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+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGRybV9pb2N0bF9kZXNjX3QgaW9jdGxzW10gPSB7CisJCit9OworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPSAwLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKHUzMiksCisJLnJlbGVhc2UgPSBmZmJfZHJpdmVyX3JlbGVhc2UsCisJLnByZXNldHVwID0gZmZiX3ByZXNldHVwLAorCS5wcmV0YWtlZG93biA9IGZmYl9kcml2ZXJfcHJldGFrZWRvd24sCisJLnBvc3RjbGVhbnVwID0gZmZiX2RyaXZlcl9wb3N0Y2xlYW51cCwKKwkua2VybmVsX2NvbnRleHRfc3dpdGNoID0gZmZiX2RyaXZlcl9jb250ZXh0X3N3aXRjaCwKKwkua2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jayA9IGZmYl9kcml2ZXJfa2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jaywKKwkuZ2V0X21hcF9vZnMgPSBmZmJfZHJpdmVyX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGZmYl9kcml2ZXJfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBpb2N0bHMsCisJLm51bV9pb2N0bHMgPSBEUk1fQVJSQVlfU0laRShpb2N0bHMpLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZmZiX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZmYl9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGZmYl9pbml0KTsKK21vZHVsZV9leGl0KGZmYl9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZmZiX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9mZmJfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmN2YxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZmZiX2Rydi5oCkBAIC0wLDAgKzEsMjg2IEBACisvKiAkSWQ6IGZmYl9kcnYuaCx2IDEuMSAyMDAwLzA2LzAxIDA0OjI0OjM5IGRhdmVtIEV4cCAkCisgKiBmZmJfZHJ2Lmg6IENyZWF0b3IvQ3JlYXRvcjNEIGRpcmVjdCByZW5kZXJpbmcgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKi8KKworLyogQXV4aWxsaWFyeSBjbGlwcy4gKi8KK3R5cGVkZWYgc3RydWN0ICB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IG1pbjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbWF4OworfSBmZmJfYXV4Y2xpcCwgKmZmYl9hdXhjbGlwUHRyOworCisvKiBGRkIgcmVnaXN0ZXIgc2V0LiAqLwordHlwZWRlZiBzdHJ1Y3QgX2ZmYl9mYmMgeworCS8qIE5leHQgdmVydGV4IHJlZ2lzdGVycywgb24gdGhlIHJpZ2h0IHdlIGxpc3Qgd2hpY2ggZHJhd29wcworCSAqIHVzZSBzYWlkIHJlZ2lzdGVyIGFuZCB0aGUgbG9naWNhbCBuYW1lIHRoZSByZWdpc3RlciBoYXMgaW4KKwkgKiB0aGF0IGNvbnRleHQuCisJICovCQkJCQkvKiBERVNDUklQVElPTgkJRFJBV09QKE5BTUUpCSovCisvKjB4MDAqL3Vuc2lnbmVkIGludAkJcGFkMVszXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qMHgwYyovdm9sYXRpbGUgdW5zaWduZWQgaW50CWFscGhhOwkJLyogQUxQSEEgVHJhbnNwYXJlbmN5CQkJKi8KKy8qMHgxMCovdm9sYXRpbGUgdW5zaWduZWQgaW50CXJlZDsJCS8qIFJFRAkJCQkJKi8KKy8qMHgxNCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWdyZWVuOwkJLyogR1JFRU4JCQkJKi8KKy8qMHgxOCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWJsdWU7CQkvKiBCTFVFCQkJCQkqLworLyoweDFjKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJejsJCS8qIERFUFRICQkJCSovCisvKjB4MjAqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAl5OwkJLyogWQkJCXRyaWFuZ2xlKERPWUYpCSovCisJCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICBhYWRvdChEWUYpCSovCisJCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICBkZGxpbmUoRFlGKQkqLworCQkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgYWFsaW5lKERZRikJKi8KKy8qMHgyNCovdm9sYXRpbGUgdW5zaWduZWQgaW50CXg7CQkvKiBYCQkJdHJpYW5nbGUoRE9YRikJKi8KKwkJCQkJCS8qICAgICAgICAgICAgICAgICAgICAgIGFhZG90KERYRikJKi8KKwkJCQkJCS8qICAgICAgICAgICAgICAgICAgICAgIGRkbGluZShEWEYpCSovCisJCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICBhYWxpbmUoRFhGKQkqLworLyoweDI4Ki91bnNpZ25lZCBpbnQJCXBhZDJbMl07CS8qIFJlc2VydmVkCQkJCSovCisvKjB4MzAqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlyeWY7CQkvKiBZIChhbGlhcyB0byBET1lGKQlkZGxpbmUoUllGKQkqLworCQkJCQkJLyoJCQlhYWxpbmUoUllGKQkqLworCQkJCQkJLyoJCQl0cmlhbmdsZShSWUYpCSovCisvKjB4MzQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlyeGY7CQkvKiBYCQkJZGRsaW5lKFJYRikJKi8KKwkJCQkJCS8qCQkJYWFsaW5lKFJYRikJKi8KKwkJCQkJCS8qCQkJdHJpYW5nbGUoUlhGKQkqLworLyoweDM4Ki91bnNpZ25lZCBpbnQJCXBhZDNbMl07CS8qIFJlc2VydmVkCQkJCSovCisvKjB4NDAqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlkbXlmOwkJLyogWSAoYWxpYXMgdG8gRE9ZRikJdHJpYW5nbGUoRE1ZRikJKi8KKy8qMHg0NCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWRteGY7CQkvKiBYCQkJdHJpYW5nbGUoRE1YRikJKi8KKy8qMHg0OCovdW5zaWduZWQgaW50CQlwYWQ0WzJdOwkvKiBSZXNlcnZlZAkJCQkqLworLyoweDUwKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJZWJ5aTsJCS8qIFkgKGFsaWFzIHRvIFJZSSkJcG9seWdvbihFQllJKQkqLworLyoweDU0Ki92b2xhdGlsZSB1bnNpZ25lZCBpbnQJZWJ4aTsJCS8qIFgJCQlwb2x5Z29uKEVCWEkpCSovCisvKjB4NTgqL3Vuc2lnbmVkIGludAkJcGFkNVsyXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qMHg2MCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWJ5OwkJLyogWQkJCWJybGluZShSWUkpCSovCisJCQkJCQkvKgkJCWZhc3RmaWxsKE9QKQkqLworCQkJCQkJLyoJCQlwb2x5Z29uKFlJKQkqLworCQkJCQkJLyoJCQlyZWN0YW5nbGUoWUkpCSovCisJCQkJCQkvKgkJCWJjb3B5KFNSQ1kpCSovCisJCQkJCQkvKgkJCXZzY3JvbGwoU1JDWSkJKi8KKy8qMHg2NCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWJ4OwkJLyogWAkJCWJybGluZShSWEkpCSovCisJCQkJCQkvKgkJCXBvbHlnb24oWEkpCSovCisJCQkJCQkvKgkJCXJlY3RhbmdsZShYSSkJKi8KKwkJCQkJCS8qCQkJYmNvcHkoU1JDWCkJKi8KKwkJCQkJCS8qCQkJdnNjcm9sbChTUkNYKQkqLworCQkJCQkJLyoJCQlmYXN0ZmlsbChHTykJKi8KKy8qMHg2OCovdm9sYXRpbGUgdW5zaWduZWQgaW50CWR5OwkJLyogZGVzdGluYXRpb24gWQlmYXN0ZmlsbChEU1RZKQkqLworCQkJCQkJLyoJCQliY29weShEU1JZKQkqLworCQkJCQkJLyoJCQl2c2Nyb2xsKERTUlkpCSovCisvKjB4NmMqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlkeDsJCS8qIGRlc3RpbmF0aW9uIFgJZmFzdGZpbGwoRFNUWCkJKi8KKwkJCQkJCS8qCQkJYmNvcHkoRFNUWCkJKi8KKwkJCQkJCS8qCQkJdnNjcm9sbChEU1RYKQkqLworLyoweDcwKi92b2xhdGlsZSB1bnNpZ25lZCBpbnQJYmg7CQkvKiBZIChhbGlhcyB0byBSWUkpCWJybGluZShEWUkpCSovCisJCQkJCQkvKgkJCWRvdChEWUkpCSovCisJCQkJCQkvKgkJCXBvbHlnb24oRVRZSSkJKi8KKwkJCQkJCS8qIEhlaWdodAkJZmFzdGZpbGwoSCkJKi8KKwkJCQkJCS8qCQkJYmNvcHkoSCkJKi8KKwkJCQkJCS8qCQkJdnNjcm9sbChIKQkqLworCQkJCQkJLyogWSBjb3VudAkJZmFzdGZpbGwoTlkpCSovCisvKjB4NzQqL3ZvbGF0aWxlIHVuc2lnbmVkIGludAlidzsJCS8qIFgJCQlkb3QoRFhJKQkqLworCQkJCQkJLyoJCQlicmxpbmUoRFhJKQkqLworCQkJCQkJLyoJCQlwb2x5Z29uKEVUWEkpCSovCisJCQkJCQkvKgkJCWZhc3RmaWxsKFcpCSovCisJCQkJCQkvKgkJCWJjb3B5KFcpCSovCisJCQkJCQkvKgkJCXZzY3JvbGwoVykJKi8KKwkJCQkJCS8qCQkJZmFzdGZpbGwoTlgpCSovCisvKjB4NzgqL3Vuc2lnbmVkIGludAkJcGFkNlsyXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qMHg4MCovdW5zaWduZWQgaW50CQlwYWQ3WzMyXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKwkKKwkvKiBTZXR1cCBVbml0J3MgdmVydGV4IHN0YXRlIHJlZ2lzdGVyICovCisvKjEwMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlzdXZ0eDsKKy8qMTA0Ki8JdW5zaWduZWQgaW50CQlwYWQ4WzYzXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKwkKKwkvKiBGcmFtZSBCdWZmZXIgQ29udHJvbCBSZWdpc3RlcnMgKi8KKy8qMjAwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXBwYzsJCS8qIFBpeGVsIFByb2Nlc3NvciBDb250cm9sCQkqLworLyoyMDQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJd2lkOwkJLyogQ3VycmVudCBXSUQJCQkJKi8KKy8qMjA4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWZnOwkJLyogRkcgZGF0YQkJCQkqLworLyoyMGMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJYmc7CQkvKiBCRyBkYXRhCQkJCSovCisvKjIxMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAljb25zdHk7CQkvKiBDb25zdGFudCBZCQkJCSovCisvKjIxNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAljb25zdHo7CQkvKiBDb25zdGFudCBaCQkJCSovCisvKjIxOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl4Y2xpcDsJCS8qIFggQ2xpcAkJCQkqLworLyoyMWMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNzczsJCS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZQkJKi8KKy8qMjIwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXZjbGlwbWluOwkvKiBWaWV3Y2xpcCBYWSBNaW4gQm91bmRzCQkqLworLyoyMjQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJdmNsaXBtYXg7CS8qIFZpZXdjbGlwIFhZIE1heCBCb3VuZHMJCSovCisvKjIyOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl2Y2xpcHptaW47CS8qIFZpZXdjbGlwIFogTWluIEJvdW5kcwkJKi8KKy8qMjJjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXZjbGlwem1heDsJLyogVmlld2NsaXAgWiBNYXggQm91bmRzCQkqLworLyoyMzAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNzZjsJCS8qIERlcHRoIEN1ZSBTY2FsZSBGcm9udCBCb3VuZAkJKi8KKy8qMjM0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjc2I7CQkvKiBEZXB0aCBDdWUgU2NhbGUgQmFjayBCb3VuZAkJKi8KKy8qMjM4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjemY7CQkvKiBEZXB0aCBDdWUgWiBGcm9udAkJCSovCisvKjIzYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3piOwkJLyogRGVwdGggQ3VlIFogQmFjawkJCSovCisvKjI0MCovCXVuc2lnbmVkIGludAkJcGFkOTsJCS8qIFJlc2VydmVkCQkJCSovCisvKjI0NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlibGVuZGM7CQkvKiBBbHBoYSBCbGVuZCBDb250cm9sCQkJKi8KKy8qMjQ4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWJsZW5kYzE7CS8qIEFscGhhIEJsZW5kIENvbG9yIDEJCQkqLworLyoyNGMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJYmxlbmRjMjsJLyogQWxwaGEgQmxlbmQgQ29sb3IgMgkJCSovCisvKjI1MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmYnJhbWl0YzsJLyogRkIgUkFNIEludGVybGVhdmUgVGVzdCBDb250cm9sCSovCisvKjI1NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmYmM7CQkvKiBGcmFtZSBCdWZmZXIgQ29udHJvbAkJCSovCisvKjI1OCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyb3A7CQkvKiBSYXN0ZXIgT1BlcmF0aW9uCQkJKi8KKy8qMjVjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWNtcDsJCS8qIEZyYW1lIEJ1ZmZlciBDb21wYXJlCQkJKi8KKy8qMjYwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CW1hdGNoYWI7CS8qIEJ1ZmZlciBBQiBNYXRjaCBNYXNrCQkJKi8KKy8qMjY0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CW1hdGNoYzsJCS8qIEJ1ZmZlciBDKFlaKSBNYXRjaCBNYXNrCQkqLworLyoyNjgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJbWFnbmFiOwkJLyogQnVmZmVyIEFCIE1hZ25pdHVkZSBNYXNrCQkqLworLyoyNmMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJbWFnbmM7CQkvKiBCdWZmZXIgQyhZWikgTWFnbml0dWRlIE1hc2sJCSovCisvKjI3MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmYmNmZzA7CQkvKiBGcmFtZSBCdWZmZXIgQ29uZmlnIDAJCSovCisvKjI3NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmYmNmZzE7CQkvKiBGcmFtZSBCdWZmZXIgQ29uZmlnIDEJCSovCisvKjI3OCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmYmNmZzI7CQkvKiBGcmFtZSBCdWZmZXIgQ29uZmlnIDIJCSovCisvKjI3YyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmYmNmZzM7CQkvKiBGcmFtZSBCdWZmZXIgQ29uZmlnIDMJCSovCisvKjI4MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlwcGNmZzsJCS8qIFBpeGVsIFByb2Nlc3NvciBDb25maWcJCSovCisvKjI4NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlwaWNrOwkJLyogUGlja2luZyBDb250cm9sCQkJKi8KKy8qMjg4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWZpbGxtb2RlOwkvKiBGaWxsTW9kZQkJCQkqLworLyoyOGMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZmJyYW13YWM7CS8qIEZCIFJBTSBXcml0ZSBBZGRyZXNzIENvbnRyb2wJCSovCisvKjI5MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlwbWFzazsJCS8qIFJHQiBQbGFuZU1hc2sJCQkqLworLyoyOTQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJeHBtYXNrOwkJLyogWCBQbGFuZU1hc2sJCQkJKi8KKy8qMjk4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXlwbWFzazsJCS8qIFkgUGxhbmVNYXNrCQkJCSovCisvKjI5YyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl6cG1hc2s7CQkvKiBaIFBsYW5lTWFzawkJCQkqLworLyoyYTAqLwlmZmJfYXV4Y2xpcAkJYXV4Y2xpcFs0XTsgCS8qIEF1eGlsbGlhcnkgVmlld3BvcnQgQ2xpcAkJKi8KKwkKKwkvKiBOZXcgM2RSQU0gSUlJIHN1cHBvcnQgcmVncyAqLworLyoyYzAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3YmxlbmQyOworLyoyYzQqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3cHJlYmxlbmQ7CisvKjJjOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdzdGVuY2lsOworLyoyY2MqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3c3RlbmNpbGN0bDsKKy8qMmQwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXRocmVlZHJhbTE7CisvKjJkNCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl0aHJlZWRyYW0yOworLyoyZDgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcGFzc2luOworLyoyZGMqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJcmF3Y2xyZGVwdGg7CisvKjJlMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdwbWFzazsKKy8qMmU0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd2NzcmM7CisvKjJlOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdtYXRjaDsKKy8qMmVjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd21hZ247CisvKjJmMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyYXdyb3BibGVuZDsKKy8qMmY0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd2NtcDsKKy8qMmY4Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXJhd3dhYzsKKy8qMmZjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWZicmFtaWQ7CisJCisvKjMwMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkcmF3b3A7CQkvKiBEcmF3IE9QZXJhdGlvbgkJCSovCisvKjMwNCovCXVuc2lnbmVkIGludAkJcGFkMTBbMl07CS8qIFJlc2VydmVkCQkJCSovCisvKjMwYyovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlscGF0OwkJLyogTGluZSBQYXR0ZXJuIGNvbnRyb2wJCQkqLworLyozMTAqLwl1bnNpZ25lZCBpbnQJCXBhZDExOwkJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qMzE0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWZvbnR4eTsJCS8qIFhZIEZvbnQgY29vcmRpbmF0ZQkJCSovCisvKjMxOCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlmb250dzsJCS8qIEZvbnQgV2lkdGgJCQkJKi8KKy8qMzFjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWZvbnRpbmM7CS8qIEZvbnQgSW5jcmVtZW50CQkJKi8KKy8qMzIwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWZvbnQ7CQkvKiBGb250IGJpdHMJCQkJKi8KKy8qMzI0Ki8JdW5zaWduZWQgaW50CQlwYWQxMlszXTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qMzMwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWJsZW5kMjsKKy8qMzM0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXByZWJsZW5kOworLyozMzgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJc3RlbmNpbDsKKy8qMzNjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXN0ZW5jaWxjdGw7CisKKy8qMzQwKi8JdW5zaWduZWQgaW50CQlwYWQxM1s0XTsJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qMzUwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjc3MxOwkJLyogRGVwdGggQ3VlIFNjYWxlIFNsb3BlIDEJCSovCisvKjM1NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3NzMjsJCS8qIERlcHRoIEN1ZSBTY2FsZSBTbG9wZSAyCQkqLworLyozNTgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNzczM7CQkvKiBEZXB0aCBDdWUgU2NhbGUgU2xvcGUgMwkJKi8KKy8qMzVjKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CXdpZHBtYXNrOworLyozNjAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNzMjsKKy8qMzY0Ki8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjczM7CisvKjM2OCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY3M0OworLyozNmMqLwl1bnNpZ25lZCBpbnQJCXBhZDE0OwkJLyogUmVzZXJ2ZWQJCQkJKi8KKy8qMzcwKi8Jdm9sYXRpbGUgdW5zaWduZWQgaW50CWRjZDI7CisvKjM3NCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlkY2QzOworLyozNzgqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGNkNDsKKy8qMzdjKi8JdW5zaWduZWQgaW50CQlwYWQxNTsJCS8qIFJlc2VydmVkCQkJCSovCisvKjM4MCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlwYXR0ZXJuWzMyXTsJLyogYXJlYSBQYXR0ZXJuCQkJCSovCisvKjQwMCovCXVuc2lnbmVkIGludAkJcGFkMTZbOF07CS8qIFJlc2VydmVkCQkJCSovCisvKjQyMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAlyZXNldDsJCS8qIGNoaXAgUkVTRVQJCQkJKi8KKy8qNDI0Ki8JdW5zaWduZWQgaW50CQlwYWQxN1syNDddOwkvKiBSZXNlcnZlZAkJCQkqLworLyo4MDAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJZGV2aWQ7CQkvKiBEZXZpY2UgSUQJCQkJKi8KKy8qODA0Ki8JdW5zaWduZWQgaW50CQlwYWQxOFs2M107CS8qIFJlc2VydmVkCQkJCSovCisvKjkwMCovCXZvbGF0aWxlIHVuc2lnbmVkIGludAl1Y3NyOwkJLyogVXNlciBDb250cm9sICYgU3RhdHVzIFJlZ2lzdGVyCSovCisvKjkwNCovCXVuc2lnbmVkIGludAkJcGFkMTlbMzFdOwkvKiBSZXNlcnZlZAkJCQkqLworLyo5ODAqLwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQJbWVyOwkJLyogTW9kZSBFbmFibGUgUmVnaXN0ZXIJCQkqLworLyo5ODQqLwl1bnNpZ25lZCBpbnQJCXBhZDIwWzE0MzldOwkvKiBSZXNlcnZlZAkJCQkqLworfSBmZmJfZmJjLCAqZmZiX2ZiY1B0cjsKKworc3RydWN0IGZmYl9od19jb250ZXh0IHsKKwlpbnQgaXNfMmRfb25seTsKKworCXVuc2lnbmVkIGludCBwcGM7CisJdW5zaWduZWQgaW50IHdpZDsKKwl1bnNpZ25lZCBpbnQgZmc7CisJdW5zaWduZWQgaW50IGJnOworCXVuc2lnbmVkIGludCBjb25zdHk7CisJdW5zaWduZWQgaW50IGNvbnN0ejsKKwl1bnNpZ25lZCBpbnQgeGNsaXA7CisJdW5zaWduZWQgaW50IGRjc3M7CisJdW5zaWduZWQgaW50IHZjbGlwbWluOworCXVuc2lnbmVkIGludCB2Y2xpcG1heDsKKwl1bnNpZ25lZCBpbnQgdmNsaXB6bWluOworCXVuc2lnbmVkIGludCB2Y2xpcHptYXg7CisJdW5zaWduZWQgaW50IGRjc2Y7CisJdW5zaWduZWQgaW50IGRjc2I7CisJdW5zaWduZWQgaW50IGRjemY7CisJdW5zaWduZWQgaW50IGRjemI7CisJdW5zaWduZWQgaW50IGJsZW5kYzsKKwl1bnNpZ25lZCBpbnQgYmxlbmRjMTsKKwl1bnNpZ25lZCBpbnQgYmxlbmRjMjsKKwl1bnNpZ25lZCBpbnQgZmJjOworCXVuc2lnbmVkIGludCByb3A7CisJdW5zaWduZWQgaW50IGNtcDsKKwl1bnNpZ25lZCBpbnQgbWF0Y2hhYjsKKwl1bnNpZ25lZCBpbnQgbWF0Y2hjOworCXVuc2lnbmVkIGludCBtYWduYWI7CisJdW5zaWduZWQgaW50IG1hZ25jOworCXVuc2lnbmVkIGludCBwbWFzazsKKwl1bnNpZ25lZCBpbnQgeHBtYXNrOworCXVuc2lnbmVkIGludCB5cG1hc2s7CisJdW5zaWduZWQgaW50IHpwbWFzazsKKwl1bnNpZ25lZCBpbnQgYXV4Y2xpcDBtaW47CisJdW5zaWduZWQgaW50IGF1eGNsaXAwbWF4OworCXVuc2lnbmVkIGludCBhdXhjbGlwMW1pbjsKKwl1bnNpZ25lZCBpbnQgYXV4Y2xpcDFtYXg7CisJdW5zaWduZWQgaW50IGF1eGNsaXAybWluOworCXVuc2lnbmVkIGludCBhdXhjbGlwMm1heDsKKwl1bnNpZ25lZCBpbnQgYXV4Y2xpcDNtaW47CisJdW5zaWduZWQgaW50IGF1eGNsaXAzbWF4OworCXVuc2lnbmVkIGludCBkcmF3b3A7CisJdW5zaWduZWQgaW50IGxwYXQ7CisJdW5zaWduZWQgaW50IGZvbnR4eTsKKwl1bnNpZ25lZCBpbnQgZm9udHc7CisJdW5zaWduZWQgaW50IGZvbnRpbmM7CisJdW5zaWduZWQgaW50IGFyZWFfcGF0dGVyblszMl07CisJdW5zaWduZWQgaW50IHVjc3I7CisJdW5zaWduZWQgaW50IHN0ZW5jaWw7CisJdW5zaWduZWQgaW50IHN0ZW5jaWxjdGw7CisJdW5zaWduZWQgaW50IGRjc3MxOworCXVuc2lnbmVkIGludCBkY3NzMjsKKwl1bnNpZ25lZCBpbnQgZGNzczM7CisJdW5zaWduZWQgaW50IGRjczI7CisJdW5zaWduZWQgaW50IGRjczM7CisJdW5zaWduZWQgaW50IGRjczQ7CisJdW5zaWduZWQgaW50IGRjZDI7CisJdW5zaWduZWQgaW50IGRjZDM7CisJdW5zaWduZWQgaW50IGRjZDQ7CisJdW5zaWduZWQgaW50IG1lcjsKK307CisKKyNkZWZpbmUgRkZCX01BWF9DVFhTCTMyCisKK2VudW0gZmZiX2NoaXBfdHlwZSB7CisJZmZiMV9wcm90b3R5cGUgPSAwLAkvKiBFYXJseSBwcmUtRkNTIEZGQiAqLworCWZmYjFfc3RhbmRhcmQsCQkvKiBGaXJzdCBGQ1MgRkZCLCAxMDBNaHogVVBBLCA2Nk1IeiBnY2xrICovCisJZmZiMV9zcGVlZHNvcnQsCQkvKiBTZWNvbmQgRkNTIEZGQiwgMTAwTWh6IFVQQSwgNzVNSHogZ2NsayAqLworCWZmYjJfcHJvdG90eXBlLAkJLyogRWFybHkgcHJlLUZDUyB2ZXJ0aWNhbCBGRkIyICovCisJZmZiMl92ZXJ0aWNhbCwJCS8qIEZpcnN0IEZDUyBGRkIyL3ZlcnRpY2FsLCAxMDBNaHogVVBBLCAxMDBNSFogZ2NsaywKKwkJCQkgICA3NShTaW5nbGVCdWZmZXIpLzgzKERvdWJsZUJ1ZmZlcikgTUh6IGZjbGsgKi8KKwlmZmIyX3ZlcnRpY2FsX3BsdXMsCS8qIFNlY29uZCBGQ1MgRkZCMi92ZXJ0aWNhbCwgc2FtZSB0aW1pbmdzICovCisJZmZiMl9ob3Jpem9udGFsLAkvKiBGaXJzdCBGQ1MgRkZCMi9ob3Jpem9udGFsLCBzYW1lIHRpbWluZ3MgYXMgRkZCMi92ZXJ0ICovCisJZmZiMl9ob3Jpem9udGFsX3BsdXMsCS8qIFNlY29uZCBGQ1MgRkZCMi9ob3Jpem9udGFsLCBzYW1lIHRpbWluZ3MgKi8KKwlhZmJfbTMsCQkJLyogRkNTIEVsaXRlM0QsIDMgZmxvYXQgY2hpcHMgKi8KKwlhZmJfbTYJCQkvKiBGQ1MgRWxpdGUzRCwgNiBmbG9hdCBjaGlwcyAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZmZiX2Rldl9wcml2IHsKKwkvKiBNaXNjIHNvZnR3YXJlIHN0YXRlLiAqLworCWludAkJCXByb21fbm9kZTsKKwllbnVtIGZmYl9jaGlwX3R5cGUJZmZiX3R5cGU7CisJdTY0CQkJY2FyZF9waHlzX2Jhc2U7CisJc3RydWN0IG1pc2NkZXZpY2UgCW1pc2NkZXY7CisKKwkvKiBDb250cm9sbGVyIHJlZ2lzdGVycy4gKi8KKwlmZmJfZmJjUHRyCQlyZWdzOworCisJLyogQ29udGV4dCB0YWJsZS4gKi8KKwlzdHJ1Y3QgZmZiX2h3X2NvbnRleHQJKmh3X3N0YXRlW0ZGQl9NQVhfQ1RYU107Cit9IGZmYl9kZXZfcHJpdl90OworCitleHRlcm4gdW5zaWduZWQgbG9uZyBmZmJfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgaGludCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIHZvaWQgZmZiX3NldF9jb250ZXh0X2lvY3Rscyh2b2lkKTsKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IERSTShpb2N0bHMpW107CisKK2V4dGVybiBpbnQgZmZiX2RyaXZlcl9jb250ZXh0X3N3aXRjaChkcm1fZGV2aWNlX3QgKmRldiwgaW50IG9sZCwgaW50IG5ldyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2NvbnRleHQuaCBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWI1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2NvbnRleHQuaApAQCAtMCwwICsxLDQ5MiBAQAorLyogZHJtX2NvbnRleHQuaCAtLSBJT0NUTHMgZm9yIGdlbmVyaWMgY29udGV4dHMgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBGcmkgTm92IDI0IDE4OjMxOjM3IDIwMDAgYnkgZ2FyZXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiBDaGFuZ2VMb2c6CisgKiAgMjAwMS0xMS0xNglUb3JzdGVuIER1d2UgPGR1d2VAY2FsZGVyYS5kZT4KKyAqCQlhZGRlZCBjb250ZXh0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgaG9va3MsCisgKgkJbmVlZGVkIGJ5IFNpUyBkcml2ZXIncyBtZW1vcnkgbWFuYWdlbWVudC4KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPbGQtc3R5bGUgY29udGV4dCBzdXBwb3J0IC0tIG9ubHkgdXNlZCBieSBnYW1tYS4gIAorICovCisKKworLyogVGhlIGRybV9yZWFkIGFuZCBkcm1fd3JpdGVfc3RyaW5nIGNvZGUgKGVzcGVjaWFsbHkgdGhhdCB3aGljaCBtYW5hZ2VzCisgICB0aGUgY2lyY3VsYXIgYnVmZmVyKSwgaXMgYmFzZWQgb24gQWxlc3NhbmRybyBSdWJpbmkncyBMSU5VWCBERVZJQ0UKKyAgIERSSVZFUlMgKENhbWJyaWRnZTogTydSZWlsbHksIDE5OTgpLCBwYWdlcyAxMTEtMTEzLiAqLworCitzc2l6ZV90IGdhbW1hX2ZvcHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKK3sKKwlkcm1fZmlsZV90ICAgICpwcml2ICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICAqZGV2ICAgID0gcHJpdi0+ZGV2OworCWludAkgICAgICBsZWZ0OworCWludAkgICAgICBhdmFpbDsKKwlpbnQJICAgICAgc2VuZDsKKwlpbnQJICAgICAgY3VyOworCisJRFJNX0RFQlVHKCIlcCwgJXBcbiIsIGRldi0+YnVmX3JwLCBkZXYtPmJ1Zl93cCk7CisKKwl3aGlsZSAoZGV2LT5idWZfcnAgPT0gZGV2LT5idWZfd3ApIHsKKwkJRFJNX0RFQlVHKCIgIHNsZWVwaW5nXG4iKTsKKwkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZkZXYtPmJ1Zl9yZWFkZXJzKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlEUk1fREVCVUcoIiAgaW50ZXJydXB0ZWRcbiIpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCQlEUk1fREVCVUcoIiAgYXdha2VcbiIpOworCX0KKworCWxlZnQgID0gKGRldi0+YnVmX3JwICsgRFJNX0JTWiAtIGRldi0+YnVmX3dwKSAlIERSTV9CU1o7CisJYXZhaWwgPSBEUk1fQlNaIC0gbGVmdDsKKwlzZW5kICA9IERSTV9NSU4oYXZhaWwsIGNvdW50KTsKKworCXdoaWxlIChzZW5kKSB7CisJCWlmIChkZXYtPmJ1Zl93cCA+IGRldi0+YnVmX3JwKSB7CisJCQljdXIgPSBEUk1fTUlOKHNlbmQsIGRldi0+YnVmX3dwIC0gZGV2LT5idWZfcnApOworCQl9IGVsc2UgeworCQkJY3VyID0gRFJNX01JTihzZW5kLCBkZXYtPmJ1Zl9lbmQgLSBkZXYtPmJ1Zl9ycCk7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRldi0+YnVmX3JwLCBjdXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWRldi0+YnVmX3JwICs9IGN1cjsKKwkJaWYgKGRldi0+YnVmX3JwID09IGRldi0+YnVmX2VuZCkgZGV2LT5idWZfcnAgPSBkZXYtPmJ1ZjsKKwkJc2VuZCAtPSBjdXI7CisJfQorCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPmJ1Zl93cml0ZXJzKTsKKwlyZXR1cm4gRFJNX01JTihhdmFpbCwgY291bnQpOworfQorCisKKy8qIEluIGFuIGluY3JlZGlibHkgY29udm9sdXRlZCBzZXR1cCwgdGhlIGtlcm5lbCBtb2R1bGUgYWN0dWFsbHkgY2FsbHMKKyAqIGJhY2sgaW50byB0aGUgWCBzZXJ2ZXIgdG8gcGVyZm9ybSBjb250ZXh0IHN3aXRjaGVzIG9uIGJlaGFsZiBvZiB0aGUKKyAqIDNkIGNsaWVudHMuCisgKi8KK2ludCBEUk0od3JpdGVfc3RyaW5nKShkcm1fZGV2aWNlX3QgKmRldiwgY29uc3QgY2hhciAqcykKK3sKKwlpbnQgbGVmdCAgID0gKGRldi0+YnVmX3JwICsgRFJNX0JTWiAtIGRldi0+YnVmX3dwKSAlIERSTV9CU1o7CisJaW50IHNlbmQgICA9IHN0cmxlbihzKTsKKwlpbnQgY291bnQ7CisKKwlEUk1fREVCVUcoIiVkIGxlZnQsICVkIHRvIHNlbmQgKCVwLCAlcClcbiIsCisJCSAgbGVmdCwgc2VuZCwgZGV2LT5idWZfcnAsIGRldi0+YnVmX3dwKTsKKworCWlmIChsZWZ0ID09IDEgfHwgZGV2LT5idWZfd3AgIT0gZGV2LT5idWZfcnApIHsKKwkJRFJNX0VSUk9SKCJCdWZmZXIgbm90IGVtcHR5ICglZCBsZWZ0LCB3cCA9ICVwLCBycCA9ICVwKVxuIiwKKwkJCSAgbGVmdCwKKwkJCSAgZGV2LT5idWZfd3AsCisJCQkgIGRldi0+YnVmX3JwKTsKKwl9CisKKwl3aGlsZSAoc2VuZCkgeworCQlpZiAoZGV2LT5idWZfd3AgPj0gZGV2LT5idWZfcnApIHsKKwkJCWNvdW50ID0gRFJNX01JTihzZW5kLCBkZXYtPmJ1Zl9lbmQgLSBkZXYtPmJ1Zl93cCk7CisJCQlpZiAoY291bnQgPT0gbGVmdCkgLS1jb3VudDsgLyogTGVhdmUgYSBob2xlICovCisJCX0gZWxzZSB7CisJCQljb3VudCA9IERSTV9NSU4oc2VuZCwgZGV2LT5idWZfcnAgLSBkZXYtPmJ1Zl93cCAtIDEpOworCQl9CisJCXN0cm5jcHkoZGV2LT5idWZfd3AsIHMsIGNvdW50KTsKKwkJZGV2LT5idWZfd3AgKz0gY291bnQ7CisJCWlmIChkZXYtPmJ1Zl93cCA9PSBkZXYtPmJ1Zl9lbmQpIGRldi0+YnVmX3dwID0gZGV2LT5idWY7CisJCXNlbmQgLT0gY291bnQ7CisJfQorCisJaWYgKGRldi0+YnVmX2FzeW5jKSBraWxsX2Zhc3luYygmZGV2LT5idWZfYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKKworCURSTV9ERUJVRygid2FraW5nXG4iKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+YnVmX3JlYWRlcnMpOworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgZ2FtbWFfZm9wc19wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJZHJtX2ZpbGVfdCAgICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ICA9IHByaXYtPmRldjsKKworCXBvbGxfd2FpdChmaWxwLCAmZGV2LT5idWZfcmVhZGVycywgd2FpdCk7CisJaWYgKGRldi0+YnVmX3dwICE9IGRldi0+YnVmX3JwKSByZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworaW50IERSTShjb250ZXh0X3N3aXRjaCkoZHJtX2RldmljZV90ICpkZXYsIGludCBvbGQsIGludCBuZXcpCit7CisJY2hhcgkgICAgYnVmWzY0XTsKKwlkcm1fcXVldWVfdCAqcTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZykpIHsKKwkJRFJNX0VSUk9SKCJSZWVudGVyaW5nIC0tIEZJWE1FXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlEUk1fREVCVUcoIkNvbnRleHQgc3dpdGNoIGZyb20gJWQgdG8gJWRcbiIsIG9sZCwgbmV3KTsKKworCWlmIChuZXcgPj0gZGV2LT5xdWV1ZV9jb3VudCkgeworCQljbGVhcl9iaXQoMCwgJmRldi0+Y29udGV4dF9mbGFnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5ldyA9PSBkZXYtPmxhc3RfY29udGV4dCkgeworCQljbGVhcl9iaXQoMCwgJmRldi0+Y29udGV4dF9mbGFnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcSA9IGRldi0+cXVldWVsaXN0W25ld107CisJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMSkgeworCQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCQljbGVhcl9iaXQoMCwgJmRldi0+Y29udGV4dF9mbGFnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVGhpcyBjYXVzZXMgdGhlIFggc2VydmVyIHRvIHdha2UgdXAgJiBkbyBhIGJ1bmNoIG9mIGhhcmR3YXJlCisJICogaW50ZXJhY3Rpb24gdG8gYWN0dWFsbHkgZWZmZWN0IHRoZSBjb250ZXh0IHN3aXRjaC4KKwkgKi8KKwlzcHJpbnRmKGJ1ZiwgIkMgJWQgJWRcbiIsIG9sZCwgbmV3KTsKKwlEUk0od3JpdGVfc3RyaW5nKShkZXYsIGJ1Zik7CisKKwlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oY29udGV4dF9zd2l0Y2hfY29tcGxldGUpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbmV3KQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCisJZGV2LT5sYXN0X2NvbnRleHQgPSBuZXc7ICAvKiBQUkUvUE9TVDogVGhpcyBpcyB0aGUgX29ubHlfIHdyaXRlci4gKi8KKwlkZXYtPmxhc3Rfc3dpdGNoICA9IGppZmZpZXM7CisKKwlpZiAoIV9EUk1fTE9DS19JU19IRUxEKGRldi0+bG9jay5od19sb2NrLT5sb2NrKSkgeworCQlEUk1fRVJST1IoIkxvY2sgaXNuJ3QgaGVsZCBhZnRlciBjb250ZXh0IHN3aXRjaFxuIik7CisJfQorCisJaWYgKCFkbWEgfHwgIShkbWEtPm5leHRfYnVmZmVyICYmIGRtYS0+bmV4dF9idWZmZXItPndoaWxlX2xvY2tlZCkpIHsKKwkJaWYgKERSTShsb2NrX2ZyZWUpKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCSAgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQkJRFJNX0VSUk9SKCJDYW5ub3QgZnJlZSBsb2NrXG4iKTsKKwkJfQorCX0KKworCWNsZWFyX2JpdCgwLCAmZGV2LT5jb250ZXh0X2ZsYWcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5jb250ZXh0X3dhaXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRFJNKGluaXRfcXVldWUpKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fcXVldWVfdCAqcSwgZHJtX2N0eF90ICpjdHgpCit7CisJRFJNX0RFQlVHKCJcbiIpOworCisJaWYgKGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpICE9IDEKKwkgICAgfHwgYXRvbWljX3JlYWQoJnEtPmZpbmFsaXphdGlvbikKKwkgICAgfHwgYXRvbWljX3JlYWQoJnEtPmJsb2NrX2NvdW50KSkgeworCQlEUk1fRVJST1IoIk5ldyBxdWV1ZSBpcyBhbHJlYWR5IGluIHVzZTogdSVkIGYlZCBiJWRcbiIsCisJCQkgIGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpLAorCQkJICBhdG9taWNfcmVhZCgmcS0+ZmluYWxpemF0aW9uKSwKKwkJCSAgYXRvbWljX3JlYWQoJnEtPmJsb2NrX2NvdW50KSk7CisJfQorCisJYXRvbWljX3NldCgmcS0+ZmluYWxpemF0aW9uLCAgMCk7CisJYXRvbWljX3NldCgmcS0+YmxvY2tfY291bnQsICAgMCk7CisJYXRvbWljX3NldCgmcS0+YmxvY2tfcmVhZCwgICAgMCk7CisJYXRvbWljX3NldCgmcS0+YmxvY2tfd3JpdGUsICAgMCk7CisJYXRvbWljX3NldCgmcS0+dG90YWxfcXVldWVkLCAgMCk7CisJYXRvbWljX3NldCgmcS0+dG90YWxfZmx1c2hlZCwgMCk7CisJYXRvbWljX3NldCgmcS0+dG90YWxfbG9ja3MsICAgMCk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxLT53cml0ZV9xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+cmVhZF9xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+Zmx1c2hfcXVldWUpOworCisJcS0+ZmxhZ3MgPSBjdHgtPmZsYWdzOworCisJRFJNKHdhaXRsaXN0X2NyZWF0ZSkoJnEtPndhaXRsaXN0LCBkZXYtPmRtYS0+YnVmX2NvdW50KTsKKworCXJldHVybiAwOworfQorCisKKy8qIGRybV9hbGxvY19xdWV1ZToKK1BSRTogMSkgZGV2LT5xdWV1ZWxpc3RbMC4uZGV2LT5xdWV1ZV9jb3VudF0gaXMgYWxsb2NhdGVkIGFuZCB3aWxsIG5vdAorCWRpc2FwcGVhciAoc28gYWxsIGRlYWxsb2NhdGlvbiBtdXN0IGJlIGRvbmUgYWZ0ZXIgSU9DVExzIGFyZSBvZmYpCisgICAgIDIpIGRldi0+cXVldWVfY291bnQgPCBkZXYtPnF1ZXVlX3Nsb3RzCisgICAgIDMpIGRldi0+cXVldWVsaXN0W2ldLnVzZV9jb3VudCA9PSAwIGFuZAorCWRldi0+cXVldWVsaXN0W2ldLmZpbmFsaXphdGlvbiA9PSAwIGlmIGkgbm90IGluIHVzZQorUE9TVDogMSkgZGV2LT5xdWV1ZWxpc3RbaV0udXNlX2NvdW50ID09IDEKKyAgICAgIDIpIGRldi0+cXVldWVfY291bnQgPCBkZXYtPnF1ZXVlX3Nsb3RzICovCisKK3N0YXRpYyBpbnQgRFJNKGFsbG9jX3F1ZXVlKShkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlpbnQJICAgIGk7CisJZHJtX3F1ZXVlX3QgKnF1ZXVlOworCWludAkgICAgb2xkc2xvdHM7CisJaW50CSAgICBuZXdzbG90czsKKwkJCQkvKiBDaGVjayBmb3IgYSBmcmVlIHF1ZXVlICovCisJZm9yIChpID0gMDsgaSA8IGRldi0+cXVldWVfY291bnQ7IGkrKykgeworCQlhdG9taWNfaW5jKCZkZXYtPnF1ZXVlbGlzdFtpXS0+dXNlX2NvdW50KTsKKwkJaWYgKGF0b21pY19yZWFkKCZkZXYtPnF1ZXVlbGlzdFtpXS0+dXNlX2NvdW50KSA9PSAxCisJCSAgICAmJiAhYXRvbWljX3JlYWQoJmRldi0+cXVldWVsaXN0W2ldLT5maW5hbGl6YXRpb24pKSB7CisJCQlEUk1fREVCVUcoIiVkIChmcmVlKVxuIiwgaSk7CisJCQlyZXR1cm4gaTsKKwkJfQorCQlhdG9taWNfZGVjKCZkZXYtPnF1ZXVlbGlzdFtpXS0+dXNlX2NvdW50KTsKKwl9CisJCQkJLyogQWxsb2NhdGUgYSBuZXcgcXVldWUgKi8KKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCisJcXVldWUgPSBEUk0oYWxsb2MpKHNpemVvZigqcXVldWUpLCBEUk1fTUVNX1FVRVVFUyk7CisJbWVtc2V0KHF1ZXVlLCAwLCBzaXplb2YoKnF1ZXVlKSk7CisJYXRvbWljX3NldCgmcXVldWUtPnVzZV9jb3VudCwgMSk7CisKKwkrK2Rldi0+cXVldWVfY291bnQ7CisJaWYgKGRldi0+cXVldWVfY291bnQgPj0gZGV2LT5xdWV1ZV9zbG90cykgeworCQlvbGRzbG90cyA9IGRldi0+cXVldWVfc2xvdHMgKiBzaXplb2YoKmRldi0+cXVldWVsaXN0KTsKKwkJaWYgKCFkZXYtPnF1ZXVlX3Nsb3RzKSBkZXYtPnF1ZXVlX3Nsb3RzID0gMTsKKwkJZGV2LT5xdWV1ZV9zbG90cyAqPSAyOworCQluZXdzbG90cyA9IGRldi0+cXVldWVfc2xvdHMgKiBzaXplb2YoKmRldi0+cXVldWVsaXN0KTsKKworCQlkZXYtPnF1ZXVlbGlzdCA9IERSTShyZWFsbG9jKShkZXYtPnF1ZXVlbGlzdCwKKwkJCQkJICAgICAgb2xkc2xvdHMsCisJCQkJCSAgICAgIG5ld3Nsb3RzLAorCQkJCQkgICAgICBEUk1fTUVNX1FVRVVFUyk7CisJCWlmICghZGV2LT5xdWV1ZWxpc3QpIHsKKwkJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQkJRFJNX0RFQlVHKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCWRldi0+cXVldWVsaXN0W2Rldi0+cXVldWVfY291bnQtMV0gPSBxdWV1ZTsKKworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCURSTV9ERUJVRygiJWQgKG5ldylcbiIsIGRldi0+cXVldWVfY291bnQgLSAxKTsKKwlyZXR1cm4gZGV2LT5xdWV1ZV9jb3VudCAtIDE7Cit9CisKK2ludCBEUk0ocmVzY3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2N0eF9yZXNfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2N0eF9yZXNfdAlyZXM7CisJZHJtX2N0eF90CWN0eDsKKwlpbnQJCWk7CisKKwlEUk1fREVCVUcoIiVkXG4iLCBEUk1fUkVTRVJWRURfQ09OVEVYVFMpOworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVzLCBhcmdwLCBzaXplb2YocmVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChyZXMuY291bnQgPj0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTKSB7CisJCW1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7CisJCWZvciAoaSA9IDA7IGkgPCBEUk1fUkVTRVJWRURfQ09OVEVYVFM7IGkrKykgeworCQkJY3R4LmhhbmRsZSA9IGk7CisJCQlpZiAoY29weV90b191c2VyKCZyZXMuY29udGV4dHNbaV0sCisJCQkJCSAmaSwKKwkJCQkJIHNpemVvZihpKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcmVzLmNvdW50ID0gRFJNX1JFU0VSVkVEX0NPTlRFWFRTOworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcywgc2l6ZW9mKHJlcykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworaW50IERSTShhZGRjdHgpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OworCWRybV9jdHhfdAljdHg7CisJZHJtX2N0eF90CV9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCBhcmdwLCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgoY3R4LmhhbmRsZSA9IERSTShhbGxvY19xdWV1ZSkoZGV2KSkgPT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CisJCQkJLyogSW5pdCBrZXJuZWwncyBjb250ZXh0IGFuZCBnZXQgYSBuZXcgb25lLiAqLworCQlEUk0oaW5pdF9xdWV1ZSkoZGV2LCBkZXYtPnF1ZXVlbGlzdFtjdHguaGFuZGxlXSwgJmN0eCk7CisJCWN0eC5oYW5kbGUgPSBEUk0oYWxsb2NfcXVldWUpKGRldik7CisJfQorCURSTShpbml0X3F1ZXVlKShkZXYsIGRldi0+cXVldWVsaXN0W2N0eC5oYW5kbGVdLCAmY3R4KTsKKwlEUk1fREVCVUcoIiVkXG4iLCBjdHguaGFuZGxlKTsKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZjdHgsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0obW9kY3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJY3R4OworCWRybV9xdWV1ZV90CSpxOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopYXJnLCBzaXplb2YoY3R4KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisKKwlpZiAoY3R4LmhhbmRsZSA8IDAgfHwgY3R4LmhhbmRsZSA+PSBkZXYtPnF1ZXVlX2NvdW50KSByZXR1cm4gLUVJTlZBTDsKKwlxID0gZGV2LT5xdWV1ZWxpc3RbY3R4LmhhbmRsZV07CisKKwlhdG9taWNfaW5jKCZxLT51c2VfY291bnQpOworCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSA9PSAxKSB7CisJCQkJLyogTm8gbG9uZ2VyIGluIHVzZSAqLworCQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoRFJNX0JVRkNPVU5UKCZxLT53YWl0bGlzdCkpIHsKKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlxLT5mbGFncyA9IGN0eC5mbGFnczsKKworCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oZ2V0Y3R4KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdAkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmRldjsKKwlkcm1fY3R4X3QJX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jdHhfdAljdHg7CisJZHJtX3F1ZXVlX3QJKnE7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgYXJncCwgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOworCisJaWYgKGN0eC5oYW5kbGUgPj0gZGV2LT5xdWV1ZV9jb3VudCkgcmV0dXJuIC1FSU5WQUw7CisJcSA9IGRldi0+cXVldWVsaXN0W2N0eC5oYW5kbGVdOworCisJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJnEtPnVzZV9jb3VudCkgPT0gMSkgeworCQkJCS8qIE5vIGxvbmdlciBpbiB1c2UgKi8KKwkJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3R4LmZsYWdzID0gcS0+ZmxhZ3M7CisJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmN0eCwgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitpbnQgRFJNKHN3aXRjaGN0eCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5kZXY7CisJZHJtX2N0eF90CWN0eDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGN0eCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlEUk1fREVCVUcoIiVkXG4iLCBjdHguaGFuZGxlKTsKKwlyZXR1cm4gRFJNKGNvbnRleHRfc3dpdGNoKShkZXYsIGRldi0+bGFzdF9jb250ZXh0LCBjdHguaGFuZGxlKTsKK30KKworaW50IERSTShuZXdjdHgpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OworCWRybV9jdHhfdAljdHg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisJRFJNKGNvbnRleHRfc3dpdGNoX2NvbXBsZXRlKShkZXYsIGN0eC5oYW5kbGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0ocm1jdHgpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OworCWRybV9jdHhfdAljdHg7CisJZHJtX3F1ZXVlX3QJKnE7CisJZHJtX2J1Zl90CSpidWY7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjdHgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CisKKwlpZiAoY3R4LmhhbmRsZSA+PSBkZXYtPnF1ZXVlX2NvdW50KSByZXR1cm4gLUVJTlZBTDsKKwlxID0gZGV2LT5xdWV1ZWxpc3RbY3R4LmhhbmRsZV07CisKKwlhdG9taWNfaW5jKCZxLT51c2VfY291bnQpOworCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSA9PSAxKSB7CisJCQkJLyogTm8gbG9uZ2VyIGluIHVzZSAqLworCQlhdG9taWNfZGVjKCZxLT51c2VfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhdG9taWNfaW5jKCZxLT5maW5hbGl6YXRpb24pOyAvKiBNYXJrIHF1ZXVlIGluIGZpbmFsaXphdGlvbiBzdGF0ZSAqLworCWF0b21pY19zdWIoMiwgJnEtPnVzZV9jb3VudCk7IC8qIE1hcmsgcXVldWUgYXMgdW51c2VkIChwZW5kaW5nCisJCQkJCSBmaW5hbGl6YXRpb24pICovCisKKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZykpIHsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOworCQkJcmV0dXJuIC1FSU5UUjsKKwkJfQorCX0KKwkJCQkvKiBSZW1vdmUgcXVldWVkIGJ1ZmZlcnMgKi8KKwl3aGlsZSAoKGJ1ZiA9IERSTSh3YWl0bGlzdF9nZXQpKCZxLT53YWl0bGlzdCkpKSB7CisJCURSTShmcmVlX2J1ZmZlcikoZGV2LCBidWYpOworCX0KKwljbGVhcl9iaXQoMCwgJmRldi0+aW50ZXJydXB0X2ZsYWcpOworCisJCQkJLyogV2FrZXVwIGJsb2NrZWQgcHJvY2Vzc2VzICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxLT5yZWFkX3F1ZXVlKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnEtPndyaXRlX3F1ZXVlKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnEtPmZsdXNoX3F1ZXVlKTsKKworCQkJCS8qIEZpbmFsaXphdGlvbiBvdmVyLiAgUXVldWUgaXMgbWFkZQorCQkJCSAgIGF2YWlsYWJsZSB3aGVuIGJvdGggdXNlX2NvdW50IGFuZAorCQkJCSAgIGZpbmFsaXphdGlvbiBiZWNvbWUgMCwgd2hpY2ggd29uJ3QKKwkJCQkgICBoYXBwZW4gdW50aWwgYWxsIHRoZSB3YWl0aW5nIHByb2Nlc3NlcworCQkJCSAgIHN0b3Agd2FpdGluZy4gKi8KKwlhdG9taWNfZGVjKCZxLT5maW5hbGl6YXRpb24pOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg2ZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kbWEuYwpAQCAtMCwwICsxLDk0NiBAQAorLyogZ2FtbWFfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIEdNWCAyMDAwIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogRnJpIE1hciAxOSAxNDozMDoxNiAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiZ2FtbWEuaCIKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZ2FtbWFfZHJtLmgiCisjaW5jbHVkZSAiZ2FtbWFfZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4JLyogRm9yIHRhc2sgcXVldWUgc3VwcG9ydCAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnYW1tYV9kbWFfZGlzcGF0Y2goZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwlkcm1fZ2FtbWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCQkJKGRybV9nYW1tYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCW1iKCk7CisJd2hpbGUgKCBHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDIpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoR0FNTUFfRE1BQUREUkVTUywgYWRkcmVzcyk7CisKKwl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9HQ09NTUFORFNUQVRVUykgIT0gNCkKKwkJY3B1X3JlbGF4KCk7CisKKwlHQU1NQV9XUklURShHQU1NQV9ETUFDT1VOVCwgbGVuZ3RoIC8gNCk7Cit9CisKK3ZvaWQgZ2FtbWFfZG1hX3F1aWVzY2VudF9zaW5nbGUoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9ETUFDT1VOVCkpCisJCWNwdV9yZWxheCgpOworCisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfSU5GSUZPU1BBQ0UpIDwgMikKKwkJY3B1X3JlbGF4KCk7CisKKwlHQU1NQV9XUklURShHQU1NQV9GSUxURVJNT0RFLCAxIDw8IDEwKTsKKwlHQU1NQV9XUklURShHQU1NQV9TWU5DLCAwKTsKKworCWRvIHsKKwkJd2hpbGUgKCFHQU1NQV9SRUFEKEdBTU1BX09VVEZJRk9XT1JEUykpCisJCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX09VVFBVVEZJRk8pICE9IEdBTU1BX1NZTkNfVEFHKTsKK30KKwordm9pZCBnYW1tYV9kbWFfcXVpZXNjZW50X2R1YWwoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9ETUFDT1VOVCkpCisJCWNwdV9yZWxheCgpOworCisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfSU5GSUZPU1BBQ0UpIDwgMykKKwkJY3B1X3JlbGF4KCk7CisKKwlHQU1NQV9XUklURShHQU1NQV9CUk9BRENBU1RNQVNLLCAzKTsKKwlHQU1NQV9XUklURShHQU1NQV9GSUxURVJNT0RFLCAxIDw8IDEwKTsKKwlHQU1NQV9XUklURShHQU1NQV9TWU5DLCAwKTsKKworCS8qIFJlYWQgZnJvbSBmaXJzdCBNWCAqLworCWRvIHsKKwkJd2hpbGUgKCFHQU1NQV9SRUFEKEdBTU1BX09VVEZJRk9XT1JEUykpCisJCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX09VVFBVVEZJRk8pICE9IEdBTU1BX1NZTkNfVEFHKTsKKworCS8qIFJlYWQgZnJvbSBzZWNvbmQgTVggKi8KKwlkbyB7CisJCXdoaWxlICghR0FNTUFfUkVBRChHQU1NQV9PVVRGSUZPV09SRFMgKyAweDEwMDAwKSkKKwkJCWNwdV9yZWxheCgpOworCX0gd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfT1VUUFVURklGTyArIDB4MTAwMDApICE9IEdBTU1BX1NZTkNfVEFHKTsKK30KKwordm9pZCBnYW1tYV9kbWFfcmVhZHkoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwl3aGlsZSAoR0FNTUFfUkVBRChHQU1NQV9ETUFDT1VOVCkpCisJCWNwdV9yZWxheCgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnYW1tYV9kbWFfaXNfcmVhZHkoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlyZXR1cm4gKCFHQU1NQV9SRUFEKEdBTU1BX0RNQUNPVU5UKSk7Cit9CisKK2lycXJldHVybl90IGdhbW1hX2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICkKK3sKKwlkcm1fZGV2aWNlX3QJICpkZXYgPSAoZHJtX2RldmljZV90ICopYXJnOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCQkoZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBGSVhNRTogc2hvdWxkIGNoZWNrIHdoZXRoZXIgd2UncmUgYWN0dWFsbHkgaW50ZXJlc3RlZCBpbiB0aGUgaW50ZXJydXB0PyAqLworCWF0b21pY19pbmMoJmRldi0+Y291bnRzWzZdKTsgLyogX0RSTV9TVEFUX0lSUSAqLworCisJd2hpbGUgKEdBTU1BX1JFQUQoR0FNTUFfSU5GSUZPU1BBQ0UpIDwgMykKKwkJY3B1X3JlbGF4KCk7CisKKwlHQU1NQV9XUklURShHQU1NQV9HREVMQVlUSU1FUiwgMHhjMzUwLzIpOyAvKiAweDA1UyAqLworCUdBTU1BX1dSSVRFKEdBTU1BX0dDT01NQU5ESU5URkxBR1MsIDgpOworCUdBTU1BX1dSSVRFKEdBTU1BX0dJTlRGTEFHUywgMHgyMDAxKTsKKwlpZiAoZ2FtbWFfZG1hX2lzX3JlYWR5KGRldikpIHsKKwkJCQkvKiBGcmVlIHByZXZpb3VzIGJ1ZmZlciAqLworCQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5kbWFfZmxhZykpCisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCWlmIChkbWEtPnRoaXNfYnVmZmVyKSB7CisJCQlnYW1tYV9mcmVlX2J1ZmZlcihkZXYsIGRtYS0+dGhpc19idWZmZXIpOworCQkJZG1hLT50aGlzX2J1ZmZlciA9IE5VTEw7CisJCX0KKwkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKKworCQkvKiBEaXNwYXRjaCBuZXcgYnVmZmVyICovCisJCXNjaGVkdWxlX3dvcmsoJmRldi0+d29yayk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogT25seSBjYWxsZWQgYnkgZ2FtbWFfZG1hX3NjaGVkdWxlLiAqLworc3RhdGljIGludCBnYW1tYV9kb19kbWEoZHJtX2RldmljZV90ICpkZXYsIGludCBsb2NrZWQpCit7CisJdW5zaWduZWQgbG9uZwkgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nCSBsZW5ndGg7CisJZHJtX2J1Zl90CSAqYnVmOworCWludAkJIHJldGNvZGUgPSAwOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpKSByZXR1cm4gLUVCVVNZOworCisKKwlpZiAoIWRtYS0+bmV4dF9idWZmZXIpIHsKKwkJRFJNX0VSUk9SKCJObyBuZXh0X2J1ZmZlclxuIik7CisJCWNsZWFyX2JpdCgwLCAmZGV2LT5kbWFfZmxhZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJ1Zgk9IGRtYS0+bmV4dF9idWZmZXI7CisJLyogV0UgTk9XIEFSRSBPTiBMT0dJQ0FMIFBBR0VTISEgLSB1c2luZyBwYWdlIHRhYmxlIHNldHVwIGluIGRtYV9pbml0ICovCisJLyogU28gd2UgcGFzcyB0aGUgYnVmZmVyIGluZGV4IHZhbHVlIGludG8gdGhlIHBoeXNpY2FsIHBhZ2Ugb2Zmc2V0ICovCisJYWRkcmVzcyA9IGJ1Zi0+aWR4IDw8IDEyOworCWxlbmd0aAk9IGJ1Zi0+dXNlZDsKKworCURSTV9ERUJVRygiY29udGV4dCAlZCwgYnVmZmVyICVkICglbGQgYnl0ZXMpXG4iLAorCQkgIGJ1Zi0+Y29udGV4dCwgYnVmLT5pZHgsIGxlbmd0aCk7CisKKwlpZiAoYnVmLT5saXN0ID09IERSTV9MSVNUX1JFQ0xBSU0pIHsKKwkJZ2FtbWFfY2xlYXJfbmV4dF9idWZmZXIoZGV2KTsKKwkJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBidWYpOworCQljbGVhcl9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWxlbmd0aCkgeworCQlEUk1fRVJST1IoIjAgbGVuZ3RoIGJ1ZmZlclxuIik7CisJCWdhbW1hX2NsZWFyX25leHRfYnVmZmVyKGRldik7CisJCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgYnVmKTsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFnYW1tYV9kbWFfaXNfcmVhZHkoZGV2KSkgeworCQljbGVhcl9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChidWYtPndoaWxlX2xvY2tlZCkgeworCQlpZiAoIV9EUk1fTE9DS19JU19IRUxEKGRldi0+bG9jay5od19sb2NrLT5sb2NrKSkgeworCQkJRFJNX0VSUk9SKCJEaXNwYXRjaGluZyBidWZmZXIgJWQgZnJvbSBwaWQgJWQiCisJCQkJICAiIFwid2hpbGUgbG9ja2VkXCIsIGJ1dCBubyBsb2NrIGhlbGRcbiIsCisJCQkJICBidWYtPmlkeCwgY3VycmVudC0+cGlkKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghbG9ja2VkICYmICFnYW1tYV9sb2NrX3Rha2UoJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJCQkgICAgICBEUk1fS0VSTkVMX0NPTlRFWFQpKSB7CisJCQljbGVhcl9iaXQoMCwgJmRldi0+ZG1hX2ZsYWcpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCWlmIChkZXYtPmxhc3RfY29udGV4dCAhPSBidWYtPmNvbnRleHQKKwkgICAgJiYgIShkZXYtPnF1ZXVlbGlzdFtidWYtPmNvbnRleHRdLT5mbGFncworCQkgJiBfRFJNX0NPTlRFWFRfUFJFU0VSVkVEKSkgeworCQkJCS8qIFBSRTogZGV2LT5sYXN0X2NvbnRleHQgIT0gYnVmLT5jb250ZXh0ICovCisJCWlmIChEUk0oY29udGV4dF9zd2l0Y2gpKGRldiwgZGV2LT5sYXN0X2NvbnRleHQsCisJCQkJCWJ1Zi0+Y29udGV4dCkpIHsKKwkJCURSTShjbGVhcl9uZXh0X2J1ZmZlcikoZGV2KTsKKwkJCURSTShmcmVlX2J1ZmZlcikoZGV2LCBidWYpOworCQl9CisJCXJldGNvZGUgPSAtRUJVU1k7CisJCWdvdG8gY2xlYW51cDsKKworCQkJCS8qIFBPU1Q6IHdlIHdpbGwgd2FpdCBmb3IgdGhlIGNvbnRleHQKKwkJCQkgICBzd2l0Y2ggYW5kIHdpbGwgZGlzcGF0Y2ggb24gYSBsYXRlciBjYWxsCisJCQkJICAgd2hlbiBkZXYtPmxhc3RfY29udGV4dCA9PSBidWYtPmNvbnRleHQuCisJCQkJICAgTk9URSBXRSBIT0xEIFRIRSBMT0NLIFRIUk9VR0hPVVQgVEhJUworCQkJCSAgIFRJTUUhICovCisJfQorCisJZ2FtbWFfY2xlYXJfbmV4dF9idWZmZXIoZGV2KTsKKwlidWYtPnBlbmRpbmcJID0gMTsKKwlidWYtPndhaXRpbmcJID0gMDsKKwlidWYtPmxpc3QJID0gRFJNX0xJU1RfUEVORDsKKworCS8qIFdFIE5PVyBBUkUgT04gTE9HSUNBTCBQQUdFUyEhISAtIG92ZXJyaWRpbmcgYWRkcmVzcyAqLworCWFkZHJlc3MgPSBidWYtPmlkeCA8PCAxMjsKKworCWdhbW1hX2RtYV9kaXNwYXRjaChkZXYsIGFkZHJlc3MsIGxlbmd0aCk7CisJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBkbWEtPnRoaXNfYnVmZmVyKTsKKwlkbWEtPnRoaXNfYnVmZmVyID0gYnVmOworCisJYXRvbWljX2luYygmZGV2LT5jb3VudHNbN10pOyAvKiBfRFJNX1NUQVRfRE1BICovCisJYXRvbWljX2FkZChsZW5ndGgsICZkZXYtPmNvdW50c1s4XSk7IC8qIF9EUk1fU1RBVF9QUklNQVJZICovCisKKwlpZiAoIWJ1Zi0+d2hpbGVfbG9ja2VkICYmICFkZXYtPmNvbnRleHRfZmxhZyAmJiAhbG9ja2VkKSB7CisJCWlmIChnYW1tYV9sb2NrX2ZyZWUoZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssCisJCQkJICBEUk1fS0VSTkVMX0NPTlRFWFQpKSB7CisJCQlEUk1fRVJST1IoIlxuIik7CisJCX0KKwl9CitjbGVhbnVwOgorCisJY2xlYXJfYml0KDAsICZkZXYtPmRtYV9mbGFnKTsKKworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyB2b2lkIGdhbW1hX2RtYV90aW1lcl9iaCh1bnNpZ25lZCBsb25nIGRldikKK3sKKwlnYW1tYV9kbWFfc2NoZWR1bGUoKGRybV9kZXZpY2VfdCAqKWRldiwgMCk7Cit9CisKK3ZvaWQgZ2FtbWFfaXJxX2ltbWVkaWF0ZV9iaCh2b2lkICpkZXYpCit7CisJZ2FtbWFfZG1hX3NjaGVkdWxlKGRldiwgMCk7Cit9CisKK2ludCBnYW1tYV9kbWFfc2NoZWR1bGUoZHJtX2RldmljZV90ICpkZXYsIGludCBsb2NrZWQpCit7CisJaW50CQkgbmV4dDsKKwlkcm1fcXVldWVfdAkgKnE7CisJZHJtX2J1Zl90CSAqYnVmOworCWludAkJIHJldGNvZGUgICA9IDA7CisJaW50CQkgcHJvY2Vzc2VkID0gMDsKKwlpbnQJCSBtaXNzZWQ7CisJaW50CQkgZXhwaXJlCSAgID0gMjA7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hCSAgID0gZGV2LT5kbWE7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZykpIHsKKwkJCQkvKiBOb3QgcmVlbnRyYW50ICovCisJCWF0b21pY19pbmMoJmRldi0+Y291bnRzWzEwXSk7IC8qIF9EUk1fU1RBVF9NSVNTRUQgKi8KKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJbWlzc2VkID0gYXRvbWljX3JlYWQoJmRldi0+Y291bnRzWzEwXSk7CisKKworYWdhaW46CisJaWYgKGRldi0+Y29udGV4dF9mbGFnKSB7CisJCWNsZWFyX2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChkbWEtPm5leHRfYnVmZmVyKSB7CisJCQkJLyogVW5zZW50IGJ1ZmZlciB0aGF0IHdhcyBwcmV2aW91c2x5CisJCQkJICAgc2VsZWN0ZWQsIGJ1dCB0aGF0IGNvdWxkbid0IGJlIHNlbnQKKwkJCQkgICBiZWNhdXNlIHRoZSBsb2NrIGNvdWxkIG5vdCBiZSBvYnRhaW5lZAorCQkJCSAgIG9yIHRoZSBETUEgZW5naW5lIHdhc24ndCByZWFkeS4gIFRyeQorCQkJCSAgIGFnYWluLiAqLworCQlpZiAoIShyZXRjb2RlID0gZ2FtbWFfZG9fZG1hKGRldiwgbG9ja2VkKSkpICsrcHJvY2Vzc2VkOworCX0gZWxzZSB7CisJCWRvIHsKKwkJCW5leHQgPSBnYW1tYV9zZWxlY3RfcXVldWUoZGV2LCBnYW1tYV9kbWFfdGltZXJfYmgpOworCQkJaWYgKG5leHQgPj0gMCkgeworCQkJCXEgICA9IGRldi0+cXVldWVsaXN0W25leHRdOworCQkJCWJ1ZiA9IGdhbW1hX3dhaXRsaXN0X2dldCgmcS0+d2FpdGxpc3QpOworCQkJCWRtYS0+bmV4dF9idWZmZXIgPSBidWY7CisJCQkJZG1hLT5uZXh0X3F1ZXVlCSA9IHE7CisJCQkJaWYgKGJ1ZiAmJiBidWYtPmxpc3QgPT0gRFJNX0xJU1RfUkVDTEFJTSkgeworCQkJCQlnYW1tYV9jbGVhcl9uZXh0X2J1ZmZlcihkZXYpOworCQkJCQlnYW1tYV9mcmVlX2J1ZmZlcihkZXYsIGJ1Zik7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChuZXh0ID49IDAgJiYgIWRtYS0+bmV4dF9idWZmZXIpOworCQlpZiAoZG1hLT5uZXh0X2J1ZmZlcikgeworCQkJaWYgKCEocmV0Y29kZSA9IGdhbW1hX2RvX2RtYShkZXYsIGxvY2tlZCkpKSB7CisJCQkJKytwcm9jZXNzZWQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoLS1leHBpcmUpIHsKKwkJaWYgKG1pc3NlZCAhPSBhdG9taWNfcmVhZCgmZGV2LT5jb3VudHNbMTBdKSkgeworCQkJaWYgKGdhbW1hX2RtYV9pc19yZWFkeShkZXYpKSBnb3RvIGFnYWluOworCQl9CisJCWlmIChwcm9jZXNzZWQgJiYgZ2FtbWFfZG1hX2lzX3JlYWR5KGRldikpIHsKKwkJCXByb2Nlc3NlZCA9IDA7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJY2xlYXJfYml0KDAsICZkZXYtPmludGVycnVwdF9mbGFnKTsKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgaW50IGdhbW1hX2RtYV9wcmlvcml0eShzdHJ1Y3QgZmlsZSAqZmlscCwgCisJCQkgICAgICBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2RtYV90ICpkKQoreworCXVuc2lnbmVkIGxvbmcJICBhZGRyZXNzOworCXVuc2lnbmVkIGxvbmcJICBsZW5ndGg7CisJaW50CQkgIG11c3RfZnJlZSA9IDA7CisJaW50CQkgIHJldGNvZGUgICA9IDA7CisJaW50CQkgIGk7CisJaW50CQkgIGlkeDsKKwlkcm1fYnVmX3QJICAqYnVmOworCWRybV9idWZfdAkgICpsYXN0X2J1ZiA9IE5VTEw7CisJZHJtX2RldmljZV9kbWFfdCAgKmRtYQkgICAgPSBkZXYtPmRtYTsKKwlpbnQJCSAgKnNlbmRfaW5kaWNlcyA9IE5VTEw7CisJaW50CQkgICpzZW5kX3NpemVzID0gTlVMTDsKKworCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsKKworCQkJCS8qIFR1cm4gb2ZmIGludGVycnVwdCBoYW5kbGluZyAqLworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkZXYtPmludGVycnVwdF9mbGFnKSkgeworCQlzY2hlZHVsZSgpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHJldHVybiAtRUlOVFI7CisJfQorCWlmICghKGQtPmZsYWdzICYgX0RSTV9ETUFfV0hJTEVfTE9DS0VEKSkgeworCQl3aGlsZSAoIWdhbW1hX2xvY2tfdGFrZSgmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssCisJCQkJICAgICAgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWNsZWFyX2JpdCgwLCAmZGV2LT5pbnRlcnJ1cHRfZmxhZyk7CisJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCX0KKwkJfQorCQkrK211c3RfZnJlZTsKKwl9CisKKwlzZW5kX2luZGljZXMgPSBEUk0oYWxsb2MpKGQtPnNlbmRfY291bnQgKiBzaXplb2YoKnNlbmRfaW5kaWNlcyksCisJCQkJICBEUk1fTUVNX0RSSVZFUik7CisJaWYgKHNlbmRfaW5kaWNlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoY29weV9mcm9tX3VzZXIoc2VuZF9pbmRpY2VzLCBkLT5zZW5kX2luZGljZXMsIAorCQkJICAgZC0+c2VuZF9jb3VudCAqIHNpemVvZigqc2VuZF9pbmRpY2VzKSkpIHsKKwkJcmV0Y29kZSA9IC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworCX0KKwkKKwlzZW5kX3NpemVzID0gRFJNKGFsbG9jKShkLT5zZW5kX2NvdW50ICogc2l6ZW9mKCpzZW5kX3NpemVzKSwKKwkJCQlEUk1fTUVNX0RSSVZFUik7CisJaWYgKHNlbmRfc2l6ZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKHNlbmRfc2l6ZXMsIGQtPnNlbmRfc2l6ZXMsIAorCQkJICAgZC0+c2VuZF9jb3VudCAqIHNpemVvZigqc2VuZF9zaXplcykpKSB7CisJCXJldGNvZGUgPSAtRUZBVUxUOworICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZC0+c2VuZF9jb3VudDsgaSsrKSB7CisJCWlkeCA9IHNlbmRfaW5kaWNlc1tpXTsKKwkJaWYgKGlkeCA8IDAgfHwgaWR4ID49IGRtYS0+YnVmX2NvdW50KSB7CisJCQlEUk1fRVJST1IoIkluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJCSAgc2VuZF9pbmRpY2VzW2ldLCBkbWEtPmJ1Zl9jb3VudCAtIDEpOworCQkJY29udGludWU7CisJCX0KKwkJYnVmID0gZG1hLT5idWZsaXN0WyBpZHggXTsKKwkJaWYgKGJ1Zi0+ZmlscCAhPSBmaWxwKSB7CisJCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG5vdCBvd25lZFxuIiwKKwkJCQkgIGN1cnJlbnQtPnBpZCk7CisJCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAoYnVmLT5saXN0ICE9IERSTV9MSVNUX05PTkUpIHsKKwkJCURSTV9FUlJPUigiUHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb24gbGlzdCAlZFxuIiwKKwkJCQkgIGN1cnJlbnQtPnBpZCwgYnVmLT5saXN0KTsKKwkJCXJldGNvZGUgPSAtRUlOVkFMOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCQkJLyogVGhpcyBpc24ndCBhIHJhY2UgY29uZGl0aW9uIG9uCisJCQkJICAgYnVmLT5saXN0LCBzaW5jZSBvdXIgY29uY2VybiBpcyB0aGUKKwkJCQkgICBidWZmZXIgcmVjbGFpbSBkdXJpbmcgdGhlIHRpbWUgdGhlCisJCQkJICAgcHJvY2VzcyBjbG9zZXMgdGhlIC9kZXYvZHJtPyBoYW5kbGUsIHNvCisJCQkJICAgaXQgY2FuJ3QgYWxzbyBiZSBkb2luZyBETUEuICovCisJCWJ1Zi0+bGlzdAkgID0gRFJNX0xJU1RfUFJJTzsKKwkJYnVmLT51c2VkCSAgPSBzZW5kX3NpemVzW2ldOworCQlidWYtPmNvbnRleHQJICA9IGQtPmNvbnRleHQ7CisJCWJ1Zi0+d2hpbGVfbG9ja2VkID0gZC0+ZmxhZ3MgJiBfRFJNX0RNQV9XSElMRV9MT0NLRUQ7CisJCWFkZHJlc3MJCSAgPSAodW5zaWduZWQgbG9uZylidWYtPmFkZHJlc3M7CisJCWxlbmd0aAkJICA9IGJ1Zi0+dXNlZDsKKwkJaWYgKCFsZW5ndGgpIHsKKwkJCURSTV9FUlJPUigiMCBsZW5ndGggYnVmZmVyXG4iKTsKKwkJfQorCQlpZiAoYnVmLT5wZW5kaW5nKSB7CisJCQlEUk1fRVJST1IoIlNlbmRpbmcgcGVuZGluZyBidWZmZXI6IgorCQkJCSAgIiBidWZmZXIgJWQsIG9mZnNldCAlZFxuIiwKKwkJCQkgIHNlbmRfaW5kaWNlc1tpXSwgaSk7CisJCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAoYnVmLT53YWl0aW5nKSB7CisJCQlEUk1fRVJST1IoIlNlbmRpbmcgd2FpdGluZyBidWZmZXI6IgorCQkJCSAgIiBidWZmZXIgJWQsIG9mZnNldCAlZFxuIiwKKwkJCQkgIHNlbmRfaW5kaWNlc1tpXSwgaSk7CisJCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlidWYtPnBlbmRpbmcgPSAxOworCisJCWlmIChkZXYtPmxhc3RfY29udGV4dCAhPSBidWYtPmNvbnRleHQKKwkJICAgICYmICEoZGV2LT5xdWV1ZWxpc3RbYnVmLT5jb250ZXh0XS0+ZmxhZ3MKKwkJCSAmIF9EUk1fQ09OVEVYVF9QUkVTRVJWRUQpKSB7CisJCQlhZGRfd2FpdF9xdWV1ZSgmZGV2LT5jb250ZXh0X3dhaXQsICZlbnRyeSk7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJCQkvKiBQUkU6IGRldi0+bGFzdF9jb250ZXh0ICE9IGJ1Zi0+Y29udGV4dCAqLworCQkJRFJNKGNvbnRleHRfc3dpdGNoKShkZXYsIGRldi0+bGFzdF9jb250ZXh0LAorCQkJCQkgICAgYnVmLT5jb250ZXh0KTsKKwkJCQkvKiBQT1NUOiB3ZSB3aWxsIHdhaXQgZm9yIHRoZSBjb250ZXh0CisJCQkJICAgc3dpdGNoIGFuZCB3aWxsIGRpc3BhdGNoIG9uIGEgbGF0ZXIgY2FsbAorCQkJCSAgIHdoZW4gZGV2LT5sYXN0X2NvbnRleHQgPT0gYnVmLT5jb250ZXh0LgorCQkJCSAgIE5PVEUgV0UgSE9MRCBUSEUgTE9DSyBUSFJPVUdIT1VUIFRISVMKKwkJCQkgICBUSU1FISAqLworCQkJc2NoZWR1bGUoKTsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+Y29udGV4dF93YWl0LCAmZW50cnkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0Y29kZSA9IC1FSU5UUjsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlpZiAoZGV2LT5sYXN0X2NvbnRleHQgIT0gYnVmLT5jb250ZXh0KSB7CisJCQkJRFJNX0VSUk9SKCJDb250ZXh0IG1pc21hdGNoOiAlZCAlZFxuIiwKKwkJCQkJICBkZXYtPmxhc3RfY29udGV4dCwKKwkJCQkJICBidWYtPmNvbnRleHQpOworCQkJfQorCQl9CisKKwkJZ2FtbWFfZG1hX2Rpc3BhdGNoKGRldiwgYWRkcmVzcywgbGVuZ3RoKTsKKwkJYXRvbWljX2luYygmZGV2LT5jb3VudHNbOV0pOyAvKiBfRFJNX1NUQVRfU1BFQ0lBTCAqLworCQlhdG9taWNfYWRkKGxlbmd0aCwgJmRldi0+Y291bnRzWzhdKTsgLyogX0RSTV9TVEFUX1BSSU1BUlkgKi8KKworCQlpZiAobGFzdF9idWYpIHsKKwkJCWdhbW1hX2ZyZWVfYnVmZmVyKGRldiwgbGFzdF9idWYpOworCQl9CisJCWxhc3RfYnVmID0gYnVmOworCX0KKworCitjbGVhbnVwOgorCWlmIChsYXN0X2J1ZikgeworCQlnYW1tYV9kbWFfcmVhZHkoZGV2KTsKKwkJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBsYXN0X2J1Zik7CisJfQorCWlmIChzZW5kX2luZGljZXMpCisJCURSTShmcmVlKShzZW5kX2luZGljZXMsIGQtPnNlbmRfY291bnQgKiBzaXplb2YoKnNlbmRfaW5kaWNlcyksIAorCQkJICBEUk1fTUVNX0RSSVZFUik7CisJaWYgKHNlbmRfc2l6ZXMpCisJCURSTShmcmVlKShzZW5kX3NpemVzLCBkLT5zZW5kX2NvdW50ICogc2l6ZW9mKCpzZW5kX3NpemVzKSwgCisJCQkgIERSTV9NRU1fRFJJVkVSKTsKKworCWlmIChtdXN0X2ZyZWUgJiYgIWRldi0+Y29udGV4dF9mbGFnKSB7CisJCWlmIChnYW1tYV9sb2NrX2ZyZWUoZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssCisJCQkJICBEUk1fS0VSTkVMX0NPTlRFWFQpKSB7CisJCQlEUk1fRVJST1IoIlxuIik7CisJCX0KKwl9CisJY2xlYXJfYml0KDAsICZkZXYtPmludGVycnVwdF9mbGFnKTsKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBnYW1tYV9kbWFfc2VuZF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgZHJtX2RldmljZV90ICpkZXYsIGRybV9kbWFfdCAqZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7CisJZHJtX2J1Zl90CSAgKmxhc3RfYnVmID0gTlVMTDsKKwlpbnQJCSAgcmV0Y29kZSAgID0gMDsKKwlkcm1fZGV2aWNlX2RtYV90ICAqZG1hCSAgICA9IGRldi0+ZG1hOworCWludCAgICAgICAgICAgICAgIHNlbmRfaW5kZXg7CisKKwlpZiAoZ2V0X3VzZXIoc2VuZF9pbmRleCwgJmQtPnNlbmRfaW5kaWNlc1tkLT5zZW5kX2NvdW50LTFdKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZC0+ZmxhZ3MgJiBfRFJNX0RNQV9CTE9DSykgeworCQlsYXN0X2J1ZiA9IGRtYS0+YnVmbGlzdFtzZW5kX2luZGV4XTsKKwkJYWRkX3dhaXRfcXVldWUoJmxhc3RfYnVmLT5kbWFfd2FpdCwgJmVudHJ5KTsKKwl9CisKKwlpZiAoKHJldGNvZGUgPSBnYW1tYV9kbWFfZW5xdWV1ZShmaWxwLCBkKSkpIHsKKwkJaWYgKGQtPmZsYWdzICYgX0RSTV9ETUFfQkxPQ0spCisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmbGFzdF9idWYtPmRtYV93YWl0LCAmZW50cnkpOworCQlyZXR1cm4gcmV0Y29kZTsKKwl9CisKKwlnYW1tYV9kbWFfc2NoZWR1bGUoZGV2LCAwKTsKKworCWlmIChkLT5mbGFncyAmIF9EUk1fRE1BX0JMT0NLKSB7CisJCURSTV9ERUJVRygiJWQgd2FpdGluZ1xuIiwgY3VycmVudC0+cGlkKTsKKwkJZm9yICg7OykgeworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQlpZiAoIWxhc3RfYnVmLT53YWl0aW5nICYmICFsYXN0X2J1Zi0+cGVuZGluZykKKwkJCQlicmVhazsgLyogZmluaXNoZWQgKi8KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXRjb2RlID0gLUVJTlRSOyAvKiBDYW4ndCByZXN0YXJ0ICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCURSTV9ERUJVRygiJWQgcnVubmluZ1xuIiwgY3VycmVudC0+cGlkKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmxhc3RfYnVmLT5kbWFfd2FpdCwgJmVudHJ5KTsKKwkJaWYgKCFyZXRjb2RlCisJCSAgICB8fCAobGFzdF9idWYtPmxpc3Q9PURSTV9MSVNUX1BFTkQgJiYgIWxhc3RfYnVmLT5wZW5kaW5nKSkgeworCQkJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZsYXN0X2J1Zi0+ZG1hX3dhaXQpKSB7CisJCQkJZ2FtbWFfZnJlZV9idWZmZXIoZGV2LCBsYXN0X2J1Zik7CisJCQl9CisJCX0KKwkJaWYgKHJldGNvZGUpIHsKKwkJCURSTV9FUlJPUigiY3R4JWQgdyVkIHAlZCBjJWxkIGklZCBsJWQgcGlkOiVkXG4iLAorCQkJCSAgZC0+Y29udGV4dCwKKwkJCQkgIGxhc3RfYnVmLT53YWl0aW5nLAorCQkJCSAgbGFzdF9idWYtPnBlbmRpbmcsCisJCQkJICAobG9uZylEUk1fV0FJVENPVU5UKGRldiwgZC0+Y29udGV4dCksCisJCQkJICBsYXN0X2J1Zi0+aWR4LAorCQkJCSAgbGFzdF9idWYtPmxpc3QsCisJCQkJICBjdXJyZW50LT5waWQpOworCQl9CisJfQorCXJldHVybiByZXRjb2RlOworfQorCitpbnQgZ2FtbWFfZG1hKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgICAgPSBwcml2LT5kZXY7CisJZHJtX2RldmljZV9kbWFfdCAgKmRtYQkgICAgPSBkZXYtPmRtYTsKKwlpbnQJCSAgcmV0Y29kZSAgID0gMDsKKwlkcm1fZG1hX3QJICBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2RtYV90CSAgZDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZCwgYXJncCwgc2l6ZW9mKGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZC5zZW5kX2NvdW50IDwgMCB8fCBkLnNlbmRfY291bnQgPiBkbWEtPmJ1Zl9jb3VudCkgeworCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdHJ5aW5nIHRvIHNlbmQgJWQgYnVmZmVycyAob2YgJWQgbWF4KVxuIiwKKwkJCSAgY3VycmVudC0+cGlkLCBkLnNlbmRfY291bnQsIGRtYS0+YnVmX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGQucmVxdWVzdF9jb3VudCA8IDAgfHwgZC5yZXF1ZXN0X2NvdW50ID4gZG1hLT5idWZfY291bnQpIHsKKwkJRFJNX0VSUk9SKCJQcm9jZXNzICVkIHRyeWluZyB0byBnZXQgJWQgYnVmZmVycyAob2YgJWQgbWF4KVxuIiwKKwkJCSAgY3VycmVudC0+cGlkLCBkLnJlcXVlc3RfY291bnQsIGRtYS0+YnVmX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGQuc2VuZF9jb3VudCkgeworCQlpZiAoZC5mbGFncyAmIF9EUk1fRE1BX1BSSU9SSVRZKQorCQkJcmV0Y29kZSA9IGdhbW1hX2RtYV9wcmlvcml0eShmaWxwLCBkZXYsICZkKTsKKwkJZWxzZQorCQkJcmV0Y29kZSA9IGdhbW1hX2RtYV9zZW5kX2J1ZmZlcnMoZmlscCwgZGV2LCAmZCk7CisJfQorCisJZC5ncmFudGVkX2NvdW50ID0gMDsKKworCWlmICghcmV0Y29kZSAmJiBkLnJlcXVlc3RfY291bnQpIHsKKwkJcmV0Y29kZSA9IGdhbW1hX2RtYV9nZXRfYnVmZmVycyhmaWxwLCAmZCk7CisJfQorCisJRFJNX0RFQlVHKCIlZCByZXR1cm5pbmcsIGdyYW50ZWQgPSAlZFxuIiwKKwkJICBjdXJyZW50LT5waWQsIGQuZ3JhbnRlZF9jb3VudCk7CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZCwgc2l6ZW9mKGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRE1BIGluaXRpYWxpemF0aW9uLCBjbGVhbnVwCisgKi8KKworc3RhdGljIGludCBnYW1tYV9kb19pbml0X2RtYSggZHJtX2RldmljZV90ICpkZXYsIGRybV9nYW1tYV9pbml0X3QgKmluaXQgKQoreworCWRybV9nYW1tYV9wcml2YXRlX3QgKmRldl9wcml2OworCWRybV9kZXZpY2VfZG1hX3QgICAgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdAkgICAgKmJ1ZjsKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICpsaXN0OworCXVuc2lnbmVkIGxvbmcJICAgICpwZ3Q7CisKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlkZXZfcHJpdiA9IERSTShhbGxvYykoIHNpemVvZihkcm1fZ2FtbWFfcHJpdmF0ZV90KSwKKwkJCQkJCQlEUk1fTUVNX0RSSVZFUiApOworCWlmICggIWRldl9wcml2ICkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKworCW1lbXNldCggZGV2X3ByaXYsIDAsIHNpemVvZihkcm1fZ2FtbWFfcHJpdmF0ZV90KSApOworCisJZGV2X3ByaXYtPm51bV9yYXN0ID0gaW5pdC0+bnVtX3Jhc3Q7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQlpZiggcl9saXN0LT5tYXAgJiYKKwkJICAgIHJfbGlzdC0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCisJCSAgICByX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0sgKSB7CisJCQlkZXZfcHJpdi0+c2FyZWEgPSByX2xpc3QtPm1hcDsKKyAJCQlicmVhazsKKyAJCX0KKyAJfQorCQorCWRldl9wcml2LT5tbWlvMCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvMCk7CisJZGV2X3ByaXYtPm1taW8xID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW8xKTsKKwlkZXZfcHJpdi0+bW1pbzIgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pbzIpOworCWRldl9wcml2LT5tbWlvMyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvMyk7CisJCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPSAoZHJtX2dhbW1hX3NhcmVhX3QgKikKKwkJKCh1OCAqKWRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsKKwkJIGluaXQtPnNhcmVhX3ByaXZfb2Zmc2V0KTsKKworCWlmIChpbml0LT5wY2ltb2RlKSB7CisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtHTElOVF9EUklfQlVGX0NPVU5UXTsKKwkJcGd0ID0gYnVmLT5hZGRyZXNzOworCisgCQlmb3IgKGkgPSAwOyBpIDwgR0xJTlRfRFJJX0JVRl9DT1VOVDsgaSsrKSB7CisJCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCQkqcGd0ID0gdmlydF90b19waHlzKCh2b2lkKilidWYtPmFkZHJlc3MpIHwgMHgwNzsKKwkJCXBndCsrOworCQl9CisKKwkJYnVmID0gZG1hLT5idWZsaXN0W0dMSU5UX0RSSV9CVUZfQ09VTlRdOworCX0gZWxzZSB7CisJCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+YnVmZmVyc19vZmZzZXQpOworCQlkcm1fY29yZV9pb3JlbWFwKCBkZXYtPmFncF9idWZmZXJfbWFwLCBkZXYpOworCisJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtHTElOVF9EUklfQlVGX0NPVU5UXTsKKwkJcGd0ID0gYnVmLT5hZGRyZXNzOworCisgCQlmb3IgKGkgPSAwOyBpIDwgR0xJTlRfRFJJX0JVRl9DT1VOVDsgaSsrKSB7CisJCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCQkqcGd0ID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5hZGRyZXNzICsgMHgwNzsKKwkJCXBndCsrOworCQl9CisKKwkJYnVmID0gZG1hLT5idWZsaXN0W0dMSU5UX0RSSV9CVUZfQ09VTlRdOworCisJCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDEpOworCQlHQU1NQV9XUklURSggR0FNTUFfR0RNQUNPTlRST0wsIDB4ZSk7CisJfQorCXdoaWxlIChHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDIpOworCUdBTU1BX1dSSVRFKCBHQU1NQV9QQUdFVEFCTEVBRERSLCB2aXJ0X3RvX3BoeXMoKHZvaWQqKWJ1Zi0+YWRkcmVzcykgKTsKKwlHQU1NQV9XUklURSggR0FNTUFfUEFHRVRBQkxFTEVOR1RILCAyICk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdhbW1hX2RvX2NsZWFudXBfZG1hKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCisJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQorCSAqIGlzIGZyZWVkLCBpdCdzIHRvbyBsYXRlLgorCSAqLworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKKwkJaWYgKCBkZXYtPmlycV9lbmFibGVkICkgCisJCQlEUk0oaXJxX3VuaW5zdGFsbCkoZGV2KTsKKworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsKKworCQlpZiAoIGRldi0+YWdwX2J1ZmZlcl9tYXAgIT0gTlVMTCApCisJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2ICk7CisKKwkJRFJNKGZyZWUpKCBkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX2dhbW1hX3ByaXZhdGVfdCksCisJCQkgICBEUk1fTUVNX0RSSVZFUiApOworCQlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdhbW1hX2RtYV9pbml0KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmRldjsKKwlkcm1fZ2FtbWFfaW5pdF90IGluaXQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCBjb3B5X2Zyb21fdXNlciggJmluaXQsIChkcm1fZ2FtbWFfaW5pdF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGluaXQpICkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoIGluaXQuZnVuYyApIHsKKwljYXNlIEdBTU1BX0lOSVRfRE1BOgorCQlyZXR1cm4gZ2FtbWFfZG9faW5pdF9kbWEoIGRldiwgJmluaXQgKTsKKwljYXNlIEdBTU1BX0NMRUFOVVBfRE1BOgorCQlyZXR1cm4gZ2FtbWFfZG9fY2xlYW51cF9kbWEoIGRldiApOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGdhbW1hX2RvX2NvcHlfZG1hKCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2dhbW1hX2NvcHlfdCAqY29weSApCit7CisJZHJtX2RldmljZV9kbWFfdCAgICAqZG1hID0gZGV2LT5kbWE7CisJdW5zaWduZWQgaW50ICAgICAgICAqc2NyZWVuYnVmOworCisJRFJNX0RFQlVHKCAiJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogV2UndmUgRFJNX1JFU1RSSUNURUQgdGhpcyBETUEgYnVmZmVyICovCisKKwlzY3JlZW5idWYgPSBkbWEtPmJ1Zmxpc3RbIEdMSU5UX0RSSV9CVUZfQ09VTlQgKyAxIF0tPmFkZHJlc3M7CisKKyNpZiAwCisJKmJ1ZmZlcisrID0gMHgxODA7CS8qIFRhZyAoRmlsdGVyTW9kZSkgKi8KKwkqYnVmZmVyKysgPSAweDIwMDsJLyogQWxsb3cgRkJDb2xvciB0aHJvdWdoICovCisJKmJ1ZmZlcisrID0gMHg1M0I7CS8qIFRhZyAqLworCSpidWZmZXIrKyA9IGNvcHktPlBpdGNoOworCSpidWZmZXIrKyA9IDB4NTNBOwkvKiBUYWcgKi8KKwkqYnVmZmVyKysgPSBjb3B5LT5TcmNBZGRyZXNzOworCSpidWZmZXIrKyA9IDB4NTM5OwkvKiBUYWcgKi8KKwkqYnVmZmVyKysgPSBjb3B5LT5XaWR0aEhlaWdodDsgLyogSW5pdGlhdGVzIHRyYW5zZmVyICovCisJKmJ1ZmZlcisrID0gMHg1M0M7CS8qIFRhZyAtIERNQU91dHB1dEFkZHJlc3MgKi8KKwkqYnVmZmVyKysgPSB2aXJ0X3RvX3BoeXMoKHZvaWQqKXNjcmVlbmJ1Zik7CisJKmJ1ZmZlcisrID0gMHg1M0Q7CS8qIFRhZyAtIERNQU91dHB1dENvdW50ICovCisJKmJ1ZmZlcisrID0gY29weS0+Q291bnQ7IC8qIFJlYWRzIEhvc3RPdXRGaWZvIEJMT0NLUyB1bnRpbCAuLiovCisKKwkvKiBEYXRhIG5vdyBzaXR0aW5nIGluIGRtYS0+YnVmbGlzdFsgR0xJTlRfRFJJX0JVRl9DT1VOVCArIDEgXSAqLworCS8qIE5vdyBwdXQgaXQgYmFjayB0byB0aGUgc2NyZWVuICovCisKKwkqYnVmZmVyKysgPSAweDE4MDsJLyogVGFnIChGaWx0ZXJNb2RlKSAqLworCSpidWZmZXIrKyA9IDB4NDAwOwkvKiBBbGxvdyBTeW5jIHRocm91Z2ggKi8KKwkqYnVmZmVyKysgPSAweDUzODsJLyogVGFnIC0gRE1BUmVjdGFuZ2xlUmVhZFRhcmdldCAqLworCSpidWZmZXIrKyA9IDB4MTU1OwkvKiBGQlNvdXJjZURhdGEgfCBjb3VudCAqLworCSpidWZmZXIrKyA9IDB4NTM3OwkvKiBUYWcgKi8KKwkqYnVmZmVyKysgPSBjb3B5LT5QaXRjaDsKKwkqYnVmZmVyKysgPSAweDUzNjsJLyogVGFnICovCisJKmJ1ZmZlcisrID0gY29weS0+RHN0QWRkcmVzczsKKwkqYnVmZmVyKysgPSAweDUzNTsJLyogVGFnICovCisJKmJ1ZmZlcisrID0gY29weS0+V2lkdGhIZWlnaHQ7IC8qIEluaXRpYXRlcyB0cmFuc2ZlciAqLworCSpidWZmZXIrKyA9IDB4NTMwOwkvKiBUYWcgLSBETUFBZGRyICovCisJKmJ1ZmZlcisrID0gdmlydF90b19waHlzKCh2b2lkKilzY3JlZW5idWYpOworCSpidWZmZXIrKyA9IDB4NTMxOworCSpidWZmZXIrKyA9IGNvcHktPkNvdW50OyAvKiBpbml0aWF0ZXMgRE1BIHRyYW5zZmVyIG9mIGNvbG9yIGRhdGEgKi8KKyNlbmRpZgorCisJLyogbmVlZCB0byBkaXNwYXRjaCBpdCBub3cgKi8KKworCXJldHVybiAwOworfQorCitpbnQgZ2FtbWFfZG1hX2NvcHkoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+ZGV2OworCWRybV9nYW1tYV9jb3B5X3QgY29weTsKKworCWlmICggY29weV9mcm9tX3VzZXIoICZjb3B5LCAoZHJtX2dhbW1hX2NvcHlfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjb3B5KSApICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZ2FtbWFfZG9fY29weV9kbWEoIGRldiwgJmNvcHkgKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyIENvbnRleHQgU0FSRUEgU3VwcG9ydAorICovCisKK2ludCBnYW1tYV9nZXRzYXJlYWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OworCWRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2N0eF9wcml2X21hcF90IHJlcXVlc3Q7CisJZHJtX21hcF90ICptYXA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlpZiAoKGludClyZXF1ZXN0LmN0eF9pZCA+PSBkZXYtPm1heF9jb250ZXh0KSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXAgPSBkZXYtPmNvbnRleHRfc2FyZWFzW3JlcXVlc3QuY3R4X2lkXTsKKwl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKworCXJlcXVlc3QuaGFuZGxlID0gbWFwLT5oYW5kbGU7CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnYW1tYV9zZXRzYXJlYWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+ZGV2OworCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OworCWRybV9tYXBfdCAqbWFwID0gTlVMTDsKKwlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsCisJCQkgICAoZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqKWFyZywKKwkJCSAgIHNpemVvZihyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlyX2xpc3QgPSBOVUxMOworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJaWYocl9saXN0LT5tYXAgJiYKKwkJICAgcl9saXN0LT5tYXAtPmhhbmRsZSA9PSByZXF1ZXN0LmhhbmRsZSkgYnJlYWs7CisJfQorCWlmIChsaXN0ID09ICYoZGV2LT5tYXBsaXN0LT5oZWFkKSkgeworCQl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1hcCA9IHJfbGlzdC0+bWFwOworCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisJaWYgKCFtYXApIHJldHVybiAtRUlOVkFMOworCisJZG93bigmZGV2LT5zdHJ1Y3Rfc2VtKTsKKwlpZiAoKGludClyZXF1ZXN0LmN0eF9pZCA+PSBkZXYtPm1heF9jb250ZXh0KSB7CisJCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2LT5jb250ZXh0X3NhcmVhc1tyZXF1ZXN0LmN0eF9pZF0gPSBtYXA7CisJdXAoJmRldi0+c3RydWN0X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2FtbWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1fZ2FtbWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCQkJKGRybV9nYW1tYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJd2hpbGUoR0FNTUFfUkVBRChHQU1NQV9JTkZJRk9TUEFDRSkgPCAyKQorCQljcHVfcmVsYXgoKTsKKworCUdBTU1BX1dSSVRFKCBHQU1NQV9HQ09NTUFORE1PREUsCTB4MDAwMDAwMDQgKTsKKwlHQU1NQV9XUklURSggR0FNTUFfR0RNQUNPTlRST0wsCQkweDAwMDAwMDAwICk7Cit9CisKK3ZvaWQgZ2FtbWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCXdoaWxlKEdBTU1BX1JFQUQoR0FNTUFfSU5GSUZPU1BBQ0UpIDwgMykKKwkJY3B1X3JlbGF4KCk7CisKKwlHQU1NQV9XUklURSggR0FNTUFfR0lOVEVOQUJMRSwJCTB4MDAwMDIwMDEgKTsKKwlHQU1NQV9XUklURSggR0FNTUFfQ09NTUFORElOVEVOQUJMRSwJMHgwMDAwMDAwOCApOworCUdBTU1BX1dSSVRFKCBHQU1NQV9HREVMQVlUSU1FUiwJCTB4MDAwMzkwOTAgKTsKK30KKwordm9pZCBnYW1tYV9kcml2ZXJfaXJxX3VuaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisJZHJtX2dhbW1hX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkJCShkcm1fZ2FtbWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAoIWRldl9wcml2KQorCQlyZXR1cm47CisKKwl3aGlsZShHQU1NQV9SRUFEKEdBTU1BX0lORklGT1NQQUNFKSA8IDMpCisJCWNwdV9yZWxheCgpOworCisJR0FNTUFfV1JJVEUoIEdBTU1BX0dERUxBWVRJTUVSLAkJMHgwMDAwMDAwMCApOworCUdBTU1BX1dSSVRFKCBHQU1NQV9DT01NQU5ESU5URU5BQkxFLAkweDAwMDAwMDAwICk7CisJR0FNTUFfV1JJVEUoIEdBTU1BX0dJTlRFTkFCTEUsCQkweDAwMDAwMDAwICk7Cit9CisKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IERSTShpb2N0bHMpW107CisKK3N0YXRpYyBpbnQgZ2FtbWFfZHJpdmVyX3ByZWluaXQoZHJtX2RldmljZV90ICpkZXYpCit7CisJLyogcmVzZXQgdGhlIGZpbmlzaCBpb2N0bCAqLworCURSTShpb2N0bHMpW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfRklOSVNIKV0uZnVuYyA9IERSTShmaW5pc2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYW1tYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCit7CisJZ2FtbWFfZG9fY2xlYW51cF9kbWEoZGV2KTsKK30KKworc3RhdGljIHZvaWQgZ2FtbWFfZHJpdmVyX2RtYV9yZWFkeShkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlnYW1tYV9kbWFfcmVhZHkoZGV2KTsKK30KKworc3RhdGljIGludCBnYW1tYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fZ2FtbWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CSgKKwkJZHJtX2dhbW1hX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaWYgKGRldl9wcml2LT5udW1fcmFzdCA9PSAyKQorCQlnYW1tYV9kbWFfcXVpZXNjZW50X2R1YWwoZGV2KTsKKwllbHNlIGdhbW1hX2RtYV9xdWllc2NlbnRfc2luZ2xlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2FtbWFfZHJpdmVyX3JlZ2lzdGVyX2Zucyhkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkZXYtPmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX1BDSV9ETUEgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfSEFWRV9JUlE7CisJRFJNKGZvcHMpLnJlYWQgPSBnYW1tYV9mb3BzX3JlYWQ7CisJRFJNKGZvcHMpLnBvbGwgPSBnYW1tYV9mb3BzX3BvbGw7CisJZGV2LT5kcml2ZXIucHJlaW5pdCA9IGdhbW1hX2RyaXZlcl9wcmVpbml0OworCWRldi0+ZHJpdmVyLnByZXRha2Vkb3duID0gZ2FtbWFfZHJpdmVyX3ByZXRha2Vkb3duOworCWRldi0+ZHJpdmVyLmRtYV9yZWFkeSA9IGdhbW1hX2RyaXZlcl9kbWFfcmVhZHk7CisJZGV2LT5kcml2ZXIuZG1hX3F1aWVzY2VudCA9IGdhbW1hX2RyaXZlcl9kbWFfcXVpZXNjZW50OworCWRldi0+ZHJpdmVyLmRtYV9mbHVzaF9ibG9ja19hbmRfZmx1c2ggPSBnYW1tYV9mbHVzaF9ibG9ja19hbmRfZmx1c2g7CisJZGV2LT5kcml2ZXIuZG1hX2ZsdXNoX3VuYmxvY2sgPSBnYW1tYV9mbHVzaF91bmJsb2NrOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4MTlkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJtLmgKQEAgLTAsMCArMSw5MCBAQAorI2lmbmRlZiBfR0FNTUFfRFJNX0hfCisjZGVmaW5lIF9HQU1NQV9EUk1fSF8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9nYW1tYV90ZXhfcmVnaW9uIHsKKwl1bnNpZ25lZCBjaGFyIG5leHQsIHByZXY7IC8qIGluZGljZXMgdG8gZm9ybSBhIGNpcmN1bGFyIExSVSAgKi8KKwl1bnNpZ25lZCBjaGFyIGluX3VzZTsJLyogb3duZWQgYnkgYSBjbGllbnQsIG9yIGZyZWU/ICovCisJaW50IGFnZTsJCS8qIHRyYWNrZWQgYnkgY2xpZW50cyB0byB1cGRhdGUgbG9jYWwgTFJVJ3MgKi8KK30gZHJtX2dhbW1hX3RleF9yZWdpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludAlHRGVsdGFNb2RlOworCXVuc2lnbmVkIGludAlHRGVwdGhNb2RlOworCXVuc2lnbmVkIGludAlHR2VvbWV0cnlNb2RlOworCXVuc2lnbmVkIGludAlHVHJhbnNmb3JtTW9kZTsKK30gZHJtX2dhbW1hX2NvbnRleHRfcmVnc190OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2dhbW1hX3NhcmVhIHsKKyAgIAlkcm1fZ2FtbWFfY29udGV4dF9yZWdzX3QgY29udGV4dF9zdGF0ZTsKKworCXVuc2lnbmVkIGludCBkaXJ0eTsKKworCisJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKKwkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgorCSAqIGFnZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSB5b3Ugc2V0LCB0aGVuIHlvdSBhcmUgbWlzdGFrZW4gYW5kCisJICogaXQgaGFzIGJlZW4gc3RvbGVuIGJ5IGFub3RoZXIgY2xpZW50LiAgSWYgZ2xvYmFsIHRleEFnZQorCSAqIGhhc24ndCBjaGFuZ2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdhbGsgdGhlIGxpc3QuCisJICoKKwkgKiBUaGVzZSByZWdpb25zIGNhbiBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHRoZSBmaW5lLWdyYWluZWQKKwkgKiB0ZXh0dXJlIGluZm9ybWF0aW9uIG9mIG90aGVyIGNsaWVudHMgLSBieSBtYWludGFpbmluZyB0aGVtCisJICogaW4gdGhlIHNhbWUgbHJ1IHdoaWNoIGlzIHVzZWQgdG8gYWdlIHRoZWlyIG93biB0ZXh0dXJlcywKKwkgKiBjbGllbnRzIGhhdmUgYW4gYXBwcm94aW1hdGUgbHJ1IGZvciB0aGUgd2hvbGUgb2YgZ2xvYmFsCisJICogdGV4dHVyZSBzcGFjZSwgYW5kIGNhbiBtYWtlIGluZm9ybWVkIGRlY2lzaW9ucyBhcyB0byB3aGljaAorCSAqIGFyZWFzIHRvIGtpY2sgb3V0LiAgVGhlcmUgaXMgbm8gbmVlZCB0byBjaG9vc2Ugd2hldGhlciB0bworCSAqIGtpY2sgb3V0IHlvdXIgb3duIHRleHR1cmUgb3Igc29tZW9uZSBlbHNlJ3MgLSBzaW1wbHkgZWplY3QKKwkgKiB0aGVtIGFsbCBpbiBMUlUgb3JkZXIuICAKKwkgKi8KKyAgIAorI2RlZmluZSBHQU1NQV9OUl9URVhfUkVHSU9OUyA2NAorCWRybV9nYW1tYV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtHQU1NQV9OUl9URVhfUkVHSU9OUysxXTsgCisJCQkJLyogTGFzdCBlbHQgaXMgc2VudGluYWwgKi8KKyAgICAgICAgaW50IHRleEFnZTsJCS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLworICAgICAgICBpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCWludCBsYXN0X3F1aWVzY2VudDsgICAgIC8qICAqLworCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KKworCWludCB2ZXJ0ZXhfcHJpbTsKK30gZHJtX2dhbW1hX3NhcmVhX3Q7CisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1HYW1tYS5oKQorICovCisKKy8qIEdhbW1hIHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX0lPQ1RMX0dBTU1BX0lOSVQJCURSTV9JT1coIDB4NDAsIGRybV9nYW1tYV9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9HQU1NQV9DT1BZCQlEUk1fSU9XKCAweDQxLCBkcm1fZ2FtbWFfY29weV90KQorCit0eXBlZGVmIHN0cnVjdCBkcm1fZ2FtbWFfY29weSB7CisJdW5zaWduZWQgaW50CURNQU91dHB1dEFkZHJlc3M7CisJdW5zaWduZWQgaW50CURNQU91dHB1dENvdW50OworCXVuc2lnbmVkIGludAlETUFSZWFkR0xJTlRTb3VyY2U7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVdyaXRlQWRkcmVzczsKKwl1bnNpZ25lZCBpbnQJRE1BUmVjdGFuZ2xlV3JpdGVMaW5lUGl0Y2g7CisJdW5zaWduZWQgaW50CURNQVJlY3RhbmdsZVdyaXRlOworCXVuc2lnbmVkIGludAlETUFSZWN0YW5nbGVSZWFkQWRkcmVzczsKKwl1bnNpZ25lZCBpbnQJRE1BUmVjdGFuZ2xlUmVhZExpbmVQaXRjaDsKKwl1bnNpZ25lZCBpbnQJRE1BUmVjdGFuZ2xlUmVhZDsKKwl1bnNpZ25lZCBpbnQJRE1BUmVjdGFuZ2xlUmVhZFRhcmdldDsKK30gZHJtX2dhbW1hX2NvcHlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2dhbW1hX2luaXQgeworICAgCWVudW0geworCSAgIAlHQU1NQV9JTklUX0RNQSAgICA9IDB4MDEsCisJICAgICAgIAlHQU1NQV9DTEVBTlVQX0RNQSA9IDB4MDIKKwl9IGZ1bmM7CisKKyAgIAlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJaW50IHBjaW1vZGU7CisJdW5zaWduZWQgaW50IG1taW8wOworCXVuc2lnbmVkIGludCBtbWlvMTsKKwl1bnNpZ25lZCBpbnQgbW1pbzI7CisJdW5zaWduZWQgaW50IG1taW8zOworCXVuc2lnbmVkIGludCBidWZmZXJzX29mZnNldDsKKwlpbnQgbnVtX3Jhc3Q7Cit9IGRybV9nYW1tYV9pbml0X3Q7CisKKyNlbmRpZiAvKiBfR0FNTUFfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U2NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kcnYuYwpAQCAtMCwwICsxLDU5IEBACisvKiBnYW1tYS5jIC0tIDNkbGFicyBHTVggMjAwMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gSmFuICA0IDA4OjU4OjMxIDE5OTkgYnkgZmFpdGhAcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImdhbW1hLmgiCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImdhbW1hX2RybS5oIgorI2luY2x1ZGUgImdhbW1hX2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX2F1dGguaCIKKyNpbmNsdWRlICJkcm1fYWdwc3VwcG9ydC5oIgorI2luY2x1ZGUgImRybV9idWZzLmgiCisjaW5jbHVkZSAiZ2FtbWFfY29udGV4dC5oIgkvKiBOT1RFISAqLworI2luY2x1ZGUgImRybV9kbWEuaCIKKyNpbmNsdWRlICJnYW1tYV9vbGRfZG1hLmgiCS8qIE5PVEUgKi8KKyNpbmNsdWRlICJkcm1fZHJhd2FibGUuaCIKKyNpbmNsdWRlICJkcm1fZHJ2LmgiCisKKyNpbmNsdWRlICJkcm1fZm9wcy5oIgorI2luY2x1ZGUgImRybV9pbml0LmgiCisjaW5jbHVkZSAiZHJtX2lvY3RsLmgiCisjaW5jbHVkZSAiZHJtX2lycS5oIgorI2luY2x1ZGUgImdhbW1hX2xpc3RzLmgiICAgICAgICAvKiBOT1RFICovCisjaW5jbHVkZSAiZHJtX2xvY2suaCIKKyNpbmNsdWRlICJnYW1tYV9sb2NrLmgiCQkvKiBOT1RFICovCisjaW5jbHVkZSAiZHJtX21lbW9yeS5oIgorI2luY2x1ZGUgImRybV9wcm9jLmgiCisjaW5jbHVkZSAiZHJtX3ZtLmgiCisjaW5jbHVkZSAiZHJtX3N0dWIuaCIKKyNpbmNsdWRlICJkcm1fc2NhdHRlci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2ZmNjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfZHJ2LmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qIGdhbW1hX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciAzZGxhYnMgR01YIDIwMDAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIEphbiAgNCAxMDowNTowNSAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoKKyAqLworCisjaWZuZGVmIF9HQU1NQV9EUlZfSF8KKyNkZWZpbmUgX0dBTU1BX0RSVl9IXworCit0eXBlZGVmIHN0cnVjdCBkcm1fZ2FtbWFfcHJpdmF0ZSB7CisJZHJtX2dhbW1hX3NhcmVhX3QgKnNhcmVhX3ByaXY7CisJZHJtX21hcF90ICpzYXJlYTsKKwlkcm1fbWFwX3QgKm1taW8wOworCWRybV9tYXBfdCAqbW1pbzE7CisJZHJtX21hcF90ICptbWlvMjsKKwlkcm1fbWFwX3QgKm1taW8zOworCWludCBudW1fcmFzdDsKK30gZHJtX2dhbW1hX3ByaXZhdGVfdDsKKworCQkJCS8qIGdhbW1hX2RtYS5jICovCitleHRlcm4gaW50IGdhbW1hX2RtYV9pbml0KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOworZXh0ZXJuIGludCBnYW1tYV9kbWFfY29weSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKKworZXh0ZXJuIGludCBnYW1tYV9kb19jbGVhbnVwX2RtYSggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIGdhbW1hX2RtYV9yZWFkeShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCBnYW1tYV9kbWFfcXVpZXNjZW50X3NpbmdsZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCBnYW1tYV9kbWFfcXVpZXNjZW50X2R1YWwoZHJtX2RldmljZV90ICpkZXYpOworCisJCQkJLyogZ2FtbWFfZG1hLmMgKi8KK2V4dGVybiBpbnQgIGdhbW1hX2RtYV9zY2hlZHVsZShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGxvY2tlZCk7CitleHRlcm4gaW50ICBnYW1tYV9kbWEoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgIGdhbW1hX2ZpbmRfZGV2aWNlcyh2b2lkKTsKK2V4dGVybiBpbnQgIGdhbW1hX2ZvdW5kKHZvaWQpOworCisvKiBHYW1tYS1zcGVjaWZpYyBjb2RlIHB1bGxlZCBmcm9tIGRybV9mb3BzLmg6CisgKi8KK2V4dGVybiBpbnQJICAgICBEUk0oZmluaXNoKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludAkgICAgIERSTShmbHVzaF91bmJsb2NrKShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGNvbnRleHQsCisJCQkJCWRybV9sb2NrX2ZsYWdzX3QgZmxhZ3MpOworZXh0ZXJuIGludAkgICAgIERSTShmbHVzaF9ibG9ja19hbmRfZmx1c2gpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY29udGV4dCwKKwkJCQkJCWRybV9sb2NrX2ZsYWdzX3QgZmxhZ3MpOworCisvKiBHYW1tYS1zcGVjaWZpYyBjb2RlIHB1bGxlZCBmcm9tIGRybV9kbWEuaDoKKyAqLworZXh0ZXJuIHZvaWQJICAgICBEUk0oY2xlYXJfbmV4dF9idWZmZXIpKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiBpbnQJICAgICBEUk0oc2VsZWN0X3F1ZXVlKShkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICAgdm9pZCAoKndyYXBwZXIpKHVuc2lnbmVkIGxvbmcpKTsKK2V4dGVybiBpbnQJICAgICBEUk0oZG1hX2VucXVldWUpKHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZG1hX3QgKmRtYSk7CitleHRlcm4gaW50CSAgICAgRFJNKGRtYV9nZXRfYnVmZmVycykoc3RydWN0IGZpbGUgKmZpbHAsIGRybV9kbWFfdCAqZG1hKTsKKworCisvKiBHYW1tYS1zcGVjaWZpYyBjb2RlIHB1bGxlZCBmcm9tIGRybV9saXN0cy5oIChub3cgcmVuYW1lZCBnYW1tYV9saXN0cy5oKToKKyAqLworZXh0ZXJuIGludAkgICAgIERSTSh3YWl0bGlzdF9jcmVhdGUpKGRybV93YWl0bGlzdF90ICpibCwgaW50IGNvdW50KTsKK2V4dGVybiBpbnQJICAgICBEUk0od2FpdGxpc3RfZGVzdHJveSkoZHJtX3dhaXRsaXN0X3QgKmJsKTsKK2V4dGVybiBpbnQJICAgICBEUk0od2FpdGxpc3RfcHV0KShkcm1fd2FpdGxpc3RfdCAqYmwsIGRybV9idWZfdCAqYnVmKTsKK2V4dGVybiBkcm1fYnVmX3QgICAgICpEUk0od2FpdGxpc3RfZ2V0KShkcm1fd2FpdGxpc3RfdCAqYmwpOworZXh0ZXJuIGludAkgICAgIERSTShmcmVlbGlzdF9jcmVhdGUpKGRybV9mcmVlbGlzdF90ICpibCwgaW50IGNvdW50KTsKK2V4dGVybiBpbnQJICAgICBEUk0oZnJlZWxpc3RfZGVzdHJveSkoZHJtX2ZyZWVsaXN0X3QgKmJsKTsKK2V4dGVybiBpbnQJICAgICBEUk0oZnJlZWxpc3RfcHV0KShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZyZWVsaXN0X3QgKmJsLAorCQkJCSAgICAgICBkcm1fYnVmX3QgKmJ1Zik7CitleHRlcm4gZHJtX2J1Zl90ICAgICAqRFJNKGZyZWVsaXN0X2dldCkoZHJtX2ZyZWVsaXN0X3QgKmJsLCBpbnQgYmxvY2spOworCisvKiBleHRlcm5zIGZvciBnYW1tYSBjaGFuZ2VzIHRvIHRoZSBvcHMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIERSTShmb3BzKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZ2FtbWFfZm9wc19wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpOworZXh0ZXJuIHNzaXplX3QgZ2FtbWFfZm9wc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKTsKKworCisjZGVmaW5lIEdMSU5UX0RSSV9CVUZfQ09VTlQgMjU2CisKKyNkZWZpbmUgR0FNTUFfT0ZGKHJlZykJCQkJCQkgICBcCisJKChyZWcgPCAweDEwMDApCQkJCQkJICAgXAorCSA/IHJlZwkJCQkJCQkgICBcCisJIDogKChyZWcgPCAweDEwMDAwKQkJCQkJICAgXAorCSAgICA/IChyZWcgLSAweDEwMDApCQkJCQkgICBcCisJICAgIDogKChyZWcgPCAweDExMDAwKQkJCQkJICAgXAorCSAgICAgICA/IChyZWcgLSAweDEwMDAwKQkJCQkgICBcCisJICAgICAgIDogKHJlZyAtIDB4MTEwMDApKSkpCisKKyNkZWZpbmUgR0FNTUFfQkFTRShyZWcpCSAoKHVuc2lnbmVkIGxvbmcpCQkJCSAgICAgXAorCQkJICAoKHJlZyA8IDB4MTAwMCkgICAgPyBkZXZfcHJpdi0+bW1pbzAtPmhhbmRsZSA6ICAgICBcCisJCQkgICAoKHJlZyA8IDB4MTAwMDApICA/IGRldl9wcml2LT5tbWlvMS0+aGFuZGxlIDogICAgIFwKKwkJCSAgICAoKHJlZyA8IDB4MTEwMDApID8gZGV2X3ByaXYtPm1taW8yLT5oYW5kbGUgOiAgICAgXAorCQkJCQkgICAgICAgZGV2X3ByaXYtPm1taW8zLT5oYW5kbGUpKSkpCisjZGVmaW5lIEdBTU1BX0FERFIocmVnKQkgKEdBTU1BX0JBU0UocmVnKSArIEdBTU1BX09GRihyZWcpKQorI2RlZmluZSBHQU1NQV9ERVJFRihyZWcpICooX192b2xhdGlsZV9fIGludCAqKUdBTU1BX0FERFIocmVnKQorI2RlZmluZSBHQU1NQV9SRUFEKHJlZykJIEdBTU1BX0RFUkVGKHJlZykKKyNkZWZpbmUgR0FNTUFfV1JJVEUocmVnLHZhbCkgZG8geyBHQU1NQV9ERVJFRihyZWcpID0gdmFsOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIEdBTU1BX0JST0FEQ0FTVE1BU0sgICAgMHg5Mzc4CisjZGVmaW5lIEdBTU1BX0NPTU1BTkRJTlRFTkFCTEUgMHgwYzQ4CisjZGVmaW5lIEdBTU1BX0RNQUFERFJFU1MgICAgICAgMHgwMDI4CisjZGVmaW5lIEdBTU1BX0RNQUNPVU5UCSAgICAgICAweDAwMzAKKyNkZWZpbmUgR0FNTUFfRklMVEVSTU9ERSAgICAgICAweDhjMDAKKyNkZWZpbmUgR0FNTUFfR0NPTU1BTkRJTlRGTEFHUyAweDBjNTAKKyNkZWZpbmUgR0FNTUFfR0NPTU1BTkRNT0RFICAgICAweDBjNDAKKyNkZWZpbmUJCUdBTU1BX1FVRVVFRF9ETUFfTU9ERQkJMTw8MQorI2RlZmluZSBHQU1NQV9HQ09NTUFORFNUQVRVUyAgIDB4MGM2MAorI2RlZmluZSBHQU1NQV9HREVMQVlUSU1FUiAgICAgIDB4MGMzOAorI2RlZmluZSBHQU1NQV9HRE1BQ09OVFJPTCAgICAgIDB4MDA2MAorI2RlZmluZSAJR0FNTUFfVVNFX0FHUAkJCTE8PDEKKyNkZWZpbmUgR0FNTUFfR0lOVEVOQUJMRSAgICAgICAweDA4MDgKKyNkZWZpbmUgR0FNTUFfR0lOVEZMQUdTCSAgICAgICAweDA4MTAKKyNkZWZpbmUgR0FNTUFfSU5GSUZPU1BBQ0UgICAgICAweDAwMTgKKyNkZWZpbmUgR0FNTUFfT1VURklGT1dPUkRTICAgICAweDAwMjAKKyNkZWZpbmUgR0FNTUFfT1VUUFVURklGTyAgICAgICAweDIwMDAKKyNkZWZpbmUgR0FNTUFfU1lOQwkgICAgICAgMHg4YzQwCisjZGVmaW5lIEdBTU1BX1NZTkNfVEFHCSAgICAgICAweDAxODgKKyNkZWZpbmUgR0FNTUFfUEFHRVRBQkxFQUREUiAgICAweDBDMDAKKyNkZWZpbmUgR0FNTUFfUEFHRVRBQkxFTEVOR1RIICAweDBDMDgKKworI2RlZmluZSBHQU1NQV9QQVNTVEhST1VHSAkweDFGRQorI2RlZmluZSBHQU1NQV9ETUFBRERSVEFHCTB4NTMwCisjZGVmaW5lIEdBTU1BX0RNQUNPVU5UVEFHCTB4NTMxCisjZGVmaW5lIEdBTU1BX0NPTU1BTkRJTlRUQUcJMHg1MzIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2xpc3RzLmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2xpc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5M2Y0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfbGlzdHMuaApAQCAtMCwwICsxLDIxNSBAQAorLyogZHJtX2xpc3RzLmggLS0gQnVmZmVyIGxpc3QgaGFuZGxpbmcgcm91dGluZXMgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gQXByIDE5IDIwOjU0OjIyIDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisKK2ludCBEUk0od2FpdGxpc3RfY3JlYXRlKShkcm1fd2FpdGxpc3RfdCAqYmwsIGludCBjb3VudCkKK3sKKwlpZiAoYmwtPmNvdW50KSByZXR1cm4gLUVJTlZBTDsKKworCWJsLT5idWZzICAgICAgID0gRFJNKGFsbG9jKSgoYmwtPmNvdW50ICsgMikgKiBzaXplb2YoKmJsLT5idWZzKSwKKwkJCQkgICAgRFJNX01FTV9CVUZMSVNUUyk7CisKKwlpZighYmwtPmJ1ZnMpIHJldHVybiAtRU5PTUVNOworCW1lbXNldChibC0+YnVmcywgMCwgc2l6ZW9mKCpibC0+YnVmcykpOworCWJsLT5jb3VudCAgICAgID0gY291bnQ7CisJYmwtPnJwCSAgICAgICA9IGJsLT5idWZzOworCWJsLT53cAkgICAgICAgPSBibC0+YnVmczsKKwlibC0+ZW5kCSAgICAgICA9ICZibC0+YnVmc1tibC0+Y291bnQrMV07CisJc3Bpbl9sb2NrX2luaXQoJmJsLT53cml0ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYmwtPnJlYWRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0od2FpdGxpc3RfZGVzdHJveSkoZHJtX3dhaXRsaXN0X3QgKmJsKQoreworCWlmIChibC0+cnAgIT0gYmwtPndwKSByZXR1cm4gLUVJTlZBTDsKKwlpZiAoYmwtPmJ1ZnMpIERSTShmcmVlKShibC0+YnVmcywKKwkJCQkoYmwtPmNvdW50ICsgMikgKiBzaXplb2YoKmJsLT5idWZzKSwKKwkJCQlEUk1fTUVNX0JVRkxJU1RTKTsKKwlibC0+Y291bnQgPSAwOworCWJsLT5idWZzICA9IE5VTEw7CisJYmwtPnJwCSAgPSBOVUxMOworCWJsLT53cAkgID0gTlVMTDsKKwlibC0+ZW5kCSAgPSBOVUxMOworCXJldHVybiAwOworfQorCitpbnQgRFJNKHdhaXRsaXN0X3B1dCkoZHJtX3dhaXRsaXN0X3QgKmJsLCBkcm1fYnVmX3QgKmJ1ZikKK3sKKwlpbnQJICAgICAgbGVmdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbGVmdCA9IERSTV9MRUZUQ09VTlQoYmwpOworCWlmICghbGVmdCkgeworCQlEUk1fRVJST1IoIk92ZXJmbG93IHdoaWxlIGFkZGluZyBidWZmZXIgJWQgZnJvbSBmaWxwICVwXG4iLAorCQkJICBidWYtPmlkeCwgYnVmLT5maWxwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWJ1Zi0+bGlzdAkgPSBEUk1fTElTVF9XQUlUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsLT53cml0ZV9sb2NrLCBmbGFncyk7CisJKmJsLT53cCA9IGJ1ZjsKKwlpZiAoKytibC0+d3AgPj0gYmwtPmVuZCkgYmwtPndwID0gYmwtPmJ1ZnM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmwtPndyaXRlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitkcm1fYnVmX3QgKkRSTSh3YWl0bGlzdF9nZXQpKGRybV93YWl0bGlzdF90ICpibCkKK3sKKwlkcm1fYnVmX3QgICAgICpidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibC0+cmVhZF9sb2NrLCBmbGFncyk7CisJYnVmID0gKmJsLT5ycDsKKwlpZiAoYmwtPnJwID09IGJsLT53cCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibC0+cmVhZF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoKytibC0+cnAgPj0gYmwtPmVuZCkgYmwtPnJwID0gYmwtPmJ1ZnM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmwtPnJlYWRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGJ1ZjsKK30KKworaW50IERSTShmcmVlbGlzdF9jcmVhdGUpKGRybV9mcmVlbGlzdF90ICpibCwgaW50IGNvdW50KQoreworCWF0b21pY19zZXQoJmJsLT5jb3VudCwgMCk7CisJYmwtPm5leHQgICAgICA9IE5VTEw7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYmwtPndhaXRpbmcpOworCWJsLT5sb3dfbWFyayAgPSAwOworCWJsLT5oaWdoX21hcmsgPSAwOworCWF0b21pY19zZXQoJmJsLT53ZmgsICAgMCk7CisJc3Bpbl9sb2NrX2luaXQoJmJsLT5sb2NrKTsKKwkrK2JsLT5pbml0aWFsaXplZDsKKwlyZXR1cm4gMDsKK30KKworaW50IERSTShmcmVlbGlzdF9kZXN0cm95KShkcm1fZnJlZWxpc3RfdCAqYmwpCit7CisJYXRvbWljX3NldCgmYmwtPmNvdW50LCAwKTsKKwlibC0+bmV4dCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEUk0oZnJlZWxpc3RfcHV0KShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZyZWVsaXN0X3QgKmJsLCBkcm1fYnVmX3QgKmJ1ZikKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgID0gZGV2LT5kbWE7CisKKwlpZiAoIWRtYSkgeworCQlEUk1fRVJST1IoIk5vIERNQSBzdXBwb3J0XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGJ1Zi0+d2FpdGluZyB8fCBidWYtPnBlbmRpbmcgfHwgYnVmLT5saXN0ID09IERSTV9MSVNUX0ZSRUUpIHsKKwkJRFJNX0VSUk9SKCJGcmVlZCBidWZmZXIgJWQ6IHclZCwgcCVkLCBsJWRcbiIsCisJCQkgIGJ1Zi0+aWR4LCBidWYtPndhaXRpbmcsIGJ1Zi0+cGVuZGluZywgYnVmLT5saXN0KTsKKwl9CisJaWYgKCFibCkgcmV0dXJuIDE7CisJYnVmLT5saXN0CT0gRFJNX0xJU1RfRlJFRTsKKworCXNwaW5fbG9jaygmYmwtPmxvY2spOworCWJ1Zi0+bmV4dAk9IGJsLT5uZXh0OworCWJsLT5uZXh0CT0gYnVmOworCXNwaW5fdW5sb2NrKCZibC0+bG9jayk7CisKKwlhdG9taWNfaW5jKCZibC0+Y291bnQpOworCWlmIChhdG9taWNfcmVhZCgmYmwtPmNvdW50KSA+IGRtYS0+YnVmX2NvdW50KSB7CisJCURSTV9FUlJPUigiJWQgb2YgJWQgYnVmZmVycyBmcmVlIGFmdGVyIGFkZGl0aW9uIG9mICVkXG4iLAorCQkJICBhdG9taWNfcmVhZCgmYmwtPmNvdW50KSwgZG1hLT5idWZfY291bnQsIGJ1Zi0+aWR4KTsKKwkJcmV0dXJuIDE7CisJfQorCQkJCS8qIENoZWNrIGZvciBoaWdoIHdhdGVyIG1hcmsgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmJsLT53ZmgpICYmIGF0b21pY19yZWFkKCZibC0+Y291bnQpPj1ibC0+aGlnaF9tYXJrKSB7CisJCWF0b21pY19zZXQoJmJsLT53ZmgsIDApOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmJsLT53YWl0aW5nKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBkcm1fYnVmX3QgKkRSTShmcmVlbGlzdF90cnkpKGRybV9mcmVlbGlzdF90ICpibCkKK3sKKwlkcm1fYnVmX3QJICAqYnVmOworCisJaWYgKCFibCkgcmV0dXJuIE5VTEw7CisKKwkJCQkvKiBHZXQgYnVmZmVyICovCisJc3Bpbl9sb2NrKCZibC0+bG9jayk7CisJaWYgKCFibC0+bmV4dCkgeworCQlzcGluX3VubG9jaygmYmwtPmxvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnVmCSAgPSBibC0+bmV4dDsKKwlibC0+bmV4dCAgPSBibC0+bmV4dC0+bmV4dDsKKwlzcGluX3VubG9jaygmYmwtPmxvY2spOworCisJYXRvbWljX2RlYygmYmwtPmNvdW50KTsKKwlidWYtPm5leHQgPSBOVUxMOworCWJ1Zi0+bGlzdCA9IERSTV9MSVNUX05PTkU7CisJaWYgKGJ1Zi0+d2FpdGluZyB8fCBidWYtPnBlbmRpbmcpIHsKKwkJRFJNX0VSUk9SKCJGcmVlIGJ1ZmZlciAlZDogdyVkLCBwJWQsIGwlZFxuIiwKKwkJCSAgYnVmLT5pZHgsIGJ1Zi0+d2FpdGluZywgYnVmLT5wZW5kaW5nLCBidWYtPmxpc3QpOworCX0KKworCXJldHVybiBidWY7Cit9CisKK2RybV9idWZfdCAqRFJNKGZyZWVsaXN0X2dldCkoZHJtX2ZyZWVsaXN0X3QgKmJsLCBpbnQgYmxvY2spCit7CisJZHJtX2J1Zl90CSAgKmJ1Zgk9IE5VTEw7CisJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOworCisJaWYgKCFibCB8fCAhYmwtPmluaXRpYWxpemVkKSByZXR1cm4gTlVMTDsKKworCQkJCS8qIENoZWNrIGZvciBsb3cgd2F0ZXIgbWFyayAqLworCWlmIChhdG9taWNfcmVhZCgmYmwtPmNvdW50KSA8PSBibC0+bG93X21hcmspIC8qIEJlY2FtZSBsb3cgKi8KKwkJYXRvbWljX3NldCgmYmwtPndmaCwgMSk7CisJaWYgKGF0b21pY19yZWFkKCZibC0+d2ZoKSkgeworCQlpZiAoYmxvY2spIHsKKwkJCWFkZF93YWl0X3F1ZXVlKCZibC0+d2FpdGluZywgJmVudHJ5KTsKKwkJCWZvciAoOzspIHsKKwkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJCQlpZiAoIWF0b21pY19yZWFkKCZibC0+d2ZoKQorCQkJCSAgICAmJiAoYnVmID0gRFJNKGZyZWVsaXN0X3RyeSkoYmwpKSkgYnJlYWs7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIGJyZWFrOworCQkJfQorCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmYmwtPndhaXRpbmcsICZlbnRyeSk7CisJCX0KKwkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlyZXR1cm4gRFJNKGZyZWVsaXN0X3RyeSkoYmwpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2xvY2suaCBiL2RyaXZlcnMvY2hhci9kcm0vZ2FtbWFfbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZWM2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX2xvY2suaApAQCAtMCwwICsxLDE0MCBAQAorLyogbG9jay5jIC0tIElPQ1RMcyBmb3IgbG9ja2luZyAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFR1ZSBGZWIgIDIgMDg6Mzc6NTQgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKworLyogR2FtbWEtc3BlY2lmaWMgY29kZSBleHRyYWN0ZWQgZnJvbSBkcm1fbG9jay5oOgorICovCitzdGF0aWMgaW50IERSTShmbHVzaF9xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsKKwlpbnQJCSAgcmV0CT0gMDsKKwlkcm1fcXVldWVfdAkgICpxCT0gZGV2LT5xdWV1ZWxpc3RbY29udGV4dF07CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlhdG9taWNfaW5jKCZxLT51c2VfY291bnQpOworCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSA+IDEpIHsKKwkJYXRvbWljX2luYygmcS0+YmxvY2tfd3JpdGUpOworCQlhZGRfd2FpdF9xdWV1ZSgmcS0+Zmx1c2hfcXVldWUsICZlbnRyeSk7CisJCWF0b21pY19pbmMoJnEtPmJsb2NrX2NvdW50KTsKKwkJZm9yICg7OykgeworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQlpZiAoIURSTV9CVUZDT1VOVCgmcS0+d2FpdGxpc3QpKSBicmVhazsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXQgPSAtRUlOVFI7IC8qIENhbid0IHJlc3RhcnQgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlhdG9taWNfZGVjKCZxLT5ibG9ja19jb3VudCk7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcS0+Zmx1c2hfcXVldWUsICZlbnRyeSk7CisJfQorCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisKKwkJCQkvKiBOT1RFOiBibG9ja193cml0ZSBpcyBzdGlsbCBpbmNyZW1lbnRlZCEKKwkJCQkgICBVc2UgZHJtX2ZsdXNoX3VubG9ja19xdWV1ZSB0byBkZWNyZW1lbnQuICovCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBEUk0oZmx1c2hfdW5ibG9ja19xdWV1ZSkoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0KQoreworCWRybV9xdWV1ZV90CSAgKnEJPSBkZXYtPnF1ZXVlbGlzdFtjb250ZXh0XTsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWF0b21pY19pbmMoJnEtPnVzZV9jb3VudCk7CisJaWYgKGF0b21pY19yZWFkKCZxLT51c2VfY291bnQpID4gMSkgeworCQlpZiAoYXRvbWljX3JlYWQoJnEtPmJsb2NrX3dyaXRlKSkgeworCQkJYXRvbWljX2RlYygmcS0+YmxvY2tfd3JpdGUpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxLT53cml0ZV9xdWV1ZSk7CisJCX0KKwl9CisJYXRvbWljX2RlYygmcS0+dXNlX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworaW50IERSTShmbHVzaF9ibG9ja19hbmRfZmx1c2gpKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY29udGV4dCwKKwkJCSAgICAgICBkcm1fbG9ja19mbGFnc190IGZsYWdzKQoreworCWludCByZXQgPSAwOworCWludCBpOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJaWYgKGZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIKSB7CisJCXJldCA9IERSTShmbHVzaF9xdWV1ZSkoZGV2LCBEUk1fS0VSTkVMX0NPTlRFWFQpOworCQlpZiAoIXJldCkgcmV0ID0gRFJNKGZsdXNoX3F1ZXVlKShkZXYsIGNvbnRleHQpOworCX0KKwlpZiAoZmxhZ3MgJiBfRFJNX0xPQ0tfRkxVU0hfQUxMKSB7CisJCWZvciAoaSA9IDA7ICFyZXQgJiYgaSA8IGRldi0+cXVldWVfY291bnQ7IGkrKykgeworCQkJcmV0ID0gRFJNKGZsdXNoX3F1ZXVlKShkZXYsIGkpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBEUk0oZmx1c2hfdW5ibG9jaykoZHJtX2RldmljZV90ICpkZXYsIGludCBjb250ZXh0LCBkcm1fbG9ja19mbGFnc190IGZsYWdzKQoreworCWludCByZXQgPSAwOworCWludCBpOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJaWYgKGZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIKSB7CisJCXJldCA9IERSTShmbHVzaF91bmJsb2NrX3F1ZXVlKShkZXYsIERSTV9LRVJORUxfQ09OVEVYVCk7CisJCWlmICghcmV0KSByZXQgPSBEUk0oZmx1c2hfdW5ibG9ja19xdWV1ZSkoZGV2LCBjb250ZXh0KTsKKwl9CisJaWYgKGZsYWdzICYgX0RSTV9MT0NLX0ZMVVNIX0FMTCkgeworCQlmb3IgKGkgPSAwOyAhcmV0ICYmIGkgPCBkZXYtPnF1ZXVlX2NvdW50OyBpKyspIHsKKwkJCXJldCA9IERSTShmbHVzaF91bmJsb2NrX3F1ZXVlKShkZXYsIGkpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IERSTShmaW5pc2gpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgPSBwcml2LT5kZXY7CisJaW50CQkgIHJldAkgID0gMDsKKwlkcm1fbG9ja190CSAgbG9jazsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbG9jaywgKGRybV9sb2NrX3QgX191c2VyICopYXJnLCBzaXplb2YobG9jaykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSBEUk0oZmx1c2hfYmxvY2tfYW5kX2ZsdXNoKShkZXYsIGxvY2suY29udGV4dCwgbG9jay5mbGFncyk7CisJRFJNKGZsdXNoX3VuYmxvY2spKGRldiwgbG9jay5jb250ZXh0LCBsb2NrLmZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9vbGRfZG1hLmggYi9kcml2ZXJzL2NoYXIvZHJtL2dhbW1hX29sZF9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmRkNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9nYW1tYV9vbGRfZG1hLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qIGRybV9kbWEuYyAtLSBETUEgSU9DVEwgYW5kIGZ1bmN0aW9uIHN1cHBvcnQgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBGcmkgTWFyIDE5IDE0OjMwOjE2IDE5OTkgYnkgZmFpdGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisKKy8qIEdhbW1hLXNwZWNpZmljIGNvZGUgcHVsbGVkIGZyb20gZHJtX2RtYS5oOgorICovCisKK3ZvaWQgRFJNKGNsZWFyX25leHRfYnVmZmVyKShkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKworCWRtYS0+bmV4dF9idWZmZXIgPSBOVUxMOworCWlmIChkbWEtPm5leHRfcXVldWUgJiYgIURSTV9CVUZDT1VOVCgmZG1hLT5uZXh0X3F1ZXVlLT53YWl0bGlzdCkpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkbWEtPm5leHRfcXVldWUtPmZsdXNoX3F1ZXVlKTsKKwl9CisJZG1hLT5uZXh0X3F1ZXVlCSA9IE5VTEw7Cit9CisKK2ludCBEUk0oc2VsZWN0X3F1ZXVlKShkcm1fZGV2aWNlX3QgKmRldiwgdm9pZCAoKndyYXBwZXIpKHVuc2lnbmVkIGxvbmcpKQoreworCWludAkgICBpOworCWludAkgICBjYW5kaWRhdGUgPSAtMTsKKwlpbnQJICAgagkgICAgID0gamlmZmllczsKKworCWlmICghZGV2KSB7CisJCURSTV9FUlJPUigiTm8gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIWRldi0+cXVldWVsaXN0IHx8ICFkZXYtPnF1ZXVlbGlzdFtEUk1fS0VSTkVMX0NPTlRFWFRdKSB7CisJCQkJLyogVGhpcyBvbmx5IGhhcHBlbnMgYmV0d2VlbiB0aGUgdGltZSB0aGUKKwkJCQkgICBpbnRlcnJ1cHQgaXMgaW5pdGlhbGl6ZWQgYW5kIHRoZSB0aW1lCisJCQkJICAgdGhlIHF1ZXVlcyBhcmUgaW5pdGlhbGl6ZWQuICovCisJCXJldHVybiAtMTsKKwl9CisKKwkJCQkvKiBEb2luZyAid2hpbGUgbG9ja2VkIiBETUE/ICovCisJaWYgKERSTV9XQUlUQ09VTlQoZGV2LCBEUk1fS0VSTkVMX0NPTlRFWFQpKSB7CisJCXJldHVybiBEUk1fS0VSTkVMX0NPTlRFWFQ7CisJfQorCisJCQkJLyogSWYgdGhlcmUgYXJlIGJ1ZmZlcnMgb24gdGhlIGxhc3RfY29udGV4dAorCQkJCSAgIHF1ZXVlLCBhbmQgd2UgaGF2ZSBub3QgYmVlbiBleGVjdXRpbmcKKwkJCQkgICB0aGlzIGNvbnRleHQgdmVyeSBsb25nLCBjb250aW51ZSB0bworCQkJCSAgIGV4ZWN1dGUgdGhpcyBjb250ZXh0LiAqLworCWlmIChkZXYtPmxhc3Rfc3dpdGNoIDw9IGoKKwkgICAgJiYgZGV2LT5sYXN0X3N3aXRjaCArIERSTV9USU1FX1NMSUNFID4gagorCSAgICAmJiBEUk1fV0FJVENPVU5UKGRldiwgZGV2LT5sYXN0X2NvbnRleHQpKSB7CisJCXJldHVybiBkZXYtPmxhc3RfY29udGV4dDsKKwl9CisKKwkJCQkvKiBPdGhlcndpc2UsIGZpbmQgYSBjYW5kaWRhdGUgKi8KKwlmb3IgKGkgPSBkZXYtPmxhc3RfY2hlY2tlZCArIDE7IGkgPCBkZXYtPnF1ZXVlX2NvdW50OyBpKyspIHsKKwkJaWYgKERSTV9XQUlUQ09VTlQoZGV2LCBpKSkgeworCQkJY2FuZGlkYXRlID0gZGV2LT5sYXN0X2NoZWNrZWQgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY2FuZGlkYXRlIDwgMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5xdWV1ZV9jb3VudDsgaSsrKSB7CisJCQlpZiAoRFJNX1dBSVRDT1VOVChkZXYsIGkpKSB7CisJCQkJY2FuZGlkYXRlID0gZGV2LT5sYXN0X2NoZWNrZWQgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHdyYXBwZXIKKwkgICAgJiYgY2FuZGlkYXRlID49IDAKKwkgICAgJiYgY2FuZGlkYXRlICE9IGRldi0+bGFzdF9jb250ZXh0CisJICAgICYmIGRldi0+bGFzdF9zd2l0Y2ggPD0gagorCSAgICAmJiBkZXYtPmxhc3Rfc3dpdGNoICsgRFJNX1RJTUVfU0xJQ0UgPiBqKSB7CisJCWlmIChkZXYtPnRpbWVyLmV4cGlyZXMgIT0gZGV2LT5sYXN0X3N3aXRjaCArIERSTV9USU1FX1NMSUNFKSB7CisJCQlkZWxfdGltZXIoJmRldi0+dGltZXIpOworCQkJZGV2LT50aW1lci5mdW5jdGlvbiA9IHdyYXBwZXI7CisJCQlkZXYtPnRpbWVyLmRhdGEJICAgID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCQkJZGV2LT50aW1lci5leHBpcmVzICA9IGRldi0+bGFzdF9zd2l0Y2grRFJNX1RJTUVfU0xJQ0U7CisJCQlhZGRfdGltZXIoJmRldi0+dGltZXIpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gY2FuZGlkYXRlOworfQorCisKK2ludCBEUk0oZG1hX2VucXVldWUpKHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZG1hX3QgKmQpCit7CisJZHJtX2ZpbGVfdCAgICAqcHJpdiAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAgKmRldiAgICA9IHByaXYtPmRldjsKKwlpbnQJCSAgaTsKKwlkcm1fcXVldWVfdAkgICpxOworCWRybV9idWZfdAkgICpidWY7CisJaW50CQkgIGlkeDsKKwlpbnQJCSAgd2hpbGVfbG9ja2VkID0gMDsKKwlkcm1fZGV2aWNlX2RtYV90ICAqZG1hID0gZGV2LT5kbWE7CisJaW50CQkgICppbmQ7CisJaW50CQkgIGVycjsKKwlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7CisKKwlEUk1fREVCVUcoIiVkXG4iLCBkLT5zZW5kX2NvdW50KTsKKworCWlmIChkLT5mbGFncyAmIF9EUk1fRE1BX1dISUxFX0xPQ0tFRCkgeworCQlpbnQgY29udGV4dCA9IGRldi0+bG9jay5od19sb2NrLT5sb2NrOworCisJCWlmICghX0RSTV9MT0NLX0lTX0hFTEQoY29udGV4dCkpIHsKKwkJCURSTV9FUlJPUigiTm8gbG9jayBoZWxkIGR1cmluZyBcIndoaWxlIGxvY2tlZFwiIgorCQkJCSAgIiByZXF1ZXN0XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChkLT5jb250ZXh0ICE9IF9EUk1fTE9DS0lOR19DT05URVhUKGNvbnRleHQpCisJCSAgICAmJiBfRFJNX0xPQ0tJTkdfQ09OVEVYVChjb250ZXh0KSAhPSBEUk1fS0VSTkVMX0NPTlRFWFQpIHsKKwkJCURSTV9FUlJPUigiTG9jayBoZWxkIGJ5ICVkIHdoaWxlICVkIG1ha2VzIgorCQkJCSAgIiBcIndoaWxlIGxvY2tlZFwiIHJlcXVlc3RcbiIsCisJCQkJICBfRFJNX0xPQ0tJTkdfQ09OVEVYVChjb250ZXh0KSwKKwkJCQkgIGQtPmNvbnRleHQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcSA9IGRldi0+cXVldWVsaXN0W0RSTV9LRVJORUxfQ09OVEVYVF07CisJCXdoaWxlX2xvY2tlZCA9IDE7CisJfSBlbHNlIHsKKwkJcSA9IGRldi0+cXVldWVsaXN0W2QtPmNvbnRleHRdOworCX0KKworCisJYXRvbWljX2luYygmcS0+dXNlX2NvdW50KTsKKwlpZiAoYXRvbWljX3JlYWQoJnEtPmJsb2NrX3dyaXRlKSkgeworCQlhZGRfd2FpdF9xdWV1ZSgmcS0+d3JpdGVfcXVldWUsICZlbnRyeSk7CisJCWF0b21pY19pbmMoJnEtPmJsb2NrX2NvdW50KTsKKwkJZm9yICg7OykgeworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQlpZiAoIWF0b21pY19yZWFkKCZxLT5ibG9ja193cml0ZSkpIGJyZWFrOworCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnEtPndyaXRlX3F1ZXVlLCAmZW50cnkpOworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisJCX0KKwkJYXRvbWljX2RlYygmcS0+YmxvY2tfY291bnQpOworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnEtPndyaXRlX3F1ZXVlLCAmZW50cnkpOworCX0KKworCWluZCA9IERSTShhbGxvYykoZC0+c2VuZF9jb3VudCAqIHNpemVvZihpbnQpLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKCFpbmQpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGluZCwgZC0+c2VuZF9pbmRpY2VzLCBkLT5zZW5kX2NvdW50ICogc2l6ZW9mKGludCkpKSB7CisJCWVyciA9IC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJfQorCisJZXJyID0gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgZC0+c2VuZF9jb3VudDsgaSsrKSB7CisJCWlkeCA9IGluZFtpXTsKKwkJaWYgKGlkeCA8IDAgfHwgaWR4ID49IGRtYS0+YnVmX2NvdW50KSB7CisJCQlEUk1fRVJST1IoIkluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJCSAgaW5kW2ldLCBkbWEtPmJ1Zl9jb3VudCAtIDEpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnVmID0gZG1hLT5idWZsaXN0WyBpZHggXTsKKwkJaWYgKGJ1Zi0+ZmlscCAhPSBmaWxwKSB7CisJCQlEUk1fRVJST1IoIlByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG5vdCBvd25lZFxuIiwKKwkJCQkgIGN1cnJlbnQtPnBpZCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoYnVmLT5saXN0ICE9IERSTV9MSVNUX05PTkUpIHsKKwkJCURSTV9FUlJPUigiUHJvY2VzcyAlZCB1c2luZyBidWZmZXIgJWQgb24gbGlzdCAlZFxuIiwKKwkJCQkgIGN1cnJlbnQtPnBpZCwgYnVmLT5pZHgsIGJ1Zi0+bGlzdCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlidWYtPnVzZWQJICA9IGluZFtpXTsKKwkJYnVmLT53aGlsZV9sb2NrZWQgPSB3aGlsZV9sb2NrZWQ7CisJCWJ1Zi0+Y29udGV4dAkgID0gZC0+Y29udGV4dDsKKwkJaWYgKCFidWYtPnVzZWQpIHsKKwkJCURSTV9FUlJPUigiUXVldWVpbmcgMCBsZW5ndGggYnVmZmVyXG4iKTsKKwkJfQorCQlpZiAoYnVmLT5wZW5kaW5nKSB7CisJCQlEUk1fRVJST1IoIlF1ZXVlaW5nIHBlbmRpbmcgYnVmZmVyOiIKKwkJCQkgICIgYnVmZmVyICVkLCBvZmZzZXQgJWRcbiIsCisJCQkJICBpbmRbaV0sIGkpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGJ1Zi0+d2FpdGluZykgeworCQkJRFJNX0VSUk9SKCJRdWV1ZWluZyB3YWl0aW5nIGJ1ZmZlcjoiCisJCQkJICAiIGJ1ZmZlciAlZCwgb2Zmc2V0ICVkXG4iLAorCQkJCSAgaW5kW2ldLCBpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ1Zi0+d2FpdGluZyA9IDE7CisJCWlmIChhdG9taWNfcmVhZCgmcS0+dXNlX2NvdW50KSA9PSAxCisJCSAgICB8fCBhdG9taWNfcmVhZCgmcS0+ZmluYWxpemF0aW9uKSkgeworCQkJRFJNKGZyZWVfYnVmZmVyKShkZXYsIGJ1Zik7CisJCX0gZWxzZSB7CisJCQlEUk0od2FpdGxpc3RfcHV0KSgmcS0+d2FpdGxpc3QsIGJ1Zik7CisJCQlhdG9taWNfaW5jKCZxLT50b3RhbF9xdWV1ZWQpOworCQl9CisJfQorCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCURSTShmcmVlKShpbmQsIGQtPnNlbmRfY291bnQgKiBzaXplb2YoaW50KSwgRFJNX01FTV9EUklWRVIpOworCWF0b21pY19kZWMoJnEtPnVzZV9jb3VudCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBEUk0oZG1hX2dldF9idWZmZXJzX29mX29yZGVyKShzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RtYV90ICpkLAorCQkJCQkgaW50IG9yZGVyKQoreworCWRybV9maWxlX3QgICAgKnByaXYgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgICpkZXYgICAgPSBwcml2LT5kZXY7CisJaW50CQkgIGk7CisJZHJtX2J1Zl90CSAgKmJ1ZjsKKwlkcm1fZGV2aWNlX2RtYV90ICAqZG1hID0gZGV2LT5kbWE7CisKKwlmb3IgKGkgPSBkLT5ncmFudGVkX2NvdW50OyBpIDwgZC0+cmVxdWVzdF9jb3VudDsgaSsrKSB7CisJCWJ1ZiA9IERSTShmcmVlbGlzdF9nZXQpKCZkbWEtPmJ1ZnNbb3JkZXJdLmZyZWVsaXN0LAorCQkJCQlkLT5mbGFncyAmIF9EUk1fRE1BX1dBSVQpOworCQlpZiAoIWJ1ZikgYnJlYWs7CisJCWlmIChidWYtPnBlbmRpbmcgfHwgYnVmLT53YWl0aW5nKSB7CisJCQlEUk1fRVJST1IoIkZyZWUgYnVmZmVyICVkIGluIHVzZTogZmlscCAlcCAodyVkLCBwJWQpXG4iLAorCQkJCSAgYnVmLT5pZHgsCisJCQkJICBidWYtPmZpbHAsCisJCQkJICBidWYtPndhaXRpbmcsCisJCQkJICBidWYtPnBlbmRpbmcpOworCQl9CisJCWJ1Zi0+ZmlscCAgICAgPSBmaWxwOworCQlpZiAoY29weV90b191c2VyKCZkLT5yZXF1ZXN0X2luZGljZXNbaV0sCisJCQkJICZidWYtPmlkeCwKKwkJCQkgc2l6ZW9mKGJ1Zi0+aWR4KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoY29weV90b191c2VyKCZkLT5yZXF1ZXN0X3NpemVzW2ldLAorCQkJCSAmYnVmLT50b3RhbCwKKwkJCQkgc2l6ZW9mKGJ1Zi0+dG90YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCSsrZC0+Z3JhbnRlZF9jb3VudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworaW50IERSTShkbWFfZ2V0X2J1ZmZlcnMpKHN0cnVjdCBmaWxlICpmaWxwLCBkcm1fZG1hX3QgKmRtYSkKK3sKKwlpbnQJCSAgb3JkZXI7CisJaW50CQkgIHJldGNvZGUgPSAwOworCWludAkJICB0bXBfb3JkZXI7CisKKwlvcmRlciA9IERSTShvcmRlcikoZG1hLT5yZXF1ZXN0X3NpemUpOworCisJZG1hLT5ncmFudGVkX2NvdW50ID0gMDsKKwlyZXRjb2RlCQkgICA9IERSTShkbWFfZ2V0X2J1ZmZlcnNfb2Zfb3JkZXIpKGZpbHAsIGRtYSwgb3JkZXIpOworCisJaWYgKGRtYS0+Z3JhbnRlZF9jb3VudCA8IGRtYS0+cmVxdWVzdF9jb3VudAorCSAgICAmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1NNQUxMRVJfT0spKSB7CisJCWZvciAodG1wX29yZGVyID0gb3JkZXIgLSAxOworCQkgICAgICFyZXRjb2RlCisJCQkgICAgICYmIGRtYS0+Z3JhbnRlZF9jb3VudCA8IGRtYS0+cmVxdWVzdF9jb3VudAorCQkJICAgICAmJiB0bXBfb3JkZXIgPj0gRFJNX01JTl9PUkRFUjsKKwkJICAgICAtLXRtcF9vcmRlcikgeworCisJCQlyZXRjb2RlID0gRFJNKGRtYV9nZXRfYnVmZmVyc19vZl9vcmRlcikoZmlscCwgZG1hLAorCQkJCQkJCQl0bXBfb3JkZXIpOworCQl9CisJfQorCisJaWYgKGRtYS0+Z3JhbnRlZF9jb3VudCA8IGRtYS0+cmVxdWVzdF9jb3VudAorCSAgICAmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX0xBUkdFUl9PSykpIHsKKwkJZm9yICh0bXBfb3JkZXIgPSBvcmRlciArIDE7CisJCSAgICAgIXJldGNvZGUKKwkJCSAgICAgJiYgZG1hLT5ncmFudGVkX2NvdW50IDwgZG1hLT5yZXF1ZXN0X2NvdW50CisJCQkgICAgICYmIHRtcF9vcmRlciA8PSBEUk1fTUFYX09SREVSOworCQkgICAgICsrdG1wX29yZGVyKSB7CisKKwkJCXJldGNvZGUgPSBEUk0oZG1hX2dldF9idWZmZXJzX29mX29yZGVyKShmaWxwLCBkbWEsCisJCQkJCQkJCXRtcF9vcmRlcik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg1N2NjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCkBAIC0wLDAgKzEsMTM4NSBAQAorLyogaTgxMF9kbWEuYyAtLSBETUEgc3VwcG9ydCBmb3IgdGhlIGk4MTAgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKgkgICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgICAgICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk4MTBfZHJtLmgiCisjaW5jbHVkZSAiaTgxMF9kcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4JLyogRm9yIHRhc2sgcXVldWUgc3VwcG9ydCAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjZGVmaW5lIEk4MTBfQlVGX0ZSRUUJCTIKKyNkZWZpbmUgSTgxMF9CVUZfQ0xJRU5UCQkxCisjZGVmaW5lIEk4MTBfQlVGX0hBUkRXQVJFICAgICAgCTAKKworI2RlZmluZSBJODEwX0JVRl9VTk1BUFBFRCAwCisjZGVmaW5lIEk4MTBfQlVGX01BUFBFRCAgIDEKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDQsMikKKyNkZWZpbmUgZG93bl93cml0ZSBkb3duCisjZGVmaW5lIHVwX3dyaXRlIHVwCisjZW5kaWYKKworc3RhdGljIGRybV9idWZfdCAqaTgxMF9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICpkZXYpCit7CisgICAJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJaW50CQkgaTsKKyAgIAlpbnQgCQkgdXNlZDsKKworCS8qIExpbmVhciBzZWFyY2ggbWlnaHQgbm90IGJlIHRoZSBiZXN0IHNvbHV0aW9uICovCisKKyAgIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCSAgIAlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCSAgIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCS8qIEluIHVzZSBpcyBhbHJlYWR5IGEgcG9pbnRlciAqLworCSAgIAl1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9GUkVFLAorCQkJICAgICAgIEk4MTBfQlVGX0NMSUVOVCk7CisJCWlmICh1c2VkID09IEk4MTBfQlVGX0ZSRUUpIHsKKwkJCXJldHVybiBidWY7CisJCX0KKwl9CisgICAJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBidWZmZXIgaXMgbm90IHNlbnQgdG8gdGhlIGhhcmR3YXJlCisgKiB5ZXQsIHRoZSBoYXJkd2FyZSB1cGRhdGVzIGluIHVzZSBmb3IgdXMgb25jZSBpdHMgb24gdGhlIHJpbmcgYnVmZmVyLgorICovCisKK3N0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfdCAqYnVmKQoreworICAgCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKyAgIAlpbnQgdXNlZDsKKworICAgCS8qIEluIHVzZSBpcyBhbHJlYWR5IGEgcG9pbnRlciAqLworICAgCXVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MTBfQlVGX0NMSUVOVCwgSTgxMF9CVUZfRlJFRSk7CisJaWYgKHVzZWQgIT0gSTgxMF9CVUZfQ0xJRU5UKSB7CisJICAgCURSTV9FUlJPUigiRnJlZWluZyBidWZmZXIgdGhhdHMgbm90IGluIHVzZSA6ICVkXG4iLCBidWYtPmlkeCk7CisJICAgCXJldHVybiAtRUlOVkFMOworCX0KKworICAgCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODEwX2J1ZmZlcl9mb3BzID0geworCS5vcGVuCSA9IGRybV9vcGVuLAorCS5mbHVzaAkgPSBkcm1fZmx1c2gsCisJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkuaW9jdGwJID0gZHJtX2lvY3RsLAorCS5tbWFwCSA9IGk4MTBfbW1hcF9idWZmZXJzLAorCS5mYXN5bmMgID0gZHJtX2Zhc3luYywKK307CisKK2ludCBpODEwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJZHJtX2ZpbGVfdAkgICAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAgICpkZXY7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICAqZGV2X3ByaXY7CisJZHJtX2J1Zl90ICAgICAgICAgICAqYnVmOworCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCisJbG9ja19rZXJuZWwoKTsKKwlkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlidWYgICAgICA9IGRldl9wcml2LT5tbWFwX2J1ZmZlcjsKKwlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX0RPTlRDT1BZKTsKKwl2bWEtPnZtX2ZpbGUgPSBmaWxwOworCisgICAJYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPSBJODEwX0JVRl9NQVBQRUQ7CisJdW5sb2NrX2tlcm5lbCgpOworCisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIFZNX09GRlNFVCh2bWEpID4+IFBBR0VfU0hJRlQsCisJCQkgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCSAgICAgdm1hLT52bV9wYWdlX3Byb3QpKSByZXR1cm4gLUVBR0FJTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODEwX21hcF9idWZmZXIoZHJtX2J1Zl90ICpidWYsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisgICAgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CisJaW50IHJldGNvZGUgPSAwOworCisJaWYgKGJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID09IEk4MTBfQlVGX01BUFBFRCkgCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bl93cml0ZSggJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSApOworCW9sZF9mb3BzID0gZmlscC0+Zl9vcDsKKwlmaWxwLT5mX29wID0gJmk4MTBfYnVmZmVyX2ZvcHM7CisJZGV2X3ByaXYtPm1tYXBfYnVmZmVyID0gYnVmOworCWJ1Zl9wcml2LT52aXJ0dWFsID0gKHZvaWQgKilkb19tbWFwKGZpbHAsIDAsIGJ1Zi0+dG90YWwsCisJCQkJCSAgICBQUk9UX1JFQUR8UFJPVF9XUklURSwKKwkJCQkJICAgIE1BUF9TSEFSRUQsCisJCQkJCSAgICBidWYtPmJ1c19hZGRyZXNzKTsKKwlkZXZfcHJpdi0+bW1hcF9idWZmZXIgPSBOVUxMOworCWZpbHAtPmZfb3AgPSBvbGRfZm9wczsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpYnVmX3ByaXYtPnZpcnR1YWwgPiAtMTAyNFVMKSB7CisJCS8qIFJlYWwgZXJyb3IgKi8KKwkJRFJNX0VSUk9SKCJtbWFwIGVycm9yXG4iKTsKKwkJcmV0Y29kZSA9IChzaWduZWQgaW50KWJ1Zl9wcml2LT52aXJ0dWFsOworCQlidWZfcHJpdi0+dmlydHVhbCA9IE5VTEw7CisJfQorCXVwX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBpODEwX3VubWFwX2J1ZmZlcihkcm1fYnVmX3QgKmJ1ZikKK3sKKwlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldGNvZGUgPSAwOworCisJaWYgKGJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkICE9IEk4MTBfQlVGX01BUFBFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldGNvZGUgPSBkb19tdW5tYXAoY3VycmVudC0+bW0sCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpYnVmX3ByaXYtPnZpcnR1YWwsCisJCQkgICAgKHNpemVfdCkgYnVmLT50b3RhbCk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKyAgIAlidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9IEk4MTBfQlVGX1VOTUFQUEVEOworICAgCWJ1Zl9wcml2LT52aXJ0dWFsID0gTlVMTDsKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgaW50IGk4MTBfZG1hX2dldF9idWZmZXIoZHJtX2RldmljZV90ICpkZXYsIGRybV9pODEwX2RtYV90ICpkLAorCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRybV9idWZfdAkgICpidWY7CisJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJaW50IHJldGNvZGUgPSAwOworCisJYnVmID0gaTgxMF9mcmVlbGlzdF9nZXQoZGV2KTsKKwlpZiAoIWJ1ZikgeworCQlyZXRjb2RlID0gLUVOT01FTTsKKwkgICAJRFJNX0RFQlVHKCJyZXRjb2RlPSVkXG4iLCByZXRjb2RlKTsKKwkJcmV0dXJuIHJldGNvZGU7CisJfQorCisJcmV0Y29kZSA9IGk4MTBfbWFwX2J1ZmZlcihidWYsIGZpbHApOworCWlmIChyZXRjb2RlKSB7CisJCWk4MTBfZnJlZWxpc3RfcHV0KGRldiwgYnVmKTsKKwkgICAJRFJNX0VSUk9SKCJtYXBidWYgZmFpbGVkLCByZXRjb2RlICVkXG4iLCByZXRjb2RlKTsKKwkJcmV0dXJuIHJldGNvZGU7CisJfQorCWJ1Zi0+ZmlscCA9IGZpbHA7CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCWQtPmdyYW50ZWQgPSAxOworICAgCWQtPnJlcXVlc3RfaWR4ID0gYnVmLT5pZHg7CisgICAJZC0+cmVxdWVzdF9zaXplID0gYnVmLT50b3RhbDsKKyAgIAlkLT52aXJ0dWFsID0gYnVmX3ByaXYtPnZpcnR1YWw7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBpODEwX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCisJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCisJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQorCSAqIGlzIGZyZWVkLCBpdCdzIHRvbyBsYXRlLgorCSAqLworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSAmJiBkZXYtPmlycV9lbmFibGVkKQorCQlkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCisJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKKwkJaW50IGk7CisJICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCSAgICAgCQkoZHJtX2k4MTBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwkJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQpIHsKKwkJICAgCWRybV9pb3JlbWFwZnJlZSgodm9pZCAqKSBkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0LAorCQkJCQkgZGV2X3ByaXYtPnJpbmcuU2l6ZSwgZGV2KTsKKwkJfQorCSAgIAlpZiAoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSB7CisJCSAgIAlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUEFHRV9TSVpFLAorCQkJCQkgICAgZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlLAorCQkJCQkgICAgZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CisJCSAgIAkvKiBOZWVkIHRvIHJld3JpdGUgaGFyZHdhcmUgc3RhdHVzIHBhZ2UgKi8KKwkJICAgCUk4MTBfV1JJVEUoMHgwMjA4MCwgMHgxZmZmZjAwMCk7CisJCX0KKwkgICAJZHJtX2ZyZWUoZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9pODEwX3ByaXZhdGVfdCksCisJCQkgRFJNX01FTV9EUklWRVIpOworCSAgIAlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkJCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwkJCWlmICggYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsICYmIGJ1Zi0+dG90YWwgKQorCQkJCWRybV9pb3JlbWFwZnJlZShidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwsIGJ1Zi0+dG90YWwsIGRldik7CisJCX0KKwl9CisgICAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF93YWl0X3JpbmcoZHJtX2RldmljZV90ICpkZXYsIGludCBuKQoreworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCWRybV9pODEwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKKyAgIAlpbnQgaXRlcnMgPSAwOworICAgCXVuc2lnbmVkIGxvbmcgZW5kOworCXVuc2lnbmVkIGludCBsYXN0X2hlYWQgPSBJODEwX1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisKKwllbmQgPSBqaWZmaWVzICsgKEhaKjMpOworICAgCXdoaWxlIChyaW5nLT5zcGFjZSA8IG4pIHsKKwkgICAJcmluZy0+aGVhZCA9IEk4MTBfUkVBRChMUF9SSU5HICsgUklOR19IRUFEKSAmIEhFQURfQUREUjsKKwkgICAJcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwrOCk7CisJCWlmIChyaW5nLT5zcGFjZSA8IDApIHJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7CisJICAgCisJCWlmIChyaW5nLT5oZWFkICE9IGxhc3RfaGVhZCkgeworCQkJZW5kID0gamlmZmllcyArIChIWiozKTsKKwkJCWxhc3RfaGVhZCA9IHJpbmctPmhlYWQ7CisJCX0KKwkgIAorCSAgIAlpdGVycysrOworCQlpZiAodGltZV9iZWZvcmUoZW5kLCBqaWZmaWVzKSkgeworCQkgICAJRFJNX0VSUk9SKCJzcGFjZTogJWQgd2FudGVkICVkXG4iLCByaW5nLT5zcGFjZSwgbik7CisJCSAgIAlEUk1fRVJST1IoImxvY2t1cFxuIik7CisJCSAgIAlnb3RvIG91dF93YWl0X3Jpbmc7CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKworb3V0X3dhaXRfcmluZzoKKyAgIAlyZXR1cm4gaXRlcnM7Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgICAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAlkcm1faTgxMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CisKKyAgIAlyaW5nLT5oZWFkID0gSTgxMF9SRUFEKExQX1JJTkcgKyBSSU5HX0hFQUQpICYgSEVBRF9BRERSOworICAgICAJcmluZy0+dGFpbCA9IEk4MTBfUkVBRChMUF9SSU5HICsgUklOR19UQUlMKTsKKyAgICAgCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsKzgpOworICAgICAJaWYgKHJpbmctPnNwYWNlIDwgMCkgcmluZy0+c3BhY2UgKz0gcmluZy0+U2l6ZTsKK30KKworc3RhdGljIGludCBpODEwX2ZyZWVsaXN0X2luaXQoZHJtX2RldmljZV90ICpkZXYsIGRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYpCit7CisgICAgICAJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisgICAJaW50IG15X2lkeCA9IDI0OworICAgCXUzMiAqaHdfc3RhdHVzID0gKHUzMiAqKShkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UgKyBteV9pZHgpOworICAgCWludCBpOworCisJaWYgKGRtYS0+YnVmX2NvdW50ID4gMTAxOSkgeworCSAgIAkvKiBOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBzdGF0dXMgcGFnZSBmb3IgdGhlIGZyZWVsaXN0ICovCisJICAgCXJldHVybiAtRUlOVkFMOworCX0KKworICAgCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7CisJICAgCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0WyBpIF07CisJICAgCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCSAgIAlidWZfcHJpdi0+aW5fdXNlID0gaHdfc3RhdHVzKys7CisJICAgCWJ1Zl9wcml2LT5teV91c2VfaWR4ID0gbXlfaWR4OworCSAgIAlteV9pZHggKz0gNDsKKworCSAgIAkqYnVmX3ByaXYtPmluX3VzZSA9IEk4MTBfQlVGX0ZSRUU7CisKKwkJYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsID0gZHJtX2lvcmVtYXAoYnVmLT5idXNfYWRkcmVzcywKKwkJCQkJCQlidWYtPnRvdGFsLCBkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODEwX2RtYV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICAgICAgIGRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICAgZHJtX2k4MTBfaW5pdF90ICppbml0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKyAgIAltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1faTgxMF9wcml2YXRlX3QpKTsKKworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCWlmIChyX2xpc3QtPm1hcCAmJgorCQkgICAgcl9saXN0LT5tYXAtPnR5cGUgPT0gX0RSTV9TSE0gJiYKKwkJICAgIHJfbGlzdC0+bWFwLT5mbGFncyAmIF9EUk1fQ09OVEFJTlNfTE9DSyApIHsKKwkJCWRldl9wcml2LT5zYXJlYV9tYXAgPSByX2xpc3QtPm1hcDsKKyAJCQlicmVhazsKKyAJCX0KKyAJfQorCWlmICghZGV2X3ByaXYtPnNhcmVhX21hcCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkgICAJaTgxMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoImNhbiBub3QgZmluZCBzYXJlYSFcbiIpOworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X3ByaXYtPm1taW9fbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPm1taW9fb2Zmc2V0KTsKKwlpZiAoIWRldl9wcml2LT5tbWlvX21hcCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkgICAJaTgxMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoImNhbiBub3QgZmluZCBtbWlvIG1hcCFcbiIpOworCSAgIAlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5idWZmZXJzX29mZnNldCk7CisJaWYgKCFkZXYtPmFncF9idWZmZXJfbWFwKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCSAgIAlpODEwX2RtYV9jbGVhbnVwKGRldik7CisJICAgCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIGRtYSBidWZmZXIgbWFwIVxuIik7CisJICAgCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2ID0gKGRybV9pODEwX3NhcmVhX3QgKikKKwkJKCh1OCAqKWRldl9wcml2LT5zYXJlYV9tYXAtPmhhbmRsZSArCisJCSBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKyAgIAlkZXZfcHJpdi0+cmluZy5TdGFydCA9IGluaXQtPnJpbmdfc3RhcnQ7CisgICAJZGV2X3ByaXYtPnJpbmcuRW5kID0gaW5pdC0+cmluZ19lbmQ7CisgICAJZGV2X3ByaXYtPnJpbmcuU2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKKworICAgCWRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPSBkcm1faW9yZW1hcChkZXYtPmFncC0+YmFzZSArCisJCQkJCQkgICAgaW5pdC0+cmluZ19zdGFydCwKKwkJCQkJCSAgICBpbml0LT5yaW5nX3NpemUsIGRldik7CisKKyAgIAlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9PSBOVUxMKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKSBkZXZfcHJpdjsKKwkgICAJaTgxMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgorCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKKwkgICAJcmV0dXJuIC1FTk9NRU07CisJfQorCisgICAJZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrID0gZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDE7CisKKwlkZXZfcHJpdi0+dyA9IGluaXQtPnc7CisJZGV2X3ByaXYtPmggPSBpbml0LT5oOworCWRldl9wcml2LT5waXRjaCA9IGluaXQtPnBpdGNoOworCWRldl9wcml2LT5iYWNrX29mZnNldCA9IGluaXQtPmJhY2tfb2Zmc2V0OworCWRldl9wcml2LT5kZXB0aF9vZmZzZXQgPSBpbml0LT5kZXB0aF9vZmZzZXQ7CisJZGV2X3ByaXYtPmZyb250X29mZnNldCA9IGluaXQtPmZyb250X29mZnNldDsKKworCWRldl9wcml2LT5vdmVybGF5X29mZnNldCA9IGluaXQtPm92ZXJsYXlfb2Zmc2V0OworCWRldl9wcml2LT5vdmVybGF5X3BoeXNpY2FsID0gaW5pdC0+b3ZlcmxheV9waHlzaWNhbDsKKworCWRldl9wcml2LT5mcm9udF9kaTEgPSBpbml0LT5mcm9udF9vZmZzZXQgfCBpbml0LT5waXRjaF9iaXRzOworCWRldl9wcml2LT5iYWNrX2RpMSA9IGluaXQtPmJhY2tfb2Zmc2V0IHwgaW5pdC0+cGl0Y2hfYml0czsKKwlkZXZfcHJpdi0+emkxID0gaW5pdC0+ZGVwdGhfb2Zmc2V0IHwgaW5pdC0+cGl0Y2hfYml0czsKKworICAgCS8qIFByb2dyYW0gSGFyZHdhcmUgU3RhdHVzIFBhZ2UgKi8KKyAgIAlkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwKKwkJCQkJCSZkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKyAgIAlpZiAoIWRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTgxMF9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoIkNhbiBub3QgYWxsb2NhdGUgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisgICAJbWVtc2V0KGRldl9wcml2LT5od19zdGF0dXNfcGFnZSwgMCwgUEFHRV9TSVpFKTsKKyAgIAlEUk1fREVCVUcoImh3IHN0YXR1cyBwYWdlIEAgJXBcbiIsIGRldl9wcml2LT5od19zdGF0dXNfcGFnZSk7CisKKwlJODEwX1dSSVRFKDB4MDIwODAsIGRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UpOworICAgCURSTV9ERUJVRygiRW5hYmxlZCBoYXJkd2FyZSBzdGF0dXMgcGFnZVxuIik7CisKKyAgIAkvKiBOb3cgd2UgbmVlZCB0byBpbml0IG91ciBmcmVlbGlzdCAqLworCWlmIChpODEwX2ZyZWVsaXN0X2luaXQoZGV2LCBkZXZfcHJpdikgIT0gMCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkgICAJaTgxMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlEUk1fRVJST1IoIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIHN0YXR1cyBwYWdlIGZvciIKKwkJCSAgIiB0aGUgZnJlZWxpc3RcbiIpOworCSAgIAlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKKyAgIAlyZXR1cm4gMDsKK30KKworLyogaTgxMCBEUk0gdmVyc2lvbiAxLjEgdXNlZCBhIHNtYWxsZXIgaW5pdCBzdHJ1Y3R1cmUgd2l0aCBkaWZmZXJlbnQKKyAqIG9yZGVyaW5nIG9mIHZhbHVlcyB0aGFuIGlzIGN1cnJlbnRseSB1c2VkIChkcm0gPj0gMS4yKS4gVGhlcmUgaXMKKyAqIG5vIGRlZmluZWQgd2F5IHRvIGRldGVjdCB0aGUgWEZyZWUgdmVyc2lvbiB0byBjb3JyZWN0IHRoaXMgcHJvYmxlbSwKKyAqIGhvd2V2ZXIgYnkgY2hlY2tpbmcgdXNpbmcgdGhpcyBwcm9jZWR1cmUgd2UgY2FuIGRldGVjdCB0aGUgY29ycmVjdAorICogdGhpbmcgdG8gZG8uCisgKgorICogIzEgUmVhZCB0aGUgU21hbGxlciBpbml0IHN0cnVjdHVyZSBmcm9tIHVzZXItc3BhY2UKKyAqICMyIFZlcmlmeSB0aGUgb3ZlcmxheV9waHlzaWNhbCBpcyBhIHZhbGlkIHBoeXNpY2FsIGFkZHJlc3MsIG9yIE5VTEwKKyAqICAgIElmIGl0IGlzbid0IHRoZW4gd2UgaGF2ZSBhIHYxLjEgY2xpZW50LiBGaXggdXAgcGFyYW1zLgorICogICAgSWYgaXQgaXMsIHRoZW4gd2UgaGF2ZSBhIDEuMiBjbGllbnQuLi4gZ2V0IHRoZSByZXN0IG9mIHRoZSBkYXRhLgorICovCitzdGF0aWMgaW50IGk4MTBfZG1hX2luaXRfY29tcGF0KGRybV9pODEwX2luaXRfdCAqaW5pdCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisKKwkvKiBHZXQgdjEuMSBpbml0IGRhdGEgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoaW5pdCwgKGRybV9pODEwX3ByZTEyX2luaXRfdCBfX3VzZXIgKilhcmcsCisJCQkgIHNpemVvZihkcm1faTgxMF9wcmUxMl9pbml0X3QpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoKCFpbml0LT5vdmVybGF5X3BoeXNpY2FsKSB8fCAoaW5pdC0+b3ZlcmxheV9waHlzaWNhbCA+IDQwOTYpKSB7CisKKwkJLyogVGhpcyBpcyBhIHYxLjIgY2xpZW50LCBqdXN0IGdldCB0aGUgdjEuMiBpbml0IGRhdGEgKi8KKwkJRFJNX0lORk8oIlVzaW5nIFBPU1QgdjEuMiBpbml0LlxuIik7CisJCWlmIChjb3B5X2Zyb21fdXNlcihpbml0LCAoZHJtX2k4MTBfaW5pdF90IF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YoZHJtX2k4MTBfaW5pdF90KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKworCQkvKiBUaGlzIGlzIGEgdjEuMSBjbGllbnQsIGZpeCB0aGUgcGFyYW1zICovCisJCURSTV9JTkZPKCJVc2luZyBQUkUgdjEuMiBpbml0LlxuIik7CisJIAlpbml0LT5waXRjaF9iaXRzID0gaW5pdC0+aDsKKwkgCWluaXQtPnBpdGNoID0gaW5pdC0+dzsKKwkgCWluaXQtPmggPSBpbml0LT5vdmVybGF5X3BoeXNpY2FsOworCSAJaW5pdC0+dyA9IGluaXQtPm92ZXJsYXlfb2Zmc2V0OworCSAJaW5pdC0+b3ZlcmxheV9waHlzaWNhbCA9IDA7CisJIAlpbml0LT5vdmVybGF5X29mZnNldCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9kbWFfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgIAlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworICAgCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXY7CisgICAJZHJtX2k4MTBfaW5pdF90IGluaXQ7CisgICAJaW50IHJldGNvZGUgPSAwOworCisJLyogR2V0IG9ubHkgdGhlIGluaXQgZnVuYyAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5pdCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZHJtX2k4MTBfaW5pdF9mdW5jX3QpKSkgCisJCXJldHVybiAtRUZBVUxUOworCisgICAJc3dpdGNoKGluaXQuZnVuYykgeworCSAJY2FzZSBJODEwX0lOSVRfRE1BOgorCSAJICAgICAgIAkvKiBUaGlzIGNhc2UgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIEl0CisJCQkgKiBoYW5kbGVzIFhGcmVlIDQuMS4wIGFuZCA0LjIuMCwgYW5kIGhhcyB0bworCQkJICogZG8gc29tZSBwYXJhbWV0ZXIgY2hlY2tpbmcgYXMgZGVzY3JpYmVkIGJlbG93LgorCQkJICogSXQgd2lsbCBzb21lZGF5IGdvIGF3YXkuCisJCQkgKi8KKwkJCXJldGNvZGUgPSBpODEwX2RtYV9pbml0X2NvbXBhdCgmaW5pdCwgYXJnKTsKKwkJCWlmIChyZXRjb2RlKQorCQkJCXJldHVybiByZXRjb2RlOworCisJICAgCQlkZXZfcHJpdiA9IGRybV9hbGxvYyhzaXplb2YoZHJtX2k4MTBfcHJpdmF0ZV90KSwKKwkJCQkJICAgICBEUk1fTUVNX0RSSVZFUik7CisJICAgCQlpZiAoZGV2X3ByaXYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkgICAJCXJldGNvZGUgPSBpODEwX2RtYV9pbml0aWFsaXplKGRldiwgZGV2X3ByaXYsICZpbml0KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJIAljYXNlIEk4MTBfSU5JVF9ETUFfMV80OgorCQkJRFJNX0lORk8oIlVzaW5nIHYxLjQgaW5pdC5cbiIpOworICAJCQlpZiAoY29weV9mcm9tX3VzZXIoJmluaXQsIChkcm1faTgxMF9pbml0X3QgX191c2VyICopYXJnLAorCQkJCQkgIHNpemVvZihkcm1faTgxMF9pbml0X3QpKSkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCSAgIAkJZGV2X3ByaXYgPSBkcm1fYWxsb2Moc2l6ZW9mKGRybV9pODEwX3ByaXZhdGVfdCksCisJCQkJCSAgICAgRFJNX01FTV9EUklWRVIpOworCQkJaWYgKGRldl9wcml2ID09IE5VTEwpIAorCQkJCXJldHVybiAtRU5PTUVNOworCSAgIAkJcmV0Y29kZSA9IGk4MTBfZG1hX2luaXRpYWxpemUoZGV2LCBkZXZfcHJpdiwgJmluaXQpOworCQkJYnJlYWs7CisKKwkgCWNhc2UgSTgxMF9DTEVBTlVQX0RNQToKKwkJICAgICAgICBEUk1fSU5GTygiRE1BIENsZWFudXBcbiIpOworCSAgIAkJcmV0Y29kZSA9IGk4MTBfZG1hX2NsZWFudXAoZGV2KTsKKyAgICAgICAgICAgICAgCSAgIAlicmVhazsKKwl9CisKKyAgIAlyZXR1cm4gcmV0Y29kZTsKK30KKworCisKKy8qIE1vc3QgZWZmaWNpZW50IHdheSB0byB2ZXJpZnkgc3RhdGUgZm9yIHRoZSBpODEwIGlzIGFzIGl0IGlzCisgKiBlbWl0dGVkLiAgTm9uLWNvbmZvcm1hbnQgc3RhdGUgaXMgc2lsZW50bHkgZHJvcHBlZC4KKyAqCisgKiBVc2UgJ3ZvbGF0aWxlJyAmIGxvY2FsIHZhciB0bXAgdG8gZm9yY2UgdGhlIGVtaXR0ZWQgdmFsdWVzIHRvIGJlCisgKiBpZGVudGljYWwgdG8gdGhlIHZlcmlmaWVkIG9uZXMuCisgKi8KK3N0YXRpYyB2b2lkIGk4MTBFbWl0Q29udGV4dFZlcmlmaWVkKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSApCit7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGksIGogPSAwOworCXVuc2lnbmVkIGludCB0bXA7CisJUklOR19MT0NBTFM7CisKKwlCRUdJTl9MUF9SSU5HKCBJODEwX0NUWF9TRVRVUF9TSVpFICk7CisKKwlPVVRfUklORyggR0ZYX09QX0NPTE9SX0ZBQ1RPUiApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfQ1RYUkVHX0NGMV0gKTsKKworCU9VVF9SSU5HKCBHRlhfT1BfU1RJUFBMRSApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfQ1RYUkVHX1NUMV0gKTsKKworCWZvciAoIGkgPSA0IDsgaSA8IEk4MTBfQ1RYX1NFVFVQX1NJWkUgOyBpKysgKSB7CisJCXRtcCA9IGNvZGVbaV07CisKKwkJaWYgKCh0bXAgJiAoNzw8MjkpKSA9PSAoMzw8MjkpICYmCisJCSAgICAodG1wICYgKDB4MWY8PDI0KSkgPCAoMHgxZDw8MjQpKQorCQl7CisJCQlPVVRfUklORyggdG1wICk7CisJCQlqKys7CisJCX0KKwkJZWxzZSBwcmludGsoImNvbnN0ZXh0IHN0YXRlIGRyb3BwZWQhISFcbiIpOworCX0KKworCWlmIChqICYgMSkKKwkJT1VUX1JJTkcoIDAgKTsKKworCUFEVkFOQ0VfTFBfUklORygpOworfQorCitzdGF0aWMgdm9pZCBpODEwRW1pdFRleFZlcmlmaWVkKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjb2RlICkKK3sKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaSwgaiA9IDA7CisJdW5zaWduZWQgaW50IHRtcDsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX0xQX1JJTkcoIEk4MTBfVEVYX1NFVFVQX1NJWkUgKTsKKworCU9VVF9SSU5HKCBHRlhfT1BfTUFQX0lORk8gKTsKKwlPVVRfUklORyggY29kZVtJODEwX1RFWFJFR19NSTFdICk7CisJT1VUX1JJTkcoIGNvZGVbSTgxMF9URVhSRUdfTUkyXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfVEVYUkVHX01JM10gKTsKKworCWZvciAoIGkgPSA0IDsgaSA8IEk4MTBfVEVYX1NFVFVQX1NJWkUgOyBpKysgKSB7CisJCXRtcCA9IGNvZGVbaV07CisKKwkJaWYgKCh0bXAgJiAoNzw8MjkpKSA9PSAoMzw8MjkpICYmCisJCSAgICAodG1wICYgKDB4MWY8PDI0KSkgPCAoMHgxZDw8MjQpKQorCQl7CisJCQlPVVRfUklORyggdG1wICk7CisJCQlqKys7CisJCX0KKwkJZWxzZSBwcmludGsoInRleHR1cmUgc3RhdGUgZHJvcHBlZCEhIVxuIik7CisJfQorCisJaWYgKGogJiAxKQorCQlPVVRfUklORyggMCApOworCisJQURWQU5DRV9MUF9SSU5HKCk7Cit9CisKKworLyogTmVlZCB0byBkbyBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcgd2hlbiBzZXR0aW5nIHRoZSBkZXN0IGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgaTgxMEVtaXREZXN0VmVyaWZpZWQoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjb2RlICkKK3sKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fTFBfUklORyggSTgxMF9ERVNUX1NFVFVQX1NJWkUgKyAyICk7CisKKwl0bXAgPSBjb2RlW0k4MTBfREVTVFJFR19ESTFdOworCWlmICh0bXAgPT0gZGV2X3ByaXYtPmZyb250X2RpMSB8fCB0bXAgPT0gZGV2X3ByaXYtPmJhY2tfZGkxKSB7CisJCU9VVF9SSU5HKCBDTURfT1BfREVTVEJVRkZFUl9JTkZPICk7CisJCU9VVF9SSU5HKCB0bXAgKTsKKwl9IGVsc2UKKwkgICBEUk1fREVCVUcoImJhZCBkaTEgJXggKGFsbG93ICV4IG9yICV4KVxuIiwKKwkJICAgICB0bXAsIGRldl9wcml2LT5mcm9udF9kaTEsIGRldl9wcml2LT5iYWNrX2RpMSk7CisKKwkvKiBpbnZhcmllbnQ6CisJICovCisJT1VUX1JJTkcoIENNRF9PUF9aX0JVRkZFUl9JTkZPICk7CisJT1VUX1JJTkcoIGRldl9wcml2LT56aTEgKTsKKworCU9VVF9SSU5HKCBHRlhfT1BfREVTVEJVRkZFUl9WQVJTICk7CisJT1VUX1JJTkcoIGNvZGVbSTgxMF9ERVNUUkVHX0RWMV0gKTsKKworCU9VVF9SSU5HKCBHRlhfT1BfRFJBV1JFQ1RfSU5GTyApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfREVTVFJFR19EUjFdICk7CisJT1VUX1JJTkcoIGNvZGVbSTgxMF9ERVNUUkVHX0RSMl0gKTsKKwlPVVRfUklORyggY29kZVtJODEwX0RFU1RSRUdfRFIzXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MTBfREVTVFJFR19EUjRdICk7CisJT1VUX1JJTkcoIDAgKTsKKworCUFEVkFOQ0VfTFBfUklORygpOworfQorCisKKworc3RhdGljIHZvaWQgaTgxMEVtaXRTdGF0ZSggZHJtX2RldmljZV90ICpkZXYgKQoreworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKKwkKKwlEUk1fREVCVUcoIiVzICV4XG4iLCBfX0ZVTkNUSU9OX18sIGRpcnR5KTsKKworCWlmIChkaXJ0eSAmIEk4MTBfVVBMT0FEX0JVRkZFUlMpIHsKKwkJaTgxMEVtaXREZXN0VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+QnVmZmVyU3RhdGUgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MTBfVVBMT0FEX0JVRkZFUlM7CisJfQorCisJaWYgKGRpcnR5ICYgSTgxMF9VUExPQURfQ1RYKSB7CisJCWk4MTBFbWl0Q29udGV4dFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPkNvbnRleHRTdGF0ZSApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgxMF9VUExPQURfQ1RYOworCX0KKworCWlmIChkaXJ0eSAmIEk4MTBfVVBMT0FEX1RFWDApIHsKKwkJaTgxMEVtaXRUZXhWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5UZXhTdGF0ZVswXSApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgxMF9VUExPQURfVEVYMDsKKwl9CisKKwlpZiAoZGlydHkgJiBJODEwX1VQTE9BRF9URVgxKSB7CisJCWk4MTBFbWl0VGV4VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+VGV4U3RhdGVbMV0gKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MTBfVVBMT0FEX1RFWDE7CisJfQorfQorCisKKworLyogbmVlZCB0byB2ZXJpZnkKKyAqLworc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfY2xlYXIoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZmxhZ3MsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3IsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2xlYXJfenZhbCApCit7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CisJaW50IGNwcCA9IDI7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJCisJaWYgKCBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEgKSB7CisJICAgICAgICB1bnNpZ25lZCBpbnQgdG1wID0gZmxhZ3M7CisJICAgICAgIAorCQlmbGFncyAmPSB+KEk4MTBfRlJPTlQgfCBJODEwX0JBQ0spOworCQlpZiAodG1wICYgSTgxMF9GUk9OVCkgZmxhZ3MgfD0gSTgxMF9CQUNLOworCQlpZiAodG1wICYgSTgxMF9CQUNLKSBmbGFncyB8PSBJODEwX0ZST05UOworCX0KKworICAJaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgICAgIAlpZiAobmJveCA+IEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTKQorICAgICAJCW5ib3ggPSBJODEwX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWZvciAoaSA9IDAgOyBpIDwgbmJveCA7IGkrKywgcGJveCsrKSB7CisJCXVuc2lnbmVkIGludCB4ID0gcGJveC0+eDE7CisJCXVuc2lnbmVkIGludCB5ID0gcGJveC0+eTE7CisJCXVuc2lnbmVkIGludCB3aWR0aCA9IChwYm94LT54MiAtIHgpICogY3BwOworCQl1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gcGJveC0+eTIgLSB5OworCQl1bnNpZ25lZCBpbnQgc3RhcnQgPSB5ICogcGl0Y2ggKyB4ICogY3BwOworCisJCWlmIChwYm94LT54MSA+IHBib3gtPngyIHx8CisJCSAgICBwYm94LT55MSA+IHBib3gtPnkyIHx8CisJCSAgICBwYm94LT54MiA+IGRldl9wcml2LT53IHx8CisJCSAgICBwYm94LT55MiA+IGRldl9wcml2LT5oKQorCQkJY29udGludWU7CisKKwkgICAJaWYgKCBmbGFncyAmIEk4MTBfRlJPTlQgKSB7CisJCQlCRUdJTl9MUF9SSU5HKCA2ICk7CisJCQlPVVRfUklORyggQlIwMF9CSVRCTFRfQ0xJRU5UIHwKKwkJCQkgIEJSMDBfT1BfQ09MT1JfQkxUIHwgMHgzICk7CisJCQlPVVRfUklORyggQlIxM19TT0xJRF9QQVRURVJOIHwgKDB4RjAgPDwgMTYpIHwgcGl0Y2ggKTsKKwkJCU9VVF9SSU5HKCAoaGVpZ2h0IDw8IDE2KSB8IHdpZHRoICk7CisJCQlPVVRfUklORyggc3RhcnQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl9jb2xvciApOworCQkJT1VUX1JJTkcoIDAgKTsKKwkJCUFEVkFOQ0VfTFBfUklORygpOworCQl9CisKKwkJaWYgKCBmbGFncyAmIEk4MTBfQkFDSyApIHsKKwkJCUJFR0lOX0xQX1JJTkcoIDYgKTsKKwkJCU9VVF9SSU5HKCBCUjAwX0JJVEJMVF9DTElFTlQgfAorCQkJCSAgQlIwMF9PUF9DT0xPUl9CTFQgfCAweDMgKTsKKwkJCU9VVF9SSU5HKCBCUjEzX1NPTElEX1BBVFRFUk4gfCAoMHhGMCA8PCAxNikgfCBwaXRjaCApOworCQkJT1VUX1JJTkcoIChoZWlnaHQgPDwgMTYpIHwgd2lkdGggKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19vZmZzZXQgKyBzdGFydCApOworCQkJT1VUX1JJTkcoIGNsZWFyX2NvbG9yICk7CisJCQlPVVRfUklORyggMCApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0KKworCQlpZiAoIGZsYWdzICYgSTgxMF9ERVBUSCApIHsKKwkJCUJFR0lOX0xQX1JJTkcoIDYgKTsKKwkJCU9VVF9SSU5HKCBCUjAwX0JJVEJMVF9DTElFTlQgfAorCQkJCSAgQlIwMF9PUF9DT0xPUl9CTFQgfCAweDMgKTsKKwkJCU9VVF9SSU5HKCBCUjEzX1NPTElEX1BBVFRFUk4gfCAoMHhGMCA8PCAxNikgfCBwaXRjaCApOworCQkJT1VUX1JJTkcoIChoZWlnaHQgPDwgMTYpIHwgd2lkdGggKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZGVwdGhfb2Zmc2V0ICsgc3RhcnQgKTsKKwkJCU9VVF9SSU5HKCBjbGVhcl96dmFsICk7CisJCQlPVVRfUklORyggMCApOworCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX3N3YXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKKwlpbnQgY3BwID0gMjsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygic3dhcGJ1ZmZlcnNcbiIpOworCisgIAlpODEwX2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworICAgICAgCWlmIChuYm94ID4gSTgxMF9OUl9TQVJFQV9DTElQUkVDVFMpCisgICAgIAkJbmJveCA9IEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJZm9yIChpID0gMCA7IGkgPCBuYm94OyBpKyssIHBib3grKykKKwl7CisJCXVuc2lnbmVkIGludCB3ID0gcGJveC0+eDIgLSBwYm94LT54MTsKKwkJdW5zaWduZWQgaW50IGggPSBwYm94LT55MiAtIHBib3gtPnkxOworCQl1bnNpZ25lZCBpbnQgZHN0ID0gcGJveC0+eDEqY3BwICsgcGJveC0+eTEqcGl0Y2g7CisJCXVuc2lnbmVkIGludCBzdGFydCA9IGRzdDsKKworCQlpZiAocGJveC0+eDEgPiBwYm94LT54MiB8fAorCQkgICAgcGJveC0+eTEgPiBwYm94LT55MiB8fAorCQkgICAgcGJveC0+eDIgPiBkZXZfcHJpdi0+dyB8fAorCQkgICAgcGJveC0+eTIgPiBkZXZfcHJpdi0+aCkKKwkJCWNvbnRpbnVlOworCisJCUJFR0lOX0xQX1JJTkcoIDYgKTsKKwkJT1VUX1JJTkcoIEJSMDBfQklUQkxUX0NMSUVOVCB8IEJSMDBfT1BfU1JDX0NPUFlfQkxUIHwgMHg0ICk7CisJCU9VVF9SSU5HKCBwaXRjaCB8ICgweENDIDw8IDE2KSk7CisJCU9VVF9SSU5HKCAoaCA8PCAxNikgfCAodyAqIGNwcCkpOworCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKQorCQkgIE9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9vZmZzZXQgKyBzdGFydCk7CisJCWVsc2UKKwkJICBPVVRfUklORyhkZXZfcHJpdi0+YmFja19vZmZzZXQgKyBzdGFydCk7CisJCU9VVF9SSU5HKCBwaXRjaCApOworCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKQorCQkgIE9VVF9SSU5HKGRldl9wcml2LT5iYWNrX29mZnNldCArIHN0YXJ0KTsKKwkJZWxzZQorCQkgIE9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9vZmZzZXQgKyBzdGFydCk7CisJCUFEVkFOQ0VfTFBfUklORygpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICBkcm1fYnVmX3QgKmJ1ZiwKKwkJCQkgICAgIGludCBkaXNjYXJkLAorCQkJCSAgICAgaW50IHVzZWQpCit7CisgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKyAgIAlkcm1fY2xpcF9yZWN0X3QgKmJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworICAgCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylidWYtPmJ1c19hZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyZXNzIC0gZGV2LT5hZ3AtPmJhc2U7CisJaW50IGkgPSAwOworICAgCVJJTkdfTE9DQUxTOworCisgICAJaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgIAlpZiAobmJveCA+IEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTKQorCQluYm94ID0gSTgxMF9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlpZiAodXNlZCA+IDQqMTAyNCkKKwkJdXNlZCA9IDA7CisKKwlpZiAoc2FyZWFfcHJpdi0+ZGlydHkpCisJICAgaTgxMEVtaXRTdGF0ZSggZGV2ICk7CisKKwlpZiAoYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPT0gSTgxMF9CVUZfTUFQUEVEKSB7CisJCXVuc2lnbmVkIGludCBwcmltID0gKHNhcmVhX3ByaXYtPnZlcnRleF9wcmltICYgUFJfTUFTSyk7CisKKwkJKih1MzIgKilidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwgPSAoKEdGWF9PUF9QUklNSVRJVkUgfCBwcmltIHwgKCh1c2VkLzQpLTIpKSk7CisKKwkJaWYgKHVzZWQgJiA0KSB7CisJCQkqKHUzMiAqKSgodTMyKWJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCArIHVzZWQpID0gMDsKKwkJCXVzZWQgKz0gNDsKKwkJfQorCisJCWk4MTBfdW5tYXBfYnVmZmVyKGJ1Zik7CisJfQorCisJaWYgKHVzZWQpIHsKKwkJZG8geworCQkJaWYgKGkgPCBuYm94KSB7CisJCQkJQkVHSU5fTFBfUklORyg0KTsKKwkJCQlPVVRfUklORyggR0ZYX09QX1NDSVNTT1IgfCBTQ19VUERBVEVfU0NJU1NPUiB8CisJCQkJCSAgU0NfRU5BQkxFICk7CisJCQkJT1VUX1JJTkcoIEdGWF9PUF9TQ0lTU09SX0lORk8gKTsKKwkJCQlPVVRfUklORyggYm94W2ldLngxIHwgKGJveFtpXS55MTw8MTYpICk7CisJCQkJT1VUX1JJTkcoIChib3hbaV0ueDItMSkgfCAoKGJveFtpXS55Mi0xKTw8MTYpICk7CisJCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCQl9CisKKwkJCUJFR0lOX0xQX1JJTkcoNCk7CisJCQlPVVRfUklORyggQ01EX09QX0JBVENIX0JVRkZFUiApOworCQkJT1VUX1JJTkcoIHN0YXJ0IHwgQkIxX1BST1RFQ1RFRCApOworCQkJT1VUX1JJTkcoIHN0YXJ0ICsgdXNlZCAtIDQgKTsKKwkJCU9VVF9SSU5HKCAwICk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKworCQl9IHdoaWxlICgrK2kgPCBuYm94KTsKKwl9CisKKwlpZiAoZGlzY2FyZCkgeworCQlkZXZfcHJpdi0+Y291bnRlcisrOworCisJCSh2b2lkKSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MTBfQlVGX0NMSUVOVCwKKwkJCSAgICAgICBJODEwX0JVRl9IQVJEV0FSRSk7CisKKwkJQkVHSU5fTFBfUklORyg4KTsKKwkJT1VUX1JJTkcoIENNRF9TVE9SRV9EV09SRF9JRFggKTsKKwkJT1VUX1JJTkcoIDIwICk7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+Y291bnRlciApOworCQlPVVRfUklORyggQ01EX1NUT1JFX0RXT1JEX0lEWCApOworCQlPVVRfUklORyggYnVmX3ByaXYtPm15X3VzZV9pZHggKTsKKwkJT1VUX1JJTkcoIEk4MTBfQlVGX0ZSRUUgKTsKKwkJT1VUX1JJTkcoIENNRF9SRVBPUlRfSEVBRCApOworCQlPVVRfUklORyggMCApOworCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX2ZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKyAgICAgICAgZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOworCVJJTkdfTE9DQUxTOworCisJRFJNX0RFQlVHKCAiJXM6IHBhZ2U9JWQgcGZDdXJyZW50UGFnZT0lZFxuIiwgCisJCV9fRlVOQ1RJT05fXywgCisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UsCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UpOworCQorICAgICAgICBpODEwX2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCUJFR0lOX0xQX1JJTkcoIDIgKTsKKyAgIAlPVVRfUklORyggSU5TVF9QQVJTRVJfQ0xJRU5UIHwgSU5TVF9PUF9GTFVTSCB8IElOU1RfRkxVU0hfTUFQX0NBQ0hFICk7IAorCU9VVF9SSU5HKCAwICk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlCRUdJTl9MUF9SSU5HKCBJODEwX0RFU1RfU0VUVVBfU0laRSArIDIgKTsKKwkvKiBPbiBpODE1IGF0IGxlYXN0IEFTWU5DIGlzIGJ1Z2d5ICovCisJLyogcGl0Y2g8PDUgaXMgZnJvbSAxMS4yLjggcDE1OCwKKwkgICBpdHMgdGhlIHBpdGNoIC8gOCB0aGVuIGxlZnQgc2hpZnRlZCA4LAorCSAgIHNvIChwaXRjaCA+PiAzKSA8PCA4ICovCisJT1VUX1JJTkcoIENNRF9PUF9GUk9OVEJVRkZFUl9JTkZPIHwgKHBpdGNoPDw1KSAvKnwgQVNZTkNfRkxJUCAqLyApOworCWlmICggZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwICkgeworCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICk7CisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAxOworCX0gZWxzZSB7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCX0KKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCUJFR0lOX0xQX1JJTkcoMik7CisJT1VUX1JJTkcoIENNRF9PUF9XQUlUX0ZPUl9FVkVOVCB8IFdBSVRfRk9SX1BMQU5FX0FfRkxJUCApOworCU9VVF9SSU5HKCAwICk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwkvKiBJbmNyZW1lbnQgdGhlIGZyYW1lIGNvdW50ZXIuICBUaGUgY2xpZW50LXNpZGUgM0QgZHJpdmVyIG11c3QKKwkgKiB0aHJvdHRsZSB0aGUgZnJhbWVyYXRlIGJ5IHdhaXRpbmcgZm9yIHRoaXMgdmFsdWUgYmVmb3JlCisJICogcGVyZm9ybWluZyB0aGUgc3dhcGJ1ZmZlciBpb2N0bC4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKKworfQorCitzdGF0aWMgdm9pZCBpODEwX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpCit7CisgICAgICAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAJUklOR19MT0NBTFM7CisKKy8qICAJcHJpbnRrKCIlc1xuIiwgX19GVU5DVElPTl9fKTsgKi8KKworICAJaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgIAlCRUdJTl9MUF9SSU5HKDQpOworICAgCU9VVF9SSU5HKCBJTlNUX1BBUlNFUl9DTElFTlQgfCBJTlNUX09QX0ZMVVNIIHwgSU5TVF9GTFVTSF9NQVBfQ0FDSEUgKTsKKyAgIAlPVVRfUklORyggQ01EX1JFUE9SVF9IRUFEICk7CisgICAgICAJT1VUX1JJTkcoIDAgKTsKKyAgICAgIAlPVVRfUklORyggMCApOworICAgCUFEVkFOQ0VfTFBfUklORygpOworCisJaTgxMF93YWl0X3JpbmcoIGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDggKTsKK30KKworc3RhdGljIGludCBpODEwX2ZsdXNoX3F1ZXVlKGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworICAgCWludCBpLCByZXQgPSAwOworICAgCVJJTkdfTE9DQUxTOworCQorLyogIAlwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOyAqLworCisgICAJaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKyAgIAlCRUdJTl9MUF9SSU5HKDIpOworICAgICAgCU9VVF9SSU5HKCBDTURfUkVQT1JUX0hFQUQgKTsKKyAgICAgIAlPVVRfUklORyggMCApOworICAgICAgCUFEVkFOQ0VfTFBfUklORygpOworCisJaTgxMF93YWl0X3JpbmcoIGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDggKTsKKworICAgCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7CisJICAgCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0WyBpIF07CisJICAgCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCQlpbnQgdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgxMF9CVUZfSEFSRFdBUkUsCisJCQkJICAgSTgxMF9CVUZfRlJFRSk7CisKKwkJaWYgKHVzZWQgPT0gSTgxMF9CVUZfSEFSRFdBUkUpCisJCQlEUk1fREVCVUcoInJlY2xhaW1lZCBmcm9tIEhBUkRXQVJFXG4iKTsKKwkJaWYgKHVzZWQgPT0gSTgxMF9CVUZfQ0xJRU5UKQorCQkJRFJNX0RFQlVHKCJzdGlsbCBvbiBjbGllbnRcbiIpOworCX0KKworICAgCXJldHVybiByZXQ7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCAqLwordm9pZCBpODEwX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJaW50CQkgaTsKKworCWlmICghZG1hKSByZXR1cm47CisgICAgICAJaWYgKCFkZXYtPmRldl9wcml2YXRlKSByZXR1cm47CisJaWYgKCFkbWEtPmJ1Zmxpc3QpIHJldHVybjsKKworICAgICAgICBpODEwX2ZsdXNoX3F1ZXVlKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCSAgIAlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCSAgIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwkJaWYgKGJ1Zi0+ZmlscCA9PSBmaWxwICYmIGJ1Zl9wcml2KSB7CisJCQlpbnQgdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgxMF9CVUZfQ0xJRU5ULAorCQkJCQkgICBJODEwX0JVRl9GUkVFKTsKKworCQkJaWYgKHVzZWQgPT0gSTgxMF9CVUZfQ0xJRU5UKQorCQkJCURSTV9ERUJVRygicmVjbGFpbWVkIGZyb20gY2xpZW50XG4iKTsKKwkJCWlmIChidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9PSBJODEwX0JVRl9NQVBQRUQpCisJCSAgICAgCQlidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9IEk4MTBfQlVGX1VOTUFQUEVEOworCQl9CisJfQorfQorCitpbnQgaTgxMF9mbHVzaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgIAlkcm1fZmlsZV90CSAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKyAgIAlkcm1fZGV2aWNlX3QJICAqZGV2CSAgPSBwcml2LT5oZWFkLT5kZXY7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworICAgCWk4MTBfZmx1c2hfcXVldWUoZGV2KTsKKyAgIAlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGk4MTBfZG1hX3ZlcnRleChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKyAgIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCisgICAgIAkJCQkJZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX2k4MTBfdmVydGV4X3QgdmVydGV4OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZXJ0ZXgsIChkcm1faTgxMF92ZXJ0ZXhfdCBfX3VzZXIgKilhcmcsIHNpemVvZih2ZXJ0ZXgpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCURSTV9ERUJVRygiaTgxMCBkbWEgdmVydGV4LCBpZHggJWQgdXNlZCAlZCBkaXNjYXJkICVkXG4iLAorCQkgIHZlcnRleC5pZHgsIHZlcnRleC51c2VkLCB2ZXJ0ZXguZGlzY2FyZCk7CisKKwlpZiAodmVydGV4LmlkeCA8IDAgfHwgdmVydGV4LmlkeCA+IGRtYS0+YnVmX2NvdW50KSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpODEwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoIGRldiwKKwkJCQkgIGRtYS0+YnVmbGlzdFsgdmVydGV4LmlkeCBdLAorCQkJCSAgdmVydGV4LmRpc2NhcmQsIHZlcnRleC51c2VkICk7CisKKyAgIAlhdG9taWNfYWRkKHZlcnRleC51c2VkLCAmZGV2LT5jb3VudHNbX0RSTV9TVEFUX1NFQ09OREFSWV0pOworCWF0b21pY19pbmMoJmRldi0+Y291bnRzW19EUk1fU1RBVF9ETUFdKTsKKwlzYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlci0xOworICAgCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KSBod19zdGF0dXNbNV07CisKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgaTgxMF9jbGVhcl9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODEwX2NsZWFyX3QgY2xlYXI7CisKKyAgIAlpZiAoY29weV9mcm9tX3VzZXIoJmNsZWFyLCAoZHJtX2k4MTBfY2xlYXJfdCBfX3VzZXIgKilhcmcsIHNpemVvZihjbGVhcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisgCS8qIEdIOiBTb21lb25lJ3MgZG9pbmcgbmFzdHkgdGhpbmdzLi4uICovCisgCWlmICghZGV2LT5kZXZfcHJpdmF0ZSkgeworIAkJcmV0dXJuIC1FSU5WQUw7CisgCX0KKworCWk4MTBfZG1hX2Rpc3BhdGNoX2NsZWFyKCBkZXYsIGNsZWFyLmZsYWdzLAorCQkJCSBjbGVhci5jbGVhcl9jb2xvciwKKwkJCQkgY2xlYXIuY2xlYXJfZGVwdGggKTsKKyAgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODEwX3N3YXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCisJRFJNX0RFQlVHKCJpODEwX3N3YXBfYnVmc1xuIik7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWk4MTBfZG1hX2Rpc3BhdGNoX3N3YXAoIGRldiApOworICAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfZ2V0YWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgIAlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKyAgIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODEwX3NhcmVhX3QgKikKKyAgICAgCQkJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKworICAgICAgCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KSBod19zdGF0dXNbNV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9nZXRidWYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJaW50CQkgIHJldGNvZGUgICA9IDA7CisJZHJtX2k4MTBfZG1hX3QJICBkOworICAgCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKyAgIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODEwX3NhcmVhX3QgKikKKyAgICAgCQkJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKworICAgCWlmIChjb3B5X2Zyb21fdXNlcigmZCwgKGRybV9pODEwX2RtYV90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWQuZ3JhbnRlZCA9IDA7CisKKwlyZXRjb2RlID0gaTgxMF9kbWFfZ2V0X2J1ZmZlcihkZXYsICZkLCBmaWxwKTsKKworCURSTV9ERUJVRygiaTgxMF9kbWE6ICVkIHJldHVybmluZyAlZCwgZ3JhbnRlZCA9ICVkXG4iLAorCQkgIGN1cnJlbnQtPnBpZCwgcmV0Y29kZSwgZC5ncmFudGVkKTsKKworCWlmIChjb3B5X3RvX3VzZXIoKGRybV9kbWFfdCBfX3VzZXIgKilhcmcsICZkLCBzaXplb2YoZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKyAgIAlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludCkgaHdfc3RhdHVzWzVdOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9jb3B5YnVmKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCS8qIE5ldmVyIGNvcHkgLSAyLjQueCBkb2Vzbid0IG5lZWQgaXQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODEwX2RvY29weShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCS8qIE5ldmVyIGNvcHkgLSAyLjQueCBkb2Vzbid0IG5lZWQgaXQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfbWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfdCAqYnVmLCBpbnQgdXNlZCwKKwkJdW5zaWduZWQgaW50IGxhc3RfcmVuZGVyKQoreworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5idXNfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcmVzcyAtIGRldi0+YWdwLT5iYXNlOworCWludCB1OworCVJJTkdfTE9DQUxTOworCisJaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKwl1ID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9DTElFTlQsCisJCUk4MTBfQlVGX0hBUkRXQVJFKTsKKwlpZiAodSAhPSBJODEwX0JVRl9DTElFTlQpIHsKKwkJRFJNX0RFQlVHKCJNQyBmb3VuZCBidWZmZXIgdGhhdCBpc24ndCBtaW5lIVxuIik7CisJfQorCisJaWYgKHVzZWQgPiA0KjEwMjQpCisJCXVzZWQgPSAwOworCisJc2FyZWFfcHJpdi0+ZGlydHkgPSAweDdmOworCisJRFJNX0RFQlVHKCJkaXNwYXRjaCBtYyBhZGRyIDB4JWx4LCB1c2VkIDB4JXhcbiIsCisJCWFkZHJlc3MsIHVzZWQpOworCisJZGV2X3ByaXYtPmNvdW50ZXIrKzsKKwlEUk1fREVCVUcoImRpc3BhdGNoIGNvdW50ZXIgOiAlbGRcbiIsIGRldl9wcml2LT5jb3VudGVyKTsKKwlEUk1fREVCVUcoImk4MTBfZG1hX2Rpc3BhdGNoX21jXG4iKTsKKwlEUk1fREVCVUcoInN0YXJ0IDogJWx4XG4iLCBzdGFydCk7CisJRFJNX0RFQlVHKCJ1c2VkIDogJWRcbiIsIHVzZWQpOworCURSTV9ERUJVRygic3RhcnQgKyB1c2VkIC0gNCA6ICVsZFxuIiwgc3RhcnQgKyB1c2VkIC0gNCk7CisKKwlpZiAoYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPT0gSTgxMF9CVUZfTUFQUEVEKSB7CisJCWlmICh1c2VkICYgNCkgeworCQkJKih1MzIgKikoKHUzMilidWZfcHJpdi0+dmlydHVhbCArIHVzZWQpID0gMDsKKwkJCXVzZWQgKz0gNDsKKwkJfQorCisJCWk4MTBfdW5tYXBfYnVmZmVyKGJ1Zik7CisJfQorCUJFR0lOX0xQX1JJTkcoNCk7CisJT1VUX1JJTkcoIENNRF9PUF9CQVRDSF9CVUZGRVIgKTsKKwlPVVRfUklORyggc3RhcnQgfCBCQjFfUFJPVEVDVEVEICk7CisJT1VUX1JJTkcoIHN0YXJ0ICsgdXNlZCAtIDQgKTsKKwlPVVRfUklORyggMCApOworCUFEVkFOQ0VfTFBfUklORygpOworCisKKwlCRUdJTl9MUF9SSU5HKDgpOworCU9VVF9SSU5HKCBDTURfU1RPUkVfRFdPUkRfSURYICk7CisJT1VUX1JJTkcoIGJ1Zl9wcml2LT5teV91c2VfaWR4ICk7CisJT1VUX1JJTkcoIEk4MTBfQlVGX0ZSRUUgKTsKKwlPVVRfUklORyggMCApOworCisJT1VUX1JJTkcoIENNRF9TVE9SRV9EV09SRF9JRFggKTsKKwlPVVRfUklORyggMTYgKTsKKwlPVVRfUklORyggbGFzdF9yZW5kZXIgKTsKKwlPVVRfUklORyggMCApOworCUFEVkFOQ0VfTFBfUklORygpOworfQorCitzdGF0aWMgaW50IGk4MTBfZG1hX21jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOworCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MTBfc2FyZWFfdCAqKQorCQlkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1faTgxMF9tY190IG1jOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtYywgKGRybV9pODEwX21jX3QgX191c2VyICopYXJnLCBzaXplb2YobWMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWlmIChtYy5pZHggPj0gZG1hLT5idWZfY291bnQgfHwgbWMuaWR4IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpODEwX2RtYV9kaXNwYXRjaF9tYyhkZXYsIGRtYS0+YnVmbGlzdFttYy5pZHhdLCBtYy51c2VkLAorCQltYy5sYXN0X3JlbmRlciApOworCisJYXRvbWljX2FkZChtYy51c2VkLCAmZGV2LT5jb3VudHNbX0RSTV9TVEFUX1NFQ09OREFSWV0pOworCWF0b21pY19pbmMoJmRldi0+Y291bnRzW19EUk1fU1RBVF9ETUFdKTsKKwlzYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlci0xOworCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KSBod19zdGF0dXNbNV07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODEwX3JzdGF0dXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldHVybiAoaW50KSgoKHUzMiAqKShkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpKVs0XSk7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9vdjBfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWRybV9pODEwX292ZXJsYXlfdCBkYXRhOworCisJZGF0YS5vZmZzZXQgPSBkZXZfcHJpdi0+b3ZlcmxheV9vZmZzZXQ7CisJZGF0YS5waHlzaWNhbCA9IGRldl9wcml2LT5vdmVybGF5X3BoeXNpY2FsOworCWlmIChjb3B5X3RvX3VzZXIoKGRybV9pODEwX292ZXJsYXlfdCBfX3VzZXIgKilhcmcsJmRhdGEsc2l6ZW9mKGRhdGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9mc3RhdHVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCXJldHVybiBJODEwX1JFQUQoMHgzMDAwOCk7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9vdjBfZmxpcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwkvL1RlbGwgdGhlIG92ZXJsYXkgdG8gdXBkYXRlCisJSTgxMF9XUklURSgweDMwMDAwLGRldl9wcml2LT5vdmVybGF5X3BoeXNpY2FsIHwgMHg4MDAwMDAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgorICovIAorc3RhdGljIHZvaWQgaTgxMF9kb19pbml0X3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyA9IDE7CisJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDA7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9kb19jbGVhbnVwX3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlICE9IDApCisJCWk4MTBfZG1hX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MTBfZmxpcF9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWlmICghZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIAorCQlpODEwX2RvX2luaXRfcGFnZWZsaXAoIGRldiApOworCisJaTgxMF9kbWFfZGlzcGF0Y2hfZmxpcCggZGV2ICk7CisgICAJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaTgxMF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCit7CisJaTgxMF9kbWFfY2xlYW51cCggZGV2ICk7Cit9CisKK3ZvaWQgaTgxMF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKQoreworCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CisJCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQlpZiAoZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIHsKKwkJCWk4MTBfZG9fY2xlYW51cF9wYWdlZmxpcChkZXYpOworCQl9CisJfQorfQorCit2b2lkIGk4MTBfZHJpdmVyX3JlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWk4MTBfcmVjbGFpbV9idWZmZXJzKGRldiwgZmlscCk7Cit9CisKK2ludCBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWk4MTBfZG1hX3F1aWVzY2VudCggZGV2ICk7CisJcmV0dXJuIDA7Cit9CisKK2RybV9pb2N0bF9kZXNjX3QgaTgxMF9pb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0lOSVQpXSAgICA9IHsgaTgxMF9kbWFfaW5pdCwgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfVkVSVEVYKV0gID0geyBpODEwX2RtYV92ZXJ0ZXgsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9DTEVBUildICAgPSB7IGk4MTBfY2xlYXJfYnVmcywgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0ZMVVNIKV0gICA9IHsgaTgxMF9mbHVzaF9pb2N0bCwgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfR0VUQUdFKV0gID0geyBpODEwX2dldGFnZSwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9HRVRCVUYpXSAgPSB7IGk4MTBfZ2V0YnVmLCAgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX1NXQVApXSAgICA9IHsgaTgxMF9zd2FwX2J1ZnMsICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfQ09QWSldICAgID0geyBpODEwX2NvcHlidWYsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9ET0NPUFkpXSAgPSB7IGk4MTBfZG9jb3B5LCAgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX09WMElORk8pXSA9IHsgaTgxMF9vdjBfaW5mbywgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfRlNUQVRVUyldID0geyBpODEwX2ZzdGF0dXMsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9PVjBGTElQKV0gPSB7IGk4MTBfb3YwX2ZsaXAsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX01DKV0gICAgICA9IHsgaTgxMF9kbWFfbWMsICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfUlNUQVRVUyldID0geyBpODEwX3JzdGF0dXMsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9GTElQKV0gICAgPSB7IGk4MTBfZmxpcF9idWZzLCAgIDEsIDAgfQorfTsKKworaW50IGk4MTBfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTgxMF9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYWM0MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJtLmgKQEAgLTAsMCArMSwyODkgQEAKKyNpZm5kZWYgX0k4MTBfRFJNX0hfCisjZGVmaW5lIF9JODEwX0RSTV9IXworCisvKiBXQVJOSU5HOiBUaGVzZSBkZWZpbmVzIG11c3QgYmUgdGhlIHNhbWUgYXMgd2hhdCB0aGUgWHNlcnZlciB1c2VzLgorICogaWYgeW91IGNoYW5nZSB0aGVtLCB5b3UgbXVzdCBjaGFuZ2UgdGhlIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIuCisgKi8KKworI2lmbmRlZiBfSTgxMF9ERUZJTkVTXworI2RlZmluZSBfSTgxMF9ERUZJTkVTXworCisjZGVmaW5lIEk4MTBfRE1BX0JVRl9PUkRFUgkJMTIKKyNkZWZpbmUgSTgxMF9ETUFfQlVGX1NaIAkJKDE8PEk4MTBfRE1BX0JVRl9PUkRFUikKKyNkZWZpbmUgSTgxMF9ETUFfQlVGX05SIAkJMjU2CisjZGVmaW5lIEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTIAk4CisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtLgorICovCisjZGVmaW5lIEk4MTBfTlJfVEVYX1JFR0lPTlMgNjQKKyNkZWZpbmUgSTgxMF9MT0dfTUlOX1RFWF9SRUdJT05fU0laRSAxNgorI2VuZGlmCisKKyNkZWZpbmUgSTgxMF9VUExPQURfVEVYMElNQUdFICAweDEgLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIEk4MTBfVVBMT0FEX1RFWDFJTUFHRSAgMHgyIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODEwX1VQTE9BRF9DVFggICAgICAgIDB4NAorI2RlZmluZSBJODEwX1VQTE9BRF9CVUZGRVJTICAgIDB4OAorI2RlZmluZSBJODEwX1VQTE9BRF9URVgwICAgICAgIDB4MTAKKyNkZWZpbmUgSTgxMF9VUExPQURfVEVYMSAgICAgICAweDIwCisjZGVmaW5lIEk4MTBfVVBMT0FEX0NMSVBSRUNUUyAgMHg0MAorCisKKy8qIEluZGljZXMgaW50byBidWYuU2V0dXAgd2hlcmUgdmFyaW91cyBiaXRzIG9mIHN0YXRlIGFyZSBtaXJyb3JlZCBwZXIKKyAqIGNvbnRleHQgYW5kIHBlciBidWZmZXIuICBUaGVzZSBjYW4gYmUgZmlyZWQgYXQgdGhlIGNhcmQgYXMgYSB1bml0LAorICogb3IgaW4gYSBwaWVjZXdpc2UgZmFzaGlvbiBhcyByZXF1aXJlZC4KKyAqLworCisvKiBEZXN0YnVmZmVyIHN0YXRlIAorICogICAgLSBiYWNrYnVmZmVyIGxpbmVhciBvZmZzZXQgYW5kIHBpdGNoIC0tIGludmFyaWVudCBpbiB0aGUgY3VycmVudCBkcmkKKyAqICAgIC0gemJ1ZmZlciBsaW5lYXIgb2Zmc2V0IGFuZCBwaXRjaCAtLSBhbHNvIGludmFyaWVudAorICogICAgLSBkcmF3aW5nIG9yaWdpbiBpbiBiYWNrIGFuZCBkZXB0aCBidWZmZXJzLgorICoKKyAqIEtlZXAgdGhlIGRlcHRoL2JhY2sgYnVmZmVyIHN0YXRlIGhlcmUgdG8gYWNjb21tb2RhdGUgcHJpdmF0ZSBidWZmZXJzCisgKiBpbiB0aGUgZnV0dXJlLgorICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19ESTAgIDAJLyogQ01EX09QX0RFU1RCVUZGRVJfSU5GTyAoMiBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19ESTEgIDEKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RWMCAgMgkvKiBHRlhfT1BfREVTVEJVRkZFUl9WQVJTICgyIGR3b3JkcykgKi8KKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RWMSAgMworI2RlZmluZSBJODEwX0RFU1RSRUdfRFIwICA0CS8qIEdGWF9PUF9EUkFXUkVDVF9JTkZPICg0IGR3b3JkcykgKi8KKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSMSAgNQorI2RlZmluZSBJODEwX0RFU1RSRUdfRFIyICA2CisjZGVmaW5lIEk4MTBfREVTVFJFR19EUjMgIDcKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSNCAgOAorI2RlZmluZSBJODEwX0RFU1RfU0VUVVBfU0laRSAxMAorCisvKiBDb250ZXh0IHN0YXRlCisgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQ0YwICAgMAkvKiBHRlhfT1BfQ09MT1JfRkFDVE9SICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0NGMSAgIDEJCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1NUMCAgIDIgICAgIC8qIEdGWF9PUF9TVElQUExFICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1NUMSAgIDMKKyNkZWZpbmUgSTgxMF9DVFhSRUdfVkYgICAgNAkvKiBHRlhfT1BfVkVSVEVYX0ZNVCAqLworI2RlZmluZSBJODEwX0NUWFJFR19NVCAgICA1CS8qIEdGWF9PUF9NQVBfVEVYRUxTICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX01DMCAgIDYJLyogR0ZYX09QX01BUF9DT0xPUl9TVEFHRVMgLSBzdGFnZSAwICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX01DMSAgIDcgICAgIC8qIEdGWF9PUF9NQVBfQ09MT1JfU1RBR0VTIC0gc3RhZ2UgMSAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQzIgICA4CS8qIEdGWF9PUF9NQVBfQ09MT1JfU1RBR0VTIC0gc3RhZ2UgMiAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQTAgICA5CS8qIEdGWF9PUF9NQVBfQUxQSEFfU1RBR0VTIC0gc3RhZ2UgMCAqLworI2RlZmluZSBJODEwX0NUWFJFR19NQTEgICAxMAkvKiBHRlhfT1BfTUFQX0FMUEhBX1NUQUdFUyAtIHN0YWdlIDEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUEyICAgMTEJLyogR0ZYX09QX01BUF9BTFBIQV9TVEFHRVMgLSBzdGFnZSAyICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1NETSAgIDEyCS8qIEdGWF9PUF9TUkNfREVTVF9NT05PICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0ZPRyAgIDEzCS8qIEdGWF9PUF9GT0dfQ09MT1IgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQjEgICAgMTQJLyogR0ZYX09QX0JPT0xfMSAqLworI2RlZmluZSBJODEwX0NUWFJFR19CMiAgICAxNQkvKiBHRlhfT1BfQk9PTF8yICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0xDUyAgIDE2CS8qIEdGWF9PUF9MSU5FV0lEVEhfQ1VMTF9TSEFERV9NT0RFICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1BWICAgIDE3CS8qIEdGWF9PUF9QVl9SVUxFIC0tIEludmFyaWVudCEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfWkEgICAgMTgJLyogR0ZYX09QX1pCSUFTX0FMUEhBRlVOQyAqLworI2RlZmluZSBJODEwX0NUWFJFR19BQSAgICAxOQkvKiBHRlhfT1BfQU5USUFMSUFTICovCisjZGVmaW5lIEk4MTBfQ1RYX1NFVFVQX1NJWkUgMjAgCisKKy8qIFRleHR1cmUgc3RhdGUgKHBlciB0ZXggdW5pdCkKKyAqLworI2RlZmluZSBJODEwX1RFWFJFR19NSTAgIDAJLyogR0ZYX09QX01BUF9JTkZPICg0IGR3b3JkcykgKi8KKyNkZWZpbmUgSTgxMF9URVhSRUdfTUkxICAxCQorI2RlZmluZSBJODEwX1RFWFJFR19NSTIgIDIJCisjZGVmaW5lIEk4MTBfVEVYUkVHX01JMyAgMwkKKyNkZWZpbmUgSTgxMF9URVhSRUdfTUYgICA0CS8qIEdGWF9PUF9NQVBfRklMVEVSICovCisjZGVmaW5lIEk4MTBfVEVYUkVHX01MQyAgNQkvKiBHRlhfT1BfTUFQX0xPRF9DVEwgKi8KKyNkZWZpbmUgSTgxMF9URVhSRUdfTUxMICA2CS8qIEdGWF9PUF9NQVBfTE9EX0xJTUlUUyAqLworI2RlZmluZSBJODEwX1RFWFJFR19NQ1MgIDcJLyogR0ZYX09QX01BUF9DT09SRF9TRVRTID8/PyAqLworI2RlZmluZSBJODEwX1RFWF9TRVRVUF9TSVpFIDgKKworLyogRmxhZ3MgZm9yIGNsZWFyIGlvY3RsCisgKi8KKyNkZWZpbmUgSTgxMF9GUk9OVCAgIDB4MQorI2RlZmluZSBJODEwX0JBQ0sgICAgMHgyCisjZGVmaW5lIEk4MTBfREVQVEggICAweDQKKwordHlwZWRlZiBlbnVtIF9kcm1faTgxMF9pbml0X2Z1bmMgeworCUk4MTBfSU5JVF9ETUEgPSAweDAxLAorCUk4MTBfQ0xFQU5VUF9ETUEgPSAweDAyLAorCUk4MTBfSU5JVF9ETUFfMV80ID0gMHgwMworIH0gZHJtX2k4MTBfaW5pdF9mdW5jX3Q7CisKKy8qIFRoaXMgaXMgdGhlIGluaXQgc3RydWN0dXJlIGFmdGVyIHYxLjIgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9pbml0IHsKKwlkcm1faTgxMF9pbml0X2Z1bmNfdCBmdW5jOworI2lmIENPTkZJR19YRlJFRTg2X1ZFUlNJT04gPCBYRlJFRTg2X1ZFUlNJT04oNCwxLDAsMCkKKwlpbnQgcmluZ19tYXBfaWR4OworCWludCBidWZmZXJfbWFwX2lkeDsKKyNlbHNlCisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGludCBidWZmZXJzX29mZnNldDsKKyNlbmRpZgorCWludCBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zdGFydDsKKwl1bnNpZ25lZCBpbnQgcmluZ19lbmQ7CisJdW5zaWduZWQgaW50IHJpbmdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCBvdmVybGF5X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgb3ZlcmxheV9waHlzaWNhbDsKKwl1bnNpZ25lZCBpbnQgdzsKKwl1bnNpZ25lZCBpbnQgaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJdW5zaWduZWQgaW50IHBpdGNoX2JpdHM7IAorfSBkcm1faTgxMF9pbml0X3Q7CisKKy8qIFRoaXMgaXMgdGhlIGluaXQgc3RydWN0dXJlIHByaW9yIHRvIHYxLjIgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9wcmUxMl9pbml0IHsKKwlkcm1faTgxMF9pbml0X2Z1bmNfdCBmdW5jOworCXVuc2lnbmVkIGludCBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyc19vZmZzZXQ7CisJaW50IHNhcmVhX3ByaXZfb2Zmc2V0OworCXVuc2lnbmVkIGludCByaW5nX3N0YXJ0OworCXVuc2lnbmVkIGludCByaW5nX2VuZDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zaXplOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0OworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHc7CisJdW5zaWduZWQgaW50IGg7CisJdW5zaWduZWQgaW50IHBpdGNoOworCXVuc2lnbmVkIGludCBwaXRjaF9iaXRzOyAKK30gZHJtX2k4MTBfcHJlMTJfaW5pdF90OworCisvKiBXYXJuaW5nOiBJZiB5b3UgY2hhbmdlIHRoZSBTQVJFQSBzdHJ1Y3R1cmUgeW91IG11c3QgY2hhbmdlIHRoZSBYc2VydmVyCisgKiBzdHJ1Y3R1cmUgYXMgd2VsbCAqLworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfdGV4X3JlZ2lvbiB7CisJdW5zaWduZWQgY2hhciBuZXh0LCBwcmV2OyAvKiBpbmRpY2VzIHRvIGZvcm0gYSBjaXJjdWxhciBMUlUgICovCisJdW5zaWduZWQgY2hhciBpbl91c2U7CS8qIG93bmVkIGJ5IGEgY2xpZW50LCBvciBmcmVlPyAqLworCWludCBhZ2U7CQkvKiB0cmFja2VkIGJ5IGNsaWVudHMgdG8gdXBkYXRlIGxvY2FsIExSVSdzICovCit9IGRybV9pODEwX3RleF9yZWdpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX3NhcmVhIHsKKyAgIAl1bnNpZ25lZCBpbnQgQ29udGV4dFN0YXRlW0k4MTBfQ1RYX1NFVFVQX1NJWkVdOworICAgCXVuc2lnbmVkIGludCBCdWZmZXJTdGF0ZVtJODEwX0RFU1RfU0VUVVBfU0laRV07CisgICAJdW5zaWduZWQgaW50IFRleFN0YXRlWzJdW0k4MTBfVEVYX1NFVFVQX1NJWkVdOworICAgCXVuc2lnbmVkIGludCBkaXJ0eTsKKworCXVuc2lnbmVkIGludCBuYm94OworCWRybV9jbGlwX3JlY3RfdCBib3hlc1tJODEwX05SX1NBUkVBX0NMSVBSRUNUU107CisKKwkvKiBNYWludGFpbiBhbiBMUlUgb2YgY29udGlndW91cyByZWdpb25zIG9mIHRleHR1cmUgc3BhY2UuICBJZgorCSAqIHlvdSB0aGluayB5b3Ugb3duIGEgcmVnaW9uIG9mIHRleHR1cmUgbWVtb3J5LCBhbmQgaXQgaGFzIGFuCisJICogYWdlIGRpZmZlcmVudCB0byB0aGUgb25lIHlvdSBzZXQsIHRoZW4geW91IGFyZSBtaXN0YWtlbiBhbmQKKwkgKiBpdCBoYXMgYmVlbiBzdG9sZW4gYnkgYW5vdGhlciBjbGllbnQuICBJZiBnbG9iYWwgdGV4QWdlCisJICogaGFzbid0IGNoYW5nZWQsIHRoZXJlIGlzIG5vIG5lZWQgdG8gd2FsayB0aGUgbGlzdC4KKwkgKgorCSAqIFRoZXNlIHJlZ2lvbnMgY2FuIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgdGhlIGZpbmUtZ3JhaW5lZAorCSAqIHRleHR1cmUgaW5mb3JtYXRpb24gb2Ygb3RoZXIgY2xpZW50cyAtIGJ5IG1haW50YWluaW5nIHRoZW0KKwkgKiBpbiB0aGUgc2FtZSBscnUgd2hpY2ggaXMgdXNlZCB0byBhZ2UgdGhlaXIgb3duIHRleHR1cmVzLAorCSAqIGNsaWVudHMgaGF2ZSBhbiBhcHByb3hpbWF0ZSBscnUgZm9yIHRoZSB3aG9sZSBvZiBnbG9iYWwKKwkgKiB0ZXh0dXJlIHNwYWNlLCBhbmQgY2FuIG1ha2UgaW5mb3JtZWQgZGVjaXNpb25zIGFzIHRvIHdoaWNoCisJICogYXJlYXMgdG8ga2ljayBvdXQuICBUaGVyZSBpcyBubyBuZWVkIHRvIGNob29zZSB3aGV0aGVyIHRvCisJICoga2ljayBvdXQgeW91ciBvd24gdGV4dHVyZSBvciBzb21lb25lIGVsc2UncyAtIHNpbXBseSBlamVjdAorCSAqIHRoZW0gYWxsIGluIExSVSBvcmRlci4gIAorCSAqLworICAgCisJZHJtX2k4MTBfdGV4X3JlZ2lvbl90IHRleExpc3RbSTgxMF9OUl9URVhfUkVHSU9OUysxXTsgCisJCQkJLyogTGFzdCBlbHQgaXMgc2VudGluYWwgKi8KKyAgICAgICAgaW50IHRleEFnZTsJCS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLworICAgICAgICBpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCWludCBsYXN0X3F1aWVzY2VudDsgICAgIC8qICAqLworCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KKworCWludCB2ZXJ0ZXhfcHJpbTsKKworCWludCBwZl9lbmFibGVkOyAgICAgICAgICAgICAgIC8qIGlzIHBhZ2VmbGlwcGluZyBhbGxvd2VkPyAqLworCWludCBwZl9hY3RpdmU7CisJaW50IHBmX2N1cnJlbnRfcGFnZTsJICAgIC8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCit9IGRybV9pODEwX3NhcmVhX3Q7CisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1NZ2EuaCkKKyAqLworCisvKiBpODEwIHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX0k4MTBfSU5JVAkJMHgwMAorI2RlZmluZSBEUk1fSTgxMF9WRVJURVgJCTB4MDEKKyNkZWZpbmUgRFJNX0k4MTBfQ0xFQVIJCTB4MDIKKyNkZWZpbmUgRFJNX0k4MTBfRkxVU0gJCTB4MDMKKyNkZWZpbmUgRFJNX0k4MTBfR0VUQUdFCQkweDA0CisjZGVmaW5lIERSTV9JODEwX0dFVEJVRgkJMHgwNQorI2RlZmluZSBEUk1fSTgxMF9TV0FQCQkweDA2CisjZGVmaW5lIERSTV9JODEwX0NPUFkJCTB4MDcKKyNkZWZpbmUgRFJNX0k4MTBfRE9DT1BZCQkweDA4CisjZGVmaW5lIERSTV9JODEwX09WMElORk8JMHgwOQorI2RlZmluZSBEUk1fSTgxMF9GU1RBVFVTCTB4MGEKKyNkZWZpbmUgRFJNX0k4MTBfT1YwRkxJUAkweDBiCisjZGVmaW5lIERSTV9JODEwX01DCQkweDBjCisjZGVmaW5lIERSTV9JODEwX1JTVEFUVVMJMHgwZAorI2RlZmluZSBEUk1fSTgxMF9GTElQCQkweDBlCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0lOSVQsIGRybV9pODEwX2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfVkVSVEVYCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfVkVSVEVYLCBkcm1faTgxMF92ZXJ0ZXhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfQ0xFQVIJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9DTEVBUiwgZHJtX2k4MTBfY2xlYXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRkxVU0gJCURSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9GTFVTSCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfR0VUQUdFCQlEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfR0VUQUdFKQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9HRVRCVUYJCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9HRVRCVUYsIGRybV9pODEwX2RtYV90KQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9TV0FQCQlEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfU1dBUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfQ09QWQkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0NPUFksIGRybV9pODEwX2NvcHlfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRE9DT1BZCQlEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRE9DT1BZKQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9PVjBJTkZPCQlEUk1fSU9SKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfT1YwSU5GTywgZHJtX2k4MTBfb3ZlcmxheV90KQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9GU1RBVFVTCQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRlNUQVRVUykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfT1YwRkxJUAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX09WMEZMSVApCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX01DCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfTUMsIGRybV9pODEwX21jX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX1JTVEFUVVMJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9SU1RBVFVTKQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9GTElQICAgICAgICAgICAgIERSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9GTElQKQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfY2xlYXIgeworCWludCBjbGVhcl9jb2xvcjsKKwlpbnQgY2xlYXJfZGVwdGg7CisJaW50IGZsYWdzOworfSBkcm1faTgxMF9jbGVhcl90OworCisvKiBUaGVzZSBtYXkgYmUgcGxhY2Vob2xkZXJzIGlmIHdlIGhhdmUgbW9yZSBjbGlwcmVjdHMgdGhhbgorICogSTgxMF9OUl9TQVJFQV9DTElQUkVDVFMuICBJbiB0aGF0IGNhc2UsIHRoZSBjbGllbnQgc2V0cyBkaXNjYXJkIHRvCisgKiBmYWxzZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgd2lsbCBiZSBkaXNwYXRjaGVkIGFnYWluIHdpdGggYQorICogbmV3IHNldCBvZiBjbGlwcmVjdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF92ZXJ0ZXggeworICAgCWludCBpZHg7CQkvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCWludCBkaXNjYXJkOwkJLyogY2xpZW50IGlzIGZpbmlzaGVkIHdpdGggdGhlIGJ1ZmZlcj8gKi8KK30gZHJtX2k4MTBfdmVydGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9jb3B5X3QgeworICAgCWludCBpZHg7CQkvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCXZvaWQgKmFkZHJlc3M7CQkvKiBBZGRyZXNzIHRvIGNvcHkgZnJvbSAqLworfSBkcm1faTgxMF9jb3B5X3Q7CisKKyNkZWZpbmUgUFJfVFJJQU5HTEVTICAgICAgICAgKDB4MDw8MTgpCisjZGVmaW5lIFBSX1RSSVNUUklQXzAgICAgICAgICgweDE8PDE4KQorI2RlZmluZSBQUl9UUklTVFJJUF8xICAgICAgICAoMHgyPDwxOCkKKyNkZWZpbmUgUFJfVFJJRkFOICAgICAgICAgICAgKDB4Mzw8MTgpCisjZGVmaW5lIFBSX1BPTFlHT04gICAgICAgICAgICgweDQ8PDE4KQorI2RlZmluZSBQUl9MSU5FUyAgICAgICAgICAgICAoMHg1PDwxOCkKKyNkZWZpbmUgUFJfTElORVNUUklQICAgICAgICAgKDB4Njw8MTgpCisjZGVmaW5lIFBSX1JFQ1RTICAgICAgICAgICAgICgweDc8PDE4KQorI2RlZmluZSBQUl9NQVNLICAgICAgICAgICAgICAoMHg3PDwxOCkKKworCit0eXBlZGVmIHN0cnVjdCBkcm1faTgxMF9kbWEgeworCXZvaWQgKnZpcnR1YWw7CisJaW50IHJlcXVlc3RfaWR4OworCWludCByZXF1ZXN0X3NpemU7CisJaW50IGdyYW50ZWQ7Cit9IGRybV9pODEwX2RtYV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfb3ZlcmxheV90IHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OyAgICAvKiBBZGRyZXNzIG9mIHRoZSBPdmVybGF5IFJlZ3MgKi8KKwl1bnNpZ25lZCBpbnQgcGh5c2ljYWw7Cit9IGRybV9pODEwX292ZXJsYXlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX21jIHsKKwlpbnQgaWR4OyAgICAgICAgICAgICAgICAvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsgICAgICAgICAgICAgICAvKiBuciBieXRlcyBpbiB1c2UgKi8KKwlpbnQgbnVtX2Jsb2NrczsgICAgICAgICAvKiBudW1iZXIgb2YgR0ZYQmxvY2tzICovCisJaW50ICpsZW5ndGg7ICAgICAgICAgICAgLyogTGlzdCBvZiBsZW5ndGhzIGZvciBHRlhCbG9ja3MgKEZVVFVSRSkqLworCXVuc2lnbmVkIGludCBsYXN0X3JlbmRlcjsgLyogTGFzdCBSZW5kZXIgUmVxdWVzdCAqLworfSBkcm1faTgxMF9tY190OworCisKKyNlbmRpZiAvKiBfSTgxMF9EUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjUxYjMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5jCkBAIC0wLDAgKzEsMTI2IEBACisvKiBpODEwX2Rydi5jIC0tIEk4MTAgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1NjoyMiAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTgxMF9kcm0uaCIKKyNpbmNsdWRlICJpODEwX2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitzdGF0aWMgaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKK3sKKwkvKiBpODEwIGhhcyA0IG1vcmUgY291bnRlcnMgKi8KKwlkZXYtPmNvdW50ZXJzICs9IDQ7CisJZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7CisJZGV2LT50eXBlc1s3XSA9IF9EUk1fU1RBVF9QUklNQVJZOworCWRldi0+dHlwZXNbOF0gPSBfRFJNX1NUQVRfU0VDT05EQVJZOworCWRldi0+dHlwZXNbOV0gPSBfRFJNX1NUQVRfRE1BOworCQorCURSTV9JTkZPKCAiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAorCQlEUklWRVJfTkFNRSwKKwkJRFJJVkVSX01BSk9SLAorCQlEUklWRVJfTUlOT1IsCisJCURSSVZFUl9QQVRDSExFVkVMLAorCQlEUklWRVJfREFURSwKKwkJZGV2LT5wcmltYXJ5Lm1pbm9yLAorCQlwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQorCQkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcnNpb24oIGRybV92ZXJzaW9uX3QgKnZlcnNpb24gKQoreworCWludCBsZW47CisKKwl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOworCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7CisJRFJNX0NPUFkoIHZlcnNpb24tPm5hbWUsIERSSVZFUl9OQU1FICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKKwlpODEwX1BDSV9JRFMKK307CisKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IGk4MTBfaW9jdGxzW107CitleHRlcm4gaW50IGk4MTBfbWF4X2lvY3RsOworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9ETUFfUVVFVUUsCisJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX2k4MTBfYnVmX3ByaXZfdCksCisJLnByZXRha2Vkb3duID0gaTgxMF9kcml2ZXJfcHJldGFrZWRvd24sCisJLnByZXJlbGVhc2UgPSBpODEwX2RyaXZlcl9wcmVyZWxlYXNlLAorCS5yZWxlYXNlID0gaTgxMF9kcml2ZXJfcmVsZWFzZSwKKwkuZG1hX3F1aWVzY2VudCA9IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQsCisJLnJlY2xhaW1fYnVmZmVycyA9IGk4MTBfcmVjbGFpbV9idWZmZXJzLAorCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAorCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAorCS52ZXJzaW9uID0gdmVyc2lvbiwKKwkuaW9jdGxzID0gaTgxMF9pb2N0bHMsCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSAgICAgID0gcGNpaWRsaXN0LAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpODEwX2luaXQodm9pZCkKK3sKKwlkcml2ZXIubnVtX2lvY3RscyA9IGk4MTBfbWF4X2lvY3RsOworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGk4MTBfZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpODEwX2luaXQpOworbW9kdWxlX2V4aXQoaTgxMF9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTIzY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCkBAIC0wLDAgKzEsMjM2IEBACisvKiBpODEwX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciB0aGUgTWF0cm94IGcyMDAvZzQwMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAJICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfSTgxMF9EUlZfSF8KKyNkZWZpbmUgX0k4MTBfRFJWX0hfCisKKy8qIEdlbmVyYWwgY3VzdG9taXphdGlvbjoKKyAqLworCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJWQSBMaW51eCBTeXN0ZW1zIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJpODEwIgorI2RlZmluZSBEUklWRVJfREVTQwkJIkludGVsIGk4MTAiCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwMzA2MDUiCisKKy8qIEludGVyZmFjZSBoaXN0b3J5CisgKgorICogMS4xICAgLSBYRnJlZTg2IDQuMQorICogMS4yICAgLSBYdk1DIGludGVyZmFjZXMKKyAqICAgICAgIC0gWEZyZWU4NiA0LjIKKyAqIDEuMi4xIC0gRGlzYWJsZSBjb3B5aW5nIGNvZGUgKGxlYXZlIHN0dWIgaW9jdGxzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkKKyAqICAgICAgIC0gUmVtb3ZlIHJlcXVpcmVtZW50IGZvciBpbnRlcnJ1cHQgKGxlYXZlIHN0dWJzIGFnYWluKQorICogMS4zICAgLSBBZGQgcGFnZSBmbGlwcGluZy4KKyAqIDEuNCAgIC0gZml4IERSTSBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQk0CisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MTBfYnVmX3ByaXYgeworICAgCXUzMiAqaW5fdXNlOworICAgCWludCBteV91c2VfaWR4OworCWludCBjdXJyZW50bHlfbWFwcGVkOworCXZvaWQgKnZpcnR1YWw7CisJdm9pZCAqa2VybmVsX3ZpcnR1YWw7Cit9IGRybV9pODEwX2J1Zl9wcml2X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9yaW5nX2J1ZmZlcnsKKwlpbnQgdGFpbF9tYXNrOworCXVuc2lnbmVkIGxvbmcgU3RhcnQ7CisJdW5zaWduZWQgbG9uZyBFbmQ7CisJdW5zaWduZWQgbG9uZyBTaXplOworCXU4ICp2aXJ0dWFsX3N0YXJ0OworCWludCBoZWFkOworCWludCB0YWlsOworCWludCBzcGFjZTsKK30gZHJtX2k4MTBfcmluZ19idWZmZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MTBfcHJpdmF0ZSB7CisJZHJtX21hcF90ICpzYXJlYV9tYXA7CisJZHJtX21hcF90ICptbWlvX21hcDsKKworCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXY7CisgICAJZHJtX2k4MTBfcmluZ19idWZmZXJfdCByaW5nOworCisgICAgICAJdm9pZCAqaHdfc3RhdHVzX3BhZ2U7CisgICAJdW5zaWduZWQgbG9uZyBjb3VudGVyOworCisJZG1hX2FkZHJfdCBkbWFfc3RhdHVzX3BhZ2U7CisKKwlkcm1fYnVmX3QgKm1tYXBfYnVmZmVyOworCisKKwl1MzIgZnJvbnRfZGkxLCBiYWNrX2RpMSwgemkxOworCisJaW50IGJhY2tfb2Zmc2V0OworCWludCBkZXB0aF9vZmZzZXQ7CisJaW50IG92ZXJsYXlfb2Zmc2V0OworCWludCBvdmVybGF5X3BoeXNpY2FsOworCWludCB3LCBoOworCWludCBwaXRjaDsKKyAgCWludCBiYWNrX3BpdGNoOworCWludCBkZXB0aF9waXRjaDsKKworCWludCBkb19ib3hlczsKKwlpbnQgZG1hX3VzZWQ7CisKKwlpbnQgY3VycmVudF9wYWdlOworCWludCBwYWdlX2ZsaXBwaW5nOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgaXJxX3F1ZXVlOworICAgCWF0b21pY190IGlycV9yZWNlaXZlZDsKKyAgIAlhdG9taWNfdCBpcnFfZW1pdHRlZDsKKyAgCisgICAgICAgIGludCBmcm9udF9vZmZzZXQ7Cit9IGRybV9pODEwX3ByaXZhdGVfdDsKKworCQkJCS8qIGk4MTBfZG1hLmMgKi8KK2V4dGVybiB2b2lkIGk4MTBfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50IGk4MTBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKK2V4dGVybiBpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApOworCisjZGVmaW5lIEk4MTBfQkFTRShyZWcpCQkoKHVuc2lnbmVkIGxvbmcpIFwKKwkJCQlkZXZfcHJpdi0+bW1pb19tYXAtPmhhbmRsZSkKKyNkZWZpbmUgSTgxMF9BRERSKHJlZykJCShJODEwX0JBU0UocmVnKSArIHJlZykKKyNkZWZpbmUgSTgxMF9ERVJFRihyZWcpCQkqKF9fdm9sYXRpbGVfXyBpbnQgKilJODEwX0FERFIocmVnKQorI2RlZmluZSBJODEwX1JFQUQocmVnKQkJSTgxMF9ERVJFRihyZWcpCisjZGVmaW5lIEk4MTBfV1JJVEUocmVnLHZhbCkgCWRvIHsgSTgxMF9ERVJFRihyZWcpID0gdmFsOyB9IHdoaWxlICgwKQorI2RlZmluZSBJODEwX0RFUkVGMTYocmVnKQkqKF9fdm9sYXRpbGVfXyB1MTYgKilJODEwX0FERFIocmVnKQorI2RlZmluZSBJODEwX1JFQUQxNihyZWcpCUk4MTBfREVSRUYxNihyZWcpCisjZGVmaW5lIEk4MTBfV1JJVEUxNihyZWcsdmFsKQlkbyB7IEk4MTBfREVSRUYxNihyZWcpID0gdmFsOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIEk4MTBfVkVSQk9TRSAwCisjZGVmaW5lIFJJTkdfTE9DQUxTCXVuc2lnbmVkIGludCBvdXRyaW5nLCByaW5nbWFzazsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgY2hhciAqdmlydDsKKworI2RlZmluZSBCRUdJTl9MUF9SSU5HKG4pIGRvIHsJCQkJCQlcCisJaWYgKEk4MTBfVkVSQk9TRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgRFJNX0RFQlVHKCJCRUdJTl9MUF9SSU5HKCVkKSBpbiAlc1xuIiwgbiwgX19GVU5DVElPTl9fKTsJXAorCWlmIChkZXZfcHJpdi0+cmluZy5zcGFjZSA8IG4qNCkJCQkJCVwKKwkJaTgxMF93YWl0X3JpbmcoZGV2LCBuKjQpOwkJCQlcCisJZGV2X3ByaXYtPnJpbmcuc3BhY2UgLT0gbio0OwkJCQkJXAorCW91dHJpbmcgPSBkZXZfcHJpdi0+cmluZy50YWlsOwkJCQkJXAorCXJpbmdtYXNrID0gZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrOwkJCQlcCisJdmlydCA9IGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQ7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQURWQU5DRV9MUF9SSU5HKCkgZG8gewkJCQkgICAgICAgIFwKKwlpZiAoSTgxMF9WRVJCT1NFKSBEUk1fREVCVUcoIkFEVkFOQ0VfTFBfUklOR1xuIik7ICAgIAlcCisJZGV2X3ByaXYtPnJpbmcudGFpbCA9IG91dHJpbmc7CQkgICAgICAgIAlcCisJSTgxMF9XUklURShMUF9SSU5HICsgUklOR19UQUlMLCBvdXRyaW5nKTsJICAgICAgICBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgT1VUX1JJTkcobikgZG8geyAgCQkJCSAgICAgICAgICAgICAgICBcCisJaWYgKEk4MTBfVkVSQk9TRSkgRFJNX0RFQlVHKCIgICBPVVRfUklORyAleFxuIiwgKGludCkobikpOwlcCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikodmlydCArIG91dHJpbmcpID0gbjsJICAgICAgICAgICAgICAgIFwKKwlvdXRyaW5nICs9IDQ7CQkJCQkgICAgICAgICAgICAgICAgXAorCW91dHJpbmcgJj0gcmluZ21hc2s7CQkJICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgCQkoKDA8PDI5KXwoMjw8MjMpKQorI2RlZmluZSBHRlhfT1BfQlJFQUtQT0lOVF9JTlRFUlJVUFQJKCgwPDwyOSl8KDE8PDIzKSkKKyNkZWZpbmUgQ01EX1JFUE9SVF9IRUFECQkJKDc8PDIzKQorI2RlZmluZSBDTURfU1RPUkVfRFdPUkRfSURYCQkoKDB4MjE8PDIzKSB8IDB4MSkKKyNkZWZpbmUgQ01EX09QX0JBVENIX0JVRkZFUiAgKCgweDA8PDI5KXwoMHgzMDw8MjMpfDB4MSkKKworI2RlZmluZSBJTlNUX1BBUlNFUl9DTElFTlQgICAweDAwMDAwMDAwCisjZGVmaW5lIElOU1RfT1BfRkxVU0ggICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgSU5TVF9GTFVTSF9NQVBfQ0FDSEUgMHgwMDAwMDAwMQorCisKKyNkZWZpbmUgQkIxX1NUQVJUX0FERFJfTUFTSyAgICh+MHg3KQorI2RlZmluZSBCQjFfUFJPVEVDVEVEICAgICAgICAgKDE8PDApCisjZGVmaW5lIEJCMV9VTlBST1RFQ1RFRCAgICAgICAoMDw8MCkKKyNkZWZpbmUgQkIyX0VORF9BRERSX01BU0sgICAgICh+MHg3KQorCisjZGVmaW5lIEk4MTBSRUdfSFdTVEFNCQkweDAyMDk4CisjZGVmaW5lIEk4MTBSRUdfSU5UX0lERU5USVRZX1IJMHgwMjBhNAorI2RlZmluZSBJODEwUkVHX0lOVF9NQVNLX1IgCTB4MDIwYTgKKyNkZWZpbmUgSTgxMFJFR19JTlRfRU5BQkxFX1IJMHgwMjBhMAorCisjZGVmaW5lIExQX1JJTkcgICAgIAkJMHgyMDMwCisjZGVmaW5lIEhQX1JJTkcgICAgIAkJMHgyMDQwCisjZGVmaW5lIFJJTkdfVEFJTCAgICAgIAkJMHgwMAorI2RlZmluZSBUQUlMX0FERFIJCTB4MDAwRkZGRjgKKyNkZWZpbmUgUklOR19IRUFEICAgICAgCQkweDA0CisjZGVmaW5lIEhFQURfV1JBUF9DT1VOVCAgICAgCTB4RkZFMDAwMDAKKyNkZWZpbmUgSEVBRF9XUkFQX09ORSAgICAgICAJMHgwMDIwMDAwMAorI2RlZmluZSBIRUFEX0FERFIgICAgICAgICAgIAkweDAwMUZGRkZDCisjZGVmaW5lIFJJTkdfU1RBUlQgICAgIAkJMHgwOAorI2RlZmluZSBTVEFSVF9BRERSICAgICAgICAgIAkweDAwRkZGRkY4CisjZGVmaW5lIFJJTkdfTEVOICAgICAgIAkJMHgwQworI2RlZmluZSBSSU5HX05SX1BBR0VTICAgICAgIAkweDAwMEZGMDAwCisjZGVmaW5lIFJJTkdfUkVQT1JUX01BU0sgICAgCTB4MDAwMDAwMDYKKyNkZWZpbmUgUklOR19SRVBPUlRfNjRLICAgICAJMHgwMDAwMDAwMgorI2RlZmluZSBSSU5HX1JFUE9SVF8xMjhLICAgIAkweDAwMDAwMDA0CisjZGVmaW5lIFJJTkdfTk9fUkVQT1JUICAgICAgCTB4MDAwMDAwMDAKKyNkZWZpbmUgUklOR19WQUxJRF9NQVNLICAgICAJMHgwMDAwMDAwMQorI2RlZmluZSBSSU5HX1ZBTElEICAgICAgICAgIAkweDAwMDAwMDAxCisjZGVmaW5lIFJJTkdfSU5WQUxJRCAgICAgICAgCTB4MDAwMDAwMDAKKworI2RlZmluZSBHRlhfT1BfU0NJU1NPUiAgICAgICAgICgoMHgzPDwyOSl8KDB4MWM8PDI0KXwoMHgxMDw8MTkpKQorI2RlZmluZSBTQ19VUERBVEVfU0NJU1NPUiAgICAgICAoMHgxPDwxKQorI2RlZmluZSBTQ19FTkFCTEVfTUFTSyAgICAgICAgICAoMHgxPDwwKQorI2RlZmluZSBTQ19FTkFCTEUgICAgICAgICAgICAgICAoMHgxPDwwKQorCisjZGVmaW5lIEdGWF9PUF9TQ0lTU09SX0lORk8gICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDgxPDwxNil8KDB4MSkpCisjZGVmaW5lIFNDSV9ZTUlOX01BU0sgICAgICAoMHhmZmZmPDwxNikKKyNkZWZpbmUgU0NJX1hNSU5fTUFTSyAgICAgICgweGZmZmY8PDApCisjZGVmaW5lIFNDSV9ZTUFYX01BU0sgICAgICAoMHhmZmZmPDwxNikKKyNkZWZpbmUgU0NJX1hNQVhfTUFTSyAgICAgICgweGZmZmY8PDApCisKKyNkZWZpbmUgR0ZYX09QX0NPTE9SX0ZBQ1RPUiAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHgxPDwxNil8MHgwKQorI2RlZmluZSBHRlhfT1BfU1RJUFBMRSAgICAgICAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDgzPDwxNikpCisjZGVmaW5lIEdGWF9PUF9NQVBfSU5GTyAgICAgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8MHgyKQorI2RlZmluZSBHRlhfT1BfREVTVEJVRkZFUl9WQVJTICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDg1PDwxNil8MHgwKQorI2RlZmluZSBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDgwPDwxNil8KDB4MykpCisjZGVmaW5lIEdGWF9PUF9QUklNSVRJVkUgICAgICAgICAoKDB4Mzw8MjkpfCgweDFmPDwyNCkpCisKKyNkZWZpbmUgQ01EX09QX1pfQlVGRkVSX0lORk8gICAgICgoMHgwPDwyOSl8KDB4MTY8PDIzKSkKKyNkZWZpbmUgQ01EX09QX0RFU1RCVUZGRVJfSU5GTyAgICgoMHgwPDwyOSl8KDB4MTU8PDIzKSkKKyNkZWZpbmUgQ01EX09QX0ZST05UQlVGRkVSX0lORk8gICgoMHgwPDwyOSl8KDB4MTQ8PDIzKSkKKyNkZWZpbmUgQ01EX09QX1dBSVRfRk9SX0VWRU5UICAgICgoMHgwPDwyOSl8KDB4MDM8PDIzKSkKKworI2RlZmluZSBCUjAwX0JJVEJMVF9DTElFTlQgICAweDQwMDAwMDAwCisjZGVmaW5lIEJSMDBfT1BfQ09MT1JfQkxUICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgQlIwMF9PUF9TUkNfQ09QWV9CTFQgMHgxMEMwMDAwMAorI2RlZmluZSBCUjEzX1NPTElEX1BBVFRFUk4gICAweDgwMDAwMDAwCisKKyNkZWZpbmUgV0FJVF9GT1JfUExBTkVfQV9TQ0FOTElORVMgKDE8PDEpIAorI2RlZmluZSBXQUlUX0ZPUl9QTEFORV9BX0ZMSVAgICAgICAoMTw8MikgCisjZGVmaW5lIFdBSVRfRk9SX1ZCTEFOSyAoMTw8MykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhZGNjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYwpAQCAtMCwwICsxLDE1ODggQEAKKy8qIGk4MzBfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBJODMwIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIERlYyAxMyAwMTo1MDowMSAxOTk5IGJ5IGpoYXJ0bWFubkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKgkgICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICoJICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqCSAgICBBYnJhaGFtIHZkIE1lcndlIDxhYnJhaGFtQDJkM2QuY28uemE+CisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTgzMF9kcm0uaCIKKyNpbmNsdWRlICJpODMwX2Rydi5oIgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFzayBxdWV1ZSBzdXBwb3J0ICovCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgkvKiBGb3IgRkFTVENBTEwgb24gdW5sb2NrX3BhZ2UoKSAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBJODMwX0JVRl9GUkVFCQkyCisjZGVmaW5lIEk4MzBfQlVGX0NMSUVOVAkJMQorI2RlZmluZSBJODMwX0JVRl9IQVJEV0FSRSAgICAgIAkwCisKKyNkZWZpbmUgSTgzMF9CVUZfVU5NQVBQRUQgMAorI2RlZmluZSBJODMwX0JVRl9NQVBQRUQgICAxCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw0LDIpCisjZGVmaW5lIGRvd25fd3JpdGUgZG93bgorI2RlZmluZSB1cF93cml0ZSB1cAorI2VuZGlmCisKK3N0YXRpYyBkcm1fYnVmX3QgKmk4MzBfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludAkJIGk7CisgICAJaW50IAkJIHVzZWQ7CisgICAKKwkvKiBMaW5lYXIgc2VhcmNoIG1pZ2h0IG5vdCBiZSB0aGUgYmVzdCBzb2x1dGlvbiAqLworCisgICAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KKwkgICAJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfRlJFRSwgCisJCQkgICAgICAgSTgzMF9CVUZfQ0xJRU5UKTsKKwkgICAJaWYodXNlZCA9PSBJODMwX0JVRl9GUkVFKSB7CisJCQlyZXR1cm4gYnVmOworCQl9CisJfQorICAgCXJldHVybiBOVUxMOworfQorCisvKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgYnVmZmVyIGlzIG5vdCBzZW50IHRvIHRoZSBoYXJkd2FyZQorICogeWV0LCB0aGUgaGFyZHdhcmUgdXBkYXRlcyBpbiB1c2UgZm9yIHVzIG9uY2UgaXRzIG9uIHRoZSByaW5nIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgaW50IGk4MzBfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZikKK3sKKyAgIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisgICAJaW50IHVzZWQ7CisgICAKKyAgIAkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KKyAgIAl1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9DTElFTlQsIEk4MzBfQlVGX0ZSRUUpOworICAgCWlmKHVzZWQgIT0gSTgzMF9CVUZfQ0xJRU5UKSB7CisJICAgCURSTV9FUlJPUigiRnJlZWluZyBidWZmZXIgdGhhdHMgbm90IGluIHVzZSA6ICVkXG4iLCBidWYtPmlkeCk7CisJICAgCXJldHVybiAtRUlOVkFMOworCX0KKyAgIAorICAgCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODMwX2J1ZmZlcl9mb3BzID0geworCS5vcGVuCSA9IGRybV9vcGVuLAorCS5mbHVzaAkgPSBkcm1fZmx1c2gsCisJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkuaW9jdGwJID0gZHJtX2lvY3RsLAorCS5tbWFwCSA9IGk4MzBfbW1hcF9idWZmZXJzLAorCS5mYXN5bmMgID0gZHJtX2Zhc3luYywKK307CisKK2ludCBpODMwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJZHJtX2ZpbGVfdAkgICAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAgICpkZXY7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICAqZGV2X3ByaXY7CisJZHJtX2J1Zl90ICAgICAgICAgICAqYnVmOworCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCisJbG9ja19rZXJuZWwoKTsKKwlkZXYJID0gcHJpdi0+aGVhZC0+ZGV2OworCWRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlidWYgICAgICA9IGRldl9wcml2LT5tbWFwX2J1ZmZlcjsKKwlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisgICAKKwl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX0RPTlRDT1BZKTsKKwl2bWEtPnZtX2ZpbGUgPSBmaWxwOworICAgCisgICAJYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPSBJODMwX0JVRl9NQVBQRUQ7CisJdW5sb2NrX2tlcm5lbCgpOworCisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIFZNX09GRlNFVCh2bWEpID4+IFBBR0VfU0hJRlQsCisJCQkgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCSAgICAgdm1hLT52bV9wYWdlX3Byb3QpKSByZXR1cm4gLUVBR0FJTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX21hcF9idWZmZXIoZHJtX2J1Zl90ICpidWYsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisgICAgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CisJdW5zaWduZWQgbG9uZyB2aXJ0dWFsOworCWludCByZXRjb2RlID0gMDsKKworCWlmKGJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID09IEk4MzBfQlVGX01BUFBFRCkgcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duX3dyaXRlKCAmY3VycmVudC0+bW0tPm1tYXBfc2VtICk7CisJb2xkX2ZvcHMgPSBmaWxwLT5mX29wOworCWZpbHAtPmZfb3AgPSAmaTgzMF9idWZmZXJfZm9wczsKKwlkZXZfcHJpdi0+bW1hcF9idWZmZXIgPSBidWY7CisJdmlydHVhbCA9IGRvX21tYXAoZmlscCwgMCwgYnVmLT50b3RhbCwgUFJPVF9SRUFEfFBST1RfV1JJVEUsCisJCQkgICAgTUFQX1NIQVJFRCwgYnVmLT5idXNfYWRkcmVzcyk7CisJZGV2X3ByaXYtPm1tYXBfYnVmZmVyID0gTlVMTDsKKwlmaWxwLT5mX29wID0gb2xkX2ZvcHM7CisJaWYgKElTX0VSUigodm9pZCAqKXZpcnR1YWwpKSB7CQkvKiB1Z2ggKi8KKwkJLyogUmVhbCBlcnJvciAqLworCQlEUk1fRVJST1IoIm1tYXAgZXJyb3JcbiIpOworCQlyZXRjb2RlID0gdmlydHVhbDsKKwkJYnVmX3ByaXYtPnZpcnR1YWwgPSBOVUxMOworCX0gZWxzZSB7CisJCWJ1Zl9wcml2LT52aXJ0dWFsID0gKHZvaWQgX191c2VyICopdmlydHVhbDsKKwl9CisJdXBfd3JpdGUoICZjdXJyZW50LT5tbS0+bW1hcF9zZW0gKTsKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgaW50IGk4MzBfdW5tYXBfYnVmZmVyKGRybV9idWZfdCAqYnVmKQoreworCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0Y29kZSA9IDA7CisKKwlpZihidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCAhPSBJODMwX0JVRl9NQVBQRUQpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0Y29kZSA9IGRvX211bm1hcChjdXJyZW50LT5tbSwKKwkJCSAgICAodW5zaWduZWQgbG9uZylidWZfcHJpdi0+dmlydHVhbCwKKwkJCSAgICAoc2l6ZV90KSBidWYtPnRvdGFsKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworICAgCWJ1Zl9wcml2LT5jdXJyZW50bHlfbWFwcGVkID0gSTgzMF9CVUZfVU5NQVBQRUQ7CisgICAJYnVmX3ByaXYtPnZpcnR1YWwgPSBOVUxMOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9kbWFfZ2V0X2J1ZmZlcihkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2k4MzBfZG1hX3QgKmQsIAorCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRybV9idWZfdAkgICpidWY7CisJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJaW50IHJldGNvZGUgPSAwOworCisJYnVmID0gaTgzMF9mcmVlbGlzdF9nZXQoZGV2KTsKKwlpZiAoIWJ1ZikgeworCQlyZXRjb2RlID0gLUVOT01FTTsKKwkgICAJRFJNX0RFQlVHKCJyZXRjb2RlPSVkXG4iLCByZXRjb2RlKTsKKwkJcmV0dXJuIHJldGNvZGU7CisJfQorICAgCisJcmV0Y29kZSA9IGk4MzBfbWFwX2J1ZmZlcihidWYsIGZpbHApOworCWlmKHJldGNvZGUpIHsKKwkJaTgzMF9mcmVlbGlzdF9wdXQoZGV2LCBidWYpOworCSAgIAlEUk1fRVJST1IoIm1hcGJ1ZiBmYWlsZWQsIHJldGNvZGUgJWRcbiIsIHJldGNvZGUpOworCQlyZXR1cm4gcmV0Y29kZTsKKwl9CisJYnVmLT5maWxwID0gZmlscDsKKwlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CQorCWQtPmdyYW50ZWQgPSAxOworICAgCWQtPnJlcXVlc3RfaWR4ID0gYnVmLT5pZHg7CisgICAJZC0+cmVxdWVzdF9zaXplID0gYnVmLT50b3RhbDsKKyAgIAlkLT52aXJ0dWFsID0gYnVmX3ByaXYtPnZpcnR1YWw7CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKworc3RhdGljIGludCBpODMwX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCisJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCisJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQorCSAqIGlzIGZyZWVkLCBpdCdzIHRvbyBsYXRlLgorCSAqLworCWlmICggZGV2LT5pcnFfZW5hYmxlZCApIGRybV9pcnFfdW5pbnN0YWxsKGRldik7CisKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlpbnQgaTsKKwkgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAorCSAgICAgCQkoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJICAgCisJICAgCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0KSB7CisJCSAgIAlkcm1faW9yZW1hcGZyZWUoKHZvaWQgKikgZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCwKKwkJCQkJIGRldl9wcml2LT5yaW5nLlNpemUsIGRldik7CisJCX0KKwkgICAJaWYgKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwKKwkJCQkJICAgIGRldl9wcml2LT5od19zdGF0dXNfcGFnZSwKKwkJCQkJICAgIGRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UpOworCQkgICAJLyogTmVlZCB0byByZXdyaXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlICovCisJCSAgIAlJODMwX1dSSVRFKDB4MDIwODAsIDB4MWZmZmYwMDApOworCQl9CisKKwkgICAJZHJtX2ZyZWUoZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9pODMwX3ByaXZhdGVfdCksIAorCQkJIERSTV9NRU1fRFJJVkVSKTsKKwkgICAJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisKKwkJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkJCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0WyBpIF07CisJCQlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCQlpZiAoIGJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCAmJiBidWYtPnRvdGFsICkKKwkJCQlkcm1faW9yZW1hcGZyZWUoYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsLCBidWYtPnRvdGFsLCBkZXYpOworCQl9CisJfQorICAgCXJldHVybiAwOworfQorCitpbnQgaTgzMF93YWl0X3JpbmcoZHJtX2RldmljZV90ICpkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAJZHJtX2k4MzBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOworICAgCWludCBpdGVycyA9IDA7CisgICAJdW5zaWduZWQgbG9uZyBlbmQ7CisJdW5zaWduZWQgaW50IGxhc3RfaGVhZCA9IEk4MzBfUkVBRChMUF9SSU5HICsgUklOR19IRUFEKSAmIEhFQURfQUREUjsKKworCWVuZCA9IGppZmZpZXMgKyAoSFoqMyk7CisgICAJd2hpbGUgKHJpbmctPnNwYWNlIDwgbikgewkKKwkgICAJcmluZy0+aGVhZCA9IEk4MzBfUkVBRChMUF9SSU5HICsgUklOR19IRUFEKSAmIEhFQURfQUREUjsKKwkgICAJcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwrOCk7CisJCWlmIChyaW5nLT5zcGFjZSA8IDApIHJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7CisJICAgCisJCWlmIChyaW5nLT5oZWFkICE9IGxhc3RfaGVhZCkgeworCQkJZW5kID0gamlmZmllcyArIChIWiozKTsKKwkJCWxhc3RfaGVhZCA9IHJpbmctPmhlYWQ7CisJCX0KKwkgIAorCSAgIAlpdGVycysrOworCQlpZih0aW1lX2JlZm9yZShlbmQsIGppZmZpZXMpKSB7CisJCSAgIAlEUk1fRVJST1IoInNwYWNlOiAlZCB3YW50ZWQgJWRcbiIsIHJpbmctPnNwYWNlLCBuKTsKKwkJICAgCURSTV9FUlJPUigibG9ja3VwXG4iKTsKKwkJICAgCWdvdG8gb3V0X3dhaXRfcmluZzsKKwkJfQorCQl1ZGVsYXkoMSk7CisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk4MzBfQk9YX1dBSVQ7CisJfQorCitvdXRfd2FpdF9yaW5nOiAgIAorICAgCXJldHVybiBpdGVyczsKK30KKworc3RhdGljIHZvaWQgaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCWRybV9pODMwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKKyAgICAgIAorICAgCXJpbmctPmhlYWQgPSBJODMwX1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisgICAgIAlyaW5nLT50YWlsID0gSTgzMF9SRUFEKExQX1JJTkcgKyBSSU5HX1RBSUwpICYgVEFJTF9BRERSOworICAgICAJcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwrOCk7CisgICAgIAlpZiAocmluZy0+c3BhY2UgPCAwKSByaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOworCisJaWYgKHJpbmctPmhlYWQgPT0gcmluZy0+dGFpbCkKKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTgzMF9CT1hfUklOR19FTVBUWTsKK30KKworc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X2luaXQoZHJtX2RldmljZV90ICpkZXYsIGRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYpCit7CisgICAgICAJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisgICAJaW50IG15X2lkeCA9IDM2OworICAgCXUzMiAqaHdfc3RhdHVzID0gKHUzMiAqKShkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UgKyBteV9pZHgpOworICAgCWludCBpOworCisgICAJaWYoZG1hLT5idWZfY291bnQgPiAxMDE5KSB7CisJICAgCS8qIE5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIHN0YXR1cyBwYWdlIGZvciB0aGUgZnJlZWxpc3QgKi8KKwkgICAJcmV0dXJuIC1FSU5WQUw7CisJfQorCisgICAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKKwkgICAJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbIGkgXTsKKwkgICAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJICAgCWJ1Zl9wcml2LT5pbl91c2UgPSBod19zdGF0dXMrKzsKKwkgICAJYnVmX3ByaXYtPm15X3VzZV9pZHggPSBteV9pZHg7CisJICAgCW15X2lkeCArPSA0OworCisJICAgCSpidWZfcHJpdi0+aW5fdXNlID0gSTgzMF9CVUZfRlJFRTsKKworCQlidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwgPSBkcm1faW9yZW1hcChidWYtPmJ1c19hZGRyZXNzLCAKKwkJCQkJCQlidWYtPnRvdGFsLCBkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX2RtYV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqZGV2LCAKKwkJCSAgICAgICBkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgICAgIGRybV9pODMwX2luaXRfdCAqaW5pdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisgICAJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k4MzBfcHJpdmF0ZV90KSk7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQlpZiggcl9saXN0LT5tYXAgJiYKKwkJICAgIHJfbGlzdC0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCisJCSAgICByX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0sgKSB7CisJCQlkZXZfcHJpdi0+c2FyZWFfbWFwID0gcl9saXN0LT5tYXA7CisgCQkJYnJlYWs7CisgCQl9CisgCX0KKworCWlmKCFkZXZfcHJpdi0+c2FyZWFfbWFwKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlpODMwX2RtYV9jbGVhbnVwKGRldik7CisJCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIHNhcmVhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfcHJpdi0+bW1pb19tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOworCWlmKCFkZXZfcHJpdi0+bW1pb19tYXApIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk4MzBfZG1hX2NsZWFudXAoZGV2KTsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgbW1pbyBtYXAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+YnVmZmVyc19vZmZzZXQpOworCWlmKCFkZXYtPmFncF9idWZmZXJfbWFwKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlpODMwX2RtYV9jbGVhbnVwKGRldik7CisJCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIGRtYSBidWZmZXIgbWFwIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2ID0gKGRybV9pODMwX3NhcmVhX3QgKikKKwkJKCh1OCAqKWRldl9wcml2LT5zYXJlYV9tYXAtPmhhbmRsZSArCisJCSBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKyAgIAlkZXZfcHJpdi0+cmluZy5TdGFydCA9IGluaXQtPnJpbmdfc3RhcnQ7CisgICAJZGV2X3ByaXYtPnJpbmcuRW5kID0gaW5pdC0+cmluZ19lbmQ7CisgICAJZGV2X3ByaXYtPnJpbmcuU2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKKworICAgCWRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPSBkcm1faW9yZW1hcChkZXYtPmFncC0+YmFzZSArIAorCQkJCQkJICAgIGluaXQtPnJpbmdfc3RhcnQsIAorCQkJCQkJICAgIGluaXQtPnJpbmdfc2l6ZSwgZGV2KTsKKworICAgCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID09IE5VTEwpIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopIGRldl9wcml2OworCSAgIAlpODMwX2RtYV9jbGVhbnVwKGRldik7CisJICAgCURSTV9FUlJPUigiY2FuIG5vdCBpb3JlbWFwIHZpcnR1YWwgYWRkcmVzcyBmb3IiCisJCQkgICIgcmluZyBidWZmZXJcbiIpOworCSAgIAlyZXR1cm4gLUVOT01FTTsKKwl9CisKKyAgIAlkZXZfcHJpdi0+cmluZy50YWlsX21hc2sgPSBkZXZfcHJpdi0+cmluZy5TaXplIC0gMTsKKyAgIAorCWRldl9wcml2LT53ID0gaW5pdC0+dzsKKwlkZXZfcHJpdi0+aCA9IGluaXQtPmg7CisJZGV2X3ByaXYtPnBpdGNoID0gaW5pdC0+cGl0Y2g7CisJZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ID0gaW5pdC0+YmFja19vZmZzZXQ7CisJZGV2X3ByaXYtPmRlcHRoX29mZnNldCA9IGluaXQtPmRlcHRoX29mZnNldDsKKwlkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ID0gaW5pdC0+ZnJvbnRfb2Zmc2V0OworCisJZGV2X3ByaXYtPmZyb250X2RpMSA9IGluaXQtPmZyb250X29mZnNldCB8IGluaXQtPnBpdGNoX2JpdHM7CisJZGV2X3ByaXYtPmJhY2tfZGkxID0gaW5pdC0+YmFja19vZmZzZXQgfCBpbml0LT5waXRjaF9iaXRzOworCWRldl9wcml2LT56aTEgPSBpbml0LT5kZXB0aF9vZmZzZXQgfCBpbml0LT5waXRjaF9iaXRzOworCisJRFJNX0RFQlVHKCJmcm9udF9kaTEgJXhcbiIsICAgIGRldl9wcml2LT5mcm9udF9kaTEpOworCURSTV9ERUJVRygiYmFja19vZmZzZXQgJXhcbiIsIGRldl9wcml2LT5iYWNrX29mZnNldCk7CisJRFJNX0RFQlVHKCJiYWNrX2RpMSAleFxuIiwgICAgZGV2X3ByaXYtPmJhY2tfZGkxKTsKKwlEUk1fREVCVUcoInBpdGNoX2JpdHMgJXhcbiIsICAgIGluaXQtPnBpdGNoX2JpdHMpOworCisJZGV2X3ByaXYtPmNwcCA9IGluaXQtPmNwcDsKKwkvKiBXZSBhcmUgdXNpbmcgc2VwYXJhdGUgdmFsdWVzIGFzIHBsYWNlaG9sZGVycyBmb3IgbWVjaGFuaXNtcyBmb3IKKwkgKiBwcml2YXRlIGJhY2tidWZmZXIvZGVwdGhidWZmZXIgdXNhZ2UuCisJICovCisKKwlkZXZfcHJpdi0+YmFja19waXRjaCA9IGluaXQtPmJhY2tfcGl0Y2g7CisJZGV2X3ByaXYtPmRlcHRoX3BpdGNoID0gaW5pdC0+ZGVwdGhfcGl0Y2g7CisJZGV2X3ByaXYtPmRvX2JveGVzID0gMDsKKwlkZXZfcHJpdi0+dXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0ID0gMDsKKworICAgCS8qIFByb2dyYW0gSGFyZHdhcmUgU3RhdHVzIFBhZ2UgKi8KKyAgIAlkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwKKwkJCQkJCSZkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKyAgIAlpZiAoIWRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTgzMF9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoIkNhbiBub3QgYWxsb2NhdGUgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisgICAJbWVtc2V0KGRldl9wcml2LT5od19zdGF0dXNfcGFnZSwgMCwgUEFHRV9TSVpFKTsKKwlEUk1fREVCVUcoImh3IHN0YXR1cyBwYWdlIEAgJXBcbiIsIGRldl9wcml2LT5od19zdGF0dXNfcGFnZSk7CisgICAKKyAgIAlJODMwX1dSSVRFKDB4MDIwODAsIGRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UpOworCURSTV9ERUJVRygiRW5hYmxlZCBoYXJkd2FyZSBzdGF0dXMgcGFnZVxuIik7CisgICAKKyAgIAkvKiBOb3cgd2UgbmVlZCB0byBpbml0IG91ciBmcmVlbGlzdCAqLworICAgCWlmKGk4MzBfZnJlZWxpc3RfaW5pdChkZXYsIGRldl9wcml2KSAhPSAwKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCSAgIAlpODMwX2RtYV9jbGVhbnVwKGRldik7CisJICAgCURSTV9FUlJPUigiTm90IGVub3VnaCBzcGFjZSBpbiB0aGUgc3RhdHVzIHBhZ2UgZm9yIgorCQkJICAiIHRoZSBmcmVlbGlzdFxuIik7CisJICAgCXJldHVybiAtRU5PTUVNOworCX0KKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKworICAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfZG1hX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKyAgIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2OworICAgCWRybV9pODMwX2luaXRfdCBpbml0OworICAgCWludCByZXRjb2RlID0gMDsKKwkKKyAgCWlmIChjb3B5X2Zyb21fdXNlcigmaW5pdCwgKHZvaWQgKiBfX3VzZXIpIGFyZywgc2l6ZW9mKGluaXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisgICAJc3dpdGNoKGluaXQuZnVuYykgeworCSAJY2FzZSBJODMwX0lOSVRfRE1BOgorCQkJZGV2X3ByaXYgPSBkcm1fYWxsb2Moc2l6ZW9mKGRybV9pODMwX3ByaXZhdGVfdCksIAorCQkJCQkgICAgICBEUk1fTUVNX0RSSVZFUik7CisJICAgCQlpZihkZXZfcHJpdiA9PSBOVUxMKSByZXR1cm4gLUVOT01FTTsKKwkgICAJCXJldGNvZGUgPSBpODMwX2RtYV9pbml0aWFsaXplKGRldiwgZGV2X3ByaXYsICZpbml0KTsKKwkgICAJYnJlYWs7CisJIAljYXNlIEk4MzBfQ0xFQU5VUF9ETUE6CisJICAgCQlyZXRjb2RlID0gaTgzMF9kbWFfY2xlYW51cChkZXYpOworCSAgIAlicmVhazsKKwkgCWRlZmF1bHQ6CisJICAgCQlyZXRjb2RlID0gLUVJTlZBTDsKKwkgICAJYnJlYWs7CisJfQorICAgCisgICAJcmV0dXJuIHJldGNvZGU7Cit9CisKKyNkZWZpbmUgR0ZYX09QX1NUSVBQTEUgICAgICAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4Mzw8MTYpKQorI2RlZmluZSBTVDFfRU5BQkxFICAgICAgICAgICAgICAgKDE8PDE2KQorI2RlZmluZSBTVDFfTUFTSyAgICAgICAgICAgICAgICAgKDB4ZmZmZikKKworLyogTW9zdCBlZmZpY2llbnQgd2F5IHRvIHZlcmlmeSBzdGF0ZSBmb3IgdGhlIGk4MzAgaXMgYXMgaXQgaXMKKyAqIGVtaXR0ZWQuICBOb24tY29uZm9ybWFudCBzdGF0ZSBpcyBzaWxlbnRseSBkcm9wcGVkLgorICovCitzdGF0aWMgdm9pZCBpODMwRW1pdENvbnRleHRWZXJpZmllZCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNvZGUgKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpLCBqID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fTFBfUklORyggSTgzMF9DVFhfU0VUVVBfU0laRSArIDQgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IEk4MzBfQ1RYUkVHX0JMRU5EQ09MUjAgOyBpKysgKSB7CisJCXRtcCA9IGNvZGVbaV07CisJCWlmICgodG1wICYgKDc8PDI5KSkgPT0gQ01EXzNEICYmCisJCSAgICAodG1wICYgKDB4MWY8PDI0KSkgPCAoMHgxZDw8MjQpKSB7CisJCQlPVVRfUklORyggdG1wICk7IAorCQkJaisrOworCQl9IGVsc2UgeworCQkJRFJNX0VSUk9SKCJTa2lwcGluZyAlZFxuIiwgaSk7CisJCX0KKwl9CisKKwlPVVRfUklORyggU1RBVEUzRF9DT05TVF9CTEVORF9DT0xPUl9DTUQgKTsgCisJT1VUX1JJTkcoIGNvZGVbSTgzMF9DVFhSRUdfQkxFTkRDT0xSXSApOyAKKwlqICs9IDI7CisKKwlmb3IgKCBpID0gSTgzMF9DVFhSRUdfVkYgOyBpIDwgSTgzMF9DVFhSRUdfTUNTQjAgOyBpKysgKSB7CisJCXRtcCA9IGNvZGVbaV07CisJCWlmICgodG1wICYgKDc8PDI5KSkgPT0gQ01EXzNEICYmCisJCSAgICAodG1wICYgKDB4MWY8PDI0KSkgPCAoMHgxZDw8MjQpKSB7CisJCQlPVVRfUklORyggdG1wICk7IAorCQkJaisrOworCQl9IGVsc2UgeworCQkJRFJNX0VSUk9SKCJTa2lwcGluZyAlZFxuIiwgaSk7CisJCX0KKwl9CisKKwlPVVRfUklORyggU1RBVEUzRF9NQVBfQ09PUkRfU0VUQklORF9DTUQgKTsgCisJT1VUX1JJTkcoIGNvZGVbSTgzMF9DVFhSRUdfTUNTQjFdICk7IAorCWogKz0gMjsKKworCWlmIChqICYgMSkgCisJCU9VVF9SSU5HKCAwICk7IAorCisJQURWQU5DRV9MUF9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4VmVyaWZpZWQoIGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUgKSAKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaSwgaiA9IDA7CisJdW5zaWduZWQgaW50IHRtcDsKKwlSSU5HX0xPQ0FMUzsKKworCWlmIChjb2RlW0k4MzBfVEVYUkVHX01JMF0gPT0gR0ZYX09QX01BUF9JTkZPIHx8CisJICAgIChjb2RlW0k4MzBfVEVYUkVHX01JMF0gJiB+KDB4ZipMT0FEX1RFWFRVUkVfTUFQMCkpID09IAorCSAgICAoU1RBVEUzRF9MT0FEX1NUQVRFX0lNTUVESUFURV8yfDQpKSB7CisKKwkJQkVHSU5fTFBfUklORyggSTgzMF9URVhfU0VUVVBfU0laRSApOworCisJCU9VVF9SSU5HKCBjb2RlW0k4MzBfVEVYUkVHX01JMF0gKTsgLyogVE0wTEkgKi8KKwkJT1VUX1JJTkcoIGNvZGVbSTgzMF9URVhSRUdfTUkxXSApOyAvKiBUTTBTMCAqLworCQlPVVRfUklORyggY29kZVtJODMwX1RFWFJFR19NSTJdICk7IC8qIFRNMFMxICovCisJCU9VVF9SSU5HKCBjb2RlW0k4MzBfVEVYUkVHX01JM10gKTsgLyogVE0wUzIgKi8KKwkJT1VUX1JJTkcoIGNvZGVbSTgzMF9URVhSRUdfTUk0XSApOyAvKiBUTTBTMyAqLworCQlPVVRfUklORyggY29kZVtJODMwX1RFWFJFR19NSTVdICk7IC8qIFRNMFM0ICovCisJCQorCQlmb3IgKCBpID0gNiA7IGkgPCBJODMwX1RFWF9TRVRVUF9TSVpFIDsgaSsrICkgeworCQkJdG1wID0gY29kZVtpXTsKKwkJCU9VVF9SSU5HKCB0bXAgKTsgCisJCQlqKys7CisJCX0gCisKKwkJaWYgKGogJiAxKSAKKwkJCU9VVF9SSU5HKCAwICk7IAorCisJCUFEVkFOQ0VfTFBfUklORygpOworCX0KKwllbHNlCisJCXByaW50aygicmVqZWN0ZWQgcGFja2V0ICV4XG4iLCBjb2RlWzBdKTsKK30KKworc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhCbGVuZFZlcmlmaWVkKCBkcm1fZGV2aWNlX3QgKmRldiwgCisJCQkJICAgICAgdW5zaWduZWQgaW50ICpjb2RlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBudW0pCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGksIGogPSAwOworCXVuc2lnbmVkIGludCB0bXA7CisJUklOR19MT0NBTFM7CisKKwlpZiAoIW51bSkKKwkJcmV0dXJuOworCisJQkVHSU5fTFBfUklORyggbnVtICsgMSApOworCisJZm9yICggaSA9IDAgOyBpIDwgbnVtIDsgaSsrICkgeworCQl0bXAgPSBjb2RlW2ldOworCQlPVVRfUklORyggdG1wICk7CisJCWorKzsKKwl9CisKKwlpZiAoaiAmIDEpIAorCQlPVVRfUklORyggMCApOyAKKworCUFEVkFOQ0VfTFBfUklORygpOworfQorCitzdGF0aWMgdm9pZCBpODMwRW1pdFRleFBhbGV0dGUoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICAgICAgICB1bnNpZ25lZCBpbnQgKnBhbGV0dGUsCisJCQkgICAgICAgIGludCBudW1iZXIsCisJCQkgICAgICAgIGludCBpc19zaGFyZWQgKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCVJJTkdfTE9DQUxTOworCisJcmV0dXJuOworCisJQkVHSU5fTFBfUklORyggMjU4ICk7CisKKwlpZihpc19zaGFyZWQgPT0gMSkgeworCQlPVVRfUklORyhDTURfT1BfTUFQX1BBTEVUVEVfTE9BRCB8CisJCQkgTUFQX1BBTEVUVEVfTlVNKDApIHwKKwkJCSBNQVBfUEFMRVRURV9CT1RIKTsKKwl9IGVsc2UgeworCQlPVVRfUklORyhDTURfT1BfTUFQX1BBTEVUVEVfTE9BRCB8IE1BUF9QQUxFVFRFX05VTShudW1iZXIpKTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJT1VUX1JJTkcocGFsZXR0ZVtpXSk7CisJfQorCU9VVF9SSU5HKDApOworCS8qIEtXOiAgV0hFUkUgSVMgVEhFIEFEVkFOQ0VfTFBfUklORz8gIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBub29wISAKKwkgKi8KK30KKworLyogTmVlZCB0byBkbyBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcgd2hlbiBzZXR0aW5nIHRoZSBkZXN0IGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgaTgzMEVtaXREZXN0VmVyaWZpZWQoIGRybV9kZXZpY2VfdCAqZGV2LCAKKwkJCQkgIHVuc2lnbmVkIGludCAqY29kZSApIAorewkKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fTFBfUklORyggSTgzMF9ERVNUX1NFVFVQX1NJWkUgKyAxMCApOworCisKKwl0bXAgPSBjb2RlW0k4MzBfREVTVFJFR19DQlVGQUREUl07CisJaWYgKHRtcCA9PSBkZXZfcHJpdi0+ZnJvbnRfZGkxIHx8IHRtcCA9PSBkZXZfcHJpdi0+YmFja19kaTEpIHsKKwkJaWYgKCgoaW50KW91dHJpbmcpICYgOCkgeworCQkJT1VUX1JJTkcoMCk7CisJCQlPVVRfUklORygwKTsKKwkJfQorCisJCU9VVF9SSU5HKCBDTURfT1BfREVTVEJVRkZFUl9JTkZPICk7CisJCU9VVF9SSU5HKCBCVUZfM0RfSURfQ09MT1JfQkFDSyB8IAorCQkJICBCVUZfM0RfUElUQ0goZGV2X3ByaXYtPmJhY2tfcGl0Y2ggKiBkZXZfcHJpdi0+Y3BwKSB8CisJCQkgIEJVRl8zRF9VU0VfRkVOQ0UpOworCQlPVVRfUklORyggdG1wICk7CisJCU9VVF9SSU5HKCAwICk7CisKKwkJT1VUX1JJTkcoIENNRF9PUF9ERVNUQlVGRkVSX0lORk8gKTsKKwkJT1VUX1JJTkcoIEJVRl8zRF9JRF9ERVBUSCB8IEJVRl8zRF9VU0VfRkVOQ0UgfCAKKwkJCSAgQlVGXzNEX1BJVENIKGRldl9wcml2LT5kZXB0aF9waXRjaCAqIGRldl9wcml2LT5jcHApKTsKKwkJT1VUX1JJTkcoIGRldl9wcml2LT56aTEgKTsKKwkJT1VUX1JJTkcoIDAgKTsKKwl9IGVsc2UgeworCQlEUk1fRVJST1IoImJhZCBkaTEgJXggKGFsbG93ICV4IG9yICV4KVxuIiwKKwkJCSAgdG1wLCBkZXZfcHJpdi0+ZnJvbnRfZGkxLCBkZXZfcHJpdi0+YmFja19kaTEpOworCX0KKworCS8qIGludmFyaWVudDoKKwkgKi8KKworCisJT1VUX1JJTkcoIEdGWF9PUF9ERVNUQlVGRkVSX1ZBUlMgKTsKKwlPVVRfUklORyggY29kZVtJODMwX0RFU1RSRUdfRFYxXSApOworCisJT1VUX1JJTkcoIEdGWF9PUF9EUkFXUkVDVF9JTkZPICk7CisJT1VUX1JJTkcoIGNvZGVbSTgzMF9ERVNUUkVHX0RSMV0gKTsKKwlPVVRfUklORyggY29kZVtJODMwX0RFU1RSRUdfRFIyXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MzBfREVTVFJFR19EUjNdICk7CisJT1VUX1JJTkcoIGNvZGVbSTgzMF9ERVNUUkVHX0RSNF0gKTsKKworCS8qIE5lZWQgdG8gdmVyaWZ5IHRoaXMgKi8KKwl0bXAgPSBjb2RlW0k4MzBfREVTVFJFR19TRU5BQkxFXTsKKwlpZigodG1wICYgfjB4MykgPT0gR0ZYX09QX1NDSVNTT1JfRU5BQkxFKSB7CisJCU9VVF9SSU5HKCB0bXAgKTsKKwl9IGVsc2UgeworCQlEUk1fRVJST1IoImJhZCBzY2lzc29yIGVuYWJsZVxuIik7CisJCU9VVF9SSU5HKCAwICk7CisJfQorCisJT1VUX1JJTkcoIEdGWF9PUF9TQ0lTU09SX1JFQ1QgKTsKKwlPVVRfUklORyggY29kZVtJODMwX0RFU1RSRUdfU1IxXSApOworCU9VVF9SSU5HKCBjb2RlW0k4MzBfREVTVFJFR19TUjJdICk7CisJT1VUX1JJTkcoIDAgKTsKKworCUFEVkFOQ0VfTFBfUklORygpOworfQorCitzdGF0aWMgdm9pZCBpODMwRW1pdFN0aXBwbGVWZXJpZmllZCggZHJtX2RldmljZV90ICpkZXYsIAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpjb2RlICkgCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlCRUdJTl9MUF9SSU5HKCAyICk7CisJT1VUX1JJTkcoIEdGWF9PUF9TVElQUExFICk7CisJT1VUX1JJTkcoIGNvZGVbMV0gKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsJCit9CisKKworc3RhdGljIHZvaWQgaTgzMEVtaXRTdGF0ZSggZHJtX2RldmljZV90ICpkZXYgKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKKworCURSTV9ERUJVRygiJXMgJXhcbiIsIF9fRlVOQ1RJT05fXywgZGlydHkpOworCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfQlVGRkVSUykgeworCQlpODMwRW1pdERlc3RWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5CdWZmZXJTdGF0ZSApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfQlVGRkVSUzsKKwl9CisKKwlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9DVFgpIHsKKwkJaTgzMEVtaXRDb250ZXh0VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+Q29udGV4dFN0YXRlICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9DVFg7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYMCkgeworCQlpODMwRW1pdFRleFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPlRleFN0YXRlWzBdICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVgwOworCX0KKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWDEpIHsKKwkJaTgzMEVtaXRUZXhWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5UZXhTdGF0ZVsxXSApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYMTsKKwl9CisKKwlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVhCTEVORDApIHsKKwkJaTgzMEVtaXRUZXhCbGVuZFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPlRleEJsZW5kU3RhdGVbMF0sCisJCQkJc2FyZWFfcHJpdi0+VGV4QmxlbmRTdGF0ZVdvcmRzVXNlZFswXSk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhCTEVORDA7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYQkxFTkQxKSB7CisJCWk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZCggZGV2LCBzYXJlYV9wcml2LT5UZXhCbGVuZFN0YXRlWzFdLAorCQkJCXNhcmVhX3ByaXYtPlRleEJsZW5kU3RhdGVXb3Jkc1VzZWRbMV0pOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYQkxFTkQxOworCX0KKworCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX1NIQVJFRCkgeworCQlpODMwRW1pdFRleFBhbGV0dGUoZGV2LCBzYXJlYV9wcml2LT5QYWxldHRlWzBdLCAwLCAxKTsKKwl9IGVsc2UgeworCQlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDApKSB7CisJCQlpODMwRW1pdFRleFBhbGV0dGUoZGV2LCBzYXJlYV9wcml2LT5QYWxldHRlWzBdLCAwLCAwKTsKKwkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVhfUEFMRVRURV9OKDApOworCQl9CisJCWlmIChkaXJ0eSAmIEk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04oMSkpIHsKKwkJCWk4MzBFbWl0VGV4UGFsZXR0ZShkZXYsIHNhcmVhX3ByaXYtPlBhbGV0dGVbMV0sIDEsIDApOworCQkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04oMSk7CisJCX0KKworCQkvKiAxLjM6CisJCSAqLworI2lmIDAKKwkJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYX1BBTEVUVEVfTigyKSkgeworCQkJaTgzMEVtaXRUZXhQYWxldHRlKGRldiwgc2FyZWFfcHJpdi0+UGFsZXR0ZTJbMF0sIDAsIDApOworCQkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04oMik7CisJCX0KKwkJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYX1BBTEVUVEVfTigzKSkgeworCQkJaTgzMEVtaXRUZXhQYWxldHRlKGRldiwgc2FyZWFfcHJpdi0+UGFsZXR0ZTJbMV0sIDEsIDApOworCQkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWF9QQUxFVFRFX04oMik7CisJCX0KKyNlbmRpZgorCX0KKworCS8qIDEuMzoKKwkgKi8KKwlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9TVElQUExFKSB7CisJCWk4MzBFbWl0U3RpcHBsZVZlcmlmaWVkKCBkZXYsIAorCQkJCQkgc2FyZWFfcHJpdi0+U3RpcHBsZVN0YXRlKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1NUSVBQTEU7CisJfQorCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYMikgeworCQlpODMwRW1pdFRleFZlcmlmaWVkKCBkZXYsIHNhcmVhX3ByaXYtPlRleFN0YXRlMiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+STgzMF9VUExPQURfVEVYMjsKKwl9CisKKwlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVgzKSB7CisJCWk4MzBFbWl0VGV4VmVyaWZpZWQoIGRldiwgc2FyZWFfcHJpdi0+VGV4U3RhdGUzICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5JODMwX1VQTE9BRF9URVgzOworCX0KKworCisJaWYgKGRpcnR5ICYgSTgzMF9VUExPQURfVEVYQkxFTkQyKSB7CisJCWk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZCggCisJCQlkZXYsIAorCQkJc2FyZWFfcHJpdi0+VGV4QmxlbmRTdGF0ZTIsCisJCQlzYXJlYV9wcml2LT5UZXhCbGVuZFN0YXRlV29yZHNVc2VkMik7CisKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWEJMRU5EMjsKKwl9CisKKwlpZiAoZGlydHkgJiBJODMwX1VQTE9BRF9URVhCTEVORDMpIHsKKwkJaTgzMEVtaXRUZXhCbGVuZFZlcmlmaWVkKCAKKwkJCWRldiwgCisJCQlzYXJlYV9wcml2LT5UZXhCbGVuZFN0YXRlMywKKwkJCXNhcmVhX3ByaXYtPlRleEJsZW5kU3RhdGVXb3Jkc1VzZWQzKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfkk4MzBfVVBMT0FEX1RFWEJMRU5EMzsKKwl9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgaTgzMF9maWxsX2JveCggZHJtX2RldmljZV90ICpkZXYsCisJCQkgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKwkJCSAgIGludCByLCBpbnQgZywgaW50IGIgKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBjb2xvcjsKKwl1bnNpZ25lZCBpbnQgQlIxMywgQ01EOworCVJJTkdfTE9DQUxTOworCisJQlIxMyA9ICgweEYwIDw8IDE2KSB8IChkZXZfcHJpdi0+cGl0Y2ggKiBkZXZfcHJpdi0+Y3BwKSB8ICgxPDwyNCk7CisJQ01EID0gWFlfQ09MT1JfQkxUX0NNRDsKKwl4ICs9IGRldl9wcml2LT5zYXJlYV9wcml2LT5ib3hlc1swXS54MTsKKwl5ICs9IGRldl9wcml2LT5zYXJlYV9wcml2LT5ib3hlc1swXS55MTsKKworCWlmIChkZXZfcHJpdi0+Y3BwID09IDQpIHsKKwkJQlIxMyB8PSAoMTw8MjUpOworCQlDTUQgfD0gKFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQSB8IFhZX0NPTE9SX0JMVF9XUklURV9SR0IpOworCQljb2xvciA9ICgoKDB4ZmYpIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8ICA4KSB8IGIpOwkKKwl9IGVsc2UgeworCQljb2xvciA9ICgoKHIgJiAweGY4KSA8PCA4KSB8CisJCQkgKChnICYgMHhmYykgPDwgMykgfAorCQkJICgoYiAmIDB4ZjgpID4+IDMpKTsKKwl9CisKKwlCRUdJTl9MUF9SSU5HKCA2ICk7CSAgICAKKwlPVVRfUklORyggQ01EICk7CisJT1VUX1JJTkcoIEJSMTMgKTsKKwlPVVRfUklORyggKHkgPDwgMTYpIHwgeCApOworCU9VVF9SSU5HKCAoKHkraCkgPDwgMTYpIHwgKHgrdykgKTsKKworIAlpZiAoIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSApIHsgCisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICk7CisgCX0gZWxzZSB7CSAKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX29mZnNldCApOworIAl9IAorCisJT1VUX1JJTkcoIGNvbG9yICk7CisJQURWQU5DRV9MUF9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBfY3BfcGVyZm9ybWFuY2VfYm94ZXMoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIFB1cnBsZSBib3ggZm9yIHBhZ2UgZmxpcHBpbmcKKwkgKi8KKwlpZiAoIGRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzICYgSTgzMF9CT1hfRkxJUCApIAorCQlpODMwX2ZpbGxfYm94KCBkZXYsIDQsIDQsIDgsIDgsIDI1NSwgMCwgMjU1ICk7CisKKwkvKiBSZWQgYm94IGlmIHdlIGhhdmUgdG8gd2FpdCBmb3IgaWRsZSBhdCBhbnkgcG9pbnQKKwkgKi8KKwlpZiAoIGRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzICYgSTgzMF9CT1hfV0FJVCApIAorCQlpODMwX2ZpbGxfYm94KCBkZXYsIDE2LCA0LCA4LCA4LCAyNTUsIDAsIDAgKTsKKworCS8qIEJsdWUgYm94OiBsb3N0IGNvbnRleHQ/CisJICovCisJaWYgKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyAmIEk4MzBfQk9YX0xPU1RfQ09OVEVYVCApIAorCQlpODMwX2ZpbGxfYm94KCBkZXYsIDI4LCA0LCA4LCA4LCAwLCAwLCAyNTUgKTsKKworCS8qIFllbGxvdyBib3ggZm9yIHRleHR1cmUgc3dhcHMKKwkgKi8KKwlpZiAoIGRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzICYgSTgzMF9CT1hfVEVYVFVSRV9MT0FEICkgCisJCWk4MzBfZmlsbF9ib3goIGRldiwgNDAsIDQsIDgsIDgsIDI1NSwgMjU1LCAwICk7CisKKwkvKiBHcmVlbiBib3ggaWYgaGFyZHdhcmUgbmV2ZXIgaWRsZXMgKGFzIGZhciBhcyB3ZSBjYW4gdGVsbCkKKwkgKi8KKwlpZiAoICEoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgJiBJODMwX0JPWF9SSU5HX0VNUFRZKSApIAorCQlpODMwX2ZpbGxfYm94KCBkZXYsIDY0LCA0LCA4LCA4LCAwLCAyNTUsIDAgKTsKKworCisJLyogRHJhdyBiYXJzIGluZGljYXRpbmcgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIAorCSAqIChub3QgYSBncmVhdCBtZWFzdXJlLCBlYXNpbHkgY29uZnVzZWQpCisJICovCisJaWYgKGRldl9wcml2LT5kbWFfdXNlZCkgeworCQlpbnQgYmFyID0gZGV2X3ByaXYtPmRtYV91c2VkIC8gMTAyNDA7CisJCWlmIChiYXIgPiAxMDApIGJhciA9IDEwMDsKKwkJaWYgKGJhciA8IDEpIGJhciA9IDE7CisJCWk4MzBfZmlsbF9ib3goIGRldiwgNCwgMTYsIGJhciwgNCwgMTk2LCAxMjgsIDEyOCApOworCQlkZXZfcHJpdi0+ZG1hX3VzZWQgPSAwOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzID0gMDsKK30KKworc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfY2xlYXIoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZmxhZ3MsIAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3IsCisJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl96dmFsLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGhtYXNrKQoreworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgICAgCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOworCWludCBjcHAgPSBkZXZfcHJpdi0+Y3BwOworCWludCBpOworCXVuc2lnbmVkIGludCBCUjEzLCBDTUQsIERfQ01EOworCVJJTkdfTE9DQUxTOworCisKKwlpZiAoIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSApIHsKKwkJdW5zaWduZWQgaW50IHRtcCA9IGZsYWdzOworCisJCWZsYWdzICY9IH4oSTgzMF9GUk9OVCB8IEk4MzBfQkFDSyk7CisJCWlmICggdG1wICYgSTgzMF9GUk9OVCApIGZsYWdzIHw9IEk4MzBfQkFDSzsKKwkJaWYgKCB0bXAgJiBJODMwX0JBQ0sgKSAgZmxhZ3MgfD0gSTgzMF9GUk9OVDsKKwl9CisKKyAgCWk4MzBfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisJc3dpdGNoKGNwcCkgeworCWNhc2UgMjogCisJCUJSMTMgPSAoMHhGMCA8PCAxNikgfCAocGl0Y2ggKiBjcHApIHwgKDE8PDI0KTsKKwkJRF9DTUQgPSBDTUQgPSBYWV9DT0xPUl9CTFRfQ01EOworCQlicmVhazsKKwljYXNlIDQ6CisJCUJSMTMgPSAoMHhGMCA8PCAxNikgfCAocGl0Y2ggKiBjcHApIHwgKDE8PDI0KSB8ICgxPDwyNSk7CisJCUNNRCA9IChYWV9DT0xPUl9CTFRfQ01EIHwgWFlfQ09MT1JfQkxUX1dSSVRFX0FMUEhBIHwgCisJCSAgICAgICBYWV9DT0xPUl9CTFRfV1JJVEVfUkdCKTsKKwkJRF9DTUQgPSBYWV9DT0xPUl9CTFRfQ01EOworCQlpZihjbGVhcl9kZXB0aG1hc2sgJiAweDAwZmZmZmZmKQorCQkJRF9DTUQgfD0gWFlfQ09MT1JfQkxUX1dSSVRFX1JHQjsKKwkJaWYoY2xlYXJfZGVwdGhtYXNrICYgMHhmZjAwMDAwMCkKKwkJCURfQ01EIHw9IFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlIxMyA9ICgweEYwIDw8IDE2KSB8IChwaXRjaCAqIGNwcCkgfCAoMTw8MjQpOworCQlEX0NNRCA9IENNRCA9IFhZX0NPTE9SX0JMVF9DTUQ7CisJCWJyZWFrOworCX0KKworICAgICAgCWlmIChuYm94ID4gSTgzMF9OUl9TQVJFQV9DTElQUkVDVFMpCisgICAgIAkJbmJveCA9IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJZm9yIChpID0gMCA7IGkgPCBuYm94IDsgaSsrLCBwYm94KyspIHsKKwkJaWYgKHBib3gtPngxID4gcGJveC0+eDIgfHwKKwkJICAgIHBib3gtPnkxID4gcGJveC0+eTIgfHwKKwkJICAgIHBib3gtPngyID4gZGV2X3ByaXYtPncgfHwKKwkJICAgIHBib3gtPnkyID4gZGV2X3ByaXYtPmgpCisJCQljb250aW51ZTsKKworCSAgIAlpZiAoIGZsYWdzICYgSTgzMF9GUk9OVCApIHsJICAgIAorCQkgICAJRFJNX0RFQlVHKCJjbGVhciBmcm9udFxuIik7CisJCQlCRUdJTl9MUF9SSU5HKCA2ICk7CSAgICAKKwkJCU9VVF9SSU5HKCBDTUQgKTsKKwkJCU9VVF9SSU5HKCBCUjEzICk7CisJCQlPVVRfUklORyggKHBib3gtPnkxIDw8IDE2KSB8IHBib3gtPngxICk7CisJCQlPVVRfUklORyggKHBib3gtPnkyIDw8IDE2KSB8IHBib3gtPngyICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X29mZnNldCApOworCQkJT1VUX1JJTkcoIGNsZWFyX2NvbG9yICk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBJODMwX0JBQ0sgKSB7CisJCQlEUk1fREVCVUcoImNsZWFyIGJhY2tcbiIpOworCQkJQkVHSU5fTFBfUklORyggNiApOwkgICAgCisJCQlPVVRfUklORyggQ01EICk7CisJCQlPVVRfUklORyggQlIxMyApOworCQkJT1VUX1JJTkcoIChwYm94LT55MSA8PCAxNikgfCBwYm94LT54MSApOworCQkJT1VUX1JJTkcoIChwYm94LT55MiA8PCAxNikgfCBwYm94LT54MiApOworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX29mZnNldCApOworCQkJT1VUX1JJTkcoIGNsZWFyX2NvbG9yICk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBJODMwX0RFUFRIICkgeworCQkJRFJNX0RFQlVHKCJjbGVhciBkZXB0aFxuIik7CisJCQlCRUdJTl9MUF9SSU5HKCA2ICk7CisJCQlPVVRfUklORyggRF9DTUQgKTsKKwkJCU9VVF9SSU5HKCBCUjEzICk7CisJCQlPVVRfUklORyggKHBib3gtPnkxIDw8IDE2KSB8IHBib3gtPngxICk7CisJCQlPVVRfUklORyggKHBib3gtPnkyIDw8IDE2KSB8IHBib3gtPngyICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX29mZnNldCApOworCQkJT1VUX1JJTkcoIGNsZWFyX3p2YWwgKTsKKwkJCUFEVkFOQ0VfTFBfUklORygpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9zd2FwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CisJaW50IGNwcCA9IGRldl9wcml2LT5jcHA7CisJaW50IGk7CisJdW5zaWduZWQgaW50IENNRCwgQlIxMzsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygic3dhcGJ1ZmZlcnNcbiIpOworCisgIAlpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCWlmIChkZXZfcHJpdi0+ZG9fYm94ZXMpCisJCWk4MzBfY3BfcGVyZm9ybWFuY2VfYm94ZXMoIGRldiApOworCisJc3dpdGNoKGNwcCkgeworCWNhc2UgMjogCisJCUJSMTMgPSAocGl0Y2ggKiBjcHApIHwgKDB4Q0MgPDwgMTYpIHwgKDE8PDI0KTsKKwkJQ01EID0gWFlfU1JDX0NPUFlfQkxUX0NNRDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlCUjEzID0gKHBpdGNoICogY3BwKSB8ICgweENDIDw8IDE2KSB8ICgxPDwyNCkgfCAoMTw8MjUpOworCQlDTUQgPSAoWFlfU1JDX0NPUFlfQkxUX0NNRCB8IFhZX1NSQ19DT1BZX0JMVF9XUklURV9BTFBIQSB8CisJCSAgICAgICBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfUkdCKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlIxMyA9IChwaXRjaCAqIGNwcCkgfCAoMHhDQyA8PCAxNikgfCAoMTw8MjQpOworCQlDTUQgPSBYWV9TUkNfQ09QWV9CTFRfQ01EOworCQlicmVhazsKKwl9CisKKworICAgICAgCWlmIChuYm94ID4gSTgzMF9OUl9TQVJFQV9DTElQUkVDVFMpCisgICAgIAkJbmJveCA9IEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJZm9yIChpID0gMCA7IGkgPCBuYm94OyBpKyssIHBib3grKykgCisJeworCQlpZiAocGJveC0+eDEgPiBwYm94LT54MiB8fAorCQkgICAgcGJveC0+eTEgPiBwYm94LT55MiB8fAorCQkgICAgcGJveC0+eDIgPiBkZXZfcHJpdi0+dyB8fAorCQkgICAgcGJveC0+eTIgPiBkZXZfcHJpdi0+aCkKKwkJCWNvbnRpbnVlOworIAorCQlEUk1fREVCVUcoImRpc3BhdGNoIHN3YXAgJWQsJWQtJWQsJWQhXG4iLAorCQkJICBwYm94LT54MSwgcGJveC0+eTEsCisJCQkgIHBib3gtPngyLCBwYm94LT55Mik7CisKKwkJQkVHSU5fTFBfUklORyggOCApOworCQlPVVRfUklORyggQ01EICk7CisJCU9VVF9SSU5HKCBCUjEzICk7CisJCU9VVF9SSU5HKCAocGJveC0+eTEgPDwgMTYpIHwgcGJveC0+eDEgKTsKKwkJT1VUX1JJTkcoIChwYm94LT55MiA8PCAxNikgfCBwYm94LT54MiApOworCisJCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDApIAorCQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9vZmZzZXQgKTsKKwkJZWxzZQorCQkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX29mZnNldCApOwkJCQorCisJCU9VVF9SSU5HKCAocGJveC0+eTEgPDwgMTYpIHwgcGJveC0+eDEgKTsKKwkJT1VUX1JJTkcoIEJSMTMgJiAweGZmZmYgKTsKKworCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSAKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsJCQkKKwkJZWxzZQorCQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9vZmZzZXQgKTsKKworCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2ZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRyggIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsIAorCQkgICBfX0ZVTkNUSU9OX18sIAorCQkgICBkZXZfcHJpdi0+Y3VycmVudF9wYWdlLAorCQkgICBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlKTsKKworICAJaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKwlpZiAoZGV2X3ByaXYtPmRvX2JveGVzKSB7CisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk4MzBfQk9YX0ZMSVA7CisJCWk4MzBfY3BfcGVyZm9ybWFuY2VfYm94ZXMoIGRldiApOworCX0KKworCisJQkVHSU5fTFBfUklORyggMiApOworICAgIAlPVVRfUklORyggSU5TVF9QQVJTRVJfQ0xJRU5UIHwgSU5TVF9PUF9GTFVTSCB8IElOU1RfRkxVU0hfTUFQX0NBQ0hFICk7IAorCU9VVF9SSU5HKCAwICk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlCRUdJTl9MUF9SSU5HKCA2ICk7CisJT1VUX1JJTkcoIENNRF9PUF9ESVNQTEFZQlVGRkVSX0lORk8gfCBBU1lOQ19GTElQICk7CQorCU9VVF9SSU5HKCAwICk7CisJaWYgKCBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDAgKSB7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19vZmZzZXQgKTsKKwkJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDE7CisJfSBlbHNlIHsKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9vZmZzZXQgKTsKKwkJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDA7CisJfQorCU9VVF9SSU5HKDApOworCUFEVkFOQ0VfTFBfUklORygpOworCisKKwlCRUdJTl9MUF9SSU5HKCAyICk7CisJT1VUX1JJTkcoIE1JX1dBSVRfRk9SX0VWRU5UIHwKKwkJICBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVAgKTsKKwlPVVRfUklORyggMCApOworCUFEVkFOQ0VfTFBfUklORygpOworCQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX3ZlcnRleChkcm1fZGV2aWNlX3QgKmRldiwgCisJCQkJICAgICBkcm1fYnVmX3QgKmJ1ZiwKKwkJCQkgICAgIGludCBkaXNjYXJkLAorCQkJCSAgICAgaW50IHVzZWQpCit7CisgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworICAgCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKyAgIAlkcm1fY2xpcF9yZWN0X3QgKmJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworICAgCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylidWYtPmJ1c19hZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyZXNzIC0gZGV2LT5hZ3AtPmJhc2U7ICAgICAKKwlpbnQgaSA9IDAsIHU7CisgICAJUklOR19MT0NBTFM7CisKKyAgIAlpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworICAgCWlmIChuYm94ID4gSTgzMF9OUl9TQVJFQV9DTElQUkVDVFMpIAorCQluYm94ID0gSTgzMF9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlpZiAoZGlzY2FyZCkgeworCQl1ID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9DTElFTlQsIAorCQkJICAgIEk4MzBfQlVGX0hBUkRXQVJFKTsKKwkJaWYodSAhPSBJODMwX0JVRl9DTElFTlQpIHsKKwkJCURSTV9ERUJVRygieHh4eCAyXG4iKTsKKwkJfQorCX0KKworCWlmICh1c2VkID4gNCoxMDIzKSAKKwkJdXNlZCA9IDA7CisKKwlpZiAoc2FyZWFfcHJpdi0+ZGlydHkpCisJICAgaTgzMEVtaXRTdGF0ZSggZGV2ICk7CisKKyAgCURSTV9ERUJVRygiZGlzcGF0Y2ggdmVydGV4IGFkZHIgMHglbHgsIHVzZWQgMHgleCBuYm94ICVkXG4iLCAKKwkJICBhZGRyZXNzLCB1c2VkLCBuYm94KTsKKworICAgCWRldl9wcml2LT5jb3VudGVyKys7CisgICAJRFJNX0RFQlVHKCAgImRpc3BhdGNoIGNvdW50ZXIgOiAlbGRcbiIsIGRldl9wcml2LT5jb3VudGVyKTsKKyAgIAlEUk1fREVCVUcoICAiaTgzMF9kbWFfZGlzcGF0Y2hcbiIpOworICAgCURSTV9ERUJVRyggICJzdGFydCA6ICVseFxuIiwgc3RhcnQpOworCURSTV9ERUJVRyggICJ1c2VkIDogJWRcbiIsIHVzZWQpOworICAgCURSTV9ERUJVRyggICJzdGFydCArIHVzZWQgLSA0IDogJWxkXG4iLCBzdGFydCArIHVzZWQgLSA0KTsKKworCWlmIChidWZfcHJpdi0+Y3VycmVudGx5X21hcHBlZCA9PSBJODMwX0JVRl9NQVBQRUQpIHsKKwkJdTMyICp2cCA9IGJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbDsKKworCQl2cFswXSA9IChHRlhfT1BfUFJJTUlUSVZFIHwKKwkJCXNhcmVhX3ByaXYtPnZlcnRleF9wcmltIHwKKwkJCSgodXNlZC80KS0yKSk7CisKKwkJaWYgKGRldl9wcml2LT51c2VfbWlfYmF0Y2hidWZmZXJfc3RhcnQpIHsKKwkJCXZwW3VzZWQvNF0gPSBNSV9CQVRDSF9CVUZGRVJfRU5EOworCQkJdXNlZCArPSA0OyAKKwkJfQorCQkKKwkJaWYgKHVzZWQgJiA0KSB7CisJCQl2cFt1c2VkLzRdID0gMDsKKwkJCXVzZWQgKz0gNDsKKwkJfQorCisJCWk4MzBfdW5tYXBfYnVmZmVyKGJ1Zik7CisJfQorCQkgICAKKwlpZiAodXNlZCkgeworCQlkbyB7CisJCQlpZiAoaSA8IG5ib3gpIHsKKwkJCQlCRUdJTl9MUF9SSU5HKDYpOworCQkJCU9VVF9SSU5HKCBHRlhfT1BfRFJBV1JFQ1RfSU5GTyApOworCQkJCU9VVF9SSU5HKCBzYXJlYV9wcml2LT5CdWZmZXJTdGF0ZVtJODMwX0RFU1RSRUdfRFIxXSApOworCQkJCU9VVF9SSU5HKCBib3hbaV0ueDEgfCAoYm94W2ldLnkxPDwxNikgKTsKKwkJCQlPVVRfUklORyggYm94W2ldLngyIHwgKGJveFtpXS55Mjw8MTYpICk7CisJCQkJT1VUX1JJTkcoIHNhcmVhX3ByaXYtPkJ1ZmZlclN0YXRlW0k4MzBfREVTVFJFR19EUjRdICk7CisJCQkJT1VUX1JJTkcoIDAgKTsKKwkJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJCX0KKworCQkJaWYgKGRldl9wcml2LT51c2VfbWlfYmF0Y2hidWZmZXJfc3RhcnQpIHsKKwkJCQlCRUdJTl9MUF9SSU5HKDIpOworCQkJCU9VVF9SSU5HKCBNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCAoMjw8NikgKTsKKwkJCQlPVVRfUklORyggc3RhcnQgfCBNSV9CQVRDSF9OT05fU0VDVVJFICk7CisJCQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCQl9IAorCQkJZWxzZSB7CisJCQkJQkVHSU5fTFBfUklORyg0KTsKKwkJCQlPVVRfUklORyggTUlfQkFUQ0hfQlVGRkVSICk7CisJCQkJT1VUX1JJTkcoIHN0YXJ0IHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRSApOworCQkJCU9VVF9SSU5HKCBzdGFydCArIHVzZWQgLSA0ICk7CisJCQkJT1VUX1JJTkcoIDAgKTsKKwkJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJCX0KKworCQl9IHdoaWxlICgrK2kgPCBuYm94KTsKKwl9CisKKwlpZiAoZGlzY2FyZCkgeworCQlkZXZfcHJpdi0+Y291bnRlcisrOworCisJCSh2b2lkKSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MzBfQlVGX0NMSUVOVCwKKwkJCSAgICAgICBJODMwX0JVRl9IQVJEV0FSRSk7CisKKwkJQkVHSU5fTFBfUklORyg4KTsKKwkJT1VUX1JJTkcoIENNRF9TVE9SRV9EV09SRF9JRFggKTsKKwkJT1VUX1JJTkcoIDIwICk7CisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+Y291bnRlciApOworCQlPVVRfUklORyggQ01EX1NUT1JFX0RXT1JEX0lEWCApOworCQlPVVRfUklORyggYnVmX3ByaXYtPm15X3VzZV9pZHggKTsKKwkJT1VUX1JJTkcoIEk4MzBfQlVGX0ZSRUUgKTsKKwkJT1VUX1JJTkcoIENNRF9SRVBPUlRfSEVBRCApOworCQlPVVRfUklORyggMCApOworCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgaTgzMF9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqZGV2KQoreworICAgICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgCVJJTkdfTE9DQUxTOworCisgIAlpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworICAgCUJFR0lOX0xQX1JJTkcoNCk7CisgICAJT1VUX1JJTkcoIElOU1RfUEFSU0VSX0NMSUVOVCB8IElOU1RfT1BfRkxVU0ggfCBJTlNUX0ZMVVNIX01BUF9DQUNIRSApOworICAgCU9VVF9SSU5HKCBDTURfUkVQT1JUX0hFQUQgKTsKKyAgICAgIAlPVVRfUklORyggMCApOworICAgICAgCU9VVF9SSU5HKCAwICk7CisgICAJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlpODMwX3dhaXRfcmluZyggZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCwgX19GVU5DVElPTl9fICk7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9mbHVzaF9xdWV1ZShkcm1fZGV2aWNlX3QgKmRldikKK3sKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKyAgIAlpbnQgaSwgcmV0ID0gMDsKKyAgIAlSSU5HX0xPQ0FMUzsKKwkKKyAgIAlpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworICAgCUJFR0lOX0xQX1JJTkcoMik7CisgICAgICAJT1VUX1JJTkcoIENNRF9SRVBPUlRfSEVBRCApOworICAgICAgCU9VVF9SSU5HKCAwICk7CisgICAgICAJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlpODMwX3dhaXRfcmluZyggZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCwgX19GVU5DVElPTl9fICk7CisKKyAgIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCSAgIAlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCSAgIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJICAgCisJCWludCB1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9IQVJEV0FSRSwgCisJCQkJICAgSTgzMF9CVUZfRlJFRSk7CisKKwkJaWYgKHVzZWQgPT0gSTgzMF9CVUZfSEFSRFdBUkUpCisJCQlEUk1fREVCVUcoInJlY2xhaW1lZCBmcm9tIEhBUkRXQVJFXG4iKTsKKwkJaWYgKHVzZWQgPT0gSTgzMF9CVUZfQ0xJRU5UKQorCQkJRFJNX0RFQlVHKCJzdGlsbCBvbiBjbGllbnRcbiIpOworCX0KKworICAgCXJldHVybiByZXQ7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCAqLwordm9pZCBpODMwX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJaW50CQkgaTsKKworCWlmICghZG1hKSByZXR1cm47CisgICAgICAJaWYgKCFkZXYtPmRldl9wcml2YXRlKSByZXR1cm47CisJaWYgKCFkbWEtPmJ1Zmxpc3QpIHJldHVybjsKKworICAgICAgICBpODMwX2ZsdXNoX3F1ZXVlKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgeworCSAgIAlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFsgaSBdOworCSAgIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJICAgCisJCWlmIChidWYtPmZpbHAgPT0gZmlscCAmJiBidWZfcHJpdikgeworCQkJaW50IHVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MzBfQlVGX0NMSUVOVCwgCisJCQkJCSAgIEk4MzBfQlVGX0ZSRUUpOworCisJCQlpZiAodXNlZCA9PSBJODMwX0JVRl9DTElFTlQpCisJCQkJRFJNX0RFQlVHKCJyZWNsYWltZWQgZnJvbSBjbGllbnRcbiIpOworCQkgICAJaWYoYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPT0gSTgzMF9CVUZfTUFQUEVEKQorCQkgICAgIAkJYnVmX3ByaXYtPmN1cnJlbnRseV9tYXBwZWQgPSBJODMwX0JVRl9VTk1BUFBFRDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBpODMwX2ZsdXNoX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCAKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAJZHJtX2ZpbGVfdAkgICpwcml2CSAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisgICAJZHJtX2RldmljZV90CSAgKmRldgkgID0gcHJpdi0+aGVhZC0+ZGV2OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKyAgIAlpODMwX2ZsdXNoX3F1ZXVlKGRldik7CisgICAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9kbWFfdmVydGV4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKyAgIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisgICAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopIAorICAgICAJCQkJCWRldl9wcml2LT5zYXJlYV9wcml2OyAKKwlkcm1faTgzMF92ZXJ0ZXhfdCB2ZXJ0ZXg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnZlcnRleCwgKGRybV9pODMwX3ZlcnRleF90IF9fdXNlciAqKWFyZywgc2l6ZW9mKHZlcnRleCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJRFJNX0RFQlVHKCJpODMwIGRtYSB2ZXJ0ZXgsIGlkeCAlZCB1c2VkICVkIGRpc2NhcmQgJWRcbiIsCisJCSAgdmVydGV4LmlkeCwgdmVydGV4LnVzZWQsIHZlcnRleC5kaXNjYXJkKTsKKworCWlmKHZlcnRleC5pZHggPCAwIHx8IHZlcnRleC5pZHggPiBkbWEtPmJ1Zl9jb3VudCkgcmV0dXJuIC1FSU5WQUw7CisKKwlpODMwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoIGRldiwgCisJCQkJICBkbWEtPmJ1Zmxpc3RbIHZlcnRleC5pZHggXSwgCisJCQkJICB2ZXJ0ZXguZGlzY2FyZCwgdmVydGV4LnVzZWQgKTsKKworCXNhcmVhX3ByaXYtPmxhc3RfZW5xdWV1ZSA9IGRldl9wcml2LT5jb3VudGVyLTE7CisgICAJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpIGh3X3N0YXR1c1s1XTsKKyAgIAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfY2xlYXJfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfY2xlYXJfdCBjbGVhcjsKKworICAgCWlmIChjb3B5X2Zyb21fdXNlcigmY2xlYXIsIChkcm1faTgzMF9jbGVhcl90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGNsZWFyKSkpCisJCXJldHVybiAtRUZBVUxUOworICAgCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwkvKiBHSDogU29tZW9uZSdzIGRvaW5nIG5hc3R5IHRoaW5ncy4uLiAqLworCWlmICghZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpODMwX2RtYV9kaXNwYXRjaF9jbGVhciggZGV2LCBjbGVhci5mbGFncywgCisJCQkJIGNsZWFyLmNsZWFyX2NvbG9yLCAKKwkJCQkgY2xlYXIuY2xlYXJfZGVwdGgsCisJCQkgICAgICAgICBjbGVhci5jbGVhcl9kZXB0aG1hc2spOworICAgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfc3dhcF9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworICAgCisJRFJNX0RFQlVHKCJpODMwX3N3YXBfYnVmc1xuIik7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWk4MzBfZG1hX2Rpc3BhdGNoX3N3YXAoIGRldiApOworICAgCXJldHVybiAwOworfQorCisKKworLyogTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3Qgc2V0IGFsbCB0aGUgdGltZToKKyAqLyAKK3N0YXRpYyB2b2lkIGk4MzBfZG9faW5pdF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyA9IDE7CisJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDA7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9kb19jbGVhbnVwX3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlICE9IDApCisJCWk4MzBfZG1hX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MzBfZmxpcF9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWlmICghZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIAorCQlpODMwX2RvX2luaXRfcGFnZWZsaXAoIGRldiApOworCisJaTgzMF9kbWFfZGlzcGF0Y2hfZmxpcCggZGV2ICk7CisgICAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9nZXRhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgIAlkcm1fZmlsZV90CSAgKnByaXYJICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRybV9kZXZpY2VfdAkgICpkZXYJICAgID0gcHJpdi0+aGVhZC0+ZGV2OworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKyAgIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODMwX3NhcmVhX3QgKikgCisgICAgIAkJCQkJZGV2X3ByaXYtPnNhcmVhX3ByaXY7IAorCisgICAgICAJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpIGh3X3N0YXR1c1s1XTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpODMwX2dldGJ1ZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJaW50CQkgIHJldGNvZGUgICA9IDA7CisJZHJtX2k4MzBfZG1hX3QJICBkOworICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKyAgIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKKyAgIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODMwX3NhcmVhX3QgKikgCisgICAgIAkJCQkJZGV2X3ByaXYtPnNhcmVhX3ByaXY7IAorCisJRFJNX0RFQlVHKCJnZXRidWZcbiIpOworICAgCWlmIChjb3B5X2Zyb21fdXNlcigmZCwgKGRybV9pODMwX2RtYV90IF9fdXNlciAqKWFyZywgc2l6ZW9mKGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisgICAKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKwkKKwlkLmdyYW50ZWQgPSAwOworCisJcmV0Y29kZSA9IGk4MzBfZG1hX2dldF9idWZmZXIoZGV2LCAmZCwgZmlscCk7CisKKwlEUk1fREVCVUcoImk4MzBfZG1hOiAlZCByZXR1cm5pbmcgJWQsIGdyYW50ZWQgPSAlZFxuIiwKKwkJICBjdXJyZW50LT5waWQsIHJldGNvZGUsIGQuZ3JhbnRlZCk7CisKKwlpZiAoY29weV90b191c2VyKChkcm1fZG1hX3QgX191c2VyICopYXJnLCAmZCwgc2l6ZW9mKGQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisgICAJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpIGh3X3N0YXR1c1s1XTsKKworCXJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgaW50IGk4MzBfY29weWJ1ZihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBOZXZlciBjb3B5IC0gMi40LnggZG9lc24ndCBuZWVkIGl0ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9kb2NvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgaTgzMF9nZXRwYXJhbSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MzBfZ2V0cGFyYW1fdCBwYXJhbTsKKwlpbnQgdmFsdWU7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnBhcmFtLCAoZHJtX2k4MzBfZ2V0cGFyYW1fdCBfX3VzZXIgKilhcmcsIHNpemVvZihwYXJhbSkgKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2goIHBhcmFtLnBhcmFtICkgeworCWNhc2UgSTgzMF9QQVJBTV9JUlFfQUNUSVZFOgorCQl2YWx1ZSA9IGRldi0+aXJxX2VuYWJsZWQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICggY29weV90b191c2VyKCBwYXJhbS52YWx1ZSwgJnZhbHVlLCBzaXplb2YoaW50KSApICkgeworCQlEUk1fRVJST1IoICJjb3B5X3RvX3VzZXJcbiIgKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaTgzMF9zZXRwYXJhbSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdAkgICpwcml2CSAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgICA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTgzMF9zZXRwYXJhbV90IHBhcmFtOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJhbSwgKGRybV9pODMwX3NldHBhcmFtX3QgX191c2VyICopYXJnLCBzaXplb2YocGFyYW0pICkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoKCBwYXJhbS5wYXJhbSApIHsKKwljYXNlIEk4MzBfU0VUUEFSQU1fVVNFX01JX0JBVENIQlVGRkVSX1NUQVJUOgorCQlkZXZfcHJpdi0+dXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0ID0gcGFyYW0udmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgaTgzMF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpCit7CisJaTgzMF9kbWFfY2xlYW51cCggZGV2ICk7Cit9CisKK3ZvaWQgaTgzMF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKQoreworCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CisJCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQlpZiAoZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIHsKKwkJCWk4MzBfZG9fY2xlYW51cF9wYWdlZmxpcChkZXYpOworCQl9CisJfQorfQorCit2b2lkIGk4MzBfZHJpdmVyX3JlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWk4MzBfcmVjbGFpbV9idWZmZXJzKGRldiwgZmlscCk7Cit9CisKK2ludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWk4MzBfZG1hX3F1aWVzY2VudCggZGV2ICk7CisJcmV0dXJuIDA7Cit9CisKK2RybV9pb2N0bF9kZXNjX3QgaTgzMF9pb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0lOSVQpXSAgICAgPSB7IGk4MzBfZG1hX2luaXQsICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX1ZFUlRFWCldICAgPSB7IGk4MzBfZG1hX3ZlcnRleCwgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0NMRUFSKV0gICAgPSB7IGk4MzBfY2xlYXJfYnVmcywgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0ZMVVNIKV0gICAgPSB7IGk4MzBfZmx1c2hfaW9jdGwsIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0dFVEFHRSldICAgPSB7IGk4MzBfZ2V0YWdlLCAgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0dFVEJVRildICAgPSB7IGk4MzBfZ2V0YnVmLCAgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX1NXQVApXSAgICAgPSB7IGk4MzBfc3dhcF9idWZzLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0NPUFkpXSAgICAgPSB7IGk4MzBfY29weWJ1ZiwgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0RPQ09QWSldICAgPSB7IGk4MzBfZG9jb3B5LCAgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0ZMSVApXSAgICAgPSB7IGk4MzBfZmxpcF9idWZzLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0lSUV9FTUlUKV0gPSB7IGk4MzBfaXJxX2VtaXQsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0lSUV9XQUlUKV0gPSB7IGk4MzBfaXJxX3dhaXQsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0dFVFBBUkFNKV0gPSB7IGk4MzBfZ2V0cGFyYW0sICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX1NFVFBBUkFNKV0gPSB7IGk4MzBfc2V0cGFyYW0sICAgIDEsIDAgfSAKK307CisKK2ludCBpODMwX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk4MzBfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzM4MmMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RybS5oCkBAIC0wLDAgKzEsMzUwIEBACisjaWZuZGVmIF9JODMwX0RSTV9IXworI2RlZmluZSBfSTgzMF9EUk1fSF8KKworLyogV0FSTklORzogVGhlc2UgZGVmaW5lcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHdoYXQgdGhlIFhzZXJ2ZXIgdXNlcy4KKyAqIGlmIHlvdSBjaGFuZ2UgdGhlbSwgeW91IG11c3QgY2hhbmdlIHRoZSBkZWZpbmVzIGluIHRoZSBYc2VydmVyLgorICoKKyAqIEtXOiBBY3R1YWxseSwgeW91IGNhbid0IGV2ZXIgY2hhbmdlIHRoZW0gYmVjYXVzZSBkb2luZyBzbyB3b3VsZAorICogYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKi8KKworI2lmbmRlZiBfSTgzMF9ERUZJTkVTXworI2RlZmluZSBfSTgzMF9ERUZJTkVTXworCisjZGVmaW5lIEk4MzBfRE1BX0JVRl9PUkRFUgkJMTIKKyNkZWZpbmUgSTgzMF9ETUFfQlVGX1NaIAkJKDE8PEk4MzBfRE1BX0JVRl9PUkRFUikKKyNkZWZpbmUgSTgzMF9ETUFfQlVGX05SIAkJMjU2CisjZGVmaW5lIEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTIAk4CisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtLgorICovCisjZGVmaW5lIEk4MzBfTlJfVEVYX1JFR0lPTlMgNjQKKyNkZWZpbmUgSTgzMF9MT0dfTUlOX1RFWF9SRUdJT05fU0laRSAxNgorCisvKiBLVzogVGhlc2UgYXJlbid0IGNvcnJlY3QgYnV0IHNvbWVvbmUgc2V0IHRoZW0gdG8gdHdvIGFuZCB0aGVuCisgKiByZWxlYXNlZCB0aGUgbW9kdWxlLiAgTm93IHdlIGNhbid0IGNoYW5nZSB0aGVtIGFzIGRvaW5nIHNvIHdvdWxkCisgKiBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBJODMwX1RFWFRVUkVfQ09VTlQJMgorI2RlZmluZSBJODMwX1RFWEJMRU5EX0NPVU5UCUk4MzBfVEVYVFVSRV9DT1VOVAorCisjZGVmaW5lIEk4MzBfVEVYQkxFTkRfU0laRQkxMgkvKiAoNCBhcmdzICsgb3ApICogMiArIENPTE9SX0ZBQ1RPUiAqLworCisjZGVmaW5lIEk4MzBfVVBMT0FEX0NUWAkJCTB4MQorI2RlZmluZSBJODMwX1VQTE9BRF9CVUZGRVJTCQkweDIKKyNkZWZpbmUgSTgzMF9VUExPQURfQ0xJUFJFQ1RTCQkweDQKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYMF9JTUFHRQkJMHgxMDAgLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDBfQ1VCRQkJMHgyMDAgLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDFfSU1BR0UJCTB4NDAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgxX0NVQkUJCTB4ODAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgyX0lNQUdFCQkweDEwMDAgLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDJfQ1VCRQkJMHgyMDAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVgzX0lNQUdFCQkweDQwMDAgLyogaGFuZGxlZCBjbGllbnRzaWRlICovCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWDNfQ1VCRQkJMHg4MDAwIC8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODMwX1VQTE9BRF9URVhfTl9JTUFHRShuKQkoMHgxMDAgPDwgKG4gKiAyKSkKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYX05fQ1VCRShuKQkoMHgyMDAgPDwgKG4gKiAyKSkKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYSU1BR0VfTUFTSwkweGZmMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYMAkJCTB4MTAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYMQkJCTB4MjAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYMgkJCTB4NDAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYMwkJCTB4ODAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYX04obikJCSgweDEwMDAwIDw8IChuKSkKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYX01BU0sJCTB4ZjAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYQkxFTkQwCQkweDEwMDAwMAorI2RlZmluZSBJODMwX1VQTE9BRF9URVhCTEVORDEJCTB4MjAwMDAwCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWEJMRU5EMgkJMHg0MDAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYQkxFTkQzCQkweDgwMDAwMAorI2RlZmluZSBJODMwX1VQTE9BRF9URVhCTEVORF9OKG4pCSgweDEwMDAwMCA8PCAobikpCisjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWEJMRU5EX01BU0sJMHhmMDAwMDAKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYX1BBTEVUVEVfTihuKSAgICAoMHgxMDAwMDAwIDw8IChuKSkKKyNkZWZpbmUgSTgzMF9VUExPQURfVEVYX1BBTEVUVEVfU0hBUkVECTB4NDAwMDAwMAorI2RlZmluZSBJODMwX1VQTE9BRF9TVElQUExFICAgICAgICAgCTB4ODAwMDAwMAorCisvKiBJbmRpY2VzIGludG8gYnVmLlNldHVwIHdoZXJlIHZhcmlvdXMgYml0cyBvZiBzdGF0ZSBhcmUgbWlycm9yZWQgcGVyCisgKiBjb250ZXh0IGFuZCBwZXIgYnVmZmVyLiAgVGhlc2UgY2FuIGJlIGZpcmVkIGF0IHRoZSBjYXJkIGFzIGEgdW5pdCwKKyAqIG9yIGluIGEgcGllY2V3aXNlIGZhc2hpb24gYXMgcmVxdWlyZWQuCisgKi8KKworLyogRGVzdGJ1ZmZlciBzdGF0ZSAKKyAqICAgIC0gYmFja2J1ZmZlciBsaW5lYXIgb2Zmc2V0IGFuZCBwaXRjaCAtLSBpbnZhcmllbnQgaW4gdGhlIGN1cnJlbnQgZHJpCisgKiAgICAtIHpidWZmZXIgbGluZWFyIG9mZnNldCBhbmQgcGl0Y2ggLS0gYWxzbyBpbnZhcmllbnQKKyAqICAgIC0gZHJhd2luZyBvcmlnaW4gaW4gYmFjayBhbmQgZGVwdGggYnVmZmVycy4KKyAqCisgKiBLZWVwIHRoZSBkZXB0aC9iYWNrIGJ1ZmZlciBzdGF0ZSBoZXJlIHRvIGFjY29tbW9kYXRlIHByaXZhdGUgYnVmZmVycworICogaW4gdGhlIGZ1dHVyZS4KKyAqLworCisjZGVmaW5lIEk4MzBfREVTVFJFR19DQlVGQUREUiAwCisjZGVmaW5lIEk4MzBfREVTVFJFR19EQlVGQUREUiAxCisjZGVmaW5lIEk4MzBfREVTVFJFR19EVjAgMgorI2RlZmluZSBJODMwX0RFU1RSRUdfRFYxIDMKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX1NFTkFCTEUgNAorI2RlZmluZSBJODMwX0RFU1RSRUdfU1IwIDUKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX1NSMSA2CisjZGVmaW5lIEk4MzBfREVTVFJFR19TUjIgNworI2RlZmluZSBJODMwX0RFU1RSRUdfRFIwIDgKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX0RSMSA5CisjZGVmaW5lIEk4MzBfREVTVFJFR19EUjIgMTAKKyNkZWZpbmUgSTgzMF9ERVNUUkVHX0RSMyAxMQorI2RlZmluZSBJODMwX0RFU1RSRUdfRFI0IDEyCisjZGVmaW5lIEk4MzBfREVTVF9TRVRVUF9TSVpFIDEzCisKKy8qIENvbnRleHQgc3RhdGUKKyAqLworI2RlZmluZSBJODMwX0NUWFJFR19TVEFURTEJCTAKKyNkZWZpbmUgSTgzMF9DVFhSRUdfU1RBVEUyCQkxCisjZGVmaW5lIEk4MzBfQ1RYUkVHX1NUQVRFMwkJMgorI2RlZmluZSBJODMwX0NUWFJFR19TVEFURTQJCTMKKyNkZWZpbmUgSTgzMF9DVFhSRUdfU1RBVEU1CQk0CisjZGVmaW5lIEk4MzBfQ1RYUkVHX0lBTFBIQUIJCTUKKyNkZWZpbmUgSTgzMF9DVFhSRUdfU1RFTkNJTFRTVAkJNgorI2RlZmluZSBJODMwX0NUWFJFR19FTkFCTEVTXzEJCTcKKyNkZWZpbmUgSTgzMF9DVFhSRUdfRU5BQkxFU18yCQk4CisjZGVmaW5lIEk4MzBfQ1RYUkVHX0FBCQkJOQorI2RlZmluZSBJODMwX0NUWFJFR19GT0dDT0xPUgkJMTAKKyNkZWZpbmUgSTgzMF9DVFhSRUdfQkxFTkRDT0xSMAkJMTEKKyNkZWZpbmUgSTgzMF9DVFhSRUdfQkxFTkRDT0xSCQkxMiAvKiBEd29yZCAxIG9mIDIgZHdvcmQgY29tbWFuZCAqLworI2RlZmluZSBJODMwX0NUWFJFR19WRgkJCTEzCisjZGVmaW5lIEk4MzBfQ1RYUkVHX1ZGMgkJCTE0CisjZGVmaW5lIEk4MzBfQ1RYUkVHX01DU0IwCQkxNQorI2RlZmluZSBJODMwX0NUWFJFR19NQ1NCMQkJMTYKKyNkZWZpbmUgSTgzMF9DVFhfU0VUVVBfU0laRQkJMTcKKworLyogMS4zOiBTdGlwcGxlIHN0YXRlCisgKi8gCisjZGVmaW5lIEk4MzBfU1RQUkVHX1NUMCAwCisjZGVmaW5lIEk4MzBfU1RQUkVHX1NUMSAxCisjZGVmaW5lIEk4MzBfU1RQX1NFVFVQX1NJWkUgMgorCisKKy8qIFRleHR1cmUgc3RhdGUgKHBlciB0ZXggdW5pdCkKKyAqLworCisjZGVmaW5lIEk4MzBfVEVYUkVHX01JMAkwCS8qIEdGWF9PUF9NQVBfSU5GTyAoNiBkd29yZHMpICovCisjZGVmaW5lIEk4MzBfVEVYUkVHX01JMQkxCisjZGVmaW5lIEk4MzBfVEVYUkVHX01JMgkyCisjZGVmaW5lIEk4MzBfVEVYUkVHX01JMwkzCisjZGVmaW5lIEk4MzBfVEVYUkVHX01JNAk0CisjZGVmaW5lIEk4MzBfVEVYUkVHX01JNQk1CisjZGVmaW5lIEk4MzBfVEVYUkVHX01GCTYJLyogR0ZYX09QX01BUF9GSUxURVIgKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfTUxDCTcJLyogR0ZYX09QX01BUF9MT0RfQ1RMICovCisjZGVmaW5lIEk4MzBfVEVYUkVHX01MTAk4CS8qIEdGWF9PUF9NQVBfTE9EX0xJTUlUUyAqLworI2RlZmluZSBJODMwX1RFWFJFR19NQ1MJOQkvKiBHRlhfT1BfTUFQX0NPT1JEX1NFVFMgKi8KKyNkZWZpbmUgSTgzMF9URVhfU0VUVVBfU0laRSAxMAorCisjZGVmaW5lIEk4MzBfVEVYUkVHX1RNMExJICAgICAgMCAvKiBsb2FkIGltbWVkaWF0ZSAyIHRleHR1cmUgbWFwIG4gKi8KKyNkZWZpbmUgSTgzMF9URVhSRUdfVE0wUzAgICAgICAxCisjZGVmaW5lIEk4MzBfVEVYUkVHX1RNMFMxICAgICAgMgorI2RlZmluZSBJODMwX1RFWFJFR19UTTBTMiAgICAgIDMKKyNkZWZpbmUgSTgzMF9URVhSRUdfVE0wUzMgICAgICA0CisjZGVmaW5lIEk4MzBfVEVYUkVHX1RNMFM0ICAgICAgNQorI2RlZmluZSBJODMwX1RFWFJFR19OT1AwICAgICAgIDYgICAgICAgLyogbm9vcCAqLworI2RlZmluZSBJODMwX1RFWFJFR19OT1AxICAgICAgIDcgICAgICAgLyogbm9vcCAqLworI2RlZmluZSBJODMwX1RFWFJFR19OT1AyICAgICAgIDggICAgICAgLyogbm9vcCAqLworI2RlZmluZSBfX0k4MzBfVEVYUkVHX01DUyAgICAgIDkgICAgICAgLyogR0ZYX09QX01BUF9DT09SRF9TRVRTIC0tIHNoYXJlZCAqLworI2RlZmluZSBfX0k4MzBfVEVYX1NFVFVQX1NJWkUgICAxMAorCisjZGVmaW5lIEk4MzBfRlJPTlQgICAweDEKKyNkZWZpbmUgSTgzMF9CQUNLICAgIDB4MgorI2RlZmluZSBJODMwX0RFUFRIICAgMHg0CisKKyNlbmRpZiAvKiBfSTgzMF9ERUZJTkVTXyAqLworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MzBfaW5pdCB7CisJZW51bSB7CisJCUk4MzBfSU5JVF9ETUEgPSAweDAxLAorCQlJODMwX0NMRUFOVVBfRE1BID0gMHgwMgorCX0gZnVuYzsKKwl1bnNpZ25lZCBpbnQgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGJ1ZmZlcnNfb2Zmc2V0OworCWludCBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zdGFydDsKKwl1bnNpZ25lZCBpbnQgcmluZ19lbmQ7CisJdW5zaWduZWQgaW50IHJpbmdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCB3OworCXVuc2lnbmVkIGludCBoOworCXVuc2lnbmVkIGludCBwaXRjaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2hfYml0czsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IGNwcDsKK30gZHJtX2k4MzBfaW5pdF90OworCisvKiBXYXJuaW5nOiBJZiB5b3UgY2hhbmdlIHRoZSBTQVJFQSBzdHJ1Y3R1cmUgeW91IG11c3QgY2hhbmdlIHRoZSBYc2VydmVyCisgKiBzdHJ1Y3R1cmUgYXMgd2VsbCAqLworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MzBfdGV4X3JlZ2lvbiB7CisJdW5zaWduZWQgY2hhciBuZXh0LCBwcmV2OyAvKiBpbmRpY2VzIHRvIGZvcm0gYSBjaXJjdWxhciBMUlUgICovCisJdW5zaWduZWQgY2hhciBpbl91c2U7CS8qIG93bmVkIGJ5IGEgY2xpZW50LCBvciBmcmVlPyAqLworCWludCBhZ2U7CQkvKiB0cmFja2VkIGJ5IGNsaWVudHMgdG8gdXBkYXRlIGxvY2FsIExSVSdzICovCit9IGRybV9pODMwX3RleF9yZWdpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX3NhcmVhIHsKKwl1bnNpZ25lZCBpbnQgQ29udGV4dFN0YXRlW0k4MzBfQ1RYX1NFVFVQX1NJWkVdOworICAgCXVuc2lnbmVkIGludCBCdWZmZXJTdGF0ZVtJODMwX0RFU1RfU0VUVVBfU0laRV07CisJdW5zaWduZWQgaW50IFRleFN0YXRlW0k4MzBfVEVYVFVSRV9DT1VOVF1bSTgzMF9URVhfU0VUVVBfU0laRV07CisJdW5zaWduZWQgaW50IFRleEJsZW5kU3RhdGVbSTgzMF9URVhCTEVORF9DT1VOVF1bSTgzMF9URVhCTEVORF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgVGV4QmxlbmRTdGF0ZVdvcmRzVXNlZFtJODMwX1RFWEJMRU5EX0NPVU5UXTsKKwl1bnNpZ25lZCBpbnQgUGFsZXR0ZVsyXVsyNTZdOworICAgCXVuc2lnbmVkIGludCBkaXJ0eTsKKworCXVuc2lnbmVkIGludCBuYm94OworCWRybV9jbGlwX3JlY3RfdCBib3hlc1tJODMwX05SX1NBUkVBX0NMSVBSRUNUU107CisKKwkvKiBNYWludGFpbiBhbiBMUlUgb2YgY29udGlndW91cyByZWdpb25zIG9mIHRleHR1cmUgc3BhY2UuICBJZgorCSAqIHlvdSB0aGluayB5b3Ugb3duIGEgcmVnaW9uIG9mIHRleHR1cmUgbWVtb3J5LCBhbmQgaXQgaGFzIGFuCisJICogYWdlIGRpZmZlcmVudCB0byB0aGUgb25lIHlvdSBzZXQsIHRoZW4geW91IGFyZSBtaXN0YWtlbiBhbmQKKwkgKiBpdCBoYXMgYmVlbiBzdG9sZW4gYnkgYW5vdGhlciBjbGllbnQuICBJZiBnbG9iYWwgdGV4QWdlCisJICogaGFzbid0IGNoYW5nZWQsIHRoZXJlIGlzIG5vIG5lZWQgdG8gd2FsayB0aGUgbGlzdC4KKwkgKgorCSAqIFRoZXNlIHJlZ2lvbnMgY2FuIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgdGhlIGZpbmUtZ3JhaW5lZAorCSAqIHRleHR1cmUgaW5mb3JtYXRpb24gb2Ygb3RoZXIgY2xpZW50cyAtIGJ5IG1haW50YWluaW5nIHRoZW0KKwkgKiBpbiB0aGUgc2FtZSBscnUgd2hpY2ggaXMgdXNlZCB0byBhZ2UgdGhlaXIgb3duIHRleHR1cmVzLAorCSAqIGNsaWVudHMgaGF2ZSBhbiBhcHByb3hpbWF0ZSBscnUgZm9yIHRoZSB3aG9sZSBvZiBnbG9iYWwKKwkgKiB0ZXh0dXJlIHNwYWNlLCBhbmQgY2FuIG1ha2UgaW5mb3JtZWQgZGVjaXNpb25zIGFzIHRvIHdoaWNoCisJICogYXJlYXMgdG8ga2ljayBvdXQuICBUaGVyZSBpcyBubyBuZWVkIHRvIGNob29zZSB3aGV0aGVyIHRvCisJICoga2ljayBvdXQgeW91ciBvd24gdGV4dHVyZSBvciBzb21lb25lIGVsc2UncyAtIHNpbXBseSBlamVjdAorCSAqIHRoZW0gYWxsIGluIExSVSBvcmRlci4gIAorCSAqLworCisJZHJtX2k4MzBfdGV4X3JlZ2lvbl90IHRleExpc3RbSTgzMF9OUl9URVhfUkVHSU9OUysxXTsgCisJCQkJLyogTGFzdCBlbHQgaXMgc2VudGluYWwgKi8KKyAgICAgICAgaW50IHRleEFnZTsJCS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLworICAgICAgICBpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCWludCBsYXN0X3F1aWVzY2VudDsgICAgIC8qICAqLworCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KKworCWludCB2ZXJ0ZXhfcHJpbTsKKworICAgICAgICBpbnQgcGZfZW5hYmxlZDsgICAgICAgICAgICAgICAvKiBpcyBwYWdlZmxpcHBpbmcgYWxsb3dlZD8gKi8KKyAgICAgICAgaW50IHBmX2FjdGl2ZTsgICAgICAgICAgICAgICAKKyAgICAgICAgaW50IHBmX2N1cnJlbnRfcGFnZTsJICAgIC8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCisKKyAgICAgICAgaW50IHBlcmZfYm94ZXM7ICAgICAgICAgICAgIC8qIHBlcmZvcm1hbmNlIGJveGVzIHRvIGJlIGRpc3BsYXllZCAqLworICAgCisgICAgICAgIC8qIEhlcmUncyB0aGUgc3RhdGUgZm9yIHRleHVuaXRzIDIsMzoKKwkgKi8KKwl1bnNpZ25lZCBpbnQgVGV4U3RhdGUyW0k4MzBfVEVYX1NFVFVQX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhCbGVuZFN0YXRlMltJODMwX1RFWEJMRU5EX1NJWkVdOworCXVuc2lnbmVkIGludCBUZXhCbGVuZFN0YXRlV29yZHNVc2VkMjsKKworCXVuc2lnbmVkIGludCBUZXhTdGF0ZTNbSTgzMF9URVhfU0VUVVBfU0laRV07CisJdW5zaWduZWQgaW50IFRleEJsZW5kU3RhdGUzW0k4MzBfVEVYQkxFTkRfU0laRV07CisJdW5zaWduZWQgaW50IFRleEJsZW5kU3RhdGVXb3Jkc1VzZWQzOworCisJdW5zaWduZWQgaW50IFN0aXBwbGVTdGF0ZVtJODMwX1NUUF9TRVRVUF9TSVpFXTsKK30gZHJtX2k4MzBfc2FyZWFfdDsKKworLyogRmxhZ3MgZm9yIHBlcmZfYm94ZXMKKyAqLworI2RlZmluZSBJODMwX0JPWF9SSU5HX0VNUFRZICAgIDB4MSAvKiBwb3B1bGF0ZWQgYnkga2VybmVsICovCisjZGVmaW5lIEk4MzBfQk9YX0ZMSVAgICAgICAgICAgMHgyIC8qIHBvcHVsYXRlZCBieSBrZXJuZWwgKi8KKyNkZWZpbmUgSTgzMF9CT1hfV0FJVCAgICAgICAgICAweDQgLyogcG9wdWxhdGVkIGJ5IGtlcm5lbCAmIGNsaWVudCAqLworI2RlZmluZSBJODMwX0JPWF9URVhUVVJFX0xPQUQgIDB4OCAvKiBwb3B1bGF0ZWQgYnkga2VybmVsICovCisjZGVmaW5lIEk4MzBfQk9YX0xPU1RfQ09OVEVYVCAgMHgxMCAvKiBwb3B1bGF0ZWQgYnkgY2xpZW50ICovCisKKworLyogSTgzMCBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9JODMwX0lOSVQJMHgwMAorI2RlZmluZSBEUk1fSTgzMF9WRVJURVgJMHgwMQorI2RlZmluZSBEUk1fSTgzMF9DTEVBUgkweDAyCisjZGVmaW5lIERSTV9JODMwX0ZMVVNICTB4MDMKKyNkZWZpbmUgRFJNX0k4MzBfR0VUQUdFCTB4MDQKKyNkZWZpbmUgRFJNX0k4MzBfR0VUQlVGCTB4MDUKKyNkZWZpbmUgRFJNX0k4MzBfU1dBUAkweDA2CisjZGVmaW5lIERSTV9JODMwX0NPUFkJMHgwNworI2RlZmluZSBEUk1fSTgzMF9ET0NPUFkJMHgwOAorI2RlZmluZSBEUk1fSTgzMF9GTElQCTB4MDkKKyNkZWZpbmUgRFJNX0k4MzBfSVJRX0VNSVQJMHgwYQorI2RlZmluZSBEUk1fSTgzMF9JUlFfV0FJVAkweDBiCisjZGVmaW5lIERSTV9JODMwX0dFVFBBUkFNCTB4MGMKKyNkZWZpbmUgRFJNX0k4MzBfU0VUUEFSQU0JMHgwZAorCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9JTklULCBkcm1faTgzMF9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX1ZFUlRFWAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX1ZFUlRFWCwgZHJtX2k4MzBfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0NMRUFSCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfQ0xFQVIsIGRybV9pODMwX2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0ZMVVNICQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfRkxVU0gpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0dFVEFHRQkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0dFVEFHRSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MzBfR0VUQlVGCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfR0VUQlVGLCBkcm1faTgzMF9kbWFfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MzBfU1dBUAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0NPUFkJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9DT1BZLCBkcm1faTgzMF9jb3B5X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0RPQ09QWQkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0RPQ09QWSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MzBfRkxJUAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0ZMSVApCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX0lSUV9FTUlUICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX0lSUV9FTUlULCBkcm1faTgzMF9pcnFfZW1pdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTgzMF9JUlFfV0FJVCAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSU9DVExfSTgzMF9JUlFfV0FJVCwgZHJtX2k4MzBfaXJxX3dhaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MzBfR0VUUEFSQU0gICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0lPQ1RMX0k4MzBfR0VUUEFSQU0sIGRybV9pODMwX2dldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODMwX1NFVFBBUkFNICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JT0NUTF9JODMwX1NFVFBBUkFNLCBkcm1faTgzMF9zZXRwYXJhbV90KQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MzBfY2xlYXIgeworCWludCBjbGVhcl9jb2xvcjsKKwlpbnQgY2xlYXJfZGVwdGg7CisJaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcm1hc2s7CisJdW5zaWduZWQgaW50IGNsZWFyX2RlcHRobWFzazsKK30gZHJtX2k4MzBfY2xlYXJfdDsKKworCisKKy8qIFRoZXNlIG1heSBiZSBwbGFjZWhvbGRlcnMgaWYgd2UgaGF2ZSBtb3JlIGNsaXByZWN0cyB0aGFuCisgKiBJODMwX05SX1NBUkVBX0NMSVBSRUNUUy4gIEluIHRoYXQgY2FzZSwgdGhlIGNsaWVudCBzZXRzIGRpc2NhcmQgdG8KKyAqIGZhbHNlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGJ1ZmZlciB3aWxsIGJlIGRpc3BhdGNoZWQgYWdhaW4gd2l0aCBhCisgKiBuZXcgc2V0IG9mIGNsaXByZWN0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX3ZlcnRleCB7CisgICAJaW50IGlkeDsJCS8qIGJ1ZmZlciBpbmRleCAqLworCWludCB1c2VkOwkJLyogbnIgYnl0ZXMgaW4gdXNlICovCisJaW50IGRpc2NhcmQ7CQkvKiBjbGllbnQgaXMgZmluaXNoZWQgd2l0aCB0aGUgYnVmZmVyPyAqLworfSBkcm1faTgzMF92ZXJ0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX2NvcHlfdCB7CisgICAJaW50IGlkeDsJCS8qIGJ1ZmZlciBpbmRleCAqLworCWludCB1c2VkOwkJLyogbnIgYnl0ZXMgaW4gdXNlICovCisJdm9pZCBfX3VzZXIgKmFkZHJlc3M7CQkvKiBBZGRyZXNzIHRvIGNvcHkgZnJvbSAqLworfSBkcm1faTgzMF9jb3B5X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pODMwX2RtYSB7CisJdm9pZCBfX3VzZXIgKnZpcnR1YWw7CisJaW50IHJlcXVlc3RfaWR4OworCWludCByZXF1ZXN0X3NpemU7CisJaW50IGdyYW50ZWQ7Cit9IGRybV9pODMwX2RtYV90OworCisKKy8qIDEuMzogVXNlcnNwYWNlIGNhbiByZXF1ZXN0ICYgd2FpdCBvbiBpcnEnczoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MzBfaXJxX2VtaXQgeworCWludCBfX3VzZXIgKmlycV9zZXE7Cit9IGRybV9pODMwX2lycV9lbWl0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pODMwX2lycV93YWl0IHsKKwlpbnQgaXJxX3NlcTsKK30gZHJtX2k4MzBfaXJxX3dhaXRfdDsKKworCisvKiAxLjM6IE5ldyBpb2N0bCB0byBxdWVyeSBrZXJuZWwgcGFyYW1zOgorICovCisjZGVmaW5lIEk4MzBfUEFSQU1fSVJRX0FDVElWRSAgICAgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MzBfZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwlpbnQgX191c2VyICp2YWx1ZTsKK30gZHJtX2k4MzBfZ2V0cGFyYW1fdDsKKworCisvKiAxLjM6IE5ldyBpb2N0bCB0byBzZXQga2VybmVsIHBhcmFtczoKKyAqLworI2RlZmluZSBJODMwX1NFVFBBUkFNX1VTRV9NSV9CQVRDSEJVRkZFUl9TVEFSVCAgICAgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MzBfc2V0cGFyYW0geworCWludCBwYXJhbTsKKwlpbnQgdmFsdWU7Cit9IGRybV9pODMwX3NldHBhcmFtX3Q7CisKKworI2VuZGlmIC8qIF9JODMwX0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODBhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIGk4MzBfZHJ2LmMgLS0gSTgxMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDAxOjU2OjIyIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBKZWZmIEhhcnRtYW5uIDxqaGFydG1hbm5AdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiAgICBBYnJhaGFtIHZkIE1lcndlIDxhYnJhaGFtQDJkM2QuY28uemE+CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJpODMwX2RybS5oIgorI2luY2x1ZGUgImk4MzBfZHJ2LmgiCisKKyNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCisKK2ludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJZGV2LT5jb3VudGVycyArPSA0OworCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROworCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKKwlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKKwlkZXYtPnR5cGVzWzldID0gX0RSTV9TVEFUX0RNQTsKKwkKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJaTgzMF9QQ0lfSURTCit9OworCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBpODMwX2lvY3Rsc1tdOworZXh0ZXJuIGludCBpODMwX21heF9pb2N0bDsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUkVRVUlSRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfRE1BX1FVRVVFLAorI2lmIFVTRV9JUlFTCisJLmRyaXZlcl9mZWF0dXJlcyB8PSBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfU0hBUkVEX0lSUSwKKyNlbmRpZgorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9pODMwX2J1Zl9wcml2X3QpLAorCS5wcmV0YWtlZG93biA9IGk4MzBfZHJpdmVyX3ByZXRha2Vkb3duLAorCS5wcmVyZWxlYXNlID0gaTgzMF9kcml2ZXJfcHJlcmVsZWFzZSwKKwkucmVsZWFzZSA9IGk4MzBfZHJpdmVyX3JlbGVhc2UsCisJLmRtYV9xdWllc2NlbnQgPSBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50LAorCS5yZWNsYWltX2J1ZmZlcnMgPSBpODMwX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKyNpZiBVU0VfSVJRUworCS5pcnFfcHJlaW5zdGFsbCA9IGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCisJLmlycV91bmluc3RhbGwgPSBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsLAorCS5pcnFfaGFuZGxlciA9IGk4MzBfZHJpdmVyX2lycV9oYW5kbGVyLAorI2VuZGlmCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBpODMwX2lvY3RscywKKwkuZm9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gZHJtX29wZW4sCisJCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJCS5pb2N0bCA9IGRybV9pb2N0bCwKKwkJLm1tYXAgPSBkcm1fbW1hcCwKKwkJLnBvbGwgPSBkcm1fcG9sbCwKKwkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlICAgICAgPSBwY2lpZGxpc3QsCisJfQorCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpODMwX2luaXQodm9pZCkKK3sKKwlkcml2ZXIubnVtX2lvY3RscyA9IGk4MzBfbWF4X2lvY3RsOworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGk4MzBfZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpODMwX2luaXQpOworbW9kdWxlX2V4aXQoaTgzMF9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGIyZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCkBAIC0wLDAgKzEsMzAxIEBACisvKiBpODMwX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciB0aGUgSTgzMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KKyAqIAkgICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICoKKyAqLworCisjaWZuZGVmIF9JODMwX0RSVl9IXworI2RlZmluZSBfSTgzMF9EUlZfSF8KKworLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgorICovCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIlZBIExpbnV4IFN5c3RlbXMgSW5jLiIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImk4MzAiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiSW50ZWwgODMwTSIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDAyMTEwOCIKKworLyogSW50ZXJmYWNlIGhpc3Rvcnk6CisgKgorICogMS4xOiBPcmlnaW5hbC4KKyAqIDEuMjogPworICogMS4zOiBOZXcgaXJxIGVtaXQvd2FpdCBpb2N0bHMuCisgKiAgICAgIE5ldyBwYWdlZmxpcCBpb2N0bC4KKyAqICAgICAgTmV3IGdldHBhcmFtIGlvY3RsLgorICogICAgICBTdGF0ZSBmb3IgdGV4dW5pdHMgMyY0IGluIHNhcmVhLgorICogICAgICBOZXcgKGFsdGVybmF0aXZlKSBsYXlvdXQgZm9yIHRleHR1cmUgc3RhdGUuCisgKi8KKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkxCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMworI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkyCisKKy8qIERyaXZlciB3aWxsIHdvcmsgZWl0aGVyIHdheTogSVJRJ3Mgc2F2ZSBjcHUgdGltZSB3aGVuIHdhaXRpbmcgZm9yCisgKiB0aGUgY2FyZCwgYnV0IGFyZSBzdWJqZWN0IHRvIHN1YnRsZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBiaW9zLAorICogaGFyZHdhcmUgYW5kIHRoZSBkcml2ZXIuCisgKi8KKy8qIFhYWDogQWRkIHZibGFuayBzdXBwb3J0PyAqLworI2RlZmluZSBVU0VfSVJRUyAwCisKK3R5cGVkZWYgc3RydWN0IGRybV9pODMwX2J1Zl9wcml2IHsKKyAgIAl1MzIgKmluX3VzZTsKKyAgIAlpbnQgbXlfdXNlX2lkeDsKKwlpbnQgY3VycmVudGx5X21hcHBlZDsKKwl2b2lkIF9fdXNlciAqdmlydHVhbDsKKwl2b2lkICprZXJuZWxfdmlydHVhbDsKK30gZHJtX2k4MzBfYnVmX3ByaXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODMwX3JpbmdfYnVmZmVyeworCWludCB0YWlsX21hc2s7CisJdW5zaWduZWQgbG9uZyBTdGFydDsKKwl1bnNpZ25lZCBsb25nIEVuZDsKKwl1bnNpZ25lZCBsb25nIFNpemU7CisJdTggKnZpcnR1YWxfc3RhcnQ7CisJaW50IGhlYWQ7CisJaW50IHRhaWw7CisJaW50IHNwYWNlOworfSBkcm1faTgzMF9yaW5nX2J1ZmZlcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTgzMF9wcml2YXRlIHsKKwlkcm1fbWFwX3QgKnNhcmVhX21hcDsKKwlkcm1fbWFwX3QgKm1taW9fbWFwOworCisJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdjsKKyAgIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90IHJpbmc7CisKKyAgICAgIAl2b2lkICogaHdfc3RhdHVzX3BhZ2U7CisgICAJdW5zaWduZWQgbG9uZyBjb3VudGVyOworCisJZG1hX2FkZHJfdCBkbWFfc3RhdHVzX3BhZ2U7CisKKwlkcm1fYnVmX3QgKm1tYXBfYnVmZmVyOworCQorCXUzMiBmcm9udF9kaTEsIGJhY2tfZGkxLCB6aTE7CisJCisJaW50IGJhY2tfb2Zmc2V0OworCWludCBkZXB0aF9vZmZzZXQ7CisJaW50IGZyb250X29mZnNldDsKKwlpbnQgdywgaDsKKwlpbnQgcGl0Y2g7CisJaW50IGJhY2tfcGl0Y2g7CisJaW50IGRlcHRoX3BpdGNoOworCXVuc2lnbmVkIGludCBjcHA7CisKKwlpbnQgZG9fYm94ZXM7CisJaW50IGRtYV91c2VkOworCisJaW50IGN1cnJlbnRfcGFnZTsKKwlpbnQgcGFnZV9mbGlwcGluZzsKKworCXdhaXRfcXVldWVfaGVhZF90IGlycV9xdWV1ZTsKKyAgIAlhdG9taWNfdCBpcnFfcmVjZWl2ZWQ7CisgICAJYXRvbWljX3QgaXJxX2VtaXR0ZWQ7CisKKwlpbnQgdXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0OworCit9IGRybV9pODMwX3ByaXZhdGVfdDsKKworLyogaTgzMF9kbWEuYyAqLworZXh0ZXJuIHZvaWQgaTgzMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKKworZXh0ZXJuIGludCBpODMwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCisvKiBpODMwX2lycS5jICovCitleHRlcm4gaW50IGk4MzBfaXJxX2VtaXQoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCAKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKK2V4dGVybiBpbnQgaTgzMF9pcnFfd2FpdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CisKK2V4dGVybiBpcnFyZXR1cm5fdCBpODMwX2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICk7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKTsKKworI2RlZmluZSBJODMwX0JBU0UocmVnKQkJKCh1bnNpZ25lZCBsb25nKSBcCisJCQkJZGV2X3ByaXYtPm1taW9fbWFwLT5oYW5kbGUpCisjZGVmaW5lIEk4MzBfQUREUihyZWcpCQkoSTgzMF9CQVNFKHJlZykgKyByZWcpCisjZGVmaW5lIEk4MzBfREVSRUYocmVnKQkJKihfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICopSTgzMF9BRERSKHJlZykKKyNkZWZpbmUgSTgzMF9SRUFEKHJlZykJCXJlYWRsKCh2b2xhdGlsZSB1MzIgKilJODMwX0FERFIocmVnKSkKKyNkZWZpbmUgSTgzMF9XUklURShyZWcsdmFsKSAJd3JpdGVsKHZhbCwgKHZvbGF0aWxlIHUzMiAqKUk4MzBfQUREUihyZWcpKQorI2RlZmluZSBJODMwX0RFUkVGMTYocmVnKQkqKF9fdm9sYXRpbGVfXyB1MTYgKilJODMwX0FERFIocmVnKQorI2RlZmluZSBJODMwX1JFQUQxNihyZWcpIAlJODMwX0RFUkVGMTYocmVnKQorI2RlZmluZSBJODMwX1dSSVRFMTYocmVnLHZhbCkJZG8geyBJODMwX0RFUkVGMTYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKKworCisKKyNkZWZpbmUgSTgzMF9WRVJCT1NFIDAKKworI2RlZmluZSBSSU5HX0xPQ0FMUwl1bnNpZ25lZCBpbnQgb3V0cmluZywgcmluZ21hc2ssIG91dGNvdW50OyBcCisgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBjaGFyICp2aXJ0OworCisjZGVmaW5lIEJFR0lOX0xQX1JJTkcobikgZG8gewkJCQlcCisJaWYgKEk4MzBfVkVSQk9TRSkJCQkJXAorCQlwcmludGsoIkJFR0lOX0xQX1JJTkcoJWQpIGluICVzXG4iLAlcCisJCQkgIG4sIF9fRlVOQ1RJT05fXyk7CQlcCisJaWYgKGRldl9wcml2LT5yaW5nLnNwYWNlIDwgbio0KQkJCVwKKwkJaTgzMF93YWl0X3JpbmcoZGV2LCBuKjQsIF9fRlVOQ1RJT05fXyk7CQlcCisJb3V0Y291bnQgPSAwOwkJCQkJXAorCW91dHJpbmcgPSBkZXZfcHJpdi0+cmluZy50YWlsOwkJCVwKKwlyaW5nbWFzayA9IGRldl9wcml2LT5yaW5nLnRhaWxfbWFzazsJCVwKKwl2aXJ0ID0gZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydDsJCVwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBPVVRfUklORyhuKSBkbyB7CQkJCQlcCisJaWYgKEk4MzBfVkVSQk9TRSkgcHJpbnRrKCIgICBPVVRfUklORyAleFxuIiwgKGludCkobikpOwlcCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikodmlydCArIG91dHJpbmcpID0gbjsJCVwKKyAgICAgICAgb3V0Y291bnQrKzsJCQkJCQlcCisJb3V0cmluZyArPSA0OwkJCQkJCVwKKwlvdXRyaW5nICY9IHJpbmdtYXNrOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBRFZBTkNFX0xQX1JJTkcoKSBkbyB7CQkJCQkJXAorCWlmIChJODMwX1ZFUkJPU0UpIHByaW50aygiQURWQU5DRV9MUF9SSU5HICV4XG4iLCBvdXRyaW5nKTsJXAorCWRldl9wcml2LT5yaW5nLnRhaWwgPSBvdXRyaW5nOwkJCQkJXAorCWRldl9wcml2LT5yaW5nLnNwYWNlIC09IG91dGNvdW50ICogNDsJCQkJXAorCUk4MzBfV1JJVEUoTFBfUklORyArIFJJTkdfVEFJTCwgb3V0cmluZyk7CQkJXAorfSB3aGlsZSgwKQorCitleHRlcm4gaW50IGk4MzBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKKworCisjZGVmaW5lIEdGWF9PUF9VU0VSX0lOVEVSUlVQVCAJCSgoMDw8MjkpfCgyPDwyMykpCisjZGVmaW5lIEdGWF9PUF9CUkVBS1BPSU5UX0lOVEVSUlVQVAkoKDA8PDI5KXwoMTw8MjMpKQorI2RlZmluZSBDTURfUkVQT1JUX0hFQUQJCQkoNzw8MjMpCisjZGVmaW5lIENNRF9TVE9SRV9EV09SRF9JRFgJCSgoMHgyMTw8MjMpIHwgMHgxKQorI2RlZmluZSBDTURfT1BfQkFUQ0hfQlVGRkVSICAoKDB4MDw8MjkpfCgweDMwPDwyMyl8MHgxKQorCisjZGVmaW5lIFNUQVRFM0RfTE9BRF9TVEFURV9JTU1FRElBVEVfMiAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHgwMzw8MTYpKQorI2RlZmluZSBMT0FEX1RFWFRVUkVfTUFQMCAgICAgICAgICAgICAgICAgICAoMTw8MTEpCisKKyNkZWZpbmUgSU5TVF9QQVJTRVJfQ0xJRU5UICAgMHgwMDAwMDAwMAorI2RlZmluZSBJTlNUX09QX0ZMVVNIICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIElOU1RfRkxVU0hfTUFQX0NBQ0hFIDB4MDAwMDAwMDEKKworCisjZGVmaW5lIEJCMV9TVEFSVF9BRERSX01BU0sgICAofjB4NykKKyNkZWZpbmUgQkIxX1BST1RFQ1RFRCAgICAgICAgICgxPDwwKQorI2RlZmluZSBCQjFfVU5QUk9URUNURUQgICAgICAgKDA8PDApCisjZGVmaW5lIEJCMl9FTkRfQUREUl9NQVNLICAgICAofjB4NykKKworI2RlZmluZSBJODMwUkVHX0hXU1RBTQkJMHgwMjA5OAorI2RlZmluZSBJODMwUkVHX0lOVF9JREVOVElUWV9SCTB4MDIwYTQKKyNkZWZpbmUgSTgzMFJFR19JTlRfTUFTS19SIAkweDAyMGE4CisjZGVmaW5lIEk4MzBSRUdfSU5UX0VOQUJMRV9SCTB4MDIwYTAKKworI2RlZmluZSBJODMwX0lSUV9SRVNFUlZFRCAoKDE8PDEzKXwoMzw8MikpCisKKworI2RlZmluZSBMUF9SSU5HICAgICAJCTB4MjAzMAorI2RlZmluZSBIUF9SSU5HICAgICAJCTB4MjA0MAorI2RlZmluZSBSSU5HX1RBSUwgICAgICAJCTB4MDAKKyNkZWZpbmUgVEFJTF9BRERSCQkweDAwMUZGRkY4CisjZGVmaW5lIFJJTkdfSEVBRCAgICAgIAkJMHgwNAorI2RlZmluZSBIRUFEX1dSQVBfQ09VTlQgICAgIAkweEZGRTAwMDAwCisjZGVmaW5lIEhFQURfV1JBUF9PTkUgICAgICAgCTB4MDAyMDAwMDAKKyNkZWZpbmUgSEVBRF9BRERSICAgICAgICAgICAJMHgwMDFGRkZGQworI2RlZmluZSBSSU5HX1NUQVJUICAgICAJCTB4MDgKKyNkZWZpbmUgU1RBUlRfQUREUiAgICAgICAgICAJMHgweEZGRkZGMDAwCisjZGVmaW5lIFJJTkdfTEVOICAgICAgIAkJMHgwQworI2RlZmluZSBSSU5HX05SX1BBR0VTICAgICAgIAkweDAwMUZGMDAwIAorI2RlZmluZSBSSU5HX1JFUE9SVF9NQVNLICAgIAkweDAwMDAwMDA2CisjZGVmaW5lIFJJTkdfUkVQT1JUXzY0SyAgICAgCTB4MDAwMDAwMDIKKyNkZWZpbmUgUklOR19SRVBPUlRfMTI4SyAgICAJMHgwMDAwMDAwNAorI2RlZmluZSBSSU5HX05PX1JFUE9SVCAgICAgIAkweDAwMDAwMDAwCisjZGVmaW5lIFJJTkdfVkFMSURfTUFTSyAgICAgCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19WQUxJRCAgICAgICAgICAJMHgwMDAwMDAwMQorI2RlZmluZSBSSU5HX0lOVkFMSUQgICAgICAgIAkweDAwMDAwMDAwCisKKyNkZWZpbmUgR0ZYX09QX1NDSVNTT1IgICAgICAgICAoKDB4Mzw8MjkpfCgweDFjPDwyNCl8KDB4MTA8PDE5KSkKKyNkZWZpbmUgU0NfVVBEQVRFX1NDSVNTT1IgICAgICAgKDB4MTw8MSkKKyNkZWZpbmUgU0NfRU5BQkxFX01BU0sgICAgICAgICAgKDB4MTw8MCkKKyNkZWZpbmUgU0NfRU5BQkxFICAgICAgICAgICAgICAgKDB4MTw8MCkKKworI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9JTkZPICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MTw8MTYpfCgweDEpKQorI2RlZmluZSBTQ0lfWU1JTl9NQVNLICAgICAgKDB4ZmZmZjw8MTYpCisjZGVmaW5lIFNDSV9YTUlOX01BU0sgICAgICAoMHhmZmZmPDwwKQorI2RlZmluZSBTQ0lfWU1BWF9NQVNLICAgICAgKDB4ZmZmZjw8MTYpCisjZGVmaW5lIFNDSV9YTUFYX01BU0sgICAgICAoMHhmZmZmPDwwKQorCisjZGVmaW5lIEdGWF9PUF9TQ0lTU09SX0VOQUJMRQkgKCgweDM8PDI5KXwoMHgxYzw8MjQpfCgweDEwPDwxOSkpCisjZGVmaW5lIEdGWF9PUF9TQ0lTU09SX1JFQ1QJICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MTw8MTYpfDEpCisjZGVmaW5lIEdGWF9PUF9DT0xPUl9GQUNUT1IgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4MTw8MTYpfDB4MCkKKyNkZWZpbmUgR0ZYX09QX1NUSVBQTEUgICAgICAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4Mzw8MTYpKQorI2RlZmluZSBHRlhfT1BfTUFQX0lORk8gICAgICAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfDB4NCkKKyNkZWZpbmUgR0ZYX09QX0RFU1RCVUZGRVJfVkFSUyAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4NTw8MTYpfDB4MCkKKyNkZWZpbmUgR0ZYX09QX0RSQVdSRUNUX0lORk8gICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MDw8MTYpfCgweDMpKQorI2RlZmluZSBHRlhfT1BfUFJJTUlUSVZFICAgICAgICAgKCgweDM8PDI5KXwoMHgxZjw8MjQpKQorCisjZGVmaW5lIENNRF9PUF9ERVNUQlVGRkVSX0lORk8JICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4ZTw8MTYpfDEpCisKKyNkZWZpbmUgQ01EX09QX0RJU1BMQVlCVUZGRVJfSU5GTyAoKDB4MDw8MjkpfCgweDE0PDwyMyl8MikKKyNkZWZpbmUgQVNZTkNfRkxJUCAgICAgICAgICAgICAgICAoMTw8MjIpCisKKyNkZWZpbmUgQ01EXzNEICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzPDwyOSkKKyNkZWZpbmUgU1RBVEUzRF9DT05TVF9CTEVORF9DT0xPUl9DTUQgICAoQ01EXzNEfCgweDFkPDwyNCl8KDB4ODg8PDE2KSkKKyNkZWZpbmUgU1RBVEUzRF9NQVBfQ09PUkRfU0VUQklORF9DTUQgICAoQ01EXzNEfCgweDFkPDwyNCl8KDB4MDI8PDE2KSkKKworI2RlZmluZSBCUjAwX0JJVEJMVF9DTElFTlQgICAweDQwMDAwMDAwCisjZGVmaW5lIEJSMDBfT1BfQ09MT1JfQkxUICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgQlIwMF9PUF9TUkNfQ09QWV9CTFQgMHgxMEMwMDAwMAorI2RlZmluZSBCUjEzX1NPTElEX1BBVFRFUk4gICAweDgwMDAwMDAwCisKKyNkZWZpbmUgQlVGXzNEX0lEX0NPTE9SX0JBQ0sgICAgKDB4Mzw8MjQpCisjZGVmaW5lIEJVRl8zRF9JRF9ERVBUSCAgICAgICAgICgweDc8PDI0KQorI2RlZmluZSBCVUZfM0RfVVNFX0ZFTkNFICAgICAgICAoMTw8MjMpCisjZGVmaW5lIEJVRl8zRF9QSVRDSCh4KSAgICAgICAgICgoKHgpLzQpPDwyKQorCisjZGVmaW5lIENNRF9PUF9NQVBfUEFMRVRURV9MT0FECSgoMzw8MjkpfCgweDFkPDwyNCl8KDB4ODI8PDE2KXwyNTUpCisjZGVmaW5lIE1BUF9QQUxFVFRFX05VTSh4KQkoKHg8PDgpICYgKDE8PDgpKQorI2RlZmluZSBNQVBfUEFMRVRURV9CT1RICSgxPDwxMSkKKworI2RlZmluZSBYWV9DT0xPUl9CTFRfQ01ECQkoKDI8PDI5KXwoMHg1MDw8MjIpfDB4NCkKKyNkZWZpbmUgWFlfQ09MT1JfQkxUX1dSSVRFX0FMUEhBCSgxPDwyMSkKKyNkZWZpbmUgWFlfQ09MT1JfQkxUX1dSSVRFX1JHQgkJKDE8PDIwKQorCisjZGVmaW5lIFhZX1NSQ19DT1BZX0JMVF9DTUQgICAgICAgICAgICAgKCgyPDwyOSl8KDB4NTM8PDIyKXw2KQorI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfQUxQSEEgICAgICgxPDwyMSkKKyNkZWZpbmUgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX1JHQiAgICAgICAoMTw8MjApCisKKyNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSIAkoKDB4MzA8PDIzKXwxKQorI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfU1RBUlQgCSgweDMxPDwyMykKKyNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSX0VORCAJKDB4QTw8MjMpCisjZGVmaW5lIE1JX0JBVENIX05PTl9TRUNVUkUJKDEpCisKKyNkZWZpbmUgTUlfV0FJVF9GT1JfRVZFTlQgICAgICAgKCgweDM8PDIzKSkKKyNkZWZpbmUgTUlfV0FJVF9GT1JfUExBTkVfQV9GTElQICAgICAgKDE8PDIpIAorI2RlZmluZSBNSV9XQUlUX0ZPUl9QTEFORV9BX1NDQU5MSU5FUyAoMTw8MSkgCisKKyNkZWZpbmUgTUlfTE9BRF9TQ0FOX0xJTkVTX0lOQ0wgICgoMHgxMjw8MjMpKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzcyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIGk4MzBfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBJODMwIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAyMDAyIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJpODMwX2RybS5oIgorI2luY2x1ZGUgImk4MzBfZHJ2LmgiCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrIHF1ZXVlIHN1cHBvcnQgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisKK2lycXJldHVybl90IGk4MzBfZHJpdmVyX2lycV9oYW5kbGVyKCBEUk1fSVJRX0FSR1MgKQoreworCWRybV9kZXZpY2VfdAkgKmRldiA9IChkcm1fZGV2aWNlX3QgKilhcmc7CisgICAgICAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworICAgCXUxNiB0ZW1wOworCisgICAgICAJdGVtcCA9IEk4MzBfUkVBRDE2KEk4MzBSRUdfSU5UX0lERU5USVRZX1IpOworCURSTV9ERUJVRygiJXhcbiIsIHRlbXApOworCisgICAJaWYgKCAhKCB0ZW1wICYgMiApICkgCisJCXJldHVybiBJUlFfTk9ORTsKKworCUk4MzBfV1JJVEUxNihJODMwUkVHX0lOVF9JREVOVElUWV9SLCB0ZW1wKTsgCisKKwlhdG9taWNfaW5jKCZkZXZfcHJpdi0+aXJxX3JlY2VpdmVkKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldl9wcml2LT5pcnFfcXVldWUpOyAKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitpbnQgaTgzMF9lbWl0X2lycShkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlhdG9taWNfaW5jKCZkZXZfcHJpdi0+aXJxX2VtaXR0ZWQpOworCisgICAJQkVHSU5fTFBfUklORygyKTsKKyAgICAgIAlPVVRfUklORyggMCApOworICAgICAgCU9VVF9SSU5HKCBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgKTsKKyAgICAgIAlBRFZBTkNFX0xQX1JJTkcoKTsKKworCXJldHVybiBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPmlycV9lbWl0dGVkKTsKK30KKworCitpbnQgaTgzMF93YWl0X2lycShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGlycV9ucikKK3sKKyAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX2k4MzBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBqaWZmaWVzICsgSFoqMzsKKwlpbnQgcmV0ID0gMDsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+aXJxX3JlY2VpdmVkKSA+PSBpcnFfbnIpICAKKyAJCXJldHVybiAwOyAKKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk4MzBfQk9YX1dBSVQ7CisKKwlhZGRfd2FpdF9xdWV1ZSgmZGV2X3ByaXYtPmlycV9xdWV1ZSwgJmVudHJ5KTsKKworCWZvciAoOzspIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCSAgIAlpZiAoYXRvbWljX3JlYWQoJmRldl9wcml2LT5pcnFfcmVjZWl2ZWQpID49IGlycV9ucikgCisJCSAgIGJyZWFrOworCQlpZigoc2lnbmVkKShlbmQgLSBqaWZmaWVzKSA8PSAwKSB7CisJCQlEUk1fRVJST1IoInRpbWVvdXQgaWlyICV4IGltciAleCBpZXIgJXggaHdzdGFtICV4XG4iLAorCQkJCSAgSTgzMF9SRUFEMTYoIEk4MzBSRUdfSU5UX0lERU5USVRZX1IgKSwKKwkJCQkgIEk4MzBfUkVBRDE2KCBJODMwUkVHX0lOVF9NQVNLX1IgKSwKKwkJCQkgIEk4MzBfUkVBRDE2KCBJODMwUkVHX0lOVF9FTkFCTEVfUiApLAorCQkJCSAgSTgzMF9SRUFEMTYoIEk4MzBSRUdfSFdTVEFNICkpOworCisJCSAgIAlyZXQgPSAtRUJVU1k7CS8qIExvY2t1cD8gIE1pc3NlZCBpcnE/ICovCisJCQlicmVhazsKKwkJfQorCSAgICAgIAlzY2hlZHVsZV90aW1lb3V0KEhaKjMpOworCSAgICAgIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJICAgCXJldCA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZkZXZfcHJpdi0+aXJxX3F1ZXVlLCAmZW50cnkpOworCXJldHVybiByZXQ7Cit9CisKKworLyogTmVlZHMgdGhlIGxvY2sgYXMgaXQgdG91Y2hlcyB0aGUgcmluZy4KKyAqLworaW50IGk4MzBfaXJxX2VtaXQoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICB1bnNpZ25lZCBsb25nIGFyZyApCit7CisJZHJtX2ZpbGVfdAkgICpwcml2CSAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QJICAqZGV2CSAgICA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTgzMF9pcnFfZW1pdF90IGVtaXQ7CisJaW50IHJlc3VsdDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCAmZW1pdCwgKGRybV9pODMwX2lycV9lbWl0X3QgX191c2VyICopYXJnLCBzaXplb2YoZW1pdCkgKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXN1bHQgPSBpODMwX2VtaXRfaXJxKCBkZXYgKTsKKworCWlmICggY29weV90b191c2VyKCBlbWl0LmlycV9zZXEsICZyZXN1bHQsIHNpemVvZihpbnQpICkgKSB7CisJCURSTV9FUlJPUiggImNvcHlfdG9fdXNlclxuIiApOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBEb2Vzbid0IG5lZWQgdGhlIGhhcmR3YXJlIGxvY2suCisgKi8KK2ludCBpODMwX2lycV93YWl0KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgdW5zaWduZWQgbG9uZyBhcmcgKQoreworCWRybV9maWxlX3QJICAqcHJpdgkgICAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90CSAgKmRldgkgICAgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k4MzBfaXJxX3dhaXRfdCBpcnF3YWl0OworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCAmaXJxd2FpdCwgKGRybV9pODMwX2lycV93YWl0X3QgX191c2VyICopYXJnLCAKKwkJCSAgICBzaXplb2YoaXJxd2FpdCkgKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gaTgzMF93YWl0X2lycSggZGV2LCBpcnF3YWl0LmlycV9zZXEgKTsKK30KKworCisvKiBkcm1fZG1hLmggaG9va3MKKyovCit2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKwlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJKGRybV9pODMwX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlJODMwX1dSSVRFMTYoIEk4MzBSRUdfSFdTVEFNLCAweGZmZmYgKTsKKwlJODMwX1dSSVRFMTYoIEk4MzBSRUdfSU5UX01BU0tfUiwgMHgwICk7CisJSTgzMF9XUklURTE2KCBJODMwUkVHX0lOVF9FTkFCTEVfUiwgMHgwICk7CisJYXRvbWljX3NldCgmZGV2X3ByaXYtPmlycV9yZWNlaXZlZCwgMCk7CisJYXRvbWljX3NldCgmZGV2X3ByaXYtPmlycV9lbWl0dGVkLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKK30KKwordm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkoZHJtX2k4MzBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCUk4MzBfV1JJVEUxNiggSTgzMFJFR19JTlRfRU5BQkxFX1IsIDB4MiApOworfQorCit2b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQorCQkoZHJtX2k4MzBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAoIWRldl9wcml2KQorCQlyZXR1cm47CisKKwlJODMwX1dSSVRFMTYoIEk4MzBSRUdfSU5UX01BU0tfUiwgMHhmZmZmICk7CisJSTgzMF9XUklURTE2KCBJODMwUkVHX0lOVF9FTkFCTEVfUiwgMHgwICk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwMGEwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwpAQCAtMCwwICsxLDcyNSBAQAorLyogaTkxNV9kbWEuYyAtLSBETUEgc3VwcG9ydCBmb3IgdGhlIEk5MTUgLSotIGxpbnV4LWMgLSotCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCitkcm1faW9jdGxfZGVzY190IGk5MTVfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JTklUKV0gPSB7aTkxNV9kbWFfaW5pdCwgMSwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GTFVTSCldID0ge2k5MTVfZmx1c2hfaW9jdGwsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRkxJUCldID0ge2k5MTVfZmxpcF9idWZzLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0JBVENIQlVGRkVSKV0gPSB7aTkxNV9iYXRjaGJ1ZmZlciwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JUlFfRU1JVCldID0ge2k5MTVfaXJxX2VtaXQsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSVJRX1dBSVQpXSA9IHtpOTE1X2lycV93YWl0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0dFVFBBUkFNKV0gPSB7aTkxNV9nZXRwYXJhbSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9TRVRQQVJBTSldID0ge2k5MTVfc2V0cGFyYW0sIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQUxMT0MpXSA9IHtpOTE1X21lbV9hbGxvYywgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GUkVFKV0gPSB7aTkxNV9tZW1fZnJlZSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JTklUX0hFQVApXSA9IHtpOTE1X21lbV9pbml0X2hlYXAsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQ01EQlVGRkVSKV0gPSB7aTkxNV9jbWRidWZmZXIsIDEsIDB9Cit9OworCitpbnQgaTkxNV9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShpOTE1X2lvY3Rscyk7CisKKy8qIFJlYWxseSB3YW50IGFuIE9TLWluZGVwZW5kZW50IHJlc2V0dGFibGUgdGltZXIuICBXb3VsZCBsaWtlIHRvIGhhdmUKKyAqIHRoaXMgbG9vcCBydW4gZm9yIChlZykgMyBzZWMsIGJ1dCBoYXZlIHRoZSB0aW1lciByZXNldCBldmVyeSB0aW1lCisgKiB0aGUgaGVhZCBwb2ludGVyIGNoYW5nZXMsIHNvIHRoYXQgRUJVU1kgb25seSBoYXBwZW5zIGlmIHRoZSByaW5nCisgKiBhY3R1YWxseSBzdGFsbHMgZm9yIChlZykgMyBzZWNvbmRzLgorICovCitpbnQgaTkxNV93YWl0X3JpbmcoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKKwl1MzIgbGFzdF9oZWFkID0gSTkxNV9SRUFEKExQX1JJTkcgKyBSSU5HX0hFQUQpICYgSEVBRF9BRERSOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJcmluZy0+aGVhZCA9IEk5MTVfUkVBRChMUF9SSU5HICsgUklOR19IRUFEKSAmIEhFQURfQUREUjsKKwkJcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwgKyA4KTsKKwkJaWYgKHJpbmctPnNwYWNlIDwgMCkKKwkJCXJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7CisJCWlmIChyaW5nLT5zcGFjZSA+PSBuKQorCQkJcmV0dXJuIDA7CisKKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTkxNV9CT1hfV0FJVDsKKworCQlpZiAocmluZy0+aGVhZCAhPSBsYXN0X2hlYWQpCisJCQlpID0gMDsKKworCQlsYXN0X2hlYWQgPSByaW5nLT5oZWFkOworCX0KKworCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKwordm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKKworCXJpbmctPmhlYWQgPSBJOTE1X1JFQUQoTFBfUklORyArIFJJTkdfSEVBRCkgJiBIRUFEX0FERFI7CisJcmluZy0+dGFpbCA9IEk5MTVfUkVBRChMUF9SSU5HICsgUklOR19UQUlMKSAmIFRBSUxfQUREUjsKKwlyaW5nLT5zcGFjZSA9IHJpbmctPmhlYWQgLSAocmluZy0+dGFpbCArIDgpOworCWlmIChyaW5nLT5zcGFjZSA8IDApCisJCXJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7CisKKwlpZiAocmluZy0+aGVhZCA9PSByaW5nLT50YWlsKQorCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9SSU5HX0VNUFRZOworfQorCitpbnQgaTkxNV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCisJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQorCSAqIGlzIGZyZWVkLCBpdCdzIHRvbyBsYXRlLgorCSAqLworCWlmIChkZXYtPmlycSkKKwkJZHJtX2lycV91bmluc3RhbGwgKGRldik7CisKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJICAgIChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCQlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCkgeworCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoICZkZXZfcHJpdi0+cmluZy5tYXAsIGRldik7CisJCX0KKworCQlpZiAoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSB7CisJCQlkcm1fcGNpX2ZyZWUoZGV2LCBQQUdFX1NJWkUsIGRldl9wcml2LT5od19zdGF0dXNfcGFnZSwKKwkJCQkgICAgIGRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UpOworCQkJLyogTmVlZCB0byByZXdyaXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlICovCisJCQlJOTE1X1dSSVRFKDB4MDIwODAsIDB4MWZmZmYwMDApOworCQl9CisKKwkJZHJtX2ZyZWUgKGRldi0+ZGV2X3ByaXZhdGUsIHNpemVvZihkcm1faTkxNV9wcml2YXRlX3QpLAorCQkJICAgRFJNX01FTV9EUklWRVIpOworCisJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk5MTVfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkgICBkcm1faTkxNV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKKwkJCSAgIGRybV9pOTE1X2luaXRfdCAqIGluaXQpCit7CisJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k5MTVfcHJpdmF0ZV90KSk7CisKKwlEUk1fR0VUU0FSRUEoKTsKKwlpZiAoIWRldl9wcml2LT5zYXJlYSkgeworCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBzYXJlYSFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTkxNV9kbWFfY2xlYW51cChkZXYpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWRldl9wcml2LT5tbWlvX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvX29mZnNldCk7CisJaWYgKCFkZXZfcHJpdi0+bW1pb19tYXApIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKKwkJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgbW1pbyBtYXAhXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9IChkcm1faTkxNV9zYXJlYV90ICopCisJICAgICgodTggKikgZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGUgKyBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKwlkZXZfcHJpdi0+cmluZy5TdGFydCA9IGluaXQtPnJpbmdfc3RhcnQ7CisJZGV2X3ByaXYtPnJpbmcuRW5kID0gaW5pdC0+cmluZ19lbmQ7CisJZGV2X3ByaXYtPnJpbmcuU2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKKwlkZXZfcHJpdi0+cmluZy50YWlsX21hc2sgPSBkZXZfcHJpdi0+cmluZy5TaXplIC0gMTsKKworCWRldl9wcml2LT5yaW5nLm1hcC5vZmZzZXQgPSBpbml0LT5yaW5nX3N0YXJ0OworCWRldl9wcml2LT5yaW5nLm1hcC5zaXplID0gaW5pdC0+cmluZ19zaXplOworCWRldl9wcml2LT5yaW5nLm1hcC50eXBlID0gMDsKKwlkZXZfcHJpdi0+cmluZy5tYXAuZmxhZ3MgPSAwOworCWRldl9wcml2LT5yaW5nLm1hcC5tdHJyID0gMDsKKworCWRybV9jb3JlX2lvcmVtYXAoICZkZXZfcHJpdi0+cmluZy5tYXAsIGRldiApOworCisJaWYgKGRldl9wcml2LT5yaW5nLm1hcC5oYW5kbGUgPT0gTlVMTCkgeworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJaTkxNV9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgorCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisKKwlkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID0gZGV2X3ByaXYtPnJpbmcubWFwLmhhbmRsZTsKKworCWRldl9wcml2LT5iYWNrX29mZnNldCA9IGluaXQtPmJhY2tfb2Zmc2V0OworCWRldl9wcml2LT5mcm9udF9vZmZzZXQgPSBpbml0LT5mcm9udF9vZmZzZXQ7CisJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDA7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisKKwkvKiBXZSBhcmUgdXNpbmcgc2VwYXJhdGUgdmFsdWVzIGFzIHBsYWNlaG9sZGVycyBmb3IgbWVjaGFuaXNtcyBmb3IKKwkgKiBwcml2YXRlIGJhY2tidWZmZXIvZGVwdGhidWZmZXIgdXNhZ2UuCisJICovCisJZGV2X3ByaXYtPnVzZV9taV9iYXRjaGJ1ZmZlcl9zdGFydCA9IDA7CisKKwkvKiBBbGxvdyBoYXJkd2FyZSBiYXRjaGJ1ZmZlcnMgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLgorCSAqLworCWRldl9wcml2LT5hbGxvd19iYXRjaGJ1ZmZlciA9IDE7CisKKwkvKiBQcm9ncmFtIEhhcmR3YXJlIFN0YXR1cyBQYWdlICovCisJZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlID0gZHJtX3BjaV9hbGxvYyhkZXYsIFBBR0VfU0laRSwgUEFHRV9TSVpFLAorCQkJCQkJIDB4ZmZmZmZmZmYsIAorCQkJCQkJICZkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKworCWlmICghZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlpOTE1X2RtYV9jbGVhbnVwKGRldik7CisJCURSTV9FUlJPUigiQ2FuIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBzdGF0dXMgcGFnZVxuIik7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCW1lbXNldChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UsIDAsIFBBR0VfU0laRSk7CisJRFJNX0RFQlVHKCJodyBzdGF0dXMgcGFnZSBAICVwXG4iLCBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpOworCisJSTkxNV9XUklURSgweDAyMDgwLCBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKKwlEUk1fREVCVUcoIkVuYWJsZWQgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTE1X3Jlc3VtZShkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIWRldl9wcml2LT5zYXJlYSkgeworCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBzYXJlYSFcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICghZGV2X3ByaXYtPm1taW9fbWFwKSB7CisJCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIG1taW8gbWFwIVxuIik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKGRldl9wcml2LT5yaW5nLm1hcC5oYW5kbGUgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgorCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisKKwkvKiBQcm9ncmFtIEhhcmR3YXJlIFN0YXR1cyBQYWdlICovCisJaWYgKCFkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpIHsKKwkJRFJNX0VSUk9SKCJDYW4gbm90IGZpbmQgaGFyZHdhcmUgc3RhdHVzIHBhZ2VcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlEUk1fREVCVUcoImh3IHN0YXR1cyBwYWdlIEAgJXBcbiIsIGRldl9wcml2LT5od19zdGF0dXNfcGFnZSk7CisKKwlJOTE1X1dSSVRFKDB4MDIwODAsIGRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UpOworCURSTV9ERUJVRygiRW5hYmxlZCBoYXJkd2FyZSBzdGF0dXMgcGFnZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGk5MTVfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2OworCWRybV9pOTE1X2luaXRfdCBpbml0OworCWludCByZXRjb2RlID0gMDsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpbml0LCAoZHJtX2k5MTVfaW5pdF90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YoaW5pdCkpOworCisJc3dpdGNoIChpbml0LmZ1bmMpIHsKKwljYXNlIEk5MTVfSU5JVF9ETUE6CisJCWRldl9wcml2ID0gZHJtX2FsbG9jIChzaXplb2YoZHJtX2k5MTVfcHJpdmF0ZV90KSwKKwkJCQkgICAgICAgRFJNX01FTV9EUklWRVIpOworCQlpZiAoZGV2X3ByaXYgPT0gTlVMTCkKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCXJldGNvZGUgPSBpOTE1X2luaXRpYWxpemUoZGV2LCBkZXZfcHJpdiwgJmluaXQpOworCQlicmVhazsKKwljYXNlIEk5MTVfQ0xFQU5VUF9ETUE6CisJCXJldGNvZGUgPSBpOTE1X2RtYV9jbGVhbnVwKGRldik7CisJCWJyZWFrOworCWNhc2UgSTkxNV9SRVNVTUVfRE1BOgorCQlyZXRjb2RlID0gaTkxNV9yZXN1bWUoZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0Y29kZSA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXRjb2RlOworfQorCisvKiBJbXBsZW1lbnQgYmFzaWNhbGx5IHRoZSBzYW1lIHNlY3VyaXR5IHJlc3RyaWN0aW9ucyBhcyBoYXJkd2FyZSBkb2VzCisgKiBmb3IgTUlfQkFUQ0hfTk9OX1NFQ1VSRS4gIFRoZXNlIGNhbiBiZSBtYWRlIHN0cmljdGVyIGF0IGFueSB0aW1lLgorICoKKyAqIE1vc3Qgb2YgdGhlIGNhbGN1bGF0aW9ucyBiZWxvdyBpbnZvbHZlIGNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIGEKKyAqIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24uICBJdCdzIGltcG9ydGFudCB0byBnZXQgdGhlIHNpemUgcmlnaHQgYXMKKyAqIHRoYXQgdGVsbHMgdXMgd2hlcmUgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdG8gY2hlY2sgaXMuICBBbnkgaWxsZWdhbAorICogaW5zdHJ1Y3Rpb24gZGV0ZWN0ZWQgd2lsbCBiZSBnaXZlbiBhIHNpemUgb2YgemVybywgd2hpY2ggaXMgYQorICogc2lnbmFsIHRvIGFib3J0IHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgZG9fdmFsaWRhdGVfY21kKGludCBjbWQpCit7CisJc3dpdGNoICgoKGNtZCA+PiAyOSkgJiAweDcpKSB7CisJY2FzZSAweDA6CisJCXN3aXRjaCAoKGNtZCA+PiAyMykgJiAweDNmKSB7CisJCWNhc2UgMHgwOgorCQkJcmV0dXJuIDE7CS8qIE1JX05PT1AgKi8KKwkJY2FzZSAweDQ6CisJCQlyZXR1cm4gMTsJLyogTUlfRkxVU0ggKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOwkvKiBkaXNhbGxvdyBldmVyeXRoaW5nIGVsc2UgKi8KKwkJfQorCQlicmVhazsKKwljYXNlIDB4MToKKwkJcmV0dXJuIDA7CS8qIHJlc2VydmVkICovCisJY2FzZSAweDI6CisJCXJldHVybiAoY21kICYgMHhmZikgKyAyOwkvKiAyZCBjb21tYW5kcyAqLworCWNhc2UgMHgzOgorCQlpZiAoKChjbWQgPj4gMjQpICYgMHgxZikgPD0gMHgxOCkKKwkJCXJldHVybiAxOworCisJCXN3aXRjaCAoKGNtZCA+PiAyNCkgJiAweDFmKSB7CisJCWNhc2UgMHgxYzoKKwkJCXJldHVybiAxOworCQljYXNlIDB4MWQ6CisJCQlzd2l0Y2ggKChjbWQ+PjE2KSYweGZmKSB7CisJCQljYXNlIDB4MzoKKwkJCQlyZXR1cm4gKGNtZCAmIDB4MWYpICsgMjsKKwkJCWNhc2UgMHg0OgorCQkJCXJldHVybiAoY21kICYgMHhmKSArIDI7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAoY21kICYgMHhmZmZmKSArIDI7CisJCQl9CisJCWNhc2UgMHgxZToKKwkJCWlmIChjbWQgJiAoMSA8PCAyMykpCisJCQkJcmV0dXJuIChjbWQgJiAweGZmZmYpICsgMTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMTsKKwkJY2FzZSAweDFmOgorCQkJaWYgKChjbWQgJiAoMSA8PCAyMykpID09IDApCS8qIGlubGluZSB2ZXJ0aWNlcyAqLworCQkJCXJldHVybiAoY21kICYgMHgxZmZmZikgKyAyOworCQkJZWxzZSBpZiAoY21kICYgKDEgPDwgMTcpKQkvKiBpbmRpcmVjdCByYW5kb20gKi8KKwkJCQlpZiAoKGNtZCAmIDB4ZmZmZikgPT0gMCkKKwkJCQkJcmV0dXJuIDA7CS8qIHVua25vd24gbGVuZ3RoLCB0b28gaGFyZCAqLworCQkJCWVsc2UKKwkJCQkJcmV0dXJuICgoKGNtZCAmIDB4ZmZmZikgKyAxKSAvIDIpICsgMTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMjsJLyogaW5kaXJlY3Qgc2VxdWVudGlhbCAqLworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9jbWQoaW50IGNtZCkKK3sKKwlpbnQgcmV0ID0gZG9fdmFsaWRhdGVfY21kKGNtZCk7CisKKy8qIAlwcmludGsoInZhbGlkYXRlX2NtZCggJXggKTogJWRcbiIsIGNtZCwgcmV0KTsgKi8KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaTkxNV9lbWl0X2NtZHMoZHJtX2RldmljZV90ICogZGV2LCBpbnQgX191c2VyICogYnVmZmVyLCBpbnQgZHdvcmRzKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCVJJTkdfTE9DQUxTOworCisJZm9yIChpID0gMDsgaSA8IGR3b3JkczspIHsKKwkJaW50IGNtZCwgc3o7CisKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoJmNtZCwgJmJ1ZmZlcltpXSwgc2l6ZW9mKGNtZCkpKQorCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworLyogCQlwcmludGsoIiVkLyVkICIsIGksIGR3b3Jkcyk7ICovCisKKwkJaWYgKChzeiA9IHZhbGlkYXRlX2NtZChjbWQpKSA9PSAwIHx8IGkgKyBzeiA+IGR3b3JkcykKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwkJQkVHSU5fTFBfUklORyhzeik7CisJCU9VVF9SSU5HKGNtZCk7CisKKwkJd2hpbGUgKCsraSwgLS1zeikgeworCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoJmNtZCwgJmJ1ZmZlcltpXSwKKwkJCQkJCQkgc2l6ZW9mKGNtZCkpKSB7CisJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCX0KKwkJCU9VVF9SSU5HKGNtZCk7CisJCX0KKwkJQURWQU5DRV9MUF9SSU5HKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTkxNV9lbWl0X2JveChkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkgZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqIGJveGVzLAorCQkJIGludCBpLCBpbnQgRFIxLCBpbnQgRFI0KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9jbGlwX3JlY3RfdCBib3g7CisJUklOR19MT0NBTFM7CisKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmYm94LCAmYm94ZXNbaV0sIHNpemVvZihib3gpKSkgeworCQlyZXR1cm4gRUZBVUxUOworCX0KKworCWlmIChib3gueTIgPD0gYm94LnkxIHx8IGJveC54MiA8PSBib3gueDEgfHwgYm94LnkyIDw9IDAgfHwgYm94LngyIDw9IDApIHsKKwkJRFJNX0VSUk9SKCJCYWQgYm94ICVkLCVkLi4lZCwlZFxuIiwKKwkJCSAgYm94LngxLCBib3gueTEsIGJveC54MiwgYm94LnkyKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlCRUdJTl9MUF9SSU5HKDYpOworCU9VVF9SSU5HKEdGWF9PUF9EUkFXUkVDVF9JTkZPKTsKKwlPVVRfUklORyhEUjEpOworCU9VVF9SSU5HKChib3gueDEgJiAweGZmZmYpIHwgKGJveC55MSA8PCAxNikpOworCU9VVF9SSU5HKCgoYm94LngyIC0gMSkgJiAweGZmZmYpIHwgKChib3gueTIgLSAxKSA8PCAxNikpOworCU9VVF9SSU5HKERSNCk7CisJT1VUX1JJTkcoMCk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2NtZGJ1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkJICAgZHJtX2k5MTVfY21kYnVmZmVyX3QgKiBjbWQpCit7CisJaW50IG5ib3ggPSBjbWQtPm51bV9jbGlwcmVjdHM7CisJaW50IGkgPSAwLCBjb3VudCwgcmV0OworCisJaWYgKGNtZC0+c3ogJiAweDMpIHsKKwkJRFJNX0VSUk9SKCJhbGlnbm1lbnQiKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCWNvdW50ID0gbmJveCA/IG5ib3ggOiAxOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGkgPCBuYm94KSB7CisJCQlyZXQgPSBpOTE1X2VtaXRfYm94KGRldiwgY21kLT5jbGlwcmVjdHMsIGksCisJCQkJCSAgICBjbWQtPkRSMSwgY21kLT5EUjQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gaTkxNV9lbWl0X2NtZHMoZGV2LCAoaW50IF9fdXNlciAqKWNtZC0+YnVmLCBjbWQtPnN6IC8gNCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfYmF0Y2hidWZmZXIoZHJtX2RldmljZV90ICogZGV2LAorCQkJCSAgICAgZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCAqIGJhdGNoKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzID0gYmF0Y2gtPmNsaXByZWN0czsKKwlpbnQgbmJveCA9IGJhdGNoLT5udW1fY2xpcHJlY3RzOworCWludCBpID0gMCwgY291bnQ7CisJUklOR19MT0NBTFM7CisKKwlpZiAoKGJhdGNoLT5zdGFydCB8IGJhdGNoLT51c2VkKSAmIDB4NykgeworCQlEUk1fRVJST1IoImFsaWdubWVudCIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisJY291bnQgPSBuYm94ID8gbmJveCA6IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoaSA8IG5ib3gpIHsKKwkJCWludCByZXQgPSBpOTE1X2VtaXRfYm94KGRldiwgYm94ZXMsIGksCisJCQkJCQliYXRjaC0+RFIxLCBiYXRjaC0+RFI0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChkZXZfcHJpdi0+dXNlX21pX2JhdGNoYnVmZmVyX3N0YXJ0KSB7CisJCQlCRUdJTl9MUF9SSU5HKDIpOworCQkJT1VUX1JJTkcoTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDIgPDwgNikpOworCQkJT1VUX1JJTkcoYmF0Y2gtPnN0YXJ0IHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRSk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJfSBlbHNlIHsKKwkJCUJFR0lOX0xQX1JJTkcoNCk7CisJCQlPVVRfUklORyhNSV9CQVRDSF9CVUZGRVIpOworCQkJT1VUX1JJTkcoYmF0Y2gtPnN0YXJ0IHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRSk7CisJCQlPVVRfUklORyhiYXRjaC0+c3RhcnQgKyBiYXRjaC0+dXNlZCAtIDQpOworCQkJT1VUX1JJTkcoMCk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJfQorCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlcisrOworCisJQkVHSU5fTFBfUklORyg0KTsKKwlPVVRfUklORyhDTURfU1RPUkVfRFdPUkRfSURYKTsKKwlPVVRfUklORygyMCk7CisJT1VUX1JJTkcoZGV2X3ByaXYtPmNvdW50ZXIpOworCU9VVF9SSU5HKDApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9mbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygiJXM6IHBhZ2U9JWQgcGZDdXJyZW50UGFnZT0lZFxuIiwKKwkJICBfX0ZVTkNUSU9OX18sCisJCSAgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSwKKwkJICBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlKTsKKworCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCisJQkVHSU5fTFBfUklORygyKTsKKwlPVVRfUklORyhJTlNUX1BBUlNFUl9DTElFTlQgfCBJTlNUX09QX0ZMVVNIIHwgSU5TVF9GTFVTSF9NQVBfQ0FDSEUpOworCU9VVF9SSU5HKDApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJQkVHSU5fTFBfUklORyg2KTsKKwlPVVRfUklORyhDTURfT1BfRElTUExBWUJVRkZFUl9JTkZPIHwgQVNZTkNfRkxJUCk7CisJT1VUX1JJTkcoMCk7CisJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkgeworCQlPVVRfUklORyhkZXZfcHJpdi0+YmFja19vZmZzZXQpOworCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMTsKKwl9IGVsc2UgeworCQlPVVRfUklORyhkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0KTsKKwkJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDA7CisJfQorCU9VVF9SSU5HKDApOworCUFEVkFOQ0VfTFBfUklORygpOworCisJQkVHSU5fTFBfUklORygyKTsKKwlPVVRfUklORyhNSV9XQUlUX0ZPUl9FVkVOVCB8IE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUCk7CisJT1VUX1JJTkcoMCk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXIrKzsKKworCUJFR0lOX0xQX1JJTkcoNCk7CisJT1VUX1JJTkcoQ01EX1NUT1JFX0RXT1JEX0lEWCk7CisJT1VUX1JJTkcoMjApOworCU9VVF9SSU5HKGRldl9wcml2LT5jb3VudGVyKTsKKwlPVVRfUklORygwKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk5MTVfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCXJldHVybiBpOTE1X3dhaXRfcmluZyhkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4LCBfX0ZVTkNUSU9OX18pOworfQorCitpbnQgaTkxNV9mbHVzaF9pb2N0bChEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlyZXR1cm4gaTkxNV9xdWllc2NlbnQoZGV2KTsKK30KKworaW50IGk5MTVfYmF0Y2hidWZmZXIoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOworCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k5MTVfc2FyZWFfdCAqKQorCSAgICBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1faTkxNV9iYXRjaGJ1ZmZlcl90IGJhdGNoOworCWludCByZXQ7CisKKwlpZiAoIWRldl9wcml2LT5hbGxvd19iYXRjaGJ1ZmZlcikgeworCQlEUk1fRVJST1IoIkJhdGNoYnVmZmVyIGlvY3RsIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoYmF0Y2gsIChkcm1faTkxNV9iYXRjaGJ1ZmZlcl90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YoYmF0Y2gpKTsKKworCURSTV9ERUJVRygiaTkxNSBiYXRjaGJ1ZmZlciwgc3RhcnQgJXggdXNlZCAlZCBjbGlwcmVjdHMgJWRcbiIsCisJCSAgYmF0Y2guc3RhcnQsIGJhdGNoLnVzZWQsIGJhdGNoLm51bV9jbGlwcmVjdHMpOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CisKKwlpZiAoYmF0Y2gubnVtX2NsaXByZWN0cyAmJiBEUk1fVkVSSUZZQVJFQV9SRUFEKGJhdGNoLmNsaXByZWN0cywKKwkJCQkJCSAgICAgICBiYXRjaC5udW1fY2xpcHJlY3RzICoKKwkJCQkJCSAgICAgICBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSkpCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwlyZXQgPSBpOTE1X2Rpc3BhdGNoX2JhdGNoYnVmZmVyKGRldiwgJmJhdGNoKTsKKworCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KWh3X3N0YXR1c1s1XTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaTkxNV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOworCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k5MTVfc2FyZWFfdCAqKQorCSAgICBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1faTkxNV9jbWRidWZmZXJfdCBjbWRidWY7CisJaW50IHJldDsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChjbWRidWYsIChkcm1faTkxNV9jbWRidWZmZXJfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGNtZGJ1ZikpOworCisJRFJNX0RFQlVHKCJpOTE1IGNtZGJ1ZmZlciwgYnVmICVwIHN6ICVkIGNsaXByZWN0cyAlZFxuIiwKKwkJICBjbWRidWYuYnVmLCBjbWRidWYuc3osIGNtZGJ1Zi5udW1fY2xpcHJlY3RzKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOworCisJaWYgKGNtZGJ1Zi5udW1fY2xpcHJlY3RzICYmCisJICAgIERSTV9WRVJJRllBUkVBX1JFQUQoY21kYnVmLmNsaXByZWN0cywKKwkJCQljbWRidWYubnVtX2NsaXByZWN0cyAqCisJCQkJc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKSB7CisJCURSTV9FUlJPUigiRmF1bHQgYWNjZXNzaW5nIGNsaXByZWN0c1xuIik7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJcmV0ID0gaTkxNV9kaXNwYXRjaF9jbWRidWZmZXIoZGV2LCAmY21kYnVmKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiaTkxNV9kaXNwYXRjaF9jbWRidWZmZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludClod19zdGF0dXNbNV07CisJcmV0dXJuIDA7Cit9CisKK2ludCBpOTE1X2RvX2NsZWFudXBfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSAhPSAwKQorCQlpOTE1X2Rpc3BhdGNoX2ZsaXAoZGV2KTsKKworCXJldHVybiAwOworfQorCitpbnQgaTkxNV9mbGlwX2J1ZnMoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCXJldHVybiBpOTE1X2Rpc3BhdGNoX2ZsaXAoZGV2KTsKK30KKworaW50IGk5MTVfZ2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9nZXRwYXJhbV90IHBhcmFtOworCWludCB2YWx1ZTsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwocGFyYW0sIChkcm1faTkxNV9nZXRwYXJhbV90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YocGFyYW0pKTsKKworCXN3aXRjaCAocGFyYW0ucGFyYW0pIHsKKwljYXNlIEk5MTVfUEFSQU1fSVJRX0FDVElWRToKKwkJdmFsdWUgPSBkZXYtPmlycSA/IDEgOiAwOworCQlicmVhazsKKwljYXNlIEk5MTVfUEFSQU1fQUxMT1dfQkFUQ0hCVUZGRVI6CisJCXZhbHVlID0gZGV2X3ByaXYtPmFsbG93X2JhdGNoYnVmZmVyID8gMSA6IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rb3duIHBhcmFtZXRlciAlZFxuIiwgcGFyYW0ucGFyYW0pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmIChEUk1fQ09QWV9UT19VU0VSKHBhcmFtLnZhbHVlLCAmdmFsdWUsIHNpemVvZihpbnQpKSkgeworCQlEUk1fRVJST1IoIkRSTV9DT1BZX1RPX1VTRVIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGk5MTVfc2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9zZXRwYXJhbV90IHBhcmFtOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChwYXJhbSwgKGRybV9pOTE1X3NldHBhcmFtX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihwYXJhbSkpOworCisJc3dpdGNoIChwYXJhbS5wYXJhbSkgeworCWNhc2UgSTkxNV9TRVRQQVJBTV9VU0VfTUlfQkFUQ0hCVUZGRVJfU1RBUlQ6CisJCWRldl9wcml2LT51c2VfbWlfYmF0Y2hidWZmZXJfc3RhcnQgPSBwYXJhbS52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X1NFVFBBUkFNX1RFWF9MUlVfTE9HX0dSQU5VTEFSSVRZOgorCQlkZXZfcHJpdi0+dGV4X2xydV9sb2dfZ3JhbnVsYXJpdHkgPSBwYXJhbS52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X1NFVFBBUkFNX0FMTE9XX0JBVENIQlVGRkVSOgorCQlkZXZfcHJpdi0+YWxsb3dfYmF0Y2hidWZmZXIgPSBwYXJhbS52YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJ1bmtub3duIHBhcmFtZXRlciAlZFxuIiwgcGFyYW0ucGFyYW0pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGk5MTVfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsKKwkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJICAgICAgICBpOTE1X21lbV90YWtlZG93biggJihkZXZfcHJpdi0+YWdwX2hlYXApICk7CisgCX0KKwlpOTE1X2RtYV9jbGVhbnVwKCBkZXYgKTsKK30KKwordm9pZCBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApCit7CisJaWYgKCBkZXYtPmRldl9wcml2YXRlICkgeworCQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKyAgICAgICAgICAgICAgICBpOTE1X21lbV9yZWxlYXNlKCBkZXYsIGZpbHAsIGRldl9wcml2LT5hZ3BfaGVhcCApOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNTVlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKQEAgLTAsMCArMSwxNjcgQEAKKyNpZm5kZWYgX0k5MTVfRFJNX0hfCisjZGVmaW5lIF9JOTE1X0RSTV9IXworCisvKiBQbGVhc2Ugbm90ZSB0aGF0IG1vZGlmaWNhdGlvbnMgdG8gYWxsIHN0cnVjdHMgZGVmaW5lZCBoZXJlIGFyZQorICogc3ViamVjdCB0byBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBjb25zdHJhaW50cy4KKyAqLworCisjaW5jbHVkZSAiZHJtLmgiCisKKy8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiAxNmssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCAyNTUgb2YgdGhlbS4KKyAqLworI2RlZmluZSBJOTE1X05SX1RFWF9SRUdJT05TIDI1NQkvKiB0YWJsZSBzaXplIDJrIC0gbWF4aW11bSBkdWUgdG8gdXNlCisJCQkJICogb2YgY2hhcnMgZm9yIG5leHQvcHJldiBpbmRpY2VzICovCisjZGVmaW5lIEk5MTVfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTQKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X2luaXQgeworCWVudW0geworCQlJOTE1X0lOSVRfRE1BID0gMHgwMSwKKwkJSTkxNV9DTEVBTlVQX0RNQSA9IDB4MDIsCisJCUk5MTVfUkVTVU1FX0RNQSA9IDB4MDMKKwl9IGZ1bmM7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCWludCBzYXJlYV9wcml2X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zdGFydDsKKwl1bnNpZ25lZCBpbnQgcmluZ19lbmQ7CisJdW5zaWduZWQgaW50IHJpbmdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCB3OworCXVuc2lnbmVkIGludCBoOworCXVuc2lnbmVkIGludCBwaXRjaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2hfYml0czsKKwl1bnNpZ25lZCBpbnQgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IGNwcDsKKwl1bnNpZ25lZCBpbnQgY2hpcHNldDsKK30gZHJtX2k5MTVfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfc2FyZWEgeworCWRybV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtJOTE1X05SX1RFWF9SRUdJT05TICsgMV07CisJaW50IGxhc3RfdXBsb2FkOwkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKwlpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KKwlpbnQgdGV4QWdlOworCWludCBwZl9lbmFibGVkOwkJLyogaXMgcGFnZWZsaXBwaW5nIGFsbG93ZWQ/ICovCisJaW50IHBmX2FjdGl2ZTsKKwlpbnQgcGZfY3VycmVudF9wYWdlOwkvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworCWludCBwZXJmX2JveGVzOwkJLyogcGVyZm9ybWFuY2UgYm94ZXMgdG8gYmUgZGlzcGxheWVkICovCit9IGRybV9pOTE1X3NhcmVhX3Q7CisKKy8qIEZsYWdzIGZvciBwZXJmX2JveGVzCisgKi8KKyNkZWZpbmUgSTkxNV9CT1hfUklOR19FTVBUWSAgICAweDEKKyNkZWZpbmUgSTkxNV9CT1hfRkxJUCAgICAgICAgICAweDIKKyNkZWZpbmUgSTkxNV9CT1hfV0FJVCAgICAgICAgICAweDQKKyNkZWZpbmUgSTkxNV9CT1hfVEVYVFVSRV9MT0FEICAweDgKKyNkZWZpbmUgSTkxNV9CT1hfTE9TVF9DT05URVhUICAweDEwCisKKy8qIEk5MTUgc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fSTkxNV9JTklUCQkweDAwCisjZGVmaW5lIERSTV9JOTE1X0ZMVVNICQkweDAxCisjZGVmaW5lIERSTV9JOTE1X0ZMSVAJCTB4MDIKKyNkZWZpbmUgRFJNX0k5MTVfQkFUQ0hCVUZGRVIJMHgwMworI2RlZmluZSBEUk1fSTkxNV9JUlFfRU1JVAkweDA0CisjZGVmaW5lIERSTV9JOTE1X0lSUV9XQUlUCTB4MDUKKyNkZWZpbmUgRFJNX0k5MTVfR0VUUEFSQU0JMHgwNgorI2RlZmluZSBEUk1fSTkxNV9TRVRQQVJBTQkweDA3CisjZGVmaW5lIERSTV9JOTE1X0FMTE9DCQkweDA4CisjZGVmaW5lIERSTV9JOTE1X0ZSRUUJCTB4MDkKKyNkZWZpbmUgRFJNX0k5MTVfSU5JVF9IRUFQCTB4MGEKKyNkZWZpbmUgRFJNX0k5MTVfQ01EQlVGRkVSCTB4MGIKKworI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSU5JVCwgZHJtX2k5MTVfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTFVTSAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0ZMVVNIKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTElQCQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRkxJUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQkFUQ0hCVUZGRVIJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0JBVENIQlVGRkVSLCBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JUlFfRU1JVCAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JUlFfRU1JVCwgZHJtX2k5MTVfaXJxX2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSVJRX1dBSVQgICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSVJRX1dBSVQsIGRybV9pOTE1X2lycV93YWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFVFBBUkFNLCBkcm1faTkxNV9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9TRVRQQVJBTSAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9TRVRQQVJBTSwgZHJtX2k5MTVfc2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQUxMT0MgICAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfQUxMT0MsIGRybV9pOTE1X21lbV9hbGxvY190KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GUkVFICAgICAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9GUkVFLCBkcm1faTkxNV9tZW1fZnJlZV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUX0hFQVAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JTklUX0hFQVAsIGRybV9pOTE1X21lbV9pbml0X2hlYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQ01EQlVGRkVSCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9DTURCVUZGRVIsIGRybV9pOTE1X2NtZGJ1ZmZlcl90KQorCisvKiBBbGxvdyBkcml2ZXJzIHRvIHN1Ym1pdCBiYXRjaGJ1ZmZlcnMgZGlyZWN0bHkgdG8gaGFyZHdhcmUsIHJlbHlpbmcKKyAqIG9uIHRoZSBzZWN1cml0eSBtZWNoYW5pc21zIHByb3ZpZGVkIGJ5IGhhcmR3YXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfYmF0Y2hidWZmZXIgeworCWludCBzdGFydDsJCS8qIGFncCBvZmZzZXQgKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLworCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCit9IGRybV9pOTE1X2JhdGNoYnVmZmVyX3Q7CisKKy8qIEFzIGFib3ZlLCBidXQgcGFzcyBhIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGJ1ZmZlciB3aGljaCBjYW4gYmUKKyAqIHZhbGlkYXRlZCBieSB0aGUga2VybmVsIHByaW9yIHRvIHNlbmRpbmcgdG8gaGFyZHdhcmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9jbWRidWZmZXIgeworCWNoYXIgX191c2VyICpidWY7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNvbW1hbmQgYnVmZmVyICovCisJaW50IHN6OwkJCS8qIG5yIGJ5dGVzIGluIGJ1ZiAqLworCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLworCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCit9IGRybV9pOTE1X2NtZGJ1ZmZlcl90OworCisvKiBVc2Vyc3BhY2UgY2FuIHJlcXVlc3QgJiB3YWl0IG9uIGlycSdzOgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9pcnFfZW1pdCB7CisJaW50IF9fdXNlciAqaXJxX3NlcTsKK30gZHJtX2k5MTVfaXJxX2VtaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaXJxX3dhaXQgeworCWludCBpcnFfc2VxOworfSBkcm1faTkxNV9pcnFfd2FpdF90OworCisvKiBJb2N0bCB0byBxdWVyeSBrZXJuZWwgcGFyYW1zOgorICovCisjZGVmaW5lIEk5MTVfUEFSQU1fSVJRX0FDVElWRSAgICAgICAgICAgIDEKKyNkZWZpbmUgSTkxNV9QQVJBTV9BTExPV19CQVRDSEJVRkZFUiAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9nZXRwYXJhbSB7CisJaW50IHBhcmFtOworCWludCBfX3VzZXIgKnZhbHVlOworfSBkcm1faTkxNV9nZXRwYXJhbV90OworCisvKiBJb2N0bCB0byBzZXQga2VybmVsIHBhcmFtczoKKyAqLworI2RlZmluZSBJOTE1X1NFVFBBUkFNX1VTRV9NSV9CQVRDSEJVRkZFUl9TVEFSVCAgICAgICAgICAgIDEKKyNkZWZpbmUgSTkxNV9TRVRQQVJBTV9URVhfTFJVX0xPR19HUkFOVUxBUklUWSAgICAgICAgICAgICAyCisjZGVmaW5lIEk5MTVfU0VUUEFSQU1fQUxMT1dfQkFUQ0hCVUZGRVIgICAgICAgICAgICAgICAgICAgMworCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9zZXRwYXJhbSB7CisJaW50IHBhcmFtOworCWludCB2YWx1ZTsKK30gZHJtX2k5MTVfc2V0cGFyYW1fdDsKKworLyogQSBtZW1vcnkgbWFuYWdlciBmb3IgcmVnaW9ucyBvZiBzaGFyZWQgbWVtb3J5OgorICovCisjZGVmaW5lIEk5MTVfTUVNX1JFR0lPTl9BR1AgMQorCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9tZW1fYWxsb2MgeworCWludCByZWdpb247CisJaW50IGFsaWdubWVudDsKKwlpbnQgc2l6ZTsKKwlpbnQgX191c2VyICpyZWdpb25fb2Zmc2V0OwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBmYiBvciBhZ3AgKi8KK30gZHJtX2k5MTVfbWVtX2FsbG9jX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X21lbV9mcmVlIHsKKwlpbnQgcmVnaW9uOworCWludCByZWdpb25fb2Zmc2V0OworfSBkcm1faTkxNV9tZW1fZnJlZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9tZW1faW5pdF9oZWFwIHsKKwlpbnQgcmVnaW9uOworCWludCBzaXplOworCWludCBzdGFydDsKK30gZHJtX2k5MTVfbWVtX2luaXRfaGVhcF90OworCisjZW5kaWYJCQkJLyogX0k5MTVfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyYjcwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYwpAQCAtMCwwICsxLDEwNCBAQAorLyogaTkxNV9kcnYuYyAtLSBpODMwLGk4NDUsaTg1NSxpODY1LGk5MTUgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitpbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQoreworCWRldi0+Y291bnRlcnMgKz0gNDsKKwlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKKwlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7CisJZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7CisJZGV2LT50eXBlc1s5XSA9IF9EUk1fU1RBVF9ETUE7CisJCisJRFJNX0lORk8oICJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCURSSVZFUl9OQU1FLAorCQlEUklWRVJfTUFKT1IsCisJCURSSVZFUl9NSU5PUiwKKwkJRFJJVkVSX1BBVENITEVWRUwsCisJCURSSVZFUl9EQVRFLAorCQlkZXYtPnByaW1hcnkubWlub3IsCisJCXBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyc2lvbiggZHJtX3ZlcnNpb25fdCAqdmVyc2lvbiApCit7CisJaW50IGxlbjsKKworCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKKwlEUk1fQ09QWSggdmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUgKTsKKwlEUk1fQ09QWSggdmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0geworCWk5MTVfUENJX0lEUworfTsKKworZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgaTkxNV9pb2N0bHNbXTsKK2V4dGVybiBpbnQgaTkxNV9tYXhfaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1JFUVVJUkVfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwKKwkJCQlEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCwKKwkucHJldGFrZWRvd24gPSBpOTE1X2RyaXZlcl9wcmV0YWtlZG93biwKKwkucHJlcmVsZWFzZSA9IGk5MTVfZHJpdmVyX3ByZXJlbGVhc2UsCisJLmlycV9wcmVpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCisJLmlycV9wb3N0aW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKKwkuaXJxX3VuaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwsCisJLmlycV9oYW5kbGVyID0gaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIsCisJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmlvY3RscyA9IGk5MTVfaW9jdGxzLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwl9LAorCS5wY2lfZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICA9IERSSVZFUl9OQU1FLAorCQkuaWRfdGFibGUgICAgICA9IHBjaWlkbGlzdCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpOTE1X2luaXQodm9pZCkKK3sKKwlkcml2ZXIubnVtX2lvY3RscyA9IGk5MTVfbWF4X2lvY3RsOworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGk5MTVfZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpOTE1X2luaXQpOworbW9kdWxlX2V4aXQoaTkxNV9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmNhOTJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCkBAIC0wLDAgKzEsMjQzIEBACisvKiBpOTE1X2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciB0aGUgSTkxNSBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0k5MTVfRFJWX0hfCisjZGVmaW5lIF9JOTE1X0RSVl9IXworCisvKiBHZW5lcmFsIGN1c3RvbWl6YXRpb246CisgKi8KKworI2RlZmluZSBEUklWRVJfQVVUSE9SCQkiVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJpOTE1IgorI2RlZmluZSBEUklWRVJfREVTQwkJIkludGVsIEdyYXBoaWNzIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDQwNDA1IgorCisvKiBJbnRlcmZhY2UgaGlzdG9yeToKKyAqCisgKiAxLjE6IE9yaWdpbmFsLgorICovCisjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQorI2RlZmluZSBEUklWRVJfTUlOT1IJCTEKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAorCisvKiBXZSB1c2Ugb3VyIG93biBkbWEgbWVjaGFuaXNtcywgbm90IHRoZSBkcm0gdGVtcGxhdGUgY29kZS4gIEhvd2V2ZXIsCisgKiB0aGUgc2hhcmVkIElSUSBjb2RlIGlzIHVzZWZ1bCB0byB1czoKKyAqLworI2RlZmluZSBfX0hBVkVfUE0JCTEKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X3JpbmdfYnVmZmVyIHsKKwlpbnQgdGFpbF9tYXNrOworCXVuc2lnbmVkIGxvbmcgU3RhcnQ7CisJdW5zaWduZWQgbG9uZyBFbmQ7CisJdW5zaWduZWQgbG9uZyBTaXplOworCXU4ICp2aXJ0dWFsX3N0YXJ0OworCWludCBoZWFkOworCWludCB0YWlsOworCWludCBzcGFjZTsKKwlkcm1fbG9jYWxfbWFwX3QgbWFwOworfSBkcm1faTkxNV9yaW5nX2J1ZmZlcl90OworCitzdHJ1Y3QgbWVtX2Jsb2NrIHsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXh0OworCXN0cnVjdCBtZW1fYmxvY2sgKnByZXY7CisJaW50IHN0YXJ0OworCWludCBzaXplOworCURSTUZJTEUgZmlscDsJCS8qIDA6IGZyZWUsIC0xOiBoZWFwLCBvdGhlcjogcmVhbCBmaWxlcyAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSB7CisJZHJtX2xvY2FsX21hcF90ICpzYXJlYTsKKwlkcm1fbG9jYWxfbWFwX3QgKm1taW9fbWFwOworCisJZHJtX2k5MTVfc2FyZWFfdCAqc2FyZWFfcHJpdjsKKwlkcm1faTkxNV9yaW5nX2J1ZmZlcl90IHJpbmc7CisKKwl2b2lkICpod19zdGF0dXNfcGFnZTsKKwl1bnNpZ25lZCBsb25nIGNvdW50ZXI7CisJZG1hX2FkZHJfdCBkbWFfc3RhdHVzX3BhZ2U7CisKKwlpbnQgYmFja19vZmZzZXQ7CisJaW50IGZyb250X29mZnNldDsKKwlpbnQgY3VycmVudF9wYWdlOworCWludCBwYWdlX2ZsaXBwaW5nOworCWludCB1c2VfbWlfYmF0Y2hidWZmZXJfc3RhcnQ7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfcXVldWU7CisJYXRvbWljX3QgaXJxX3JlY2VpdmVkOworCWF0b21pY190IGlycV9lbWl0dGVkOworCisJaW50IHRleF9scnVfbG9nX2dyYW51bGFyaXR5OworCWludCBhbGxvd19iYXRjaGJ1ZmZlcjsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICphZ3BfaGVhcDsKK30gZHJtX2k5MTVfcHJpdmF0ZV90OworCisJCQkJLyogaTkxNV9kbWEuYyAqLworZXh0ZXJuIGludCBpOTE1X2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBpOTE1X2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV9iYXRjaGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfZmxpcF9idWZzKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV9nZXRwYXJhbShEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfc2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBpOTE1X2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gdm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCk7CisKKy8qIGk5MTVfaXJxLmMgKi8KK2V4dGVybiBpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IGk5MTVfaXJxX3dhaXQoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBpOTE1X3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGlycV9ucik7CitleHRlcm4gaW50IGk5MTVfZW1pdF9pcnEoZHJtX2RldmljZV90ICogZGV2KTsKKworZXh0ZXJuIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKmRldik7CisKKy8qIGk5MTVfbWVtLmMgKi8KK2V4dGVybiBpbnQgaTkxNV9tZW1fYWxsb2MoRFJNX0lPQ1RMX0FSR1MpOworZXh0ZXJuIGludCBpOTE1X21lbV9mcmVlKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV9tZW1faW5pdF9oZWFwKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiB2b2lkIGk5MTVfbWVtX3Rha2Vkb3duKHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwKTsKK2V4dGVybiB2b2lkIGk5MTVfbWVtX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LAorCQkJICAgICBEUk1GSUxFIGZpbHAsIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApOworCisjZGVmaW5lIEk5MTVfUkVBRChyZWcpICAgICAgICAgIERSTV9SRUFEMzIoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcpCisjZGVmaW5lIEk5MTVfV1JJVEUocmVnLHZhbCkgICAgIERSTV9XUklURTMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnLCB2YWwpCisjZGVmaW5lIEk5MTVfUkVBRDE2KHJlZykgCURSTV9SRUFEMTYoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcpCisjZGVmaW5lIEk5MTVfV1JJVEUxNihyZWcsdmFsKQlEUk1fV1JJVEUxNihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQorCisjZGVmaW5lIEk5MTVfVkVSQk9TRSAwCisKKyNkZWZpbmUgUklOR19MT0NBTFMJdW5zaWduZWQgaW50IG91dHJpbmcsIHJpbmdtYXNrLCBvdXRjb3VudDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgY2hhciAqdmlydDsKKworI2RlZmluZSBCRUdJTl9MUF9SSU5HKG4pIGRvIHsJCQkJXAorCWlmIChJOTE1X1ZFUkJPU0UpCQkJCVwKKwkJRFJNX0RFQlVHKCJCRUdJTl9MUF9SSU5HKCVkKSBpbiAlc1xuIiwJXAorCQkJICBuLCBfX0ZVTkNUSU9OX18pOwkJXAorCWlmIChkZXZfcHJpdi0+cmluZy5zcGFjZSA8IG4qNCkJCQlcCisJCWk5MTVfd2FpdF9yaW5nKGRldiwgbio0LCBfX0ZVTkNUSU9OX18pOwkJXAorCW91dGNvdW50ID0gMDsJCQkJCVwKKwlvdXRyaW5nID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQlcCisJcmluZ21hc2sgPSBkZXZfcHJpdi0+cmluZy50YWlsX21hc2s7CQlcCisJdmlydCA9IGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQ7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE9VVF9SSU5HKG4pIGRvIHsJCQkJCVwKKwlpZiAoSTkxNV9WRVJCT1NFKSBEUk1fREVCVUcoIiAgIE9VVF9SSU5HICV4XG4iLCAoaW50KShuKSk7CVwKKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSh2aXJ0ICsgb3V0cmluZykgPSBuOwkJXAorICAgICAgICBvdXRjb3VudCsrOwkJCQkJCVwKKwlvdXRyaW5nICs9IDQ7CQkJCQkJXAorCW91dHJpbmcgJj0gcmluZ21hc2s7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFEVkFOQ0VfTFBfUklORygpIGRvIHsJCQkJCQlcCisJaWYgKEk5MTVfVkVSQk9TRSkgRFJNX0RFQlVHKCJBRFZBTkNFX0xQX1JJTkcgJXhcbiIsIG91dHJpbmcpOwlcCisJZGV2X3ByaXYtPnJpbmcudGFpbCA9IG91dHJpbmc7CQkJCQlcCisJZGV2X3ByaXYtPnJpbmcuc3BhY2UgLT0gb3V0Y291bnQgKiA0OwkJCQlcCisJSTkxNV9XUklURShMUF9SSU5HICsgUklOR19UQUlMLCBvdXRyaW5nKTsJCQlcCit9IHdoaWxlKDApCisKK2V4dGVybiBpbnQgaTkxNV93YWl0X3JpbmcoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKKworI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgCQkoKDA8PDI5KXwoMjw8MjMpKQorI2RlZmluZSBHRlhfT1BfQlJFQUtQT0lOVF9JTlRFUlJVUFQJKCgwPDwyOSl8KDE8PDIzKSkKKyNkZWZpbmUgQ01EX1JFUE9SVF9IRUFECQkJKDc8PDIzKQorI2RlZmluZSBDTURfU1RPUkVfRFdPUkRfSURYCQkoKDB4MjE8PDIzKSB8IDB4MSkKKyNkZWZpbmUgQ01EX09QX0JBVENIX0JVRkZFUiAgKCgweDA8PDI5KXwoMHgzMDw8MjMpfDB4MSkKKworI2RlZmluZSBJTlNUX1BBUlNFUl9DTElFTlQgICAweDAwMDAwMDAwCisjZGVmaW5lIElOU1RfT1BfRkxVU0ggICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgSU5TVF9GTFVTSF9NQVBfQ0FDSEUgMHgwMDAwMDAwMQorCisjZGVmaW5lIEJCMV9TVEFSVF9BRERSX01BU0sgICAofjB4NykKKyNkZWZpbmUgQkIxX1BST1RFQ1RFRCAgICAgICAgICgxPDwwKQorI2RlZmluZSBCQjFfVU5QUk9URUNURUQgICAgICAgKDA8PDApCisjZGVmaW5lIEJCMl9FTkRfQUREUl9NQVNLICAgICAofjB4NykKKworI2RlZmluZSBJOTE1UkVHX0hXU1RBTQkJMHgwMjA5OAorI2RlZmluZSBJOTE1UkVHX0lOVF9JREVOVElUWV9SCTB4MDIwYTQKKyNkZWZpbmUgSTkxNVJFR19JTlRfTUFTS19SIAkweDAyMGE4CisjZGVmaW5lIEk5MTVSRUdfSU5UX0VOQUJMRV9SCTB4MDIwYTAKKworI2RlZmluZSBTUlhfSU5ERVgJCTB4M2M0CisjZGVmaW5lIFNSWF9EQVRBCQkweDNjNQorI2RlZmluZSBTUjAxCQkJMQorI2RlZmluZSBTUjAxX1NDUkVFTl9PRkYgCSgxPDw1KQorCisjZGVmaW5lIFBQQ1IJCQkweDYxMjA0CisjZGVmaW5lIFBQQ1JfT04JCQkoMTw8MCkKKworI2RlZmluZSBBRFBBCQkJMHg2MTEwMAorI2RlZmluZSBBRFBBX0RQTVNfTUFTSwkJKH4oMzw8MTApKQorI2RlZmluZSBBRFBBX0RQTVNfT04JCSgwPDwxMCkKKyNkZWZpbmUgQURQQV9EUE1TX1NVU1BFTkQJKDE8PDEwKQorI2RlZmluZSBBRFBBX0RQTVNfU1RBTkRCWQkoMjw8MTApCisjZGVmaW5lIEFEUEFfRFBNU19PRkYJCSgzPDwxMCkKKworI2RlZmluZSBOT1BJRCAgICAgICAgICAgICAgICAgICAweDIwOTQKKyNkZWZpbmUgTFBfUklORyAgICAgCQkweDIwMzAKKyNkZWZpbmUgSFBfUklORyAgICAgCQkweDIwNDAKKyNkZWZpbmUgUklOR19UQUlMICAgICAgCQkweDAwCisjZGVmaW5lIFRBSUxfQUREUgkJMHgwMDFGRkZGOAorI2RlZmluZSBSSU5HX0hFQUQgICAgICAJCTB4MDQKKyNkZWZpbmUgSEVBRF9XUkFQX0NPVU5UICAgICAJMHhGRkUwMDAwMAorI2RlZmluZSBIRUFEX1dSQVBfT05FICAgICAgIAkweDAwMjAwMDAwCisjZGVmaW5lIEhFQURfQUREUiAgICAgICAgICAgCTB4MDAxRkZGRkMKKyNkZWZpbmUgUklOR19TVEFSVCAgICAgCQkweDA4CisjZGVmaW5lIFNUQVJUX0FERFIgICAgICAgICAgCTB4MHhGRkZGRjAwMAorI2RlZmluZSBSSU5HX0xFTiAgICAgICAJCTB4MEMKKyNkZWZpbmUgUklOR19OUl9QQUdFUyAgICAgICAJMHgwMDFGRjAwMAorI2RlZmluZSBSSU5HX1JFUE9SVF9NQVNLICAgIAkweDAwMDAwMDA2CisjZGVmaW5lIFJJTkdfUkVQT1JUXzY0SyAgICAgCTB4MDAwMDAwMDIKKyNkZWZpbmUgUklOR19SRVBPUlRfMTI4SyAgICAJMHgwMDAwMDAwNAorI2RlZmluZSBSSU5HX05PX1JFUE9SVCAgICAgIAkweDAwMDAwMDAwCisjZGVmaW5lIFJJTkdfVkFMSURfTUFTSyAgICAgCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19WQUxJRCAgICAgICAgICAJMHgwMDAwMDAwMQorI2RlZmluZSBSSU5HX0lOVkFMSUQgICAgICAgIAkweDAwMDAwMDAwCisKKyNkZWZpbmUgR0ZYX09QX1NDSVNTT1IgICAgICAgICAoKDB4Mzw8MjkpfCgweDFjPDwyNCl8KDB4MTA8PDE5KSkKKyNkZWZpbmUgU0NfVVBEQVRFX1NDSVNTT1IgICAgICAgKDB4MTw8MSkKKyNkZWZpbmUgU0NfRU5BQkxFX01BU0sgICAgICAgICAgKDB4MTw8MCkKKyNkZWZpbmUgU0NfRU5BQkxFICAgICAgICAgICAgICAgKDB4MTw8MCkKKworI2RlZmluZSBHRlhfT1BfU0NJU1NPUl9JTkZPICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MTw8MTYpfCgweDEpKQorI2RlZmluZSBTQ0lfWU1JTl9NQVNLICAgICAgKDB4ZmZmZjw8MTYpCisjZGVmaW5lIFNDSV9YTUlOX01BU0sgICAgICAoMHhmZmZmPDwwKQorI2RlZmluZSBTQ0lfWU1BWF9NQVNLICAgICAgKDB4ZmZmZjw8MTYpCisjZGVmaW5lIFNDSV9YTUFYX01BU0sgICAgICAoMHhmZmZmPDwwKQorCisjZGVmaW5lIEdGWF9PUF9TQ0lTU09SX0VOQUJMRQkgKCgweDM8PDI5KXwoMHgxYzw8MjQpfCgweDEwPDwxOSkpCisjZGVmaW5lIEdGWF9PUF9TQ0lTU09SX1JFQ1QJICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MTw8MTYpfDEpCisjZGVmaW5lIEdGWF9PUF9DT0xPUl9GQUNUT1IgICAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4MTw8MTYpfDB4MCkKKyNkZWZpbmUgR0ZYX09QX1NUSVBQTEUgICAgICAgICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4Mzw8MTYpKQorI2RlZmluZSBHRlhfT1BfTUFQX0lORk8gICAgICAgICAgKCgweDM8PDI5KXwoMHgxZDw8MjQpfDB4NCkKKyNkZWZpbmUgR0ZYX09QX0RFU1RCVUZGRVJfVkFSUyAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4NTw8MTYpfDB4MCkKKyNkZWZpbmUgR0ZYX09QX0RSQVdSRUNUX0lORk8gICAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg4MDw8MTYpfCgweDMpKQorCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUiAJKCgweDMwPDwyMyl8MSkKKyNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIAkoMHgzMTw8MjMpCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9FTkQgCSgweEE8PDIzKQorI2RlZmluZSBNSV9CQVRDSF9OT05fU0VDVVJFCSgxKQorCisjZGVmaW5lIE1JX1dBSVRfRk9SX0VWRU5UICAgICAgICgoMHgzPDwyMykpCisjZGVmaW5lIE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUCAgICAgICgxPDwyKQorI2RlZmluZSBNSV9XQUlUX0ZPUl9QTEFORV9BX1NDQU5MSU5FUyAoMTw8MSkKKworI2RlZmluZSBNSV9MT0FEX1NDQU5fTElORVNfSU5DTCAgKCgweDEyPDwyMykpCisKKyNkZWZpbmUgQ01EX09QX0RJU1BMQVlCVUZGRVJfSU5GTyAoKDB4MDw8MjkpfCgweDE0PDwyMyl8MikKKyNkZWZpbmUgQVNZTkNfRkxJUCAgICAgICAgICAgICAgICAoMTw8MjIpCisKKyNkZWZpbmUgQ01EX09QX0RFU1RCVUZGRVJfSU5GTwkgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDhlPDwxNil8MSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyMzkyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYwpAQCAtMCwwICsxLDE2MSBAQAorLyogaTkxNV9kbWEuYyAtLSBETUEgc3VwcG9ydCBmb3IgdGhlIEk5MTUgLSotIGxpbnV4LWMgLSotCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCisjZGVmaW5lIFVTRVJfSU5UX0ZMQUcgMHgyCisjZGVmaW5lIE1BWF9OT1BJRCAoKHUzMil+MCkKKyNkZWZpbmUgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSAgKCgodTMyKikoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSlbNV0pCisKK2lycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJdTE2IHRlbXA7CisKKwl0ZW1wID0gSTkxNV9SRUFEMTYoSTkxNVJFR19JTlRfSURFTlRJVFlfUik7CisJdGVtcCAmPSBVU0VSX0lOVF9GTEFHOworCisJRFJNX0RFQlVHKCIlcyBmbGFnPSUwOHhcbiIsIF9fRlVOQ1RJT05fXywgdGVtcCk7CisKKwlpZiAodGVtcCA9PSAwKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfSURFTlRJVFlfUiwgdGVtcCk7CisJRFJNX1dBS0VVUCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBpOTE1X2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgcmV0OworCVJJTkdfTE9DQUxTOworCisJaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcmV0ID0gZGV2X3ByaXYtPmNvdW50ZXI7CisKKwlCRUdJTl9MUF9SSU5HKDIpOworCU9VVF9SSU5HKDApOworCU9VVF9SSU5HKEdGWF9PUF9VU0VSX0lOVEVSUlVQVCk7CisJQURWQU5DRV9MUF9SSU5HKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaTkxNV93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBpcnFfbnIpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0ID0gMDsKKworCURSTV9ERUJVRygiJXMgaXJxX25yPSVkIGJyZWFkY3J1bWI9JWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxX25yLAorCQkgIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikpOworCisJaWYgKFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikgPj0gaXJxX25yKQorCQlyZXR1cm4gMDsKKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk5MTVfQk9YX1dBSVQ7CisKKwlEUk1fV0FJVF9PTihyZXQsIGRldl9wcml2LT5pcnFfcXVldWUsIDMgKiBEUk1fSFosCisJCSAgICBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpID49IGlycV9ucik7CisKKwlpZiAocmV0ID09IERSTV9FUlIoRUJVU1kpKSB7CisJCURSTV9FUlJPUigiJXM6IEVCVVNZIC0tIHJlYzogJWQgZW1pdHRlZDogJWRcbiIsCisJCQkgIF9fRlVOQ1RJT05fXywKKwkJCSAgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSwgKGludClkZXZfcHJpdi0+Y291bnRlcik7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5lZWRzIHRoZSBsb2NrIGFzIGl0IHRvdWNoZXMgdGhlIHJpbmcuCisgKi8KK2ludCBpOTE1X2lycV9lbWl0KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfaXJxX2VtaXRfdCBlbWl0OworCWludCByZXN1bHQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZW1pdCwgKGRybV9pOTE1X2lycV9lbWl0X3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihlbWl0KSk7CisKKwlyZXN1bHQgPSBpOTE1X2VtaXRfaXJxKGRldik7CisKKwlpZiAoRFJNX0NPUFlfVE9fVVNFUihlbWl0LmlycV9zZXEsICZyZXN1bHQsIHNpemVvZihpbnQpKSkgeworCQlEUk1fRVJST1IoImNvcHlfdG9fdXNlclxuIik7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIERvZXNuJ3QgbmVlZCB0aGUgaGFyZHdhcmUgbG9jay4KKyAqLworaW50IGk5MTVfaXJxX3dhaXQoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9pcnFfd2FpdF90IGlycXdhaXQ7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGlycXdhaXQsIChkcm1faTkxNV9pcnFfd2FpdF90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YoaXJxd2FpdCkpOworCisJcmV0dXJuIGk5MTVfd2FpdF9pcnEoZGV2LCBpcnF3YWl0LmlycV9zZXEpOworfQorCisvKiBkcm1fZG1hLmggaG9va3MKKyovCit2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCisJSTkxNV9XUklURTE2KEk5MTVSRUdfSFdTVEFNLCAweGZmZmUpOworCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9NQVNLX1IsIDB4MCk7CisJSTkxNV9XUklURTE2KEk5MTVSRUdfSU5UX0VOQUJMRV9SLCAweDApOworfQorCit2b2lkIGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9FTkFCTEVfUiwgVVNFUl9JTlRfRkxBRyk7CisJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKK30KKwordm9pZCBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWlmICghZGV2X3ByaXYpCisJCXJldHVybjsKKworCUk5MTVfV1JJVEUxNihJOTE1UkVHX0hXU1RBTSwgMHhmZmZmKTsKKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfTUFTS19SLCAweGZmZmYpOworCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9FTkFCTEVfUiwgMHgwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTRhMzAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKiBpOTE1X21lbS5jIC0tIFNpbXBsZSBhZ3AvZmIgbWVtb3J5IG1hbmFnZXIgZm9yIGk5MTUgLSotIGxpbnV4LWMgLSotCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCisvKiBUaGlzIG1lbW9yeSBtYW5hZ2VyIGlzIGludGVncmF0ZWQgaW50byB0aGUgZ2xvYmFsL2xvY2FsIGxydQorICogbWVjaGFuaXNtcyB1c2VkIGJ5IHRoZSBjbGllbnRzLiAgU3BlY2lmaWNhbGx5LCBpdCBvcGVyYXRlcyBieQorICogc2V0dGluZyB0aGUgJ2luX3VzZScgZmllbGRzIG9mIHRoZSBnbG9iYWwgTFJVIHRvIGluZGljYXRlIHdoZXRoZXIKKyAqIHRoaXMgcmVnaW9uIGlzIHByaXZhdGVseSBhbGxvY2F0ZWQgdG8gYSBjbGllbnQuCisgKgorICogVGhpcyBkb2VzIHJlcXVpcmUgdGhlIGNsaWVudCB0byBhY3R1YWxseSByZXNwZWN0IHRoYXQgZmllbGQuCisgKgorICogQ3VycmVudGx5IG5vIGVmZm9ydCBpcyBtYWRlIHRvIGFsbG9jYXRlICdwcml2YXRlJyBtZW1vcnkgaW4gYW55CisgKiBjbGV2ZXIgd2F5IC0gdGhlIExSVSBpbmZvcm1hdGlvbiBpc24ndCB1c2VkIHRvIGRldGVybWluZSB3aGljaAorICogYmxvY2sgdG8gYWxsb2NhdGUsIGFuZCB0aGUgcmluZyBpcyBkcmFpbmVkIHByaW9yIHRvIGFsbG9jYXRpb25zIC0tCisgKiBpbiBvdGhlciB3b3JkcyBhbGxvY2F0aW9uIGlzIGV4cGVuc2l2ZS4KKyAqLworc3RhdGljIHZvaWQgbWFya19ibG9jayhkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBtZW1fYmxvY2sgKnAsIGludCBpbl91c2UpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV90ZXhfcmVnaW9uX3QgKmxpc3Q7CisJdW5zaWduZWQgc2hpZnQsIG5yOworCXVuc2lnbmVkIHN0YXJ0OworCXVuc2lnbmVkIGVuZDsKKwl1bnNpZ25lZCBpOworCWludCBhZ2U7CisKKwlzaGlmdCA9IGRldl9wcml2LT50ZXhfbHJ1X2xvZ19ncmFudWxhcml0eTsKKwluciA9IEk5MTVfTlJfVEVYX1JFR0lPTlM7CisKKwlzdGFydCA9IHAtPnN0YXJ0ID4+IHNoaWZ0OworCWVuZCA9IChwLT5zdGFydCArIHAtPnNpemUgLSAxKSA+PiBzaGlmdDsKKworCWFnZSA9ICsrc2FyZWFfcHJpdi0+dGV4QWdlOworCWxpc3QgPSBzYXJlYV9wcml2LT50ZXhMaXN0OworCisJLyogTWFyayB0aGUgcmVnaW9ucyB3aXRoIHRoZSBuZXcgZmxhZyBhbmQgdXBkYXRlIHRoZWlyIGFnZS4gIE1vdmUKKwkgKiB0aGVtIHRvIGhlYWQgb2YgbGlzdCB0byBwcmVzZXJ2ZSBMUlUgc2VtYW50aWNzLgorCSAqLworCWZvciAoaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7CisJCWxpc3RbaV0uaW5fdXNlID0gaW5fdXNlOworCQlsaXN0W2ldLmFnZSA9IGFnZTsKKworCQkvKiByZW1vdmVfZnJvbV9saXN0KGkpCisJCSAqLworCQlsaXN0Wyh1bnNpZ25lZClsaXN0W2ldLm5leHRdLnByZXYgPSBsaXN0W2ldLnByZXY7CisJCWxpc3RbKHVuc2lnbmVkKWxpc3RbaV0ucHJldl0ubmV4dCA9IGxpc3RbaV0ubmV4dDsKKworCQkvKiBpbnNlcnRfYXRfaGVhZChsaXN0LCBpKQorCQkgKi8KKwkJbGlzdFtpXS5wcmV2ID0gbnI7CisJCWxpc3RbaV0ubmV4dCA9IGxpc3RbbnJdLm5leHQ7CisJCWxpc3RbKHVuc2lnbmVkKWxpc3RbbnJdLm5leHRdLnByZXYgPSBpOworCQlsaXN0W25yXS5uZXh0ID0gaTsKKwl9Cit9CisKKy8qIFZlcnkgc2ltcGxlIGFsbG9jYXRvciBmb3IgYWdwIG1lbW9yeSwgd29ya2luZyBvbiBhIHN0YXRpYyByYW5nZQorICogYWxyZWFkeSBtYXBwZWQgaW50byBlYWNoIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UuICAKKyAqLworCitzdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqc3BsaXRfYmxvY2soc3RydWN0IG1lbV9ibG9jayAqcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSwKKwkJCQkgICAgIERSTUZJTEUgZmlscCkKK3sKKwkvKiBNYXliZSBjdXQgb2ZmIHRoZSBzdGFydCBvZiBhbiBleGlzdGluZyBibG9jayAqLworCWlmIChzdGFydCA+IHAtPnN0YXJ0KSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKm5ld2Jsb2NrID0gZHJtX2FsbG9jKHNpemVvZigqbmV3YmxvY2spLCBEUk1fTUVNX0JVRkxJU1RTKTsKKwkJaWYgKCFuZXdibG9jaykKKwkJCWdvdG8gb3V0OworCQluZXdibG9jay0+c3RhcnQgPSBzdGFydDsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gKHN0YXJ0IC0gcC0+c3RhcnQpOworCQluZXdibG9jay0+ZmlscCA9IE5VTEw7CisJCW5ld2Jsb2NrLT5uZXh0ID0gcC0+bmV4dDsKKwkJbmV3YmxvY2stPnByZXYgPSBwOworCQlwLT5uZXh0LT5wcmV2ID0gbmV3YmxvY2s7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKwkJcC0+c2l6ZSAtPSBuZXdibG9jay0+c2l6ZTsKKwkJcCA9IG5ld2Jsb2NrOworCX0KKworCS8qIE1heWJlIGN1dCBvZmYgdGhlIGVuZCBvZiBhbiBleGlzdGluZyBibG9jayAqLworCWlmIChzaXplIDwgcC0+c2l6ZSkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXdibG9jayA9IGRybV9hbGxvYyhzaXplb2YoKm5ld2Jsb2NrKSwgRFJNX01FTV9CVUZMSVNUUyk7CisJCWlmICghbmV3YmxvY2spCisJCQlnb3RvIG91dDsKKwkJbmV3YmxvY2stPnN0YXJ0ID0gc3RhcnQgKyBzaXplOworCQluZXdibG9jay0+c2l6ZSA9IHAtPnNpemUgLSBzaXplOworCQluZXdibG9jay0+ZmlscCA9IE5VTEw7CisJCW5ld2Jsb2NrLT5uZXh0ID0gcC0+bmV4dDsKKwkJbmV3YmxvY2stPnByZXYgPSBwOworCQlwLT5uZXh0LT5wcmV2ID0gbmV3YmxvY2s7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKwkJcC0+c2l6ZSA9IHNpemU7CisJfQorCisgICAgICBvdXQ6CisJLyogT3VyIGJsb2NrIGlzIGluIHRoZSBtaWRkbGUgKi8KKwlwLT5maWxwID0gZmlscDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKmFsbG9jX2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKmhlYXAsIGludCBzaXplLAorCQkJCSAgICAgaW50IGFsaWduMiwgRFJNRklMRSBmaWxwKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisJaW50IG1hc2sgPSAoMSA8PCBhbGlnbjIpIC0gMTsKKworCWZvciAocCA9IGhlYXAtPm5leHQ7IHAgIT0gaGVhcDsgcCA9IHAtPm5leHQpIHsKKwkJaW50IHN0YXJ0ID0gKHAtPnN0YXJ0ICsgbWFzaykgJiB+bWFzazsKKwkJaWYgKHAtPmZpbHAgPT0gTlVMTCAmJiBzdGFydCArIHNpemUgPD0gcC0+c3RhcnQgKyBwLT5zaXplKQorCQkJcmV0dXJuIHNwbGl0X2Jsb2NrKHAsIHN0YXJ0LCBzaXplLCBmaWxwKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKmZpbmRfYmxvY2soc3RydWN0IG1lbV9ibG9jayAqaGVhcCwgaW50IHN0YXJ0KQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisKKwlmb3IgKHAgPSBoZWFwLT5uZXh0OyBwICE9IGhlYXA7IHAgPSBwLT5uZXh0KQorCQlpZiAocC0+c3RhcnQgPT0gc3RhcnQpCisJCQlyZXR1cm4gcDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKnApCit7CisJcC0+ZmlscCA9IE5VTEw7CisKKwkvKiBBc3N1bWVzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgcmFuZ2UuICBOZWVkcyBhIHNwZWNpYWwgZmlscCBpbgorCSAqICdoZWFwJyB0byBzdG9wIGl0IGJlaW5nIHN1YnN1bWVkLgorCSAqLworCWlmIChwLT5uZXh0LT5maWxwID09IE5VTEwpIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPm5leHQ7CisJCXAtPnNpemUgKz0gcS0+c2l6ZTsKKwkJcC0+bmV4dCA9IHEtPm5leHQ7CisJCXAtPm5leHQtPnByZXYgPSBwOworCQlkcm1fZnJlZShxLCBzaXplb2YoKnEpLCBEUk1fTUVNX0JVRkxJU1RTKTsKKwl9CisKKwlpZiAocC0+cHJldi0+ZmlscCA9PSBOVUxMKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwLT5wcmV2OworCQlxLT5zaXplICs9IHAtPnNpemU7CisJCXEtPm5leHQgPSBwLT5uZXh0OworCQlxLT5uZXh0LT5wcmV2ID0gcTsKKwkJZHJtX2ZyZWUocCwgc2l6ZW9mKCpxKSwgRFJNX01FTV9CVUZMSVNUUyk7CisJfQorfQorCisvKiBJbml0aWFsaXplLiAgSG93IHRvIGNoZWNrIGZvciBhbiB1bmluaXRpYWxpemVkIGhlYXA/CisgKi8KK3N0YXRpYyBpbnQgaW5pdF9oZWFwKHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwLCBpbnQgc3RhcnQsIGludCBzaXplKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKmJsb2NrcyA9IGRybV9hbGxvYyhzaXplb2YoKmJsb2NrcyksIERSTV9NRU1fQlVGTElTVFMpOworCisJaWYgKCFibG9ja3MpCisJCXJldHVybiAtRU5PTUVNOworCisJKmhlYXAgPSBkcm1fYWxsb2Moc2l6ZW9mKCoqaGVhcCksIERSTV9NRU1fQlVGTElTVFMpOworCWlmICghKmhlYXApIHsKKwkJZHJtX2ZyZWUoYmxvY2tzLCBzaXplb2YoKmJsb2NrcyksIERSTV9NRU1fQlVGTElTVFMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlibG9ja3MtPnN0YXJ0ID0gc3RhcnQ7CisJYmxvY2tzLT5zaXplID0gc2l6ZTsKKwlibG9ja3MtPmZpbHAgPSBOVUxMOworCWJsb2Nrcy0+bmV4dCA9IGJsb2Nrcy0+cHJldiA9ICpoZWFwOworCisJbWVtc2V0KCpoZWFwLCAwLCBzaXplb2YoKipoZWFwKSk7CisJKCpoZWFwKS0+ZmlscCA9IChEUk1GSUxFKSAtIDE7CisJKCpoZWFwKS0+bmV4dCA9ICgqaGVhcCktPnByZXYgPSBibG9ja3M7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZyZWUgYWxsIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGVhc2luZyBmaWxlLgorICovCit2b2lkIGk5MTVfbWVtX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHAsIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApCit7CisJc3RydWN0IG1lbV9ibG9jayAqcDsKKworCWlmICghaGVhcCB8fCAhaGVhcC0+bmV4dCkKKwkJcmV0dXJuOworCisJZm9yIChwID0gaGVhcC0+bmV4dDsgcCAhPSBoZWFwOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+ZmlscCA9PSBmaWxwKSB7CisJCQlwLT5maWxwID0gTlVMTDsKKwkJCW1hcmtfYmxvY2soZGV2LCBwLCAwKTsKKwkJfQorCX0KKworCS8qIEFzc3VtZXMgYSBzaW5nbGUgY29udGlndW91cyByYW5nZS4gIE5lZWRzIGEgc3BlY2lhbCBmaWxwIGluCisJICogJ2hlYXAnIHRvIHN0b3AgaXQgYmVpbmcgc3Vic3VtZWQuCisJICovCisJZm9yIChwID0gaGVhcC0+bmV4dDsgcCAhPSBoZWFwOyBwID0gcC0+bmV4dCkgeworCQl3aGlsZSAocC0+ZmlscCA9PSBOVUxMICYmIHAtPm5leHQtPmZpbHAgPT0gTlVMTCkgeworCQkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHAtPm5leHQ7CisJCQlwLT5zaXplICs9IHEtPnNpemU7CisJCQlwLT5uZXh0ID0gcS0+bmV4dDsKKwkJCXAtPm5leHQtPnByZXYgPSBwOworCQkJZHJtX2ZyZWUocSwgc2l6ZW9mKCpxKSwgRFJNX01FTV9CVUZMSVNUUyk7CisJCX0KKwl9Cit9CisKKy8qIFNodXRkb3duLgorICovCit2b2lkIGk5MTVfbWVtX3Rha2Vkb3duKHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisKKwlpZiAoISpoZWFwKQorCQlyZXR1cm47CisKKwlmb3IgKHAgPSAoKmhlYXApLT5uZXh0OyBwICE9ICpoZWFwOykgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcDsKKwkJcCA9IHAtPm5leHQ7CisJCWRybV9mcmVlKHEsIHNpemVvZigqcSksIERSTV9NRU1fQlVGTElTVFMpOworCX0KKworCWRybV9mcmVlKCpoZWFwLCBzaXplb2YoKipoZWFwKSwgRFJNX01FTV9CVUZMSVNUUyk7CisJKmhlYXAgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqKmdldF9oZWFwKGRybV9pOTE1X3ByaXZhdGVfdCAqIGRldl9wcml2LCBpbnQgcmVnaW9uKQoreworCXN3aXRjaCAocmVnaW9uKSB7CisJY2FzZSBJOTE1X01FTV9SRUdJT05fQUdQOgorCQlyZXR1cm4gJmRldl9wcml2LT5hZ3BfaGVhcDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qIElPQ1RMIEhBTkRMRVJTICovCisKK2ludCBpOTE1X21lbV9hbGxvYyhEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X21lbV9hbGxvY190IGFsbG9jOworCXN0cnVjdCBtZW1fYmxvY2sgKmJsb2NrLCAqKmhlYXA7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFsbG9jLCAoZHJtX2k5MTVfbWVtX2FsbG9jX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihhbGxvYykpOworCisJaGVhcCA9IGdldF9oZWFwKGRldl9wcml2LCBhbGxvYy5yZWdpb24pOworCWlmICghaGVhcCB8fCAhKmhlYXApCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwkvKiBNYWtlIHRoaW5ncyBlYXNpZXIgb24gb3Vyc2VsdmVzOiBhbGwgYWxsb2NhdGlvbnMgYXQgbGVhc3QKKwkgKiA0ayBhbGlnbmVkLgorCSAqLworCWlmIChhbGxvYy5hbGlnbm1lbnQgPCAxMikKKwkJYWxsb2MuYWxpZ25tZW50ID0gMTI7CisKKwlibG9jayA9IGFsbG9jX2Jsb2NrKCpoZWFwLCBhbGxvYy5zaXplLCBhbGxvYy5hbGlnbm1lbnQsIGZpbHApOworCisJaWYgKCFibG9jaykKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKworCW1hcmtfYmxvY2soZGV2LCBibG9jaywgMSk7CisKKwlpZiAoRFJNX0NPUFlfVE9fVVNFUihhbGxvYy5yZWdpb25fb2Zmc2V0LCAmYmxvY2stPnN0YXJ0LCBzaXplb2YoaW50KSkpIHsKKwkJRFJNX0VSUk9SKCJjb3B5X3RvX3VzZXJcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaTkxNV9tZW1fZnJlZShEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X21lbV9mcmVlX3QgbWVtZnJlZTsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpibG9jaywgKipoZWFwOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChtZW1mcmVlLCAoZHJtX2k5MTVfbWVtX2ZyZWVfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKG1lbWZyZWUpKTsKKworCWhlYXAgPSBnZXRfaGVhcChkZXZfcHJpdiwgbWVtZnJlZS5yZWdpb24pOworCWlmICghaGVhcCB8fCAhKmhlYXApCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwlibG9jayA9IGZpbmRfYmxvY2soKmhlYXAsIG1lbWZyZWUucmVnaW9uX29mZnNldCk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCWlmIChibG9jay0+ZmlscCAhPSBmaWxwKQorCQlyZXR1cm4gRFJNX0VSUihFUEVSTSk7CisKKwltYXJrX2Jsb2NrKGRldiwgYmxvY2ssIDApOworCWZyZWVfYmxvY2soYmxvY2spOworCXJldHVybiAwOworfQorCitpbnQgaTkxNV9tZW1faW5pdF9oZWFwKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfbWVtX2luaXRfaGVhcF90IGluaXRoZWFwOworCXN0cnVjdCBtZW1fYmxvY2sgKipoZWFwOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpbml0aGVhcCwKKwkJCQkgKGRybV9pOTE1X21lbV9pbml0X2hlYXBfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGluaXRoZWFwKSk7CisKKwloZWFwID0gZ2V0X2hlYXAoZGV2X3ByaXYsIGluaXRoZWFwLnJlZ2lvbik7CisJaWYgKCFoZWFwKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJaWYgKCpoZWFwKSB7CisJCURSTV9FUlJPUigiaGVhcCBhbHJlYWR5IGluaXRpYWxpemVkPyIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCXJldHVybiBpbml0X2hlYXAoaGVhcCwgaW5pdGhlYXAuc3RhcnQsIGluaXRoZWFwLnNpemUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzJlYWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKQEAgLTAsMCArMSw3NTQgQEAKKy8qIG1nYV9kbWEuYyAtLSBETUEgc3VwcG9ydCBmb3IgbWdhIGcyMDAvZzQwMCAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBEZWMgMTMgMDE6NTA6MDEgMTk5OSBieSBqaGFydG1hbm5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBKZWZmIEhhcnRtYW5uIDxqaGFydG1hbm5AdmFsaW51eC5jb20+CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKgorICogUmV3cml0dGVuIGJ5OgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibWdhX2RybS5oIgorI2luY2x1ZGUgIm1nYV9kcnYuaCIKKworI2RlZmluZSBNR0FfREVGQVVMVF9VU0VDX1RJTUVPVVQJMTAwMDAKKyNkZWZpbmUgTUdBX0ZSRUVMSVNUX0RFQlVHCQkwCisKK3N0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKCBkcm1fZGV2aWNlX3QgKmRldiApOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFbmdpbmUgY29udHJvbAorICovCisKK2ludCBtZ2FfZG9fd2FpdF9mb3JfaWRsZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgc3RhdHVzID0gMDsKKwlpbnQgaTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CisJCXN0YXR1cyA9IE1HQV9SRUFEKCBNR0FfU1RBVFVTICkgJiBNR0FfRU5HSU5FX0lETEVfTUFTSzsKKwkJaWYgKCBzdGF0dXMgPT0gTUdBX0VORFBSRE1BU1RTICkgeworCQkJTUdBX1dSSVRFOCggTUdBX0NSVENfSU5ERVgsIDAgKTsKKwkJCXJldHVybiAwOworCQl9CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKyNpZiBNR0FfRE1BX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworCURSTV9JTkZPKCAiICAgc3RhdHVzPTB4JTA4eFxuIiwgc3RhdHVzICk7CisjZW5kaWYKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RvX2RtYV9yZXNldCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX3ByaW1hcnlfYnVmZmVyX3QgKnByaW1hcnkgPSAmZGV2X3ByaXYtPnByaW07CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCS8qIFRoZSBwcmltYXJ5IERNQSBzdHJlYW0gc2hvdWxkIGxvb2sgbGlrZSBuZXcgcmlnaHQgYWJvdXQgbm93LgorCSAqLworCXByaW1hcnktPnRhaWwgPSAwOworCXByaW1hcnktPnNwYWNlID0gcHJpbWFyeS0+c2l6ZTsKKwlwcmltYXJ5LT5sYXN0X2ZsdXNoID0gMDsKKworCXNhcmVhX3ByaXYtPmxhc3Rfd3JhcCA9IDA7CisKKwkvKiBGSVhNRTogUmVzZXQgY291bnRlcnMsIGJ1ZmZlciBhZ2VzIGV0Yy4uLgorCSAqLworCisJLyogRklYTUU6IFdoYXQgZWxzZSBkbyB3ZSBuZWVkIHRvIHJlaW5pdGlhbGl6ZT8gIFdBUlAgc3R1ZmY/CisJICovCisKKwlyZXR1cm4gMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJpbWFyeSBETUEgc3RyZWFtCisgKi8KKwordm9pZCBtZ2FfZG9fZG1hX2ZsdXNoKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2FfcHJpbWFyeV9idWZmZXJfdCAqcHJpbWFyeSA9ICZkZXZfcHJpdi0+cHJpbTsKKwl1MzIgaGVhZCwgdGFpbDsKKwl1MzIgc3RhdHVzID0gMDsKKwlpbnQgaTsKKyAJRE1BX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworICAgICAgICAvKiBXZSBuZWVkIHRvIHdhaXQgc28gdGhhdCB3ZSBjYW4gZG8gYW4gc2FmZSBmbHVzaCAqLworCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CisJCXN0YXR1cyA9IE1HQV9SRUFEKCBNR0FfU1RBVFVTICkgJiBNR0FfRU5HSU5FX0lETEVfTUFTSzsKKwkJaWYgKCBzdGF0dXMgPT0gTUdBX0VORFBSRE1BU1RTICkgYnJlYWs7CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKwlpZiAoIHByaW1hcnktPnRhaWwgPT0gcHJpbWFyeS0+bGFzdF9mbHVzaCApIHsKKwkJRFJNX0RFQlVHKCAiICAgYmFpbGluZyBvdXQuLi5cbiIgKTsKKwkJcmV0dXJuOworCX0KKworCXRhaWwgPSBwcmltYXJ5LT50YWlsICsgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldDsKKworCS8qIFdlIG5lZWQgdG8gcGFkIHRoZSBzdHJlYW0gYmV0d2VlbiBmbHVzaGVzLCBhcyB0aGUgY2FyZAorCSAqIGFjdHVhbGx5IChwYXJ0aWFsbHk/KSByZWFkcyB0aGUgZmlyc3Qgb2YgdGhlc2UgY29tbWFuZHMuCisJICogU2VlIHBhZ2UgNC0xNiBpbiB0aGUgRzQwMCBtYW51YWwsIG1pZGRsZSBvZiB0aGUgcGFnZSBvciBzby4KKwkgKi8KKwlCRUdJTl9ETUEoIDEgKTsKKworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwgIDB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsICAweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELCAgMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCApOworCisJQURWQU5DRV9ETUEoKTsKKworCXByaW1hcnktPmxhc3RfZmx1c2ggPSBwcmltYXJ5LT50YWlsOworCisJaGVhZCA9IE1HQV9SRUFEKCBNR0FfUFJJTUFERFJFU1MgKTsKKworCWlmICggaGVhZCA8PSB0YWlsICkgeworCQlwcmltYXJ5LT5zcGFjZSA9IHByaW1hcnktPnNpemUgLSBwcmltYXJ5LT50YWlsOworCX0gZWxzZSB7CisJCXByaW1hcnktPnNwYWNlID0gaGVhZCAtIHRhaWw7CisJfQorCisJRFJNX0RFQlVHKCAiICAgaGVhZCA9IDB4JTA2bHhcbiIsIGhlYWQgLSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0ICk7CisJRFJNX0RFQlVHKCAiICAgdGFpbCA9IDB4JTA2bHhcbiIsIHRhaWwgLSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0ICk7CisJRFJNX0RFQlVHKCAiICBzcGFjZSA9IDB4JTA2eFxuIiwgcHJpbWFyeS0+c3BhY2UgKTsKKworCW1nYV9mbHVzaF93cml0ZV9jb21iaW5lKCk7CisJTUdBX1dSSVRFKCBNR0FfUFJJTUVORCwgdGFpbCB8IE1HQV9QQUdQWEZFUiApOworCisJRFJNX0RFQlVHKCAiZG9uZS5cbiIgKTsKK30KKwordm9pZCBtZ2FfZG9fZG1hX3dyYXBfc3RhcnQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9wcmltYXJ5X2J1ZmZlcl90ICpwcmltYXJ5ID0gJmRldl9wcml2LT5wcmltOworCXUzMiBoZWFkLCB0YWlsOworCURNQV9MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlCRUdJTl9ETUFfV1JBUCgpOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwICk7CisKKwlBRFZBTkNFX0RNQSgpOworCisJdGFpbCA9IHByaW1hcnktPnRhaWwgKyBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0OworCisJcHJpbWFyeS0+dGFpbCA9IDA7CisJcHJpbWFyeS0+bGFzdF9mbHVzaCA9IDA7CisJcHJpbWFyeS0+bGFzdF93cmFwKys7CisKKwloZWFkID0gTUdBX1JFQUQoIE1HQV9QUklNQUREUkVTUyApOworCisJaWYgKCBoZWFkID09IGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQgKSB7CisJCXByaW1hcnktPnNwYWNlID0gcHJpbWFyeS0+c2l6ZTsKKwl9IGVsc2UgeworCQlwcmltYXJ5LT5zcGFjZSA9IGhlYWQgLSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0OworCX0KKworCURSTV9ERUJVRyggIiAgIGhlYWQgPSAweCUwNmx4XG4iLAorCQkgIGhlYWQgLSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0ICk7CisJRFJNX0RFQlVHKCAiICAgdGFpbCA9IDB4JTA2eFxuIiwgcHJpbWFyeS0+dGFpbCApOworCURSTV9ERUJVRyggIiAgIHdyYXAgPSAlZFxuIiwgcHJpbWFyeS0+bGFzdF93cmFwICk7CisJRFJNX0RFQlVHKCAiICBzcGFjZSA9IDB4JTA2eFxuIiwgcHJpbWFyeS0+c3BhY2UgKTsKKworCW1nYV9mbHVzaF93cml0ZV9jb21iaW5lKCk7CisJTUdBX1dSSVRFKCBNR0FfUFJJTUVORCwgdGFpbCB8IE1HQV9QQUdQWEZFUiApOworCisJc2V0X2JpdCggMCwgJnByaW1hcnktPndyYXBwZWQgKTsKKwlEUk1fREVCVUcoICJkb25lLlxuIiApOworfQorCit2b2lkIG1nYV9kb19kbWFfd3JhcF9lbmQoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9wcmltYXJ5X2J1ZmZlcl90ICpwcmltYXJ5ID0gJmRldl9wcml2LT5wcmltOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXUzMiBoZWFkID0gZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCXNhcmVhX3ByaXYtPmxhc3Rfd3JhcCsrOworCURSTV9ERUJVRyggIiAgIHdyYXAgPSAlZFxuIiwgc2FyZWFfcHJpdi0+bGFzdF93cmFwICk7CisKKwltZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpOworCU1HQV9XUklURSggTUdBX1BSSU1BRERSRVNTLCBoZWFkIHwgTUdBX0RNQV9HRU5FUkFMICk7CisKKwljbGVhcl9iaXQoIDAsICZwcmltYXJ5LT53cmFwcGVkICk7CisJRFJNX0RFQlVHKCAiZG9uZS5cbiIgKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGcmVlbGlzdCBtYW5hZ2VtZW50CisgKi8KKworI2RlZmluZSBNR0FfQlVGRkVSX1VTRUQJCX4wCisjZGVmaW5lIE1HQV9CVUZGRVJfRlJFRQkJMAorCisjaWYgTUdBX0ZSRUVMSVNUX0RFQlVHCitzdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcHJpbnQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnk7CisKKwlEUk1fSU5GTyggIlxuIiApOworCURSTV9JTkZPKCAiY3VycmVudCBkaXNwYXRjaDogbGFzdD0weCV4IGRvbmU9MHgleFxuIiwKKwkJICBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCwKKwkJICAodW5zaWduZWQgaW50KShNR0FfUkVBRCggTUdBX1BSSU1BRERSRVNTICkgLQorCQkJCSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0KSApOworCURSTV9JTkZPKCAiY3VycmVudCBmcmVlbGlzdDpcbiIgKTsKKworCWZvciAoIGVudHJ5ID0gZGV2X3ByaXYtPmhlYWQtPm5leHQgOyBlbnRyeSA7IGVudHJ5ID0gZW50cnktPm5leHQgKSB7CisJCURSTV9JTkZPKCAiICAgJXAgICBpZHg9JTJkICBhZ2U9MHgleCAweCUwNmx4XG4iLAorCQkJICBlbnRyeSwgZW50cnktPmJ1Zi0+aWR4LCBlbnRyeS0+YWdlLmhlYWQsCisJCQkgIGVudHJ5LT5hZ2UuaGVhZCAtIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQgKTsKKwl9CisJRFJNX0lORk8oICJcbiIgKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG1nYV9mcmVlbGlzdF9pbml0KCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnk7CisJaW50IGk7CisJRFJNX0RFQlVHKCAiY291bnQ9JWRcbiIsIGRtYS0+YnVmX2NvdW50ICk7CisKKwlkZXZfcHJpdi0+aGVhZCA9IGRybV9hbGxvYyggc2l6ZW9mKGRybV9tZ2FfZnJlZWxpc3RfdCksCisJCQkJICAgICBEUk1fTUVNX0RSSVZFUiApOworCWlmICggZGV2X3ByaXYtPmhlYWQgPT0gTlVMTCApCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwltZW1zZXQoIGRldl9wcml2LT5oZWFkLCAwLCBzaXplb2YoZHJtX21nYV9mcmVlbGlzdF90KSApOworCVNFVF9BR0UoICZkZXZfcHJpdi0+aGVhZC0+YWdlLCBNR0FfQlVGRkVSX1VTRUQsIDAgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJICAgICAgICBidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwkJZW50cnkgPSBkcm1fYWxsb2MoIHNpemVvZihkcm1fbWdhX2ZyZWVsaXN0X3QpLAorCQkJCSAgICBEUk1fTUVNX0RSSVZFUiApOworCQlpZiAoIGVudHJ5ID09IE5VTEwgKQorCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKworCQltZW1zZXQoIGVudHJ5LCAwLCBzaXplb2YoZHJtX21nYV9mcmVlbGlzdF90KSApOworCisJCWVudHJ5LT5uZXh0ID0gZGV2X3ByaXYtPmhlYWQtPm5leHQ7CisJCWVudHJ5LT5wcmV2ID0gZGV2X3ByaXYtPmhlYWQ7CisJCVNFVF9BR0UoICZlbnRyeS0+YWdlLCBNR0FfQlVGRkVSX0ZSRUUsIDAgKTsKKwkJZW50cnktPmJ1ZiA9IGJ1ZjsKKworCQlpZiAoIGRldl9wcml2LT5oZWFkLT5uZXh0ICE9IE5VTEwgKQorCQkJZGV2X3ByaXYtPmhlYWQtPm5leHQtPnByZXYgPSBlbnRyeTsKKwkJaWYgKCBlbnRyeS0+bmV4dCA9PSBOVUxMICkKKwkJCWRldl9wcml2LT50YWlsID0gZW50cnk7CisKKwkJYnVmX3ByaXYtPmxpc3RfZW50cnkgPSBlbnRyeTsKKwkJYnVmX3ByaXYtPmRpc2NhcmQgPSAwOworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisKKwkJZGV2X3ByaXYtPmhlYWQtPm5leHQgPSBlbnRyeTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X2NsZWFudXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnk7CisJZHJtX21nYV9mcmVlbGlzdF90ICpuZXh0OworCURSTV9ERUJVRyggIlxuIiApOworCisJZW50cnkgPSBkZXZfcHJpdi0+aGVhZDsKKwl3aGlsZSAoIGVudHJ5ICkgeworCQluZXh0ID0gZW50cnktPm5leHQ7CisJCWRybV9mcmVlKCBlbnRyeSwgc2l6ZW9mKGRybV9tZ2FfZnJlZWxpc3RfdCksIERSTV9NRU1fRFJJVkVSICk7CisJCWVudHJ5ID0gbmV4dDsKKwl9CisKKwlkZXZfcHJpdi0+aGVhZCA9IGRldl9wcml2LT50YWlsID0gTlVMTDsKK30KKworI2lmIDAKKy8qIEZJWE1FOiBTdGlsbCBuZWVkZWQ/CisgKi8KK3N0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9yZXNldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJaW50IGk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkbWEtPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCSAgICAgICAgYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCQlTRVRfQUdFKCAmYnVmX3ByaXYtPmxpc3RfZW50cnktPmFnZSwKKwkJCSBNR0FfQlVGRkVSX0ZSRUUsIDAgKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGRybV9idWZfdCAqbWdhX2ZyZWVsaXN0X2dldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9mcmVlbGlzdF90ICpuZXh0OworCWRybV9tZ2FfZnJlZWxpc3RfdCAqcHJldjsKKwlkcm1fbWdhX2ZyZWVsaXN0X3QgKnRhaWwgPSBkZXZfcHJpdi0+dGFpbDsKKwl1MzIgaGVhZCwgd3JhcDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWhlYWQgPSBNR0FfUkVBRCggTUdBX1BSSU1BRERSRVNTICk7CisJd3JhcCA9IGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X3dyYXA7CisKKwlEUk1fREVCVUcoICIgICB0YWlsPTB4JTA2bHggJWRcbiIsCisJCSAgIHRhaWwtPmFnZS5oZWFkID8KKwkJICAgdGFpbC0+YWdlLmhlYWQgLSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0IDogMCwKKwkJICAgdGFpbC0+YWdlLndyYXAgKTsKKwlEUk1fREVCVUcoICIgICBoZWFkPTB4JTA2bHggJWRcbiIsCisJCSAgIGhlYWQgLSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0LCB3cmFwICk7CisKKwlpZiAoIFRFU1RfQUdFKCAmdGFpbC0+YWdlLCBoZWFkLCB3cmFwICkgKSB7CisJCXByZXYgPSBkZXZfcHJpdi0+dGFpbC0+cHJldjsKKwkJbmV4dCA9IGRldl9wcml2LT50YWlsOworCQlwcmV2LT5uZXh0ID0gTlVMTDsKKwkJbmV4dC0+cHJldiA9IG5leHQtPm5leHQgPSBOVUxMOworCQlkZXZfcHJpdi0+dGFpbCA9IHByZXY7CisJCVNFVF9BR0UoICZuZXh0LT5hZ2UsIE1HQV9CVUZGRVJfVVNFRCwgMCApOworCQlyZXR1cm4gbmV4dC0+YnVmOworCX0KKworCURSTV9ERUJVRyggInJldHVybmluZyBOVUxMIVxuIiApOworCXJldHVybiBOVUxMOworfQorCitpbnQgbWdhX2ZyZWVsaXN0X3B1dCggZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfdCAqYnVmICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCWRybV9tZ2FfZnJlZWxpc3RfdCAqaGVhZCwgKmVudHJ5LCAqcHJldjsKKworCURSTV9ERUJVRyggImFnZT0weCUwNmx4IHdyYXA9JWRcbiIsCisJCSAgIGJ1Zl9wcml2LT5saXN0X2VudHJ5LT5hZ2UuaGVhZCAtCisJCSAgIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQsCisJCSAgIGJ1Zl9wcml2LT5saXN0X2VudHJ5LT5hZ2Uud3JhcCApOworCisJZW50cnkgPSBidWZfcHJpdi0+bGlzdF9lbnRyeTsKKwloZWFkID0gZGV2X3ByaXYtPmhlYWQ7CisKKwlpZiAoIGJ1Zl9wcml2LT5saXN0X2VudHJ5LT5hZ2UuaGVhZCA9PSBNR0FfQlVGRkVSX1VTRUQgKSB7CisJCVNFVF9BR0UoICZlbnRyeS0+YWdlLCBNR0FfQlVGRkVSX0ZSRUUsIDAgKTsKKwkJcHJldiA9IGRldl9wcml2LT50YWlsOworCQlwcmV2LT5uZXh0ID0gZW50cnk7CisJCWVudHJ5LT5wcmV2ID0gcHJldjsKKwkJZW50cnktPm5leHQgPSBOVUxMOworCX0gZWxzZSB7CisJCXByZXYgPSBoZWFkLT5uZXh0OworCQloZWFkLT5uZXh0ID0gZW50cnk7CisJCXByZXYtPnByZXYgPSBlbnRyeTsKKwkJZW50cnktPnByZXYgPSBoZWFkOworCQllbnRyeS0+bmV4dCA9IHByZXY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRE1BIGluaXRpYWxpemF0aW9uLCBjbGVhbnVwCisgKi8KKworc3RhdGljIGludCBtZ2FfZG9faW5pdF9kbWEoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbWdhX2luaXRfdCAqaW5pdCApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2OworCWludCByZXQ7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlkZXZfcHJpdiA9IGRybV9hbGxvYyggc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIgKTsKKwlpZiAoICFkZXZfcHJpdiApCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwltZW1zZXQoIGRldl9wcml2LCAwLCBzaXplb2YoZHJtX21nYV9wcml2YXRlX3QpICk7CisKKwlkZXZfcHJpdi0+Y2hpcHNldCA9IGluaXQtPmNoaXBzZXQ7CisKKwlkZXZfcHJpdi0+dXNlY190aW1lb3V0ID0gTUdBX0RFRkFVTFRfVVNFQ19USU1FT1VUOworCisJaWYgKCBpbml0LT5zZ3JhbSApIHsKKwkJZGV2X3ByaXYtPmNsZWFyX2NtZCA9IE1HQV9EV0dDVExfQ0xFQVIgfCBNR0FfQVRZUEVfQkxLOworCX0gZWxzZSB7CisJCWRldl9wcml2LT5jbGVhcl9jbWQgPSBNR0FfRFdHQ1RMX0NMRUFSIHwgTUdBX0FUWVBFX1JTVFI7CisJfQorCWRldl9wcml2LT5tYWNjZXNzCT0gaW5pdC0+bWFjY2VzczsKKworCWRldl9wcml2LT5mYl9jcHAJPSBpbml0LT5mYl9jcHA7CisJZGV2X3ByaXYtPmZyb250X29mZnNldAk9IGluaXQtPmZyb250X29mZnNldDsKKwlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2gJPSBpbml0LT5mcm9udF9waXRjaDsKKwlkZXZfcHJpdi0+YmFja19vZmZzZXQJPSBpbml0LT5iYWNrX29mZnNldDsKKwlkZXZfcHJpdi0+YmFja19waXRjaAk9IGluaXQtPmJhY2tfcGl0Y2g7CisKKwlkZXZfcHJpdi0+ZGVwdGhfY3BwCT0gaW5pdC0+ZGVwdGhfY3BwOworCWRldl9wcml2LT5kZXB0aF9vZmZzZXQJPSBpbml0LT5kZXB0aF9vZmZzZXQ7CisJZGV2X3ByaXYtPmRlcHRoX3BpdGNoCT0gaW5pdC0+ZGVwdGhfcGl0Y2g7CisKKwkvKiBGSVhNRTogTmVlZCB0byBzdXBwb3J0IEFHUCB0ZXh0dXJlcy4uLgorCSAqLworCWRldl9wcml2LT50ZXh0dXJlX29mZnNldCA9IGluaXQtPnRleHR1cmVfb2Zmc2V0WzBdOworCWRldl9wcml2LT50ZXh0dXJlX3NpemUgPSBpbml0LT50ZXh0dXJlX3NpemVbMF07CisKKwlEUk1fR0VUU0FSRUEoKTsKKworCWlmKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgc2FyZWEhXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPm1taW8gPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOworCWlmKCFkZXZfcHJpdi0+bW1pbykgeworCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gZmluZCBtbWlvIHJlZ2lvbiFcbiIgKTsKKwkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2X3ByaXYtPnN0YXR1cyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5zdGF0dXNfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPnN0YXR1cykgeworCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gZmluZCBzdGF0dXMgcGFnZSFcbiIgKTsKKwkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2X3ByaXYtPndhcnAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+d2FycF9vZmZzZXQpOworCWlmKCFkZXZfcHJpdi0+d2FycCkgeworCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gZmluZCB3YXJwIG1pY3JvY29kZSByZWdpb24hXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT5wcmltYXJ5ID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPnByaW1hcnlfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPnByaW1hcnkpIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGZpbmQgcHJpbWFyeSBkbWEgcmVnaW9uIVxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKKwlpZighZGV2LT5hZ3BfYnVmZmVyX21hcCkgeworCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gZmluZCBkbWEgYnVmZmVyIHJlZ2lvbiFcbiIgKTsKKwkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9CisJCShkcm1fbWdhX3NhcmVhX3QgKikoKHU4ICopZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGUgKworCQkJCSAgICBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKwlkcm1fY29yZV9pb3JlbWFwKCBkZXZfcHJpdi0+d2FycCwgZGV2ICk7CisJZHJtX2NvcmVfaW9yZW1hcCggZGV2X3ByaXYtPnByaW1hcnksIGRldiApOworCWRybV9jb3JlX2lvcmVtYXAoIGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldiApOworCisJaWYoIWRldl9wcml2LT53YXJwLT5oYW5kbGUgfHwKKwkgICAhZGV2X3ByaXYtPnByaW1hcnktPmhhbmRsZSB8fAorCSAgICFkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKSB7CisJCURSTV9FUlJPUiggImZhaWxlZCB0byBpb3JlbWFwIGFncCByZWdpb25zIVxuIiApOworCQkvKiBBc3NpZ24gZGV2X3ByaXZhdGUgc28gd2UgY2FuIGRvIGNsZWFudXAuICovCisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCXJldCA9IG1nYV93YXJwX2luc3RhbGxfbWljcm9jb2RlKCBkZXZfcHJpdiApOworCWlmICggcmV0IDwgMCApIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGluc3RhbGwgV0FSUCB1Y29kZSFcbiIgKTsKKwkJLyogQXNzaWduIGRldl9wcml2YXRlIHNvIHdlIGNhbiBkbyBjbGVhbnVwLiAqLworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKCBkZXYgKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBtZ2Ffd2FycF9pbml0KCBkZXZfcHJpdiApOworCWlmICggcmV0IDwgMCApIHsKKwkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGluaXQgV0FSUCBlbmdpbmUhXG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X3ByaXYtPnByaW0uc3RhdHVzID0gKHUzMiAqKWRldl9wcml2LT5zdGF0dXMtPmhhbmRsZTsKKworCW1nYV9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApOworCisJLyogSW5pdCB0aGUgcHJpbWFyeSBETUEgcmVnaXN0ZXJzLgorCSAqLworCU1HQV9XUklURSggTUdBX1BSSU1BRERSRVNTLAorCQkgICBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0IHwgTUdBX0RNQV9HRU5FUkFMICk7CisjaWYgMAorCU1HQV9XUklURSggTUdBX1BSSU1QVFIsCisJCSAgIHZpcnRfdG9fYnVzKCh2b2lkICopZGV2X3ByaXYtPnByaW0uc3RhdHVzKSB8CisJCSAgIE1HQV9QUklNUFRSRU4wIHwJLyogU29mdCB0cmFwLCBTRUNFTkQsIFNFVFVQRU5EICovCisJCSAgIE1HQV9QUklNUFRSRU4xICk7CS8qIERXR1NZTkMgKi8KKyNlbmRpZgorCisJZGV2X3ByaXYtPnByaW0uc3RhcnQgPSAodTggKilkZXZfcHJpdi0+cHJpbWFyeS0+aGFuZGxlOworCWRldl9wcml2LT5wcmltLmVuZCA9ICgodTggKilkZXZfcHJpdi0+cHJpbWFyeS0+aGFuZGxlCisJCQkgICAgICArIGRldl9wcml2LT5wcmltYXJ5LT5zaXplKTsKKwlkZXZfcHJpdi0+cHJpbS5zaXplID0gZGV2X3ByaXYtPnByaW1hcnktPnNpemU7CisKKwlkZXZfcHJpdi0+cHJpbS50YWlsID0gMDsKKwlkZXZfcHJpdi0+cHJpbS5zcGFjZSA9IGRldl9wcml2LT5wcmltLnNpemU7CisJZGV2X3ByaXYtPnByaW0ud3JhcHBlZCA9IDA7CisKKwlkZXZfcHJpdi0+cHJpbS5sYXN0X2ZsdXNoID0gMDsKKwlkZXZfcHJpdi0+cHJpbS5sYXN0X3dyYXAgPSAwOworCisJZGV2X3ByaXYtPnByaW0uaGlnaF9tYXJrID0gMjU2ICogRE1BX0JMT0NLX1NJWkU7CisKKwlkZXZfcHJpdi0+cHJpbS5zdGF0dXNbMF0gPSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0OworCWRldl9wcml2LT5wcmltLnN0YXR1c1sxXSA9IDA7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF93cmFwID0gMDsKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZS5oZWFkID0gMDsKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZS53cmFwID0gMDsKKworCWlmICggbWdhX2ZyZWVsaXN0X2luaXQoIGRldiwgZGV2X3ByaXYgKSA8IDAgKSB7CisJCURSTV9FUlJPUiggImNvdWxkIG5vdCBpbml0aWFsaXplIGZyZWVsaXN0XG4iICk7CisJCS8qIEFzc2lnbiBkZXZfcHJpdmF0ZSBzbyB3ZSBjYW4gZG8gY2xlYW51cC4gKi8KKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCW1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJLyogTWFrZSBkZXZfcHJpdmF0ZSB2aXNhYmxlIHRvIG90aGVycy4gKi8KKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAorCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKKwkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KKwkgKi8KKwlpZiAoIGRldi0+aXJxX2VuYWJsZWQgKSBkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCisJaWYgKCBkZXYtPmRldl9wcml2YXRlICkgeworCQlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJCWlmICggZGV2X3ByaXYtPndhcnAgIT0gTlVMTCApCisJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2X3ByaXYtPndhcnAsIGRldiApOworCQlpZiAoIGRldl9wcml2LT5wcmltYXJ5ICE9IE5VTEwgKQorCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldl9wcml2LT5wcmltYXJ5LCBkZXYgKTsKKwkJaWYgKCBkZXYtPmFncF9idWZmZXJfbWFwICE9IE5VTEwgKQorCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldiApOworCisJCWlmICggZGV2X3ByaXYtPmhlYWQgIT0gTlVMTCApIHsKKwkJCW1nYV9mcmVlbGlzdF9jbGVhbnVwKCBkZXYgKTsKKwkJfQorCisJCWRybV9mcmVlKCBkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX21nYV9wcml2YXRlX3QpLAorCQkJICAgRFJNX01FTV9EUklWRVIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtZ2FfZG1hX2luaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfaW5pdF90IGluaXQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBpbml0LCAoZHJtX21nYV9pbml0X3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGluaXQpICk7CisKKwlzd2l0Y2ggKCBpbml0LmZ1bmMgKSB7CisJY2FzZSBNR0FfSU5JVF9ETUE6CisJCXJldHVybiBtZ2FfZG9faW5pdF9kbWEoIGRldiwgJmluaXQgKTsKKwljYXNlIE1HQV9DTEVBTlVQX0RNQToKKwkJcmV0dXJuIG1nYV9kb19jbGVhbnVwX2RtYSggZGV2ICk7CisJfQorCisJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQcmltYXJ5IERNQSBzdHJlYW0gbWFuYWdlbWVudAorICovCisKK2ludCBtZ2FfZG1hX2ZsdXNoKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWRybV9sb2NrX3QgbG9jazsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGxvY2ssIChkcm1fbG9ja190IF9fdXNlciAqKWRhdGEsIHNpemVvZihsb2NrKSApOworCisJRFJNX0RFQlVHKCAiJXMlcyVzXG4iLAorCQkgICAobG9jay5mbGFncyAmIF9EUk1fTE9DS19GTFVTSCkgPwkiZmx1c2gsICIgOiAiIiwKKwkJICAgKGxvY2suZmxhZ3MgJiBfRFJNX0xPQ0tfRkxVU0hfQUxMKSA/CSJmbHVzaCBhbGwsICIgOiAiIiwKKwkJICAgKGxvY2suZmxhZ3MgJiBfRFJNX0xPQ0tfUVVJRVNDRU5UKSA/CSJpZGxlLCAiIDogIiIgKTsKKworCVdSQVBfV0FJVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWlmICggbG9jay5mbGFncyAmIChfRFJNX0xPQ0tfRkxVU0ggfCBfRFJNX0xPQ0tfRkxVU0hfQUxMKSApIHsKKwkJbWdhX2RvX2RtYV9mbHVzaCggZGV2X3ByaXYgKTsKKwl9CisKKwlpZiAoIGxvY2suZmxhZ3MgJiBfRFJNX0xPQ0tfUVVJRVNDRU5UICkgeworI2lmIE1HQV9ETUFfREVCVUcKKwkJaW50IHJldCA9IG1nYV9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApOworCQlpZiAoIHJldCA8IDAgKQorCQkJRFJNX0lORk8oICIlczogLUVCVVNZXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIHJldDsKKyNlbHNlCisJCXJldHVybiBtZ2FfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworaW50IG1nYV9kbWFfcmVzZXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJcmV0dXJuIG1nYV9kb19kbWFfcmVzZXQoIGRldl9wcml2ICk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRE1BIGJ1ZmZlciBtYW5hZ2VtZW50CisgKi8KKworc3RhdGljIGludCBtZ2FfZG1hX2dldF9idWZmZXJzKCBEUk1GSUxFIGZpbHAsCisJCQkJZHJtX2RldmljZV90ICpkZXYsIGRybV9kbWFfdCAqZCApCit7CisJZHJtX2J1Zl90ICpidWY7CisJaW50IGk7CisKKwlmb3IgKCBpID0gZC0+Z3JhbnRlZF9jb3VudCA7IGkgPCBkLT5yZXF1ZXN0X2NvdW50IDsgaSsrICkgeworCQlidWYgPSBtZ2FfZnJlZWxpc3RfZ2V0KCBkZXYgKTsKKwkJaWYgKCAhYnVmICkgcmV0dXJuIERSTV9FUlIoRUFHQUlOKTsKKworCQlidWYtPmZpbHAgPSBmaWxwOworCisJCWlmICggRFJNX0NPUFlfVE9fVVNFUiggJmQtPnJlcXVlc3RfaW5kaWNlc1tpXSwKKwkJCQkgICAmYnVmLT5pZHgsIHNpemVvZihidWYtPmlkeCkgKSApCisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQlpZiAoIERSTV9DT1BZX1RPX1VTRVIoICZkLT5yZXF1ZXN0X3NpemVzW2ldLAorCQkJCSAgICZidWYtPnRvdGFsLCBzaXplb2YoYnVmLT50b3RhbCkgKSApCisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJCWQtPmdyYW50ZWRfY291bnQrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtZ2FfZG1hX2J1ZmZlcnMoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RtYV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJZHJtX2RtYV90IGQ7CisJaW50IHJldCA9IDA7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBkLCBhcmdwLCBzaXplb2YoZCkgKTsKKworCS8qIFBsZWFzZSBkb24ndCBzZW5kIHVzIGJ1ZmZlcnMuCisJICovCisJaWYgKCBkLnNlbmRfY291bnQgIT0gMCApIHsKKwkJRFJNX0VSUk9SKCAiUHJvY2VzcyAlZCB0cnlpbmcgdG8gc2VuZCAlZCBidWZmZXJzIHZpYSBkcm1ETUFcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgZC5zZW5kX2NvdW50ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJLyogV2UnbGwgc2VuZCB5b3UgYnVmZmVycy4KKwkgKi8KKwlpZiAoIGQucmVxdWVzdF9jb3VudCA8IDAgfHwgZC5yZXF1ZXN0X2NvdW50ID4gZG1hLT5idWZfY291bnQgKSB7CisJCURSTV9FUlJPUiggIlByb2Nlc3MgJWQgdHJ5aW5nIHRvIGdldCAlZCBidWZmZXJzIChvZiAlZCBtYXgpXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGQucmVxdWVzdF9jb3VudCwgZG1hLT5idWZfY291bnQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlkLmdyYW50ZWRfY291bnQgPSAwOworCisJaWYgKCBkLnJlcXVlc3RfY291bnQgKSB7CisJCXJldCA9IG1nYV9kbWFfZ2V0X2J1ZmZlcnMoIGZpbHAsIGRldiwgJmQgKTsKKwl9CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKCBhcmdwLCBkLCBzaXplb2YoZCkgKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbWdhX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3sKKwltZ2FfZG9fY2xlYW51cF9kbWEoIGRldiApOworfQorCitpbnQgbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJcmV0dXJuIG1nYV9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFkNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJtLmgKQEAgLTAsMCArMSwzNDkgQEAKKy8qIG1nYV9kcm0uaCAtLSBQdWJsaWMgaGVhZGVyIGZvciB0aGUgTWF0cm94IGcyMDAvZzQwMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUdWUgSmFuIDI1IDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICoKKyAqIFJld3JpdHRlbiBieToKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaWZuZGVmIF9fTUdBX0RSTV9IX18KKyNkZWZpbmUgX19NR0FfRFJNX0hfXworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlIChtZ2Ffc2FyZWEuaCkKKyAqLworCisjaWZuZGVmIF9fTUdBX1NBUkVBX0RFRklORVNfXworI2RlZmluZSBfX01HQV9TQVJFQV9ERUZJTkVTX18KKworLyogV0FSUCBwaXBlIGZsYWdzCisgKi8KKyNkZWZpbmUgTUdBX0YJCQkweDEJCS8qIGZvZyAqLworI2RlZmluZSBNR0FfQQkJCTB4MgkJLyogYWxwaGEgKi8KKyNkZWZpbmUgTUdBX1MJCQkweDQJCS8qIHNwZWN1bGFyICovCisjZGVmaW5lIE1HQV9UMgkJCTB4OAkJLyogbXVsdGl0ZXh0dXJlICovCisKKyNkZWZpbmUgTUdBX1dBUlBfVEdaCQkwCisjZGVmaW5lIE1HQV9XQVJQX1RHWkYJCShNR0FfRikKKyNkZWZpbmUgTUdBX1dBUlBfVEdaQQkJKE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UR1pBRgkJKE1HQV9GfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UR1pTCQkoTUdBX1MpCisjZGVmaW5lIE1HQV9XQVJQX1RHWlNGCQkoTUdBX1N8TUdBX0YpCisjZGVmaW5lIE1HQV9XQVJQX1RHWlNBCQkoTUdBX1N8TUdBX0EpCisjZGVmaW5lIE1HQV9XQVJQX1RHWlNBRgkJKE1HQV9TfE1HQV9GfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaCQkoTUdBX1QyKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaRgkJKE1HQV9UMnxNR0FfRikKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWkEJCShNR0FfVDJ8TUdBX0EpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pBRgkJKE1HQV9UMnxNR0FfQXxNR0FfRikKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWlMJCShNR0FfVDJ8TUdBX1MpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTRgkJKE1HQV9UMnxNR0FfU3xNR0FfRikKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWlNBCQkoTUdBX1QyfE1HQV9TfE1HQV9BKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaU0FGCShNR0FfVDJ8TUdBX1N8TUdBX0Z8TUdBX0EpCisKKyNkZWZpbmUgTUdBX01BWF9HMjAwX1BJUEVTCTgJCS8qIG5vIG11bHRpdGV4ICovCisjZGVmaW5lIE1HQV9NQVhfRzQwMF9QSVBFUwkxNgorI2RlZmluZSBNR0FfTUFYX1dBUlBfUElQRVMJTUdBX01BWF9HNDAwX1BJUEVTCisjZGVmaW5lIE1HQV9XQVJQX1VDT0RFX1NJWkUJMzI3NjgJCS8qIGluIGJ5dGVzICovCisKKyNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HMjAwCTEKKyNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HNDAwCTIKKworCisjZGVmaW5lIE1HQV9GUk9OVAkJMHgxCisjZGVmaW5lIE1HQV9CQUNLCQkweDIKKyNkZWZpbmUgTUdBX0RFUFRICQkweDQKKworLyogV2hhdCBuZWVkcyB0byBiZSBjaGFuZ2VkIGZvciB0aGUgY3VycmVudCB2ZXJ0ZXggZG1hIGJ1ZmZlcj8KKyAqLworI2RlZmluZSBNR0FfVVBMT0FEX0NPTlRFWFQJMHgxCisjZGVmaW5lIE1HQV9VUExPQURfVEVYMAkJMHgyCisjZGVmaW5lIE1HQV9VUExPQURfVEVYMQkJMHg0CisjZGVmaW5lIE1HQV9VUExPQURfUElQRQkJMHg4CisjZGVmaW5lIE1HQV9VUExPQURfVEVYMElNQUdFCTB4MTAgLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2RlZmluZSBNR0FfVVBMT0FEX1RFWDFJTUFHRQkweDIwIC8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgTUdBX1VQTE9BRF8yRAkJMHg0MAorI2RlZmluZSBNR0FfV0FJVF9BR0UJCTB4ODAgLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2RlZmluZSBNR0FfVVBMT0FEX0NMSVBSRUNUUwkweDEwMCAvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjaWYgMAorI2RlZmluZSBNR0FfRE1BX0ZMVVNICQkweDIwMCAvKiBzZXQgd2hlbiBzb21lb25lIGdldHMgdGhlIGxvY2sKKwkJCQkJIHF1aWVzY2VudCAqLworI2VuZGlmCisKKy8qIDMyIGJ1ZmZlcnMgb2YgNjRrIGVhY2gsIHRvdGFsIDIgbWVnLgorICovCisjZGVmaW5lIE1HQV9CVUZGRVJfU0laRQkJKDEgPDwgMTYpCisjZGVmaW5lIE1HQV9OVU1fQlVGRkVSUwkJMTI4CisKKy8qIEtlZXAgdGhlc2Ugc21hbGwgZm9yIHRlc3RpbmcuCisgKi8KKyNkZWZpbmUgTUdBX05SX1NBUkVBX0NMSVBSRUNUUwk4CisKKy8qIDIgaGVhcHMgKDEgZm9yIGNhcmQsIDEgZm9yIGFncCksIGVhY2ggZGl2aWRlZCBpbnRvIHVwdG8gMTI4CisgKiByZWdpb25zLCBzdWJqZWN0IHRvIGEgbWluaW11bSByZWdpb24gc2l6ZSBvZiAoMTw8MTYpID09IDY0ay4KKyAqCisgKiBDbGllbnRzIG1heSBzdWJkaXZpZGUgcmVnaW9ucyBpbnRlcm5hbGx5LCBidXQgd2hlbiBzaGFyaW5nIGJldHdlZW4KKyAqIGNsaWVudHMsIHRoZSByZWdpb24gc2l6ZSBpcyB0aGUgbWluaW11bSBncmFudWxhcml0eS4KKyAqLworCisjZGVmaW5lIE1HQV9DQVJEX0hFQVAJCQkwCisjZGVmaW5lIE1HQV9BR1BfSEVBUAkJCTEKKyNkZWZpbmUgTUdBX05SX1RFWF9IRUFQUwkJMgorI2RlZmluZSBNR0FfTlJfVEVYX1JFR0lPTlMJCTE2CisjZGVmaW5lIE1HQV9MT0dfTUlOX1RFWF9SRUdJT05fU0laRQkxNgorCisjZGVmaW5lICBEUk1fTUdBX0lETEVfUkVUUlkgICAgICAgICAgMjA0OAorCisjZW5kaWYgLyogX19NR0FfU0FSRUFfREVGSU5FU19fICovCisKKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciAzRCBjb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZHN0b3JnOworCXVuc2lnbmVkIGludCBtYWNjZXNzOworCXVuc2lnbmVkIGludCBwbG53dDsKKwl1bnNpZ25lZCBpbnQgZHdnY3RsOworCXVuc2lnbmVkIGludCBhbHBoYWN0cmw7CisJdW5zaWduZWQgaW50IGZvZ2NvbG9yOworCXVuc2lnbmVkIGludCB3ZmxhZzsKKwl1bnNpZ25lZCBpbnQgdGR1YWxzdGFnZTA7CisJdW5zaWduZWQgaW50IHRkdWFsc3RhZ2UxOworCXVuc2lnbmVkIGludCBmY29sOworCXVuc2lnbmVkIGludCBzdGVuY2lsOworCXVuc2lnbmVkIGludCBzdGVuY2lsY3RsOworfSBkcm1fbWdhX2NvbnRleHRfcmVnc190OworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIDJELCBYIHNlcnZlcgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHBpdGNoOworfSBkcm1fbWdhX3NlcnZlcl9yZWdzX3Q7CisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgZWFjaCB0ZXh0dXJlIHVuaXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCB0ZXhjdGw7CisJdW5zaWduZWQgaW50IHRleGN0bDI7CisJdW5zaWduZWQgaW50IHRleGZpbHRlcjsKKwl1bnNpZ25lZCBpbnQgdGV4Ym9yZGVyY29sOworCXVuc2lnbmVkIGludCB0ZXhvcmc7CisJdW5zaWduZWQgaW50IHRleHdpZHRoOworCXVuc2lnbmVkIGludCB0ZXhoZWlnaHQ7CisJdW5zaWduZWQgaW50IHRleG9yZzE7CisJdW5zaWduZWQgaW50IHRleG9yZzI7CisJdW5zaWduZWQgaW50IHRleG9yZzM7CisJdW5zaWduZWQgaW50IHRleG9yZzQ7Cit9IGRybV9tZ2FfdGV4dHVyZV9yZWdzX3Q7CisKKy8qIEdlbmVyYWwgYWdpbmcgbWVjaGFuaXNtCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgaGVhZDsJCS8qIFBvc2l0aW9uIG9mIGhlYWQgcG9pbnRlciAgICAgICAgICAqLworCXVuc2lnbmVkIGludCB3cmFwOwkJLyogUHJpbWFyeSBETUEgd3JhcCBjb3VudCAgICAgICAgICAgICovCit9IGRybV9tZ2FfYWdlX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fbWdhX3NhcmVhIHsKKwkvKiBUaGUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiBvZiBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsCisJICogb24gZmlyaW5nIGEgdmVydGV4IGRtYSBidWZmZXIuCisJICovCisgICAJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCBjb250ZXh0X3N0YXRlOworICAgCWRybV9tZ2Ffc2VydmVyX3JlZ3NfdCBzZXJ2ZXJfc3RhdGU7CisgICAJZHJtX21nYV90ZXh0dXJlX3JlZ3NfdCB0ZXhfc3RhdGVbMl07CisgICAJdW5zaWduZWQgaW50IHdhcnBfcGlwZTsKKyAgIAl1bnNpZ25lZCBpbnQgZGlydHk7CisgICAJdW5zaWduZWQgaW50IHZlcnRzaXplOworCisJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgorCSAqLworICAgCWRybV9jbGlwX3JlY3RfdCBib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKyAgIAl1bnNpZ25lZCBpbnQgbmJveDsKKworCS8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgM2QgZHJhd2FibGUuICBUaGUKKwkgKiBjbGllbnQgZmlsbHMgaW4gdGhlIHJlcV8qIGZpZWxkcywgdGhlIHNlcnZlciBmaWxscyBpbiB0aGUKKwkgKiBleHBvcnRlZF8gZmllbGRzIGFuZCBwdXRzIHRoZSBjbGlwcmVjdHMgaW50byBib3hlcywgYWJvdmUuCisJICoKKwkgKiBUaGUgY2xpZW50IGNsZWFycyB0aGUgZXhwb3J0ZWRfZHJhd2FibGUgZmllbGQgYmVmb3JlCisJICogY2xvYmJlcmluZyB0aGUgYm94ZXMgZGF0YS4KKwkgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHJlcV9kcmF3YWJsZTsJIC8qIHRoZSBYIGRyYXdhYmxlIGlkICovCisJdW5zaWduZWQgaW50IHJlcV9kcmF3X2J1ZmZlcjsJIC8qIE1HQV9GUk9OVCBvciBNR0FfQkFDSyAqLworCisgICAgICAgIHVuc2lnbmVkIGludCBleHBvcnRlZF9kcmF3YWJsZTsKKwl1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfaW5kZXg7CisgICAgICAgIHVuc2lnbmVkIGludCBleHBvcnRlZF9zdGFtcDsKKyAgICAgICAgdW5zaWduZWQgaW50IGV4cG9ydGVkX2J1ZmZlcnM7CisgICAgICAgIHVuc2lnbmVkIGludCBleHBvcnRlZF9uZnJvbnQ7CisgICAgICAgIHVuc2lnbmVkIGludCBleHBvcnRlZF9uYmFjazsKKwlpbnQgZXhwb3J0ZWRfYmFja194LCBleHBvcnRlZF9mcm9udF94LCBleHBvcnRlZF93OworCWludCBleHBvcnRlZF9iYWNrX3ksIGV4cG9ydGVkX2Zyb250X3ksIGV4cG9ydGVkX2g7CisgICAJZHJtX2NsaXBfcmVjdF90IGV4cG9ydGVkX2JveGVzW01HQV9OUl9TQVJFQV9DTElQUkVDVFNdOworCisJLyogQ291bnRlcnMgZm9yIGFnaW5nIHRleHR1cmVzIGFuZCBmb3IgY2xpZW50LXNpZGUgdGhyb3R0bGluZy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdHVzWzRdOworCXVuc2lnbmVkIGludCBsYXN0X3dyYXA7CisKKwlkcm1fbWdhX2FnZV90IGxhc3RfZnJhbWU7CisgICAgICAgIHVuc2lnbmVkIGludCBsYXN0X2VucXVldWU7CS8qIGxhc3QgdGltZSBhIGJ1ZmZlciB3YXMgZW5xdWV1ZWQgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9kaXNwYXRjaDsJLyogYWdlIG9mIHRoZSBtb3N0IHJlY2VudGx5IGRpc3BhdGNoZWQgYnVmZmVyICovCisJdW5zaWduZWQgaW50IGxhc3RfcXVpZXNjZW50OyAgICAgLyogICovCisKKwkvKiBMUlUgbGlzdHMgZm9yIHRleHR1cmUgbWVtb3J5IGluIGFncCBzcGFjZSBhbmQgb24gdGhlIGNhcmQuCisJICovCisJZHJtX3RleF9yZWdpb25fdCB0ZXhMaXN0W01HQV9OUl9URVhfSEVBUFNdW01HQV9OUl9URVhfUkVHSU9OUysxXTsKKwl1bnNpZ25lZCBpbnQgdGV4QWdlW01HQV9OUl9URVhfSEVBUFNdOworCisJLyogTWVjaGFuaXNtIHRvIHZhbGlkYXRlIGNhcmQgc3RhdGUuCisJICovCisgICAJaW50IGN0eE93bmVyOworfSBkcm1fbWdhX3NhcmVhX3Q7CisKKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIgZmlsZSAoeGY4NmRybU1nYS5oKQorICovCisKKy8qIE1HQSBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9NR0FfSU5JVCAgICAgMHgwMAorI2RlZmluZSBEUk1fTUdBX0ZMVVNIICAgIDB4MDEKKyNkZWZpbmUgRFJNX01HQV9SRVNFVCAgICAweDAyCisjZGVmaW5lIERSTV9NR0FfU1dBUCAgICAgMHgwMworI2RlZmluZSBEUk1fTUdBX0NMRUFSICAgIDB4MDQKKyNkZWZpbmUgRFJNX01HQV9WRVJURVggICAweDA1CisjZGVmaW5lIERSTV9NR0FfSU5ESUNFUyAgMHgwNgorI2RlZmluZSBEUk1fTUdBX0lMT0FEICAgIDB4MDcKKyNkZWZpbmUgRFJNX01HQV9CTElUICAgICAweDA4CisjZGVmaW5lIERSTV9NR0FfR0VUUEFSQU0gMHgwOQorCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSU5JVCAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSU5JVCwgZHJtX21nYV9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfRkxVU0ggICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfRkxVU0gsIGRybV9sb2NrX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfUkVTRVQgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfU1dBUCAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfU1dBUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9DTEVBUiAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9DTEVBUiwgZHJtX21nYV9jbGVhcl90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX1ZFUlRFWCAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1ZFUlRFWCwgZHJtX21nYV92ZXJ0ZXhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9JTkRJQ0VTICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9JTkRJQ0VTLCBkcm1fbWdhX2luZGljZXNfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9JTE9BRCAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9JTE9BRCwgZHJtX21nYV9pbG9hZF90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0JMSVQgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0JMSVQsIGRybV9tZ2FfYmxpdF90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0dFVFBBUkFNIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0dFVFBBUkFNLCBkcm1fbWdhX2dldHBhcmFtX3QpCisKK3R5cGVkZWYgc3RydWN0IF9kcm1fbWdhX3dhcnBfaW5kZXggeworICAgCWludCBpbnN0YWxsZWQ7CisgICAJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7CisgICAJaW50IHNpemU7Cit9IGRybV9tZ2Ffd2FycF9pbmRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2luaXQgeworICAgCWVudW0geworCSAgIAlNR0FfSU5JVF9ETUEgICAgPSAweDAxLAorCSAgICAgICAJTUdBX0NMRUFOVVBfRE1BID0gMHgwMgorCX0gZnVuYzsKKworICAgCXVuc2lnbmVkIGxvbmcgc2FyZWFfcHJpdl9vZmZzZXQ7CisKKwlpbnQgY2hpcHNldDsKKyAgIAlpbnQgc2dyYW07CisKKwl1bnNpZ25lZCBpbnQgbWFjY2VzczsKKworICAgCXVuc2lnbmVkIGludCBmYl9jcHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisgICAJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCisgICAJdW5zaWduZWQgaW50IGRlcHRoX2NwcDsKKyAgIAl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0LCBkZXB0aF9waXRjaDsKKworICAgCXVuc2lnbmVkIGludCB0ZXh0dXJlX29mZnNldFtNR0FfTlJfVEVYX0hFQVBTXTsKKyAgIAl1bnNpZ25lZCBpbnQgdGV4dHVyZV9zaXplW01HQV9OUl9URVhfSEVBUFNdOworCisJdW5zaWduZWQgbG9uZyBmYl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyB3YXJwX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHByaW1hcnlfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYnVmZmVyc19vZmZzZXQ7Cit9IGRybV9tZ2FfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2Z1bGxzY3JlZW4geworCWVudW0geworCQlNR0FfSU5JVF9GVUxMU0NSRUVOICAgID0gMHgwMSwKKwkJTUdBX0NMRUFOVVBfRlVMTFNDUkVFTiA9IDB4MDIKKwl9IGZ1bmM7Cit9IGRybV9tZ2FfZnVsbHNjcmVlbl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2NsZWFyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aDsKKwl1bnNpZ25lZCBpbnQgY29sb3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfbWFzazsKK30gZHJtX21nYV9jbGVhcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX3ZlcnRleCB7CisgICAJaW50IGlkeDsJCQkvKiBidWZmZXIgdG8gcXVldWUgKi8KKwlpbnQgdXNlZDsJCQkvKiBieXRlcyBpbiB1c2UgKi8KKwlpbnQgZGlzY2FyZDsJCQkvKiBjbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICAqLworfSBkcm1fbWdhX3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2luZGljZXMgeworICAgCWludCBpZHg7CQkJLyogYnVmZmVyIHRvIHF1ZXVlICovCisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBlbmQ7CisJaW50IGRpc2NhcmQ7CQkJLyogY2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAgKi8KK30gZHJtX21nYV9pbmRpY2VzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9tZ2FfaWxvYWQgeworCWludCBpZHg7CisJdW5zaWduZWQgaW50IGRzdG9yZzsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworfSBkcm1fbWdhX2lsb2FkX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fbWdhX2JsaXQgeworCXVuc2lnbmVkIGludCBwbGFuZW1hc2s7CisJdW5zaWduZWQgaW50IHNyY29yZzsKKwl1bnNpZ25lZCBpbnQgZHN0b3JnOworCWludCBzcmNfcGl0Y2gsIGRzdF9waXRjaDsKKwlpbnQgZGVsdGFfc3gsIGRlbHRhX3N5OworCWludCBkZWx0YV9keCwgZGVsdGFfZHk7CisJaW50IGhlaWdodCwgeWRpcjsJCS8qIGZsaXAgaW1hZ2UgdmVydGljYWxseSAqLworCWludCBzb3VyY2VfcGl0Y2gsIGRlc3RfcGl0Y2g7Cit9IGRybV9tZ2FfYmxpdF90OworCisvKiAzLjE6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKKyAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LiAgCisgKi8KKyNkZWZpbmUgTUdBX1BBUkFNX0lSUV9OUiAgICAgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9nZXRwYXJhbSB7CisJaW50IHBhcmFtOworCXZvaWQgX191c2VyICp2YWx1ZTsKK30gZHJtX21nYV9nZXRwYXJhbV90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkYWIzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiBtZ2FfZHJ2LmMgLS0gTWF0cm94IEcyMDAvRzQwMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDAxOjU2OjIyIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJtLmgiCisjaW5jbHVkZSAibWdhX2Rydi5oIgorCisgIAorI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCit7CisJZGV2LT5jb3VudGVycyArPSAzOworCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROworCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKKwlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKKworCURSTV9JTkZPKCAiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAorCQlEUklWRVJfTkFNRSwKKwkJRFJJVkVSX01BSk9SLAorCQlEUklWRVJfTUlOT1IsCisJCURSSVZFUl9QQVRDSExFVkVMLAorCQlEUklWRVJfREFURSwKKwkJZGV2LT5wcmltYXJ5Lm1pbm9yLAorCQlwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQorCQkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcnNpb24oIGRybV92ZXJzaW9uX3QgKnZlcnNpb24gKQoreworCWludCBsZW47CisKKwl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOworCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7CisJRFJNX0NPUFkoIHZlcnNpb24tPm5hbWUsIERSSVZFUl9OQU1FICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKKwltZ2FfUENJX0lEUworfTsKKworZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgbWdhX2lvY3Rsc1tdOworZXh0ZXJuIGludCBtZ2FfbWF4X2lvY3RsOworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPSBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0lSUV9WQkwsCisJLnByZXRha2Vkb3duID0gbWdhX2RyaXZlcl9wcmV0YWtlZG93biwKKwkuZG1hX3F1aWVzY2VudCA9IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudCwKKwkudmJsYW5rX3dhaXQgPSBtZ2FfZHJpdmVyX3ZibGFua193YWl0LAorCS5pcnFfcHJlaW5zdGFsbCA9IG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCisJLmlycV9wb3N0aW5zdGFsbCA9IG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAorCS5pcnFfdW5pbnN0YWxsID0gbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsLAorCS5pcnFfaGFuZGxlciA9IG1nYV9kcml2ZXJfaXJxX2hhbmRsZXIsCisJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKKwkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKKwkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKKwkucG9zdGluaXQgPSBwb3N0aW5pdCwKKwkudmVyc2lvbiA9IHZlcnNpb24sCisJLmlvY3RscyA9IG1nYV9pb2N0bHMsCisJLmRtYV9pb2N0bCA9IG1nYV9kbWFfYnVmZmVycywKKwkuZm9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gZHJtX29wZW4sCisJCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJCS5pb2N0bCA9IGRybV9pb2N0bCwKKwkJLm1tYXAgPSBkcm1fbW1hcCwKKwkJLnBvbGwgPSBkcm1fcG9sbCwKKwkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlID0gcGNpaWRsaXN0LAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1nYV9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSBtZ2FfbWF4X2lvY3RsOworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1nYV9leGl0KHZvaWQpCit7CisJZHJtX2V4aXQoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1nYV9pbml0KTsKK21vZHVsZV9leGl0KG1nYV9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4NGExZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oCkBAIC0wLDAgKzEsNjM4IEBACisvKiBtZ2FfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHRoZSBNYXRyb3ggRzIwMC9HNDAwIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBEZWMgMTMgMDE6NTA6MDEgMTk5OSBieSBqaGFydG1hbm5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2lmbmRlZiBfX01HQV9EUlZfSF9fCisjZGVmaW5lIF9fTUdBX0RSVl9IX18KKworLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgorICovCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIkdhcmV0aCBIdWdoZXMsIFZBIExpbnV4IFN5c3RlbXMgSW5jLiIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJIm1nYSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJNYXRyb3ggRzIwMC9HNDAwIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDIxMDI5IgorCisjZGVmaW5lIERSSVZFUl9NQUpPUgkJMworI2RlZmluZSBEUklWRVJfTUlOT1IJCTEKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAorCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX3ByaW1hcnlfYnVmZmVyIHsKKwl1OCAqc3RhcnQ7CisJdTggKmVuZDsKKwlpbnQgc2l6ZTsKKworCXUzMiB0YWlsOworCWludCBzcGFjZTsKKwl2b2xhdGlsZSBsb25nIHdyYXBwZWQ7CisKKwl2b2xhdGlsZSB1MzIgKnN0YXR1czsKKworCXUzMiBsYXN0X2ZsdXNoOworCXUzMiBsYXN0X3dyYXA7CisKKwl1MzIgaGlnaF9tYXJrOworfSBkcm1fbWdhX3ByaW1hcnlfYnVmZmVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9tZ2FfZnJlZWxpc3QgeworICAgCXN0cnVjdCBkcm1fbWdhX2ZyZWVsaXN0ICpuZXh0OworICAgCXN0cnVjdCBkcm1fbWdhX2ZyZWVsaXN0ICpwcmV2OworCWRybV9tZ2FfYWdlX3QgYWdlOworICAgCWRybV9idWZfdCAqYnVmOworfSBkcm1fbWdhX2ZyZWVsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIAlkcm1fbWdhX2ZyZWVsaXN0X3QgKmxpc3RfZW50cnk7CisJaW50IGRpc2NhcmQ7CisJaW50IGRpc3BhdGNoZWQ7Cit9IGRybV9tZ2FfYnVmX3ByaXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9wcml2YXRlIHsKKwlkcm1fbWdhX3ByaW1hcnlfYnVmZmVyX3QgcHJpbTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXY7CisKKyAgIAlkcm1fbWdhX2ZyZWVsaXN0X3QgKmhlYWQ7CisgICAJZHJtX21nYV9mcmVlbGlzdF90ICp0YWlsOworCisJdW5zaWduZWQgaW50IHdhcnBfcGlwZTsKKwl1bnNpZ25lZCBsb25nIHdhcnBfcGlwZV9waHlzW01HQV9NQVhfV0FSUF9QSVBFU107CisKKwlpbnQgY2hpcHNldDsKKwlpbnQgdXNlY190aW1lb3V0OworCisJdTMyIGNsZWFyX2NtZDsKKwl1MzIgbWFjY2VzczsKKworCXVuc2lnbmVkIGludCBmYl9jcHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX3BpdGNoOworCisJdW5zaWduZWQgaW50IGRlcHRoX2NwcDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCBkZXB0aF9waXRjaDsKKworCXVuc2lnbmVkIGludCB0ZXh0dXJlX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9zaXplOworCisJZHJtX2xvY2FsX21hcF90ICpzYXJlYTsKKwlkcm1fbG9jYWxfbWFwX3QgKm1taW87CisJZHJtX2xvY2FsX21hcF90ICpzdGF0dXM7CisJZHJtX2xvY2FsX21hcF90ICp3YXJwOworCWRybV9sb2NhbF9tYXBfdCAqcHJpbWFyeTsKKwlkcm1fbG9jYWxfbWFwX3QgKmJ1ZmZlcnM7CisJZHJtX2xvY2FsX21hcF90ICphZ3BfdGV4dHVyZXM7Cit9IGRybV9tZ2FfcHJpdmF0ZV90OworCisJCQkJLyogbWdhX2RtYS5jICovCitleHRlcm4gaW50IG1nYV9kbWFfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgbWdhX2RtYV9mbHVzaCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgbWdhX2RtYV9yZXNldCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgbWdhX2RtYV9idWZmZXJzKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldik7CisKK2V4dGVybiBpbnQgbWdhX2RvX3dhaXRfZm9yX2lkbGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApOworCitleHRlcm4gdm9pZCBtZ2FfZG9fZG1hX2ZsdXNoKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKK2V4dGVybiB2b2lkIG1nYV9kb19kbWFfd3JhcF9zdGFydCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICk7CitleHRlcm4gdm9pZCBtZ2FfZG9fZG1hX3dyYXBfZW5kKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKKworZXh0ZXJuIGludCBtZ2FfZnJlZWxpc3RfcHV0KCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl90ICpidWYgKTsKKworCQkJCS8qIG1nYV93YXJwLmMgKi8KK2V4dGVybiBpbnQgbWdhX3dhcnBfaW5zdGFsbF9taWNyb2NvZGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApOworZXh0ZXJuIGludCBtZ2Ffd2FycF9pbml0KCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKTsKKworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyKCBEUk1fSVJRX0FSR1MgKTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKKworI2RlZmluZSBtZ2FfZmx1c2hfd3JpdGVfY29tYmluZSgpCURSTV9XUklURU1FTU9SWUJBUlJJRVIoKQorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX19hbHBoYV9fKQorI2RlZmluZSBNR0FfQkFTRSggcmVnICkJCSgodW5zaWduZWQgbG9uZykoZGV2X3ByaXYtPm1taW8tPmhhbmRsZSkpCisjZGVmaW5lIE1HQV9BRERSKCByZWcgKQkJKE1HQV9CQVNFKHJlZykgKyByZWcpCisKKyNkZWZpbmUgTUdBX0RFUkVGKCByZWcgKQkqKHZvbGF0aWxlIHUzMiAqKU1HQV9BRERSKCByZWcgKQorI2RlZmluZSBNR0FfREVSRUY4KCByZWcgKQkqKHZvbGF0aWxlIHU4ICopTUdBX0FERFIoIHJlZyApCisKKyNkZWZpbmUgTUdBX1JFQUQoIHJlZyApCQkoX01HQV9SRUFEKCh1MzIgKilNR0FfQUREUihyZWcpKSkKKyNkZWZpbmUgTUdBX1JFQUQ4KCByZWcgKQkoX01HQV9SRUFEKCh1OCAqKU1HQV9BRERSKHJlZykpKQorI2RlZmluZSBNR0FfV1JJVEUoIHJlZywgdmFsICkJZG8geyBEUk1fV1JJVEVNRU1PUllCQVJSSUVSKCk7IE1HQV9ERVJFRiggcmVnICkgPSB2YWw7IH0gd2hpbGUgKDApCisjZGVmaW5lIE1HQV9XUklURTgoIHJlZywgdmFsICkgIGRvIHsgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpOyBNR0FfREVSRUY4KCByZWcgKSA9IHZhbDsgfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB1MzIgX01HQV9SRUFEKHUzMiAqYWRkcikKK3sKKwlEUk1fTUVNT1JZQkFSUklFUigpOworCXJldHVybiAqKHZvbGF0aWxlIHUzMiAqKWFkZHI7Cit9CisjZWxzZQorI2RlZmluZSBNR0FfUkVBRDgoIHJlZyApCURSTV9SRUFEOChkZXZfcHJpdi0+bW1pbywgKHJlZykpCisjZGVmaW5lIE1HQV9SRUFEKCByZWcgKQkJRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pbywgKHJlZykpCisjZGVmaW5lIE1HQV9XUklURTgoIHJlZywgdmFsICkgIERSTV9XUklURTgoZGV2X3ByaXYtPm1taW8sIChyZWcpLCAodmFsKSkKKyNkZWZpbmUgTUdBX1dSSVRFKCByZWcsIHZhbCApCURSTV9XUklURTMyKGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkpCisjZW5kaWYKKworI2RlZmluZSBEV0dSRUcwIAkweDFjMDAKKyNkZWZpbmUgRFdHUkVHMF9FTkQgCTB4MWRmZgorI2RlZmluZSBEV0dSRUcxCQkweDJjMDAKKyNkZWZpbmUgRFdHUkVHMV9FTkQJMHgyZGZmCisKKyNkZWZpbmUgSVNSRUcwKHIpCShyID49IERXR1JFRzAgJiYgciA8PSBEV0dSRUcwX0VORCkKKyNkZWZpbmUgRE1BUkVHMChyKQkodTgpKChyIC0gRFdHUkVHMCkgPj4gMikKKyNkZWZpbmUgRE1BUkVHMShyKQkodTgpKCgociAtIERXR1JFRzEpID4+IDIpIHwgMHg4MCkKKyNkZWZpbmUgRE1BUkVHKHIpCShJU1JFRzAocikgPyBETUFSRUcwKHIpIDogRE1BUkVHMShyKSkKKworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhlbHBlciBtYWNyb3NzLi4uCisgKi8KKworI2RlZmluZSBNR0FfRU1JVF9TVEFURSggZGV2X3ByaXYsIGRpcnR5ICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIChkaXJ0eSkgJiB+TUdBX1VQTE9BRF9DTElQUkVDVFMgKSB7CQkJXAorCQlpZiAoIGRldl9wcml2LT5jaGlwc2V0ID09IE1HQV9DQVJEX1RZUEVfRzQwMCApIHsJXAorCQkJbWdhX2c0MDBfZW1pdF9zdGF0ZSggZGV2X3ByaXYgKTsJCVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQltZ2FfZzIwMF9lbWl0X3N0YXRlKCBkZXZfcHJpdiApOwkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFdSQVBfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICggdGVzdF9iaXQoIDAsICZkZXZfcHJpdi0+cHJpbS53cmFwcGVkICkgKSB7CQkJXAorCQlpZiAoIG1nYV9pc19pZGxlKCBkZXZfcHJpdiApICkgewkJCVwKKwkJCW1nYV9kb19kbWFfd3JhcF9lbmQoIGRldl9wcml2ICk7CQlcCisJCX0gZWxzZSBpZiAoIGRldl9wcml2LT5wcmltLnNwYWNlIDwJCQlcCisJCQkgICAgZGV2X3ByaXYtPnByaW0uaGlnaF9tYXJrICkgewkJXAorCQkJaWYgKCBNR0FfRE1BX0RFQlVHICkJCQkJXAorCQkJCURSTV9JTkZPKCAiJXM6IHdyYXAuLi5cbiIsIF9fRlVOQ1RJT05fXyApOwlcCisJCQlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFdSQVBfV0FJVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICggdGVzdF9iaXQoIDAsICZkZXZfcHJpdi0+cHJpbS53cmFwcGVkICkgKSB7CQkJXAorCQlpZiAoIG1nYV9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApIDwgMCApIHsJCVwKKwkJCWlmICggTUdBX0RNQV9ERUJVRyApCQkJCVwKKwkJCQlEUk1fSU5GTyggIiVzOiB3cmFwLi4uXG4iLCBfX0ZVTkNUSU9OX18gKTsJXAorCQkJcmV0dXJuIERSTV9FUlIoRUJVU1kpOwkJCVwKKwkJfQkJCQkJCQlcCisJCW1nYV9kb19kbWFfd3JhcF9lbmQoIGRldl9wcml2ICk7CQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJpbWFyeSBETUEgY29tbWFuZCBzdHJlYW0KKyAqLworCisjZGVmaW5lIE1HQV9WRVJCT1NFCTAKKworI2RlZmluZSBETUFfTE9DQUxTCXVuc2lnbmVkIGludCB3cml0ZTsgdm9sYXRpbGUgdTggKnByaW07CisKKyNkZWZpbmUgRE1BX0JMT0NLX1NJWkUJKDUgKiBzaXplb2YodTMyKSkKKworI2RlZmluZSBCRUdJTl9ETUEoIG4gKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICggTUdBX1ZFUkJPU0UgKSB7CQkJCQkJXAorCQlEUk1fSU5GTyggIkJFR0lOX0RNQSggJWQgKSBpbiAlc1xuIiwJCQlcCisJCQkgIChuKSwgX19GVU5DVElPTl9fICk7CQkJCVwKKwkJRFJNX0lORk8oICIgICBzcGFjZT0weCV4IHJlcT0weCVaeFxuIiwJCQlcCisJCQkgIGRldl9wcml2LT5wcmltLnNwYWNlLCAobikgKiBETUFfQkxPQ0tfU0laRSApOwlcCisJfQkJCQkJCQkJXAorCXByaW0gPSBkZXZfcHJpdi0+cHJpbS5zdGFydDsJCQkJCVwKKwl3cml0ZSA9IGRldl9wcml2LT5wcmltLnRhaWw7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEJFR0lOX0RNQV9XUkFQKCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICggTUdBX1ZFUkJPU0UgKSB7CQkJCQkJXAorCQlEUk1fSU5GTyggIkJFR0lOX0RNQSgpIGluICVzXG4iLCBfX0ZVTkNUSU9OX18gKTsJCVwKKwkJRFJNX0lORk8oICIgICBzcGFjZT0weCV4XG4iLCBkZXZfcHJpdi0+cHJpbS5zcGFjZSApOwlcCisJfQkJCQkJCQkJXAorCXByaW0gPSBkZXZfcHJpdi0+cHJpbS5zdGFydDsJCQkJCVwKKwl3cml0ZSA9IGRldl9wcml2LT5wcmltLnRhaWw7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFEVkFOQ0VfRE1BKCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlkZXZfcHJpdi0+cHJpbS50YWlsID0gd3JpdGU7CQkJCQlcCisJaWYgKCBNR0FfVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiQURWQU5DRV9ETUEoKSB0YWlsPTB4JTA1eCBzcD0weCV4XG4iLAlcCisJCQkgIHdyaXRlLCBkZXZfcHJpdi0+cHJpbS5zcGFjZSApOwkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRkxVU0hfRE1BKCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIDAgKSB7CQkJCQkJCVwKKwkJRFJNX0lORk8oICIlczpcbiIsIF9fRlVOQ1RJT05fXyApOwkJCQlcCisJCURSTV9JTkZPKCAiICAgdGFpbD0weCUwNnggaGVhZD0weCUwNmx4XG4iLAkJXAorCQkJICBkZXZfcHJpdi0+cHJpbS50YWlsLAkJCQlcCisJCQkgIE1HQV9SRUFEKCBNR0FfUFJJTUFERFJFU1MgKSAtCQkJXAorCQkJICBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0ICk7CQkJXAorCX0JCQkJCQkJCVwKKwlpZiAoICF0ZXN0X2JpdCggMCwgJmRldl9wcml2LT5wcmltLndyYXBwZWQgKSApIHsJCVwKKwkJaWYgKCBkZXZfcHJpdi0+cHJpbS5zcGFjZSA8CQkJCVwKKwkJICAgICBkZXZfcHJpdi0+cHJpbS5oaWdoX21hcmsgKSB7CQkJXAorCQkJbWdhX2RvX2RtYV93cmFwX3N0YXJ0KCBkZXZfcHJpdiApOwkJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCW1nYV9kb19kbWFfZmx1c2goIGRldl9wcml2ICk7CQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBOZXZlciB1c2UgdGhpcywgYWx3YXlzIHVzZSBETUFfQkxPQ0soLi4uKSBmb3IgcHJpbWFyeSBETUEgb3V0cHV0LgorICovCisjZGVmaW5lIERNQV9XUklURSggb2Zmc2V0LCB2YWwgKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIE1HQV9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICIgICBETUFfV1JJVEUoIDB4JTA4eCApIGF0IDB4JTA0WnhcbiIsCVwKKwkJCSAgKHUzMikodmFsKSwgd3JpdGUgKyAob2Zmc2V0KSAqIHNpemVvZih1MzIpICk7CVwKKwl9CQkJCQkJCQlcCisJKih2b2xhdGlsZSB1MzIgKikocHJpbSArIHdyaXRlICsgKG9mZnNldCkgKiBzaXplb2YodTMyKSkgPSB2YWw7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRE1BX0JMT0NLKCByZWcwLCB2YWwwLCByZWcxLCB2YWwxLCByZWcyLCB2YWwyLCByZWczLCB2YWwzICkJXAorZG8gewkJCQkJCQkJCVwKKwlETUFfV1JJVEUoIDAsICgoRE1BUkVHKCByZWcwICkgPDwgMCkgfAkJCQlcCisJCSAgICAgICAoRE1BUkVHKCByZWcxICkgPDwgOCkgfAkJCQlcCisJCSAgICAgICAoRE1BUkVHKCByZWcyICkgPDwgMTYpIHwJCQkJXAorCQkgICAgICAgKERNQVJFRyggcmVnMyApIDw8IDI0KSkgKTsJCQlcCisJRE1BX1dSSVRFKCAxLCB2YWwwICk7CQkJCQkJXAorCURNQV9XUklURSggMiwgdmFsMSApOwkJCQkJCVwKKwlETUFfV1JJVEUoIDMsIHZhbDIgKTsJCQkJCQlcCisJRE1BX1dSSVRFKCA0LCB2YWwzICk7CQkJCQkJXAorCXdyaXRlICs9IERNQV9CTE9DS19TSVpFOwkJCQkJXAorfSB3aGlsZSAoMCkKKworCisvKiBCdWZmZXIgYWdpbmcgdmlhIHByaW1hcnkgRE1BIHN0cmVhbSBoZWFkIHBvaW50ZXIuCisgKi8KKworI2RlZmluZSBTRVRfQUdFKCBhZ2UsIGgsIHcgKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJKGFnZSktPmhlYWQgPSBoOwkJCQkJCVwKKwkoYWdlKS0+d3JhcCA9IHc7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBURVNUX0FHRSggYWdlLCBoLCB3ICkJCSggKGFnZSktPndyYXAgPCB3IHx8CQlcCisJCQkJCSAgKCAoYWdlKS0+d3JhcCA9PSB3ICYmCQlcCisJCQkJCSAgICAoYWdlKS0+aGVhZCA8IGggKSApCisKKyNkZWZpbmUgQUdFX0JVRkZFUiggYnVmX3ByaXYgKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJZHJtX21nYV9mcmVlbGlzdF90ICplbnRyeSA9IChidWZfcHJpdiktPmxpc3RfZW50cnk7CQlcCisJaWYgKCAoYnVmX3ByaXYpLT5kaXNwYXRjaGVkICkgewkJCQkJXAorCQllbnRyeS0+YWdlLmhlYWQgPSAoZGV2X3ByaXYtPnByaW0udGFpbCArCQlcCisJCQkJICAgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCk7CQlcCisJCWVudHJ5LT5hZ2Uud3JhcCA9IGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X3dyYXA7CVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCWVudHJ5LT5hZ2UuaGVhZCA9IDA7CQkJCQlcCisJCWVudHJ5LT5hZ2Uud3JhcCA9IDA7CQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIE1HQV9FTkdJTkVfSURMRV9NQVNLCQkoTUdBX1NPRlRSQVBFTiB8CQlcCisJCQkJCSBNR0FfRFdHRU5HU1RTIHwJCVwKKwkJCQkJIE1HQV9FTkRQUkRNQVNUUykKKyNkZWZpbmUgTUdBX0RNQV9JRExFX01BU0sJCShNR0FfU09GVFJBUEVOIHwJCVwKKwkJCQkJIE1HQV9FTkRQUkRNQVNUUykKKworI2RlZmluZSBNR0FfRE1BX0RFQlVHCQkJMAorCisKKworLyogQSByZWR1Y2VkIHNldCBvZiB0aGUgbWdhIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBNR0FfQ1JUQ19JTkRFWAkJCTB4MWZkNAorI2RlZmluZSBNR0FfQ1JUQ19EQVRBCQkJMHgxZmQ1CisKKy8qIENSVEMxMSAqLworI2RlZmluZSBNR0FfVklOVENMUgkJCSgxIDw8IDQpCisjZGVmaW5lIE1HQV9WSU5URU4JCQkoMSA8PCA1KQorCisjZGVmaW5lIE1HQV9BTFBIQUNUUkwgCQkJMHgyYzdjCisjZGVmaW5lIE1HQV9BUjAgCQkJMHgxYzYwCisjZGVmaW5lIE1HQV9BUjEgCQkJMHgxYzY0CisjZGVmaW5lIE1HQV9BUjIgCQkJMHgxYzY4CisjZGVmaW5lIE1HQV9BUjMgCQkJMHgxYzZjCisjZGVmaW5lIE1HQV9BUjQgCQkJMHgxYzcwCisjZGVmaW5lIE1HQV9BUjUgCQkJMHgxYzc0CisjZGVmaW5lIE1HQV9BUjYgCQkJMHgxYzc4CisKKyNkZWZpbmUgTUdBX0NYQk5EUlkJCQkweDFjODAKKyNkZWZpbmUgTUdBX0NYTEVGVCAJCQkweDFjYTAKKyNkZWZpbmUgTUdBX0NYUklHSFQJCQkweDFjYTQKKworI2RlZmluZSBNR0FfRE1BUEFEIAkJCTB4MWM1NAorI2RlZmluZSBNR0FfRFNUT1JHIAkJCTB4MmNiOAorI2RlZmluZSBNR0FfRFdHQ1RMIAkJCTB4MWMwMAorIwlkZWZpbmUgTUdBX09QQ09EX01BU0sJCQkoMTUgPDwgMCkKKyMJZGVmaW5lIE1HQV9PUENPRF9UUkFQCQkJKDQgPDwgMCkKKyMJZGVmaW5lIE1HQV9PUENPRF9URVhUVVJFX1RSQVAJCSg2IDw8IDApCisjCWRlZmluZSBNR0FfT1BDT0RfQklUQkxUCQkJKDggPDwgMCkKKyMJZGVmaW5lIE1HQV9PUENPRF9JTE9BRAkJCSg5IDw8IDApCisjCWRlZmluZSBNR0FfQVRZUEVfTUFTSwkJCSg3IDw8IDQpCisjCWRlZmluZSBNR0FfQVRZUEVfUlBMCQkJKDAgPDwgNCkKKyMJZGVmaW5lIE1HQV9BVFlQRV9SU1RSCQkJKDEgPDwgNCkKKyMJZGVmaW5lIE1HQV9BVFlQRV9aSQkJCSgzIDw8IDQpCisjCWRlZmluZSBNR0FfQVRZUEVfQkxLCQkJKDQgPDwgNCkKKyMJZGVmaW5lIE1HQV9BVFlQRV9JCQkJKDcgPDwgNCkKKyMJZGVmaW5lIE1HQV9MSU5FQVIJCQkoMSA8PCA3KQorIwlkZWZpbmUgTUdBX1pNT0RFX01BU0sJCQkoNyA8PCA4KQorIwlkZWZpbmUgTUdBX1pNT0RFX05PWkNNUAkJCSgwIDw8IDgpCisjCWRlZmluZSBNR0FfWk1PREVfWkUJCQkoMiA8PCA4KQorIwlkZWZpbmUgTUdBX1pNT0RFX1pORQkJCSgzIDw8IDgpCisjCWRlZmluZSBNR0FfWk1PREVfWkxUCQkJKDQgPDwgOCkKKyMJZGVmaW5lIE1HQV9aTU9ERV9aTFRFCQkJKDUgPDwgOCkKKyMJZGVmaW5lIE1HQV9aTU9ERV9aR1QJCQkoNiA8PCA4KQorIwlkZWZpbmUgTUdBX1pNT0RFX1pHVEUJCQkoNyA8PCA4KQorIwlkZWZpbmUgTUdBX1NPTElECQkJKDEgPDwgMTEpCisjCWRlZmluZSBNR0FfQVJaRVJPCQkJKDEgPDwgMTIpCisjCWRlZmluZSBNR0FfU0dOWkVSTwkJCSgxIDw8IDEzKQorIwlkZWZpbmUgTUdBX1NISUZUWkVSTwkJCSgxIDw8IDE0KQorIwlkZWZpbmUgTUdBX0JPUF9NQVNLCQkJKDE1IDw8IDE2KQorIwlkZWZpbmUgTUdBX0JPUF9aRVJPCQkJKDAgPDwgMTYpCisjCWRlZmluZSBNR0FfQk9QX0RTVAkJCSgxMCA8PCAxNikKKyMJZGVmaW5lIE1HQV9CT1BfU1JDCQkJKDEyIDw8IDE2KQorIwlkZWZpbmUgTUdBX0JPUF9PTkUJCQkoMTUgPDwgMTYpCisjCWRlZmluZSBNR0FfVFJBTlNfU0hJRlQJCQkyMAorIwlkZWZpbmUgTUdBX1RSQU5TX01BU0sJCQkoMTUgPDwgMjApCisjCWRlZmluZSBNR0FfQkxUTU9EX01BU0sJCQkoMTUgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX0JNT05PTEVGCQkoMCA8PCAyNSkKKyMJZGVmaW5lIE1HQV9CTFRNT0RfQk1PTk9XRgkJKDQgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX1BMQU4JCQkoMSA8PCAyNSkKKyMJZGVmaW5lIE1HQV9CTFRNT0RfQkZDT0wJCQkoMiA8PCAyNSkKKyMJZGVmaW5lIE1HQV9CTFRNT0RfQlUzMkJHUgkJKDMgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX0JVMzJSR0IJCSg3IDw8IDI1KQorIwlkZWZpbmUgTUdBX0JMVE1PRF9CVTI0QkdSCQkoMTEgPDwgMjUpCisjCWRlZmluZSBNR0FfQkxUTU9EX0JVMjRSR0IJCSgxNSA8PCAyNSkKKyMJZGVmaW5lIE1HQV9QQVRURVJOCQkJKDEgPDwgMjkpCisjCWRlZmluZSBNR0FfVFJBTlNDCQkJKDEgPDwgMzApCisjCWRlZmluZSBNR0FfQ0xJUERJUwkJCSgxIDw8IDMxKQorI2RlZmluZSBNR0FfRFdHU1lOQwkJCTB4MmM0YworCisjZGVmaW5lIE1HQV9GQ09MIAkJCTB4MWMyNAorI2RlZmluZSBNR0FfRklGT1NUQVRVUyAJCQkweDFlMTAKKyNkZWZpbmUgTUdBX0ZPR0NPTCAJCQkweDFjZjQKKyNkZWZpbmUgTUdBX0ZYQk5EUlkJCQkweDFjODQKKyNkZWZpbmUgTUdBX0ZYTEVGVCAJCQkweDFjYTgKKyNkZWZpbmUgTUdBX0ZYUklHSFQJCQkweDFjYWMKKworI2RlZmluZSBNR0FfSUNMRUFSIAkJCTB4MWUxOAorIwlkZWZpbmUgTUdBX1NPRlRSQVBJQ0xSCQkJKDEgPDwgMCkKKyMJZGVmaW5lIE1HQV9WTElORUlDTFIJCQkoMSA8PCA1KQorI2RlZmluZSBNR0FfSUVOIAkJCTB4MWUxYworIwlkZWZpbmUgTUdBX1NPRlRSQVBJRU4JCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1ZMSU5FSUVOCQkJKDEgPDwgNSkKKworI2RlZmluZSBNR0FfTEVOIAkJCTB4MWM1YworCisjZGVmaW5lIE1HQV9NQUNDRVNTCQkJMHgxYzA0CisKKyNkZWZpbmUgTUdBX1BJVENIIAkJCTB4MWM4YworI2RlZmluZSBNR0FfUExOV1QgCQkJMHgxYzFjCisjZGVmaW5lIE1HQV9QUklNQUREUkVTUyAJCTB4MWU1OAorIwlkZWZpbmUgTUdBX0RNQV9HRU5FUkFMCQkJKDAgPDwgMCkKKyMJZGVmaW5lIE1HQV9ETUFfQkxJVAkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfRE1BX1ZFQ1RPUgkJCSgyIDw8IDApCisjCWRlZmluZSBNR0FfRE1BX1ZFUlRFWAkJCSgzIDw8IDApCisjZGVmaW5lIE1HQV9QUklNRU5ECQkJMHgxZTVjCisjCWRlZmluZSBNR0FfUFJJTU5PU1RBUlQJCQkoMSA8PCAwKQorIwlkZWZpbmUgTUdBX1BBR1BYRkVSCQkJKDEgPDwgMSkKKyNkZWZpbmUgTUdBX1BSSU1QVFIJCQkweDFlNTAKKyMJZGVmaW5lIE1HQV9QUklNUFRSRU4wCQkJKDEgPDwgMCkKKyMJZGVmaW5lIE1HQV9QUklNUFRSRU4xCQkJKDEgPDwgMSkKKworI2RlZmluZSBNR0FfUlNUIAkJCTB4MWU0MAorIwlkZWZpbmUgTUdBX1NPRlRSRVNFVAkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfU09GVEVYVFJTVAkJCSgxIDw8IDEpCisKKyNkZWZpbmUgTUdBX1NFQ0FERFJFU1MgCQkJMHgyYzQwCisjZGVmaW5lIE1HQV9TRUNFTkQgCQkJMHgyYzQ0CisjZGVmaW5lIE1HQV9TRVRVUEFERFJFU1MgCQkweDJjZDAKKyNkZWZpbmUgTUdBX1NFVFVQRU5EIAkJCTB4MmNkNAorI2RlZmluZSBNR0FfU0dOCQkJCTB4MWM1OAorI2RlZmluZSBNR0FfU09GVFJBUAkJCTB4MmM0OAorI2RlZmluZSBNR0FfU1JDT1JHIAkJCTB4MmNiNAorIwlkZWZpbmUgTUdBX1NSTU1BUF9NQVNLCQkJKDEgPDwgMCkKKyMJZGVmaW5lIE1HQV9TUkNNQVBfRkIJCQkoMCA8PCAwKQorIwlkZWZpbmUgTUdBX1NSQ01BUF9TWVNNRU0JCSgxIDw8IDApCisjCWRlZmluZSBNR0FfU1JDQUNDX01BU0sJCQkoMSA8PCAxKQorIwlkZWZpbmUgTUdBX1NSQ0FDQ19QQ0kJCQkoMCA8PCAxKQorIwlkZWZpbmUgTUdBX1NSQ0FDQ19BR1AJCQkoMSA8PCAxKQorI2RlZmluZSBNR0FfU1RBVFVTIAkJCTB4MWUxNAorIwlkZWZpbmUgTUdBX1NPRlRSQVBFTgkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfVlNZTkNQRU4JCQkoMSA8PCA0KQorIwlkZWZpbmUgTUdBX1ZMSU5FUEVOCQkJKDEgPDwgNSkKKyMJZGVmaW5lIE1HQV9EV0dFTkdTVFMJCQkoMSA8PCAxNikKKyMJZGVmaW5lIE1HQV9FTkRQUkRNQVNUUwkJCSgxIDw8IDE3KQorI2RlZmluZSBNR0FfU1RFTkNJTAkJCTB4MmNjOAorI2RlZmluZSBNR0FfU1RFTkNJTENUTCAJCQkweDJjY2MKKworI2RlZmluZSBNR0FfVERVQUxTVEFHRTAgCQkweDJjZjgKKyNkZWZpbmUgTUdBX1REVUFMU1RBR0UxIAkJMHgyY2ZjCisjZGVmaW5lIE1HQV9URVhCT1JERVJDT0wgCQkweDJjNWMKKyNkZWZpbmUgTUdBX1RFWENUTCAJCQkweDJjMzAKKyNkZWZpbmUgTUdBX1RFWENUTDIJCQkweDJjM2MKKyMJZGVmaW5lIE1HQV9EVUFMVEVYCQkJKDEgPDwgNykKKyMJZGVmaW5lIE1HQV9HNDAwX1RDMl9NQUdJQwkJKDEgPDwgMTUpCisjCWRlZmluZSBNR0FfTUFQMV9FTkFCTEUJCQkoMSA8PCAzMSkKKyNkZWZpbmUgTUdBX1RFWEZJTFRFUiAJCQkweDJjNTgKKyNkZWZpbmUgTUdBX1RFWEhFSUdIVCAJCQkweDJjMmMKKyNkZWZpbmUgTUdBX1RFWE9SRyAJCQkweDJjMjQKKyMJZGVmaW5lIE1HQV9URVhPUkdNQVBfTUFTSwkJKDEgPDwgMCkKKyMJZGVmaW5lIE1HQV9URVhPUkdNQVBfRkIJCQkoMCA8PCAwKQorIwlkZWZpbmUgTUdBX1RFWE9SR01BUF9TWVNNRU0JCSgxIDw8IDApCisjCWRlZmluZSBNR0FfVEVYT1JHQUNDX01BU0sJCSgxIDw8IDEpCisjCWRlZmluZSBNR0FfVEVYT1JHQUNDX1BDSQkJKDAgPDwgMSkKKyMJZGVmaW5lIE1HQV9URVhPUkdBQ0NfQUdQCQkoMSA8PCAxKQorI2RlZmluZSBNR0FfVEVYT1JHMQkJCTB4MmNhNAorI2RlZmluZSBNR0FfVEVYT1JHMgkJCTB4MmNhOAorI2RlZmluZSBNR0FfVEVYT1JHMwkJCTB4MmNhYworI2RlZmluZSBNR0FfVEVYT1JHNAkJCTB4MmNiMAorI2RlZmluZSBNR0FfVEVYVFJBTlMgCQkJMHgyYzM0CisjZGVmaW5lIE1HQV9URVhUUkFOU0hJR0ggCQkweDJjMzgKKyNkZWZpbmUgTUdBX1RFWFdJRFRIIAkJCTB4MmMyOAorCisjZGVmaW5lIE1HQV9XQUNDRVBUU0VRIAkJCTB4MWRkNAorI2RlZmluZSBNR0FfV0NPREVBRERSIAkJCTB4MWU2YworI2RlZmluZSBNR0FfV0ZMQUcgCQkJMHgxZGM0CisjZGVmaW5lIE1HQV9XRkxBRzEgCQkJMHgxZGUwCisjZGVmaW5lIE1HQV9XRkxBR05CCQkJMHgxZTY0CisjZGVmaW5lIE1HQV9XRkxBR05CMSAJCQkweDFlMDgKKyNkZWZpbmUgTUdBX1dHRVRNU0IJCQkweDFkYzgKKyNkZWZpbmUgTUdBX1dJQUREUiAJCQkweDFkYzAKKyNkZWZpbmUgTUdBX1dJQUREUjIJCQkweDFkZDgKKyMJZGVmaW5lIE1HQV9XTU9ERV9TVVNQRU5ECQkoMCA8PCAwKQorIwlkZWZpbmUgTUdBX1dNT0RFX1JFU1VNRQkJCSgxIDw8IDApCisjCWRlZmluZSBNR0FfV01PREVfSlVNUAkJCSgyIDw8IDApCisjCWRlZmluZSBNR0FfV01PREVfU1RBUlQJCQkoMyA8PCAwKQorIwlkZWZpbmUgTUdBX1dBR1BfRU5BQkxFCQkJKDEgPDwgMikKKyNkZWZpbmUgTUdBX1dNSVNDIAkJCTB4MWU3MAorIwlkZWZpbmUgTUdBX1dVQ09ERUNBQ0hFX0VOQUJMRQkJKDEgPDwgMCkKKyMJZGVmaW5lIE1HQV9XTUFTVEVSX0VOQUJMRQkJKDEgPDwgMSkKKyMJZGVmaW5lIE1HQV9XQ0FDSEVGTFVTSF9FTkFCTEUJCSgxIDw8IDMpCisjZGVmaW5lIE1HQV9XVlJUWFNaCQkJMHgxZGNjCisKKyNkZWZpbmUgTUdBX1lCT1QgCQkJMHgxYzljCisjZGVmaW5lIE1HQV9ZRFNUIAkJCTB4MWM5MAorI2RlZmluZSBNR0FfWURTVExFTgkJCTB4MWM4OAorI2RlZmluZSBNR0FfWURTVE9SRwkJCTB4MWM5NAorI2RlZmluZSBNR0FfWVRPUCAJCQkweDFjOTgKKworI2RlZmluZSBNR0FfWk9SRyAJCQkweDFjMGMKKworLyogVGhpcyBmaW5pc2hlcyB0aGUgY3VycmVudCBiYXRjaCBvZiBjb21tYW5kcworICovCisjZGVmaW5lIE1HQV9FWEVDIAkJCTB4MDEwMAorCisvKiBXYXJwIHJlZ2lzdGVycworICovCisjZGVmaW5lIE1HQV9XUjAJCQkJMHgyZDAwCisjZGVmaW5lIE1HQV9XUjEJCQkJMHgyZDA0CisjZGVmaW5lIE1HQV9XUjIJCQkJMHgyZDA4CisjZGVmaW5lIE1HQV9XUjMJCQkJMHgyZDBjCisjZGVmaW5lIE1HQV9XUjQJCQkJMHgyZDEwCisjZGVmaW5lIE1HQV9XUjUJCQkJMHgyZDE0CisjZGVmaW5lIE1HQV9XUjYJCQkJMHgyZDE4CisjZGVmaW5lIE1HQV9XUjcJCQkJMHgyZDFjCisjZGVmaW5lIE1HQV9XUjgJCQkJMHgyZDIwCisjZGVmaW5lIE1HQV9XUjkJCQkJMHgyZDI0CisjZGVmaW5lIE1HQV9XUjEwCQkJMHgyZDI4CisjZGVmaW5lIE1HQV9XUjExCQkJMHgyZDJjCisjZGVmaW5lIE1HQV9XUjEyCQkJMHgyZDMwCisjZGVmaW5lIE1HQV9XUjEzCQkJMHgyZDM0CisjZGVmaW5lIE1HQV9XUjE0CQkJMHgyZDM4CisjZGVmaW5lIE1HQV9XUjE1CQkJMHgyZDNjCisjZGVmaW5lIE1HQV9XUjE2CQkJMHgyZDQwCisjZGVmaW5lIE1HQV9XUjE3CQkJMHgyZDQ0CisjZGVmaW5lIE1HQV9XUjE4CQkJMHgyZDQ4CisjZGVmaW5lIE1HQV9XUjE5CQkJMHgyZDRjCisjZGVmaW5lIE1HQV9XUjIwCQkJMHgyZDUwCisjZGVmaW5lIE1HQV9XUjIxCQkJMHgyZDU0CisjZGVmaW5lIE1HQV9XUjIyCQkJMHgyZDU4CisjZGVmaW5lIE1HQV9XUjIzCQkJMHgyZDVjCisjZGVmaW5lIE1HQV9XUjI0CQkJMHgyZDYwCisjZGVmaW5lIE1HQV9XUjI1CQkJMHgyZDY0CisjZGVmaW5lIE1HQV9XUjI2CQkJMHgyZDY4CisjZGVmaW5lIE1HQV9XUjI3CQkJMHgyZDZjCisjZGVmaW5lIE1HQV9XUjI4CQkJMHgyZDcwCisjZGVmaW5lIE1HQV9XUjI5CQkJMHgyZDc0CisjZGVmaW5lIE1HQV9XUjMwCQkJMHgyZDc4CisjZGVmaW5lIE1HQV9XUjMxCQkJMHgyZDdjCisjZGVmaW5lIE1HQV9XUjMyCQkJMHgyZDgwCisjZGVmaW5lIE1HQV9XUjMzCQkJMHgyZDg0CisjZGVmaW5lIE1HQV9XUjM0CQkJMHgyZDg4CisjZGVmaW5lIE1HQV9XUjM1CQkJMHgyZDhjCisjZGVmaW5lIE1HQV9XUjM2CQkJMHgyZDkwCisjZGVmaW5lIE1HQV9XUjM3CQkJMHgyZDk0CisjZGVmaW5lIE1HQV9XUjM4CQkJMHgyZDk4CisjZGVmaW5lIE1HQV9XUjM5CQkJMHgyZDljCisjZGVmaW5lIE1HQV9XUjQwCQkJMHgyZGEwCisjZGVmaW5lIE1HQV9XUjQxCQkJMHgyZGE0CisjZGVmaW5lIE1HQV9XUjQyCQkJMHgyZGE4CisjZGVmaW5lIE1HQV9XUjQzCQkJMHgyZGFjCisjZGVmaW5lIE1HQV9XUjQ0CQkJMHgyZGIwCisjZGVmaW5lIE1HQV9XUjQ1CQkJMHgyZGI0CisjZGVmaW5lIE1HQV9XUjQ2CQkJMHgyZGI4CisjZGVmaW5lIE1HQV9XUjQ3CQkJMHgyZGJjCisjZGVmaW5lIE1HQV9XUjQ4CQkJMHgyZGMwCisjZGVmaW5lIE1HQV9XUjQ5CQkJMHgyZGM0CisjZGVmaW5lIE1HQV9XUjUwCQkJMHgyZGM4CisjZGVmaW5lIE1HQV9XUjUxCQkJMHgyZGNjCisjZGVmaW5lIE1HQV9XUjUyCQkJMHgyZGQwCisjZGVmaW5lIE1HQV9XUjUzCQkJMHgyZGQ0CisjZGVmaW5lIE1HQV9XUjU0CQkJMHgyZGQ4CisjZGVmaW5lIE1HQV9XUjU1CQkJMHgyZGRjCisjZGVmaW5lIE1HQV9XUjU2CQkJMHgyZGUwCisjZGVmaW5lIE1HQV9XUjU3CQkJMHgyZGU0CisjZGVmaW5lIE1HQV9XUjU4CQkJMHgyZGU4CisjZGVmaW5lIE1HQV9XUjU5CQkJMHgyZGVjCisjZGVmaW5lIE1HQV9XUjYwCQkJMHgyZGYwCisjZGVmaW5lIE1HQV9XUjYxCQkJMHgyZGY0CisjZGVmaW5lIE1HQV9XUjYyCQkJMHgyZGY4CisjZGVmaW5lIE1HQV9XUjYzCQkJMHgyZGZjCisjCWRlZmluZSBNR0FfRzQwMF9XUl9NQUdJQwkJKDEgPDwgNikKKyMJZGVmaW5lIE1HQV9HNDAwX1dSNTZfTUFHSUMJCTB4NDY0ODAwMDAJLyogMTI4MDAuMGYgKi8KKworCisjZGVmaW5lIE1HQV9JTE9BRF9BTElHTgkJNjQKKyNkZWZpbmUgTUdBX0lMT0FEX01BU0sJCShNR0FfSUxPQURfQUxJR04gLSAxKQorCisjZGVmaW5lIE1HQV9EV0dDVExfRkxVU0gJKE1HQV9PUENPRF9URVhUVVJFX1RSQVAgfAkJXAorCQkJCSBNR0FfQVRZUEVfSSB8CQkJCVwKKwkJCQkgTUdBX1pNT0RFX05PWkNNUCB8CQkJXAorCQkJCSBNR0FfQVJaRVJPIHwJCQkJXAorCQkJCSBNR0FfU0dOWkVSTyB8CQkJCVwKKwkJCQkgTUdBX0JPUF9TUkMgfAkJCQlcCisJCQkJICgxNSA8PCBNR0FfVFJBTlNfU0hJRlQpKQorCisjZGVmaW5lIE1HQV9EV0dDVExfQ0xFQVIJKE1HQV9PUENPRF9UUkFQIHwJCQlcCisJCQkJIE1HQV9aTU9ERV9OT1pDTVAgfAkJCVwKKwkJCQkgTUdBX1NPTElEIHwJCQkJXAorCQkJCSBNR0FfQVJaRVJPIHwJCQkJXAorCQkJCSBNR0FfU0dOWkVSTyB8CQkJCVwKKwkJCQkgTUdBX1NISUZUWkVSTyB8CQkJXAorCQkJCSBNR0FfQk9QX1NSQyB8CQkJCVwKKwkJCQkgKDAgPDwgTUdBX1RSQU5TX1NISUZUKSB8CQlcCisJCQkJIE1HQV9CTFRNT0RfQk1PTk9MRUYgfAkJCVwKKwkJCQkgTUdBX1RSQU5TQyB8CQkJCVwKKwkJCQkgTUdBX0NMSVBESVMpCisKKyNkZWZpbmUgTUdBX0RXR0NUTF9DT1BZCQkoTUdBX09QQ09EX0JJVEJMVCB8CQkJXAorCQkJCSBNR0FfQVRZUEVfUlBMIHwJCQlcCisJCQkJIE1HQV9TR05aRVJPIHwJCQkJXAorCQkJCSBNR0FfU0hJRlRaRVJPIHwJCQlcCisJCQkJIE1HQV9CT1BfU1JDIHwJCQkJXAorCQkJCSAoMCA8PCBNR0FfVFJBTlNfU0hJRlQpIHwJCVwKKwkJCQkgTUdBX0JMVE1PRF9CRkNPTCB8CQkJXAorCQkJCSBNR0FfQ0xJUERJUykKKworLyogU2ltcGxlIGlkbGUgdGVzdC4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IG1nYV9pc19pZGxlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXUzMiBzdGF0dXMgPSBNR0FfUkVBRCggTUdBX1NUQVRVUyApICYgTUdBX0VOR0lORV9JRExFX01BU0s7CisJcmV0dXJuICggc3RhdHVzID09IE1HQV9FTkRQUkRNQVNUUyApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwYjZiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jCkBAIC0wLDAgKzEsMTAyIEBACisvKiBtZ2FfaXJxLmMgLS0gSVJRIGhhbmRsaW5nIGZvciByYWRlb24gLSotIGxpbnV4LWMgLSotCisgKgorICogQ29weXJpZ2h0IChDKSBUaGUgV2VhdGhlciBDaGFubmVsLCBJbmMuICAyMDAyLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogVGhlIFdlYXRoZXIgQ2hhbm5lbCAoVE0pIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0byBkZXZlbG9wIHRoZQorICogaW5pdGlhbCByZWxlYXNlIG9mIHRoZSBSYWRlb24gODUwMCBkcml2ZXIgdW5kZXIgdGhlIFhGcmVlODYgbGljZW5zZS4KKyAqIFRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICogICAgRXJpYyBBbmhvbHQgPGFuaG9sdEBGcmVlQlNELm9yZz4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm1nYV9kcm0uaCIKKyNpbmNsdWRlICJtZ2FfZHJ2LmgiCisKK2lycXJldHVybl90IG1nYV9kcml2ZXJfaXJxX2hhbmRsZXIoIERSTV9JUlFfQVJHUyApCit7CisJZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBNR0FfUkVBRCggTUdBX1NUQVRVUyApOworCQorCS8qIFZCTEFOSyBpbnRlcnJ1cHQgKi8KKwlpZiAoIHN0YXR1cyAmIE1HQV9WTElORVBFTiApIHsKKwkJTUdBX1dSSVRFKCBNR0FfSUNMRUFSLCBNR0FfVkxJTkVJQ0xSICk7CisJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKKwkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWUpOworCQlkcm1fdmJsX3NlbmRfc2lnbmFscyggZGV2ICk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIElSUV9OT05FOworfQorCitpbnQgbWdhX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK3sKKwl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKKwlpbnQgcmV0ID0gMDsKKworCS8qIEFzc3VtZSB0aGF0IHRoZSB1c2VyIGhhcyBtaXNzZWQgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyCisJICogYnkgYWJvdXQgYSBkYXkgcmF0aGVyIHRoYW4gc2hlIHdhbnRzIHRvIHdhaXQgZm9yIHllYXJzCisJICogdXNpbmcgdmVydGljYWwgYmxhbmtzLi4uIAorCSAqLworCURSTV9XQUlUX09OKCByZXQsIGRldi0+dmJsX3F1ZXVlLCAzKkRSTV9IWiwgCisJCSAgICAgKCAoICggY3VyX3ZibGFuayA9IGF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZCApICkKKwkJCSAtICpzZXF1ZW5jZSApIDw9ICgxPDwyMykgKSApOworCisJKnNlcXVlbmNlID0gY3VyX3ZibGFuazsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisgIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCisgICAgICAJTUdBX1dSSVRFKCBNR0FfSUVOLCAwICk7CisJLyogQ2xlYXIgYml0cyBpZiB0aGV5J3JlIGFscmVhZHkgaGlnaCAqLworICAgCU1HQV9XUklURSggTUdBX0lDTEVBUiwgfjAgKTsKK30KKwordm9pZCBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisgIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX21nYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCisJLyogVHVybiBvbiBWQkwgaW50ZXJydXB0ICovCisgICAJTUdBX1dSSVRFKCBNR0FfSUVOLCBNR0FfVkxJTkVJRU4gKTsKK30KKwordm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworICAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9tZ2FfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAoIWRldl9wcml2KQorCQlyZXR1cm47CisKKwkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KKwlNR0FfV1JJVEUoIE1HQV9JRU4sIDAgKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2E4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCkBAIC0wLDAgKzEsMTEyMyBAQAorLyogbWdhX3N0YXRlLmMgLS0gU3RhdGUgc3VwcG9ydCBmb3IgTUdBIEcyMDAvRzQwMCAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFRodSBKYW4gMjcgMDI6NTM6NDMgMjAwMCBieSBqaGFydG1hbm5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBKZWZmIEhhcnRtYW5uIDxqaGFydG1hbm5AdmFsaW51eC5jb20+CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKgorICogUmV3cml0dGVuIGJ5OgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibWdhX2RybS5oIgorI2luY2x1ZGUgIm1nYV9kcnYuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRE1BIGhhcmR3YXJlIHN0YXRlIHByb2dyYW1taW5nIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIG1nYV9lbWl0X2NsaXBfcmVjdCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCWRybV9jbGlwX3JlY3RfdCAqYm94ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2g7CisJRE1BX0xPQ0FMUzsKKworCUJFR0lOX0RNQSggMiApOworCisJLyogRm9yY2UgcmVzZXQgb2YgRFdHQ1RMIG9uIEc0MDAgKGVsaW1pbmF0ZXMgY2xpcCBkaXNhYmxlIGJpdCkuCisJICovCisJaWYgKCBkZXZfcHJpdi0+Y2hpcHNldCA9PSBNR0FfQ0FSRF9UWVBFX0c0MDAgKSB7CisJCURNQV9CTE9DSyggTUdBX0RXR0NUTCwJCWN0eC0+ZHdnY3RsLAorCQkJICAgTUdBX0xFTiArIE1HQV9FWEVDLAkweDgwMDAwMDAwLAorCQkJICAgTUdBX0RXR0NUTCwJCWN0eC0+ZHdnY3RsLAorCQkJICAgTUdBX0xFTiArIE1HQV9FWEVDLAkweDgwMDAwMDAwICk7CisJfQorCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0NYQk5EUlksCShib3gtPngyIDw8IDE2KSB8IGJveC0+eDEsCisJCSAgIE1HQV9ZVE9QLAlib3gtPnkxICogcGl0Y2gsCisJCSAgIE1HQV9ZQk9ULAlib3gtPnkyICogcGl0Y2ggKTsKKworCUFEVkFOQ0VfRE1BKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2cyMDBfZW1pdF9jb250ZXh0KCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCURNQV9MT0NBTFM7CisKKwlCRUdJTl9ETUEoIDMgKTsKKworCURNQV9CTE9DSyggTUdBX0RTVE9SRywJCWN0eC0+ZHN0b3JnLAorCQkgICBNR0FfTUFDQ0VTUywJCWN0eC0+bWFjY2VzcywKKwkJICAgTUdBX1BMTldULAkJY3R4LT5wbG53dCwKKwkJICAgTUdBX0RXR0NUTCwJCWN0eC0+ZHdnY3RsICk7CisKKwlETUFfQkxPQ0soIE1HQV9BTFBIQUNUUkwsCWN0eC0+YWxwaGFjdHJsLAorCQkgICBNR0FfRk9HQ09MLAkJY3R4LT5mb2djb2xvciwKKwkJICAgTUdBX1dGTEFHLAkJY3R4LT53ZmxhZywKKwkJICAgTUdBX1pPUkcsCQlkZXZfcHJpdi0+ZGVwdGhfb2Zmc2V0ICk7CisKKwlETUFfQkxPQ0soIE1HQV9GQ09MLAkJY3R4LT5mY29sLAorCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwICk7CisKKwlBRFZBTkNFX0RNQSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9nNDAwX2VtaXRfY29udGV4dCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlETUFfTE9DQUxTOworCisJQkVHSU5fRE1BKCA0ICk7CisKKwlETUFfQkxPQ0soIE1HQV9EU1RPUkcsCQljdHgtPmRzdG9yZywKKwkJICAgTUdBX01BQ0NFU1MsCQljdHgtPm1hY2Nlc3MsCisJCSAgIE1HQV9QTE5XVCwJCWN0eC0+cGxud3QsCisJCSAgIE1HQV9EV0dDVEwsCQljdHgtPmR3Z2N0bCApOworCisJRE1BX0JMT0NLKCBNR0FfQUxQSEFDVFJMLAljdHgtPmFscGhhY3RybCwKKwkJICAgTUdBX0ZPR0NPTCwJCWN0eC0+Zm9nY29sb3IsCisJCSAgIE1HQV9XRkxBRywJCWN0eC0+d2ZsYWcsCisJCSAgIE1HQV9aT1JHLAkJZGV2X3ByaXYtPmRlcHRoX29mZnNldCApOworCisJRE1BX0JMT0NLKCBNR0FfV0ZMQUcxLAkJY3R4LT53ZmxhZywKKwkJICAgTUdBX1REVUFMU1RBR0UwLAljdHgtPnRkdWFsc3RhZ2UwLAorCQkgICBNR0FfVERVQUxTVEFHRTEsCWN0eC0+dGR1YWxzdGFnZTEsCisJCSAgIE1HQV9GQ09MLAkJY3R4LT5mY29sICk7CisKKwlETUFfQkxPQ0soIE1HQV9TVEVOQ0lMLAkJY3R4LT5zdGVuY2lsLAorCQkgICBNR0FfU1RFTkNJTENUTCwJY3R4LT5zdGVuY2lsY3RsLAorCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAgKTsKKworCUFEVkFOQ0VfRE1BKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2cyMDBfZW1pdF90ZXgwKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfdGV4dHVyZV9yZWdzX3QgKnRleCA9ICZzYXJlYV9wcml2LT50ZXhfc3RhdGVbMF07CisJRE1BX0xPQ0FMUzsKKworCUJFR0lOX0RNQSggNCApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYQ1RMMiwJCXRleC0+dGV4Y3RsMiwKKwkJICAgTUdBX1RFWENUTCwJCXRleC0+dGV4Y3RsLAorCQkgICBNR0FfVEVYRklMVEVSLAl0ZXgtPnRleGZpbHRlciwKKwkJICAgTUdBX1RFWEJPUkRFUkNPTCwJdGV4LT50ZXhib3JkZXJjb2wgKTsKKworCURNQV9CTE9DSyggTUdBX1RFWE9SRywJCXRleC0+dGV4b3JnLAorCQkgICBNR0FfVEVYT1JHMSwJCXRleC0+dGV4b3JnMSwKKwkJICAgTUdBX1RFWE9SRzIsCQl0ZXgtPnRleG9yZzIsCisJCSAgIE1HQV9URVhPUkczLAkJdGV4LT50ZXhvcmczICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhPUkc0LAkJdGV4LT50ZXhvcmc0LAorCQkgICBNR0FfVEVYV0lEVEgsCXRleC0+dGV4d2lkdGgsCisJCSAgIE1HQV9URVhIRUlHSFQsCXRleC0+dGV4aGVpZ2h0LAorCQkgICBNR0FfV1IyNCwJCXRleC0+dGV4d2lkdGggKTsKKworCURNQV9CTE9DSyggTUdBX1dSMzQsCQl0ZXgtPnRleGhlaWdodCwKKwkJICAgTUdBX1RFWFRSQU5TLAkweDAwMDBmZmZmLAorCQkgICBNR0FfVEVYVFJBTlNISUdILAkweDAwMDBmZmZmLAorCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzQwMF9lbWl0X3RleDAoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV90ZXh0dXJlX3JlZ3NfdCAqdGV4ID0gJnNhcmVhX3ByaXYtPnRleF9zdGF0ZVswXTsKKwlETUFfTE9DQUxTOworCisvKiAgCXByaW50aygibWdhX2c0MDBfZW1pdF90ZXgwICV4ICV4ICV4XG4iLCB0ZXgtPnRleG9yZywgKi8KKy8qICAJICAgICAgIHRleC0+dGV4Y3RsLCB0ZXgtPnRleGN0bDIpOyAqLworCisJQkVHSU5fRE1BKCA2ICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhDVEwyLAkJdGV4LT50ZXhjdGwyIHwgTUdBX0c0MDBfVEMyX01BR0lDLAorCQkgICBNR0FfVEVYQ1RMLAkJdGV4LT50ZXhjdGwsCisJCSAgIE1HQV9URVhGSUxURVIsCXRleC0+dGV4ZmlsdGVyLAorCQkgICBNR0FfVEVYQk9SREVSQ09MLAl0ZXgtPnRleGJvcmRlcmNvbCApOworCisJRE1BX0JMT0NLKCBNR0FfVEVYT1JHLAkJdGV4LT50ZXhvcmcsCisJCSAgIE1HQV9URVhPUkcxLAkJdGV4LT50ZXhvcmcxLAorCQkgICBNR0FfVEVYT1JHMiwJCXRleC0+dGV4b3JnMiwKKwkJICAgTUdBX1RFWE9SRzMsCQl0ZXgtPnRleG9yZzMgKTsKKworCURNQV9CTE9DSyggTUdBX1RFWE9SRzQsCQl0ZXgtPnRleG9yZzQsCisJCSAgIE1HQV9URVhXSURUSCwJdGV4LT50ZXh3aWR0aCwKKwkJICAgTUdBX1RFWEhFSUdIVCwJdGV4LT50ZXhoZWlnaHQsCisJCSAgIE1HQV9XUjQ5LAkJMHgwMDAwMDAwMCApOworCisJRE1BX0JMT0NLKCBNR0FfV1I1NywJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9XUjUzLAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSNjEsCQkweDAwMDAwMDAwLAorCQkgICBNR0FfV1I1MiwJCU1HQV9HNDAwX1dSX01BR0lDICk7CisKKwlETUFfQkxPQ0soIE1HQV9XUjYwLAkJTUdBX0c0MDBfV1JfTUFHSUMsCisJCSAgIE1HQV9XUjU0LAkJdGV4LT50ZXh3aWR0aCB8IE1HQV9HNDAwX1dSX01BR0lDLAorCQkgICBNR0FfV1I2MiwJCXRleC0+dGV4aGVpZ2h0IHwgTUdBX0c0MDBfV1JfTUFHSUMsCisJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwICk7CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1RFWFRSQU5TLAkweDAwMDBmZmZmLAorCQkgICBNR0FfVEVYVFJBTlNISUdILAkweDAwMDBmZmZmICk7CisKKwlBRFZBTkNFX0RNQSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9nNDAwX2VtaXRfdGV4MSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzFdOworCURNQV9MT0NBTFM7CisKKy8qICAJcHJpbnRrKCJtZ2FfZzQwMF9lbWl0X3RleDEgJXggJXggJXhcbiIsIHRleC0+dGV4b3JnLCAgKi8KKy8qICAJICAgICAgIHRleC0+dGV4Y3RsLCB0ZXgtPnRleGN0bDIpOyAqLworCisJQkVHSU5fRE1BKCA1ICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhDVEwyLAkJKHRleC0+dGV4Y3RsMiB8CisJCQkJCSBNR0FfTUFQMV9FTkFCTEUgfAorCQkJCQkgTUdBX0c0MDBfVEMyX01BR0lDKSwKKwkJICAgTUdBX1RFWENUTCwJCXRleC0+dGV4Y3RsLAorCQkgICBNR0FfVEVYRklMVEVSLAl0ZXgtPnRleGZpbHRlciwKKwkJICAgTUdBX1RFWEJPUkRFUkNPTCwJdGV4LT50ZXhib3JkZXJjb2wgKTsKKworCURNQV9CTE9DSyggTUdBX1RFWE9SRywJCXRleC0+dGV4b3JnLAorCQkgICBNR0FfVEVYT1JHMSwJCXRleC0+dGV4b3JnMSwKKwkJICAgTUdBX1RFWE9SRzIsCQl0ZXgtPnRleG9yZzIsCisJCSAgIE1HQV9URVhPUkczLAkJdGV4LT50ZXhvcmczICk7CisKKwlETUFfQkxPQ0soIE1HQV9URVhPUkc0LAkJdGV4LT50ZXhvcmc0LAorCQkgICBNR0FfVEVYV0lEVEgsCXRleC0+dGV4d2lkdGgsCisJCSAgIE1HQV9URVhIRUlHSFQsCXRleC0+dGV4aGVpZ2h0LAorCQkgICBNR0FfV1I0OSwJCTB4MDAwMDAwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX1dSNTcsCQkweDAwMDAwMDAwLAorCQkgICBNR0FfV1I1MywJCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9XUjYxLAkJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1dSNTIsCQl0ZXgtPnRleHdpZHRoIHwgTUdBX0c0MDBfV1JfTUFHSUMgKTsKKworCURNQV9CTE9DSyggTUdBX1dSNjAsCQl0ZXgtPnRleGhlaWdodCB8IE1HQV9HNDAwX1dSX01BR0lDLAorCQkgICBNR0FfVEVYVFJBTlMsCTB4MDAwMGZmZmYsCisJCSAgIE1HQV9URVhUUkFOU0hJR0gsCTB4MDAwMGZmZmYsCisJCSAgIE1HQV9URVhDVEwyLAkJdGV4LT50ZXhjdGwyIHwgTUdBX0c0MDBfVEMyX01BR0lDICk7CisKKwlBRFZBTkNFX0RNQSgpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9nMjAwX2VtaXRfcGlwZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwl1bnNpZ25lZCBpbnQgcGlwZSA9IHNhcmVhX3ByaXYtPndhcnBfcGlwZTsKKwlETUFfTE9DQUxTOworCisJQkVHSU5fRE1BKCAzICk7CisKKwlETUFfQkxPQ0soIE1HQV9XSUFERFIsCU1HQV9XTU9ERV9TVVNQRU5ELAorCQkgICBNR0FfV1ZSVFhTWiwJMHgwMDAwMDAwNywKKwkJICAgTUdBX1dGTEFHLAkweDAwMDAwMDAwLAorCQkgICBNR0FfV1IyNCwJMHgwMDAwMDAwMCApOworCisJRE1BX0JMT0NLKCBNR0FfV1IyNSwJMHgwMDAwMDEwMCwKKwkJICAgTUdBX1dSMzQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9XUjQyLAkweDAwMDBmZmZmLAorCQkgICBNR0FfV1I2MCwJMHgwMDAwZmZmZiApOworCisJLyogUGFkZGluZyByZXF1aXJlZCB0byB0byBoYXJkd2FyZSBidWcuCisJICovCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweGZmZmZmZmZmLAorCQkgICBNR0FfRE1BUEFELAkweGZmZmZmZmZmLAorCQkgICBNR0FfRE1BUEFELAkweGZmZmZmZmZmLAorCQkgICBNR0FfV0lBRERSLAkoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzW3BpcGVdIHwKKwkJCQkgTUdBX1dNT0RFX1NUQVJUIHwKKwkJCQkgTUdBX1dBR1BfRU5BQkxFKSApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzQwMF9lbWl0X3BpcGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgaW50IHBpcGUgPSBzYXJlYV9wcml2LT53YXJwX3BpcGU7CisJRE1BX0xPQ0FMUzsKKworLyogIAlwcmludGsoIm1nYV9nNDAwX2VtaXRfcGlwZSAleFxuIiwgcGlwZSk7ICovCisKKwlCRUdJTl9ETUEoIDEwICk7CisKKwlETUFfQkxPQ0soIE1HQV9XSUFERFIyLAlNR0FfV01PREVfU1VTUEVORCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCApOworCisJaWYgKCBwaXBlICYgTUdBX1QyICkgeworCQlETUFfQkxPQ0soIE1HQV9XVlJUWFNaLAkJMHgwMDAwMWUwOSwKKwkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCApOworCisJCURNQV9CTE9DSyggTUdBX1dBQ0NFUFRTRVEsCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfV0FDQ0VQVFNFUSwJMHgwMDAwMDAwMCwKKwkJCSAgIE1HQV9XQUNDRVBUU0VRLAkweDAwMDAwMDAwLAorCQkJICAgTUdBX1dBQ0NFUFRTRVEsCTB4MWUwMDAwMDAgKTsKKwl9IGVsc2UgeworCQlpZiAoIGRldl9wcml2LT53YXJwX3BpcGUgJiBNR0FfVDIgKSB7CisJCQkvKiBGbHVzaCB0aGUgV0FSUCBwaXBlICovCisJCQlETUFfQkxPQ0soIE1HQV9ZRFNULAkJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfRlhMRUZULAkJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfRlhSSUdIVCwJCTB4MDAwMDAwMDEsCisJCQkJICAgTUdBX0RXR0NUTCwJCU1HQV9EV0dDVExfRkxVU0ggKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfTEVOICsgTUdBX0VYRUMsCTB4MDAwMDAwMDEsCisJCQkJICAgTUdBX0RXR1NZTkMsCQkweDAwMDA3MDAwLAorCQkJCSAgIE1HQV9URVhDVEwyLAkJTUdBX0c0MDBfVEMyX01BR0lDLAorCQkJCSAgIE1HQV9MRU4gKyBNR0FfRVhFQywJMHgwMDAwMDAwMCApOworCisJCQlETUFfQkxPQ0soIE1HQV9URVhDVEwyLAkJKE1HQV9EVUFMVEVYIHwKKwkJCQkJCQkgTUdBX0c0MDBfVEMyX01BR0lDKSwKKwkJCQkgICBNR0FfTEVOICsgTUdBX0VYRUMsCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX1RFWENUTDIsCQlNR0FfRzQwMF9UQzJfTUFHSUMsCisJCQkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAgKTsKKwkJfQorCisJCURNQV9CTE9DSyggTUdBX1dWUlRYU1osCQkweDAwMDAxODA3LAorCQkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfRE1BUEFELAkJMHgwMDAwMDAwMCwKKwkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwICk7CisKKwkJRE1BX0JMT0NLKCBNR0FfV0FDQ0VQVFNFUSwJMHgwMDAwMDAwMCwKKwkJCSAgIE1HQV9XQUNDRVBUU0VRLAkweDAwMDAwMDAwLAorCQkJICAgTUdBX1dBQ0NFUFRTRVEsCTB4MDAwMDAwMDAsCisJCQkgICBNR0FfV0FDQ0VQVFNFUSwJMHgxODAwMDAwMCApOworCX0KKworCURNQV9CTE9DSyggTUdBX1dGTEFHLAkweDAwMDAwMDAwLAorCQkgICBNR0FfV0ZMQUcxLAkweDAwMDAwMDAwLAorCQkgICBNR0FfV1I1NiwJTUdBX0c0MDBfV1I1Nl9NQUdJQywKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCApOworCisJRE1BX0JMT0NLKCBNR0FfV1I0OSwJMHgwMDAwMDAwMCwJCS8qIHRleDAgICAgICAgICAgICAgICovCisJCSAgIE1HQV9XUjU3LAkweDAwMDAwMDAwLAkJLyogdGV4MCAgICAgICAgICAgICAgKi8KKwkJICAgTUdBX1dSNTMsCTB4MDAwMDAwMDAsCQkvKiB0ZXgxICAgICAgICAgICAgICAqLworCQkgICBNR0FfV1I2MSwJMHgwMDAwMDAwMCApOwkJLyogdGV4MSAgICAgICAgICAgICAgKi8KKworCURNQV9CTE9DSyggTUdBX1dSNTQsCU1HQV9HNDAwX1dSX01BR0lDLAkvKiB0ZXgwIHdpZHRoICAgICAgICAqLworCQkgICBNR0FfV1I2MiwJTUdBX0c0MDBfV1JfTUFHSUMsCS8qIHRleDAgaGVpZ2h0ICAgICAgICovCisJCSAgIE1HQV9XUjUyLAlNR0FfRzQwMF9XUl9NQUdJQywJLyogdGV4MSB3aWR0aCAgICAgICAgKi8KKwkJICAgTUdBX1dSNjAsCU1HQV9HNDAwX1dSX01BR0lDICk7CS8qIHRleDEgaGVpZ2h0ICAgICAgICovCisKKwkvKiBQYWRkaW5nIHJlcXVpcmVkIHRvIHRvIGhhcmR3YXJlIGJ1ZyAqLworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX0RNQVBBRCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX1dJQUREUjIsCShkZXZfcHJpdi0+d2FycF9waXBlX3BoeXNbcGlwZV0gfAorCQkJCSBNR0FfV01PREVfU1RBUlQgfAorCQkJCSBNR0FfV0FHUF9FTkFCTEUpICk7CisKKwlBRFZBTkNFX0RNQSgpOworfQorCitzdGF0aWMgdm9pZCBtZ2FfZzIwMF9lbWl0X3N0YXRlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGludCBkaXJ0eSA9IHNhcmVhX3ByaXYtPmRpcnR5OworCisJaWYgKCBzYXJlYV9wcml2LT53YXJwX3BpcGUgIT0gZGV2X3ByaXYtPndhcnBfcGlwZSApIHsKKwkJbWdhX2cyMDBfZW1pdF9waXBlKCBkZXZfcHJpdiApOworCQlkZXZfcHJpdi0+d2FycF9waXBlID0gc2FyZWFfcHJpdi0+d2FycF9waXBlOworCX0KKworCWlmICggZGlydHkgJiBNR0FfVVBMT0FEX0NPTlRFWFQgKSB7CisJCW1nYV9nMjAwX2VtaXRfY29udGV4dCggZGV2X3ByaXYgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfk1HQV9VUExPQURfQ09OVEVYVDsKKwl9CisKKwlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9URVgwICkgeworCQltZ2FfZzIwMF9lbWl0X3RleDAoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5NR0FfVVBMT0FEX1RFWDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBtZ2FfZzQwMF9lbWl0X3N0YXRlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXVuc2lnbmVkIGludCBkaXJ0eSA9IHNhcmVhX3ByaXYtPmRpcnR5OworCWludCBtdWx0aXRleCA9IHNhcmVhX3ByaXYtPndhcnBfcGlwZSAmIE1HQV9UMjsKKworCWlmICggc2FyZWFfcHJpdi0+d2FycF9waXBlICE9IGRldl9wcml2LT53YXJwX3BpcGUgKSB7CisJCW1nYV9nNDAwX2VtaXRfcGlwZSggZGV2X3ByaXYgKTsKKwkJZGV2X3ByaXYtPndhcnBfcGlwZSA9IHNhcmVhX3ByaXYtPndhcnBfcGlwZTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9DT05URVhUICkgeworCQltZ2FfZzQwMF9lbWl0X2NvbnRleHQoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5NR0FfVVBMT0FEX0NPTlRFWFQ7CisJfQorCisJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfVEVYMCApIHsKKwkJbWdhX2c0MDBfZW1pdF90ZXgwKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+TUdBX1VQTE9BRF9URVgwOworCX0KKworCWlmICggKGRpcnR5ICYgTUdBX1VQTE9BRF9URVgxKSAmJiBtdWx0aXRleCApIHsKKwkJbWdhX2c0MDBfZW1pdF90ZXgxKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+TUdBX1VQTE9BRF9URVgxOworCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTQVJFQSBzdGF0ZSB2ZXJpZmljYXRpb24KKyAqLworCisvKiBEaXNhbGxvdyBhbGwgd3JpdGUgZGVzdGluYXRpb25zIGV4Y2VwdCB0aGUgZnJvbnQgYW5kIGJhY2tidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgbWdhX3ZlcmlmeV9jb250ZXh0KCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCisJaWYgKCBjdHgtPmRzdG9yZyAhPSBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ICYmCisJICAgICBjdHgtPmRzdG9yZyAhPSBkZXZfcHJpdi0+YmFja19vZmZzZXQgKSB7CisJCURSTV9FUlJPUiggIioqKiBiYWQgRFNUT1JHOiAleCAoZnJvbnQgJXgsIGJhY2sgJXgpXG5cbiIsCisJCQkgICBjdHgtPmRzdG9yZywgZGV2X3ByaXYtPmZyb250X29mZnNldCwKKwkJCSAgIGRldl9wcml2LT5iYWNrX29mZnNldCApOworCQljdHgtPmRzdG9yZyA9IDA7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIERpc2FsbG93IHRleHR1cmUgcmVhZHMgZnJvbSBQQ0kgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgbWdhX3ZlcmlmeV90ZXgoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHVuaXQgKQoreworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfdGV4dHVyZV9yZWdzX3QgKnRleCA9ICZzYXJlYV9wcml2LT50ZXhfc3RhdGVbdW5pdF07CisJdW5zaWduZWQgaW50IG9yZzsKKworCW9yZyA9IHRleC0+dGV4b3JnICYgKE1HQV9URVhPUkdNQVBfTUFTSyB8IE1HQV9URVhPUkdBQ0NfTUFTSyk7CisKKwlpZiAoIG9yZyA9PSAoTUdBX1RFWE9SR01BUF9TWVNNRU0gfCBNR0FfVEVYT1JHQUNDX1BDSSkgKSB7CisJCURSTV9FUlJPUiggIioqKiBiYWQgVEVYT1JHOiAweCV4LCB1bml0ICVkXG4iLAorCQkJICAgdGV4LT50ZXhvcmcsIHVuaXQgKTsKKwkJdGV4LT50ZXhvcmcgPSAwOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfc3RhdGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgaW50IGRpcnR5ID0gc2FyZWFfcHJpdi0+ZGlydHk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IE1HQV9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9DT05URVhUICkKKwkJcmV0IHw9IG1nYV92ZXJpZnlfY29udGV4dCggZGV2X3ByaXYgKTsKKworCWlmICggZGlydHkgJiBNR0FfVVBMT0FEX1RFWDAgKQorCQlyZXQgfD0gbWdhX3ZlcmlmeV90ZXgoIGRldl9wcml2LCAwICk7CisKKwlpZiAoIGRldl9wcml2LT5jaGlwc2V0ID09IE1HQV9DQVJEX1RZUEVfRzQwMCApIHsKKwkJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfVEVYMSApCisJCQlyZXQgfD0gbWdhX3ZlcmlmeV90ZXgoIGRldl9wcml2LCAxICk7CisKKwkJaWYgKCBkaXJ0eSAmIE1HQV9VUExPQURfUElQRSApCisJCQlyZXQgfD0gKCBzYXJlYV9wcml2LT53YXJwX3BpcGUgPiBNR0FfTUFYX0c0MDBfUElQRVMgKTsKKwl9IGVsc2UgeworCQlpZiAoIGRpcnR5ICYgTUdBX1VQTE9BRF9QSVBFICkKKwkJCXJldCB8PSAoIHNhcmVhX3ByaXYtPndhcnBfcGlwZSA+IE1HQV9NQVhfRzIwMF9QSVBFUyApOworCX0KKworCXJldHVybiAoIHJldCA9PSAwICk7Cit9CisKK3N0YXRpYyBpbnQgbWdhX3ZlcmlmeV9pbG9hZCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgICB1bnNpZ25lZCBpbnQgZHN0b3JnLCB1bnNpZ25lZCBpbnQgbGVuZ3RoICkKK3sKKwlpZiAoIGRzdG9yZyA8IGRldl9wcml2LT50ZXh0dXJlX29mZnNldCB8fAorCSAgICAgZHN0b3JnICsgbGVuZ3RoID4gKGRldl9wcml2LT50ZXh0dXJlX29mZnNldCArCisJCQkJZGV2X3ByaXYtPnRleHR1cmVfc2l6ZSkgKSB7CisJCURSTV9FUlJPUiggIioqKiBiYWQgaWxvYWQgRFNUT1JHOiAweCV4XG4iLCBkc3RvcmcgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIGxlbmd0aCAmIE1HQV9JTE9BRF9NQVNLICkgeworCQlEUk1fRVJST1IoICIqKiogYmFkIGlsb2FkIGxlbmd0aDogMHgleFxuIiwKKwkJCSAgIGxlbmd0aCAmIE1HQV9JTE9BRF9NQVNLICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX3ZlcmlmeV9ibGl0KCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgdW5zaWduZWQgaW50IHNyY29yZywgdW5zaWduZWQgaW50IGRzdG9yZyApCit7CisJaWYgKCAoc3Jjb3JnICYgMHgzKSA9PSAoTUdBX1NSQ0FDQ19QQ0kgfCBNR0FfU1JDTUFQX1NZU01FTSkgfHwKKwkgICAgIChkc3RvcmcgJiAweDMpID09IChNR0FfU1JDQUNDX1BDSSB8IE1HQV9TUkNNQVBfU1lTTUVNKSApIHsKKwkJRFJNX0VSUk9SKCAiKioqIGJhZCBibGl0OiBzcmM9MHgleCBkc3Q9MHgleFxuIiwKKwkJCSAgIHNyY29yZywgZHN0b3JnICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9jbGVhciggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgIGRybV9tZ2FfY2xlYXJfdCAqY2xlYXIgKQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWludCBpOworCURNQV9MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlCRUdJTl9ETUEoIDEgKTsKKworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RXR1NZTkMsCTB4MDAwMDcxMDAsCisJCSAgIE1HQV9EV0dTWU5DLAkweDAwMDA3MDAwICk7CisKKwlBRFZBTkNFX0RNQSgpOworCisJZm9yICggaSA9IDAgOyBpIDwgbmJveCA7IGkrKyApIHsKKwkJZHJtX2NsaXBfcmVjdF90ICpib3ggPSAmcGJveFtpXTsKKwkJdTMyIGhlaWdodCA9IGJveC0+eTIgLSBib3gtPnkxOworCisJCURSTV9ERUJVRyggIiAgIGZyb209JWQsJWQgdG89JWQsJWRcbiIsCisJCQkgICBib3gtPngxLCBib3gtPnkxLCBib3gtPngyLCBib3gtPnkyICk7CisKKwkJaWYgKCBjbGVhci0+ZmxhZ3MgJiBNR0FfRlJPTlQgKSB7CisJCQlCRUdJTl9ETUEoIDIgKTsKKworCQkJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9QTE5XVCwJY2xlYXItPmNvbG9yX21hc2ssCisJCQkJICAgTUdBX1lEU1RMRU4sIChib3gtPnkxIDw8IDE2KSB8IGhlaWdodCwKKwkJCQkgICBNR0FfRlhCTkRSWSwgKGJveC0+eDIgPDwgMTYpIHwgYm94LT54MSApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0ZDT0wsCWNsZWFyLT5jbGVhcl9jb2xvciwKKwkJCQkgICBNR0FfRFNUT1JHLAlkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0LAorCQkJCSAgIE1HQV9EV0dDVEwgKyBNR0FfRVhFQywKKwkJCQkJCWRldl9wcml2LT5jbGVhcl9jbWQgKTsKKworCQkJQURWQU5DRV9ETUEoKTsKKwkJfQorCisKKwkJaWYgKCBjbGVhci0+ZmxhZ3MgJiBNR0FfQkFDSyApIHsKKwkJCUJFR0lOX0RNQSggMiApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX1BMTldULAljbGVhci0+Y29sb3JfbWFzaywKKwkJCQkgICBNR0FfWURTVExFTiwgKGJveC0+eTEgPDwgMTYpIHwgaGVpZ2h0LAorCQkJCSAgIE1HQV9GWEJORFJZLCAoYm94LT54MiA8PCAxNikgfCBib3gtPngxICk7CisKKwkJCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfRkNPTCwJY2xlYXItPmNsZWFyX2NvbG9yLAorCQkJCSAgIE1HQV9EU1RPUkcsCWRldl9wcml2LT5iYWNrX29mZnNldCwKKwkJCQkgICBNR0FfRFdHQ1RMICsgTUdBX0VYRUMsCisJCQkJCQlkZXZfcHJpdi0+Y2xlYXJfY21kICk7CisKKwkJCUFEVkFOQ0VfRE1BKCk7CisJCX0KKworCQlpZiAoIGNsZWFyLT5mbGFncyAmIE1HQV9ERVBUSCApIHsKKwkJCUJFR0lOX0RNQSggMiApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX1BMTldULAljbGVhci0+ZGVwdGhfbWFzaywKKwkJCQkgICBNR0FfWURTVExFTiwgKGJveC0+eTEgPDwgMTYpIHwgaGVpZ2h0LAorCQkJCSAgIE1HQV9GWEJORFJZLCAoYm94LT54MiA8PCAxNikgfCBib3gtPngxICk7CisKKwkJCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJCQkgICBNR0FfRkNPTCwJY2xlYXItPmNsZWFyX2RlcHRoLAorCQkJCSAgIE1HQV9EU1RPUkcsCWRldl9wcml2LT5kZXB0aF9vZmZzZXQsCisJCQkJICAgTUdBX0RXR0NUTCArIE1HQV9FWEVDLAorCQkJCQkJZGV2X3ByaXYtPmNsZWFyX2NtZCApOworCisJCQlBRFZBTkNFX0RNQSgpOworCQl9CisKKwl9CisKKwlCRUdJTl9ETUEoIDEgKTsKKworCS8qIEZvcmNlIHJlc2V0IG9mIERXR0NUTCAqLworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1BMTldULAljdHgtPnBsbnd0LAorCQkgICBNR0FfRFdHQ1RMLAljdHgtPmR3Z2N0bCApOworCisJQURWQU5DRV9ETUEoKTsKKworCUZMVVNIX0RNQSgpOworfQorCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX3N3YXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlpbnQgaTsKKwlETUFfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJc2FyZWFfcHJpdi0+bGFzdF9mcmFtZS5oZWFkID0gZGV2X3ByaXYtPnByaW0udGFpbDsKKwlzYXJlYV9wcml2LT5sYXN0X2ZyYW1lLndyYXAgPSBkZXZfcHJpdi0+cHJpbS5sYXN0X3dyYXA7CisKKwlCRUdJTl9ETUEoIDQgKyBuYm94ICk7CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9EV0dTWU5DLAkweDAwMDA3MTAwLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzAwMCApOworCisJRE1BX0JMT0NLKCBNR0FfRFNUT1JHLAlkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0LAorCQkgICBNR0FfTUFDQ0VTUywJZGV2X3ByaXYtPm1hY2Nlc3MsCisJCSAgIE1HQV9TUkNPUkcsCWRldl9wcml2LT5iYWNrX29mZnNldCwKKwkJICAgTUdBX0FSNSwJZGV2X3ByaXYtPmZyb250X3BpdGNoICk7CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9QTE5XVCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX0RXR0NUTCwJTUdBX0RXR0NUTF9DT1BZICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQlkcm1fY2xpcF9yZWN0X3QgKmJveCA9ICZwYm94W2ldOworCQl1MzIgaGVpZ2h0ID0gYm94LT55MiAtIGJveC0+eTE7CisJCXUzMiBzdGFydCA9IGJveC0+eTEgKiBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2g7CisKKwkJRFJNX0RFQlVHKCAiICAgZnJvbT0lZCwlZCB0bz0lZCwlZFxuIiwKKwkJCSAgIGJveC0+eDEsIGJveC0+eTEsIGJveC0+eDIsIGJveC0+eTIgKTsKKworCQlETUFfQkxPQ0soIE1HQV9BUjAsCXN0YXJ0ICsgYm94LT54MiAtIDEsCisJCQkgICBNR0FfQVIzLAlzdGFydCArIGJveC0+eDEsCisJCQkgICBNR0FfRlhCTkRSWSwJKChib3gtPngyIC0gMSkgPDwgMTYpIHwgYm94LT54MSwKKwkJCSAgIE1HQV9ZRFNUTEVOICsgTUdBX0VYRUMsCisJCQkJCShib3gtPnkxIDw8IDE2KSB8IGhlaWdodCApOworCX0KKworCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX1BMTldULAljdHgtPnBsbnd0LAorCQkgICBNR0FfU1JDT1JHLAlkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0LAorCQkgICBNR0FfRFdHQ1RMLAljdHgtPmR3Z2N0bCApOworCisJQURWQU5DRV9ETUEoKTsKKworCUZMVVNIX0RNQSgpOworCisJRFJNX0RFQlVHKCAiJXMuLi4gZG9uZS5cbiIsIF9fRlVOQ1RJT05fXyApOworfQorCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX3ZlcnRleCggZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfdCAqYnVmICkKK3sKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXUzMiBhZGRyZXNzID0gKHUzMikgYnVmLT5idXNfYWRkcmVzczsKKwl1MzIgbGVuZ3RoID0gKHUzMikgYnVmLT51c2VkOworCWludCBpID0gMDsKKwlETUFfTE9DQUxTOworCURSTV9ERUJVRyggInZlcnRleDogYnVmPSVkIHVzZWQ9JWRcbiIsIGJ1Zi0+aWR4LCBidWYtPnVzZWQgKTsKKworCWlmICggYnVmLT51c2VkICkgeworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDE7CisKKwkJTUdBX0VNSVRfU1RBVEUoIGRldl9wcml2LCBzYXJlYV9wcml2LT5kaXJ0eSApOworCisJCWRvIHsKKwkJCWlmICggaSA8IHNhcmVhX3ByaXYtPm5ib3ggKSB7CisJCQkJbWdhX2VtaXRfY2xpcF9yZWN0KCBkZXZfcHJpdiwKKwkJCQkJCSAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0gKTsKKwkJCX0KKworCQkJQkVHSU5fRE1BKCAxICk7CisKKwkJCURNQV9CTE9DSyggTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX0RNQVBBRCwJCTB4MDAwMDAwMDAsCisJCQkJICAgTUdBX1NFQ0FERFJFU1MsCShhZGRyZXNzIHwKKwkJCQkJCQkgTUdBX0RNQV9WRVJURVgpLAorCQkJCSAgIE1HQV9TRUNFTkQsCQkoKGFkZHJlc3MgKyBsZW5ndGgpIHwKKwkJCQkJCQkgTUdBX1BBR1BYRkVSKSApOworCisJCQlBRFZBTkNFX0RNQSgpOworCQl9IHdoaWxlICggKytpIDwgc2FyZWFfcHJpdi0+bmJveCApOworCX0KKworCWlmICggYnVmX3ByaXYtPmRpc2NhcmQgKSB7CisJCUFHRV9CVUZGRVIoIGJ1Zl9wcml2ICk7CisJCWJ1Zi0+cGVuZGluZyA9IDA7CisJCWJ1Zi0+dXNlZCA9IDA7CisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMDsKKworCQltZ2FfZnJlZWxpc3RfcHV0KCBkZXYsIGJ1ZiApOworCX0KKworCUZMVVNIX0RNQSgpOworfQorCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2luZGljZXMoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBlbmQgKQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdTMyIGFkZHJlc3MgPSAodTMyKSBidWYtPmJ1c19hZGRyZXNzOworCWludCBpID0gMDsKKwlETUFfTE9DQUxTOworCURSTV9ERUJVRyggImluZGljZXM6IGJ1Zj0lZCBzdGFydD0lZCBlbmQ9JWRcbiIsIGJ1Zi0+aWR4LCBzdGFydCwgZW5kICk7CisKKwlpZiAoIHN0YXJ0ICE9IGVuZCApIHsKKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAxOworCisJCU1HQV9FTUlUX1NUQVRFKCBkZXZfcHJpdiwgc2FyZWFfcHJpdi0+ZGlydHkgKTsKKworCQlkbyB7CisJCQlpZiAoIGkgPCBzYXJlYV9wcml2LT5uYm94ICkgeworCQkJCW1nYV9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsCisJCQkJCQkgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldICk7CisJCQl9CisKKwkJCUJFR0lOX0RNQSggMSApOworCisJCQlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9ETUFQQUQsCQkweDAwMDAwMDAwLAorCQkJCSAgIE1HQV9TRVRVUEFERFJFU1MsCWFkZHJlc3MgKyBzdGFydCwKKwkJCQkgICBNR0FfU0VUVVBFTkQsCSgoYWRkcmVzcyArIGVuZCkgfAorCQkJCQkJCSBNR0FfUEFHUFhGRVIpICk7CisKKwkJCUFEVkFOQ0VfRE1BKCk7CisJCX0gd2hpbGUgKCArK2kgPCBzYXJlYV9wcml2LT5uYm94ICk7CisJfQorCisJaWYgKCBidWZfcHJpdi0+ZGlzY2FyZCApIHsKKwkJQUdFX0JVRkZFUiggYnVmX3ByaXYgKTsKKwkJYnVmLT5wZW5kaW5nID0gMDsKKwkJYnVmLT51c2VkID0gMDsKKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCisJCW1nYV9mcmVlbGlzdF9wdXQoIGRldiwgYnVmICk7CisJfQorCisJRkxVU0hfRE1BKCk7Cit9CisKKy8qIFRoaXMgY29waWVzIGEgNjQgYnl0ZSBhbGlnbmVkIGFncCByZWdpb24gdG8gdGhlIGZyYW1idWZmZXIgd2l0aCBhCisgKiBzdGFuZGFyZCBibGl0LCB0aGUgaW9jdGwgbmVlZHMgdG8gZG8gY2hlY2tpbmcuCisgKi8KK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfaWxvYWQoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiwKKwkJCQkgICAgdW5zaWduZWQgaW50IGRzdG9yZywgdW5zaWduZWQgaW50IGxlbmd0aCApCit7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJdTMyIHNyY29yZyA9IGJ1Zi0+YnVzX2FkZHJlc3MgfCBNR0FfU1JDQUNDX0FHUCB8IE1HQV9TUkNNQVBfU1lTTUVNOworCXUzMiB5MjsKKwlETUFfTE9DQUxTOworCURSTV9ERUJVRyggImJ1Zj0lZCB1c2VkPSVkXG4iLCBidWYtPmlkeCwgYnVmLT51c2VkICk7CisKKwl5MiA9IGxlbmd0aCAvIDY0OworCisJQkVHSU5fRE1BKCA1ICk7CisKKwlETUFfQkxPQ0soIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9ETUFQQUQsCTB4MDAwMDAwMDAsCisJCSAgIE1HQV9EV0dTWU5DLAkweDAwMDA3MTAwLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzAwMCApOworCisJRE1BX0JMT0NLKCBNR0FfRFNUT1JHLAlkc3RvcmcsCisJCSAgIE1HQV9NQUNDRVNTLAkweDAwMDAwMDAwLAorCQkgICBNR0FfU1JDT1JHLAlzcmNvcmcsCisJCSAgIE1HQV9BUjUsCTY0ICk7CisKKwlETUFfQkxPQ0soIE1HQV9QSVRDSCwJNjQsCisJCSAgIE1HQV9QTE5XVCwJMHhmZmZmZmZmZiwKKwkJICAgTUdBX0RNQVBBRCwJMHgwMDAwMDAwMCwKKwkJICAgTUdBX0RXR0NUTCwJTUdBX0RXR0NUTF9DT1BZICk7CisKKwlETUFfQkxPQ0soIE1HQV9BUjAsCTYzLAorCQkgICBNR0FfQVIzLAkwLAorCQkgICBNR0FfRlhCTkRSWSwJKDYzIDw8IDE2KSB8IDAsCisJCSAgIE1HQV9ZRFNUTEVOICsgTUdBX0VYRUMsIHkyICk7CisKKwlETUFfQkxPQ0soIE1HQV9QTE5XVCwJY3R4LT5wbG53dCwKKwkJICAgTUdBX1NSQ09SRywJZGV2X3ByaXYtPmZyb250X29mZnNldCwKKwkJICAgTUdBX1BJVENILAlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2gsCisJCSAgIE1HQV9EV0dTWU5DLAkweDAwMDA3MDAwICk7CisKKwlBRFZBTkNFX0RNQSgpOworCisJQUdFX0JVRkZFUiggYnVmX3ByaXYgKTsKKworCWJ1Zi0+cGVuZGluZyA9IDA7CisJYnVmLT51c2VkID0gMDsKKwlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisKKwltZ2FfZnJlZWxpc3RfcHV0KCBkZXYsIGJ1ZiApOworCisJRkxVU0hfRE1BKCk7Cit9CisKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfYmxpdCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgZHJtX21nYV9ibGl0X3QgKmJsaXQgKQoreworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCXUzMiBzY2FuZGlyID0gMCwgaTsKKwlETUFfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJQkVHSU5fRE1BKCA0ICsgbmJveCApOworCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfRFdHU1lOQywJMHgwMDAwNzEwMCwKKwkJICAgTUdBX0RXR1NZTkMsCTB4MDAwMDcwMDAgKTsKKworCURNQV9CTE9DSyggTUdBX0RXR0NUTCwJTUdBX0RXR0NUTF9DT1BZLAorCQkgICBNR0FfUExOV1QsCWJsaXQtPnBsYW5lbWFzaywKKwkJICAgTUdBX1NSQ09SRywJYmxpdC0+c3Jjb3JnLAorCQkgICBNR0FfRFNUT1JHLAlibGl0LT5kc3RvcmcgKTsKKworCURNQV9CTE9DSyggTUdBX1NHTiwJc2NhbmRpciwKKwkJICAgTUdBX01BQ0NFU1MsCWRldl9wcml2LT5tYWNjZXNzLAorCQkgICBNR0FfQVI1LAlibGl0LT55ZGlyICogYmxpdC0+c3JjX3BpdGNoLAorCQkgICBNR0FfUElUQ0gsCWJsaXQtPmRzdF9waXRjaCApOworCisJZm9yICggaSA9IDAgOyBpIDwgbmJveCA7IGkrKyApIHsKKwkJaW50IHNyY3ggPSBwYm94W2ldLngxICsgYmxpdC0+ZGVsdGFfc3g7CisJCWludCBzcmN5ID0gcGJveFtpXS55MSArIGJsaXQtPmRlbHRhX3N5OworCQlpbnQgZHN0eCA9IHBib3hbaV0ueDEgKyBibGl0LT5kZWx0YV9keDsKKwkJaW50IGRzdHkgPSBwYm94W2ldLnkxICsgYmxpdC0+ZGVsdGFfZHk7CisJCWludCBoID0gcGJveFtpXS55MiAtIHBib3hbaV0ueTE7CisJCWludCB3ID0gcGJveFtpXS54MiAtIHBib3hbaV0ueDEgLSAxOworCQlpbnQgc3RhcnQ7CisKKwkJaWYgKCBibGl0LT55ZGlyID09IC0xICkgeworCQkJc3JjeSA9IGJsaXQtPmhlaWdodCAtIHNyY3kgLSAxOworCQl9CisKKwkJc3RhcnQgPSBzcmN5ICogYmxpdC0+c3JjX3BpdGNoICsgc3JjeDsKKworCQlETUFfQkxPQ0soIE1HQV9BUjAsCXN0YXJ0ICsgdywKKwkJCSAgIE1HQV9BUjMsCXN0YXJ0LAorCQkJICAgTUdBX0ZYQk5EUlksCSgoZHN0eCArIHcpIDw8IDE2KSB8IChkc3R4ICYgMHhmZmZmKSwKKwkJCSAgIE1HQV9ZRFNUTEVOICsgTUdBX0VYRUMsIChkc3R5IDw8IDE2KSB8IGggKTsKKwl9CisKKwkvKiBEbyBzb21ldGhpbmcgdG8gZmx1c2ggQUdQPworCSAqLworCisJLyogRm9yY2UgcmVzZXQgb2YgRFdHQ1RMICovCisJRE1BX0JMT0NLKCBNR0FfRE1BUEFELAkweDAwMDAwMDAwLAorCQkgICBNR0FfUExOV1QsCWN0eC0+cGxud3QsCisJCSAgIE1HQV9QSVRDSCwJZGV2X3ByaXYtPmZyb250X3BpdGNoLAorCQkgICBNR0FfRFdHQ1RMLAljdHgtPmR3Z2N0bCApOworCisJQURWQU5DRV9ETUEoKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKK3N0YXRpYyBpbnQgbWdhX2RtYV9jbGVhciggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2NsZWFyX3QgY2xlYXI7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBjbGVhciwgKGRybV9tZ2FfY2xlYXJfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoY2xlYXIpICk7CisKKwlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IE1HQV9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwltZ2FfZG1hX2Rpc3BhdGNoX2NsZWFyKCBkZXYsICZjbGVhciApOworCisJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+ZGlydHkgfD0gTUdBX1VQTE9BRF9DT05URVhUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdhX2RtYV9zd2FwKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggc2FyZWFfcHJpdi0+bmJveCA+IE1HQV9OUl9TQVJFQV9DTElQUkVDVFMgKQorCQlzYXJlYV9wcml2LT5uYm94ID0gTUdBX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCVdSQVBfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCW1nYV9kbWFfZGlzcGF0Y2hfc3dhcCggZGV2ICk7CisKKwkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5kaXJ0eSB8PSBNR0FfVVBMT0FEX0NPTlRFWFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfZG1hX3ZlcnRleCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWRybV9tZ2FfdmVydGV4X3QgdmVydGV4OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggdmVydGV4LAorCQkJICAgICAoZHJtX21nYV92ZXJ0ZXhfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YodmVydGV4KSApOworCisgICAgICAgIGlmKHZlcnRleC5pZHggPCAwIHx8IHZlcnRleC5pZHggPiBkbWEtPmJ1Zl9jb3VudCkgcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbdmVydGV4LmlkeF07CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJYnVmLT51c2VkID0gdmVydGV4LnVzZWQ7CisJYnVmX3ByaXYtPmRpc2NhcmQgPSB2ZXJ0ZXguZGlzY2FyZDsKKworCWlmICggIW1nYV92ZXJpZnlfc3RhdGUoIGRldl9wcml2ICkgKSB7CisJCWlmICggdmVydGV4LmRpc2NhcmQgKSB7CisJCQlpZiAoIGJ1Zl9wcml2LT5kaXNwYXRjaGVkID09IDEgKQorCQkJCUFHRV9CVUZGRVIoIGJ1Zl9wcml2ICk7CisJCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisJCQltZ2FfZnJlZWxpc3RfcHV0KCBkZXYsIGJ1ZiApOworCQl9CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJV1JBUF9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJbWdhX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoIGRldiwgYnVmICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfZG1hX2luZGljZXMoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fbWdhX2luZGljZXNfdCBpbmRpY2VzOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaW5kaWNlcywKKwkJCSAgICAgKGRybV9tZ2FfaW5kaWNlc190IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZihpbmRpY2VzKSApOworCisgICAgICAgIGlmKGluZGljZXMuaWR4IDwgMCB8fCBpbmRpY2VzLmlkeCA+IGRtYS0+YnVmX2NvdW50KSByZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJYnVmID0gZG1hLT5idWZsaXN0W2luZGljZXMuaWR4XTsKKwlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwlidWZfcHJpdi0+ZGlzY2FyZCA9IGluZGljZXMuZGlzY2FyZDsKKworCWlmICggIW1nYV92ZXJpZnlfc3RhdGUoIGRldl9wcml2ICkgKSB7CisJCWlmICggaW5kaWNlcy5kaXNjYXJkICkgeworCQkJaWYgKCBidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9PSAxICkKKwkJCQlBR0VfQlVGRkVSKCBidWZfcHJpdiApOworCQkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAwOworCQkJbWdhX2ZyZWVsaXN0X3B1dCggZGV2LCBidWYgKTsKKwkJfQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVdSQVBfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCW1nYV9kbWFfZGlzcGF0Y2hfaW5kaWNlcyggZGV2LCBidWYsIGluZGljZXMuc3RhcnQsIGluZGljZXMuZW5kICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZ2FfZG1hX2lsb2FkKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9idWZfdCAqYnVmOworCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX21nYV9pbG9hZF90IGlsb2FkOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaWxvYWQsIChkcm1fbWdhX2lsb2FkX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGlsb2FkKSApOworCisjaWYgMAorCWlmICggbWdhX2RvX3dhaXRfZm9yX2lkbGUoIGRldl9wcml2ICkgPCAwICkgeworCQlpZiAoIE1HQV9ETUFfREVCVUcgKQorCQkJRFJNX0lORk8oICIlczogLUVCVVNZXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworCX0KKyNlbmRpZgorICAgICAgICBpZihpbG9hZC5pZHggPCAwIHx8IGlsb2FkLmlkeCA+IGRtYS0+YnVmX2NvdW50KSByZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJYnVmID0gZG1hLT5idWZsaXN0W2lsb2FkLmlkeF07CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJaWYgKCBtZ2FfdmVyaWZ5X2lsb2FkKCBkZXZfcHJpdiwgaWxvYWQuZHN0b3JnLCBpbG9hZC5sZW5ndGggKSApIHsKKwkJbWdhX2ZyZWVsaXN0X3B1dCggZGV2LCBidWYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwltZ2FfZG1hX2Rpc3BhdGNoX2lsb2FkKCBkZXYsIGJ1ZiwgaWxvYWQuZHN0b3JnLCBpbG9hZC5sZW5ndGggKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmRpcnR5IHw9IE1HQV9VUExPQURfQ09OVEVYVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1nYV9kbWFfYmxpdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fbWdhX2JsaXRfdCBibGl0OworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggYmxpdCwgKGRybV9tZ2FfYmxpdF90IF9fdXNlciAqKWRhdGEsIHNpemVvZihibGl0KSApOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gTUdBX05SX1NBUkVBX0NMSVBSRUNUUyApCisJCXNhcmVhX3ByaXYtPm5ib3ggPSBNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTOworCisJaWYgKCBtZ2FfdmVyaWZ5X2JsaXQoIGRldl9wcml2LCBibGl0LnNyY29yZywgYmxpdC5kc3RvcmcgKSApCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlXUkFQX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwltZ2FfZG1hX2Rpc3BhdGNoX2JsaXQoIGRldiwgJmJsaXQgKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmRpcnR5IHw9IE1HQV9VUExPQURfQ09OVEVYVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1nYV9nZXRwYXJhbSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fbWdhX2dldHBhcmFtX3QgcGFyYW07CisJaW50IHZhbHVlOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHBhcmFtLCAoZHJtX21nYV9nZXRwYXJhbV90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZihwYXJhbSkgKTsKKworCURSTV9ERUJVRyggInBpZD0lZFxuIiwgRFJNX0NVUlJFTlRQSUQgKTsKKworCXN3aXRjaCggcGFyYW0ucGFyYW0gKSB7CisJY2FzZSBNR0FfUEFSQU1fSVJRX05SOgorCQl2YWx1ZSA9IGRldi0+aXJxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggRFJNX0NPUFlfVE9fVVNFUiggcGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkgKSApIHsKKwkJRFJNX0VSUk9SKCAiY29weV90b191c2VyXG4iICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCQorCXJldHVybiAwOworfQorCitkcm1faW9jdGxfZGVzY190IG1nYV9pb2N0bHNbXSA9IHsKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSU5JVCldICAgID0geyBtZ2FfZG1hX2luaXQsICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfRkxVU0gpXSAgID0geyBtZ2FfZG1hX2ZsdXNoLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfUkVTRVQpXSAgID0geyBtZ2FfZG1hX3Jlc2V0LCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfU1dBUCldICAgID0geyBtZ2FfZG1hX3N3YXAsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfQ0xFQVIpXSAgID0geyBtZ2FfZG1hX2NsZWFyLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfVkVSVEVYKV0gID0geyBtZ2FfZG1hX3ZlcnRleCwgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSU5ESUNFUyldID0geyBtZ2FfZG1hX2luZGljZXMsIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSUxPQUQpXSAgID0geyBtZ2FfZG1hX2lsb2FkLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfQkxJVCldICAgID0geyBtZ2FfZG1hX2JsaXQsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfR0VUUEFSQU0pXT0geyBtZ2FfZ2V0cGFyYW0sICAgIDEsIDAgfSwKK307CisKK2ludCBtZ2FfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUobWdhX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV91Y29kZS5oIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfdWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBmODJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfdWNvZGUuaApAQCAtMCwwICsxLDExNjQ1IEBACisvKiBtZ2FfdWNvZGUuaCAtLSBNYXRyb3ggRzIwMC9HNDAwIFdBUlAgZW5naW5lIG1pY3JvY29kZSAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFRodSBKYW4gMTEgMjE6MjA6NDMgMjAwMSBieSBnYXJldGhAdmFsaW51eC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBNYXRyb3ggR3JhcGhpY3MgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIE1BVFJPWCBHUkFQSElDUyBJTkMuLCBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUKKyAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEtlcm5lbC1iYXNlZCBXQVJQIGVuZ2luZSBtYW5hZ2VtZW50OgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKy8qCisgKiBXQVJQIHBpcGVzIGFyZSBuYW1lZCBhY2NvcmRpbmcgdG8gdGhlIGZ1bmN0aW9ucyB0aGV5IHBlcmZvcm0sIHdoZXJlOgorICoKKyAqICAgLSBUIHN0YW5kcyBmb3IgY29tcHV0YXRpb24gb2YgdGV4dHVyZSBzdGFnZSAwCisgKiAgIC0gVDIgc3RhbmRzIGZvciBjb21wdXRhdGlvbiBvZiBib3RoIHRleHR1cmUgc3RhZ2UgMCBhbmQgdGV4dHVyZSBzdGFnZSAxCisgKiAgIC0gRyBzdGFuZHMgZm9yIGNvbXB1dGF0aW9uIG9mIHRyaWFuZ2xlIGludGVuc2l0eSAoR291cmF1ZCBpbnRlcnBvbGF0aW9uKQorICogICAtIFogc3RhbmRzIGZvciBjb21wdXRhdGlvbiBvZiBaIGJ1ZmZlciBpbnRlcnBvbGF0aW9uCisgKiAgIC0gUyBzdGFuZHMgZm9yIGNvbXB1dGF0aW9uIG9mIHNwZWN1bGFyIGhpZ2hsaWdodAorICogICAtIEEgc3RhbmRzIGZvciBjb21wdXRhdGlvbiBvZiB0aGUgYWxwaGEgY2hhbm5lbAorICogICAtIEYgc3RhbmRzIGZvciBjb21wdXRhdGlvbiBvZiB2ZXJ0ZXggZm9nIGludGVycG9sYXRpb24KKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2cyMDBfdGd6W10gPSB7CisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4NzIsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDE1LCAweDQxLCAweDQ5LCAweEJELAorMHgxRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgyRSwgMHg0MSwgMHgyQSwgMHhCOCwKKzB4MzQsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4MzAsCisweDFELCAweDMwLAorMHg1OCwgMHhFMywKKzB4MDAsIDB4RTAsCisKKzB4QjUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDI0LCAweDQzLCAweEEwLCAweEU4LAorMHgyQywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgxNSwgMHg3MiwKKzB4MDksIDB4RTMsCisweDAwLCAweEUwLAorMHgxRCwgMHg3MiwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHg5NywgMHg1NywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NkMsIDB4NjQsIDB4QzgsIDB4RUMsCisweDk4LCAweEUxLAorMHhCNSwgMHgwNSwKKworMHhCRCwgMHgwNSwKKzB4MkUsIDB4MzAsCisweDMyLCAweEMwLCAweEEwLCAweEU4LAorCisweDMzLCAweEMwLCAweEEwLCAweEU4LAorMHg3NCwgMHg2NCwgMHhDOCwgMHhFQywKKworMHg0MCwgMHgzQywgMHg0MCwgMHhBRCwKKzB4MzIsIDB4NkEsCisweDJBLCAweDMwLAorCisweDIwLCAweDczLAorMHgzMywgMHg2QSwKKzB4MDAsIDB4RTAsCisweDI4LCAweDczLAorCisweDFDLCAweDcyLAorMHg4MywgMHhFMiwKKzB4NjAsIDB4ODAsIDB4MTUsIDB4RUEsCisKKzB4QjgsIDB4M0QsIDB4MjgsIDB4REYsCisweDMwLCAweDM1LCAweDIwLCAweERGLAorCisweDQwLCAweDMwLAorMHgwMCwgMHhFMCwKKzB4Q0MsIDB4RTIsCisweDY0LCAweDcyLAorCisweDI1LCAweDQyLCAweDUyLCAweEJGLAorMHgyRCwgMHg0MiwgMHg0QSwgMHhCRiwKKworMHgzMCwgMHgyRSwgMHgzMCwgMHhERiwKKzB4MzgsIDB4MkUsIDB4MzgsIDB4REYsCisKKzB4MTgsIDB4MUQsIDB4NDUsIDB4RTksCisweDFFLCAweDE1LCAweDQ1LCAweEU5LAorCisweDJCLCAweDQ5LCAweDUxLCAweEJELAorMHgwMCwgMHhFMCwKKzB4MUYsIDB4NzMsCisKKzB4MzgsIDB4MzgsIDB4NDAsIDB4QUYsCisweDMwLCAweDMwLCAweDQwLCAweEFGLAorCisweDI0LCAweDFGLCAweDI0LCAweERGLAorMHgxRCwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgyQywgMHgxRiwgMHgyQywgMHhERiwKKzB4MUEsIDB4MzMsIDB4MjAsIDB4RTksCisKKzB4QjAsIDB4MTAsCisweDA4LCAweEUzLAorMHg0MCwgMHgxMCwKKzB4QjgsIDB4MTAsCisKKzB4MjYsIDB4RjAsIDB4MzAsIDB4Q0QsCisweDJGLCAweEYwLCAweDM4LCAweENELAorCisweDJCLCAweDgwLCAweDIwLCAweEU5LAorMHgyQSwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHhBNiwgMHgyMCwKKzB4ODgsIDB4RTIsCisweDAwLCAweEUwLAorMHhBRiwgMHgyMCwKKworMHgyOCwgMHgyQSwgMHgyNiwgMHhBRiwKKzB4MjAsIDB4MkEsIDB4QzAsIDB4QUYsCisKKzB4MzQsIDB4MUYsIDB4MzQsIDB4REYsCisweDQ2LCAweDI0LCAweDQ2LCAweERGLAorCisweDI4LCAweDMwLCAweDgwLCAweEJGLAorMHgyMCwgMHgzOCwgMHg4MCwgMHhCRiwKKworMHg0NywgMHgyNCwgMHg0NywgMHhERiwKKzB4NEUsIDB4MkMsIDB4NEUsIDB4REYsCisKKzB4NEYsIDB4MkMsIDB4NEYsIDB4REYsCisweDU2LCAweDM0LCAweDU2LCAweERGLAorCisweDI4LCAweDE1LCAweDI4LCAweERGLAorMHgyMCwgMHgxRCwgMHgyMCwgMHhERiwKKworMHg1NywgMHgzNCwgMHg1NywgMHhERiwKKzB4MDAsIDB4RTAsCisweDFELCAweDA1LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4OSwgMHhFMiwKKzB4MkIsIDB4MzAsCisKKzB4M0YsIDB4QzEsIDB4MUQsIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBMCwgMHg2OCwKKzB4QkYsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIwLCAweEMwLCAweDIwLCAweEFGLAorMHgyOCwgMHgwNSwKKzB4OTcsIDB4NzQsCisKKzB4MDAsIDB4RTAsCisweDJBLCAweDEwLAorMHgxNiwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4OEMsIDB4RTIsCisweDk1LCAweDA1LAorCisweDI4LCAweEMxLCAweDI4LCAweEFELAorMHgxRiwgMHhDMSwgMHgxNSwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTgsIDB4NjcsCisweDlGLCAweDZCLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyOCwgMHhDMCwgMHgyOCwgMHhBRCwKKzB4MUQsIDB4MjUsCisweDIwLCAweDA1LAorCisweDI4LCAweDMyLCAweDgwLCAweEFELAorMHg0MCwgMHgyQSwgMHg0MCwgMHhCRCwKKworMHgxQywgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MjAsIDB4MzMsIDB4MjAsIDB4QUQsCisKKzB4MjAsIDB4NzMsCisweDAwLCAweEUwLAorMHhCNiwgMHg0OSwgMHg1MSwgMHhCQiwKKworMHgyNiwgMHgyRiwgMHhCMCwgMHhFOCwKKzB4MTksIDB4MjAsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MjAsIDB4MzUsIDB4REYsCisweDNELCAweDIwLCAweDNELCAweERGLAorCisweDE1LCAweDIwLCAweDE1LCAweERGLAorMHgxRCwgMHgyMCwgMHgxRCwgMHhERiwKKworMHgyNiwgMHhEMCwgMHgyNiwgMHhDRCwKKzB4MjksIDB4NDksIDB4MkEsIDB4QjgsCisKKzB4MjYsIDB4NDAsIDB4ODAsIDB4QkQsCisweDNCLCAweDQ4LCAweDUwLCAweEJELAorCisweDNFLCAweDU0LCAweDU3LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4ODIsIDB4RTEsCisKKzB4MUUsIDB4QUYsIDB4NTksIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI2LCAweDMwLAorMHgyOSwgMHgzMCwKKzB4NDgsIDB4M0MsIDB4NDgsIDB4QUQsCisKKzB4MkIsIDB4NzIsCisweEMyLCAweEUxLAorMHgyQywgMHhDMCwgMHg0NCwgMHhDMiwKKworMHgwNSwgMHgyNCwgMHgzNCwgMHhCRiwKKzB4MEQsIDB4MjQsIDB4MkMsIDB4QkYsCisKKzB4MkQsIDB4NDYsIDB4NEUsIDB4QkYsCisweDI1LCAweDQ2LCAweDU2LCAweEJGLAorCisweDIwLCAweDFELCAweDZGLCAweDhGLAorMHgzMiwgMHgzRSwgMHg1RiwgMHhFOSwKKworMHgzRSwgMHg1MCwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDMwLAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgzMywgMHgxRSwgMHg1RiwgMHhFOSwKKworMHgwNSwgMHg0NCwgMHg1NCwgMHhCMiwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjIsCisKKzB4MTksIDB4QzAsIDB4QjAsIDB4RTgsCisweDM0LCAweEMwLCAweDQ0LCAweEM0LAorCisweDMzLCAweDczLAorMHgwMCwgMHhFMCwKKzB4M0UsIDB4NjIsIDB4NTcsIDB4OUYsCisKKzB4MUUsIDB4QUYsIDB4NTksIDB4OUYsCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKworMHg4NCwgMHgzRSwgMHg1OCwgMHhFOSwKKzB4MjgsIDB4MUQsIDB4NkYsIDB4OEYsCisKKzB4MDUsIDB4MjAsCisweDAwLCAweEUwLAorMHg4NSwgMHgxRSwgMHg1OCwgMHhFOSwKKworMHg5QiwgMHgzQiwgMHgzMywgMHhERiwKKzB4MjAsIDB4MjAsIDB4NDIsIDB4QUYsCisKKzB4MzAsIDB4NDIsIDB4NTYsIDB4OUYsCisweDgwLCAweDNFLCAweDU3LCAweEU5LAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzMCwgMHg4MCwgMHg1RiwgMHhFOSwKKworMHgyOCwgMHgyOCwgMHgyNCwgMHhBRiwKKzB4ODEsIDB4MUUsIDB4NTcsIDB4RTksCisKKzB4MDUsIDB4NDcsIDB4NTcsIDB4QkYsCisweDBELCAweDQ3LCAweDRGLCAweEJGLAorCisweDg4LCAweDgwLCAweDU4LCAweEU5LAorMHgxQiwgMHgyOSwgMHgxQiwgMHhERiwKKworMHgzMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4M0EsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MUMsIDB4MzAsIDB4MjYsIDB4REYsCisweDA5LCAweEUzLAorMHgzQiwgMHgwNSwKKworMHgzRSwgMHg1MCwgMHg1NiwgMHg5RiwKKzB4M0IsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDAwLCAweEUwLAorMHhBQywgMHgyMCwKKworMHgyRCwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MkMsIDB4MUMsIDB4QzAsIDB4QUYsCisKKzB4MjUsIDB4NDQsIDB4NTQsIDB4QjQsCisweDAwLCAweEUwLAorMHhDOCwgMHgzMCwKKworMHgzMCwgMHg0NiwgMHgzMCwgMHhBRiwKKzB4MUIsIDB4MUIsIDB4NDgsIDB4QUYsCisKKzB4MDAsIDB4RTAsCisweDI1LCAweDIwLAorMHgzOCwgMHgyQywgMHg0RiwgMHhFOSwKKworMHg4NiwgMHg4MCwgMHg1NywgMHhFOSwKKzB4MzgsIDB4MUQsIDB4NkYsIDB4OEYsCisKKzB4MjgsIDB4NzQsCisweDAwLCAweEUwLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMCwKKworMHgwNSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MkQsIDB4MjAsCisweDlCLCAweDEwLAorCisweDgyLCAweDNFLCAweDU3LCAweEU5LAorMHgzMiwgMHhGMCwgMHgxQiwgMHhDRCwKKworMHgxRSwgMHhCRCwgMHg1OSwgMHg5RiwKKzB4ODMsIDB4MUUsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4NDcsIDB4MzgsIDB4QUYsCisweDM0LCAweDIwLAorMHgyQSwgMHgzMCwKKworMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisweDMyLCAweDIwLAorMHgwNSwgMHgyMCwKKworMHg4NywgMHg4MCwgMHg1NywgMHhFOSwKKzB4MUYsIDB4NTQsIDB4NTcsIDB4OUYsCisKKzB4MTcsIDB4NDIsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHg2QSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzcsIDB4MUUsIDB4NEYsIDB4RTksCisKKzB4MzcsIDB4MzIsIDB4MkEsIDB4QUYsCisweDAwLCAweEUwLAorMHgzMiwgMHgwMCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjcsIDB4QzAsIDB4NDQsIDB4QzAsCisKKzB4MzYsIDB4MUYsIDB4NEYsIDB4RTksCisweDFGLCAweDFGLCAweDI2LCAweERGLAorCisweDM3LCAweDFCLCAweDM3LCAweEJGLAorMHgxNywgMHgyNiwgMHgxNywgMHhERiwKKworMHgzRSwgMHgxNywgMHg0RiwgMHhFOSwKKzB4M0YsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MzQsIDB4MUYsIDB4MzQsIDB4QUYsCisweDJCLCAweDA1LAorMHhBNywgMHgyMCwKKworMHgzMywgMHgyQiwgMHgzNywgMHhERiwKKzB4MjcsIDB4MTcsIDB4QzAsIDB4QUYsCisKKzB4MzQsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAzLCAweDgwLCAweDBBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjMsIDB4NjgsCisweDk3LCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHgzMywgMHhBRiwKKzB4M0MsIDB4MjcsIDB4NEYsIDB4RTksCisKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisweDI4LCAweDE5LCAweDYwLCAweEVDLAorCisweDJCLCAweDMyLCAweDIwLCAweEU5LAorMHgxRCwgMHgzQiwgMHgyMCwgMHhFOSwKKworMHhCMywgMHgwNSwKKzB4MDAsIDB4RTAsCisweDE2LCAweDI4LCAweDIwLCAweEU5LAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgxRSwgMHgyQiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHg4MCwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4ODUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDg0LCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDgyLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDdGLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3phW10gPSB7CisKKzB4MDAsIDB4OTgsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4ODEsIDB4MDQsCisweDg5LCAweDA0LAorMHgwMSwgMHgwNCwKKzB4MDksIDB4MDQsCisKKzB4QzksIDB4NDEsIDB4QzAsIDB4RUMsCisweDExLCAweDA0LAorMHgwMCwgMHhFMCwKKworMHg0MSwgMHhDQywgMHg0MSwgMHhDRCwKKzB4NDksIDB4Q0MsIDB4NDksIDB4Q0QsCisKKzB4RDEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDUxLCAweENDLCAweDUxLCAweENELAorCisweDgwLCAweDA0LAorMHgxMCwgMHgwNCwKKzB4MDgsIDB4MDQsCisweDAwLCAweEUwLAorCisweDAwLCAweENDLCAweEMwLCAweENELAorMHhEMSwgMHg0OSwgMHhDMCwgMHhFQywKKworMHg4QSwgMHgxRiwgMHgyMCwgMHhFOSwKKzB4OEIsIDB4M0YsIDB4MjAsIDB4RTksCisKKzB4NDEsIDB4M0MsIDB4NDEsIDB4QUQsCisweDQ5LCAweDNDLCAweDQ5LCAweEFELAorCisweDEwLCAweENDLCAweDEwLCAweENELAorMHgwOCwgMHhDQywgMHgwOCwgMHhDRCwKKworMHhCOSwgMHg0MSwgMHg0OSwgMHhCQiwKKzB4MUYsIDB4RjAsIDB4NDEsIDB4Q0QsCisKKzB4NTEsIDB4M0MsIDB4NTEsIDB4QUQsCisweDAwLCAweDk4LCAweDgwLCAweEU5LAorCisweDdELCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHgxRiwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MUQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MkUsIDB4NDEsIDB4MkEsIDB4QjgsCisweDM0LCAweDUzLCAweEEwLCAweEU4LAorCisweDE1LCAweDMwLAorMHgxRCwgMHgzMCwKKzB4NTgsIDB4RTMsCisweDAwLCAweEUwLAorCisweEI1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgyNCwgMHg0MywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4NzIsCisweDA5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4NzIsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4OTcsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZDLCAweDY0LCAweEM4LCAweEVDLAorMHg5OCwgMHhFMSwKKzB4QjUsIDB4MDUsCisKKzB4QkQsIDB4MDUsCisweDJFLCAweDMwLAorMHgzMiwgMHhDMCwgMHhBMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHhBMCwgMHhFOCwKKzB4NzQsIDB4NjQsIDB4QzgsIDB4RUMsCisKKzB4NDAsIDB4M0MsIDB4NDAsIDB4QUQsCisweDMyLCAweDZBLAorMHgyQSwgMHgzMCwKKworMHgyMCwgMHg3MywKKzB4MzMsIDB4NkEsCisweDAwLCAweEUwLAorMHgyOCwgMHg3MywKKworMHgxQywgMHg3MiwKKzB4ODMsIDB4RTIsCisweDZCLCAweDgwLCAweDE1LCAweEVBLAorCisweEI4LCAweDNELCAweDI4LCAweERGLAorMHgzMCwgMHgzNSwgMHgyMCwgMHhERiwKKworMHg0MCwgMHgzMCwKKzB4MDAsIDB4RTAsCisweENDLCAweEUyLAorMHg2NCwgMHg3MiwKKworMHgyNSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MkQsIDB4NDIsIDB4NEEsIDB4QkYsCisKKzB4MzAsIDB4MkUsIDB4MzAsIDB4REYsCisweDM4LCAweDJFLCAweDM4LCAweERGLAorCisweDE4LCAweDFELCAweDQ1LCAweEU5LAorMHgxRSwgMHgxNSwgMHg0NSwgMHhFOSwKKworMHgyQiwgMHg0OSwgMHg1MSwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDczLAorCisweDM4LCAweDM4LCAweDQwLCAweEFGLAorMHgzMCwgMHgzMCwgMHg0MCwgMHhBRiwKKworMHgyNCwgMHgxRiwgMHgyNCwgMHhERiwKKzB4MUQsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MkMsIDB4MUYsIDB4MkMsIDB4REYsCisweDFBLCAweDMzLCAweDIwLCAweEU5LAorCisweEIwLCAweDEwLAorMHgwOCwgMHhFMywKKzB4NDAsIDB4MTAsCisweEI4LCAweDEwLAorCisweDI2LCAweEYwLCAweDMwLCAweENELAorMHgyRiwgMHhGMCwgMHgzOCwgMHhDRCwKKworMHgyQiwgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MkEsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4QTYsIDB4MjAsCisweDg4LCAweEUyLAorMHgwMCwgMHhFMCwKKzB4QUYsIDB4MjAsCisKKzB4MjgsIDB4MkEsIDB4MjYsIDB4QUYsCisweDIwLCAweDJBLCAweEMwLCAweEFGLAorCisweDM0LCAweDFGLCAweDM0LCAweERGLAorMHg0NiwgMHgyNCwgMHg0NiwgMHhERiwKKworMHgyOCwgMHgzMCwgMHg4MCwgMHhCRiwKKzB4MjAsIDB4MzgsIDB4ODAsIDB4QkYsCisKKzB4NDcsIDB4MjQsIDB4NDcsIDB4REYsCisweDRFLCAweDJDLCAweDRFLCAweERGLAorCisweDRGLCAweDJDLCAweDRGLCAweERGLAorMHg1NiwgMHgzNCwgMHg1NiwgMHhERiwKKworMHgyOCwgMHgxNSwgMHgyOCwgMHhERiwKKzB4MjAsIDB4MUQsIDB4MjAsIDB4REYsCisKKzB4NTcsIDB4MzQsIDB4NTcsIDB4REYsCisweDAwLCAweEUwLAorMHgxRCwgMHgwNSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4ODksIDB4RTIsCisweDJCLCAweDMwLAorCisweDNGLCAweEMxLCAweDFELCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTAsIDB4NjgsCisweEJGLCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMCwgMHhDMCwgMHgyMCwgMHhBRiwKKzB4MjgsIDB4MDUsCisweDk3LCAweDc0LAorCisweDAwLCAweEUwLAorMHgyQSwgMHgxMCwKKzB4MTYsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDhDLCAweEUyLAorMHg5NSwgMHgwNSwKKworMHgyOCwgMHhDMSwgMHgyOCwgMHhBRCwKKzB4MUYsIDB4QzEsIDB4MTUsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEE4LCAweDY3LAorMHg5RiwgMHg2QiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjgsIDB4QzAsIDB4MjgsIDB4QUQsCisweDFELCAweDI1LAorMHgyMCwgMHgwNSwKKworMHgyOCwgMHgzMiwgMHg4MCwgMHhBRCwKKzB4NDAsIDB4MkEsIDB4NDAsIDB4QkQsCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDIwLCAweDMzLCAweDIwLCAweEFELAorCisweDIwLCAweDczLAorMHgwMCwgMHhFMCwKKzB4QjYsIDB4NDksIDB4NTEsIDB4QkIsCisKKzB4MjYsIDB4MkYsIDB4QjAsIDB4RTgsCisweDE5LCAweDIwLCAweDIwLCAweEU5LAorCisweDM1LCAweDIwLCAweDM1LCAweERGLAorMHgzRCwgMHgyMCwgMHgzRCwgMHhERiwKKworMHgxNSwgMHgyMCwgMHgxNSwgMHhERiwKKzB4MUQsIDB4MjAsIDB4MUQsIDB4REYsCisKKzB4MjYsIDB4RDAsIDB4MjYsIDB4Q0QsCisweDI5LCAweDQ5LCAweDJBLCAweEI4LAorCisweDI2LCAweDQwLCAweDgwLCAweEJELAorMHgzQiwgMHg0OCwgMHg1MCwgMHhCRCwKKworMHgzRSwgMHg1NCwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDgyLCAweEUxLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNiwgMHgzMCwKKzB4MjksIDB4MzAsCisweDQ4LCAweDNDLCAweDQ4LCAweEFELAorCisweDJCLCAweDcyLAorMHhDMiwgMHhFMSwKKzB4MkMsIDB4QzAsIDB4NDQsIDB4QzIsCisKKzB4MDUsIDB4MjQsIDB4MzQsIDB4QkYsCisweDBELCAweDI0LCAweDJDLCAweEJGLAorCisweDJELCAweDQ2LCAweDRFLCAweEJGLAorMHgyNSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgyMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4MzIsIDB4M0UsIDB4NUYsIDB4RTksCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHgzMCwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzMsIDB4MUUsIDB4NUYsIDB4RTksCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjIsCisweDBELCAweDQ0LCAweDRDLCAweEIyLAorCisweDE5LCAweEMwLCAweEIwLCAweEU4LAorMHgzNCwgMHhDMCwgMHg0NCwgMHhDNCwKKworMHgzMywgMHg3MywKKzB4MDAsIDB4RTAsCisweDNFLCAweDYyLCAweDU3LCAweDlGLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisKKzB4ODQsIDB4M0UsIDB4NTgsIDB4RTksCisweDI4LCAweDFELCAweDZGLCAweDhGLAorCisweDA1LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4ODUsIDB4MUUsIDB4NTgsIDB4RTksCisKKzB4OUIsIDB4M0IsIDB4MzMsIDB4REYsCisweDIwLCAweDIwLCAweDQyLCAweEFGLAorCisweDMwLCAweDQyLCAweDU2LCAweDlGLAorMHg4MCwgMHgzRSwgMHg1NywgMHhFOSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzAsIDB4ODAsIDB4NUYsIDB4RTksCisKKzB4MjgsIDB4MjgsIDB4MjQsIDB4QUYsCisweDgxLCAweDFFLCAweDU3LCAweEU5LAorCisweDA1LCAweDQ3LCAweDU3LCAweEJGLAorMHgwRCwgMHg0NywgMHg0RiwgMHhCRiwKKworMHg4OCwgMHg4MCwgMHg1OCwgMHhFOSwKKzB4MUIsIDB4MjksIDB4MUIsIDB4REYsCisKKzB4MzAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDNBLCAweDMwLCAweDRGLCAweEU5LAorCisweDFDLCAweDMwLCAweDI2LCAweERGLAorMHgwOSwgMHhFMywKKzB4M0IsIDB4MDUsCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDNCLCAweDNGLCAweDRGLCAweEU5LAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4QUMsIDB4MjAsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjQsCisweDJDLCAweDFDLCAweEMwLCAweEFGLAorCisweDI1LCAweDQ0LCAweDU0LCAweEI0LAorMHgwMCwgMHhFMCwKKzB4QzgsIDB4MzAsCisKKzB4MzAsIDB4NDYsIDB4MzAsIDB4QUYsCisweDFCLCAweDFCLCAweDQ4LCAweEFGLAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MzgsIDB4MkMsIDB4NEYsIDB4RTksCisKKzB4ODYsIDB4ODAsIDB4NTcsIDB4RTksCisweDM4LCAweDFELCAweDZGLCAweDhGLAorCisweDI4LCAweDc0LAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjAsCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjAsCisweDJELCAweDIwLAorMHg5QiwgMHgxMCwKKworMHg4MiwgMHgzRSwgMHg1NywgMHhFOSwKKzB4MzIsIDB4RjAsIDB4MUIsIDB4Q0QsCisKKzB4MUUsIDB4QkQsIDB4NTksIDB4OUYsCisweDgzLCAweDFFLCAweDU3LCAweEU5LAorCisweDM4LCAweDQ3LCAweDM4LCAweEFGLAorMHgzNCwgMHgyMCwKKzB4MkEsIDB4MzAsCisKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorMHgzMiwgMHgyMCwKKzB4MDUsIDB4MjAsCisKKzB4ODcsIDB4ODAsIDB4NTcsIDB4RTksCisweDFGLCAweDU0LCAweDU3LCAweDlGLAorCisweDE3LCAweDQyLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4NkEsCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDM3LCAweDFFLCAweDRGLCAweEU5LAorCisweDM3LCAweDMyLCAweDJBLCAweEFGLAorMHgwMCwgMHhFMCwKKzB4MzIsIDB4MDAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI3LCAweEMwLCAweDQ0LCAweEMwLAorCisweDM2LCAweDFGLCAweDRGLCAweEU5LAorMHgxRiwgMHgxRiwgMHgyNiwgMHhERiwKKworMHgzNywgMHgxQiwgMHgzNywgMHhCRiwKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisKKzB4M0UsIDB4MTcsIDB4NEYsIDB4RTksCisweDNGLCAweDNGLCAweDRGLCAweEU5LAorCisweDM0LCAweDFGLCAweDM0LCAweEFGLAorMHgyQiwgMHgwNSwKKzB4QTcsIDB4MjAsCisKKzB4MzMsIDB4MkIsIDB4MzcsIDB4REYsCisweDI3LCAweDE3LCAweEMwLCAweEFGLAorCisweDM0LCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyRCwgMHg0NCwgMHg0QywgMHhCNiwKKzB4MjUsIDB4NDQsIDB4NTQsIDB4QjYsCisKKzB4MDMsIDB4ODAsIDB4MkEsIDB4RUEsCisweDE3LCAweEMxLCAweDJCLCAweEJELAorCisweDJELCAweDIwLAorMHgyNSwgMHgyMCwKKzB4MDcsIDB4QzAsIDB4NDQsIDB4QzYsCisKKzB4QjMsIDB4NjgsCisweDk3LCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHgzMywgMHhBRiwKKzB4M0MsIDB4MjcsIDB4NEYsIDB4RTksCisKKzB4MUYsIDB4NjIsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDNGLCAweDNELCAweDVELCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MDcsIDB4MjAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI4LCAweDE5LCAweDYwLCAweEVDLAorCisweEIzLCAweDA1LAorMHgwMCwgMHhFMCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjMsIDB4M0IsIDB4MzMsIDB4QUQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweDI2LCAweDFGLCAweERGLAorMHg5RCwgMHgxRiwgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDlFLCAweDNGLCAweDRGLCAweEU5LAorCisweDA3LCAweDA3LCAweDFGLCAweEFGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4OUMsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg1NywgMHgzOSwgMHgyMCwgMHhFOSwKKworMHgxNiwgMHgyOCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4M0IsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MkIsIDB4MjAsIDB4RTksCisweDJCLCAweDMyLCAweDIwLCAweEU5LAorCisweDFDLCAweDIzLCAweDIwLCAweEU5LAorMHg1NywgMHgzNiwgMHgyMCwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDkwLCAweEUyLAorMHgwMCwgMHhFMCwKKworMHg3QSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MTksIDB4QzgsIDB4QzEsIDB4Q0QsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDlGLCAweDQxLCAweDQ5LCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MkQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MEQsIDB4ODAsIDB4MDcsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDM1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjUsIDB4MzAsCisweDJELCAweDMwLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweEE3LCAweDVCLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NzksIDB4RkYsIDB4MEEsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM5LCAweDQxLCAweEM4LCAweEVDLAorMHg0MiwgMHhFMSwKKzB4MDAsIDB4RTAsCisKKzB4NzcsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOCwgMHg0MCwgMHhDMCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NzQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nMjAwX3RnemFmW10gPSB7CisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDk4LCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDgxLCAweDA0LAorMHg4OSwgMHgwNCwKKzB4MDEsIDB4MDQsCisweDA5LCAweDA0LAorCisweEM5LCAweDQxLCAweEMwLCAweEVDLAorMHgxMSwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4NDEsIDB4Q0MsIDB4NDEsIDB4Q0QsCisweDQ5LCAweENDLCAweDQ5LCAweENELAorCisweEQxLCAweDQxLCAweEMwLCAweEVDLAorMHg1MSwgMHhDQywgMHg1MSwgMHhDRCwKKworMHg4MCwgMHgwNCwKKzB4MTAsIDB4MDQsCisweDA4LCAweDA0LAorMHgwMCwgMHhFMCwKKworMHgwMCwgMHhDQywgMHhDMCwgMHhDRCwKKzB4RDEsIDB4NDksIDB4QzAsIDB4RUMsCisKKzB4OEEsIDB4MUYsIDB4MjAsIDB4RTksCisweDhCLCAweDNGLCAweDIwLCAweEU5LAorCisweDQxLCAweDNDLCAweDQxLCAweEFELAorMHg0OSwgMHgzQywgMHg0OSwgMHhBRCwKKworMHgxMCwgMHhDQywgMHgxMCwgMHhDRCwKKzB4MDgsIDB4Q0MsIDB4MDgsIDB4Q0QsCisKKzB4QjksIDB4NDEsIDB4NDksIDB4QkIsCisweDFGLCAweEYwLCAweDQxLCAweENELAorCisweDUxLCAweDNDLCAweDUxLCAweEFELAorMHgwMCwgMHg5OCwgMHg4MCwgMHhFOSwKKworMHg4MywgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4MUYsIDB4MjAsIDB4RTksCisKKzB4MjEsIDB4NDUsIDB4ODAsIDB4RTgsCisweDFBLCAweDRELCAweDgwLCAweEU4LAorCisweDMxLCAweDU1LCAweDgwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MUQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MkUsIDB4NDEsIDB4MkEsIDB4QjgsCisweDM0LCAweDUzLCAweEEwLCAweEU4LAorCisweDE1LCAweDMwLAorMHgxRCwgMHgzMCwKKzB4NTgsIDB4RTMsCisweDAwLCAweEUwLAorCisweEI1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgyNCwgMHg0MywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4NzIsCisweDA5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4NzIsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4OTcsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZDLCAweDY0LCAweEM4LCAweEVDLAorMHg5OCwgMHhFMSwKKzB4QjUsIDB4MDUsCisKKzB4QkQsIDB4MDUsCisweDJFLCAweDMwLAorMHgzMiwgMHhDMCwgMHhBMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHhBMCwgMHhFOCwKKzB4NzQsIDB4NjQsIDB4QzgsIDB4RUMsCisKKzB4NDAsIDB4M0MsIDB4NDAsIDB4QUQsCisweDMyLCAweDZBLAorMHgyQSwgMHgzMCwKKworMHgyMCwgMHg3MywKKzB4MzMsIDB4NkEsCisweDAwLCAweEUwLAorMHgyOCwgMHg3MywKKworMHgxQywgMHg3MiwKKzB4ODMsIDB4RTIsCisweDZGLCAweDgwLCAweDE1LCAweEVBLAorCisweEI4LCAweDNELCAweDI4LCAweERGLAorMHgzMCwgMHgzNSwgMHgyMCwgMHhERiwKKworMHg0MCwgMHgzMCwKKzB4MDAsIDB4RTAsCisweENDLCAweEUyLAorMHg2NCwgMHg3MiwKKworMHgyNSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MkQsIDB4NDIsIDB4NEEsIDB4QkYsCisKKzB4MzAsIDB4MkUsIDB4MzAsIDB4REYsCisweDM4LCAweDJFLCAweDM4LCAweERGLAorCisweDE4LCAweDFELCAweDQ1LCAweEU5LAorMHgxRSwgMHgxNSwgMHg0NSwgMHhFOSwKKworMHgyQiwgMHg0OSwgMHg1MSwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDczLAorCisweDM4LCAweDM4LCAweDQwLCAweEFGLAorMHgzMCwgMHgzMCwgMHg0MCwgMHhBRiwKKworMHgyNCwgMHgxRiwgMHgyNCwgMHhERiwKKzB4MUQsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MkMsIDB4MUYsIDB4MkMsIDB4REYsCisweDFBLCAweDMzLCAweDIwLCAweEU5LAorCisweEIwLCAweDEwLAorMHgwOCwgMHhFMywKKzB4NDAsIDB4MTAsCisweEI4LCAweDEwLAorCisweDI2LCAweEYwLCAweDMwLCAweENELAorMHgyRiwgMHhGMCwgMHgzOCwgMHhDRCwKKworMHgyQiwgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MkEsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4QTYsIDB4MjAsCisweDg4LCAweEUyLAorMHgwMCwgMHhFMCwKKzB4QUYsIDB4MjAsCisKKzB4MjgsIDB4MkEsIDB4MjYsIDB4QUYsCisweDIwLCAweDJBLCAweEMwLCAweEFGLAorCisweDM0LCAweDFGLCAweDM0LCAweERGLAorMHg0NiwgMHgyNCwgMHg0NiwgMHhERiwKKworMHgyOCwgMHgzMCwgMHg4MCwgMHhCRiwKKzB4MjAsIDB4MzgsIDB4ODAsIDB4QkYsCisKKzB4NDcsIDB4MjQsIDB4NDcsIDB4REYsCisweDRFLCAweDJDLCAweDRFLCAweERGLAorCisweDRGLCAweDJDLCAweDRGLCAweERGLAorMHg1NiwgMHgzNCwgMHg1NiwgMHhERiwKKworMHgyOCwgMHgxNSwgMHgyOCwgMHhERiwKKzB4MjAsIDB4MUQsIDB4MjAsIDB4REYsCisKKzB4NTcsIDB4MzQsIDB4NTcsIDB4REYsCisweDAwLCAweEUwLAorMHgxRCwgMHgwNSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4ODksIDB4RTIsCisweDJCLCAweDMwLAorCisweDNGLCAweEMxLCAweDFELCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTAsIDB4NjgsCisweEJGLCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMCwgMHhDMCwgMHgyMCwgMHhBRiwKKzB4MjgsIDB4MDUsCisweDk3LCAweDc0LAorCisweDAwLCAweEUwLAorMHgyQSwgMHgxMCwKKzB4MTYsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDhDLCAweEUyLAorMHg5NSwgMHgwNSwKKworMHgyOCwgMHhDMSwgMHgyOCwgMHhBRCwKKzB4MUYsIDB4QzEsIDB4MTUsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEE4LCAweDY3LAorMHg5RiwgMHg2QiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjgsIDB4QzAsIDB4MjgsIDB4QUQsCisweDFELCAweDI1LAorMHgyMCwgMHgwNSwKKworMHgyOCwgMHgzMiwgMHg4MCwgMHhBRCwKKzB4NDAsIDB4MkEsIDB4NDAsIDB4QkQsCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDIwLCAweDMzLCAweDIwLCAweEFELAorCisweDIwLCAweDczLAorMHgwMCwgMHhFMCwKKzB4QjYsIDB4NDksIDB4NTEsIDB4QkIsCisKKzB4MjYsIDB4MkYsIDB4QjAsIDB4RTgsCisweDE5LCAweDIwLCAweDIwLCAweEU5LAorCisweDM1LCAweDIwLCAweDM1LCAweERGLAorMHgzRCwgMHgyMCwgMHgzRCwgMHhERiwKKworMHgxNSwgMHgyMCwgMHgxNSwgMHhERiwKKzB4MUQsIDB4MjAsIDB4MUQsIDB4REYsCisKKzB4MjYsIDB4RDAsIDB4MjYsIDB4Q0QsCisweDI5LCAweDQ5LCAweDJBLCAweEI4LAorCisweDI2LCAweDQwLCAweDgwLCAweEJELAorMHgzQiwgMHg0OCwgMHg1MCwgMHhCRCwKKworMHgzRSwgMHg1NCwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDgyLCAweEUxLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNiwgMHgzMCwKKzB4MjksIDB4MzAsCisweDQ4LCAweDNDLCAweDQ4LCAweEFELAorCisweDJCLCAweDcyLAorMHhDMiwgMHhFMSwKKzB4MkMsIDB4QzAsIDB4NDQsIDB4QzIsCisKKzB4MDUsIDB4MjQsIDB4MzQsIDB4QkYsCisweDBELCAweDI0LCAweDJDLCAweEJGLAorCisweDJELCAweDQ2LCAweDRFLCAweEJGLAorMHgyNSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgyMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4MzIsIDB4M0UsIDB4NUYsIDB4RTksCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHgzMCwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzMsIDB4MUUsIDB4NUYsIDB4RTksCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjIsCisweDBELCAweDQ0LCAweDRDLCAweEIyLAorCisweDE5LCAweEMwLCAweEIwLCAweEU4LAorMHgzNCwgMHhDMCwgMHg0NCwgMHhDNCwKKworMHgzMywgMHg3MywKKzB4MDAsIDB4RTAsCisweDNFLCAweDYyLCAweDU3LCAweDlGLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisKKzB4ODQsIDB4M0UsIDB4NTgsIDB4RTksCisweDI4LCAweDFELCAweDZGLCAweDhGLAorCisweDA1LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4ODUsIDB4MUUsIDB4NTgsIDB4RTksCisKKzB4OUIsIDB4M0IsIDB4MzMsIDB4REYsCisweDIwLCAweDIwLCAweDQyLCAweEFGLAorCisweDMwLCAweDQyLCAweDU2LCAweDlGLAorMHg4MCwgMHgzRSwgMHg1NywgMHhFOSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzAsIDB4ODAsIDB4NUYsIDB4RTksCisKKzB4MjgsIDB4MjgsIDB4MjQsIDB4QUYsCisweDgxLCAweDFFLCAweDU3LCAweEU5LAorCisweDA1LCAweDQ3LCAweDU3LCAweEJGLAorMHgwRCwgMHg0NywgMHg0RiwgMHhCRiwKKworMHg4OCwgMHg4MCwgMHg1OCwgMHhFOSwKKzB4MUIsIDB4MjksIDB4MUIsIDB4REYsCisKKzB4MzAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDNBLCAweDMwLCAweDRGLCAweEU5LAorCisweDFDLCAweDMwLCAweDI2LCAweERGLAorMHgwOSwgMHhFMywKKzB4M0IsIDB4MDUsCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDNCLCAweDNGLCAweDRGLCAweEU5LAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4QUMsIDB4MjAsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjQsCisweDJDLCAweDFDLCAweEMwLCAweEFGLAorCisweDI1LCAweDQ0LCAweDU0LCAweEI0LAorMHgwMCwgMHhFMCwKKzB4QzgsIDB4MzAsCisKKzB4MzAsIDB4NDYsIDB4MzAsIDB4QUYsCisweDFCLCAweDFCLCAweDQ4LCAweEFGLAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MzgsIDB4MkMsIDB4NEYsIDB4RTksCisKKzB4ODYsIDB4ODAsIDB4NTcsIDB4RTksCisweDM4LCAweDFELCAweDZGLCAweDhGLAorCisweDI4LCAweDc0LAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjAsCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjAsCisweDJELCAweDIwLAorMHg5QiwgMHgxMCwKKworMHg4MiwgMHgzRSwgMHg1NywgMHhFOSwKKzB4MzIsIDB4RjAsIDB4MUIsIDB4Q0QsCisKKzB4MUUsIDB4QkQsIDB4NTksIDB4OUYsCisweDgzLCAweDFFLCAweDU3LCAweEU5LAorCisweDM4LCAweDQ3LCAweDM4LCAweEFGLAorMHgzNCwgMHgyMCwKKzB4MkEsIDB4MzAsCisKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorMHgzMiwgMHgyMCwKKzB4MDUsIDB4MjAsCisKKzB4ODcsIDB4ODAsIDB4NTcsIDB4RTksCisweDFGLCAweDU0LCAweDU3LCAweDlGLAorCisweDE3LCAweDQyLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4NkEsCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDM3LCAweDFFLCAweDRGLCAweEU5LAorCisweDM3LCAweDMyLCAweDJBLCAweEFGLAorMHgwMCwgMHhFMCwKKzB4MzIsIDB4MDAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI3LCAweEMwLCAweDQ0LCAweEMwLAorCisweDM2LCAweDFGLCAweDRGLCAweEU5LAorMHgxRiwgMHgxRiwgMHgyNiwgMHhERiwKKworMHgzNywgMHgxQiwgMHgzNywgMHhCRiwKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisKKzB4M0UsIDB4MTcsIDB4NEYsIDB4RTksCisweDNGLCAweDNGLCAweDRGLCAweEU5LAorCisweDM0LCAweDFGLCAweDM0LCAweEFGLAorMHgyQiwgMHgwNSwKKzB4QTcsIDB4MjAsCisKKzB4MzMsIDB4MkIsIDB4MzcsIDB4REYsCisweDI3LCAweDE3LCAweEMwLCAweEFGLAorCisweDM0LCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwRCwgMHgyMSwgMHgxQSwgMHhCNiwKKzB4MDUsIDB4MjEsIDB4MzEsIDB4QjYsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjYsCisweDI1LCAweDQ0LCAweDU0LCAweEI2LAorCisweDAzLCAweDgwLCAweDJBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgwRCwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDJGLCAweEMwLCAweDIxLCAweEM2LAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MDcsIDB4QzAsIDB4NDQsIDB4QzYsCisKKzB4MTcsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgyRCwgMHgyMCwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDJGLCAweDIwLAorCisweDFGLCAweDYyLCAweDU3LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MDcsIDB4MjAsCisKKzB4M0YsIDB4M0QsIDB4NUQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHhCMywgMHgwNSwKKzB4MDAsIDB4RTAsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDIzLCAweDNCLCAweDMzLCAweEFELAorMHgzNSwgMHgxNywgMHg0RiwgMHhFOSwKKworMHgxRiwgMHgyNiwgMHgxRiwgMHhERiwKKzB4OUQsIDB4MUYsIDB4NEYsIDB4RTksCisKKzB4OUUsIDB4M0YsIDB4NEYsIDB4RTksCisweDM5LCAweDM3LCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDE3LCAweEFGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwNywgMHgwNywgMHgxRiwgMHhBRiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzEsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDlDLCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4NzQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDczLCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDcxLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZFLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3pmW10gPSB7CisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDk4LCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDgxLCAweDA0LAorMHg4OSwgMHgwNCwKKzB4MDEsIDB4MDQsCisweDA5LCAweDA0LAorCisweEM5LCAweDQxLCAweEMwLCAweEVDLAorMHgxMSwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4NDEsIDB4Q0MsIDB4NDEsIDB4Q0QsCisweDQ5LCAweENDLCAweDQ5LCAweENELAorCisweEQxLCAweDQxLCAweEMwLCAweEVDLAorMHg1MSwgMHhDQywgMHg1MSwgMHhDRCwKKworMHg4MCwgMHgwNCwKKzB4MTAsIDB4MDQsCisweDA4LCAweDA0LAorMHgwMCwgMHhFMCwKKworMHgwMCwgMHhDQywgMHhDMCwgMHhDRCwKKzB4RDEsIDB4NDksIDB4QzAsIDB4RUMsCisKKzB4OEEsIDB4MUYsIDB4MjAsIDB4RTksCisweDhCLCAweDNGLCAweDIwLCAweEU5LAorCisweDQxLCAweDNDLCAweDQxLCAweEFELAorMHg0OSwgMHgzQywgMHg0OSwgMHhBRCwKKworMHgxMCwgMHhDQywgMHgxMCwgMHhDRCwKKzB4MDgsIDB4Q0MsIDB4MDgsIDB4Q0QsCisKKzB4QjksIDB4NDEsIDB4NDksIDB4QkIsCisweDFGLCAweEYwLCAweDQxLCAweENELAorCisweDUxLCAweDNDLCAweDUxLCAweEFELAorMHgwMCwgMHg5OCwgMHg4MCwgMHhFOSwKKworMHg3RiwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4MUYsIDB4MjAsIDB4RTksCisKKzB4MjEsIDB4NDUsIDB4ODAsIDB4RTgsCisweDFBLCAweDRELCAweDgwLCAweEU4LAorCisweDMxLCAweDU1LCAweDgwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MUQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MkUsIDB4NDEsIDB4MkEsIDB4QjgsCisweDM0LCAweDUzLCAweEEwLCAweEU4LAorCisweDE1LCAweDMwLAorMHgxRCwgMHgzMCwKKzB4NTgsIDB4RTMsCisweDAwLCAweEUwLAorCisweEI1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgyNCwgMHg0MywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4NzIsCisweDA5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4NzIsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4OTcsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZDLCAweDY0LCAweEM4LCAweEVDLAorMHg5OCwgMHhFMSwKKzB4QjUsIDB4MDUsCisKKzB4QkQsIDB4MDUsCisweDJFLCAweDMwLAorMHgzMiwgMHhDMCwgMHhBMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHhBMCwgMHhFOCwKKzB4NzQsIDB4NjQsIDB4QzgsIDB4RUMsCisKKzB4NDAsIDB4M0MsIDB4NDAsIDB4QUQsCisweDMyLCAweDZBLAorMHgyQSwgMHgzMCwKKworMHgyMCwgMHg3MywKKzB4MzMsIDB4NkEsCisweDAwLCAweEUwLAorMHgyOCwgMHg3MywKKworMHgxQywgMHg3MiwKKzB4ODMsIDB4RTIsCisweDZCLCAweDgwLCAweDE1LCAweEVBLAorCisweEI4LCAweDNELCAweDI4LCAweERGLAorMHgzMCwgMHgzNSwgMHgyMCwgMHhERiwKKworMHg0MCwgMHgzMCwKKzB4MDAsIDB4RTAsCisweENDLCAweEUyLAorMHg2NCwgMHg3MiwKKworMHgyNSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MkQsIDB4NDIsIDB4NEEsIDB4QkYsCisKKzB4MzAsIDB4MkUsIDB4MzAsIDB4REYsCisweDM4LCAweDJFLCAweDM4LCAweERGLAorCisweDE4LCAweDFELCAweDQ1LCAweEU5LAorMHgxRSwgMHgxNSwgMHg0NSwgMHhFOSwKKworMHgyQiwgMHg0OSwgMHg1MSwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDczLAorCisweDM4LCAweDM4LCAweDQwLCAweEFGLAorMHgzMCwgMHgzMCwgMHg0MCwgMHhBRiwKKworMHgyNCwgMHgxRiwgMHgyNCwgMHhERiwKKzB4MUQsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MkMsIDB4MUYsIDB4MkMsIDB4REYsCisweDFBLCAweDMzLCAweDIwLCAweEU5LAorCisweEIwLCAweDEwLAorMHgwOCwgMHhFMywKKzB4NDAsIDB4MTAsCisweEI4LCAweDEwLAorCisweDI2LCAweEYwLCAweDMwLCAweENELAorMHgyRiwgMHhGMCwgMHgzOCwgMHhDRCwKKworMHgyQiwgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MkEsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4QTYsIDB4MjAsCisweDg4LCAweEUyLAorMHgwMCwgMHhFMCwKKzB4QUYsIDB4MjAsCisKKzB4MjgsIDB4MkEsIDB4MjYsIDB4QUYsCisweDIwLCAweDJBLCAweEMwLCAweEFGLAorCisweDM0LCAweDFGLCAweDM0LCAweERGLAorMHg0NiwgMHgyNCwgMHg0NiwgMHhERiwKKworMHgyOCwgMHgzMCwgMHg4MCwgMHhCRiwKKzB4MjAsIDB4MzgsIDB4ODAsIDB4QkYsCisKKzB4NDcsIDB4MjQsIDB4NDcsIDB4REYsCisweDRFLCAweDJDLCAweDRFLCAweERGLAorCisweDRGLCAweDJDLCAweDRGLCAweERGLAorMHg1NiwgMHgzNCwgMHg1NiwgMHhERiwKKworMHgyOCwgMHgxNSwgMHgyOCwgMHhERiwKKzB4MjAsIDB4MUQsIDB4MjAsIDB4REYsCisKKzB4NTcsIDB4MzQsIDB4NTcsIDB4REYsCisweDAwLCAweEUwLAorMHgxRCwgMHgwNSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4ODksIDB4RTIsCisweDJCLCAweDMwLAorCisweDNGLCAweEMxLCAweDFELCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTAsIDB4NjgsCisweEJGLCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMCwgMHhDMCwgMHgyMCwgMHhBRiwKKzB4MjgsIDB4MDUsCisweDk3LCAweDc0LAorCisweDAwLCAweEUwLAorMHgyQSwgMHgxMCwKKzB4MTYsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDhDLCAweEUyLAorMHg5NSwgMHgwNSwKKworMHgyOCwgMHhDMSwgMHgyOCwgMHhBRCwKKzB4MUYsIDB4QzEsIDB4MTUsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEE4LCAweDY3LAorMHg5RiwgMHg2QiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjgsIDB4QzAsIDB4MjgsIDB4QUQsCisweDFELCAweDI1LAorMHgyMCwgMHgwNSwKKworMHgyOCwgMHgzMiwgMHg4MCwgMHhBRCwKKzB4NDAsIDB4MkEsIDB4NDAsIDB4QkQsCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDIwLCAweDMzLCAweDIwLCAweEFELAorCisweDIwLCAweDczLAorMHgwMCwgMHhFMCwKKzB4QjYsIDB4NDksIDB4NTEsIDB4QkIsCisKKzB4MjYsIDB4MkYsIDB4QjAsIDB4RTgsCisweDE5LCAweDIwLCAweDIwLCAweEU5LAorCisweDM1LCAweDIwLCAweDM1LCAweERGLAorMHgzRCwgMHgyMCwgMHgzRCwgMHhERiwKKworMHgxNSwgMHgyMCwgMHgxNSwgMHhERiwKKzB4MUQsIDB4MjAsIDB4MUQsIDB4REYsCisKKzB4MjYsIDB4RDAsIDB4MjYsIDB4Q0QsCisweDI5LCAweDQ5LCAweDJBLCAweEI4LAorCisweDI2LCAweDQwLCAweDgwLCAweEJELAorMHgzQiwgMHg0OCwgMHg1MCwgMHhCRCwKKworMHgzRSwgMHg1NCwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDgyLCAweEUxLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNiwgMHgzMCwKKzB4MjksIDB4MzAsCisweDQ4LCAweDNDLCAweDQ4LCAweEFELAorCisweDJCLCAweDcyLAorMHhDMiwgMHhFMSwKKzB4MkMsIDB4QzAsIDB4NDQsIDB4QzIsCisKKzB4MDUsIDB4MjQsIDB4MzQsIDB4QkYsCisweDBELCAweDI0LCAweDJDLCAweEJGLAorCisweDJELCAweDQ2LCAweDRFLCAweEJGLAorMHgyNSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgyMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4MzIsIDB4M0UsIDB4NUYsIDB4RTksCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHgzMCwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzMsIDB4MUUsIDB4NUYsIDB4RTksCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjIsCisweDBELCAweDQ0LCAweDRDLCAweEIyLAorCisweDE5LCAweEMwLCAweEIwLCAweEU4LAorMHgzNCwgMHhDMCwgMHg0NCwgMHhDNCwKKworMHgzMywgMHg3MywKKzB4MDAsIDB4RTAsCisweDNFLCAweDYyLCAweDU3LCAweDlGLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisKKzB4ODQsIDB4M0UsIDB4NTgsIDB4RTksCisweDI4LCAweDFELCAweDZGLCAweDhGLAorCisweDA1LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4ODUsIDB4MUUsIDB4NTgsIDB4RTksCisKKzB4OUIsIDB4M0IsIDB4MzMsIDB4REYsCisweDIwLCAweDIwLCAweDQyLCAweEFGLAorCisweDMwLCAweDQyLCAweDU2LCAweDlGLAorMHg4MCwgMHgzRSwgMHg1NywgMHhFOSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzAsIDB4ODAsIDB4NUYsIDB4RTksCisKKzB4MjgsIDB4MjgsIDB4MjQsIDB4QUYsCisweDgxLCAweDFFLCAweDU3LCAweEU5LAorCisweDA1LCAweDQ3LCAweDU3LCAweEJGLAorMHgwRCwgMHg0NywgMHg0RiwgMHhCRiwKKworMHg4OCwgMHg4MCwgMHg1OCwgMHhFOSwKKzB4MUIsIDB4MjksIDB4MUIsIDB4REYsCisKKzB4MzAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDNBLCAweDMwLCAweDRGLCAweEU5LAorCisweDFDLCAweDMwLCAweDI2LCAweERGLAorMHgwOSwgMHhFMywKKzB4M0IsIDB4MDUsCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDNCLCAweDNGLCAweDRGLCAweEU5LAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4QUMsIDB4MjAsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjQsCisweDJDLCAweDFDLCAweEMwLCAweEFGLAorCisweDI1LCAweDQ0LCAweDU0LCAweEI0LAorMHgwMCwgMHhFMCwKKzB4QzgsIDB4MzAsCisKKzB4MzAsIDB4NDYsIDB4MzAsIDB4QUYsCisweDFCLCAweDFCLCAweDQ4LCAweEFGLAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MzgsIDB4MkMsIDB4NEYsIDB4RTksCisKKzB4ODYsIDB4ODAsIDB4NTcsIDB4RTksCisweDM4LCAweDFELCAweDZGLCAweDhGLAorCisweDI4LCAweDc0LAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjAsCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjAsCisweDJELCAweDIwLAorMHg5QiwgMHgxMCwKKworMHg4MiwgMHgzRSwgMHg1NywgMHhFOSwKKzB4MzIsIDB4RjAsIDB4MUIsIDB4Q0QsCisKKzB4MUUsIDB4QkQsIDB4NTksIDB4OUYsCisweDgzLCAweDFFLCAweDU3LCAweEU5LAorCisweDM4LCAweDQ3LCAweDM4LCAweEFGLAorMHgzNCwgMHgyMCwKKzB4MkEsIDB4MzAsCisKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorMHgzMiwgMHgyMCwKKzB4MDUsIDB4MjAsCisKKzB4ODcsIDB4ODAsIDB4NTcsIDB4RTksCisweDFGLCAweDU0LCAweDU3LCAweDlGLAorCisweDE3LCAweDQyLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4NkEsCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDM3LCAweDFFLCAweDRGLCAweEU5LAorCisweDM3LCAweDMyLCAweDJBLCAweEFGLAorMHgwMCwgMHhFMCwKKzB4MzIsIDB4MDAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI3LCAweEMwLCAweDQ0LCAweEMwLAorCisweDM2LCAweDFGLCAweDRGLCAweEU5LAorMHgxRiwgMHgxRiwgMHgyNiwgMHhERiwKKworMHgzNywgMHgxQiwgMHgzNywgMHhCRiwKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisKKzB4M0UsIDB4MTcsIDB4NEYsIDB4RTksCisweDNGLCAweDNGLCAweDRGLCAweEU5LAorCisweDM0LCAweDFGLCAweDM0LCAweEFGLAorMHgyQiwgMHgwNSwKKzB4QTcsIDB4MjAsCisKKzB4MzMsIDB4MkIsIDB4MzcsIDB4REYsCisweDI3LCAweDE3LCAweEMwLCAweEFGLAorCisweDM0LCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwRCwgMHgyMSwgMHgxQSwgMHhCNiwKKzB4MDUsIDB4MjEsIDB4MzEsIDB4QjYsCisKKzB4MDMsIDB4ODAsIDB4MkEsIDB4RUEsCisweDE3LCAweEMxLCAweDJCLCAweEJELAorCisweDBELCAweDIwLAorMHgwNSwgMHgyMCwKKzB4MkYsIDB4QzAsIDB4MjEsIDB4QzYsCisKKzB4QjMsIDB4NjgsCisweDk3LCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHgzMywgMHhBRiwKKzB4M0MsIDB4MjcsIDB4NEYsIDB4RTksCisKKzB4MTcsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDM3LCAweDBGLCAweDVDLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MkYsIDB4MjAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI4LCAweDE5LCAweDYwLCAweEVDLAorCisweEIzLCAweDA1LAorMHgwMCwgMHhFMCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjMsIDB4M0IsIDB4MzMsIDB4QUQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE3LCAweDI2LCAweDE3LCAweERGLAorMHgzNSwgMHgxNywgMHg0RiwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDM5LCAweDM3LCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDE3LCAweEFGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzEsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg1NywgMHgzOSwgMHgyMCwgMHhFOSwKKworMHgxNiwgMHgyOCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4M0IsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MkIsIDB4MjAsIDB4RTksCisweDJCLCAweDMyLCAweDIwLCAweEU5LAorCisweDFDLCAweDIzLCAweDIwLCAweEU5LAorMHg1NywgMHgzNiwgMHgyMCwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDkwLCAweEUyLAorMHgwMCwgMHhFMCwKKworMHg3OCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MTksIDB4QzgsIDB4QzEsIDB4Q0QsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDlGLCAweDQxLCAweDQ5LCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MkQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MEQsIDB4ODAsIDB4MDcsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDM1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjUsIDB4MzAsCisweDJELCAweDMwLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweEE3LCAweDVCLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NzcsIDB4RkYsIDB4MEEsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM5LCAweDQxLCAweEM4LCAweEVDLAorMHg0MiwgMHhFMSwKKzB4MDAsIDB4RTAsCisKKzB4NzUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOCwgMHg0MCwgMHhDMCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NzIsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nMjAwX3RnenNbXSA9IHsKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4OTgsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4ODEsIDB4MDQsCisweDg5LCAweDA0LAorMHgwMSwgMHgwNCwKKzB4MDksIDB4MDQsCisKKzB4QzksIDB4NDEsIDB4QzAsIDB4RUMsCisweDExLCAweDA0LAorMHgwMCwgMHhFMCwKKworMHg0MSwgMHhDQywgMHg0MSwgMHhDRCwKKzB4NDksIDB4Q0MsIDB4NDksIDB4Q0QsCisKKzB4RDEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDUxLCAweENDLCAweDUxLCAweENELAorCisweDgwLCAweDA0LAorMHgxMCwgMHgwNCwKKzB4MDgsIDB4MDQsCisweDAwLCAweEUwLAorCisweDAwLCAweENDLCAweEMwLCAweENELAorMHhEMSwgMHg0OSwgMHhDMCwgMHhFQywKKworMHg4QSwgMHgxRiwgMHgyMCwgMHhFOSwKKzB4OEIsIDB4M0YsIDB4MjAsIDB4RTksCisKKzB4NDEsIDB4M0MsIDB4NDEsIDB4QUQsCisweDQ5LCAweDNDLCAweDQ5LCAweEFELAorCisweDEwLCAweENDLCAweDEwLCAweENELAorMHgwOCwgMHhDQywgMHgwOCwgMHhDRCwKKworMHhCOSwgMHg0MSwgMHg0OSwgMHhCQiwKKzB4MUYsIDB4RjAsIDB4NDEsIDB4Q0QsCisKKzB4NTEsIDB4M0MsIDB4NTEsIDB4QUQsCisweDAwLCAweDk4LCAweDgwLCAweEU5LAorCisweDhCLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHgxRiwgMHgyMCwgMHhFOSwKKworMHgyMSwgMHg0NSwgMHg4MCwgMHhFOCwKKzB4MUEsIDB4NEQsIDB4ODAsIDB4RTgsCisKKzB4MzEsIDB4NTUsIDB4ODAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweDQxLCAweDQ5LCAweEJELAorMHgxRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgyRSwgMHg0MSwgMHgyQSwgMHhCOCwKKzB4MzQsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4MzAsCisweDFELCAweDMwLAorMHg1OCwgMHhFMywKKzB4MDAsIDB4RTAsCisKKzB4QjUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDI0LCAweDQzLCAweEEwLCAweEU4LAorMHgyQywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgxNSwgMHg3MiwKKzB4MDksIDB4RTMsCisweDAwLCAweEUwLAorMHgxRCwgMHg3MiwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHg5NywgMHg1NywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NkMsIDB4NjQsIDB4QzgsIDB4RUMsCisweDk4LCAweEUxLAorMHhCNSwgMHgwNSwKKworMHhCRCwgMHgwNSwKKzB4MkUsIDB4MzAsCisweDMyLCAweEMwLCAweEEwLCAweEU4LAorCisweDMzLCAweEMwLCAweEEwLCAweEU4LAorMHg3NCwgMHg2NCwgMHhDOCwgMHhFQywKKworMHg0MCwgMHgzQywgMHg0MCwgMHhBRCwKKzB4MzIsIDB4NkEsCisweDJBLCAweDMwLAorCisweDIwLCAweDczLAorMHgzMywgMHg2QSwKKzB4MDAsIDB4RTAsCisweDI4LCAweDczLAorCisweDFDLCAweDcyLAorMHg4MywgMHhFMiwKKzB4NzcsIDB4ODAsIDB4MTUsIDB4RUEsCisKKzB4QjgsIDB4M0QsIDB4MjgsIDB4REYsCisweDMwLCAweDM1LCAweDIwLCAweERGLAorCisweDQwLCAweDMwLAorMHgwMCwgMHhFMCwKKzB4Q0MsIDB4RTIsCisweDY0LCAweDcyLAorCisweDI1LCAweDQyLCAweDUyLCAweEJGLAorMHgyRCwgMHg0MiwgMHg0QSwgMHhCRiwKKworMHgzMCwgMHgyRSwgMHgzMCwgMHhERiwKKzB4MzgsIDB4MkUsIDB4MzgsIDB4REYsCisKKzB4MTgsIDB4MUQsIDB4NDUsIDB4RTksCisweDFFLCAweDE1LCAweDQ1LCAweEU5LAorCisweDJCLCAweDQ5LCAweDUxLCAweEJELAorMHgwMCwgMHhFMCwKKzB4MUYsIDB4NzMsCisKKzB4MzgsIDB4MzgsIDB4NDAsIDB4QUYsCisweDMwLCAweDMwLCAweDQwLCAweEFGLAorCisweDI0LCAweDFGLCAweDI0LCAweERGLAorMHgxRCwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgyQywgMHgxRiwgMHgyQywgMHhERiwKKzB4MUEsIDB4MzMsIDB4MjAsIDB4RTksCisKKzB4QjAsIDB4MTAsCisweDA4LCAweEUzLAorMHg0MCwgMHgxMCwKKzB4QjgsIDB4MTAsCisKKzB4MjYsIDB4RjAsIDB4MzAsIDB4Q0QsCisweDJGLCAweEYwLCAweDM4LCAweENELAorCisweDJCLCAweDgwLCAweDIwLCAweEU5LAorMHgyQSwgMHg4MCwgMHgyMCwgMHhFOSwKKworMHhBNiwgMHgyMCwKKzB4ODgsIDB4RTIsCisweDAwLCAweEUwLAorMHhBRiwgMHgyMCwKKworMHgyOCwgMHgyQSwgMHgyNiwgMHhBRiwKKzB4MjAsIDB4MkEsIDB4QzAsIDB4QUYsCisKKzB4MzQsIDB4MUYsIDB4MzQsIDB4REYsCisweDQ2LCAweDI0LCAweDQ2LCAweERGLAorCisweDI4LCAweDMwLCAweDgwLCAweEJGLAorMHgyMCwgMHgzOCwgMHg4MCwgMHhCRiwKKworMHg0NywgMHgyNCwgMHg0NywgMHhERiwKKzB4NEUsIDB4MkMsIDB4NEUsIDB4REYsCisKKzB4NEYsIDB4MkMsIDB4NEYsIDB4REYsCisweDU2LCAweDM0LCAweDU2LCAweERGLAorCisweDI4LCAweDE1LCAweDI4LCAweERGLAorMHgyMCwgMHgxRCwgMHgyMCwgMHhERiwKKworMHg1NywgMHgzNCwgMHg1NywgMHhERiwKKzB4MDAsIDB4RTAsCisweDFELCAweDA1LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4OSwgMHhFMiwKKzB4MkIsIDB4MzAsCisKKzB4M0YsIDB4QzEsIDB4MUQsIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBMCwgMHg2OCwKKzB4QkYsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIwLCAweEMwLCAweDIwLCAweEFGLAorMHgyOCwgMHgwNSwKKzB4OTcsIDB4NzQsCisKKzB4MDAsIDB4RTAsCisweDJBLCAweDEwLAorMHgxNiwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4OEMsIDB4RTIsCisweDk1LCAweDA1LAorCisweDI4LCAweEMxLCAweDI4LCAweEFELAorMHgxRiwgMHhDMSwgMHgxNSwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTgsIDB4NjcsCisweDlGLCAweDZCLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyOCwgMHhDMCwgMHgyOCwgMHhBRCwKKzB4MUQsIDB4MjUsCisweDIwLCAweDA1LAorCisweDI4LCAweDMyLCAweDgwLCAweEFELAorMHg0MCwgMHgyQSwgMHg0MCwgMHhCRCwKKworMHgxQywgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MjAsIDB4MzMsIDB4MjAsIDB4QUQsCisKKzB4MjAsIDB4NzMsCisweDAwLCAweEUwLAorMHhCNiwgMHg0OSwgMHg1MSwgMHhCQiwKKworMHgyNiwgMHgyRiwgMHhCMCwgMHhFOCwKKzB4MTksIDB4MjAsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MjAsIDB4MzUsIDB4REYsCisweDNELCAweDIwLCAweDNELCAweERGLAorCisweDE1LCAweDIwLCAweDE1LCAweERGLAorMHgxRCwgMHgyMCwgMHgxRCwgMHhERiwKKworMHgyNiwgMHhEMCwgMHgyNiwgMHhDRCwKKzB4MjksIDB4NDksIDB4MkEsIDB4QjgsCisKKzB4MjYsIDB4NDAsIDB4ODAsIDB4QkQsCisweDNCLCAweDQ4LCAweDUwLCAweEJELAorCisweDNFLCAweDU0LCAweDU3LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4ODIsIDB4RTEsCisKKzB4MUUsIDB4QUYsIDB4NTksIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI2LCAweDMwLAorMHgyOSwgMHgzMCwKKzB4NDgsIDB4M0MsIDB4NDgsIDB4QUQsCisKKzB4MkIsIDB4NzIsCisweEMyLCAweEUxLAorMHgyQywgMHhDMCwgMHg0NCwgMHhDMiwKKworMHgwNSwgMHgyNCwgMHgzNCwgMHhCRiwKKzB4MEQsIDB4MjQsIDB4MkMsIDB4QkYsCisKKzB4MkQsIDB4NDYsIDB4NEUsIDB4QkYsCisweDI1LCAweDQ2LCAweDU2LCAweEJGLAorCisweDIwLCAweDFELCAweDZGLCAweDhGLAorMHgzMiwgMHgzRSwgMHg1RiwgMHhFOSwKKworMHgzRSwgMHg1MCwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDMwLAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgzMywgMHgxRSwgMHg1RiwgMHhFOSwKKworMHgwNSwgMHg0NCwgMHg1NCwgMHhCMiwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjIsCisKKzB4MTksIDB4QzAsIDB4QjAsIDB4RTgsCisweDM0LCAweEMwLCAweDQ0LCAweEM0LAorCisweDMzLCAweDczLAorMHgwMCwgMHhFMCwKKzB4M0UsIDB4NjIsIDB4NTcsIDB4OUYsCisKKzB4MUUsIDB4QUYsIDB4NTksIDB4OUYsCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKworMHg4NCwgMHgzRSwgMHg1OCwgMHhFOSwKKzB4MjgsIDB4MUQsIDB4NkYsIDB4OEYsCisKKzB4MDUsIDB4MjAsCisweDAwLCAweEUwLAorMHg4NSwgMHgxRSwgMHg1OCwgMHhFOSwKKworMHg5QiwgMHgzQiwgMHgzMywgMHhERiwKKzB4MjAsIDB4MjAsIDB4NDIsIDB4QUYsCisKKzB4MzAsIDB4NDIsIDB4NTYsIDB4OUYsCisweDgwLCAweDNFLCAweDU3LCAweEU5LAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzMCwgMHg4MCwgMHg1RiwgMHhFOSwKKworMHgyOCwgMHgyOCwgMHgyNCwgMHhBRiwKKzB4ODEsIDB4MUUsIDB4NTcsIDB4RTksCisKKzB4MDUsIDB4NDcsIDB4NTcsIDB4QkYsCisweDBELCAweDQ3LCAweDRGLCAweEJGLAorCisweDg4LCAweDgwLCAweDU4LCAweEU5LAorMHgxQiwgMHgyOSwgMHgxQiwgMHhERiwKKworMHgzMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4M0EsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MUMsIDB4MzAsIDB4MjYsIDB4REYsCisweDA5LCAweEUzLAorMHgzQiwgMHgwNSwKKworMHgzRSwgMHg1MCwgMHg1NiwgMHg5RiwKKzB4M0IsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDAwLCAweEUwLAorMHhBQywgMHgyMCwKKworMHgyRCwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MkMsIDB4MUMsIDB4QzAsIDB4QUYsCisKKzB4MjUsIDB4NDQsIDB4NTQsIDB4QjQsCisweDAwLCAweEUwLAorMHhDOCwgMHgzMCwKKworMHgzMCwgMHg0NiwgMHgzMCwgMHhBRiwKKzB4MUIsIDB4MUIsIDB4NDgsIDB4QUYsCisKKzB4MDAsIDB4RTAsCisweDI1LCAweDIwLAorMHgzOCwgMHgyQywgMHg0RiwgMHhFOSwKKworMHg4NiwgMHg4MCwgMHg1NywgMHhFOSwKKzB4MzgsIDB4MUQsIDB4NkYsIDB4OEYsCisKKzB4MjgsIDB4NzQsCisweDAwLCAweEUwLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMCwKKworMHgwNSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MkQsIDB4MjAsCisweDlCLCAweDEwLAorCisweDgyLCAweDNFLCAweDU3LCAweEU5LAorMHgzMiwgMHhGMCwgMHgxQiwgMHhDRCwKKworMHgxRSwgMHhCRCwgMHg1OSwgMHg5RiwKKzB4ODMsIDB4MUUsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4NDcsIDB4MzgsIDB4QUYsCisweDM0LCAweDIwLAorMHgyQSwgMHgzMCwKKworMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisweDMyLCAweDIwLAorMHgwNSwgMHgyMCwKKworMHg4NywgMHg4MCwgMHg1NywgMHhFOSwKKzB4MUYsIDB4NTQsIDB4NTcsIDB4OUYsCisKKzB4MTcsIDB4NDIsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHg2QSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzcsIDB4MUUsIDB4NEYsIDB4RTksCisKKzB4MzcsIDB4MzIsIDB4MkEsIDB4QUYsCisweDAwLCAweEUwLAorMHgzMiwgMHgwMCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjcsIDB4QzAsIDB4NDQsIDB4QzAsCisKKzB4MzYsIDB4MUYsIDB4NEYsIDB4RTksCisweDFGLCAweDFGLCAweDI2LCAweERGLAorCisweDM3LCAweDFCLCAweDM3LCAweEJGLAorMHgxNywgMHgyNiwgMHgxNywgMHhERiwKKworMHgzRSwgMHgxNywgMHg0RiwgMHhFOSwKKzB4M0YsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MzQsIDB4MUYsIDB4MzQsIDB4QUYsCisweDJCLCAweDA1LAorMHhBNywgMHgyMCwKKworMHgzMywgMHgyQiwgMHgzNywgMHhERiwKKzB4MjcsIDB4MTcsIDB4QzAsIDB4QUYsCisKKzB4MzQsIDB4ODAsIDB4NEYsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDJELCAweDIxLCAweDFBLCAweEIwLAorMHgyNSwgMHgyMSwgMHgzMSwgMHhCMCwKKworMHgwRCwgMHgyMSwgMHgxQSwgMHhCMiwKKzB4MDUsIDB4MjEsIDB4MzEsIDB4QjIsCisKKzB4MDMsIDB4ODAsIDB4MkEsIDB4RUEsCisweDE3LCAweEMxLCAweDJCLCAweEJELAorCisweDJELCAweDIwLAorMHgyNSwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDBELCAweDIwLAorCisweEIzLCAweDY4LAorMHg5NywgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4MzMsIDB4QUYsCisweDJGLCAweEMwLCAweDIxLCAweEMwLAorCisweDE2LCAweDQyLCAweDU2LCAweDlGLAorMHgzQywgMHgyNywgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg2MiwgMHg1NywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4MjEsIDB4MzEsIDB4QjQsCisweDJELCAweDIxLCAweDFBLCAweEI0LAorCisweDNGLCAweDJGLCAweDVELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHgwNSwKKzB4MDAsIDB4RTAsCisweDI4LCAweDE5LCAweDYwLCAweEVDLAorCisweDM3LCAweDBGLCAweDVDLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MkYsIDB4MjAsCisKKzB4MjMsIDB4M0IsIDB4MzMsIDB4QUQsCisweDFFLCAweDI2LCAweDFFLCAweERGLAorCisweEE3LCAweDFFLCAweDRGLCAweEU5LAorMHgxNywgMHgyNiwgMHgxNiwgMHhERiwKKworMHgyRCwgMHgyMCwKKzB4MDAsIDB4RTAsCisweEE4LCAweDNGLCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDFFLCAweEFGLAorMHgyNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisKKzB4QTQsIDB4MTYsIDB4NEYsIDB4RTksCisweDBGLCAweEMwLCAweDIxLCAweEMyLAorCisweEE2LCAweDgwLCAweDRGLCAweEU5LAorMHgxRiwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgzRiwgMHgyRiwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDhGLCAweDIwLAorCisweEE1LCAweDM3LCAweDRGLCAweEU5LAorMHgwRiwgMHgxNywgMHgwRiwgMHhBRiwKKworMHgwNiwgMHhDMCwgMHgyMSwgMHhDNCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweEEzLCAweDgwLCAweDRGLCAweEU5LAorCisweDA2LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4MUYsIDB4MjYsIDB4MUYsIDB4REYsCisKKzB4QTEsIDB4MUYsIDB4NEYsIDB4RTksCisweEEyLCAweDNGLCAweDRGLCAweEU5LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwNiwgMHgwNiwgMHgxRiwgMHhBRiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4NTcsIDB4MzksIDB4MjAsIDB4RTksCisKKzB4MTYsIDB4MjgsIDB4MjAsIDB4RTksCisweDFELCAweDNCLCAweDIwLCAweEU5LAorCisweDFFLCAweDJCLCAweDIwLCAweEU5LAorMHgyQiwgMHgzMiwgMHgyMCwgMHhFOSwKKworMHgxQywgMHgyMywgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDQwLCAweDQwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHg5MCwgMHhFMiwKKzB4MDAsIDB4RTAsCisKKzB4NkMsIDB4RkYsIDB4MjAsIDB4RUEsCisweDE5LCAweEM4LCAweEMxLCAweENELAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg5RiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjUsIDB4NDEsIDB4NDksIDB4QkQsCisweDJELCAweDQxLCAweDUxLCAweEJELAorCisweDBELCAweDgwLCAweDA3LCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI1LCAweDMwLAorMHgyRCwgMHgzMCwKKworMHgzNSwgMHgzMCwKKzB4QjUsIDB4MzAsCisweEJELCAweDMwLAorMHgzRCwgMHgzMCwKKworMHg5QywgMHhBNywgMHg1QiwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZCLCAweEZGLCAweDBBLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOSwgMHg0MSwgMHhDOCwgMHhFQywKKzB4NDIsIDB4RTEsCisweDAwLCAweEUwLAorCisweDY5LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzgsIDB4NDAsIDB4QzAsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY2LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzIwMF90Z3pzYVtdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg5OCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDFGLCAweEQ3LCAweDE4LCAweEJELAorMHgzRiwgMHhENywgMHgyMiwgMHhCRCwKKworMHg4MSwgMHgwNCwKKzB4ODksIDB4MDQsCisweDAxLCAweDA0LAorMHgwOSwgMHgwNCwKKworMHhDOSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MTEsIDB4MDQsCisweDAwLCAweEUwLAorCisweDQxLCAweENDLCAweDQxLCAweENELAorMHg0OSwgMHhDQywgMHg0OSwgMHhDRCwKKworMHhEMSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4NTEsIDB4Q0MsIDB4NTEsIDB4Q0QsCisKKzB4ODAsIDB4MDQsCisweDEwLCAweDA0LAorMHgwOCwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4MDAsIDB4Q0MsIDB4QzAsIDB4Q0QsCisweEQxLCAweDQ5LCAweEMwLCAweEVDLAorCisweDhBLCAweDFGLCAweDIwLCAweEU5LAorMHg4QiwgMHgzRiwgMHgyMCwgMHhFOSwKKworMHg0MSwgMHgzQywgMHg0MSwgMHhBRCwKKzB4NDksIDB4M0MsIDB4NDksIDB4QUQsCisKKzB4MTAsIDB4Q0MsIDB4MTAsIDB4Q0QsCisweDA4LCAweENDLCAweDA4LCAweENELAorCisweEI5LCAweDQxLCAweDQ5LCAweEJCLAorMHgxRiwgMHhGMCwgMHg0MSwgMHhDRCwKKworMHg1MSwgMHgzQywgMHg1MSwgMHhBRCwKKzB4MDAsIDB4OTgsIDB4ODAsIDB4RTksCisKKzB4OEYsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDFGLCAweDIwLCAweEU5LAorCisweDIxLCAweDQ1LCAweDgwLCAweEU4LAorMHgxQSwgMHg0RCwgMHg4MCwgMHhFOCwKKworMHgzMSwgMHg1NSwgMHg4MCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4NDEsIDB4NDksIDB4QkQsCisweDFELCAweDQxLCAweDUxLCAweEJELAorCisweDJFLCAweDQxLCAweDJBLCAweEI4LAorMHgzNCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHgxNSwgMHgzMCwKKzB4MUQsIDB4MzAsCisweDU4LCAweEUzLAorMHgwMCwgMHhFMCwKKworMHhCNSwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4M0QsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MjQsIDB4NDMsIDB4QTAsIDB4RTgsCisweDJDLCAweDRCLCAweEEwLCAweEU4LAorCisweDE1LCAweDcyLAorMHgwOSwgMHhFMywKKzB4MDAsIDB4RTAsCisweDFELCAweDcyLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweDk3LCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2QywgMHg2NCwgMHhDOCwgMHhFQywKKzB4OTgsIDB4RTEsCisweEI1LCAweDA1LAorCisweEJELCAweDA1LAorMHgyRSwgMHgzMCwKKzB4MzIsIDB4QzAsIDB4QTAsIDB4RTgsCisKKzB4MzMsIDB4QzAsIDB4QTAsIDB4RTgsCisweDc0LCAweDY0LCAweEM4LCAweEVDLAorCisweDQwLCAweDNDLCAweDQwLCAweEFELAorMHgzMiwgMHg2QSwKKzB4MkEsIDB4MzAsCisKKzB4MjAsIDB4NzMsCisweDMzLCAweDZBLAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4NzMsCisKKzB4MUMsIDB4NzIsCisweDgzLCAweEUyLAorMHg3QiwgMHg4MCwgMHgxNSwgMHhFQSwKKworMHhCOCwgMHgzRCwgMHgyOCwgMHhERiwKKzB4MzAsIDB4MzUsIDB4MjAsIDB4REYsCisKKzB4NDAsIDB4MzAsCisweDAwLCAweEUwLAorMHhDQywgMHhFMiwKKzB4NjQsIDB4NzIsCisKKzB4MjUsIDB4NDIsIDB4NTIsIDB4QkYsCisweDJELCAweDQyLCAweDRBLCAweEJGLAorCisweDMwLCAweDJFLCAweDMwLCAweERGLAorMHgzOCwgMHgyRSwgMHgzOCwgMHhERiwKKworMHgxOCwgMHgxRCwgMHg0NSwgMHhFOSwKKzB4MUUsIDB4MTUsIDB4NDUsIDB4RTksCisKKzB4MkIsIDB4NDksIDB4NTEsIDB4QkQsCisweDAwLCAweEUwLAorMHgxRiwgMHg3MywKKworMHgzOCwgMHgzOCwgMHg0MCwgMHhBRiwKKzB4MzAsIDB4MzAsIDB4NDAsIDB4QUYsCisKKzB4MjQsIDB4MUYsIDB4MjQsIDB4REYsCisweDFELCAweDMyLCAweDIwLCAweEU5LAorCisweDJDLCAweDFGLCAweDJDLCAweERGLAorMHgxQSwgMHgzMywgMHgyMCwgMHhFOSwKKworMHhCMCwgMHgxMCwKKzB4MDgsIDB4RTMsCisweDQwLCAweDEwLAorMHhCOCwgMHgxMCwKKworMHgyNiwgMHhGMCwgMHgzMCwgMHhDRCwKKzB4MkYsIDB4RjAsIDB4MzgsIDB4Q0QsCisKKzB4MkIsIDB4ODAsIDB4MjAsIDB4RTksCisweDJBLCAweDgwLCAweDIwLCAweEU5LAorCisweEE2LCAweDIwLAorMHg4OCwgMHhFMiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDI4LCAweDJBLCAweDI2LCAweEFGLAorMHgyMCwgMHgyQSwgMHhDMCwgMHhBRiwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhERiwKKzB4NDYsIDB4MjQsIDB4NDYsIDB4REYsCisKKzB4MjgsIDB4MzAsIDB4ODAsIDB4QkYsCisweDIwLCAweDM4LCAweDgwLCAweEJGLAorCisweDQ3LCAweDI0LCAweDQ3LCAweERGLAorMHg0RSwgMHgyQywgMHg0RSwgMHhERiwKKworMHg0RiwgMHgyQywgMHg0RiwgMHhERiwKKzB4NTYsIDB4MzQsIDB4NTYsIDB4REYsCisKKzB4MjgsIDB4MTUsIDB4MjgsIDB4REYsCisweDIwLCAweDFELCAweDIwLCAweERGLAorCisweDU3LCAweDM0LCAweDU3LCAweERGLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4MDUsCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDg5LCAweEUyLAorMHgyQiwgMHgzMCwKKworMHgzRiwgMHhDMSwgMHgxRCwgMHhCRCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDY4LAorMHhCRiwgMHgyNSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjAsIDB4QzAsIDB4MjAsIDB4QUYsCisweDI4LCAweDA1LAorMHg5NywgMHg3NCwKKworMHgwMCwgMHhFMCwKKzB4MkEsIDB4MTAsCisweDE2LCAweEMwLCAweDIwLCAweEU5LAorCisweDA0LCAweDgwLCAweDEwLCAweEVBLAorMHg4QywgMHhFMiwKKzB4OTUsIDB4MDUsCisKKzB4MjgsIDB4QzEsIDB4MjgsIDB4QUQsCisweDFGLCAweEMxLCAweDE1LCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhBOCwgMHg2NywKKzB4OUYsIDB4NkIsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI4LCAweEMwLCAweDI4LCAweEFELAorMHgxRCwgMHgyNSwKKzB4MjAsIDB4MDUsCisKKzB4MjgsIDB4MzIsIDB4ODAsIDB4QUQsCisweDQwLCAweDJBLCAweDQwLCAweEJELAorCisweDFDLCAweDgwLCAweDIwLCAweEU5LAorMHgyMCwgMHgzMywgMHgyMCwgMHhBRCwKKworMHgyMCwgMHg3MywKKzB4MDAsIDB4RTAsCisweEI2LCAweDQ5LCAweDUxLCAweEJCLAorCisweDI2LCAweDJGLCAweEIwLCAweEU4LAorMHgxOSwgMHgyMCwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgyMCwgMHgzNSwgMHhERiwKKzB4M0QsIDB4MjAsIDB4M0QsIDB4REYsCisKKzB4MTUsIDB4MjAsIDB4MTUsIDB4REYsCisweDFELCAweDIwLCAweDFELCAweERGLAorCisweDI2LCAweEQwLCAweDI2LCAweENELAorMHgyOSwgMHg0OSwgMHgyQSwgMHhCOCwKKworMHgyNiwgMHg0MCwgMHg4MCwgMHhCRCwKKzB4M0IsIDB4NDgsIDB4NTAsIDB4QkQsCisKKzB4M0UsIDB4NTQsIDB4NTcsIDB4OUYsCisweDAwLCAweEUwLAorMHg4MiwgMHhFMSwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjYsIDB4MzAsCisweDI5LCAweDMwLAorMHg0OCwgMHgzQywgMHg0OCwgMHhBRCwKKworMHgyQiwgMHg3MiwKKzB4QzIsIDB4RTEsCisweDJDLCAweEMwLCAweDQ0LCAweEMyLAorCisweDA1LCAweDI0LCAweDM0LCAweEJGLAorMHgwRCwgMHgyNCwgMHgyQywgMHhCRiwKKworMHgyRCwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MjUsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MjAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDMyLCAweDNFLCAweDVGLCAweEU5LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4MzAsCisKKzB4MUUsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMzLCAweDFFLCAweDVGLCAweEU5LAorCisweDA1LCAweDQ0LCAweDU0LCAweEIyLAorMHgwRCwgMHg0NCwgMHg0QywgMHhCMiwKKworMHgxOSwgMHhDMCwgMHhCMCwgMHhFOCwKKzB4MzQsIDB4QzAsIDB4NDQsIDB4QzQsCisKKzB4MzMsIDB4NzMsCisweDAwLCAweEUwLAorMHgzRSwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgxRSwgMHhBRiwgMHg1OSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorCisweDg0LCAweDNFLCAweDU4LCAweEU5LAorMHgyOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgwNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisweDg1LCAweDFFLCAweDU4LCAweEU5LAorCisweDlCLCAweDNCLCAweDMzLCAweERGLAorMHgyMCwgMHgyMCwgMHg0MiwgMHhBRiwKKworMHgzMCwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4ODAsIDB4M0UsIDB4NTcsIDB4RTksCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDMwLCAweDgwLCAweDVGLCAweEU5LAorCisweDI4LCAweDI4LCAweDI0LCAweEFGLAorMHg4MSwgMHgxRSwgMHg1NywgMHhFOSwKKworMHgwNSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MEQsIDB4NDcsIDB4NEYsIDB4QkYsCisKKzB4ODgsIDB4ODAsIDB4NTgsIDB4RTksCisweDFCLCAweDI5LCAweDFCLCAweERGLAorCisweDMwLCAweDFELCAweDZGLCAweDhGLAorMHgzQSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgxQywgMHgzMCwgMHgyNiwgMHhERiwKKzB4MDksIDB4RTMsCisweDNCLCAweDA1LAorCisweDNFLCAweDUwLCAweDU2LCAweDlGLAorMHgzQiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweEFDLCAweDIwLAorCisweDJELCAweDQ0LCAweDRDLCAweEI0LAorMHgyQywgMHgxQywgMHhDMCwgMHhBRiwKKworMHgyNSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MDAsIDB4RTAsCisweEM4LCAweDMwLAorCisweDMwLCAweDQ2LCAweDMwLCAweEFGLAorMHgxQiwgMHgxQiwgMHg0OCwgMHhBRiwKKworMHgwMCwgMHhFMCwKKzB4MjUsIDB4MjAsCisweDM4LCAweDJDLCAweDRGLCAweEU5LAorCisweDg2LCAweDgwLCAweDU3LCAweEU5LAorMHgzOCwgMHgxRCwgMHg2RiwgMHg4RiwKKworMHgyOCwgMHg3NCwKKzB4MDAsIDB4RTAsCisweDBELCAweDQ0LCAweDRDLCAweEIwLAorCisweDA1LCAweDQ0LCAweDU0LCAweEIwLAorMHgyRCwgMHgyMCwKKzB4OUIsIDB4MTAsCisKKzB4ODIsIDB4M0UsIDB4NTcsIDB4RTksCisweDMyLCAweEYwLCAweDFCLCAweENELAorCisweDFFLCAweEJELCAweDU5LCAweDlGLAorMHg4MywgMHgxRSwgMHg1NywgMHhFOSwKKworMHgzOCwgMHg0NywgMHgzOCwgMHhBRiwKKzB4MzQsIDB4MjAsCisweDJBLCAweDMwLAorCisweDAwLCAweEUwLAorMHgwRCwgMHgyMCwKKzB4MzIsIDB4MjAsCisweDA1LCAweDIwLAorCisweDg3LCAweDgwLCAweDU3LCAweEU5LAorMHgxRiwgMHg1NCwgMHg1NywgMHg5RiwKKworMHgxNywgMHg0MiwgMHg1NiwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDNCLCAweDZBLAorCisweDNGLCAweDhGLCAweDUxLCAweDlGLAorMHgzNywgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNywgMHgzMiwgMHgyQSwgMHhBRiwKKzB4MDAsIDB4RTAsCisweDMyLCAweDAwLAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNywgMHhDMCwgMHg0NCwgMHhDMCwKKworMHgzNiwgMHgxRiwgMHg0RiwgMHhFOSwKKzB4MUYsIDB4MUYsIDB4MjYsIDB4REYsCisKKzB4MzcsIDB4MUIsIDB4MzcsIDB4QkYsCisweDE3LCAweDI2LCAweDE3LCAweERGLAorCisweDNFLCAweDE3LCAweDRGLCAweEU5LAorMHgzRiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgzNCwgMHgxRiwgMHgzNCwgMHhBRiwKKzB4MkIsIDB4MDUsCisweEE3LCAweDIwLAorCisweDMzLCAweDJCLCAweDM3LCAweERGLAorMHgyNywgMHgxNywgMHhDMCwgMHhBRiwKKworMHgzNCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjAsCisweDI1LCAweDIxLCAweDMxLCAweEIwLAorCisweDBELCAweDIxLCAweDFBLCAweEIyLAorMHgwNSwgMHgyMSwgMHgzMSwgMHhCMiwKKworMHgwMywgMHg4MCwgMHgyQSwgMHhFQSwKKzB4MTcsIDB4QzEsIDB4MkIsIDB4QkQsCisKKzB4MkQsIDB4MjAsCisweDI1LCAweDIwLAorMHgwNSwgMHgyMCwKKzB4MEQsIDB4MjAsCisKKzB4QjMsIDB4NjgsCisweDk3LCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHgzMywgMHhBRiwKKzB4MkYsIDB4QzAsIDB4MjEsIDB4QzAsCisKKzB4MTYsIDB4NDIsIDB4NTYsIDB4OUYsCisweDNDLCAweDI3LCAweDRGLCAweEU5LAorCisweDFFLCAweDYyLCAweDU3LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHgyMSwgMHgzMSwgMHhCNCwKKzB4MkQsIDB4MjEsIDB4MUEsIDB4QjQsCisKKzB4M0YsIDB4MkYsIDB4NUQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweDA1LAorMHgwMCwgMHhFMCwKKzB4MjgsIDB4MTksIDB4NjAsIDB4RUMsCisKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjYsCisweDA1LCAweDQ0LCAweDU0LCAweEI2LAorCisweDM3LCAweDBGLCAweDVDLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MkYsIDB4MjAsCisKKzB4MjMsIDB4M0IsIDB4MzMsIDB4QUQsCisweDFFLCAweDI2LCAweDFFLCAweERGLAorCisweEE3LCAweDFFLCAweDRGLCAweEU5LAorMHgxNywgMHgyNiwgMHgxNiwgMHhERiwKKworMHgyRCwgMHgyMCwKKzB4MDAsIDB4RTAsCisweEE4LCAweDNGLCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDFFLCAweEFGLAorMHgyNSwgMHgyMCwKKzB4MDAsIDB4RTAsCisKKzB4QTQsIDB4MTYsIDB4NEYsIDB4RTksCisweDBGLCAweEMwLCAweDIxLCAweEMyLAorCisweEE2LCAweDgwLCAweDRGLCAweEU5LAorMHgxRiwgMHg2MiwgMHg1NywgMHg5RiwKKworMHgwRCwgMHgyMCwKKzB4MDUsIDB4MjAsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDNGLCAweDJGLCAweDVELCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEYsIDB4MjAsCisKKzB4MTcsIDB4NTAsIDB4NTYsIDB4OUYsCisweEE1LCAweDM3LCAweDRGLCAweEU5LAorCisweDA2LCAweEMwLCAweDIxLCAweEM0LAorMHgwRiwgMHgxNywgMHgwRiwgMHhBRiwKKworMHgzNywgMHgwRiwgMHg1QywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MkYsIDB4QzAsIDB4NDQsIDB4QzYsCisweEEzLCAweDgwLCAweDRGLCAweEU5LAorCisweDA2LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4MUYsIDB4MjYsIDB4MUYsIDB4REYsCisKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisweDlELCAweDE3LCAweDRGLCAweEU5LAorCisweEExLCAweDFGLCAweDRGLCAweEU5LAorMHhBMiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgwNiwgMHgxRiwgMHhBRiwKKzB4MDAsIDB4RTAsCisweEFGLCAweDIwLAorCisweDlFLCAweDM3LCAweDRGLCAweEU5LAorMHgyRiwgMHgxNywgMHgyRiwgMHhBRiwKKworMHhBMCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDlDLCAweDgwLCAweDRGLCAweEU5LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg1NywgMHgzOSwgMHgyMCwgMHhFOSwKKworMHgxNiwgMHgyOCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4M0IsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MkIsIDB4MjAsIDB4RTksCisweDJCLCAweDMyLCAweDIwLCAweEU5LAorCisweDFDLCAweDIzLCAweDIwLCAweEU5LAorMHg1NywgMHgzNiwgMHgyMCwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDkwLCAweEUyLAorMHgwMCwgMHhFMCwKKworMHg2OCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MTksIDB4QzgsIDB4QzEsIDB4Q0QsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDlGLCAweDQxLCAweDQ5LCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MkQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MEQsIDB4ODAsIDB4MDcsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDM1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjUsIDB4MzAsCisweDJELCAweDMwLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweEE3LCAweDVCLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjcsIDB4RkYsIDB4MEEsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM5LCAweDQxLCAweEM4LCAweEVDLAorMHg0MiwgMHhFMSwKKzB4MDAsIDB4RTAsCisKKzB4NjUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOCwgMHg0MCwgMHhDMCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjIsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nMjAwX3RnenNhZltdID0geworCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDk4LCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDgxLCAweDA0LAorMHg4OSwgMHgwNCwKKzB4MDEsIDB4MDQsCisweDA5LCAweDA0LAorCisweEM5LCAweDQxLCAweEMwLCAweEVDLAorMHgxMSwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4NDEsIDB4Q0MsIDB4NDEsIDB4Q0QsCisweDQ5LCAweENDLCAweDQ5LCAweENELAorCisweEQxLCAweDQxLCAweEMwLCAweEVDLAorMHg1MSwgMHhDQywgMHg1MSwgMHhDRCwKKworMHg4MCwgMHgwNCwKKzB4MTAsIDB4MDQsCisweDA4LCAweDA0LAorMHgwMCwgMHhFMCwKKworMHgwMCwgMHhDQywgMHhDMCwgMHhDRCwKKzB4RDEsIDB4NDksIDB4QzAsIDB4RUMsCisKKzB4OEEsIDB4MUYsIDB4MjAsIDB4RTksCisweDhCLCAweDNGLCAweDIwLCAweEU5LAorCisweDQxLCAweDNDLCAweDQxLCAweEFELAorMHg0OSwgMHgzQywgMHg0OSwgMHhBRCwKKworMHgxMCwgMHhDQywgMHgxMCwgMHhDRCwKKzB4MDgsIDB4Q0MsIDB4MDgsIDB4Q0QsCisKKzB4QjksIDB4NDEsIDB4NDksIDB4QkIsCisweDFGLCAweEYwLCAweDQxLCAweENELAorCisweDUxLCAweDNDLCAweDUxLCAweEFELAorMHgwMCwgMHg5OCwgMHg4MCwgMHhFOSwKKworMHg5NCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4MUYsIDB4MjAsIDB4RTksCisKKzB4MjEsIDB4NDUsIDB4ODAsIDB4RTgsCisweDFBLCAweDRELCAweDgwLCAweEU4LAorCisweDMxLCAweDU1LCAweDgwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MUQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MkUsIDB4NDEsIDB4MkEsIDB4QjgsCisweDM0LCAweDUzLCAweEEwLCAweEU4LAorCisweDE1LCAweDMwLAorMHgxRCwgMHgzMCwKKzB4NTgsIDB4RTMsCisweDAwLCAweEUwLAorCisweEI1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgyNCwgMHg0MywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4NzIsCisweDA5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4NzIsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4OTcsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZDLCAweDY0LCAweEM4LCAweEVDLAorMHg5OCwgMHhFMSwKKzB4QjUsIDB4MDUsCisKKzB4QkQsIDB4MDUsCisweDJFLCAweDMwLAorMHgzMiwgMHhDMCwgMHhBMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHhBMCwgMHhFOCwKKzB4NzQsIDB4NjQsIDB4QzgsIDB4RUMsCisKKzB4NDAsIDB4M0MsIDB4NDAsIDB4QUQsCisweDMyLCAweDZBLAorMHgyQSwgMHgzMCwKKworMHgyMCwgMHg3MywKKzB4MzMsIDB4NkEsCisweDAwLCAweEUwLAorMHgyOCwgMHg3MywKKworMHgxQywgMHg3MiwKKzB4ODMsIDB4RTIsCisweDgwLCAweDgwLCAweDE1LCAweEVBLAorCisweEI4LCAweDNELCAweDI4LCAweERGLAorMHgzMCwgMHgzNSwgMHgyMCwgMHhERiwKKworMHg0MCwgMHgzMCwKKzB4MDAsIDB4RTAsCisweENDLCAweEUyLAorMHg2NCwgMHg3MiwKKworMHgyNSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MkQsIDB4NDIsIDB4NEEsIDB4QkYsCisKKzB4MzAsIDB4MkUsIDB4MzAsIDB4REYsCisweDM4LCAweDJFLCAweDM4LCAweERGLAorCisweDE4LCAweDFELCAweDQ1LCAweEU5LAorMHgxRSwgMHgxNSwgMHg0NSwgMHhFOSwKKworMHgyQiwgMHg0OSwgMHg1MSwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDczLAorCisweDM4LCAweDM4LCAweDQwLCAweEFGLAorMHgzMCwgMHgzMCwgMHg0MCwgMHhBRiwKKworMHgyNCwgMHgxRiwgMHgyNCwgMHhERiwKKzB4MUQsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MkMsIDB4MUYsIDB4MkMsIDB4REYsCisweDFBLCAweDMzLCAweDIwLCAweEU5LAorCisweEIwLCAweDEwLAorMHgwOCwgMHhFMywKKzB4NDAsIDB4MTAsCisweEI4LCAweDEwLAorCisweDI2LCAweEYwLCAweDMwLCAweENELAorMHgyRiwgMHhGMCwgMHgzOCwgMHhDRCwKKworMHgyQiwgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MkEsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4QTYsIDB4MjAsCisweDg4LCAweEUyLAorMHgwMCwgMHhFMCwKKzB4QUYsIDB4MjAsCisKKzB4MjgsIDB4MkEsIDB4MjYsIDB4QUYsCisweDIwLCAweDJBLCAweEMwLCAweEFGLAorCisweDM0LCAweDFGLCAweDM0LCAweERGLAorMHg0NiwgMHgyNCwgMHg0NiwgMHhERiwKKworMHgyOCwgMHgzMCwgMHg4MCwgMHhCRiwKKzB4MjAsIDB4MzgsIDB4ODAsIDB4QkYsCisKKzB4NDcsIDB4MjQsIDB4NDcsIDB4REYsCisweDRFLCAweDJDLCAweDRFLCAweERGLAorCisweDRGLCAweDJDLCAweDRGLCAweERGLAorMHg1NiwgMHgzNCwgMHg1NiwgMHhERiwKKworMHgyOCwgMHgxNSwgMHgyOCwgMHhERiwKKzB4MjAsIDB4MUQsIDB4MjAsIDB4REYsCisKKzB4NTcsIDB4MzQsIDB4NTcsIDB4REYsCisweDAwLCAweEUwLAorMHgxRCwgMHgwNSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4ODksIDB4RTIsCisweDJCLCAweDMwLAorCisweDNGLCAweEMxLCAweDFELCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTAsIDB4NjgsCisweEJGLCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMCwgMHhDMCwgMHgyMCwgMHhBRiwKKzB4MjgsIDB4MDUsCisweDk3LCAweDc0LAorCisweDAwLCAweEUwLAorMHgyQSwgMHgxMCwKKzB4MTYsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDhDLCAweEUyLAorMHg5NSwgMHgwNSwKKworMHgyOCwgMHhDMSwgMHgyOCwgMHhBRCwKKzB4MUYsIDB4QzEsIDB4MTUsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEE4LCAweDY3LAorMHg5RiwgMHg2QiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjgsIDB4QzAsIDB4MjgsIDB4QUQsCisweDFELCAweDI1LAorMHgyMCwgMHgwNSwKKworMHgyOCwgMHgzMiwgMHg4MCwgMHhBRCwKKzB4NDAsIDB4MkEsIDB4NDAsIDB4QkQsCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDIwLCAweDMzLCAweDIwLCAweEFELAorCisweDIwLCAweDczLAorMHgwMCwgMHhFMCwKKzB4QjYsIDB4NDksIDB4NTEsIDB4QkIsCisKKzB4MjYsIDB4MkYsIDB4QjAsIDB4RTgsCisweDE5LCAweDIwLCAweDIwLCAweEU5LAorCisweDM1LCAweDIwLCAweDM1LCAweERGLAorMHgzRCwgMHgyMCwgMHgzRCwgMHhERiwKKworMHgxNSwgMHgyMCwgMHgxNSwgMHhERiwKKzB4MUQsIDB4MjAsIDB4MUQsIDB4REYsCisKKzB4MjYsIDB4RDAsIDB4MjYsIDB4Q0QsCisweDI5LCAweDQ5LCAweDJBLCAweEI4LAorCisweDI2LCAweDQwLCAweDgwLCAweEJELAorMHgzQiwgMHg0OCwgMHg1MCwgMHhCRCwKKworMHgzRSwgMHg1NCwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDgyLCAweEUxLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNiwgMHgzMCwKKzB4MjksIDB4MzAsCisweDQ4LCAweDNDLCAweDQ4LCAweEFELAorCisweDJCLCAweDcyLAorMHhDMiwgMHhFMSwKKzB4MkMsIDB4QzAsIDB4NDQsIDB4QzIsCisKKzB4MDUsIDB4MjQsIDB4MzQsIDB4QkYsCisweDBELCAweDI0LCAweDJDLCAweEJGLAorCisweDJELCAweDQ2LCAweDRFLCAweEJGLAorMHgyNSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgyMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4MzIsIDB4M0UsIDB4NUYsIDB4RTksCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHgzMCwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzMsIDB4MUUsIDB4NUYsIDB4RTksCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjIsCisweDBELCAweDQ0LCAweDRDLCAweEIyLAorCisweDE5LCAweEMwLCAweEIwLCAweEU4LAorMHgzNCwgMHhDMCwgMHg0NCwgMHhDNCwKKworMHgzMywgMHg3MywKKzB4MDAsIDB4RTAsCisweDNFLCAweDYyLCAweDU3LCAweDlGLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisKKzB4ODQsIDB4M0UsIDB4NTgsIDB4RTksCisweDI4LCAweDFELCAweDZGLCAweDhGLAorCisweDA1LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4ODUsIDB4MUUsIDB4NTgsIDB4RTksCisKKzB4OUIsIDB4M0IsIDB4MzMsIDB4REYsCisweDIwLCAweDIwLCAweDQyLCAweEFGLAorCisweDMwLCAweDQyLCAweDU2LCAweDlGLAorMHg4MCwgMHgzRSwgMHg1NywgMHhFOSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzAsIDB4ODAsIDB4NUYsIDB4RTksCisKKzB4MjgsIDB4MjgsIDB4MjQsIDB4QUYsCisweDgxLCAweDFFLCAweDU3LCAweEU5LAorCisweDA1LCAweDQ3LCAweDU3LCAweEJGLAorMHgwRCwgMHg0NywgMHg0RiwgMHhCRiwKKworMHg4OCwgMHg4MCwgMHg1OCwgMHhFOSwKKzB4MUIsIDB4MjksIDB4MUIsIDB4REYsCisKKzB4MzAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDNBLCAweDMwLCAweDRGLCAweEU5LAorCisweDFDLCAweDMwLCAweDI2LCAweERGLAorMHgwOSwgMHhFMywKKzB4M0IsIDB4MDUsCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDNCLCAweDNGLCAweDRGLCAweEU5LAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4QUMsIDB4MjAsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjQsCisweDJDLCAweDFDLCAweEMwLCAweEFGLAorCisweDI1LCAweDQ0LCAweDU0LCAweEI0LAorMHgwMCwgMHhFMCwKKzB4QzgsIDB4MzAsCisKKzB4MzAsIDB4NDYsIDB4MzAsIDB4QUYsCisweDFCLCAweDFCLCAweDQ4LCAweEFGLAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MzgsIDB4MkMsIDB4NEYsIDB4RTksCisKKzB4ODYsIDB4ODAsIDB4NTcsIDB4RTksCisweDM4LCAweDFELCAweDZGLCAweDhGLAorCisweDI4LCAweDc0LAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjAsCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjAsCisweDJELCAweDIwLAorMHg5QiwgMHgxMCwKKworMHg4MiwgMHgzRSwgMHg1NywgMHhFOSwKKzB4MzIsIDB4RjAsIDB4MUIsIDB4Q0QsCisKKzB4MUUsIDB4QkQsIDB4NTksIDB4OUYsCisweDgzLCAweDFFLCAweDU3LCAweEU5LAorCisweDM4LCAweDQ3LCAweDM4LCAweEFGLAorMHgzNCwgMHgyMCwKKzB4MkEsIDB4MzAsCisKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorMHgzMiwgMHgyMCwKKzB4MDUsIDB4MjAsCisKKzB4ODcsIDB4ODAsIDB4NTcsIDB4RTksCisweDFGLCAweDU0LCAweDU3LCAweDlGLAorCisweDE3LCAweDQyLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4NkEsCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDM3LCAweDFFLCAweDRGLCAweEU5LAorCisweDM3LCAweDMyLCAweDJBLCAweEFGLAorMHgwMCwgMHhFMCwKKzB4MzIsIDB4MDAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI3LCAweEMwLCAweDQ0LCAweEMwLAorCisweDM2LCAweDFGLCAweDRGLCAweEU5LAorMHgxRiwgMHgxRiwgMHgyNiwgMHhERiwKKworMHgzNywgMHgxQiwgMHgzNywgMHhCRiwKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisKKzB4M0UsIDB4MTcsIDB4NEYsIDB4RTksCisweDNGLCAweDNGLCAweDRGLCAweEU5LAorCisweDM0LCAweDFGLCAweDM0LCAweEFGLAorMHgyQiwgMHgwNSwKKzB4QTcsIDB4MjAsCisKKzB4MzMsIDB4MkIsIDB4MzcsIDB4REYsCisweDI3LCAweDE3LCAweEMwLCAweEFGLAorCisweDM0LCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyRCwgMHgyMSwgMHgxQSwgMHhCMCwKKzB4MjUsIDB4MjEsIDB4MzEsIDB4QjAsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjIsCisweDA1LCAweDIxLCAweDMxLCAweEIyLAorCisweDAzLCAweDgwLCAweDJBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgyRCwgMHgyMCwKKzB4MjUsIDB4MjAsCisweDA1LCAweDIwLAorMHgwRCwgMHgyMCwKKworMHhCMywgMHg2OCwKKzB4OTcsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweEMwLCAweDMzLCAweEFGLAorMHgyRiwgMHhDMCwgMHgyMSwgMHhDMCwKKworMHgxNiwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4M0MsIDB4MjcsIDB4NEYsIDB4RTksCisKKzB4MUUsIDB4NjIsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDIxLCAweDMxLCAweEI0LAorMHgyRCwgMHgyMSwgMHgxQSwgMHhCNCwKKworMHgzRiwgMHgyRiwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4MDUsCisweDAwLCAweEUwLAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHgwRCwgMHgyMSwgMHgxQSwgMHhCNiwKKzB4MDUsIDB4MjEsIDB4MzEsIDB4QjYsCisKKzB4MzcsIDB4MEYsIDB4NUMsIDB4OUYsCisweDAwLCAweEUwLAorMHgyRiwgMHgyMCwKKworMHgyMywgMHgzQiwgMHgzMywgMHhBRCwKKzB4MUUsIDB4MjYsIDB4MUUsIDB4REYsCisKKzB4QTcsIDB4MUUsIDB4NEYsIDB4RTksCisweDE3LCAweDI2LCAweDE2LCAweERGLAorCisweDJELCAweDIwLAorMHgwMCwgMHhFMCwKKzB4QTgsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MkYsIDB4MkYsIDB4MUUsIDB4QUYsCisweDI1LCAweDIwLAorMHgwMCwgMHhFMCwKKworMHhBNCwgMHgxNiwgMHg0RiwgMHhFOSwKKzB4MEYsIDB4QzAsIDB4MjEsIDB4QzIsCisKKzB4QTYsIDB4ODAsIDB4NEYsIDB4RTksCisweDFGLCAweDYyLCAweDU3LCAweDlGLAorCisweDBELCAweDIwLAorMHgwNSwgMHgyMCwKKzB4MkYsIDB4QzAsIDB4MjEsIDB4QzYsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjYsCisweDI1LCAweDQ0LCAweDU0LCAweEI2LAorCisweDNGLCAweDJGLCAweDVELCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEYsIDB4MjAsCisKKzB4MkQsIDB4MjAsCisweDI1LCAweDIwLAorMHgwNywgMHhDMCwgMHg0NCwgMHhDNiwKKworMHgxNywgMHg1MCwgMHg1NiwgMHg5RiwKKzB4QTUsIDB4MzcsIDB4NEYsIDB4RTksCisKKzB4MDYsIDB4QzAsIDB4MjEsIDB4QzQsCisweDBGLCAweDE3LCAweDBGLCAweEFGLAorCisweDM3LCAweDBGLCAweDVDLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxRSwgMHg2MiwgMHg1NywgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4M0UsIDB4M0QsIDB4NUQsIDB4OUYsCisweDAwLCAweEUwLAorMHgwNywgMHgyMCwKKworMHgyRiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweEEzLCAweDBGLCAweDRGLCAweEU5LAorCisweDA2LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4MUYsIDB4MjYsIDB4MUYsIDB4REYsCisKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisweEExLCAweDFGLCAweDRGLCAweEU5LAorCisweDFFLCAweDI2LCAweDFFLCAweERGLAorMHg5RCwgMHgxRSwgMHg0RiwgMHhFOSwKKworMHgzNSwgMHgxNywgMHg0RiwgMHhFOSwKKzB4QTIsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MDYsIDB4MDYsIDB4MUYsIDB4QUYsCisweDM5LCAweDM3LCAweDRGLCAweEU5LAorCisweDJGLCAweDJGLCAweDE3LCAweEFGLAorMHgwNywgMHgwNywgMHgxRSwgMHhBRiwKKworMHhBMCwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4OUUsIDB4M0UsIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4ODAsIDB4NEYsIDB4RTksCisweDlDLCAweDgwLCAweDRGLCAweEU5LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHg1NywgMHgzOSwgMHgyMCwgMHhFOSwKKworMHgxNiwgMHgyOCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4M0IsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MkIsIDB4MjAsIDB4RTksCisweDJCLCAweDMyLCAweDIwLCAweEU5LAorCisweDFDLCAweDIzLCAweDIwLCAweEU5LAorMHg1NywgMHgzNiwgMHgyMCwgMHhFOSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4NDAsIDB4NDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDkwLCAweEUyLAorMHgwMCwgMHhFMCwKKworMHg2MywgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MTksIDB4QzgsIDB4QzEsIDB4Q0QsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDlGLCAweDQxLCAweDQ5LCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MkQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MEQsIDB4ODAsIDB4MDcsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDM1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MjUsIDB4MzAsCisweDJELCAweDMwLAorCisweDM1LCAweDMwLAorMHhCNSwgMHgzMCwKKzB4QkQsIDB4MzAsCisweDNELCAweDMwLAorCisweDlDLCAweEE3LCAweDVCLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjIsIDB4RkYsIDB4MEEsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM5LCAweDQxLCAweEM4LCAweEVDLAorMHg0MiwgMHhFMSwKKzB4MDAsIDB4RTAsCisKKzB4NjAsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhDOCwgMHg0MCwgMHhDMCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NUQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nMjAwX3RnenNmW10gPSB7CisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDk4LCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MUYsIDB4RDcsIDB4MTgsIDB4QkQsCisweDNGLCAweEQ3LCAweDIyLCAweEJELAorCisweDgxLCAweDA0LAorMHg4OSwgMHgwNCwKKzB4MDEsIDB4MDQsCisweDA5LCAweDA0LAorCisweEM5LCAweDQxLCAweEMwLCAweEVDLAorMHgxMSwgMHgwNCwKKzB4MDAsIDB4RTAsCisKKzB4NDEsIDB4Q0MsIDB4NDEsIDB4Q0QsCisweDQ5LCAweENDLCAweDQ5LCAweENELAorCisweEQxLCAweDQxLCAweEMwLCAweEVDLAorMHg1MSwgMHhDQywgMHg1MSwgMHhDRCwKKworMHg4MCwgMHgwNCwKKzB4MTAsIDB4MDQsCisweDA4LCAweDA0LAorMHgwMCwgMHhFMCwKKworMHgwMCwgMHhDQywgMHhDMCwgMHhDRCwKKzB4RDEsIDB4NDksIDB4QzAsIDB4RUMsCisKKzB4OEEsIDB4MUYsIDB4MjAsIDB4RTksCisweDhCLCAweDNGLCAweDIwLCAweEU5LAorCisweDQxLCAweDNDLCAweDQxLCAweEFELAorMHg0OSwgMHgzQywgMHg0OSwgMHhBRCwKKworMHgxMCwgMHhDQywgMHgxMCwgMHhDRCwKKzB4MDgsIDB4Q0MsIDB4MDgsIDB4Q0QsCisKKzB4QjksIDB4NDEsIDB4NDksIDB4QkIsCisweDFGLCAweEYwLCAweDQxLCAweENELAorCisweDUxLCAweDNDLCAweDUxLCAweEFELAorMHgwMCwgMHg5OCwgMHg4MCwgMHhFOSwKKworMHg4RiwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4MUYsIDB4MjAsIDB4RTksCisKKzB4MjEsIDB4NDUsIDB4ODAsIDB4RTgsCisweDFBLCAweDRELCAweDgwLCAweEU4LAorCisweDMxLCAweDU1LCAweDgwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4MUQsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4MkUsIDB4NDEsIDB4MkEsIDB4QjgsCisweDM0LCAweDUzLCAweEEwLCAweEU4LAorCisweDE1LCAweDMwLAorMHgxRCwgMHgzMCwKKzB4NTgsIDB4RTMsCisweDAwLCAweEUwLAorCisweEI1LCAweDQwLCAweDQ4LCAweEJELAorMHgzRCwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgyNCwgMHg0MywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MTUsIDB4NzIsCisweDA5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4MUQsIDB4NzIsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4OTcsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDZDLCAweDY0LCAweEM4LCAweEVDLAorMHg5OCwgMHhFMSwKKzB4QjUsIDB4MDUsCisKKzB4QkQsIDB4MDUsCisweDJFLCAweDMwLAorMHgzMiwgMHhDMCwgMHhBMCwgMHhFOCwKKworMHgzMywgMHhDMCwgMHhBMCwgMHhFOCwKKzB4NzQsIDB4NjQsIDB4QzgsIDB4RUMsCisKKzB4NDAsIDB4M0MsIDB4NDAsIDB4QUQsCisweDMyLCAweDZBLAorMHgyQSwgMHgzMCwKKworMHgyMCwgMHg3MywKKzB4MzMsIDB4NkEsCisweDAwLCAweEUwLAorMHgyOCwgMHg3MywKKworMHgxQywgMHg3MiwKKzB4ODMsIDB4RTIsCisweDdCLCAweDgwLCAweDE1LCAweEVBLAorCisweEI4LCAweDNELCAweDI4LCAweERGLAorMHgzMCwgMHgzNSwgMHgyMCwgMHhERiwKKworMHg0MCwgMHgzMCwKKzB4MDAsIDB4RTAsCisweENDLCAweEUyLAorMHg2NCwgMHg3MiwKKworMHgyNSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MkQsIDB4NDIsIDB4NEEsIDB4QkYsCisKKzB4MzAsIDB4MkUsIDB4MzAsIDB4REYsCisweDM4LCAweDJFLCAweDM4LCAweERGLAorCisweDE4LCAweDFELCAweDQ1LCAweEU5LAorMHgxRSwgMHgxNSwgMHg0NSwgMHhFOSwKKworMHgyQiwgMHg0OSwgMHg1MSwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDFGLCAweDczLAorCisweDM4LCAweDM4LCAweDQwLCAweEFGLAorMHgzMCwgMHgzMCwgMHg0MCwgMHhBRiwKKworMHgyNCwgMHgxRiwgMHgyNCwgMHhERiwKKzB4MUQsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MkMsIDB4MUYsIDB4MkMsIDB4REYsCisweDFBLCAweDMzLCAweDIwLCAweEU5LAorCisweEIwLCAweDEwLAorMHgwOCwgMHhFMywKKzB4NDAsIDB4MTAsCisweEI4LCAweDEwLAorCisweDI2LCAweEYwLCAweDMwLCAweENELAorMHgyRiwgMHhGMCwgMHgzOCwgMHhDRCwKKworMHgyQiwgMHg4MCwgMHgyMCwgMHhFOSwKKzB4MkEsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4QTYsIDB4MjAsCisweDg4LCAweEUyLAorMHgwMCwgMHhFMCwKKzB4QUYsIDB4MjAsCisKKzB4MjgsIDB4MkEsIDB4MjYsIDB4QUYsCisweDIwLCAweDJBLCAweEMwLCAweEFGLAorCisweDM0LCAweDFGLCAweDM0LCAweERGLAorMHg0NiwgMHgyNCwgMHg0NiwgMHhERiwKKworMHgyOCwgMHgzMCwgMHg4MCwgMHhCRiwKKzB4MjAsIDB4MzgsIDB4ODAsIDB4QkYsCisKKzB4NDcsIDB4MjQsIDB4NDcsIDB4REYsCisweDRFLCAweDJDLCAweDRFLCAweERGLAorCisweDRGLCAweDJDLCAweDRGLCAweERGLAorMHg1NiwgMHgzNCwgMHg1NiwgMHhERiwKKworMHgyOCwgMHgxNSwgMHgyOCwgMHhERiwKKzB4MjAsIDB4MUQsIDB4MjAsIDB4REYsCisKKzB4NTcsIDB4MzQsIDB4NTcsIDB4REYsCisweDAwLCAweEUwLAorMHgxRCwgMHgwNSwKKworMHgwNCwgMHg4MCwgMHgxMCwgMHhFQSwKKzB4ODksIDB4RTIsCisweDJCLCAweDMwLAorCisweDNGLCAweEMxLCAweDFELCAweEJELAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QTAsIDB4NjgsCisweEJGLCAweDI1LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMCwgMHhDMCwgMHgyMCwgMHhBRiwKKzB4MjgsIDB4MDUsCisweDk3LCAweDc0LAorCisweDAwLCAweEUwLAorMHgyQSwgMHgxMCwKKzB4MTYsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MDQsIDB4ODAsIDB4MTAsIDB4RUEsCisweDhDLCAweEUyLAorMHg5NSwgMHgwNSwKKworMHgyOCwgMHhDMSwgMHgyOCwgMHhBRCwKKzB4MUYsIDB4QzEsIDB4MTUsIDB4QkQsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEE4LCAweDY3LAorMHg5RiwgMHg2QiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjgsIDB4QzAsIDB4MjgsIDB4QUQsCisweDFELCAweDI1LAorMHgyMCwgMHgwNSwKKworMHgyOCwgMHgzMiwgMHg4MCwgMHhBRCwKKzB4NDAsIDB4MkEsIDB4NDAsIDB4QkQsCisKKzB4MUMsIDB4ODAsIDB4MjAsIDB4RTksCisweDIwLCAweDMzLCAweDIwLCAweEFELAorCisweDIwLCAweDczLAorMHgwMCwgMHhFMCwKKzB4QjYsIDB4NDksIDB4NTEsIDB4QkIsCisKKzB4MjYsIDB4MkYsIDB4QjAsIDB4RTgsCisweDE5LCAweDIwLCAweDIwLCAweEU5LAorCisweDM1LCAweDIwLCAweDM1LCAweERGLAorMHgzRCwgMHgyMCwgMHgzRCwgMHhERiwKKworMHgxNSwgMHgyMCwgMHgxNSwgMHhERiwKKzB4MUQsIDB4MjAsIDB4MUQsIDB4REYsCisKKzB4MjYsIDB4RDAsIDB4MjYsIDB4Q0QsCisweDI5LCAweDQ5LCAweDJBLCAweEI4LAorCisweDI2LCAweDQwLCAweDgwLCAweEJELAorMHgzQiwgMHg0OCwgMHg1MCwgMHhCRCwKKworMHgzRSwgMHg1NCwgMHg1NywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDgyLCAweEUxLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNiwgMHgzMCwKKzB4MjksIDB4MzAsCisweDQ4LCAweDNDLCAweDQ4LCAweEFELAorCisweDJCLCAweDcyLAorMHhDMiwgMHhFMSwKKzB4MkMsIDB4QzAsIDB4NDQsIDB4QzIsCisKKzB4MDUsIDB4MjQsIDB4MzQsIDB4QkYsCisweDBELCAweDI0LCAweDJDLCAweEJGLAorCisweDJELCAweDQ2LCAweDRFLCAweEJGLAorMHgyNSwgMHg0NiwgMHg1NiwgMHhCRiwKKworMHgyMCwgMHgxRCwgMHg2RiwgMHg4RiwKKzB4MzIsIDB4M0UsIDB4NUYsIDB4RTksCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDAwLCAweEUwLAorMHgzQiwgMHgzMCwKKworMHgxRSwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzMsIDB4MUUsIDB4NUYsIDB4RTksCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjIsCisweDBELCAweDQ0LCAweDRDLCAweEIyLAorCisweDE5LCAweEMwLCAweEIwLCAweEU4LAorMHgzNCwgMHhDMCwgMHg0NCwgMHhDNCwKKworMHgzMywgMHg3MywKKzB4MDAsIDB4RTAsCisweDNFLCAweDYyLCAweDU3LCAweDlGLAorCisweDFFLCAweEFGLCAweDU5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4MjAsCisKKzB4ODQsIDB4M0UsIDB4NTgsIDB4RTksCisweDI4LCAweDFELCAweDZGLCAweDhGLAorCisweDA1LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4ODUsIDB4MUUsIDB4NTgsIDB4RTksCisKKzB4OUIsIDB4M0IsIDB4MzMsIDB4REYsCisweDIwLCAweDIwLCAweDQyLCAweEFGLAorCisweDMwLCAweDQyLCAweDU2LCAweDlGLAorMHg4MCwgMHgzRSwgMHg1NywgMHhFOSwKKworMHgzRiwgMHg4RiwgMHg1MSwgMHg5RiwKKzB4MzAsIDB4ODAsIDB4NUYsIDB4RTksCisKKzB4MjgsIDB4MjgsIDB4MjQsIDB4QUYsCisweDgxLCAweDFFLCAweDU3LCAweEU5LAorCisweDA1LCAweDQ3LCAweDU3LCAweEJGLAorMHgwRCwgMHg0NywgMHg0RiwgMHhCRiwKKworMHg4OCwgMHg4MCwgMHg1OCwgMHhFOSwKKzB4MUIsIDB4MjksIDB4MUIsIDB4REYsCisKKzB4MzAsIDB4MUQsIDB4NkYsIDB4OEYsCisweDNBLCAweDMwLCAweDRGLCAweEU5LAorCisweDFDLCAweDMwLCAweDI2LCAweERGLAorMHgwOSwgMHhFMywKKzB4M0IsIDB4MDUsCisKKzB4M0UsIDB4NTAsIDB4NTYsIDB4OUYsCisweDNCLCAweDNGLCAweDRGLCAweEU5LAorCisweDFFLCAweDhGLCAweDUxLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4QUMsIDB4MjAsCisKKzB4MkQsIDB4NDQsIDB4NEMsIDB4QjQsCisweDJDLCAweDFDLCAweEMwLCAweEFGLAorCisweDI1LCAweDQ0LCAweDU0LCAweEI0LAorMHgwMCwgMHhFMCwKKzB4QzgsIDB4MzAsCisKKzB4MzAsIDB4NDYsIDB4MzAsIDB4QUYsCisweDFCLCAweDFCLCAweDQ4LCAweEFGLAorCisweDAwLCAweEUwLAorMHgyNSwgMHgyMCwKKzB4MzgsIDB4MkMsIDB4NEYsIDB4RTksCisKKzB4ODYsIDB4ODAsIDB4NTcsIDB4RTksCisweDM4LCAweDFELCAweDZGLCAweDhGLAorCisweDI4LCAweDc0LAorMHgwMCwgMHhFMCwKKzB4MEQsIDB4NDQsIDB4NEMsIDB4QjAsCisKKzB4MDUsIDB4NDQsIDB4NTQsIDB4QjAsCisweDJELCAweDIwLAorMHg5QiwgMHgxMCwKKworMHg4MiwgMHgzRSwgMHg1NywgMHhFOSwKKzB4MzIsIDB4RjAsIDB4MUIsIDB4Q0QsCisKKzB4MUUsIDB4QkQsIDB4NTksIDB4OUYsCisweDgzLCAweDFFLCAweDU3LCAweEU5LAorCisweDM4LCAweDQ3LCAweDM4LCAweEFGLAorMHgzNCwgMHgyMCwKKzB4MkEsIDB4MzAsCisKKzB4MDAsIDB4RTAsCisweDBELCAweDIwLAorMHgzMiwgMHgyMCwKKzB4MDUsIDB4MjAsCisKKzB4ODcsIDB4ODAsIDB4NTcsIDB4RTksCisweDFGLCAweDU0LCAweDU3LCAweDlGLAorCisweDE3LCAweDQyLCAweDU2LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4M0IsIDB4NkEsCisKKzB4M0YsIDB4OEYsIDB4NTEsIDB4OUYsCisweDM3LCAweDFFLCAweDRGLCAweEU5LAorCisweDM3LCAweDMyLCAweDJBLCAweEFGLAorMHgwMCwgMHhFMCwKKzB4MzIsIDB4MDAsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDI3LCAweEMwLCAweDQ0LCAweEMwLAorCisweDM2LCAweDFGLCAweDRGLCAweEU5LAorMHgxRiwgMHgxRiwgMHgyNiwgMHhERiwKKworMHgzNywgMHgxQiwgMHgzNywgMHhCRiwKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisKKzB4M0UsIDB4MTcsIDB4NEYsIDB4RTksCisweDNGLCAweDNGLCAweDRGLCAweEU5LAorCisweDM0LCAweDFGLCAweDM0LCAweEFGLAorMHgyQiwgMHgwNSwKKzB4QTcsIDB4MjAsCisKKzB4MzMsIDB4MkIsIDB4MzcsIDB4REYsCisweDI3LCAweDE3LCAweEMwLCAweEFGLAorCisweDM0LCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyRCwgMHgyMSwgMHgxQSwgMHhCMCwKKzB4MjUsIDB4MjEsIDB4MzEsIDB4QjAsCisKKzB4MEQsIDB4MjEsIDB4MUEsIDB4QjIsCisweDA1LCAweDIxLCAweDMxLCAweEIyLAorCisweDAzLCAweDgwLCAweDJBLCAweEVBLAorMHgxNywgMHhDMSwgMHgyQiwgMHhCRCwKKworMHgyRCwgMHgyMCwKKzB4MjUsIDB4MjAsCisweDA1LCAweDIwLAorMHgwRCwgMHgyMCwKKworMHhCMywgMHg2OCwKKzB4OTcsIDB4MjUsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMzLCAweEMwLCAweDMzLCAweEFGLAorMHgyRiwgMHhDMCwgMHgyMSwgMHhDMCwKKworMHgxNiwgMHg0MiwgMHg1NiwgMHg5RiwKKzB4M0MsIDB4MjcsIDB4NEYsIDB4RTksCisKKzB4MUUsIDB4NjIsIDB4NTcsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDIxLCAweDMxLCAweEI0LAorMHgyRCwgMHgyMSwgMHgxQSwgMHhCNCwKKworMHgzRiwgMHgyRiwgMHg1RCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzMsIDB4MDUsCisweDAwLCAweEUwLAorMHgyOCwgMHgxOSwgMHg2MCwgMHhFQywKKworMHgwRCwgMHgyMSwgMHgxQSwgMHhCNiwKKzB4MDUsIDB4MjEsIDB4MzEsIDB4QjYsCisKKzB4MzcsIDB4MEYsIDB4NUMsIDB4OUYsCisweDAwLCAweEUwLAorMHgyRiwgMHgyMCwKKworMHgyMywgMHgzQiwgMHgzMywgMHhBRCwKKzB4MUUsIDB4MjYsIDB4MUUsIDB4REYsCisKKzB4QTcsIDB4MUUsIDB4NEYsIDB4RTksCisweDE3LCAweDI2LCAweDE2LCAweERGLAorCisweDJELCAweDIwLAorMHgwMCwgMHhFMCwKKzB4QTgsIDB4M0YsIDB4NEYsIDB4RTksCisKKzB4MkYsIDB4MkYsIDB4MUUsIDB4QUYsCisweDI1LCAweDIwLAorMHgwMCwgMHhFMCwKKworMHhBNCwgMHgxNiwgMHg0RiwgMHhFOSwKKzB4MEYsIDB4QzAsIDB4MjEsIDB4QzIsCisKKzB4QTYsIDB4ODAsIDB4NEYsIDB4RTksCisweDFGLCAweDYyLCAweDU3LCAweDlGLAorCisweDBELCAweDIwLAorMHgwNSwgMHgyMCwKKzB4MkYsIDB4QzAsIDB4MjEsIDB4QzYsCisKKzB4M0YsIDB4MkYsIDB4NUQsIDB4OUYsCisweDAwLCAweEUwLAorMHgwRiwgMHgyMCwKKworMHgxNywgMHg1MCwgMHg1NiwgMHg5RiwKKzB4QTUsIDB4MzcsIDB4NEYsIDB4RTksCisKKzB4MDYsIDB4QzAsIDB4MjEsIDB4QzQsCisweDBGLCAweDE3LCAweDBGLCAweEFGLAorCisweDM3LCAweDBGLCAweDVDLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyRiwgMHgyMCwKKzB4MDAsIDB4RTAsCisweEEzLCAweDgwLCAweDRGLCAweEU5LAorCisweDA2LCAweDIwLAorMHgwMCwgMHhFMCwKKzB4MUYsIDB4MjYsIDB4MUYsIDB4REYsCisKKzB4MTcsIDB4MjYsIDB4MTcsIDB4REYsCisweDM1LCAweDE3LCAweDRGLCAweEU5LAorCisweEExLCAweDFGLCAweDRGLCAweEU5LAorMHhBMiwgMHgzRiwgMHg0RiwgMHhFOSwKKworMHgwNiwgMHgwNiwgMHgxRiwgMHhBRiwKKzB4MzksIDB4MzcsIDB4NEYsIDB4RTksCisKKzB4MkYsIDB4MkYsIDB4MTcsIDB4QUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEEwLCAweDgwLCAweDRGLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMSwgMHg4MCwgMHg0RiwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDU3LCAweDM5LCAweDIwLCAweEU5LAorCisweDE2LCAweDI4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzQiwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgyQiwgMHgyMCwgMHhFOSwKKzB4MkIsIDB4MzIsIDB4MjAsIDB4RTksCisKKzB4MUMsIDB4MjMsIDB4MjAsIDB4RTksCisweDU3LCAweDM2LCAweDIwLCAweEU5LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHg0MCwgMHg0MCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4OTAsIDB4RTIsCisweDAwLCAweEUwLAorCisweDY4LCAweEZGLCAweDIwLCAweEVBLAorMHgxOSwgMHhDOCwgMHhDMSwgMHhDRCwKKworMHgxRiwgMHhENywgMHgxOCwgMHhCRCwKKzB4M0YsIDB4RDcsIDB4MjIsIDB4QkQsCisKKzB4OUYsIDB4NDEsIDB4NDksIDB4QkQsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDI1LCAweDQxLCAweDQ5LCAweEJELAorMHgyRCwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHgwRCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MzUsIDB4NDAsIDB4NDgsIDB4QkQsCisweDNELCAweDQwLCAweDUwLCAweEJELAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyNSwgMHgzMCwKKzB4MkQsIDB4MzAsCisKKzB4MzUsIDB4MzAsCisweEI1LCAweDMwLAorMHhCRCwgMHgzMCwKKzB4M0QsIDB4MzAsCisKKzB4OUMsIDB4QTcsIDB4NUIsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NywgMHhGRiwgMHgwQSwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QzksIDB4NDEsIDB4QzgsIDB4RUMsCisweDQyLCAweEUxLAorMHgwMCwgMHhFMCwKKworMHg2NSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEM4LCAweDQwLCAweEMwLCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2MiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdDJneltdID0geworCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDBBLCAweDQwLCAweDUwLCAweEJGLAorMHgyQSwgMHg0MCwgMHg2MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg1MSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweEQzLCAweDZCLAorMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyMywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDUxLCAweDA0LAorCisweDkwLCAweEUyLAorMHg2MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDM5LCAweDY3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NjEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg3OCwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MTAsIDB4MDQsCisweDIwLCAweDA0LAorCisweDYxLCAweDUxLCAweEUwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDUyLCAweEJGLAorMHgwRiwgMHg1MiwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg2MiwgMHhCRiwKKzB4MUUsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDBFLCAweDYxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDUwLCAweEJELAorMHgyMiwgMHg0MCwgMHg2MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg1MSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MEUsIDB4QkQsCisweDk3LCAweEUyLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHgzNSwgMHg0OCwgMHhCMSwgMHhFOCwKKzB4M0QsIDB4NTksIDB4QjEsIDB4RTgsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHgzMSwgMHg2NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisweDY3LCAweDM5LCAweDY3LCAweEJGLAorCisweDY5LCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgwMCwKKzB4M0QsIDB4MDAsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweDhELCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDc1LCAweEY4LCAweEVDLAorMHgzNSwgMHgyMCwKKzB4M0QsIDB4MjAsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDUzLCAweDUzLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDBFLCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NDgsIDB4MzUsIDB4NDgsIDB4QkYsCisweDU4LCAweDM1LCAweDU4LCAweEJGLAorCisweDY4LCAweDM1LCAweDY4LCAweEJGLAorMHg0OSwgMHgzRCwgMHg0OSwgMHhCRiwKKworMHg1OSwgMHgzRCwgMHg1OSwgMHhCRiwKKzB4NjksIDB4M0QsIDB4NjksIDB4QkYsCisKKzB4NjMsIDB4NjMsIDB4MkQsIDB4REYsCisweDRELCAweDdELCAweEY4LCAweEVDLAorCisweDU5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKworMHgzRiwgMHg1MywgMHhBMCwgMHhFOCwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDYzLCAweEEwLCAweEU4LAorCisweDUwLCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg1MCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgwRiwgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTksIDB4NzgsIDB4RjgsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg1NiwgMHgzRiwgMHg1NiwgMHhERiwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4NjYsIDB4M0QsIDB4NjYsIDB4REYsCisKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisweDY3LCAweDNELCAweDY3LCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRiwgMHg1NywgMHhERiwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTksIDB4M0YsIDB4NTksIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDY5LCAweDNELCAweDY5LCAweERGLAorCisweDQ4LCAweDM3LCAweDQ4LCAweERGLAorMHg1OCwgMHgzRiwgMHg1OCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM0LCAweDgwLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgwQSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NjQsIDB4QjAsCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjIsCisweDFBLCAweDQ0LCAweDY0LCAweEIyLAorCisweDI1LCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCNCwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjQsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NTYsIDB4QkYsCisweDFBLCAweDQ2LCAweDY2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNiwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg5RiwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhCRSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDdELCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6YVtdID0geworCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDBBLCAweDQwLCAweDUwLCAweEJGLAorMHgyQSwgMHg0MCwgMHg2MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg1MSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweEQzLCAweDZCLAorMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyMywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDUxLCAweDA0LAorCisweDkwLCAweEUyLAorMHg2MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDM5LCAweDY3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NjEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg3QywgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MTAsIDB4MDQsCisweDIwLCAweDA0LAorCisweDYxLCAweDUxLCAweEUwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDUyLCAweEJGLAorMHgwRiwgMHg1MiwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg2MiwgMHhCRiwKKzB4MUUsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDBFLCAweDYxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDUwLCAweEJELAorMHgyMiwgMHg0MCwgMHg2MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg1MSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MEUsIDB4QkQsCisweDk3LCAweEUyLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHgzNSwgMHg0OCwgMHhCMSwgMHhFOCwKKzB4M0QsIDB4NTksIDB4QjEsIDB4RTgsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHgzMSwgMHg2NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisweDY3LCAweDM5LCAweDY3LCAweEJGLAorCisweDZELCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgwMCwKKzB4M0QsIDB4MDAsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweDhELCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDc1LCAweEY4LCAweEVDLAorMHgzNSwgMHgyMCwKKzB4M0QsIDB4MjAsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDUzLCAweDUzLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDBFLCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NDgsIDB4MzUsIDB4NDgsIDB4QkYsCisweDU4LCAweDM1LCAweDU4LCAweEJGLAorCisweDY4LCAweDM1LCAweDY4LCAweEJGLAorMHg0OSwgMHgzRCwgMHg0OSwgMHhCRiwKKworMHg1OSwgMHgzRCwgMHg1OSwgMHhCRiwKKzB4NjksIDB4M0QsIDB4NjksIDB4QkYsCisKKzB4NjMsIDB4NjMsIDB4MkQsIDB4REYsCisweDRELCAweDdELCAweEY4LCAweEVDLAorCisweDU5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKworMHgzRiwgMHg1MywgMHhBMCwgMHhFOCwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDYzLCAweEEwLCAweEU4LAorCisweDUwLCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg1MCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgwRiwgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTksIDB4NzgsIDB4RjgsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg1NiwgMHgzRiwgMHg1NiwgMHhERiwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4NjYsIDB4M0QsIDB4NjYsIDB4REYsCisKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisweDY3LCAweDNELCAweDY3LCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRiwgMHg1NywgMHhERiwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTksIDB4M0YsIDB4NTksIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDY5LCAweDNELCAweDY5LCAweERGLAorCisweDQ4LCAweDM3LCAweDQ4LCAweERGLAorMHg1OCwgMHgzRiwgMHg1OCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM0LCAweDgwLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgwQSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NjQsIDB4QjAsCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjIsCisweDFBLCAweDQ0LCAweDY0LCAweEIyLAorCisweDI5LCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEYsIDB4Q0YsIDB4NzQsIDB4QzYsCisweDNELCAweENGLCAweDc0LCAweEMyLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjQsCisweDAyLCAweDQ0LCAweDY0LCAweEI0LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI2LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNiwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzgsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDYsIDB4NTYsIDB4QkYsCisweDFBLCAweDQ2LCAweDY2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM2LCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzNywgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg1MywgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NjMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDlELCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg5RSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0OCwgMHg1OCwgMHhCRiwKKzB4MDIsIDB4NDgsIDB4NjgsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgyQSwgMHg0OSwgMHg1OSwgMHhCRiwKKzB4MUEsIDB4NDksIDB4NjksIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4QkYsIDB4RUEsCisKKzB4ODAsIDB4MzAsIDB4NTcsIDB4RTksCisweDgxLCAweDM4LCAweDU3LCAweEU5LAorCisweDgyLCAweDMxLCAweDU3LCAweEU5LAorMHg4NiwgMHg3OCwgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOSwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzksIDB4NTcsIDB4RTksCisKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisweDhBLCAweDM0LCAweDIwLCAweEU5LAorCisweDhCLCAweDNDLCAweDIwLCAweEU5LAorMHgzNywgMHg1MCwgMHg2MCwgMHhCRCwKKworMHg1NywgMHgwRCwgMHgyMCwgMHhFOSwKKzB4MzUsIDB4NTEsIDB4NjEsIDB4QkQsCisKKzB4MkIsIDB4NTAsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MEUsIDB4NzcsCisKKzB4MjQsIDB4NTEsIDB4MjAsIDB4RTksCisweDlCLCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDBFLCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgwQiwgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTYsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjYsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ3LCAweEEwLCAweEU4LAorCisweDFDLCAweDU3LCAweEEwLCAweEU4LAorMHgyQywgMHg2NywgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NTcsIDB4ODAsIDB4NTcsIDB4Q0YsCisKKzB4NjYsIDB4MzMsIDB4NjYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg2NywgMHgzQiwgMHg2NywgMHhDRiwKKworMHgwQiwgMHg0OCwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTgsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjgsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ5LCAweEEwLCAweEU4LAorCisweDFDLCAweDU5LCAweEEwLCAweEU4LAorMHgyQywgMHg2OSwgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzQsIDB4RDcsIDB4MzQsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNDLCAweEQ3LCAweDNDLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzQsIDB4ODAsIDB4MzQsIDB4QkQsCisweDNDLCAweDgwLCAweDNDLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0OCwgMHg4MCwgMHg0OCwgMHhDRiwKKzB4NTksIDB4ODAsIDB4NTksIDB4Q0YsCisKKzB4NjgsIDB4MzMsIDB4NjgsIDB4Q0YsCisweDQ5LCAweDNCLCAweDQ5LCAweENGLAorCisweEJBLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OCwgMHgzMywgMHg1OCwgMHhDRiwKKzB4NjksIDB4M0IsIDB4NjksIDB4Q0YsCisKKzB4NzksIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3QyZ3phZltdID0geworCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDBBLCAweDQwLCAweDUwLCAweEJGLAorMHgyQSwgMHg0MCwgMHg2MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg1MSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweEQzLCAweDZCLAorMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyMywgMHg5RiwKKzB4MDAsIDB4RTAsCisweDUxLCAweDA0LAorCisweDkwLCAweEUyLAorMHg2MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDM5LCAweDY3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NjEsIDB4NDEsIDB4RTAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg4MSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MTAsIDB4MDQsCisweDIwLCAweDA0LAorCisweDYxLCAweDUxLCAweEUwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDUyLCAweEJGLAorMHgwRiwgMHg1MiwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg2MiwgMHhCRiwKKzB4MUUsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDBFLCAweDYxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDUwLCAweEJELAorMHgyMiwgMHg0MCwgMHg2MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg1MSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NjEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MEUsIDB4QkQsCisweDk3LCAweEUyLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHgzNSwgMHg0OCwgMHhCMSwgMHhFOCwKKzB4M0QsIDB4NTksIDB4QjEsIDB4RTgsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg2NiwgMHgzMSwgMHg2NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisweDY3LCAweDM5LCAweDY3LCAweEJGLAorCisweDcyLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHgzNSwgMHgwMCwKKzB4M0QsIDB4MDAsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweDhELCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDc1LCAweEY4LCAweEVDLAorMHgzNSwgMHgyMCwKKzB4M0QsIDB4MjAsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDUzLCAweDUzLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDBFLCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NDgsIDB4MzUsIDB4NDgsIDB4QkYsCisweDU4LCAweDM1LCAweDU4LCAweEJGLAorCisweDY4LCAweDM1LCAweDY4LCAweEJGLAorMHg0OSwgMHgzRCwgMHg0OSwgMHhCRiwKKworMHg1OSwgMHgzRCwgMHg1OSwgMHhCRiwKKzB4NjksIDB4M0QsIDB4NjksIDB4QkYsCisKKzB4NjMsIDB4NjMsIDB4MkQsIDB4REYsCisweDRELCAweDdELCAweEY4LCAweEVDLAorCisweDU5LCAweEUzLAorMHgwMCwgMHhFMCwKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKworMHgzRiwgMHg1MywgMHhBMCwgMHhFOCwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDYzLCAweEEwLCAweEU4LAorCisweDUwLCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg1MCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgwRiwgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTksIDB4NzgsIDB4RjgsIDB4RUMsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg1NiwgMHgzRiwgMHg1NiwgMHhERiwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4NjYsIDB4M0QsIDB4NjYsIDB4REYsCisKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisweDY3LCAweDNELCAweDY3LCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRiwgMHg1NywgMHhERiwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTksIDB4M0YsIDB4NTksIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDY5LCAweDNELCAweDY5LCAweERGLAorCisweDQ4LCAweDM3LCAweDQ4LCAweERGLAorMHg1OCwgMHgzRiwgMHg1OCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNCwgMHgzNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjIsCisweDFBLCAweDQ0LCAweDY0LCAweEIyLAorCisweDJFLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMiwKKzB4MEYsIDB4Q0YsIDB4NzQsIDB4QzYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjQsCisweDAyLCAweDQ0LCAweDY0LCAweEI0LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI2LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNiwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzgsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4M0QsIDB4Q0YsIDB4NzUsIDB4QzYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjYsCisweDAyLCAweDQ1LCAweDY1LCAweEI2LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4M0QsIDB4MjAsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgyQSwgMHg0NiwgMHg1NiwgMHhCRiwKKzB4MUEsIDB4NDYsIDB4NjYsIDB4QkYsCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNiwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlELCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg5RSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg1MywgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NjMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM1LCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzOSwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0OCwgMHg1OCwgMHhCRiwKKzB4MDIsIDB4NDgsIDB4NjgsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgyQSwgMHg0OSwgMHg1OSwgMHhCRiwKKzB4MUEsIDB4NDksIDB4NjksIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4QkYsIDB4RUEsCisKKzB4ODAsIDB4MzAsIDB4NTcsIDB4RTksCisweDgxLCAweDM4LCAweDU3LCAweEU5LAorCisweDgyLCAweDMxLCAweDU3LCAweEU5LAorMHg4NiwgMHg3OCwgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOSwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzksIDB4NTcsIDB4RTksCisKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisweDhBLCAweDM0LCAweDIwLCAweEU5LAorCisweDhCLCAweDNDLCAweDIwLCAweEU5LAorMHgzNywgMHg1MCwgMHg2MCwgMHhCRCwKKworMHg1NywgMHgwRCwgMHgyMCwgMHhFOSwKKzB4MzUsIDB4NTEsIDB4NjEsIDB4QkQsCisKKzB4MkIsIDB4NTAsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MEUsIDB4NzcsCisKKzB4MjQsIDB4NTEsIDB4MjAsIDB4RTksCisweDk2LCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDBFLCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgwQiwgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTYsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjYsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ3LCAweEEwLCAweEU4LAorCisweDFDLCAweDU3LCAweEEwLCAweEU4LAorMHgyQywgMHg2NywgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NTcsIDB4ODAsIDB4NTcsIDB4Q0YsCisKKzB4NjYsIDB4MzMsIDB4NjYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg2NywgMHgzQiwgMHg2NywgMHhDRiwKKworMHgwQiwgMHg0OCwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTgsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjgsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ5LCAweEEwLCAweEU4LAorCisweDFDLCAweDU5LCAweEEwLCAweEU4LAorMHgyQywgMHg2OSwgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzQsIDB4RDcsIDB4MzQsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNDLCAweEQ3LCAweDNDLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzQsIDB4ODAsIDB4MzQsIDB4QkQsCisweDNDLCAweDgwLCAweDNDLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0OCwgMHg4MCwgMHg0OCwgMHhDRiwKKzB4NTksIDB4ODAsIDB4NTksIDB4Q0YsCisKKzB4NjgsIDB4MzMsIDB4NjgsIDB4Q0YsCisweDQ5LCAweDNCLCAweDQ5LCAweENGLAorCisweEI1LCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OCwgMHgzMywgMHg1OCwgMHhDRiwKKzB4NjksIDB4M0IsIDB4NjksIDB4Q0YsCisKKzB4NzQsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3QyZ3pmW10gPSB7CisKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEEsIDB4NDAsIDB4NTAsIDB4QkYsCisweDJBLCAweDQwLCAweDYwLCAweEJGLAorCisweDMyLCAweDQxLCAweDUxLCAweEJGLAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4RDMsIDB4NkIsCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDIzLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NTEsIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDYxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzksIDB4NjcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg2MywgMHhBMCwgMHhFOCwKKworMHg2MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDdELCAweDgwLCAweDE1LCAweEVBLAorMHgxMCwgMHgwNCwKKzB4MjAsIDB4MDQsCisKKzB4NjEsIDB4NTEsIDB4RTAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDBGLCAweDUyLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDYyLCAweEJGLAorMHgxRSwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MEUsIDB4NjEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NTAsIDB4QkQsCisweDIyLCAweDQwLCAweDYwLCAweEJELAorCisweDEyLCAweDQxLCAweDUxLCAweEJELAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgwRSwgMHhCRCwKKzB4OTcsIDB4RTIsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDM1LCAweDQ4LCAweEIxLCAweEU4LAorMHgzRCwgMHg1OSwgMHhCMSwgMHhFOCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY2LCAweDMxLCAweDY2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKzB4NjcsIDB4MzksIDB4NjcsIDB4QkYsCisKKzB4NkUsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDM1LCAweDAwLAorMHgzRCwgMHgwMCwKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4OEQsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NzUsIDB4RjgsIDB4RUMsCisweDM1LCAweDIwLAorMHgzRCwgMHgyMCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MEUsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg0OCwgMHgzNSwgMHg0OCwgMHhCRiwKKzB4NTgsIDB4MzUsIDB4NTgsIDB4QkYsCisKKzB4NjgsIDB4MzUsIDB4NjgsIDB4QkYsCisweDQ5LCAweDNELCAweDQ5LCAweEJGLAorCisweDU5LCAweDNELCAweDU5LCAweEJGLAorMHg2OSwgMHgzRCwgMHg2OSwgMHhCRiwKKworMHg2MywgMHg2MywgMHgyRCwgMHhERiwKKzB4NEQsIDB4N0QsIDB4RjgsIDB4RUMsCisKKzB4NTksIDB4RTMsCisweDAwLCAweEUwLAorMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorCisweDNGLCAweDUzLCAweEEwLCAweEU4LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NTAsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDUwLCAweDNDLCAweEU5LAorCisweDFGLCAweDBGLCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OSwgMHg3OCwgMHhGOCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDU2LCAweDNGLCAweDU2LCAweERGLAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHg2NiwgMHgzRCwgMHg2NiwgMHhERiwKKworMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKzB4NjcsIDB4M0QsIDB4NjcsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNGLCAweDU3LCAweERGLAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1OSwgMHgzRiwgMHg1OSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NjksIDB4M0QsIDB4NjksIDB4REYsCisKKzB4NDgsIDB4MzcsIDB4NDgsIDB4REYsCisweDU4LCAweDNGLCAweDU4LCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4NjgsIDB4M0QsIDB4NjgsIDB4REYsCisweDQ5LCAweDM3LCAweDQ5LCAweERGLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzQsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwRiwgMHhDRiwgMHg3NSwgMHhDNiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjAsCisweDAyLCAweDQ0LCAweDY0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDU0LCAweEIyLAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCMiwKKworMHgyOCwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDNELCAweENGLCAweDc0LCAweEMyLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzEsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NTQsIDB4QjQsCisweDAyLCAweDQ0LCAweDY0LCAweEI0LAorCisweDJBLCAweDQ1LCAweDU1LCAweEI2LAorMHgxQSwgMHg0NSwgMHg2NSwgMHhCNiwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzgsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDYsIDB4NTYsIDB4QkYsCisweDFBLCAweDQ2LCAweDY2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM2LCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzNywgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg1MywgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NjMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM1LCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzOSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0OCwgMHg1OCwgMHhCRiwKKzB4MDIsIDB4NDgsIDB4NjgsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgyQSwgMHg0OSwgMHg1OSwgMHhCRiwKKzB4MUEsIDB4NDksIDB4NjksIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4QkYsIDB4RUEsCisKKzB4ODAsIDB4MzAsIDB4NTcsIDB4RTksCisweDgxLCAweDM4LCAweDU3LCAweEU5LAorCisweDgyLCAweDMxLCAweDU3LCAweEU5LAorMHg4NiwgMHg3OCwgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOSwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzksIDB4NTcsIDB4RTksCisKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisweDhBLCAweDM0LCAweDIwLCAweEU5LAorCisweDhCLCAweDNDLCAweDIwLCAweEU5LAorMHgzNywgMHg1MCwgMHg2MCwgMHhCRCwKKworMHg1NywgMHgwRCwgMHgyMCwgMHhFOSwKKzB4MzUsIDB4NTEsIDB4NjEsIDB4QkQsCisKKzB4MkIsIDB4NTAsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MEUsIDB4NzcsCisKKzB4MjQsIDB4NTEsIDB4MjAsIDB4RTksCisweDlBLCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDBFLCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgwQiwgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTYsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjYsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ3LCAweEEwLCAweEU4LAorCisweDFDLCAweDU3LCAweEEwLCAweEU4LAorMHgyQywgMHg2NywgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NTcsIDB4ODAsIDB4NTcsIDB4Q0YsCisKKzB4NjYsIDB4MzMsIDB4NjYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg2NywgMHgzQiwgMHg2NywgMHhDRiwKKworMHgwQiwgMHg0OCwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTgsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjgsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ5LCAweEEwLCAweEU4LAorCisweDFDLCAweDU5LCAweEEwLCAweEU4LAorMHgyQywgMHg2OSwgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzQsIDB4RDcsIDB4MzQsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNDLCAweEQ3LCAweDNDLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzQsIDB4ODAsIDB4MzQsIDB4QkQsCisweDNDLCAweDgwLCAweDNDLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0OCwgMHg4MCwgMHg0OCwgMHhDRiwKKzB4NTksIDB4ODAsIDB4NTksIDB4Q0YsCisKKzB4NjgsIDB4MzMsIDB4NjgsIDB4Q0YsCisweDQ5LCAweDNCLCAweDQ5LCAweENGLAorCisweEJCLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OCwgMHgzMywgMHg1OCwgMHhDRiwKKzB4NjksIDB4M0IsIDB4NjksIDB4Q0YsCisKKzB4NzgsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3QyZ3pzW10gPSB7CisKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEEsIDB4NDAsIDB4NTAsIDB4QkYsCisweDJBLCAweDQwLCAweDYwLCAweEJGLAorCisweDMyLCAweDQxLCAweDUxLCAweEJGLAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4RDMsIDB4NkIsCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDIzLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NTEsIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDYxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzksIDB4NjcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg2MywgMHhBMCwgMHhFOCwKKworMHg2MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDg1LCAweDgwLCAweDE1LCAweEVBLAorMHgxMCwgMHgwNCwKKzB4MjAsIDB4MDQsCisKKzB4NjEsIDB4NTEsIDB4RTAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDBGLCAweDUyLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDYyLCAweEJGLAorMHgxRSwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MEUsIDB4NjEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NTAsIDB4QkQsCisweDIyLCAweDQwLCAweDYwLCAweEJELAorCisweDEyLCAweDQxLCAweDUxLCAweEJELAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgwRSwgMHhCRCwKKzB4OTcsIDB4RTIsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDM1LCAweDQ4LCAweEIxLCAweEU4LAorMHgzRCwgMHg1OSwgMHhCMSwgMHhFOCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY2LCAweDMxLCAweDY2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKzB4NjcsIDB4MzksIDB4NjcsIDB4QkYsCisKKzB4NzYsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDM1LCAweDAwLAorMHgzRCwgMHgwMCwKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4OEQsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NzUsIDB4RjgsIDB4RUMsCisweDM1LCAweDIwLAorMHgzRCwgMHgyMCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MEUsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg0OCwgMHgzNSwgMHg0OCwgMHhCRiwKKzB4NTgsIDB4MzUsIDB4NTgsIDB4QkYsCisKKzB4NjgsIDB4MzUsIDB4NjgsIDB4QkYsCisweDQ5LCAweDNELCAweDQ5LCAweEJGLAorCisweDU5LCAweDNELCAweDU5LCAweEJGLAorMHg2OSwgMHgzRCwgMHg2OSwgMHhCRiwKKworMHg2MywgMHg2MywgMHgyRCwgMHhERiwKKzB4NEQsIDB4N0QsIDB4RjgsIDB4RUMsCisKKzB4NTksIDB4RTMsCisweDAwLCAweEUwLAorMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorCisweDNGLCAweDUzLCAweEEwLCAweEU4LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NTAsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDUwLCAweDNDLCAweEU5LAorCisweDFGLCAweDBGLCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OSwgMHg3OCwgMHhGOCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDU2LCAweDNGLCAweDU2LCAweERGLAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHg2NiwgMHgzRCwgMHg2NiwgMHhERiwKKworMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKzB4NjcsIDB4M0QsIDB4NjcsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNGLCAweDU3LCAweERGLAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1OSwgMHgzRiwgMHg1OSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NjksIDB4M0QsIDB4NjksIDB4REYsCisKKzB4NDgsIDB4MzcsIDB4NDgsIDB4REYsCisweDU4LCAweDNGLCAweDU4LCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDBGLCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NjQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjIsCisweDFBLCAweDQ0LCAweDY0LCAweEIyLAorCisweDMxLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEYsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI0LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg1NSwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NjUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDU1LCAweEIyLAorMHgxQSwgMHg0NSwgMHg2NSwgMHhCMiwKKworMHgwQSwgMHg0NSwgMHg1NSwgMHhCNCwKKzB4MDIsIDB4NDUsIDB4NjUsIDB4QjQsCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDJBLCAweDQ2LCAweDU2LCAweEJGLAorMHgxQSwgMHg0NiwgMHg2NiwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBNywgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTgsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg5MiwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhCMiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDcwLCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Mmd6c2FbXSA9IHsKKworMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwQSwgMHg0MCwgMHg1MCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NjAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NTEsIDB4QkYsCisweDNBLCAweDQxLCAweDYxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhEMywgMHg2QiwKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjMsIDB4OUYsCisweDAwLCAweEUwLAorMHg1MSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NjEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDUxLCAweDQxLCAweEUwLCAweEVDLAorMHgzOSwgMHg2NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDYzLCAweEEwLCAweEU4LAorCisweDYxLCAweDQxLCAweEUwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4OEEsIDB4ODAsIDB4MTUsIDB4RUEsCisweDEwLCAweDA0LAorMHgyMCwgMHgwNCwKKworMHg2MSwgMHg1MSwgMHhFMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MEYsIDB4NTIsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NjIsIDB4QkYsCisweDFFLCAweDUxLCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgwRSwgMHg2MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg1MCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NjAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NTEsIDB4QkQsCisweDNBLCAweDQxLCAweDYxLCAweEJELAorCisweEJGLCAweDJGLCAweDBFLCAweEJELAorMHg5NywgMHhFMiwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4MzUsIDB4NDgsIDB4QjEsIDB4RTgsCisweDNELCAweDU5LCAweEIxLCAweEU4LAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjYsIDB4MzEsIDB4NjYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorMHg2NywgMHgzOSwgMHg2NywgMHhCRiwKKworMHg3QiwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MDAsCisweDNELCAweDAwLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHg4RCwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg3NSwgMHhGOCwgMHhFQywKKzB4MzUsIDB4MjAsCisweDNELCAweDIwLAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgwRSwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDQ4LCAweDM1LCAweDQ4LCAweEJGLAorMHg1OCwgMHgzNSwgMHg1OCwgMHhCRiwKKworMHg2OCwgMHgzNSwgMHg2OCwgMHhCRiwKKzB4NDksIDB4M0QsIDB4NDksIDB4QkYsCisKKzB4NTksIDB4M0QsIDB4NTksIDB4QkYsCisweDY5LCAweDNELCAweDY5LCAweEJGLAorCisweDYzLCAweDYzLCAweDJELCAweERGLAorMHg0RCwgMHg3RCwgMHhGOCwgMHhFQywKKworMHg1OSwgMHhFMywKKzB4MDAsIDB4RTAsCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisKKzB4M0YsIDB4NTMsIDB4QTAsIDB4RTgsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg2MywgMHhBMCwgMHhFOCwKKworMHg1MCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NTAsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MEYsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU5LCAweDc4LCAweEY4LCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NTYsIDB4M0YsIDB4NTYsIDB4REYsCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDY2LCAweDNELCAweDY2LCAweERGLAorCisweDFELCAweDMyLCAweDQxLCAweEU5LAorMHg2NywgMHgzRCwgMHg2NywgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0YsIDB4NTcsIDB4REYsCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU5LCAweDNGLCAweDU5LCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg2OSwgMHgzRCwgMHg2OSwgMHhERiwKKworMHg0OCwgMHgzNywgMHg0OCwgMHhERiwKKzB4NTgsIDB4M0YsIDB4NTgsIDB4REYsCisKKzB4NjgsIDB4M0QsIDB4NjgsIDB4REYsCisweDQ5LCAweDM3LCAweDQ5LCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4MEYsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDBBLCAweDQ0LCAweDU0LCAweEIwLAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzQsIDB4MzcsIDB4MjAsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM4LCAweDBGLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjIsCisKKzB4MzYsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgwRiwgMHhDRiwgMHg3NSwgMHhDMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4M0QsIDB4Q0YsIDB4NzUsIDB4QzIsCisweDM3LCAweENGLCAweDc1LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNiwgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTMsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjQsCisweDFBLCAweDQ0LCAweDY0LCAweEI0LAorCisweDBBLCAweDQ1LCAweDU1LCAweEIwLAorMHgwMiwgMHg0NSwgMHg2NSwgMHhCMCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweEEwLCAweDM3LCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDNFLCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzRiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDU1LCAweEIyLAorMHgxQSwgMHg0NSwgMHg2NSwgMHhCMiwKKworMHgwQSwgMHg0NSwgMHg1NSwgMHhCNCwKKzB4MDIsIDB4NDUsIDB4NjUsIDB4QjQsCisKKzB4MEYsIDB4Q0YsIDB4NzQsIDB4QzYsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBNywgMHgzMCwgMHg0RiwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg5QywgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTgsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjYsCisweDFBLCAweDQ0LCAweDY0LCAweEI2LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNiwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgyQSwgMHg0NiwgMHg1NiwgMHhCRiwKKzB4MUEsIDB4NDYsIDB4NjYsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEE0LCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBNSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MDIsIDB4NDcsIDB4NjcsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEExLCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBMiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg1MywgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NjMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDlELCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg5RSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0OCwgMHg1OCwgMHhCRiwKKzB4MDIsIDB4NDgsIDB4NjgsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgyQSwgMHg0OSwgMHg1OSwgMHhCRiwKKzB4MUEsIDB4NDksIDB4NjksIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4QkYsIDB4RUEsCisKKzB4ODAsIDB4MzAsIDB4NTcsIDB4RTksCisweDgxLCAweDM4LCAweDU3LCAweEU5LAorCisweDgyLCAweDMxLCAweDU3LCAweEU5LAorMHg4NiwgMHg3OCwgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOSwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzksIDB4NTcsIDB4RTksCisKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisweDhBLCAweDM0LCAweDIwLCAweEU5LAorCisweDhCLCAweDNDLCAweDIwLCAweEU5LAorMHgzNywgMHg1MCwgMHg2MCwgMHhCRCwKKworMHg1NywgMHgwRCwgMHgyMCwgMHhFOSwKKzB4MzUsIDB4NTEsIDB4NjEsIDB4QkQsCisKKzB4MkIsIDB4NTAsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MEUsIDB4NzcsCisKKzB4MjQsIDB4NTEsIDB4MjAsIDB4RTksCisweDhELCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDBFLCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgwQiwgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTYsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjYsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ3LCAweEEwLCAweEU4LAorCisweDFDLCAweDU3LCAweEEwLCAweEU4LAorMHgyQywgMHg2NywgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NTcsIDB4ODAsIDB4NTcsIDB4Q0YsCisKKzB4NjYsIDB4MzMsIDB4NjYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg2NywgMHgzQiwgMHg2NywgMHhDRiwKKworMHgwQiwgMHg0OCwgMHhBMCwgMHhFOCwKKzB4MUIsIDB4NTgsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NjgsIDB4QTAsIDB4RTgsCisweDBDLCAweDQ5LCAweEEwLCAweEU4LAorCisweDFDLCAweDU5LCAweEEwLCAweEU4LAorMHgyQywgMHg2OSwgMHhBMCwgMHhFOCwKKworMHgwQiwgMHgwMCwKKzB4MUIsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQywgMHgwMCwKKzB4MUMsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHg2NSwKKzB4MUIsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQywgMHg2NSwKKzB4MUMsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgwQiwgMHgxQiwgMHg2MCwgMHhFQywKKzB4MzQsIDB4RDcsIDB4MzQsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDBDLCAweDFDLCAweDYwLCAweEVDLAorCisweDNDLCAweEQ3LCAweDNDLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgwQiwgMHgyQiwgMHhERSwgMHhFOCwKKzB4MUIsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzQsIDB4ODAsIDB4MzQsIDB4QkQsCisweDNDLCAweDgwLCAweDNDLCAweEJELAorCisweDMzLCAweEQ3LCAweDBCLCAweEJELAorMHgzQiwgMHhENywgMHgxQiwgMHhCRCwKKworMHg0OCwgMHg4MCwgMHg0OCwgMHhDRiwKKzB4NTksIDB4ODAsIDB4NTksIDB4Q0YsCisKKzB4NjgsIDB4MzMsIDB4NjgsIDB4Q0YsCisweDQ5LCAweDNCLCAweDQ5LCAweENGLAorCisweEFELCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OCwgMHgzMywgMHg1OCwgMHhDRiwKKzB4NjksIDB4M0IsIDB4NjksIDB4Q0YsCisKKzB4NkIsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3QyZ3pzYWZbXSA9IHsKKworMHgwMCwgMHg4QSwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwQSwgMHg0MCwgMHg1MCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NjAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NTEsIDB4QkYsCisweDNBLCAweDQxLCAweDYxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhEMywgMHg2QiwKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjMsIDB4OUYsCisweDAwLCAweEUwLAorMHg1MSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NjEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDUxLCAweDQxLCAweEUwLCAweEVDLAorMHgzOSwgMHg2NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDYzLCAweEEwLCAweEU4LAorCisweDYxLCAweDQxLCAweEUwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4OEUsIDB4ODAsIDB4MTUsIDB4RUEsCisweDEwLCAweDA0LAorMHgyMCwgMHgwNCwKKworMHg2MSwgMHg1MSwgMHhFMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MEYsIDB4NTIsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NjIsIDB4QkYsCisweDFFLCAweDUxLCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgwRSwgMHg2MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg1MCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NjAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NTEsIDB4QkQsCisweDNBLCAweDQxLCAweDYxLCAweEJELAorCisweEJGLCAweDJGLCAweDBFLCAweEJELAorMHg5NywgMHhFMiwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4MzUsIDB4NDgsIDB4QjEsIDB4RTgsCisweDNELCAweDU5LCAweEIxLCAweEU4LAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NjYsIDB4MzEsIDB4NjYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorMHg2NywgMHgzOSwgMHg2NywgMHhCRiwKKworMHg3RiwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4MzUsIDB4MDAsCisweDNELCAweDAwLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHg4RCwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg3NSwgMHhGOCwgMHhFQywKKzB4MzUsIDB4MjAsCisweDNELCAweDIwLAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgwRSwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDQ4LCAweDM1LCAweDQ4LCAweEJGLAorMHg1OCwgMHgzNSwgMHg1OCwgMHhCRiwKKworMHg2OCwgMHgzNSwgMHg2OCwgMHhCRiwKKzB4NDksIDB4M0QsIDB4NDksIDB4QkYsCisKKzB4NTksIDB4M0QsIDB4NTksIDB4QkYsCisweDY5LCAweDNELCAweDY5LCAweEJGLAorCisweDYzLCAweDYzLCAweDJELCAweERGLAorMHg0RCwgMHg3RCwgMHhGOCwgMHhFQywKKworMHg1OSwgMHhFMywKKzB4MDAsIDB4RTAsCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisKKzB4M0YsIDB4NTMsIDB4QTAsIDB4RTgsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg2MywgMHhBMCwgMHhFOCwKKworMHg1MCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NTAsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MEYsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU5LCAweDc4LCAweEY4LCAweEVDLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NTYsIDB4M0YsIDB4NTYsIDB4REYsCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDY2LCAweDNELCAweDY2LCAweERGLAorCisweDFELCAweDMyLCAweDQxLCAweEU5LAorMHg2NywgMHgzRCwgMHg2NywgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0YsIDB4NTcsIDB4REYsCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU5LCAweDNGLCAweDU5LCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg2OSwgMHgzRCwgMHg2OSwgMHhERiwKKworMHg0OCwgMHgzNywgMHg0OCwgMHhERiwKKzB4NTgsIDB4M0YsIDB4NTgsIDB4REYsCisKKzB4NjgsIDB4M0QsIDB4NjgsIDB4REYsCisweDQ5LCAweDM3LCAweDQ5LCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4MEYsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDBBLCAweDQ0LCAweDU0LCAweEIwLAorMHgwMiwgMHg0NCwgMHg2NCwgMHhCMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzQsIDB4MzcsIDB4MjAsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM4LCAweDBGLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg1NCwgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NjQsIDB4QjIsCisKKzB4M0EsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgwRiwgMHhDRiwgMHg3NSwgMHhDMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4M0QsIDB4Q0YsIDB4NzUsIDB4QzIsCisweDM3LCAweENGLCAweDc1LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNiwgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTMsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjQsCisweDFBLCAweDQ0LCAweDY0LCAweEI0LAorCisweDBBLCAweDQ1LCAweDU1LCAweEIwLAorMHgwMiwgMHg0NSwgMHg2NSwgMHhCMCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweEEwLCAweDM3LCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDNFLCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzRiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDU1LCAweEIyLAorMHgxQSwgMHg0NSwgMHg2NSwgMHhCMiwKKworMHgwQSwgMHg0NSwgMHg1NSwgMHhCNCwKKzB4MDIsIDB4NDUsIDB4NjUsIDB4QjQsCisKKzB4MEYsIDB4Q0YsIDB4NzQsIDB4QzYsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBNywgMHgzMCwgMHg0RiwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg5QywgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTgsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjYsCisweDFBLCAweDQ0LCAweDY0LCAweEI2LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNiwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjYsCisweDAyLCAweDQ1LCAweDY1LCAweEI2LAorCisweDNELCAweENGLCAweDc1LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NTYsIDB4QkYsCisweDFBLCAweDQ2LCAweDY2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4M0QsIDB4MjAsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgwQSwgMHg0NywgMHg1NywgMHhCRiwKKzB4MDIsIDB4NDcsIDB4NjcsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweEExLCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHhBMiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDlFLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDUzLCAweEJGLAorMHgxQSwgMHg0MywgMHg2MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzUsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM5LCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ4LCAweDU4LCAweEJGLAorMHgwMiwgMHg0OCwgMHg2OCwgMHhCRiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDJBLCAweDQ5LCAweDU5LCAweEJGLAorMHgxQSwgMHg0OSwgMHg2OSwgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHhCRiwgMHhFQSwKKworMHg4MCwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODEsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4ODIsIDB4MzEsIDB4NTcsIDB4RTksCisweDg2LCAweDc4LCAweDU3LCAweEU5LAorCisweDgzLCAweDM5LCAweDU3LCAweEU5LAorMHg4NywgMHg3OSwgMHg1NywgMHhFOSwKKworMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKzB4OEEsIDB4MzQsIDB4MjAsIDB4RTksCisKKzB4OEIsIDB4M0MsIDB4MjAsIDB4RTksCisweDM3LCAweDUwLCAweDYwLCAweEJELAorCisweDU3LCAweDBELCAweDIwLCAweEU5LAorMHgzNSwgMHg1MSwgMHg2MSwgMHhCRCwKKworMHgyQiwgMHg1MCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgwRSwgMHg3NywKKworMHgyNCwgMHg1MSwgMHgyMCwgMHhFOSwKKzB4ODksIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MEUsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDBCLCAweDQ2LCAweEEwLCAweEU4LAorMHgxQiwgMHg1NiwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2NiwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTcsIDB4QTAsIDB4RTgsCisweDJDLCAweDY3LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg1NywgMHg4MCwgMHg1NywgMHhDRiwKKworMHg2NiwgMHgzMywgMHg2NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDY3LCAweDNCLCAweDY3LCAweENGLAorCisweDBCLCAweDQ4LCAweEEwLCAweEU4LAorMHgxQiwgMHg1OCwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg2OCwgMHhBMCwgMHhFOCwKKzB4MEMsIDB4NDksIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4NTksIDB4QTAsIDB4RTgsCisweDJDLCAweDY5LCAweEEwLCAweEU4LAorCisweDBCLCAweDAwLAorMHgxQiwgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBDLCAweDAwLAorMHgxQywgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDBCLCAweDY1LAorMHgxQiwgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBDLCAweDY1LAorMHgxQywgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDBCLCAweDFCLCAweDYwLCAweEVDLAorMHgzNCwgMHhENywgMHgzNCwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MEMsIDB4MUMsIDB4NjAsIDB4RUMsCisKKzB4M0MsIDB4RDcsIDB4M0MsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDBCLCAweDJCLCAweERFLCAweEU4LAorMHgxQiwgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNCwgMHg4MCwgMHgzNCwgMHhCRCwKKzB4M0MsIDB4ODAsIDB4M0MsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MEIsIDB4QkQsCisweDNCLCAweEQ3LCAweDFCLCAweEJELAorCisweDQ4LCAweDgwLCAweDQ4LCAweENGLAorMHg1OSwgMHg4MCwgMHg1OSwgMHhDRiwKKworMHg2OCwgMHgzMywgMHg2OCwgMHhDRiwKKzB4NDksIDB4M0IsIDB4NDksIDB4Q0YsCisKKzB4QTksIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU4LCAweDMzLCAweDU4LCAweENGLAorMHg2OSwgMHgzQiwgMHg2OSwgMHhDRiwKKworMHg2NywgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdDJnenNmW10gPSB7CisKKzB4MDAsIDB4OEEsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MEEsIDB4NDAsIDB4NTAsIDB4QkYsCisweDJBLCAweDQwLCAweDYwLCAweEJGLAorCisweDMyLCAweDQxLCAweDUxLCAweEJGLAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4RDMsIDB4NkIsCisweDAwLCAweDhBLCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDIzLCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NTEsIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDYxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzksIDB4NjcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg2MywgMHhBMCwgMHhFOCwKKworMHg2MSwgMHg0MSwgMHhFMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDhBLCAweDgwLCAweDE1LCAweEVBLAorMHgxMCwgMHgwNCwKKzB4MjAsIDB4MDQsCisKKzB4NjEsIDB4NTEsIDB4RTAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDBGLCAweDUyLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDYyLCAweEJGLAorMHgxRSwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MEUsIDB4NjEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NTAsIDB4QkQsCisweDIyLCAweDQwLCAweDYwLCAweEJELAorCisweDEyLCAweDQxLCAweDUxLCAweEJELAorMHgzQSwgMHg0MSwgMHg2MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgwRSwgMHhCRCwKKzB4OTcsIDB4RTIsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDM1LCAweDQ4LCAweEIxLCAweEU4LAorMHgzRCwgMHg1OSwgMHhCMSwgMHhFOCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDY2LCAweDMxLCAweDY2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKzB4NjcsIDB4MzksIDB4NjcsIDB4QkYsCisKKzB4N0IsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDM1LCAweDAwLAorMHgzRCwgMHgwMCwKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4OEQsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NzUsIDB4RjgsIDB4RUMsCisweDM1LCAweDIwLAorMHgzRCwgMHgyMCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MEUsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg0OCwgMHgzNSwgMHg0OCwgMHhCRiwKKzB4NTgsIDB4MzUsIDB4NTgsIDB4QkYsCisKKzB4NjgsIDB4MzUsIDB4NjgsIDB4QkYsCisweDQ5LCAweDNELCAweDQ5LCAweEJGLAorCisweDU5LCAweDNELCAweDU5LCAweEJGLAorMHg2OSwgMHgzRCwgMHg2OSwgMHhCRiwKKworMHg2MywgMHg2MywgMHgyRCwgMHhERiwKKzB4NEQsIDB4N0QsIDB4RjgsIDB4RUMsCisKKzB4NTksIDB4RTMsCisweDAwLCAweEUwLAorMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorCisweDNGLCAweDUzLCAweEEwLCAweEU4LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NjMsIDB4QTAsIDB4RTgsCisKKzB4NTAsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDUwLCAweDNDLCAweEU5LAorCisweDFGLCAweDBGLCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1OSwgMHg3OCwgMHhGOCwgMHhFQywKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDU2LCAweDNGLCAweDU2LCAweERGLAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHg2NiwgMHgzRCwgMHg2NiwgMHhERiwKKworMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKzB4NjcsIDB4M0QsIDB4NjcsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNGLCAweDU3LCAweERGLAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1OSwgMHgzRiwgMHg1OSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NjksIDB4M0QsIDB4NjksIDB4REYsCisKKzB4NDgsIDB4MzcsIDB4NDgsIDB4REYsCisweDU4LCAweDNGLCAweDU4LCAweERGLAorCisweDY4LCAweDNELCAweDY4LCAweERGLAorMHg0OSwgMHgzNywgMHg0OSwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDBGLCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg1NCwgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NjQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgwRiwgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NTQsIDB4QjIsCisweDFBLCAweDQ0LCAweDY0LCAweEIyLAorCisweDM2LCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MEYsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDU0LCAweEI0LAorMHgxQSwgMHg0NCwgMHg2NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg1NSwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NjUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg1NSwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NjUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NTUsIDB4QjQsCisweDAyLCAweDQ1LCAweDY1LCAweEI0LAorCisweDBGLCAweENGLCAweDc1LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzEsIDB4MEYsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDU1LCAweEI2LAorMHgxQSwgMHg0NSwgMHg2NSwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NTYsIDB4QkYsCisweDFBLCAweDQ2LCAweDY2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NTcsIDB4QkYsCisweDAyLCAweDQ3LCAweDY3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NTMsIDB4QkYsCisweDFBLCAweDQzLCAweDYzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDgsIDB4NTgsIDB4QkYsCisweDAyLCAweDQ4LCAweDY4LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MkEsIDB4NDksIDB4NTksIDB4QkYsCisweDFBLCAweDQ5LCAweDY5LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweEJGLCAweEVBLAorCisweDgwLCAweDMwLCAweDU3LCAweEU5LAorMHg4MSwgMHgzOCwgMHg1NywgMHhFOSwKKworMHg4MiwgMHgzMSwgMHg1NywgMHhFOSwKKzB4ODYsIDB4NzgsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzksIDB4NTcsIDB4RTksCisweDg3LCAweDc5LCAweDU3LCAweEU5LAorCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorMHg4QSwgMHgzNCwgMHgyMCwgMHhFOSwKKworMHg4QiwgMHgzQywgMHgyMCwgMHhFOSwKKzB4MzcsIDB4NTAsIDB4NjAsIDB4QkQsCisKKzB4NTcsIDB4MEQsIDB4MjAsIDB4RTksCisweDM1LCAweDUxLCAweDYxLCAweEJELAorCisweDJCLCAweDUwLCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDBFLCAweDc3LAorCisweDI0LCAweDUxLCAweDIwLCAweEU5LAorMHg4RCwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgwRSwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MEIsIDB4NDYsIDB4QTAsIDB4RTgsCisweDFCLCAweDU2LCAweEEwLCAweEU4LAorCisweDJCLCAweDY2LCAweEEwLCAweEU4LAorMHgwQywgMHg0NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1NywgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjcsIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDU3LCAweDgwLCAweDU3LCAweENGLAorCisweDY2LCAweDMzLCAweDY2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NjcsIDB4M0IsIDB4NjcsIDB4Q0YsCisKKzB4MEIsIDB4NDgsIDB4QTAsIDB4RTgsCisweDFCLCAweDU4LCAweEEwLCAweEU4LAorCisweDJCLCAweDY4LCAweEEwLCAweEU4LAorMHgwQywgMHg0OSwgMHhBMCwgMHhFOCwKKworMHgxQywgMHg1OSwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NjksIDB4QTAsIDB4RTgsCisKKzB4MEIsIDB4MDAsCisweDFCLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4MDAsCisweDFDLCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4NjUsCisweDFCLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEMsIDB4NjUsCisweDFDLCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MEIsIDB4MUIsIDB4NjAsIDB4RUMsCisweDM0LCAweEQ3LCAweDM0LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgwQywgMHgxQywgMHg2MCwgMHhFQywKKworMHgzQywgMHhENywgMHgzQywgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MEIsIDB4MkIsIDB4REUsIDB4RTgsCisweDFCLCAweDgwLCAweERFLCAweEU4LAorCisweDM0LCAweDgwLCAweDM0LCAweEJELAorMHgzQywgMHg4MCwgMHgzQywgMHhCRCwKKworMHgzMywgMHhENywgMHgwQiwgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MUIsIDB4QkQsCisKKzB4NDgsIDB4ODAsIDB4NDgsIDB4Q0YsCisweDU5LCAweDgwLCAweDU5LCAweENGLAorCisweDY4LCAweDMzLCAweDY4LCAweENGLAorMHg0OSwgMHgzQiwgMHg0OSwgMHhDRiwKKworMHhBRCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTgsIDB4MzMsIDB4NTgsIDB4Q0YsCisweDY5LCAweDNCLCAweDY5LCAweENGLAorCisweDZCLCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Z3pbXSA9IHsKKworMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCisweEZGLCAweDgwLCAweEMwLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyMiwgMHg0MCwgMHg0OCwgMHhCRiwKKzB4MkEsIDB4NDAsIDB4NTAsIDB4QkYsCisKKzB4MzIsIDB4NDEsIDB4NDksIDB4QkYsCisweDNBLCAweDQxLCAweDUxLCAweEJGLAorCisweEMzLCAweDZCLAorMHhDQiwgMHg2QiwKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDk2LCAweEUyLAorMHg0MSwgMHgwNCwKKworMHg3QiwgMHg0MywgMHhBMCwgMHhFOCwKKzB4NzMsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4QUQsIDB4RUUsIDB4MjksIDB4OUYsCisweDAwLCAweEUwLAorMHg0OSwgMHgwNCwKKworMHg5MCwgMHhFMiwKKzB4NTEsIDB4MDQsCisweDMxLCAweDQ2LCAweEIxLCAweEU4LAorCisweDQ5LCAweDQxLCAweEMwLCAweEVDLAorMHgzOSwgMHg1NywgMHhCMSwgMHhFOCwKKworMHgwMCwgMHgwNCwKKzB4NDYsIDB4RTIsCisweDczLCAweDUzLCAweEEwLCAweEU4LAorCisweDUxLCAweDQxLCAweEMwLCAweEVDLAorMHgzMSwgMHgwMCwKKzB4MzksIDB4MDAsCisKKzB4NTgsIDB4ODAsIDB4MTUsIDB4RUEsCisweDA4LCAweDA0LAorMHgxMCwgMHgwNCwKKworMHg1MSwgMHg0OSwgMHhDMCwgMHhFQywKKzB4MkYsIDB4NDEsIDB4NjAsIDB4RUEsCisKKzB4MzEsIDB4MjAsCisweDM5LCAweDIwLAorMHgxRiwgMHg0MiwgMHhBMCwgMHhFOCwKKworMHgyQSwgMHg0MiwgMHg0QSwgMHhCRiwKKzB4MjcsIDB4NEEsIDB4QTAsIDB4RTgsCisKKzB4MUEsIDB4NDIsIDB4NTIsIDB4QkYsCisweDFFLCAweDQ5LCAweDYwLCAweEVBLAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHgyNiwgMHg1MSwgMHg2MCwgMHhFQSwKKworMHgzMiwgMHg0MCwgMHg0OCwgMHhCRCwKKzB4MjIsIDB4NDAsIDB4NTAsIDB4QkQsCisKKzB4MTIsIDB4NDEsIDB4NDksIDB4QkQsCisweDNBLCAweDQxLCAweDUxLCAweEJELAorCisweEJGLCAweDJGLCAweDI2LCAweEJELAorMHgwMCwgMHhFMCwKKzB4N0IsIDB4NzIsCisKKzB4MzIsIDB4MjAsCisweDIyLCAweDIwLAorMHgxMiwgMHgyMCwKKzB4M0EsIDB4MjAsCisKKzB4NDYsIDB4MzEsIDB4NDYsIDB4QkYsCisweDRFLCAweDMxLCAweDRFLCAweEJGLAorCisweEIzLCAweEUyLCAweDJELCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg1NiwgMHgzMSwgMHg1NiwgMHhCRiwKKzB4NDcsIDB4MzksIDB4NDcsIDB4QkYsCisKKzB4NEYsIDB4MzksIDB4NEYsIDB4QkYsCisweDU3LCAweDM5LCAweDU3LCAweEJGLAorCisweDRBLCAweDgwLCAweDA3LCAweEVBLAorMHgyNCwgMHg0MSwgMHgyMCwgMHhFOSwKKworMHg0MiwgMHg3MywgMHhGOCwgMHhFQywKKzB4MDAsIDB4RTAsCisweDJELCAweDczLAorCisweDMzLCAweDcyLAorMHgwQywgMHhFMywKKzB4QTUsIDB4MkYsIDB4MUUsIDB4QkQsCisKKzB4NDMsIDB4NDMsIDB4MkQsIDB4REYsCisweDRCLCAweDRCLCAweDJELCAweERGLAorCisweEFFLCAweDFFLCAweDI2LCAweEJELAorMHg1OCwgMHhFMywKKzB4MzMsIDB4NjYsCisKKzB4NTMsIDB4NTMsIDB4MkQsIDB4REYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweEI4LCAweDM4LCAweDMzLCAweEJGLAorMHgwMCwgMHhFMCwKKzB4NTksIDB4RTMsCisKKzB4MUUsIDB4MTIsIDB4NDEsIDB4RTksCisweDFBLCAweDIyLCAweDQxLCAweEU5LAorCisweDJCLCAweDQwLCAweDNELCAweEU5LAorMHgzRiwgMHg0QiwgMHhBMCwgMHhFOCwKKworMHgyRCwgMHg3MywKKzB4MzAsIDB4NzYsCisweDA1LCAweDgwLCAweDNELCAweEVBLAorCisweDM3LCAweDQzLCAweEEwLCAweEU4LAorMHgzRCwgMHg1MywgMHhBMCwgMHhFOCwKKworMHg0OCwgMHg3MCwgMHhGOCwgMHhFQywKKzB4MkIsIDB4NDgsIDB4M0MsIDB4RTksCisKKzB4MUYsIDB4MjcsIDB4QkMsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE4LCAweDNBLCAweDQxLCAweEU5LAorMHgxRCwgMHgzMiwgMHg0MSwgMHhFOSwKKworMHgyQSwgMHg0MCwgMHgyMCwgMHhFOSwKKzB4NTYsIDB4M0QsIDB4NTYsIDB4REYsCisKKzB4NDYsIDB4MzcsIDB4NDYsIDB4REYsCisweDRFLCAweDNGLCAweDRFLCAweERGLAorCisweDE2LCAweDMwLCAweDIwLCAweEU5LAorMHg0RiwgMHgzRiwgMHg0RiwgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzcsIDB4Q0YsIDB4NzQsIDB4QzQsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM0LCAweDgwLCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjIsCisweDFBLCAweDQ0LCAweDU0LCAweEIyLAorCisweDFELCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjQsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NEIsIDB4QkYsCisweDFBLCAweDQzLCAweDUzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNiwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgzNywgMHg0OCwgMHg1MCwgMHhCRCwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweDIwLCAweEU5LAorCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKzB4MzUsIDB4NDksIDB4NTEsIDB4QkQsCisKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorMHg1NywgMHgyNSwgMHgyMCwgMHhFOSwKKworMHgyQiwgMHg0OCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgyNiwgMHg3NywKKworMHgyNCwgMHg0OSwgMHgyMCwgMHhFOSwKKzB4QUYsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MjYsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDFDLCAweDQ2LCAweEEwLCAweEU4LAorMHgyMywgMHg0RSwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg1NiwgMHhBMCwgMHhFOCwKKzB4MUQsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MjQsIDB4NEYsIDB4QTAsIDB4RTgsCisweDJDLCAweDU3LCAweEEwLCAweEU4LAorCisweDFDLCAweDAwLAorMHgyMywgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFELCAweDAwLAorMHgyNCwgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFDLCAweDY1LAorMHgyMywgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFELCAweDY1LAorMHgyNCwgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFDLCAweDIzLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MUQsIDB4MjQsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDFDLCAweDJCLCAweERFLCAweEU4LAorMHgyMywgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MUMsIDB4QkQsCisweDNCLCAweEQ3LCAweDIzLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg0RiwgMHg4MCwgMHg0RiwgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4RDYsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDRFLCAweDMzLCAweDRFLCAweENGLAorMHg1NywgMHgzQiwgMHg1NywgMHhDRiwKKworMHg5RCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdGd6YVtdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg1QywgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NEUsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNELCAweDU3LCAweERGLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzQsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDI3LCAweENGLCAweDc0LCAweEM2LAorMHgzRCwgMHhDRiwgMHg3NCwgMHhDMiwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjIsCisweDFBLCAweDQ0LCAweDU0LCAweEIyLAorCisweDIwLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg5QywgMHgyNywgMHgyMCwgMHhFOSwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCNCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjQsCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjYsCisweDFBLCAweDQ0LCAweDU0LCAweEI2LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzOCwgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgwQSwgMHg0NywgMHg0RiwgMHhCRiwKKzB4MDIsIDB4NDcsIDB4NTcsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNFLCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzRiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MUEsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzYsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM3LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDRCLCAweEJGLAorMHgxQSwgMHg0MywgMHg1MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4OUQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDlFLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MzcsIDB4NDgsIDB4NTAsIDB4QkQsCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHgyMCwgMHhFOSwKKworMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisweDM1LCAweDQ5LCAweDUxLCAweEJELAorCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKworMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKzB4NTcsIDB4MjUsIDB4MjAsIDB4RTksCisKKzB4MkIsIDB4NDgsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MjYsIDB4NzcsCisKKzB4MjQsIDB4NDksIDB4MjAsIDB4RTksCisweEFCLCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDI2LCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgxQywgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MjMsIDB4NEUsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NTYsIDB4QTAsIDB4RTgsCisweDFELCAweDQ3LCAweEEwLCAweEU4LAorCisweDI0LCAweDRGLCAweEEwLCAweEU4LAorMHgyQywgMHg1NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHgwMCwKKzB4MjMsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHgwMCwKKzB4MjQsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxQywgMHg2NSwKKzB4MjMsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHg2NSwKKzB4MjQsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxQywgMHgyMywgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDFELCAweDI0LCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgxQywgMHgyQiwgMHhERSwgMHhFOCwKKzB4MjMsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDFDLCAweEJELAorMHgzQiwgMHhENywgMHgyMywgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NEYsIDB4ODAsIDB4NEYsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweEQzLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg0RSwgMHgzMywgMHg0RSwgMHhDRiwKKzB4NTcsIDB4M0IsIDB4NTcsIDB4Q0YsCisKKzB4OTksIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3RnemFmW10gPSB7CisKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjIsIDB4NDAsIDB4NDgsIDB4QkYsCisweDJBLCAweDQwLCAweDUwLCAweEJGLAorCisweDMyLCAweDQxLCAweDQ5LCAweEJGLAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4Q0IsIDB4NkIsCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDRCLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDI5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NDksIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDUxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg0OSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzksIDB4NTcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDYxLCAweDgwLCAweDE1LCAweEVBLAorMHgwOCwgMHgwNCwKKzB4MTAsIDB4MDQsCisKKzB4NTEsIDB4NDksIDB4QzAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NEEsIDB4QkYsCisweDI3LCAweDRBLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDUyLCAweEJGLAorMHgxRSwgMHg0OSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MjYsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NDgsIDB4QkQsCisweDIyLCAweDQwLCAweDUwLCAweEJELAorCisweDEyLCAweDQxLCAweDQ5LCAweEJELAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgyNiwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg0RSwgMHgzMSwgMHg0RSwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDRGLCAweDM5LCAweDRGLCAweEJGLAorMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKworMHg1MywgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4NDIsIDB4NzMsIDB4RjgsIDB4RUMsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweEE1LCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg0QiwgMHg0QiwgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgyNiwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDUzLCAweDUzLCAweDJELCAweERGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKzB4MDAsIDB4RTAsCisweDU5LCAweEUzLAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4M0YsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NDgsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDQ4LCAweDNDLCAweEU5LAorCisweDFGLCAweDI3LCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU2LCAweDNELCAweDU2LCAweERGLAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg0RSwgMHgzRiwgMHg0RSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NEYsIDB4M0YsIDB4NEYsIDB4REYsCisKKzB4MzIsIDB4MzIsIDB4MkQsIDB4REYsCisweDIyLCAweDIyLCAweDJELCAweERGLAorCisweDEyLCAweDEyLCAweDJELCAweERGLAorMHgzQSwgMHgzQSwgMHgyRCwgMHhERiwKKworMHg0NywgMHgzNywgMHg0NywgMHhERiwKKzB4NTcsIDB4M0QsIDB4NTcsIDB4REYsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDBBLCAweDQ0LCAweDRDLCAweEIwLAorMHgwMiwgMHg0NCwgMHg1NCwgMHhCMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzQsIDB4MzcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNDLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEIyLAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCMiwKKworMHgyNiwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDI3LCAweENGLCAweDc0LCAweEM2LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDlDLCAweDI3LCAweDIwLCAweEU5LAorCisweDBBLCAweDQ0LCAweDRDLCAweEI0LAorMHgwMiwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCNiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjYsCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDM4LCAweDNELCAweDIwLCAweEU5LAorCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDNELCAweENGLCAweDc1LCAweEM2LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0UsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNGLCAweDM4LCAweDRGLCAweEU5LAorCisweDBBLCAweDQ1LCAweDRELCAweEI2LAorMHgwMiwgMHg0NSwgMHg1NSwgMHhCNiwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDMxLCAweDNELCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDBBLCAweDQ3LCAweDRGLCAweEJGLAorMHgwMiwgMHg0NywgMHg1NywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM4LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg5RCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4OUUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NEIsIDB4QkYsCisweDFBLCAweDQzLCAweDUzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzksIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgzNywgMHg0OCwgMHg1MCwgMHhCRCwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweDIwLCAweEU5LAorCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKzB4MzUsIDB4NDksIDB4NTEsIDB4QkQsCisKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorMHg1NywgMHgyNSwgMHgyMCwgMHhFOSwKKworMHgyQiwgMHg0OCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgyNiwgMHg3NywKKworMHgyNCwgMHg0OSwgMHgyMCwgMHhFOSwKKzB4QTYsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MjYsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDFDLCAweDQ2LCAweEEwLCAweEU4LAorMHgyMywgMHg0RSwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg1NiwgMHhBMCwgMHhFOCwKKzB4MUQsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MjQsIDB4NEYsIDB4QTAsIDB4RTgsCisweDJDLCAweDU3LCAweEEwLCAweEU4LAorCisweDFDLCAweDAwLAorMHgyMywgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFELCAweDAwLAorMHgyNCwgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFDLCAweDY1LAorMHgyMywgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFELCAweDY1LAorMHgyNCwgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFDLCAweDIzLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MUQsIDB4MjQsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDFDLCAweDJCLCAweERFLCAweEU4LAorMHgyMywgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MUMsIDB4QkQsCisweDNCLCAweEQ3LCAweDIzLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg0RiwgMHg4MCwgMHg0RiwgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4Q0QsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDRFLCAweDMzLCAweDRFLCAweENGLAorMHg1NywgMHgzQiwgMHg1NywgMHhDRiwKKworMHg5NCwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdGd6ZltdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg1RCwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NEYsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNELCAweDU3LCAweERGLAorCisweDNELCAweENGLCAweDc0LCAweEMwLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzQsIDB4ODAsIDB4MjAsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDg4LCAweDczLCAweDVFLCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgyNywgMHhDRiwgMHg3NSwgMHhDNiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjAsCisweDAyLCAweDQ0LCAweDU0LCAweEIwLAorCisweDJBLCAweDQ0LCAweDRDLCAweEIyLAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCMiwKKworMHgyMCwgMHg4MCwgMHgzQSwgMHhFQSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDNELCAweENGLCAweDc0LCAweEMyLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDMyLCAweDMxLCAweDVGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzMywgMHgzOSwgMHg1RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4MzEsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4NDQsIDB4NEMsIDB4QjQsCisweDAyLCAweDQ0LCAweDU0LCAweEI0LAorCisweDJBLCAweDQ1LCAweDRELCAweEI2LAorMHgxQSwgMHg0NSwgMHg1NSwgMHhCNiwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzgsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzQSwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM2LCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzNywgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg0QiwgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NTMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM1LCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzOSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDM3LCAweDQ4LCAweDUwLCAweEJELAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4MjAsIDB4RTksCisKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorMHgzNSwgMHg0OSwgMHg1MSwgMHhCRCwKKworMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisweDU3LCAweDI1LCAweDIwLCAweEU5LAorCisweDJCLCAweDQ4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDI2LCAweDc3LAorCisweDI0LCAweDQ5LCAweDIwLCAweEU5LAorMHhBQSwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgyNiwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MUMsIDB4NDYsIDB4QTAsIDB4RTgsCisweDIzLCAweDRFLCAweEEwLCAweEU4LAorCisweDJCLCAweDU2LCAweEEwLCAweEU4LAorMHgxRCwgMHg0NywgMHhBMCwgMHhFOCwKKworMHgyNCwgMHg0RiwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NTcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4MDAsCisweDIzLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4MDAsCisweDI0LCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4NjUsCisweDIzLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4NjUsCisweDI0LCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4MjMsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgxRCwgMHgyNCwgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MUMsIDB4MkIsIDB4REUsIDB4RTgsCisweDIzLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgxQywgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MjMsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDRGLCAweDgwLCAweDRGLCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHhEMywgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NEUsIDB4MzMsIDB4NEUsIDB4Q0YsCisweDU3LCAweDNCLCAweDU3LCAweENGLAorCisweDk4LCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Z3pzW10gPSB7CisKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjIsIDB4NDAsIDB4NDgsIDB4QkYsCisweDJBLCAweDQwLCAweDUwLCAweEJGLAorCisweDMyLCAweDQxLCAweDQ5LCAweEJGLAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4Q0IsIDB4NkIsCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDRCLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDI5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NDksIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDUxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg0OSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzksIDB4NTcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDY1LCAweDgwLCAweDE1LCAweEVBLAorMHgwOCwgMHgwNCwKKzB4MTAsIDB4MDQsCisKKzB4NTEsIDB4NDksIDB4QzAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NEEsIDB4QkYsCisweDI3LCAweDRBLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDUyLCAweEJGLAorMHgxRSwgMHg0OSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MjYsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NDgsIDB4QkQsCisweDIyLCAweDQwLCAweDUwLCAweEJELAorCisweDEyLCAweDQxLCAweDQ5LCAweEJELAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgyNiwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg0RSwgMHgzMSwgMHg0RSwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDRGLCAweDM5LCAweDRGLCAweEJGLAorMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKworMHg1NywgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4NDIsIDB4NzMsIDB4RjgsIDB4RUMsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweEE1LCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg0QiwgMHg0QiwgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgyNiwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDUzLCAweDUzLCAweDJELCAweERGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKzB4MDAsIDB4RTAsCisweDU5LCAweEUzLAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4M0YsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NDgsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDQ4LCAweDNDLCAweEU5LAorCisweDFGLCAweDI3LCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU2LCAweDNELCAweDU2LCAweERGLAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg0RSwgMHgzRiwgMHg0RSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NEYsIDB4M0YsIDB4NEYsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNELCAweDU3LCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4MjcsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDBBLCAweDQ0LCAweDRDLCAweEIwLAorMHgwMiwgMHg0NCwgMHg1NCwgMHhCMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzQsIDB4MzcsIDB4MjAsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM4LCAweDI3LCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjIsCisKKzB4MjksIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgyNywgMHhDRiwgMHg3NSwgMHhDMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4M0QsIDB4Q0YsIDB4NzUsIDB4QzIsCisweDM3LCAweENGLCAweDc1LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNiwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTMsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjQsCisweDFBLCAweDQ0LCAweDU0LCAweEI0LAorCisweDBBLCAweDQ1LCAweDRELCAweEIwLAorMHgwMiwgMHg0NSwgMHg1NSwgMHhCMCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweEEwLCAweDM3LCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDNFLCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzRiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDUsIDB4NEQsIDB4QjIsCisweDFBLCAweDQ1LCAweDU1LCAweEIyLAorCisweDBBLCAweDQ1LCAweDRELCAweEI0LAorMHgwMiwgMHg0NSwgMHg1NSwgMHhCNCwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4M0IsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzNiwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweEE3LCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHhBOCwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0NywgMHg0RiwgMHhCRiwKKzB4MDIsIDB4NDcsIDB4NTcsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEE0LCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBNSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg0QiwgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NTMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweEExLCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHhBMiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDM3LCAweDQ4LCAweDUwLCAweEJELAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4MjAsIDB4RTksCisKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorMHgzNSwgMHg0OSwgMHg1MSwgMHhCRCwKKworMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisweDU3LCAweDI1LCAweDIwLCAweEU5LAorCisweDJCLCAweDQ4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDI2LCAweDc3LAorCisweDI0LCAweDQ5LCAweDIwLCAweEU5LAorMHhBMiwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgyNiwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MUMsIDB4NDYsIDB4QTAsIDB4RTgsCisweDIzLCAweDRFLCAweEEwLCAweEU4LAorCisweDJCLCAweDU2LCAweEEwLCAweEU4LAorMHgxRCwgMHg0NywgMHhBMCwgMHhFOCwKKworMHgyNCwgMHg0RiwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NTcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4MDAsCisweDIzLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4MDAsCisweDI0LCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4NjUsCisweDIzLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4NjUsCisweDI0LCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4MjMsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgxRCwgMHgyNCwgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MUMsIDB4MkIsIDB4REUsIDB4RTgsCisweDIzLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgxQywgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MjMsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDRGLCAweDgwLCAweDRGLCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHhDQSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NEUsIDB4MzMsIDB4NEUsIDB4Q0YsCisweDU3LCAweDNCLCAweDU3LCAweENGLAorCisweDkwLCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdhcnBfZzQwMF90Z3pzYVtdID0geworCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKKzB4RkYsIDB4ODAsIDB4QzAsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDIyLCAweDQwLCAweDQ4LCAweEJGLAorMHgyQSwgMHg0MCwgMHg1MCwgMHhCRiwKKworMHgzMiwgMHg0MSwgMHg0OSwgMHhCRiwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkYsCisKKzB4QzMsIDB4NkIsCisweENCLCAweDZCLAorMHgwMCwgMHg4OCwgMHg5OCwgMHhFOSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4OTYsIDB4RTIsCisweDQxLCAweDA0LAorCisweDdCLCAweDQzLCAweEEwLCAweEU4LAorMHg3MywgMHg0QiwgMHhBMCwgMHhFOCwKKworMHhBRCwgMHhFRSwgMHgyOSwgMHg5RiwKKzB4MDAsIDB4RTAsCisweDQ5LCAweDA0LAorCisweDkwLCAweEUyLAorMHg1MSwgMHgwNCwKKzB4MzEsIDB4NDYsIDB4QjEsIDB4RTgsCisKKzB4NDksIDB4NDEsIDB4QzAsIDB4RUMsCisweDM5LCAweDU3LCAweEIxLCAweEU4LAorCisweDAwLCAweDA0LAorMHg0NiwgMHhFMiwKKzB4NzMsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NTEsIDB4NDEsIDB4QzAsIDB4RUMsCisweDMxLCAweDAwLAorMHgzOSwgMHgwMCwKKworMHg2QSwgMHg4MCwgMHgxNSwgMHhFQSwKKzB4MDgsIDB4MDQsCisweDEwLCAweDA0LAorCisweDUxLCAweDQ5LCAweEMwLCAweEVDLAorMHgyRiwgMHg0MSwgMHg2MCwgMHhFQSwKKworMHgzMSwgMHgyMCwKKzB4MzksIDB4MjAsCisweDFGLCAweDQyLCAweEEwLCAweEU4LAorCisweDJBLCAweDQyLCAweDRBLCAweEJGLAorMHgyNywgMHg0QSwgMHhBMCwgMHhFOCwKKworMHgxQSwgMHg0MiwgMHg1MiwgMHhCRiwKKzB4MUUsIDB4NDksIDB4NjAsIDB4RUEsCisKKzB4NzMsIDB4N0IsIDB4QzgsIDB4RUMsCisweDI2LCAweDUxLCAweDYwLCAweEVBLAorCisweDMyLCAweDQwLCAweDQ4LCAweEJELAorMHgyMiwgMHg0MCwgMHg1MCwgMHhCRCwKKworMHgxMiwgMHg0MSwgMHg0OSwgMHhCRCwKKzB4M0EsIDB4NDEsIDB4NTEsIDB4QkQsCisKKzB4QkYsIDB4MkYsIDB4MjYsIDB4QkQsCisweDAwLCAweEUwLAorMHg3QiwgMHg3MiwKKworMHgzMiwgMHgyMCwKKzB4MjIsIDB4MjAsCisweDEyLCAweDIwLAorMHgzQSwgMHgyMCwKKworMHg0NiwgMHgzMSwgMHg0NiwgMHhCRiwKKzB4NEUsIDB4MzEsIDB4NEUsIDB4QkYsCisKKzB4QjMsIDB4RTIsIDB4MkQsIDB4OUYsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDU2LCAweDMxLCAweDU2LCAweEJGLAorMHg0NywgMHgzOSwgMHg0NywgMHhCRiwKKworMHg0RiwgMHgzOSwgMHg0RiwgMHhCRiwKKzB4NTcsIDB4MzksIDB4NTcsIDB4QkYsCisKKzB4NUMsIDB4ODAsIDB4MDcsIDB4RUEsCisweDI0LCAweDQxLCAweDIwLCAweEU5LAorCisweDQyLCAweDczLCAweEY4LCAweEVDLAorMHgwMCwgMHhFMCwKKzB4MkQsIDB4NzMsCisKKzB4MzMsIDB4NzIsCisweDBDLCAweEUzLAorMHhBNSwgMHgyRiwgMHgxRSwgMHhCRCwKKworMHg0MywgMHg0MywgMHgyRCwgMHhERiwKKzB4NEIsIDB4NEIsIDB4MkQsIDB4REYsCisKKzB4QUUsIDB4MUUsIDB4MjYsIDB4QkQsCisweDU4LCAweEUzLAorMHgzMywgMHg2NiwKKworMHg1MywgMHg1MywgMHgyRCwgMHhERiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4QjgsIDB4MzgsIDB4MzMsIDB4QkYsCisweDAwLCAweEUwLAorMHg1OSwgMHhFMywKKworMHgxRSwgMHgxMiwgMHg0MSwgMHhFOSwKKzB4MUEsIDB4MjIsIDB4NDEsIDB4RTksCisKKzB4MkIsIDB4NDAsIDB4M0QsIDB4RTksCisweDNGLCAweDRCLCAweEEwLCAweEU4LAorCisweDJELCAweDczLAorMHgzMCwgMHg3NiwKKzB4MDUsIDB4ODAsIDB4M0QsIDB4RUEsCisKKzB4MzcsIDB4NDMsIDB4QTAsIDB4RTgsCisweDNELCAweDUzLCAweEEwLCAweEU4LAorCisweDQ4LCAweDcwLCAweEY4LCAweEVDLAorMHgyQiwgMHg0OCwgMHgzQywgMHhFOSwKKworMHgxRiwgMHgyNywgMHhCQywgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisKKzB4MTgsIDB4M0EsIDB4NDEsIDB4RTksCisweDFELCAweDMyLCAweDQxLCAweEU5LAorCisweDJBLCAweDQwLCAweDIwLCAweEU5LAorMHg1NiwgMHgzRCwgMHg1NiwgMHhERiwKKworMHg0NiwgMHgzNywgMHg0NiwgMHhERiwKKzB4NEUsIDB4M0YsIDB4NEUsIDB4REYsCisKKzB4MTYsIDB4MzAsIDB4MjAsIDB4RTksCisweDRGLCAweDNGLCAweDRGLCAweERGLAorCisweDQ3LCAweDM3LCAweDQ3LCAweERGLAorMHg1NywgMHgzRCwgMHg1NywgMHhERiwKKworMHgzMiwgMHgzMiwgMHgyRCwgMHhERiwKKzB4MjIsIDB4MjIsIDB4MkQsIDB4REYsCisKKzB4MTIsIDB4MTIsIDB4MkQsIDB4REYsCisweDNBLCAweDNBLCAweDJELCAweERGLAorCisweDI3LCAweENGLCAweDc0LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NCwgMHhDNCwKKworMHgwQSwgMHg0NCwgMHg0QywgMHhCMCwKKzB4MDIsIDB4NDQsIDB4NTQsIDB4QjAsCisKKzB4M0QsIDB4Q0YsIDB4NzQsIDB4QzAsCisweDM0LCAweDM3LCAweDIwLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzOCwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0MsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjIsCisweDFBLCAweDQ0LCAweDU0LCAweEIyLAorCisweDJFLCAweDgwLCAweDNBLCAweEVBLAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzAsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzIsIDB4MzEsIDB4NUYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDMzLCAweDM5LCAweDVGLCAweEU5LAorCisweDNELCAweENGLCAweDc1LCAweEMyLAorMHgzNywgMHhDRiwgMHg3NSwgMHhDNCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4QTYsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEEzLCAweDNELCAweDIwLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI0LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNCwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCMCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjAsCisKKzB4ODgsIDB4NzMsIDB4NUUsIDB4RTksCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBMCwgMHgzNywgMHgyMCwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzRSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4M0YsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDNBLCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzQiwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0NSwgMHg0RCwgMHhCMiwKKzB4MUEsIDB4NDUsIDB4NTUsIDB4QjIsCisKKzB4MEEsIDB4NDUsIDB4NEQsIDB4QjQsCisweDAyLCAweDQ1LCAweDU1LCAweEI0LAorCisweDI3LCAweENGLCAweDc0LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4QTcsIDB4MzAsIDB4NEYsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUMsIDB4MjcsIDB4MjAsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweEE4LCAweDM4LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ0LCAweDRDLCAweEI2LAorMHgxQSwgMHg0NCwgMHg1NCwgMHhCNiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzYsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM3LCAweDM5LCAweDRGLCAweEU5LAorCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDcsIDB4NEYsIDB4QkYsCisweDAyLCAweDQ3LCAweDU3LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBMSwgMHgzMCwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTIsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDMsIDB4NEIsIDB4QkYsCisweDFBLCAweDQzLCAweDUzLCAweEJGLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHg5RCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4OUUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDgwLCAweDMxLCAweDU3LCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHg4MSwgMHgzOSwgMHg1NywgMHhFOSwKKworMHgzNywgMHg0OCwgMHg1MCwgMHhCRCwKKzB4OEEsIDB4MzYsIDB4MjAsIDB4RTksCisKKzB4ODYsIDB4NzYsIDB4NTcsIDB4RTksCisweDhCLCAweDNFLCAweDIwLCAweEU5LAorCisweDgyLCAweDMwLCAweDU3LCAweEU5LAorMHg4NywgMHg3NywgMHg1NywgMHhFOSwKKworMHg4MywgMHgzOCwgMHg1NywgMHhFOSwKKzB4MzUsIDB4NDksIDB4NTEsIDB4QkQsCisKKzB4ODQsIDB4MzEsIDB4NUUsIDB4RTksCisweDMwLCAweDFGLCAweDVGLCAweEU5LAorCisweDg1LCAweDM5LCAweDVFLCAweEU5LAorMHg1NywgMHgyNSwgMHgyMCwgMHhFOSwKKworMHgyQiwgMHg0OCwgMHgyMCwgMHhFOSwKKzB4MUQsIDB4MzcsIDB4RTEsIDB4RUEsCisKKzB4MUUsIDB4MzUsIDB4RTEsIDB4RUEsCisweDAwLCAweEUwLAorMHgyNiwgMHg3NywKKworMHgyNCwgMHg0OSwgMHgyMCwgMHhFOSwKKzB4OUQsIDB4RkYsIDB4MjAsIDB4RUEsCisKKzB4MTYsIDB4MjYsIDB4MjAsIDB4RTksCisweDU3LCAweDJFLCAweEJGLCAweEVBLAorCisweDFDLCAweDQ2LCAweEEwLCAweEU4LAorMHgyMywgMHg0RSwgMHhBMCwgMHhFOCwKKworMHgyQiwgMHg1NiwgMHhBMCwgMHhFOCwKKzB4MUQsIDB4NDcsIDB4QTAsIDB4RTgsCisKKzB4MjQsIDB4NEYsIDB4QTAsIDB4RTgsCisweDJDLCAweDU3LCAweEEwLCAweEU4LAorCisweDFDLCAweDAwLAorMHgyMywgMHgwMCwKKzB4MkIsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFELCAweDAwLAorMHgyNCwgMHgwMCwKKzB4MkMsIDB4MDAsCisweDAwLCAweEUwLAorCisweDFDLCAweDY1LAorMHgyMywgMHg2NSwKKzB4MkIsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFELCAweDY1LAorMHgyNCwgMHg2NSwKKzB4MkMsIDB4NjUsCisweDAwLCAweEUwLAorCisweDFDLCAweDIzLCAweDYwLCAweEVDLAorMHgzNiwgMHhENywgMHgzNiwgMHhBRCwKKworMHgyQiwgMHg4MCwgMHg2MCwgMHhFQywKKzB4MUQsIDB4MjQsIDB4NjAsIDB4RUMsCisKKzB4M0UsIDB4RDcsIDB4M0UsIDB4QUQsCisweDJDLCAweDgwLCAweDYwLCAweEVDLAorCisweDFDLCAweDJCLCAweERFLCAweEU4LAorMHgyMywgMHg4MCwgMHhERSwgMHhFOCwKKworMHgzNiwgMHg4MCwgMHgzNiwgMHhCRCwKKzB4M0UsIDB4ODAsIDB4M0UsIDB4QkQsCisKKzB4MzMsIDB4RDcsIDB4MUMsIDB4QkQsCisweDNCLCAweEQ3LCAweDIzLCAweEJELAorCisweDQ2LCAweDgwLCAweDQ2LCAweENGLAorMHg0RiwgMHg4MCwgMHg0RiwgMHhDRiwKKworMHg1NiwgMHgzMywgMHg1NiwgMHhDRiwKKzB4NDcsIDB4M0IsIDB4NDcsIDB4Q0YsCisKKzB4QzUsIDB4RkYsIDB4MjAsIDB4RUEsCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDRFLCAweDMzLCAweDRFLCAweENGLAorMHg1NywgMHgzQiwgMHg1NywgMHhDRiwKKworMHg4QiwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4NTcsIDB4QzAsIDB4QkYsIDB4RUEsCisKKzB4MDAsIDB4ODAsIDB4QTAsIDB4RTksCisweDAwLCAweDAwLCAweEQ4LCAweEVDLAorCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB3YXJwX2c0MDBfdGd6c2FmW10gPSB7CisKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjIsIDB4NDAsIDB4NDgsIDB4QkYsCisweDJBLCAweDQwLCAweDUwLCAweEJGLAorCisweDMyLCAweDQxLCAweDQ5LCAweEJGLAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4Q0IsIDB4NkIsCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDRCLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDI5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NDksIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDUxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg0OSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzksIDB4NTcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDZFLCAweDgwLCAweDE1LCAweEVBLAorMHgwOCwgMHgwNCwKKzB4MTAsIDB4MDQsCisKKzB4NTEsIDB4NDksIDB4QzAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NEEsIDB4QkYsCisweDI3LCAweDRBLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDUyLCAweEJGLAorMHgxRSwgMHg0OSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MjYsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NDgsIDB4QkQsCisweDIyLCAweDQwLCAweDUwLCAweEJELAorCisweDEyLCAweDQxLCAweDQ5LCAweEJELAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgyNiwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg0RSwgMHgzMSwgMHg0RSwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDRGLCAweDM5LCAweDRGLCAweEJGLAorMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKworMHg2MCwgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4NDIsIDB4NzMsIDB4RjgsIDB4RUMsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweEE1LCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg0QiwgMHg0QiwgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgyNiwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDUzLCAweDUzLCAweDJELCAweERGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKzB4MDAsIDB4RTAsCisweDU5LCAweEUzLAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4M0YsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NDgsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDQ4LCAweDNDLCAweEU5LAorCisweDFGLCAweDI3LCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU2LCAweDNELCAweDU2LCAweERGLAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg0RSwgMHgzRiwgMHg0RSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NEYsIDB4M0YsIDB4NEYsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNELCAweDU3LCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4MjcsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDBBLCAweDQ0LCAweDRDLCAweEIwLAorMHgwMiwgMHg0NCwgMHg1NCwgMHhCMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzQsIDB4MzcsIDB4MjAsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM4LCAweDI3LCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjIsCisKKzB4MzIsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgyNywgMHhDRiwgMHg3NSwgMHhDMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4M0QsIDB4Q0YsIDB4NzUsIDB4QzIsCisweDM3LCAweENGLCAweDc1LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNiwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTMsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjQsCisweDFBLCAweDQ0LCAweDU0LCAweEI0LAorCisweDBBLCAweDQ1LCAweDRELCAweEIwLAorMHgwMiwgMHg0NSwgMHg1NSwgMHhCMCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweEEwLCAweDM3LCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDNFLCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzRiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDRELCAweEIyLAorMHgxQSwgMHg0NSwgMHg1NSwgMHhCMiwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCNCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjQsCisKKzB4MjcsIDB4Q0YsIDB4NzQsIDB4QzYsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBNywgMHgzMCwgMHg0RiwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg5QywgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTgsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjYsCisweDFBLCAweDQ0LCAweDU0LCAweEI2LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNiwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MEEsIDB4NDUsIDB4NEQsIDB4QjYsCisweDAyLCAweDQ1LCAweDU1LCAweEI2LAorCisweDNELCAweENGLCAweDc1LCAweEM2LAorMHgyQSwgMHgyMCwKKzB4MUEsIDB4MjAsCisKKzB4MkEsIDB4NDYsIDB4NEUsIDB4QkYsCisweDFBLCAweDQ2LCAweDU2LCAweEJGLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNCwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTUsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MzEsIDB4M0QsIDB4MjAsIDB4RTksCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgwQSwgMHg0NywgMHg0RiwgMHhCRiwKKzB4MDIsIDB4NDcsIDB4NTcsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweEExLCAweDMwLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHhBMiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4OUQsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDlFLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQzLCAweDRCLCAweEJGLAorMHgxQSwgMHg0MywgMHg1MywgMHhCRiwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4MzUsIDB4MzAsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDM5LCAweDM4LCAweDRGLCAweEU5LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHg4MCwgMHgzMSwgMHg1NywgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4ODEsIDB4MzksIDB4NTcsIDB4RTksCisKKzB4MzcsIDB4NDgsIDB4NTAsIDB4QkQsCisweDhBLCAweDM2LCAweDIwLCAweEU5LAorCisweDg2LCAweDc2LCAweDU3LCAweEU5LAorMHg4QiwgMHgzRSwgMHgyMCwgMHhFOSwKKworMHg4MiwgMHgzMCwgMHg1NywgMHhFOSwKKzB4ODcsIDB4NzcsIDB4NTcsIDB4RTksCisKKzB4ODMsIDB4MzgsIDB4NTcsIDB4RTksCisweDM1LCAweDQ5LCAweDUxLCAweEJELAorCisweDg0LCAweDMxLCAweDVFLCAweEU5LAorMHgzMCwgMHgxRiwgMHg1RiwgMHhFOSwKKworMHg4NSwgMHgzOSwgMHg1RSwgMHhFOSwKKzB4NTcsIDB4MjUsIDB4MjAsIDB4RTksCisKKzB4MkIsIDB4NDgsIDB4MjAsIDB4RTksCisweDFELCAweDM3LCAweEUxLCAweEVBLAorCisweDFFLCAweDM1LCAweEUxLCAweEVBLAorMHgwMCwgMHhFMCwKKzB4MjYsIDB4NzcsCisKKzB4MjQsIDB4NDksIDB4MjAsIDB4RTksCisweDk5LCAweEZGLCAweDIwLCAweEVBLAorCisweDE2LCAweDI2LCAweDIwLCAweEU5LAorMHg1NywgMHgyRSwgMHhCRiwgMHhFQSwKKworMHgxQywgMHg0NiwgMHhBMCwgMHhFOCwKKzB4MjMsIDB4NEUsIDB4QTAsIDB4RTgsCisKKzB4MkIsIDB4NTYsIDB4QTAsIDB4RTgsCisweDFELCAweDQ3LCAweEEwLCAweEU4LAorCisweDI0LCAweDRGLCAweEEwLCAweEU4LAorMHgyQywgMHg1NywgMHhBMCwgMHhFOCwKKworMHgxQywgMHgwMCwKKzB4MjMsIDB4MDAsCisweDJCLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHgwMCwKKzB4MjQsIDB4MDAsCisweDJDLCAweDAwLAorMHgwMCwgMHhFMCwKKworMHgxQywgMHg2NSwKKzB4MjMsIDB4NjUsCisweDJCLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxRCwgMHg2NSwKKzB4MjQsIDB4NjUsCisweDJDLCAweDY1LAorMHgwMCwgMHhFMCwKKworMHgxQywgMHgyMywgMHg2MCwgMHhFQywKKzB4MzYsIDB4RDcsIDB4MzYsIDB4QUQsCisKKzB4MkIsIDB4ODAsIDB4NjAsIDB4RUMsCisweDFELCAweDI0LCAweDYwLCAweEVDLAorCisweDNFLCAweEQ3LCAweDNFLCAweEFELAorMHgyQywgMHg4MCwgMHg2MCwgMHhFQywKKworMHgxQywgMHgyQiwgMHhERSwgMHhFOCwKKzB4MjMsIDB4ODAsIDB4REUsIDB4RTgsCisKKzB4MzYsIDB4ODAsIDB4MzYsIDB4QkQsCisweDNFLCAweDgwLCAweDNFLCAweEJELAorCisweDMzLCAweEQ3LCAweDFDLCAweEJELAorMHgzQiwgMHhENywgMHgyMywgMHhCRCwKKworMHg0NiwgMHg4MCwgMHg0NiwgMHhDRiwKKzB4NEYsIDB4ODAsIDB4NEYsIDB4Q0YsCisKKzB4NTYsIDB4MzMsIDB4NTYsIDB4Q0YsCisweDQ3LCAweDNCLCAweDQ3LCAweENGLAorCisweEMxLCAweEZGLCAweDIwLCAweEVBLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHg0RSwgMHgzMywgMHg0RSwgMHhDRiwKKzB4NTcsIDB4M0IsIDB4NTcsIDB4Q0YsCisKKzB4ODcsIDB4RkYsIDB4MjAsIDB4RUEsCisweDU3LCAweEMwLCAweEJGLCAweEVBLAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FycF9nNDAwX3RnenNmW10gPSB7CisKKzB4MDAsIDB4ODgsIDB4OTgsIDB4RTksCisweDAwLCAweDgwLCAweDAwLCAweEU4LAorCisweDAwLCAweDgwLCAweEEwLCAweEU5LAorMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywKKworMHhGRiwgMHg4MCwgMHhDMCwgMHhFOSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MjIsIDB4NDAsIDB4NDgsIDB4QkYsCisweDJBLCAweDQwLCAweDUwLCAweEJGLAorCisweDMyLCAweDQxLCAweDQ5LCAweEJGLAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRiwKKworMHhDMywgMHg2QiwKKzB4Q0IsIDB4NkIsCisweDAwLCAweDg4LCAweDk4LCAweEU5LAorCisweDczLCAweDdCLCAweEM4LCAweEVDLAorMHg5NiwgMHhFMiwKKzB4NDEsIDB4MDQsCisKKzB4N0IsIDB4NDMsIDB4QTAsIDB4RTgsCisweDczLCAweDRCLCAweEEwLCAweEU4LAorCisweEFELCAweEVFLCAweDI5LCAweDlGLAorMHgwMCwgMHhFMCwKKzB4NDksIDB4MDQsCisKKzB4OTAsIDB4RTIsCisweDUxLCAweDA0LAorMHgzMSwgMHg0NiwgMHhCMSwgMHhFOCwKKworMHg0OSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzksIDB4NTcsIDB4QjEsIDB4RTgsCisKKzB4MDAsIDB4MDQsCisweDQ2LCAweEUyLAorMHg3MywgMHg1MywgMHhBMCwgMHhFOCwKKworMHg1MSwgMHg0MSwgMHhDMCwgMHhFQywKKzB4MzEsIDB4MDAsCisweDM5LCAweDAwLAorCisweDZBLCAweDgwLCAweDE1LCAweEVBLAorMHgwOCwgMHgwNCwKKzB4MTAsIDB4MDQsCisKKzB4NTEsIDB4NDksIDB4QzAsIDB4RUMsCisweDJGLCAweDQxLCAweDYwLCAweEVBLAorCisweDMxLCAweDIwLAorMHgzOSwgMHgyMCwKKzB4MUYsIDB4NDIsIDB4QTAsIDB4RTgsCisKKzB4MkEsIDB4NDIsIDB4NEEsIDB4QkYsCisweDI3LCAweDRBLCAweEEwLCAweEU4LAorCisweDFBLCAweDQyLCAweDUyLCAweEJGLAorMHgxRSwgMHg0OSwgMHg2MCwgMHhFQSwKKworMHg3MywgMHg3QiwgMHhDOCwgMHhFQywKKzB4MjYsIDB4NTEsIDB4NjAsIDB4RUEsCisKKzB4MzIsIDB4NDAsIDB4NDgsIDB4QkQsCisweDIyLCAweDQwLCAweDUwLCAweEJELAorCisweDEyLCAweDQxLCAweDQ5LCAweEJELAorMHgzQSwgMHg0MSwgMHg1MSwgMHhCRCwKKworMHhCRiwgMHgyRiwgMHgyNiwgMHhCRCwKKzB4MDAsIDB4RTAsCisweDdCLCAweDcyLAorCisweDMyLCAweDIwLAorMHgyMiwgMHgyMCwKKzB4MTIsIDB4MjAsCisweDNBLCAweDIwLAorCisweDQ2LCAweDMxLCAweDQ2LCAweEJGLAorMHg0RSwgMHgzMSwgMHg0RSwgMHhCRiwKKworMHhCMywgMHhFMiwgMHgyRCwgMHg5RiwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NTYsIDB4MzEsIDB4NTYsIDB4QkYsCisweDQ3LCAweDM5LCAweDQ3LCAweEJGLAorCisweDRGLCAweDM5LCAweDRGLCAweEJGLAorMHg1NywgMHgzOSwgMHg1NywgMHhCRiwKKworMHg1QywgMHg4MCwgMHgwNywgMHhFQSwKKzB4MjQsIDB4NDEsIDB4MjAsIDB4RTksCisKKzB4NDIsIDB4NzMsIDB4RjgsIDB4RUMsCisweDAwLCAweEUwLAorMHgyRCwgMHg3MywKKworMHgzMywgMHg3MiwKKzB4MEMsIDB4RTMsCisweEE1LCAweDJGLCAweDFFLCAweEJELAorCisweDQzLCAweDQzLCAweDJELCAweERGLAorMHg0QiwgMHg0QiwgMHgyRCwgMHhERiwKKworMHhBRSwgMHgxRSwgMHgyNiwgMHhCRCwKKzB4NTgsIDB4RTMsCisweDMzLCAweDY2LAorCisweDUzLCAweDUzLCAweDJELCAweERGLAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHhCOCwgMHgzOCwgMHgzMywgMHhCRiwKKzB4MDAsIDB4RTAsCisweDU5LCAweEUzLAorCisweDFFLCAweDEyLCAweDQxLCAweEU5LAorMHgxQSwgMHgyMiwgMHg0MSwgMHhFOSwKKworMHgyQiwgMHg0MCwgMHgzRCwgMHhFOSwKKzB4M0YsIDB4NEIsIDB4QTAsIDB4RTgsCisKKzB4MkQsIDB4NzMsCisweDMwLCAweDc2LAorMHgwNSwgMHg4MCwgMHgzRCwgMHhFQSwKKworMHgzNywgMHg0MywgMHhBMCwgMHhFOCwKKzB4M0QsIDB4NTMsIDB4QTAsIDB4RTgsCisKKzB4NDgsIDB4NzAsIDB4RjgsIDB4RUMsCisweDJCLCAweDQ4LCAweDNDLCAweEU5LAorCisweDFGLCAweDI3LCAweEJDLCAweEU4LAorMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKworMHgwMCwgMHg4MCwgMHgwMCwgMHhFOCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4MTUsIDB4QzAsIDB4MjAsIDB4RTksCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorCisweDE1LCAweEMwLCAweDIwLCAweEU5LAorMHgxNSwgMHhDMCwgMHgyMCwgMHhFOSwKKworMHgxOCwgMHgzQSwgMHg0MSwgMHhFOSwKKzB4MUQsIDB4MzIsIDB4NDEsIDB4RTksCisKKzB4MkEsIDB4NDAsIDB4MjAsIDB4RTksCisweDU2LCAweDNELCAweDU2LCAweERGLAorCisweDQ2LCAweDM3LCAweDQ2LCAweERGLAorMHg0RSwgMHgzRiwgMHg0RSwgMHhERiwKKworMHgxNiwgMHgzMCwgMHgyMCwgMHhFOSwKKzB4NEYsIDB4M0YsIDB4NEYsIDB4REYsCisKKzB4NDcsIDB4MzcsIDB4NDcsIDB4REYsCisweDU3LCAweDNELCAweDU3LCAweERGLAorCisweDMyLCAweDMyLCAweDJELCAweERGLAorMHgyMiwgMHgyMiwgMHgyRCwgMHhERiwKKworMHgxMiwgMHgxMiwgMHgyRCwgMHhERiwKKzB4M0EsIDB4M0EsIDB4MkQsIDB4REYsCisKKzB4MjcsIDB4Q0YsIDB4NzQsIDB4QzIsCisweDM3LCAweENGLCAweDc0LCAweEM0LAorCisweDBBLCAweDQ0LCAweDRDLCAweEIwLAorMHgwMiwgMHg0NCwgMHg1NCwgMHhCMCwKKworMHgzRCwgMHhDRiwgMHg3NCwgMHhDMCwKKzB4MzQsIDB4MzcsIDB4MjAsIDB4RTksCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDM4LCAweDI3LCAweDIwLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzQywgMHgzRCwgMHgyMCwgMHhFOSwKKworMHgyQSwgMHg0NCwgMHg0QywgMHhCMiwKKzB4MUEsIDB4NDQsIDB4NTQsIDB4QjIsCisKKzB4MkUsIDB4ODAsIDB4M0EsIDB4RUEsCisweDBBLCAweDIwLAorMHgwMiwgMHgyMCwKKworMHgyNywgMHhDRiwgMHg3NSwgMHhDMCwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzMiwgMHgzMSwgMHg1RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzMsIDB4MzksIDB4NUYsIDB4RTksCisKKzB4M0QsIDB4Q0YsIDB4NzUsIDB4QzIsCisweDM3LCAweENGLCAweDc1LCAweEM0LAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHhBNiwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTMsIDB4M0QsIDB4MjAsIDB4RTksCisKKzB4MkEsIDB4NDQsIDB4NEMsIDB4QjQsCisweDFBLCAweDQ0LCAweDU0LCAweEI0LAorCisweDBBLCAweDQ1LCAweDRELCAweEIwLAorMHgwMiwgMHg0NSwgMHg1NSwgMHhCMCwKKworMHg4OCwgMHg3MywgMHg1RSwgMHhFOSwKKzB4MkEsIDB4MjAsCisweDFBLCAweDIwLAorCisweEEwLCAweDM3LCAweDIwLCAweEU5LAorMHgwQSwgMHgyMCwKKzB4MDIsIDB4MjAsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweDNFLCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHgzRiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgzMCwgMHg1MCwgMHgyRSwgMHg5RiwKKzB4M0EsIDB4MzEsIDB4NEYsIDB4RTksCisKKzB4MzgsIDB4MjEsIDB4MkMsIDB4OUYsCisweDNCLCAweDM5LCAweDRGLCAweEU5LAorCisweDJBLCAweDQ1LCAweDRELCAweEIyLAorMHgxQSwgMHg0NSwgMHg1NSwgMHhCMiwKKworMHgwQSwgMHg0NSwgMHg0RCwgMHhCNCwKKzB4MDIsIDB4NDUsIDB4NTUsIDB4QjQsCisKKzB4MjcsIDB4Q0YsIDB4NzUsIDB4QzYsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHhBNywgMHgzMCwgMHg0RiwgMHhFOSwKKzB4MEEsIDB4MjAsCisweDAyLCAweDIwLAorCisweDMxLCAweDUzLCAweDJGLCAweDlGLAorMHgzMSwgMHgyNywgMHgyMCwgMHhFOSwKKworMHgzOSwgMHhFNSwgMHgyQywgMHg5RiwKKzB4QTgsIDB4MzgsIDB4NEYsIDB4RTksCisKKzB4MkEsIDB4NDUsIDB4NEQsIDB4QjYsCisweDFBLCAweDQ1LCAweDU1LCAweEI2LAorCisweDMwLCAweDUwLCAweDJFLCAweDlGLAorMHgzNiwgMHgzMSwgMHg0RiwgMHhFOSwKKworMHgzOCwgMHgyMSwgMHgyQywgMHg5RiwKKzB4MzcsIDB4MzksIDB4NEYsIDB4RTksCisKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisweDJBLCAweDIwLAorMHgxQSwgMHgyMCwKKworMHgyQSwgMHg0NiwgMHg0RSwgMHhCRiwKKzB4MUEsIDB4NDYsIDB4NTYsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEE0LCAweDMxLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBNSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgwQSwgMHg0NywgMHg0RiwgMHhCRiwKKzB4MDIsIDB4NDcsIDB4NTcsIDB4QkYsCisKKzB4MzEsIDB4NTMsIDB4MkYsIDB4OUYsCisweEExLCAweDMwLCAweDRGLCAweEU5LAorCisweDM5LCAweEU1LCAweDJDLCAweDlGLAorMHhBMiwgMHgzOCwgMHg0RiwgMHhFOSwKKworMHgyQSwgMHg0MywgMHg0QiwgMHhCRiwKKzB4MUEsIDB4NDMsIDB4NTMsIDB4QkYsCisKKzB4MzAsIDB4NTAsIDB4MkUsIDB4OUYsCisweDM1LCAweDMxLCAweDRGLCAweEU5LAorCisweDM4LCAweDIxLCAweDJDLCAweDlGLAorMHgzOSwgMHgzOSwgMHg0RiwgMHhFOSwKKworMHgzMSwgMHg1MywgMHgyRiwgMHg5RiwKKzB4ODAsIDB4MzEsIDB4NTcsIDB4RTksCisKKzB4MzksIDB4RTUsIDB4MkMsIDB4OUYsCisweDgxLCAweDM5LCAweDU3LCAweEU5LAorCisweDM3LCAweDQ4LCAweDUwLCAweEJELAorMHg4QSwgMHgzNiwgMHgyMCwgMHhFOSwKKworMHg4NiwgMHg3NiwgMHg1NywgMHhFOSwKKzB4OEIsIDB4M0UsIDB4MjAsIDB4RTksCisKKzB4ODIsIDB4MzAsIDB4NTcsIDB4RTksCisweDg3LCAweDc3LCAweDU3LCAweEU5LAorCisweDgzLCAweDM4LCAweDU3LCAweEU5LAorMHgzNSwgMHg0OSwgMHg1MSwgMHhCRCwKKworMHg4NCwgMHgzMSwgMHg1RSwgMHhFOSwKKzB4MzAsIDB4MUYsIDB4NUYsIDB4RTksCisKKzB4ODUsIDB4MzksIDB4NUUsIDB4RTksCisweDU3LCAweDI1LCAweDIwLCAweEU5LAorCisweDJCLCAweDQ4LCAweDIwLCAweEU5LAorMHgxRCwgMHgzNywgMHhFMSwgMHhFQSwKKworMHgxRSwgMHgzNSwgMHhFMSwgMHhFQSwKKzB4MDAsIDB4RTAsCisweDI2LCAweDc3LAorCisweDI0LCAweDQ5LCAweDIwLCAweEU5LAorMHg5RCwgMHhGRiwgMHgyMCwgMHhFQSwKKworMHgxNiwgMHgyNiwgMHgyMCwgMHhFOSwKKzB4NTcsIDB4MkUsIDB4QkYsIDB4RUEsCisKKzB4MUMsIDB4NDYsIDB4QTAsIDB4RTgsCisweDIzLCAweDRFLCAweEEwLCAweEU4LAorCisweDJCLCAweDU2LCAweEEwLCAweEU4LAorMHgxRCwgMHg0NywgMHhBMCwgMHhFOCwKKworMHgyNCwgMHg0RiwgMHhBMCwgMHhFOCwKKzB4MkMsIDB4NTcsIDB4QTAsIDB4RTgsCisKKzB4MUMsIDB4MDAsCisweDIzLCAweDAwLAorMHgyQiwgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4MDAsCisweDI0LCAweDAwLAorMHgyQywgMHgwMCwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4NjUsCisweDIzLCAweDY1LAorMHgyQiwgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUQsIDB4NjUsCisweDI0LCAweDY1LAorMHgyQywgMHg2NSwKKzB4MDAsIDB4RTAsCisKKzB4MUMsIDB4MjMsIDB4NjAsIDB4RUMsCisweDM2LCAweEQ3LCAweDM2LCAweEFELAorCisweDJCLCAweDgwLCAweDYwLCAweEVDLAorMHgxRCwgMHgyNCwgMHg2MCwgMHhFQywKKworMHgzRSwgMHhENywgMHgzRSwgMHhBRCwKKzB4MkMsIDB4ODAsIDB4NjAsIDB4RUMsCisKKzB4MUMsIDB4MkIsIDB4REUsIDB4RTgsCisweDIzLCAweDgwLCAweERFLCAweEU4LAorCisweDM2LCAweDgwLCAweDM2LCAweEJELAorMHgzRSwgMHg4MCwgMHgzRSwgMHhCRCwKKworMHgzMywgMHhENywgMHgxQywgMHhCRCwKKzB4M0IsIDB4RDcsIDB4MjMsIDB4QkQsCisKKzB4NDYsIDB4ODAsIDB4NDYsIDB4Q0YsCisweDRGLCAweDgwLCAweDRGLCAweENGLAorCisweDU2LCAweDMzLCAweDU2LCAweENGLAorMHg0NywgMHgzQiwgMHg0NywgMHhDRiwKKworMHhDNSwgMHhGRiwgMHgyMCwgMHhFQSwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4RTgsCisKKzB4NEUsIDB4MzMsIDB4NEUsIDB4Q0YsCisweDU3LCAweDNCLCAweDU3LCAweENGLAorCisweDhCLCAweEZGLCAweDIwLCAweEVBLAorMHg1NywgMHhDMCwgMHhCRiwgMHhFQSwKKworMHgwMCwgMHg4MCwgMHhBMCwgMHhFOSwKKzB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsCisKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV93YXJwLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV93YXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzYTBjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX3dhcnAuYwpAQCAtMCwwICsxLDIxMCBAQAorLyogbWdhX3dhcnAuYyAtLSBNYXRyb3ggRzIwMC9HNDAwIFdBUlAgZW5naW5lIG1hbmFnZW1lbnQgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUaHUgSmFuIDExIDIxOjI5OjMyIDIwMDEgYnkgZ2FyZXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibWdhX2RybS5oIgorI2luY2x1ZGUgIm1nYV9kcnYuaCIKKyNpbmNsdWRlICJtZ2FfdWNvZGUuaCIKKworCisjZGVmaW5lIE1HQV9XQVJQX0NPREVfQUxJR04JCTI1NgkJLyogaW4gYnl0ZXMgKi8KKworI2RlZmluZSBXQVJQX1VDT0RFX1NJWkUoIHdoaWNoICkJCQkJCVwKKwkoKHNpemVvZih3aGljaCkgLyBNR0FfV0FSUF9DT0RFX0FMSUdOICsgMSkgKiBNR0FfV0FSUF9DT0RFX0FMSUdOKQorCisjZGVmaW5lIFdBUlBfVUNPREVfSU5TVEFMTCggd2hpY2gsIHdoZXJlICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlEUk1fREVCVUcoICIgcGNiYXNlID0gMHglMDhseCAgdmNiYXNlID0gJXBcbiIsIHBjYmFzZSwgdmNiYXNlICk7XAorCWRldl9wcml2LT53YXJwX3BpcGVfcGh5c1t3aGVyZV0gPSBwY2Jhc2U7CQkJXAorCW1lbWNweSggdmNiYXNlLCB3aGljaCwgc2l6ZW9mKHdoaWNoKSApOwkJCQlcCisJcGNiYXNlICs9IFdBUlBfVUNPREVfU0laRSggd2hpY2ggKTsJCQkJXAorCXZjYmFzZSArPSBXQVJQX1VDT0RFX1NJWkUoIHdoaWNoICk7CQkJCVwKK30gd2hpbGUgKDApCisKKworc3RhdGljIHVuc2lnbmVkIGludCBtZ2Ffd2FycF9nNDAwX21pY3JvY29kZV9zaXplKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXVuc2lnbmVkIGludCBzaXplOworCisJc2l6ZSA9ICggV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdGd6ICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdGd6YSApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnemFmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdGd6ZiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnenMgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Z3pzYSApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnenNhZiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3RnenNmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdDJneiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3phICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdDJnemFmICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2c0MDBfdDJnemYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6cyApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3pzYSApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nNDAwX3QyZ3pzYWYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzQwMF90Mmd6c2YgKSApOworCisJc2l6ZSA9IFBBR0VfQUxJR04oIHNpemUgKTsKKworCURSTV9ERUJVRyggIkc0MDAgdWNvZGUgc2l6ZSA9ICVkIGJ5dGVzXG4iLCBzaXplICk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWdhX3dhcnBfZzIwMF9taWNyb2NvZGVfc2l6ZSggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXNpemUgPSAoIFdBUlBfVUNPREVfU0laRSggd2FycF9nMjAwX3RneiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nMjAwX3RnemEgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3phZiApICsKKwkJIFdBUlBfVUNPREVfU0laRSggd2FycF9nMjAwX3RnemYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3pzICkgKworCQkgV0FSUF9VQ09ERV9TSVpFKCB3YXJwX2cyMDBfdGd6c2EgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3pzYWYgKSArCisJCSBXQVJQX1VDT0RFX1NJWkUoIHdhcnBfZzIwMF90Z3pzZiApICk7CisKKwlzaXplID0gUEFHRV9BTElHTiggc2l6ZSApOworCisJRFJNX0RFQlVHKCAiRzIwMCB1Y29kZSBzaXplID0gJWQgYnl0ZXNcbiIsIHNpemUgKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBtZ2Ffd2FycF9pbnN0YWxsX2c0MDBfbWljcm9jb2RlKCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXVuc2lnbmVkIGNoYXIgKnZjYmFzZSA9IGRldl9wcml2LT53YXJwLT5oYW5kbGU7CisJdW5zaWduZWQgbG9uZyBwY2Jhc2UgPSBkZXZfcHJpdi0+d2FycC0+b2Zmc2V0OworCXVuc2lnbmVkIGludCBzaXplOworCisJc2l6ZSA9IG1nYV93YXJwX2c0MDBfbWljcm9jb2RlX3NpemUoIGRldl9wcml2ICk7CisJaWYgKCBzaXplID4gZGV2X3ByaXYtPndhcnAtPnNpemUgKSB7CisJCURSTV9FUlJPUiggIm1pY3JvY29kZSB0b28gbGFyZ2UhICgldSA+ICVsdSlcbiIsCisJCQkgICBzaXplLCBkZXZfcHJpdi0+d2FycC0+c2l6ZSApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCW1lbXNldCggZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzLCAwLAorCQlzaXplb2YoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzKSApOworCisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6LAlNR0FfV0FSUF9UR1ogKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Z3pmLAlNR0FfV0FSUF9UR1pGICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdGd6YSwJTUdBX1dBUlBfVEdaQSApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3RnemFmLAlNR0FfV0FSUF9UR1pBRiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3RnenMsCU1HQV9XQVJQX1RHWlMgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Z3pzZiwJTUdBX1dBUlBfVEdaU0YgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Z3pzYSwJTUdBX1dBUlBfVEdaU0EgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Z3pzYWYsCU1HQV9XQVJQX1RHWlNBRiApOworCisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdDJneiwJTUdBX1dBUlBfVDJHWiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3pmLAlNR0FfV0FSUF9UMkdaRiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3phLAlNR0FfV0FSUF9UMkdaQSApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3phZiwJTUdBX1dBUlBfVDJHWkFGICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdDJnenMsCU1HQV9XQVJQX1QyR1pTICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2c0MDBfdDJnenNmLAlNR0FfV0FSUF9UMkdaU0YgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzQwMF90Mmd6c2EsCU1HQV9XQVJQX1QyR1pTQSApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nNDAwX3QyZ3pzYWYsCU1HQV9XQVJQX1QyR1pTQUYgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1nYV93YXJwX2luc3RhbGxfZzIwMF9taWNyb2NvZGUoIGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdW5zaWduZWQgY2hhciAqdmNiYXNlID0gZGV2X3ByaXYtPndhcnAtPmhhbmRsZTsKKwl1bnNpZ25lZCBsb25nIHBjYmFzZSA9IGRldl9wcml2LT53YXJwLT5vZmZzZXQ7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlzaXplID0gbWdhX3dhcnBfZzIwMF9taWNyb2NvZGVfc2l6ZSggZGV2X3ByaXYgKTsKKwlpZiAoIHNpemUgPiBkZXZfcHJpdi0+d2FycC0+c2l6ZSApIHsKKwkJRFJNX0VSUk9SKCAibWljcm9jb2RlIHRvbyBsYXJnZSEgKCV1ID4gJWx1KVxuIiwKKwkJCSAgIHNpemUsIGRldl9wcml2LT53YXJwLT5zaXplICk7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJbWVtc2V0KCBkZXZfcHJpdi0+d2FycF9waXBlX3BoeXMsIDAsCisJCXNpemVvZihkZXZfcHJpdi0+d2FycF9waXBlX3BoeXMpICk7CisKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3osCU1HQV9XQVJQX1RHWiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RnemYsCU1HQV9XQVJQX1RHWkYgKTsKKwlXQVJQX1VDT0RFX0lOU1RBTEwoIHdhcnBfZzIwMF90Z3phLAlNR0FfV0FSUF9UR1pBICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6YWYsCU1HQV9XQVJQX1RHWkFGICk7CisJV0FSUF9VQ09ERV9JTlNUQUxMKCB3YXJwX2cyMDBfdGd6cywJTUdBX1dBUlBfVEdaUyApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RnenNmLAlNR0FfV0FSUF9UR1pTRiApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RnenNhLAlNR0FfV0FSUF9UR1pTQSApOworCVdBUlBfVUNPREVfSU5TVEFMTCggd2FycF9nMjAwX3RnenNhZiwJTUdBX1dBUlBfVEdaU0FGICk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1nYV93YXJwX2luc3RhbGxfbWljcm9jb2RlKAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXN3aXRjaCAoIGRldl9wcml2LT5jaGlwc2V0ICkgeworCWNhc2UgTUdBX0NBUkRfVFlQRV9HNDAwOgorCQlyZXR1cm4gbWdhX3dhcnBfaW5zdGFsbF9nNDAwX21pY3JvY29kZSggZGV2X3ByaXYgKTsKKwljYXNlIE1HQV9DQVJEX1RZUEVfRzIwMDoKKwkJcmV0dXJuIG1nYV93YXJwX2luc3RhbGxfZzIwMF9taWNyb2NvZGUoIGRldl9wcml2ICk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9Cit9CisKKyNkZWZpbmUgV01JU0NfRVhQRUNURUQJCShNR0FfV1VDT0RFQ0FDSEVfRU5BQkxFIHwgTUdBX1dNQVNURVJfRU5BQkxFKQorCitpbnQgbWdhX3dhcnBfaW5pdCggZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgd21pc2M7CisKKwkvKiBGSVhNRTogR2V0IHJpZCBvZiB0aGVzZSBkYW1uZWQgbWFnaWMgbnVtYmVycy4uLgorCSAqLworCXN3aXRjaCAoIGRldl9wcml2LT5jaGlwc2V0ICkgeworCWNhc2UgTUdBX0NBUkRfVFlQRV9HNDAwOgorCQlNR0FfV1JJVEUoIE1HQV9XSUFERFIyLCBNR0FfV01PREVfU1VTUEVORCApOworCQlNR0FfV1JJVEUoIE1HQV9XR0VUTVNCLCAweDAwMDAwRTAwICk7CisJCU1HQV9XUklURSggTUdBX1dWUlRYU1osIDB4MDAwMDE4MDcgKTsKKwkJTUdBX1dSSVRFKCBNR0FfV0FDQ0VQVFNFUSwgMHgxODAwMDAwMCApOworCQlicmVhazsKKwljYXNlIE1HQV9DQVJEX1RZUEVfRzIwMDoKKwkJTUdBX1dSSVRFKCBNR0FfV0lBRERSLCBNR0FfV01PREVfU1VTUEVORCApOworCQlNR0FfV1JJVEUoIE1HQV9XR0VUTVNCLCAweDE2MDYgKTsKKwkJTUdBX1dSSVRFKCBNR0FfV1ZSVFhTWiwgNyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCU1HQV9XUklURSggTUdBX1dNSVNDLCAoTUdBX1dVQ09ERUNBQ0hFX0VOQUJMRSB8CisJCQkgICAgICAgTUdBX1dNQVNURVJfRU5BQkxFIHwKKwkJCSAgICAgICBNR0FfV0NBQ0hFRkxVU0hfRU5BQkxFKSApOworCXdtaXNjID0gTUdBX1JFQUQoIE1HQV9XTUlTQyApOworCWlmICggd21pc2MgIT0gV01JU0NfRVhQRUNURUQgKSB7CisJCURSTV9FUlJPUiggIldBUlAgZW5naW5lIGNvbmZpZyBmYWlsZWQhIDB4JXggIT0gMHgleFxuIiwKKwkJCSAgIHdtaXNjLCBXTUlTQ19FWFBFQ1RFRCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZWQ4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMKQEAgLTAsMCArMSw5NDMgQEAKKy8qIHIxMjhfY2NlLmMgLS0gQVRJIFJhZ2UgMTI4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IFdlZCBBcHIgIDUgMTk6MjQ6MTkgMjAwMCBieSBrZXZpbkBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJyMTI4X2RybS5oIgorI2luY2x1ZGUgInIxMjhfZHJ2LmgiCisKKyNkZWZpbmUgUjEyOF9GSUZPX0RFQlVHCQkwCisKKy8qIENDRSBtaWNyb2NvZGUgKGZyb20gQVRJKSAqLworc3RhdGljIHUzMiByMTI4X2NjZV9taWNyb2NvZGVbXSA9IHsKKwkwLCAyNzY4Mzg0MDAsIDAsIDI2ODQ0OTc5MiwgMiwgMTQyLCAyLCAxNDUsIDAsIDEwNzY3NjU3MzEsIDAsCisJMTYxNzAzOTk1MSwgMCwgNzc0NTkyODc3LCAwLCAxOTg3NTQwMjg2LCAwLCAyMzA3NDkwOTQ2VSwgMCwKKwk1OTk1NTg5MjUsIDAsIDU4OTUwNTMxNSwgMCwgNTk2NDg3MDkyLCAwLCA1ODk1MDUzMTUsIDEsCisJMTE1NDQ1NzYsIDEsIDIwNjg0OCwgMSwgMzExMjk2LCAxLCAxOTg2NTYsIDIsIDkxMjI3MzQyMiwgMTEsCisJMjYyMTQ0LCAwLCAwLCAxLCAzMzU1OTgzNywgMSwgNzQzOCwgMSwgMTQ4MDksIDEsIDY2MTUsIDEyLCAyOCwKKwkxLCA2NjE0LCAxMiwgMjgsIDIsIDIzLCAxMSwgMTg4NzQzNjgsIDAsIDE2NzkwOTIyLCAxLCA0MDk2MDAsIDksCisJMzAsIDEsIDE0Nzg1NDc3MiwgMTYsIDQyMDQ4MzA3MiwgMywgODE5MiwgMCwgMTAyNDAsIDEsIDE5ODY1NiwKKwkxLCAxNTYzMCwgMSwgNTEyMDAsIDEwLCAzNDg1OCwgOSwgNDIsIDEsIDMzNTU5ODIzLCAyLCAxMDI3NiwgMSwKKwkxNTcxNywgMSwgMTU3MTgsIDIsIDQzLCAxLCAxNTkzNjk0OCwgMSwgNTcwNDgwODMxLCAxLCAxNDcxNTA3MSwKKwkxMiwgMzIyMTIzODMxLCAxLCAzMzk1MzEyNSwgMTIsIDU1LCAxLCAzMzU1OTkwOCwgMSwgMTU3MTgsIDIsCisJNDYsIDQsIDIwOTkyNTgsIDEsIDUyNjMzNiwgMSwgNDQyNjIzLCA0LCA0MTk0MzY1LCAxLCA1MDk5NTIsIDEsCisJNDU5MDA3LCAzLCAwLCAxMiwgOTIsIDIsIDQ2LCAxMiwgMTc2LCAxLCAxNTczNCwgMSwgMjA2ODQ4LCAxLAorCTE4NDMyLCAxLCAxMzMxMjAsIDEsIDEwMDY3MDczNCwgMSwgMTQ5NTA0LCAxLCAxNjU4ODgsIDEsCisJMTU5NzU5MjgsIDEsIDEwNDg1NzYsIDYsIDMxNDU4MDYsIDEsIDE1NzE1LCAxNiwgMjE1MDY0NTIzMlUsIDIsCisJMjY4NDQ5ODU5LCAyLCAxMDMwNywgMTIsIDE3NiwgMSwgMTU3MzQsIDEsIDE1NzM1LCAxLCAxNTYzMCwgMSwKKwkxNTYzMSwgMSwgNTI1MzEyMCwgNiwgMzE0NTgxMCwgMTYsIDIxNTA2NDUyMzJVLCAxLCAxNTg2NCwgMiwgODIsCisJMSwgMzQzMzEwLCAxLCAxMDY0MjA3LCAyLCAzMTQ1ODEzLCAxLCAxNTcyOCwgMSwgNzgxNywgMSwgMTU3MjksCisJMywgMTU3MzAsIDEyLCA5MiwgMiwgOTgsIDEsIDE2MTY4LCAxLCAxNjE2NywgMSwgMTYwMDIsIDEsIDE2MDA4LAorCTEsIDE1OTc0LCAxLCAxNTk3NSwgMSwgMTU5OTAsIDEsIDE1OTc2LCAxLCAxNTk3NywgMSwgMTU5ODAsIDAsCisJMTU5ODEsIDEsIDEwMjQwLCAxLCA1MjUzMTIwLCAxLCAxNTcyMCwgMSwgMTk4NjU2LCA2LCAxMTAsIDEsCisJMTgwMjI0LCAxLCAxMDM4MjQ3MzgsIDIsIDExMiwgMiwgMzE0NTgzOSwgMCwgNTM2ODg1NDQwLCAxLAorCTExNDg4MCwgMTQsIDEyNSwgMTIsIDIwNjk3NSwgMSwgMzM1NTk5OTUsIDEyLCAxOTg3ODQsIDAsCisJMzM1NzAyMzYsIDEsIDE1ODAzLCAwLCAxNTgwNCwgMywgMjk0OTEyLCAxLCAyOTQ5MTIsIDMsIDQ0MjM3MCwKKwkxLCAxMTU0NDU3NiwgMCwgODExNjEyMTYwLCAxLCAxMjU5MzE1MiwgMSwgMTE1MzYzODQsIDEsCisJMTQwMjQ3MDQsIDcsIDMxMDM4MjcyNiwgMCwgMTAyNDAsIDEsIDE0Nzk2LCAxLCAxNDc5NywgMSwgMTQ3OTMsCisJMSwgMTQ3OTQsIDAsIDE0Nzk1LCAxLCAyNjg2NzkxNjgsIDEsIDk0MzcxODQsIDEsIDI2ODQ0OTc5MiwgMSwKKwkxOTg2NTYsIDEsIDk0NTI4MjcsIDEsIDEwNzU4NTQ2MDIsIDEsIDEwNzU4NTQ2MDMsIDEsIDU1NzA1NiwgMSwKKwkxMTQ4ODAsIDE0LCAxNTksIDEyLCAxOTg3ODQsIDEsIDExMDk0MDkyMTMsIDEyLCAxOTg3ODMsIDEsCisJMTEwNzMxMjA1OSwgMTIsIDE5ODc4NCwgMSwgMTEwOTQwOTIxMiwgMiwgMTYyLCAxLCAxMDc1ODU0NzgxLCAxLAorCTEwNzM3NTc2MjcsIDEsIDEwNzU4NTQ3ODAsIDEsIDU0MDY3MiwgMSwgMTA0ODU3NjAsIDYsIDMxNDU4OTQsCisJMTYsIDI3NDc0MTI0OCwgOSwgMTY4LCAzLCA0MTk0MzA0LCAzLCA0MjA5OTQ5LCAwLCAwLCAwLCAyNTYsIDE0LAorCTE3NCwgMSwgMTE0ODU3LCAxLCAzMzU2MDAwNywgMTIsIDE3NiwgMCwgMTAyNDAsIDEsIDExNDg1OCwgMSwKKwkzMzU2MDAxOCwgMSwgMTE0ODU3LCAzLCAzMzU2MDAwNywgMSwgMTYwMDgsIDEsIDExNDg3NCwgMSwKKwkzMzU2MDM2MCwgMSwgMTE0ODc1LCAxLCAzMzU2MDE1NCwgMCwgMTU5NjMsIDAsIDI1NiwgMCwgNDA5NiwgMSwKKwk0MDk2MTEsIDksIDE4OCwgMCwgMTAyNDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKK3N0YXRpYyBpbnQgUjEyOF9SRUFEX1BMTChkcm1fZGV2aWNlX3QgKmRldiwgaW50IGFkZHIpCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlSMTI4X1dSSVRFOChSMTI4X0NMT0NLX0NOVExfSU5ERVgsIGFkZHIgJiAweDFmKTsKKwlyZXR1cm4gUjEyOF9SRUFEKFIxMjhfQ0xPQ0tfQ05UTF9EQVRBKTsKK30KKworI2lmIFIxMjhfRklGT19ERUJVRworc3RhdGljIHZvaWQgcjEyOF9zdGF0dXMoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXByaW50ayggIkdVSV9TVEFUICAgICAgICAgICA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSMTI4X1JFQUQoIFIxMjhfR1VJX1NUQVQgKSApOworCXByaW50ayggIlBNNF9TVEFUICAgICAgICAgICA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSMTI4X1JFQUQoIFIxMjhfUE00X1NUQVQgKSApOworCXByaW50ayggIlBNNF9CVUZGRVJfRExfV1BUUiA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludClSMTI4X1JFQUQoIFIxMjhfUE00X0JVRkZFUl9ETF9XUFRSICkgKTsKKwlwcmludGsoICJQTTRfQlVGRkVSX0RMX1JQVFIgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfRExfUlBUUiApICk7CisJcHJpbnRrKCAiUE00X01JQ1JPX0NOVEwgICAgID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVIxMjhfUkVBRCggUjEyOF9QTTRfTUlDUk9fQ05UTCApICk7CisJcHJpbnRrKCAiUE00X0JVRkZFUl9DTlRMICAgID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVIxMjhfUkVBRCggUjEyOF9QTTRfQlVGRkVSX0NOVEwgKSApOworfQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5naW5lLCBGSUZPIGNvbnRyb2wKKyAqLworCitzdGF0aWMgaW50IHIxMjhfZG9fcGl4Y2FjaGVfZmx1c2goIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXUzMiB0bXA7CisJaW50IGk7CisKKwl0bXAgPSBSMTI4X1JFQUQoIFIxMjhfUENfTkdVSV9DVExTVEFUICkgfCBSMTI4X1BDX0ZMVVNIX0FMTDsKKwlSMTI4X1dSSVRFKCBSMTI4X1BDX05HVUlfQ1RMU1RBVCwgdG1wICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlpZiAoICEoUjEyOF9SRUFEKCBSMTI4X1BDX05HVUlfQ1RMU1RBVCApICYgUjEyOF9QQ19CVVNZKSApIHsKKwkJCXJldHVybiAwOworCQl9CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKyNpZiBSMTI4X0ZJRk9fREVCVUcKKwlEUk1fRVJST1IoICJmYWlsZWQhXG4iICk7CisjZW5kaWYKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9kb193YWl0X2Zvcl9maWZvKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgZW50cmllcyApCit7CisJaW50IGk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlpbnQgc2xvdHMgPSBSMTI4X1JFQUQoIFIxMjhfR1VJX1NUQVQgKSAmIFIxMjhfR1VJX0ZJRk9DTlRfTUFTSzsKKwkJaWYgKCBzbG90cyA+PSBlbnRyaWVzICkgcmV0dXJuIDA7CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKyNpZiBSMTI4X0ZJRk9fREVCVUcKKwlEUk1fRVJST1IoICJmYWlsZWQhXG4iICk7CisjZW5kaWYKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9kb193YWl0X2Zvcl9pZGxlKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlpbnQgaSwgcmV0OworCisJcmV0ID0gcjEyOF9kb193YWl0X2Zvcl9maWZvKCBkZXZfcHJpdiwgNjQgKTsKKwlpZiAoIHJldCApIHJldHVybiByZXQ7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQlpZiAoICEoUjEyOF9SRUFEKCBSMTI4X0dVSV9TVEFUICkgJiBSMTI4X0dVSV9BQ1RJVkUpICkgeworCQkJcjEyOF9kb19waXhjYWNoZV9mbHVzaCggZGV2X3ByaXYgKTsKKwkJCXJldHVybiAwOworCQl9CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKyNpZiBSMTI4X0ZJRk9fREVCVUcKKwlEUk1fRVJST1IoICJmYWlsZWQhXG4iICk7CisjZW5kaWYKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ0NFIGNvbnRyb2wsIGluaXRpYWxpemF0aW9uCisgKi8KKworLyogTG9hZCB0aGUgbWljcm9jb2RlIGZvciB0aGUgQ0NFICovCitzdGF0aWMgdm9pZCByMTI4X2NjZV9sb2FkX21pY3JvY29kZSggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJaW50IGk7CisKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCXIxMjhfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKworCVIxMjhfV1JJVEUoIFIxMjhfUE00X01JQ1JPQ09ERV9BRERSLCAwICk7CisJZm9yICggaSA9IDAgOyBpIDwgMjU2IDsgaSsrICkgeworCQlSMTI4X1dSSVRFKCBSMTI4X1BNNF9NSUNST0NPREVfREFUQUgsCisJCQkgICAgcjEyOF9jY2VfbWljcm9jb2RlW2kgKiAyXSApOworCQlSMTI4X1dSSVRFKCBSMTI4X1BNNF9NSUNST0NPREVfREFUQUwsCisJCQkgICAgcjEyOF9jY2VfbWljcm9jb2RlW2kgKiAyICsgMV0gKTsKKwl9Cit9CisKKy8qIEZsdXNoIGFueSBwZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSBDQ0UuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQganVzdAorICogcHJpb3IgdG8gYSB3YWl0IGZvciBpZGxlLCBhcyBpdCBpbmZvcm1zIHRoZSBlbmdpbmUgdGhhdCB0aGUgY29tbWFuZAorICogc3RyZWFtIGlzIGVuZGluZy4KKyAqLworc3RhdGljIHZvaWQgcjEyOF9kb19jY2VfZmx1c2goIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXUzMiB0bXA7CisKKwl0bXAgPSBSMTI4X1JFQUQoIFIxMjhfUE00X0JVRkZFUl9ETF9XUFRSICkgfCBSMTI4X1BNNF9CVUZGRVJfRExfRE9ORTsKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiwgdG1wICk7Cit9CisKKy8qIFdhaXQgZm9yIHRoZSBDQ0UgdG8gZ28gaWRsZS4KKyAqLworaW50IHIxMjhfZG9fY2NlX2lkbGUoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJaWYgKCBHRVRfUklOR19IRUFEKCBkZXZfcHJpdiApID09IGRldl9wcml2LT5yaW5nLnRhaWwgKSB7CisJCQlpbnQgcG00c3RhdCA9IFIxMjhfUkVBRCggUjEyOF9QTTRfU1RBVCApOworCQkJaWYgKCAoIChwbTRzdGF0ICYgUjEyOF9QTTRfRklGT0NOVF9NQVNLKSA+PQorCQkJICAgICAgIGRldl9wcml2LT5jY2VfZmlmb19zaXplICkgJiYKKwkJCSAgICAgIShwbTRzdGF0ICYgKFIxMjhfUE00X0JVU1kgfAorCQkJCQkgIFIxMjhfUE00X0dVSV9BQ1RJVkUpKSApIHsKKwkJCQlyZXR1cm4gcjEyOF9kb19waXhjYWNoZV9mbHVzaCggZGV2X3ByaXYgKTsKKwkJCX0KKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUjEyOF9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworCXIxMjhfc3RhdHVzKCBkZXZfcHJpdiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCisvKiBTdGFydCB0aGUgQ29uY3VycmVudCBDb21tYW5kIEVuZ2luZS4KKyAqLworc3RhdGljIHZvaWQgcjEyOF9kb19jY2Vfc3RhcnQoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXIxMjhfZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKworCVIxMjhfV1JJVEUoIFIxMjhfUE00X0JVRkZFUl9DTlRMLAorCQkgICAgZGV2X3ByaXYtPmNjZV9tb2RlIHwgZGV2X3ByaXYtPnJpbmcuc2l6ZV9sMnF3CisJCSAgICB8IFIxMjhfUE00X0JVRkZFUl9DTlRMX05PVVBEQVRFICk7CisJUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfQUREUiApOyAvKiBhcyBwZXIgdGhlIHNhbXBsZSBjb2RlICovCisJUjEyOF9XUklURSggUjEyOF9QTTRfTUlDUk9fQ05UTCwgUjEyOF9QTTRfTUlDUk9fRlJFRVJVTiApOworCisJZGV2X3ByaXYtPmNjZV9ydW5uaW5nID0gMTsKK30KKworLyogUmVzZXQgdGhlIENvbmN1cnJlbnQgQ29tbWFuZCBFbmdpbmUuICBUaGlzIHdpbGwgbm90IGZsdXNoIGFueSBwZW5kaW5nCisgKiBjb21tYW5kcywgc28geW91IG11c3Qgd2FpdCBmb3IgdGhlIENDRSBjb21tYW5kIHN0cmVhbSB0byBjb21wbGV0ZQorICogYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCByMTI4X2RvX2NjZV9yZXNldCggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0RMX1dQVFIsIDAgKTsKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfRExfUlBUUiwgMCApOworCWRldl9wcml2LT5yaW5nLnRhaWwgPSAwOworfQorCisvKiBTdG9wIHRoZSBDb25jdXJyZW50IENvbW1hbmQgRW5naW5lLiAgVGhpcyB3aWxsIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICogY29tbWFuZHMsIHNvIHlvdSBtdXN0IGZsdXNoIHRoZSBjb21tYW5kIHN0cmVhbSBhbmQgd2FpdCBmb3IgdGhlIENDRQorICogdG8gZ28gaWRsZSBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHIxMjhfZG9fY2NlX3N0b3AoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCVIxMjhfV1JJVEUoIFIxMjhfUE00X01JQ1JPX0NOVEwsIDAgKTsKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfQ05UTCwKKwkJICAgIFIxMjhfUE00X05PTlBNNCB8IFIxMjhfUE00X0JVRkZFUl9DTlRMX05PVVBEQVRFICk7CisKKwlkZXZfcHJpdi0+Y2NlX3J1bm5pbmcgPSAwOworfQorCisvKiBSZXNldCB0aGUgZW5naW5lLiAgVGhpcyB3aWxsIHN0b3AgdGhlIENDRSBpZiBpdCBpcyBydW5uaW5nLgorICovCitzdGF0aWMgaW50IHIxMjhfZG9fZW5naW5lX3Jlc2V0KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIGNsb2NrX2NudGxfaW5kZXgsIG1jbGtfY250bCwgZ2VuX3Jlc2V0X2NudGw7CisKKwlyMTI4X2RvX3BpeGNhY2hlX2ZsdXNoKCBkZXZfcHJpdiApOworCisJY2xvY2tfY250bF9pbmRleCA9IFIxMjhfUkVBRCggUjEyOF9DTE9DS19DTlRMX0lOREVYICk7CisJbWNsa19jbnRsID0gUjEyOF9SRUFEX1BMTCggZGV2LCBSMTI4X01DTEtfQ05UTCApOworCisJUjEyOF9XUklURV9QTEwoIFIxMjhfTUNMS19DTlRMLAorCQkJbWNsa19jbnRsIHwgUjEyOF9GT1JDRV9HQ1AgfCBSMTI4X0ZPUkNFX1BJUEUzRF9DUCApOworCisJZ2VuX3Jlc2V0X2NudGwgPSBSMTI4X1JFQUQoIFIxMjhfR0VOX1JFU0VUX0NOVEwgKTsKKworCS8qIFRha2VuIGZyb20gdGhlIHNhbXBsZSBjb2RlIC0gZG8gbm90IGNoYW5nZSAqLworCVIxMjhfV1JJVEUoIFIxMjhfR0VOX1JFU0VUX0NOVEwsCisJCSAgICBnZW5fcmVzZXRfY250bCB8IFIxMjhfU09GVF9SRVNFVF9HVUkgKTsKKwlSMTI4X1JFQUQoIFIxMjhfR0VOX1JFU0VUX0NOVEwgKTsKKwlSMTI4X1dSSVRFKCBSMTI4X0dFTl9SRVNFVF9DTlRMLAorCQkgICAgZ2VuX3Jlc2V0X2NudGwgJiB+UjEyOF9TT0ZUX1JFU0VUX0dVSSApOworCVIxMjhfUkVBRCggUjEyOF9HRU5fUkVTRVRfQ05UTCApOworCisJUjEyOF9XUklURV9QTEwoIFIxMjhfTUNMS19DTlRMLCBtY2xrX2NudGwgKTsKKwlSMTI4X1dSSVRFKCBSMTI4X0NMT0NLX0NOVExfSU5ERVgsIGNsb2NrX2NudGxfaW5kZXggKTsKKwlSMTI4X1dSSVRFKCBSMTI4X0dFTl9SRVNFVF9DTlRMLCBnZW5fcmVzZXRfY250bCApOworCisJLyogUmVzZXQgdGhlIENDRSByaW5nICovCisJcjEyOF9kb19jY2VfcmVzZXQoIGRldl9wcml2ICk7CisKKwkvKiBUaGUgQ0NFIGlzIG5vIGxvbmdlciBydW5uaW5nIGFmdGVyIGFuIGVuZ2luZSByZXNldCAqLworCWRldl9wcml2LT5jY2VfcnVubmluZyA9IDA7CisKKwkvKiBSZXNldCBhbnkgcGVuZGluZyB2ZXJ0ZXgsIGluZGlyZWN0IGJ1ZmZlcnMgKi8KKwlyMTI4X2ZyZWVsaXN0X3Jlc2V0KCBkZXYgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9pbml0X3JpbmdfYnVmZmVyKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICAgZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdTMyIHJpbmdfc3RhcnQ7CisJdTMyIHRtcDsKKworCURSTV9ERUJVRyggIlxuIiApOworCisJLyogVGhlIG1hbnVhbCAocC4gMikgc2F5cyB0aGlzIGFkZHJlc3MgaXMgaW4gIlZNIHNwYWNlIi4gIFRoaXMKKwkgKiBtZWFucyBpdCdzIGFuIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiBBR1Agc3BhY2UuCisJICovCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApCisJCXJpbmdfc3RhcnQgPSBkZXZfcHJpdi0+Y2NlX3JpbmctPm9mZnNldCAtIGRldi0+YWdwLT5iYXNlOworCWVsc2UKKyNlbmRpZgorCQlyaW5nX3N0YXJ0ID0gZGV2X3ByaXYtPmNjZV9yaW5nLT5vZmZzZXQgLSBkZXYtPnNnLT5oYW5kbGU7CisKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfT0ZGU0VULCByaW5nX3N0YXJ0IHwgUjEyOF9BR1BfT0ZGU0VUICk7CisKKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfRExfV1BUUiwgMCApOworCVIxMjhfV1JJVEUoIFIxMjhfUE00X0JVRkZFUl9ETF9SUFRSLCAwICk7CisKKwkvKiBTZXQgd2F0ZXJtYXJrIGNvbnRyb2wgKi8KKwlSMTI4X1dSSVRFKCBSMTI4X1BNNF9CVUZGRVJfV01fQ05UTCwKKwkJICAgICgoUjEyOF9XQVRFUk1BUktfTC80KSA8PCBSMTI4X1dNQV9TSElGVCkKKwkJICAgIHwgKChSMTI4X1dBVEVSTUFSS19NLzQpIDw8IFIxMjhfV01CX1NISUZUKQorCQkgICAgfCAoKFIxMjhfV0FURVJNQVJLX04vNCkgPDwgUjEyOF9XTUNfU0hJRlQpCisJCSAgICB8ICgoUjEyOF9XQVRFUk1BUktfSy82NCkgPDwgUjEyOF9XQl9XTV9TSElGVCkgKTsKKworCS8qIEZvcmNlIHJlYWQuICBXaHk/ICBCZWNhdXNlIGl0J3MgaW4gdGhlIGV4YW1wbGVzLi4uICovCisJUjEyOF9SRUFEKCBSMTI4X1BNNF9CVUZGRVJfQUREUiApOworCisJLyogVHVybiBvbiBidXMgbWFzdGVyaW5nICovCisJdG1wID0gUjEyOF9SRUFEKCBSMTI4X0JVU19DTlRMICkgJiB+UjEyOF9CVVNfTUFTVEVSX0RJUzsKKwlSMTI4X1dSSVRFKCBSMTI4X0JVU19DTlRMLCB0bXAgKTsKK30KKworc3RhdGljIGludCByMTI4X2RvX2luaXRfY2NlKCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3IxMjhfaW5pdF90ICppbml0ICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2OworCisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlkZXZfcHJpdiA9IGRybV9hbGxvYyggc2l6ZW9mKGRybV9yMTI4X3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSICk7CisJaWYgKCBkZXZfcHJpdiA9PSBOVUxMICkKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKworCW1lbXNldCggZGV2X3ByaXYsIDAsIHNpemVvZihkcm1fcjEyOF9wcml2YXRlX3QpICk7CisKKwlkZXZfcHJpdi0+aXNfcGNpID0gaW5pdC0+aXNfcGNpOworCisJaWYgKCBkZXZfcHJpdi0+aXNfcGNpICYmICFkZXYtPnNnICkgeworCQlEUk1fRVJST1IoICJQQ0kgR0FSVCBtZW1vcnkgbm90IGFsbG9jYXRlZCFcbiIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWRldl9wcml2LT51c2VjX3RpbWVvdXQgPSBpbml0LT51c2VjX3RpbWVvdXQ7CisJaWYgKCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDwgMSB8fAorCSAgICAgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA+IFIxMjhfTUFYX1VTRUNfVElNRU9VVCApIHsKKwkJRFJNX0RFQlVHKCAiVElNRU9VVCBwcm9ibGVtIVxuIiApOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcjEyOF9kb19jbGVhbnVwX2NjZSggZGV2ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZGV2X3ByaXYtPmNjZV9tb2RlID0gaW5pdC0+Y2NlX21vZGU7CisKKwkvKiBHSDogU2ltcGxlIGlkbGUgY2hlY2suCisJICovCisJYXRvbWljX3NldCggJmRldl9wcml2LT5pZGxlX2NvdW50LCAwICk7CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gYnVzLW1hc3RlcmluZyByaW5nIG1vZGUsCisJICogYnV0IHRoZSByaW5nIGNhbiBiZSBpbiBlaXRoZXIgQUdQIG9yIFBDSSBzcGFjZSBmb3IgdGhlIHJpbmcKKwkgKiByZWFkIHBvaW50ZXIuCisJICovCisJaWYgKCAoIGluaXQtPmNjZV9tb2RlICE9IFIxMjhfUE00XzE5MkJNICkgJiYKKwkgICAgICggaW5pdC0+Y2NlX21vZGUgIT0gUjEyOF9QTTRfMTI4Qk1fNjRJTkRCTSApICYmCisJICAgICAoIGluaXQtPmNjZV9tb2RlICE9IFIxMjhfUE00XzY0Qk1fMTI4SU5EQk0gKSAmJgorCSAgICAgKCBpbml0LT5jY2VfbW9kZSAhPSBSMTI4X1BNNF82NEJNXzY0VkNCTV82NElOREJNICkgKSB7CisJCURSTV9ERUJVRyggIkJhZCBjY2VfbW9kZSFcbiIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXN3aXRjaCAoIGluaXQtPmNjZV9tb2RlICkgeworCWNhc2UgUjEyOF9QTTRfTk9OUE00OgorCQlkZXZfcHJpdi0+Y2NlX2ZpZm9fc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgUjEyOF9QTTRfMTkyUElPOgorCWNhc2UgUjEyOF9QTTRfMTkyQk06CisJCWRldl9wcml2LT5jY2VfZmlmb19zaXplID0gMTkyOworCQlicmVhazsKKwljYXNlIFIxMjhfUE00XzEyOFBJT182NElOREJNOgorCWNhc2UgUjEyOF9QTTRfMTI4Qk1fNjRJTkRCTToKKwkJZGV2X3ByaXYtPmNjZV9maWZvX3NpemUgPSAxMjg7CisJCWJyZWFrOworCWNhc2UgUjEyOF9QTTRfNjRQSU9fMTI4SU5EQk06CisJY2FzZSBSMTI4X1BNNF82NEJNXzEyOElOREJNOgorCWNhc2UgUjEyOF9QTTRfNjRQSU9fNjRWQ0JNXzY0SU5EQk06CisJY2FzZSBSMTI4X1BNNF82NEJNXzY0VkNCTV82NElOREJNOgorCWNhc2UgUjEyOF9QTTRfNjRQSU9fNjRWQ1BJT182NElORFBJTzoKKwkJZGV2X3ByaXYtPmNjZV9maWZvX3NpemUgPSA2NDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICggaW5pdC0+ZmJfYnBwICkgeworCWNhc2UgMTY6CisJCWRldl9wcml2LT5jb2xvcl9mbXQgPSBSMTI4X0RBVEFUWVBFX1JHQjU2NTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwlkZWZhdWx0OgorCQlkZXZfcHJpdi0+Y29sb3JfZm10ID0gUjEyOF9EQVRBVFlQRV9BUkdCODg4ODsKKwkJYnJlYWs7CisJfQorCWRldl9wcml2LT5mcm9udF9vZmZzZXQJPSBpbml0LT5mcm9udF9vZmZzZXQ7CisJZGV2X3ByaXYtPmZyb250X3BpdGNoCT0gaW5pdC0+ZnJvbnRfcGl0Y2g7CisJZGV2X3ByaXYtPmJhY2tfb2Zmc2V0CT0gaW5pdC0+YmFja19vZmZzZXQ7CisJZGV2X3ByaXYtPmJhY2tfcGl0Y2gJPSBpbml0LT5iYWNrX3BpdGNoOworCisJc3dpdGNoICggaW5pdC0+ZGVwdGhfYnBwICkgeworCWNhc2UgMTY6CisJCWRldl9wcml2LT5kZXB0aF9mbXQgPSBSMTI4X0RBVEFUWVBFX1JHQjU2NTsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwljYXNlIDMyOgorCWRlZmF1bHQ6CisJCWRldl9wcml2LT5kZXB0aF9mbXQgPSBSMTI4X0RBVEFUWVBFX0FSR0I4ODg4OworCQlicmVhazsKKwl9CisJZGV2X3ByaXYtPmRlcHRoX29mZnNldAk9IGluaXQtPmRlcHRoX29mZnNldDsKKwlkZXZfcHJpdi0+ZGVwdGhfcGl0Y2gJPSBpbml0LT5kZXB0aF9waXRjaDsKKwlkZXZfcHJpdi0+c3Bhbl9vZmZzZXQJPSBpbml0LT5zcGFuX29mZnNldDsKKworCWRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXRfYyA9ICgoKGRldl9wcml2LT5mcm9udF9waXRjaC84KSA8PCAyMSkgfAorCQkJCQkgIChkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0ID4+IDUpKTsKKwlkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXRfYyA9ICgoKGRldl9wcml2LT5iYWNrX3BpdGNoLzgpIDw8IDIxKSB8CisJCQkJCSAoZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ID4+IDUpKTsKKwlkZXZfcHJpdi0+ZGVwdGhfcGl0Y2hfb2Zmc2V0X2MgPSAoKChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2gvOCkgPDwgMjEpIHwKKwkJCQkJICAoZGV2X3ByaXYtPmRlcHRoX29mZnNldCA+PiA1KSB8CisJCQkJCSAgUjEyOF9EU1RfVElMRSk7CisJZGV2X3ByaXYtPnNwYW5fcGl0Y2hfb2Zmc2V0X2MgPSAoKChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2gvOCkgPDwgMjEpIHwKKwkJCQkJIChkZXZfcHJpdi0+c3Bhbl9vZmZzZXQgPj4gNSkpOworCisJRFJNX0dFVFNBUkVBKCk7CisJCisJaWYoIWRldl9wcml2LT5zYXJlYSkgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+bW1pbyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvX29mZnNldCk7CisJaWYoIWRldl9wcml2LT5tbWlvKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgbW1pbyByZWdpb24hXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXZfcHJpdi0+Y2NlX3JpbmcgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+cmluZ19vZmZzZXQpOworCWlmKCFkZXZfcHJpdi0+Y2NlX3JpbmcpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBjY2UgcmluZyByZWdpb24hXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXZfcHJpdi0+cmluZ19ycHRyID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPnJpbmdfcnB0cl9vZmZzZXQpOworCWlmKCFkZXZfcHJpdi0+cmluZ19ycHRyKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgcmluZyByZWFkIHBvaW50ZXIhXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKKwlpZighZGV2LT5hZ3BfYnVmZmVyX21hcCkgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIGRtYSBidWZmZXIgcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyMTI4X2RvX2NsZWFudXBfY2NlKCBkZXYgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoICFkZXZfcHJpdi0+aXNfcGNpICkgeworCQlkZXZfcHJpdi0+YWdwX3RleHR1cmVzID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmFncF90ZXh0dXJlc19vZmZzZXQpOworCQlpZighZGV2X3ByaXYtPmFncF90ZXh0dXJlcykgeworCQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBhZ3AgdGV4dHVyZSByZWdpb24hXG4iKTsKKwkJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQkJcjEyOF9kb19jbGVhbnVwX2NjZSggZGV2ICk7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYgPQorCQkoZHJtX3IxMjhfc2FyZWFfdCAqKSgodTggKilkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZSArCisJCQkJICAgICBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoICFkZXZfcHJpdi0+aXNfcGNpICkgeworCQlkcm1fY29yZV9pb3JlbWFwKCBkZXZfcHJpdi0+Y2NlX3JpbmcsIGRldiApOworCQlkcm1fY29yZV9pb3JlbWFwKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBkZXYgKTsKKwkJZHJtX2NvcmVfaW9yZW1hcCggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2ICk7CisJCWlmKCFkZXZfcHJpdi0+Y2NlX3JpbmctPmhhbmRsZSB8fAorCQkgICAhZGV2X3ByaXYtPnJpbmdfcnB0ci0+aGFuZGxlIHx8CisJCSAgICFkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUpIHsKKwkJCURSTV9FUlJPUigiQ291bGQgbm90IGlvcmVtYXAgYWdwIHJlZ2lvbnMhXG4iKTsKKwkJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQkJcjEyOF9kb19jbGVhbnVwX2NjZSggZGV2ICk7CisJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQl9CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWRldl9wcml2LT5jY2VfcmluZy0+aGFuZGxlID0KKwkJCSh2b2lkICopZGV2X3ByaXYtPmNjZV9yaW5nLT5vZmZzZXQ7CisJCWRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSA9CisJCQkodm9pZCAqKWRldl9wcml2LT5yaW5nX3JwdHItPm9mZnNldDsKKwkJZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlID0gKHZvaWQgKilkZXYtPmFncF9idWZmZXJfbWFwLT5vZmZzZXQ7CisJfQorCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApCisJCWRldl9wcml2LT5jY2VfYnVmZmVyc19vZmZzZXQgPSBkZXYtPmFncC0+YmFzZTsKKwllbHNlCisjZW5kaWYKKwkJZGV2X3ByaXYtPmNjZV9idWZmZXJzX29mZnNldCA9IGRldi0+c2ctPmhhbmRsZTsKKworCWRldl9wcml2LT5yaW5nLnN0YXJ0ID0gKHUzMiAqKWRldl9wcml2LT5jY2VfcmluZy0+aGFuZGxlOworCWRldl9wcml2LT5yaW5nLmVuZCA9ICgodTMyICopZGV2X3ByaXYtPmNjZV9yaW5nLT5oYW5kbGUKKwkJCSAgICAgICsgaW5pdC0+cmluZ19zaXplIC8gc2l6ZW9mKHUzMikpOworCWRldl9wcml2LT5yaW5nLnNpemUgPSBpbml0LT5yaW5nX3NpemU7CisJZGV2X3ByaXYtPnJpbmcuc2l6ZV9sMnF3ID0gZHJtX29yZGVyKCBpbml0LT5yaW5nX3NpemUgLyA4ICk7CisKKwlkZXZfcHJpdi0+cmluZy50YWlsX21hc2sgPQorCQkoZGV2X3ByaXYtPnJpbmcuc2l6ZSAvIHNpemVvZih1MzIpKSAtIDE7CisKKwlkZXZfcHJpdi0+cmluZy5oaWdoX21hcmsgPSAxMjg7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSA9IDA7CisJUjEyOF9XUklURSggUjEyOF9MQVNUX0ZSQU1FX1JFRywgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgKTsKKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gMDsKKwlSMTI4X1dSSVRFKCBSMTI4X0xBU1RfRElTUEFUQ0hfUkVHLAorCQkgICAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggKTsKKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggZGV2X3ByaXYtPmlzX3BjaSApIHsKKyNlbmRpZgorCQlpZiAoIWRybV9hdGlfcGNpZ2FydF9pbml0KCBkZXYsICZkZXZfcHJpdi0+cGh5c19wY2lfZ2FydCwKKyAgICAgCQkJCQkgICAgJmRldl9wcml2LT5idXNfcGNpX2dhcnQpICkgeworCQkJRFJNX0VSUk9SKCAiZmFpbGVkIHRvIGluaXQgUENJIEdBUlQhXG4iICk7CisJCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJfQorCQlSMTI4X1dSSVRFKCBSMTI4X1BDSV9HQVJUX1BBR0UsIGRldl9wcml2LT5idXNfcGNpX2dhcnQgKTsKKyNpZiBfX09TX0hBU19BR1AKKwl9CisjZW5kaWYKKworCXIxMjhfY2NlX2luaXRfcmluZ19idWZmZXIoIGRldiwgZGV2X3ByaXYgKTsKKwlyMTI4X2NjZV9sb2FkX21pY3JvY29kZSggZGV2X3ByaXYgKTsKKworCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCisJcjEyOF9kb19lbmdpbmVfcmVzZXQoIGRldiApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByMTI4X2RvX2NsZWFudXBfY2NlKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisKKwkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKKwkgKiBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgYW5kIGFmdGVyIGRldl9wcml2YXRlCisJICogaXMgZnJlZWQsIGl0J3MgdG9vIGxhdGUuCisJICovCisJaWYgKCBkZXYtPmlycV9lbmFibGVkICkgZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsKKwkJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKyNpZiBfX09TX0hBU19BR1AKKwkJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJCWlmICggZGV2X3ByaXYtPmNjZV9yaW5nICE9IE5VTEwgKQorCQkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXZfcHJpdi0+Y2NlX3JpbmcsIGRldiApOworCQkJaWYgKCBkZXZfcHJpdi0+cmluZ19ycHRyICE9IE5VTEwgKQorCQkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXZfcHJpdi0+cmluZ19ycHRyLCBkZXYgKTsKKwkJCWlmICggZGV2LT5hZ3BfYnVmZmVyX21hcCAhPSBOVUxMICkKKwkJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSggZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2ICk7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCWlmICghZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoIGRldiwKKwkJCQkJCWRldl9wcml2LT5waHlzX3BjaV9nYXJ0LAorCQkJCQkJZGV2X3ByaXYtPmJ1c19wY2lfZ2FydCApKQorCQkJCURSTV9FUlJPUiggImZhaWxlZCB0byBjbGVhbnVwIFBDSSBHQVJUIVxuIiApOworCQl9CisKKwkJZHJtX2ZyZWUoIGRldi0+ZGV2X3ByaXZhdGUsIHNpemVvZihkcm1fcjEyOF9wcml2YXRlX3QpLAorCQkJICAgRFJNX01FTV9EUklWRVIgKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCByMTI4X2NjZV9pbml0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9pbml0X3QgaW5pdDsKKworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaW5pdCwgKGRybV9yMTI4X2luaXRfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoaW5pdCkgKTsKKworCXN3aXRjaCAoIGluaXQuZnVuYyApIHsKKwljYXNlIFIxMjhfSU5JVF9DQ0U6CisJCXJldHVybiByMTI4X2RvX2luaXRfY2NlKCBkZXYsICZpbml0ICk7CisJY2FzZSBSMTI4X0NMRUFOVVBfQ0NFOgorCQlyZXR1cm4gcjEyOF9kb19jbGVhbnVwX2NjZSggZGV2ICk7CisJfQorCisJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKK30KKworaW50IHIxMjhfY2NlX3N0YXJ0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoIGRldl9wcml2LT5jY2VfcnVubmluZyB8fCBkZXZfcHJpdi0+Y2NlX21vZGUgPT0gUjEyOF9QTTRfTk9OUE00ICkgeworCQlEUk1fREVCVUcoICIlcyB3aGlsZSBDQ0UgcnVubmluZ1xuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0KKworCXIxMjhfZG9fY2NlX3N0YXJ0KCBkZXZfcHJpdiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFN0b3AgdGhlIENDRS4gIFRoZSBlbmdpbmUgbXVzdCBoYXZlIGJlZW4gaWRsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcworICogcm91dGluZS4KKyAqLworaW50IHIxMjhfY2NlX3N0b3AoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X2NjZV9zdG9wX3Qgc3RvcDsKKwlpbnQgcmV0OworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChzdG9wLCAoZHJtX3IxMjhfY2NlX3N0b3BfdCBfX3VzZXIgKilkYXRhLCBzaXplb2Yoc3RvcCkgKTsKKworCS8qIEZsdXNoIGFueSBwZW5kaW5nIENDRSBjb21tYW5kcy4gIFRoaXMgZW5zdXJlcyBhbnkgb3V0c3RhbmRpbmcKKwkgKiBjb21tYW5kcyBhcmUgZXhlY3R1dGVkIGJ5IHRoZSBlbmdpbmUgYmVmb3JlIHdlIHR1cm4gaXQgb2ZmLgorCSAqLworCWlmICggc3RvcC5mbHVzaCApIHsKKwkJcjEyOF9kb19jY2VfZmx1c2goIGRldl9wcml2ICk7CisJfQorCisJLyogSWYgd2UgZmFpbCB0byBtYWtlIHRoZSBlbmdpbmUgZ28gaWRsZSwgd2UgcmV0dXJuIGFuIGVycm9yCisJICogY29kZSBzbyB0aGF0IHRoZSBEUk0gaW9jdGwgd3JhcHBlciBjYW4gdHJ5IGFnYWluLgorCSAqLworCWlmICggc3RvcC5pZGxlICkgeworCQlyZXQgPSByMTI4X2RvX2NjZV9pZGxlKCBkZXZfcHJpdiApOworCQlpZiAoIHJldCApIHJldHVybiByZXQ7CisJfQorCisJLyogRmluYWxseSwgd2UgY2FuIHR1cm4gb2ZmIHRoZSBDQ0UuICBJZiB0aGUgZW5naW5lIGlzbid0IGlkbGUsCisJICogd2Ugd2lsbCBnZXQgc29tZSBkcm9wcGVkIHRyaWFuZ2xlcyBhcyB0aGV5IHdvbid0IGJlIGZ1bGx5CisJICogcmVuZGVyZWQgYmVmb3JlIHRoZSBDQ0UgaXMgc2h1dCBkb3duLgorCSAqLworCXIxMjhfZG9fY2NlX3N0b3AoIGRldl9wcml2ICk7CisKKwkvKiBSZXNldCB0aGUgZW5naW5lICovCisJcjEyOF9kb19lbmdpbmVfcmVzZXQoIGRldiApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEp1c3QgcmVzZXQgdGhlIENDRSByaW5nLiAgQ2FsbGVkIGFzIHBhcnQgb2YgYW4gWCBTZXJ2ZXIgZW5naW5lIHJlc2V0LgorICovCitpbnQgcjEyOF9jY2VfcmVzZXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fREVCVUcoICIlcyBjYWxsZWQgYmVmb3JlIGluaXQgZG9uZVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJcjEyOF9kb19jY2VfcmVzZXQoIGRldl9wcml2ICk7CisKKwkvKiBUaGUgQ0NFIGlzIG5vIGxvbmdlciBydW5uaW5nIGFmdGVyIGFuIGVuZ2luZSByZXNldCAqLworCWRldl9wcml2LT5jY2VfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHIxMjhfY2NlX2lkbGUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggZGV2X3ByaXYtPmNjZV9ydW5uaW5nICkgeworCQlyMTI4X2RvX2NjZV9mbHVzaCggZGV2X3ByaXYgKTsKKwl9CisKKwlyZXR1cm4gcjEyOF9kb19jY2VfaWRsZSggZGV2X3ByaXYgKTsKK30KKworaW50IHIxMjhfZW5naW5lX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlyZXR1cm4gcjEyOF9kb19lbmdpbmVfcmVzZXQoIGRldiApOworfQorCitpbnQgcjEyOF9mdWxsc2NyZWVuKCBEUk1fSU9DVExfQVJHUyApCit7CisJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGcmVlbGlzdCBtYW5hZ2VtZW50CisgKi8KKyNkZWZpbmUgUjEyOF9CVUZGRVJfVVNFRAkweGZmZmZmZmZmCisjZGVmaW5lIFIxMjhfQlVGRkVSX0ZSRUUJMAorCisjaWYgMAorc3RhdGljIGludCByMTI4X2ZyZWVsaXN0X2luaXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fcjEyOF9mcmVlbGlzdF90ICplbnRyeTsKKwlpbnQgaTsKKworCWRldl9wcml2LT5oZWFkID0gZHJtX2FsbG9jKCBzaXplb2YoZHJtX3IxMjhfZnJlZWxpc3RfdCksCisJCQkJICAgICBEUk1fTUVNX0RSSVZFUiApOworCWlmICggZGV2X3ByaXYtPmhlYWQgPT0gTlVMTCApCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwltZW1zZXQoIGRldl9wcml2LT5oZWFkLCAwLCBzaXplb2YoZHJtX3IxMjhfZnJlZWxpc3RfdCkgKTsKKwlkZXZfcHJpdi0+aGVhZC0+YWdlID0gUjEyOF9CVUZGRVJfVVNFRDsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRtYS0+YnVmX2NvdW50IDsgaSsrICkgeworCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCQllbnRyeSA9IGRybV9hbGxvYyggc2l6ZW9mKGRybV9yMTI4X2ZyZWVsaXN0X3QpLAorCQkJCSAgICBEUk1fTUVNX0RSSVZFUiApOworCQlpZiAoICFlbnRyeSApIHJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwkJZW50cnktPmFnZSA9IFIxMjhfQlVGRkVSX0ZSRUU7CisJCWVudHJ5LT5idWYgPSBidWY7CisJCWVudHJ5LT5wcmV2ID0gZGV2X3ByaXYtPmhlYWQ7CisJCWVudHJ5LT5uZXh0ID0gZGV2X3ByaXYtPmhlYWQtPm5leHQ7CisJCWlmICggIWVudHJ5LT5uZXh0ICkKKwkJCWRldl9wcml2LT50YWlsID0gZW50cnk7CisKKwkJYnVmX3ByaXYtPmRpc2NhcmQgPSAwOworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisJCWJ1Zl9wcml2LT5saXN0X2VudHJ5ID0gZW50cnk7CisKKwkJZGV2X3ByaXYtPmhlYWQtPm5leHQgPSBlbnRyeTsKKworCQlpZiAoIGRldl9wcml2LT5oZWFkLT5uZXh0ICkKKwkJCWRldl9wcml2LT5oZWFkLT5uZXh0LT5wcmV2ID0gZW50cnk7CisJfQorCisJcmV0dXJuIDA7CisKK30KKyNlbmRpZgorCitzdGF0aWMgZHJtX2J1Zl90ICpyMTI4X2ZyZWVsaXN0X2dldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWRybV9idWZfdCAqYnVmOworCWludCBpLCB0OworCisJLyogRklYTUU6IE9wdGltaXplIC0tIHVzZSBmcmVlbGlzdCBjb2RlICovCisKKwlmb3IgKCBpID0gMCA7IGkgPCBkbWEtPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCWlmICggYnVmLT5maWxwID09IDAgKQorCQkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlmb3IgKCB0ID0gMCA7IHQgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgdCsrICkgeworCQl1MzIgZG9uZV9hZ2UgPSBSMTI4X1JFQUQoIFIxMjhfTEFTVF9ESVNQQVRDSF9SRUcgKTsKKworCQlmb3IgKCBpID0gMCA7IGkgPCBkbWEtPmJ1Zl9jb3VudCA7IGkrKyApIHsKKwkJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwkJCWlmICggYnVmLT5wZW5kaW5nICYmIGJ1Zl9wcml2LT5hZ2UgPD0gZG9uZV9hZ2UgKSB7CisJCQkJLyogVGhlIGJ1ZmZlciBoYXMgYmVlbiBwcm9jZXNzZWQsIHNvIGl0CisJCQkJICogY2FuIG5vdyBiZSB1c2VkLgorCQkJCSAqLworCQkJCWJ1Zi0+cGVuZGluZyA9IDA7CisJCQkJcmV0dXJuIGJ1ZjsKKwkJCX0KKwkJfQorCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisJRFJNX0RFQlVHKCAicmV0dXJuaW5nIE5VTEwhXG4iICk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgcjEyOF9mcmVlbGlzdF9yZXNldCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludCBpOworCisJZm9yICggaSA9IDAgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCWJ1Zl9wcml2LT5hZ2UgPSAwOworCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDQ0UgY29tbWFuZCBzdWJtaXNzaW9uCisgKi8KKworaW50IHIxMjhfd2FpdF9yaW5nKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgbiApCit7CisJZHJtX3IxMjhfcmluZ19idWZmZXJfdCAqcmluZyA9ICZkZXZfcHJpdi0+cmluZzsKKwlpbnQgaTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CisJCXIxMjhfdXBkYXRlX3Jpbmdfc25hcHNob3QoIGRldl9wcml2ICk7CisJCWlmICggcmluZy0+c3BhY2UgPj0gbiApCisJCQlyZXR1cm4gMDsKKwkJRFJNX1VERUxBWSggMSApOworCX0KKworCS8qIEZJWE1FOiBUaGlzIGlzIGJlaW5nIGlnbm9yZWQuLi4gKi8KKwlEUk1fRVJST1IoICJmYWlsZWQhXG4iICk7CisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2dldF9idWZmZXJzKCBEUk1GSUxFIGZpbHAsIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQgKQoreworCWludCBpOworCWRybV9idWZfdCAqYnVmOworCisJZm9yICggaSA9IGQtPmdyYW50ZWRfY291bnQgOyBpIDwgZC0+cmVxdWVzdF9jb3VudCA7IGkrKyApIHsKKwkJYnVmID0gcjEyOF9mcmVlbGlzdF9nZXQoIGRldiApOworCQlpZiAoICFidWYgKSByZXR1cm4gRFJNX0VSUihFQUdBSU4pOworCisJCWJ1Zi0+ZmlscCA9IGZpbHA7CisKKwkJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCAmZC0+cmVxdWVzdF9pbmRpY2VzW2ldLCAmYnVmLT5pZHgsCisJCQkJICAgc2l6ZW9mKGJ1Zi0+aWR4KSApICkKKwkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCWlmICggRFJNX0NPUFlfVE9fVVNFUiggJmQtPnJlcXVlc3Rfc2l6ZXNbaV0sICZidWYtPnRvdGFsLAorCQkJCSAgIHNpemVvZihidWYtPnRvdGFsKSApICkKKwkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwkJZC0+Z3JhbnRlZF9jb3VudCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHIxMjhfY2NlX2J1ZmZlcnMoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludCByZXQgPSAwOworCWRybV9kbWFfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV9kbWFfdCBkOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggZCwgYXJncCwgc2l6ZW9mKGQpICk7CisKKwkvKiBQbGVhc2UgZG9uJ3Qgc2VuZCB1cyBidWZmZXJzLgorCSAqLworCWlmICggZC5zZW5kX2NvdW50ICE9IDAgKSB7CisJCURSTV9FUlJPUiggIlByb2Nlc3MgJWQgdHJ5aW5nIHRvIHNlbmQgJWQgYnVmZmVycyB2aWEgZHJtRE1BXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGQuc2VuZF9jb3VudCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIFdlJ2xsIHNlbmQgeW91IGJ1ZmZlcnMuCisJICovCisJaWYgKCBkLnJlcXVlc3RfY291bnQgPCAwIHx8IGQucmVxdWVzdF9jb3VudCA+IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHRyeWluZyB0byBnZXQgJWQgYnVmZmVycyAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBkLnJlcXVlc3RfY291bnQsIGRtYS0+YnVmX2NvdW50ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZC5ncmFudGVkX2NvdW50ID0gMDsKKworCWlmICggZC5yZXF1ZXN0X2NvdW50ICkgeworCQlyZXQgPSByMTI4X2NjZV9nZXRfYnVmZmVycyggZmlscCwgZGV2LCAmZCApOworCX0KKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoYXJncCwgZCwgc2l6ZW9mKGQpICk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYmExN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qIHIxMjhfZHJtLmggLS0gUHVibGljIGhlYWRlciBmb3IgdGhlIHIxMjggZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogV2VkIEFwciAgNSAxOToyNDoxOSAyMDAwIGJ5IGtldmluQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICovCisKKyNpZm5kZWYgX19SMTI4X0RSTV9IX18KKyNkZWZpbmUgX19SMTI4X0RSTV9IX18KKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFggc2VydmVyIGZpbGUgKHIxMjhfc2FyZWEuaCkKKyAqLworI2lmbmRlZiBfX1IxMjhfU0FSRUFfREVGSU5FU19fCisjZGVmaW5lIF9fUjEyOF9TQVJFQV9ERUZJTkVTX18KKworLyogV2hhdCBuZWVkcyB0byBiZSBjaGFuZ2VkIGZvciB0aGUgY3VycmVudCB2ZXJ0ZXggYnVmZmVyPworICovCisjZGVmaW5lIFIxMjhfVVBMT0FEX0NPTlRFWFQJCTB4MDAxCisjZGVmaW5lIFIxMjhfVVBMT0FEX1NFVFVQCQkweDAwMgorI2RlZmluZSBSMTI4X1VQTE9BRF9URVgwCQkweDAwNAorI2RlZmluZSBSMTI4X1VQTE9BRF9URVgxCQkweDAwOAorI2RlZmluZSBSMTI4X1VQTE9BRF9URVgwSU1BR0VTCQkweDAxMAorI2RlZmluZSBSMTI4X1VQTE9BRF9URVgxSU1BR0VTCQkweDAyMAorI2RlZmluZSBSMTI4X1VQTE9BRF9DT1JFCQkweDA0MAorI2RlZmluZSBSMTI4X1VQTE9BRF9NQVNLUwkJMHgwODAKKyNkZWZpbmUgUjEyOF9VUExPQURfV0lORE9XCQkweDEwMAorI2RlZmluZSBSMTI4X1VQTE9BRF9DTElQUkVDVFMJCTB4MjAwCS8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgUjEyOF9SRVFVSVJFX1FVSUVTQ0VOQ0UJCTB4NDAwCisjZGVmaW5lIFIxMjhfVVBMT0FEX0FMTAkJCTB4N2ZmCisKKyNkZWZpbmUgUjEyOF9GUk9OVAkJCTB4MQorI2RlZmluZSBSMTI4X0JBQ0sJCQkweDIKKyNkZWZpbmUgUjEyOF9ERVBUSAkJCTB4NAorCisvKiBQcmltaXRpdmUgdHlwZXMKKyAqLworI2RlZmluZSBSMTI4X1BPSU5UUwkJCTB4MQorI2RlZmluZSBSMTI4X0xJTkVTCQkJMHgyCisjZGVmaW5lIFIxMjhfTElORV9TVFJJUAkJCTB4MworI2RlZmluZSBSMTI4X1RSSUFOR0xFUwkJCTB4NAorI2RlZmluZSBSMTI4X1RSSUFOR0xFX0ZBTgkJMHg1CisjZGVmaW5lIFIxMjhfVFJJQU5HTEVfU1RSSVAJCTB4NgorCisvKiBWZXJ0ZXgvaW5kaXJlY3QgYnVmZmVyIHNpemUKKyAqLworI2RlZmluZSBSMTI4X0JVRkZFUl9TSVpFCQkxNjM4NAorCisvKiBCeXRlIG9mZnNldHMgZm9yIGluZGlyZWN0IGJ1ZmZlciBkYXRhCisgKi8KKyNkZWZpbmUgUjEyOF9JTkRFWF9QUklNX09GRlNFVAkJMjAKKyNkZWZpbmUgUjEyOF9IT1NUREFUQV9CTElUX09GRlNFVAkzMgorCisvKiBLZWVwIHRoZXNlIHNtYWxsIGZvciB0ZXN0aW5nLgorICovCisjZGVmaW5lIFIxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTCQkxMgorCisvKiBUaGVyZSBhcmUgMiBoZWFwcyAobG9jYWwvQUdQKS4gIEVhY2ggcmVnaW9uIHdpdGhpbiBhIGhlYXAgaXMgYQorICogIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbSBwZXIgaGVhcC4KKyAqLworI2RlZmluZSBSMTI4X0xPQ0FMX1RFWF9IRUFQCQkwCisjZGVmaW5lIFIxMjhfQUdQX1RFWF9IRUFQCQkxCisjZGVmaW5lIFIxMjhfTlJfVEVYX0hFQVBTCQkyCisjZGVmaW5lIFIxMjhfTlJfVEVYX1JFR0lPTlMJCTY0CisjZGVmaW5lIFIxMjhfTE9HX1RFWF9HUkFOVUxBUklUWQkxNgorCisjZGVmaW5lIFIxMjhfTlJfQ09OVEVYVF9SRUdTCQkxMgorCisjZGVmaW5lIFIxMjhfTUFYX1RFWFRVUkVfTEVWRUxTCQkxMQorI2RlZmluZSBSMTI4X01BWF9URVhUVVJFX1VOSVRTCQkyCisKKyNlbmRpZiAvKiBfX1IxMjhfU0FSRUFfREVGSU5FU19fICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBDb250ZXh0IHN0YXRlIC0gY2FuIGJlIHdyaXR0ZW4gaW4gb25lIGxhcmdlIGNodW5rICovCisJdW5zaWduZWQgaW50IGRzdF9waXRjaF9vZmZzZXRfYzsKKwl1bnNpZ25lZCBpbnQgZHBfZ3VpX21hc3Rlcl9jbnRsX2M7CisJdW5zaWduZWQgaW50IHNjX3RvcF9sZWZ0X2M7CisJdW5zaWduZWQgaW50IHNjX2JvdHRvbV9yaWdodF9jOworCXVuc2lnbmVkIGludCB6X29mZnNldF9jOworCXVuc2lnbmVkIGludCB6X3BpdGNoX2M7CisJdW5zaWduZWQgaW50IHpfc3Rlbl9jbnRsX2M7CisJdW5zaWduZWQgaW50IHRleF9jbnRsX2M7CisJdW5zaWduZWQgaW50IG1pc2NfM2Rfc3RhdGVfY250bF9yZWc7CisJdW5zaWduZWQgaW50IHRleHR1cmVfY2xyX2NtcF9jbHJfYzsKKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9jbHJfY21wX21za19jOworCXVuc2lnbmVkIGludCBmb2dfY29sb3JfYzsKKworCS8qIFRleHR1cmUgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgdGV4X3NpemVfcGl0Y2hfYzsKKwl1bnNpZ25lZCBpbnQgY29uc3RhbnRfY29sb3JfYzsKKworCS8qIFNldHVwIHN0YXRlICovCisJdW5zaWduZWQgaW50IHBtNF92Y19mcHVfc2V0dXA7CisJdW5zaWduZWQgaW50IHNldHVwX2NudGw7CisKKwkvKiBNYXNrIHN0YXRlICovCisJdW5zaWduZWQgaW50IGRwX3dyaXRlX21hc2s7CisJdW5zaWduZWQgaW50IHN0ZW5fcmVmX21hc2tfYzsKKwl1bnNpZ25lZCBpbnQgcGxhbmVfM2RfbWFza19jOworCisJLyogV2luZG93IHN0YXRlICovCisJdW5zaWduZWQgaW50IHdpbmRvd194eV9vZmZzZXQ7CisKKwkvKiBDb3JlIHN0YXRlICovCisJdW5zaWduZWQgaW50IHNjYWxlXzNkX2NudGw7Cit9IGRybV9yMTI4X2NvbnRleHRfcmVnc190OworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIGVhY2ggdGV4dHVyZSB1bml0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdGV4X2NudGw7CisJdW5zaWduZWQgaW50IHRleF9jb21iaW5lX2NudGw7CisJdW5zaWduZWQgaW50IHRleF9zaXplX3BpdGNoOworCXVuc2lnbmVkIGludCB0ZXhfb2Zmc2V0W1IxMjhfTUFYX1RFWFRVUkVfTEVWRUxTXTsKKwl1bnNpZ25lZCBpbnQgdGV4X2JvcmRlcl9jb2xvcjsKK30gZHJtX3IxMjhfdGV4dHVyZV9yZWdzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfc2FyZWEgeworCS8qIFRoZSBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIG9mIHN0YXRlIGluZm9ybWF0aW9uIHRvIHRoZSBrZXJuZWwKKwkgKiBvbiBmaXJpbmcgYSB2ZXJ0ZXggYnVmZmVyLgorCSAqLworCWRybV9yMTI4X2NvbnRleHRfcmVnc190IGNvbnRleHRfc3RhdGU7CisJZHJtX3IxMjhfdGV4dHVyZV9yZWdzX3QgdGV4X3N0YXRlW1IxMjhfTUFYX1RFWFRVUkVfVU5JVFNdOworCXVuc2lnbmVkIGludCBkaXJ0eTsKKwl1bnNpZ25lZCBpbnQgdmVydHNpemU7CisJdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsKKworCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KKwkgKi8KKwlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbUjEyOF9OUl9TQVJFQV9DTElQUkVDVFNdOworCXVuc2lnbmVkIGludCBuYm94OworCisJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCisJICovCisJdW5zaWduZWQgaW50IGxhc3RfZnJhbWU7CisJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CisKKwlkcm1fdGV4X3JlZ2lvbl90IHRleF9saXN0W1IxMjhfTlJfVEVYX0hFQVBTXVtSMTI4X05SX1RFWF9SRUdJT05TKzFdOworCXVuc2lnbmVkIGludCB0ZXhfYWdlW1IxMjhfTlJfVEVYX0hFQVBTXTsKKwlpbnQgY3R4X293bmVyOworCWludCBwZkFsbG93UGFnZUZsaXA7ICAgICAgICAvKiBudW1iZXIgb2YgM2Qgd2luZG93cyAoMCwxLDIgb3IgbW9yZSkgKi8KKwlpbnQgcGZDdXJyZW50UGFnZTsJICAgIC8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCit9IGRybV9yMTI4X3NhcmVhX3Q7CisKKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIgZmlsZSAoeGY4NmRybVIxMjguaCkKKyAqLworCisvKiBSYWdlIDEyOCBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9SMTI4X0lOSVQgICAgICAgMHgwMAorI2RlZmluZSBEUk1fUjEyOF9DQ0VfU1RBUlQgIDB4MDEKKyNkZWZpbmUgRFJNX1IxMjhfQ0NFX1NUT1AgICAweDAyCisjZGVmaW5lIERSTV9SMTI4X0NDRV9SRVNFVCAgMHgwMworI2RlZmluZSBEUk1fUjEyOF9DQ0VfSURMRSAgIDB4MDQKKy8qIDB4MDUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX1IxMjhfUkVTRVQgICAgICAweDA2CisjZGVmaW5lIERSTV9SMTI4X1NXQVAgICAgICAgMHgwNworI2RlZmluZSBEUk1fUjEyOF9DTEVBUiAgICAgIDB4MDgKKyNkZWZpbmUgRFJNX1IxMjhfVkVSVEVYICAgICAweDA5CisjZGVmaW5lIERSTV9SMTI4X0lORElDRVMgICAgMHgwYQorI2RlZmluZSBEUk1fUjEyOF9CTElUICAgICAgIDB4MGIKKyNkZWZpbmUgRFJNX1IxMjhfREVQVEggICAgICAweDBjCisjZGVmaW5lIERSTV9SMTI4X1NUSVBQTEUgICAgMHgwZAorLyogMHgwZSBub3QgdXNlZCAqLworI2RlZmluZSBEUk1fUjEyOF9JTkRJUkVDVCAgIDB4MGYKKyNkZWZpbmUgRFJNX1IxMjhfRlVMTFNDUkVFTiAweDEwCisjZGVmaW5lIERSTV9SMTI4X0NMRUFSMiAgICAgMHgxMQorI2RlZmluZSBEUk1fUjEyOF9HRVRQQVJBTSAgIDB4MTIKKyNkZWZpbmUgRFJNX1IxMjhfRkxJUCAgICAgICAweDEzCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfSU5JVCAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfSU5JVCwgZHJtX3IxMjhfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfU1RBUlQgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfU1RBUlQpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NDRV9TVE9QICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NDRV9TVE9QLCBkcm1fcjEyOF9jY2Vfc3RvcF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfUkVTRVQgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NDRV9JRExFICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NDRV9JRExFKQorLyogMHgwNSBub3QgdXNlZCAqLworI2RlZmluZSBEUk1fSU9DVExfUjEyOF9SRVNFVCAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9SRVNFVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfU1dBUCAgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfU1dBUCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0xFQVIgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0xFQVIsIGRybV9yMTI4X2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X1ZFUlRFWCAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X1ZFUlRFWCwgZHJtX3IxMjhfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0lORElDRVMgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0lORElDRVMsIGRybV9yMTI4X2luZGljZXNfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQkxJVCAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQkxJVCwgZHJtX3IxMjhfYmxpdF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9ERVBUSCAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9ERVBUSCwgZHJtX3IxMjhfZGVwdGhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfU1RJUFBMRSAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfU1RJUFBMRSwgZHJtX3IxMjhfc3RpcHBsZV90KQorLyogMHgwZSBub3QgdXNlZCAqLworI2RlZmluZSBEUk1fSU9DVExfUjEyOF9JTkRJUkVDVCAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9JTkRJUkVDVCwgZHJtX3IxMjhfaW5kaXJlY3RfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfRlVMTFNDUkVFTiBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfRlVMTFNDUkVFTiwgZHJtX3IxMjhfZnVsbHNjcmVlbl90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DTEVBUjIgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DTEVBUjIsIGRybV9yMTI4X2NsZWFyMl90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9HRVRQQVJBTSAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9HRVRQQVJBTSwgZHJtX3IxMjhfZ2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfRkxJUCAgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfRkxJUCkKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfaW5pdCB7CisJZW51bSB7CisJCVIxMjhfSU5JVF9DQ0UgICAgPSAweDAxLAorCQlSMTI4X0NMRUFOVVBfQ0NFID0gMHgwMgorCX0gZnVuYzsKKyNpZiBDT05GSUdfWEZSRUU4Nl9WRVJTSU9OIDwgWEZSRUU4Nl9WRVJTSU9OKDQsMSwwLDApCisJaW50IHNhcmVhX3ByaXZfb2Zmc2V0OworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIHNhcmVhX3ByaXZfb2Zmc2V0OworI2VuZGlmCisJaW50IGlzX3BjaTsKKwlpbnQgY2NlX21vZGU7CisJaW50IGNjZV9zZWN1cmU7CisJaW50IHJpbmdfc2l6ZTsKKwlpbnQgdXNlY190aW1lb3V0OworCisJdW5zaWduZWQgaW50IGZiX2JwcDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0LCBmcm9udF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQsIGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX2JwcDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0LCBkZXB0aF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgc3Bhbl9vZmZzZXQ7CisKKyNpZiBDT05GSUdfWEZSRUU4Nl9WRVJTSU9OIDwgWEZSRUU4Nl9WRVJTSU9OKDQsMSwwLDApCisJdW5zaWduZWQgaW50IGZiX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfb2Zmc2V0OworCXVuc2lnbmVkIGludCByaW5nX3JwdHJfb2Zmc2V0OworCXVuc2lnbmVkIGludCBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYWdwX3RleHR1cmVzX29mZnNldDsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBmYl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcmluZ19ycHRyX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYWdwX3RleHR1cmVzX29mZnNldDsKKyNlbmRpZgorfSBkcm1fcjEyOF9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2NjZV9zdG9wIHsKKwlpbnQgZmx1c2g7CisJaW50IGlkbGU7Cit9IGRybV9yMTI4X2NjZV9zdG9wX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2NsZWFyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisjaWYgQ09ORklHX1hGUkVFODZfVkVSU0lPTiA8IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorCWludCB4LCB5LCB3LCBoOworI2VuZGlmCisJdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aDsKKyNpZiBDT05GSUdfWEZSRUU4Nl9WRVJTSU9OID49IFhGUkVFODZfVkVSU0lPTig0LDEsMCwwKQorCXVuc2lnbmVkIGludCBjb2xvcl9tYXNrOworCXVuc2lnbmVkIGludCBkZXB0aF9tYXNrOworI2VuZGlmCit9IGRybV9yMTI4X2NsZWFyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3ZlcnRleCB7CisJaW50IHByaW07CisJaW50IGlkeDsJCQkvKiBJbmRleCBvZiB2ZXJ0ZXggYnVmZmVyICovCisJaW50IGNvdW50OwkJCS8qIE51bWJlciBvZiB2ZXJ0aWNlcyBpbiBidWZmZXIgKi8KKwlpbnQgZGlzY2FyZDsJCQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9yMTI4X3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9pbmRpY2VzIHsKKwlpbnQgcHJpbTsKKwlpbnQgaWR4OworCWludCBzdGFydDsKKwlpbnQgZW5kOworCWludCBkaXNjYXJkOwkJCS8qIENsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gKi8KK30gZHJtX3IxMjhfaW5kaWNlc190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9ibGl0IHsKKwlpbnQgaWR4OworCWludCBwaXRjaDsKKwlpbnQgb2Zmc2V0OworCWludCBmb3JtYXQ7CisJdW5zaWduZWQgc2hvcnQgeCwgeTsKKwl1bnNpZ25lZCBzaG9ydCB3aWR0aCwgaGVpZ2h0OworfSBkcm1fcjEyOF9ibGl0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2RlcHRoIHsKKwllbnVtIHsKKwkJUjEyOF9XUklURV9TUEFOCQk9IDB4MDEsCisJCVIxMjhfV1JJVEVfUElYRUxTCT0gMHgwMiwKKwkJUjEyOF9SRUFEX1NQQU4JCT0gMHgwMywKKwkJUjEyOF9SRUFEX1BJWEVMUwk9IDB4MDQKKwl9IGZ1bmM7CisJaW50IG47CisJaW50IF9fdXNlciAqeDsKKwlpbnQgX191c2VyICp5OworCXVuc2lnbmVkIGludCBfX3VzZXIgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyIF9fdXNlciAqbWFzazsKK30gZHJtX3IxMjhfZGVwdGhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfc3RpcHBsZSB7CisJdW5zaWduZWQgaW50IF9fdXNlciAqbWFzazsKK30gZHJtX3IxMjhfc3RpcHBsZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9pbmRpcmVjdCB7CisJaW50IGlkeDsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsKK30gZHJtX3IxMjhfaW5kaXJlY3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfZnVsbHNjcmVlbiB7CisJZW51bSB7CisJCVIxMjhfSU5JVF9GVUxMU0NSRUVOICAgID0gMHgwMSwKKwkJUjEyOF9DTEVBTlVQX0ZVTExTQ1JFRU4gPSAweDAyCisJfSBmdW5jOworfSBkcm1fcjEyOF9mdWxsc2NyZWVuX3Q7CisKKy8qIDIuMzogQW4gaW9jdGwgdG8gZ2V0IHBhcmFtZXRlcnMgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIHRvIHRoZSAzZAorICogY2xpZW50IGFueSBvdGhlciB3YXkuICAKKyAqLworI2RlZmluZSBSMTI4X1BBUkFNX0lSUV9OUiAgICAgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwl2b2lkIF9fdXNlciAqdmFsdWU7Cit9IGRybV9yMTI4X2dldHBhcmFtX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDYzODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIHIxMjhfZHJ2LmMgLS0gQVRJIFJhZ2UgMTI4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBEZWMgMTMgMDk6NDc6MjcgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcm0uaCIKKyNpbmNsdWRlICJyMTI4X2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitzdGF0aWMgaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKK3sKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJcjEyOF9QQ0lfSURTCit9OworCitleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCByMTI4X2lvY3Rsc1tdOworZXh0ZXJuIGludCByMTI4X21heF9pb2N0bDsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfUENJX0RNQSB8IERSSVZFUl9TRyB8IERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0lSUV9WQkwsCisJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX3IxMjhfYnVmX3ByaXZfdCksCisJLnByZXJlbGVhc2UgPSByMTI4X2RyaXZlcl9wcmVyZWxlYXNlLAorCS5wcmV0YWtlZG93biA9IHIxMjhfZHJpdmVyX3ByZXRha2Vkb3duLAorCS52Ymxhbmtfd2FpdCA9IHIxMjhfZHJpdmVyX3ZibGFua193YWl0LAorCS5pcnFfcHJlaW5zdGFsbCA9IHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSByMTI4X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCisJLmlycV91bmluc3RhbGwgPSByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsLAorCS5pcnFfaGFuZGxlciA9IHIxMjhfZHJpdmVyX2lycV9oYW5kbGVyLAorCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSByMTI4X2lvY3RscywKKwkuZG1hX2lvY3RsID0gcjEyOF9jY2VfYnVmZmVycywKKwkuZm9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gZHJtX29wZW4sCisJCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJCS5pb2N0bCA9IGRybV9pb2N0bCwKKwkJLm1tYXAgPSBkcm1fbW1hcCwKKwkJLnBvbGwgPSBkcm1fcG9sbCwKKwkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlICAgICAgPSBwY2lpZGxpc3QsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgcjEyOF9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSByMTI4X21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByMTI4X2V4aXQodm9pZCkKK3sKKwlkcm1fZXhpdCgmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocjEyOF9pbml0KTsKK21vZHVsZV9leGl0KHIxMjhfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxYWE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaApAQCAtMCwwICsxLDUyMSBAQAorLyogcjEyOF9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgcjEyOCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gRGVjIDEzIDA5OjUxOjExIDE5OTkgYnkgZmFpdGhAcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CisgKiAgICBLZXZpbiBFLiBNYXJ0aW4gPG1hcnRpbkB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqICAgIE1pY2hlbCBE77+9emVyIDxkYWVuemVybUBzdHVkZW50LmV0aHouY2g+CisgKi8KKworI2lmbmRlZiBfX1IxMjhfRFJWX0hfXworI2RlZmluZSBfX1IxMjhfRFJWX0hfXworCisvKiBHZW5lcmFsIGN1c3RvbWl6YXRpb246CisgKi8KKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIkdhcmV0aCBIdWdoZXMsIFZBIExpbnV4IFN5c3RlbXMgSW5jLiIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJInIxMjgiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiQVRJIFJhZ2UgMTI4IgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDMwNzI1IgorCisvKiBJbnRlcmZhY2UgaGlzdG9yeToKKyAqCisgKiA/PyAgLSA/PworICogMi40IC0gQWRkIHN1cHBvcnQgZm9yIHljYmNyIHRleHR1cmVzIChubyBuZXcgaW9jdGxzKQorICogMi41IC0gQWRkIEZMSVAgaW9jdGwsIGRpc2FibGUgRlVMTFNDUkVFTi4KKyAqLworI2RlZmluZSBEUklWRVJfTUFKT1IJCTIKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQk1CisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKworCisjZGVmaW5lIEdFVF9SSU5HX0hFQUQoZGV2X3ByaXYpCQlSMTI4X1JFQUQoIFIxMjhfUE00X0JVRkZFUl9ETF9SUFRSICkKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfZnJlZWxpc3QgeworICAgCXVuc2lnbmVkIGludCBhZ2U7CisgICAJZHJtX2J1Zl90ICpidWY7CisgICAJc3RydWN0IGRybV9yMTI4X2ZyZWVsaXN0ICpuZXh0OworICAgCXN0cnVjdCBkcm1fcjEyOF9mcmVlbGlzdCAqcHJldjsKK30gZHJtX3IxMjhfZnJlZWxpc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfcmluZ19idWZmZXIgeworCXUzMiAqc3RhcnQ7CisJdTMyICplbmQ7CisJaW50IHNpemU7CisJaW50IHNpemVfbDJxdzsKKworCXUzMiB0YWlsOworCXUzMiB0YWlsX21hc2s7CisJaW50IHNwYWNlOworCisJaW50IGhpZ2hfbWFyazsKK30gZHJtX3IxMjhfcmluZ19idWZmZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfcHJpdmF0ZSB7CisJZHJtX3IxMjhfcmluZ19idWZmZXJfdCByaW5nOworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXY7CisKKwlpbnQgY2NlX21vZGU7CisJaW50IGNjZV9maWZvX3NpemU7CisJaW50IGNjZV9ydW5uaW5nOworCisgICAJZHJtX3IxMjhfZnJlZWxpc3RfdCAqaGVhZDsKKyAgIAlkcm1fcjEyOF9mcmVlbGlzdF90ICp0YWlsOworCisJaW50IHVzZWNfdGltZW91dDsKKwlpbnQgaXNfcGNpOworCXVuc2lnbmVkIGxvbmcgcGh5c19wY2lfZ2FydDsKKwlkbWFfYWRkcl90IGJ1c19wY2lfZ2FydDsKKwl1bnNpZ25lZCBsb25nIGNjZV9idWZmZXJzX29mZnNldDsKKworCWF0b21pY190IGlkbGVfY291bnQ7CisKKwlpbnQgcGFnZV9mbGlwcGluZzsKKwlpbnQgY3VycmVudF9wYWdlOworCXUzMiBjcnRjX29mZnNldDsKKwl1MzIgY3J0Y19vZmZzZXRfY250bDsKKworCXUzMiBjb2xvcl9mbXQ7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX3BpdGNoOworCisJdTMyIGRlcHRoX2ZtdDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCBkZXB0aF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgc3Bhbl9vZmZzZXQ7CisKKwl1MzIgZnJvbnRfcGl0Y2hfb2Zmc2V0X2M7CisJdTMyIGJhY2tfcGl0Y2hfb2Zmc2V0X2M7CisJdTMyIGRlcHRoX3BpdGNoX29mZnNldF9jOworCXUzMiBzcGFuX3BpdGNoX29mZnNldF9jOworCisJZHJtX2xvY2FsX21hcF90ICpzYXJlYTsKKwlkcm1fbG9jYWxfbWFwX3QgKm1taW87CisJZHJtX2xvY2FsX21hcF90ICpjY2VfcmluZzsKKwlkcm1fbG9jYWxfbWFwX3QgKnJpbmdfcnB0cjsKKwlkcm1fbG9jYWxfbWFwX3QgKmFncF90ZXh0dXJlczsKK30gZHJtX3IxMjhfcHJpdmF0ZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9idWZfcHJpdiB7CisJdTMyIGFnZTsKKwlpbnQgcHJpbTsKKwlpbnQgZGlzY2FyZDsKKwlpbnQgZGlzcGF0Y2hlZDsKKyAgIAlkcm1fcjEyOF9mcmVlbGlzdF90ICpsaXN0X2VudHJ5OworfSBkcm1fcjEyOF9idWZfcHJpdl90OworCisJCQkJLyogcjEyOF9jY2UuYyAqLworZXh0ZXJuIGludCByMTI4X2NjZV9pbml0KCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByMTI4X2NjZV9zdGFydCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcjEyOF9jY2Vfc3RvcCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcjEyOF9jY2VfcmVzZXQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHIxMjhfY2NlX2lkbGUoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHIxMjhfZW5naW5lX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByMTI4X2Z1bGxzY3JlZW4oIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHIxMjhfY2NlX2J1ZmZlcnMoIERSTV9JT0NUTF9BUkdTICk7CisKK2V4dGVybiB2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoIGRybV9kZXZpY2VfdCAqZGV2ICk7CisKK2V4dGVybiBpbnQgcjEyOF93YWl0X3JpbmcoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBuICk7CisKK2V4dGVybiBpbnQgcjEyOF9kb19jY2VfaWRsZSggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApOworZXh0ZXJuIGludCByMTI4X2RvX2NsZWFudXBfY2NlKCBkcm1fZGV2aWNlX3QgKmRldiApOworCitleHRlcm4gaW50IHIxMjhfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKKworZXh0ZXJuIGlycXJldHVybl90IHIxMjhfZHJpdmVyX2lycV9oYW5kbGVyKCBEUk1fSVJRX0FSR1MgKTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3VuaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCk7CisKKy8qIFJlZ2lzdGVyIGRlZmluaXRpb25zLCByZWdpc3RlciBhY2Nlc3MgbWFjcm9zIGFuZCBkcm1BZGRNYXAgY29uc3RhbnRzCisgKiBmb3IgUmFnZSAxMjgga2VybmVsIGRyaXZlci4KKyAqLworCisjZGVmaW5lIFIxMjhfQVVYX1NDX0NOVEwJCTB4MTY2MAorIwlkZWZpbmUgUjEyOF9BVVgxX1NDX0VOCQkJKDEgPDwgMCkKKyMJZGVmaW5lIFIxMjhfQVVYMV9TQ19NT0RFX09SCQkoMCA8PCAxKQorIwlkZWZpbmUgUjEyOF9BVVgxX1NDX01PREVfTkFORAkJKDEgPDwgMSkKKyMJZGVmaW5lIFIxMjhfQVVYMl9TQ19FTgkJCSgxIDw8IDIpCisjCWRlZmluZSBSMTI4X0FVWDJfU0NfTU9ERV9PUgkJKDAgPDwgMykKKyMJZGVmaW5lIFIxMjhfQVVYMl9TQ19NT0RFX05BTkQJCSgxIDw8IDMpCisjCWRlZmluZSBSMTI4X0FVWDNfU0NfRU4JCQkoMSA8PCA0KQorIwlkZWZpbmUgUjEyOF9BVVgzX1NDX01PREVfT1IJCSgwIDw8IDUpCisjCWRlZmluZSBSMTI4X0FVWDNfU0NfTU9ERV9OQU5ECQkoMSA8PCA1KQorI2RlZmluZSBSMTI4X0FVWDFfU0NfTEVGVAkJMHgxNjY0CisjZGVmaW5lIFIxMjhfQVVYMV9TQ19SSUdIVAkJMHgxNjY4CisjZGVmaW5lIFIxMjhfQVVYMV9TQ19UT1AJCTB4MTY2YworI2RlZmluZSBSMTI4X0FVWDFfU0NfQk9UVE9NCQkweDE2NzAKKyNkZWZpbmUgUjEyOF9BVVgyX1NDX0xFRlQJCTB4MTY3NAorI2RlZmluZSBSMTI4X0FVWDJfU0NfUklHSFQJCTB4MTY3OAorI2RlZmluZSBSMTI4X0FVWDJfU0NfVE9QCQkweDE2N2MKKyNkZWZpbmUgUjEyOF9BVVgyX1NDX0JPVFRPTQkJMHgxNjgwCisjZGVmaW5lIFIxMjhfQVVYM19TQ19MRUZUCQkweDE2ODQKKyNkZWZpbmUgUjEyOF9BVVgzX1NDX1JJR0hUCQkweDE2ODgKKyNkZWZpbmUgUjEyOF9BVVgzX1NDX1RPUAkJMHgxNjhjCisjZGVmaW5lIFIxMjhfQVVYM19TQ19CT1RUT00JCTB4MTY5MAorCisjZGVmaW5lIFIxMjhfQlJVU0hfREFUQTAJCTB4MTQ4MAorI2RlZmluZSBSMTI4X0JVU19DTlRMCQkJMHgwMDMwCisjCWRlZmluZSBSMTI4X0JVU19NQVNURVJfRElTCQkoMSA8PCA2KQorCisjZGVmaW5lIFIxMjhfQ0xPQ0tfQ05UTF9JTkRFWAkJMHgwMDA4CisjZGVmaW5lIFIxMjhfQ0xPQ0tfQ05UTF9EQVRBCQkweDAwMGMKKyMJZGVmaW5lIFIxMjhfUExMX1dSX0VOCQkJKDEgPDwgNykKKyNkZWZpbmUgUjEyOF9DT05TVEFOVF9DT0xPUl9DCQkweDFkMzQKKyNkZWZpbmUgUjEyOF9DUlRDX09GRlNFVAkJMHgwMjI0CisjZGVmaW5lIFIxMjhfQ1JUQ19PRkZTRVRfQ05UTAkJMHgwMjI4CisjCWRlZmluZSBSMTI4X0NSVENfT0ZGU0VUX0ZMSVBfQ05UTAkoMSA8PCAxNikKKworI2RlZmluZSBSMTI4X0RQX0dVSV9NQVNURVJfQ05UTAkJMHgxNDZjCisjICAgICAgIGRlZmluZSBSMTI4X0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwJKDEgICAgPDwgIDApCisjICAgICAgIGRlZmluZSBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwJKDEgICAgPDwgIDEpCisjCWRlZmluZSBSMTI4X0dNQ19CUlVTSF9TT0xJRF9DT0xPUgkoMTMgICA8PCAgNCkKKyMJZGVmaW5lIFIxMjhfR01DX0JSVVNIX05PTkUJCSgxNSAgIDw8ICA0KQorIwlkZWZpbmUgUjEyOF9HTUNfRFNUXzE2QlBQCQkoNCAgICA8PCAgOCkKKyMJZGVmaW5lIFIxMjhfR01DX0RTVF8yNEJQUAkJKDUgICAgPDwgIDgpCisjCWRlZmluZSBSMTI4X0dNQ19EU1RfMzJCUFAJCSg2ICAgIDw8ICA4KQorIyAgICAgICBkZWZpbmUgUjEyOF9HTUNfRFNUX0RBVEFUWVBFX1NISUZUCTgKKyMJZGVmaW5lIFIxMjhfR01DX1NSQ19EQVRBVFlQRV9DT0xPUgkoMyAgICA8PCAxMikKKyMJZGVmaW5lIFIxMjhfRFBfU1JDX1NPVVJDRV9NRU1PUlkJKDIgICAgPDwgMjQpCisjCWRlZmluZSBSMTI4X0RQX1NSQ19TT1VSQ0VfSE9TVF9EQVRBCSgzICAgIDw8IDI0KQorIwlkZWZpbmUgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUwkoMSAgICA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfR01DX0FVWF9DTElQX0RJUwkJKDEgICAgPDwgMjkpCisjCWRlZmluZSBSMTI4X0dNQ19XUl9NU0tfRElTCQkoMSAgICA8PCAzMCkKKyMJZGVmaW5lIFIxMjhfUk9QM19TCQkJMHgwMGNjMDAwMAorIwlkZWZpbmUgUjEyOF9ST1AzX1AJCQkweDAwZjAwMDAwCisjZGVmaW5lIFIxMjhfRFBfV1JJVEVfTUFTSwkJMHgxNmNjCisjZGVmaW5lIFIxMjhfRFNUX1BJVENIX09GRlNFVF9DCQkweDFjODAKKyMJZGVmaW5lIFIxMjhfRFNUX1RJTEUJCQkoMSA8PCAzMSkKKworI2RlZmluZSBSMTI4X0dFTl9JTlRfQ05UTAkJMHgwMDQwCisjCWRlZmluZSBSMTI4X0NSVENfVkJMQU5LX0lOVF9FTgkJKDEgPDwgIDApCisjZGVmaW5lIFIxMjhfR0VOX0lOVF9TVEFUVVMJCTB4MDA0NAorIwlkZWZpbmUgUjEyOF9DUlRDX1ZCTEFOS19JTlQJCSgxIDw8ICAwKQorIwlkZWZpbmUgUjEyOF9DUlRDX1ZCTEFOS19JTlRfQUsJCSgxIDw8ICAwKQorI2RlZmluZSBSMTI4X0dFTl9SRVNFVF9DTlRMCQkweDAwZjAKKyMJZGVmaW5lIFIxMjhfU09GVF9SRVNFVF9HVUkJCSgxIDw8ICAwKQorCisjZGVmaW5lIFIxMjhfR1VJX1NDUkFUQ0hfUkVHMAkJMHgxNWUwCisjZGVmaW5lIFIxMjhfR1VJX1NDUkFUQ0hfUkVHMQkJMHgxNWU0CisjZGVmaW5lIFIxMjhfR1VJX1NDUkFUQ0hfUkVHMgkJMHgxNWU4CisjZGVmaW5lIFIxMjhfR1VJX1NDUkFUQ0hfUkVHMwkJMHgxNWVjCisjZGVmaW5lIFIxMjhfR1VJX1NDUkFUQ0hfUkVHNAkJMHgxNWYwCisjZGVmaW5lIFIxMjhfR1VJX1NDUkFUQ0hfUkVHNQkJMHgxNWY0CisKKyNkZWZpbmUgUjEyOF9HVUlfU1RBVAkJCTB4MTc0MAorIwlkZWZpbmUgUjEyOF9HVUlfRklGT0NOVF9NQVNLCQkweDBmZmYKKyMJZGVmaW5lIFIxMjhfR1VJX0FDVElWRQkJCSgxIDw8IDMxKQorCisjZGVmaW5lIFIxMjhfTUNMS19DTlRMCQkJMHgwMDBmCisjCWRlZmluZSBSMTI4X0ZPUkNFX0dDUAkJCSgxIDw8IDE2KQorIwlkZWZpbmUgUjEyOF9GT1JDRV9QSVBFM0RfQ1AJCSgxIDw8IDE3KQorIwlkZWZpbmUgUjEyOF9GT1JDRV9SQ1AJCQkoMSA8PCAxOCkKKworI2RlZmluZSBSMTI4X1BDX0dVSV9DVExTVEFUCQkweDE3NDgKKyNkZWZpbmUgUjEyOF9QQ19OR1VJX0NUTFNUQVQJCTB4MDE4NAorIwlkZWZpbmUgUjEyOF9QQ19GTFVTSF9HVUkJCSgzIDw8IDApCisjCWRlZmluZSBSMTI4X1BDX1JJX0dVSQkJCSgxIDw8IDIpCisjCWRlZmluZSBSMTI4X1BDX0ZMVVNIX0FMTAkJMHgwMGZmCisjCWRlZmluZSBSMTI4X1BDX0JVU1kJCQkoMSA8PCAzMSkKKworI2RlZmluZSBSMTI4X1BDSV9HQVJUX1BBR0UJCTB4MDE3YworI2RlZmluZSBSMTI4X1BSSU1fVEVYX0NOVExfQwkJMHgxY2IwCisKKyNkZWZpbmUgUjEyOF9TQ0FMRV8zRF9DTlRMCQkweDFhMDAKKyNkZWZpbmUgUjEyOF9TRUNfVEVYX0NOVExfQwkJMHgxZDAwCisjZGVmaW5lIFIxMjhfU0VDX1RFWFRVUkVfQk9SREVSX0NPTE9SX0MJMHgxZDNjCisjZGVmaW5lIFIxMjhfU0VUVVBfQ05UTAkJCTB4MWJjNAorI2RlZmluZSBSMTI4X1NURU5fUkVGX01BU0tfQwkJMHgxZDQwCisKKyNkZWZpbmUgUjEyOF9URVhfQ05UTF9DCQkJMHgxYzljCisjCWRlZmluZSBSMTI4X1RFWF9DQUNIRV9GTFVTSAkJKDEgPDwgMjMpCisKKyNkZWZpbmUgUjEyOF9XQUlUX1VOVElMCQkJMHgxNzIwCisjCWRlZmluZSBSMTI4X0VWRU5UX0NSVENfT0ZGU0VUCQkoMSA8PCAwKQorI2RlZmluZSBSMTI4X1dJTkRPV19YWV9PRkZTRVQJCTB4MWJjYworCisKKy8qIENDRSByZWdpc3RlcnMKKyAqLworI2RlZmluZSBSMTI4X1BNNF9CVUZGRVJfT0ZGU0VUCQkweDA3MDAKKyNkZWZpbmUgUjEyOF9QTTRfQlVGRkVSX0NOVEwJCTB4MDcwNAorIwlkZWZpbmUgUjEyOF9QTTRfTUFTSwkJCSgxNSA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00X05PTlBNNAkJCSgwICA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00XzE5MlBJTwkJCSgxICA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00XzE5MkJNCQkJKDIgIDw8IDI4KQorIwlkZWZpbmUgUjEyOF9QTTRfMTI4UElPXzY0SU5EQk0JCSgzICA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00XzEyOEJNXzY0SU5EQk0JCSg0ICA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00XzY0UElPXzEyOElOREJNCQkoNSAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF82NEJNXzEyOElOREJNCQkoNiAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF82NFBJT182NFZDQk1fNjRJTkRCTQkoNyAgPDwgMjgpCisjCWRlZmluZSBSMTI4X1BNNF82NEJNXzY0VkNCTV82NElOREJNCSg4ICA8PCAyOCkKKyMJZGVmaW5lIFIxMjhfUE00XzY0UElPXzY0VkNQSU9fNjRJTkRQSU8JKDE1IDw8IDI4KQorIwlkZWZpbmUgUjEyOF9QTTRfQlVGRkVSX0NOVExfTk9VUERBVEUJKDEgIDw8IDI3KQorCisjZGVmaW5lIFIxMjhfUE00X0JVRkZFUl9XTV9DTlRMCQkweDA3MDgKKyMJZGVmaW5lIFIxMjhfV01BX1NISUZUCQkJMAorIwlkZWZpbmUgUjEyOF9XTUJfU0hJRlQJCQk4CisjCWRlZmluZSBSMTI4X1dNQ19TSElGVAkJCTE2CisjCWRlZmluZSBSMTI4X1dCX1dNX1NISUZUCQkJMjQKKworI2RlZmluZSBSMTI4X1BNNF9CVUZGRVJfRExfUlBUUl9BRERSCTB4MDcwYworI2RlZmluZSBSMTI4X1BNNF9CVUZGRVJfRExfUlBUUgkJMHgwNzEwCisjZGVmaW5lIFIxMjhfUE00X0JVRkZFUl9ETF9XUFRSCQkweDA3MTQKKyMJZGVmaW5lIFIxMjhfUE00X0JVRkZFUl9ETF9ET05FCQkoMSA8PCAzMSkKKworI2RlZmluZSBSMTI4X1BNNF9WQ19GUFVfU0VUVVAJCTB4MDcxYworCisjZGVmaW5lIFIxMjhfUE00X0lXX0lORE9GRgkJMHgwNzM4CisjZGVmaW5lIFIxMjhfUE00X0lXX0lORFNJWkUJCTB4MDczYworCisjZGVmaW5lIFIxMjhfUE00X1NUQVQJCQkweDA3YjgKKyMJZGVmaW5lIFIxMjhfUE00X0ZJRk9DTlRfTUFTSwkJMHgwZmZmCisjCWRlZmluZSBSMTI4X1BNNF9CVVNZCQkJKDEgPDwgMTYpCisjCWRlZmluZSBSMTI4X1BNNF9HVUlfQUNUSVZFCQkoMSA8PCAzMSkKKworI2RlZmluZSBSMTI4X1BNNF9NSUNST0NPREVfQUREUgkJMHgwN2Q0CisjZGVmaW5lIFIxMjhfUE00X01JQ1JPQ09ERV9SQUREUgkweDA3ZDgKKyNkZWZpbmUgUjEyOF9QTTRfTUlDUk9DT0RFX0RBVEFICTB4MDdkYworI2RlZmluZSBSMTI4X1BNNF9NSUNST0NPREVfREFUQUwJMHgwN2UwCisKKyNkZWZpbmUgUjEyOF9QTTRfQlVGRkVSX0FERFIJCTB4MDdmMAorI2RlZmluZSBSMTI4X1BNNF9NSUNST19DTlRMCQkweDA3ZmMKKyMJZGVmaW5lIFIxMjhfUE00X01JQ1JPX0ZSRUVSVU4JCSgxIDw8IDMwKQorCisjZGVmaW5lIFIxMjhfUE00X0ZJRk9fREFUQV9FVkVOCQkweDEwMDAKKyNkZWZpbmUgUjEyOF9QTTRfRklGT19EQVRBX09ERAkJMHgxMDA0CisKKworLyogQ0NFIGNvbW1hbmQgcGFja2V0cworICovCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVDAJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUjEyOF9DQ0VfUEFDS0VUMQkJMHg0MDAwMDAwMAorI2RlZmluZSBSMTI4X0NDRV9QQUNLRVQyCQkweDgwMDAwMDAwCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVDMJCTB4QzAwMDAwMDAKKyMJZGVmaW5lIFIxMjhfQ05UTF9IT1NUREFUQV9CTFQJCTB4MDAwMDk0MDAKKyMJZGVmaW5lIFIxMjhfQ05UTF9QQUlOVF9NVUxUSQkJMHgwMDAwOUEwMAorIwlkZWZpbmUgUjEyOF9DTlRMX0JJVEJMVF9NVUxUSQkJMHgwMDAwOUIwMAorIwlkZWZpbmUgUjEyOF8zRF9STkRSX0dFTl9JTkRYX1BSSU0JMHgwMDAwMjMwMAorCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVF9NQVNLCQkweEMwMDAwMDAwCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVF9DT1VOVF9NQVNLCTB4M2ZmZjAwMDAKKyNkZWZpbmUgUjEyOF9DQ0VfUEFDS0VUMF9SRUdfTUFTSwkweDAwMDAwN2ZmCisjZGVmaW5lIFIxMjhfQ0NFX1BBQ0tFVDFfUkVHMF9NQVNLCTB4MDAwMDA3ZmYKKyNkZWZpbmUgUjEyOF9DQ0VfUEFDS0VUMV9SRUcxX01BU0sJMHgwMDNmZjgwMAorCisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX05PTkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUjEyOF9DQ0VfVkNfQ05UTF9QUklNX1RZUEVfUE9JTlQJMHgwMDAwMDAwMQorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9MSU5FCQkweDAwMDAwMDAyCisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX1BPTFlfTElORQkweDAwMDAwMDAzCisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX1RSSV9MSVNUCTB4MDAwMDAwMDQKKyNkZWZpbmUgUjEyOF9DQ0VfVkNfQ05UTF9QUklNX1RZUEVfVFJJX0ZBTgkweDAwMDAwMDA1CisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX1RSSV9TVFJJUAkweDAwMDAwMDA2CisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX1RSSV9UWVBFMgkweDAwMDAwMDA3CisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9XQUxLX0lORAkJMHgwMDAwMDAxMAorI2RlZmluZSBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fV0FMS19MSVNUCQkweDAwMDAwMDIwCisjZGVmaW5lIFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9XQUxLX1JJTkcJCTB4MDAwMDAwMzAKKyNkZWZpbmUgUjEyOF9DQ0VfVkNfQ05UTF9OVU1fU0hJRlQJCTE2CisKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9WUQkJMAorI2RlZmluZSBSMTI4X0RBVEFUWVBFX0NJNAkJMQorI2RlZmluZSBSMTI4X0RBVEFUWVBFX0NJOAkJMgorI2RlZmluZSBSMTI4X0RBVEFUWVBFX0FSR0IxNTU1CQkzCisjZGVmaW5lIFIxMjhfREFUQVRZUEVfUkdCNTY1CQk0CisjZGVmaW5lIFIxMjhfREFUQVRZUEVfUkdCODg4CQk1CisjZGVmaW5lIFIxMjhfREFUQVRZUEVfQVJHQjg4ODgJCTYKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9SR0IzMzIJCTcKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9ZOAkJOAorI2RlZmluZSBSMTI4X0RBVEFUWVBFX1JHQjgJCTkKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9DSTE2CQkxMAorI2RlZmluZSBSMTI4X0RBVEFUWVBFX1lWWVU0MjIJCTExCisjZGVmaW5lIFIxMjhfREFUQVRZUEVfVllVWTQyMgkJMTIKKyNkZWZpbmUgUjEyOF9EQVRBVFlQRV9BWVVWNDQ0CQkxNAorI2RlZmluZSBSMTI4X0RBVEFUWVBFX0FSR0I0NDQ0CQkxNQorCisvKiBDb25zdGFudHMgKi8KKyNkZWZpbmUgUjEyOF9BR1BfT0ZGU0VUCQkJMHgwMjAwMDAwMAorCisjZGVmaW5lIFIxMjhfV0FURVJNQVJLX0wJCTE2CisjZGVmaW5lIFIxMjhfV0FURVJNQVJLX00JCTgKKyNkZWZpbmUgUjEyOF9XQVRFUk1BUktfTgkJOAorI2RlZmluZSBSMTI4X1dBVEVSTUFSS19LCQkxMjgKKworI2RlZmluZSBSMTI4X01BWF9VU0VDX1RJTUVPVVQJCTEwMDAwMAkvKiAxMDAgbXMgKi8KKworI2RlZmluZSBSMTI4X0xBU1RfRlJBTUVfUkVHCQlSMTI4X0dVSV9TQ1JBVENIX1JFRzAKKyNkZWZpbmUgUjEyOF9MQVNUX0RJU1BBVENIX1JFRwkJUjEyOF9HVUlfU0NSQVRDSF9SRUcxCisjZGVmaW5lIFIxMjhfTUFYX1ZCX0FHRQkJCTB4N2ZmZmZmZmYKKyNkZWZpbmUgUjEyOF9NQVhfVkJfVkVSVFMJCSgweGZmZmYpCisKKyNkZWZpbmUgUjEyOF9SSU5HX0hJR0hfTUFSSwkJMTI4CisKKyNkZWZpbmUgUjEyOF9QRVJGT1JNQU5DRV9CT1hFUwkJMAorCisjZGVmaW5lIFIxMjhfUkVBRChyZWcpCQlEUk1fUkVBRDMyKCAgZGV2X3ByaXYtPm1taW8sIChyZWcpICkKKyNkZWZpbmUgUjEyOF9XUklURShyZWcsdmFsKQlEUk1fV1JJVEUzMiggZGV2X3ByaXYtPm1taW8sIChyZWcpLCAodmFsKSApCisjZGVmaW5lIFIxMjhfUkVBRDgocmVnKQkJRFJNX1JFQUQ4KCAgIGRldl9wcml2LT5tbWlvLCAocmVnKSApCisjZGVmaW5lIFIxMjhfV1JJVEU4KHJlZyx2YWwpCURSTV9XUklURTgoICBkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpICkKKworI2RlZmluZSBSMTI4X1dSSVRFX1BMTChhZGRyLHZhbCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJUjEyOF9XUklURTgoUjEyOF9DTE9DS19DTlRMX0lOREVYLAkJCQlcCisJCSAgICAoKGFkZHIpICYgMHgxZikgfCBSMTI4X1BMTF9XUl9FTik7CQkJXAorCVIxMjhfV1JJVEUoUjEyOF9DTE9DS19DTlRMX0RBVEEsICh2YWwpKTsJCQlcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgQ0NFX1BBQ0tFVDAoIHJlZywgbiApCQkoUjEyOF9DQ0VfUEFDS0VUMCB8CQlcCisJCQkJCSAoKG4pIDw8IDE2KSB8ICgocmVnKSA+PiAyKSkKKyNkZWZpbmUgQ0NFX1BBQ0tFVDEoIHJlZzAsIHJlZzEgKQkoUjEyOF9DQ0VfUEFDS0VUMSB8CQlcCisJCQkJCSAoKChyZWcxKSA+PiAyKSA8PCAxMSkgfCAoKHJlZzApID4+IDIpKQorI2RlZmluZSBDQ0VfUEFDS0VUMigpCQkJKFIxMjhfQ0NFX1BBQ0tFVDIpCisjZGVmaW5lIENDRV9QQUNLRVQzKCBwa3QsIG4gKQkJKFIxMjhfQ0NFX1BBQ0tFVDMgfAkJXAorCQkJCQkgKHBrdCkgfCAoKG4pIDw8IDE2KSkKKworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCityMTI4X3VwZGF0ZV9yaW5nX3NuYXBzaG90KCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJmRldl9wcml2LT5yaW5nOworCXJpbmctPnNwYWNlID0gKEdFVF9SSU5HX0hFQUQoIGRldl9wcml2ICkgLSByaW5nLT50YWlsKSAqIHNpemVvZih1MzIpOworCWlmICggcmluZy0+c3BhY2UgPD0gMCApCisJCXJpbmctPnNwYWNlICs9IHJpbmctPnNpemU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1pc2MgaGVscGVyIG1hY3JvcworICovCisKKyNkZWZpbmUgUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJZHJtX3IxMjhfcmluZ19idWZmZXJfdCAqcmluZyA9ICZkZXZfcHJpdi0+cmluZzsgaW50IGk7CQlcCisJaWYgKCByaW5nLT5zcGFjZSA8IHJpbmctPmhpZ2hfbWFyayApIHsJCQkJXAorCQlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgewlcCisJCQlyMTI4X3VwZGF0ZV9yaW5nX3NuYXBzaG90KCBkZXZfcHJpdiApOwkJXAorCQkJaWYgKCByaW5nLT5zcGFjZSA+PSByaW5nLT5oaWdoX21hcmsgKQkJXAorCQkJCWdvdG8gX19yaW5nX3NwYWNlX2RvbmU7CQkJXAorCQkJRFJNX1VERUxBWSgxKTsJCQkJXAorCQl9CQkJCQkJCVwKKwkJRFJNX0VSUk9SKCAicmluZyBzcGFjZSBjaGVjayBmYWlsZWQhXG4iICk7CQlcCisJCXJldHVybiBEUk1fRVJSKEVCVVNZKTsJCQkJXAorCX0JCQkJCQkJCVwKKyBfX3Jpbmdfc3BhY2VfZG9uZToJCQkJCQkJXAorCTsJCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CQlcCisJaWYgKCBzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID49IFIxMjhfTUFYX1ZCX0FHRSApIHsJCVwKKwkJaW50IF9fcmV0ID0gcjEyOF9kb19jY2VfaWRsZSggZGV2X3ByaXYgKTsJCVwKKwkJaWYgKCBfX3JldCApIHJldHVybiBfX3JldDsJCQkJXAorCQlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gMDsJCQkJXAorCQlyMTI4X2ZyZWVsaXN0X3Jlc2V0KCBkZXYgKTsJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUjEyOF9XQUlUX1VOVElMX1BBR0VfRkxJUFBFRCgpIGRvIHsJCQkJXAorCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9XQUlUX1VOVElMLCAwICkgKTsJCQlcCisJT1VUX1JJTkcoIFIxMjhfRVZFTlRfQ1JUQ19PRkZTRVQgKTsJCQkJXAorfSB3aGlsZSAoMCkKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSaW5nIGNvbnRyb2wKKyAqLworCisjZGVmaW5lIFIxMjhfVkVSQk9TRQkwCisKKyNkZWZpbmUgUklOR19MT0NBTFMJCQkJCQkJXAorCWludCB3cml0ZSwgX25yOyB1bnNpZ25lZCBpbnQgdGFpbF9tYXNrOyB2b2xhdGlsZSB1MzIgKnJpbmc7CisKKyNkZWZpbmUgQkVHSU5fUklORyggbiApIGRvIHsJCQkJCQlcCisJaWYgKCBSMTI4X1ZFUkJPU0UgKSB7CQkJCQkJXAorCQlEUk1fSU5GTyggIkJFR0lOX1JJTkcoICVkICkgaW4gJXNcbiIsCQkJXAorCQkJICAgKG4pLCBfX0ZVTkNUSU9OX18gKTsJCQkJXAorCX0JCQkJCQkJCVwKKwlpZiAoIGRldl9wcml2LT5yaW5nLnNwYWNlIDw9IChuKSAqIHNpemVvZih1MzIpICkgewkJXAorCQlDT01NSVRfUklORygpOwkJCQkJCVwKKwkJcjEyOF93YWl0X3JpbmcoIGRldl9wcml2LCAobikgKiBzaXplb2YodTMyKSApOwkJXAorCX0JCQkJCQkJCVwKKwlfbnIgPSBuOyBkZXZfcHJpdi0+cmluZy5zcGFjZSAtPSAobikgKiBzaXplb2YodTMyKTsJCVwKKwlyaW5nID0gZGV2X3ByaXYtPnJpbmcuc3RhcnQ7CQkJCQlcCisJd3JpdGUgPSBkZXZfcHJpdi0+cmluZy50YWlsOwkJCQkJXAorCXRhaWxfbWFzayA9IGRldl9wcml2LT5yaW5nLnRhaWxfbWFzazsJCQkJXAorfSB3aGlsZSAoMCkKKworLyogWW91IGNhbiBzZXQgdGhpcyB0byB6ZXJvIGlmIHlvdSB3YW50LiAgSWYgdGhlIGNhcmQgbG9ja3MgdXAsIHlvdSdsbAorICogbmVlZCB0byBrZWVwIHRoaXMgc2V0LiAgSXQgd29ya3MgYXJvdW5kIGEgYnVnIGluIGVhcmx5IHJldnMgb2YgdGhlCisgKiBSYWdlIDEyOCBjaGlwc2V0LCB3aGVyZSB0aGUgQ0NFIHdvdWxkIHJlYWQgMzIgZHdvcmRzIHBhc3QgdGhlIGVuZCBvZgorICogdGhlIHJpbmcgYnVmZmVyIGJlZm9yZSB3cmFwcGluZyBhcm91bmQuCisgKi8KKyNkZWZpbmUgUjEyOF9CUk9LRU5fQ0NFCTEKKworI2RlZmluZSBBRFZBTkNFX1JJTkcoKSBkbyB7CQkJCQkJXAorCWlmICggUjEyOF9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICJBRFZBTkNFX1JJTkcoKSB3cj0weCUwNnggdGFpbD0weCUwNnhcbiIsCVwKKwkJCSAgd3JpdGUsIGRldl9wcml2LT5yaW5nLnRhaWwgKTsJCQlcCisJfQkJCQkJCQkJXAorCWlmICggUjEyOF9CUk9LRU5fQ0NFICYmIHdyaXRlIDwgMzIgKSB7CQkJCVwKKwkJbWVtY3B5KCBkZXZfcHJpdi0+cmluZy5lbmQsCQkJCVwKKwkJCWRldl9wcml2LT5yaW5nLnN0YXJ0LAkJCQlcCisJCQl3cml0ZSAqIHNpemVvZih1MzIpICk7CQkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKCgoZGV2X3ByaXYtPnJpbmcudGFpbCArIF9ucikgJiB0YWlsX21hc2spICE9IHdyaXRlKSB7CVwKKwkJRFJNX0VSUk9SKCAJCQkJCQlcCisJCQkiQURWQU5DRV9SSU5HKCk6IG1pc21hdGNoOiBucjogJXggd3JpdGU6ICV4IGxpbmU6ICVkXG4iLAlcCisJCQkoKGRldl9wcml2LT5yaW5nLnRhaWwgKyBfbnIpICYgdGFpbF9tYXNrKSwJXAorCQkJd3JpdGUsIF9fTElORV9fKTsJCQkJXAorCX0gZWxzZQkJCQkJCQkJXAorCQlkZXZfcHJpdi0+cmluZy50YWlsID0gd3JpdGU7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09NTUlUX1JJTkcoKSBkbyB7CQkJCQkJXAorCWlmICggUjEyOF9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICJDT01NSVRfUklORygpIHRhaWw9MHglMDZ4XG4iLAkJXAorCQkJZGV2X3ByaXYtPnJpbmcudGFpbCApOwkJCQlcCisJfQkJCQkJCQkJXAorCURSTV9NRU1PUllCQVJSSUVSKCk7CQkJCQkJXAorCVIxMjhfV1JJVEUoIFIxMjhfUE00X0JVRkZFUl9ETF9XUFRSLCBkZXZfcHJpdi0+cmluZy50YWlsICk7CVwKKwlSMTI4X1JFQUQoIFIxMjhfUE00X0JVRkZFUl9ETF9XUFRSICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgT1VUX1JJTkcoIHggKSBkbyB7CQkJCQkJXAorCWlmICggUjEyOF9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICIgICBPVVRfUklORyggMHglMDh4ICkgYXQgMHgleFxuIiwJCVwKKwkJCSAgICh1bnNpZ25lZCBpbnQpKHgpLCB3cml0ZSApOwkJCVwKKwl9CQkJCQkJCQlcCisJcmluZ1t3cml0ZSsrXSA9IGNwdV90b19sZTMyKCB4ICk7CQkJCVwKKwl3cml0ZSAmPSB0YWlsX21hc2s7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9fUjEyOF9EUlZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzYTMwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogcjEyOF9pcnEuYyAtLSBJUlEgaGFuZGxpbmcgZm9yIHJhZGVvbiAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFRoZSBXZWF0aGVyIENoYW5uZWwsIEluYy4gIDIwMDIuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGUgV2VhdGhlciBDaGFubmVsIChUTSkgZnVuZGVkIFR1bmdzdGVuIEdyYXBoaWNzIHRvIGRldmVsb3AgdGhlCisgKiBpbml0aWFsIHJlbGVhc2Ugb2YgdGhlIFJhZGVvbiA4NTAwIGRyaXZlciB1bmRlciB0aGUgWEZyZWU4NiBsaWNlbnNlLgorICogVGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKiAgICBFcmljIEFuaG9sdCA8YW5ob2x0QEZyZWVCU0Qub3JnPgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicjEyOF9kcm0uaCIKKyNpbmNsdWRlICJyMTI4X2Rydi5oIgorCitpcnFyZXR1cm5fdCByMTI4X2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX3IxMjhfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gUjEyOF9SRUFEKCBSMTI4X0dFTl9JTlRfU1RBVFVTICk7CisJCisJLyogVkJMQU5LIGludGVycnVwdCAqLworCWlmICggc3RhdHVzICYgUjEyOF9DUlRDX1ZCTEFOS19JTlQgKSB7CisJCVIxMjhfV1JJVEUoIFIxMjhfR0VOX0lOVF9TVEFUVVMsIFIxMjhfQ1JUQ19WQkxBTktfSU5UX0FLICk7CisJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKKwkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWUpOworCQlkcm1fdmJsX3NlbmRfc2lnbmFscyggZGV2ICk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIElSUV9OT05FOworfQorCitpbnQgcjEyOF9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCit7CisJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CisJaW50IHJldCA9IDA7CisKKwkvKiBBc3N1bWUgdGhhdCB0aGUgdXNlciBoYXMgbWlzc2VkIHRoZSBjdXJyZW50IHNlcXVlbmNlIG51bWJlcgorCSAqIGJ5IGFib3V0IGEgZGF5IHJhdGhlciB0aGFuIHNoZSB3YW50cyB0byB3YWl0IGZvciB5ZWFycworCSAqIHVzaW5nIHZlcnRpY2FsIGJsYW5rcy4uLiAKKwkgKi8KKwlEUk1fV0FJVF9PTiggcmV0LCBkZXYtPnZibF9xdWV1ZSwgMypEUk1fSFosIAorCQkgICAgICggKCAoIGN1cl92YmxhbmsgPSBhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQgKSApCisJCQkgLSAqc2VxdWVuY2UgKSA8PSAoMTw8MjMpICkgKTsKKworCSpzZXF1ZW5jZSA9IGN1cl92Ymxhbms7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKyAgCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX3IxMjhfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIERpc2FibGUgKmFsbCogaW50ZXJydXB0cyAqLworICAgICAgCVIxMjhfV1JJVEUoIFIxMjhfR0VOX0lOVF9DTlRMLCAwICk7CisJLyogQ2xlYXIgdmJsYW5rIGJpdCBpZiBpdCdzIGFscmVhZHkgaGlnaCAqLworICAgCVIxMjhfV1JJVEUoIFIxMjhfR0VOX0lOVF9TVEFUVVMsIFIxMjhfQ1JUQ19WQkxBTktfSU5UX0FLICk7Cit9CisKK3ZvaWQgcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKKyAgCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKKwkgICAoZHJtX3IxMjhfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIFR1cm4gb24gVkJMIGludGVycnVwdCAqLworICAgCVIxMjhfV1JJVEUoIFIxMjhfR0VOX0lOVF9DTlRMLCBSMTI4X0NSVENfVkJMQU5LX0lOVF9FTiApOworfQorCit2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworICAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAorCSAgIChkcm1fcjEyOF9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWlmICghZGV2X3ByaXYpCisJCXJldHVybjsKKworCS8qIERpc2FibGUgKmFsbCogaW50ZXJydXB0cyAqLworCVIxMjhfV1JJVEUoIFIxMjhfR0VOX0lOVF9DTlRMLCAwICk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjNjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwpAQCAtMCwwICsxLDE3MzIgQEAKKy8qIHIxMjhfc3RhdGUuYyAtLSBTdGF0ZSBzdXBwb3J0IGZvciByMTI4IC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogVGh1IEphbiAyNyAwMjo1Mzo0MyAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJyMTI4X2RybS5oIgorI2luY2x1ZGUgInIxMjhfZHJ2LmgiCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ0NFIGhhcmR3YXJlIHN0YXRlIHByb2dyYW1taW5nIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIHIxMjhfZW1pdF9jbGlwX3JlY3RzKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCSAgZHJtX2NsaXBfcmVjdF90ICpib3hlcywgaW50IGNvdW50ICkKK3sKKwl1MzIgYXV4X3NjX2NudGwgPSAweDAwMDAwMDAwOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiAgICAlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCAoY291bnQgPCAzPyBjb3VudDogMykgKiA1ICsgMiApOworCisJaWYgKCBjb3VudCA+PSAxICkgeworCQlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfQVVYMV9TQ19MRUZULCAzICkgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzBdLngxICk7CisJCU9VVF9SSU5HKCBib3hlc1swXS54MiAtIDEgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzBdLnkxICk7CisJCU9VVF9SSU5HKCBib3hlc1swXS55MiAtIDEgKTsKKworCQlhdXhfc2NfY250bCB8PSAoUjEyOF9BVVgxX1NDX0VOIHwgUjEyOF9BVVgxX1NDX01PREVfT1IpOworCX0KKwlpZiAoIGNvdW50ID49IDIgKSB7CisJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9BVVgyX1NDX0xFRlQsIDMgKSApOworCQlPVVRfUklORyggYm94ZXNbMV0ueDEgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzFdLngyIC0gMSApOworCQlPVVRfUklORyggYm94ZXNbMV0ueTEgKTsKKwkJT1VUX1JJTkcoIGJveGVzWzFdLnkyIC0gMSApOworCisJCWF1eF9zY19jbnRsIHw9IChSMTI4X0FVWDJfU0NfRU4gfCBSMTI4X0FVWDJfU0NfTU9ERV9PUik7CisJfQorCWlmICggY291bnQgPj0gMyApIHsKKwkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0FVWDNfU0NfTEVGVCwgMyApICk7CisJCU9VVF9SSU5HKCBib3hlc1syXS54MSApOworCQlPVVRfUklORyggYm94ZXNbMl0ueDIgLSAxICk7CisJCU9VVF9SSU5HKCBib3hlc1syXS55MSApOworCQlPVVRfUklORyggYm94ZXNbMl0ueTIgLSAxICk7CisKKwkJYXV4X3NjX2NudGwgfD0gKFIxMjhfQVVYM19TQ19FTiB8IFIxMjhfQVVYM19TQ19NT0RFX09SKTsKKwl9CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfQVVYX1NDX0NOVEwsIDAgKSApOworCU9VVF9SSU5HKCBhdXhfc2NfY250bCApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X2NvcmUoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiICAgICVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUJFR0lOX1JJTkcoIDIgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9TQ0FMRV8zRF9DTlRMLCAwICkgKTsKKwlPVVRfUklORyggY3R4LT5zY2FsZV8zZF9jbnRsICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCByMTI4X2VtaXRfY29udGV4dCggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggMTMgKTsKKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9EU1RfUElUQ0hfT0ZGU0VUX0MsIDExICkgKTsKKwlPVVRfUklORyggY3R4LT5kc3RfcGl0Y2hfb2Zmc2V0X2MgKTsKKwlPVVRfUklORyggY3R4LT5kcF9ndWlfbWFzdGVyX2NudGxfYyApOworCU9VVF9SSU5HKCBjdHgtPnNjX3RvcF9sZWZ0X2MgKTsKKwlPVVRfUklORyggY3R4LT5zY19ib3R0b21fcmlnaHRfYyApOworCU9VVF9SSU5HKCBjdHgtPnpfb2Zmc2V0X2MgKTsKKwlPVVRfUklORyggY3R4LT56X3BpdGNoX2MgKTsKKwlPVVRfUklORyggY3R4LT56X3N0ZW5fY250bF9jICk7CisJT1VUX1JJTkcoIGN0eC0+dGV4X2NudGxfYyApOworCU9VVF9SSU5HKCBjdHgtPm1pc2NfM2Rfc3RhdGVfY250bF9yZWcgKTsKKwlPVVRfUklORyggY3R4LT50ZXh0dXJlX2Nscl9jbXBfY2xyX2MgKTsKKwlPVVRfUklORyggY3R4LT50ZXh0dXJlX2Nscl9jbXBfbXNrX2MgKTsKKwlPVVRfUklORyggY3R4LT5mb2dfY29sb3JfYyApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X3NldHVwKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiAgICAlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCAzICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDEoIFIxMjhfU0VUVVBfQ05UTCwgUjEyOF9QTTRfVkNfRlBVX1NFVFVQICkgKTsKKwlPVVRfUklORyggY3R4LT5zZXR1cF9jbnRsICk7CisJT1VUX1JJTkcoIGN0eC0+cG00X3ZjX2ZwdV9zZXR1cCApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X21hc2tzKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiAgICAlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCA1ICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfRFBfV1JJVEVfTUFTSywgMCApICk7CisJT1VUX1JJTkcoIGN0eC0+ZHBfd3JpdGVfbWFzayApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1NURU5fUkVGX01BU0tfQywgMSApICk7CisJT1VUX1JJTkcoIGN0eC0+c3Rlbl9yZWZfbWFza19jICk7CisJT1VUX1JJTkcoIGN0eC0+cGxhbmVfM2RfbWFza19jICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCByMTI4X2VtaXRfd2luZG93KCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiAgICAlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlCRUdJTl9SSU5HKCAyICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfV0lORE9XX1hZX09GRlNFVCwgMCApICk7CisJT1VUX1JJTkcoIGN0eC0+d2luZG93X3h5X29mZnNldCApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X3RleDAoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CisJZHJtX3IxMjhfdGV4dHVyZV9yZWdzX3QgKnRleCA9ICZzYXJlYV9wcml2LT50ZXhfc3RhdGVbMF07CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiICAgICVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUJFR0lOX1JJTkcoIDcgKyBSMTI4X01BWF9URVhUVVJFX0xFVkVMUyApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1BSSU1fVEVYX0NOVExfQywKKwkJCSAgICAgICAyICsgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFMgKSApOworCU9VVF9SSU5HKCB0ZXgtPnRleF9jbnRsICk7CisJT1VUX1JJTkcoIHRleC0+dGV4X2NvbWJpbmVfY250bCApOworCU9VVF9SSU5HKCBjdHgtPnRleF9zaXplX3BpdGNoX2MgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBSMTI4X01BWF9URVhUVVJFX0xFVkVMUyA7IGkrKyApIHsKKwkJT1VUX1JJTkcoIHRleC0+dGV4X29mZnNldFtpXSApOworCX0KKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9DT05TVEFOVF9DT0xPUl9DLCAxICkgKTsKKwlPVVRfUklORyggY3R4LT5jb25zdGFudF9jb2xvcl9jICk7CisJT1VUX1JJTkcoIHRleC0+dGV4X2JvcmRlcl9jb2xvciApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X3RleDEoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fcjEyOF90ZXh0dXJlX3JlZ3NfdCAqdGV4ID0gJnNhcmVhX3ByaXYtPnRleF9zdGF0ZVsxXTsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyApOworCisJQkVHSU5fUklORyggNSArIFIxMjhfTUFYX1RFWFRVUkVfTEVWRUxTICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfU0VDX1RFWF9DTlRMX0MsCisJCQkgICAgICAgMSArIFIxMjhfTUFYX1RFWFRVUkVfTEVWRUxTICkgKTsKKwlPVVRfUklORyggdGV4LT50ZXhfY250bCApOworCU9VVF9SSU5HKCB0ZXgtPnRleF9jb21iaW5lX2NudGwgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCBSMTI4X01BWF9URVhUVVJFX0xFVkVMUyA7IGkrKyApIHsKKwkJT1VUX1JJTkcoIHRleC0+dGV4X29mZnNldFtpXSApOworCX0KKworCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9TRUNfVEVYVFVSRV9CT1JERVJfQ09MT1JfQywgMCApICk7CisJT1VUX1JJTkcoIHRleC0+dGV4X2JvcmRlcl9jb2xvciApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X3N0YXRlKCBkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJdW5zaWduZWQgaW50IGRpcnR5ID0gc2FyZWFfcHJpdi0+ZGlydHk7CisKKwlEUk1fREVCVUcoICIlczogZGlydHk9MHglMDh4XG4iLCBfX0ZVTkNUSU9OX18sIGRpcnR5ICk7CisKKwlpZiAoIGRpcnR5ICYgUjEyOF9VUExPQURfQ09SRSApIHsKKwkJcjEyOF9lbWl0X2NvcmUoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9DT1JFOworCX0KKworCWlmICggZGlydHkgJiBSMTI4X1VQTE9BRF9DT05URVhUICkgeworCQlyMTI4X2VtaXRfY29udGV4dCggZGV2X3ByaXYgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gflIxMjhfVVBMT0FEX0NPTlRFWFQ7CisJfQorCisJaWYgKCBkaXJ0eSAmIFIxMjhfVVBMT0FEX1NFVFVQICkgeworCQlyMTI4X2VtaXRfc2V0dXAoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9TRVRVUDsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUjEyOF9VUExPQURfTUFTS1MgKSB7CisJCXIxMjhfZW1pdF9tYXNrcyggZGV2X3ByaXYgKTsKKwkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gflIxMjhfVVBMT0FEX01BU0tTOworCX0KKworCWlmICggZGlydHkgJiBSMTI4X1VQTE9BRF9XSU5ET1cgKSB7CisJCXIxMjhfZW1pdF93aW5kb3coIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9XSU5ET1c7CisJfQorCisJaWYgKCBkaXJ0eSAmIFIxMjhfVVBMT0FEX1RFWDAgKSB7CisJCXIxMjhfZW1pdF90ZXgwKCBkZXZfcHJpdiApOworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+UjEyOF9VUExPQURfVEVYMDsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUjEyOF9VUExPQURfVEVYMSApIHsKKwkJcjEyOF9lbWl0X3RleDEoIGRldl9wcml2ICk7CisJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9URVgxOworCX0KKworCS8qIFR1cm4gb2ZmIHRoZSB0ZXh0dXJlIGNhY2hlIGZsdXNoaW5nICovCisJc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZS50ZXhfY250bF9jICY9IH5SMTI4X1RFWF9DQUNIRV9GTFVTSDsKKworCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1JFUVVJUkVfUVVJRVNDRU5DRTsKK30KKworCisjaWYgUjEyOF9QRVJGT1JNQU5DRV9CT1hFUworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCByMTI4X2NsZWFyX2JveCggZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKwkJCSAgICBpbnQgciwgaW50IGcsIGludCBiICkKK3sKKwl1MzIgcGl0Y2gsIG9mZnNldDsKKwl1MzIgZmJfYnBwLCBjb2xvcjsKKwlSSU5HX0xPQ0FMUzsKKworCXN3aXRjaCAoIGRldl9wcml2LT5mYl9icHAgKSB7CisJY2FzZSAxNjoKKwkJZmJfYnBwID0gUjEyOF9HTUNfRFNUXzE2QlBQOworCQljb2xvciA9ICgoKHIgJiAweGY4KSA8PCA4KSB8CisJCQkgKChnICYgMHhmYykgPDwgMykgfAorCQkJICgoYiAmIDB4ZjgpID4+IDMpKTsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJZmJfYnBwID0gUjEyOF9HTUNfRFNUXzI0QlBQOworCQljb2xvciA9ICgociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworCQlicmVhazsKKwljYXNlIDMyOgorCQlmYl9icHAgPSBSMTI4X0dNQ19EU1RfMzJCUFA7CisJCWNvbG9yID0gKCgoMHhmZikgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgIDgpIHwgYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlvZmZzZXQgPSBkZXZfcHJpdi0+YmFja19vZmZzZXQ7CisJcGl0Y2ggPSBkZXZfcHJpdi0+YmFja19waXRjaCA+PiAzOworCisJQkVHSU5fUklORyggNiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkgIFIxMjhfR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJICBmYl9icHAgfAorCQkgIFIxMjhfR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCSAgUjEyOF9ST1AzX1AgfAorCQkgIFIxMjhfR01DX0NMUl9DTVBfQ05UTF9ESVMgfAorCQkgIFIxMjhfR01DX0FVWF9DTElQX0RJUyApOworCisJT1VUX1JJTkcoIChwaXRjaCA8PCAyMSkgfCAob2Zmc2V0ID4+IDUpICk7CisJT1VUX1JJTkcoIGNvbG9yICk7CisKKwlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKK30KKworc3RhdGljIHZvaWQgcjEyOF9jY2VfcGVyZm9ybWFuY2VfYm94ZXMoIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCWlmICggYXRvbWljX3JlYWQoICZkZXZfcHJpdi0+aWRsZV9jb3VudCApID09IDAgKSB7CisJCXIxMjhfY2xlYXJfYm94KCBkZXZfcHJpdiwgNjQsIDQsIDgsIDgsIDAsIDI1NSwgMCApOworCX0gZWxzZSB7CisJCWF0b21pY19zZXQoICZkZXZfcHJpdi0+aWRsZV9jb3VudCwgMCApOworCX0KK30KKworI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ0NFIGNvbW1hbmQgZGlzcGF0Y2ggZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgcjEyOF9wcmludF9kaXJ0eSggY29uc3QgY2hhciAqbXNnLCB1bnNpZ25lZCBpbnQgZmxhZ3MgKQoreworCURSTV9JTkZPKCAiJXM6ICgweCV4KSAlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCSAgbXNnLAorCQkgIGZsYWdzLAorCQkgIChmbGFncyAmIFIxMjhfVVBMT0FEX0NPUkUpICAgICAgICA/ICJjb3JlLCAiIDogIiIsCisJCSAgKGZsYWdzICYgUjEyOF9VUExPQURfQ09OVEVYVCkgICAgID8gImNvbnRleHQsICIgOiAiIiwKKwkJICAoZmxhZ3MgJiBSMTI4X1VQTE9BRF9TRVRVUCkgICAgICAgPyAic2V0dXAsICIgOiAiIiwKKwkJICAoZmxhZ3MgJiBSMTI4X1VQTE9BRF9URVgwKSAgICAgICAgPyAidGV4MCwgIiA6ICIiLAorCQkgIChmbGFncyAmIFIxMjhfVVBMT0FEX1RFWDEpICAgICAgICA/ICJ0ZXgxLCAiIDogIiIsCisJCSAgKGZsYWdzICYgUjEyOF9VUExPQURfTUFTS1MpICAgICAgID8gIm1hc2tzLCAiIDogIiIsCisJCSAgKGZsYWdzICYgUjEyOF9VUExPQURfV0lORE9XKSAgICAgID8gIndpbmRvdywgIiA6ICIiLAorCQkgIChmbGFncyAmIFIxMjhfVVBMT0FEX0NMSVBSRUNUUykgICA/ICJjbGlwcmVjdHMsICIgOiAiIiwKKwkJICAoZmxhZ3MgJiBSMTI4X1JFUVVJUkVfUVVJRVNDRU5DRSkgPyAicXVpZXNjZW5jZSwgIiA6ICIiICk7Cit9CisKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2NsZWFyKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgIGRybV9yMTI4X2NsZWFyX3QgKmNsZWFyICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OworCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXVuc2lnbmVkIGludCBmbGFncyA9IGNsZWFyLT5mbGFnczsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICYmIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSApIHsKKwkJdW5zaWduZWQgaW50IHRtcCA9IGZsYWdzOworCisJCWZsYWdzICY9IH4oUjEyOF9GUk9OVCB8IFIxMjhfQkFDSyk7CisJCWlmICggdG1wICYgUjEyOF9GUk9OVCApIGZsYWdzIHw9IFIxMjhfQkFDSzsKKwkJaWYgKCB0bXAgJiBSMTI4X0JBQ0sgKSAgZmxhZ3MgfD0gUjEyOF9GUk9OVDsKKwl9CisKKwlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgeworCQlpbnQgeCA9IHBib3hbaV0ueDE7CisJCWludCB5ID0gcGJveFtpXS55MTsKKwkJaW50IHcgPSBwYm94W2ldLngyIC0geDsKKwkJaW50IGggPSBwYm94W2ldLnkyIC0geTsKKworCQlEUk1fREVCVUcoICJkaXNwYXRjaCBjbGVhciAlZCwlZC0lZCwlZCBmbGFncyAweCV4XG4iLAorCQkJICAgcGJveFtpXS54MSwgcGJveFtpXS55MSwgcGJveFtpXS54MiwKKwkJCSAgIHBib3hbaV0ueTIsIGZsYWdzICk7CisKKwkJaWYgKCBmbGFncyAmIChSMTI4X0ZST05UIHwgUjEyOF9CQUNLKSApIHsKKwkJCUJFR0lOX1JJTkcoIDIgKTsKKworCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0RQX1dSSVRFX01BU0ssIDAgKSApOworCQkJT1VUX1JJTkcoIGNsZWFyLT5jb2xvcl9tYXNrICk7CisKKwkJCUFEVkFOQ0VfUklORygpOworCQl9CisKKwkJaWYgKCBmbGFncyAmIFIxMjhfRlJPTlQgKSB7CisJCQlCRUdJTl9SSU5HKCA2ICk7CisKKwkJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX1BBSU5UX01VTFRJLCA0ICkgKTsKKwkJCU9VVF9SSU5HKCBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCSAgUjEyOF9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkJCSAgUjEyOF9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkgIFIxMjhfUk9QM19QIHwKKwkJCQkgIFIxMjhfR01DX0NMUl9DTVBfQ05UTF9ESVMgfAorCQkJCSAgUjEyOF9HTUNfQVVYX0NMSVBfRElTICk7CisKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0X2MgKTsKKwkJCU9VVF9SSU5HKCBjbGVhci0+Y2xlYXJfY29sb3IgKTsKKworCQkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisKKwkJCUFEVkFOQ0VfUklORygpOworCQl9CisKKwkJaWYgKCBmbGFncyAmIFIxMjhfQkFDSyApIHsKKwkJCUJFR0lOX1JJTkcoIDYgKTsKKworCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJT1VUX1JJTkcoIFIxMjhfR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJICBSMTI4X0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJICAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCA4KSB8CisJCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCSAgUjEyOF9ST1AzX1AgfAorCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJICBSMTI4X0dNQ19BVVhfQ0xJUF9ESVMgKTsKKworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldF9jICk7CisJCQlPVVRfUklORyggY2xlYXItPmNsZWFyX2NvbG9yICk7CisKKwkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBSMTI4X0RFUFRIICkgeworCQkJQkVHSU5fUklORyggNiApOworCisJCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9QQUlOVF9NVUxUSSwgNCApICk7CisJCQlPVVRfUklORyggUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCQkgIFIxMjhfR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkgIChkZXZfcHJpdi0+ZGVwdGhfZm10IDw8IDgpIHwKKwkJCQkgIFIxMjhfR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkJICBSMTI4X1JPUDNfUCB8CisJCQkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCQkgIFIxMjhfR01DX0FVWF9DTElQX0RJUyB8CisJCQkJICBSMTI4X0dNQ19XUl9NU0tfRElTICk7CisKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZGVwdGhfcGl0Y2hfb2Zmc2V0X2MgKTsKKwkJCU9VVF9SSU5HKCBjbGVhci0+Y2xlYXJfZGVwdGggKTsKKworCQkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisKKwkJCUFEVkFOQ0VfUklORygpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zd2FwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKKwlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKyNpZiBSMTI4X1BFUkZPUk1BTkNFX0JPWEVTCisJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KKwkgKi8KKwlyMTI4X2NjZV9wZXJmb3JtYW5jZV9ib3hlcyggZGV2X3ByaXYgKTsKKyNlbmRpZgorCisJZm9yICggaSA9IDAgOyBpIDwgbmJveCA7IGkrKyApIHsKKwkJaW50IHggPSBwYm94W2ldLngxOworCQlpbnQgeSA9IHBib3hbaV0ueTE7CisJCWludCB3ID0gcGJveFtpXS54MiAtIHg7CisJCWludCBoID0gcGJveFtpXS55MiAtIHk7CisKKwkJQkVHSU5fUklORyggNyApOworCisJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX0JJVEJMVF9NVUxUSSwgNSApICk7CisJCU9VVF9SSU5HKCBSMTI4X0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICBSMTI4X0dNQ19CUlVTSF9OT05FIHwKKwkJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJICBSMTI4X1JPUDNfUyB8CisJCQkgIFIxMjhfRFBfU1JDX1NPVVJDRV9NRU1PUlkgfAorCQkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCSAgUjEyOF9HTUNfQVVYX0NMSVBfRElTIHwKKwkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCS8qIE1ha2UgdGhpcyB3b3JrIGV2ZW4gaWYgZnJvbnQgJiBiYWNrIGFyZSBmbGlwcGVkOgorCQkgKi8KKwkJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkgeworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldF9jICk7CisJCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldF9jICk7CisJCX0gCisJCWVsc2UgeworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXRfYyApOworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldF9jICk7CisJCX0KKworCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCUFEVkFOQ0VfUklORygpOworCX0KKworCS8qIEluY3JlbWVudCB0aGUgZnJhbWUgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAorCSAqIHRocm90dGxlIHRoZSBmcmFtZXJhdGUgYnkgd2FpdGluZyBmb3IgdGhpcyB2YWx1ZSBiZWZvcmUKKwkgKiBwZXJmb3JtaW5nIHRoZSBzd2FwYnVmZmVyIGlvY3RsLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKys7CisKKwlCRUdJTl9SSU5HKCAyICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfTEFTVF9GUkFNRV9SRUcsIDAgKSApOworCU9VVF9SSU5HKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2ZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsIAorCQlfX0ZVTkNUSU9OX18sCisJCWRldl9wcml2LT5jdXJyZW50X3BhZ2UsCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlKTsKKworI2lmIFIxMjhfUEVSRk9STUFOQ0VfQk9YRVMKKwkvKiBEbyBzb21lIHRyaXZpYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4uLgorCSAqLworCXIxMjhfY2NlX3BlcmZvcm1hbmNlX2JveGVzKCBkZXZfcHJpdiApOworI2VuZGlmCisKKwlCRUdJTl9SSU5HKCA0ICk7CisKKwlSMTI4X1dBSVRfVU5USUxfUEFHRV9GTElQUEVEKCk7CisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0NSVENfT0ZGU0VULCAwICkgKTsKKworCWlmICggZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwICkgeworCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ICk7CisJfSBlbHNlIHsKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9vZmZzZXQgKTsKKwl9CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCS8qIEluY3JlbWVudCB0aGUgZnJhbWUgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAorCSAqIHRocm90dGxlIHRoZSBmcmFtZXJhdGUgYnkgd2FpdGluZyBmb3IgdGhpcyB2YWx1ZSBiZWZvcmUKKwkgKiBwZXJmb3JtaW5nIHRoZSBzd2FwYnVmZmVyIGlvY3RsLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKys7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0KKwkJCQkJICAgICAgMSAtIGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisKKwlCRUdJTl9SSU5HKCAyICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfTEFTVF9GUkFNRV9SRUcsIDAgKSApOworCU9VVF9SSU5HKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3ZlcnRleCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJICAgICAgZHJtX2J1Zl90ICpidWYgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJaW50IGZvcm1hdCA9IHNhcmVhX3ByaXYtPnZjX2Zvcm1hdDsKKwlpbnQgb2Zmc2V0ID0gYnVmLT5idXNfYWRkcmVzczsKKwlpbnQgc2l6ZSA9IGJ1Zi0+dXNlZDsKKwlpbnQgcHJpbSA9IGJ1Zl9wcml2LT5wcmltOworCWludCBpID0gMDsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJidWY9JWQgbmJveD0lZFxuIiwgYnVmLT5pZHgsIHNhcmVhX3ByaXYtPm5ib3ggKTsKKworCWlmICggMCApCisJCXIxMjhfcHJpbnRfZGlydHkoICJkaXNwYXRjaF92ZXJ0ZXgiLCBzYXJlYV9wcml2LT5kaXJ0eSApOworCisJaWYgKCBidWYtPnVzZWQgKSB7CisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMTsKKworCQlpZiAoIHNhcmVhX3ByaXYtPmRpcnR5ICYgflIxMjhfVVBMT0FEX0NMSVBSRUNUUyApIHsKKwkJCXIxMjhfZW1pdF9zdGF0ZSggZGV2X3ByaXYgKTsKKwkJfQorCisJCWRvIHsKKwkJCS8qIEVtaXQgdGhlIG5leHQgc2V0IG9mIHVwIHRvIHRocmVlIGNsaXByZWN0cyAqLworCQkJaWYgKCBpIDwgc2FyZWFfcHJpdi0+bmJveCApIHsKKwkJCQlyMTI4X2VtaXRfY2xpcF9yZWN0cyggZGV2X3ByaXYsCisJCQkJCQkgICAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0sCisJCQkJCQkgICAgICBzYXJlYV9wcml2LT5uYm94IC0gaSApOworCQkJfQorCisJCQkvKiBFbWl0IHRoZSB2ZXJ0ZXggYnVmZmVyIHJlbmRlcmluZyBjb21tYW5kcyAqLworCQkJQkVHSU5fUklORyggNSApOworCisJCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfM0RfUk5EUl9HRU5fSU5EWF9QUklNLCAzICkgKTsKKwkJCU9VVF9SSU5HKCBvZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBzaXplICk7CisJCQlPVVRfUklORyggZm9ybWF0ICk7CisJCQlPVVRfUklORyggcHJpbSB8IFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9XQUxLX0xJU1QgfAorCQkJCSAgKHNpemUgPDwgUjEyOF9DQ0VfVkNfQ05UTF9OVU1fU0hJRlQpICk7CisKKwkJCUFEVkFOQ0VfUklORygpOworCisJCQlpICs9IDM7CisJCX0gd2hpbGUgKCBpIDwgc2FyZWFfcHJpdi0+bmJveCApOworCX0KKworCWlmICggYnVmX3ByaXYtPmRpc2NhcmQgKSB7CisJCWJ1Zl9wcml2LT5hZ2UgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaDsKKworCQkvKiBFbWl0IHRoZSB2ZXJ0ZXggYnVmZmVyIGFnZSAqLworCQlCRUdJTl9SSU5HKCAyICk7CisKKwkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0xBU1RfRElTUEFUQ0hfUkVHLCAwICkgKTsKKwkJT1VUX1JJTkcoIGJ1Zl9wcml2LT5hZ2UgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKworCQlidWYtPnBlbmRpbmcgPSAxOworCQlidWYtPnVzZWQgPSAwOworCQkvKiBGSVhNRTogQ2hlY2sgZGlzcGF0Y2hlZCBmaWVsZCAqLworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2grKzsKKworCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9DTElQUkVDVFM7CisJc2FyZWFfcHJpdi0+bmJveCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2luZGlyZWN0KCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJZHJtX2J1Zl90ICpidWYsCisJCQkJCWludCBzdGFydCwgaW50IGVuZCApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggImluZGlyZWN0OiBidWY9JWQgcz0weCV4IGU9MHgleFxuIiwKKwkJICAgYnVmLT5pZHgsIHN0YXJ0LCBlbmQgKTsKKworCWlmICggc3RhcnQgIT0gZW5kICkgeworCQlpbnQgb2Zmc2V0ID0gYnVmLT5idXNfYWRkcmVzcyArIHN0YXJ0OworCQlpbnQgZHdvcmRzID0gKGVuZCAtIHN0YXJ0ICsgMykgLyBzaXplb2YodTMyKTsKKworCQkvKiBJbmRpcmVjdCBidWZmZXIgZGF0YSBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mCisJCSAqIGR3b3Jkcywgc28gaWYgd2UndmUgYmVlbiBnaXZlbiBhbiBvZGQgbnVtYmVyIHdlIG11c3QKKwkJICogcGFkIHRoZSBkYXRhIHdpdGggYSBUeXBlLTIgQ0NFIHBhY2tldC4KKwkJICovCisJCWlmICggZHdvcmRzICYgMSApIHsKKwkJCXUzMiAqZGF0YSA9ICh1MzIgKikKKwkJCQkoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUKKwkJCQkgKyBidWYtPm9mZnNldCArIHN0YXJ0KTsKKwkJCWRhdGFbZHdvcmRzKytdID0gY3B1X3RvX2xlMzIoIFIxMjhfQ0NFX1BBQ0tFVDIgKTsKKwkJfQorCisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMTsKKworCQkvKiBGaXJlIG9mZiB0aGUgaW5kaXJlY3QgYnVmZmVyICovCisJCUJFR0lOX1JJTkcoIDMgKTsKKworCQlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfUE00X0lXX0lORE9GRiwgMSApICk7CisJCU9VVF9SSU5HKCBvZmZzZXQgKTsKKwkJT1VUX1JJTkcoIGR3b3JkcyApOworCisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggYnVmX3ByaXYtPmRpc2NhcmQgKSB7CisJCWJ1Zl9wcml2LT5hZ2UgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaDsKKworCQkvKiBFbWl0IHRoZSBpbmRpcmVjdCBidWZmZXIgYWdlICovCisJCUJFR0lOX1JJTkcoIDIgKTsKKworCQlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfTEFTVF9ESVNQQVRDSF9SRUcsIDAgKSApOworCQlPVVRfUklORyggYnVmX3ByaXYtPmFnZSApOworCisJCUFEVkFOQ0VfUklORygpOworCisJCWJ1Zi0+cGVuZGluZyA9IDE7CisJCWJ1Zi0+dXNlZCA9IDA7CisJCS8qIEZJWE1FOiBDaGVjayBkaXNwYXRjaGVkIGZpZWxkICovCisJCWJ1Zl9wcml2LT5kaXNwYXRjaGVkID0gMDsKKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCsrOworfQorCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpY2VzKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICAgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgICAgIGludCBzdGFydCwgaW50IGVuZCwKKwkJCQkgICAgICAgaW50IGNvdW50ICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBmb3JtYXQgPSBzYXJlYV9wcml2LT52Y19mb3JtYXQ7CisJaW50IG9mZnNldCA9IGRldi0+YWdwX2J1ZmZlcl9tYXAtPm9mZnNldCAtIGRldl9wcml2LT5jY2VfYnVmZmVyc19vZmZzZXQ7CisJaW50IHByaW0gPSBidWZfcHJpdi0+cHJpbTsKKwl1MzIgKmRhdGE7CisJaW50IGR3b3JkczsKKwlpbnQgaSA9IDA7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiaW5kaWNlczogcz0lZCBlPSVkIGM9JWRcbiIsIHN0YXJ0LCBlbmQsIGNvdW50ICk7CisKKwlpZiAoIDAgKQorCQlyMTI4X3ByaW50X2RpcnR5KCAiZGlzcGF0Y2hfaW5kaWNlcyIsIHNhcmVhX3ByaXYtPmRpcnR5ICk7CisKKwlpZiAoIHN0YXJ0ICE9IGVuZCApIHsKKwkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAxOworCisJCWlmICggc2FyZWFfcHJpdi0+ZGlydHkgJiB+UjEyOF9VUExPQURfQ0xJUFJFQ1RTICkgeworCQkJcjEyOF9lbWl0X3N0YXRlKCBkZXZfcHJpdiApOworCQl9CisKKwkJZHdvcmRzID0gKGVuZCAtIHN0YXJ0ICsgMykgLyBzaXplb2YodTMyKTsKKworCQlkYXRhID0gKHUzMiAqKSgoY2hhciAqKWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZQorCQkJICAgICAgICsgYnVmLT5vZmZzZXQgKyBzdGFydCk7CisKKwkJZGF0YVswXSA9IGNwdV90b19sZTMyKCBDQ0VfUEFDS0VUMyggUjEyOF8zRF9STkRSX0dFTl9JTkRYX1BSSU0sCisJCQkJCQkgICAgZHdvcmRzLTIgKSApOworCisJCWRhdGFbMV0gPSBjcHVfdG9fbGUzMiggb2Zmc2V0ICk7CisJCWRhdGFbMl0gPSBjcHVfdG9fbGUzMiggUjEyOF9NQVhfVkJfVkVSVFMgKTsKKwkJZGF0YVszXSA9IGNwdV90b19sZTMyKCBmb3JtYXQgKTsKKwkJZGF0YVs0XSA9IGNwdV90b19sZTMyKCAocHJpbSB8IFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9XQUxLX0lORCB8CisJCQkJCShjb3VudCA8PCAxNikpICk7CisKKwkJaWYgKCBjb3VudCAmIDB4MSApIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwkJCWRhdGFbZHdvcmRzLTFdICY9IDB4MDAwMGZmZmY7CisjZWxzZQorCQkJZGF0YVtkd29yZHMtMV0gJj0gMHhmZmZmMDAwMDsKKyNlbmRpZgorCQl9CisKKwkJZG8geworCQkJLyogRW1pdCB0aGUgbmV4dCBzZXQgb2YgdXAgdG8gdGhyZWUgY2xpcHJlY3RzICovCisJCQlpZiAoIGkgPCBzYXJlYV9wcml2LT5uYm94ICkgeworCQkJCXIxMjhfZW1pdF9jbGlwX3JlY3RzKCBkZXZfcHJpdiwKKwkJCQkJCSAgICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSwKKwkJCQkJCSAgICAgIHNhcmVhX3ByaXYtPm5ib3ggLSBpICk7CisJCQl9CisKKwkJCXIxMjhfY2NlX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGJ1Ziwgc3RhcnQsIGVuZCApOworCisJCQlpICs9IDM7CisJCX0gd2hpbGUgKCBpIDwgc2FyZWFfcHJpdi0+bmJveCApOworCX0KKworCWlmICggYnVmX3ByaXYtPmRpc2NhcmQgKSB7CisJCWJ1Zl9wcml2LT5hZ2UgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaDsKKworCQkvKiBFbWl0IHRoZSB2ZXJ0ZXggYnVmZmVyIGFnZSAqLworCQlCRUdJTl9SSU5HKCAyICk7CisKKwkJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X0xBU1RfRElTUEFUQ0hfUkVHLCAwICkgKTsKKwkJT1VUX1JJTkcoIGJ1Zl9wcml2LT5hZ2UgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKworCQlidWYtPnBlbmRpbmcgPSAxOworCQkvKiBGSVhNRTogQ2hlY2sgZGlzcGF0Y2hlZCBmaWVsZCAqLworCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDA7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2grKzsKKworCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH5SMTI4X1VQTE9BRF9DTElQUkVDVFM7CisJc2FyZWFfcHJpdi0+bmJveCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfYmxpdCggRFJNRklMRSBmaWxwLAorCQkJCSAgIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgIGRybV9yMTI4X2JsaXRfdCAqYmxpdCApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJdTMyICpkYXRhOworCWludCBkd29yZF9zaGlmdCwgZHdvcmRzOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJLyogVGhlIGNvbXBpbGVyIHdvbid0IG9wdGltaXplIGF3YXkgYSBkaXZpc2lvbiBieSBhIHZhcmlhYmxlLAorCSAqIGV2ZW4gaWYgdGhlIG9ubHkgbGVnYWwgdmFsdWVzIGFyZSBwb3dlcnMgb2YgdHdvLiAgVGh1cywgd2UnbGwKKwkgKiB1c2UgYSBzaGlmdCBpbnN0ZWFkLgorCSAqLworCXN3aXRjaCAoIGJsaXQtPmZvcm1hdCApIHsKKwljYXNlIFIxMjhfREFUQVRZUEVfQVJHQjg4ODg6CisJCWR3b3JkX3NoaWZ0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBSMTI4X0RBVEFUWVBFX0FSR0IxNTU1OgorCWNhc2UgUjEyOF9EQVRBVFlQRV9SR0I1NjU6CisJY2FzZSBSMTI4X0RBVEFUWVBFX0FSR0I0NDQ0OgorCWNhc2UgUjEyOF9EQVRBVFlQRV9ZVllVNDIyOgorCWNhc2UgUjEyOF9EQVRBVFlQRV9WWVVZNDIyOgorCQlkd29yZF9zaGlmdCA9IDE7CisJCWJyZWFrOworCWNhc2UgUjEyOF9EQVRBVFlQRV9DSTg6CisJY2FzZSBSMTI4X0RBVEFUWVBFX1JHQjg6CisJCWR3b3JkX3NoaWZ0ID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCAiaW52YWxpZCBibGl0IGZvcm1hdCAlZFxuIiwgYmxpdC0+Zm9ybWF0ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJLyogRmx1c2ggdGhlIHBpeGVsIGNhY2hlLCBhbmQgbWFyayB0aGUgY29udGVudHMgYXMgUmVhZCBJbnZhbGlkLgorCSAqIFRoaXMgZW5zdXJlcyBubyBwaXhlbCBkYXRhIGdldHMgbWl4ZWQgdXAgd2l0aCB0aGUgdGV4dHVyZQorCSAqIGRhdGEgZnJvbSB0aGUgaG9zdCBkYXRhIGJsaXQsIG90aGVyd2lzZSBwYXJ0IG9mIHRoZSB0ZXh0dXJlCisJICogaW1hZ2UgbWF5IGJlIGNvcnJ1cHRlZC4KKwkgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfUENfR1VJX0NUTFNUQVQsIDAgKSApOworCU9VVF9SSU5HKCBSMTI4X1BDX1JJX0dVSSB8IFIxMjhfUENfRkxVU0hfR1VJICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCS8qIERpc3BhdGNoIHRoZSBpbmRpcmVjdCBidWZmZXIuCisJICovCisJYnVmID0gZG1hLT5idWZsaXN0W2JsaXQtPmlkeF07CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCBibGl0LT5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlidWZfcHJpdi0+ZGlzY2FyZCA9IDE7CisKKwlkd29yZHMgPSAoYmxpdC0+d2lkdGggKiBibGl0LT5oZWlnaHQpID4+IGR3b3JkX3NoaWZ0OworCisJZGF0YSA9ICh1MzIgKikoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKyBidWYtPm9mZnNldCk7CisKKwlkYXRhWzBdID0gY3B1X3RvX2xlMzIoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfSE9TVERBVEFfQkxULCBkd29yZHMgKyA2ICkgKTsKKwlkYXRhWzFdID0gY3B1X3RvX2xlMzIoIChSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJCVIxMjhfR01DX0JSVVNIX05PTkUgfAorCQkJCShibGl0LT5mb3JtYXQgPDwgOCkgfAorCQkJCVIxMjhfR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkJUjEyOF9ST1AzX1MgfAorCQkJCVIxMjhfRFBfU1JDX1NPVVJDRV9IT1NUX0RBVEEgfAorCQkJCVIxMjhfR01DX0NMUl9DTVBfQ05UTF9ESVMgfAorCQkJCVIxMjhfR01DX0FVWF9DTElQX0RJUyB8CisJCQkJUjEyOF9HTUNfV1JfTVNLX0RJUykgKTsKKworCWRhdGFbMl0gPSBjcHVfdG9fbGUzMiggKGJsaXQtPnBpdGNoIDw8IDIxKSB8IChibGl0LT5vZmZzZXQgPj4gNSkgKTsKKwlkYXRhWzNdID0gY3B1X3RvX2xlMzIoIDB4ZmZmZmZmZmYgKTsKKwlkYXRhWzRdID0gY3B1X3RvX2xlMzIoIDB4ZmZmZmZmZmYgKTsKKwlkYXRhWzVdID0gY3B1X3RvX2xlMzIoIChibGl0LT55IDw8IDE2KSB8IGJsaXQtPnggKTsKKwlkYXRhWzZdID0gY3B1X3RvX2xlMzIoIChibGl0LT5oZWlnaHQgPDwgMTYpIHwgYmxpdC0+d2lkdGggKTsKKwlkYXRhWzddID0gY3B1X3RvX2xlMzIoIGR3b3JkcyApOworCisJYnVmLT51c2VkID0gKGR3b3JkcyArIDgpICogc2l6ZW9mKHUzMik7CisKKwlyMTI4X2NjZV9kaXNwYXRjaF9pbmRpcmVjdCggZGV2LCBidWYsIDAsIGJ1Zi0+dXNlZCApOworCisJLyogRmx1c2ggdGhlIHBpeGVsIGNhY2hlIGFmdGVyIHRoZSBibGl0IGNvbXBsZXRlcy4gIFRoaXMgZW5zdXJlcworCSAqIHRoZSB0ZXh0dXJlIGRhdGEgaXMgd3JpdHRlbiBvdXQgdG8gbWVtb3J5IGJlZm9yZSByZW5kZXJpbmcKKwkgKiBjb250aW51ZXMuCisJICovCisJQkVHSU5fUklORyggMiApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQwKCBSMTI4X1BDX0dVSV9DVExTVEFULCAwICkgKTsKKwlPVVRfUklORyggUjEyOF9QQ19GTFVTSF9HVUkgKTsKKworCUFEVkFOQ0VfUklORygpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGlsZWQgZGVwdGggYnVmZmVyIG1hbmFnZW1lbnQKKyAqCisgKiBGSVhNRTogVGhlc2Ugc2hvdWxkIGFsbCBzZXQgdGhlIGRlc3RpbmF0aW9uIHdyaXRlIG1hc2sgZm9yIHdoZW4gd2UKKyAqIGhhdmUgaGFyZHdhcmUgc3RlbmNpbCBzdXBwb3J0LgorICovCisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfc3BhbiggZHJtX2RldmljZV90ICpkZXYsCisJCQkJCSBkcm1fcjEyOF9kZXB0aF90ICpkZXB0aCApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGNvdW50LCB4LCB5OworCXUzMiAqYnVmZmVyOworCXU4ICptYXNrOworCWludCBpLCBidWZmZXJfc2l6ZSwgbWFza19zaXplOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJY291bnQgPSBkZXB0aC0+bjsKKwlpZiAoY291bnQgPiA0MDk2IHx8IGNvdW50IDw9IDApCisJCXJldHVybiBEUk1fRVJSKEVNU0dTSVpFKTsKKworCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmeCwgZGVwdGgtPngsIHNpemVvZih4KSApICkgeworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJnksIGRlcHRoLT55LCBzaXplb2YoeSkgKSApIHsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlidWZmZXJfc2l6ZSA9IGRlcHRoLT5uICogc2l6ZW9mKHUzMik7CisJYnVmZmVyID0gZHJtX2FsbG9jKCBidWZmZXJfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCBidWZmZXIgPT0gTlVMTCApCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoIGJ1ZmZlciwgZGVwdGgtPmJ1ZmZlciwgYnVmZmVyX3NpemUgKSApIHsKKwkJZHJtX2ZyZWUoIGJ1ZmZlciwgYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJbWFza19zaXplID0gZGVwdGgtPm4gKiBzaXplb2YodTgpOworCWlmICggZGVwdGgtPm1hc2sgKSB7CisJCW1hc2sgPSBkcm1fYWxsb2MoIG1hc2tfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWlmICggbWFzayA9PSBOVUxMICkgeworCQkJZHJtX2ZyZWUoIGJ1ZmZlciwgYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyApOworCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJfQorCQlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggbWFzaywgZGVwdGgtPm1hc2ssIG1hc2tfc2l6ZSApICkgeworCQkJZHJtX2ZyZWUoIGJ1ZmZlciwgYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyApOworCQkJZHJtX2ZyZWUoIG1hc2ssIG1hc2tfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQl9CisKKwkJZm9yICggaSA9IDAgOyBpIDwgY291bnQgOyBpKyssIHgrKyApIHsKKwkJCWlmICggbWFza1tpXSApIHsKKwkJCQlCRUdJTl9SSU5HKCA2ICk7CisKKwkJCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9QQUlOVF9NVUxUSSwgNCApICk7CisJCQkJT1VUX1JJTkcoIFIxMjhfR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJCSAgUjEyOF9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCQkgIChkZXZfcHJpdi0+ZGVwdGhfZm10IDw8IDgpIHwKKwkJCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCQkgIFIxMjhfUk9QM19QIHwKKwkJCQkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCQkJICBSMTI4X0dNQ19XUl9NU0tfRElTICk7CisKKwkJCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jICk7CisJCQkJT1VUX1JJTkcoIGJ1ZmZlcltpXSApOworCisJCQkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJCQlPVVRfUklORyggKDEgPDwgMTYpIHwgMSApOworCisJCQkJQURWQU5DRV9SSU5HKCk7CisJCQl9CisJCX0KKworCQlkcm1fZnJlZSggbWFzaywgbWFza19zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwl9IGVsc2UgeworCQlmb3IgKCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKywgeCsrICkgeworCQkJQkVHSU5fUklORyggNiApOworCisJCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9QQUlOVF9NVUxUSSwgNCApICk7CisJCQlPVVRfUklORyggUjEyOF9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJCQkgIFIxMjhfR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkgIChkZXZfcHJpdi0+ZGVwdGhfZm10IDw8IDgpIHwKKwkJCQkgIFIxMjhfR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkJICBSMTI4X1JPUDNfUCB8CisJCQkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCQkgIFIxMjhfR01DX1dSX01TS19ESVMgKTsKKworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5kZXB0aF9waXRjaF9vZmZzZXRfYyApOworCQkJT1VUX1JJTkcoIGJ1ZmZlcltpXSApOworCisJCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCQkJT1VUX1JJTkcoICgxIDw8IDE2KSB8IDEgKTsKKworCQkJQURWQU5DRV9SSU5HKCk7CisJCX0KKwl9CisKKwlkcm1fZnJlZSggYnVmZmVyLCBidWZmZXJfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF93cml0ZV9waXhlbHMoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQkgICBkcm1fcjEyOF9kZXB0aF90ICpkZXB0aCApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGNvdW50LCAqeCwgKnk7CisJdTMyICpidWZmZXI7CisJdTggKm1hc2s7CisJaW50IGksIHhidWZfc2l6ZSwgeWJ1Zl9zaXplLCBidWZmZXJfc2l6ZSwgbWFza19zaXplOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIlxuIiApOworCisJY291bnQgPSBkZXB0aC0+bjsKKwlpZiAoY291bnQgPiA0MDk2IHx8IGNvdW50IDw9IDApCisJCXJldHVybiBEUk1fRVJSKEVNU0dTSVpFKTsKKworCXhidWZfc2l6ZSA9IGNvdW50ICogc2l6ZW9mKCp4KTsKKwl5YnVmX3NpemUgPSBjb3VudCAqIHNpemVvZigqeSk7CisJeCA9IGRybV9hbGxvYyggeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwlpZiAoIHggPT0gTlVMTCApIHsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisJeSA9IGRybV9hbGxvYyggeWJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwlpZiAoIHkgPT0gTlVMTCApIHsKKwkJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCB4LCBkZXB0aC0+eCwgeGJ1Zl9zaXplICkgKSB7CisJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlkcm1fZnJlZSggeSwgeWJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoIHksIGRlcHRoLT55LCB4YnVmX3NpemUgKSApIHsKKwkJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCWJ1ZmZlcl9zaXplID0gZGVwdGgtPm4gKiBzaXplb2YodTMyKTsKKwlidWZmZXIgPSBkcm1fYWxsb2MoIGJ1ZmZlcl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwlpZiAoIGJ1ZmZlciA9PSBOVUxMICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCBidWZmZXIsIGRlcHRoLT5idWZmZXIsIGJ1ZmZlcl9zaXplICkgKSB7CisJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlkcm1fZnJlZSggeSwgeWJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIGJ1ZmZlciwgYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCWlmICggZGVwdGgtPm1hc2sgKSB7CisJCW1hc2tfc2l6ZSA9IGRlcHRoLT5uICogc2l6ZW9mKHU4KTsKKwkJbWFzayA9IGRybV9hbGxvYyggbWFza19zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJaWYgKCBtYXNrID09IE5VTEwgKSB7CisJCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJCWRybV9mcmVlKCB5LCB5YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQkJZHJtX2ZyZWUoIGJ1ZmZlciwgYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyApOworCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJfQorCQlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggbWFzaywgZGVwdGgtPm1hc2ssIG1hc2tfc2l6ZSApICkgeworCQkJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICApOworCQkJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICApOworCQkJZHJtX2ZyZWUoIGJ1ZmZlciwgYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyAgKTsKKwkJCWRybV9mcmVlKCBtYXNrLCBtYXNrX3NpemUsIERSTV9NRU1fQlVGUyAgKTsKKwkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCX0KKworCQlmb3IgKCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKyApIHsKKwkJCWlmICggbWFza1tpXSApIHsKKwkJCQlCRUdJTl9SSU5HKCA2ICk7CisKKwkJCQlPVVRfUklORyggQ0NFX1BBQ0tFVDMoIFIxMjhfQ05UTF9QQUlOVF9NVUxUSSwgNCApICk7CisJCQkJT1VUX1JJTkcoIFIxMjhfR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJCSAgUjEyOF9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAorCQkJCQkgIChkZXZfcHJpdi0+ZGVwdGhfZm10IDw8IDgpIHwKKwkJCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCQkgIFIxMjhfUk9QM19QIHwKKwkJCQkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCQkJICBSMTI4X0dNQ19XUl9NU0tfRElTICk7CisKKwkJCQlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jICk7CisJCQkJT1VUX1JJTkcoIGJ1ZmZlcltpXSApOworCisJCQkJT1VUX1JJTkcoICh4W2ldIDw8IDE2KSB8IHlbaV0gKTsKKwkJCQlPVVRfUklORyggKDEgPDwgMTYpIHwgMSApOworCisJCQkJQURWQU5DRV9SSU5HKCk7CisJCQl9CisJCX0KKworCQlkcm1fZnJlZSggbWFzaywgbWFza19zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwl9IGVsc2UgeworCQlmb3IgKCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKyApIHsKKwkJCUJFR0lOX1JJTkcoIDYgKTsKKworCQkJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJT1VUX1JJTkcoIFIxMjhfR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJICBSMTI4X0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJICAoZGV2X3ByaXYtPmRlcHRoX2ZtdCA8PCA4KSB8CisJCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJCSAgUjEyOF9ST1AzX1AgfAorCQkJCSAgUjEyOF9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8CisJCQkJICBSMTI4X0dNQ19XUl9NU0tfRElTICk7CisKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZGVwdGhfcGl0Y2hfb2Zmc2V0X2MgKTsKKwkJCU9VVF9SSU5HKCBidWZmZXJbaV0gKTsKKworCQkJT1VUX1JJTkcoICh4W2ldIDw8IDE2KSB8IHlbaV0gKTsKKwkJCU9VVF9SSU5HKCAoMSA8PCAxNikgfCAxICk7CisKKwkJCUFEVkFOQ0VfUklORygpOworCQl9CisJfQorCisJZHJtX2ZyZWUoIHgsIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJZHJtX2ZyZWUoIGJ1ZmZlciwgYnVmZmVyX3NpemUsIERSTV9NRU1fQlVGUyApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfcmVhZF9zcGFuKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJZHJtX3IxMjhfZGVwdGhfdCAqZGVwdGggKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjb3VudCwgeCwgeTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWNvdW50ID0gZGVwdGgtPm47CisJaWYgKGNvdW50ID4gNDA5NiB8fCBjb3VudCA8PSAwKQorCQlyZXR1cm4gRFJNX0VSUihFTVNHU0laRSk7CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJngsIGRlcHRoLT54LCBzaXplb2YoeCkgKSApIHsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZ5LCBkZXB0aC0+eSwgc2l6ZW9mKHkpICkgKSB7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJQkVHSU5fUklORyggNyApOworCisJT1VUX1JJTkcoIENDRV9QQUNLRVQzKCBSMTI4X0NOVExfQklUQkxUX01VTFRJLCA1ICkgKTsKKwlPVVRfUklORyggUjEyOF9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKKwkJICBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkgIFIxMjhfR01DX0JSVVNIX05PTkUgfAorCQkgIChkZXZfcHJpdi0+ZGVwdGhfZm10IDw8IDgpIHwKKwkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkgIFIxMjhfUk9QM19TIHwKKwkJICBSMTI4X0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKKwkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJICBSMTI4X0dNQ19XUl9NU0tfRElTICk7CisKKwlPVVRfUklORyggZGV2X3ByaXYtPmRlcHRoX3BpdGNoX29mZnNldF9jICk7CisJT1VUX1JJTkcoIGRldl9wcml2LT5zcGFuX3BpdGNoX29mZnNldF9jICk7CisKKwlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCU9VVF9SSU5HKCAoMCA8PCAxNikgfCAwICk7CisJT1VUX1JJTkcoIChjb3VudCA8PCAxNikgfCAxICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfcGl4ZWxzKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICBkcm1fcjEyOF9kZXB0aF90ICpkZXB0aCApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGNvdW50LCAqeCwgKnk7CisJaW50IGksIHhidWZfc2l6ZSwgeWJ1Zl9zaXplOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWNvdW50ID0gZGVwdGgtPm47CisJaWYgKGNvdW50ID4gNDA5NiB8fCBjb3VudCA8PSAwKQorCQlyZXR1cm4gRFJNX0VSUihFTVNHU0laRSk7CisKKwlpZiAoIGNvdW50ID4gZGV2X3ByaXYtPmRlcHRoX3BpdGNoICkgeworCQljb3VudCA9IGRldl9wcml2LT5kZXB0aF9waXRjaDsKKwl9CisKKwl4YnVmX3NpemUgPSBjb3VudCAqIHNpemVvZigqeCk7CisJeWJ1Zl9zaXplID0gY291bnQgKiBzaXplb2YoKnkpOworCXggPSBkcm1fYWxsb2MoIHhidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCB4ID09IE5VTEwgKSB7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCXkgPSBkcm1fYWxsb2MoIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCB5ID09IE5VTEwgKSB7CisJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggeCwgZGVwdGgtPngsIHhidWZfc2l6ZSApICkgeworCQlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJZHJtX2ZyZWUoIHksIHlidWZfc2l6ZSwgRFJNX01FTV9CVUZTICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCB5LCBkZXB0aC0+eSwgeWJ1Zl9zaXplICkgKSB7CisJCWRybV9mcmVlKCB4LCB4YnVmX3NpemUsIERSTV9NRU1fQlVGUyApOworCQlkcm1fZnJlZSggeSwgeWJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlmb3IgKCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKyApIHsKKwkJQkVHSU5fUklORyggNyApOworCisJCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMyggUjEyOF9DTlRMX0JJVEJMVF9NVUxUSSwgNSApICk7CisJCU9VVF9SSU5HKCBSMTI4X0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICBSMTI4X0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICBSMTI4X0dNQ19CUlVTSF9OT05FIHwKKwkJCSAgKGRldl9wcml2LT5kZXB0aF9mbXQgPDwgOCkgfAorCQkJICBSMTI4X0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJICBSMTI4X1JPUDNfUyB8CisJCQkgIFIxMjhfRFBfU1JDX1NPVVJDRV9NRU1PUlkgfAorCQkJICBSMTI4X0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCSAgUjEyOF9HTUNfV1JfTVNLX0RJUyApOworCisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZGVwdGhfcGl0Y2hfb2Zmc2V0X2MgKTsKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5zcGFuX3BpdGNoX29mZnNldF9jICk7CisKKwkJT1VUX1JJTkcoICh4W2ldIDw8IDE2KSB8IHlbaV0gKTsKKwkJT1VUX1JJTkcoIChpIDw8IDE2KSB8IDAgKTsKKwkJT1VUX1JJTkcoICgxIDw8IDE2KSB8IDEgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlkcm1fZnJlZSggeCwgeGJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKwlkcm1fZnJlZSggeSwgeWJ1Zl9zaXplLCBEUk1fTUVNX0JVRlMgKTsKKworCXJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBvbHlnb24gc3RpcHBsZQorICovCisKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3N0aXBwbGUoIGRybV9kZXZpY2VfdCAqZGV2LCB1MzIgKnN0aXBwbGUgKQoreworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUJFR0lOX1JJTkcoIDMzICk7CisKKwlPVVRfUklORyggQ0NFX1BBQ0tFVDAoIFIxMjhfQlJVU0hfREFUQTAsIDMxICkgKTsKKwlmb3IgKCBpID0gMCA7IGkgPCAzMiA7IGkrKyApIHsKKwkJT1VUX1JJTkcoIHN0aXBwbGVbaV0gKTsKKwl9CisKKwlBRFZBTkNFX1JJTkcoKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJT0NUTCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IHIxMjhfY2NlX2NsZWFyKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJZHJtX3IxMjhfY2xlYXJfdCBjbGVhcjsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGNsZWFyLCAoZHJtX3IxMjhfY2xlYXJfdCBfX3VzZXIgKikgZGF0YSwKKwkJCSAgICAgc2l6ZW9mKGNsZWFyKSApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKCBzYXJlYV9wcml2LT5uYm94ID4gUjEyOF9OUl9TQVJFQV9DTElQUkVDVFMgKQorCQlzYXJlYV9wcml2LT5uYm94ID0gUjEyOF9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlyMTI4X2NjZV9kaXNwYXRjaF9jbGVhciggZGV2LCAmY2xlYXIgKTsKKwlDT01NSVRfUklORygpOworCisJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkgKi8KKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+ZGlydHkgfD0gUjEyOF9VUExPQURfQ09OVEVYVCB8IFIxMjhfVVBMT0FEX01BU0tTOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9kb19pbml0X3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlkZXZfcHJpdi0+Y3J0Y19vZmZzZXQgPSAgICAgIFIxMjhfUkVBRCggUjEyOF9DUlRDX09GRlNFVCApOworCWRldl9wcml2LT5jcnRjX29mZnNldF9jbnRsID0gUjEyOF9SRUFEKCBSMTI4X0NSVENfT0ZGU0VUX0NOVEwgKTsKKworCVIxMjhfV1JJVEUoIFIxMjhfQ1JUQ19PRkZTRVQsIGRldl9wcml2LT5mcm9udF9vZmZzZXQgKTsKKwlSMTI4X1dSSVRFKCBSMTI4X0NSVENfT0ZGU0VUX0NOVEwsCisJCSAgICBkZXZfcHJpdi0+Y3J0Y19vZmZzZXRfY250bCB8IFIxMjhfQ1JUQ19PRkZTRVRfRkxJUF9DTlRMICk7CisKKwlkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyA9IDE7CisJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDA7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByMTI4X2RvX2NsZWFudXBfcGFnZWZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCVIxMjhfV1JJVEUoIFIxMjhfQ1JUQ19PRkZTRVQsICAgICAgZGV2X3ByaXYtPmNydGNfb2Zmc2V0ICk7CisJUjEyOF9XUklURSggUjEyOF9DUlRDX09GRlNFVF9DTlRMLCBkZXZfcHJpdi0+Y3J0Y19vZmZzZXRfY250bCApOworCisJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgIT0gMCkgeworCQlyMTI4X2NjZV9kaXNwYXRjaF9mbGlwKCBkZXYgKTsKKwkJQ09NTUlUX1JJTkcoKTsKKwl9CisKKwlkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFN3YXBwaW5nIGFuZCBmbGlwcGluZyBhcmUgZGlmZmVyZW50IG9wZXJhdGlvbnMsIG5lZWQgZGlmZmVyZW50IGlvY3Rscy4KKyAqIFRoZXkgY2FuICYgc2hvdWxkIGJlIGludGVybWl4ZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSAzZCB3aW5kb3dzLiAgCisgKi8KKworc3RhdGljIGludCByMTI4X2NjZV9mbGlwKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKCFkZXZfcHJpdi0+cGFnZV9mbGlwcGluZykgCisJCXIxMjhfZG9faW5pdF9wYWdlZmxpcCggZGV2ICk7CisKKwlyMTI4X2NjZV9kaXNwYXRjaF9mbGlwKCBkZXYgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2Vfc3dhcCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCURSTV9ERUJVRyggIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBSMTI4X05SX1NBUkVBX0NMSVBSRUNUUyApCisJCXNhcmVhX3ByaXYtPm5ib3ggPSBSMTI4X05SX1NBUkVBX0NMSVBSRUNUUzsKKworCXIxMjhfY2NlX2Rpc3BhdGNoX3N3YXAoIGRldiApOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5kaXJ0eSB8PSAoUjEyOF9VUExPQURfQ09OVEVYVCB8CisJCQkJCVIxMjhfVVBMT0FEX01BU0tTKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfdmVydGV4KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fcjEyOF92ZXJ0ZXhfdCB2ZXJ0ZXg7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHZlcnRleCwgKGRybV9yMTI4X3ZlcnRleF90IF9fdXNlciAqKSBkYXRhLAorCQkJICAgICBzaXplb2YodmVydGV4KSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkIGluZGV4PSVkIGNvdW50PSVkIGRpc2NhcmQ9JWRcbiIsCisJCSAgIERSTV9DVVJSRU5UUElELAorCQkgICB2ZXJ0ZXguaWR4LCB2ZXJ0ZXguY291bnQsIHZlcnRleC5kaXNjYXJkICk7CisKKwlpZiAoIHZlcnRleC5pZHggPCAwIHx8IHZlcnRleC5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIHZlcnRleC5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIHZlcnRleC5wcmltIDwgMCB8fAorCSAgICAgdmVydGV4LnByaW0gPiBSMTI4X0NDRV9WQ19DTlRMX1BSSU1fVFlQRV9UUklfVFlQRTIgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCB2ZXJ0ZXgucHJpbSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKwlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFt2ZXJ0ZXguaWR4XTsKKwlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwICkgeworCQlEUk1fRVJST1IoICJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHAgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBidWYtPnBlbmRpbmcgKSB7CisJCURSTV9FUlJPUiggInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIHZlcnRleC5pZHggKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlidWYtPnVzZWQgPSB2ZXJ0ZXguY291bnQ7CisJYnVmX3ByaXYtPnByaW0gPSB2ZXJ0ZXgucHJpbTsKKwlidWZfcHJpdi0+ZGlzY2FyZCA9IHZlcnRleC5kaXNjYXJkOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfdmVydGV4KCBkZXYsIGJ1ZiApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByMTI4X2NjZV9pbmRpY2VzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKKwlkcm1fcjEyOF9pbmRpY2VzX3QgZWx0czsKKwlpbnQgY291bnQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGVsdHMsIChkcm1fcjEyOF9pbmRpY2VzX3QgX191c2VyICopIGRhdGEsCisJCQkgICAgIHNpemVvZihlbHRzKSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkIGJ1Zj0lZCBzPSVkIGU9JWQgZD0lZFxuIiwgRFJNX0NVUlJFTlRQSUQsCisJCSAgIGVsdHMuaWR4LCBlbHRzLnN0YXJ0LCBlbHRzLmVuZCwgZWx0cy5kaXNjYXJkICk7CisKKwlpZiAoIGVsdHMuaWR4IDwgMCB8fCBlbHRzLmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICAgZWx0cy5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGVsdHMucHJpbSA8IDAgfHwKKwkgICAgIGVsdHMucHJpbSA+IFIxMjhfQ0NFX1ZDX0NOVExfUFJJTV9UWVBFX1RSSV9UWVBFMiApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIHByaW0gJWRcbiIsIGVsdHMucHJpbSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKwlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtlbHRzLmlkeF07CisJYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCBlbHRzLmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWNvdW50ID0gKGVsdHMuZW5kIC0gZWx0cy5zdGFydCkgLyBzaXplb2YodTE2KTsKKwllbHRzLnN0YXJ0IC09IFIxMjhfSU5ERVhfUFJJTV9PRkZTRVQ7CisKKwlpZiAoIGVsdHMuc3RhcnQgJiAweDcgKSB7CisJCURSTV9FUlJPUiggIm1pc2FsaWduZWQgYnVmZmVyIDB4JXhcbiIsIGVsdHMuc3RhcnQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBlbHRzLnN0YXJ0IDwgYnVmLT51c2VkICkgeworCQlEUk1fRVJST1IoICJubyBoZWFkZXIgMHgleCAtIDB4JXhcbiIsIGVsdHMuc3RhcnQsIGJ1Zi0+dXNlZCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWJ1Zi0+dXNlZCA9IGVsdHMuZW5kOworCWJ1Zl9wcml2LT5wcmltID0gZWx0cy5wcmltOworCWJ1Zl9wcml2LT5kaXNjYXJkID0gZWx0cy5kaXNjYXJkOworCisJcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaWNlcyggZGV2LCBidWYsIGVsdHMuc3RhcnQsIGVsdHMuZW5kLCBjb3VudCApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByMTI4X2NjZV9ibGl0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9ibGl0X3QgYmxpdDsKKwlpbnQgcmV0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggYmxpdCwgKGRybV9yMTI4X2JsaXRfdCBfX3VzZXIgKikgZGF0YSwKKwkJCSAgICAgc2l6ZW9mKGJsaXQpICk7CisKKwlEUk1fREVCVUcoICJwaWQ9JWQgaW5kZXg9JWRcbiIsIERSTV9DVVJSRU5UUElELCBibGl0LmlkeCApOworCisJaWYgKCBibGl0LmlkeCA8IDAgfHwgYmxpdC5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIGJsaXQuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlyZXQgPSByMTI4X2NjZV9kaXNwYXRjaF9ibGl0KCBmaWxwLCBkZXYsICZibGl0ICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGVwdGgoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X2RlcHRoX3QgZGVwdGg7CisJaW50IHJldDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGRlcHRoLCAoZHJtX3IxMjhfZGVwdGhfdCBfX3VzZXIgKikgZGF0YSwKKwkJCSAgICAgc2l6ZW9mKGRlcHRoKSApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJcmV0ID0gRFJNX0VSUihFSU5WQUwpOworCXN3aXRjaCAoIGRlcHRoLmZ1bmMgKSB7CisJY2FzZSBSMTI4X1dSSVRFX1NQQU46CisJCXJldCA9IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3NwYW4oIGRldiwgJmRlcHRoICk7CisJY2FzZSBSMTI4X1dSSVRFX1BJWEVMUzoKKwkJcmV0ID0gcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfcGl4ZWxzKCBkZXYsICZkZXB0aCApOworCWNhc2UgUjEyOF9SRUFEX1NQQU46CisJCXJldCA9IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfc3BhbiggZGV2LCAmZGVwdGggKTsKKwljYXNlIFIxMjhfUkVBRF9QSVhFTFM6CisJCXJldCA9IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfcGl4ZWxzKCBkZXYsICZkZXB0aCApOworCX0KKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByMTI4X2NjZV9zdGlwcGxlKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcjEyOF9zdGlwcGxlX3Qgc3RpcHBsZTsKKwl1MzIgbWFza1szMl07CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBzdGlwcGxlLCAoZHJtX3IxMjhfc3RpcHBsZV90IF9fdXNlciAqKSBkYXRhLAorCQkJICAgICBzaXplb2Yoc3RpcHBsZSkgKTsKKworCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmbWFzaywgc3RpcHBsZS5tYXNrLAorCQkJICAgICAzMiAqIHNpemVvZih1MzIpICkgKQorCQlyZXR1cm4gRFJNX0VSUiggRUZBVUxUICk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlyMTI4X2NjZV9kaXNwYXRjaF9zdGlwcGxlKCBkZXYsIG1hc2sgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjEyOF9jY2VfaW5kaXJlY3QoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWRybV9yMTI4X2luZGlyZWN0X3QgaW5kaXJlY3Q7CisjaWYgMAorCVJJTkdfTE9DQUxTOworI2VuZGlmCisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGluZGlyZWN0LCAoZHJtX3IxMjhfaW5kaXJlY3RfdCBfX3VzZXIgKikgZGF0YSwKKwkJCSAgICAgc2l6ZW9mKGluZGlyZWN0KSApOworCisJRFJNX0RFQlVHKCAiaW5kaXJlY3Q6IGlkeD0lZCBzPSVkIGU9JWQgZD0lZFxuIiwKKwkJICAgaW5kaXJlY3QuaWR4LCBpbmRpcmVjdC5zdGFydCwKKwkJICAgaW5kaXJlY3QuZW5kLCBpbmRpcmVjdC5kaXNjYXJkICk7CisKKwlpZiAoIGluZGlyZWN0LmlkeCA8IDAgfHwgaW5kaXJlY3QuaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICBpbmRpcmVjdC5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpbmRpcmVjdC5pZHhdOworCWJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKworCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7CisJCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgaW5kaXJlY3QuaWR4ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCBpbmRpcmVjdC5zdGFydCA8IGJ1Zi0+dXNlZCApIHsKKwkJRFJNX0VSUk9SKCAicmV1c2luZyBpbmRpcmVjdDogc3RhcnQ9MHgleCBhY3R1YWw9MHgleFxuIiwKKwkJCSAgIGluZGlyZWN0LnN0YXJ0LCBidWYtPnVzZWQgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlidWYtPnVzZWQgPSBpbmRpcmVjdC5lbmQ7CisJYnVmX3ByaXYtPmRpc2NhcmQgPSBpbmRpcmVjdC5kaXNjYXJkOworCisjaWYgMAorCS8qIFdhaXQgZm9yIHRoZSAzRCBzdHJlYW0gdG8gaWRsZSBiZWZvcmUgdGhlIGluZGlyZWN0IGJ1ZmZlcgorCSAqIGNvbnRhaW5pbmcgMkQgYWNjZWxlcmF0aW9uIGNvbW1hbmRzIGlzIHByb2Nlc3NlZC4KKwkgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOworCUFEVkFOQ0VfUklORygpOworI2VuZGlmCisKKwkvKiBEaXNwYXRjaCB0aGUgaW5kaXJlY3QgYnVmZmVyIGZ1bGwgb2YgY29tbWFuZHMgZnJvbSB0aGUKKwkgKiBYIHNlcnZlci4gIFRoaXMgaXMgaW5zZWN1cmUgYW5kIGlzIHRodXMgb25seSBhdmFpbGFibGUgdG8KKwkgKiBwcml2aWxlZ2VkIGNsaWVudHMuCisJICovCisJcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaXJlY3QoIGRldiwgYnVmLCBpbmRpcmVjdC5zdGFydCwgaW5kaXJlY3QuZW5kICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIxMjhfZ2V0cGFyYW0oIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yMTI4X2dldHBhcmFtX3QgcGFyYW07CisJaW50IHZhbHVlOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHBhcmFtLCAoZHJtX3IxMjhfZ2V0cGFyYW1fdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YocGFyYW0pICk7CisKKwlEUk1fREVCVUcoICJwaWQ9JWRcbiIsIERSTV9DVVJSRU5UUElEICk7CisKKwlzd2l0Y2goIHBhcmFtLnBhcmFtICkgeworCWNhc2UgUjEyOF9QQVJBTV9JUlFfTlI6CisJCXZhbHVlID0gZGV2LT5pcnE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCBwYXJhbS52YWx1ZSwgJnZhbHVlLCBzaXplb2YoaW50KSApICkgeworCQlEUk1fRVJST1IoICJjb3B5X3RvX3VzZXJcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcjEyOF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKQoreworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsKKwkJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJCWlmICggZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgKSB7CisJCQlyMTI4X2RvX2NsZWFudXBfcGFnZWZsaXAoIGRldiApOworCQl9CisJfQkJCQorfQorCit2b2lkIHIxMjhfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KQoreworCXIxMjhfZG9fY2xlYW51cF9jY2UoIGRldiApOworfQorCitkcm1faW9jdGxfZGVzY190IHIxMjhfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9JTklUKV0gICAgICAgPSB7IHIxMjhfY2NlX2luaXQsICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfU1RBUlQpXSAgPSB7IHIxMjhfY2NlX3N0YXJ0LCAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfU1RPUCldICAgPSB7IHIxMjhfY2NlX3N0b3AsICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfUkVTRVQpXSAgPSB7IHIxMjhfY2NlX3Jlc2V0LCAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfSURMRSldICAgPSB7IHIxMjhfY2NlX2lkbGUsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9SRVNFVCldICAgICAgPSB7IHIxMjhfZW5naW5lX3Jlc2V0LCAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9GVUxMU0NSRUVOKV0gPSB7IHIxMjhfZnVsbHNjcmVlbiwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9TV0FQKV0gICAgICAgPSB7IHIxMjhfY2NlX3N3YXAsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9GTElQKV0gICAgICAgPSB7IHIxMjhfY2NlX2ZsaXAsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DTEVBUildICAgICAgPSB7IHIxMjhfY2NlX2NsZWFyLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9WRVJURVgpXSAgICAgPSB7IHIxMjhfY2NlX3ZlcnRleCwgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9JTkRJQ0VTKV0gICAgPSB7IHIxMjhfY2NlX2luZGljZXMsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9CTElUKV0gICAgICAgPSB7IHIxMjhfY2NlX2JsaXQsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9ERVBUSCldICAgICAgPSB7IHIxMjhfY2NlX2RlcHRoLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9TVElQUExFKV0gICAgPSB7IHIxMjhfY2NlX3N0aXBwbGUsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9JTkRJUkVDVCldICAgPSB7IHIxMjhfY2NlX2luZGlyZWN0LCAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9HRVRQQVJBTSldICAgPSB7IHIxMjhfZ2V0cGFyYW0sIDEsIDAgfSwKK307CisKK2ludCByMTI4X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHIxMjhfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmNmODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCkBAIC0wLDAgKzEsMjA2MSBAQAorLyogcmFkZW9uX2NwLmMgLS0gQ1Agc3VwcG9ydCBmb3IgUmFkZW9uIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2Rydi5oIgorCisjZGVmaW5lIFJBREVPTl9GSUZPX0RFQlVHCTAKKworc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9jcCggZHJtX2RldmljZV90ICpkZXYgKTsKKworLyogQ1AgbWljcm9jb2RlIChmcm9tIEFUSSkgKi8KK3N0YXRpYyB1MzIgUjIwMF9jcF9taWNyb2NvZGVbXVsyXSA9IHsKKwl7IDB4MjEwMDcwMDAsIDAwMDAwMDAwMDAgfSwgICAgICAgIAorCXsgMHgyMDAwNzAwMCwgMDAwMDAwMDAwMCB9LCAKKwl7IDB4MDAwMDAwYWIsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDAwYWYsIDB4MDAwMDAwMDQgfSwKKwl7IDB4NjY1NDRhNDksIDAwMDAwMDAwMDAgfSwKKwl7IDB4NDk0OTQxNzQsIDAwMDAwMDAwMDAgfSwKKwl7IDB4NTQ1MTdkODMsIDAwMDAwMDAwMDAgfSwKKwl7IDB4NDk4ZDhiNjQsIDAwMDAwMDAwMDAgfSwKKwl7IDB4NDk0OTQ5NDksIDAwMDAwMDAwMDAgfSwKKwl7IDB4NDlkYTQ5M2MsIDAwMDAwMDAwMDAgfSwKKwl7IDB4NDk5ODk4OTgsIDAwMDAwMDAwMDAgfSwKKwl7IDB4ZDM0OTQ5ZDUsIDAwMDAwMDAwMDAgfSwKKwl7IDB4OWRjOTBlMTEsIDAwMDAwMDAwMDAgfSwKKwl7IDB4Y2U5YjliOWIsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwZjAwMDAsIDB4MDAwMDAwMTYgfSwKKwl7IDB4MzUyZTIzMmMsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMDAwMTMsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwZjAwMDAsIDB4MDAwMDAwMTYgfSwKKwl7IDB4MzUyZTI3MmMsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwZjAwMDEsIDB4MDAwMDAwMTYgfSwKKwl7IDB4MzIzOTM2MmYsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMDc3ZWYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwMjAsIDB4MDAwMDAwMWEgfSwKKwl7IDB4MDAwMDQwMDAsIDB4MDAwMDAwMWUgfSwKKwl7IDB4MDAwNjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwMjAsIDB4MDAwMDAwMWEgfSwKKwl7IDB4MDAwMDQwMDAsIDB4MDAwMDAwMWUgfSwKKwl7IDB4MDAwNjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwMjAsIDB4MDAwMDAwMWEgfSwKKwl7IDB4MDAwMDQwMDAsIDB4MDAwMDAwMWUgfSwKKwl7IDB4MDAwMDAwMTYsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMzgwMmEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDQwMDY3ZTAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwMTYsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDc3ZTAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDM3ZTEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDQwMDY3ZTEsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwMDc3ZTAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc3ZTEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc3ZTEsIDB4MDAwMDAwMDYgfSwKKwl7IDB4ZmZmZmZmZmYsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MTAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMzgwMmEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDQwMDY3ZTAsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwMDc2NzUsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc2NzYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc2NzcsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc2NzgsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwMzgwMmIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDQwMDI2NzYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc2NzcsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc2NzgsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwMDAwMmUsIDB4MDAwMDAwMTggfSwKKwl7IDB4MDAwMDAwMmUsIDB4MDAwMDAwMTggfSwKKwl7IDAwMDAwMDAwMDAsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwMDAwMmYsIDB4MDAwMDAwMTggfSwKKwl7IDB4MDAwMDAwMmYsIDB4MDAwMDAwMTggfSwKKwl7IDAwMDAwMDAwMDAsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDE2MDUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwOTgwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4NjRjMDYwM2QsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwODAwMDAsIDB4MDAwMDAwMTYgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDQwMDI1MWQsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1ODAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjc1ODEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDQwMDI1ODAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjc1ODEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwNDYsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDUwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwNjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1MGUsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMTkwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMTEwNTUsIDB4MDAwMDAwMTQgfSwKKwl7IDB4MDAwMDAwNTUsIDB4MDAwMDAwMTIgfSwKKwl7IDB4MDQwMDI1MGYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDUwNGEsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDc1NjUsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1NjYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwNTEsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDFlNjU1YjQsIDB4MDAwMDAwMDIgfSwKKwl7IDB4NDQwMWIwZGMsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDFjMTEwZGMsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MjY2NjcwNWQsIDB4MDAwMDAwMTggfSwKKwl7IDB4MDQwYzI1NjUsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwNWQsIDB4MDAwMDAwMTggfSwKKwl7IDB4MDQwMDI1NjQsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1NjYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwNTQsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDA0MDEwNjAsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAxMDEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwZDgwZmYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDA4MDAwNjMsIDB4MDAwMDAwMDggfSwKKwl7IDB4MDAwZjkwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwZTAwZmYsIDB4MDAwMDAwMDIgfSwKKwl7IDAwMDAwMDAwMDAsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwMDAwODAsIDB4MDAwMDAwMTggfSwKKwl7IDB4MDAwMDAwNTQsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDc1NzYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDkwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNDEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MGMwMDM1MGUsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNDkwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNTEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDFlNzg1ZjgsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAyMDAwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDA2MDAwNzMsIDB4MDAwMDAwMGMgfSwKKwl7IDB4MDAwMDc1NjMsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDA2MDc1ZjAsIDB4MDAwMDAwMjEgfSwKKwl7IDB4MjAwMDcwNjgsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDUwNjgsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDc1NzYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1NzcsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1MGUsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1MGYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDBhMDUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDA2MDAwNzYsIDB4MDAwMDAwMGMgfSwKKwl7IDB4MDA2MDc1ZjAsIDB4MDAwMDAwMjEgfSwKKwl7IDB4MDAwMDc1ZjgsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwNzYsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwYTc1MGUsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAyMDc1MGYsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDA2MDAwNzksIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDc1NzAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1NzEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1NzIsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwMDUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDBhMDUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1NjgsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwODQsIDB4MDAwMDAwMGMgfSwKKwl7IDB4MDAwNTgwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MGM2MDc1NjIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwODYsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDA2MDAwODUsIDB4MDAwMDAwMDQgfSwKKwl7IDB4NDAwMDcwZGQsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMzgwZGQsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwOTMsIDB4MDAwMDAwMWMgfSwKKwl7IDB4MDAwNjUwOTUsIDB4MDAwMDAwMTggfSwKKwl7IDB4MDQwMDI1YmIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjEwOTYsIDB4MDAwMDAwMTggfSwKKwl7IDB4MDQwMDc1YmMsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMDc1YmIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1YmMsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwOTAwMDAsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwOTAwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwZDgwMDIsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwMDUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc4MjEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc4MDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMDc4MjEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc4MDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDE2NjUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwYTAwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjcxY2MsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDI4NmYxY2QsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwYTMsIDB4MDAwMDAwMTAgfSwKKwl7IDB4MjEwMDcwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMDAwYWEsIDB4MDAwMDAwMWMgfSwKKwl7IDB4MDAwNjUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwYTAwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwYjAwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MzgwNjcwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwYTAwYTYsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MjAwMDcwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDEyMDAwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MjAwNzcwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDEyMDAwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MjAwMDcwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwNjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDEyMDc1MWIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4ODA0MDc1MGEsIDB4MDAwMDAwMDIgfSwKKwl7IDB4ODA0MDc1MGIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAxMTAwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMzgwZGQsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwYmQsIDB4MDAwMDAwMWMgfSwKKwl7IDB4MDAwNjEwOTYsIDB4MDAwMDAwMTggfSwKKwl7IDB4ODQ0MDc1YmQsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjEwOTUsIDB4MDAwMDAwMTggfSwKKwl7IDB4ODQwMDc1YmIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwNjEwOTYsIDB4MDAwMDAwMTggfSwKKwl7IDB4ODQ0MDc1YmMsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDAwYzAsIDB4MDAwMDAwMDQgfSwKKwl7IDB4ODA0MDc1YmQsIDB4MDAwMDAwMDIgfSwKKwl7IDB4ODAwMDc1YmIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4ODA0MDc1YmMsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAxMDgwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDE0MDAwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDA2MDAwYzQsIDB4MDAwMDAwMGMgfSwKKwl7IDB4MjBjMDcwMDAsIDB4MDAwMDAwMjAgfSwKKwl7IDB4MDAwMDAwYzYsIDB4MDAwMDAwMTIgfSwKKwl7IDB4MDA4MDAwMDAsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDA4MDc1MWQsIDB4MDAwMDAwMDYgfSwKKwl7IDB4MDAwMDI1YmIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDQwYzAsIDB4MDAwMDAwMDQgfSwKKwl7IDB4MDAwMDc3NWMsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDBhMDUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDA2NjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDQ2MDI3NWQsIDB4MDAwMDAwMjAgfSwKKwl7IDB4MDAwMDQwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMDc5OTksIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDBhMDUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDA2NjEwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDQ2MDI5OWIsIDB4MDAwMDAwMjAgfSwKKwl7IDB4MDAwMDQwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDFlMDA4MzAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MjEwMDcwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMDUwMDAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMzgwNDIsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDQwMDI1ZTAsIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDAwMDc1ZTEsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMDAwMDEsIDAwMDAwMDAwMDAgfSwKKwl7IDB4MDAwMzgwZDksIDB4MDAwMDAwMDIgfSwKKwl7IDB4MDQwMDczOTQsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKKwl7IDAwMDAwMDAwMDAsIDAwMDAwMDAwMDAgfSwKK307CisKKworc3RhdGljIHUzMiByYWRlb25fY3BfbWljcm9jb2RlW11bMl0gPSB7CisJeyAweDIxMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDIwMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMGI0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMGI4LCAweDAwMDAwMDA0IH0sCisJeyAweDZmNWI0ZDRjLCAwMDAwMDAwMDAwIH0sCisJeyAweDRjNGM0MjdmLCAwMDAwMDAwMDAwIH0sCisJeyAweDViNTY4YTkyLCAwMDAwMDAwMDAwIH0sCisJeyAweDRjYTA5YzZkLCAwMDAwMDAwMDAwIH0sCisJeyAweGFkNGM0YzRjLCAwMDAwMDAwMDAwIH0sCisJeyAweDRjZTFhZjNkLCAwMDAwMDAwMDAwIH0sCisJeyAweGQ4YWZhZmFmLCAwMDAwMDAwMDAwIH0sCisJeyAweGQ2NGM0Y2RjLCAwMDAwMDAwMDAwIH0sCisJeyAweDRjZDEwZDEwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMGYwMDAwLCAweDAwMDAwMDE2IH0sCisJeyAweDM2MmYyNDJkLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDEyLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGYwMDAwLCAweDAwMDAwMDE2IH0sCisJeyAweDM2MmYyODJkLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MGU3LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyYzk3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGYwMDAxLCAweDAwMDAwMDE2IH0sCisJeyAweDMzM2EzNzMwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3N2VmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDIxLCAweDAwMDAwMDFhIH0sCisJeyAweDAwMDA0MDAwLCAweDAwMDAwMDFlIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDIxLCAweDAwMDAwMDFhIH0sCisJeyAweDAwMDA0MDAwLCAweDAwMDAwMDFlIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDIxLCAweDAwMDAwMDFhIH0sCisJeyAweDAwMDA0MDAwLCAweDAwMDAwMDFlIH0sCisJeyAweDAwMDAwMDE3LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDM4MDJiLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA2N2UwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDE3LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3N2UwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAzN2UxLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA2N2UxLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA3N2UwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3N2UxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3N2UxLCAweDAwMDAwMDA2IH0sCisJeyAweGZmZmZmZmZmLCAwMDAwMDAwMDAwIH0sCisJeyAweDEwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MDJiLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDA2N2UwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA3Njc1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc4LCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDM4MDJjLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNjc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3Njc4LCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAwMDJmLCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDAwMDJmLCAweDAwMDAwMDE4IH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAwMDMwLCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDAwMDMwLCAweDAwMDAwMDE4IH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAxNjA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDk4MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDY0YzA2MDNlLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDgwMDAwLCAweDAwMDAwMDE2IH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDA0MDAyNTFkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTgwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY3NTgxLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNTgwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY3NTgxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDQ5LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA1MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDE5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDExMDU1LCAweDAwMDAwMDE0IH0sCisJeyAweDAwMDAwMDU1LCAweDAwMDAwMDEyIH0sCisJeyAweDA0MDAyNTBmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA1MDRmLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDU4LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAxZTY1NWI0LCAweDAwMDAwMDAyIH0sCisJeyAweDQ0MDFiMGU0LCAweDAwMDAwMDAyIH0sCisJeyAweDAxYzExMGU0LCAweDAwMDAwMDAyIH0sCisJeyAweDI2NjY3MDY2LCAweDAwMDAwMDE4IH0sCisJeyAweDA0MGMyNTY1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDY2LCAweDAwMDAwMDE4IH0sCisJeyAweDA0MDAyNTY0LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDVkLCAweDAwMDAwMDA0IH0sCisJeyAweDAwNDAxMDY5LCAweDAwMDAwMDA4IH0sCisJeyAweDAwMTAxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGQ4MGZmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwODAwMDZjLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMGY5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGUwMGZmLCAweDAwMDAwMDAyIH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDAwMDhmLCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDAwMDViLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDY1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDQxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDBjMDAzNTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDQ5MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDUxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxZTc4NWY4LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMjAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDdlLCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDA3NTYzLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjA3NWYwLCAweDAwMDAwMDIxIH0sCisJeyAweDIwMDA3MDczLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA1MDczLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTc2LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTc3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTBmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDgzLCAweDAwMDAwMDBjIH0sCisJeyAweDAwNjA3NWYwLCAweDAwMDAwMDIxIH0sCisJeyAweDAwMDA3NWY4LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDgzLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGE3NTBlLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMjA3NTBmLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDg2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA3NTcwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTcxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTcyLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NTY4LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDk1LCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDU4MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDBjNjA3NTYyLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMDk3LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMDk2LCAweDAwMDAwMDA0IH0sCisJeyAweDQwMDA3MGU1LCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MGU2LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWM1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDM4MGU1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMGE4LCAweDAwMDAwMDFjIH0sCisJeyAweDAwMDY1MGFhLCAweDAwMDAwMDE4IH0sCisJeyAweDA0MDAyNWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMGFiLCAweDAwMDAwMDE4IH0sCisJeyAweDA0MDA3NWJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3NWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NWJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDkwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDkwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMGQ4MDAyLCAweDAwMDAwMDA2IH0sCisJeyAweDAwMDA3ODMyLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDM4MGU3LCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyYzk3LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3ODIwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3ODIxLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3ODAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAxMjAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDIwMDc3MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxMjAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDIwMDA3MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxMjA3NTFiLCAweDAwMDAwMDAyIH0sCisJeyAweDgwNDA3NTBhLCAweDAwMDAwMDAyIH0sCisJeyAweDgwNDA3NTBiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMTEwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDM4MGU1LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMGM2LCAweDAwMDAwMDFjIH0sCisJeyAweDAwMDYxMGFiLCAweDAwMDAwMDE4IH0sCisJeyAweDg0NDA3NWJkLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMGFhLCAweDAwMDAwMDE4IH0sCisJeyAweDg0MDA3NWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDYxMGFiLCAweDAwMDAwMDE4IH0sCisJeyAweDg0NDA3NWJjLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDAwMGM5LCAweDAwMDAwMDA0IH0sCisJeyAweDgwNDA3NWJkLCAweDAwMDAwMDAyIH0sCisJeyAweDgwMDA3NWJiLCAweDAwMDAwMDAyIH0sCisJeyAweDgwNDA3NWJjLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMTA4MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAxNDAwMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjAwMGNkLCAweDAwMDAwMDBjIH0sCisJeyAweDIwYzA3MDAwLCAweDAwMDAwMDIwIH0sCisJeyAweDAwMDAwMGNmLCAweDAwMDAwMDEyIH0sCisJeyAweDAwODAwMDAwLCAweDAwMDAwMDA2IH0sCisJeyAweDAwODA3NTFkLCAweDAwMDAwMDA2IH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA3NzVjLCAweDAwMDAwMDAyIH0sCisJeyAweDAwYTA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwNjYxMDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDA0NjAyNzVkLCAweDAwMDAwMDIwIH0sCisJeyAweDAwMDA0MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAxZTAwODMwLCAweDAwMDAwMDAyIH0sCisJeyAweDIxMDA3MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDY0NjQ2MTRkLCAwMDAwMDAwMDAwIH0sCisJeyAweDY5Njg3NDIwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDczLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDA1MDAwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDM4MGQwLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyNWUwLCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA3NWUxLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDAxLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDM4MGUwLCAweDAwMDAwMDAyIH0sCisJeyAweDA0MDAyMzk0LCAweDAwMDAwMDAyIH0sCisJeyAweDAwMDA1MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDA4LCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDA0LCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCit9OworCitzdGF0aWMgdTMyIFIzMDBfY3BfbWljcm9jb2RlW11bMl0gPSB7CisJeyAweDQyMDBlMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDQwMDBlMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMGFmLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDAwMGIzLCAweDAwMDAwMDA4IH0sCisJeyAweDZjNWE1MDRmLCAwMDAwMDAwMDAwIH0sCisJeyAweDRmNGY0OTdhLCAwMDAwMDAwMDAwIH0sCisJeyAweDVhNTc4Mjg4LCAwMDAwMDAwMDAwIH0sCisJeyAweDRmOTE5MDZhLCAwMDAwMDAwMDAwIH0sCisJeyAweDRmNGY0ZjRmLCAwMDAwMDAwMDAwIH0sCisJeyAweDRmZTI0ZjQ0LCAwMDAwMDAwMDAwIH0sCisJeyAweDRmOWM5YzljLCAwMDAwMDAwMDAwIH0sCisJeyAweGRjNGY0ZmRlLCAwMDAwMDAwMDAwIH0sCisJeyAweGExY2Q0ZjRmLCAwMDAwMDAwMDAwIH0sCisJeyAweGQyOWQ5ZDlkLCAwMDAwMDAwMDAwIH0sCisJeyAweDRmMGY5ZmQ3LCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMGNhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDEyLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBlOGI0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDE0LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBlOGI2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDE2LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBlODU0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDE4LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBlODU1LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDFhLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBlODU2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDFjLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBlODU3LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDFlLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBlODI0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDIwLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBlODI1LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDIyLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBlODMwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDI0LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMGMwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDI2LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMGMxLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDI4LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMDQxLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDJhLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMTg0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDJjLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMTg1LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDJlLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMTg2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDMwLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMTg3LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDMyLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMTgwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDM0LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMzkzLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDM2LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMzhhLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGQwMDM4LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMDBmMzhlLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlODIxLCAweDAwMDAwMDA0IH0sCisJeyAweDAxNDBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDQzLCAweDAwMDAwMDE4IH0sCisJeyAweDAwY2NlODAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMWIwMDAxLCAweDAwMDAwMDA0IH0sCisJeyAweDA4MDA0ODAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMWIwMDAxLCAweDAwMDAwMDA0IH0sCisJeyAweDA4MDA0ODAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMWIwMDAxLCAweDAwMDAwMDA0IH0sCisJeyAweDA4MDA0ODAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDNhLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDBhMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAyYzBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGNhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMTMwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGMyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweGM5ODBjMDQ1LCAweDAwMDAwMDA4IH0sCisJeyAweDIwMDA0NTFkLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTgwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGNlNTgxLCAweDAwMDAwMDA0IH0sCisJeyAweDA4MDA0NTgwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGNlNTgxLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDRjLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDBhMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMGMyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTBlLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDMyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDIyMDU2LCAweDAwMDAwMDI4IH0sCisJeyAweDAwMDAwMDU2LCAweDAwMDAwMDI0IH0sCisJeyAweDA4MDA0NTBmLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBhMDUwLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDBlNTY1LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTY2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDU3LCAweDAwMDAwMDA4IH0sCisJeyAweDAzY2NhNWI0LCAweDAwMDAwMDA0IH0sCisJeyAweDA1NDMyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDIyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDRjY2NlMDYzLCAweDAwMDAwMDMwIH0sCisJeyAweDA4Mjc0NTY1LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDYzLCAweDAwMDAwMDMwIH0sCisJeyAweDA4MDA0NTY0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTY2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDVhLCAweDAwMDAwMDA4IH0sCisJeyAweDAwODAyMDY2LCAweDAwMDAwMDEwIH0sCisJeyAweDAwMjAyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMWIwMGZmLCAweDAwMDAwMDA0IH0sCisJeyAweDAxMDAwMDY5LCAweDAwMDAwMDEwIH0sCisJeyAweDAwMWYyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMWMwMGZmLCAweDAwMDAwMDA0IH0sCisJeyAwMDAwMDAwMDAwLCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDAwMDg1LCAweDAwMDAwMDMwIH0sCisJeyAweDAwMDAwMDVhLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDBlNTc2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGNhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDEyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDgyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDE4MDA2NTBlLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDkyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGEyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGYwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwNDAwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDc5LCAweDAwMDAwMDE4IH0sCisJeyAweDAwMDBlNTYzLCAweDAwMDAwMDA0IH0sCisJeyAweDAwYzBlNWY5LCAweDAwMDAwMGMyIH0sCisJeyAweDAwMDAwMDZlLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDBhMDZlLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDBlNTc2LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTc3LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTBlLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTBmLCAweDAwMDAwMDA0IH0sCisJeyAweDAxNDBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDdjLCAweDAwMDAwMDE4IH0sCisJeyAweDAwYzBlNWY5LCAweDAwMDAwMGMyIH0sCisJeyAweDAwMDAwMDdjLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMTRlNTBlLCAweDAwMDAwMDA0IH0sCisJeyAweDAwNDBlNTBmLCAweDAwMDAwMDA0IH0sCisJeyAweDAwYzAwMDdmLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDBlNTcwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTcxLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTcyLCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAxNDBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNTY4LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGMyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDg5LCAweDAwMDAwMDE4IH0sCisJeyAweDAwMGIwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDE4YzBlNTYyLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDhiLCAweDAwMDAwMDA4IH0sCisJeyAweDAwYzAwMDhhLCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDcwMGU0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMDk3LCAweDAwMDAwMDM4IH0sCisJeyAweDAwMGNhMDk5LCAweDAwMDAwMDMwIH0sCisJeyAweDA4MDA0NWJiLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGMyMDlhLCAweDAwMDAwMDMwIH0sCisJeyAweDA4MDBlNWJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDBlNWJiLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNWJjLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMTIwMDAwLCAweDAwMDAwMDBjIH0sCisJeyAweDAwMTIwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMWIwMDAyLCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlODIxLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlODAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDBlODIxLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlODJlLCAwMDAwMDAwMDAwIH0sCisJeyAweDAyY2NhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMTQwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGNlMWNjLCAweDAwMDAwMDA0IH0sCisJeyAweDA1MGRlMWNkLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMGE3LCAweDAwMDAwMDIwIH0sCisJeyAweDQyMDBlMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMGFlLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMGNhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMTQwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMGMyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMTYwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDcwMGNlMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMTQwMGFhLCAweDAwMDAwMDA4IH0sCisJeyAweDQwMDBlMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAyNDAwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDQwMGVlMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAyNDAwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDQwMDBlMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMGMyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAyNDBlNTFiLCAweDAwMDAwMDA0IH0sCisJeyAweDAwODBlNTBhLCAweDAwMDAwMDA1IH0sCisJeyAweDAwODBlNTBiLCAweDAwMDAwMDA1IH0sCisJeyAweDAwMjIwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDcwMGU0LCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDAwMGMxLCAweDAwMDAwMDM4IH0sCisJeyAweDAwMGMyMDlhLCAweDAwMDAwMDMwIH0sCisJeyAweDA4ODBlNWJkLCAweDAwMDAwMDA1IH0sCisJeyAweDAwMGMyMDk5LCAweDAwMDAwMDMwIH0sCisJeyAweDA4MDBlNWJiLCAweDAwMDAwMDA1IH0sCisJeyAweDAwMGMyMDlhLCAweDAwMDAwMDMwIH0sCisJeyAweDA4ODBlNWJjLCAweDAwMDAwMDA1IH0sCisJeyAweDAwMDAwMGM0LCAweDAwMDAwMDA4IH0sCisJeyAweDAwODBlNWJkLCAweDAwMDAwMDA1IH0sCisJeyAweDAwMDBlNWJiLCAweDAwMDAwMDA1IH0sCisJeyAweDAwODBlNWJjLCAweDAwMDAwMDA1IH0sCisJeyAweDAwMjEwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAyODAwMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwYzAwMGM4LCAweDAwMDAwMDE4IH0sCisJeyAweDQxODBlMDAwLCAweDAwMDAwMDQwIH0sCisJeyAweDAwMDAwMGNhLCAweDAwMDAwMDI0IH0sCisJeyAweDAxMDAwMDAwLCAweDAwMDAwMDBjIH0sCisJeyAweDAxMDBlNTFkLCAweDAwMDAwMDBjIH0sCisJeyAweDAwMDA0NWJiLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDA4MGM0LCAweDAwMDAwMDA4IH0sCisJeyAweDAwMDBmM2NlLCAweDAwMDAwMDA0IH0sCisJeyAweDAxNDBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwY2MyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDA4YzA1M2NmLCAweDAwMDAwMDQwIH0sCisJeyAweDAwMDA4MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDBmM2QyLCAweDAwMDAwMDA0IH0sCisJeyAweDAxNDBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwY2MyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDA4YzA1M2QzLCAweDAwMDAwMDQwIH0sCisJeyAweDAwMDA4MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDBmMzlkLCAweDAwMDAwMDA0IH0sCisJeyAweDAxNDBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwY2MyMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDA4YzA1MzllLCAweDAwMDAwMDQwIH0sCisJeyAweDAwMDA4MDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAzYzAwODMwLCAweDAwMDAwMDA0IH0sCisJeyAweDQyMDBlMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDBhMDAwLCAweDAwMDAwMDA0IH0sCisJeyAweDIwMDA0NWUwLCAweDAwMDAwMDA0IH0sCisJeyAweDAwMDBlNWUxLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDAwMDAxLCAwMDAwMDAwMDAwIH0sCisJeyAweDAwMDcwMGUxLCAweDAwMDAwMDA0IH0sCisJeyAweDA4MDBlMzk0LCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCisJeyAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwIH0sCit9OworCitzdGF0aWMgaW50IFJBREVPTl9SRUFEX1BMTChkcm1fZGV2aWNlX3QgKmRldiwgaW50IGFkZHIpCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCVJBREVPTl9XUklURTgoUkFERU9OX0NMT0NLX0NOVExfSU5ERVgsIGFkZHIgJiAweDFmKTsKKwlyZXR1cm4gUkFERU9OX1JFQUQoUkFERU9OX0NMT0NLX0NOVExfREFUQSk7Cit9CisKKyNpZiBSQURFT05fRklGT19ERUJVRworc3RhdGljIHZvaWQgcmFkZW9uX3N0YXR1cyggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlwcmludGsoICIlczpcbiIsIF9fRlVOQ1RJT05fXyApOworCXByaW50ayggIlJCQk1fU1RBVFVTID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fUkJCTV9TVEFUVVMgKSApOworCXByaW50ayggIkNQX1JCX1JUUFIgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUkFERU9OX1JFQUQoIFJBREVPTl9DUF9SQl9SUFRSICkgKTsKKwlwcmludGsoICJDUF9SQl9XVFBSID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQ1BfUkJfV1BUUiApICk7CisJcHJpbnRrKCAiQUlDX0NOVEwgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUkFERU9OX1JFQUQoIFJBREVPTl9BSUNfQ05UTCApICk7CisJcHJpbnRrKCAiQUlDX1NUQVQgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUkFERU9OX1JFQUQoIFJBREVPTl9BSUNfU1RBVCApICk7CisJcHJpbnRrKCAiQUlDX1BUX0JBU0UgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUkFERU9OX1JFQUQoIFJBREVPTl9BSUNfUFRfQkFTRSApICk7CisJcHJpbnRrKCAiVExCX0FERFIgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpUkFERU9OX1JFQUQoIFJBREVPTl9BSUNfVExCX0FERFIgKSApOworCXByaW50ayggIlRMQl9EQVRBID0gMHglMDh4XG4iLAorCQkodW5zaWduZWQgaW50KVJBREVPTl9SRUFEKCBSQURFT05fQUlDX1RMQl9EQVRBICkgKTsKK30KKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuZ2luZSwgRklGTyBjb250cm9sCisgKi8KKworc3RhdGljIGludCByYWRlb25fZG9fcGl4Y2FjaGVfZmx1c2goIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJdTMyIHRtcDsKKwlpbnQgaTsKKworCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKworCXRtcCAgPSBSQURFT05fUkVBRCggUkFERU9OX1JCMkRfRFNUQ0FDSEVfQ1RMU1RBVCApOworCXRtcCB8PSBSQURFT05fUkIyRF9EQ19GTFVTSF9BTEw7CisJUkFERU9OX1dSSVRFKCBSQURFT05fUkIyRF9EU1RDQUNIRV9DVExTVEFULCB0bXAgKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CisJCWlmICggIShSQURFT05fUkVBRCggUkFERU9OX1JCMkRfRFNUQ0FDSEVfQ1RMU1RBVCApCisJCSAgICAgICAmIFJBREVPTl9SQjJEX0RDX0JVU1kpICkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJRFJNX1VERUxBWSggMSApOworCX0KKworI2lmIFJBREVPTl9GSUZPX0RFQlVHCisJRFJNX0VSUk9SKCAiZmFpbGVkIVxuIiApOworCXJhZGVvbl9zdGF0dXMoIGRldl9wcml2ICk7CisjZW5kaWYKKwlyZXR1cm4gRFJNX0VSUihFQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX3dhaXRfZm9yX2ZpZm8oIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgICAgaW50IGVudHJpZXMgKQoreworCWludCBpOworCisJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOworCisJZm9yICggaSA9IDAgOyBpIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IGkrKyApIHsKKwkJaW50IHNsb3RzID0gKCBSQURFT05fUkVBRCggUkFERU9OX1JCQk1fU1RBVFVTICkKKwkJCSAgICAgICYgUkFERU9OX1JCQk1fRklGT0NOVF9NQVNLICk7CisJCWlmICggc2xvdHMgPj0gZW50cmllcyApIHJldHVybiAwOworCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisjaWYgUkFERU9OX0ZJRk9fREVCVUcKKwlEUk1fRVJST1IoICJmYWlsZWQhXG4iICk7CisJcmFkZW9uX3N0YXR1cyggZGV2X3ByaXYgKTsKKyNlbmRpZgorCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworc3RhdGljIGludCByYWRlb25fZG9fd2FpdF9mb3JfaWRsZSggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlpbnQgaSwgcmV0OworCisJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOworCisJcmV0ID0gcmFkZW9uX2RvX3dhaXRfZm9yX2ZpZm8oIGRldl9wcml2LCA2NCApOworCWlmICggcmV0ICkgcmV0dXJuIHJldDsKKworCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CisJCWlmICggIShSQURFT05fUkVBRCggUkFERU9OX1JCQk1fU1RBVFVTICkKKwkJICAgICAgICYgUkFERU9OX1JCQk1fQUNUSVZFKSApIHsKKwkJCXJhZGVvbl9kb19waXhjYWNoZV9mbHVzaCggZGV2X3ByaXYgKTsKKwkJCXJldHVybiAwOworCQl9CisJCURSTV9VREVMQVkoIDEgKTsKKwl9CisKKyNpZiBSQURFT05fRklGT19ERUJVRworCURSTV9FUlJPUiggImZhaWxlZCFcbiIgKTsKKwlyYWRlb25fc3RhdHVzKCBkZXZfcHJpdiApOworI2VuZGlmCisJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENQIGNvbnRyb2wsIGluaXRpYWxpemF0aW9uCisgKi8KKworLyogTG9hZCB0aGUgbWljcm9jb2RlIGZvciB0aGUgQ1AgKi8KK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9sb2FkX21pY3JvY29kZSggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlpbnQgaTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCXJhZGVvbl9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApOworCisJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfTUVfUkFNX0FERFIsIDAgKTsKKworCWlmIChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249PVVDT0RFX1IyMDApIHsKKwkJRFJNX0lORk8oIkxvYWRpbmcgUjIwMCBNaWNyb2NvZGVcbiIpOworCQlmb3IgKCBpID0gMCA7IGkgPCAyNTYgOyBpKysgKSAKKwkJeworCQkJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfTUVfUkFNX0RBVEFILAorCQkJCSAgICAgIFIyMDBfY3BfbWljcm9jb2RlW2ldWzFdICk7CisJCQlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9NRV9SQU1fREFUQUwsCisJCQkJICAgICAgUjIwMF9jcF9taWNyb2NvZGVbaV1bMF0gKTsKKwkJfQorCX0gZWxzZSBpZiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uPT1VQ09ERV9SMzAwKSB7CisJCURSTV9JTkZPKCJMb2FkaW5nIFIzMDAgTWljcm9jb2RlXG4iKTsKKwkJZm9yICggaSA9IDAgOyBpIDwgMjU2IDsgaSsrICkgCisJCXsKKwkJCVJBREVPTl9XUklURSggUkFERU9OX0NQX01FX1JBTV9EQVRBSCwKKwkJCQkgICAgICBSMzAwX2NwX21pY3JvY29kZVtpXVsxXSApOworCQkJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfTUVfUkFNX0RBVEFMLAorCQkJCSAgICAgIFIzMDBfY3BfbWljcm9jb2RlW2ldWzBdICk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKCBpID0gMCA7IGkgPCAyNTYgOyBpKysgKSB7CisJCQlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9NRV9SQU1fREFUQUgsCisJCQkJICAgICAgcmFkZW9uX2NwX21pY3JvY29kZVtpXVsxXSApOworCQkJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfTUVfUkFNX0RBVEFMLAorCQkJCSAgICAgIHJhZGVvbl9jcF9taWNyb2NvZGVbaV1bMF0gKTsKKwkJfQorCX0KK30KKworLyogRmx1c2ggYW55IHBlbmRpbmcgY29tbWFuZHMgdG8gdGhlIENQLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGp1c3QKKyAqIHByaW9yIHRvIGEgd2FpdCBmb3IgaWRsZSwgYXMgaXQgaW5mb3JtcyB0aGUgZW5naW5lIHRoYXQgdGhlIGNvbW1hbmQKKyAqIHN0cmVhbSBpcyBlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHJhZGVvbl9kb19jcF9mbHVzaCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlEUk1fREVCVUcoICJcbiIgKTsKKyNpZiAwCisJdTMyIHRtcDsKKworCXRtcCA9IFJBREVPTl9SRUFEKCBSQURFT05fQ1BfUkJfV1BUUiApIHwgKDEgPDwgMzEpOworCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1dQVFIsIHRtcCApOworI2VuZGlmCit9CisKKy8qIFdhaXQgZm9yIHRoZSBDUCB0byBnbyBpZGxlLgorICovCitpbnQgcmFkZW9uX2RvX2NwX2lkbGUoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlCRUdJTl9SSU5HKCA2ICk7CisKKwlSQURFT05fUFVSR0VfQ0FDSEUoKTsKKwlSQURFT05fUFVSR0VfWkNBQ0hFKCk7CisJUkFERU9OX1dBSVRfVU5USUxfSURMRSgpOworCisJQURWQU5DRV9SSU5HKCk7CisJQ09NTUlUX1JJTkcoKTsKKworCXJldHVybiByYWRlb25fZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKK30KKworLyogU3RhcnQgdGhlIENvbW1hbmQgUHJvY2Vzc29yLgorICovCitzdGF0aWMgdm9pZCByYWRlb25fZG9fY3Bfc3RhcnQoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCit7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlyYWRlb25fZG9fd2FpdF9mb3JfaWRsZSggZGV2X3ByaXYgKTsKKworCVJBREVPTl9XUklURSggUkFERU9OX0NQX0NTUV9DTlRMLCBkZXZfcHJpdi0+Y3BfbW9kZSApOworCisJZGV2X3ByaXYtPmNwX3J1bm5pbmcgPSAxOworCisJQkVHSU5fUklORyggNiApOworCisJUkFERU9OX1BVUkdFX0NBQ0hFKCk7CisJUkFERU9OX1BVUkdFX1pDQUNIRSgpOworCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKKworCUFEVkFOQ0VfUklORygpOworCUNPTU1JVF9SSU5HKCk7Cit9CisKKy8qIFJlc2V0IHRoZSBDb21tYW5kIFByb2Nlc3Nvci4gIFRoaXMgd2lsbCBub3QgZmx1c2ggYW55IHBlbmRpbmcKKyAqIGNvbW1hbmRzLCBzbyB5b3UgbXVzdCB3YWl0IGZvciB0aGUgQ1AgY29tbWFuZCBzdHJlYW0gdG8gY29tcGxldGUKKyAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgcmFkZW9uX2RvX2NwX3Jlc2V0KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCXUzMiBjdXJfcmVhZF9wdHI7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwljdXJfcmVhZF9wdHIgPSBSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1JQVFIgKTsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9SQl9XUFRSLCBjdXJfcmVhZF9wdHIgKTsKKwlTRVRfUklOR19IRUFEKCBkZXZfcHJpdiwgY3VyX3JlYWRfcHRyICk7CisJZGV2X3ByaXYtPnJpbmcudGFpbCA9IGN1cl9yZWFkX3B0cjsKK30KKworLyogU3RvcCB0aGUgQ29tbWFuZCBQcm9jZXNzb3IuICBUaGlzIHdpbGwgbm90IGZsdXNoIGFueSBwZW5kaW5nCisgKiBjb21tYW5kcywgc28geW91IG11c3QgZmx1c2ggdGhlIGNvbW1hbmQgc3RyZWFtIGFuZCB3YWl0IGZvciB0aGUgQ1AKKyAqIHRvIGdvIGlkbGUgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCByYWRlb25fZG9fY3Bfc3RvcCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCVJBREVPTl9XUklURSggUkFERU9OX0NQX0NTUV9DTlRMLCBSQURFT05fQ1NRX1BSSURJU19JTkRESVMgKTsKKworCWRldl9wcml2LT5jcF9ydW5uaW5nID0gMDsKK30KKworLyogUmVzZXQgdGhlIGVuZ2luZS4gIFRoaXMgd2lsbCBzdG9wIHRoZSBDUCBpZiBpdCBpcyBydW5uaW5nLgorICovCitzdGF0aWMgaW50IHJhZGVvbl9kb19lbmdpbmVfcmVzZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBjbG9ja19jbnRsX2luZGV4LCBtY2xrX2NudGwsIHJiYm1fc29mdF9yZXNldDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCXJhZGVvbl9kb19waXhjYWNoZV9mbHVzaCggZGV2X3ByaXYgKTsKKworCWNsb2NrX2NudGxfaW5kZXggPSBSQURFT05fUkVBRCggUkFERU9OX0NMT0NLX0NOVExfSU5ERVggKTsKKwltY2xrX2NudGwgPSBSQURFT05fUkVBRF9QTEwoIGRldiwgUkFERU9OX01DTEtfQ05UTCApOworCisJUkFERU9OX1dSSVRFX1BMTCggUkFERU9OX01DTEtfQ05UTCwgKCBtY2xrX2NudGwgfAorCQkJCQkgICAgICBSQURFT05fRk9SQ0VPTl9NQ0xLQSB8CisJCQkJCSAgICAgIFJBREVPTl9GT1JDRU9OX01DTEtCIHwKKyAJCQkJCSAgICAgIFJBREVPTl9GT1JDRU9OX1lDTEtBIHwKKwkJCQkJICAgICAgUkFERU9OX0ZPUkNFT05fWUNMS0IgfAorCQkJCQkgICAgICBSQURFT05fRk9SQ0VPTl9NQyB8CisJCQkJCSAgICAgIFJBREVPTl9GT1JDRU9OX0FJQyApICk7CisKKwlyYmJtX3NvZnRfcmVzZXQgPSBSQURFT05fUkVBRCggUkFERU9OX1JCQk1fU09GVF9SRVNFVCApOworCisJUkFERU9OX1dSSVRFKCBSQURFT05fUkJCTV9TT0ZUX1JFU0VULCAoIHJiYm1fc29mdF9yZXNldCB8CisJCQkJCQlSQURFT05fU09GVF9SRVNFVF9DUCB8CisJCQkJCQlSQURFT05fU09GVF9SRVNFVF9ISSB8CisJCQkJCQlSQURFT05fU09GVF9SRVNFVF9TRSB8CisJCQkJCQlSQURFT05fU09GVF9SRVNFVF9SRSB8CisJCQkJCQlSQURFT05fU09GVF9SRVNFVF9QUCB8CisJCQkJCQlSQURFT05fU09GVF9SRVNFVF9FMiB8CisJCQkJCQlSQURFT05fU09GVF9SRVNFVF9SQiApICk7CisJUkFERU9OX1JFQUQoIFJBREVPTl9SQkJNX1NPRlRfUkVTRVQgKTsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9SQkJNX1NPRlRfUkVTRVQsICggcmJibV9zb2Z0X3Jlc2V0ICYKKwkJCQkJCX4oIFJBREVPTl9TT0ZUX1JFU0VUX0NQIHwKKwkJCQkJCSAgIFJBREVPTl9TT0ZUX1JFU0VUX0hJIHwKKwkJCQkJCSAgIFJBREVPTl9TT0ZUX1JFU0VUX1NFIHwKKwkJCQkJCSAgIFJBREVPTl9TT0ZUX1JFU0VUX1JFIHwKKwkJCQkJCSAgIFJBREVPTl9TT0ZUX1JFU0VUX1BQIHwKKwkJCQkJCSAgIFJBREVPTl9TT0ZUX1JFU0VUX0UyIHwKKwkJCQkJCSAgIFJBREVPTl9TT0ZUX1JFU0VUX1JCICkgKSApOworCVJBREVPTl9SRUFEKCBSQURFT05fUkJCTV9TT0ZUX1JFU0VUICk7CisKKworCVJBREVPTl9XUklURV9QTEwoIFJBREVPTl9NQ0xLX0NOVEwsIG1jbGtfY250bCApOworCVJBREVPTl9XUklURSggUkFERU9OX0NMT0NLX0NOVExfSU5ERVgsIGNsb2NrX2NudGxfaW5kZXggKTsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9SQkJNX1NPRlRfUkVTRVQsICByYmJtX3NvZnRfcmVzZXQgKTsKKworCS8qIFJlc2V0IHRoZSBDUCByaW5nICovCisJcmFkZW9uX2RvX2NwX3Jlc2V0KCBkZXZfcHJpdiApOworCisJLyogVGhlIENQIGlzIG5vIGxvbmdlciBydW5uaW5nIGFmdGVyIGFuIGVuZ2luZSByZXNldCAqLworCWRldl9wcml2LT5jcF9ydW5uaW5nID0gMDsKKworCS8qIFJlc2V0IGFueSBwZW5kaW5nIHZlcnRleCwgaW5kaXJlY3QgYnVmZmVycyAqLworCXJhZGVvbl9mcmVlbGlzdF9yZXNldCggZGV2ICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX2luaXRfcmluZ19idWZmZXIoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICAgICAgZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ICkKK3sKKwl1MzIgcmluZ19zdGFydCwgY3VyX3JlYWRfcHRyOworCXUzMiB0bXA7CisKKwkvKiBJbml0aWFsaXplIHRoZSBtZW1vcnkgY29udHJvbGxlciAqLworCVJBREVPTl9XUklURSggUkFERU9OX01DX0ZCX0xPQ0FUSU9OLAorCQkgICAgICAoICggZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgLSAxICkgJiAweGZmZmYwMDAwICkKKwkJICAgIHwgKCBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gPj4gMTYgKSApOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJUkFERU9OX1dSSVRFKCBSQURFT05fTUNfQUdQX0xPQ0FUSU9OLAorCQkJICAgICAgKCgoZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgLSAxICsKKwkJCQkgZGV2X3ByaXYtPmdhcnRfc2l6ZSkgJiAweGZmZmYwMDAwKSB8CisJCQkgICAgICAgKGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0ID4+IDE2KSkgKTsKKworCQlyaW5nX3N0YXJ0ID0gKGRldl9wcml2LT5jcF9yaW5nLT5vZmZzZXQKKwkJCSAgICAgIC0gZGV2LT5hZ3AtPmJhc2UKKwkJCSAgICAgICsgZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQpOworICAgICAgIH0gZWxzZQorI2VuZGlmCisJCXJpbmdfc3RhcnQgPSAoZGV2X3ByaXYtPmNwX3JpbmctPm9mZnNldAorCQkJICAgICAgLSBkZXYtPnNnLT5oYW5kbGUKKwkJCSAgICAgICsgZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQpOworCisJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfQkFTRSwgcmluZ19zdGFydCApOworCisJLyogU2V0IHRoZSB3cml0ZSBwb2ludGVyIGRlbGF5ICovCisJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfV1BUUl9ERUxBWSwgMCApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmluZyBidWZmZXIncyByZWFkIGFuZCB3cml0ZSBwb2ludGVycyAqLworCWN1cl9yZWFkX3B0ciA9IFJBREVPTl9SRUFEKCBSQURFT05fQ1BfUkJfUlBUUiApOworCVJBREVPTl9XUklURSggUkFERU9OX0NQX1JCX1dQVFIsIGN1cl9yZWFkX3B0ciApOworCVNFVF9SSU5HX0hFQUQoIGRldl9wcml2LCBjdXJfcmVhZF9wdHIgKTsKKwlkZXZfcHJpdi0+cmluZy50YWlsID0gY3VyX3JlYWRfcHRyOworCisjaWYgX19PU19IQVNfQUdQCisJaWYgKCAhZGV2X3ByaXYtPmlzX3BjaSApIHsKKwkJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfUlBUUl9BRERSLAorCQkJICAgICAgZGV2X3ByaXYtPnJpbmdfcnB0ci0+b2Zmc2V0CisJCQkgICAgICAtIGRldi0+YWdwLT5iYXNlCisJCQkgICAgICArIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJZHJtX3NnX21lbV90ICplbnRyeSA9IGRldi0+c2c7CisJCXVuc2lnbmVkIGxvbmcgdG1wX29mcywgcGFnZV9vZnM7CisKKwkJdG1wX29mcyA9IGRldl9wcml2LT5yaW5nX3JwdHItPm9mZnNldCAtIGRldi0+c2ctPmhhbmRsZTsKKwkJcGFnZV9vZnMgPSB0bXBfb2ZzID4+IFBBR0VfU0hJRlQ7CisKKwkJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfUlBUUl9BRERSLAorCQkJICAgICBlbnRyeS0+YnVzYWRkcltwYWdlX29mc10pOworCQlEUk1fREVCVUcoICJyaW5nIHJwdHI6IG9mZnNldD0weCUwOGx4IGhhbmRsZT0weCUwOGx4XG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpIGVudHJ5LT5idXNhZGRyW3BhZ2Vfb2ZzXSwKKwkJCSAgIGVudHJ5LT5oYW5kbGUgKyB0bXBfb2ZzICk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgc2NyYXRjaCByZWdpc3RlciBwb2ludGVyLiAgVGhpcyB3aWxsIGNhdXNlCisJICogdGhlIHNjcmF0Y2ggcmVnaXN0ZXIgdmFsdWVzIHRvIGJlIHdyaXR0ZW4gb3V0IHRvIG1lbW9yeQorCSAqIHdoZW5ldmVyIHRoZXkgYXJlIHVwZGF0ZWQuCisJICoKKwkgKiBXZSBzaW1wbHkgcHV0IHRoaXMgYmVoaW5kIHRoZSByaW5nIHJlYWQgcG9pbnRlciwgdGhpcyB3b3JrcworCSAqIHdpdGggUENJIEdBUlQgYXMgd2VsbCBhcyAod2hhdGV2ZXIga2luZCBvZikgQUdQIEdBUlQKKwkgKi8KKwlSQURFT05fV1JJVEUoIFJBREVPTl9TQ1JBVENIX0FERFIsIFJBREVPTl9SRUFEKCBSQURFT05fQ1BfUkJfUlBUUl9BRERSICkKKwkJCQkJICsgUkFERU9OX1NDUkFUQ0hfUkVHX09GRlNFVCApOworCisJZGV2X3ByaXYtPnNjcmF0Y2ggPSAoKF9fdm9sYXRpbGVfXyB1MzIgKikKKwkJCSAgICAgZGV2X3ByaXYtPnJpbmdfcnB0ci0+aGFuZGxlICsKKwkJCSAgICAgKFJBREVPTl9TQ1JBVENIX1JFR19PRkZTRVQgLyBzaXplb2YodTMyKSkpOworCisJUkFERU9OX1dSSVRFKCBSQURFT05fU0NSQVRDSF9VTVNLLCAweDcgKTsKKworCS8qIFdyaXRlYmFjayBkb2Vzbid0IHNlZW0gdG8gd29yayBldmVyeXdoZXJlLCB0ZXN0IGl0IGZpcnN0ICovCisJRFJNX1dSSVRFMzIoIGRldl9wcml2LT5yaW5nX3JwdHIsIFJBREVPTl9TQ1JBVENIT0ZGKDEpLCAwICk7CisJUkFERU9OX1dSSVRFKCBSQURFT05fU0NSQVRDSF9SRUcxLCAweGRlYWRiZWVmICk7CisKKwlmb3IgKCB0bXAgPSAwIDsgdG1wIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCA7IHRtcCsrICkgeworCQlpZiAoIERSTV9SRUFEMzIoIGRldl9wcml2LT5yaW5nX3JwdHIsIFJBREVPTl9TQ1JBVENIT0ZGKDEpICkgPT0gMHhkZWFkYmVlZiApCisJCQlicmVhazsKKwkJRFJNX1VERUxBWSggMSApOworCX0KKworCWlmICggdG1wIDwgZGV2X3ByaXYtPnVzZWNfdGltZW91dCApIHsKKwkJZGV2X3ByaXYtPndyaXRlYmFja193b3JrcyA9IDE7CisJCURSTV9ERUJVRyggIndyaXRlYmFjayB0ZXN0IHN1Y2NlZWRlZCwgdG1wPSVkXG4iLCB0bXAgKTsKKwl9IGVsc2UgeworCQlkZXZfcHJpdi0+d3JpdGViYWNrX3dvcmtzID0gMDsKKwkJRFJNX0RFQlVHKCAid3JpdGViYWNrIHRlc3QgZmFpbGVkXG4iICk7CisJfQorCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgPSBkZXZfcHJpdi0+c2NyYXRjaFswXSA9IDA7CisJUkFERU9OX1dSSVRFKCBSQURFT05fTEFTVF9GUkFNRV9SRUcsCisJCSAgICAgIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lICk7CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IGRldl9wcml2LT5zY3JhdGNoWzFdID0gMDsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9MQVNUX0RJU1BBVENIX1JFRywKKwkJICAgICAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggKTsKKworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyID0gZGV2X3ByaXYtPnNjcmF0Y2hbMl0gPSAwOworCVJBREVPTl9XUklURSggUkFERU9OX0xBU1RfQ0xFQVJfUkVHLAorCQkgICAgICBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9jbGVhciApOworCisJLyogU2V0IHJpbmcgYnVmZmVyIHNpemUgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU4KKwlSQURFT05fV1JJVEUoIFJBREVPTl9DUF9SQl9DTlRMLCBkZXZfcHJpdi0+cmluZy5zaXplX2wycXcgfCBSQURFT05fQlVGX1NXQVBfMzJCSVQgKTsKKyNlbHNlCisJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfQ05UTCwgZGV2X3ByaXYtPnJpbmcuc2l6ZV9sMnF3ICk7CisjZW5kaWYKKworCXJhZGVvbl9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApOworCisJLyogVHVybiBvbiBidXMgbWFzdGVyaW5nICovCisJdG1wID0gUkFERU9OX1JFQUQoIFJBREVPTl9CVVNfQ05UTCApICYgflJBREVPTl9CVVNfTUFTVEVSX0RJUzsKKwlSQURFT05fV1JJVEUoIFJBREVPTl9CVVNfQ05UTCwgdG1wICk7CisKKwkvKiBTeW5jIGV2ZXJ5dGhpbmcgdXAgKi8KKwlSQURFT05fV1JJVEUoIFJBREVPTl9JU1lOQ19DTlRMLAorCQkgICAgICAoUkFERU9OX0lTWU5DX0FOWTJEX0lETEUzRCB8CisJCSAgICAgICBSQURFT05fSVNZTkNfQU5ZM0RfSURMRTJEIHwKKwkJICAgICAgIFJBREVPTl9JU1lOQ19XQUlUX0lETEVHVUkgfAorCQkgICAgICAgUkFERU9OX0lTWU5DX0NQU0NSQVRDSF9JRExFR1VJKSApOworfQorCisvKiBFbmFibGUgb3IgZGlzYWJsZSBQQ0kgR0FSVCBvbiB0aGUgY2hpcCAqLworc3RhdGljIHZvaWQgcmFkZW9uX3NldF9wY2lnYXJ0KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBvbiApCit7CisJdTMyIHRtcAk9IFJBREVPTl9SRUFEKCBSQURFT05fQUlDX0NOVEwgKTsKKworCWlmICggb24gKSB7CisJCVJBREVPTl9XUklURSggUkFERU9OX0FJQ19DTlRMLCB0bXAgfCBSQURFT05fUENJR0FSVF9UUkFOU0xBVEVfRU4gKTsKKworCQkvKiBzZXQgUENJIEdBUlQgcGFnZS10YWJsZSBiYXNlIGFkZHJlc3MKKwkJICovCisJCVJBREVPTl9XUklURSggUkFERU9OX0FJQ19QVF9CQVNFLCBkZXZfcHJpdi0+YnVzX3BjaV9nYXJ0ICk7CisKKwkJLyogc2V0IGFkZHJlc3MgcmFuZ2UgZm9yIFBDSSBhZGRyZXNzIHRyYW5zbGF0ZQorCQkgKi8KKwkJUkFERU9OX1dSSVRFKCBSQURFT05fQUlDX0xPX0FERFIsIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0ICk7CisJCVJBREVPTl9XUklURSggUkFERU9OX0FJQ19ISV9BRERSLCBkZXZfcHJpdi0+Z2FydF92bV9zdGFydAorCQkJCQkJICArIGRldl9wcml2LT5nYXJ0X3NpemUgLSAxKTsKKworCQkvKiBUdXJuIG9mZiBBR1AgYXBlcnR1cmUgLS0gaXMgdGhpcyByZXF1aXJlZCBmb3IgUENJIEdBUlQ/CisJCSAqLworCQlSQURFT05fV1JJVEUoIFJBREVPTl9NQ19BR1BfTE9DQVRJT04sIDB4ZmZmZmZmYzAgKTsgLyogPz8gKi8KKwkJUkFERU9OX1dSSVRFKCBSQURFT05fQUdQX0NPTU1BTkQsIDAgKTsgLyogY2xlYXIgQUdQX0NPTU1BTkQgKi8KKwl9IGVsc2UgeworCQlSQURFT05fV1JJVEUoIFJBREVPTl9BSUNfQ05UTCwgdG1wICYgflJBREVPTl9QQ0lHQVJUX1RSQU5TTEFURV9FTiApOworCX0KK30KKworc3RhdGljIGludCByYWRlb25fZG9faW5pdF9jcCggZHJtX2RldmljZV90ICpkZXYsIGRybV9yYWRlb25faW5pdF90ICppbml0ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCWRldl9wcml2LT5pc19wY2kgPSBpbml0LT5pc19wY2k7CisKKwlpZiAoIGRldl9wcml2LT5pc19wY2kgJiYgIWRldi0+c2cgKSB7CisJCURSTV9FUlJPUiggIlBDSSBHQVJUIG1lbW9yeSBub3QgYWxsb2NhdGVkIVxuIiApOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+dXNlY190aW1lb3V0ID0gaW5pdC0+dXNlY190aW1lb3V0OworCWlmICggZGV2X3ByaXYtPnVzZWNfdGltZW91dCA8IDEgfHwKKwkgICAgIGRldl9wcml2LT51c2VjX3RpbWVvdXQgPiBSQURFT05fTUFYX1VTRUNfVElNRU9VVCApIHsKKwkJRFJNX0RFQlVHKCAiVElNRU9VVCBwcm9ibGVtIVxuIiApOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlzd2l0Y2goaW5pdC0+ZnVuYykgeworCWNhc2UgUkFERU9OX0lOSVRfUjIwMF9DUDoKKwkJZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uPVVDT0RFX1IyMDA7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX0lOSVRfUjMwMF9DUDoKKwkJZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uPVVDT0RFX1IzMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj1VQ09ERV9SMTAwOworCX0KKwkKKwlkZXZfcHJpdi0+ZG9fYm94ZXMgPSAwOworCWRldl9wcml2LT5jcF9tb2RlID0gaW5pdC0+Y3BfbW9kZTsKKworCS8qIFdlIGRvbid0IHN1cHBvcnQgYW55dGhpbmcgb3RoZXIgdGhhbiBidXMtbWFzdGVyaW5nIHJpbmcgbW9kZSwKKwkgKiBidXQgdGhlIHJpbmcgY2FuIGJlIGluIGVpdGhlciBBR1Agb3IgUENJIHNwYWNlIGZvciB0aGUgcmluZworCSAqIHJlYWQgcG9pbnRlci4KKwkgKi8KKwlpZiAoICggaW5pdC0+Y3BfbW9kZSAhPSBSQURFT05fQ1NRX1BSSUJNX0lORERJUyApICYmCisJICAgICAoIGluaXQtPmNwX21vZGUgIT0gUkFERU9OX0NTUV9QUklCTV9JTkRCTSApICkgeworCQlEUk1fREVCVUcoICJCQUQgY3BfbW9kZSAoJXgpIVxuIiwgaW5pdC0+Y3BfbW9kZSApOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlzd2l0Y2ggKCBpbml0LT5mYl9icHAgKSB7CisJY2FzZSAxNjoKKwkJZGV2X3ByaXYtPmNvbG9yX2ZtdCA9IFJBREVPTl9DT0xPUl9GT1JNQVRfUkdCNTY1OworCQlicmVhazsKKwljYXNlIDMyOgorCWRlZmF1bHQ6CisJCWRldl9wcml2LT5jb2xvcl9mbXQgPSBSQURFT05fQ09MT1JfRk9STUFUX0FSR0I4ODg4OworCQlicmVhazsKKwl9CisJZGV2X3ByaXYtPmZyb250X29mZnNldAk9IGluaXQtPmZyb250X29mZnNldDsKKwlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2gJPSBpbml0LT5mcm9udF9waXRjaDsKKwlkZXZfcHJpdi0+YmFja19vZmZzZXQJPSBpbml0LT5iYWNrX29mZnNldDsKKwlkZXZfcHJpdi0+YmFja19waXRjaAk9IGluaXQtPmJhY2tfcGl0Y2g7CisKKwlzd2l0Y2ggKCBpbml0LT5kZXB0aF9icHAgKSB7CisJY2FzZSAxNjoKKwkJZGV2X3ByaXYtPmRlcHRoX2ZtdCA9IFJBREVPTl9ERVBUSF9GT1JNQVRfMTZCSVRfSU5UX1o7CisJCWJyZWFrOworCWNhc2UgMzI6CisJZGVmYXVsdDoKKwkJZGV2X3ByaXYtPmRlcHRoX2ZtdCA9IFJBREVPTl9ERVBUSF9GT1JNQVRfMjRCSVRfSU5UX1o7CisJCWJyZWFrOworCX0KKwlkZXZfcHJpdi0+ZGVwdGhfb2Zmc2V0CT0gaW5pdC0+ZGVwdGhfb2Zmc2V0OworCWRldl9wcml2LT5kZXB0aF9waXRjaAk9IGluaXQtPmRlcHRoX3BpdGNoOworCisJLyogSGFyZHdhcmUgc3RhdGUgZm9yIGRlcHRoIGNsZWFycy4gIFJlbW92ZSB0aGlzIGlmL3doZW4gd2Ugbm8KKwkgKiBsb25nZXIgY2xlYXIgdGhlIGRlcHRoIGJ1ZmZlciB3aXRoIGEgM0QgcmVjdGFuZ2xlLiAgSGFyZC1jb2RlCisJICogYWxsIHZhbHVlcyB0byBwcmV2ZW50IHVud2FudGVkIDNEIHN0YXRlIGZyb20gc2xpcHBpbmcgdGhyb3VnaAorCSAqIGFuZCBzY3Jld2luZyB3aXRoIHRoZSBjbGVhciBvcGVyYXRpb24uCisJICovCisJZGV2X3ByaXYtPmRlcHRoX2NsZWFyLnJiM2RfY250bCA9IChSQURFT05fUExBTkVfTUFTS19FTkFCTEUgfAorCQkJCQkgICAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCAxMCkgfAorCQkJCQkgICAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IxMDAgPyBSQURFT05fWkJMT0NLMTYgOiAwKSk7CisKKwlkZXZfcHJpdi0+ZGVwdGhfY2xlYXIucmIzZF96c3RlbmNpbGNudGwgPSAKKwkJKGRldl9wcml2LT5kZXB0aF9mbXQgfAorCQkgUkFERU9OX1pfVEVTVF9BTFdBWVMgfAorCQkgUkFERU9OX1NURU5DSUxfVEVTVF9BTFdBWVMgfAorCQkgUkFERU9OX1NURU5DSUxfU19GQUlMX1JFUExBQ0UgfAorCQkgUkFERU9OX1NURU5DSUxfWlBBU1NfUkVQTEFDRSB8CisJCSBSQURFT05fU1RFTkNJTF9aRkFJTF9SRVBMQUNFIHwKKwkJIFJBREVPTl9aX1dSSVRFX0VOQUJMRSk7CisKKwlkZXZfcHJpdi0+ZGVwdGhfY2xlYXIuc2VfY250bCA9IChSQURFT05fRkZBQ0VfQ1VMTF9DVyB8CisJCQkJCSBSQURFT05fQkZBQ0VfU09MSUQgfAorCQkJCQkgUkFERU9OX0ZGQUNFX1NPTElEIHwKKwkJCQkJIFJBREVPTl9GTEFUX1NIQURFX1ZUWF9MQVNUIHwKKwkJCQkJIFJBREVPTl9ESUZGVVNFX1NIQURFX0ZMQVQgfAorCQkJCQkgUkFERU9OX0FMUEhBX1NIQURFX0ZMQVQgfAorCQkJCQkgUkFERU9OX1NQRUNVTEFSX1NIQURFX0ZMQVQgfAorCQkJCQkgUkFERU9OX0ZPR19TSEFERV9GTEFUIHwKKwkJCQkJIFJBREVPTl9WVFhfUElYX0NFTlRFUl9PR0wgfAorCQkJCQkgUkFERU9OX1JPVU5EX01PREVfVFJVTkMgfAorCQkJCQkgUkFERU9OX1JPVU5EX1BSRUNfOFRIX1BJWCk7CisKKwlEUk1fR0VUU0FSRUEoKTsKKworCWRldl9wcml2LT5mYl9vZmZzZXQgPSBpbml0LT5mYl9vZmZzZXQ7CisJZGV2X3ByaXYtPm1taW9fb2Zmc2V0ID0gaW5pdC0+bW1pb19vZmZzZXQ7CisJZGV2X3ByaXYtPnJpbmdfb2Zmc2V0ID0gaW5pdC0+cmluZ19vZmZzZXQ7CisJZGV2X3ByaXYtPnJpbmdfcnB0cl9vZmZzZXQgPSBpbml0LT5yaW5nX3JwdHJfb2Zmc2V0OworCWRldl9wcml2LT5idWZmZXJzX29mZnNldCA9IGluaXQtPmJ1ZmZlcnNfb2Zmc2V0OworCWRldl9wcml2LT5nYXJ0X3RleHR1cmVzX29mZnNldCA9IGluaXQtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0OworCQorCWlmKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlkZXZfcHJpdi0+bW1pbyA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvX29mZnNldCk7CisJaWYoIWRldl9wcml2LT5tbWlvKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgbW1pbyByZWdpb24hXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT5jcF9yaW5nID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPnJpbmdfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPmNwX3JpbmcpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBjcCByaW5nIHJlZ2lvbiFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJZGV2X3ByaXYtPnJpbmdfcnB0ciA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5yaW5nX3JwdHJfb2Zmc2V0KTsKKwlpZighZGV2X3ByaXYtPnJpbmdfcnB0cikgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHJpbmcgcmVhZCBwb2ludGVyIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyYWRlb25fZG9fY2xlYW51cF9jcChkZXYpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXYtPmFncF9idWZmZXJfbWFwID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKKwlpZighZGV2LT5hZ3BfYnVmZmVyX21hcCkgeworCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIGRtYSBidWZmZXIgcmVnaW9uIVxuIik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQlyYWRlb25fZG9fY2xlYW51cF9jcChkZXYpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggaW5pdC0+Z2FydF90ZXh0dXJlc19vZmZzZXQgKSB7CisJCWRldl9wcml2LT5nYXJ0X3RleHR1cmVzID0gZHJtX2NvcmVfZmluZG1hcChkZXYsIGluaXQtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0KTsKKwkJaWYgKCAhZGV2X3ByaXYtPmdhcnRfdGV4dHVyZXMgKSB7CisJCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIEdBUlQgdGV4dHVyZSByZWdpb24hXG4iKTsKKwkJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwl9CisKKwlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9CisJCShkcm1fcmFkZW9uX3NhcmVhX3QgKikoKHU4ICopZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGUgKworCQkJCSAgICAgICBpbml0LT5zYXJlYV9wcml2X29mZnNldCk7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoICFkZXZfcHJpdi0+aXNfcGNpICkgeworCQlkcm1fY29yZV9pb3JlbWFwKCBkZXZfcHJpdi0+Y3BfcmluZywgZGV2ICk7CisJCWRybV9jb3JlX2lvcmVtYXAoIGRldl9wcml2LT5yaW5nX3JwdHIsIGRldiApOworCQlkcm1fY29yZV9pb3JlbWFwKCBkZXYtPmFncF9idWZmZXJfbWFwLCBkZXYgKTsKKwkJaWYoIWRldl9wcml2LT5jcF9yaW5nLT5oYW5kbGUgfHwKKwkJICAgIWRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSB8fAorCQkgICAhZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlKSB7CisJCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIGlvcmVtYXAgYWdwIHJlZ2lvbnMhXG4iKTsKKwkJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJZGV2X3ByaXYtPmNwX3JpbmctPmhhbmRsZSA9CisJCQkodm9pZCAqKWRldl9wcml2LT5jcF9yaW5nLT5vZmZzZXQ7CisJCWRldl9wcml2LT5yaW5nX3JwdHItPmhhbmRsZSA9CisJCQkodm9pZCAqKWRldl9wcml2LT5yaW5nX3JwdHItPm9mZnNldDsKKwkJZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlID0gKHZvaWQgKilkZXYtPmFncF9idWZmZXJfbWFwLT5vZmZzZXQ7CisKKwkJRFJNX0RFQlVHKCAiZGV2X3ByaXYtPmNwX3JpbmctPmhhbmRsZSAlcFxuIiwKKwkJCSAgIGRldl9wcml2LT5jcF9yaW5nLT5oYW5kbGUgKTsKKwkJRFJNX0RFQlVHKCAiZGV2X3ByaXYtPnJpbmdfcnB0ci0+aGFuZGxlICVwXG4iLAorCQkJICAgZGV2X3ByaXYtPnJpbmdfcnB0ci0+aGFuZGxlICk7CisJCURSTV9ERUJVRyggImRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSAlcFxuIiwKKwkJCSAgIGRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSApOworCX0KKworCWRldl9wcml2LT5mYl9sb2NhdGlvbiA9ICggUkFERU9OX1JFQUQoIFJBREVPTl9NQ19GQl9MT0NBVElPTiApCisJCQkJJiAweGZmZmYgKSA8PCAxNjsKKworCWRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQgPSAoKChkZXZfcHJpdi0+ZnJvbnRfcGl0Y2gvNjQpIDw8IDIyKSB8CisJCQkJCSggKCBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0CisJCQkJCSAgKyBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gKSA+PiAxMCApICk7CisKKwlkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgPSAoKChkZXZfcHJpdi0+YmFja19waXRjaC82NCkgPDwgMjIpIHwKKwkJCQkgICAgICAgKCAoIGRldl9wcml2LT5iYWNrX29mZnNldAorCQkJCQkgKyBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gKSA+PiAxMCApICk7CisKKwlkZXZfcHJpdi0+ZGVwdGhfcGl0Y2hfb2Zmc2V0ID0gKCgoZGV2X3ByaXYtPmRlcHRoX3BpdGNoLzY0KSA8PCAyMikgfAorCQkJCQkoICggZGV2X3ByaXYtPmRlcHRoX29mZnNldAorCQkJCQkgICsgZGV2X3ByaXYtPmZiX2xvY2F0aW9uICkgPj4gMTAgKSApOworCisKKwlkZXZfcHJpdi0+Z2FydF9zaXplID0gaW5pdC0+Z2FydF9zaXplOworCWRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0ID0gZGV2X3ByaXYtPmZiX2xvY2F0aW9uCisJCQkJKyBSQURFT05fUkVBRCggUkFERU9OX0NPTkZJR19BUEVSX1NJWkUgKTsKKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKQorCQlkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCA9IChkZXYtPmFncF9idWZmZXJfbWFwLT5vZmZzZXQKKwkJCQkJCS0gZGV2LT5hZ3AtPmJhc2UKKwkJCQkJCSsgZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQpOworCWVsc2UKKyNlbmRpZgorCQlkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCA9IChkZXYtPmFncF9idWZmZXJfbWFwLT5vZmZzZXQKKwkJCQkJCS0gZGV2LT5zZy0+aGFuZGxlCisJCQkJCQkrIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0KTsKKworCURSTV9ERUJVRyggImRldl9wcml2LT5nYXJ0X3NpemUgJWRcbiIsCisJCSAgIGRldl9wcml2LT5nYXJ0X3NpemUgKTsKKwlEUk1fREVCVUcoICJkZXZfcHJpdi0+Z2FydF92bV9zdGFydCAweCV4XG4iLAorCQkgICBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCApOworCURSTV9ERUJVRyggImRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0IDB4JWx4XG4iLAorCQkgICBkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCApOworCisJZGV2X3ByaXYtPnJpbmcuc3RhcnQgPSAodTMyICopZGV2X3ByaXYtPmNwX3JpbmctPmhhbmRsZTsKKwlkZXZfcHJpdi0+cmluZy5lbmQgPSAoKHUzMiAqKWRldl9wcml2LT5jcF9yaW5nLT5oYW5kbGUKKwkJCSAgICAgICsgaW5pdC0+cmluZ19zaXplIC8gc2l6ZW9mKHUzMikpOworCWRldl9wcml2LT5yaW5nLnNpemUgPSBpbml0LT5yaW5nX3NpemU7CisJZGV2X3ByaXYtPnJpbmcuc2l6ZV9sMnF3ID0gZHJtX29yZGVyKCBpbml0LT5yaW5nX3NpemUgLyA4ICk7CisKKwlkZXZfcHJpdi0+cmluZy50YWlsX21hc2sgPQorCQkoZGV2X3ByaXYtPnJpbmcuc2l6ZSAvIHNpemVvZih1MzIpKSAtIDE7CisKKwlkZXZfcHJpdi0+cmluZy5oaWdoX21hcmsgPSBSQURFT05fUklOR19ISUdIX01BUks7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoICFkZXZfcHJpdi0+aXNfcGNpICkgeworCQkvKiBUdXJuIG9mZiBQQ0kgR0FSVCAqLworCQlyYWRlb25fc2V0X3BjaWdhcnQoIGRldl9wcml2LCAwICk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWlmICghZHJtX2F0aV9wY2lnYXJ0X2luaXQoIGRldiwgJmRldl9wcml2LT5waHlzX3BjaV9nYXJ0LAorCQkJCQkgICAgJmRldl9wcml2LT5idXNfcGNpX2dhcnQpKSB7CisJCQlEUk1fRVJST1IoICJmYWlsZWQgdG8gaW5pdCBQQ0kgR0FSVCFcbiIgKTsKKwkJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCQkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKKwkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCX0KKworCQkvKiBUdXJuIG9uIFBDSSBHQVJUICovCisJCXJhZGVvbl9zZXRfcGNpZ2FydCggZGV2X3ByaXYsIDEgKTsKKwl9CisKKwlyYWRlb25fY3BfbG9hZF9taWNyb2NvZGUoIGRldl9wcml2ICk7CisJcmFkZW9uX2NwX2luaXRfcmluZ19idWZmZXIoIGRldiwgZGV2X3ByaXYgKTsKKworCWRldl9wcml2LT5sYXN0X2J1ZiA9IDA7CisKKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKworCXJhZGVvbl9kb19lbmdpbmVfcmVzZXQoIGRldiApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3AoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCisJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQorCSAqIGlzIGZyZWVkLCBpdCdzIHRvbyBsYXRlLgorCSAqLworCWlmICggZGV2LT5pcnFfZW5hYmxlZCApIGRybV9pcnFfdW5pbnN0YWxsKGRldik7CisKKyNpZiBfX09TX0hBU19BR1AKKwlpZiAoICFkZXZfcHJpdi0+aXNfcGNpICkgeworCQlpZiAoIGRldl9wcml2LT5jcF9yaW5nICE9IE5VTEwgKQorCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldl9wcml2LT5jcF9yaW5nLCBkZXYgKTsKKwkJaWYgKCBkZXZfcHJpdi0+cmluZ19ycHRyICE9IE5VTEwgKQorCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoIGRldl9wcml2LT5yaW5nX3JwdHIsIGRldiApOworCQlpZiAoIGRldi0+YWdwX2J1ZmZlcl9tYXAgIT0gTlVMTCApCisJCXsKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCBkZXYtPmFncF9idWZmZXJfbWFwLCBkZXYgKTsKKwkJCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBOVUxMOworCQl9CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWlmICghZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoIGRldiwKKwkJCQkJICAgICAgZGV2X3ByaXYtPnBoeXNfcGNpX2dhcnQsCisJCQkJCSAgICAgIGRldl9wcml2LT5idXNfcGNpX2dhcnQgKSkKKwkJCURSTV9FUlJPUiggImZhaWxlZCB0byBjbGVhbnVwIFBDSSBHQVJUIVxuIiApOworCX0KKwkKKwkvKiBvbmx5IGNsZWFyIHRvIHRoZSBzdGFydCBvZiBmbGFncyAqLworCW1lbXNldChkZXZfcHJpdiwgMCwgb2Zmc2V0b2YoZHJtX3JhZGVvbl9wcml2YXRlX3QsIGZsYWdzKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBjb2RlIHdpbGwgcmVpbml0IHRoZSBSYWRlb24gQ1AgaGFyZHdhcmUgYWZ0ZXIgYSByZXN1bWUgZnJvbSBkaXNjLiAgCisgKiBBRkFJSywgaXQgd291bGQgYmUgdmVyeSBkaWZmaWN1bHQgdG8gcGlja2xlIHRoZSBzdGF0ZSBhdCBzdXNwZW5kIHRpbWUsIHNvIAorICogaGVyZSB3ZSBtYWtlIHN1cmUgdGhhdCBhbGwgUmFkZW9uIGhhcmR3YXJlIGluaXRpYWxpc2F0aW9uIGlzIHJlLWRvbmUgd2l0aG91dAorICogYWZmZWN0aW5nIHJ1bm5pbmcgYXBwbGljYXRpb25zLgorICoKKyAqIENoYXJsIFAuIEJvdGhhIDxodHRwOi8vY3Bib3RoYS5uZXQ+CisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2RvX3Jlc3VtZV9jcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiQ2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCX0KKworCURSTV9ERUJVRygiU3RhcnRpbmcgcmFkZW9uX2RvX3Jlc3VtZV9jcCgpXG4iKTsKKworI2lmIF9fT1NfSEFTX0FHUAorCWlmICggIWRldl9wcml2LT5pc19wY2kgKSB7CisJCS8qIFR1cm4gb2ZmIFBDSSBHQVJUICovCisJCXJhZGVvbl9zZXRfcGNpZ2FydCggZGV2X3ByaXYsIDAgKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyogVHVybiBvbiBQQ0kgR0FSVCAqLworCQlyYWRlb25fc2V0X3BjaWdhcnQoIGRldl9wcml2LCAxICk7CisJfQorCisJcmFkZW9uX2NwX2xvYWRfbWljcm9jb2RlKCBkZXZfcHJpdiApOworCXJhZGVvbl9jcF9pbml0X3JpbmdfYnVmZmVyKCBkZXYsIGRldl9wcml2ICk7CisKKwlyYWRlb25fZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKKworCURSTV9ERUJVRygicmFkZW9uX2RvX3Jlc3VtZV9jcCgpIGNvbXBsZXRlXG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCByYWRlb25fY3BfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9pbml0X3QgaW5pdDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGluaXQsIChkcm1fcmFkZW9uX2luaXRfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoaW5pdCkgKTsKKworCXN3aXRjaCAoIGluaXQuZnVuYyApIHsKKwljYXNlIFJBREVPTl9JTklUX0NQOgorCWNhc2UgUkFERU9OX0lOSVRfUjIwMF9DUDoKKwljYXNlIFJBREVPTl9JTklUX1IzMDBfQ1A6CisJCXJldHVybiByYWRlb25fZG9faW5pdF9jcCggZGV2LCAmaW5pdCApOworCWNhc2UgUkFERU9OX0NMRUFOVVBfQ1A6CisJCXJldHVybiByYWRlb25fZG9fY2xlYW51cF9jcCggZGV2ICk7CisJfQorCisJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKK30KKworaW50IHJhZGVvbl9jcF9zdGFydCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoIGRldl9wcml2LT5jcF9ydW5uaW5nICkgeworCQlEUk1fREVCVUcoICIlcyB3aGlsZSBDUCBydW5uaW5nXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICggZGV2X3ByaXYtPmNwX21vZGUgPT0gUkFERU9OX0NTUV9QUklESVNfSU5ERElTICkgeworCQlEUk1fREVCVUcoICIlcyBjYWxsZWQgd2l0aCBib2d1cyBDUCBtb2RlICglZClcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRldl9wcml2LT5jcF9tb2RlICk7CisJCXJldHVybiAwOworCX0KKworCXJhZGVvbl9kb19jcF9zdGFydCggZGV2X3ByaXYgKTsKKworCXJldHVybiAwOworfQorCisvKiBTdG9wIHRoZSBDUC4gIFRoZSBlbmdpbmUgbXVzdCBoYXZlIGJlZW4gaWRsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcworICogcm91dGluZS4KKyAqLworaW50IHJhZGVvbl9jcF9zdG9wKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fY3Bfc3RvcF90IHN0b3A7CisJaW50IHJldDsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHN0b3AsIChkcm1fcmFkZW9uX2NwX3N0b3BfdCBfX3VzZXIgKilkYXRhLCBzaXplb2Yoc3RvcCkgKTsKKworCWlmICghZGV2X3ByaXYtPmNwX3J1bm5pbmcpCisJCXJldHVybiAwOworCisJLyogRmx1c2ggYW55IHBlbmRpbmcgQ1AgY29tbWFuZHMuICBUaGlzIGVuc3VyZXMgYW55IG91dHN0YW5kaW5nCisJICogY29tbWFuZHMgYXJlIGV4ZWN0dXRlZCBieSB0aGUgZW5naW5lIGJlZm9yZSB3ZSB0dXJuIGl0IG9mZi4KKwkgKi8KKwlpZiAoIHN0b3AuZmx1c2ggKSB7CisJCXJhZGVvbl9kb19jcF9mbHVzaCggZGV2X3ByaXYgKTsKKwl9CisKKwkvKiBJZiB3ZSBmYWlsIHRvIG1ha2UgdGhlIGVuZ2luZSBnbyBpZGxlLCB3ZSByZXR1cm4gYW4gZXJyb3IKKwkgKiBjb2RlIHNvIHRoYXQgdGhlIERSTSBpb2N0bCB3cmFwcGVyIGNhbiB0cnkgYWdhaW4uCisJICovCisJaWYgKCBzdG9wLmlkbGUgKSB7CisJCXJldCA9IHJhZGVvbl9kb19jcF9pZGxlKCBkZXZfcHJpdiApOworCQlpZiAoIHJldCApIHJldHVybiByZXQ7CisJfQorCisJLyogRmluYWxseSwgd2UgY2FuIHR1cm4gb2ZmIHRoZSBDUC4gIElmIHRoZSBlbmdpbmUgaXNuJ3QgaWRsZSwKKwkgKiB3ZSB3aWxsIGdldCBzb21lIGRyb3BwZWQgdHJpYW5nbGVzIGFzIHRoZXkgd29uJ3QgYmUgZnVsbHkKKwkgKiByZW5kZXJlZCBiZWZvcmUgdGhlIENQIGlzIHNodXQgZG93bi4KKwkgKi8KKwlyYWRlb25fZG9fY3Bfc3RvcCggZGV2X3ByaXYgKTsKKworCS8qIFJlc2V0IHRoZSBlbmdpbmUgKi8KKwlyYWRlb25fZG9fZW5naW5lX3Jlc2V0KCBkZXYgKTsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgcmFkZW9uX2RvX3JlbGVhc2UoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpLCByZXQ7CisKKwlpZiAoZGV2X3ByaXYpIHsKKwkJaWYgKGRldl9wcml2LT5jcF9ydW5uaW5nKSB7CisJCQkvKiBTdG9wIHRoZSBjcCAqLworCQkJd2hpbGUgKChyZXQgPSByYWRlb25fZG9fY3BfaWRsZSggZGV2X3ByaXYgKSkgIT0gMCkgeworCQkJCURSTV9ERUJVRygicmFkZW9uX2RvX2NwX2lkbGUgJWRcbiIsIHJldCk7CisjaWZkZWYgX19saW51eF9fCisJCQkJc2NoZWR1bGUoKTsKKyNlbHNlCisJCQkJdHNsZWVwKCZyZXQsIFBaRVJPLCAicmRucmVsIiwgMSk7CisjZW5kaWYKKwkJCX0KKwkJCXJhZGVvbl9kb19jcF9zdG9wKCBkZXZfcHJpdiApOworCQkJcmFkZW9uX2RvX2VuZ2luZV9yZXNldCggZGV2ICk7CisJCX0KKworCQkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KKwkJaWYgKGRldl9wcml2LT5tbWlvKQkvKiByZW1vdmUgdGhpcyBhZnRlciBwZXJtYW5lbnQgYWRkbWFwcyAqLworCQkJUkFERU9OX1dSSVRFKCBSQURFT05fR0VOX0lOVF9DTlRMLCAwICk7CisKKwkJaWYgKGRldl9wcml2LT5tbWlvKSB7LyogcmVtb3ZlIGFsbCBzdXJmYWNlcyAqLworCQkJZm9yIChpID0gMDsgaSA8IFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgeworCQkJCVJBREVPTl9XUklURShSQURFT05fU1VSRkFDRTBfSU5GTyArIDE2KmksIDApOworCQkJCVJBREVPTl9XUklURShSQURFT05fU1VSRkFDRTBfTE9XRVJfQk9VTkQgKyAxNippLCAwKTsKKwkJCQlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX1VQUEVSX0JPVU5EICsgMTYqaSwgMCk7CisJCQl9CisJCX0KKworCQkvKiBGcmVlIG1lbW9yeSBoZWFwIHN0cnVjdHVyZXMgKi8KKwkJcmFkZW9uX21lbV90YWtlZG93biggJihkZXZfcHJpdi0+Z2FydF9oZWFwKSApOworCQlyYWRlb25fbWVtX3Rha2Vkb3duKCAmKGRldl9wcml2LT5mYl9oZWFwKSApOworCisJCS8qIGRlYWxsb2NhdGUga2VybmVsIHJlc291cmNlcyAqLworCQlyYWRlb25fZG9fY2xlYW51cF9jcCggZGV2ICk7CisJfQorfQorCisvKiBKdXN0IHJlc2V0IHRoZSBDUCByaW5nLiAgQ2FsbGVkIGFzIHBhcnQgb2YgYW4gWCBTZXJ2ZXIgZW5naW5lIHJlc2V0LgorICovCitpbnQgcmFkZW9uX2NwX3Jlc2V0KCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCURSTV9ERUJVRyggIlxuIiApOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fREVCVUcoICIlcyBjYWxsZWQgYmVmb3JlIGluaXQgZG9uZVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJcmFkZW9uX2RvX2NwX3Jlc2V0KCBkZXZfcHJpdiApOworCisJLyogVGhlIENQIGlzIG5vIGxvbmdlciBydW5uaW5nIGFmdGVyIGFuIGVuZ2luZSByZXNldCAqLworCWRldl9wcml2LT5jcF9ydW5uaW5nID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgcmFkZW9uX2NwX2lkbGUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJcmV0dXJuIHJhZGVvbl9kb19jcF9pZGxlKCBkZXZfcHJpdiApOworfQorCisvKiBBZGRlZCBieSBDaGFybCBQLiBCb3RoYSB0byBjYWxsIHJhZGVvbl9kb19yZXN1bWVfY3AoKS4KKyAqLworaW50IHJhZGVvbl9jcF9yZXN1bWUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCisJcmV0dXJuIHJhZGVvbl9kb19yZXN1bWVfY3AoZGV2KTsKK30KKworCitpbnQgcmFkZW9uX2VuZ2luZV9yZXNldCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJcmV0dXJuIHJhZGVvbl9kb19lbmdpbmVfcmVzZXQoIGRldiApOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bGxzY3JlZW4gbW9kZQorICovCisKKy8qIEtXOiBEZXByZWNhdGVkIHRvIHNheSB0aGUgbGVhc3Q6CisgKi8KK2ludCByYWRlb25fZnVsbHNjcmVlbiggRFJNX0lPQ1RMX0FSR1MgKQoreworCXJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZyZWVsaXN0IG1hbmFnZW1lbnQKKyAqLworCisvKiBPcmlnaW5hbCBjb21tZW50OiBGSVhNRTogUk9UQVRFX0JVRlMgaXMgYSBoYWNrIHRvIGN5Y2xlIHRocm91Z2gKKyAqICAgYnVmcyB1bnRpbCBmcmVlbGlzdCBjb2RlIGlzIHVzZWQuICBOb3RlIHRoaXMgaGlkZXMgYSBwcm9ibGVtIHdpdGgKKyAqICAgdGhlIHNjcmF0Y2ggcmVnaXN0ZXIgKiAodXNlZCB0byBrZWVwIHRyYWNrIG9mIGxhc3QgYnVmZmVyCisgKiAgIGNvbXBsZXRlZCkgYmVpbmcgd3JpdHRlbiB0byBiZWZvcmUgKiB0aGUgbGFzdCBidWZmZXIgaGFzIGFjdHVhbGx5CisgKiAgIGNvbXBsZXRlZCByZW5kZXJpbmcuICAKKyAqCisgKiBLVzogIEl0J3MgYWxzbyBhIGdvb2Qgd2F5IHRvIGZpbmQgZnJlZSBidWZmZXJzIHF1aWNrbHkuCisgKgorICogS1c6IElkZWFsbHkgdGhpcyBsb29wIHdvdWxkbid0IGV4aXN0LCBhbmQgZnJlZWxpc3RfZ2V0IHdvdWxkbid0CisgKiBzbGVlcC4gIEhvd2V2ZXIsIGJ1Z3MgaW4gb2xkZXIgdmVyc2lvbnMgb2YgcmFkZW9uX2FjY2VsLmMgbWVhbiB0aGF0CisgKiB3ZSBlc3NlbnRpYWxseSBoYXZlIHRvIGRvIHRoaXMsIGVsc2Ugb2xkIGNsaWVudHMgd2lsbCBicmVhay4KKyAqIAorICogSG93ZXZlciwgaXQgZG9lcyBsZWF2ZSBvcGVuIGEgcG90ZW50aWFsIGRlYWRsb2NrIHdoZXJlIGFsbCB0aGUKKyAqIGJ1ZmZlcnMgYXJlIGhlbGQgYnkgb3RoZXIgY2xpZW50cywgd2hpY2ggY2FuJ3QgcmVsZWFzZSB0aGVtIGJlY2F1c2UKKyAqIHRoZXkgY2FuJ3QgZ2V0IHRoZSBsb2NrLiAgCisgKi8KKworZHJtX2J1Zl90ICpyYWRlb25fZnJlZWxpc3RfZ2V0KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OworCWRybV9idWZfdCAqYnVmOworCWludCBpLCB0OworCWludCBzdGFydDsKKworCWlmICggKytkZXZfcHJpdi0+bGFzdF9idWYgPj0gZG1hLT5idWZfY291bnQgKQorCQlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOworCisJc3RhcnQgPSBkZXZfcHJpdi0+bGFzdF9idWY7CisKKwlmb3IgKCB0ID0gMCA7IHQgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgdCsrICkgeworCQl1MzIgZG9uZV9hZ2UgPSBHRVRfU0NSQVRDSCggMSApOworCQlEUk1fREVCVUcoImRvbmVfYWdlID0gJWRcbiIsZG9uZV9hZ2UpOworCQlmb3IgKCBpID0gc3RhcnQgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCQlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCQlpZiAoIGJ1Zi0+ZmlscCA9PSAwIHx8IChidWYtPnBlbmRpbmcgJiYgCisJCQkJCSAgICAgICBidWZfcHJpdi0+YWdlIDw9IGRvbmVfYWdlKSApIHsKKwkJCQlkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMrKzsKKwkJCQlidWYtPnBlbmRpbmcgPSAwOworCQkJCXJldHVybiBidWY7CisJCQl9CisJCQlzdGFydCA9IDA7CisJCX0KKworCQlpZiAodCkgeworCQkJRFJNX1VERUxBWSggMSApOworCQkJZGV2X3ByaXYtPnN0YXRzLmZyZWVsaXN0X2xvb3BzKys7CisJCX0KKwl9CisKKwlEUk1fREVCVUcoICJyZXR1cm5pbmcgTlVMTCFcbiIgKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNpZiAwCitkcm1fYnVmX3QgKnJhZGVvbl9mcmVlbGlzdF9nZXQoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3sKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXY7CisJZHJtX2J1Zl90ICpidWY7CisJaW50IGksIHQ7CisJaW50IHN0YXJ0OworCXUzMiBkb25lX2FnZSA9IERSTV9SRUFEMzIoZGV2X3ByaXYtPnJpbmdfcnB0ciwgUkFERU9OX1NDUkFUQ0hPRkYoMSkpOworCisJaWYgKCArK2Rldl9wcml2LT5sYXN0X2J1ZiA+PSBkbWEtPmJ1Zl9jb3VudCApCisJCWRldl9wcml2LT5sYXN0X2J1ZiA9IDA7CisKKwlzdGFydCA9IGRldl9wcml2LT5sYXN0X2J1ZjsKKwlkZXZfcHJpdi0+c3RhdHMuZnJlZWxpc3RfbG9vcHMrKzsKKwkKKwlmb3IgKCB0ID0gMCA7IHQgPCAyIDsgdCsrICkgeworCQlmb3IgKCBpID0gc3RhcnQgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCQlidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCQlidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CisJCQlpZiAoIGJ1Zi0+ZmlscCA9PSAwIHx8IChidWYtPnBlbmRpbmcgJiYgCisJCQkJCSAgICAgICBidWZfcHJpdi0+YWdlIDw9IGRvbmVfYWdlKSApIHsKKwkJCQlkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMrKzsKKwkJCQlidWYtPnBlbmRpbmcgPSAwOworCQkJCXJldHVybiBidWY7CisJCQl9CisJCX0KKwkJc3RhcnQgPSAwOworCX0KKworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3ZvaWQgcmFkZW9uX2ZyZWVsaXN0X3Jlc2V0KCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKworCWRldl9wcml2LT5sYXN0X2J1ZiA9IDA7CisJZm9yICggaSA9IDAgOyBpIDwgZG1hLT5idWZfY291bnQgOyBpKysgKSB7CisJCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwkJYnVmX3ByaXYtPmFnZSA9IDA7CisJfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENQIGNvbW1hbmQgc3VibWlzc2lvbgorICovCisKK2ludCByYWRlb25fd2FpdF9yaW5nKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBuICkKK3sKKwlkcm1fcmFkZW9uX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmc7CisJaW50IGk7CisJdTMyIGxhc3RfaGVhZCA9IEdFVF9SSU5HX0hFQUQoIGRldl9wcml2ICk7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrICkgeworCQl1MzIgaGVhZCA9IEdFVF9SSU5HX0hFQUQoIGRldl9wcml2ICk7CisKKwkJcmluZy0+c3BhY2UgPSAoaGVhZCAtIHJpbmctPnRhaWwpICogc2l6ZW9mKHUzMik7CisJCWlmICggcmluZy0+c3BhY2UgPD0gMCApCisJCQlyaW5nLT5zcGFjZSArPSByaW5nLT5zaXplOworCQlpZiAoIHJpbmctPnNwYWNlID4gbiApCisJCQlyZXR1cm4gMDsKKwkJCisJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKworCQlpZiAoaGVhZCAhPSBsYXN0X2hlYWQpCisJCQlpID0gMDsKKwkJbGFzdF9oZWFkID0gaGVhZDsKKworCQlEUk1fVURFTEFZKCAxICk7CisJfQorCisJLyogRklYTUU6IFRoaXMgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQgaW4gdGhlIEJFR0lOX1JJTkcgbWFjcm8hICovCisjaWYgUkFERU9OX0ZJRk9fREVCVUcKKwlyYWRlb25fc3RhdHVzKCBkZXZfcHJpdiApOworCURSTV9FUlJPUiggImZhaWxlZCFcbiIgKTsKKyNlbmRpZgorCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfZ2V0X2J1ZmZlcnMoIERSTUZJTEUgZmlscCwgZHJtX2RldmljZV90ICpkZXYsIGRybV9kbWFfdCAqZCApCit7CisJaW50IGk7CisJZHJtX2J1Zl90ICpidWY7CisKKwlmb3IgKCBpID0gZC0+Z3JhbnRlZF9jb3VudCA7IGkgPCBkLT5yZXF1ZXN0X2NvdW50IDsgaSsrICkgeworCQlidWYgPSByYWRlb25fZnJlZWxpc3RfZ2V0KCBkZXYgKTsKKwkJaWYgKCAhYnVmICkgcmV0dXJuIERSTV9FUlIoRUJVU1kpOyAvKiBOT1RFOiBicm9rZW4gY2xpZW50ICovCisKKwkJYnVmLT5maWxwID0gZmlscDsKKworCQlpZiAoIERSTV9DT1BZX1RPX1VTRVIoICZkLT5yZXF1ZXN0X2luZGljZXNbaV0sICZidWYtPmlkeCwKKwkJCQkgICBzaXplb2YoYnVmLT5pZHgpICkgKQorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCAmZC0+cmVxdWVzdF9zaXplc1tpXSwgJmJ1Zi0+dG90YWwsCisJCQkJICAgc2l6ZW9mKGJ1Zi0+dG90YWwpICkgKQorCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCQlkLT5ncmFudGVkX2NvdW50Kys7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmFkZW9uX2NwX2J1ZmZlcnMoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWludCByZXQgPSAwOworCWRybV9kbWFfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV9kbWFfdCBkOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggZCwgYXJncCwgc2l6ZW9mKGQpICk7CisKKwkvKiBQbGVhc2UgZG9uJ3Qgc2VuZCB1cyBidWZmZXJzLgorCSAqLworCWlmICggZC5zZW5kX2NvdW50ICE9IDAgKSB7CisJCURSTV9FUlJPUiggIlByb2Nlc3MgJWQgdHJ5aW5nIHRvIHNlbmQgJWQgYnVmZmVycyB2aWEgZHJtRE1BXG4iLAorCQkJICAgRFJNX0NVUlJFTlRQSUQsIGQuc2VuZF9jb3VudCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIFdlJ2xsIHNlbmQgeW91IGJ1ZmZlcnMuCisJICovCisJaWYgKCBkLnJlcXVlc3RfY291bnQgPCAwIHx8IGQucmVxdWVzdF9jb3VudCA+IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJQcm9jZXNzICVkIHRyeWluZyB0byBnZXQgJWQgYnVmZmVycyAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBkLnJlcXVlc3RfY291bnQsIGRtYS0+YnVmX2NvdW50ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJZC5ncmFudGVkX2NvdW50ID0gMDsKKworCWlmICggZC5yZXF1ZXN0X2NvdW50ICkgeworCQlyZXQgPSByYWRlb25fY3BfZ2V0X2J1ZmZlcnMoIGZpbHAsIGRldiwgJmQgKTsKKwl9CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKCBhcmdwLCBkLCBzaXplb2YoZCkgKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCByYWRlb25fZHJpdmVyX3ByZWluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfcHJpdiA9IGRybV9hbGxvYyhzaXplb2YoZHJtX3JhZGVvbl9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1fcmFkZW9uX3ByaXZhdGVfdCkpOworCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OworCWRldl9wcml2LT5mbGFncyA9IGZsYWdzOworCisJc3dpdGNoIChmbGFncyAmIENISVBfRkFNSUxZX01BU0spIHsKKwljYXNlIENISVBfUjEwMDoKKwljYXNlIENISVBfUlYyMDA6CisJY2FzZSBDSElQX1IyMDA6CisJY2FzZSBDSElQX1IzMDA6CisJCWRldl9wcml2LT5mbGFncyB8PSBDSElQX0hBU19ISUVSWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkvKiBhbGwgb3RoZXIgY2hpcHMgaGF2ZSBubyBoaWVyYXJjaGljYWwgeiBidWZmZXIgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCByYWRlb25fZHJpdmVyX3Bvc3RjbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWRybV9mcmVlKGRldl9wcml2LCBzaXplb2YoKmRldl9wcml2KSwgRFJNX01FTV9EUklWRVIpOworCisJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTYyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaApAQCAtMCwwICsxLDY1OSBAQAorLyogcmFkZW9uX2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSByYWRlb24gZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCisgKiBDb3B5cmlnaHQgMjAwMiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKi8KKworI2lmbmRlZiBfX1JBREVPTl9EUk1fSF9fCisjZGVmaW5lIF9fUkFERU9OX0RSTV9IX18KKworLyogV0FSTklORzogSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlc2UgZGVmaW5lcywgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUKKyAqIGRlZmluZXMgaW4gdGhlIFggc2VydmVyIGZpbGUgKHJhZGVvbl9zYXJlYS5oKQorICovCisjaWZuZGVmIF9fUkFERU9OX1NBUkVBX0RFRklORVNfXworI2RlZmluZSBfX1JBREVPTl9TQVJFQV9ERUZJTkVTX18KKworLyogT2xkIHN0eWxlIHN0YXRlIGZsYWdzLCByZXF1aXJlZCBmb3Igc2FyZWEgaW50ZXJmYWNlICgxLjEgYW5kIDEuMgorICogY2xlYXJzKSBhbmQgMS4yIGRybV92ZXJ0ZXgyIGlvY3RsLgorICovCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ09OVEVYVAkJMHgwMDAwMDAwMQorI2RlZmluZSBSQURFT05fVVBMT0FEX1ZFUlRGTVQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9MSU5FCQkweDAwMDAwMDA0CisjZGVmaW5lIFJBREVPTl9VUExPQURfQlVNUE1BUAkJMHgwMDAwMDAwOAorI2RlZmluZSBSQURFT05fVVBMT0FEX01BU0tTCQkweDAwMDAwMDEwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVklFV1BPUlQJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9TRVRVUAkJMHgwMDAwMDA0MAorI2RlZmluZSBSQURFT05fVVBMT0FEX1RDTAkJMHgwMDAwMDA4MAorI2RlZmluZSBSQURFT05fVVBMT0FEX01JU0MJCTB4MDAwMDAxMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgwCQkweDAwMDAwMjAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMQkJMHgwMDAwMDQwMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1RFWDIJCTB4MDAwMDA4MDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgwSU1BR0VTCTB4MDAwMDEwMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgxSU1BR0VTCTB4MDAwMDIwMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgySU1BR0VTCTB4MDAwMDQwMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9DTElQUkVDVFMJCTB4MDAwMDgwMDAgLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2RlZmluZSBSQURFT05fUkVRVUlSRV9RVUlFU0NFTkNFCTB4MDAwMTAwMDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9aQklBUwkJMHgwMDAyMDAwMCAvKiB2ZXJzaW9uIDEuMiBhbmQgbmV3ZXIgKi8KKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9BTEwJCTB4MDAzZWZmZmYKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9DT05URVhUX0FMTCAgICAgICAweDAwM2UwMWZmCisKKworLyogTmV3IHN0eWxlIHBlci1wYWNrZXQgaWRlbnRpZmllcnMgZm9yIHVzZSBpbiBjbWRfYnVmZmVyIGlvY3RsIHdpdGgKKyAqIHRoZSBSQURFT05fRU1JVF9QQUNLRVQgY29tbWFuZC4gIENvbW1lbnRzIHJlbGF0ZSBuZXcgcGFja2V0cyB0byBvbGQKKyAqIHN0YXRlIGJpdHMgYW5kIHRoZSBwYWNrZXQgc2l6ZToKKyAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9NSVNDICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogY29udGV4dC83ICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBjb250ZXh0LzMgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUkIzRF9DT0xPUlBJVENIICAgICAgICAgICAgICAgICAyIC8qIGNvbnRleHQvMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9SRV9MSU5FX1BBVFRFUk4gICAgICAgICAgICAgICAgIDMgLyogbGluZS8yICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgNCAvKiBsaW5lLzEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfTFVNX01BVFJJWCAgICAgICAgICAgICAgICAgICA1IC8qIGJ1bXBtYXAvMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9ST1RfTUFUUklYXzAgICAgICAgICAgICAgICAgIDYgLyogYnVtcG1hcC8yICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1JCM0RfU1RFTkNJTFJFRk1BU0sgICAgICAgICAgICAgNyAvKiBtYXNrcy8zICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX1ZQT1JUX1hTQ0FMRSAgICAgICAgICAgICAgICAgOCAvKiB2aWV3cG9ydC82ICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgOSAvKiBzZXR1cC8yICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX0NOVExfU1RBVFVTICAgICAgICAgICAgICAgICAgMTAgLyogc2V0dXAvMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9SRV9NSVNDICAgICAgICAgICAgICAgICAgICAgICAgIDExIC8qIG1pc2MvMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8wICAgICAgICAgICAgICAgICAgIDEyIC8qIHRleDAvNiAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9CT1JERVJfQ09MT1JfMCAgICAgICAgICAgICAgIDEzIC8qIHRleDAvMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8xICAgICAgICAgICAgICAgICAgIDE0IC8qIHRleDEvNiAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9CT1JERVJfQ09MT1JfMSAgICAgICAgICAgICAgIDE1IC8qIHRleDEvMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8yICAgICAgICAgICAgICAgICAgIDE2IC8qIHRleDIvNiAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9CT1JERVJfQ09MT1JfMiAgICAgICAgICAgICAgIDE3IC8qIHRleDIvMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9aQklBU19GQUNUT1IgICAgICAgICAgICAgICAgIDE4IC8qIHpiaWFzLzIgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfVENMX09VVFBVVF9WVFhfRk1UICAgICAgICAgICAxOSAvKiB0Y2wvMTEgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQgICAyMCAvKiBtYXRlcmlhbC8xNyAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMCAgICAgICAgICAgICAgICAgICAgIDIxIC8qIHRleDAvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMSAgICAgICAgICAgICAgICAgICAgIDIyIC8qIHRleDEvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMiAgICAgICAgICAgICAgICAgICAgIDIzIC8qIHRleDIvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMyAgICAgICAgICAgICAgICAgICAgIDI0IC8qIHRleDMvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNCAgICAgICAgICAgICAgICAgICAgIDI1IC8qIHRleDQvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNSAgICAgICAgICAgICAgICAgICAgIDI2IC8qIHRleDUvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNiAgICAgICAgICAgICAgICAgICAgIDI3IC8qIC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF83ICAgICAgICAgICAgICAgICAgICAgMjggLyogLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RDTF9MSUdIVF9NT0RFTF9DVExfMCAgICAgICAgICAgICAyOSAvKiB0Y2wvNyAqLworI2RlZmluZSBSMjAwX0VNSVRfVEZBQ1RPUl8wICAgICAgICAgICAgICAgICAgICAgICAgIDMwIC8qIHRmLzcgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1ZUWF9GTVRfMCAgICAgICAgICAgICAgICAgICAgICAgICAzMSAvKiB2dHgvNSAqLworI2RlZmluZSBSMjAwX0VNSVRfVkFQX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyIC8qIHZhcC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9NQVRSSVhfU0VMRUNUXzAgICAgICAgICAgICAgICAgICAgMzMgLyogbXNsLzUgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RFWF9QUk9DX0NUTF8yICAgICAgICAgICAgICAgICAgICAzNCAvKiB0Y2cvNSAqLworI2RlZmluZSBSMjAwX0VNSVRfVENMX1VDUF9WRVJUX0JMRU5EX0NUTCAgICAgICAgICAgIDM1IC8qIHRjbC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8wICAgICAgICAgICAgICAgICAgICAgMzYgLyogdGV4MC82ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8xICAgICAgICAgICAgICAgICAgICAgMzcgLyogdGV4MS82ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8yICAgICAgICAgICAgICAgICAgICAgMzggLyogdGV4Mi82ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8zICAgICAgICAgICAgICAgICAgICAgMzkgLyogdGV4My82ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl80ICAgICAgICAgICAgICAgICAgICAgNDAgLyogdGV4NC82ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl81ICAgICAgICAgICAgICAgICAgICAgNDEgLyogdGV4NS82ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8wICAgICAgICAgICAgICAgICAgICAgNDIgLyogdGV4MC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8xICAgICAgICAgICAgICAgICAgICAgNDMgLyogdGV4MS8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8yICAgICAgICAgICAgICAgICAgICAgNDQgLyogdGV4Mi8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8zICAgICAgICAgICAgICAgICAgICAgNDUgLyogdGV4My8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF80ICAgICAgICAgICAgICAgICAgICAgNDYgLyogdGV4NC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF81ICAgICAgICAgICAgICAgICAgICAgNDcgLyogdGV4NS8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9WVEVfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgNDggLyogdnRlLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX09VVFBVVF9WVFhfQ09NUF9TRUwgICAgICAgICAgICAgICA0OSAvKiB2dHgvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfVEFNX0RFQlVHMyAgICAgICAgICAgICAgICAgICAgIDUwIC8qIHRhbS8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DTlRMX1ggICAgICAgICAgICAgICAgICAgICAgICAgNTEgLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JCM0RfREVQVEhYWV9PRkZTRVQgICAgICAgICAgICAgICA1MiAvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUkVfQVVYX1NDSVNTT1JfQ05UTCAgICAgICAgICAgICAgIDUzIC8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzAgICAgICAgICAgICAgICAgICAgNTQgLyogY3N0LzIgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMSAgICAgICAgICAgICAgICAgICA1NSAvKiBjc3QvMiAqLworI2RlZmluZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8yICAgICAgICAgICAgICAgICAgIDU2IC8qIGNzdC8yICovCisjZGVmaW5lIFIyMDBfRU1JVF9TRV9WQVBfQ05UTF9TVEFUVVMgICAgICAgICAgICAgICAgNTcgLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1NFX1ZUWF9TVEFURV9DTlRMICAgICAgICAgICAgICAgICA1OCAvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUkVfUE9JTlRTSVpFICAgICAgICAgICAgICAgICAgICAgIDU5IC8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAgICAgICAgNjAgLyogY3N0LzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzAgICAgICAgICAgICAgICAgICA2MQorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18wICAgICAgICAgICAgICAgIDYyCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18xICAgICAgICAgICAgICAgICAgNjMKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMSAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMiAgICAgICAgICAgICAgICAgIDY1CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzIgICAgICAgICAgICAgICAgNjYKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzMgICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18zICAgICAgICAgICAgICAgIDY4CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU180ICAgICAgICAgICAgICAgICAgNjkKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfNCAgICAgICAgICAgICAgICA3MAorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfNSAgICAgICAgICAgICAgICAgIDcxCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzUgICAgICAgICAgICAgICAgNzIKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMCAgICAgICAgICAgICAgICAgICA3MworI2RlZmluZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8xICAgICAgICAgICAgICAgICAgIDc0CisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzIgICAgICAgICAgICAgICAgICAgNzUKKyNkZWZpbmUgUjIwMF9FTUlUX1JCM0RfQkxFTkRDT0xPUiAgICAgICAgICAgICAgICAgICA3NgorI2RlZmluZSBSMjAwX0VNSVRfVENMX1BPSU5UX1NQUklURV9DTlRMICAgICAgICAgICAgIDc3CisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzAgICAgICAgICAgICAgICAgNzgKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMCAgICAgICAgICAgICA3OQorI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18xICAgICAgICAgICAgICAgIDgwCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDEgICAgICAgICAgICAgODEKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMiAgICAgICAgICAgICAgICA4MgorI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QyICAgICAgICAgICAgIDgzCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UUklfUEVSRl9DTlRMICAgICAgICAgICAgICAgICAgODQKKyNkZWZpbmUgUkFERU9OX01BWF9TVEFURV9QQUNLRVRTICAgICAgICAgICAgICAgICAgICA4NQorCisvKiBDb21tYW5kcyB1bmRlcnN0b29kIGJ5IGNtZF9idWZmZXIgaW9jdGwuICBNb3JlIGNhbiBiZSBhZGRlZCBidXQKKyAqIG9idmlvdXNseSB0aGVzZSBjYW4ndCBiZSByZW1vdmVkIG9yIGNoYW5nZWQ6CisgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9QQUNLRVQgICAgICAxIC8qIGVtaXQgb25lIG9mIHRoZSByZWdpc3RlciBwYWNrZXRzIGFib3ZlICovCisjZGVmaW5lIFJBREVPTl9DTURfU0NBTEFSUyAgICAgMiAvKiBlbWl0IHNjYWxhciBkYXRhICovCisjZGVmaW5lIFJBREVPTl9DTURfVkVDVE9SUyAgICAgMyAvKiBlbWl0IHZlY3RvciBkYXRhICovCisjZGVmaW5lIFJBREVPTl9DTURfRE1BX0RJU0NBUkQgNCAvKiBkaXNjYXJkIGN1cnJlbnQgZG1hIGJ1ZiAqLworI2RlZmluZSBSQURFT05fQ01EX1BBQ0tFVDMgICAgIDUgLyogZW1pdCBodyBwYWNrZXQgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9QQUNLRVQzX0NMSVAgNiAvKiBlbWl0IGh3IHBhY2tldCB3cmFwcGVkIGluIGNsaXByZWN0cyAqLworI2RlZmluZSBSQURFT05fQ01EX1NDQUxBUlMyICAgICA3IC8qIHIyMDAgc3RvcGdhcCAqLworI2RlZmluZSBSQURFT05fQ01EX1dBSVQgICAgICAgICA4IC8qIGVtaXQgaHcgd2FpdCBjb21tYW5kcyAtLSBub3RlOgorCQkJCSAgICogIGRvZXNuJ3QgbWFrZSB0aGUgY3B1IHdhaXQsIGp1c3QKKwkJCQkgICAqICB0aGUgZ3JhcGhpY3MgaGFyZHdhcmUgKi8KKworCit0eXBlZGVmIHVuaW9uIHsKKwlpbnQgaTsKKwlzdHJ1Y3QgeyAKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgcGFkMCwgcGFkMSwgcGFkMjsKKwl9IGhlYWRlcjsKKwlzdHJ1Y3QgeyAKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgcGFja2V0X2lkLCBwYWQwLCBwYWQxOworCX0gcGFja2V0OworCXN0cnVjdCB7IAorCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBvZmZzZXQsIHN0cmlkZSwgY291bnQ7IAorCX0gc2NhbGFyczsKKwlzdHJ1Y3QgeyAKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgb2Zmc2V0LCBzdHJpZGUsIGNvdW50OyAKKwl9IHZlY3RvcnM7CisJc3RydWN0IHsgCisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGJ1Zl9pZHgsIHBhZDAsIHBhZDE7IAorCX0gZG1hOworCXN0cnVjdCB7IAorCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBmbGFncywgcGFkMCwgcGFkMTsgCisJfSB3YWl0OworfSBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdDsKKworI2RlZmluZSBSQURFT05fV0FJVF8yRCAgMHgxCisjZGVmaW5lIFJBREVPTl9XQUlUXzNEICAweDIKKworCisjZGVmaW5lIFJBREVPTl9GUk9OVAkJCTB4MQorI2RlZmluZSBSQURFT05fQkFDSwkJCTB4MgorI2RlZmluZSBSQURFT05fREVQVEgJCQkweDQKKyNkZWZpbmUgUkFERU9OX1NURU5DSUwJCQkweDgKKyNkZWZpbmUgUkFERU9OX0NMRUFSX0ZBU1RaCQkweDgwMDAwMDAwCisjZGVmaW5lIFJBREVPTl9VU0VfSElFUloJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkFERU9OX1VTRV9DT01QX1pCVUYJCTB4MjAwMDAwMDAKKworLyogUHJpbWl0aXZlIHR5cGVzCisgKi8KKyNkZWZpbmUgUkFERU9OX1BPSU5UUwkJCTB4MQorI2RlZmluZSBSQURFT05fTElORVMJCQkweDIKKyNkZWZpbmUgUkFERU9OX0xJTkVfU1RSSVAJCTB4MworI2RlZmluZSBSQURFT05fVFJJQU5HTEVTCQkweDQKKyNkZWZpbmUgUkFERU9OX1RSSUFOR0xFX0ZBTgkJMHg1CisjZGVmaW5lIFJBREVPTl9UUklBTkdMRV9TVFJJUAkJMHg2CisKKy8qIFZlcnRleC9pbmRpcmVjdCBidWZmZXIgc2l6ZQorICovCisjZGVmaW5lIFJBREVPTl9CVUZGRVJfU0laRQkJNjU1MzYKKworLyogQnl0ZSBvZmZzZXRzIGZvciBpbmRpcmVjdCBidWZmZXIgZGF0YQorICovCisjZGVmaW5lIFJBREVPTl9JTkRFWF9QUklNX09GRlNFVAkyMAorCisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1JFR19PRkZTRVQJMzIKKworI2RlZmluZSBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTCTEyCisKKy8qIFRoZXJlIGFyZSAyIGhlYXBzIChsb2NhbC9HQVJUKS4gIEVhY2ggcmVnaW9uIHdpdGhpbiBhIGhlYXAgaXMgYQorICogbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtIHBlciBoZWFwLgorICovCisjZGVmaW5lIFJBREVPTl9MT0NBTF9URVhfSEVBUAkJMAorI2RlZmluZSBSQURFT05fR0FSVF9URVhfSEVBUAkJMQorI2RlZmluZSBSQURFT05fTlJfVEVYX0hFQVBTCQkyCisjZGVmaW5lIFJBREVPTl9OUl9URVhfUkVHSU9OUwkJNjQKKyNkZWZpbmUgUkFERU9OX0xPR19URVhfR1JBTlVMQVJJVFkJMTYKKworI2RlZmluZSBSQURFT05fTUFYX1RFWFRVUkVfTEVWRUxTCTEyCisjZGVmaW5lIFJBREVPTl9NQVhfVEVYVFVSRV9VTklUUwkzCisKKyNkZWZpbmUgUkFERU9OX01BWF9TVVJGQUNFUwkJOAorCisvKiBCbGl0cyBoYXZlIHN0cmljdCBvZmZzZXQgcnVsZXMuICBBbGwgYmxpdCBvZmZzZXQgbXVzdCBiZSBhbGlnbmVkIG9uCisgKiBhIDFLLWJ5dGUgYm91bmRhcnkuCisgKi8KKyNkZWZpbmUgUkFERU9OX09GRlNFVF9TSElGVCAgICAgICAgICAgICAxMAorI2RlZmluZSBSQURFT05fT0ZGU0VUX0FMSUdOICAgICAgICAgICAgICgxIDw8IFJBREVPTl9PRkZTRVRfU0hJRlQpCisjZGVmaW5lIFJBREVPTl9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgKFJBREVPTl9PRkZTRVRfQUxJR04gLSAxKQorCisjZW5kaWYgLyogX19SQURFT05fU0FSRUFfREVGSU5FU19fICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcmVkOworCXVuc2lnbmVkIGludCBncmVlbjsKKwl1bnNpZ25lZCBpbnQgYmx1ZTsKKwl1bnNpZ25lZCBpbnQgYWxwaGE7Cit9IHJhZGVvbl9jb2xvcl9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBDb250ZXh0IHN0YXRlICovCisJdW5zaWduZWQgaW50IHBwX21pc2M7CQkJCS8qIDB4MWMxNCAqLworCXVuc2lnbmVkIGludCBwcF9mb2dfY29sb3I7CisJdW5zaWduZWQgaW50IHJlX3NvbGlkX2NvbG9yOworCXVuc2lnbmVkIGludCByYjNkX2JsZW5kY250bDsKKwl1bnNpZ25lZCBpbnQgcmIzZF9kZXB0aG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmIzZF9kZXB0aHBpdGNoOworCXVuc2lnbmVkIGludCByYjNkX3pzdGVuY2lsY250bDsKKworCXVuc2lnbmVkIGludCBwcF9jbnRsOwkJCQkvKiAweDFjMzggKi8KKwl1bnNpZ25lZCBpbnQgcmIzZF9jbnRsOworCXVuc2lnbmVkIGludCByYjNkX2NvbG9yb2Zmc2V0OworCXVuc2lnbmVkIGludCByZV93aWR0aF9oZWlnaHQ7CisJdW5zaWduZWQgaW50IHJiM2RfY29sb3JwaXRjaDsKKwl1bnNpZ25lZCBpbnQgc2VfY250bDsKKworCS8qIFZlcnRleCBmb3JtYXQgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgc2VfY29vcmRfZm10OwkJCS8qIDB4MWM1MCAqLworCisJLyogTGluZSBzdGF0ZSAqLworCXVuc2lnbmVkIGludCByZV9saW5lX3BhdHRlcm47CQkJLyogMHgxY2QwICovCisJdW5zaWduZWQgaW50IHJlX2xpbmVfc3RhdGU7CisKKwl1bnNpZ25lZCBpbnQgc2VfbGluZV93aWR0aDsJCQkvKiAweDFkYjggKi8KKworCS8qIEJ1bXBtYXAgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcHBfbHVtX21hdHJpeDsJCQkvKiAweDFkMDAgKi8KKworCXVuc2lnbmVkIGludCBwcF9yb3RfbWF0cml4XzA7CQkJLyogMHgxZDU4ICovCisJdW5zaWduZWQgaW50IHBwX3JvdF9tYXRyaXhfMTsKKworCS8qIE1hc2sgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcmIzZF9zdGVuY2lscmVmbWFzazsJCS8qIDB4MWQ3YyAqLworCXVuc2lnbmVkIGludCByYjNkX3JvcGNudGw7CisJdW5zaWduZWQgaW50IHJiM2RfcGxhbmVtYXNrOworCisJLyogVmlld3BvcnQgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeHNjYWxlOwkJCS8qIDB4MWQ5OCAqLworCXVuc2lnbmVkIGludCBzZV92cG9ydF94b2Zmc2V0OworCXVuc2lnbmVkIGludCBzZV92cG9ydF95c2NhbGU7CisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3lvZmZzZXQ7CisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3pzY2FsZTsKKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfem9mZnNldDsKKworCS8qIFNldHVwIHN0YXRlICovCisJdW5zaWduZWQgaW50IHNlX2NudGxfc3RhdHVzOwkJCS8qIDB4MjE0MCAqLworCisJLyogTWlzYyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCByZV90b3BfbGVmdDsJCQkvKiAweDI2YzAgKi8KKwl1bnNpZ25lZCBpbnQgcmVfbWlzYzsKK30gZHJtX3JhZGVvbl9jb250ZXh0X3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFpiaWFzIHN0YXRlICovCisJdW5zaWduZWQgaW50IHNlX3piaWFzX2ZhY3RvcjsJCQkvKiAweDFkYWMgKi8KKwl1bnNpZ25lZCBpbnQgc2VfemJpYXNfY29uc3RhbnQ7Cit9IGRybV9yYWRlb25fY29udGV4dDJfcmVnc190OworCisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgZWFjaCB0ZXh0dXJlIHVuaXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBwcF90eGZpbHRlcjsKKwl1bnNpZ25lZCBpbnQgcHBfdHhmb3JtYXQ7CisJdW5zaWduZWQgaW50IHBwX3R4b2Zmc2V0OworCXVuc2lnbmVkIGludCBwcF90eGNibGVuZDsKKwl1bnNpZ25lZCBpbnQgcHBfdHhhYmxlbmQ7CisJdW5zaWduZWQgaW50IHBwX3RmYWN0b3I7CisJdW5zaWduZWQgaW50IHBwX2JvcmRlcl9jb2xvcjsKK30gZHJtX3JhZGVvbl90ZXh0dXJlX3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZmluaXNoOworCXVuc2lnbmVkIGludCBwcmltOjg7CisJdW5zaWduZWQgaW50IHN0YXRlaWR4Ojg7CisJdW5zaWduZWQgaW50IG51bXZlcnRzOjE2OyAvKiBvdmVybG9hZGVkIGFzIG9mZnNldC82NCBmb3IgZWx0IHByaW1zICovCisgICAgICAgIHVuc2lnbmVkIGludCB2Y19mb3JtYXQ7ICAgLyogdmVydGV4IGZvcm1hdCAqLworfSBkcm1fcmFkZW9uX3ByaW1fdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJZHJtX3JhZGVvbl9jb250ZXh0X3JlZ3NfdCBjb250ZXh0OworCWRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgdGV4W1JBREVPTl9NQVhfVEVYVFVSRV9VTklUU107CisJZHJtX3JhZGVvbl9jb250ZXh0Ml9yZWdzX3QgY29udGV4dDI7CisJdW5zaWduZWQgaW50IGRpcnR5OworfSBkcm1fcmFkZW9uX3N0YXRlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFRoZSBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIG9mIHN0YXRlIGluZm9ybWF0aW9uIHRvIHRoZQorCSAqIGtlcm5lbCBvbiBmaXJpbmcgYSB2ZXJ0ZXggYnVmZmVyIHdpdGggZWl0aGVyIG9mIHRoZQorCSAqIG9ic29sZXRlZCB2ZXJ0ZXgvaW5kZXggaW9jdGxzLgorCSAqLworCWRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgY29udGV4dF9zdGF0ZTsKKwlkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190IHRleF9zdGF0ZVtSQURFT05fTUFYX1RFWFRVUkVfVU5JVFNdOworCXVuc2lnbmVkIGludCBkaXJ0eTsKKwl1bnNpZ25lZCBpbnQgdmVydHNpemU7CisJdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsKKworCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KKwkgKi8KKwlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUU107CisJdW5zaWduZWQgaW50IG5ib3g7CisKKwkvKiBDb3VudGVycyBmb3IgY2xpZW50LXNpZGUgdGhyb3R0bGluZyBvZiByZW5kZXJpbmcgY2xpZW50cy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFtZTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9kaXNwYXRjaDsKKwl1bnNpZ25lZCBpbnQgbGFzdF9jbGVhcjsKKworCWRybV90ZXhfcmVnaW9uX3QgdGV4X2xpc3RbUkFERU9OX05SX1RFWF9IRUFQU11bUkFERU9OX05SX1RFWF9SRUdJT05TKzFdOworCXVuc2lnbmVkIGludCB0ZXhfYWdlW1JBREVPTl9OUl9URVhfSEVBUFNdOworCWludCBjdHhfb3duZXI7CisgICAgICAgIGludCBwZlN0YXRlOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgM2Qgd2luZG93cyAoMCwxLDJvcm1vcmUpICovCisgICAgICAgIGludCBwZkN1cnJlbnRQYWdlOwkgICAgLyogd2hpY2ggYnVmZmVyIGlzIGJlaW5nIGRpc3BsYXllZD8gKi8KKwlpbnQgY3J0YzJfYmFzZTsJCSAgICAvKiBDUlRDMiBmcmFtZSBvZmZzZXQgKi8KKwlpbnQgdGlsaW5nX2VuYWJsZWQ7CS8qIHNldCBieSBkcm0sIHJlYWQgYnkgMmQgKyAzZCBjbGllbnRzICovCit9IGRybV9yYWRlb25fc2FyZWFfdDsKKworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlICh4Zjg2ZHJtUmFkZW9uLmgpCisgKgorICogS1c6IGFjdHVhbGx5IGl0J3MgaWxsZWdhbCB0byBjaGFuZ2UgYW55IG9mIHRoaXMgKGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KS4KKyAqLworCisvKiBSYWRlb24gc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fUkFERU9OX0NQX0lOSVQgICAgMHgwMCAKKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9TVEFSVCAgIDB4MDEgCisjZGVmaW5lIERSTV9SQURFT05fQ1BfU1RPUCAgICAweDAyCisjZGVmaW5lIERSTV9SQURFT05fQ1BfUkVTRVQgICAweDAzCisjZGVmaW5lIERSTV9SQURFT05fQ1BfSURMRSAgICAweDA0CisjZGVmaW5lIERSTV9SQURFT05fUkVTRVQgICAgICAweDA1IAorI2RlZmluZSBEUk1fUkFERU9OX0ZVTExTQ1JFRU4gMHgwNgorI2RlZmluZSBEUk1fUkFERU9OX1NXQVAgICAgICAgMHgwNyAKKyNkZWZpbmUgRFJNX1JBREVPTl9DTEVBUiAgICAgIDB4MDggCisjZGVmaW5lIERSTV9SQURFT05fVkVSVEVYICAgICAweDA5CisjZGVmaW5lIERSTV9SQURFT05fSU5ESUNFUyAgICAweDBBCisjZGVmaW5lIERSTV9SQURFT05fTk9UX1VTRUQKKyNkZWZpbmUgRFJNX1JBREVPTl9TVElQUExFICAgIDB4MEMKKyNkZWZpbmUgRFJNX1JBREVPTl9JTkRJUkVDVCAgIDB4MEQKKyNkZWZpbmUgRFJNX1JBREVPTl9URVhUVVJFICAgIDB4MEUKKyNkZWZpbmUgRFJNX1JBREVPTl9WRVJURVgyICAgIDB4MEYKKyNkZWZpbmUgRFJNX1JBREVPTl9DTURCVUYgICAgIDB4MTAKKyNkZWZpbmUgRFJNX1JBREVPTl9HRVRQQVJBTSAgIDB4MTEKKyNkZWZpbmUgRFJNX1JBREVPTl9GTElQICAgICAgIDB4MTIKKyNkZWZpbmUgRFJNX1JBREVPTl9BTExPQyAgICAgIDB4MTMKKyNkZWZpbmUgRFJNX1JBREVPTl9GUkVFICAgICAgIDB4MTQKKyNkZWZpbmUgRFJNX1JBREVPTl9JTklUX0hFQVAgIDB4MTUKKyNkZWZpbmUgRFJNX1JBREVPTl9JUlFfRU1JVCAgIDB4MTYKKyNkZWZpbmUgRFJNX1JBREVPTl9JUlFfV0FJVCAgIDB4MTcKKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9SRVNVTUUgIDB4MTgKKyNkZWZpbmUgRFJNX1JBREVPTl9TRVRQQVJBTSAgIDB4MTkKKyNkZWZpbmUgRFJNX1JBREVPTl9TVVJGX0FMTE9DIDB4MWEKKyNkZWZpbmUgRFJNX1JBREVPTl9TVVJGX0ZSRUUgIDB4MWIKKworI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX0lOSVQgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfSU5JVCwgZHJtX3JhZGVvbl9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfU1RBUlQgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9TVEFSVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9TVE9QICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX1NUT1AsIGRybV9yYWRlb25fY3Bfc3RvcF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX1JFU0VUICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfSURMRSAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9JRExFKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1JFU0VUICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fRlVMTFNDUkVFTiBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9GVUxMU0NSRUVOLCBkcm1fcmFkZW9uX2Z1bGxzY3JlZW5fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TV0FQICAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ0xFQVIgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DTEVBUiwgZHJtX3JhZGVvbl9jbGVhcl90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1ZFUlRFWCAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fVkVSVEVYLCBkcm1fcmFkZW9uX3ZlcnRleF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lORElDRVMgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSU5ESUNFUywgZHJtX3JhZGVvbl9pbmRpY2VzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU1RJUFBMRSAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TVElQUExFLCBkcm1fcmFkZW9uX3N0aXBwbGVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JTkRJUkVDVCAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lORElSRUNULCBkcm1fcmFkZW9uX2luZGlyZWN0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fVEVYVFVSRSAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9URVhUVVJFLCBkcm1fcmFkZW9uX3RleHR1cmVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9WRVJURVgyICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1ZFUlRFWDIsIGRybV9yYWRlb25fdmVydGV4Ml90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NNREJVRiAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ01EQlVGLCBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRVRQQVJBTSAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFVFBBUkFNLCBkcm1fcmFkZW9uX2dldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fRkxJUCAgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9GTElQKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0FMTE9DICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQUxMT0MsIGRybV9yYWRlb25fbWVtX2FsbG9jX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fRlJFRSAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9GUkVFLCBkcm1fcmFkZW9uX21lbV9mcmVlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSU5JVF9IRUFQICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JTklUX0hFQVAsIGRybV9yYWRlb25fbWVtX2luaXRfaGVhcF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lSUV9FTUlUICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSVJRX0VNSVQsIGRybV9yYWRlb25faXJxX2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JUlFfV0FJVCAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lSUV9XQUlULCBkcm1fcmFkZW9uX2lycV93YWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfUkVTVU1FICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9SRVNVTUUpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU0VUUEFSQU0gICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TRVRQQVJBTSwgZHJtX3JhZGVvbl9zZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NVUkZfQUxMT0MgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU1VSRl9BTExPQywgZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU1VSRl9GUkVFICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TVVJGX0ZSRUUsIGRybV9yYWRlb25fc3VyZmFjZV9mcmVlX3QpCisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faW5pdCB7CisJZW51bSB7CisJCVJBREVPTl9JTklUX0NQICAgID0gMHgwMSwKKwkJUkFERU9OX0NMRUFOVVBfQ1AgPSAweDAyLAorCQlSQURFT05fSU5JVF9SMjAwX0NQID0gMHgwMywKKwkJUkFERU9OX0lOSVRfUjMwMF9DUCA9IDB4MDQKKwl9IGZ1bmM7CisJdW5zaWduZWQgbG9uZyBzYXJlYV9wcml2X29mZnNldDsKKwlpbnQgaXNfcGNpOworCWludCBjcF9tb2RlOworCWludCBnYXJ0X3NpemU7CisJaW50IHJpbmdfc2l6ZTsKKwlpbnQgdXNlY190aW1lb3V0OworCisJdW5zaWduZWQgaW50IGZiX2JwcDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0LCBmcm9udF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQsIGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX2JwcDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0LCBkZXB0aF9waXRjaDsKKworCXVuc2lnbmVkIGxvbmcgZmJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfcnB0cl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGdhcnRfdGV4dHVyZXNfb2Zmc2V0OworfSBkcm1fcmFkZW9uX2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9jcF9zdG9wIHsKKwlpbnQgZmx1c2g7CisJaW50IGlkbGU7Cit9IGRybV9yYWRlb25fY3Bfc3RvcF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2Z1bGxzY3JlZW4geworCWVudW0geworCQlSQURFT05fSU5JVF9GVUxMU0NSRUVOICAgID0gMHgwMSwKKwkJUkFERU9OX0NMRUFOVVBfRlVMTFNDUkVFTiA9IDB4MDIKKwl9IGZ1bmM7Cit9IGRybV9yYWRlb25fZnVsbHNjcmVlbl90OworCisjZGVmaW5lIENMRUFSX1gxCTAKKyNkZWZpbmUgQ0xFQVJfWTEJMQorI2RlZmluZSBDTEVBUl9YMgkyCisjZGVmaW5lIENMRUFSX1kyCTMKKyNkZWZpbmUgQ0xFQVJfREVQVEgJNAorCit0eXBlZGVmIHVuaW9uIGRybV9yYWRlb25fY2xlYXJfcmVjdCB7CisJZmxvYXQgZls1XTsKKwl1bnNpZ25lZCBpbnQgdWlbNV07Cit9IGRybV9yYWRlb25fY2xlYXJfcmVjdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2NsZWFyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aDsKKwl1bnNpZ25lZCBpbnQgY29sb3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfbWFzazsgICAvKiBtaXNuYW1lZCBmaWVsZDogIHNob3VsZCBiZSBzdGVuY2lsICovCisJZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3QgX191c2VyICpkZXB0aF9ib3hlczsKK30gZHJtX3JhZGVvbl9jbGVhcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3ZlcnRleCB7CisJaW50IHByaW07CisJaW50IGlkeDsJCQkvKiBJbmRleCBvZiB2ZXJ0ZXggYnVmZmVyICovCisJaW50IGNvdW50OwkJCS8qIE51bWJlciBvZiB2ZXJ0aWNlcyBpbiBidWZmZXIgKi8KKwlpbnQgZGlzY2FyZDsJCQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9yYWRlb25fdmVydGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faW5kaWNlcyB7CisJaW50IHByaW07CisJaW50IGlkeDsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsJCQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9yYWRlb25faW5kaWNlc190OworCisvKiB2MS4yIC0gb2Jzb2xldGVzIGRybV9yYWRlb25fdmVydGV4IGFuZCBkcm1fcmFkZW9uX2luZGljZXMKKyAqICAgICAgLSBhbGxvd3MgbXVsdGlwbGUgcHJpbWl0aXZlcyBhbmQgc3RhdGUgY2hhbmdlcyBpbiBhIHNpbmdsZSBpb2N0bAorICogICAgICAtIHN1cHBvcnRzIGRyaXZlciBjaGFuZ2UgdG8gZW1pdCBuYXRpdmUgcHJpbWl0aXZlcworICovCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3ZlcnRleDIgeworCWludCBpZHg7CQkJLyogSW5kZXggb2YgdmVydGV4IGJ1ZmZlciAqLworCWludCBkaXNjYXJkOwkJCS8qIENsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gKi8KKwlpbnQgbnJfc3RhdGVzOworCWRybV9yYWRlb25fc3RhdGVfdCBfX3VzZXIgKnN0YXRlOworCWludCBucl9wcmltczsKKwlkcm1fcmFkZW9uX3ByaW1fdCBfX3VzZXIgKnByaW07Cit9IGRybV9yYWRlb25fdmVydGV4Ml90OworCisvKiB2MS4zIC0gb2Jzb2xldGVzIGRybV9yYWRlb25fdmVydGV4MgorICogICAgICAtIGFsbG93cyBhcmJpdGFyaWx5IGxhcmdlIGNsaXByZWN0IGxpc3QgCisgKiAgICAgIC0gYWxsb3dzIHVwZGF0aW5nIG9mIHRjbCBwYWNrZXQsIHZlY3RvciBhbmQgc2NhbGFyIHN0YXRlCisgKiAgICAgIC0gYWxsb3dzIG1lbW9yeS1lZmZpY2llbnQgZGVzY3JpcHRpb24gb2Ygc3RhdGUgdXBkYXRlcworICogICAgICAtIGFsbG93cyBzdGF0ZSB0byBiZSBlbWl0dGVkIHdpdGhvdXQgYSBwcmltaXRpdmUgCisgKiAgICAgICAgICAgKGZvciBjbGVhcnMsIGN0eCBzd2l0Y2hlcykKKyAqICAgICAgLSBhbGxvd3MgbW9yZSB0aGFuIG9uZSBkbWEgYnVmZmVyIHRvIGJlIHJlZmVyZW5jZWQgcGVyIGlvY3RsCisgKiAgICAgIC0gc3VwcG9ydHMgdGNsIGRyaXZlcgorICogICAgICAtIG1heSBiZSBleHRlbmRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgd2l0aCBuZXcgY21kIHR5cGVzLCBwYWNrZXRzCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fY21kX2J1ZmZlciB7CisJaW50IGJ1ZnN6OworCWNoYXIgX191c2VyICpidWY7CisJaW50IG5ib3g7CisJZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXM7Cit9IGRybV9yYWRlb25fY21kX2J1ZmZlcl90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3RleF9pbWFnZSB7CisJdW5zaWduZWQgaW50IHgsIHk7CQkvKiBCbGl0IGNvb3JkaW5hdGVzICovCisJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisJY29uc3Qgdm9pZCBfX3VzZXIgKmRhdGE7Cit9IGRybV9yYWRlb25fdGV4X2ltYWdlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fdGV4dHVyZSB7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgcGl0Y2g7CisJaW50IGZvcm1hdDsKKwlpbnQgd2lkdGg7CQkJLyogVGV4dHVyZSBpbWFnZSBjb29yZGluYXRlcyAqLworCWludCBoZWlnaHQ7CisJZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBfX3VzZXIgKmltYWdlOworfSBkcm1fcmFkZW9uX3RleHR1cmVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdGlwcGxlIHsKKwl1bnNpZ25lZCBpbnQgX191c2VyICptYXNrOworfSBkcm1fcmFkZW9uX3N0aXBwbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pbmRpcmVjdCB7CisJaW50IGlkeDsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsKK30gZHJtX3JhZGVvbl9pbmRpcmVjdF90OworCisKKy8qIDEuMzogQW4gaW9jdGwgdG8gZ2V0IHBhcmFtZXRlcnMgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIHRvIHRoZSAzZAorICogY2xpZW50IGFueSBvdGhlciB3YXkuICAKKyAqLworI2RlZmluZSBSQURFT05fUEFSQU1fR0FSVF9CVUZGRVJfT0ZGU0VUICAgIDEgLyogY2FyZCBvZmZzZXQgb2YgMXN0IEdBUlQgYnVmZmVyICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9MQVNUX0ZSQU1FICAgICAgICAgICAgMgorI2RlZmluZSBSQURFT05fUEFSQU1fTEFTVF9ESVNQQVRDSCAgICAgICAgIDMKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0xBU1RfQ0xFQVIgICAgICAgICAgICA0CisvKiBBZGRlZCB3aXRoIERSTSB2ZXJzaW9uIDEuNi4gKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX0lSUV9OUiAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFJBREVPTl9QQVJBTV9HQVJUX0JBU0UgICAgICAgICAgICAgNiAvKiBjYXJkIG9mZnNldCBvZiBHQVJUIGJhc2UgKi8KKy8qIEFkZGVkIHdpdGggRFJNIHZlcnNpb24gMS44LiAqLworI2RlZmluZSBSQURFT05fUEFSQU1fUkVHSVNURVJfSEFORExFICAgICAgIDcgLyogZm9yIGRybU1hcCgpICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9TVEFUVVNfSEFORExFICAgICAgICAgOAorI2RlZmluZSBSQURFT05fUEFSQU1fU0FSRUFfSEFORExFICAgICAgICAgIDkKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0dBUlRfVEVYX0hBTkRMRSAgICAgICAxMAorI2RlZmluZSBSQURFT05fUEFSQU1fU0NSQVRDSF9PRkZTRVQgICAgICAgIDExCisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZ2V0cGFyYW0geworCWludCBwYXJhbTsKKwl2b2lkIF9fdXNlciAqdmFsdWU7Cit9IGRybV9yYWRlb25fZ2V0cGFyYW1fdDsKKworLyogMS42OiBTZXQgdXAgYSBtZW1vcnkgbWFuYWdlciBmb3IgcmVnaW9ucyBvZiBzaGFyZWQgbWVtb3J5OgorICovCisjZGVmaW5lIFJBREVPTl9NRU1fUkVHSU9OX0dBUlQgMQorI2RlZmluZSBSQURFT05fTUVNX1JFR0lPTl9GQiAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9tZW1fYWxsb2MgeworCWludCByZWdpb247CisJaW50IGFsaWdubWVudDsKKwlpbnQgc2l6ZTsKKwlpbnQgX191c2VyICpyZWdpb25fb2Zmc2V0OwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBmYiBvciBHQVJUICovCit9IGRybV9yYWRlb25fbWVtX2FsbG9jX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fbWVtX2ZyZWUgeworCWludCByZWdpb247CisJaW50IHJlZ2lvbl9vZmZzZXQ7Cit9IGRybV9yYWRlb25fbWVtX2ZyZWVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9tZW1faW5pdF9oZWFwIHsKKwlpbnQgcmVnaW9uOworCWludCBzaXplOworCWludCBzdGFydDsJCit9IGRybV9yYWRlb25fbWVtX2luaXRfaGVhcF90OworCisKKy8qIDEuNjogVXNlcnNwYWNlIGNhbiByZXF1ZXN0ICYgd2FpdCBvbiBpcnEnczoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pcnFfZW1pdCB7CisJaW50IF9fdXNlciAqaXJxX3NlcTsKK30gZHJtX3JhZGVvbl9pcnFfZW1pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2lycV93YWl0IHsKKwlpbnQgaXJxX3NlcTsKK30gZHJtX3JhZGVvbl9pcnFfd2FpdF90OworCisKKy8qIDEuMTA6IENsaWVudHMgdGVsbCB0aGUgRFJNIHdoZXJlIHRoZXkgdGhpbmsgdGhlIGZyYW1lYnVmZmVyIGlzIGxvY2F0ZWQgaW4KKyAqIHRoZSBjYXJkJ3MgYWRkcmVzcyBzcGFjZSwgdmlhIGEgbmV3IGdlbmVyaWMgaW9jdGwgdG8gc2V0IHBhcmFtZXRlcnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3NldHBhcmFtIHsKKwl1bnNpZ25lZCBpbnQgcGFyYW07CisJaW50NjRfdCAgICAgIHZhbHVlOworfSBkcm1fcmFkZW9uX3NldHBhcmFtX3Q7CisKKyNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX0ZCX0xPQ0FUSU9OICAgIDEJLyogZGV0ZXJtaW5lZCBmcmFtZWJ1ZmZlciBsb2NhdGlvbiAqLworI2RlZmluZSBSQURFT05fU0VUUEFSQU1fU1dJVENIX1RJTElORyAgMgkvKiBlbmFibGUvZGlzYWJsZSBjb2xvciB0aWxpbmcgKi8KKworLyogMS4xNDogQ2xpZW50cyBjYW4gYWxsb2NhdGUvZnJlZSBhIHN1cmZhY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jIHsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9IGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZSB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7Cit9IGRybV9yYWRlb25fc3VyZmFjZV9mcmVlX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk4M2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qKgorICogXGZpbGUgcmFkZW9uX2Rydi5jCisgKiBBVEkgUmFkZW9uIGRyaXZlcgorICoKKyAqIFxhdXRob3IgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBTdW5ueXZhbGUsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitzdGF0aWMgaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKK3sKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJcmFkZW9uX1BDSV9JRFMKK307CisKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IHJhZGVvbl9pb2N0bHNbXTsKK2V4dGVybiBpbnQgcmFkZW9uX21heF9pb2N0bDsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfUENJX0RNQSB8IERSSVZFUl9TRyB8IERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0lSUV9WQkwsCisJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX3JhZGVvbl9idWZfcHJpdl90KSwKKwkucHJlaW5pdCA9IHJhZGVvbl9kcml2ZXJfcHJlaW5pdCwKKwkucG9zdGNsZWFudXAgPSByYWRlb25fZHJpdmVyX3Bvc3RjbGVhbnVwLAorCS5wcmVyZWxlYXNlID0gcmFkZW9uX2RyaXZlcl9wcmVyZWxlYXNlLAorCS5wcmV0YWtlZG93biA9IHJhZGVvbl9kcml2ZXJfcHJldGFrZWRvd24sCisJLm9wZW5faGVscGVyID0gcmFkZW9uX2RyaXZlcl9vcGVuX2hlbHBlciwKKwkudmJsYW5rX3dhaXQgPSByYWRlb25fZHJpdmVyX3ZibGFua193YWl0LAorCS5pcnFfcHJlaW5zdGFsbCA9IHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCisJLmlycV9wb3N0aW5zdGFsbCA9IHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAorCS5pcnFfdW5pbnN0YWxsID0gcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsLAorCS5pcnFfaGFuZGxlciA9IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIsCisJLmZyZWVfZmlscF9wcml2ID0gcmFkZW9uX2RyaXZlcl9mcmVlX2ZpbHBfcHJpdiwKKwkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAorCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAorCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAorCS52ZXJzaW9uID0gdmVyc2lvbiwKKwkuaW9jdGxzID0gcmFkZW9uX2lvY3RscywKKwkuZG1hX2lvY3RsID0gcmFkZW9uX2NwX2J1ZmZlcnMsCisJLmZvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9IGRybV9vcGVuLAorCQkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCQkuaW9jdGwgPSBkcm1faW9jdGwsCisJCS5tbWFwID0gZHJtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorCX0sCisJLnBjaV9kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCisJCS5pZF90YWJsZSAgICAgID0gcGNpaWRsaXN0LAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJhZGVvbl9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSByYWRlb25fbWF4X2lvY3RsOworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJhZGVvbl9leGl0KHZvaWQpCit7CisJZHJtX2V4aXQoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJhZGVvbl9pbml0KTsKK21vZHVsZV9leGl0KHJhZGVvbl9leGl0KTsKKworTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOworTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzNzA5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCkBAIC0wLDAgKzEsMTA0NCBAQAorLyogcmFkZW9uX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciByYWRlb24gZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKi8KKworI2lmbmRlZiBfX1JBREVPTl9EUlZfSF9fCisjZGVmaW5lIF9fUkFERU9OX0RSVl9IX18KKworLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgorICovCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIkdhcmV0aCBIdWdoZXMsIEtlaXRoIFdoaXR3ZWxsLCBvdGhlcnMuIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkicmFkZW9uIgorI2RlZmluZSBEUklWRVJfREVTQwkJIkFUSSBSYWRlb24iCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNTAzMTEiCisKKy8qIEludGVyZmFjZSBoaXN0b3J5OgorICoKKyAqIDEuMSAtID8/CisgKiAxLjIgLSBBZGQgdmVydGV4MiBpb2N0bCAoa2VpdGgpCisgKiAgICAgLSBBZGQgc3RlbmNpbCBjYXBhYmlsaXR5IHRvIGNsZWFyIGlvY3RsIChnYXJldGgsIGtlaXRoKQorICogICAgIC0gSW5jcmVhc2UgTUFYX1RFWFRVUkVfTEVWRUxTIChicmlhbikKKyAqIDEuMyAtIEFkZCBjbWRidWYgaW9jdGwgKGtlaXRoKQorICogICAgIC0gQWRkIHN1cHBvcnQgZm9yIG5ldyByYWRlb24gcGFja2V0cyAoa2VpdGgpCisgKiAgICAgLSBBZGQgZ2V0cGFyYW0gaW9jdGwgKGtlaXRoKQorICogICAgIC0gQWRkIGZsaXAtYnVmZmVycyBpb2N0bCwgZGVwcmVjYXRlIGZ1bGxzY3JlZW4gZm9vIChrZWl0aCkuCisgKiAxLjQgLSBBZGQgc2NyYXRjaCByZWdpc3RlcnMgdG8gZ2V0X3BhcmFtIGlvY3RsLgorICogMS41IC0gQWRkIHIyMDAgcGFja2V0cyB0byBjbWRidWYgaW9jdGwKKyAqICAgICAtIEFkZCByMjAwIGZ1bmN0aW9uIHRvIGluaXQgaW9jdGwKKyAqICAgICAtIEFkZCAnc2NhbGFyMicgaW5zdHJ1Y3Rpb24gdG8gY21kYnVmCisgKiAxLjYgLSBBZGQgc3RhdGljIEdBUlQgbWVtb3J5IG1hbmFnZXIKKyAqICAgICAgIEFkZCBpcnEgaGFuZGxlciAod29uJ3QgYmUgdHVybmVkIG9uIHVubGVzcyBYIHNlcnZlciBrbm93cyB0bykKKyAqICAgICAgIEFkZCBpcnEgaW9jdGxzIGFuZCBpcnFfYWN0aXZlIGdldHBhcmFtLgorICogICAgICAgQWRkIHdhaXQgY29tbWFuZCBmb3IgY21kYnVmIGlvY3RsCisgKiAgICAgICBBZGQgR0FSVCBvZmZzZXQgcXVlcnkgZm9yIGdldHBhcmFtCisgKiAxLjcgLSBBZGQgc3VwcG9ydCBmb3IgY3ViZSBtYXAgcmVnaXN0ZXJzOiBSMjAwX1BQX0NVQklDX0ZBQ0VTX1swLi41XQorICogICAgICAgYW5kIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxX1swLi41XS4KKyAqICAgICAgIEFkZGVkIHBhY2tldHMgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTX1swLi41XSBhbmQKKyAqICAgICAgIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1swLi41XS4gIChicmlhbikKKyAqIDEuOCAtIFJlbW92ZSBuZWVkIHRvIGNhbGwgY2xlYW51cCBpb2N0bHMgb24gbGFzdCBjbGllbnQgZXhpdCAoa2VpdGgpCisgKiAgICAgICBBZGQgJ0dFVCcgcXVlcmllcyBmb3Igc3RhcnRpbmcgYWRkaXRpb25hbCBjbGllbnRzIG9uIGRpZmZlcmVudCBWVCdzLgorICogMS45IC0gQWRkIERSTV9JT0NUTF9SQURFT05fQ1BfUkVTVU1FIGlvY3RsLgorICogICAgICAgQWRkIHRleHR1cmUgcmVjdGFuZ2xlIHN1cHBvcnQgZm9yIHIxMDAuCisgKiAxLjEwLSBBZGQgU0VUUEFSQU0gaW9jdGw7IGZpcnN0IHBhcmFtZXRlciB0byBzZXQgaXMgRkJfTE9DQVRJT04sIHdoaWNoCisgKiAgICAgICBjbGllbnRzIHVzZSB0byB0ZWxsIHRoZSBEUk0gd2hlcmUgdGhleSB0aGluayB0aGUgZnJhbWVidWZmZXIgaXMgCisgKiAgICAgICBsb2NhdGVkIGluIHRoZSBjYXJkJ3MgYWRkcmVzcyBzcGFjZQorICogMS4xMS0gQWRkIHBhY2tldCBSMjAwX0VNSVRfUkIzRF9CTEVORENPTE9SIHRvIHN1cHBvcnQgR0xfRVhUX2JsZW5kX2NvbG9yCisgKiAgICAgICBhbmQgR0xfRVhUX2JsZW5kX1tmdW5jfGVxdWF0aW9uXV9zZXBhcmF0ZSBvbiByMjAwCisgKiAxLjEyLSBBZGQgUjMwMCBDUCBtaWNyb2NvZGUgc3VwcG9ydCAtIHRoaXMganVzdCBsb2FkcyB0aGUgQ1Agb24gcjMwMAorICogICAgICAgKE5vIDNEIHN1cHBvcnQgeWV0IC0ganVzdCBtaWNyb2NvZGUgbG9hZGluZykKKyAqIDEuMTMtIEFkZCBwYWNrZXQgUjIwMF9FTUlUX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCBmb3IgQVJCX3BvaW50X3BhcmFtZXRlcnMKKyAqICAgICAtIEFkZCBoeXBlcnogc3VwcG9ydCwgYWRkIGh5cGVyeiBmbGFncyB0byBjbGVhciBpb2N0bC4KKyAqIDEuMTQtIEFkZCBzdXBwb3J0IGZvciBjb2xvciB0aWxpbmcKKyAqICAgICAtIEFkZCBSMTAwL1IyMDAgc3VyZmFjZSBhbGxvY2F0aW9uL2ZyZWUgc3VwcG9ydAorICogMS4xNS0gQWRkIHN1cHBvcnQgZm9yIHRleHR1cmUgbWljcm8gdGlsaW5nCisgKiAgICAgLSBBZGQgc3VwcG9ydCBmb3IgcjEwMCBjdWJlIG1hcHMKKyAqIDEuMTYtIEFkZCBSMjAwX0VNSVRfUFBfVFJJX1BFUkZfQ05UTCBwYWNrZXQgdG8gc3VwcG9ydCBicmlsaW5lYXIKKyAqICAgICAgIHRleHR1cmUgZmlsdGVyaW5nIG9uIHIyMDAKKyAqLworI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkxNgorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCisKKyNkZWZpbmUgR0VUX1JJTkdfSEVBRChkZXZfcHJpdikJCURSTV9SRUFEMzIoICAoZGV2X3ByaXYpLT5yaW5nX3JwdHIsIDAgKQorI2RlZmluZSBTRVRfUklOR19IRUFEKGRldl9wcml2LHZhbCkJRFJNX1dSSVRFMzIoIChkZXZfcHJpdiktPnJpbmdfcnB0ciwgMCwgKHZhbCkgKQorCisvKgorICogUmFkZW9uIGNoaXAgZmFtaWxpZXMKKyAqLworZW51bSByYWRlb25fZmFtaWx5IHsKKwlDSElQX1IxMDAsCisJQ0hJUF9SUzEwMCwKKwlDSElQX1JWMTAwLAorCUNISVBfUjIwMCwKKwlDSElQX1JWMjAwLAorCUNISVBfUlMyMDAsCisJQ0hJUF9SMjUwLAorCUNISVBfUlMyNTAsCisJQ0hJUF9SVjI1MCwKKwlDSElQX1JWMjgwLAorCUNISVBfUjMwMCwKKwlDSElQX1JTMzAwLAorCUNISVBfUlYzNTAsCisJQ0hJUF9MQVNULAorfTsKKworZW51bSByYWRlb25fY3BfbWljcm9jb2RlX3ZlcnNpb24geworCVVDT0RFX1IxMDAsCisJVUNPREVfUjIwMCwKKwlVQ09ERV9SMzAwLAorfTsKKworLyoKKyAqIENoaXAgZmxhZ3MKKyAqLworZW51bSByYWRlb25fY2hpcF9mbGFncyB7CisJQ0hJUF9GQU1JTFlfTUFTSyA9IDB4MDAwMGZmZmZVTCwKKwlDSElQX0ZMQUdTX01BU0sgPSAweGZmZmYwMDAwVUwsCisJQ0hJUF9JU19NT0JJTElUWSA9IDB4MDAwMTAwMDBVTCwKKwlDSElQX0lTX0lHUCA9IDB4MDAwMjAwMDBVTCwKKwlDSElQX1NJTkdMRV9DUlRDID0gMHgwMDA0MDAwMFVMLAorCUNISVBfSVNfQUdQID0gMHgwMDA4MDAwMFVMLAorCUNISVBfSEFTX0hJRVJaID0gMHgwMDEwMDAwMFVMLCAKK307CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZnJlZWxpc3QgeworICAgCXVuc2lnbmVkIGludCBhZ2U7CisgICAJZHJtX2J1Zl90ICpidWY7CisgICAJc3RydWN0IGRybV9yYWRlb25fZnJlZWxpc3QgKm5leHQ7CisgICAJc3RydWN0IGRybV9yYWRlb25fZnJlZWxpc3QgKnByZXY7Cit9IGRybV9yYWRlb25fZnJlZWxpc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9yaW5nX2J1ZmZlciB7CisJdTMyICpzdGFydDsKKwl1MzIgKmVuZDsKKwlpbnQgc2l6ZTsKKwlpbnQgc2l6ZV9sMnF3OworCisJdTMyIHRhaWw7CisJdTMyIHRhaWxfbWFzazsKKwlpbnQgc3BhY2U7CisKKwlpbnQgaGlnaF9tYXJrOworfSBkcm1fcmFkZW9uX3JpbmdfYnVmZmVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZGVwdGhfY2xlYXJfdCB7CisJdTMyIHJiM2RfY250bDsKKwl1MzIgcmIzZF96c3RlbmNpbGNudGw7CisJdTMyIHNlX2NudGw7Cit9IGRybV9yYWRlb25fZGVwdGhfY2xlYXJfdDsKKworc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzIHsKKwlpbnQ2NF90IHJhZGVvbl9mYl9kZWx0YTsKK307CisKK3N0cnVjdCBtZW1fYmxvY2sgeworCXN0cnVjdCBtZW1fYmxvY2sgKm5leHQ7CisJc3RydWN0IG1lbV9ibG9jayAqcHJldjsKKwlpbnQgc3RhcnQ7CisJaW50IHNpemU7CisJRFJNRklMRSBmaWxwOwkJLyogMDogZnJlZSwgLTE6IGhlYXAsIG90aGVyOiByZWFsIGZpbGVzICovCit9OworCitzdHJ1Y3QgcmFkZW9uX3N1cmZhY2UgeworCWludCByZWZjb3VudDsKKwl1MzIgbG93ZXI7CisJdTMyIHVwcGVyOworCXUzMiBmbGFnczsKK307CisKK3N0cnVjdCByYWRlb25fdmlydF9zdXJmYWNlIHsKKwlpbnQgc3VyZmFjZV9pbmRleDsKKwl1MzIgbG93ZXI7CisJdTMyIHVwcGVyOworCXUzMiBmbGFnczsKKwlEUk1GSUxFIGZpbHA7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3ByaXZhdGUgeworCWRybV9yYWRlb25fcmluZ19idWZmZXJfdCByaW5nOworCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdjsKKworCXUzMiBmYl9sb2NhdGlvbjsKKworCWludCBnYXJ0X3NpemU7CisJdTMyIGdhcnRfdm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBnYXJ0X2J1ZmZlcnNfb2Zmc2V0OworCisJaW50IGNwX21vZGU7CisJaW50IGNwX3J1bm5pbmc7CisKKyAgIAlkcm1fcmFkZW9uX2ZyZWVsaXN0X3QgKmhlYWQ7CisgICAJZHJtX3JhZGVvbl9mcmVlbGlzdF90ICp0YWlsOworCWludCBsYXN0X2J1ZjsKKwl2b2xhdGlsZSB1MzIgKnNjcmF0Y2g7CisJaW50IHdyaXRlYmFja193b3JrczsKKworCWludCB1c2VjX3RpbWVvdXQ7CisKKwlpbnQgbWljcm9jb2RlX3ZlcnNpb247CisKKwlpbnQgaXNfcGNpOworCXVuc2lnbmVkIGxvbmcgcGh5c19wY2lfZ2FydDsKKwlkbWFfYWRkcl90IGJ1c19wY2lfZ2FydDsKKworCXN0cnVjdCB7CisJCXUzMiBib3hlczsKKwkJaW50IGZyZWVsaXN0X3RpbWVvdXRzOworCQlpbnQgZnJlZWxpc3RfbG9vcHM7CisJCWludCByZXF1ZXN0ZWRfYnVmczsKKwkJaW50IGxhc3RfZnJhbWVfcmVhZHM7CisJCWludCBsYXN0X2NsZWFyX3JlYWRzOworCQlpbnQgY2xlYXJzOworCQlpbnQgdGV4dHVyZV91cGxvYWRzOworCX0gc3RhdHM7CisKKwlpbnQgZG9fYm94ZXM7CisJaW50IHBhZ2VfZmxpcHBpbmc7CisJaW50IGN1cnJlbnRfcGFnZTsKKworCXUzMiBjb2xvcl9mbXQ7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0OworCXVuc2lnbmVkIGludCBiYWNrX3BpdGNoOworCisJdTMyIGRlcHRoX2ZtdDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0OworCXVuc2lnbmVkIGludCBkZXB0aF9waXRjaDsKKworCXUzMiBmcm9udF9waXRjaF9vZmZzZXQ7CisJdTMyIGJhY2tfcGl0Y2hfb2Zmc2V0OworCXUzMiBkZXB0aF9waXRjaF9vZmZzZXQ7CisKKwlkcm1fcmFkZW9uX2RlcHRoX2NsZWFyX3QgZGVwdGhfY2xlYXI7CisJCisJdW5zaWduZWQgbG9uZyBmYl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJpbmdfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcmluZ19ycHRyX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZ2FydF90ZXh0dXJlc19vZmZzZXQ7CisKKwlkcm1fbG9jYWxfbWFwX3QgKnNhcmVhOworCWRybV9sb2NhbF9tYXBfdCAqbW1pbzsKKwlkcm1fbG9jYWxfbWFwX3QgKmNwX3Jpbmc7CisJZHJtX2xvY2FsX21hcF90ICpyaW5nX3JwdHI7CisJZHJtX2xvY2FsX21hcF90ICpnYXJ0X3RleHR1cmVzOworCisJc3RydWN0IG1lbV9ibG9jayAqZ2FydF9oZWFwOworCXN0cnVjdCBtZW1fYmxvY2sgKmZiX2hlYXA7CisKKwkvKiBTVyBpbnRlcnJ1cHQgKi8KKyAgIAl3YWl0X3F1ZXVlX2hlYWRfdCBzd2lfcXVldWU7CisgICAJYXRvbWljX3Qgc3dpX2VtaXR0ZWQ7CisKKwlzdHJ1Y3QgcmFkZW9uX3N1cmZhY2Ugc3VyZmFjZXNbUkFERU9OX01BWF9TVVJGQUNFU107CisJc3RydWN0IHJhZGVvbl92aXJ0X3N1cmZhY2UgdmlydF9zdXJmYWNlc1syKlJBREVPTl9NQVhfU1VSRkFDRVNdOworCisJLyogc3RhcnRpbmcgZnJvbSBoZXJlIG9uLCBkYXRhIGlzIHByZXNlcnZlZCBhY2Nyb3NzIGFuIG9wZW4gKi8KKwl1aW50MzJfdCBmbGFnczsJCS8qIHNlZSByYWRlb25fY2hpcF9mbGFncyAqLworfSBkcm1fcmFkZW9uX3ByaXZhdGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9idWZfcHJpdiB7CisJdTMyIGFnZTsKK30gZHJtX3JhZGVvbl9idWZfcHJpdl90OworCisJCQkJLyogcmFkZW9uX2NwLmMgKi8KK2V4dGVybiBpbnQgcmFkZW9uX2NwX2luaXQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9jcF9zdGFydCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcmFkZW9uX2NwX3N0b3AoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9jcF9yZXNldCggRFJNX0lPQ1RMX0FSR1MgKTsKK2V4dGVybiBpbnQgcmFkZW9uX2NwX2lkbGUoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9jcF9yZXN1bWUoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9lbmdpbmVfcmVzZXQoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9mdWxsc2NyZWVuKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fY3BfYnVmZmVycyggRFJNX0lPQ1RMX0FSR1MgKTsKKworZXh0ZXJuIHZvaWQgcmFkZW9uX2ZyZWVsaXN0X3Jlc2V0KCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIGRybV9idWZfdCAqcmFkZW9uX2ZyZWVsaXN0X2dldCggZHJtX2RldmljZV90ICpkZXYgKTsKKworZXh0ZXJuIGludCByYWRlb25fd2FpdF9yaW5nKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBuICk7CisKK2V4dGVybiBpbnQgcmFkZW9uX2RvX2NwX2lkbGUoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApOworCitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfcHJlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKworZXh0ZXJuIGludCByYWRlb25fbWVtX2FsbG9jKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25fbWVtX2ZyZWUoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHJhZGVvbl9tZW1faW5pdF9oZWFwKCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIHZvaWQgcmFkZW9uX21lbV90YWtlZG93biggc3RydWN0IG1lbV9ibG9jayAqKmhlYXAgKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9tZW1fcmVsZWFzZSggRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwICk7CisKKwkJCQkvKiByYWRlb25faXJxLmMgKi8KK2V4dGVybiBpbnQgcmFkZW9uX2lycV9lbWl0KCBEUk1fSU9DVExfQVJHUyApOworZXh0ZXJuIGludCByYWRlb25faXJxX3dhaXQoIERSTV9JT0NUTF9BUkdTICk7CisKK2V4dGVybiB2b2lkIHJhZGVvbl9kb19yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaXJxcmV0dXJuX3QgcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICk7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9vcGVuX2hlbHBlcihkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZpbGVfdCAqZmlscF9wcml2KTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfZnJlZV9maWxwX3ByaXYoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKmZpbHBfcHJpdik7CisKK2V4dGVybiBpbnQgcmFkZW9uX3ByZWluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKTsKK2V4dGVybiBpbnQgcmFkZW9uX3Bvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICk7CitleHRlcm4gaW50IHJhZGVvbl9wb3N0Y2xlYW51cCggc3RydWN0IGRybV9kZXZpY2UgKmRldiApOworCisvKiBGbGFncyBmb3Igc3RhdHMuYm94ZXMKKyAqLworI2RlZmluZSBSQURFT05fQk9YX0RNQV9JRExFICAgICAgMHgxCisjZGVmaW5lIFJBREVPTl9CT1hfUklOR19GVUxMICAgICAweDIKKyNkZWZpbmUgUkFERU9OX0JPWF9GTElQICAgICAgICAgIDB4NAorI2RlZmluZSBSQURFT05fQk9YX1dBSVRfSURMRSAgICAgMHg4CisjZGVmaW5lIFJBREVPTl9CT1hfVEVYVFVSRV9MT0FEICAweDEwCisKKworCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucywgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyBhbmQgZHJtQWRkTWFwIGNvbnN0YW50cworICogZm9yIFJhZGVvbiBrZXJuZWwgZHJpdmVyLgorICovCisKKyNkZWZpbmUgUkFERU9OX0FHUF9DT01NQU5ECQkweDBmNjAKKyNkZWZpbmUgUkFERU9OX0FVWF9TQ0lTU09SX0NOVEwJCTB4MjZmMAorIwlkZWZpbmUgUkFERU9OX0VYQ0xVU0lWRV9TQ0lTU09SXzAJKDEgPDwgMjQpCisjCWRlZmluZSBSQURFT05fRVhDTFVTSVZFX1NDSVNTT1JfMQkoMSA8PCAyNSkKKyMJZGVmaW5lIFJBREVPTl9FWENMVVNJVkVfU0NJU1NPUl8yCSgxIDw8IDI2KQorIwlkZWZpbmUgUkFERU9OX1NDSVNTT1JfMF9FTkFCTEUJCSgxIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX1NDSVNTT1JfMV9FTkFCTEUJCSgxIDw8IDI5KQorIwlkZWZpbmUgUkFERU9OX1NDSVNTT1JfMl9FTkFCTEUJCSgxIDw8IDMwKQorCisjZGVmaW5lIFJBREVPTl9CVVNfQ05UTAkJCTB4MDAzMAorIwlkZWZpbmUgUkFERU9OX0JVU19NQVNURVJfRElTCQkoMSA8PCA2KQorCisjZGVmaW5lIFJBREVPTl9DTE9DS19DTlRMX0RBVEEJCTB4MDAwYworIwlkZWZpbmUgUkFERU9OX1BMTF9XUl9FTgkJCSgxIDw8IDcpCisjZGVmaW5lIFJBREVPTl9DTE9DS19DTlRMX0lOREVYCQkweDAwMDgKKyNkZWZpbmUgUkFERU9OX0NPTkZJR19BUEVSX1NJWkUJCTB4MDEwOAorI2RlZmluZSBSQURFT05fQ1JUQ19PRkZTRVQJCTB4MDIyNAorI2RlZmluZSBSQURFT05fQ1JUQ19PRkZTRVRfQ05UTAkJMHgwMjI4CisjCWRlZmluZSBSQURFT05fQ1JUQ19USUxFX0VOCQkoMSA8PCAxNSkKKyMJZGVmaW5lIFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwJKDEgPDwgMTYpCisjZGVmaW5lIFJBREVPTl9DUlRDMl9PRkZTRVQJCTB4MDMyNAorI2RlZmluZSBSQURFT05fQ1JUQzJfT0ZGU0VUX0NOVEwJMHgwMzI4CisKKyNkZWZpbmUgUkFERU9OX1JCM0RfQ09MT1JPRkZTRVQJCTB4MWM0MAorI2RlZmluZSBSQURFT05fUkIzRF9DT0xPUlBJVENICQkweDFjNDgKKworI2RlZmluZSBSQURFT05fRFBfR1VJX01BU1RFUl9DTlRMCTB4MTQ2YworIwlkZWZpbmUgUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMCSgxIDw8IDEpCisjCWRlZmluZSBSQURFT05fR01DX0JSVVNIX1NPTElEX0NPTE9SCSgxMyA8PCA0KQorIwlkZWZpbmUgUkFERU9OX0dNQ19CUlVTSF9OT05FCQkoMTUgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfRFNUXzE2QlBQCQkoNCA8PCA4KQorIwlkZWZpbmUgUkFERU9OX0dNQ19EU1RfMjRCUFAJCSg1IDw8IDgpCisjCWRlZmluZSBSQURFT05fR01DX0RTVF8zMkJQUAkJKDYgPDwgOCkKKyMJZGVmaW5lIFJBREVPTl9HTUNfRFNUX0RBVEFUWVBFX1NISUZUCTgKKyMJZGVmaW5lIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SCSgzIDw8IDEyKQorIwlkZWZpbmUgUkFERU9OX0RQX1NSQ19TT1VSQ0VfTUVNT1JZCSgyIDw8IDI0KQorIwlkZWZpbmUgUkFERU9OX0RQX1NSQ19TT1VSQ0VfSE9TVF9EQVRBCSgzIDw8IDI0KQorIwlkZWZpbmUgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTCSgxIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0dNQ19XUl9NU0tfRElTCQkoMSA8PCAzMCkKKyMJZGVmaW5lIFJBREVPTl9ST1AzX1MJCQkweDAwY2MwMDAwCisjCWRlZmluZSBSQURFT05fUk9QM19QCQkJMHgwMGYwMDAwMAorI2RlZmluZSBSQURFT05fRFBfV1JJVEVfTUFTSwkJMHgxNmNjCisjZGVmaW5lIFJBREVPTl9EU1RfUElUQ0hfT0ZGU0VUCQkweDE0MmMKKyNkZWZpbmUgUkFERU9OX0RTVF9QSVRDSF9PRkZTRVRfQwkweDFjODAKKyMJZGVmaW5lIFJBREVPTl9EU1RfVElMRV9MSU5FQVIJCSgwIDw8IDMwKQorIwlkZWZpbmUgUkFERU9OX0RTVF9USUxFX01BQ1JPCQkoMSA8PCAzMCkKKyMJZGVmaW5lIFJBREVPTl9EU1RfVElMRV9NSUNSTwkJKDIgPDwgMzApCisjCWRlZmluZSBSQURFT05fRFNUX1RJTEVfQk9USAkJKDMgPDwgMzApCisKKyNkZWZpbmUgUkFERU9OX1NDUkFUQ0hfUkVHMAkJMHgxNWUwCisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1JFRzEJCTB4MTVlNAorI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUcyCQkweDE1ZTgKKyNkZWZpbmUgUkFERU9OX1NDUkFUQ0hfUkVHMwkJMHgxNWVjCisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX1JFRzQJCTB4MTVmMAorI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUc1CQkweDE1ZjQKKyNkZWZpbmUgUkFERU9OX1NDUkFUQ0hfVU1TSwkJMHgwNzcwCisjZGVmaW5lIFJBREVPTl9TQ1JBVENIX0FERFIJCTB4MDc3NAorCisjZGVmaW5lIFJBREVPTl9TQ1JBVENIT0ZGKCB4ICkJCShSQURFT05fU0NSQVRDSF9SRUdfT0ZGU0VUICsgNCooeCkpCisKKyNkZWZpbmUgR0VUX1NDUkFUQ0goIHggKQkoZGV2X3ByaXYtPndyaXRlYmFja193b3JrcwkJCVwKKwkJCQk/IERSTV9SRUFEMzIoIGRldl9wcml2LT5yaW5nX3JwdHIsIFJBREVPTl9TQ1JBVENIT0ZGKHgpICkgXAorCQkJCTogUkFERU9OX1JFQUQoIFJBREVPTl9TQ1JBVENIX1JFRzAgKyA0Kih4KSApICkKKworCisjZGVmaW5lIFJBREVPTl9HRU5fSU5UX0NOVEwJCTB4MDA0MAorIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX01BU0sJCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fR1VJX0lETEVfSU5UX0VOQUJMRQkoMSA8PCAxOSkKKyMJZGVmaW5lIFJBREVPTl9TV19JTlRfRU5BQkxFCQkoMSA8PCAyNSkKKworI2RlZmluZSBSQURFT05fR0VOX0lOVF9TVEFUVVMJCTB4MDA0NAorIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQJCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fQ1JUQ19WQkxBTktfU1RBVF9BQ0sgICAJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9HVUlfSURMRV9JTlRfVEVTVF9BQ0sgICAgICgxIDw8IDE5KQorIwlkZWZpbmUgUkFERU9OX1NXX0lOVF9URVNUCQkoMSA8PCAyNSkKKyMJZGVmaW5lIFJBREVPTl9TV19JTlRfVEVTVF9BQ0sgICAJKDEgPDwgMjUpCisjCWRlZmluZSBSQURFT05fU1dfSU5UX0ZJUkUJCSgxIDw8IDI2KQorCisjZGVmaW5lIFJBREVPTl9IT1NUX1BBVEhfQ05UTAkJMHgwMTMwCisjCWRlZmluZSBSQURFT05fSERQX1NPRlRfUkVTRVQJCSgxIDw8IDI2KQorIwlkZWZpbmUgUkFERU9OX0hEUF9XQ19USU1FT1VUX01BU0sJKDcgPDwgMjgpCisjCWRlZmluZSBSQURFT05fSERQX1dDX1RJTUVPVVRfMjhCQ0xLCSg3IDw8IDI4KQorCisjZGVmaW5lIFJBREVPTl9JU1lOQ19DTlRMCQkweDE3MjQKKyMJZGVmaW5lIFJBREVPTl9JU1lOQ19BTlkyRF9JRExFM0QJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9JU1lOQ19BTlkzRF9JRExFMkQJKDEgPDwgMSkKKyMJZGVmaW5lIFJBREVPTl9JU1lOQ19UUklHMkRfSURMRTNECSgxIDw8IDIpCisjCWRlZmluZSBSQURFT05fSVNZTkNfVFJJRzNEX0lETEUyRAkoMSA8PCAzKQorIwlkZWZpbmUgUkFERU9OX0lTWU5DX1dBSVRfSURMRUdVSQkoMSA8PCA0KQorIwlkZWZpbmUgUkFERU9OX0lTWU5DX0NQU0NSQVRDSF9JRExFR1VJCSgxIDw8IDUpCisKKyNkZWZpbmUgUkFERU9OX1JCQk1fR1VJQ05UTAkJMHgxNzJjCisjCWRlZmluZSBSQURFT05fSE9TVF9EQVRBX1NXQVBfTk9ORQkoMCA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0hPU1RfREFUQV9TV0FQXzE2QklUCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fSE9TVF9EQVRBX1NXQVBfMzJCSVQJKDIgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9IT1NUX0RBVEFfU1dBUF9IRFcJKDMgPDwgMCkKKworI2RlZmluZSBSQURFT05fTUNfQUdQX0xPQ0FUSU9OCQkweDAxNGMKKyNkZWZpbmUgUkFERU9OX01DX0ZCX0xPQ0FUSU9OCQkweDAxNDgKKyNkZWZpbmUgUkFERU9OX01DTEtfQ05UTAkJMHgwMDEyCisjCWRlZmluZSBSQURFT05fRk9SQ0VPTl9NQ0xLQQkJKDEgPDwgMTYpCisjCWRlZmluZSBSQURFT05fRk9SQ0VPTl9NQ0xLQgkJKDEgPDwgMTcpCisjCWRlZmluZSBSQURFT05fRk9SQ0VPTl9ZQ0xLQQkJKDEgPDwgMTgpCisjCWRlZmluZSBSQURFT05fRk9SQ0VPTl9ZQ0xLQgkJKDEgPDwgMTkpCisjCWRlZmluZSBSQURFT05fRk9SQ0VPTl9NQwkJKDEgPDwgMjApCisjCWRlZmluZSBSQURFT05fRk9SQ0VPTl9BSUMJCSgxIDw8IDIxKQorCisjZGVmaW5lIFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMAkweDFkNDAKKyNkZWZpbmUgUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8xCTB4MWQ0NAorI2RlZmluZSBSQURFT05fUFBfQk9SREVSX0NPTE9SXzIJMHgxZDQ4CisjZGVmaW5lIFJBREVPTl9QUF9DTlRMCQkJMHgxYzM4CisjCWRlZmluZSBSQURFT05fU0NJU1NPUl9FTkFCTEUJCSgxIDw8ICAxKQorI2RlZmluZSBSQURFT05fUFBfTFVNX01BVFJJWAkJMHgxZDAwCisjZGVmaW5lIFJBREVPTl9QUF9NSVNDCQkJMHgxYzE0CisjZGVmaW5lIFJBREVPTl9QUF9ST1RfTUFUUklYXzAJCTB4MWQ1OAorI2RlZmluZSBSQURFT05fUFBfVFhGSUxURVJfMAkJMHgxYzU0CisjZGVmaW5lIFJBREVPTl9QUF9UWE9GRlNFVF8wCQkweDFjNWMKKyNkZWZpbmUgUkFERU9OX1BQX1RYRklMVEVSXzEJCTB4MWM2YworI2RlZmluZSBSQURFT05fUFBfVFhGSUxURVJfMgkJMHgxYzg0CisKKyNkZWZpbmUgUkFERU9OX1JCMkRfRFNUQ0FDSEVfQ1RMU1RBVAkweDM0MmMKKyMJZGVmaW5lIFJBREVPTl9SQjJEX0RDX0ZMVVNICQkoMyA8PCAwKQorIwlkZWZpbmUgUkFERU9OX1JCMkRfRENfRlJFRQkJKDMgPDwgMikKKyMJZGVmaW5lIFJBREVPTl9SQjJEX0RDX0ZMVVNIX0FMTAkJMHhmCisjCWRlZmluZSBSQURFT05fUkIyRF9EQ19CVVNZCQkoMSA8PCAzMSkKKyNkZWZpbmUgUkFERU9OX1JCM0RfQ05UTAkJMHgxYzNjCisjCWRlZmluZSBSQURFT05fQUxQSEFfQkxFTkRfRU5BQkxFCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fUExBTkVfTUFTS19FTkFCTEUJCSgxIDw8IDEpCisjCWRlZmluZSBSQURFT05fRElUSEVSX0VOQUJMRQkJKDEgPDwgMikKKyMJZGVmaW5lIFJBREVPTl9ST1VORF9FTkFCTEUJCSgxIDw8IDMpCisjCWRlZmluZSBSQURFT05fU0NBTEVfRElUSEVSX0VOQUJMRQkoMSA8PCA0KQorIwlkZWZpbmUgUkFERU9OX0RJVEhFUl9JTklUCQkoMSA8PCA1KQorIwlkZWZpbmUgUkFERU9OX1JPUF9FTkFCTEUJCSgxIDw8IDYpCisjCWRlZmluZSBSQURFT05fU1RFTkNJTF9FTkFCTEUJCSgxIDw8IDcpCisjCWRlZmluZSBSQURFT05fWl9FTkFCTEUJCQkoMSA8PCA4KQorIwlkZWZpbmUgUkFERU9OX1pCTE9DSzE2CQkJKDEgPDwgMTUpCisjZGVmaW5lIFJBREVPTl9SQjNEX0RFUFRIT0ZGU0VUCQkweDFjMjQKKyNkZWZpbmUgUkFERU9OX1JCM0RfREVQVEhDTEVBUlZBTFVFCTB4MzIzMAorI2RlZmluZSBSQURFT05fUkIzRF9ERVBUSFBJVENICQkweDFjMjgKKyNkZWZpbmUgUkFERU9OX1JCM0RfUExBTkVNQVNLCQkweDFkODQKKyNkZWZpbmUgUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0sJMHgxZDdjCisjZGVmaW5lIFJBREVPTl9SQjNEX1pDQUNIRV9NT0RFCQkweDMyNTAKKyNkZWZpbmUgUkFERU9OX1JCM0RfWkNBQ0hFX0NUTFNUQVQJMHgzMjU0CisjCWRlZmluZSBSQURFT05fUkIzRF9aQ19GTFVTSAkJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9SQjNEX1pDX0ZSRUUJCSgxIDw8IDIpCisjCWRlZmluZSBSQURFT05fUkIzRF9aQ19GTFVTSF9BTEwJCTB4NQorIwlkZWZpbmUgUkFERU9OX1JCM0RfWkNfQlVTWQkJKDEgPDwgMzEpCisjZGVmaW5lIFJBREVPTl9SQjNEX1pTVEVOQ0lMQ05UTAkweDFjMmMKKyMJZGVmaW5lIFJBREVPTl9aX1RFU1RfTUFTSwkJKDcgPDwgNCkKKyMJZGVmaW5lIFJBREVPTl9aX1RFU1RfQUxXQVlTCQkoNyA8PCA0KQorIwlkZWZpbmUgUkFERU9OX1pfSElFUkFSQ0hZX0VOQUJMRQkoMSA8PCA4KQorIwlkZWZpbmUgUkFERU9OX1NURU5DSUxfVEVTVF9BTFdBWVMJKDcgPDwgMTIpCisjCWRlZmluZSBSQURFT05fU1RFTkNJTF9TX0ZBSUxfUkVQTEFDRQkoMiA8PCAxNikKKyMJZGVmaW5lIFJBREVPTl9TVEVOQ0lMX1pQQVNTX1JFUExBQ0UJKDIgPDwgMjApCisjCWRlZmluZSBSQURFT05fU1RFTkNJTF9aRkFJTF9SRVBMQUNFCSgyIDw8IDI0KQorIwlkZWZpbmUgUkFERU9OX1pfQ09NUFJFU1NJT05fRU5BQkxFCSgxIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX0ZPUkNFX1pfRElSVFkJCSgxIDw8IDI5KQorIwlkZWZpbmUgUkFERU9OX1pfV1JJVEVfRU5BQkxFCQkoMSA8PCAzMCkKKyMJZGVmaW5lIFJBREVPTl9aX0RFQ09NUFJFU1NJT05fRU5BQkxFCSgxIDw8IDMxKQorI2RlZmluZSBSQURFT05fUkJCTV9TT0ZUX1JFU0VUCQkweDAwZjAKKyMJZGVmaW5lIFJBREVPTl9TT0ZUX1JFU0VUX0NQCQkoMSA8PCAgMCkKKyMJZGVmaW5lIFJBREVPTl9TT0ZUX1JFU0VUX0hJCQkoMSA8PCAgMSkKKyMJZGVmaW5lIFJBREVPTl9TT0ZUX1JFU0VUX1NFCQkoMSA8PCAgMikKKyMJZGVmaW5lIFJBREVPTl9TT0ZUX1JFU0VUX1JFCQkoMSA8PCAgMykKKyMJZGVmaW5lIFJBREVPTl9TT0ZUX1JFU0VUX1BQCQkoMSA8PCAgNCkKKyMJZGVmaW5lIFJBREVPTl9TT0ZUX1JFU0VUX0UyCQkoMSA8PCAgNSkKKyMJZGVmaW5lIFJBREVPTl9TT0ZUX1JFU0VUX1JCCQkoMSA8PCAgNikKKyMJZGVmaW5lIFJBREVPTl9TT0ZUX1JFU0VUX0hEUAkJKDEgPDwgIDcpCisjZGVmaW5lIFJBREVPTl9SQkJNX1NUQVRVUwkJMHgwZTQwCisjCWRlZmluZSBSQURFT05fUkJCTV9GSUZPQ05UX01BU0sJCTB4MDA3ZgorIwlkZWZpbmUgUkFERU9OX1JCQk1fQUNUSVZFCQkoMSA8PCAzMSkKKyNkZWZpbmUgUkFERU9OX1JFX0xJTkVfUEFUVEVSTgkJMHgxY2QwCisjZGVmaW5lIFJBREVPTl9SRV9NSVNDCQkJMHgyNmM0CisjZGVmaW5lIFJBREVPTl9SRV9UT1BfTEVGVAkJMHgyNmMwCisjZGVmaW5lIFJBREVPTl9SRV9XSURUSF9IRUlHSFQJCTB4MWM0NAorI2RlZmluZSBSQURFT05fUkVfU1RJUFBMRV9BRERSCQkweDFjYzgKKyNkZWZpbmUgUkFERU9OX1JFX1NUSVBQTEVfREFUQQkJMHgxY2NjCisKKyNkZWZpbmUgUkFERU9OX1NDSVNTT1JfVExfMAkJMHgxY2Q4CisjZGVmaW5lIFJBREVPTl9TQ0lTU09SX0JSXzAJCTB4MWNkYworI2RlZmluZSBSQURFT05fU0NJU1NPUl9UTF8xCQkweDFjZTAKKyNkZWZpbmUgUkFERU9OX1NDSVNTT1JfQlJfMQkJMHgxY2U0CisjZGVmaW5lIFJBREVPTl9TQ0lTU09SX1RMXzIJCTB4MWNlOAorI2RlZmluZSBSQURFT05fU0NJU1NPUl9CUl8yCQkweDFjZWMKKyNkZWZpbmUgUkFERU9OX1NFX0NPT1JEX0ZNVAkJMHgxYzUwCisjZGVmaW5lIFJBREVPTl9TRV9DTlRMCQkJMHgxYzRjCisjCWRlZmluZSBSQURFT05fRkZBQ0VfQ1VMTF9DVwkJKDAgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9CRkFDRV9TT0xJRAkJKDMgPDwgMSkKKyMJZGVmaW5lIFJBREVPTl9GRkFDRV9TT0xJRAkJKDMgPDwgMykKKyMJZGVmaW5lIFJBREVPTl9GTEFUX1NIQURFX1ZUWF9MQVNUCSgzIDw8IDYpCisjCWRlZmluZSBSQURFT05fRElGRlVTRV9TSEFERV9GTEFUCSgxIDw8IDgpCisjCWRlZmluZSBSQURFT05fRElGRlVTRV9TSEFERV9HT1VSQVVECSgyIDw8IDgpCisjCWRlZmluZSBSQURFT05fQUxQSEFfU0hBREVfRkxBVAkJKDEgPDwgMTApCisjCWRlZmluZSBSQURFT05fQUxQSEFfU0hBREVfR09VUkFVRAkoMiA8PCAxMCkKKyMJZGVmaW5lIFJBREVPTl9TUEVDVUxBUl9TSEFERV9GTEFUCSgxIDw8IDEyKQorIwlkZWZpbmUgUkFERU9OX1NQRUNVTEFSX1NIQURFX0dPVVJBVUQJKDIgPDwgMTIpCisjCWRlZmluZSBSQURFT05fRk9HX1NIQURFX0ZMQVQJCSgxIDw8IDE0KQorIwlkZWZpbmUgUkFERU9OX0ZPR19TSEFERV9HT1VSQVVECQkoMiA8PCAxNCkKKyMJZGVmaW5lIFJBREVPTl9WUE9SVF9YWV9YRk9STV9FTkFCTEUJKDEgPDwgMjQpCisjCWRlZmluZSBSQURFT05fVlBPUlRfWl9YRk9STV9FTkFCTEUJKDEgPDwgMjUpCisjCWRlZmluZSBSQURFT05fVlRYX1BJWF9DRU5URVJfT0dMCSgxIDw8IDI3KQorIwlkZWZpbmUgUkFERU9OX1JPVU5EX01PREVfVFJVTkMJCSgwIDw8IDI4KQorIwlkZWZpbmUgUkFERU9OX1JPVU5EX1BSRUNfOFRIX1BJWAkoMSA8PCAzMCkKKyNkZWZpbmUgUkFERU9OX1NFX0NOVExfU1RBVFVTCQkweDIxNDAKKyNkZWZpbmUgUkFERU9OX1NFX0xJTkVfV0lEVEgJCTB4MWRiOAorI2RlZmluZSBSQURFT05fU0VfVlBPUlRfWFNDQUxFCQkweDFkOTgKKyNkZWZpbmUgUkFERU9OX1NFX1pCSUFTX0ZBQ1RPUgkJMHgxZGIwCisjZGVmaW5lIFJBREVPTl9TRV9UQ0xfTUFURVJJQUxfRU1NSVNTSVZFX1JFRCAweDIyMTAKKyNkZWZpbmUgUkFERU9OX1NFX1RDTF9PVVRQVVRfVlRYX0ZNVCAgICAgICAgIDB4MjI1NAorI2RlZmluZSBSQURFT05fU0VfVENMX1ZFQ1RPUl9JTkRYX1JFRyAgICAgICAgMHgyMjAwCisjICAgICAgIGRlZmluZSBSQURFT05fVkVDX0lORFhfT0NUV09SRF9TVFJJREVfU0hJRlQgIDE2CisjICAgICAgIGRlZmluZSBSQURFT05fVkVDX0lORFhfRFdPUkRfQ09VTlRfU0hJRlQgICAgIDI4CisjZGVmaW5lIFJBREVPTl9TRV9UQ0xfVkVDVE9SX0RBVEFfUkVHICAgICAgIDB4MjIwNAorI2RlZmluZSBSQURFT05fU0VfVENMX1NDQUxBUl9JTkRYX1JFRyAgICAgICAweDIyMDgKKyMgICAgICAgZGVmaW5lIFJBREVPTl9TQ0FMX0lORFhfRFdPUkRfU1RSSURFX1NISUZUICAxNgorI2RlZmluZSBSQURFT05fU0VfVENMX1NDQUxBUl9EQVRBX1JFRyAgICAgICAweDIyMEMKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0VfQUNDRVNTX0ZMQUdTCTB4MGJmOAorI2RlZmluZSBSQURFT05fU1VSRkFDRV9BQ0NFU1NfQ0xSCTB4MGJmYworI2RlZmluZSBSQURFT05fU1VSRkFDRV9DTlRMCQkweDBiMDAKKyMJZGVmaW5lIFJBREVPTl9TVVJGX1RSQU5TTEFUSU9OX0RJUwkoMSA8PCA4KQorIwlkZWZpbmUgUkFERU9OX05PTlNVUkZfQVAwX1NXUF9NQVNLCSgzIDw8IDIwKQorIwlkZWZpbmUgUkFERU9OX05PTlNVUkZfQVAwX1NXUF9MSVRUTEUJKDAgPDwgMjApCisjCWRlZmluZSBSQURFT05fTk9OU1VSRl9BUDBfU1dQX0JJRzE2CSgxIDw8IDIwKQorIwlkZWZpbmUgUkFERU9OX05PTlNVUkZfQVAwX1NXUF9CSUczMgkoMiA8PCAyMCkKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMV9TV1BfTUFTSwkoMyA8PCAyMikKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMV9TV1BfTElUVExFCSgwIDw8IDIyKQorIwlkZWZpbmUgUkFERU9OX05PTlNVUkZfQVAxX1NXUF9CSUcxNgkoMSA8PCAyMikKKyMJZGVmaW5lIFJBREVPTl9OT05TVVJGX0FQMV9TV1BfQklHMzIJKDIgPDwgMjIpCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMF9JTkZPCQkweDBiMGMKKyMJZGVmaW5lIFJBREVPTl9TVVJGX1BJVENIU0VMX01BU0sJKDB4MWZmIDw8IDApCisjCWRlZmluZSBSQURFT05fU1VSRl9USUxFX01PREVfTUFTSwkoMyA8PCAxNikKKyMJZGVmaW5lIFJBREVPTl9TVVJGX1RJTEVfTU9ERV9NQUNSTwkoMCA8PCAxNikKKyMJZGVmaW5lIFJBREVPTl9TVVJGX1RJTEVfTU9ERV9NSUNSTwkoMSA8PCAxNikKKyMJZGVmaW5lIFJBREVPTl9TVVJGX1RJTEVfTU9ERV8zMkJJVF9aCSgyIDw8IDE2KQorIwlkZWZpbmUgUkFERU9OX1NVUkZfVElMRV9NT0RFXzE2QklUX1oJKDMgPDwgMTYpCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMF9MT1dFUl9CT1VORAkweDBiMDQKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UwX1VQUEVSX0JPVU5ECTB4MGIwOAorIwlkZWZpbmUgUkFERU9OX1NVUkZfQUREUkVTU19GSVhFRF9NQVNLCSgweDNmZiA8PCAwKQorI2RlZmluZSBSQURFT05fU1VSRkFDRTFfSU5GTwkJMHgwYjFjCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMV9MT1dFUl9CT1VORAkweDBiMTQKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UxX1VQUEVSX0JPVU5ECTB4MGIxOAorI2RlZmluZSBSQURFT05fU1VSRkFDRTJfSU5GTwkJMHgwYjJjCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFMl9MT1dFUl9CT1VORAkweDBiMjQKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UyX1VQUEVSX0JPVU5ECTB4MGIyOAorI2RlZmluZSBSQURFT05fU1VSRkFDRTNfSU5GTwkJMHgwYjNjCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFM19MT1dFUl9CT1VORAkweDBiMzQKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0UzX1VQUEVSX0JPVU5ECTB4MGIzOAorI2RlZmluZSBSQURFT05fU1VSRkFDRTRfSU5GTwkJMHgwYjRjCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFNF9MT1dFUl9CT1VORAkweDBiNDQKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U0X1VQUEVSX0JPVU5ECTB4MGI0OAorI2RlZmluZSBSQURFT05fU1VSRkFDRTVfSU5GTwkJMHgwYjVjCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFNV9MT1dFUl9CT1VORAkweDBiNTQKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U1X1VQUEVSX0JPVU5ECTB4MGI1OAorI2RlZmluZSBSQURFT05fU1VSRkFDRTZfSU5GTwkJMHgwYjZjCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFNl9MT1dFUl9CT1VORAkweDBiNjQKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U2X1VQUEVSX0JPVU5ECTB4MGI2OAorI2RlZmluZSBSQURFT05fU1VSRkFDRTdfSU5GTwkJMHgwYjdjCisjZGVmaW5lIFJBREVPTl9TVVJGQUNFN19MT1dFUl9CT1VORAkweDBiNzQKKyNkZWZpbmUgUkFERU9OX1NVUkZBQ0U3X1VQUEVSX0JPVU5ECTB4MGI3OAorI2RlZmluZSBSQURFT05fU1dfU0VNQVBIT1JFCQkweDAxM2MKKworI2RlZmluZSBSQURFT05fV0FJVF9VTlRJTAkJMHgxNzIwCisjCWRlZmluZSBSQURFT05fV0FJVF9DUlRDX1BGTElQCQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX1dBSVRfMkRfSURMRUNMRUFOCQkoMSA8PCAxNikKKyMJZGVmaW5lIFJBREVPTl9XQUlUXzNEX0lETEVDTEVBTgkJKDEgPDwgMTcpCisjCWRlZmluZSBSQURFT05fV0FJVF9IT1NUX0lETEVDTEVBTgkoMSA8PCAxOCkKKworI2RlZmluZSBSQURFT05fUkIzRF9aTUFTS09GRlNFVAkJMHgzMjM0CisjZGVmaW5lIFJBREVPTl9SQjNEX1pTVEVOQ0lMQ05UTAkweDFjMmMKKyMJZGVmaW5lIFJBREVPTl9ERVBUSF9GT1JNQVRfMTZCSVRfSU5UX1oJKDAgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9ERVBUSF9GT1JNQVRfMjRCSVRfSU5UX1oJKDIgPDwgMCkKKworCisvKiBDUCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkFERU9OX0NQX01FX1JBTV9BRERSCQkweDA3ZDQKKyNkZWZpbmUgUkFERU9OX0NQX01FX1JBTV9SQUREUgkJMHgwN2Q4CisjZGVmaW5lIFJBREVPTl9DUF9NRV9SQU1fREFUQUgJCTB4MDdkYworI2RlZmluZSBSQURFT05fQ1BfTUVfUkFNX0RBVEFMCQkweDA3ZTAKKworI2RlZmluZSBSQURFT05fQ1BfUkJfQkFTRQkJMHgwNzAwCisjZGVmaW5lIFJBREVPTl9DUF9SQl9DTlRMCQkweDA3MDQKKyMJZGVmaW5lIFJBREVPTl9CVUZfU1dBUF8zMkJJVAkJKDIgPDwgMTYpCisjZGVmaW5lIFJBREVPTl9DUF9SQl9SUFRSX0FERFIJCTB4MDcwYworI2RlZmluZSBSQURFT05fQ1BfUkJfUlBUUgkJMHgwNzEwCisjZGVmaW5lIFJBREVPTl9DUF9SQl9XUFRSCQkweDA3MTQKKworI2RlZmluZSBSQURFT05fQ1BfUkJfV1BUUl9ERUxBWQkJMHgwNzE4CisjCWRlZmluZSBSQURFT05fUFJFX1dSSVRFX1RJTUVSX1NISUZUCTAKKyMJZGVmaW5lIFJBREVPTl9QUkVfV1JJVEVfTElNSVRfU0hJRlQJMjMKKworI2RlZmluZSBSQURFT05fQ1BfSUJfQkFTRQkJMHgwNzM4CisKKyNkZWZpbmUgUkFERU9OX0NQX0NTUV9DTlRMCQkweDA3NDAKKyMJZGVmaW5lIFJBREVPTl9DU1FfQ05UX1BSSU1BUllfTUFTSwkoMHhmZiA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0NTUV9QUklESVNfSU5ERElTCQkoMCA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9DU1FfUFJJUElPX0lORERJUwkJKDEgPDwgMjgpCisjCWRlZmluZSBSQURFT05fQ1NRX1BSSUJNX0lORERJUwkJKDIgPDwgMjgpCisjCWRlZmluZSBSQURFT05fQ1NRX1BSSVBJT19JTkRCTQkJKDMgPDwgMjgpCisjCWRlZmluZSBSQURFT05fQ1NRX1BSSUJNX0lOREJNCQkoNCA8PCAyOCkKKyMJZGVmaW5lIFJBREVPTl9DU1FfUFJJUElPX0lORFBJTwkJKDE1IDw8IDI4KQorCisjZGVmaW5lIFJBREVPTl9BSUNfQ05UTAkJCTB4MDFkMAorIwlkZWZpbmUgUkFERU9OX1BDSUdBUlRfVFJBTlNMQVRFX0VOCSgxIDw8IDApCisjZGVmaW5lIFJBREVPTl9BSUNfU1RBVAkJCTB4MDFkNAorI2RlZmluZSBSQURFT05fQUlDX1BUX0JBU0UJCTB4MDFkOAorI2RlZmluZSBSQURFT05fQUlDX0xPX0FERFIJCTB4MDFkYworI2RlZmluZSBSQURFT05fQUlDX0hJX0FERFIJCTB4MDFlMAorI2RlZmluZSBSQURFT05fQUlDX1RMQl9BRERSCQkweDAxZTQKKyNkZWZpbmUgUkFERU9OX0FJQ19UTEJfREFUQQkJMHgwMWU4CisKKy8qIENQIGNvbW1hbmQgcGFja2V0cyAqLworI2RlZmluZSBSQURFT05fQ1BfUEFDS0VUMAkJMHgwMDAwMDAwMAorIwlkZWZpbmUgUkFERU9OX09ORV9SRUdfV1IJCSgxIDw8IDE1KQorI2RlZmluZSBSQURFT05fQ1BfUEFDS0VUMQkJMHg0MDAwMDAwMAorI2RlZmluZSBSQURFT05fQ1BfUEFDS0VUMgkJMHg4MDAwMDAwMAorI2RlZmluZSBSQURFT05fQ1BfUEFDS0VUMwkJMHhDMDAwMDAwMAorIwlkZWZpbmUgUkFERU9OXzNEX1JORFJfR0VOX0lORFhfUFJJTQkweDAwMDAyMzAwCisjCWRlZmluZSBSQURFT05fV0FJVF9GT1JfSURMRQkJMHgwMDAwMjYwMAorIwlkZWZpbmUgUkFERU9OXzNEX0RSQVdfVkJVRgkJMHgwMDAwMjgwMAorIwlkZWZpbmUgUkFERU9OXzNEX0RSQVdfSU1NRAkJMHgwMDAwMjkwMAorIwlkZWZpbmUgUkFERU9OXzNEX0RSQVdfSU5EWAkJMHgwMDAwMkEwMAorIwlkZWZpbmUgUkFERU9OXzNEX0xPQURfVkJQTlRSCQkweDAwMDAyRjAwCisjCWRlZmluZSBSQURFT05fTVBFR19JRENUX01BQ1JPQkxPQ0sJMHgwMDAwMzAwMAorIwlkZWZpbmUgUkFERU9OX01QRUdfSURDVF9NQUNST0JMT0NLX1JFVgkweDAwMDAzMTAwCisjCWRlZmluZSBSQURFT05fM0RfQ0xFQVJfWk1BU0sJCTB4MDAwMDMyMDAKKyMJZGVmaW5lIFJBREVPTl8zRF9DTEVBUl9ISVoJCTB4MDAwMDM3MDAKKyMJZGVmaW5lIFJBREVPTl9DTlRMX0hPU1REQVRBX0JMVAkJMHgwMDAwOTQwMAorIwlkZWZpbmUgUkFERU9OX0NOVExfUEFJTlRfTVVMVEkJCTB4MDAwMDlBMDAKKyMJZGVmaW5lIFJBREVPTl9DTlRMX0JJVEJMVF9NVUxUSQkJMHgwMDAwOUIwMAorIwlkZWZpbmUgUkFERU9OX0NOVExfU0VUX1NDSVNTT1JTCQkweEMwMDAxRTAwCisKKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVF9NQVNLCQkweEMwMDAwMDAwCisjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVRfQ09VTlRfTUFTSwkweDNmZmYwMDAwCisjZGVmaW5lIFJBREVPTl9DUF9QQUNLRVQwX1JFR19NQVNLCTB4MDAwMDA3ZmYKKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDFfUkVHMF9NQVNLCTB4MDAwMDA3ZmYKKyNkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDFfUkVHMV9NQVNLCTB4MDAzZmY4MDAKKworI2RlZmluZSBSQURFT05fVlRYX1pfUFJFU0VOVAkJCSgxIDw8IDMxKQorI2RlZmluZSBSQURFT05fVlRYX1BLQ09MT1JfUFJFU0VOVAkJKDEgPDwgMykKKworI2RlZmluZSBSQURFT05fUFJJTV9UWVBFX05PTkUJCQkoMCA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFX1BPSU5UCQkJKDEgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9MSU5FCQkJKDIgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9MSU5FX1NUUklQCQkoMyA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFX1RSSV9MSVNUCQkoNCA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFX1RSSV9GQU4JCSg1IDw8IDApCisjZGVmaW5lIFJBREVPTl9QUklNX1RZUEVfVFJJX1NUUklQCQkoNiA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFX1RSSV9UWVBFMgkJKDcgPDwgMCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1QJCSg4IDw8IDApCisjZGVmaW5lIFJBREVPTl9QUklNX1RZUEVfM1ZSVF9QT0lOVF9MSVNUCSg5IDw8IDApCisjZGVmaW5lIFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QJCSgxMCA8PCAwKQorI2RlZmluZSBSQURFT05fUFJJTV9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgMHhmCisjZGVmaW5lIFJBREVPTl9QUklNX1dBTEtfSU5ECQkJKDEgPDwgNCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fV0FMS19MSVNUCQkJKDIgPDwgNCkKKyNkZWZpbmUgUkFERU9OX1BSSU1fV0FMS19SSU5HCQkJKDMgPDwgNCkKKyNkZWZpbmUgUkFERU9OX0NPTE9SX09SREVSX0JHUkEJCQkoMCA8PCA2KQorI2RlZmluZSBSQURFT05fQ09MT1JfT1JERVJfUkdCQQkJCSgxIDw8IDYpCisjZGVmaW5lIFJBREVPTl9NQU9TX0VOQUJMRQkJCSgxIDw8IDcpCisjZGVmaW5lIFJBREVPTl9WVFhfRk1UX1IxMjhfTU9ERQkJKDAgPDwgOCkKKyNkZWZpbmUgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUJCSgxIDw8IDgpCisjZGVmaW5lIFJBREVPTl9OVU1fVkVSVElDRVNfU0hJRlQJCTE2CisKKyNkZWZpbmUgUkFERU9OX0NPTE9SX0ZPUk1BVF9DSTgJCTIKKyNkZWZpbmUgUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCMTU1NQkzCisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfUkdCNTY1CTQKKyNkZWZpbmUgUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCODg4OAk2CisjZGVmaW5lIFJBREVPTl9DT0xPUl9GT1JNQVRfUkdCMzMyCTcKKyNkZWZpbmUgUkFERU9OX0NPTE9SX0ZPUk1BVF9SR0I4CTkKKyNkZWZpbmUgUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCNDQ0NAkxNQorCisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9JOAkJMAorI2RlZmluZSBSQURFT05fVFhGT1JNQVRfQUk4OAkJMQorI2RlZmluZSBSQURFT05fVFhGT1JNQVRfUkdCMzMyCQkyCisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9BUkdCMTU1NQkzCisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9SR0I1NjUJCTQKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX0FSR0I0NDQ0CTUKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX0FSR0I4ODg4CTYKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX1JHQkE4ODg4CTcKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX1k4CQk4CisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9WWVVZNDIyICAgICAgICAgMTAKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX1lWWVU0MjIgICAgICAgICAxMQorI2RlZmluZSBSQURFT05fVFhGT1JNQVRfRFhUMSAgICAgICAgICAgIDEyCisjZGVmaW5lIFJBREVPTl9UWEZPUk1BVF9EWFQyMyAgICAgICAgICAgMTQKKyNkZWZpbmUgUkFERU9OX1RYRk9STUFUX0RYVDQ1ICAgICAgICAgICAxNQorCisjZGVmaW5lIFIyMDBfUFBfVFhDQkxFTkRfMCAgICAgICAgICAgICAgICAweDJmMDAKKyNkZWZpbmUgUjIwMF9QUF9UWENCTEVORF8xICAgICAgICAgICAgICAgIDB4MmYxMAorI2RlZmluZSBSMjAwX1BQX1RYQ0JMRU5EXzIgICAgICAgICAgICAgICAgMHgyZjIwCisjZGVmaW5lIFIyMDBfUFBfVFhDQkxFTkRfMyAgICAgICAgICAgICAgICAweDJmMzAKKyNkZWZpbmUgUjIwMF9QUF9UWENCTEVORF80ICAgICAgICAgICAgICAgIDB4MmY0MAorI2RlZmluZSBSMjAwX1BQX1RYQ0JMRU5EXzUgICAgICAgICAgICAgICAgMHgyZjUwCisjZGVmaW5lIFIyMDBfUFBfVFhDQkxFTkRfNiAgICAgICAgICAgICAgICAweDJmNjAKKyNkZWZpbmUgUjIwMF9QUF9UWENCTEVORF83ICAgICAgICAgICAgICAgIDB4MmY3MAorI2RlZmluZSBSMjAwX1NFX1RDTF9MSUdIVF9NT0RFTF9DVExfMCAgICAgMHgyMjY4IAorI2RlZmluZSBSMjAwX1BQX1RGQUNUT1JfMCAgICAgICAgICAgICAgICAgMHgyZWUwCisjZGVmaW5lIFIyMDBfU0VfVlRYX0ZNVF8wICAgICAgICAgICAgICAgICAweDIwODgKKyNkZWZpbmUgUjIwMF9TRV9WQVBfQ05UTCAgICAgICAgICAgICAgICAgIDB4MjA4MAorI2RlZmluZSBSMjAwX1NFX1RDTF9NQVRSSVhfU0VMXzAgICAgICAgICAgMHgyMjMwCisjZGVmaW5lIFIyMDBfU0VfVENMX1RFWF9QUk9DX0NUTF8yICAgICAgICAweDIyYTggCisjZGVmaW5lIFIyMDBfU0VfVENMX1VDUF9WRVJUX0JMRU5EX0NUTCAgICAweDIyYzAgCisjZGVmaW5lIFIyMDBfUFBfVFhGSUxURVJfNSAgICAgICAgICAgICAgICAweDJjYTAgCisjZGVmaW5lIFIyMDBfUFBfVFhGSUxURVJfNCAgICAgICAgICAgICAgICAweDJjODAgCisjZGVmaW5lIFIyMDBfUFBfVFhGSUxURVJfMyAgICAgICAgICAgICAgICAweDJjNjAgCisjZGVmaW5lIFIyMDBfUFBfVFhGSUxURVJfMiAgICAgICAgICAgICAgICAweDJjNDAgCisjZGVmaW5lIFIyMDBfUFBfVFhGSUxURVJfMSAgICAgICAgICAgICAgICAweDJjMjAgCisjZGVmaW5lIFIyMDBfUFBfVFhGSUxURVJfMCAgICAgICAgICAgICAgICAweDJjMDAgCisjZGVmaW5lIFIyMDBfUFBfVFhPRkZTRVRfNSAgICAgICAgICAgICAgICAweDJkNzgKKyNkZWZpbmUgUjIwMF9QUF9UWE9GRlNFVF80ICAgICAgICAgICAgICAgIDB4MmQ2MAorI2RlZmluZSBSMjAwX1BQX1RYT0ZGU0VUXzMgICAgICAgICAgICAgICAgMHgyZDQ4CisjZGVmaW5lIFIyMDBfUFBfVFhPRkZTRVRfMiAgICAgICAgICAgICAgICAweDJkMzAKKyNkZWZpbmUgUjIwMF9QUF9UWE9GRlNFVF8xICAgICAgICAgICAgICAgIDB4MmQxOAorI2RlZmluZSBSMjAwX1BQX1RYT0ZGU0VUXzAgICAgICAgICAgICAgICAgMHgyZDAwCisKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19GQUNFU18wICAgICAgICAgICAgIDB4MmMxOAorI2RlZmluZSBSMjAwX1BQX0NVQklDX0ZBQ0VTXzEgICAgICAgICAgICAgMHgyYzM4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfRkFDRVNfMiAgICAgICAgICAgICAweDJjNTgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19GQUNFU18zICAgICAgICAgICAgIDB4MmM3OAorI2RlZmluZSBSMjAwX1BQX0NVQklDX0ZBQ0VTXzQgICAgICAgICAgICAgMHgyYzk4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfRkFDRVNfNSAgICAgICAgICAgICAweDJjYjgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMCAgICAgICAgIDB4MmQwNAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMl8wICAgICAgICAgMHgyZDA4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YzXzAgICAgICAgICAweDJkMGMKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjRfMCAgICAgICAgIDB4MmQxMAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNV8wICAgICAgICAgMHgyZDE0CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzEgICAgICAgICAweDJkMWMKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjJfMSAgICAgICAgIDB4MmQyMAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GM18xICAgICAgICAgMHgyZDI0CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y0XzEgICAgICAgICAweDJkMjgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjVfMSAgICAgICAgIDB4MmQyYworI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8yICAgICAgICAgMHgyZDM0CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YyXzIgICAgICAgICAweDJkMzgKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjNfMiAgICAgICAgIDB4MmQzYworI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNF8yICAgICAgICAgMHgyZDQwCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y1XzIgICAgICAgICAweDJkNDQKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMyAgICAgICAgIDB4MmQ0YworI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMl8zICAgICAgICAgMHgyZDUwCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YzXzMgICAgICAgICAweDJkNTQKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjRfMyAgICAgICAgIDB4MmQ1OAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNV8zICAgICAgICAgMHgyZDVjCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzQgICAgICAgICAweDJkNjQKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjJfNCAgICAgICAgIDB4MmQ2OAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GM180ICAgICAgICAgMHgyZDZjCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y0XzQgICAgICAgICAweDJkNzAKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjVfNCAgICAgICAgIDB4MmQ3NAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV81ICAgICAgICAgMHgyZDdjCisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YyXzUgICAgICAgICAweDJkODAKKyNkZWZpbmUgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjNfNSAgICAgICAgIDB4MmQ4NAorI2RlZmluZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GNF81ICAgICAgICAgMHgyZDg4CisjZGVmaW5lIFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0Y1XzUgICAgICAgICAweDJkOGMKKworI2RlZmluZSBSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwgICAgICAgICAgMHgyNmYwCisjZGVmaW5lIFIyMDBfU0VfVlRFX0NOVEwgICAgICAgICAgICAgICAgICAweDIwYjAKKyNkZWZpbmUgUjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCAgIDB4MjI1MAorI2RlZmluZSBSMjAwX1BQX1RBTV9ERUJVRzMgICAgICAgICAgICAgICAgMHgyZDljCisjZGVmaW5lIFIyMDBfUFBfQ05UTF9YICAgICAgICAgICAgICAgICAgICAweDJjYzQKKyNkZWZpbmUgUjIwMF9TRV9WQVBfQ05UTF9TVEFUVVMgICAgICAgICAgIDB4MjE0MAorI2RlZmluZSBSMjAwX1JFX1NDSVNTT1JfVExfMCAgICAgICAgICAgICAgMHgxY2Q4CisjZGVmaW5lIFIyMDBfUkVfU0NJU1NPUl9UTF8xICAgICAgICAgICAgICAweDFjZTAKKyNkZWZpbmUgUjIwMF9SRV9TQ0lTU09SX1RMXzIgICAgICAgICAgICAgIDB4MWNlOAorI2RlZmluZSBSMjAwX1JCM0RfREVQVEhYWV9PRkZTRVQgICAgICAgICAgMHgxZDYwIAorI2RlZmluZSBSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwgICAgICAgICAgMHgyNmYwCisjZGVmaW5lIFIyMDBfU0VfVlRYX1NUQVRFX0NOVEwgICAgICAgICAgICAweDIxODAKKyNkZWZpbmUgUjIwMF9SRV9QT0lOVFNJWkUgICAgICAgICAgICAgICAgIDB4MjY0OAorI2RlZmluZSBSMjAwX1NFX1RDTF9JTlBVVF9WVFhfVkVDVE9SX0FERFJfMCAweDIyNTQKKworI2RlZmluZSBSQURFT05fUFBfVEVYX1NJWkVfMCAgICAgICAgICAgICAgICAweDFkMDQgIC8qIE5QT1QgKi8KKyNkZWZpbmUgUkFERU9OX1BQX1RFWF9TSVpFXzEgICAgICAgICAgICAgICAgMHgxZDBjCisjZGVmaW5lIFJBREVPTl9QUF9URVhfU0laRV8yICAgICAgICAgICAgICAgIDB4MWQxNAorCisjZGVmaW5lIFJBREVPTl9QUF9DVUJJQ19GQUNFU18wICAgICAgICAgICAgIDB4MWQyNAorI2RlZmluZSBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMSAgICAgICAgICAgICAweDFkMjgKKyNkZWZpbmUgUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzIgICAgICAgICAgICAgMHgxZDJjCisjZGVmaW5lIFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDBfMCAgICAgICAgIDB4MWRkMAkvKiBiaXRzIFszMTo1XSAqLworI2RlZmluZSBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QxXzAgICAgICAgICAweDFlMDAKKyNkZWZpbmUgUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wICAgICAgICAgMHgxZTE0CisKKyNkZWZpbmUgU0VfVkFQX0NOVExfX1RDTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRV9WQVBfQ05UTF9fRk9SQ0VfV19UT19PTkVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFNFX1ZBUF9DTlRMX19WRl9NQVhfVlRYX05VTV9fU0hJRlQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKKyNkZWZpbmUgU0VfVlRFX0NOVExfX1ZUWF9YWV9GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTRV9WVEVfQ05UTF9fVlRYX1pfRk1UX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNFX1ZUWF9GTVRfMF9fVlRYX1owX1BSRVNFTlRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VfVlRYX0ZNVF8wX19WVFhfVzBfUFJFU0VOVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTRV9WVFhfRk1UXzBfX1ZUWF9DT0xPUl8wX0ZNVF9fU0hJRlQgICAgICAgICAgICAgICAweDAwMDAwMDBiCisjZGVmaW5lIFIyMDBfM0RfRFJBV19JTU1EXzIgICAgICAweEMwMDAzNTAwCisjZGVmaW5lIFIyMDBfU0VfVlRYX0ZNVF8xICAgICAgICAgICAgICAgICAweDIwOGMKKyNkZWZpbmUgUjIwMF9SRV9DTlRMICAgICAgICAgICAgICAgICAgICAgIDB4MWM1MCAKKworI2RlZmluZSBSMjAwX1JCM0RfQkxFTkRDT0xPUiAgICAgICAgICAgICAgMHgzMjE4CisKKyNkZWZpbmUgUjIwMF9TRV9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwgICAgIDB4MjJjNAorCisjZGVmaW5lIFIyMDBfUFBfVFJJX1BFUkYgMHgyY2Y4CisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSBSQURFT05fTUFYX1VTRUNfVElNRU9VVAkJMTAwMDAwCS8qIDEwMCBtcyAqLworCisjZGVmaW5lIFJBREVPTl9MQVNUX0ZSQU1FX1JFRwkJUkFERU9OX1NDUkFUQ0hfUkVHMAorI2RlZmluZSBSQURFT05fTEFTVF9ESVNQQVRDSF9SRUcJUkFERU9OX1NDUkFUQ0hfUkVHMQorI2RlZmluZSBSQURFT05fTEFTVF9DTEVBUl9SRUcJCVJBREVPTl9TQ1JBVENIX1JFRzIKKyNkZWZpbmUgUkFERU9OX0xBU1RfU1dJX1JFRwkJUkFERU9OX1NDUkFUQ0hfUkVHMworI2RlZmluZSBSQURFT05fTEFTVF9ESVNQQVRDSAkJMQorCisjZGVmaW5lIFJBREVPTl9NQVhfVkJfQUdFCQkweDdmZmZmZmZmCisjZGVmaW5lIFJBREVPTl9NQVhfVkJfVkVSVFMJCSgweGZmZmYpCisKKyNkZWZpbmUgUkFERU9OX1JJTkdfSElHSF9NQVJLCQkxMjgKKworI2RlZmluZSBSQURFT05fUkVBRChyZWcpCURSTV9SRUFEMzIoICBkZXZfcHJpdi0+bW1pbywgKHJlZykgKQorI2RlZmluZSBSQURFT05fV1JJVEUocmVnLHZhbCkJRFJNX1dSSVRFMzIoIGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkgKQorI2RlZmluZSBSQURFT05fUkVBRDgocmVnKQlEUk1fUkVBRDgoICBkZXZfcHJpdi0+bW1pbywgKHJlZykgKQorI2RlZmluZSBSQURFT05fV1JJVEU4KHJlZyx2YWwpCURSTV9XUklURTgoIGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkgKQorCisjZGVmaW5lIFJBREVPTl9XUklURV9QTEwoIGFkZHIsIHZhbCApCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCVJBREVPTl9XUklURTgoIFJBREVPTl9DTE9DS19DTlRMX0lOREVYLAkJCQlcCisJCSAgICAgICAoKGFkZHIpICYgMHgxZikgfCBSQURFT05fUExMX1dSX0VOICk7CQlcCisJUkFERU9OX1dSSVRFKCBSQURFT05fQ0xPQ0tfQ05UTF9EQVRBLCAodmFsKSApOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ1BfUEFDS0VUMCggcmVnLCBuICkJCQkJCQlcCisJKFJBREVPTl9DUF9QQUNLRVQwIHwgKChuKSA8PCAxNikgfCAoKHJlZykgPj4gMikpCisjZGVmaW5lIENQX1BBQ0tFVDBfVEFCTEUoIHJlZywgbiApCQkJCQlcCisJKFJBREVPTl9DUF9QQUNLRVQwIHwgUkFERU9OX09ORV9SRUdfV1IgfCAoKG4pIDw8IDE2KSB8ICgocmVnKSA+PiAyKSkKKyNkZWZpbmUgQ1BfUEFDS0VUMSggcmVnMCwgcmVnMSApCQkJCQlcCisJKFJBREVPTl9DUF9QQUNLRVQxIHwgKCgocmVnMSkgPj4gMikgPDwgMTUpIHwgKChyZWcwKSA+PiAyKSkKKyNkZWZpbmUgQ1BfUEFDS0VUMigpCQkJCQkJCVwKKwkoUkFERU9OX0NQX1BBQ0tFVDIpCisjZGVmaW5lIENQX1BBQ0tFVDMoIHBrdCwgbiApCQkJCQkJXAorCShSQURFT05fQ1BfUEFDS0VUMyB8IChwa3QpIHwgKChuKSA8PCAxNikpCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5naW5lIGNvbnRyb2wgaGVscGVyIG1hY3JvcworICovCisKKyNkZWZpbmUgUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpIGRvIHsJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fV0FJVF9VTlRJTCwgMCApICk7CQkJXAorCU9VVF9SSU5HKCAoUkFERU9OX1dBSVRfMkRfSURMRUNMRUFOIHwJCQkJXAorCQkgICBSQURFT05fV0FJVF9IT1NUX0lETEVDTEVBTikgKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKSBkbyB7CQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1dBSVRfVU5USUwsIDAgKSApOwkJCVwKKwlPVVRfUklORyggKFJBREVPTl9XQUlUXzNEX0lETEVDTEVBTiB8CQkJCVwKKwkJICAgUkFERU9OX1dBSVRfSE9TVF9JRExFQ0xFQU4pICk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQURFT05fV0FJVF9VTlRJTF9JRExFKCkgZG8gewkJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fV0FJVF9VTlRJTCwgMCApICk7CQkJXAorCU9VVF9SSU5HKCAoUkFERU9OX1dBSVRfMkRfSURMRUNMRUFOIHwJCQkJXAorCQkgICBSQURFT05fV0FJVF8zRF9JRExFQ0xFQU4gfAkJCQlcCisJCSAgIFJBREVPTl9XQUlUX0hPU1RfSURMRUNMRUFOKSApOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX1dBSVRfVU5USUxfUEFHRV9GTElQUEVEKCkgZG8gewkJCQlcCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9XQUlUX1VOVElMLCAwICkgKTsJCQlcCisJT1VUX1JJTkcoIFJBREVPTl9XQUlUX0NSVENfUEZMSVAgKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQURFT05fRkxVU0hfQ0FDSEUoKSBkbyB7CQkJCQlcCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SQjJEX0RTVENBQ0hFX0NUTFNUQVQsIDAgKSApOwlcCisJT1VUX1JJTkcoIFJBREVPTl9SQjJEX0RDX0ZMVVNIICk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX1BVUkdFX0NBQ0hFKCkgZG8gewkJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkIyRF9EU1RDQUNIRV9DVExTVEFULCAwICkgKTsJXAorCU9VVF9SSU5HKCBSQURFT05fUkIyRF9EQ19GTFVTSF9BTEwgKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQURFT05fRkxVU0hfWkNBQ0hFKCkgZG8gewkJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkIzRF9aQ0FDSEVfQ1RMU1RBVCwgMCApICk7CVwKKwlPVVRfUklORyggUkFERU9OX1JCM0RfWkNfRkxVU0ggKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQURFT05fUFVSR0VfWkNBQ0hFKCkgZG8gewkJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkIzRF9aQ0FDSEVfQ1RMU1RBVCwgMCApICk7CVwKKwlPVVRfUklORyggUkFERU9OX1JCM0RfWkNfRkxVU0hfQUxMICk7CQkJCVwKK30gd2hpbGUgKDApCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTWlzYyBoZWxwZXIgbWFjcm9zCisgKi8KKworLyogUGVyZmJveCBmdW5jdGlvbmFsaXR5IG9ubHkuICAKKyAqLworI2RlZmluZSBSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIShkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX0RNQV9JRExFKSkgewkJXAorCQl1MzIgaGVhZCA9IEdFVF9SSU5HX0hFQUQoIGRldl9wcml2ICk7CQkJXAorCQlpZiAoaGVhZCA9PSBkZXZfcHJpdi0+cmluZy50YWlsKQkJCVwKKwkJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX0RNQV9JRExFOwlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwkJXAorCWlmICggc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA+PSBSQURFT05fTUFYX1ZCX0FHRSApIHsJCVwKKwkJaW50IF9fcmV0ID0gcmFkZW9uX2RvX2NwX2lkbGUoIGRldl9wcml2ICk7CQlcCisJCWlmICggX19yZXQgKSByZXR1cm4gX19yZXQ7CQkJCVwKKwkJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IDA7CQkJCVwKKwkJcmFkZW9uX2ZyZWVsaXN0X3Jlc2V0KCBkZXYgKTsJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkFERU9OX0RJU1BBVENIX0FHRSggYWdlICkgZG8gewkJCQkJXAorCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fTEFTVF9ESVNQQVRDSF9SRUcsIDAgKSApOwkJXAorCU9VVF9SSU5HKCBhZ2UgKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJBREVPTl9GUkFNRV9BR0UoIGFnZSApIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0xBU1RfRlJBTUVfUkVHLCAwICkgKTsJCVwKKwlPVVRfUklORyggYWdlICk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSQURFT05fQ0xFQVJfQUdFKCBhZ2UgKSBkbyB7CQkJCQlcCisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9MQVNUX0NMRUFSX1JFRywgMCApICk7CQlcCisJT1VUX1JJTkcoIGFnZSApOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmluZyBjb250cm9sCisgKi8KKworI2RlZmluZSBSQURFT05fVkVSQk9TRQkwCisKKyNkZWZpbmUgUklOR19MT0NBTFMJaW50IHdyaXRlLCBfbnI7IHVuc2lnbmVkIGludCBtYXNrOyB1MzIgKnJpbmc7CisKKyNkZWZpbmUgQkVHSU5fUklORyggbiApIGRvIHsJCQkJCQlcCisJaWYgKCBSQURFT05fVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiQkVHSU5fUklORyggJWQgKSBpbiAlc1xuIiwJCQlcCisJCQkgICBuLCBfX0ZVTkNUSU9OX18gKTsJCQkJXAorCX0JCQkJCQkJCVwKKwlpZiAoIGRldl9wcml2LT5yaW5nLnNwYWNlIDw9IChuKSAqIHNpemVvZih1MzIpICkgewkJXAorICAgICAgICAgICAgICAgIENPTU1JVF9SSU5HKCk7CQkJCQkJXAorCQlyYWRlb25fd2FpdF9yaW5nKCBkZXZfcHJpdiwgKG4pICogc2l6ZW9mKHUzMikgKTsJXAorCX0JCQkJCQkJCVwKKwlfbnIgPSBuOyBkZXZfcHJpdi0+cmluZy5zcGFjZSAtPSAobikgKiBzaXplb2YodTMyKTsJCVwKKwlyaW5nID0gZGV2X3ByaXYtPnJpbmcuc3RhcnQ7CQkJCQlcCisJd3JpdGUgPSBkZXZfcHJpdi0+cmluZy50YWlsOwkJCQkJXAorCW1hc2sgPSBkZXZfcHJpdi0+cmluZy50YWlsX21hc2s7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQURWQU5DRV9SSU5HKCkgZG8gewkJCQkJCVwKKwlpZiAoIFJBREVPTl9WRVJCT1NFICkgewkJCQkJCVwKKwkJRFJNX0lORk8oICJBRFZBTkNFX1JJTkcoKSB3cj0weCUwNnggdGFpbD0weCUwNnhcbiIsCVwKKwkJCSAgd3JpdGUsIGRldl9wcml2LT5yaW5nLnRhaWwgKTsJCQlcCisJfQkJCQkJCQkJXAorCWlmICgoKGRldl9wcml2LT5yaW5nLnRhaWwgKyBfbnIpICYgbWFzaykgIT0gd3JpdGUpIHsJCVwKKwkJRFJNX0VSUk9SKCAJCQkJCQlcCisJCQkiQURWQU5DRV9SSU5HKCk6IG1pc21hdGNoOiBucjogJXggd3JpdGU6ICV4IGxpbmU6ICVkXG4iLAlcCisJCQkoKGRldl9wcml2LT5yaW5nLnRhaWwgKyBfbnIpICYgbWFzayksCQlcCisJCQl3cml0ZSwgX19MSU5FX18pOwkJCQkJCVwKKwl9IGVsc2UJCQkJCQkJCVwKKwkJZGV2X3ByaXYtPnJpbmcudGFpbCA9IHdyaXRlOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTU1JVF9SSU5HKCkgZG8gewkJCQkJCVwKKwkvKiBGbHVzaCB3cml0ZXMgdG8gcmluZyAqLwkJCQkJXAorCURSTV9NRU1PUllCQVJSSUVSKCk7CQkJCQkJXAorCUdFVF9SSU5HX0hFQUQoIGRldl9wcml2ICk7CQkJCQlcCisJUkFERU9OX1dSSVRFKCBSQURFT05fQ1BfUkJfV1BUUiwgZGV2X3ByaXYtPnJpbmcudGFpbCApOwkJXAorCS8qIHJlYWQgZnJvbSBQQ0kgYnVzIHRvIGVuc3VyZSBjb3JyZWN0IHBvc3RpbmcgKi8JCVwKKwlSQURFT05fUkVBRCggUkFERU9OX0NQX1JCX1JQVFIgKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBPVVRfUklORyggeCApIGRvIHsJCQkJCQlcCisJaWYgKCBSQURFT05fVkVSQk9TRSApIHsJCQkJCQlcCisJCURSTV9JTkZPKCAiICAgT1VUX1JJTkcoIDB4JTA4eCApIGF0IDB4JXhcbiIsCQlcCisJCQkgICAodW5zaWduZWQgaW50KSh4KSwgd3JpdGUgKTsJCQlcCisJfQkJCQkJCQkJXAorCXJpbmdbd3JpdGUrK10gPSAoeCk7CQkJCQkJXAorCXdyaXRlICY9IG1hc2s7CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgT1VUX1JJTkdfUkVHKCByZWcsIHZhbCApIGRvIHsJCQkJCVwKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggcmVnLCAwICkgKTsJCQkJXAorCU9VVF9SSU5HKCB2YWwgKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgT1VUX1JJTkdfVEFCTEUoIHRhYiwgc3ogKSBkbyB7CQkJCQlcCisJaW50IF9zaXplID0gKHN6KTsJCQkJCVwKKwlpbnQgKl90YWIgPSAoaW50ICopKHRhYik7CQkJCVwKKwkJCQkJCQkJXAorCWlmICh3cml0ZSArIF9zaXplID4gbWFzaykgewkJCQlcCisJCWludCBfaSA9IChtYXNrKzEpIC0gd3JpdGU7CQkJXAorCQlfc2l6ZSAtPSBfaTsJCQkJCVwKKwkJd2hpbGUgKF9pID4gMCApIHsJCQkJXAorCQkJKihpbnQgKikocmluZyArIHdyaXRlKSA9ICpfdGFiKys7CVwKKwkJCXdyaXRlKys7CQkJCVwKKwkJCV9pLS07CQkJCQlcCisJCX0JCQkJCQlcCisJCXdyaXRlID0gMDsJCQkJCVwKKwkJX3RhYiArPSBfaTsJCQkJCVwKKwl9CQkJCQkJCVwKKwkJCQkJCQkJXAorCXdoaWxlIChfc2l6ZSA+IDApIHsJCQkJCVwKKwkJKihyaW5nICsgd3JpdGUpID0gKl90YWIrKzsJCQlcCisJCXdyaXRlKys7CQkJCQlcCisJCV9zaXplLS07CQkJCQlcCisJfQkJCQkJCQlcCisJd3JpdGUgJj0gbWFzazsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKKyNlbmRpZiAvKiBfX1JBREVPTl9EUlZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMThiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYwpAQCAtMCwwICsxLDI1MSBAQAorLyogcmFkZW9uX2lycS5jIC0tIElSUSBoYW5kbGluZyBmb3IgcmFkZW9uIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAoQykgVGhlIFdlYXRoZXIgQ2hhbm5lbCwgSW5jLiAgMjAwMi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFRoZSBXZWF0aGVyIENoYW5uZWwgKFRNKSBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8gZGV2ZWxvcCB0aGUKKyAqIGluaXRpYWwgcmVsZWFzZSBvZiB0aGUgUmFkZW9uIDg1MDAgZHJpdmVyIHVuZGVyIHRoZSBYRnJlZTg2IGxpY2Vuc2UuCisgKiBUaGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aEB0dW5nc3RlbmdyYXBoaWNzLmNvbT4KKyAqICAgIE1pY2hlbCBE77+9emVyIDxtaWNoZWxAZGFlbnplci5uZXQ+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2Rydi5oIgorCisvKiBJbnRlcnJ1cHRzIC0gVXNlZCBmb3IgZGV2aWNlIHN5bmNocm9uaXphdGlvbiBhbmQgZmx1c2hpbmcgaW4gdGhlCisgKiBmb2xsb3dpbmcgY2lyY3Vtc3RhbmNlczoKKyAqCisgKiAtIEV4Y2x1c2l2ZSBGQiBhY2Nlc3Mgd2l0aCBodyBpZGxlOgorICogICAgLSBXYWl0IGZvciBHVUkgSWRsZSAoPykgaW50ZXJydXB0LCB0aGVuIGRvIG5vcm1hbCBmbHVzaC4KKyAqCisgKiAtIEZyYW1lIHRocm90dGxpbmcsIE5WX2ZlbmNlOgorICogICAgLSBEcm9wIG1hcmtlciBpcnEncyBpbnRvIGNvbW1hbmQgc3RyZWFtIGFoZWFkIG9mIHRpbWUuCisgKiAgICAtIFdhaXQgb24gaXJxJ3Mgd2l0aCBsb2NrICpub3QgaGVsZCoKKyAqICAgIC0gQ2hlY2sgZWFjaCBmb3IgdGVybWluYXRpb24gY29uZGl0aW9uCisgKgorICogLSBJbnRlcm5hbGx5IGluIGNwX2dldGJ1ZmZlciwgZXRjOgorICogICAgLSBhcyBhYm92ZSwgYnV0IHdhaXQgd2l0aCBsb2NrIGhlbGQ/Pz8KKyAqCisgKiBOT1RFOiBUaGVzZSBmdW5jdGlvbnMgYXJlIG1pc2xlYWRpbmdseSBuYW1lZCAtLSB0aGUgaXJxJ3MgYXJlbid0CisgKiB0aWVkIHRvIGRtYSBhdCBhbGwsIHRoaXMgaXMganVzdCBhIGhhbmdvdmVyIGZyb20gZHJpIHByZWhpc3RvcnkuCisgKi8KKworaXJxcmV0dXJuX3QgcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlciggRFJNX0lSUV9BUkdTICkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAorCSAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisgICAJdTMyIHN0YXQ7CisKKwkvKiBPbmx5IGNvbnNpZGVyIHRoZSBiaXRzIHdlJ3JlIGludGVyZXN0ZWQgaW4gLSBvdGhlcnMgY291bGQgYmUgdXNlZAorCSAqIG91dHNpZGUgdGhlIERSTQorCSAqLworCXN0YXQgPSBSQURFT05fUkVBRChSQURFT05fR0VOX0lOVF9TVEFUVVMpCisJICAgICAmIChSQURFT05fU1dfSU5UX1RFU1QgfCBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCk7CisJaWYgKCFzdGF0KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBTVyBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdCAmIFJBREVPTl9TV19JTlRfVEVTVCkgeworCQlEUk1fV0FLRVVQKCAmZGV2X3ByaXYtPnN3aV9xdWV1ZSApOworCX0KKworCS8qIFZCTEFOSyBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdCAmIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKSB7CisJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKKwkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWUpOworCQlkcm1fdmJsX3NlbmRfc2lnbmFscyggZGV2ICk7CisJfQorCisJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0cyB3ZSBoYW5kbGUgKi8KKwlSQURFT05fV1JJVEUoUkFERU9OX0dFTl9JTlRfU1RBVFVTLCBzdGF0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2KQoreworCXUzMiB0bXAgPSBSQURFT05fUkVBRCggUkFERU9OX0dFTl9JTlRfU1RBVFVTICkKKwkJJiAoUkFERU9OX1NXX0lOVF9URVNUX0FDSyB8IFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKTsKKwlpZiAodG1wKQorCQlSQURFT05fV1JJVEUoIFJBREVPTl9HRU5fSU5UX1NUQVRVUywgdG1wICk7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IHJldDsKKwlSSU5HX0xPQ0FMUzsKKworCWF0b21pY19pbmMoJmRldl9wcml2LT5zd2lfZW1pdHRlZCk7CisJcmV0ID0gYXRvbWljX3JlYWQoJmRldl9wcml2LT5zd2lfZW1pdHRlZCk7CisKKwlCRUdJTl9SSU5HKCA0ICk7CisJT1VUX1JJTkdfUkVHKCBSQURFT05fTEFTVF9TV0lfUkVHLCByZXQgKTsKKwlPVVRfUklOR19SRUcoIFJBREVPTl9HRU5fSU5UX1NUQVRVUywgUkFERU9OX1NXX0lOVF9GSVJFICk7CisJQURWQU5DRV9SSU5HKCk7IAorIAlDT01NSVRfUklORygpOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHJhZGVvbl93YWl0X2lycShkcm1fZGV2aWNlX3QgKmRldiwgaW50IHN3aV9ucikKK3sKKyAgCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IAorCSAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldCA9IDA7CisKKyAJaWYgKFJBREVPTl9SRUFEKCBSQURFT05fTEFTVF9TV0lfUkVHICkgPj0gc3dpX25yKSAgCisgCQlyZXR1cm4gMDsgCisKKwlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisKKwkvKiBUaGlzIGlzIGEgaGFjayB0byB3b3JrIGFyb3VuZCBteXN0ZXJpb3VzIGZyZWV6ZXMgb24gY2VydGFpbgorCSAqIHN5c3RlbXM6CisJICovIAorCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKCBkZXZfcHJpdiApOworCisJRFJNX1dBSVRfT04oIHJldCwgZGV2X3ByaXYtPnN3aV9xdWV1ZSwgMyAqIERSTV9IWiwgCisJCSAgICAgUkFERU9OX1JFQUQoIFJBREVPTl9MQVNUX1NXSV9SRUcgKSA+PSBzd2lfbnIgKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCByYWRlb25fZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworICAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gCisJICAgKGRybV9yYWRlb25fcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKKwlpbnQgcmV0ID0gMDsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoIGRldl9wcml2ICk7CisKKwlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7CisKKwkvKiBBc3N1bWUgdGhhdCB0aGUgdXNlciBoYXMgbWlzc2VkIHRoZSBjdXJyZW50IHNlcXVlbmNlIG51bWJlcgorCSAqIGJ5IGFib3V0IGEgZGF5IHJhdGhlciB0aGFuIHNoZSB3YW50cyB0byB3YWl0IGZvciB5ZWFycworCSAqIHVzaW5nIHZlcnRpY2FsIGJsYW5rcy4uLiAKKwkgKi8KKwlEUk1fV0FJVF9PTiggcmV0LCBkZXYtPnZibF9xdWV1ZSwgMypEUk1fSFosIAorCQkgICAgICggKCAoIGN1cl92YmxhbmsgPSBhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQgKSApCisJCQkgLSAqc2VxdWVuY2UgKSA8PSAoMTw8MjMpICkgKTsKKworCSpzZXF1ZW5jZSA9IGN1cl92Ymxhbms7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIE5lZWRzIHRoZSBsb2NrIGFzIGl0IHRvdWNoZXMgdGhlIHJpbmcuCisgKi8KK2ludCByYWRlb25faXJxX2VtaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9pcnFfZW1pdF90IGVtaXQ7CisJaW50IHJlc3VsdDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggZW1pdCwgKGRybV9yYWRlb25faXJxX2VtaXRfdCBfX3VzZXIgKilkYXRhLAorCQkJCSAgc2l6ZW9mKGVtaXQpICk7CisKKwlyZXN1bHQgPSByYWRlb25fZW1pdF9pcnEoIGRldiApOworCisJaWYgKCBEUk1fQ09QWV9UT19VU0VSKCBlbWl0LmlycV9zZXEsICZyZXN1bHQsIHNpemVvZihpbnQpICkgKSB7CisJCURSTV9FUlJPUiggImNvcHlfdG9fdXNlclxuIiApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIERvZXNuJ3QgbmVlZCB0aGUgaGFyZHdhcmUgbG9jay4KKyAqLworaW50IHJhZGVvbl9pcnFfd2FpdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX2lycV93YWl0X3QgaXJxd2FpdDsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBpcnF3YWl0LCAoZHJtX3JhZGVvbl9pcnFfd2FpdF90IF9fdXNlciopZGF0YSwKKwkJCQkgIHNpemVvZihpcnF3YWl0KSApOworCisJcmV0dXJuIHJhZGVvbl93YWl0X2lycSggZGV2LCBpcnF3YWl0LmlycV9zZXEgKTsKK30KKworCisvKiBkcm1fZG1hLmggaG9va3MKKyovCit2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKyAJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCisgICAgICAJUkFERU9OX1dSSVRFKCBSQURFT05fR0VOX0lOVF9DTlRMLCAwICk7CisKKwkvKiBDbGVhciBiaXRzIGlmIHRoZXkncmUgYWxyZWFkeSBoaWdoICovCisJcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoIGRldl9wcml2ICk7Cit9CisKK3ZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICkgeworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CisJCShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKyAgIAlhdG9taWNfc2V0KCZkZXZfcHJpdi0+c3dpX2VtaXR0ZWQsIDApOworCURSTV9JTklUX1dBSVRRVUVVRSggJmRldl9wcml2LT5zd2lfcXVldWUgKTsKKworCS8qIFR1cm4gb24gU1cgYW5kIFZCTCBpbnRzICovCisgICAJUkFERU9OX1dSSVRFKCBSQURFT05fR0VOX0lOVF9DTlRMLAorCQkgICAgICBSQURFT05fQ1JUQ19WQkxBTktfTUFTSyB8CQorCQkgICAgICBSQURFT05fU1dfSU5UX0VOQUJMRSApOworfQorCit2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKSB7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJKGRybV9yYWRlb25fcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAoIWRldl9wcml2KQorCQlyZXR1cm47CisKKwkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KKwlSQURFT05fV1JJVEUoIFJBREVPTl9HRU5fSU5UX0NOVEwsIDAgKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX21lbS5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0Zjg5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX21lbS5jCkBAIC0wLDAgKzEsMzIyIEBACisvKiByYWRlb25fbWVtLmMgLS0gU2ltcGxlIEdBUlQvZmIgbWVtb3J5IG1hbmFnZXIgZm9yIHJhZGVvbiAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFRoZSBXZWF0aGVyIENoYW5uZWwsIEluYy4gIDIwMDIuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBUaGUgV2VhdGhlciBDaGFubmVsIChUTSkgZnVuZGVkIFR1bmdzdGVuIEdyYXBoaWNzIHRvIGRldmVsb3AgdGhlCisgKiBpbml0aWFsIHJlbGVhc2Ugb2YgdGhlIFJhZGVvbiA4NTAwIGRyaXZlciB1bmRlciB0aGUgWEZyZWU4NiBsaWNlbnNlLgorICogVGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2Rydi5oIgorCisvKiBWZXJ5IHNpbXBsZSBhbGxvY2F0b3IgZm9yIEdBUlQgbWVtb3J5LCB3b3JraW5nIG9uIGEgc3RhdGljIHJhbmdlCisgKiBhbHJlYWR5IG1hcHBlZCBpbnRvIGVhY2ggY2xpZW50J3MgYWRkcmVzcyBzcGFjZS4gIAorICovCisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Jsb2NrICpzcGxpdF9ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICpwLCBpbnQgc3RhcnQsIGludCBzaXplLAorCQkJCSAgICAgRFJNRklMRSBmaWxwICkKK3sKKwkvKiBNYXliZSBjdXQgb2ZmIHRoZSBzdGFydCBvZiBhbiBleGlzdGluZyBibG9jayAqLworCWlmIChzdGFydCA+IHAtPnN0YXJ0KSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKm5ld2Jsb2NrID0gZHJtX2FsbG9jKHNpemVvZigqbmV3YmxvY2spLCBEUk1fTUVNX0JVRlMgKTsKKwkJaWYgKCFuZXdibG9jaykgCisJCQlnb3RvIG91dDsKKwkJbmV3YmxvY2stPnN0YXJ0ID0gc3RhcnQ7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIChzdGFydCAtIHAtPnN0YXJ0KTsKKwkJbmV3YmxvY2stPmZpbHAgPSBOVUxMOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCW5ld2Jsb2NrLT5wcmV2ID0gcDsKKwkJcC0+bmV4dC0+cHJldiA9IG5ld2Jsb2NrOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisJCXAtPnNpemUgLT0gbmV3YmxvY2stPnNpemU7CisJCXAgPSBuZXdibG9jazsKKwl9CisgICAKKwkvKiBNYXliZSBjdXQgb2ZmIHRoZSBlbmQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgKi8KKwlpZiAoc2l6ZSA8IHAtPnNpemUpIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqbmV3YmxvY2sgPSBkcm1fYWxsb2Moc2l6ZW9mKCpuZXdibG9jayksIERSTV9NRU1fQlVGUyApOworCQlpZiAoIW5ld2Jsb2NrKQorCQkJZ290byBvdXQ7CisJCW5ld2Jsb2NrLT5zdGFydCA9IHN0YXJ0ICsgc2l6ZTsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gc2l6ZTsKKwkJbmV3YmxvY2stPmZpbHAgPSBOVUxMOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCW5ld2Jsb2NrLT5wcmV2ID0gcDsKKwkJcC0+bmV4dC0+cHJldiA9IG5ld2Jsb2NrOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisJCXAtPnNpemUgPSBzaXplOworCX0KKworIG91dDoKKwkvKiBPdXIgYmxvY2sgaXMgaW4gdGhlIG1pZGRsZSAqLworCXAtPmZpbHAgPSBmaWxwOworCXJldHVybiBwOworfQorCitzdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqYWxsb2NfYmxvY2soIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXAsIGludCBzaXplLCAKKwkJCQkgICAgICBpbnQgYWxpZ24yLCBEUk1GSUxFIGZpbHAgKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisJaW50IG1hc2sgPSAoMSA8PCBhbGlnbjIpLTE7CisKKwlsaXN0X2Zvcl9lYWNoKHAsIGhlYXApIHsKKwkJaW50IHN0YXJ0ID0gKHAtPnN0YXJ0ICsgbWFzaykgJiB+bWFzazsKKwkJaWYgKHAtPmZpbHAgPT0gMCAmJiBzdGFydCArIHNpemUgPD0gcC0+c3RhcnQgKyBwLT5zaXplKQorCQkJcmV0dXJuIHNwbGl0X2Jsb2NrKCBwLCBzdGFydCwgc2l6ZSwgZmlscCApOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqZmluZF9ibG9jayggc3RydWN0IG1lbV9ibG9jayAqaGVhcCwgaW50IHN0YXJ0ICkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCisJbGlzdF9mb3JfZWFjaChwLCBoZWFwKQorCQlpZiAocC0+c3RhcnQgPT0gc3RhcnQpCisJCQlyZXR1cm4gcDsKKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIGZyZWVfYmxvY2soIHN0cnVjdCBtZW1fYmxvY2sgKnAgKQoreworCXAtPmZpbHAgPSBOVUxMOworCisJLyogQXNzdW1lcyBhIHNpbmdsZSBjb250aWd1b3VzIHJhbmdlLiAgTmVlZHMgYSBzcGVjaWFsIGZpbHAgaW4KKwkgKiAnaGVhcCcgdG8gc3RvcCBpdCBiZWluZyBzdWJzdW1lZC4KKwkgKi8KKwlpZiAocC0+bmV4dC0+ZmlscCA9PSAwKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwLT5uZXh0OworCQlwLT5zaXplICs9IHEtPnNpemU7CisJCXAtPm5leHQgPSBxLT5uZXh0OworCQlwLT5uZXh0LT5wcmV2ID0gcDsKKwkJZHJtX2ZyZWUocSwgc2l6ZW9mKCpxKSwgRFJNX01FTV9CVUZTICk7CisJfQorCisJaWYgKHAtPnByZXYtPmZpbHAgPT0gMCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcC0+cHJldjsKKwkJcS0+c2l6ZSArPSBwLT5zaXplOworCQlxLT5uZXh0ID0gcC0+bmV4dDsKKwkJcS0+bmV4dC0+cHJldiA9IHE7CisJCWRybV9mcmVlKHAsIHNpemVvZigqcSksIERSTV9NRU1fQlVGUyApOworCX0KK30KKworLyogSW5pdGlhbGl6ZS4gIEhvdyB0byBjaGVjayBmb3IgYW4gdW5pbml0aWFsaXplZCBoZWFwPworICovCitzdGF0aWMgaW50IGluaXRfaGVhcChzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpibG9ja3MgPSBkcm1fYWxsb2Moc2l6ZW9mKCpibG9ja3MpLCBEUk1fTUVNX0JVRlMgKTsKKworCWlmICghYmxvY2tzKSAKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkKKwkqaGVhcCA9IGRybV9hbGxvYyhzaXplb2YoKipoZWFwKSwgRFJNX01FTV9CVUZTICk7CisJaWYgKCEqaGVhcCkgeworCQlkcm1fZnJlZSggYmxvY2tzLCBzaXplb2YoKmJsb2NrcyksIERSTV9NRU1fQlVGUyApOworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKworCWJsb2Nrcy0+c3RhcnQgPSBzdGFydDsKKwlibG9ja3MtPnNpemUgPSBzaXplOworCWJsb2Nrcy0+ZmlscCA9IE5VTEw7CisJYmxvY2tzLT5uZXh0ID0gYmxvY2tzLT5wcmV2ID0gKmhlYXA7CisKKwltZW1zZXQoICpoZWFwLCAwLCBzaXplb2YoKipoZWFwKSApOworCSgqaGVhcCktPmZpbHAgPSAoRFJNRklMRSkgLTE7CisJKCpoZWFwKS0+bmV4dCA9ICgqaGVhcCktPnByZXYgPSBibG9ja3M7CisJcmV0dXJuIDA7Cit9CisKKworLyogRnJlZSBhbGwgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZWFzaW5nIGZpbGUuCisgKi8KK3ZvaWQgcmFkZW9uX21lbV9yZWxlYXNlKCBEUk1GSUxFIGZpbHAsIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXAgKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisKKwlpZiAoIWhlYXAgfHwgIWhlYXAtPm5leHQpCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2gocCwgaGVhcCkgeworCQlpZiAocC0+ZmlscCA9PSBmaWxwKSAKKwkJCXAtPmZpbHAgPSBOVUxMOworCX0KKworCS8qIEFzc3VtZXMgYSBzaW5nbGUgY29udGlndW91cyByYW5nZS4gIE5lZWRzIGEgc3BlY2lhbCBmaWxwIGluCisJICogJ2hlYXAnIHRvIHN0b3AgaXQgYmVpbmcgc3Vic3VtZWQuCisJICovCisJbGlzdF9mb3JfZWFjaChwLCBoZWFwKSB7CisJCXdoaWxlIChwLT5maWxwID09IDAgJiYgcC0+bmV4dC0+ZmlscCA9PSAwKSB7CisJCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcC0+bmV4dDsKKwkJCXAtPnNpemUgKz0gcS0+c2l6ZTsKKwkJCXAtPm5leHQgPSBxLT5uZXh0OworCQkJcC0+bmV4dC0+cHJldiA9IHA7CisJCQlkcm1fZnJlZShxLCBzaXplb2YoKnEpLERSTV9NRU1fRFJJVkVSKTsKKwkJfQorCX0KK30KKworLyogU2h1dGRvd24uCisgKi8KK3ZvaWQgcmFkZW9uX21lbV90YWtlZG93biggc3RydWN0IG1lbV9ibG9jayAqKmhlYXAgKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisJCisJaWYgKCEqaGVhcCkKKwkJcmV0dXJuOworCisJZm9yIChwID0gKCpoZWFwKS0+bmV4dCA7IHAgIT0gKmhlYXAgOyApIHsKKwkJc3RydWN0IG1lbV9ibG9jayAqcSA9IHA7CisJCXAgPSBwLT5uZXh0OworCQlkcm1fZnJlZShxLCBzaXplb2YoKnEpLERSTV9NRU1fRFJJVkVSKTsKKwl9CisKKwlkcm1fZnJlZSggKmhlYXAsIHNpemVvZigqKmhlYXApLERSTV9NRU1fRFJJVkVSICk7CisJKmhlYXAgPSBOVUxMOworfQorCisKKworLyogSU9DVEwgSEFORExFUlMgKi8KKworc3RhdGljIHN0cnVjdCBtZW1fYmxvY2sgKipnZXRfaGVhcCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCSAgIGludCByZWdpb24gKQoreworCXN3aXRjaCggcmVnaW9uICkgeworCWNhc2UgUkFERU9OX01FTV9SRUdJT05fR0FSVDoKKyAJCXJldHVybiAmZGV2X3ByaXYtPmdhcnRfaGVhcDsgCisJY2FzZSBSQURFT05fTUVNX1JFR0lPTl9GQjoKKwkJcmV0dXJuICZkZXZfcHJpdi0+ZmJfaGVhcDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK2ludCByYWRlb25fbWVtX2FsbG9jKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fbWVtX2FsbG9jX3QgYWxsb2M7CisJc3RydWN0IG1lbV9ibG9jayAqYmxvY2ssICoqaGVhcDsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBhbGxvYywgKGRybV9yYWRlb25fbWVtX2FsbG9jX3QgX191c2VyICopZGF0YSwKKwkJCQkgIHNpemVvZihhbGxvYykgKTsKKworCWhlYXAgPSBnZXRfaGVhcCggZGV2X3ByaXYsIGFsbG9jLnJlZ2lvbiApOworCWlmICghaGVhcCB8fCAhKmhlYXApCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCisJLyogTWFrZSB0aGluZ3MgZWFzaWVyIG9uIG91cnNlbHZlczogYWxsIGFsbG9jYXRpb25zIGF0IGxlYXN0CisJICogNGsgYWxpZ25lZC4KKwkgKi8KKwlpZiAoYWxsb2MuYWxpZ25tZW50IDwgMTIpCisJCWFsbG9jLmFsaWdubWVudCA9IDEyOworCisJYmxvY2sgPSBhbGxvY19ibG9jayggKmhlYXAsIGFsbG9jLnNpemUsIGFsbG9jLmFsaWdubWVudCwKKwkJCSAgICAgZmlscCApOworCisJaWYgKCFibG9jaykgCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwlpZiAoIERSTV9DT1BZX1RPX1VTRVIoIGFsbG9jLnJlZ2lvbl9vZmZzZXQsICZibG9jay0+c3RhcnQsIAorCQkJICAgICAgIHNpemVvZihpbnQpICkgKSB7CisJCURSTV9FUlJPUiggImNvcHlfdG9fdXNlclxuIiApOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworCisKK2ludCByYWRlb25fbWVtX2ZyZWUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9tZW1fZnJlZV90IG1lbWZyZWU7CisJc3RydWN0IG1lbV9ibG9jayAqYmxvY2ssICoqaGVhcDsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBtZW1mcmVlLCAoZHJtX3JhZGVvbl9tZW1fZnJlZV90IF9fdXNlciAqKWRhdGEsCisJCQkJICBzaXplb2YobWVtZnJlZSkgKTsKKworCWhlYXAgPSBnZXRfaGVhcCggZGV2X3ByaXYsIG1lbWZyZWUucmVnaW9uICk7CisJaWYgKCFoZWFwIHx8ICEqaGVhcCkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkKKwlibG9jayA9IGZpbmRfYmxvY2soICpoZWFwLCBtZW1mcmVlLnJlZ2lvbl9vZmZzZXQgKTsKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJaWYgKGJsb2NrLT5maWxwICE9IGZpbHApCisJCXJldHVybiBEUk1fRVJSKEVQRVJNKTsKKworCWZyZWVfYmxvY2soIGJsb2NrICk7CQorCXJldHVybiAwOworfQorCitpbnQgcmFkZW9uX21lbV9pbml0X2hlYXAoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3JhZGVvbl9tZW1faW5pdF9oZWFwX3QgaW5pdGhlYXA7CisJc3RydWN0IG1lbV9ibG9jayAqKmhlYXA7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggaW5pdGhlYXAsIChkcm1fcmFkZW9uX21lbV9pbml0X2hlYXBfdCBfX3VzZXIgKilkYXRhLAorCQkJCSAgc2l6ZW9mKGluaXRoZWFwKSApOworCisJaGVhcCA9IGdldF9oZWFwKCBkZXZfcHJpdiwgaW5pdGhlYXAucmVnaW9uICk7CisJaWYgKCFoZWFwKSAKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkKKwlpZiAoKmhlYXApIHsKKwkJRFJNX0VSUk9SKCJoZWFwIGFscmVhZHkgaW5pdGlhbGl6ZWQ/Iik7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCQkKKwlyZXR1cm4gaW5pdF9oZWFwKCBoZWFwLCBpbml0aGVhcC5zdGFydCwgaW5pdGhlYXAuc2l6ZSApOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzllMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCkBAIC0wLDAgKzEsMzEwMiBAQAorLyogcmFkZW9uX3N0YXRlLmMgLS0gU3RhdGUgc3VwcG9ydCBmb3IgUmFkZW9uIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fc2FyZWEuaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2Rydi5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBjbGllbnQgc3RhdGUgY2hlY2tpbmcgYW5kIGZpeHVwCisgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCQkgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJCQkJCSAgICAgdTMyICpvZmZzZXQgKSB7CisJdTMyIG9mZiA9ICpvZmZzZXQ7CisJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKKworCWlmICggb2ZmID49IGRldl9wcml2LT5mYl9sb2NhdGlvbiAmJgorCSAgICAgb2ZmIDwgKCBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCArIGRldl9wcml2LT5nYXJ0X3NpemUgKSApCisJCXJldHVybiAwOworCisJcmFkZW9uX3ByaXYgPSBmaWxwX3ByaXYtPmRyaXZlcl9wcml2OworCW9mZiArPSByYWRlb25fcHJpdi0+cmFkZW9uX2ZiX2RlbHRhOworCisJRFJNX0RFQlVHKCAib2Zmc2V0IGZpeGVkIHVwIHRvIDB4JXhcbiIsIG9mZiApOworCisJaWYgKCBvZmYgPCBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gfHwKKwkgICAgIG9mZiA+PSAoIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0ICsgZGV2X3ByaXYtPmdhcnRfc2l6ZSApICkKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCisJKm9mZnNldCA9IG9mZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXRzKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCQkgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkJCQkgICAgICBpbnQgaWQsCisJCQkJCQkgICAgICB1MzIgX191c2VyICpkYXRhICkgeworCXN3aXRjaCAoIGlkICkgeworCisJY2FzZSBSQURFT05fRU1JVF9QUF9NSVNDOgorCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZkYXRhWyggUkFERU9OX1JCM0RfREVQVEhPRkZTRVQKKwkJCQkJCQkgICAgLSBSQURFT05fUFBfTUlTQyApIC8gNF0gKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgZGVwdGggYnVmZmVyIG9mZnNldFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSQURFT05fRU1JVF9QUF9DTlRMOgorCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZkYXRhWyggUkFERU9OX1JCM0RfQ09MT1JPRkZTRVQKKwkJCQkJCQkgICAgLSBSQURFT05fUFBfQ05UTCApIC8gNF0gKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgY29sb3VyIGJ1ZmZlciBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8yOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzM6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF81OgorCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZkYXRhWzBdICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIFIyMDAgdGV4dHVyZSBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzE6CisJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8yOgorCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZkYXRhWyggUkFERU9OX1BQX1RYT0ZGU0VUXzAKKwkJCQkJCQkgICAgLSBSQURFT05fUFBfVFhGSUxURVJfMCApIC8gNF0gKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgUjEwMCB0ZXh0dXJlIG9mZnNldFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18wOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18zOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzU6IHsKKwkJaW50IGk7CisJCWZvciAoIGkgPSAwOyBpIDwgNTsgaSsrICkgeworCQkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCQkgICAgJmRhdGFbaV0gKSApIHsKKwkJCQlEUk1fRVJST1IoICJJbnZhbGlkIFIyMDAgY3ViaWMgdGV4dHVyZSBvZmZzZXRcbiIgKTsKKwkJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QwOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMToKKwljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDI6eworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCQkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LAorCQkJCQkJCQkgIGZpbHBfcHJpdiwKKwkJCQkJCQkJICAmZGF0YVtpXSkpIHsKKwkJCQkJRFJNX0VSUk9SCisJCQkJCSAgICAoIkludmFsaWQgUjEwMCBjdWJpYyB0ZXh0dXJlIG9mZnNldFxuIik7CisJCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBSQURFT05fRU1JVF9SQjNEX0NPTE9SUElUQ0g6CisJY2FzZSBSQURFT05fRU1JVF9SRV9MSU5FX1BBVFRFUk46CisJY2FzZSBSQURFT05fRU1JVF9TRV9MSU5FX1dJRFRIOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfTFVNX01BVFJJWDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX1JPVF9NQVRSSVhfMDoKKwljYXNlIFJBREVPTl9FTUlUX1JCM0RfU1RFTkNJTFJFRk1BU0s6CisJY2FzZSBSQURFT05fRU1JVF9TRV9WUE9SVF9YU0NBTEU6CisJY2FzZSBSQURFT05fRU1JVF9TRV9DTlRMOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfQ05UTF9TVEFUVVM6CisJY2FzZSBSQURFT05fRU1JVF9SRV9NSVNDOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzA6CisJY2FzZSBSQURFT05fRU1JVF9QUF9CT1JERVJfQ09MT1JfMToKKwljYXNlIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8yOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfWkJJQVNfRkFDVE9SOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfVENMX09VVFBVVF9WVFhfRk1UOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQ6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF8xOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF80OgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzU6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNjoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF83OgorCWNhc2UgUjIwMF9FTUlUX1RDTF9MSUdIVF9NT0RFTF9DVExfMDoKKwljYXNlIFIyMDBfRU1JVF9URkFDVE9SXzA6CisJY2FzZSBSMjAwX0VNSVRfVlRYX0ZNVF8wOgorCWNhc2UgUjIwMF9FTUlUX1ZBUF9DVEw6CisJY2FzZSBSMjAwX0VNSVRfTUFUUklYX1NFTEVDVF8wOgorCWNhc2UgUjIwMF9FTUlUX1RFWF9QUk9DX0NUTF8yOgorCWNhc2UgUjIwMF9FTUlUX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEw6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8xOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl80OgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzU6CisJY2FzZSBSMjAwX0VNSVRfVlRFX0NOVEw6CisJY2FzZSBSMjAwX0VNSVRfT1VUUFVUX1ZUWF9DT01QX1NFTDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UQU1fREVCVUczOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NOVExfWDoKKwljYXNlIFIyMDBfRU1JVF9SQjNEX0RFUFRIWFlfT0ZGU0VUOgorCWNhc2UgUjIwMF9FTUlUX1JFX0FVWF9TQ0lTU09SX0NOVEw6CisJY2FzZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8wOgorCWNhc2UgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMToKKwljYXNlIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzI6CisJY2FzZSBSMjAwX0VNSVRfU0VfVkFQX0NOVExfU1RBVFVTOgorCWNhc2UgUjIwMF9FTUlUX1NFX1ZUWF9TVEFURV9DTlRMOgorCWNhc2UgUjIwMF9FTUlUX1JFX1BPSU5UU0laRToKKwljYXNlIFIyMDBfRU1JVF9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMDoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18xOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU180OgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzU6CisJY2FzZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8wOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMToKKwljYXNlIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzI6CisJY2FzZSBSMjAwX0VNSVRfUkIzRF9CTEVORENPTE9SOgorCWNhc2UgUjIwMF9FTUlUX1RDTF9QT0lOVF9TUFJJVEVfQ05UTDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzA6CisJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18xOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMjoKKwljYXNlIFIyMDBfRU1JVF9QUF9UUklfUEVSRl9DTlRMOgorCQkvKiBUaGVzZSBwYWNrZXRzIGRvbid0IGNvbnRhaW4gbWVtb3J5IG9mZnNldHMgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoICJVbmtub3duIHN0YXRlIHBhY2tldCBJRCAlZFxuIiwgaWQgKTsKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCQkgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkJCQkgICAgICBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqY21kYnVmLAorCQkJCQkJICAgICAgdW5zaWduZWQgaW50ICpjbWRzeiApIHsKKwl1MzIgKmNtZCA9ICh1MzIgKikgY21kYnVmLT5idWY7CisKKwkqY21kc3ogPSAyICsgKCAoIGNtZFswXSAmIFJBREVPTl9DUF9QQUNLRVRfQ09VTlRfTUFTSyApID4+IDE2ICk7CisKKwlpZiAoICggY21kWzBdICYgMHhjMDAwMDAwMCApICE9IFJBREVPTl9DUF9QQUNLRVQzICkgeworCQlEUk1fRVJST1IoICJOb3QgYSB0eXBlIDMgcGFja2V0XG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlpZiAoIDQgKiAqY21kc3ogPiBjbWRidWYtPmJ1ZnN6ICkgeworCQlEUk1fRVJST1IoICJQYWNrZXQgc2l6ZSBsYXJnZXIgdGhhbiBzaXplIG9mIGRhdGEgcHJvdmlkZWRcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCX0KKworCS8qIENoZWNrIGNsaWVudCBzdGF0ZSBhbmQgZml4IGl0IHVwIGlmIG5lY2Vzc2FyeSAqLworCWlmICggY21kWzBdICYgMHg4MDAwICkgeyAvKiBNU0Igb2Ygb3Bjb2RlOiBuZXh0IERXT1JEIEdVSV9DTlRMICovCisJCXUzMiBvZmZzZXQ7CisKKwkJaWYgKCBjbWRbMV0gJiAoIFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMCisJCQkgICAgICB8IFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMICkgKSB7CisJCQlvZmZzZXQgPSBjbWRbMl0gPDwgMTA7CisJCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LCAmb2Zmc2V0ICkgKSB7CisJCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBmaXJzdCBwYWNrZXQgb2Zmc2V0XG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCQkJY21kWzJdID0gKCBjbWRbMl0gJiAweGZmYzAwMDAwICkgfCBvZmZzZXQgPj4gMTA7CisJCX0KKworCQlpZiAoICggY21kWzFdICYgUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgKSAmJgorCQkgICAgICggY21kWzFdICYgUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgKSApIHsKKwkJCW9mZnNldCA9IGNtZFszXSA8PCAxMDsKKwkJCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsICZvZmZzZXQgKSApIHsKKwkJCQlEUk1fRVJST1IoICJJbnZhbGlkIHNlY29uZCBwYWNrZXQgb2Zmc2V0XG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCQkJY21kWzNdID0gKCBjbWRbM10gJiAweGZmYzAwMDAwICkgfCBvZmZzZXQgPj4gMTA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDUCBoYXJkd2FyZSBzdGF0ZSBwcm9ncmFtbWluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkgIGRybV9jbGlwX3JlY3RfdCAqYm94ICkKK3sKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRyggIiAgIGJveDogIHgxPSVkIHkxPSVkICB4Mj0lZCB5Mj0lZFxuIiwKKwkJICAgYm94LT54MSwgYm94LT55MSwgYm94LT54MiwgYm94LT55MiApOworCisJQkVHSU5fUklORyggNCApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkVfVE9QX0xFRlQsIDAgKSApOworCU9VVF9SSU5HKCAoYm94LT55MSA8PCAxNikgfCBib3gtPngxICk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9XSURUSF9IRUlHSFQsIDAgKSApOworCU9VVF9SSU5HKCAoKGJveC0+eTIgLSAxKSA8PCAxNikgfCAoYm94LT54MiAtIDEpICk7CisJQURWQU5DRV9SSU5HKCk7Cit9CisKKy8qIEVtaXQgMS4xIHN0YXRlCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfc3RhdGUoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJCSAgICAgIGRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgKmN0eCwKKwkJCSAgICAgIGRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgKnRleCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBkaXJ0eSApCit7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiZGlydHk9MHglMDh4XG4iLCBkaXJ0eSApOworCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfQ09OVEVYVCApIHsKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmY3R4LT5yYjNkX2RlcHRob2Zmc2V0ICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCisJCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICAgJmN0eC0+cmIzZF9jb2xvcm9mZnNldCApICkgeworCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBkZXB0aCBidWZmZXIgb2Zmc2V0XG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKworCQlCRUdJTl9SSU5HKCAxNCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX01JU0MsIDYgKSApOworCQlPVVRfUklORyggY3R4LT5wcF9taXNjICk7CisJCU9VVF9SSU5HKCBjdHgtPnBwX2ZvZ19jb2xvciApOworCQlPVVRfUklORyggY3R4LT5yZV9zb2xpZF9jb2xvciApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2JsZW5kY250bCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2RlcHRob2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBjdHgtPnJiM2RfZGVwdGhwaXRjaCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX3pzdGVuY2lsY250bCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0NOVEwsIDIgKSApOworCQlPVVRfUklORyggY3R4LT5wcF9jbnRsICk7CisJCU9VVF9SSU5HKCBjdHgtPnJiM2RfY250bCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2NvbG9yb2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkIzRF9DT0xPUlBJVENILCAwICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9jb2xvcnBpdGNoICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX1ZFUlRGTVQgKSB7CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9DT09SRF9GTVQsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5zZV9jb29yZF9mbXQgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfTElORSApIHsKKwkJQkVHSU5fUklORyggNSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JFX0xJTkVfUEFUVEVSTiwgMSApICk7CisJCU9VVF9SSU5HKCBjdHgtPnJlX2xpbmVfcGF0dGVybiApOworCQlPVVRfUklORyggY3R4LT5yZV9saW5lX3N0YXRlICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfTElORV9XSURUSCwgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX2xpbmVfd2lkdGggKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfQlVNUE1BUCApIHsKKwkJQkVHSU5fUklORyggNSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0xVTV9NQVRSSVgsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5wcF9sdW1fbWF0cml4ICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfUk9UX01BVFJJWF8wLCAxICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cHBfcm90X21hdHJpeF8wICk7CisJCU9VVF9SSU5HKCBjdHgtPnBwX3JvdF9tYXRyaXhfMSApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9NQVNLUyApIHsKKwkJQkVHSU5fUklORyggNCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0ssIDIgKSApOworCQlPVVRfUklORyggY3R4LT5yYjNkX3N0ZW5jaWxyZWZtYXNrICk7CisJCU9VVF9SSU5HKCBjdHgtPnJiM2Rfcm9wY250bCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX3BsYW5lbWFzayApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9WSUVXUE9SVCApIHsKKwkJQkVHSU5fUklORyggNyApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1ZQT1JUX1hTQ0FMRSwgNSApICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX3Zwb3J0X3hzY2FsZSApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF94b2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX3Zwb3J0X3lzY2FsZSApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF95b2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX3Zwb3J0X3pzY2FsZSApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF96b2Zmc2V0ICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX1NFVFVQICkgeworCQlCRUdJTl9SSU5HKCA0ICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfQ05UTCwgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX2NudGwgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9DTlRMX1NUQVRVUywgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX2NudGxfc3RhdHVzICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX01JU0MgKSB7CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9NSVNDLCAwICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmVfbWlzYyApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgwICkgeworCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZ0ZXhbMF0ucHBfdHhvZmZzZXQgKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJQkVHSU5fUklORyggOSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX1RYRklMVEVSXzAsIDUgKSApOworCQlPVVRfUklORyggdGV4WzBdLnBwX3R4ZmlsdGVyICk7CisJCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdHhmb3JtYXQgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF90eG9mZnNldCApOworCQlPVVRfUklORyggdGV4WzBdLnBwX3R4Y2JsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdHhhYmxlbmQgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF90ZmFjdG9yICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfQk9SREVSX0NPTE9SXzAsIDAgKSApOworCQlPVVRfUklORyggdGV4WzBdLnBwX2JvcmRlcl9jb2xvciApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgxICkgeworCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZ0ZXhbMV0ucHBfdHhvZmZzZXQgKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMVxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJQkVHSU5fUklORyggOSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX1RYRklMVEVSXzEsIDUgKSApOworCQlPVVRfUklORyggdGV4WzFdLnBwX3R4ZmlsdGVyICk7CisJCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdHhmb3JtYXQgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF90eG9mZnNldCApOworCQlPVVRfUklORyggdGV4WzFdLnBwX3R4Y2JsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdHhhYmxlbmQgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF90ZmFjdG9yICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfQk9SREVSX0NPTE9SXzEsIDAgKSApOworCQlPVVRfUklORyggdGV4WzFdLnBwX2JvcmRlcl9jb2xvciApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgyICkgeworCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZ0ZXhbMl0ucHBfdHhvZmZzZXQgKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMlxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJQkVHSU5fUklORyggOSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX1RYRklMVEVSXzIsIDUgKSApOworCQlPVVRfUklORyggdGV4WzJdLnBwX3R4ZmlsdGVyICk7CisJCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdHhmb3JtYXQgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF90eG9mZnNldCApOworCQlPVVRfUklORyggdGV4WzJdLnBwX3R4Y2JsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdHhhYmxlbmQgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF90ZmFjdG9yICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfQk9SREVSX0NPTE9SXzIsIDAgKSApOworCQlPVVRfUklORyggdGV4WzJdLnBwX2JvcmRlcl9jb2xvciApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRW1pdCAxLjIgc3RhdGUKKyAqLworc3RhdGljIGludCByYWRlb25fZW1pdF9zdGF0ZTIoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkgICAgICAgZHJtX3JhZGVvbl9zdGF0ZV90ICpzdGF0ZSApCit7CisJUklOR19MT0NBTFM7CisKKwlpZiAoc3RhdGUtPmRpcnR5ICYgUkFERU9OX1VQTE9BRF9aQklBUykgeworCQlCRUdJTl9SSU5HKCAzICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfWkJJQVNfRkFDVE9SLCAxICkgKTsKKwkJT1VUX1JJTkcoIHN0YXRlLT5jb250ZXh0Mi5zZV96Ymlhc19mYWN0b3IgKTsgCisJCU9VVF9SSU5HKCBzdGF0ZS0+Y29udGV4dDIuc2VfemJpYXNfY29uc3RhbnQgKTsgCisJCUFEVkFOQ0VfUklORygpOworCX0KKworCXJldHVybiByYWRlb25fZW1pdF9zdGF0ZSggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnN0YXRlLT5jb250ZXh0LAorCQkJICAgc3RhdGUtPnRleCwgc3RhdGUtPmRpcnR5ICk7Cit9CisKKy8qIE5ldyAoMS4zKSBzdGF0ZSBtZWNoYW5pc20uICAzIGNvbW1hbmRzIChwYWNrZXQsIHNjYWxhciwgdmVjdG9yKSBpbgorICogMS4zIGNtZGJ1ZmZlcnMgYWxsb3cgYWxsIHByZXZpb3VzIHN0YXRlIHRvIGJlIHVwZGF0ZWQgYXMgd2VsbCBhcworICogdGhlIHRjbCBzY2FsYXIgYW5kIHZlY3RvciBhcmVhcy4gIAorICovCitzdGF0aWMgc3RydWN0IHsgCisJaW50IHN0YXJ0OyAKKwlpbnQgbGVuOyAKKwljb25zdCBjaGFyICpuYW1lOworfSBwYWNrZXRbUkFERU9OX01BWF9TVEFURV9QQUNLRVRTXSA9IHsKKwl7IFJBREVPTl9QUF9NSVNDLDcsIlJBREVPTl9QUF9NSVNDIiB9LAorCXsgUkFERU9OX1BQX0NOVEwsMywiUkFERU9OX1BQX0NOVEwiIH0sCisJeyBSQURFT05fUkIzRF9DT0xPUlBJVENILDEsIlJBREVPTl9SQjNEX0NPTE9SUElUQ0giIH0sCisJeyBSQURFT05fUkVfTElORV9QQVRURVJOLDIsIlJBREVPTl9SRV9MSU5FX1BBVFRFUk4iIH0sCisJeyBSQURFT05fU0VfTElORV9XSURUSCwxLCJSQURFT05fU0VfTElORV9XSURUSCIgfSwKKwl7IFJBREVPTl9QUF9MVU1fTUFUUklYLDEsIlJBREVPTl9QUF9MVU1fTUFUUklYIiB9LAorCXsgUkFERU9OX1BQX1JPVF9NQVRSSVhfMCwyLCJSQURFT05fUFBfUk9UX01BVFJJWF8wIiB9LAorCXsgUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0ssMywiUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0siIH0sCisJeyBSQURFT05fU0VfVlBPUlRfWFNDQUxFLDYsIlJBREVPTl9TRV9WUE9SVF9YU0NBTEUiIH0sCisJeyBSQURFT05fU0VfQ05UTCwyLCJSQURFT05fU0VfQ05UTCIgfSwKKwl7IFJBREVPTl9TRV9DTlRMX1NUQVRVUywxLCJSQURFT05fU0VfQ05UTF9TVEFUVVMiIH0sCisJeyBSQURFT05fUkVfTUlTQywxLCJSQURFT05fUkVfTUlTQyIgfSwKKwl7IFJBREVPTl9QUF9UWEZJTFRFUl8wLDYsIlJBREVPTl9QUF9UWEZJTFRFUl8wIiB9LAorCXsgUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8wLDEsIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMCIgfSwKKwl7IFJBREVPTl9QUF9UWEZJTFRFUl8xLDYsIlJBREVPTl9QUF9UWEZJTFRFUl8xIiB9LAorCXsgUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8xLDEsIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMSIgfSwKKwl7IFJBREVPTl9QUF9UWEZJTFRFUl8yLDYsIlJBREVPTl9QUF9UWEZJTFRFUl8yIiB9LAorCXsgUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yLDEsIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMiIgfSwKKwl7IFJBREVPTl9TRV9aQklBU19GQUNUT1IsMiwiUkFERU9OX1NFX1pCSUFTX0ZBQ1RPUiIgfSwKKwl7IFJBREVPTl9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQsMTEsIlJBREVPTl9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQiIH0sCisJeyBSQURFT05fU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQsMTcsIlJBREVPTl9TRV9UQ0xfTUFURVJJQUxfRU1NSVNTSVZFX1JFRCIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfMCwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMCIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfMSwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMSIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfMiwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMiIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfMywgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMyIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfNCwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNCIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfNSwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNSIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfNiwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNiIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfNywgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNyIgfSwKKwl7IFIyMDBfU0VfVENMX0xJR0hUX01PREVMX0NUTF8wLCA2LCAiUjIwMF9TRV9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAiIH0sCisJeyBSMjAwX1BQX1RGQUNUT1JfMCwgNiwgIlIyMDBfUFBfVEZBQ1RPUl8wIiB9LAorCXsgUjIwMF9TRV9WVFhfRk1UXzAsIDQsICJSMjAwX1NFX1ZUWF9GTVRfMCIgfSwKKwl7IFIyMDBfU0VfVkFQX0NOVEwsIDEsICJSMjAwX1NFX1ZBUF9DTlRMIiB9LAorCXsgUjIwMF9TRV9UQ0xfTUFUUklYX1NFTF8wLCA1LCAiUjIwMF9TRV9UQ0xfTUFUUklYX1NFTF8wIiB9LAorCXsgUjIwMF9TRV9UQ0xfVEVYX1BST0NfQ1RMXzIsIDUsICJSMjAwX1NFX1RDTF9URVhfUFJPQ19DVExfMiIgfSwKKwl7IFIyMDBfU0VfVENMX1VDUF9WRVJUX0JMRU5EX0NUTCwgMSwgIlIyMDBfU0VfVENMX1VDUF9WRVJUX0JMRU5EX0NUTCIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfMCwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMCIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfMSwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMSIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfMiwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMiIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfMywgNiwgIlIyMDBfUFBfVFhGSUxURVJfMyIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfNCwgNiwgIlIyMDBfUFBfVFhGSUxURVJfNCIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfNSwgNiwgIlIyMDBfUFBfVFhGSUxURVJfNSIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfMCwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMCIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfMSwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMSIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfMiwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMiIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfMywgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMyIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfNCwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfNCIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfNSwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfNSIgfSwKKwl7IFIyMDBfU0VfVlRFX0NOVEwsIDEsICJSMjAwX1NFX1ZURV9DTlRMIiB9LAorCXsgUjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCwgMSwgIlIyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwiIH0sCisJeyBSMjAwX1BQX1RBTV9ERUJVRzMsIDEsICJSMjAwX1BQX1RBTV9ERUJVRzMiIH0sCisJeyBSMjAwX1BQX0NOVExfWCwgMSwgIlIyMDBfUFBfQ05UTF9YIiB9LCAKKwl7IFIyMDBfUkIzRF9ERVBUSFhZX09GRlNFVCwgMSwgIlIyMDBfUkIzRF9ERVBUSFhZX09GRlNFVCIgfSwgCisJeyBSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwsIDEsICJSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwiIH0sIAorCXsgUjIwMF9SRV9TQ0lTU09SX1RMXzAsIDIsICJSMjAwX1JFX1NDSVNTT1JfVExfMCIgfSwgCisJeyBSMjAwX1JFX1NDSVNTT1JfVExfMSwgMiwgIlIyMDBfUkVfU0NJU1NPUl9UTF8xIiB9LCAKKwl7IFIyMDBfUkVfU0NJU1NPUl9UTF8yLCAyLCAiUjIwMF9SRV9TQ0lTU09SX1RMXzIiIH0sIAorCXsgUjIwMF9TRV9WQVBfQ05UTF9TVEFUVVMsIDEsICJSMjAwX1NFX1ZBUF9DTlRMX1NUQVRVUyIgfSwgCisJeyBSMjAwX1NFX1ZUWF9TVEFURV9DTlRMLCAxLCAiUjIwMF9TRV9WVFhfU1RBVEVfQ05UTCIgfSwgCisJeyBSMjAwX1JFX1BPSU5UU0laRSwgMSwgIlIyMDBfUkVfUE9JTlRTSVpFIiB9LCAKKwl7IFIyMDBfU0VfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wLCA0LCAiUjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAiIH0sCisJeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzAsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzAiIH0sIC8qIDYxICovCisJeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMCIgfSwgLyogNjIgKi8KKwl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfMSwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMSIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzEsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8xIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19GQUNFU18yLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18yIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMiwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzIiIH0sCisJeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzMsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzMiIH0sCisJeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8zLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMyIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfNCwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfNCIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzQsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV80IiB9LAorCXsgUjIwMF9QUF9DVUJJQ19GQUNFU181LCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU181IiB9LAorCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNSwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzUiIH0sCisJeyBSQURFT05fUFBfVEVYX1NJWkVfMCwgMiwgIlJBREVPTl9QUF9URVhfU0laRV8wIiB9LAorCXsgUkFERU9OX1BQX1RFWF9TSVpFXzEsIDIsICJSQURFT05fUFBfVEVYX1NJWkVfMSIgfSwKKwl7IFJBREVPTl9QUF9URVhfU0laRV8yLCAyLCAiUkFERU9OX1BQX1RFWF9TSVpFXzIiIH0sCisJeyBSMjAwX1JCM0RfQkxFTkRDT0xPUiwgMywgIlIyMDBfUkIzRF9CTEVORENPTE9SIiB9LAorCXsgUjIwMF9TRV9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwsIDEsICJSMjAwX1NFX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCIgfSwKKwl7IFJBREVPTl9QUF9DVUJJQ19GQUNFU18wLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzAifSwKKwl7IFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDBfMCwgNSwgIlJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDBfMCJ9LAorCXsgUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzEsIDEsICJSQURFT05fUFBfQ1VCSUNfRkFDRVNfMSJ9LAorCXsgUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMV8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMV8wIn0sCisJeyBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMiwgMSwgIlJBREVPTl9QUF9DVUJJQ19GQUNFU18yIn0sCisJeyBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QyXzAsIDUsICJSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QyXzAifSwKKwl7IFIyMDBfUFBfVFJJX1BFUkYsIDIsICJSMjAwX1BQX1RSSV9QRVJGIn0sCit9OworCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCByYWRlb25fY2xlYXJfYm94KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKwkJCSAgICAgIGludCByLCBpbnQgZywgaW50IGIgKQoreworCXUzMiBjb2xvcjsKKwlSSU5HX0xPQ0FMUzsKKworCXggKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLngxOworCXkgKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLnkxOworCisJc3dpdGNoICggZGV2X3ByaXYtPmNvbG9yX2ZtdCApIHsKKwljYXNlIFJBREVPTl9DT0xPUl9GT1JNQVRfUkdCNTY1OgorCQljb2xvciA9ICgoKHIgJiAweGY4KSA8PCA4KSB8CisJCQkgKChnICYgMHhmYykgPDwgMykgfAorCQkJICgoYiAmIDB4ZjgpID4+IDMpKTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fQ09MT1JfRk9STUFUX0FSR0I4ODg4OgorCWRlZmF1bHQ6CisJCWNvbG9yID0gKCgoMHhmZikgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgIDgpIHwgYik7CisJCWJyZWFrOworCX0KKworCUJFR0lOX1JJTkcoIDQgKTsKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CQkKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0RQX1dSSVRFX01BU0ssIDAgKSApOworCU9VVF9SSU5HKCAweGZmZmZmZmZmICk7CisJQURWQU5DRV9SSU5HKCk7CisKKwlCRUdJTl9SSU5HKCA2ICk7CisKKwlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCU9VVF9SSU5HKCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCSAgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkgIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJICBSQURFT05fUk9QM19QIHwKKwkJICBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgKTsKKworIAlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICYmIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSApIHsgCisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7CisgCX0gZWxzZSB7CSAKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCApOworIAl9IAorCisJT1VUX1JJTkcoIGNvbG9yICk7CisKKwlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCS8qIENvbGxhcHNlIHZhcmlvdXMgdGhpbmdzIGludG8gYSB3YWl0IGZsYWcgLS0gdHJ5aW5nIHRvCisJICogZ3Vlc3MgaWYgdXNlcnNwYXNlIHNsZXB0IC0tIGJldHRlciBqdXN0IHRvIGhhdmUgdGhlbSB0ZWxsIHVzLgorCSAqLworCWlmIChkZXZfcHJpdi0+c3RhdHMubGFzdF9mcmFtZV9yZWFkcyA+IDEgfHwKKwkgICAgZGV2X3ByaXYtPnN0YXRzLmxhc3RfY2xlYXJfcmVhZHMgPiBkZXZfcHJpdi0+c3RhdHMuY2xlYXJzKSB7CisJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPnN0YXRzLmZyZWVsaXN0X2xvb3BzKSB7CisJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKwl9CisKKwkvKiBQdXJwbGUgYm94IGZvciBwYWdlIGZsaXBwaW5nCisJICovCisJaWYgKCBkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX0ZMSVAgKSAKKwkJcmFkZW9uX2NsZWFyX2JveCggZGV2X3ByaXYsIDQsIDQsIDgsIDgsIDI1NSwgMCwgMjU1ICk7CisKKwkvKiBSZWQgYm94IGlmIHdlIGhhdmUgdG8gd2FpdCBmb3IgaWRsZSBhdCBhbnkgcG9pbnQKKwkgKi8KKwlpZiAoIGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfV0FJVF9JRExFICkgCisJCXJhZGVvbl9jbGVhcl9ib3goIGRldl9wcml2LCAxNiwgNCwgOCwgOCwgMjU1LCAwLCAwICk7CisKKwkvKiBCbHVlIGJveDogbG9zdCBjb250ZXh0PworCSAqLworCisJLyogWWVsbG93IGJveCBmb3IgdGV4dHVyZSBzd2FwcworCSAqLworCWlmICggZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9URVhUVVJFX0xPQUQgKSAKKwkJcmFkZW9uX2NsZWFyX2JveCggZGV2X3ByaXYsIDQwLCA0LCA4LCA4LCAyNTUsIDI1NSwgMCApOworCisJLyogR3JlZW4gYm94IGlmIGhhcmR3YXJlIG5ldmVyIGlkbGVzIChhcyBmYXIgYXMgd2UgY2FuIHRlbGwpCisJICovCisJaWYgKCAhKGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfRE1BX0lETEUpICkgCisJCXJhZGVvbl9jbGVhcl9ib3goIGRldl9wcml2LCA2NCwgNCwgOCwgOCwgMCwgMjU1LCAwICk7CisKKworCS8qIERyYXcgYmFycyBpbmRpY2F0aW5nIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCAKKwkgKiAobm90IGEgZ3JlYXQgbWVhc3VyZSwgZWFzaWx5IGNvbmZ1c2VkKQorCSAqLworCWlmIChkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMpIHsKKwkJaWYgKGRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcyA+IDEwMCkKKwkJCWRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcyA9IDEwMDsKKworCQlyYWRlb25fY2xlYXJfYm94KCBkZXZfcHJpdiwgNCwgMTYsICAKKwkJCQkgIGRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcywgNCwKKwkJCQkgIDE5NiwgMTI4LCAxMjggKTsKKwl9CisKKwltZW1zZXQoICZkZXZfcHJpdi0+c3RhdHMsIDAsIHNpemVvZihkZXZfcHJpdi0+c3RhdHMpICk7CisKK30KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENQIGNvbW1hbmQgZGlzcGF0Y2ggZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2NsZWFyKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICBkcm1fcmFkZW9uX2NsZWFyX3QgKmNsZWFyLAorCQkJCSAgICAgIGRybV9yYWRlb25fY2xlYXJfcmVjdF90ICpkZXB0aF9ib3hlcyApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fcmFkZW9uX2RlcHRoX2NsZWFyX3QgKmRlcHRoX2NsZWFyID0gJmRldl9wcml2LT5kZXB0aF9jbGVhcjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJdW5zaWduZWQgaW50IGZsYWdzID0gY2xlYXItPmZsYWdzOworCXUzMiByYjNkX2NudGwgPSAwLCByYjNkX3N0ZW5jaWxyZWZtYXNrPSAwOworCWludCBpOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggImZsYWdzID0gMHgleFxuIiwgZmxhZ3MgKTsKKworCWRldl9wcml2LT5zdGF0cy5jbGVhcnMrKzsKKworCWlmICggZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgJiYgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAxICkgeworCQl1bnNpZ25lZCBpbnQgdG1wID0gZmxhZ3M7CisKKwkJZmxhZ3MgJj0gfihSQURFT05fRlJPTlQgfCBSQURFT05fQkFDSyk7CisJCWlmICggdG1wICYgUkFERU9OX0ZST05UICkgZmxhZ3MgfD0gUkFERU9OX0JBQ0s7CisJCWlmICggdG1wICYgUkFERU9OX0JBQ0sgKSAgZmxhZ3MgfD0gUkFERU9OX0ZST05UOworCX0KKworCWlmICggZmxhZ3MgJiAoUkFERU9OX0ZST05UIHwgUkFERU9OX0JBQ0spICkgeworCisJCUJFR0lOX1JJTkcoIDQgKTsKKworCQkvKiBFbnN1cmUgdGhlIDNEIHN0cmVhbSBpcyBpZGxlIGJlZm9yZSBkb2luZyBhCisJCSAqIDJEIGZpbGwgdG8gY2xlYXIgdGhlIGZyb250IG9yIGJhY2sgYnVmZmVyLgorCQkgKi8KKwkJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOworCQkKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9EUF9XUklURV9NQVNLLCAwICkgKTsKKwkJT1VUX1JJTkcoIGNsZWFyLT5jb2xvcl9tYXNrICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkJICovCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCQlpbnQgeCA9IHBib3hbaV0ueDE7CisJCQlpbnQgeSA9IHBib3hbaV0ueTE7CisJCQlpbnQgdyA9IHBib3hbaV0ueDIgLSB4OworCQkJaW50IGggPSBwYm94W2ldLnkyIC0geTsKKworCQkJRFJNX0RFQlVHKCAiZGlzcGF0Y2ggY2xlYXIgJWQsJWQtJWQsJWQgZmxhZ3MgMHgleFxuIiwKKwkJCQkgICB4LCB5LCB3LCBoLCBmbGFncyApOworCisJCQlpZiAoIGZsYWdzICYgUkFERU9OX0ZST05UICkgeworCQkJCUJFR0lOX1JJTkcoIDYgKTsKKwkJCQkKKwkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJCU9VVF9SSU5HKCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJCSAgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkJCQkgIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJICBSQURFT05fUk9QM19QIHwKKwkJCQkJICBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgKTsKKworCQkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7CisJCQkJT1VUX1JJTkcoIGNsZWFyLT5jbGVhcl9jb2xvciApOworCQkJCQorCQkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQkJT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKKwkJCQkKKwkJCQlBRFZBTkNFX1JJTkcoKTsKKwkJCX0KKwkJCQorCQkJaWYgKCBmbGFncyAmIFJBREVPTl9CQUNLICkgeworCQkJCUJFR0lOX1JJTkcoIDYgKTsKKwkJCQkKKwkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJCU9VVF9SSU5HKCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJCSAgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkJCQkgIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJICBSQURFT05fUk9QM19QIHwKKwkJCQkJICBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgKTsKKwkJCQkKKwkJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICk7CisJCQkJT1VUX1JJTkcoIGNsZWFyLT5jbGVhcl9jb2xvciApOworCisJCQkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCQkJQURWQU5DRV9SSU5HKCk7CisJCQl9CisJCX0KKwl9CisJCisJLyogaHlwZXIgeiBjbGVhciAqLworCS8qIG5vIGRvY3MgYXZhaWxhYmxlLCBiYXNlZCBvbiByZXZlcnNlIGVuZ2VuZWVyaW5nIGJ5IFN0ZXBoYW5lIE1hcmNoZXNpbiAqLworCWlmICgoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSAmJiAoZmxhZ3MgJiBSQURFT05fQ0xFQVJfRkFTVFopKSB7CisKKwkJaW50IGk7CisJCWludCBkZXB0aHBpeHBlcmxpbmUgPSBkZXZfcHJpdi0+ZGVwdGhfZm10PT1SQURFT05fREVQVEhfRk9STUFUXzE2QklUX0lOVF9aPyAKKwkJCShkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLyAyKTogKGRldl9wcml2LT5kZXB0aF9waXRjaCAvIDQpOworCQkKKwkJdTMyIGNsZWFybWFzazsKKworCQl1MzIgdGVtcFJCM0RfREVQVEhDTEVBUlZBTFVFID0gY2xlYXItPmNsZWFyX2RlcHRoIHwKKwkJCSgoY2xlYXItPmRlcHRoX21hc2sgJiAweGZmKSA8PCAyNCk7CisJCisJCQorCQkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgorCQkgKiB3ZSBoYXZlbid0IHRvdWNoZWQgYW55ICJub3JtYWwiIHN0YXRlIC0gc3RpbGwgbmVlZCB0aGlzPworCQkgKi8KKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CisKKwkJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0hBU19ISUVSWikgJiYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikpIHsKKwkJLyogRklYTUUgOiByZXZlcnNlIGVuZ2luZWVyIHRoYXQgZm9yIFJ4MDAgY2FyZHMgKi8KKwkJLyogRklYTUUgOiB0aGUgbWFzayBzdXBwb3NlZGx5IGNvbnRhaW5zIGxvdy1yZXMgeiB2YWx1ZXMuIFNvIGNhbid0IHNldAorCQkgICBqdXN0IHRvIHRoZSBtYXggKDB4ZmY/IG9yIGFjdHVhbGx5IDB4M2ZmZj8pLCBuZWVkIHRvIHRha2UgeiBjbGVhcgorCQkgICB2YWx1ZSBpbnRvIGFjY291bnQ/ICovCisJCS8qIHBhdHRlcm4gc2VlbXMgdG8gd29yayBmb3IgcjEwMCwgdGhvdWdoIGdldCBzbGlnaHQKKwkJICAgcmVuZGVyaW5nIGVycm9ycyB3aXRoIGdseGdlYXJzLiBJZiBoaWVyeiBpcyBub3QgZW5hYmxlZCBmb3IgcjEwMCwKKwkJICAgb25seSA0IGJpdHMgd2hpY2ggaW5kaWNhdGUgY2xlYXIgKDE1LDE2LDMxLDMyLCBhbGwgemVybykgbWF0dGVyLCB0aGUKKwkJICAgb3RoZXIgb25lcyBhcmUgaWdub3JlZCwgYW5kIHRoZSBzYW1lIGNsZWFyIG1hc2sgY2FuIGJlIHVzZWQuIFRoYXQncworCQkgICB2ZXJ5IGRpZmZlcmVudCBiZWhhdmlvdXIgdGhhbiBSMjAwIHdoaWNoIG5lZWRzIGRpZmZlcmVudCBjbGVhciBtYXNrCisJCSAgIGFuZCBkaWZmZXJlbnQgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyIGlmIGhpZXJ6IGlzIGVuYWJsZWQgb3Igbm90ICE/IQorCQkqLworCQkJY2xlYXJtYXNrID0gKDB4ZmY8PDIyKXwoMHhmZjw8Nil8IDB4MDAzZjAwM2Y7CisJCX0KKwkJZWxzZSB7CisJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLgorCQkgICBydjI1MDogY291bGQgYmUgdXNlZCB0byBjbGVhciBvbmx5IHBhcnRzIG9mIG1hY3JvdGlsZXMKKwkJICAgKGJ1dCB0aGF0IHdvdWxkIGdldCByZWFsbHkgY29tcGxpY2F0ZWQuLi4pPworCQkgICBiaXQgMCBhbmQgMSAoZWl0aGVyIG9yIGJvdGggb2YgdGhlbSA/IT8hKSBhcmUgdXNlZCB0bworCQkgICBub3QgY2xlYXIgdGlsZSAob3IgbWF5YmUgb25lIG9mIHRoZSBiaXRzIGluZGljYXRlcyBpZiB0aGUgdGlsZSBpcworCQkgICBjb21wcmVzc2VkIG9yIG5vdCksIGJpdCAyIGFuZCAzIHRvIG5vdCBjbGVhciB0aWxlIDEsLi4uLC4KKwkJICAgUGF0dGVybiBpcyBhcyBmb2xsb3dzOgorCQkgICAgICAgIHwgMCwxIHwgNCw1IHwgOCw5IHwxMiwxM3wxNiwxN3wyMCwyMXwyNCwyNXwyOCwyOXwKKwkJICAgYml0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAgICAgICAgfCAyLDMgfCA2LDcgfDEwLDExfDE0LDE1fDE4LDE5fDIyLDIzfDI2LDI3fDMwLDMxfAorCQkgICBydjEwMDogY2xlYXJtYXNrIGNvdmVycyAyeDggNHgxIHRpbGVzLCBidXQgb25lIGNsZWFyIHN0aWxsCisJCSAgIGNvdmVycyAyNTYgcGl4ZWxzID8hPworCQkqLworCQkJY2xlYXJtYXNrID0gMHgwOworCQl9CisKKwkJQkVHSU5fUklORyggOCApOworCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfREVQVEhDTEVBUlZBTFVFLAorCQkJdGVtcFJCM0RfREVQVEhDTEVBUlZBTFVFKTsKKwkJLyogd2hhdCBvZmZzZXQgaXMgdGhpcyBleGFjdGx5ID8gKi8KKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9aTUFTS09GRlNFVCwgMCApOworCQkvKiBuZWVkIGN0bHN0YXQsIG90aGVyd2lzZSBnZXQgc29tZSBzdHJhbmdlIGJsYWNrIGZsaWNrZXJpbmcgKi8KKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9aQ0FDSEVfQ1RMU1RBVCwgUkFERU9OX1JCM0RfWkNfRkxVU0hfQUxMICk7CisJCUFEVkFOQ0VfUklORygpOworCisJCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKKwkJCWludCB0aWxlb2Zmc2V0LCBucnRpbGVzeCwgbnJ0aWxlc3ksIGo7CisJCQkvKiBpdCBsb29rcyBsaWtlIHIyMDAgbmVlZHMgcnYtc3R5bGUgY2xlYXJzLCBhdCBsZWFzdCBpZiBoaWVyeiBpcyBub3QgZW5hYmxlZD8gKi8KKwkJCWlmICgoZGV2X3ByaXYtPmZsYWdzJkNISVBfSEFTX0hJRVJaKSAmJiAhKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj09VUNPREVfUjIwMCkpIHsKKwkJCQkvKiBGSVhNRSA6IGZpZ3VyZSB0aGlzIG91dCBmb3IgcjIwMCAod2hlbiBoaWVyeiBpcyBlbmFibGVkKS4gT3IKKwkJCQkgICBtYXliZSByMjAwIGFjdHVhbGx5IGRvZXNuJ3QgbmVlZCB0byBwdXQgdGhlIGxvdy1yZXMgeiB2YWx1ZSBpbnRvCisJCQkJICAgdGhlIHRpbGUgY2FjaGUgbGlrZSByMTAwLCBidXQganVzdCBuZWVkcyB0byBjbGVhciB0aGUgaGktbGV2ZWwgei1idWZmZXI/CisJCQkJICAgV29ya3MgZm9yIFIxMDAsIGJvdGggd2l0aCBoaWVyeiBhbmQgd2l0aG91dC4KKwkJCQkgICBSMTAwIHNlZW1zIHRvIG9wZXJhdGUgb24gMngxIDh4OCB0aWxlcywgYnV0Li4uCisJCQkJICAgb2RkOiBvZmZzZXQvbnJ0aWxlcyBuZWVkIHRvIGJlIDY0IHBpeCAoNCBibG9jaykgYWxpZ25lZD8gUG90ZW50aWFsbHkKKwkJCQkgICBwcm9ibGVtYXRpYyB3aXRoIHJlc29sdXRpb25zIHdoaWNoIGFyZSBub3QgNjQgcGl4IGFsaWduZWQ/ICovCisJCQkJdGlsZW9mZnNldCA9ICgocGJveFtpXS55MSA+PiAzKSAqIGRlcHRocGl4cGVybGluZSArIHBib3hbaV0ueDEpID4+IDY7CisJCQkJbnJ0aWxlc3ggPSAoKHBib3hbaV0ueDIgJiB+NjMpIC0gKHBib3hbaV0ueDEgJiB+NjMpKSA+PiA0OworCQkJCW5ydGlsZXN5ID0gKHBib3hbaV0ueTIgPj4gMykgLSAocGJveFtpXS55MSA+PiAzKTsKKwkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKKwkJCQkJQkVHSU5fUklORyggNCApOworCQkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyICkgKTsKKwkJCQkJLyogZmlyc3QgdGlsZSAqLworCQkJCQlPVVRfUklORyggdGlsZW9mZnNldCAqIDggKTsKKwkJCQkJLyogdGhlIG51bWJlciBvZiB0aWxlcyB0byBjbGVhciAqLworCQkJCQlPVVRfUklORyggbnJ0aWxlc3ggKyA0ICk7CisJCQkJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLiAqLworCQkJCQlPVVRfUklORyggY2xlYXJtYXNrICk7CisJCQkJCUFEVkFOQ0VfUklORygpOworCQkJCQl0aWxlb2Zmc2V0ICs9IGRlcHRocGl4cGVybGluZSA+PiA2OworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj09VUNPREVfUjIwMCkgeworCQkJCS8qIHdvcmtzIGZvciBydjI1MC4gKi8KKwkJCQkvKiBmaW5kIGZpcnN0IG1hY3JvIHRpbGUgKDh4MiA0eDQgei1waXhlbHMgb24gcnYyNTApICovCisJCQkJdGlsZW9mZnNldCA9ICgocGJveFtpXS55MSA+PiAzKSAqIGRlcHRocGl4cGVybGluZSArIHBib3hbaV0ueDEpID4+IDU7CisJCQkJbnJ0aWxlc3ggPSAocGJveFtpXS54MiA+PiA1KSAtIChwYm94W2ldLngxID4+IDUpOworCQkJCW5ydGlsZXN5ID0gKHBib3hbaV0ueTIgPj4gMykgLSAocGJveFtpXS55MSA+PiAzKTsKKwkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKKwkJCQkJQkVHSU5fUklORyggNCApOworCQkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyICkgKTsKKwkJCQkJLyogZmlyc3QgdGlsZSAqLworCQkJCQkvKiBqdWRnaW5nIGJ5IHRoZSBmaXJzdCB0aWxlIG9mZnNldCBuZWVkZWQsIGNvdWxkIHBvc3NpYmx5CisJCQkJCSAgIGRpcmVjdGx5IGFkZHJlc3MvY2xlYXIgNHg0IHRpbGVzIGluc3RlYWQgb2YgOHgyICogNHg0CisJCQkJCSAgIG1hY3JvIHRpbGVzLCB0aG91Z2ggd291bGQgc3RpbGwgbmVlZCBjbGVhciBtYXNrIGZvcgorCQkJCQkgICByaWdodC9ib3R0b20gaWYgdHJ1ZWx5IDR4NCBncmFudWxhcml0eSBpcyBkZXNpcmVkID8gKi8KKwkJCQkJT1VUX1JJTkcoIHRpbGVvZmZzZXQgKiAxNiApOworCQkJCQkvKiB0aGUgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyICovCisJCQkJCU9VVF9SSU5HKCBucnRpbGVzeCArIDEgKTsKKwkJCQkJLyogY2xlYXIgbWFzayA6IGNob29zZXMgdGhlIGNsZWFyaW5nIHBhdHRlcm4uICovCisJCQkJCU9VVF9SSU5HKCBjbGVhcm1hc2sgKTsKKwkJCQkJQURWQU5DRV9SSU5HKCk7CisJCQkJCXRpbGVvZmZzZXQgKz0gZGVwdGhwaXhwZXJsaW5lID4+IDU7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7IC8qIHJ2IDEwMCAqLworCQkJCS8qIHJ2MTAwIG1pZ2h0IG5vdCBuZWVkIDY0IHBpeCBhbGlnbm1lbnQsIHdobyBrbm93cyAqLworCQkJCS8qIG9mZnNldHMgYXJlLCBobW0sIHdlaXJkICovCisJCQkJdGlsZW9mZnNldCA9ICgocGJveFtpXS55MSA+PiA0KSAqIGRlcHRocGl4cGVybGluZSArIHBib3hbaV0ueDEpID4+IDY7CisJCQkJbnJ0aWxlc3ggPSAoKHBib3hbaV0ueDIgJiB+NjMpIC0gKHBib3hbaV0ueDEgJiB+NjMpKSA+PiA0OworCQkJCW5ydGlsZXN5ID0gKHBib3hbaV0ueTIgPj4gNCkgLSAocGJveFtpXS55MSA+PiA0KTsKKwkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKKwkJCQkJQkVHSU5fUklORyggNCApOworCQkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyICkgKTsKKwkJCQkJT1VUX1JJTkcoIHRpbGVvZmZzZXQgKiAxMjggKTsKKwkJCQkJLyogdGhlIG51bWJlciBvZiB0aWxlcyB0byBjbGVhciAqLworCQkJCQlPVVRfUklORyggbnJ0aWxlc3ggKyA0ICk7CisJCQkJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLiAqLworCQkJCQlPVVRfUklORyggY2xlYXJtYXNrICk7CisJCQkJCUFEVkFOQ0VfUklORygpOworCQkJCQl0aWxlb2Zmc2V0ICs9IGRlcHRocGl4cGVybGluZSA+PiA2OworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIFRPRE8gZG9uJ3QgYWx3YXlzIGNsZWFyIGFsbCBoaS1sZXZlbCB6IHRpbGVzICovCisJCWlmICgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9IQVNfSElFUlopICYmIChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249PVVDT0RFX1IyMDApCisJCQkmJiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSkKKwkJLyogcjEwMCBhbmQgY2FyZHMgd2l0aG91dCBoaWVyYXJjaGljYWwgei1idWZmZXIgaGF2ZSBubyBoaWdoLWxldmVsIHotYnVmZmVyICovCisJCS8qIEZJWE1FIDogdGhlIG1hc2sgc3VwcG9zZWRseSBjb250YWlucyBsb3ctcmVzIHogdmFsdWVzLiBTbyBjYW4ndCBzZXQKKwkJICAganVzdCB0byB0aGUgbWF4ICgweGZmPyBvciBhY3R1YWxseSAweDNmZmY/KSwgbmVlZCB0byB0YWtlIHogY2xlYXIKKwkJICAgdmFsdWUgaW50byBhY2NvdW50PyAqLworCQl7CisJCQlCRUdJTl9SSU5HKCA0ICk7CisJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX0hJWiwgMiApICk7CisJCQlPVVRfUklORyggMHgwICk7IC8qIEZpcnN0IHRpbGUgKi8KKwkJCU9VVF9SSU5HKCAweDNjYzAgKTsKKwkJCU9VVF9SSU5HKCAoMHhmZjw8MjIpfCgweGZmPDw2KXwgMHgwMDNmMDAzZik7CisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCX0KKworCS8qIFdlIGhhdmUgdG8gY2xlYXIgdGhlIGRlcHRoIGFuZC9vciBzdGVuY2lsIGJ1ZmZlcnMgYnkKKwkgKiByZW5kZXJpbmcgYSBxdWFkIGludG8ganVzdCB0aG9zZSBidWZmZXJzLiAgVGh1cywgd2UgaGF2ZSB0bworCSAqIG1ha2Ugc3VyZSB0aGUgM0QgZW5naW5lIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5LgorCSAqLworCWlmICgoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IyMDApICYmCisJICAgIChmbGFncyAmIChSQURFT05fREVQVEggfCBSQURFT05fU1RFTkNJTCkpKSB7CisKKwkJaW50IHRlbXBQUF9DTlRMOworCQlpbnQgdGVtcFJFX0NOVEw7CisJCWludCB0ZW1wUkIzRF9DTlRMOworCQlpbnQgdGVtcFJCM0RfWlNURU5DSUxDTlRMOworCQlpbnQgdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0s7CisJCWludCB0ZW1wUkIzRF9QTEFORU1BU0s7CisJCWludCB0ZW1wU0VfQ05UTDsKKwkJaW50IHRlbXBTRV9WVEVfQ05UTDsKKwkJaW50IHRlbXBTRV9WVFhfRk1UXzA7CisJCWludCB0ZW1wU0VfVlRYX0ZNVF8xOworCQlpbnQgdGVtcFNFX1ZBUF9DTlRMOworCQlpbnQgdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEw7CisKKwkJdGVtcFBQX0NOVEwgPSAwOworCQl0ZW1wUkVfQ05UTCA9IDA7CisKKwkJdGVtcFJCM0RfQ05UTCA9IGRlcHRoX2NsZWFyLT5yYjNkX2NudGw7CisKKwkJdGVtcFJCM0RfWlNURU5DSUxDTlRMID0gZGVwdGhfY2xlYXItPnJiM2RfenN0ZW5jaWxjbnRsOworCQl0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyA9IDB4MDsKKworCQl0ZW1wU0VfQ05UTCA9IGRlcHRoX2NsZWFyLT5zZV9jbnRsOworCisKKworCQkvKiBEaXNhYmxlIFRDTCAqLworCisJCXRlbXBTRV9WQVBfQ05UTCA9ICgvKiBTRV9WQVBfQ05UTF9fRk9SQ0VfV19UT19PTkVfTUFTSyB8ICAqLworCQkJCSAgICgweDkgPDwgU0VfVkFQX0NOVExfX1ZGX01BWF9WVFhfTlVNX19TSElGVCkpOworCisJCXRlbXBSQjNEX1BMQU5FTUFTSyA9IDB4MDsKKworCQl0ZW1wUkVfQVVYX1NDSVNTT1JfQ05UTCA9IDB4MDsKKworCQl0ZW1wU0VfVlRFX0NOVEwgPQorCQkJU0VfVlRFX0NOVExfX1ZUWF9YWV9GTVRfTUFTSyB8CisJCQlTRV9WVEVfQ05UTF9fVlRYX1pfRk1UX01BU0s7CisKKwkJLyogVmVydGV4IGZvcm1hdCAoWCwgWSwgWiwgVykqLworCQl0ZW1wU0VfVlRYX0ZNVF8wID0KKwkJCVNFX1ZUWF9GTVRfMF9fVlRYX1owX1BSRVNFTlRfTUFTSyB8CisJCQlTRV9WVFhfRk1UXzBfX1ZUWF9XMF9QUkVTRU5UX01BU0s7CisJCXRlbXBTRV9WVFhfRk1UXzEgPSAweDA7CisKKworCQkvKiAKKwkJICogRGVwdGggYnVmZmVyIHNwZWNpZmljIGVuYWJsZXMgCisJCSAqLworCQlpZiAoZmxhZ3MgJiBSQURFT05fREVQVEgpIHsKKwkJCS8qIEVuYWJsZSBkZXB0aCBidWZmZXIgKi8KKwkJCXRlbXBSQjNEX0NOVEwgfD0gUkFERU9OX1pfRU5BQkxFOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBkZXB0aCBidWZmZXIgKi8KKwkJCXRlbXBSQjNEX0NOVEwgJj0gflJBREVPTl9aX0VOQUJMRTsKKwkJfQorCisJCS8qIAorCQkgKiBTdGVuY2lsIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzCisJCSAqLworCQlpZiAoIGZsYWdzICYgUkFERU9OX1NURU5DSUwgKSB7CisJCQl0ZW1wUkIzRF9DTlRMIHw9ICBSQURFT05fU1RFTkNJTF9FTkFCTEU7CisJCQl0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyA9IGNsZWFyLT5kZXB0aF9tYXNrOyAKKwkJfSBlbHNlIHsKKwkJCXRlbXBSQjNEX0NOVEwgJj0gflJBREVPTl9TVEVOQ0lMX0VOQUJMRTsKKwkJCXRlbXBSQjNEX1NURU5DSUxSRUZNQVNLID0gMHgwMDAwMDAwMDsKKwkJfQorCisJCWlmIChmbGFncyAmIFJBREVPTl9VU0VfQ09NUF9aQlVGKSB7CisJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfQ09NUFJFU1NJT05fRU5BQkxFIHwKKwkJCQlSQURFT05fWl9ERUNPTVBSRVNTSU9OX0VOQUJMRTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSB7CisJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfSElFUkFSQ0hZX0VOQUJMRTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDI2ICk7CisJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKKworCQlPVVRfUklOR19SRUcoIFJBREVPTl9QUF9DTlRMLCB0ZW1wUFBfQ05UTCApOworCQlPVVRfUklOR19SRUcoIFIyMDBfUkVfQ05UTCwgdGVtcFJFX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9DTlRMLCB0ZW1wUkIzRF9DTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfWlNURU5DSUxDTlRMLAorCQkJICAgICAgdGVtcFJCM0RfWlNURU5DSUxDTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0ssIAorCQkJICAgICAgdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0sgKTsKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9QTEFORU1BU0ssIHRlbXBSQjNEX1BMQU5FTUFTSyApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9TRV9DTlRMLCB0ZW1wU0VfQ05UTCApOworCQlPVVRfUklOR19SRUcoIFIyMDBfU0VfVlRFX0NOVEwsIHRlbXBTRV9WVEVfQ05UTCApOworCQlPVVRfUklOR19SRUcoIFIyMDBfU0VfVlRYX0ZNVF8wLCB0ZW1wU0VfVlRYX0ZNVF8wICk7CisJCU9VVF9SSU5HX1JFRyggUjIwMF9TRV9WVFhfRk1UXzEsIHRlbXBTRV9WVFhfRk1UXzEgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1NFX1ZBUF9DTlRMLCB0ZW1wU0VfVkFQX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwsIAorCQkJICAgICAgdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEwgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkJICovCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCQkKKwkJCS8qIEZ1bm55IHRoYXQgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQgLS0gCisJCQkgKiAgc2V0cyB0b3AtbGVmdD8KKwkJCSAqLworCQkJcmFkZW9uX2VtaXRfY2xpcF9yZWN0KCBkZXZfcHJpdiwKKwkJCQkJICAgICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCisJCQlCRUdJTl9SSU5HKCAxNCApOworCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFIyMDBfM0RfRFJBV19JTU1EXzIsIDEyICkgKTsKKwkJCU9VVF9SSU5HKCAoUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1QgfAorCQkJCSAgIFJBREVPTl9QUklNX1dBTEtfUklORyB8CisJCQkJICAgKDMgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkpICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTFdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7CisJCQlPVVRfUklORyggMHgzZjgwMDAwMCApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOworCQkJT1VUX1JJTkcoIDB4M2Y4MDAwMDAgKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0gKTsKKwkJCU9VVF9SSU5HKCAweDNmODAwMDAwICk7CisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCX0gCisJZWxzZSBpZiAoIChmbGFncyAmIChSQURFT05fREVQVEggfCBSQURFT05fU1RFTkNJTCkpICkgeworCisJCWludCB0ZW1wUkIzRF9aU1RFTkNJTENOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF96c3RlbmNpbGNudGw7CisKKwkJcmIzZF9jbnRsID0gZGVwdGhfY2xlYXItPnJiM2RfY250bDsKKworCQlpZiAoIGZsYWdzICYgUkFERU9OX0RFUFRIICkgeworCQkJcmIzZF9jbnRsIHw9ICBSQURFT05fWl9FTkFCTEU7CisJCX0gZWxzZSB7CisJCQlyYjNkX2NudGwgJj0gflJBREVPTl9aX0VOQUJMRTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBSQURFT05fU1RFTkNJTCApIHsKKwkJCXJiM2RfY250bCB8PSAgUkFERU9OX1NURU5DSUxfRU5BQkxFOworCQkJcmIzZF9zdGVuY2lscmVmbWFzayA9IGNsZWFyLT5kZXB0aF9tYXNrOyAvKiBtaXNuYW1lZCBmaWVsZCAqLworCQl9IGVsc2UgeworCQkJcmIzZF9jbnRsICY9IH5SQURFT05fU1RFTkNJTF9FTkFCTEU7CisJCQlyYjNkX3N0ZW5jaWxyZWZtYXNrID0gMHgwMDAwMDAwMDsKKwkJfQorCisJCWlmIChmbGFncyAmIFJBREVPTl9VU0VfQ09NUF9aQlVGKSB7CisJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfQ09NUFJFU1NJT05fRU5BQkxFIHwKKwkJCQlSQURFT05fWl9ERUNPTVBSRVNTSU9OX0VOQUJMRTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSB7CisJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfSElFUkFSQ0hZX0VOQUJMRTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDEzICk7CisJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKKworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0NOVEwsIDEgKSApOworCQlPVVRfUklORyggMHgwMDAwMDAwMCApOworCQlPVVRfUklORyggcmIzZF9jbnRsICk7CisJCQorCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1pTVEVOQ0lMQ05UTCwgdGVtcFJCM0RfWlNURU5DSUxDTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0ssCisJCQkgICAgICByYjNkX3N0ZW5jaWxyZWZtYXNrICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfUExBTkVNQVNLLAorCQkJICAgICAgMHgwMDAwMDAwMCApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9TRV9DTlRMLAorCQkJICAgICAgZGVwdGhfY2xlYXItPnNlX2NudGwgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkJICovCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCQkKKwkJCS8qIEZ1bm55IHRoYXQgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQgLS0gCisJCQkgKiAgc2V0cyB0b3AtbGVmdD8KKwkJCSAqLworCQkJcmFkZW9uX2VtaXRfY2xpcF9yZWN0KCBkZXZfcHJpdiwKKwkJCQkJICAgICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCisJCQlCRUdJTl9SSU5HKCAxNSApOworCisJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0RSQVdfSU1NRCwgMTMgKSApOworCQkJT1VUX1JJTkcoIFJBREVPTl9WVFhfWl9QUkVTRU5UIHwKKwkJCQkgIFJBREVPTl9WVFhfUEtDT0xPUl9QUkVTRU5UKTsKKwkJCU9VVF9SSU5HKCAoUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1QgfAorCQkJCSAgIFJBREVPTl9QUklNX1dBTEtfUklORyB8CisJCQkJICAgUkFERU9OX01BT1NfRU5BQkxFIHwKKwkJCQkgICBSQURFT05fVlRYX0ZNVF9SQURFT05fTU9ERSB8CisJCQkJICAgKDMgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkpICk7CisKKworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOworCQkJT1VUX1JJTkcoIDB4MCApOworCisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7CisJCQlPVVRfUklORyggMHgwICk7CisKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0gKTsKKwkJCU9VVF9SSU5HKCAweDAgKTsKKworCQkJQURWQU5DRV9SSU5HKCk7CisJCX0KKwl9CisKKwkvKiBJbmNyZW1lbnQgdGhlIGNsZWFyIGNvdW50ZXIuICBUaGUgY2xpZW50LXNpZGUgM0QgZHJpdmVyIG11c3QKKwkgKiB3YWl0IG9uIHRoaXMgdmFsdWUgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGNsZWFyIGlvY3RsLiAgV2UKKwkgKiBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgY2FyZCdzIHNvIGRhbW5lZCBmYXN0Li4uCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfY2xlYXIrKzsKKworCUJFR0lOX1JJTkcoIDQgKTsKKworCVJBREVPTl9DTEVBUl9BR0UoIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyICk7CisJUkFERU9OX1dBSVRfVU5USUxfSURMRSgpOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zd2FwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwkvKiBEbyBzb21lIHRyaXZpYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4uLgorCSAqLworCWlmIChkZXZfcHJpdi0+ZG9fYm94ZXMpCisJCXJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyggZGV2X3ByaXYgKTsKKworCisJLyogV2FpdCBmb3IgdGhlIDNEIHN0cmVhbSB0byBpZGxlIGJlZm9yZSBkaXNwYXRjaGluZyB0aGUgYml0Ymx0LgorCSAqIFRoaXMgd2lsbCBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiBiZXR3ZWVuIHRoZSB0d28gc3RyZWFtcy4KKwkgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCWludCB4ID0gcGJveFtpXS54MTsKKwkJaW50IHkgPSBwYm94W2ldLnkxOworCQlpbnQgdyA9IHBib3hbaV0ueDIgLSB4OworCQlpbnQgaCA9IHBib3hbaV0ueTIgLSB5OworCisJCURSTV9ERUJVRyggImRpc3BhdGNoIHN3YXAgJWQsJWQtJWQsJWRcbiIsCisJCQkgICB4LCB5LCB3LCBoICk7CisKKwkJQkVHSU5fUklORyggNyApOworCisJCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fQ05UTF9CSVRCTFRfTVVMVEksIDUgKSApOworCQlPVVRfUklORyggUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkgIFJBREVPTl9HTUNfQlJVU0hfTk9ORSB8CisJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCSAgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJICBSQURFT05fUk9QM19TIHwKKwkJCSAgUkFERU9OX0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKKwkJCSAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCSAgUkFERU9OX0dNQ19XUl9NU0tfRElTICk7CisJCQorCQkvKiBNYWtlIHRoaXMgd29yayBldmVuIGlmIGZyb250ICYgYmFjayBhcmUgZmxpcHBlZDoKKwkJICovCisJCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDApIHsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7CisJCX0gCisJCWVsc2UgeworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgKTsKKwkJfQorCisJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJLyogSW5jcmVtZW50IHRoZSBmcmFtZSBjb3VudGVyLiAgVGhlIGNsaWVudC1zaWRlIDNEIGRyaXZlciBtdXN0CisJICogdGhyb3R0bGUgdGhlIGZyYW1lcmF0ZSBieSB3YWl0aW5nIGZvciB0aGlzIHZhbHVlIGJlZm9yZQorCSAqIHBlcmZvcm1pbmcgdGhlIHN3YXBidWZmZXIgaW9jdGwuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUrKzsKKworCUJFR0lOX1JJTkcoIDQgKTsKKworCVJBREVPTl9GUkFNRV9BR0UoIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lICk7CisJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fc2FyZWFfdCAqc2FyZWEgPSAoZHJtX3NhcmVhX3QgKilkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZTsKKwlpbnQgb2Zmc2V0ID0gKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSkKKwkJICAgPyBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0IDogZGV2X3ByaXYtPmJhY2tfb2Zmc2V0OworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsIAorCQlfX0ZVTkNUSU9OX18sIAorCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlLAorCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSk7CisKKwkvKiBEbyBzb21lIHRyaXZpYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4uLgorCSAqLworCWlmIChkZXZfcHJpdi0+ZG9fYm94ZXMpIHsKKwkJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfRkxJUDsKKwkJcmFkZW9uX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkZXZfcHJpdiApOworCX0KKworCS8qIFVwZGF0ZSB0aGUgZnJhbWUgb2Zmc2V0cyBmb3IgYm90aCBDUlRDcworCSAqLworCUJFR0lOX1JJTkcoIDYgKTsKKworCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwlPVVRfUklOR19SRUcoIFJBREVPTl9DUlRDX09GRlNFVCwgKCAoIHNhcmVhLT5mcmFtZS55ICogZGV2X3ByaXYtPmZyb250X3BpdGNoCisJCQkJCSAgICAgICsgc2FyZWEtPmZyYW1lLnggCisJCQkJCSAgICAgICogKCBkZXZfcHJpdi0+Y29sb3JfZm10IC0gMiApICkgJiB+NyApCisJCQkJCSAgKyBvZmZzZXQgKTsKKwlPVVRfUklOR19SRUcoIFJBREVPTl9DUlRDMl9PRkZTRVQsIGRldl9wcml2LT5zYXJlYV9wcml2LT5jcnRjMl9iYXNlCisJCQkJCSAgICsgb2Zmc2V0ICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCS8qIEluY3JlbWVudCB0aGUgZnJhbWUgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAorCSAqIHRocm90dGxlIHRoZSBmcmFtZXJhdGUgYnkgd2FpdGluZyBmb3IgdGhpcyB2YWx1ZSBiZWZvcmUKKwkgKiBwZXJmb3JtaW5nIHRoZSBzd2FwYnVmZmVyIGlvY3RsLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKys7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0KKwkJCQkJICAgICAgMSAtIGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisKKwlCRUdJTl9SSU5HKCAyICk7CisKKwlSQURFT05fRlJBTUVfQUdFKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBpbnQgYmFkX3ByaW1fdmVydGV4X25yKCBpbnQgcHJpbWl0aXZlLCBpbnQgbnIgKQoreworCXN3aXRjaCAocHJpbWl0aXZlICYgUkFERU9OX1BSSU1fVFlQRV9NQVNLKSB7CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX05PTkU6CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX1BPSU5UOgorCQlyZXR1cm4gbnIgPCAxOworCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9MSU5FOgorCQlyZXR1cm4gKG5yICYgMSkgfHwgbnIgPT0gMDsKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfTElORV9TVFJJUDoKKwkJcmV0dXJuIG5yIDwgMjsKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfVFJJX0xJU1Q6CisJY2FzZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfUE9JTlRfTElTVDoKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1Q6CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX1JFQ1RfTElTVDoKKwkJcmV0dXJuIG5yICUgMyB8fCBuciA9PSAwOworCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9UUklfRkFOOgorCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9UUklfU1RSSVA6CisJCXJldHVybiBuciA8IDM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQkKK30KKworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJdW5zaWduZWQgaW50IGZpbmlzaDsKKwl1bnNpZ25lZCBpbnQgcHJpbTsKKwl1bnNpZ25lZCBpbnQgbnVtdmVydHM7CisJdW5zaWduZWQgaW50IG9mZnNldDsgICAKKyAgICAgICAgdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsKK30gZHJtX3JhZGVvbl90Y2xfcHJpbV90OworCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICAgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqcHJpbSApCisKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBvZmZzZXQgPSBkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCArIGJ1Zi0+b2Zmc2V0ICsgcHJpbS0+c3RhcnQ7CisJaW50IG51bXZlcnRzID0gKGludClwcmltLT5udW12ZXJ0czsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJaW50IGkgPSAwOworCVJJTkdfTE9DQUxTOworCisJRFJNX0RFQlVHKCJod3ByaW0gMHgleCB2Zm10IDB4JXggJWQuLiVkICVkIHZlcnRzXG4iLAorCQkgIHByaW0tPnByaW0sCisJCSAgcHJpbS0+dmNfZm9ybWF0LAorCQkgIHByaW0tPnN0YXJ0LAorCQkgIHByaW0tPmZpbmlzaCwKKwkJICBwcmltLT5udW12ZXJ0cyk7CisKKwlpZiAoYmFkX3ByaW1fdmVydGV4X25yKCBwcmltLT5wcmltLCBwcmltLT5udW12ZXJ0cyApKSB7CisJCURSTV9FUlJPUiggImJhZCBwcmltICV4IG51bXZlcnRzICVkXG4iLCAKKwkJCSAgIHByaW0tPnByaW0sIHByaW0tPm51bXZlcnRzICk7CisJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCS8qIEVtaXQgdGhlIG5leHQgY2xpcHJlY3QgKi8KKwkJaWYgKCBpIDwgbmJveCApIHsKKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsIAorCQkJCQkgICAgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldICk7CisJCX0KKworCQkvKiBFbWl0IHRoZSB2ZXJ0ZXggYnVmZmVyIHJlbmRlcmluZyBjb21tYW5kcyAqLworCQlCRUdJTl9SSU5HKCA1ICk7CisKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9STkRSX0dFTl9JTkRYX1BSSU0sIDMgKSApOworCQlPVVRfUklORyggb2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBudW12ZXJ0cyApOworCQlPVVRfUklORyggcHJpbS0+dmNfZm9ybWF0ICk7CisJCU9VVF9SSU5HKCBwcmltLT5wcmltIHwgUkFERU9OX1BSSU1fV0FMS19MSVNUIHwKKwkJCSAgUkFERU9OX0NPTE9SX09SREVSX1JHQkEgfAorCQkJICBSQURFT05fVlRYX0ZNVF9SQURFT05fTU9ERSB8CisJCQkgIChudW12ZXJ0cyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSApOworCisJCUFEVkFOQ0VfUklORygpOworCisJCWkrKzsKKwl9IHdoaWxlICggaSA8IG5ib3ggKTsKK30KKworCisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfdCAqYnVmICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCVJJTkdfTE9DQUxTOworCisJYnVmX3ByaXYtPmFnZSA9ICsrZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CisKKwkvKiBFbWl0IHRoZSB2ZXJ0ZXggYnVmZmVyIGFnZSAqLworCUJFR0lOX1JJTkcoIDIgKTsKKwlSQURFT05fRElTUEFUQ0hfQUdFKCBidWZfcHJpdi0+YWdlICk7CisJQURWQU5DRV9SSU5HKCk7CisKKwlidWYtPnBlbmRpbmcgPSAxOworCWJ1Zi0+dXNlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJCSBkcm1fYnVmX3QgKmJ1ZiwKKwkJCQkJIGludCBzdGFydCwgaW50IGVuZCApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJpbmRpcmVjdDogYnVmPSVkIHM9MHgleCBlPTB4JXhcbiIsCisJCSAgIGJ1Zi0+aWR4LCBzdGFydCwgZW5kICk7CisKKwlpZiAoIHN0YXJ0ICE9IGVuZCApIHsKKwkJaW50IG9mZnNldCA9IChkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldAorCQkJICAgICAgKyBidWYtPm9mZnNldCArIHN0YXJ0KTsKKwkJaW50IGR3b3JkcyA9IChlbmQgLSBzdGFydCArIDMpIC8gc2l6ZW9mKHUzMik7CisKKwkJLyogSW5kaXJlY3QgYnVmZmVyIGRhdGEgbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZgorCQkgKiBkd29yZHMsIHNvIGlmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gb2RkIG51bWJlciB3ZSBtdXN0CisJCSAqIHBhZCB0aGUgZGF0YSB3aXRoIGEgVHlwZS0yIENQIHBhY2tldC4KKwkJICovCisJCWlmICggZHdvcmRzICYgMSApIHsKKwkJCXUzMiAqZGF0YSA9ICh1MzIgKikKKwkJCQkoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUKKwkJCQkgKyBidWYtPm9mZnNldCArIHN0YXJ0KTsKKwkJCWRhdGFbZHdvcmRzKytdID0gUkFERU9OX0NQX1BBQ0tFVDI7CisJCX0KKworCQkvKiBGaXJlIG9mZiB0aGUgaW5kaXJlY3QgYnVmZmVyICovCisJCUJFR0lOX1JJTkcoIDMgKTsKKworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0NQX0lCX0JBU0UsIDEgKSApOworCQlPVVRfUklORyggb2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBkd29yZHMgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQlkcm1fYnVmX3QgKmVsdF9idWYsCisJCQkJCWRybV9yYWRlb25fdGNsX3ByaW1fdCAqcHJpbSApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgKyBwcmltLT5vZmZzZXQ7CisJdTMyICpkYXRhOworCWludCBkd29yZHM7CisJaW50IGkgPSAwOworCWludCBzdGFydCA9IHByaW0tPnN0YXJ0ICsgUkFERU9OX0lOREVYX1BSSU1fT0ZGU0VUOworCWludCBjb3VudCA9IChwcmltLT5maW5pc2ggLSBzdGFydCkgLyBzaXplb2YodTE2KTsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisKKwlEUk1fREVCVUcoImh3cHJpbSAweCV4IHZmbXQgMHgleCAlZC4uJWQgb2Zmc2V0OiAleCBuciAlZFxuIiwKKwkJICBwcmltLT5wcmltLAorCQkgIHByaW0tPnZjX2Zvcm1hdCwKKwkJICBwcmltLT5zdGFydCwKKwkJICBwcmltLT5maW5pc2gsCisJCSAgcHJpbS0+b2Zmc2V0LAorCQkgIHByaW0tPm51bXZlcnRzKTsKKworCWlmIChiYWRfcHJpbV92ZXJ0ZXhfbnIoIHByaW0tPnByaW0sIGNvdW50ICkpIHsKKwkJRFJNX0VSUk9SKCAiYmFkIHByaW0gJXggY291bnQgJWRcbiIsIAorCQkJICAgcHJpbS0+cHJpbSwgY291bnQgKTsKKwkJcmV0dXJuOworCX0KKworCisJaWYgKCBzdGFydCA+PSBwcmltLT5maW5pc2ggfHwKKwkgICAgIChwcmltLT5zdGFydCAmIDB4NykgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCBwcmltLT5wcmltICk7CisJCXJldHVybjsKKwl9CisKKwlkd29yZHMgPSAocHJpbS0+ZmluaXNoIC0gcHJpbS0+c3RhcnQgKyAzKSAvIHNpemVvZih1MzIpOworCisJZGF0YSA9ICh1MzIgKikoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKworCQkgICAgICAgZWx0X2J1Zi0+b2Zmc2V0ICsgcHJpbS0+c3RhcnQpOworCisJZGF0YVswXSA9IENQX1BBQ0tFVDMoIFJBREVPTl8zRF9STkRSX0dFTl9JTkRYX1BSSU0sIGR3b3Jkcy0yICk7CisJZGF0YVsxXSA9IG9mZnNldDsKKwlkYXRhWzJdID0gcHJpbS0+bnVtdmVydHM7CisJZGF0YVszXSA9IHByaW0tPnZjX2Zvcm1hdDsKKwlkYXRhWzRdID0gKHByaW0tPnByaW0gfAorCQkgICBSQURFT05fUFJJTV9XQUxLX0lORCB8CisJCSAgIFJBREVPTl9DT0xPUl9PUkRFUl9SR0JBIHwKKwkJICAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAorCQkgICAoY291bnQgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkgKTsKKworCWRvIHsKKwkJaWYgKCBpIDwgbmJveCApIAorCQkJcmFkZW9uX2VtaXRfY2xpcF9yZWN0KCBkZXZfcHJpdiwgCisJCQkJCSAgICAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0gKTsKKworCQlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoIGRldiwgZWx0X2J1ZiwKKwkJCQkJICAgICBwcmltLT5zdGFydCwKKwkJCQkJICAgICBwcmltLT5maW5pc2ggKTsKKworCQlpKys7CisJfSB3aGlsZSAoIGkgPCBuYm94ICk7CisKK30KKworI2RlZmluZSBSQURFT05fTUFYX1RFWFRVUkVfU0laRSAoUkFERU9OX0JVRkZFUl9TSVpFIC0gOCAqIHNpemVvZih1MzIpKQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9kaXNwYXRjaF90ZXh0dXJlKCBEUk1GSUxFIGZpbHAsCisJCQkJICAgICAgIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICAgICBkcm1fcmFkZW9uX3RleHR1cmVfdCAqdGV4LAorCQkJCSAgICAgICBkcm1fcmFkZW9uX3RleF9pbWFnZV90ICppbWFnZSApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX2J1Zl90ICpidWY7CisJdTMyIGZvcm1hdDsKKwl1MzIgKmJ1ZmZlcjsKKwljb25zdCB1OCBfX3VzZXIgKmRhdGE7CisJaW50IHNpemUsIGR3b3JkcywgdGV4X3dpZHRoLCBibGl0X3dpZHRoOworCXUzMiBoZWlnaHQ7CisJaW50IGk7CisJdTMyIHRleHBpdGNoLCBtaWNyb3RpbGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnRleC0+b2Zmc2V0ICkgKSB7CisJCURSTV9FUlJPUiggIkludmFsaWQgZGVzdGluYXRpb24gb2Zmc2V0XG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9URVhUVVJFX0xPQUQ7CisKKwkvKiBGbHVzaCB0aGUgcGl4ZWwgY2FjaGUuICBUaGlzIGVuc3VyZXMgbm8gcGl4ZWwgZGF0YSBnZXRzIG1peGVkCisJICogdXAgd2l0aCB0aGUgdGV4dHVyZSBkYXRhIGZyb20gdGhlIGhvc3QgZGF0YSBibGl0LCBvdGhlcndpc2UKKwkgKiBwYXJ0IG9mIHRoZSB0ZXh0dXJlIGltYWdlIG1heSBiZSBjb3JydXB0ZWQuCisJICovCisJQkVHSU5fUklORyggNCApOworCVJBREVPTl9GTFVTSF9DQUNIRSgpOworCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCS8qIFRoZSBNZXNhIHRleHR1cmUgZnVuY3Rpb25zIHByb3ZpZGUgdGhlIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBhcyB0aGUKKwkgKiBjaGlwIHdhbnRzIGl0LCBidXQgd2UgbmVlZCB0byBjb21wZW5zYXRlIGZvciB0aGUgZmFjdCB0aGF0IHRoZSBDUAorCSAqIHJpbmcgZ2V0cyBieXRlLXN3YXBwZWQKKwkgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisJT1VUX1JJTkdfUkVHKCBSQURFT05fUkJCTV9HVUlDTlRMLCBSQURFT05fSE9TVF9EQVRBX1NXQVBfMzJCSVQgKTsKKwlBRFZBTkNFX1JJTkcoKTsKKyNlbmRpZgorCisKKwkvKiBUaGUgY29tcGlsZXIgd29uJ3Qgb3B0aW1pemUgYXdheSBhIGRpdmlzaW9uIGJ5IGEgdmFyaWFibGUsCisJICogZXZlbiBpZiB0aGUgb25seSBsZWdhbCB2YWx1ZXMgYXJlIHBvd2VycyBvZiB0d28uICBUaHVzLCB3ZSdsbAorCSAqIHVzZSBhIHNoaWZ0IGluc3RlYWQuCisJICovCisJc3dpdGNoICggdGV4LT5mb3JtYXQgKSB7CisJY2FzZSBSQURFT05fVFhGT1JNQVRfQVJHQjg4ODg6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfUkdCQTg4ODg6CisJCWZvcm1hdCA9IFJBREVPTl9DT0xPUl9GT1JNQVRfQVJHQjg4ODg7CisJCXRleF93aWR0aCA9IHRleC0+d2lkdGggKiA0OworCQlibGl0X3dpZHRoID0gaW1hZ2UtPndpZHRoICogNDsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fVFhGT1JNQVRfQUk4ODoKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9BUkdCMTU1NToKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9SR0I1NjU6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfQVJHQjQ0NDQ6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfVllVWTQyMjoKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9ZVllVNDIyOgorCQlmb3JtYXQgPSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NTsKKwkJdGV4X3dpZHRoID0gdGV4LT53aWR0aCAqIDI7CisJCWJsaXRfd2lkdGggPSBpbWFnZS0+d2lkdGggKiAyOworCQlicmVhazsKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9JODoKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9SR0IzMzI6CisJCWZvcm1hdCA9IFJBREVPTl9DT0xPUl9GT1JNQVRfQ0k4OworCQl0ZXhfd2lkdGggPSB0ZXgtPndpZHRoICogMTsKKwkJYmxpdF93aWR0aCA9IGltYWdlLT53aWR0aCAqIDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUiggImludmFsaWQgdGV4dHVyZSBmb3JtYXQgJWRcbiIsIHRleC0+Zm9ybWF0ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCXRleHBpdGNoID0gdGV4LT5waXRjaDsKKwlpZiAoKHRleHBpdGNoIDw8IDIyKSAmIFJBREVPTl9EU1RfVElMRV9NSUNSTykgeworCQltaWNyb3RpbGUgPSAxOworCQlpZiAodGV4X3dpZHRoIDwgNjQpIHsKKwkJCXRleHBpdGNoICY9IH4oUkFERU9OX0RTVF9USUxFX01JQ1JPID4+IDIyKTsKKwkJCS8qIHdlIGdvdCB0aWxlZCBjb29yZGluYXRlcywgdW50aWxlIHRoZW0gKi8KKwkJCWltYWdlLT54ICo9IDI7CisJCX0KKwl9CisJZWxzZSBtaWNyb3RpbGUgPSAwOworCisJRFJNX0RFQlVHKCJ0ZXg9JWR4JWQgYmxpdD0lZFxuIiwgdGV4X3dpZHRoLCB0ZXgtPmhlaWdodCwgYmxpdF93aWR0aCApOworCisJZG8geworCQlEUk1fREVCVUcoICJ0ZXg6IG9mcz0weCV4IHA9JWQgZj0lZCB4PSVoZCB5PSVoZCB3PSVoZCBoPSVoZFxuIiwKKwkJCSAgIHRleC0+b2Zmc2V0ID4+IDEwLCB0ZXgtPnBpdGNoLCB0ZXgtPmZvcm1hdCwKKwkJCSAgIGltYWdlLT54LCBpbWFnZS0+eSwgaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0ICk7CisKKwkJLyogTWFrZSBhIGNvcHkgb2Ygc29tZSBwYXJhbWV0ZXJzIGluIGNhc2Ugd2UgaGF2ZSB0bworCQkgKiB1cGRhdGUgdGhlbSBmb3IgYSBtdWx0aS1wYXNzIHRleHR1cmUgYmxpdC4KKwkJICovCisJCWhlaWdodCA9IGltYWdlLT5oZWlnaHQ7CisJCWRhdGEgPSAoY29uc3QgdTggX191c2VyICopaW1hZ2UtPmRhdGE7CisJCQorCQlzaXplID0gaGVpZ2h0ICogYmxpdF93aWR0aDsKKworCQlpZiAoIHNpemUgPiBSQURFT05fTUFYX1RFWFRVUkVfU0laRSApIHsKKwkJCWhlaWdodCA9IFJBREVPTl9NQVhfVEVYVFVSRV9TSVpFIC8gYmxpdF93aWR0aDsKKwkJCXNpemUgPSBoZWlnaHQgKiBibGl0X3dpZHRoOworCQl9IGVsc2UgaWYgKCBzaXplIDwgNCAmJiBzaXplID4gMCApIHsKKwkJCXNpemUgPSA0OworCQl9IGVsc2UgaWYgKCBzaXplID09IDAgKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoIGRldiApOworCQlpZiAoIDAgJiYgIWJ1ZiApIHsKKwkJCXJhZGVvbl9kb19jcF9pZGxlKCBkZXZfcHJpdiApOworCQkJYnVmID0gcmFkZW9uX2ZyZWVsaXN0X2dldCggZGV2ICk7CisJCX0KKwkJaWYgKCAhYnVmICkgeworCQkJRFJNX0RFQlVHKCJyYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZTogRUFHQUlOXG4iKTsKKwkJCWlmIChEUk1fQ09QWV9UT19VU0VSKCB0ZXgtPmltYWdlLCBpbWFnZSwgc2l6ZW9mKCppbWFnZSkgKSkKKwkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJcmV0dXJuIERSTV9FUlIoRUFHQUlOKTsKKwkJfQorCisKKwkJLyogRGlzcGF0Y2ggdGhlIGluZGlyZWN0IGJ1ZmZlci4KKwkJICovCisJCWJ1ZmZlciA9ICh1MzIqKSgoY2hhciopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsgYnVmLT5vZmZzZXQpOworCQlkd29yZHMgPSBzaXplIC8gNDsKKwkJYnVmZmVyWzBdID0gQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfSE9TVERBVEFfQkxULCBkd29yZHMgKyA2ICk7CisJCWJ1ZmZlclsxXSA9IChSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkgICAgIFJBREVPTl9HTUNfQlJVU0hfTk9ORSB8CisJCQkgICAgIChmb3JtYXQgPDwgOCkgfAorCQkJICAgICBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkgICAgIFJBREVPTl9ST1AzX1MgfAorCQkJICAgICBSQURFT05fRFBfU1JDX1NPVVJDRV9IT1NUX0RBVEEgfAorCQkJICAgICBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgfAorCQkJICAgICBSQURFT05fR01DX1dSX01TS19ESVMpOworCQkKKwkJYnVmZmVyWzJdID0gKHRleHBpdGNoIDw8IDIyKSB8ICh0ZXgtPm9mZnNldCA+PiAxMCk7CisJCWJ1ZmZlclszXSA9IDB4ZmZmZmZmZmY7CisJCWJ1ZmZlcls0XSA9IDB4ZmZmZmZmZmY7CisJCWJ1ZmZlcls1XSA9IChpbWFnZS0+eSA8PCAxNikgfCBpbWFnZS0+eDsKKwkJYnVmZmVyWzZdID0gKGhlaWdodCA8PCAxNikgfCBpbWFnZS0+d2lkdGg7CisJCWJ1ZmZlcls3XSA9IGR3b3JkczsKKwkJYnVmZmVyICs9IDg7CisKKwkJCisKKwkJaWYgKG1pY3JvdGlsZSkgeworCQkJLyogdGV4dHVyZSBtaWNybyB0aWxpbmcgaW4gdXNlLCBtaW5pbXVtIHRleHR1cmUgd2lkdGggaXMgdGh1cyAxNiBieXRlcy4KKwkJCSAgIGhvd2V2ZXIsIHdlIGNhbm5vdCB1c2UgYmxpdHRlciBkaXJlY3RseSBmb3IgdGV4dHVyZSB3aWR0aCA8IDY0IGJ5dGVzLAorCQkJICAgc2luY2UgbWluaW11bSB0ZXggcGl0Y2ggaXMgNjQgYnl0ZXMgYW5kIHdlIG5lZWQgdGhpcyB0byBtYXRjaAorCQkJICAgdGhlIHRleHR1cmUgd2lkdGgsIG90aGVyd2lzZSB0aGUgYmxpdHRlciB3aWxsIHRpbGUgaXQgd3JvbmcuCisJCQkgICBUaHVzLCB0aWxpbmcgbWFudWFsbHkgaW4gdGhpcyBjYXNlLiBBZGRpdGlvbmFsbHksIG5lZWQgdG8gc3BlY2lhbAorCQkJICAgY2FzZSB0ZXggaGVpZ2h0ID0gMSwgc2luY2Ugb3VyIGFjdHVhbCBpbWFnZSB3aWxsIGhhdmUgaGVpZ2h0IDIKKwkJCSAgIGFuZCB3ZSBuZWVkIHRvIGVuc3VyZSB3ZSBkb24ndCByZWFkIGJleW9uZCB0aGUgdGV4dHVyZSBzaXplCisJCQkgICBmcm9tIHVzZXIgc3BhY2UuICovCisJCQlpZiAodGV4LT5oZWlnaHQgPT0gMSkgeworCQkJCWlmICh0ZXhfd2lkdGggPj0gNjQgfHwgdGV4X3dpZHRoIDw9IDE2KSB7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLAorCQkJCQkJCSAgICAgICB0ZXhfd2lkdGggKiBzaXplb2YodTMyKSkpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAodGV4X3dpZHRoID09IDMyKSB7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLCAxNikpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciArIDgsIGRhdGEgKyAxNiwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA+PSA2NCB8fCB0ZXhfd2lkdGggPT0gMTYpIHsKKwkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwKKwkJCQkJCSAgICAgICBkd29yZHMgKiBzaXplb2YodTMyKSkpIHsKKwkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gZGF0YSwgJWQgZHdvcmRzXG4iLAorCQkJCQkJICBkd29yZHMpOworCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAodGV4X3dpZHRoIDwgMTYpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkrKykgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgdGV4X3dpZHRoKSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWJ1ZmZlciArPSA0OworCQkJCQlkYXRhICs9IHRleF93aWR0aDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA9PSAzMikgeworCQkJCS8qIFRPRE86IG1ha2Ugc3VyZSB0aGlzIHdvcmtzIHdoZW4gbm90IGZpdHRpbmcgaW4gb25lIGJ1ZmZlcgorCQkJCSAgIChpLmUuIDMyYnl0ZXMgeCAyMDQ4Li4uKSAqLworCQkJCWZvciAoaSA9IDA7IGkgPCB0ZXgtPmhlaWdodDsgaSArPSAyKSB7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLCAxNikpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlkYXRhICs9IDE2OworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciArIDgsIGRhdGEsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWRhdGEgKz0gMTY7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyICsgNCwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQkJZGF0YSArPSAxNjsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIgKyAxMiwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQkJZGF0YSArPSAxNjsKKwkJCQkJYnVmZmVyICs9IDE2OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmICh0ZXhfd2lkdGggPj0gMzIpIHsKKwkJCQkvKiBUZXh0dXJlIGltYWdlIHdpZHRoIGlzIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtLCBzbyB3ZQorCQkJCSAqIGNhbiB1cGxvYWQgaXQgZGlyZWN0bHkuCisJCQkJICovCisJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsCisJCQkJCQkgICAgICAgZHdvcmRzICogc2l6ZW9mKHUzMikpKSB7CisJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIGRhdGEsICVkIGR3b3Jkc1xuIiwKKwkJCQkJCSAgZHdvcmRzKTsKKwkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIFRleHR1cmUgaW1hZ2Ugd2lkdGggaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtLCBzbyB3ZQorCQkJCSAqIG5lZWQgdG8gcGFkIG91dCBlYWNoIGltYWdlIHNjYW5saW5lIHRvIHRoZSBtaW5pbXVtCisJCQkJICogd2lkdGguCisJCQkJICovCisJCQkJZm9yIChpID0gMCA7IGkgPCB0ZXgtPmhlaWdodCA7IGkrKykgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgdGV4X3dpZHRoICkpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWJ1ZmZlciArPSA4OworCQkJCQlkYXRhICs9IHRleF93aWR0aDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlidWYtPmZpbHAgPSBmaWxwOworCQlidWYtPnVzZWQgPSAoZHdvcmRzICsgOCkgKiBzaXplb2YodTMyKTsKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGJ1ZiwgMCwgYnVmLT51c2VkICk7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKworCQkvKiBVcGRhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG5leHQgdGltZSAqLworCQlpbWFnZS0+eSArPSBoZWlnaHQ7CisJCWltYWdlLT5oZWlnaHQgLT0gaGVpZ2h0OworCQlpbWFnZS0+ZGF0YSA9IChjb25zdCB1OCBfX3VzZXIgKilpbWFnZS0+ZGF0YSArIHNpemU7CisJfSB3aGlsZSAoaW1hZ2UtPmhlaWdodCA+IDApOworCisJLyogRmx1c2ggdGhlIHBpeGVsIGNhY2hlIGFmdGVyIHRoZSBibGl0IGNvbXBsZXRlcy4gIFRoaXMgZW5zdXJlcworCSAqIHRoZSB0ZXh0dXJlIGRhdGEgaXMgd3JpdHRlbiBvdXQgdG8gbWVtb3J5IGJlZm9yZSByZW5kZXJpbmcKKwkgKiBjb250aW51ZXMuCisJICovCisJQkVHSU5fUklORyggNCApOworCVJBREVPTl9GTFVTSF9DQUNIRSgpOworCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKKwlBRFZBTkNFX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3RpcHBsZSggZHJtX2RldmljZV90ICpkZXYsIHUzMiAqc3RpcHBsZSApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUJFR0lOX1JJTkcoIDM1ICk7CisKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JFX1NUSVBQTEVfQUREUiwgMCApICk7CisJT1VUX1JJTkcoIDB4MDAwMDAwMDAgKTsKKworCU9VVF9SSU5HKCBDUF9QQUNLRVQwX1RBQkxFKCBSQURFT05fUkVfU1RJUFBMRV9EQVRBLCAzMSApICk7CisJZm9yICggaSA9IDAgOyBpIDwgMzIgOyBpKysgKSB7CisJCU9VVF9SSU5HKCBzdGlwcGxlW2ldICk7CisJfQorCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3MoaW50IHN1cmZfaW5kZXgsIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwlpZiAoIWRldl9wcml2LT5tbWlvKQorCQlyZXR1cm47CisKKwlyYWRlb25fZG9fY3BfaWRsZShkZXZfcHJpdik7CisKKwlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0lORk8gKyAxNipzdXJmX2luZGV4LAorCQlkZXZfcHJpdi0+c3VyZmFjZXNbc3VyZl9pbmRleF0uZmxhZ3MpOworCVJBREVPTl9XUklURShSQURFT05fU1VSRkFDRTBfTE9XRVJfQk9VTkQgKyAxNipzdXJmX2luZGV4LAorCQlkZXZfcHJpdi0+c3VyZmFjZXNbc3VyZl9pbmRleF0ubG93ZXIpOworCVJBREVPTl9XUklURShSQURFT05fU1VSRkFDRTBfVVBQRVJfQk9VTkQgKyAxNipzdXJmX2luZGV4LAorCQlkZXZfcHJpdi0+c3VyZmFjZXNbc3VyZl9pbmRleF0udXBwZXIpOworfQorCisKKy8qIEFsbG9jYXRlcyBhIHZpcnR1YWwgc3VyZmFjZQorICogZG9lc24ndCBhbHdheXMgYWxsb2NhdGUgYSByZWFsIHN1cmZhY2UsIHdpbGwgc3RyZXRjaCBhbiBleGlzdGluZyAKKyAqIHN1cmZhY2Ugd2hlbiBwb3NzaWJsZS4KKyAqCisgKiBOb3RlIHRoYXQgcmVmY291bnQgY2FuIGJlIGF0IG1vc3QgMiwgc2luY2UgZHVyaW5nIGEgZnJlZSByZWZjb3VudD0zCisgKiBtaWdodCBtZWFuIHdlIGhhdmUgdG8gYWxsb2NhdGUgYSBuZXcgc3VyZmFjZSB3aGljaCBtaWdodCBub3QgYWx3YXlzCisgKiBiZSBhdmFpbGFibGUuCisgKiBGb3IgZXhhbXBsZSA6IHdlIGFsbG9jYXRlIHRocmVlIGNvbnRpZ291cyBzdXJmYWNlcyBBQkMuIElmIEIgaXMgCisgKiBmcmVlZCwgd2Ugc3VkZGVubHkgbmVlZCB0d28gc3VyZmFjZXMgdG8gc3RvcmUgQSBhbmQgQywgd2hpY2ggbWlnaHQKKyAqIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW50IGFsbG9jX3N1cmZhY2UoZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3QqIG5ldywgZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBEUk1GSUxFIGZpbHApCit7CisJc3RydWN0IHJhZGVvbl92aXJ0X3N1cmZhY2UgKnM7CisJaW50IGk7CisJaW50IHZpcnRfc3VyZmFjZV9pbmRleDsKKwl1aW50MzJfdCBuZXdfdXBwZXIsIG5ld19sb3dlcjsKKworCW5ld19sb3dlciA9IG5ldy0+YWRkcmVzczsKKwluZXdfdXBwZXIgPSBuZXdfbG93ZXIgKyBuZXctPnNpemUgLSAxOworCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKChuZXdfbG93ZXIgPj0gbmV3X3VwcGVyKSB8fCAobmV3LT5mbGFncyA9PSAwKSB8fCAobmV3LT5zaXplID09IDApIHx8CisJCSgobmV3X3VwcGVyICYgUkFERU9OX1NVUkZfQUREUkVTU19GSVhFRF9NQVNLKSAhPSBSQURFT05fU1VSRl9BRERSRVNTX0ZJWEVEX01BU0spIHx8CisJCSgobmV3X2xvd2VyICYgUkFERU9OX1NVUkZfQUREUkVTU19GSVhFRF9NQVNLKSAhPSAwKSkKKwkJcmV0dXJuIC0xOworCisJLyogbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG92ZXJsYXAgd2l0aCBleGlzdGluZyBzdXJmYWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKKwkJaWYgKChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgIT0gMCkgJiYKKwkJKCggKG5ld19sb3dlciA+PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIpICYmCisJCQkobmV3X2xvd2VyIDwgZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyKSApIHx8CisJCSAoIChuZXdfbG93ZXIgPCBkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIpICYmCisJCQkobmV3X3VwcGVyID4gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSApKSApeworCQlyZXR1cm4gLTE7fQorCX0KKworCS8qIGZpbmQgYSB2aXJ0dWFsIHN1cmZhY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMipSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspCisJCWlmIChkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXS5maWxwID09IDApCisJCQlicmVhazsKKwlpZiAoaSA9PSAyKlJBREVPTl9NQVhfU1VSRkFDRVMpIHsKKwkJcmV0dXJuIC0xO30KKwl2aXJ0X3N1cmZhY2VfaW5kZXggPSBpOworCisJLyogdHJ5IHRvIHJldXNlIGFuIGV4aXN0aW5nIHN1cmZhY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CisJCS8qIGV4dGVuZCBiZWZvcmUgKi8KKwkJaWYgKChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgPT0gMSkgJiYKKwkJICAobmV3LT5mbGFncyA9PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0uZmxhZ3MpICYmCisJCSAgKG5ld191cHBlciArIDEgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSkgeworCQkJcyA9ICYoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbdmlydF9zdXJmYWNlX2luZGV4XSk7CisJCQlzLT5zdXJmYWNlX2luZGV4ID0gaTsKKwkJCXMtPmxvd2VyID0gbmV3X2xvd2VyOworCQkJcy0+dXBwZXIgPSBuZXdfdXBwZXI7CisJCQlzLT5mbGFncyA9IG5ldy0+ZmxhZ3M7CisJCQlzLT5maWxwID0gZmlscDsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCsrOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyID0gcy0+bG93ZXI7CisJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKKwkJCXJldHVybiB2aXJ0X3N1cmZhY2VfaW5kZXg7CisJCX0KKworCQkvKiBleHRlbmQgYWZ0ZXIgKi8KKwkJaWYgKChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgPT0gMSkgJiYKKwkJICAobmV3LT5mbGFncyA9PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0uZmxhZ3MpICYmCisJCSAgKG5ld19sb3dlciA9PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0udXBwZXIgKyAxKSkgeworCQkJcyA9ICYoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbdmlydF9zdXJmYWNlX2luZGV4XSk7CisJCQlzLT5zdXJmYWNlX2luZGV4ID0gaTsKKwkJCXMtPmxvd2VyID0gbmV3X2xvd2VyOworCQkJcy0+dXBwZXIgPSBuZXdfdXBwZXI7CisJCQlzLT5mbGFncyA9IG5ldy0+ZmxhZ3M7CisJCQlzLT5maWxwID0gZmlscDsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCsrOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyID0gcy0+dXBwZXI7CisJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKKwkJCXJldHVybiB2aXJ0X3N1cmZhY2VfaW5kZXg7CisJCX0KKwl9CisKKwkvKiBva2F5LCB3ZSBuZWVkIGEgbmV3IG9uZSAqLworCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKKwkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCA9PSAwKSB7CisJCQlzID0gJihkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1t2aXJ0X3N1cmZhY2VfaW5kZXhdKTsKKwkJCXMtPnN1cmZhY2VfaW5kZXggPSBpOworCQkJcy0+bG93ZXIgPSBuZXdfbG93ZXI7CisJCQlzLT51cHBlciA9IG5ld191cHBlcjsKKwkJCXMtPmZsYWdzID0gbmV3LT5mbGFnczsKKwkJCXMtPmZpbHAgPSBmaWxwOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID0gMTsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlciA9IHMtPmxvd2VyOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyID0gcy0+dXBwZXI7CisJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0uZmxhZ3MgPSBzLT5mbGFnczsKKwkJCXJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3Mocy0+c3VyZmFjZV9pbmRleCwgZGV2X3ByaXYpOworCQkJcmV0dXJuIHZpcnRfc3VyZmFjZV9pbmRleDsKKwkJfQorCX0KKworCS8qIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGZyZWVfc3VyZmFjZShEUk1GSUxFIGZpbHAsIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGxvd2VyKQoreworCXN0cnVjdCByYWRlb25fdmlydF9zdXJmYWNlICpzOworCWludCBpOworCS8qIGZpbmQgdGhlIHZpcnR1YWwgc3VyZmFjZSAqLworCWZvcihpID0gMDsgaSA8IDIqUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CisJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldKTsKKwkJaWYgKHMtPmZpbHApIHsKKwkJCWlmICgobG93ZXIgPT0gcy0+bG93ZXIpICYmIChmaWxwID09IHMtPmZpbHApKSB7CisJCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5sb3dlciA9PSBzLT5sb3dlcikKKwkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLmxvd2VyID0gcy0+dXBwZXI7CisKKwkJCQlpZiAoZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLnVwcGVyID09IHMtPnVwcGVyKQorCQkJCQlkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0udXBwZXIgPSBzLT5sb3dlcjsKKworCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5yZWZjb3VudC0tOworCQkJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0ucmVmY291bnQgPT0gMCkKKwkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLmZsYWdzID0gMDsKKwkJCQlzLT5maWxwID0gTlVMTDsKKwkJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX3N1cmZhY2VzX3JlbGVhc2UoRFJNRklMRSBmaWxwLCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYpCit7CisJaW50IGk7CisJZm9yKCBpID0gMDsgaSA8IDIqUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKQorCXsKKwkJaWYgKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmZpbHAgPT0gZmlscCkKKwkJCWZyZWVfc3VyZmFjZShmaWxwLCBkZXZfcHJpdiwgZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbaV0ubG93ZXIpOworCX0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSU9DVEwgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX3N1cmZhY2VfYWxsb2MoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190IGFsbG9jOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFsbG9jLCAoZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3QgX191c2VyICopZGF0YSwKKwkJCQkgIHNpemVvZihhbGxvYykpOworCisJaWYgKGFsbG9jX3N1cmZhY2UoJmFsbG9jLCBkZXZfcHJpdiwgZmlscCkgPT0gLTEpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fc3VyZmFjZV9mcmVlKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90IG1lbWZyZWU7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobWVtZnJlZSwgKGRybV9yYWRlb25fbWVtX2ZyZWVfdCBfX3VzZXIgKilkYXRhLAorCQkJCSAgc2l6ZW9mKG1lbWZyZWUpICk7CisKKwlpZiAoZnJlZV9zdXJmYWNlKGZpbHAsIGRldl9wcml2LCBtZW1mcmVlLmFkZHJlc3MpKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2NsZWFyKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yYWRlb25fY2xlYXJfdCBjbGVhcjsKKwlkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCBkZXB0aF9ib3hlc1tSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGNsZWFyLCAoZHJtX3JhZGVvbl9jbGVhcl90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZihjbGVhcikgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWlmICggc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMgKQorCQlzYXJlYV9wcml2LT5uYm94ID0gUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmZGVwdGhfYm94ZXMsIGNsZWFyLmRlcHRoX2JveGVzLAorCQkJICAgICBzYXJlYV9wcml2LT5uYm94ICogc2l6ZW9mKGRlcHRoX2JveGVzWzBdKSApICkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCXJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhciggZGV2LCAmY2xlYXIsIGRlcHRoX2JveGVzICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCisKKy8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6CisgKi8gCitzdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRyggIlxuIiApOworCisJQkVHSU5fUklORyggNiApOworCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwsIDAgKSApOworCU9VVF9SSU5HKCBSQURFT05fUkVBRCggUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwgKSB8IFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwgKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0NSVEMyX09GRlNFVF9DTlRMLCAwICkgKTsKKwlPVVRfUklORyggUkFERU9OX1JFQUQoIFJBREVPTl9DUlRDMl9PRkZTRVRfQ05UTCApIHwgUkFERU9OX0NSVENfT0ZGU0VUX0ZMSVBfQ05UTCApOworCUFEVkFOQ0VfUklORygpOworCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAxOworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbmV2ZXIgYSBjbGllbnQgZGllcywgZnJvbSBkcm1fcmVsZWFzZS4KKyAqIE5PVEU6ICBMb2NrIGlzbid0IG5lY2Vzc2FyaWx5IGhlbGQgd2hlbiB0aGlzIGlzIGNhbGxlZCEKKyAqLworc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSAhPSAwKQorCQlyYWRlb25fY3BfZGlzcGF0Y2hfZmxpcCggZGV2ICk7CisKKwlkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFN3YXBwaW5nIGFuZCBmbGlwcGluZyBhcmUgZGlmZmVyZW50IG9wZXJhdGlvbnMsIG5lZWQgZGlmZmVyZW50IGlvY3Rscy4KKyAqIFRoZXkgY2FuICYgc2hvdWxkIGJlIGludGVybWl4ZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSAzZCB3aW5kb3dzLiAgCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2ZsaXAoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKCFkZXZfcHJpdi0+cGFnZV9mbGlwcGluZykgCisJCXJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKCBkZXYgKTsKKwkJCisJcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3Bfc3dhcCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlyYWRlb25fY3BfZGlzcGF0Y2hfc3dhcCggZGV2ICk7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF92ZXJ0ZXgoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9yYWRlb25fdmVydGV4X3QgdmVydGV4OworCWRybV9yYWRlb25fdGNsX3ByaW1fdCBwcmltOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTiggZmlscF9wcml2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHZlcnRleCwgKGRybV9yYWRlb25fdmVydGV4X3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHZlcnRleCkgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBpbmRleD0lZCBjb3VudD0lZCBkaXNjYXJkPSVkXG4iLAorCQkgICBEUk1fQ1VSUkVOVFBJRCwKKwkJICAgdmVydGV4LmlkeCwgdmVydGV4LmNvdW50LCB2ZXJ0ZXguZGlzY2FyZCApOworCisJaWYgKCB2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICB2ZXJ0ZXguaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCB2ZXJ0ZXgucHJpbSA8IDAgfHwKKwkgICAgIHZlcnRleC5wcmltID4gUkFERU9OX1BSSU1fVFlQRV8zVlJUX0xJTkVfTElTVCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIHByaW0gJWRcbiIsIHZlcnRleC5wcmltICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmID0gZG1hLT5idWZsaXN0W3ZlcnRleC5pZHhdOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCB2ZXJ0ZXguaWR4ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJLyogQnVpbGQgdXAgYSBwcmltX3QgcmVjb3JkOgorCSAqLworCWlmICh2ZXJ0ZXguY291bnQpIHsKKwkJYnVmLT51c2VkID0gdmVydGV4LmNvdW50OyAvKiBub3QgdXNlZD8gKi8KKworCQlpZiAoIHNhcmVhX3ByaXYtPmRpcnR5ICYgflJBREVPTl9VUExPQURfQ0xJUFJFQ1RTICkgeworCQkJaWYgKCByYWRlb25fZW1pdF9zdGF0ZSggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlLAorCQkJCQkJc2FyZWFfcHJpdi0+dGV4X3N0YXRlLAorCQkJCQkJc2FyZWFfcHJpdi0+ZGlydHkgKSApIHsKKwkJCQlEUk1fRVJST1IoICJyYWRlb25fZW1pdF9zdGF0ZSBmYWlsZWRcbiIgKTsKKwkJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCQl9CisKKwkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH4oUkFERU9OX1VQTE9BRF9URVgwSU1BR0VTIHwKKwkJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUyB8CisJCQkJCSAgICAgICBSQURFT05fVVBMT0FEX1RFWDJJTUFHRVMgfAorCQkJCQkgICAgICAgUkFERU9OX1JFUVVJUkVfUVVJRVNDRU5DRSk7CisJCX0KKworCQlwcmltLnN0YXJ0ID0gMDsKKwkJcHJpbS5maW5pc2ggPSB2ZXJ0ZXguY291bnQ7IC8qIHVudXNlZCAqLworCQlwcmltLnByaW0gPSB2ZXJ0ZXgucHJpbTsKKwkJcHJpbS5udW12ZXJ0cyA9IHZlcnRleC5jb3VudDsKKwkJcHJpbS52Y19mb3JtYXQgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dmNfZm9ybWF0OworCQkKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleCggZGV2LCBidWYsICZwcmltICk7CisJfQorCisJaWYgKHZlcnRleC5kaXNjYXJkKSB7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKwl9CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9pbmRpY2VzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcmFkZW9uX2luZGljZXNfdCBlbHRzOworCWRybV9yYWRlb25fdGNsX3ByaW1fdCBwcmltOworCWludCBjb3VudDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTiggZmlscF9wcml2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGVsdHMsIChkcm1fcmFkZW9uX2luZGljZXNfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoZWx0cykgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBpbmRleD0lZCBzdGFydD0lZCBlbmQ9JWQgZGlzY2FyZD0lZFxuIiwKKwkJICAgRFJNX0NVUlJFTlRQSUQsCisJCSAgIGVsdHMuaWR4LCBlbHRzLnN0YXJ0LCBlbHRzLmVuZCwgZWx0cy5kaXNjYXJkICk7CisKKwlpZiAoIGVsdHMuaWR4IDwgMCB8fCBlbHRzLmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICAgZWx0cy5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGVsdHMucHJpbSA8IDAgfHwKKwkgICAgIGVsdHMucHJpbSA+IFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCBlbHRzLnByaW0gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbZWx0cy5pZHhdOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCBlbHRzLmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWNvdW50ID0gKGVsdHMuZW5kIC0gZWx0cy5zdGFydCkgLyBzaXplb2YodTE2KTsKKwllbHRzLnN0YXJ0IC09IFJBREVPTl9JTkRFWF9QUklNX09GRlNFVDsKKworCWlmICggZWx0cy5zdGFydCAmIDB4NyApIHsKKwkJRFJNX0VSUk9SKCAibWlzYWxpZ25lZCBidWZmZXIgMHgleFxuIiwgZWx0cy5zdGFydCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGVsdHMuc3RhcnQgPCBidWYtPnVzZWQgKSB7CisJCURSTV9FUlJPUiggIm5vIGhlYWRlciAweCV4IC0gMHgleFxuIiwgZWx0cy5zdGFydCwgYnVmLT51c2VkICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJYnVmLT51c2VkID0gZWx0cy5lbmQ7CisKKwlpZiAoIHNhcmVhX3ByaXYtPmRpcnR5ICYgflJBREVPTl9VUExPQURfQ0xJUFJFQ1RTICkgeworCQlpZiAoIHJhZGVvbl9lbWl0X3N0YXRlKCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZSwKKwkJCQkJc2FyZWFfcHJpdi0+dGV4X3N0YXRlLAorCQkJCQlzYXJlYV9wcml2LT5kaXJ0eSApICkgeworCQkJRFJNX0VSUk9SKCAicmFkZW9uX2VtaXRfc3RhdGUgZmFpbGVkXG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+KFJBREVPTl9VUExPQURfVEVYMElNQUdFUyB8CisJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUyB8CisJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMklNQUdFUyB8CisJCQkJICAgICAgIFJBREVPTl9SRVFVSVJFX1FVSUVTQ0VOQ0UpOworCX0KKworCisJLyogQnVpbGQgdXAgYSBwcmltX3QgcmVjb3JkOgorCSAqLworCXByaW0uc3RhcnQgPSBlbHRzLnN0YXJ0OworCXByaW0uZmluaXNoID0gZWx0cy5lbmQ7IAorCXByaW0ucHJpbSA9IGVsdHMucHJpbTsKKwlwcmltLm9mZnNldCA9IDA7CS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGRtYSBidWZmZXJzICovCisJcHJpbS5udW12ZXJ0cyA9IFJBREVPTl9NQVhfVkJfVkVSVFM7IC8qIGR1aCAqLworCXByaW0udmNfZm9ybWF0ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnZjX2Zvcm1hdDsKKwkKKwlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyggZGV2LCBidWYsICZwcmltICk7CisJaWYgKGVsdHMuZGlzY2FyZCkgeworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJfQorCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfdGV4dHVyZSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3RleHR1cmVfdCB0ZXg7CisJZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBpbWFnZTsKKwlpbnQgcmV0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggdGV4LCAoZHJtX3JhZGVvbl90ZXh0dXJlX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKHRleCkgKTsKKworCWlmICggdGV4LmltYWdlID09IE5VTEwgKSB7CisJCURSTV9FUlJPUiggIm51bGwgdGV4dHVyZSBpbWFnZSFcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJmltYWdlLAorCQkJICAgICAoZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBfX3VzZXIgKil0ZXguaW1hZ2UsCisJCQkgICAgIHNpemVvZihpbWFnZSkgKSApCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlyZXQgPSByYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZSggZmlscCwgZGV2LCAmdGV4LCAmaW1hZ2UgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByYWRlb25fY3Bfc3RpcHBsZSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3N0aXBwbGVfdCBzdGlwcGxlOworCXUzMiBtYXNrWzMyXTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHN0aXBwbGUsIChkcm1fcmFkZW9uX3N0aXBwbGVfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2Yoc3RpcHBsZSkgKTsKKworCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmbWFzaywgc3RpcHBsZS5tYXNrLCAzMiAqIHNpemVvZih1MzIpICkgKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoIGRldiwgbWFzayApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfaW5kaXJlY3QoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3JhZGVvbl9pbmRpcmVjdF90IGluZGlyZWN0OworCVJJTkdfTE9DQUxTOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBpbmRpcmVjdCwgKGRybV9yYWRlb25faW5kaXJlY3RfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoaW5kaXJlY3QpICk7CisKKwlEUk1fREVCVUcoICJpbmRpcmVjdDogaWR4PSVkIHM9JWQgZT0lZCBkPSVkXG4iLAorCQkgICBpbmRpcmVjdC5pZHgsIGluZGlyZWN0LnN0YXJ0LAorCQkgICBpbmRpcmVjdC5lbmQsIGluZGlyZWN0LmRpc2NhcmQgKTsKKworCWlmICggaW5kaXJlY3QuaWR4IDwgMCB8fCBpbmRpcmVjdC5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIGluZGlyZWN0LmlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJYnVmID0gZG1hLT5idWZsaXN0W2luZGlyZWN0LmlkeF07CisKKwlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwICkgeworCQlEUk1fRVJST1IoICJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHAgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBidWYtPnBlbmRpbmcgKSB7CisJCURSTV9FUlJPUiggInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIGluZGlyZWN0LmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggaW5kaXJlY3Quc3RhcnQgPCBidWYtPnVzZWQgKSB7CisJCURSTV9FUlJPUiggInJldXNpbmcgaW5kaXJlY3Q6IHN0YXJ0PTB4JXggYWN0dWFsPTB4JXhcbiIsCisJCQkgICBpbmRpcmVjdC5zdGFydCwgYnVmLT51c2VkICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmLT51c2VkID0gaW5kaXJlY3QuZW5kOworCisJLyogV2FpdCBmb3IgdGhlIDNEIHN0cmVhbSB0byBpZGxlIGJlZm9yZSB0aGUgaW5kaXJlY3QgYnVmZmVyCisJICogY29udGFpbmluZyAyRCBhY2NlbGVyYXRpb24gY29tbWFuZHMgaXMgcHJvY2Vzc2VkLgorCSAqLworCUJFR0lOX1JJTkcoIDIgKTsKKworCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKworCUFEVkFOQ0VfUklORygpOworCisJLyogRGlzcGF0Y2ggdGhlIGluZGlyZWN0IGJ1ZmZlciBmdWxsIG9mIGNvbW1hbmRzIGZyb20gdGhlCisJICogWCBzZXJ2ZXIuICBUaGlzIGlzIGluc2VjdXJlIGFuZCBpcyB0aHVzIG9ubHkgYXZhaWxhYmxlIHRvCisJICogcHJpdmlsZWdlZCBjbGllbnRzLgorCSAqLworCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdCggZGV2LCBidWYsIGluZGlyZWN0LnN0YXJ0LCBpbmRpcmVjdC5lbmQgKTsKKwlpZiAoaW5kaXJlY3QuZGlzY2FyZCkgeworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJfQorCisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF92ZXJ0ZXgyKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcmFkZW9uX3ZlcnRleDJfdCB2ZXJ0ZXg7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBsYXN0c3RhdGU7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCB2ZXJ0ZXgsIChkcm1fcmFkZW9uX3ZlcnRleDJfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YodmVydGV4KSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkIGluZGV4PSVkIGRpc2NhcmQ9JWRcbiIsCisJCSAgIERSTV9DVVJSRU5UUElELAorCQkgICB2ZXJ0ZXguaWR4LCB2ZXJ0ZXguZGlzY2FyZCApOworCisJaWYgKCB2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICB2ZXJ0ZXguaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbdmVydGV4LmlkeF07CisKKwlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwICkgeworCQlEUk1fRVJST1IoICJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHAgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgdmVydGV4LmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwkKKwlpZiAoc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlmb3IgKGxhc3RzdGF0ZSA9IDB4ZmYsIGkgPSAwIDsgaSA8IHZlcnRleC5ucl9wcmltcyA7IGkrKykgeworCQlkcm1fcmFkZW9uX3ByaW1fdCBwcmltOworCQlkcm1fcmFkZW9uX3RjbF9wcmltX3QgdGNscHJpbTsKKwkJCisJCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmcHJpbSwgJnZlcnRleC5wcmltW2ldLCBzaXplb2YocHJpbSkgKSApCisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkKKwkJaWYgKCBwcmltLnN0YXRlaWR4ICE9IGxhc3RzdGF0ZSApIHsKKwkJCWRybV9yYWRlb25fc3RhdGVfdCBzdGF0ZTsJCQkgICAgICAgCisJCQkJCisJCQlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJnN0YXRlLCAKKwkJCQkJICAgICAmdmVydGV4LnN0YXRlW3ByaW0uc3RhdGVpZHhdLCAKKwkJCQkJICAgICBzaXplb2Yoc3RhdGUpICkgKQorCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwkJCWlmICggcmFkZW9uX2VtaXRfc3RhdGUyKCBkZXZfcHJpdiwgZmlscF9wcml2LCAmc3RhdGUgKSApIHsKKwkJCQlEUk1fRVJST1IoICJyYWRlb25fZW1pdF9zdGF0ZTIgZmFpbGVkXG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCisJCQlsYXN0c3RhdGUgPSBwcmltLnN0YXRlaWR4OworCQl9CisKKwkJdGNscHJpbS5zdGFydCA9IHByaW0uc3RhcnQ7CisJCXRjbHByaW0uZmluaXNoID0gcHJpbS5maW5pc2g7CisJCXRjbHByaW0ucHJpbSA9IHByaW0ucHJpbTsKKwkJdGNscHJpbS52Y19mb3JtYXQgPSBwcmltLnZjX2Zvcm1hdDsKKworCQlpZiAoIHByaW0ucHJpbSAmIFJBREVPTl9QUklNX1dBTEtfSU5EICkgeworCQkJdGNscHJpbS5vZmZzZXQgPSBwcmltLm51bXZlcnRzICogNjQ7CisJCQl0Y2xwcmltLm51bXZlcnRzID0gUkFERU9OX01BWF9WQl9WRVJUUzsgLyogZHVoICovCisKKwkJCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpY2VzKCBkZXYsIGJ1ZiwgJnRjbHByaW0gKTsKKwkJfSBlbHNlIHsKKwkJCXRjbHByaW0ubnVtdmVydHMgPSBwcmltLm51bXZlcnRzOworCQkJdGNscHJpbS5vZmZzZXQgPSAwOyAvKiBub3QgdXNlZCAqLworCisJCQlyYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KCBkZXYsIGJ1ZiwgJnRjbHByaW0gKTsKKwkJfQorCQkKKwkJaWYgKHNhcmVhX3ByaXYtPm5ib3ggPT0gMSkKKwkJCXNhcmVhX3ByaXYtPm5ib3ggPSAwOworCX0KKworCWlmICggdmVydGV4LmRpc2NhcmQgKSB7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKwl9CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0cyggCisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCWRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCisJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiApCit7CisJaW50IGlkID0gKGludCloZWFkZXIucGFja2V0LnBhY2tldF9pZDsKKwlpbnQgc3osIHJlZzsKKwlpbnQgKmRhdGEgPSAoaW50ICopY21kYnVmLT5idWY7CisJUklOR19MT0NBTFM7CisgICAKKwlpZiAoaWQgPj0gUkFERU9OX01BWF9TVEFURV9QQUNLRVRTKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJc3ogPSBwYWNrZXRbaWRdLmxlbjsKKwlyZWcgPSBwYWNrZXRbaWRdLnN0YXJ0OworCisJaWYgKHN6ICogc2l6ZW9mKGludCkgPiBjbWRidWYtPmJ1ZnN6KSB7CisJCURSTV9FUlJPUiggIlBhY2tldCBzaXplIHByb3ZpZGVkIGxhcmdlciB0aGFuIGRhdGEgcHJvdmlkZWRcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0cyggZGV2X3ByaXYsIGZpbHBfcHJpdiwgaWQsIGRhdGEgKSApIHsKKwkJRFJNX0VSUk9SKCAiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCX0KKworCUJFR0lOX1JJTkcoc3orMSk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIHJlZywgKHN6LTEpICkgKTsKKwlPVVRfUklOR19UQUJMRSggZGF0YSwgc3ogKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CisJY21kYnVmLT5idWZzeiAtPSBzeiAqIHNpemVvZihpbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfc2NhbGFycyggCisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKKwlkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqY21kYnVmICkKK3sKKwlpbnQgc3ogPSBoZWFkZXIuc2NhbGFycy5jb3VudDsKKwlpbnQgc3RhcnQgPSBoZWFkZXIuc2NhbGFycy5vZmZzZXQ7CisJaW50IHN0cmlkZSA9IGhlYWRlci5zY2FsYXJzLnN0cmlkZTsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX1JJTkcoIDMrc3ogKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1RDTF9TQ0FMQVJfSU5EWF9SRUcsIDAgKSApOworCU9VVF9SSU5HKCBzdGFydCB8IChzdHJpZGUgPDwgUkFERU9OX1NDQUxfSU5EWF9EV09SRF9TVFJJREVfU0hJRlQpKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMF9UQUJMRSggUkFERU9OX1NFX1RDTF9TQ0FMQVJfREFUQV9SRUcsIHN6LTEgKSApOworCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1Ziwgc3ogKTsKKwlBRFZBTkNFX1JJTkcoKTsKKwljbWRidWYtPmJ1ZiArPSBzeiAqIHNpemVvZihpbnQpOworCWNtZGJ1Zi0+YnVmc3ogLT0gc3ogKiBzaXplb2YoaW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogR29kIHRoaXMgaXMgdWdseQorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfc2NhbGFyczIoIAorCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCisJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiApCit7CisJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CisJaW50IHN0YXJ0ID0gKCh1bnNpZ25lZCBpbnQpaGVhZGVyLnNjYWxhcnMub2Zmc2V0KSArIDB4MTAwOworCWludCBzdHJpZGUgPSBoZWFkZXIuc2NhbGFycy5zdHJpZGU7CisJUklOR19MT0NBTFM7CisKKwlCRUdJTl9SSU5HKCAzK3N6ICk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0lORFhfUkVHLCAwICkgKTsKKwlPVVRfUklORyggc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9TQ0FMX0lORFhfRFdPUkRfU1RSSURFX1NISUZUKSk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDBfVEFCTEUoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0RBVEFfUkVHLCBzei0xICkgKTsKKwlPVVRfUklOR19UQUJMRSggY21kYnVmLT5idWYsIHN6ICk7CisJQURWQU5DRV9SSU5HKCk7CisJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKKwljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fZW1pdF92ZWN0b3JzKCAKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAorCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQoreworCWludCBzeiA9IGhlYWRlci52ZWN0b3JzLmNvdW50OworCWludCBzdGFydCA9IGhlYWRlci52ZWN0b3JzLm9mZnNldDsKKwlpbnQgc3RyaWRlID0gaGVhZGVyLnZlY3RvcnMuc3RyaWRlOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fUklORyggMytzeiApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfVENMX1ZFQ1RPUl9JTkRYX1JFRywgMCApICk7CisJT1VUX1JJTkcoIHN0YXJ0IHwgKHN0cmlkZSA8PCBSQURFT05fVkVDX0lORFhfT0NUV09SRF9TVFJJREVfU0hJRlQpKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMF9UQUJMRSggUkFERU9OX1NFX1RDTF9WRUNUT1JfREFUQV9SRUcsIChzei0xKSApICk7CisJT1VUX1JJTkdfVEFCTEUoIGNtZGJ1Zi0+YnVmLCBzeiApOworCUFEVkFOQ0VfUklORygpOworCisJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKKwljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQlkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY21kc3o7CisJaW50IHJldDsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmICggKCByZXQgPSByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICAgIGNtZGJ1ZiwgJmNtZHN6ICkgKSApIHsKKwkJRFJNX0VSUk9SKCAiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIgKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlCRUdJTl9SSU5HKCBjbWRzeiApOworCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1ZiwgY21kc3ogKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworCWNtZGJ1Zi0+YnVmICs9IGNtZHN6ICogNDsKKwljbWRidWYtPmJ1ZnN6IC09IGNtZHN6ICogNDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcHJlY3QoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQkgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCQkgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKKwkJCQkJIGludCBvcmlnX25ib3ggKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2NsaXBfcmVjdF90IGJveDsKKwl1bnNpZ25lZCBpbnQgY21kc3o7CisJaW50IHJldDsKKwlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hlcyA9IGNtZGJ1Zi0+Ym94ZXM7CisJaW50IGkgPSAwOworCVJJTkdfTE9DQUxTOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJaWYgKCAoIHJldCA9IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0MyggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAgY21kYnVmLCAmY21kc3ogKSApICkgeworCQlEUk1fRVJST1IoICJQYWNrZXQgdmVyaWZpY2F0aW9uIGZhaWxlZFxuIiApOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghb3JpZ19uYm94KQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJaWYgKCBpIDwgY21kYnVmLT5uYm94ICkgeworCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUiggJmJveCwgJmJveGVzW2ldLCBzaXplb2YoYm94KSApKQorCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkvKiBGSVhNRSBUaGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHRpbWVzIHJvdW5kCisJCQkgKiB0aGlzIGxvb3AsIHNlbmQgYSBXQUlUX1VOVElMXzNEX0lETEUgYmVmb3JlCisJCQkgKiBjYWxsaW5nIGVtaXRfY2xpcF9yZWN0KCkuIFRoaXMgZml4ZXMgYQorCQkJICogbG9ja3VwIG9uIGZhc3QgbWFjaGluZXMgd2hlbiBzZW5kaW5nCisJCQkgKiBzZXZlcmFsIGNsaXByZWN0cyB3aXRoIGEgY21kYnVmLCBhcyB3aGVuCisJCQkgKiB3YXZpbmcgYSAyRCB3aW5kb3cgb3ZlciBhIDNECisJCQkgKiB3aW5kb3cuIFNvbWV0aGluZyBpbiB0aGUgY29tbWFuZHMgZnJvbSB1c2VyCisJCQkgKiBzcGFjZSBzZWVtcyB0byBoYW5nIHRoZSBjYXJkIHdoZW4gdGhleSdyZQorCQkJICogc2VudCBzZXZlcmFsIHRpbWVzIGluIGEgcm93LiBUaGF0IHdvdWxkIGJlCisJCQkgKiB0aGUgY29ycmVjdCBwbGFjZSB0byBmaXggaXQgYnV0IHRoaXMgd29ya3MKKwkJCSAqIGFyb3VuZCBpdCB1bnRpbCBJIGNhbiBmaWd1cmUgdGhhdCBvdXQgLSBUaW0KKwkJCSAqIFNtaXRoICovCisJCQlpZiAoIGkgKSB7CisJCQkJQkVHSU5fUklORyggMiApOworCQkJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwkJCQlBRFZBTkNFX1JJTkcoKTsKKwkJCX0KKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsICZib3ggKTsKKwkJfQorCQkKKwkJQkVHSU5fUklORyggY21kc3ogKTsKKwkJT1VUX1JJTkdfVEFCTEUoIGNtZGJ1Zi0+YnVmLCBjbWRzeiApOworCQlBRFZBTkNFX1JJTkcoKTsKKworCX0gd2hpbGUgKCArK2kgPCBjbWRidWYtPm5ib3ggKTsKKyAJaWYgKGNtZGJ1Zi0+bmJveCA9PSAxKQorCQljbWRidWYtPm5ib3ggPSAwOworCisgb3V0OgorCWNtZGJ1Zi0+YnVmICs9IGNtZHN6ICogNDsKKwljbWRidWYtPmJ1ZnN6IC09IGNtZHN6ICogNDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3dhaXQoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZmxhZ3MgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoIiVzOiAleFxuIiwgX19GVU5DVElPTl9fLCBmbGFncyk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgUkFERU9OX1dBSVRfMkQ6CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOyAKKwkJQURWQU5DRV9SSU5HKCk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1dBSVRfM0Q6CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOyAKKwkJQURWQU5DRV9SSU5HKCk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1dBSVRfMkR8UkFERU9OX1dBSVRfM0Q6CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJUkFERU9OX1dBSVRfVU5USUxfSURMRSgpOyAKKwkJQURWQU5DRV9SSU5HKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2NtZGJ1ZiggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWYgPSBOVUxMOworCWludCBpZHg7CisJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgY21kYnVmOworCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlcjsKKwlpbnQgb3JpZ19uYm94LCBvcmlnX2J1ZnN6OworCWNoYXIgKmtidWY9TlVMTDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTiggZmlscF9wcml2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGNtZGJ1ZiwgKGRybV9yYWRlb25fY21kX2J1ZmZlcl90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZihjbWRidWYpICk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlpZiAoY21kYnVmLmJ1ZnN6ID4gNjQqMTAyNCB8fCBjbWRidWYuYnVmc3o8MCkgeworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIEFsbG9jYXRlIGFuIGluLWtlcm5lbCBhcmVhIGFuZCBjb3B5IGluIHRoZSBjbWRidWYuICBEbyB0aGlzIHRvIGF2b2lkCisJICogcmFjZXMgYmV0d2VlbiBjaGVja2luZyB2YWx1ZXMgYW5kIHVzaW5nIHRob3NlIHZhbHVlcyBpbiBvdGhlciBjb2RlLAorCSAqIGFuZCBzaW1wbHkgdG8gYXZvaWQgYSBsb3Qgb2YgZnVuY3Rpb24gY2FsbHMgdG8gY29weSBpbiBkYXRhLgorCSAqLworCW9yaWdfYnVmc3ogPSBjbWRidWYuYnVmc3o7CisJaWYgKG9yaWdfYnVmc3ogIT0gMCkgeworCQlrYnVmID0gZHJtX2FsbG9jKGNtZGJ1Zi5idWZzeiwgRFJNX01FTV9EUklWRVIpOworCQlpZiAoa2J1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihrYnVmLCBjbWRidWYuYnVmLCBjbWRidWYuYnVmc3opKSB7CisJCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQl9CisJCWNtZGJ1Zi5idWYgPSBrYnVmOworCX0KKworCW9yaWdfbmJveCA9IGNtZGJ1Zi5uYm94OworCisJd2hpbGUgKCBjbWRidWYuYnVmc3ogPj0gc2l6ZW9mKGhlYWRlcikgKSB7CisKKwkJaGVhZGVyLmkgPSAqKGludCAqKWNtZGJ1Zi5idWY7CisJCWNtZGJ1Zi5idWYgKz0gc2l6ZW9mKGhlYWRlcik7CisJCWNtZGJ1Zi5idWZzeiAtPSBzaXplb2YoaGVhZGVyKTsKKworCQlzd2l0Y2ggKGhlYWRlci5oZWFkZXIuY21kX3R5cGUpIHsKKwkJY2FzZSBSQURFT05fQ01EX1BBQ0tFVDogCisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfUEFDS0VUXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF9wYWNrZXRzKCBkZXZfcHJpdiwgZmlscF9wcml2LCBoZWFkZXIsICZjbWRidWYgKSkgeworCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfcGFja2V0cyBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQURFT05fQ01EX1NDQUxBUlM6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfU0NBTEFSU1xuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfc2NhbGFycyggZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZiApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9zY2FsYXJzIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBREVPTl9DTURfVkVDVE9SUzoKKwkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9WRUNUT1JTXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF92ZWN0b3JzKCBkZXZfcHJpdiwgaGVhZGVyLCAmY21kYnVmICkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3ZlY3RvcnMgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9ETUFfRElTQ0FSRDoKKwkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9ETUFfRElTQ0FSRFxuIik7CisJCQlpZHggPSBoZWFkZXIuZG1hLmJ1Zl9pZHg7CisJCQlpZiAoIGlkeCA8IDAgfHwgaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQkJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCQkJICAgaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkJYnVmID0gZG1hLT5idWZsaXN0W2lkeF07CisJCQlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwIHx8IGJ1Zi0+cGVuZGluZyApIHsKKwkJCQlEUk1fRVJST1IoICJiYWQgYnVmZmVyICVwICVwICVkXG4iLAorCQkJCQkgICBidWYtPmZpbHAsIGZpbHAsIGJ1Zi0+cGVuZGluZyk7CisJCQkJZ290byBlcnI7CisJCQl9CisKKwkJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9QQUNLRVQzOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1BBQ0tFVDNcbiIpOworCQkJaWYgKHJhZGVvbl9lbWl0X3BhY2tldDMoIGRldiwgZmlscF9wcml2LCAmY21kYnVmICkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldDMgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9QQUNLRVQzX0NMSVA6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfUEFDS0VUM19DTElQXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KCBkZXYsIGZpbHBfcHJpdiwgJmNtZGJ1Ziwgb3JpZ19uYm94ICkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcCBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQURFT05fQ01EX1NDQUxBUlMyOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1NDQUxBUlMyXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF9zY2FsYXJzMiggZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZiApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9zY2FsYXJzMiBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQURFT05fQ01EX1dBSVQ6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfV0FJVFxuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfd2FpdCggZGV2LCBoZWFkZXIud2FpdC5mbGFncyApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF93YWl0IGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiYmFkIGNtZF90eXBlICVkIGF0ICVwXG4iLCAKKwkJCQkgIGhlYWRlci5oZWFkZXIuY21kX3R5cGUsCisJCQkJICBjbWRidWYuYnVmIC0gc2l6ZW9mKGhlYWRlcikpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZiAob3JpZ19idWZzeiAhPSAwKQorCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CisKKwlEUk1fREVCVUcoIkRPTkVcbiIpOworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlpZiAob3JpZ19idWZzeiAhPSAwKQorCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CisJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKK30KKworCisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2dldHBhcmFtKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fZ2V0cGFyYW1fdCBwYXJhbTsKKwlpbnQgdmFsdWU7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggcGFyYW0sIChkcm1fcmFkZW9uX2dldHBhcmFtX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHBhcmFtKSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCApOworCisJc3dpdGNoKCBwYXJhbS5wYXJhbSApIHsKKwljYXNlIFJBREVPTl9QQVJBTV9HQVJUX0JVRkZFUl9PRkZTRVQ6CisJCXZhbHVlID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQ7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX0xBU1RfRlJBTUU6CisJCWRldl9wcml2LT5zdGF0cy5sYXN0X2ZyYW1lX3JlYWRzKys7CisJCXZhbHVlID0gR0VUX1NDUkFUQ0goIDAgKTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fTEFTVF9ESVNQQVRDSDoKKwkJdmFsdWUgPSBHRVRfU0NSQVRDSCggMSApOworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9MQVNUX0NMRUFSOgorCQlkZXZfcHJpdi0+c3RhdHMubGFzdF9jbGVhcl9yZWFkcysrOworCQl2YWx1ZSA9IEdFVF9TQ1JBVENIKCAyICk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX0lSUV9OUjoKKwkJdmFsdWUgPSBkZXYtPmlycTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9CQVNFOgorCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0OworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9SRUdJU1RFUl9IQU5ETEU6CisJCXZhbHVlID0gZGV2X3ByaXYtPm1taW9fb2Zmc2V0OworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9TVEFUVVNfSEFORExFOgorCQl2YWx1ZSA9IGRldl9wcml2LT5yaW5nX3JwdHJfb2Zmc2V0OworCQlicmVhazsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJLyoKKwkgKiBUaGlzIGlvY3RsKCkgZG9lc24ndCB3b3JrIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYmVjYXVzZSBod19sb2NrIGlzIGEKKwkgKiBwb2ludGVyIHdoaWNoIGNhbid0IGZpdCBpbnRvIGFuIGludC1zaXplZCB2YXJpYWJsZS4gIEFjY29yZGluZyB0bworCSAqIE1pY2hlbCBE5G56ZXIsIHRoZSBpb2N0bCgpIGlzIG9ubHkgdXNlZCBvbiBlbWJlZGRlZCBwbGF0Zm9ybXMsIHNvCisJICogbm90IHN1cHBvcnRpbmcgaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4gIElmIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkKKwkgKiBpcyBuZWVkZWQgb24gNjQtYml0IHBsYXRmb3JtcywgYSBuZXcgaW9jdGwoKSB3b3VsZCBoYXZlIHRvIGJlIGFkZGVkLAorCSAqIHNvIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciB0aGUgZW1iZWRkZWQgcGxhdGZvcm1zIGNhbiBiZQorCSAqIG1haW50YWluZWQuICAtLWRhdmlkbSA0LUZlYi0yMDA0LgorCSAqLworCWNhc2UgUkFERU9OX1BBUkFNX1NBUkVBX0hBTkRMRToKKwkJLyogVGhlIGxvY2sgaXMgdGhlIGZpcnN0IGR3b3JkIGluIHRoZSBzYXJlYS4gKi8KKwkJdmFsdWUgPSAobG9uZylkZXYtPmxvY2suaHdfbG9jazsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFJBREVPTl9QQVJBTV9HQVJUX1RFWF9IQU5ETEU6CisJCXZhbHVlID0gZGV2X3ByaXYtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggRFJNX0NPUFlfVE9fVVNFUiggcGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkgKSApIHsKKwkJRFJNX0VSUk9SKCAiY29weV90b191c2VyXG4iICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9zZXRwYXJhbSggRFJNX0lPQ1RMX0FSR1MgKSB7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlkcm1fcmFkZW9uX3NldHBhcmFtX3Qgc3A7CisJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBzcCwgKCBkcm1fcmFkZW9uX3NldHBhcmFtX3QgX191c2VyICogKWRhdGEsCisJCQkJICBzaXplb2YoIHNwICkgKTsKKworCXN3aXRjaCggc3AucGFyYW0gKSB7CisJY2FzZSBSQURFT05fU0VUUEFSQU1fRkJfTE9DQVRJT046CisJCXJhZGVvbl9wcml2ID0gZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKKwkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IGRldl9wcml2LT5mYl9sb2NhdGlvbiAtIHNwLnZhbHVlOworCQlicmVhazsKKwljYXNlIFJBREVPTl9TRVRQQVJBTV9TV0lUQ0hfVElMSU5HOgorCQlpZiAoc3AudmFsdWUgPT0gMCkgeworCQkJRFJNX0RFQlVHKCAiY29sb3IgdGlsaW5nIGRpc2FibGVkXG4iICk7CisJCQlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICY9IH5SQURFT05fRFNUX1RJTEVfTUFDUk87CisJCQlkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgJj0gflJBREVPTl9EU1RfVElMRV9NQUNSTzsKKwkJCWRldl9wcml2LT5zYXJlYV9wcml2LT50aWxpbmdfZW5hYmxlZCA9IDA7CisJCX0KKwkJZWxzZSBpZiAoc3AudmFsdWUgPT0gMSkgeworCQkJRFJNX0RFQlVHKCAiY29sb3IgdGlsaW5nIGVuYWJsZWRcbiIgKTsKKwkJCWRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQgfD0gUkFERU9OX0RTVF9USUxFX01BQ1JPOworCQkJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0IHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKKwkJCWRldl9wcml2LT5zYXJlYV9wcml2LT50aWxpbmdfZW5hYmxlZCA9IDE7CisJCX0KKwkJYnJlYWs7CQorCWRlZmF1bHQ6CisJCURSTV9ERUJVRyggIkludmFsaWQgcGFyYW1ldGVyICVkXG4iLCBzcC5wYXJhbSApOworCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFdoZW4gYSBjbGllbnQgZGllczoKKyAqICAgIC0gQ2hlY2sgZm9yIGFuZCBjbGVhbiB1cCBmbGlwcGVkIHBhZ2Ugc3RhdGUKKyAqICAgIC0gRnJlZSBhbnkgYWxsb2NlZCBHQVJUIG1lbW9yeS4KKyAqCisgKiBEUk0gaW5mcmFzdHJ1Y3R1cmUgdGFrZXMgY2FyZSBvZiByZWNsYWltaW5nIGRtYSBidWZmZXJzLgorICovCit2b2lkIHJhZGVvbl9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKQoreworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsJCQkJCisJCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7IAorCQlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICkgewkJCisJCQlyYWRlb25fZG9fY2xlYW51cF9wYWdlZmxpcCggZGV2ICk7CQorCQl9CQkJCQkJCisJCXJhZGVvbl9tZW1fcmVsZWFzZSggZmlscCwgZGV2X3ByaXYtPmdhcnRfaGVhcCApOyAKKwkJcmFkZW9uX21lbV9yZWxlYXNlKCBmaWxwLCBkZXZfcHJpdi0+ZmJfaGVhcCApOwkKKwkJcmFkZW9uX3N1cmZhY2VzX3JlbGVhc2UoZmlscCwgZGV2X3ByaXYpOworCX0JCQkJCit9CisKK3ZvaWQgcmFkZW9uX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlyYWRlb25fZG9fcmVsZWFzZShkZXYpOworfQorCitpbnQgcmFkZW9uX2RyaXZlcl9vcGVuX2hlbHBlcihkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZpbGVfdCAqZmlscF9wcml2KQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKKwkKKwlyYWRlb25fcHJpdiA9IChzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKilkcm1fYWxsb2Moc2l6ZW9mKCpyYWRlb25fcHJpdiksIERSTV9NRU1fRklMRVMpOworCQorCWlmICghcmFkZW9uX3ByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZmlscF9wcml2LT5kcml2ZXJfcHJpdiA9IHJhZGVvbl9wcml2OworCWlmICggZGV2X3ByaXYgKQorCQlyYWRlb25fcHJpdi0+cmFkZW9uX2ZiX2RlbHRhID0gZGV2X3ByaXYtPmZiX2xvY2F0aW9uOworCWVsc2UKKwkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCByYWRlb25fZHJpdmVyX2ZyZWVfZmlscF9wcml2KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZmlsZV90ICpmaWxwX3ByaXYpCit7CisJIHN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXYgPSBmaWxwX3ByaXYtPmRyaXZlcl9wcml2OworCSAKKwkgZHJtX2ZyZWUocmFkZW9uX3ByaXYsIHNpemVvZigqcmFkZW9uX3ByaXYpLCBEUk1fTUVNX0ZJTEVTKTsKK30KKworZHJtX2lvY3RsX2Rlc2NfdCByYWRlb25faW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX0lOSVQpXSAgICA9IHsgcmFkZW9uX2NwX2luaXQsICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVEFSVCldICAgPSB7IHJhZGVvbl9jcF9zdGFydCwgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfU1RPUCldICAgID0geyByYWRlb25fY3Bfc3RvcCwgICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU0VUKV0gICA9IHsgcmFkZW9uX2NwX3Jlc2V0LCAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9JRExFKV0gICAgPSB7IHJhZGVvbl9jcF9pZGxlLCAgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfUkVTVU1FKV0gID0geyByYWRlb25fY3BfcmVzdW1lLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1JFU0VUKV0gICAgICA9IHsgcmFkZW9uX2VuZ2luZV9yZXNldCwgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9GVUxMU0NSRUVOKV0gPSB7IHJhZGVvbl9mdWxsc2NyZWVuLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1dBUCldICAgICAgID0geyByYWRlb25fY3Bfc3dhcCwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NMRUFSKV0gICAgICA9IHsgcmFkZW9uX2NwX2NsZWFyLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9WRVJURVgpXSAgICAgPSB7IHJhZGVvbl9jcF92ZXJ0ZXgsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSU5ESUNFUyldICAgID0geyByYWRlb25fY3BfaW5kaWNlcywgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1RFWFRVUkUpXSAgICA9IHsgcmFkZW9uX2NwX3RleHR1cmUsICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVElQUExFKV0gICAgPSB7IHJhZGVvbl9jcF9zdGlwcGxlLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSU5ESVJFQ1QpXSAgID0geyByYWRlb25fY3BfaW5kaXJlY3QsICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1ZFUlRFWDIpXSAgICA9IHsgcmFkZW9uX2NwX3ZlcnRleDIsICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DTURCVUYpXSAgICAgPSB7IHJhZGVvbl9jcF9jbWRidWYsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fR0VUUEFSQU0pXSAgID0geyByYWRlb25fY3BfZ2V0cGFyYW0sICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZMSVApXSAgICAgICA9IHsgcmFkZW9uX2NwX2ZsaXAsICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9BTExPQyldICAgICAgPSB7IHJhZGVvbl9tZW1fYWxsb2MsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRlJFRSldICAgICAgID0geyByYWRlb25fbWVtX2ZyZWUsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lOSVRfSEVBUCldICA9IHsgcmFkZW9uX21lbV9pbml0X2hlYXAsMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JUlFfRU1JVCldICAgPSB7IHJhZGVvbl9pcnFfZW1pdCwgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX1dBSVQpXSAgID0geyByYWRlb25faXJxX3dhaXQsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NFVFBBUkFNKV0gICA9IHsgcmFkZW9uX2NwX3NldHBhcmFtLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVVJGX0FMTE9DKV0gPSB7IHJhZGVvbl9zdXJmYWNlX2FsbG9jLDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9GUkVFKV0gID0geyByYWRlb25fc3VyZmFjZV9mcmVlLCAxLCAwIH0KK307CisKK2ludCByYWRlb25fbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUocmFkZW9uX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWMzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcm0uaApAQCAtMCwwICsxLDQyIEBACisKKyNpZm5kZWYgX19TSVNfRFJNX0hfXworI2RlZmluZSBfX1NJU19EUk1fSF9fCisKKy8qIFNpUyBzcGVjaWZpYyBpb2N0bHMgKi8KKyNkZWZpbmUgTk9UX1VTRURfMF8zCisjZGVmaW5lIERSTV9TSVNfRkJfQUxMT0MJMHgwNAorI2RlZmluZSBEUk1fU0lTX0ZCX0ZSRUUJICAgICAgICAweDA1CisjZGVmaW5lIE5PVF9VU0VEXzZfMTIKKyNkZWZpbmUgRFJNX1NJU19BR1BfSU5JVAkweDEzCisjZGVmaW5lIERSTV9TSVNfQUdQX0FMTE9DCTB4MTQKKyNkZWZpbmUgRFJNX1NJU19BR1BfRlJFRQkweDE1CisjZGVmaW5lIERSTV9TSVNfRkJfSU5JVAkgICAgICAgIDB4MTYKKworI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZCX0FMTE9DCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19GQl9BTExPQywgZHJtX3Npc19tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GQl9GUkVFCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19GQl9GUkVFLCBkcm1fc2lzX21lbV90KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0FHUF9JTklUCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19BR1BfSU5JVCwgZHJtX3Npc19hZ3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19BR1BfQUxMT0MJCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0FHUF9BTExPQywgZHJtX3Npc19tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19BR1BfRlJFRQkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfQUdQX0ZSRUUsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkJfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfSU5JVCwgZHJtX3Npc19mYl90KQorLyoKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GTElQCQlEUk1fSU9XKCAweDQ4LCBkcm1fc2lzX2ZsaXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GTElQX0lOSVQJCURSTV9JTyggIDB4NDkpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUF9GSU5BTAlEUk1fSU8oICAweDUwKQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBjb250ZXh0OworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgbG9uZyBmcmVlOworfSBkcm1fc2lzX21lbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG9mZnNldCwgc2l6ZTsKK30gZHJtX3Npc19hZ3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemU7Cit9IGRybV9zaXNfZmJfdDsKKworI2VuZGlmIC8qIF9fU0lTX0RSTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0MTcxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jCkBAIC0wLDAgKzEsMTEwIEBACisvKiBzaXMuYyAtLSBzaXMgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAic2lzX2RybS5oIgorI2luY2x1ZGUgInNpc19kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKyAgCitzdGF0aWMgaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKK3sKKwlEUk1fSU5GTyggIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsCisJCURSSVZFUl9NQUpPUiwKKwkJRFJJVkVSX01JTk9SLAorCQlEUklWRVJfUEFUQ0hMRVZFTCwKKwkJRFJJVkVSX0RBVEUsCisJCWRldi0+cHJpbWFyeS5taW5vciwKKwkJcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKCBkcm1fdmVyc2lvbl90ICp2ZXJzaW9uICkKK3sKKwlpbnQgbGVuOworCisJdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKKwl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOworCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOworCURSTV9DT1BZKCB2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSApOworCURSTV9DT1BZKCB2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJc2lzZHJ2X1BDSV9JRFMKK307CisKK2V4dGVybiBkcm1faW9jdGxfZGVzY190IHNpc19pb2N0bHNbXTsKK2V4dGVybiBpbnQgc2lzX21heF9pb2N0bDsKKworc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfVVNFX01UUlIsCisJLmNvbnRleHRfY3RvciA9IHNpc19pbml0X2NvbnRleHQsCisJLmNvbnRleHRfZHRvciA9IHNpc19maW5hbF9jb250ZXh0LAorCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBzaXNfaW9jdGxzLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwl9LAorCS5wY2lfZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICA9IERSSVZFUl9OQU1FLAorCQkuaWRfdGFibGUgICAgICA9IHBjaWlkbGlzdCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaXNfaW5pdCh2b2lkKQoreworCWRyaXZlci5udW1faW9jdGxzID0gc2lzX21heF9pb2N0bDsKKwlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaXNfZXhpdCh2b2lkKQoreworCWRybV9leGl0KCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzaXNfaW5pdCk7Cittb2R1bGVfZXhpdChzaXNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKK01PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTM2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaApAQCAtMCwwICsxLDUyIEBACisvKiBzaXNfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHNpcyBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICovCisKKyNpZm5kZWYgX1NJU19EUlZfSF8KKyNkZWZpbmUgX1NJU19EUlZfSF8KKworLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgorICovCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIlNJUyIKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJzaXMiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiU0lTIDMwMC82MzAvNTQwIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDMwODI2IgorI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkxCisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKworI2luY2x1ZGUgInNpc19kcy5oIgorCit0eXBlZGVmIHN0cnVjdCBkcm1fc2lzX3ByaXZhdGUgeworCW1lbUhlYXBfdCAqQUdQSGVhcDsKKwltZW1IZWFwX3QgKkZCSGVhcDsKK30gZHJtX3Npc19wcml2YXRlX3Q7CisKK2V4dGVybiBpbnQgc2lzX2luaXRfY29udGV4dChkcm1fZGV2aWNlX3QgKmRldiwgaW50IGNvbnRleHQpOworZXh0ZXJuIGludCBzaXNfZmluYWxfY29udGV4dChkcm1fZGV2aWNlX3QgKmRldiwgaW50IGNvbnRleHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2VkOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5jCkBAIC0wLDAgKzEsMzAxIEBACisvKiBzaXNfZHMuYyAtLSBQcml2YXRlIGhlYWRlciBmb3IgRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogTW9uIEphbiAgNCAxMDowNTowNSAxOTk5IGJ5IHNjbGluQHNpcy5jb20udHcKKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBDb3JwLCBJbmMuLCBIc2luQ2h1LCBUYWl3YW4uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKiBBdXRob3JzOgorICogICAgU3VuZy1DaGluZyBMaW4gPHNjbGluQHNpcy5jb20udHc+CisgKiAKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgInNpc19kcy5oIgorCisvKiBTZXQgRGF0YSBTdHJ1Y3R1cmUsIG5vdCBjaGVjayByZXBlYXRlZCB2YWx1ZQorICogdGVtcG9yYXJpbHkgdXNlZAorICovCisKK3NldF90ICpzZXRJbml0KHZvaWQpCit7CisJaW50IGk7CisJc2V0X3QgKnNldDsKKworCXNldCA9IChzZXRfdCAqKWRybV9hbGxvYyhzaXplb2Yoc2V0X3QpLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKHNldCAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTRVRfU0laRTsgaSsrKSB7CisJCQlzZXQtPmxpc3RbaV0uZnJlZV9uZXh0ID0gaSArIDE7ICAgIAorCQkJc2V0LT5saXN0W2ldLmFsbG9jX25leHQgPSAtMTsKKwkJfQorCQlzZXQtPmxpc3RbU0VUX1NJWkUtMV0uZnJlZV9uZXh0ID0gLTE7CisJCXNldC0+ZnJlZSA9IDA7CisJCXNldC0+YWxsb2MgPSAtMTsKKwkJc2V0LT50cmFjZSA9IC0xOworCX0KKwlyZXR1cm4gc2V0OworfQorCitpbnQgc2V0QWRkKHNldF90ICpzZXQsIElURU1fVFlQRSBpdGVtKQoreworCWludCBmcmVlID0gc2V0LT5mcmVlOworICAKKwlpZiAoZnJlZSAhPSAtMSkgeworCQlzZXQtPmxpc3RbZnJlZV0udmFsID0gaXRlbTsKKwkJc2V0LT5mcmVlID0gc2V0LT5saXN0W2ZyZWVdLmZyZWVfbmV4dDsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXQtPmxpc3RbZnJlZV0uYWxsb2NfbmV4dCA9IHNldC0+YWxsb2M7CisJc2V0LT5hbGxvYyA9IGZyZWU7ICAKKwlzZXQtPmxpc3RbZnJlZV0uZnJlZV9uZXh0ID0gLTE7ICAgIAorCisJcmV0dXJuIDE7Cit9CisKK2ludCBzZXREZWwoc2V0X3QgKnNldCwgSVRFTV9UWVBFIGl0ZW0pCit7CisJaW50IGFsbG9jID0gc2V0LT5hbGxvYzsKKwlpbnQgcHJldiA9IC0xOyAgCisKKwl3aGlsZSAoYWxsb2MgIT0gLTEpIHsKKwkJaWYgKHNldC0+bGlzdFthbGxvY10udmFsID09IGl0ZW0pIHsKKwkJCWlmIChwcmV2ICE9IC0xKQorCQkJCXNldC0+bGlzdFtwcmV2XS5hbGxvY19uZXh0ID0KKwkJCQkgICAgc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0OworCQkJZWxzZQorCQkJCXNldC0+YWxsb2MgPSBzZXQtPmxpc3RbYWxsb2NdLmFsbG9jX25leHQ7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gYWxsb2M7CisJCWFsbG9jID0gc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0OworCX0KKworCWlmIChhbGxvYyA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlzZXQtPmxpc3RbYWxsb2NdLmZyZWVfbmV4dCA9IHNldC0+ZnJlZTsKKwlzZXQtPmZyZWUgPSBhbGxvYzsKKwlzZXQtPmxpc3RbYWxsb2NdLmFsbG9jX25leHQgPSAtMTsKKworCXJldHVybiAxOworfQorCisvKiBzZXRGaXJzdCAtPiBzZXRBZGQgLT4gc2V0TmV4dCBpcyB3cm9uZyAqLworCitpbnQgc2V0Rmlyc3Qoc2V0X3QgKnNldCwgSVRFTV9UWVBFICppdGVtKQoreworCWlmIChzZXQtPmFsbG9jID09IC0xKQorCQlyZXR1cm4gMDsKKworCSppdGVtID0gc2V0LT5saXN0W3NldC0+YWxsb2NdLnZhbDsKKwlzZXQtPnRyYWNlID0gc2V0LT5saXN0W3NldC0+YWxsb2NdLmFsbG9jX25leHQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHNldE5leHQoc2V0X3QgKnNldCwgSVRFTV9UWVBFICppdGVtKQoreworCWlmIChzZXQtPnRyYWNlID09IC0xKQorCQlyZXR1cm4gMDsKKworCSppdGVtID0gc2V0LT5saXN0W3NldC0+dHJhY2VdLnZhbDsKKwlzZXQtPnRyYWNlID0gc2V0LT5saXN0W3NldC0+dHJhY2VdLmFsbG9jX25leHQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHNldERlc3Ryb3koc2V0X3QgKnNldCkKK3sKKwlkcm1fZnJlZShzZXQsIHNpemVvZihzZXRfdCksIERSTV9NRU1fRFJJVkVSKTsKKworCXJldHVybiAxOworfQorCisvKgorICogR0xYIEhhcmR3YXJlIERldmljZSBEcml2ZXIgY29tbW9uIGNvZGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSBXaXR0YXdhdCBZYW13b25nCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBXSVRUQVdBVCBZQU1XT05HLCBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAKKyAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjZGVmaW5lIElTRlJFRShicHRyKSAoKGJwdHIpLT5mcmVlKQorCittZW1IZWFwX3QgKm1tSW5pdChpbnQgb2ZzLAorCQkgIGludCBzaXplKQoreworCVBNZW1CbG9jayBibG9ja3M7CisKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWJsb2NrcyA9IChUTWVtQmxvY2sgKilkcm1fY2FsbG9jKDEsIHNpemVvZihUTWVtQmxvY2spLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKGJsb2NrcyAhPSBOVUxMKSB7CisJCWJsb2Nrcy0+b2ZzID0gb2ZzOworCQlibG9ja3MtPnNpemUgPSBzaXplOworCQlibG9ja3MtPmZyZWUgPSAxOworCQlyZXR1cm4gKG1lbUhlYXBfdCAqKWJsb2NrczsKKwl9IGVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrcyBpZiBhIHBvaW50ZXIgJ2InIGlzIHBhcnQgb2YgdGhlIGhlYXAgJ2hlYXAnICovCitpbnQgbW1CbG9ja0luSGVhcChtZW1IZWFwX3QgKmhlYXAsIFBNZW1CbG9jayBiKQoreworCVRNZW1CbG9jayAqcDsKKworCWlmIChoZWFwID09IE5VTEwgfHwgYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXAgPSBoZWFwOworCXdoaWxlIChwICE9IE5VTEwgJiYgcCAhPSBiKSB7CisJCXAgPSBwLT5uZXh0OworCX0KKwlpZiAocCA9PSBiKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgVE1lbUJsb2NrKiBTbGljZUJsb2NrKFRNZW1CbG9jayAqcCwgCisJCQkgICAgIGludCBzdGFydG9mcywgaW50IHNpemUsIAorCQkJICAgICBpbnQgcmVzZXJ2ZWQsIGludCBhbGlnbm1lbnQpCit7CisJVE1lbUJsb2NrICpuZXdibG9jazsKKworCS8qIGJyZWFrIGxlZnQgKi8KKwlpZiAoc3RhcnRvZnMgPiBwLT5vZnMpIHsKKwkJbmV3YmxvY2sgPSAoVE1lbUJsb2NrKikgZHJtX2NhbGxvYygxLCBzaXplb2YoVE1lbUJsb2NrKSwKKwkJICAgIERSTV9NRU1fRFJJVkVSKTsKKwkJbmV3YmxvY2stPm9mcyA9IHN0YXJ0b2ZzOworCQluZXdibG9jay0+c2l6ZSA9IHAtPnNpemUgLSAoc3RhcnRvZnMgLSBwLT5vZnMpOworCQluZXdibG9jay0+ZnJlZSA9IDE7CisJCW5ld2Jsb2NrLT5uZXh0ID0gcC0+bmV4dDsKKwkJcC0+c2l6ZSAtPSBuZXdibG9jay0+c2l6ZTsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCQlwID0gbmV3YmxvY2s7CisJfQorCisJLyogYnJlYWsgcmlnaHQgKi8KKwlpZiAoc2l6ZSA8IHAtPnNpemUpIHsKKwkJbmV3YmxvY2sgPSAoVE1lbUJsb2NrKikgZHJtX2NhbGxvYygxLCBzaXplb2YoVE1lbUJsb2NrKSwKKwkJICAgIERSTV9NRU1fRFJJVkVSKTsKKwkJbmV3YmxvY2stPm9mcyA9IHN0YXJ0b2ZzICsgc2l6ZTsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gc2l6ZTsKKwkJbmV3YmxvY2stPmZyZWUgPSAxOworCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7CisJCXAtPnNpemUgPSBzaXplOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisJfQorCisJLyogcCA9IG1pZGRsZSBibG9jayAqLworCXAtPmFsaWduID0gYWxpZ25tZW50OworCXAtPmZyZWUgPSAwOworCXAtPnJlc2VydmVkID0gcmVzZXJ2ZWQ7CisJcmV0dXJuIHA7Cit9CisKK1BNZW1CbG9jayBtbUFsbG9jTWVtKCBtZW1IZWFwX3QgKmhlYXAsIGludCBzaXplLCBpbnQgYWxpZ24yLCBpbnQgc3RhcnRTZWFyY2gpCit7CisJaW50IG1hc2ssc3RhcnRvZnMsIGVuZG9mczsKKwlUTWVtQmxvY2sgKnA7CisJCisJaWYgKGhlYXAgPT0gTlVMTCB8fCBhbGlnbjIgPCAwIHx8IHNpemUgPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwltYXNrID0gKDEgPDwgYWxpZ24yKS0xOworCXN0YXJ0b2ZzID0gMDsKKwlwID0gKFRNZW1CbG9jayAqKWhlYXA7CisJd2hpbGUgKHAgIT0gTlVMTCkgeworCQlpZiAoSVNGUkVFKHApKSB7CisJCQlzdGFydG9mcyA9IChwLT5vZnMgKyBtYXNrKSAmIH5tYXNrOworCQkJaWYgKCBzdGFydG9mcyA8IHN0YXJ0U2VhcmNoICkgeworCQkJCXN0YXJ0b2ZzID0gc3RhcnRTZWFyY2g7CisJCQl9CisJCQllbmRvZnMgPSBzdGFydG9mcytzaXplOworCQkJaWYgKGVuZG9mcyA8PSAocC0+b2ZzK3AtPnNpemUpKQorCQkJCWJyZWFrOworCQl9CisJCXAgPSBwLT5uZXh0OworCX0KKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gU2xpY2VCbG9jayhwLHN0YXJ0b2ZzLHNpemUsMCxtYXNrKzEpOworCXAtPmhlYXAgPSBoZWFwOworCXJldHVybiBwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgSm9pbjJCbG9ja3MoVE1lbUJsb2NrICpwKQoreworCWlmIChwLT5mcmVlICYmIHAtPm5leHQgJiYgcC0+bmV4dC0+ZnJlZSkgeworCQlUTWVtQmxvY2sgKnEgPSBwLT5uZXh0OworCQlwLT5zaXplICs9IHEtPnNpemU7CisJCXAtPm5leHQgPSBxLT5uZXh0OworCQlkcm1fZnJlZShxLCBzaXplb2YoVE1lbUJsb2NrKSwgRFJNX01FTV9EUklWRVIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtbUZyZWVNZW0oUE1lbUJsb2NrIGIpCit7CisJVE1lbUJsb2NrICpwLCAqcHJldjsKKworCWlmIChiID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChiLT5oZWFwID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXAgPSBiLT5oZWFwOworCXByZXYgPSBOVUxMOworCXdoaWxlIChwICE9IE5VTEwgJiYgcCAhPSBiKSB7CisJCXByZXYgPSBwOworCQlwID0gcC0+bmV4dDsKKwl9CisJaWYgKHAgPT0gTlVMTCB8fCBwLT5mcmVlIHx8IHAtPnJlc2VydmVkKQorCQlyZXR1cm4gLTE7CisKKwlwLT5mcmVlID0gMTsKKwlKb2luMkJsb2NrcyhwKTsKKwlpZiAocHJldikKKwlKb2luMkJsb2NrcyhwcmV2KTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHMuaCBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxZWU3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RzLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qIHNpc19kcy5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBNb24gSmFuICA0IDEwOjA1OjA1IDE5OTkgYnkgc2NsaW5Ac2lzLmNvbS50dworICoKKyAqIENvcHlyaWdodCAyMDAwIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIENvcnAsIEluYy4sIEhzaW5DaHUsIFRhaXdhbi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqIEF1dGhvcnM6CisgKiAgICBTdW5nLUNoaW5nIExpbiA8c2NsaW5Ac2lzLmNvbS50dz4KKyAqIAorICovCisKKyNpZm5kZWYgX19TSVNfRFNfSF9fCisjZGVmaW5lIF9fU0lTX0RTX0hfXworCisvKiBTZXQgRGF0YSBTdHJ1Y3R1cmUgKi8KKworI2RlZmluZSBTRVRfU0laRSA1MDAwCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IElURU1fVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUlURU1fVFlQRSB2YWw7CisJaW50IGFsbG9jX25leHQsIGZyZWVfbmV4dDsKK30gbGlzdF9pdGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgYWxsb2M7CisJaW50IGZyZWU7CisJaW50IHRyYWNlOworCWxpc3RfaXRlbV90IGxpc3RbU0VUX1NJWkVdOworfSBzZXRfdDsKKworc2V0X3QgKnNldEluaXQodm9pZCk7CitpbnQgc2V0QWRkKHNldF90ICpzZXQsIElURU1fVFlQRSBpdGVtKTsKK2ludCBzZXREZWwoc2V0X3QgKnNldCwgSVRFTV9UWVBFIGl0ZW0pOworaW50IHNldEZpcnN0KHNldF90ICpzZXQsIElURU1fVFlQRSAqaXRlbSk7CitpbnQgc2V0TmV4dChzZXRfdCAqc2V0LCBJVEVNX1RZUEUgKml0ZW0pOworaW50IHNldERlc3Ryb3koc2V0X3QgKnNldCk7CisKKy8qCisgKiBHTFggSGFyZHdhcmUgRGV2aWNlIERyaXZlciBjb21tb24gY29kZQorICogQ29weXJpZ2h0IChDKSAxOTk5IFdpdHRhd2F0IFlhbXdvbmcKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFdJVFRBV0FUIFlBTVdPTkcsIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIAorICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKK3N0cnVjdCBtZW1fYmxvY2tfdCB7CisJc3RydWN0IG1lbV9ibG9ja190ICpuZXh0OworCXN0cnVjdCBtZW1fYmxvY2tfdCAqaGVhcDsKKwlpbnQgb2ZzLHNpemU7CisJaW50IGFsaWduOworCXVuc2lnbmVkIGludCBmcmVlOjE7CisJdW5zaWduZWQgaW50IHJlc2VydmVkOjE7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbWVtX2Jsb2NrX3QgVE1lbUJsb2NrOwordHlwZWRlZiBzdHJ1Y3QgbWVtX2Jsb2NrX3QgKlBNZW1CbG9jazsKKworLyogYSBoZWFwIGlzIGp1c3QgdGhlIGZpcnN0IGJsb2NrIGluIGEgY2hhaW4gKi8KK3R5cGVkZWYgc3RydWN0IG1lbV9ibG9ja190IG1lbUhlYXBfdDsKKworc3RhdGljIF9faW5saW5lX18gaW50IG1tQmxvY2tTaXplKFBNZW1CbG9jayBiKQoreworCXJldHVybiBiLT5zaXplOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbW1PZmZzZXQoUE1lbUJsb2NrIGIpCit7CisJcmV0dXJuIGItPm9mczsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBtbU1hcmtSZXNlcnZlZChQTWVtQmxvY2sgYikKK3sKKwliLT5yZXNlcnZlZCA9IDE7Cit9CisKKy8qIAorICogaW5wdXQ6IHRvdGFsIHNpemUgaW4gYnl0ZXMKKyAqIHJldHVybjogYSBoZWFwIHBvaW50ZXIgaWYgT0ssIE5VTEwgaWYgZXJyb3IKKyAqLworbWVtSGVhcF90ICptbUluaXQoIGludCBvZnMsIGludCBzaXplICk7CisKKy8qCisgKiBBbGxvY2F0ZSAnc2l6ZScgYnl0ZXMgd2l0aCAyXmFsaWduMiBieXRlcyBhbGlnbm1lbnQsCisgKiByZXN0cmljdCB0aGUgc2VhcmNoIHRvIGZyZWUgbWVtb3J5IGFmdGVyICdzdGFydFNlYXJjaCcKKyAqIGRlcHRoIGFuZCBiYWNrIGJ1ZmZlcnMgc2hvdWxkIGJlIGluIGRpZmZlcmVudCA0bWIgYmFua3MKKyAqIHRvIGdldCBiZXR0ZXIgcGFnZSBoaXRzIGlmIHBvc3NpYmxlCisgKiBpbnB1dDoJc2l6ZSA9IHNpemUgb2YgYmxvY2sKKyAqICAgICAgIAlhbGlnbjIgPSAyXmFsaWduMiBieXRlcyBhbGlnbm1lbnQKKyAqCQlzdGFydFNlYXJjaCA9IGxpbmVhciBvZmZzZXQgZnJvbSBzdGFydCBvZiBoZWFwIHRvIGJlZ2luIHNlYXJjaAorICogcmV0dXJuOiBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIDAgaWYgZXJyb3IKKyAqLworUE1lbUJsb2NrIG1tQWxsb2NNZW0oIG1lbUhlYXBfdCAqaGVhcCwgaW50IHNpemUsIGludCBhbGlnbjIsIGludCBzdGFydFNlYXJjaCApOworCisvKgorICogUmV0dXJucyAxIGlmIHRoZSBibG9jayAnYicgaXMgcGFydCBvZiB0aGUgaGVhcCAnaGVhcCcKKyAqLworaW50IG1tQmxvY2tJbkhlYXAoIFBNZW1CbG9jayBoZWFwLCBQTWVtQmxvY2sgYiApOworCisvKgorICogRnJlZSBibG9jayBzdGFydHMgYXQgb2Zmc2V0CisgKiBpbnB1dDogcG9pbnRlciB0byBhIGJsb2NrCisgKiByZXR1cm46IDAgaWYgT0ssIC0xIGlmIGVycm9yCisgKi8KK2ludCBtbUZyZWVNZW0oIFBNZW1CbG9jayBiICk7CisKKy8qIEZvciBkZWJ1Z2luZyBwdXJwb3NlLiAqLwordm9pZCBtbUR1bXBNZW1JbmZvKCBtZW1IZWFwX3QgKm1tSW5pdCApOworCisjZW5kaWYgLyogX19TSVNfRFNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjEwYzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYwpAQCAtMCwwICsxLDQxNyBAQAorLyogc2lzX21tLmMgLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIERpcmVjdCBSZW5kZXJpbmcgTWFuYWdlciAtKi0gbGludXgtYyAtKi0KKyAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMTA6MDU6MDUgMTk5OSBieSBzY2xpbkBzaXMuY29tLnR3CisgKgorICogQ29weXJpZ2h0IDIwMDAgU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycCwgSW5jLiwgSHNpbkNodSwgVGFpd2FuLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICogQXV0aG9yczoKKyAqICAgIFN1bmctQ2hpbmcgTGluIDxzY2xpbkBzaXMuY29tLnR3PgorICogCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJzaXNfZHJtLmgiCisjaW5jbHVkZSAic2lzX2Rydi5oIgorI2luY2x1ZGUgInNpc19kcy5oIgorI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKENPTkZJR19GQl9TSVMpCisjaW5jbHVkZSA8dmlkZW8vc2lzZmIuaD4KKyNlbmRpZgorCisjZGVmaW5lIE1BWF9DT05URVhUIDEwMAorI2RlZmluZSBWSURFT19UWVBFIDAgCisjZGVmaW5lIEFHUF9UWVBFIDEKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB1c2VkOworCWludCBjb250ZXh0OworCXNldF90ICpzZXRzWzJdOyAvKiAwIGZvciB2aWRlbywgMSBmb3IgQUdQICovCit9IHNpc19jb250ZXh0X3Q7CisKK3N0YXRpYyBzaXNfY29udGV4dF90IGdsb2JhbF9wcHJpdltNQVhfQ09OVEVYVF07CisKKworc3RhdGljIGludCBhZGRfYWxsb2Nfc2V0KGludCBjb250ZXh0LCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpbnQgaSwgcmV0dmFsID0gMDsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlRFWFQ7IGkrKykgeworCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYgZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkKKwkJeworCQkJcmV0dmFsID0gc2V0QWRkKGdsb2JhbF9wcHJpdltpXS5zZXRzW3R5cGVdLCB2YWwpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkZWxfYWxsb2Nfc2V0KGludCBjb250ZXh0LCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHZhbCkKK3sgIAorCWludCBpLCByZXR2YWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9DT05URVhUOyBpKyspIHsKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmIGdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID09IGNvbnRleHQpCisJCXsKKwkJCXJldHZhbCA9IHNldERlbChnbG9iYWxfcHByaXZbaV0uc2V0c1t0eXBlXSwgdmFsKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIGZiIG1hbmFnZW1lbnQgdmlhIGZiIGRldmljZSAqLyAKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQorCitzdGF0aWMgaW50IHNpc19mYl9pbml0KCBEUk1fSU9DVExfQVJHUyApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2ZiX2FsbG9jKCBEUk1fSU9DVExfQVJHUyApCit7CisJZHJtX3Npc19tZW1fdCBmYjsKKwlzdHJ1Y3Qgc2lzX21lbXJlcSByZXE7CisJZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWludCByZXR2YWwgPSAwOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZiLCBhcmdwLCBzaXplb2YoZmIpKTsKKworCXJlcS5zaXplID0gZmIuc2l6ZTsKKwlzaXNfbWFsbG9jKCZyZXEpOworCWlmIChyZXEub2Zmc2V0KSB7CisJCS8qIFRPRE8gKi8KKwkJZmIub2Zmc2V0ID0gcmVxLm9mZnNldDsKKwkJZmIuZnJlZSA9IHJlcS5vZmZzZXQ7CisJCWlmICghYWRkX2FsbG9jX3NldChmYi5jb250ZXh0LCBWSURFT19UWVBFLCBmYi5mcmVlKSkgeworCQkJRFJNX0RFQlVHKCJhZGRpbmcgdG8gYWxsb2NhdGlvbiBzZXQgZmFpbHNcbiIpOworCQkJc2lzX2ZyZWUocmVxLm9mZnNldCk7CisJCQlyZXR2YWwgPSBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKwl9IGVsc2UgeyAgCisJCWZiLm9mZnNldCA9IDA7CisJCWZiLnNpemUgPSAwOworCQlmYi5mcmVlID0gMDsKKwl9CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKGFyZ3AsIGZiLCBzaXplb2YoZmIpKTsKKworCURSTV9ERUJVRygiYWxsb2MgZmIsIHNpemUgPSAlZCwgb2Zmc2V0ID0gJWRcbiIsIGZiLnNpemUsIHJlcS5vZmZzZXQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBzaXNfZmJfZnJlZSggRFJNX0lPQ1RMX0FSR1MgKQoreworCWRybV9zaXNfbWVtX3QgZmI7CisJaW50IHJldHZhbCA9IDA7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZmIsIChkcm1fc2lzX21lbV90IF9fdXNlciAqKWRhdGEsIHNpemVvZihmYikpOworCisJaWYgKCFmYi5mcmVlKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJaWYgKCFkZWxfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJREVPX1RZUEUsIGZiLmZyZWUpKQorCQlyZXR2YWwgPSBEUk1fRVJSKEVJTlZBTCk7CisJc2lzX2ZyZWUoKHUzMilmYi5mcmVlKTsKKworCURSTV9ERUJVRygiZnJlZSBmYiwgb2Zmc2V0ID0gJWx1XG4iLCBmYi5mcmVlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKyNlbHNlCisKKy8qIENhbGxlZCBieSB0aGUgWCBTZXJ2ZXIgdG8gaW5pdGlhbGl6ZSB0aGUgRkIgaGVhcC4gIEFsbG9jYXRpb25zIHdpbGwgZmFpbAorICogdW5sZXNzIHRoaXMgaXMgY2FsbGVkLiAgT2Zmc2V0IGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlYXAgZnJvbSB0aGUKKyAqIGZyYW1lYnVmZmVyIG9mZnNldCAoTWF4WEZCTWVtIGluIFhGcmVlODYpLgorICoKKyAqIE1lbW9yeSBsYXlvdXQgYWNjb3JkaW5nIHRvIFRob21hcyBXaW5pc2Nob2ZlcjoKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS18RERERERERERERERERERERERERERERERERERERER8SEhISHxDQ0NDQ0NDQ0NDQ3wKKyAqCisgKiAgICBYIGRyaXZlci9zaXNmYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVy0gICBDb21tYW5kLQorICogIGZyYW1lYnVmZmVyIG1lbW9yeSAgICAgICAgICAgRFJJIGhlYXAgICAgICAgICAgIEN1cnNvciAgIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQgc2lzX2ZiX2luaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3Npc19mYl90IGZiOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZiLCAoZHJtX3Npc19mYl90IF9fdXNlciAqKWRhdGEsIHNpemVvZihmYikpOworCisJaWYgKGRldl9wcml2ID09IE5VTEwpIHsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKGRybV9zaXNfcHJpdmF0ZV90KSwKKwkJICAgIERSTV9NRU1fRFJJVkVSKTsKKwkJZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQlpZiAoZGV2X3ByaXYgPT0gTlVMTCkKKwkJCXJldHVybiBFTk9NRU07CisJfQorCisJaWYgKGRldl9wcml2LT5GQkhlYXAgIT0gTlVMTCkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCWRldl9wcml2LT5GQkhlYXAgPSBtbUluaXQoZmIub2Zmc2V0LCBmYi5zaXplKTsKKworCURSTV9ERUJVRygib2Zmc2V0ID0gJXUsIHNpemUgPSAldSIsIGZiLm9mZnNldCwgZmIuc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaXNfZmJfYWxsb2MoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV9zaXNfbWVtX3QgZmI7CisJUE1lbUJsb2NrIGJsb2NrOworCWludCByZXR2YWwgPSAwOworCisJaWYgKGRldl9wcml2ID09IE5VTEwgfHwgZGV2X3ByaXYtPkZCSGVhcCA9PSBOVUxMKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworICAKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZmIsIGFyZ3AsIHNpemVvZihmYikpOworICAKKwlibG9jayA9IG1tQWxsb2NNZW0oZGV2X3ByaXYtPkZCSGVhcCwgZmIuc2l6ZSwgMCwgMCk7CisJaWYgKGJsb2NrKSB7CisJCS8qIFRPRE8gKi8KKwkJZmIub2Zmc2V0ID0gYmxvY2stPm9mczsKKwkJZmIuZnJlZSA9ICh1bnNpZ25lZCBsb25nKWJsb2NrOworCQlpZiAoIWFkZF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU9fVFlQRSwgZmIuZnJlZSkpIHsKKwkJCURSTV9ERUJVRygiYWRkaW5nIHRvIGFsbG9jYXRpb24gc2V0IGZhaWxzXG4iKTsKKwkJCW1tRnJlZU1lbSgoUE1lbUJsb2NrKWZiLmZyZWUpOworCQkJcmV0dmFsID0gRFJNX0VSUihFSU5WQUwpOworCQl9CisJfSBlbHNlIHsKKwkJZmIub2Zmc2V0ID0gMDsKKwkJZmIuc2l6ZSA9IDA7CisJCWZiLmZyZWUgPSAwOworCX0KKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoYXJncCwgZmIsIHNpemVvZihmYikpOworCisJRFJNX0RFQlVHKCJhbGxvYyBmYiwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZFxuIiwgZmIuc2l6ZSwgZmIub2Zmc2V0KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2lzX2ZiX2ZyZWUoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX3Npc19tZW1fdCBmYjsKKworCWlmIChkZXZfcHJpdiA9PSBOVUxMIHx8IGRldl9wcml2LT5GQkhlYXAgPT0gTlVMTCkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChmYiwgKGRybV9zaXNfbWVtX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGZiKSk7CisKKwlpZiAoIW1tQmxvY2tJbkhlYXAoZGV2X3ByaXYtPkZCSGVhcCwgKFBNZW1CbG9jaylmYi5mcmVlKSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCWlmICghZGVsX2FsbG9jX3NldChmYi5jb250ZXh0LCBWSURFT19UWVBFLCBmYi5mcmVlKSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwltbUZyZWVNZW0oKFBNZW1CbG9jaylmYi5mcmVlKTsKKworCURSTV9ERUJVRygiZnJlZSBmYiwgZnJlZSA9IDB4JWx4XG4iLCBmYi5mcmVlKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKKworLyogYWdwIG1lbW9yeSBtYW5hZ2VtZW50ICovIAorCitzdGF0aWMgaW50IHNpc19pb2N0bF9hZ3BfaW5pdCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fc2lzX2FncF90IGFncDsKKworCWlmIChkZXZfcHJpdiA9PSBOVUxMKSB7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSBkcm1fY2FsbG9jKDEsIHNpemVvZihkcm1fc2lzX3ByaXZhdGVfdCksCisJCSAgICBEUk1fTUVNX0RSSVZFUik7CisJCWRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwkJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCQlyZXR1cm4gRU5PTUVNOworCX0KKworCWlmIChkZXZfcHJpdi0+QUdQSGVhcCAhPSBOVUxMKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFncCwgKGRybV9zaXNfYWdwX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKGFncCkpOworCisJZGV2X3ByaXYtPkFHUEhlYXAgPSBtbUluaXQoYWdwLm9mZnNldCwgYWdwLnNpemUpOworCisJRFJNX0RFQlVHKCJvZmZzZXQgPSAldSwgc2l6ZSA9ICV1IiwgYWdwLm9mZnNldCwgYWdwLnNpemUpOworICAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaXNfaW9jdGxfYWdwX2FsbG9jKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fc2lzX21lbV90IGFncDsKKwlQTWVtQmxvY2sgYmxvY2s7CisJaW50IHJldHZhbCA9IDA7CisgICAKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCB8fCBkZXZfcHJpdi0+QUdQSGVhcCA9PSBOVUxMKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworICAKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoYWdwLCBhcmdwLCBzaXplb2YoYWdwKSk7CisgIAorCWJsb2NrID0gbW1BbGxvY01lbShkZXZfcHJpdi0+QUdQSGVhcCwgYWdwLnNpemUsIDAsIDApOworCWlmIChibG9jaykgeworCQkvKiBUT0RPICovCisJCWFncC5vZmZzZXQgPSBibG9jay0+b2ZzOworCQlhZ3AuZnJlZSA9ICh1bnNpZ25lZCBsb25nKWJsb2NrOworCQlpZiAoIWFkZF9hbGxvY19zZXQoYWdwLmNvbnRleHQsIEFHUF9UWVBFLCBhZ3AuZnJlZSkpIHsKKwkJCURSTV9ERUJVRygiYWRkaW5nIHRvIGFsbG9jYXRpb24gc2V0IGZhaWxzXG4iKTsKKwkJCW1tRnJlZU1lbSgoUE1lbUJsb2NrKWFncC5mcmVlKTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisJfSBlbHNlIHsgIAorCQlhZ3Aub2Zmc2V0ID0gMDsKKwkJYWdwLnNpemUgPSAwOworCQlhZ3AuZnJlZSA9IDA7CisJfQorCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmdwLCBhZ3AsIHNpemVvZihhZ3ApKTsKKworCURSTV9ERUJVRygiYWxsb2MgYWdwLCBzaXplID0gJWQsIG9mZnNldCA9ICVkXG4iLCBhZ3Auc2l6ZSwgYWdwLm9mZnNldCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNpc19pb2N0bF9hZ3BfZnJlZSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fc2lzX21lbV90IGFncDsKKworCWlmIChkZXZfcHJpdiA9PSBOVUxMIHx8IGRldl9wcml2LT5BR1BIZWFwID09IE5VTEwpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoYWdwLCAoZHJtX3Npc19tZW1fdCBfX3VzZXIgKilkYXRhLCBzaXplb2YoYWdwKSk7CisKKwlpZiAoIW1tQmxvY2tJbkhlYXAoZGV2X3ByaXYtPkFHUEhlYXAsIChQTWVtQmxvY2spYWdwLmZyZWUpKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJbW1GcmVlTWVtKChQTWVtQmxvY2spYWdwLmZyZWUpOworCWlmICghZGVsX2FsbG9jX3NldChhZ3AuY29udGV4dCwgQUdQX1RZUEUsIGFncC5mcmVlKSkKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCURSTV9ERUJVRygiZnJlZSBhZ3AsIGZyZWUgPSAweCVseFxuIiwgYWdwLmZyZWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzaXNfaW5pdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9DT05URVhUIDsgaSsrKSB7CisJCWlmIChnbG9iYWxfcHByaXZbaV0udXNlZCAmJgorCQkgICAgKGdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID09IGNvbnRleHQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gTUFYX0NPTlRFWFQpIHsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9DT05URVhUIDsgaSsrKSB7CisJCQlpZiAoIWdsb2JhbF9wcHJpdltpXS51c2VkKSB7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPSBjb250ZXh0OworCQkJCWdsb2JhbF9wcHJpdltpXS51c2VkID0gMTsKKwkJCQlnbG9iYWxfcHByaXZbaV0uc2V0c1swXSA9IHNldEluaXQoKTsKKwkJCQlnbG9iYWxfcHByaXZbaV0uc2V0c1sxXSA9IHNldEluaXQoKTsKKwkJCQlEUk1fREVCVUcoImluaXQgYWxsb2NhdGlvbiBzZXQsIHNvY2tldD0lZCwgIgorCQkJCSAgICAiY29udGV4dCA9ICVkXG4iLCBpLCBjb250ZXh0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoKGkgPj0gTUFYX0NPTlRFWFQpIHx8IChnbG9iYWxfcHByaXZbaV0uc2V0c1swXSA9PSBOVUxMKSB8fAorCQkgICAgKGdsb2JhbF9wcHJpdltpXS5zZXRzWzFdID09IE5VTEwpKQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkKKwlyZXR1cm4gMTsKK30KKworaW50IHNpc19maW5hbF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8TUFYX0NPTlRFWFQ7IGkrKykgeworCQlpZiAoZ2xvYmFsX3Bwcml2W2ldLnVzZWQgJiYKKwkJICAgIChnbG9iYWxfcHByaXZbaV0uY29udGV4dCA9PSBjb250ZXh0KSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpIDwgTUFYX0NPTlRFWFQpIHsKKwkJc2V0X3QgKnNldDsKKwkJdW5zaWduZWQgaW50IGl0ZW07CisJCWludCByZXR2YWw7CisKKwkJRFJNX0RFQlVHKCJmaW5kIHNvY2tldCAlZCwgY29udGV4dCA9ICVkXG4iLCBpLCBjb250ZXh0KTsKKworCQkvKiBWaWRlbyBNZW1vcnkgKi8KKwkJc2V0ID0gZ2xvYmFsX3Bwcml2W2ldLnNldHNbMF07CisJCXJldHZhbCA9IHNldEZpcnN0KHNldCwgJml0ZW0pOworCQl3aGlsZSAocmV0dmFsKSB7CisJCQlEUk1fREVCVUcoImZyZWUgdmlkZW8gbWVtb3J5IDB4JXhcbiIsIGl0ZW0pOworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKENPTkZJR19GQl9TSVMpCisJCQlzaXNfZnJlZShpdGVtKTsKKyNlbHNlCisJCQltbUZyZWVNZW0oKFBNZW1CbG9jaylpdGVtKTsKKyNlbmRpZgorCQkJcmV0dmFsID0gc2V0TmV4dChzZXQsICZpdGVtKTsKKwkJfQorCQlzZXREZXN0cm95KHNldCk7CisKKwkJLyogQUdQIE1lbW9yeSAqLworCQlzZXQgPSBnbG9iYWxfcHByaXZbaV0uc2V0c1sxXTsKKwkJcmV0dmFsID0gc2V0Rmlyc3Qoc2V0LCAmaXRlbSk7CisJCXdoaWxlIChyZXR2YWwpIHsKKwkJCURSTV9ERUJVRygiZnJlZSBhZ3AgbWVtb3J5IDB4JXhcbiIsIGl0ZW0pOworCQkJbW1GcmVlTWVtKChQTWVtQmxvY2spaXRlbSk7CisJCQlyZXR2YWwgPSBzZXROZXh0KHNldCwgJml0ZW0pOworCQl9CisJCXNldERlc3Ryb3koc2V0KTsKKworCQlnbG9iYWxfcHByaXZbaV0udXNlZCA9IDA7CSAgCisgICAgICAgIH0KKwkKKwlyZXR1cm4gMTsKK30KKworZHJtX2lvY3RsX2Rlc2NfdCBzaXNfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0FMTE9DKV0gID0geyBzaXNfZmJfYWxsb2MsICAgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0ZSRUUpXSAgID0geyBzaXNfZmJfZnJlZSwgICAgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0FHUF9JTklUKV0gID0geyBzaXNfaW9jdGxfYWdwX2luaXQsICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0FHUF9BTExPQyldID0geyBzaXNfaW9jdGxfYWdwX2FsbG9jLCAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0FHUF9GUkVFKV0gID0geyBzaXNfaW9jdGxfYWdwX2ZyZWUsICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0lOSVQpXSAgID0geyBzaXNfZmJfaW5pdCwgICAgICAgICAxLCAxIH0KK307CisKK2ludCBzaXNfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoc2lzX2lvY3Rscyk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTc5NDNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiB0ZGZ4X2Rydi5jIC0tIHRkZnggZHJpdmVyIC0qLSBsaW51eC1jIC0qLQorICogQ3JlYXRlZDogVGh1IE9jdCAgNyAxMDozODozMiAxOTk5IGJ5IGZhaXRoQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICogICAgRGFyeWxsIFN0cmF1c3MgPGRhcnlsbEB2YWxpbnV4LmNvbT4KKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInRkZnhfZHJ2LmgiCisKKyNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCisKK3N0YXRpYyBpbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQoreworCURSTV9JTkZPKCAiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAorCQlEUklWRVJfTkFNRSwKKwkJRFJJVkVSX01BSk9SLAorCQlEUklWRVJfTUlOT1IsCisJCURSSVZFUl9QQVRDSExFVkVMLAorCQlEUklWRVJfREFURSwKKwkJZGV2LT5wcmltYXJ5Lm1pbm9yLAorCQlwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQorCQkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcnNpb24oIGRybV92ZXJzaW9uX3QgKnZlcnNpb24gKQoreworCWludCBsZW47CisKKwl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOworCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7CisJRFJNX0NPUFkoIHZlcnNpb24tPm5hbWUsIERSSVZFUl9OQU1FICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFICk7CisJRFJNX0NPUFkoIHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKKwl0ZGZ4X1BDSV9JRFMKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9VU0VfTVRSUiwKKwkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAorCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAorCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAorCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAorCS52ZXJzaW9uID0gdmVyc2lvbiwKKwkuZm9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gZHJtX29wZW4sCisJCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCisJCS5pb2N0bCA9IGRybV9pb2N0bCwKKwkJLm1tYXAgPSBkcm1fbW1hcCwKKwkJLnBvbGwgPSBkcm1fcG9sbCwKKwkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlICAgICAgPSBwY2lpZGxpc3QsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgdGRmeF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGRmeF9leGl0KHZvaWQpCit7CisJZHJtX2V4aXQoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRkZnhfaW5pdCk7Cittb2R1bGVfZXhpdCh0ZGZ4X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODJhM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmgKQEAgLTAsMCArMSw1MCBAQAorLyogdGRmeC5oIC0tIDNkZnggRFJNIHRlbXBsYXRlIGN1c3RvbWl6YXRpb24gLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBXZWQgRmViIDE0IDEyOjMyOjMyIDIwMDEgYnkgZ2FyZXRoQHZhbGludXguY29tCisgKgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICovCisKKyNpZm5kZWYgX19UREZYX0hfXworI2RlZmluZSBfX1RERlhfSF9fCisKKy8qIFRoaXMgcmVtYWlucyBjb25zdGFudCBmb3IgYWxsIERSTSB0ZW1wbGF0ZSBmaWxlcy4KKyAqLworI2RlZmluZSBEUk0oeCkgdGRmeF8jI3gKKworLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgorICovCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIlZBIExpbnV4IFN5c3RlbXMgSW5jLiIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJInRkZngiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiM2RmeCBCYW5zaGVlL1Zvb2RvbzMrIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDEwMjE2IgorCisjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQorI2RlZmluZSBEUklWRVJfTUlOT1IJCTAKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kczEyODYuYyBiL2RyaXZlcnMvY2hhci9kczEyODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU1Y2FjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RzMTI4Ni5jCkBAIC0wLDAgKzEsNTc4IEBACisvKgorICogRFMxMjg2IFJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwIFJhbGYgQmFlY2hsZQorICoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBQYXVsIEdvcnRtYWtlci4KKyAqCisgKiBUaGlzIGRyaXZlciBhbGxvd3MgdXNlIG9mIHRoZSByZWFsIHRpbWUgY2xvY2sgKGJ1aWx0IGludG8gbmVhcmx5IGFsbAorICogY29tcHV0ZXJzKSBmcm9tIHVzZXIgc3BhY2UuIEl0IGV4cG9ydHMgdGhlIC9kZXYvcnRjIGludGVyZmFjZSBzdXBwb3J0aW5nCisgKiB2YXJpb3VzIGlvY3RsKCkgYW5kIGFsc28gdGhlIC9wcm9jL3J0YyBwc2V1ZG8tZmlsZSBmb3Igc3RhdHVzCisgKiBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgaW9jdGxzIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW50ZXJydXB0IGJlaGF2aW91ciBhbmQgZ2VuZXJhdGlvbiByYXRlCisgKiBmcm9tIHRoZSBSVEMgdmlhIElSUSA4LiBUaGVuIHRoZSAvZGV2L3J0YyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gbWFrZQorICogdXNlIG9mIHRoZXNlIHRpbWVyIGludGVycnVwdHMsIGJlIHRoZXkgaW50ZXJ2YWwgb3IgYWxhcm0gYmFzZWQuCisgKgorICogVGhlIC9kZXYvcnRjIGludGVyZmFjZSB3aWxsIGJsb2NrIG9uIHJlYWRzIHVudGlsIGFuIGludGVycnVwdCBoYXMgYmVlbgorICogcmVjZWl2ZWQuIElmIGEgUlRDIGludGVycnVwdCBoYXMgYWxyZWFkeSBoYXBwZW5lZCwgaXQgd2lsbCBvdXRwdXQgYW4KKyAqIHVuc2lnbmVkIGxvbmcgYW5kIHRoZW4gYmxvY2suIFRoZSBvdXRwdXQgdmFsdWUgY29udGFpbnMgdGhlIGludGVycnVwdAorICogc3RhdHVzIGluIHRoZSBsb3cgYnl0ZSBhbmQgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIHNpbmNlIHRoZSBsYXN0IHJlYWQKKyAqIGluIHRoZSByZW1haW5pbmcgaGlnaCBieXRlcy4gVGhlIC9kZXYvcnRjIGludGVyZmFjZSBjYW4gYWxzbyBiZSB1c2VkIHdpdGgKKyAqIHRoZSBzZWxlY3QoMikgY2FsbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvZHMxMjg2Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgRFMxMjg2X1ZFUlNJT04JCSIxLjAiCisKKy8qCisgKglXZSBzcG9uZ2UgYSBtaW5vciBvZmYgb2YgdGhlIG1pc2MgbWFqb3IuIE5vIG5lZWQgc2x1cnBpbmcKKyAqCXVwIGFub3RoZXIgdmFsdWFibGUgbWFqb3IgZGV2IG51bWJlciBmb3IgdGhpcy4gSWYgeW91IGFkZAorICoJYW4gaW9jdGwsIG1ha2Ugc3VyZSB5b3UgZG9uJ3QgY29uZmxpY3Qgd2l0aCBTUEFSQydzIFJUQworICoJaW9jdGxzLgorICovCisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChkczEyODZfd2FpdCk7CisKK3N0YXRpYyBzc2l6ZV90IGRzMTI4Nl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisKK3N0YXRpYyBpbnQgZHMxMjg2X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGRzMTI4Nl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKKworc3RhdGljIHZvaWQgZHMxMjg2X2dldF9hbG1fdGltZSAoc3RydWN0IHJ0Y190aW1lICphbG1fdG0pOworc3RhdGljIHZvaWQgZHMxMjg2X2dldF90aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKTsKK3N0YXRpYyBpbnQgZHMxMjg2X3NldF90aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGRzMTI4Nl9pc191cGRhdGluZyh2b2lkKTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhkczEyODZfbG9jayk7CisKK3N0YXRpYyBpbnQgZHMxMjg2X3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKKworLyoKKyAqCUJpdHMgaW4gcnRjX3N0YXR1cy4gKDcgYml0cyBvZiByb29tIGZvciBmdXR1cmUgZXhwYW5zaW9uKQorICovCisKKyNkZWZpbmUgUlRDX0lTX09QRU4JCTB4MDEJLyogbWVhbnMgL2Rldi9ydGMgaXMgaW4gdXNlCSovCisjZGVmaW5lIFJUQ19USU1FUl9PTgkJMHgwMgkvKiBtaXNzZWQgaXJxIHRpbWVyIGFjdGl2ZQkqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBkczEyODZfc3RhdHVzOwkvKiBiaXRtYXBwZWQgc3RhdHVzIGJ5dGUuCSovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRheXNfaW5fbW9bXSA9IHsKKwkwLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCit9OworCisvKgorICoJTm93IGFsbCB0aGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgdGhhdCB3ZSBleHBvcnQuCisgKi8KKworc3RhdGljIHNzaXplX3QgZHMxMjg2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGRzMTI4Nl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBydGNfdGltZSB3dGltZTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoJLyogTWFzayBhbGFybSBpbnQuIGVuYWIuIGJpdAkqLworCXsKKwkJdW5zaWduZWQgaW50IGZsYWdzOworCQl1bnNpZ25lZCBjaGFyIHZhbDsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCQl2YWwgPSBydGNfcmVhZChSVENfQ01EKTsKKwkJdmFsIHw9ICBSVENfVERNOworCQlydGNfd3JpdGUodmFsLCBSVENfQ01EKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfQUlFX09OOgkvKiBBbGxvdyBhbGFybSBpbnRlcnJ1cHRzLgkqLworCXsKKwkJdW5zaWduZWQgaW50IGZsYWdzOworCQl1bnNpZ25lZCBjaGFyIHZhbDsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCQl2YWwgPSBydGNfcmVhZChSVENfQ01EKTsKKwkJdmFsICY9ICB+UlRDX1RETTsKKwkJcnRjX3dyaXRlKHZhbCwgUlRDX0NNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1dJRV9PRkY6CS8qIE1hc2sgd2F0Y2hkb2cgaW50LiBlbmFiLiBiaXQJKi8KKwl7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJCXZhbCB8PSBSVENfV0FNOworCQlydGNfd3JpdGUodmFsLCBSVENfQ01EKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfV0lFX09OOgkvKiBBbGxvdyB3YXRjaGRvZyBpbnRlcnJ1cHRzLgkqLworCXsKKwkJdW5zaWduZWQgaW50IGZsYWdzOworCQl1bnNpZ25lZCBjaGFyIHZhbDsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCQl2YWwgPSBydGNfcmVhZChSVENfQ01EKTsKKwkJdmFsICY9IH5SVENfV0FNOworCQlydGNfd3JpdGUodmFsLCBSVENfQ01EKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfQUxNX1JFQUQ6CS8qIFJlYWQgdGhlIHByZXNlbnQgYWxhcm0gdGltZSAqLworCXsKKwkJLyoKKwkJICogVGhpcyByZXR1cm5zIGEgc3RydWN0IHJ0Y190aW1lLiBSZWFkaW5nID49IDB4YzAKKwkJICogbWVhbnMgImRvbid0IGNhcmUiIG9yICJtYXRjaCBhbGwiLiBPbmx5IHRoZSB0bV9ob3VyLAorCQkgKiB0bV9taW4sIGFuZCB0bV9zZWMgdmFsdWVzIGFyZSBmaWxsZWQgaW4uCisJCSAqLworCisJCW1lbXNldCgmd3RpbWUsIDAsIHNpemVvZih3dGltZSkpOworCQlkczEyODZfZ2V0X2FsbV90aW1lKCZ3dGltZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFJUQ19BTE1fU0VUOgkvKiBTdG9yZSBhIHRpbWUgaW50byB0aGUgYWxhcm0gKi8KKwl7CisJCS8qCisJCSAqIFRoaXMgZXhwZWN0cyBhIHN0cnVjdCBydGNfdGltZS4gV3JpdGluZyAweGZmIG1lYW5zCisJCSAqICJkb24ndCBjYXJlIiBvciAibWF0Y2ggYWxsIi4gT25seSB0aGUgdG1faG91ciwKKwkJICogdG1fbWluIGFuZCB0bV9zZWMgYXJlIHVzZWQuCisJCSAqLworCQl1bnNpZ25lZCBjaGFyIGhycywgbWluLCBzZWM7CisJCXN0cnVjdCBydGNfdGltZSBhbG1fdG07CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFsbV90bSwgKHN0cnVjdCBydGNfdGltZSopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWhycyA9IGFsbV90bS50bV9ob3VyOworCQltaW4gPSBhbG1fdG0udG1fbWluOworCisJCWlmIChocnMgPj0gMjQpCisJCQlocnMgPSAweGZmOworCisJCWlmIChtaW4gPj0gNjApCisJCQltaW4gPSAweGZmOworCisJCUJJTl9UT19CQ0Qoc2VjKTsKKwkJQklOX1RPX0JDRChtaW4pOworCQlCSU5fVE9fQkNEKGhycyk7CisKKwkJc3Bpbl9sb2NrKCZkczEyODZfbG9jayk7CisJCXJ0Y193cml0ZShocnMsIFJUQ19IT1VSU19BTEFSTSk7CisJCXJ0Y193cml0ZShtaW4sIFJUQ19NSU5VVEVTX0FMQVJNKTsKKwkJc3Bpbl91bmxvY2soJmRzMTI4Nl9sb2NrKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfUkRfVElNRToJLyogUmVhZCB0aGUgdGltZS9kYXRlIGZyb20gUlRDCSovCisJeworCQltZW1zZXQoJnd0aW1lLCAwLCBzaXplb2Yod3RpbWUpKTsKKwkJZHMxMjg2X2dldF90aW1lKCZ3dGltZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFJUQ19TRVRfVElNRToJLyogU2V0IHRoZSBSVEMgKi8KKwl7CisJCXN0cnVjdCBydGNfdGltZSBydGNfdG07CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ0Y190bSwgKHN0cnVjdCBydGNfdGltZSopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBkczEyODZfc2V0X3RpbWUoJnJ0Y190bSk7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmd3RpbWUsIHNpemVvZiB3dGltZSkgPyAtRUZBVUxUIDogMDsKK30KKworLyoKKyAqCVdlIGVuZm9yY2Ugb25seSBvbmUgdXNlciBhdCBhIHRpbWUgaGVyZSB3aXRoIHRoZSBvcGVuL2Nsb3NlLgorICoJQWxzbyBjbGVhciB0aGUgcHJldmlvdXMgaW50ZXJydXB0IGRhdGEgb24gYW4gb3BlbiwgYW5kIGNsZWFuCisgKgl1cCB0aGluZ3Mgb24gYSBjbG9zZS4KKyAqLworCitzdGF0aWMgaW50IGRzMTI4Nl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXNwaW5fbG9ja19pcnEoJmRzMTI4Nl9sb2NrKTsKKworCWlmIChkczEyODZfc3RhdHVzICYgUlRDX0lTX09QRU4pCisJCWdvdG8gb3V0X2J1c3k7CisKKwlkczEyODZfc3RhdHVzIHw9IFJUQ19JU19PUEVOOworCisJc3Bpbl91bmxvY2tfaXJxKCZkczEyODZfbG9jayk7CisJcmV0dXJuIDA7CisKK291dF9idXN5OgorCXNwaW5fbG9ja19pcnEoJmRzMTI4Nl9sb2NrKTsKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IGRzMTI4Nl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWRzMTI4Nl9zdGF0dXMgJj0gflJUQ19JU19PUEVOOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHMxMjg2X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJcG9sbF93YWl0KGZpbGUsICZkczEyODZfd2FpdCwgd2FpdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVRoZSB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucyB3ZSBzdXBwb3J0LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRzMTI4Nl9mb3BzID0geworCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGRzMTI4Nl9yZWFkLAorCS5wb2xsCQk9IGRzMTI4Nl9wb2xsLAorCS5pb2N0bAkJPSBkczEyODZfaW9jdGwsCisJLm9wZW4JCT0gZHMxMjg2X29wZW4sCisJLnJlbGVhc2UJPSBkczEyODZfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBkczEyODZfZGV2PQoreworCS5taW5vcgk9IFJUQ19NSU5PUiwKKwkubmFtZQk9ICJydGMiLAorCS5mb3BzCT0gJmRzMTI4Nl9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHMxMjg2X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRFMxMjg2IFJlYWwgVGltZSBDbG9jayBEcml2ZXIgdiVzXG4iLCBEUzEyODZfVkVSU0lPTik7CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZkczEyODZfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlmICghY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL3J0YyIsIDAsIDAsIGRzMTI4Nl9yZWFkX3Byb2MsIE5VTEwpKSB7CisJCWVyciA9IC1FTk9NRU07CisKKwkJZ290byBvdXRfZGVyZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2RlcmVnaXN0ZXI6CisJbWlzY19kZXJlZ2lzdGVyKCZkczEyODZfZGV2KTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkczEyODZfZXhpdCh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcnRjIiwgTlVMTCk7CisJbWlzY19kZXJlZ2lzdGVyKCZkczEyODZfZGV2KTsKK30KKworc3RhdGljIGNoYXIgKmRheXNbXSA9IHsKKwkiKioqIiwgIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIKK307CisKKy8qCisgKglJbmZvIGV4cG9ydGVkIHZpYSAiL3Byb2MvcnRjIi4KKyAqLworc3RhdGljIGludCBkczEyODZfcHJvY19vdXRwdXQoY2hhciAqYnVmKQoreworCWNoYXIgKnAsICpzOworCXN0cnVjdCBydGNfdGltZSB0bTsKKwl1bnNpZ25lZCBjaGFyIGh1bmRyZWR0aCwgbW9udGgsIGNtZCwgYW1vZGU7CisKKwlwID0gYnVmOworCisJZHMxMjg2X2dldF90aW1lKCZ0bSk7CisJaHVuZHJlZHRoID0gcnRjX3JlYWQoUlRDX0hVTkRSRURUSF9TRUNPTkQpOworCUJDRF9UT19CSU4oaHVuZHJlZHRoKTsKKworCXAgKz0gc3ByaW50ZihwLAorCSAgICAgICAgICAgICAicnRjX3RpbWVcdDogJTAyZDolMDJkOiUwMmQuJTAyZFxuIgorCSAgICAgICAgICAgICAicnRjX2RhdGVcdDogJTA0ZC0lMDJkLSUwMmRcbiIsCisJCSAgICAgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMsIGh1bmRyZWR0aCwKKwkJICAgICB0bS50bV95ZWFyICsgMTkwMCwgdG0udG1fbW9uICsgMSwgdG0udG1fbWRheSk7CisKKwkvKgorCSAqIFdlIGltcGxpY2l0bHkgYXNzdW1lIDI0aHIgbW9kZSBoZXJlLiBBbGFybSB2YWx1ZXMgPj0gMHhjMCB3aWxsCisJICogbWF0Y2ggYW55IHZhbHVlIGZvciB0aGF0IHBhcnRpY3VsYXIgZmllbGQuIFZhbHVlcyB0aGF0IGFyZQorCSAqIGdyZWF0ZXIgdGhhbiBhIHZhbGlkIHRpbWUsIGJ1dCBsZXNzIHRoYW4gMHhjMCBzaG91bGRuJ3QgYXBwZWFyLgorCSAqLworCWRzMTI4Nl9nZXRfYWxtX3RpbWUoJnRtKTsKKwlwICs9IHNwcmludGYocCwgImFsYXJtXHRcdDogJXMgIiwgZGF5c1t0bS50bV93ZGF5XSk7CisJaWYgKHRtLnRtX2hvdXIgPD0gMjQpCisJCXAgKz0gc3ByaW50ZihwLCAiJTAyZDoiLCB0bS50bV9ob3VyKTsKKwllbHNlCisJCXAgKz0gc3ByaW50ZihwLCAiKio6Iik7CisKKwlpZiAodG0udG1fbWluIDw9IDU5KQorCQlwICs9IHNwcmludGYocCwgIiUwMmRcbiIsIHRtLnRtX21pbik7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgIioqXG4iKTsKKworCW1vbnRoID0gcnRjX3JlYWQoUlRDX01PTlRIKTsKKwlwICs9IHNwcmludGYocCwKKwkgICAgICAgICAgICAgIm9zY2lsbGF0b3JcdDogJXNcbiIKKwkgICAgICAgICAgICAgInNxdWFyZV93YXZlXHQ6ICVzXG4iLAorCSAgICAgICAgICAgICAobW9udGggJiBSVENfRU9TQykgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAorCSAgICAgICAgICAgICAobW9udGggJiBSVENfRVNRVykgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKworCWFtb2RlID0gKChydGNfcmVhZChSVENfTUlOVVRFU19BTEFSTSkgJiAweDgwKSA+PiA1KSB8CisJICAgICAgICAoKHJ0Y19yZWFkKFJUQ19IT1VSU19BTEFSTSkgJiAweDgwKSA+PiA2KSB8CisJICAgICAgICAoKHJ0Y19yZWFkKFJUQ19EQVlfQUxBUk0pICYgMHg4MCkgPj4gNyk7CisJaWYgKGFtb2RlID09IDcpICAgICAgcyA9ICJlYWNoIG1pbnV0ZSI7CisJZWxzZSBpZiAoYW1vZGUgPT0gMykgcyA9ICJtaW51dGVzIG1hdGNoIjsKKwllbHNlIGlmIChhbW9kZSA9PSAxKSBzID0gImhvdXJzIGFuZCBtaW51dGVzIG1hdGNoIjsKKwllbHNlIGlmIChhbW9kZSA9PSAwKSBzID0gImRheXMsIGhvdXJzIGFuZCBtaW51dGVzIG1hdGNoIjsKKwllbHNlICAgICAgICAgICAgICAgICBzID0gImludmFsaWQiOworCXAgKz0gc3ByaW50ZihwLCAiYWxhcm1fbW9kZVx0OiAlc1xuIiwgcyk7CisKKwljbWQgPSBydGNfcmVhZChSVENfQ01EKTsKKwlwICs9IHNwcmludGYocCwKKwkgICAgICAgICAgICAgImFsYXJtX2VuYWJsZVx0OiAlc1xuIgorCSAgICAgICAgICAgICAid2RvZ19hbGFybVx0OiAlc1xuIgorCSAgICAgICAgICAgICAiYWxhcm1fbWFza1x0OiAlc1xuIgorCSAgICAgICAgICAgICAid2RvZ19hbGFybV9tYXNrXHQ6ICVzXG4iCisJICAgICAgICAgICAgICJpbnRlcnJ1cHRfbW9kZVx0OiAlc1xuIgorCSAgICAgICAgICAgICAiSU5UQl9tb2RlXHQ6ICVzX2FjdGl2ZVxuIgorCSAgICAgICAgICAgICAiaW50ZXJydXB0X3BpbnNcdDogJXNcbiIsCisJCSAgICAgKGNtZCAmIFJUQ19UREYpID8gInllcyIgOiAibm8iLAorCQkgICAgIChjbWQgJiBSVENfV0FGKSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgICAoY21kICYgUlRDX1RETSkgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAorCQkgICAgIChjbWQgJiBSVENfV0FNKSA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIsCisJCSAgICAgKGNtZCAmIFJUQ19QVV9MVkwpID8gInB1bHNlIiA6ICJsZXZlbCIsCisJCSAgICAgKGNtZCAmIFJUQ19JQkhfTE8pID8gImxvdyIgOiAiaGlnaCIsCisJICAgICAgICAgICAgIChjbWQgJiBSVENfSVBTVykgPyAidW5zd2FwcGVkIiA6ICJzd2FwcGVkIik7CisKKwlyZXR1cm4gIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgZHMxMjg2X3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSBkczEyODZfcHJvY19vdXRwdXQgKHBhZ2UpOworCWlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCWxlbiAtPSBvZmY7CisJaWYgKGxlbj5jb3VudCkKKwkJbGVuID0gY291bnQ7CisJaWYgKGxlbjwwKQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIGNsb2NrIHVwZGF0ZSBpcyBpbiBwcm9ncmVzcworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZHMxMjg2X2lzX3VwZGF0aW5nKHZvaWQpCit7CisJcmV0dXJuIHJ0Y19yZWFkKFJUQ19DTUQpICYgUlRDX1RFOworfQorCisKK3N0YXRpYyB2b2lkIGRzMTI4Nl9nZXRfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKK3sKKwl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB1aXBfd2F0Y2hkb2cgPSBqaWZmaWVzOworCisJLyoKKwkgKiByZWFkIFJUQyBvbmNlIGFueSB1cGRhdGUgaW4gcHJvZ3Jlc3MgaXMgZG9uZS4gVGhlIHVwZGF0ZQorCSAqIGNhbiB0YWtlIGp1c3Qgb3ZlciAybXMuIFdlIHdhaXQgMTAgdG8gMjBtcy4gVGhlcmUgaXMgbm8gbmVlZCB0bworCSAqIHRvIHBvbGwtd2FpdCAodXAgdG8gMXMgLSBlZWNjY2gpIGZvciB0aGUgZmFsbGluZyBlZGdlIG9mIFJUQ19VSVAuCisJICogSWYgeW91IG5lZWQgdG8ga25vdyAqZXhhY3RseSogd2hlbiBhIHNlY29uZCBoYXMgc3RhcnRlZCwgZW5hYmxlCisJICogcGVyaW9kaWMgdXBkYXRlIGNvbXBsZXRlIGludGVycnVwdHMsICh2aWEgaW9jdGwpIGFuZCB0aGVuCisJICogaW1tZWRpYXRlbHkgcmVhZCAvZGV2L3J0YyB3aGljaCB3aWxsIGJsb2NrIHVudGlsIHlvdSBnZXQgdGhlIElSUS4KKwkgKiBPbmNlIHRoZSByZWFkIGNsZWFycywgcmVhZCB0aGUgUlRDIHRpbWUgKGFnYWluIHZpYSBpb2N0bCkuIEVhc3kuCisJICovCisKKwlpZiAoZHMxMjg2X2lzX3VwZGF0aW5nKCkgIT0gMCkKKwkJd2hpbGUgKGppZmZpZXMgLSB1aXBfd2F0Y2hkb2cgPCAyKkhaLzEwMCkKKwkJCWJhcnJpZXIoKTsKKworCS8qCisJICogT25seSB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBmcm9tIHRoZSBSVEMgYXJlIHNldC4gV2UgbGVhdmUKKwkgKiB0bV93ZGF5LCB0bV95ZGF5IGFuZCB0bV9pc2RzdCB1bnRvdWNoZWQuIEV2ZW4gdGhvdWdoIHRoZQorCSAqIFJUQyBoYXMgUlRDX0RBWV9PRl9XRUVLLCB3ZSBpZ25vcmUgaXQsIGFzIGl0IGlzIG9ubHkgdXBkYXRlZAorCSAqIGJ5IHRoZSBSVEMgd2hlbiBpbml0aWFsbHkgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisJc2F2ZV9jb250cm9sID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJcnRjX3dyaXRlKChzYXZlX2NvbnRyb2x8UlRDX1RFKSwgUlRDX0NNRCk7CisKKwlydGNfdG0tPnRtX3NlYyA9IHJ0Y19yZWFkKFJUQ19TRUNPTkRTKTsKKwlydGNfdG0tPnRtX21pbiA9IHJ0Y19yZWFkKFJUQ19NSU5VVEVTKTsKKwlydGNfdG0tPnRtX2hvdXIgPSBydGNfcmVhZChSVENfSE9VUlMpICYgMHgzZjsKKwlydGNfdG0tPnRtX21kYXkgPSBydGNfcmVhZChSVENfREFURSk7CisJcnRjX3RtLT50bV9tb24gPSBydGNfcmVhZChSVENfTU9OVEgpICYgMHgxZjsKKwlydGNfdG0tPnRtX3llYXIgPSBydGNfcmVhZChSVENfWUVBUik7CisKKwlydGNfd3JpdGUoc2F2ZV9jb250cm9sLCBSVENfQ01EKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCisJQkNEX1RPX0JJTihydGNfdG0tPnRtX3NlYyk7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX21pbik7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX2hvdXIpOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9tZGF5KTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbW9uKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1feWVhcik7CisKKwkvKgorCSAqIEFjY291bnQgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gaG93IHRoZSBSVEMgdXNlcyB0aGUgdmFsdWVzCisJICogYW5kIGhvdyB0aGV5IGFyZSBkZWZpbmVkIGluIGEgc3RydWN0IHJ0Y190aW1lOworCSAqLworCWlmIChydGNfdG0tPnRtX3llYXIgPCA0NSkKKwkJcnRjX3RtLT50bV95ZWFyICs9IDMwOworCWlmICgocnRjX3RtLT50bV95ZWFyICs9IDQwKSA8IDcwKQorCQlydGNfdG0tPnRtX3llYXIgKz0gMTAwOworCisJcnRjX3RtLT50bV9tb24tLTsKK30KKworc3RhdGljIGludCBkczEyODZfc2V0X3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdW5zaWduZWQgY2hhciBtb24sIGRheSwgaHJzLCBtaW4sIHNlYywgbGVhcF95cjsKKwl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbDsKKwl1bnNpZ25lZCBpbnQgeXJzLCBmbGFnczsKKworCisJeXJzID0gcnRjX3RtLT50bV95ZWFyICsgMTkwMDsKKwltb24gPSBydGNfdG0tPnRtX21vbiArIDE7ICAgLyogdG1fbW9uIHN0YXJ0cyBhdCB6ZXJvICovCisJZGF5ID0gcnRjX3RtLT50bV9tZGF5OworCWhycyA9IHJ0Y190bS0+dG1faG91cjsKKwltaW4gPSBydGNfdG0tPnRtX21pbjsKKwlzZWMgPSBydGNfdG0tPnRtX3NlYzsKKworCWlmICh5cnMgPCAxOTcwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxlYXBfeXIgPSAoKCEoeXJzICUgNCkgJiYgKHlycyAlIDEwMCkpIHx8ICEoeXJzICUgNDAwKSk7CisKKwlpZiAoKG1vbiA+IDEyKSB8fCAoZGF5ID09IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkYXkgPiAoZGF5c19pbl9tb1ttb25dICsgKChtb24gPT0gMikgJiYgbGVhcF95cikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoaHJzID49IDI0KSB8fCAobWluID49IDYwKSB8fCAoc2VjID49IDYwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHlycyAtPSAxOTQwKSA+IDI1NSkgICAgLyogVGhleSBhcmUgdW5zaWduZWQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoeXJzID49IDEwMCkKKwkJeXJzIC09IDEwMDsKKworCUJJTl9UT19CQ0Qoc2VjKTsKKwlCSU5fVE9fQkNEKG1pbik7CisJQklOX1RPX0JDRChocnMpOworCUJJTl9UT19CQ0QoZGF5KTsKKwlCSU5fVE9fQkNEKG1vbik7CisJQklOX1RPX0JDRCh5cnMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisJc2F2ZV9jb250cm9sID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJcnRjX3dyaXRlKChzYXZlX2NvbnRyb2x8UlRDX1RFKSwgUlRDX0NNRCk7CisKKwlydGNfd3JpdGUoeXJzLCBSVENfWUVBUik7CisJcnRjX3dyaXRlKG1vbiwgUlRDX01PTlRIKTsKKwlydGNfd3JpdGUoZGF5LCBSVENfREFURSk7CisJcnRjX3dyaXRlKGhycywgUlRDX0hPVVJTKTsKKwlydGNfd3JpdGUobWluLCBSVENfTUlOVVRFUyk7CisJcnRjX3dyaXRlKHNlYywgUlRDX1NFQ09ORFMpOworCXJ0Y193cml0ZSgwLCBSVENfSFVORFJFRFRIX1NFQ09ORCk7CisKKwlydGNfd3JpdGUoc2F2ZV9jb250cm9sLCBSVENfQ01EKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkczEyODZfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRzMTI4Nl9nZXRfYWxtX3RpbWUoc3RydWN0IHJ0Y190aW1lICphbG1fdG0pCit7CisJdW5zaWduZWQgY2hhciBjbWQ7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJLyoKKwkgKiBPbmx5IHRoZSB2YWx1ZXMgdGhhdCB3ZSByZWFkIGZyb20gdGhlIFJUQyBhcmUgc2V0LiBUaGF0CisJICogbWVhbnMgb25seSB0bV93ZGF5LCB0bV9ob3VyLCB0bV9taW4uCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzMTI4Nl9sb2NrLCBmbGFncyk7CisJYWxtX3RtLT50bV9taW4gPSBydGNfcmVhZChSVENfTUlOVVRFU19BTEFSTSkgJiAweDdmOworCWFsbV90bS0+dG1faG91ciA9IHJ0Y19yZWFkKFJUQ19IT1VSU19BTEFSTSkgICYgMHgxZjsKKwlhbG1fdG0tPnRtX3dkYXkgPSBydGNfcmVhZChSVENfREFZX0FMQVJNKSAgICAmIDB4MDc7CisJY21kID0gcnRjX3JlYWQoUlRDX0NNRCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHMxMjg2X2xvY2ssIGZsYWdzKTsKKworCUJDRF9UT19CSU4oYWxtX3RtLT50bV9taW4pOworCUJDRF9UT19CSU4oYWxtX3RtLT50bV9ob3VyKTsKKwlhbG1fdG0tPnRtX3NlYyA9IDA7Cit9CisKK21vZHVsZV9pbml0KGRzMTI4Nl9pbml0KTsKK21vZHVsZV9leGl0KGRzMTI4Nl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmFsZiBCYWVjaGxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihSVENfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RzMTMwMi5jIGIvZHJpdmVycy9jaGFyL2RzMTMwMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NWU4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHMxMzAyLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiEKKyohIEZJTEUgTkFNRSAgOiBkczEzMDIuYworKiEKKyohIERFU0NSSVBUSU9OOiBJbXBsZW1lbnRzIGFuIGludGVyZmFjZSBmb3IgdGhlIERTMTMwMiBSVEMKKyohCisqISBGdW5jdGlvbnMgZXhwb3J0ZWQ6IGRzMTMwMl9yZWFkcmVnLCBkczEzMDJfd3JpdGVyZWcsIGRzMTMwMl9pbml0LCBnZXRfcnRjX3N0YXR1cworKiEKKyohIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiEKKyohIChDKSBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAgQXhpcyBDb21tdW5pY2F0aW9ucyBBQiwgTFVORCwgU1dFREVOCisqIQorKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisjaWYgZGVmaW5lZChDT05GSUdfTTMyUikKKyNpbmNsdWRlIDxhc20vbTMyci5oPgorI2VuZGlmCisKKyNkZWZpbmUgUlRDX01BSk9SX05SIDEyMSAvKiBsb2NhbCBtYWpvciwgY2hhbmdlIGxhdGVyICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGRzMTMwMl9uYW1lW10gPSAiZHMxMzAyIjsKKworLyogU2VuZCA4IGJpdHMuICovCitzdGF0aWMgdm9pZAorb3V0X2J5dGVfcnRjKHVuc2lnbmVkIGludCByZWdfYWRkciwgdW5zaWduZWQgY2hhciB4KQoreworCS8vUlNUIEgKKwlvdXR3KDB4MDAwMSwodW5zaWduZWQgbG9uZylQTERfUlRDUlNUT0RUKTsKKwkvL3dyaXRlIGRhdGEKKwlvdXR3KCgoeDw8OCl8KHJlZ19hZGRyJjB4ZmYpKSwodW5zaWduZWQgbG9uZylQTERfUlRDV1JEQVRBKTsKKwkvL1dFCisJb3V0dygweDAwMDIsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ0NSKTsKKwkvL3dhaXQKKwl3aGlsZShpbncoKHVuc2lnbmVkIGxvbmcpUExEX1JUQ0NSKSk7CisKKwkvL1JTVCBMCisJb3V0dygweDAwMDAsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ1JTVE9EVCk7CisKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2luX2J5dGVfcnRjKHVuc2lnbmVkIGludCByZWdfYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIHJldHZhbDsKKworCS8vUlNUIEgKKwlvdXR3KDB4MDAwMSwodW5zaWduZWQgbG9uZylQTERfUlRDUlNUT0RUKTsKKwkvL3dyaXRlIGRhdGEKKwlvdXR3KChyZWdfYWRkciYweGZmKSwodW5zaWduZWQgbG9uZylQTERfUlRDUkREQVRBKTsKKwkvL1JFCisJb3V0dygweDAwMDEsKHVuc2lnbmVkIGxvbmcpUExEX1JUQ0NSKTsKKwkvL3dhaXQKKwl3aGlsZShpbncoKHVuc2lnbmVkIGxvbmcpUExEX1JUQ0NSKSk7CisKKwkvL3JlYWQgZGF0YQorCXJldHZhbD0oaW53KCh1bnNpZ25lZCBsb25nKVBMRF9SVENSRERBVEEpICYgMHhmZjAwKT4+ODsKKworCS8vUlNUIEwKKwlvdXR3KDB4MDAwMCwodW5zaWduZWQgbG9uZylQTERfUlRDUlNUT0RUKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEVuYWJsZSB3cml0aW5nLiAqLworCitzdGF0aWMgdm9pZAorZHMxMzAyX3dlbmFibGUodm9pZCkKK3sKKwlvdXRfYnl0ZV9ydGMoMHg4ZSwweDAwKTsKK30KKworLyogRGlzYWJsZSB3cml0aW5nLiAqLworCitzdGF0aWMgdm9pZAorZHMxMzAyX3dkaXNhYmxlKHZvaWQpCit7CisJb3V0X2J5dGVfcnRjKDB4OGUsMHg4MCk7Cit9CisKKworCisvKiBSZWFkIGEgYnl0ZSBmcm9tIHRoZSBzZWxlY3RlZCByZWdpc3RlciBpbiB0aGUgRFMxMzAyLiAqLworCit1bnNpZ25lZCBjaGFyCitkczEzMDJfcmVhZHJlZyhpbnQgcmVnKQoreworCXVuc2lnbmVkIGNoYXIgeDsKKworCXg9aW5fYnl0ZV9ydGMoKDB4ODEgfCAocmVnIDw8IDEpKSk7IC8qIHJlYWQgcmVnaXN0ZXIgKi8KKworCXJldHVybiB4OworfQorCisvKiBXcml0ZSBhIGJ5dGUgdG8gdGhlIHNlbGVjdGVkIHJlZ2lzdGVyLiAqLworCit2b2lkCitkczEzMDJfd3JpdGVyZWcoaW50IHJlZywgdW5zaWduZWQgY2hhciB2YWwpCit7CisJZHMxMzAyX3dlbmFibGUoKTsKKwlvdXRfYnl0ZV9ydGMoKDB4ODAgfCAocmVnIDw8IDEpKSx2YWwpOworCWRzMTMwMl93ZGlzYWJsZSgpOworfQorCit2b2lkCitnZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJcnRjX3RtLT50bV9zZWMgPSBDTU9TX1JFQUQoUlRDX1NFQ09ORFMpOworCXJ0Y190bS0+dG1fbWluID0gQ01PU19SRUFEKFJUQ19NSU5VVEVTKTsKKwlydGNfdG0tPnRtX2hvdXIgPSBDTU9TX1JFQUQoUlRDX0hPVVJTKTsKKwlydGNfdG0tPnRtX21kYXkgPSBDTU9TX1JFQUQoUlRDX0RBWV9PRl9NT05USCk7CisJcnRjX3RtLT50bV9tb24gPSBDTU9TX1JFQUQoUlRDX01PTlRIKTsKKwlydGNfdG0tPnRtX3llYXIgPSBDTU9TX1JFQUQoUlRDX1lFQVIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJQkNEX1RPX0JJTihydGNfdG0tPnRtX3NlYyk7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX21pbik7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX2hvdXIpOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9tZGF5KTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbW9uKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1feWVhcik7CisKKwkvKgorCSAqIEFjY291bnQgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gaG93IHRoZSBSVEMgdXNlcyB0aGUgdmFsdWVzCisJICogYW5kIGhvdyB0aGV5IGFyZSBkZWZpbmVkIGluIGEgc3RydWN0IHJ0Y190aW1lOworCSAqLworCisJaWYgKHJ0Y190bS0+dG1feWVhciA8PSA2OSkKKwkJcnRjX3RtLT50bV95ZWFyICs9IDEwMDsKKworCXJ0Y190bS0+dG1fbW9uLS07Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRheXNfaW5fbW9bXSA9CisgICAgezAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9OworCisvKiBpb2N0bCB0aGF0IHN1cHBvcnRzIFJUQ19SRF9USU1FIGFuZCBSVENfU0VUX1RJTUUgKHJlYWQgYW5kIHNldCB0aW1lL2RhdGUpLiAqLworCitzdGF0aWMgaW50CitydGNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoKGNtZCkgeworCQljYXNlIFJUQ19SRF9USU1FOgkvKiByZWFkIHRoZSB0aW1lL2RhdGUgZnJvbSBSVEMJKi8KKwkJeworCQkJc3RydWN0IHJ0Y190aW1lIHJ0Y190bTsKKworCQkJbWVtc2V0KCZydGNfdG0sIDAsIHNpemVvZiAoc3RydWN0IHJ0Y190aW1lKSk7CisJCQlnZXRfcnRjX3RpbWUoJnJ0Y190bSk7CisJCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgcnRjX3RpbWUqKWFyZywgJnJ0Y190bSwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFJUQ19TRVRfVElNRToJLyogc2V0IHRoZSBSVEMgKi8KKwkJeworCQkJc3RydWN0IHJ0Y190aW1lIHJ0Y190bTsKKwkJCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWMsIGxlYXBfeXI7CisJCQl1bnNpZ25lZCBpbnQgeXJzOworCisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ0Y190bSwgKHN0cnVjdCBydGNfdGltZSopYXJnLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXlycyA9IHJ0Y190bS50bV95ZWFyICsgMTkwMDsKKwkJCW1vbiA9IHJ0Y190bS50bV9tb24gKyAxOyAgIC8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLworCQkJZGF5ID0gcnRjX3RtLnRtX21kYXk7CisJCQlocnMgPSBydGNfdG0udG1faG91cjsKKwkJCW1pbiA9IHJ0Y190bS50bV9taW47CisJCQlzZWMgPSBydGNfdG0udG1fc2VjOworCisKKwkJCWlmICgoeXJzIDwgMTk3MCkgfHwgKHlycyA+IDIwNjkpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlsZWFwX3lyID0gKCghKHlycyAlIDQpICYmICh5cnMgJSAxMDApKSB8fCAhKHlycyAlIDQwMCkpOworCisJCQlpZiAoKG1vbiA+IDEyKSB8fCAoZGF5ID09IDApKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZiAoZGF5ID4gKGRheXNfaW5fbW9bbW9uXSArICgobW9uID09IDIpICYmIGxlYXBfeXIpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKChocnMgPj0gMjQpIHx8IChtaW4gPj0gNjApIHx8IChzZWMgPj0gNjApKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZiAoeXJzID49IDIwMDApCisJCQkJeXJzIC09IDIwMDA7CS8qIFJUQyAoMCwgMSwgLi4uIDY5KSAqLworCQkJZWxzZQorCQkJCXlycyAtPSAxOTAwOwkvKiBSVEMgKDcwLCA3MSwgLi4uIDk5KSAqLworCisJCQlCSU5fVE9fQkNEKHNlYyk7CisJCQlCSU5fVE9fQkNEKG1pbik7CisJCQlCSU5fVE9fQkNEKGhycyk7CisJCQlCSU5fVE9fQkNEKGRheSk7CisJCQlCSU5fVE9fQkNEKG1vbik7CisJCQlCSU5fVE9fQkNEKHlycyk7CisKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCQlDTU9TX1dSSVRFKHlycywgUlRDX1lFQVIpOworCQkJQ01PU19XUklURShtb24sIFJUQ19NT05USCk7CisJCQlDTU9TX1dSSVRFKGRheSwgUlRDX0RBWV9PRl9NT05USCk7CisJCQlDTU9TX1dSSVRFKGhycywgUlRDX0hPVVJTKTsKKwkJCUNNT1NfV1JJVEUobWluLCBSVENfTUlOVVRFUyk7CisJCQlDTU9TX1dSSVRFKHNlYywgUlRDX1NFQ09ORFMpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCQkvKiBOb3RpY2UgdGhhdCBhdCB0aGlzIHBvaW50LCB0aGUgUlRDIGlzIHVwZGF0ZWQgYnV0CisJCQkgKiB0aGUga2VybmVsIGlzIHN0aWxsIHJ1bm5pbmcgd2l0aCB0aGUgb2xkIHRpbWUuCisJCQkgKiBZb3UgbmVlZCB0byBzZXQgdGhhdCBzZXBhcmF0ZWx5IHdpdGggc2V0dGltZW9mZGF5CisJCQkgKiBvciBhZGp0aW1leC4KKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFJUQ19TRVRfQ0hBUkdFOiAvKiBzZXQgdGhlIFJUQyBUUklDS0xFIENIQVJHRSByZWdpc3RlciAqLworCQl7CisJCQlpbnQgdGNzX3ZhbDsKKworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCisJCQkJcmV0dXJuIC1FUEVSTTsKKworCQkJaWYoY29weV9mcm9tX3VzZXIoJnRjc192YWwsIChpbnQqKWFyZywgc2l6ZW9mKGludCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQl0Y3NfdmFsID0gUlRDX1RDUl9QQVRURVJOIHwgKHRjc192YWwgJiAweDBGKTsKKwkJCWRzMTMwMl93cml0ZXJlZyhSVENfVFJJQ0tMRUNIQVJHRVIsIHRjc192YWwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworaW50CitnZXRfcnRjX3N0YXR1cyhjaGFyICpidWYpCit7CisJY2hhciAqcDsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwlwID0gYnVmOworCisJZ2V0X3J0Y190aW1lKCZ0bSk7CisKKwkvKgorCSAqIFRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIGlmIHRoZSBsdXNlciBoYXMgdGhlIFJUQyBzZXQgZm9yIGxvY2FsCisJICogdGltZSBvciBmb3IgVW5pdmVyc2FsIFN0YW5kYXJkIFRpbWUgKEdNVCkuIFByb2JhYmx5IGxvY2FsIHRob3VnaC4KKwkgKi8KKworCXAgKz0gc3ByaW50ZihwLAorCQkicnRjX3RpbWVcdDogJTAyZDolMDJkOiUwMmRcbiIKKwkJInJ0Y19kYXRlXHQ6ICUwNGQtJTAyZC0lMDJkXG4iLAorCQl0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYywKKwkJdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXkpOworCisJcmV0dXJuICBwIC0gYnVmOworfQorCisKKy8qIFRoZSB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucyB3ZSBzdXBwb3J0LiAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IHJ0Y19pb2N0bCwKK307CisKKy8qIFByb2JlIGZvciB0aGUgY2hpcCBieSB3cml0aW5nIHNvbWV0aGluZyB0byBpdHMgUkFNIGFuZCB0cnkgcmVhZGluZyBpdCBiYWNrLiAqLworCisjZGVmaW5lIE1BR0lDX1BBVFRFUk4gMHg0MgorCitzdGF0aWMgaW50IF9faW5pdAorZHMxMzAyX3Byb2JlKHZvaWQpCit7CisJaW50IHJldHZhbCwgcmVzLCBiYXVyOworCisJYmF1cj0oYm9vdF9jcHVfZGF0YS5idXNfY2xvY2svKDIqMTAwMCoxMDAwKSk7CisKKwlwcmludGsoIiVzOiBTZXQgUExEX1JUQ0JBVVIgPSAlZFxuIiwgZHMxMzAyX25hbWUsYmF1cik7CisKKwlvdXR3KDB4MDAwMCwodW5zaWduZWQgbG9uZylQTERfUlRDQ1IpOworCW91dHcoMHgwMDAwLCh1bnNpZ25lZCBsb25nKVBMRF9SVENSU1RPRFQpOworCW91dHcoYmF1ciwodW5zaWduZWQgbG9uZylQTERfUlRDQkFVUik7CisKKwkvKiBUcnkgdG8gdGFsayB0byB0aW1la2VlcGVyLiAqLworCisJZHMxMzAyX3dlbmFibGUoKTsKKwkvKiB3cml0ZSBSQU0gYnl0ZSAwICovCisJLyogd3JpdGUgc29tZXRoaW5nIG1hZ2ljICovCisJb3V0X2J5dGVfcnRjKDB4YzAsTUFHSUNfUEFUVEVSTik7CisKKwkvKiByZWFkIFJBTSBieXRlIDAgKi8KKwlpZigocmVzID0gaW5fYnl0ZV9ydGMoMHhjMSkpID09IE1BR0lDX1BBVFRFUk4pIHsKKwkJY2hhciBidWZbMTAwXTsKKwkJZHMxMzAyX3dkaXNhYmxlKCk7CisJCXByaW50aygiJXM6IFJUQyBmb3VuZC5cbiIsIGRzMTMwMl9uYW1lKTsKKwkJZ2V0X3J0Y19zdGF0dXMoYnVmKTsKKwkJcHJpbnRrKGJ1Zik7CisJCXJldHZhbCA9IDE7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIlczogUlRDIG5vdCBmb3VuZC5cbiIsIGRzMTMwMl9uYW1lKTsKKwkJcmV0dmFsID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qIEp1c3QgcHJvYmUgZm9yIHRoZSBSVEMgYW5kIHJlZ2lzdGVyIHRoZSBkZXZpY2UgdG8gaGFuZGxlIHRoZSBpb2N0bCBuZWVkZWQuICovCisKK2ludCBfX2luaXQKK2RzMTMwMl9pbml0KHZvaWQpCit7CisJaWYgKCFkczEzMDJfcHJvYmUoKSkgeworCQlyZXR1cm4gLTE7CisgIAl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTMwMl9yZWdpc3Rlcih2b2lkKQoreworCWRzMTMwMl9pbml0KCk7CisJaWYgKHJlZ2lzdGVyX2NocmRldihSVENfTUFKT1JfTlIsIGRzMTMwMl9uYW1lLCAmcnRjX2ZvcHMpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciBydGNcbiIsCisJCSAgICAgICBkczEzMDJfbmFtZSwgUlRDX01BSk9SX05SKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoZHMxMzAyX3JlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kczE2MjAuYyBiL2RyaXZlcnMvY2hhci9kczE2MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGVmNmFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RzMTYyMC5jCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL2RzMTYyMC5jOiBEYWxsYXMgU2VtaWNvbmR1Y3RvcnMgRFMxNjIwCisgKiAgIHRoZXJtb21ldGVyIGRyaXZlciAoYXMgdXNlZCBpbiB0aGUgUmViZWwuY29tIE5ldFdpbmRlcikKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdGhlcm0uaD4KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisvKiBkZWZpbmUgZm9yIC9wcm9jIGludGVyZmFjZSAqLworI2RlZmluZSBUSEVSTV9VU0VfUFJPQworI2VuZGlmCisKKy8qIERlZmluaXRpb25zIGZvciBEUzE2MjAgY2hpcCAqLworI2RlZmluZSBUSEVSTV9TVEFSVF9DT05WRVJUCTB4ZWUKKyNkZWZpbmUgVEhFUk1fUkVTRVQJCTB4YWYKKyNkZWZpbmUgVEhFUk1fUkVBRF9DT05GSUcJMHhhYworI2RlZmluZSBUSEVSTV9SRUFEX1RFTVAJCTB4YWEKKyNkZWZpbmUgVEhFUk1fUkVBRF9UTAkJMHhhMgorI2RlZmluZSBUSEVSTV9SRUFEX1RICQkweGExCisjZGVmaW5lIFRIRVJNX1dSSVRFX0NPTkZJRwkweDBjCisjZGVmaW5lIFRIRVJNX1dSSVRFX1RMCQkweDAyCisjZGVmaW5lIFRIRVJNX1dSSVRFX1RICQkweDAxCisKKyNkZWZpbmUgQ0ZHX0NQVQkJCTIKKyNkZWZpbmUgQ0ZHXzFTSE9UCQkxCisKK3N0YXRpYyBjb25zdCBjaGFyICpmYW5fc3RhdGVbXSA9IHsgIm9mZiIsICJvbiIsICJvbiAoaGFyZHdpcmVkKSIgfTsKKworLyoKKyAqIFN0YXJ0IG9mIE5ldFdpbmRlciBzcGVjaWZpY3MKKyAqICBOb3RlISAgV2UgaGF2ZSB0byBob2xkIHRoZSBncGlvIGxvY2sgd2l0aCBJUlFzIGRpc2FibGVkIG92ZXIgdGhlCisgKiAgd2hvbGUgb2Ygb3VyIHRyYW5zYWN0aW9uIHRvIHRoZSBEYWxsYXMgY2hpcCwgc2luY2UgdGhlcmUgaXMgYQorICogIGNoYW5jZSB0aGF0IHRoZSBXYXZlQXJ0aXN0IGRyaXZlciBjb3VsZCB0b3VjaCB0aGVzZSBiaXRzIHRvCisgKiAgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwZWFrZXIuCisgKi8KK2V4dGVybiBzcGlubG9ja190IGdwaW9fbG9jazsKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3lzdGVtX3JldjsKKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9kczE2MjBfc2V0X2NsayhpbnQgY2xrKQoreworCWdwaW9fbW9kaWZ5X29wKEdQSU9fRFNDTEssIGNsayA/IEdQSU9fRFNDTEsgOiAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGEoaW50IGRhdCkKK3sKKwlncGlvX21vZGlmeV9vcChHUElPX0RBVEEsIGRhdCA/IEdQSU9fREFUQSA6IDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXR3aW5kZXJfZHMxNjIwX2dldF9kYXRhKHZvaWQpCit7CisJcmV0dXJuIGdwaW9fcmVhZCgpICYgR1BJT19EQVRBOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0d2luZGVyX2RzMTYyMF9zZXRfZGF0YV9kaXIoaW50IGRpcikKK3sKKwlncGlvX21vZGlmeV9pbyhHUElPX0RBVEEsIGRpciA/IEdQSU9fREFUQSA6IDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0d2luZGVyX2RzMTYyMF9yZXNldCh2b2lkKQoreworCWNwbGRfbW9kaWZ5KENQTERfRFNfRU5BQkxFLCAwKTsKKwljcGxkX21vZGlmeShDUExEX0RTX0VOQUJMRSwgQ1BMRF9EU19FTkFCTEUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0d2luZGVyX2xvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgKmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCAqZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0d2luZGVyX3NldF9mYW4oaW50IGkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwlncGlvX21vZGlmeV9vcChHUElPX0ZBTiwgaSA/IEdQSU9fRkFOIDogMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5ldHdpbmRlcl9nZXRfZmFuKHZvaWQpCit7CisJaWYgKChzeXN0ZW1fcmV2ICYgMHhmMDAwKSA9PSAweDQwMDApCisJCXJldHVybiBGQU5fQUxXQVlTX09OOworCisJcmV0dXJuIChncGlvX3JlYWQoKSAmIEdQSU9fRkFOKSA/IEZBTl9PTiA6IEZBTl9PRkY7Cit9CisKKy8qCisgKiBFbmQgb2YgTmV0V2luZGVyIHNwZWNpZmljcworICovCisKK3N0YXRpYyB2b2lkIGRzMTYyMF9zZW5kX2JpdHMoaW50IG5yLCBpbnQgdmFsdWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQluZXR3aW5kZXJfZHMxNjIwX3NldF9kYXRhKHZhbHVlICYgMSk7CisJCW5ldHdpbmRlcl9kczE2MjBfc2V0X2NsaygwKTsKKwkJdWRlbGF5KDEpOworCQluZXR3aW5kZXJfZHMxNjIwX3NldF9jbGsoMSk7CisJCXVkZWxheSgxKTsKKworCQl2YWx1ZSA+Pj0gMTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHMxNjIwX3JlY3ZfYml0cyhpbnQgbnIpCit7CisJdW5zaWduZWQgaW50IHZhbHVlID0gMCwgbWFzayA9IDE7CisJaW50IGk7CisKKwluZXR3aW5kZXJfZHMxNjIwX3NldF9kYXRhKDApOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJbmV0d2luZGVyX2RzMTYyMF9zZXRfY2xrKDApOworCQl1ZGVsYXkoMSk7CisKKwkJaWYgKG5ldHdpbmRlcl9kczE2MjBfZ2V0X2RhdGEoKSkKKwkJCXZhbHVlIHw9IG1hc2s7CisKKwkJbWFzayA8PD0gMTsKKworCQluZXR3aW5kZXJfZHMxNjIwX3NldF9jbGsoMSk7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGRzMTYyMF9vdXQoaW50IGNtZCwgaW50IGJpdHMsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0d2luZGVyX2xvY2soJmZsYWdzKTsKKwluZXR3aW5kZXJfZHMxNjIwX3NldF9jbGsoMSk7CisJbmV0d2luZGVyX2RzMTYyMF9zZXRfZGF0YV9kaXIoMCk7CisJbmV0d2luZGVyX2RzMTYyMF9yZXNldCgpOworCisJdWRlbGF5KDEpOworCisJZHMxNjIwX3NlbmRfYml0cyg4LCBjbWQpOworCWlmIChiaXRzKQorCQlkczE2MjBfc2VuZF9iaXRzKGJpdHMsIHZhbHVlKTsKKworCXVkZWxheSgxKTsKKworCW5ldHdpbmRlcl9kczE2MjBfcmVzZXQoKTsKKwluZXR3aW5kZXJfdW5sb2NrKCZmbGFncyk7CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoMik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHMxNjIwX2luKGludCBjbWQsIGludCBiaXRzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHZhbHVlOworCisJbmV0d2luZGVyX2xvY2soJmZsYWdzKTsKKwluZXR3aW5kZXJfZHMxNjIwX3NldF9jbGsoMSk7CisJbmV0d2luZGVyX2RzMTYyMF9zZXRfZGF0YV9kaXIoMCk7CisJbmV0d2luZGVyX2RzMTYyMF9yZXNldCgpOworCisJdWRlbGF5KDEpOworCisJZHMxNjIwX3NlbmRfYml0cyg4LCBjbWQpOworCisJbmV0d2luZGVyX2RzMTYyMF9zZXRfZGF0YV9kaXIoMSk7CisJdmFsdWUgPSBkczE2MjBfcmVjdl9iaXRzKGJpdHMpOworCisJbmV0d2luZGVyX2RzMTYyMF9yZXNldCgpOworCW5ldHdpbmRlcl91bmxvY2soJmZsYWdzKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBjdnRfOV90b19pbnQodW5zaWduZWQgaW50IHZhbCkKK3sKKwlpZiAodmFsICYgMHgxMDApCisJCXZhbCB8PSAweGZmZmZmZTAwOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgZHMxNjIwX3dyaXRlX3N0YXRlKHN0cnVjdCB0aGVybSAqdGhlcm0pCit7CisJZHMxNjIwX291dChUSEVSTV9XUklURV9DT05GSUcsIDgsIENGR19DUFUpOworCWRzMTYyMF9vdXQoVEhFUk1fV1JJVEVfVEwsIDksIHRoZXJtLT5sbyk7CisJZHMxNjIwX291dChUSEVSTV9XUklURV9USCwgOSwgdGhlcm0tPmhpKTsKKwlkczE2MjBfb3V0KFRIRVJNX1NUQVJUX0NPTlZFUlQsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBkczE2MjBfcmVhZF9zdGF0ZShzdHJ1Y3QgdGhlcm0gKnRoZXJtKQoreworCXRoZXJtLT5sbyA9IGN2dF85X3RvX2ludChkczE2MjBfaW4oVEhFUk1fUkVBRF9UTCwgOSkpOworCXRoZXJtLT5oaSA9IGN2dF85X3RvX2ludChkczE2MjBfaW4oVEhFUk1fUkVBRF9USCwgOSkpOworfQorCitzdGF0aWMgc3NpemVfdAorZHMxNjIwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwdHIpCit7CisJc2lnbmVkIGludCBjdXJfdGVtcDsKKwlzaWduZWQgY2hhciBjdXJfdGVtcF9kZWdGOworCisJY3VyX3RlbXAgPSBjdnRfOV90b19pbnQoZHMxNjIwX2luKFRIRVJNX1JFQURfVEVNUCwgOSkpID4+IDE7CisKKwkvKiBjb252ZXJ0IHRvIEZhaHJlbmhlaXQsIGFzIHBlciB3ZHQuYyAqLworCWN1cl90ZW1wX2RlZ0YgPSAoY3VyX3RlbXAgKiA5KSAvIDUgKyAzMjsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmY3VyX3RlbXBfZGVnRiwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2RzMTYyMF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHRoZXJtIHRoZXJtOworCXVuaW9uIHsKKwkJc3RydWN0IHRoZXJtIF9fdXNlciAqdGhlcm07CisJCWludCBfX3VzZXIgKmk7CisJfSB1YXJnOworCWludCBpOworCisJdWFyZy5pID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBDTURfU0VUX1RIRVJNT1NUQVRFOgorCWNhc2UgQ01EX1NFVF9USEVSTU9TVEFURTI6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNtZCA9PSBDTURfU0VUX1RIRVJNT1NUQVRFKSB7CisJCQlpZiAoZ2V0X3VzZXIodGhlcm0uaGksIHVhcmcuaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl0aGVybS5sbyA9IHRoZXJtLmhpIC0gMzsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdGhlcm0sIHVhcmcudGhlcm0sIHNpemVvZih0aGVybSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJdGhlcm0ubG8gPDw9IDE7CisJCXRoZXJtLmhpIDw8PSAxOworCisJCWRzMTYyMF93cml0ZV9zdGF0ZSgmdGhlcm0pOworCQlicmVhazsKKworCWNhc2UgQ01EX0dFVF9USEVSTU9TVEFURToKKwljYXNlIENNRF9HRVRfVEhFUk1PU1RBVEUyOgorCQlkczE2MjBfcmVhZF9zdGF0ZSgmdGhlcm0pOworCisJCXRoZXJtLmxvID4+PSAxOworCQl0aGVybS5oaSA+Pj0gMTsKKworCQlpZiAoY21kID09IENNRF9HRVRfVEhFUk1PU1RBVEUpIHsKKwkJCWlmIChwdXRfdXNlcih0aGVybS5oaSwgdWFyZy5pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIodWFyZy50aGVybSwgJnRoZXJtLCBzaXplb2YodGhlcm0pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ01EX0dFVF9URU1QRVJBVFVSRToKKwljYXNlIENNRF9HRVRfVEVNUEVSQVRVUkUyOgorCQlpID0gY3Z0XzlfdG9faW50KGRzMTYyMF9pbihUSEVSTV9SRUFEX1RFTVAsIDkpKTsKKworCQlpZiAoY21kID09IENNRF9HRVRfVEVNUEVSQVRVUkUpCisJCQlpID4+PSAxOworCisJCXJldHVybiBwdXRfdXNlcihpLCB1YXJnLmkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIENNRF9HRVRfU1RBVFVTOgorCQlpID0gZHMxNjIwX2luKFRIRVJNX1JFQURfQ09ORklHLCA4KSAmIDB4ZTM7CisKKwkJcmV0dXJuIHB1dF91c2VyKGksIHVhcmcuaSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgQ01EX0dFVF9GQU46CisJCWkgPSBuZXR3aW5kZXJfZ2V0X2ZhbigpOworCisJCXJldHVybiBwdXRfdXNlcihpLCB1YXJnLmkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIENNRF9TRVRfRkFOOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChnZXRfdXNlcihpLCB1YXJnLmkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJbmV0d2luZGVyX3NldF9mYW4oaSk7CisJCWJyZWFrOworCQkKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgVEhFUk1fVVNFX1BST0MKK3N0YXRpYyBpbnQKK3Byb2NfdGhlcm1fZHMxNjIwX3JlYWQoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJICAgICAgIGludCBsZW4sIGludCAqZW9mLCB2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IHRoZXJtIHRoOworCWludCB0ZW1wOworCisJZHMxNjIwX3JlYWRfc3RhdGUoJnRoKTsKKwl0ZW1wID0gIGN2dF85X3RvX2ludChkczE2MjBfaW4oVEhFUk1fUkVBRF9URU1QLCA5KSk7CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIlRoZXJtb3N0YXQ6IEhJICVpLiVpLCBMT1cgJWkuJWk7ICIKKwkJICAgICAgInRlbXBlcmF0dXJlOiAlaS4laSBDLCBmYW4gJXNcbiIsCisJCSAgICAgIHRoLmhpID4+IDEsIHRoLmhpICYgMSA/IDUgOiAwLAorCQkgICAgICB0aC5sbyA+PiAxLCB0aC5sbyAmIDEgPyA1IDogMCwKKwkJICAgICAgdGVtcCAgPj4gMSwgdGVtcCAgJiAxID8gNSA6IDAsCisJCSAgICAgIGZhbl9zdGF0ZVtuZXR3aW5kZXJfZ2V0X2ZhbigpXSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3RoZXJtX2RzMTYyMDsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkczE2MjBfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gbm9uc2Vla2FibGVfb3BlbiwKKwkucmVhZAkJPSBkczE2MjBfcmVhZCwKKwkuaW9jdGwJCT0gZHMxNjIwX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGRzMTYyMF9taXNjZGV2ID0geworCVRFTVBfTUlOT1IsCisJInRlbXAiLAorCSZkczE2MjBfZm9wcworfTsKKworc3RhdGljIGludCBfX2luaXQgZHMxNjIwX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB0aGVybSB0aCwgdGhfc3RhcnQ7CisKKwlpZiAoIW1hY2hpbmVfaXNfbmV0d2luZGVyKCkpCisJCXJldHVybiAtRU5PREVWOworCisJZHMxNjIwX291dChUSEVSTV9SRVNFVCwgMCwgMCk7CisJZHMxNjIwX291dChUSEVSTV9XUklURV9DT05GSUcsIDgsIENGR19DUFUpOworCWRzMTYyMF9vdXQoVEhFUk1fU1RBUlRfQ09OVkVSVCwgMCwgMCk7CisKKwkvKgorCSAqIFRyaWdnZXIgdGhlIGZhbiB0byBzdGFydCBieSBzZXR0aW5nCisJICogdGVtcGVyYXR1cmUgaGlnaCBwb2ludCBsb3cuICBUaGlzIGtpY2tzCisJICogdGhlIGZhbiBpbnRvIGFjdGlvbi4KKwkgKi8KKwlkczE2MjBfcmVhZF9zdGF0ZSgmdGgpOworCXRoX3N0YXJ0LmxvID0gMDsKKwl0aF9zdGFydC5oaSA9IDE7CisJZHMxNjIwX3dyaXRlX3N0YXRlKCZ0aF9zdGFydCk7CisKKwltc2xlZXAoMjAwMCk7CisKKwlkczE2MjBfd3JpdGVfc3RhdGUoJnRoKTsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmRzMTYyMF9taXNjZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworI2lmZGVmIFRIRVJNX1VTRV9QUk9DCisJcHJvY190aGVybV9kczE2MjAgPSBjcmVhdGVfcHJvY19lbnRyeSgidGhlcm0iLCAwLCBOVUxMKTsKKwlpZiAocHJvY190aGVybV9kczE2MjApCisJCXByb2NfdGhlcm1fZHMxNjIwLT5yZWFkX3Byb2MgPSBwcm9jX3RoZXJtX2RzMTYyMF9yZWFkOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJ0aGVybTogdW5hYmxlIHRvIHJlZ2lzdGVyIC9wcm9jL3RoZXJtXG4iKTsKKyNlbmRpZgorCisJZHMxNjIwX3JlYWRfc3RhdGUoJnRoKTsKKwlyZXQgPSBjdnRfOV90b19pbnQoZHMxNjIwX2luKFRIRVJNX1JFQURfVEVNUCwgOSkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVGhlcm1vc3RhdDogaGlnaCAlaS4laSwgbG93ICVpLiVpLCAiCisJICAgICAgICJjdXJyZW50ICVpLiVpIEMsIGZhbiAlcy5cbiIsCisJICAgICAgIHRoLmhpID4+IDEsIHRoLmhpICYgMSA/IDUgOiAwLAorCSAgICAgICB0aC5sbyA+PiAxLCB0aC5sbyAmIDEgPyA1IDogMCwKKwkgICAgICAgcmV0ICAgPj4gMSwgcmV0ICAgJiAxID8gNSA6IDAsCisJICAgICAgIGZhbl9zdGF0ZVtuZXR3aW5kZXJfZ2V0X2ZhbigpXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRzMTYyMF9leGl0KHZvaWQpCit7CisjaWZkZWYgVEhFUk1fVVNFX1BST0MKKwlyZW1vdmVfcHJvY19lbnRyeSgidGhlcm0iLCBOVUxMKTsKKyNlbmRpZgorCW1pc2NfZGVyZWdpc3RlcigmZHMxNjIwX21pc2NkZXYpOworfQorCittb2R1bGVfaW5pdChkczE2MjBfaW5pdCk7Cittb2R1bGVfZXhpdChkczE2MjBfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kc3A1NmsuYyBiL2RyaXZlcnMvY2hhci9kc3A1NmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q2NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RzcDU2ay5jCkBAIC0wLDAgKzEsNTQ3IEBACisvKgorICogVGhlIERTUDU2MDAxIERldmljZSBEcml2ZXIsIHNhdmlvdXIgb2YgdGhlIEZyZWUgV29ybGQodG0pCisgKgorICogQXV0aG9yczogRnJlZHJpayBOb3JpbmcgICA8bm9yaW5nQG5vY3Jldy5vcmc+CisgKiAgICAgICAgICBsYXJzIGJyaW5raG9mZiAgIDxsYXJzQG5vY3Jldy5vcmc+CisgKiAgICAgICAgICBUb21hcyBCZXJuZHRzc29uIDx0b21hc0Bub2NyZXcub3JnPgorICoKKyAqIEZpcnN0IHZlcnNpb24gTWF5IDE5OTYKKyAqCisgKiBIaXN0b3J5OgorICogIDk3LTAxLTI5ICAgVG9tYXMgQmVybmR0c3NvbiwKKyAqICAgICAgICAgICAgICAgSW50ZWdyYXRlZCB3aXRoIExpbnV4IDIuMS4yMSBrZXJuZWwgc291cmNlcy4KKyAqICA5Ny0wMi0xNSAgIFRvbWFzIEJlcm5kdHNzb24sCisgKiAgICAgICAgICAgICAgIEZpeGVkIGZvciBrZXJuZWwgMi4xLjI2CisgKgorICogQlVHUzoKKyAqICBIbW0uLi4gdGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgaGVyZSA6KQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwxOTk3IEZyZWRyaWsgTm9yaW5nLCBsYXJzIGJyaW5raG9mZiAmIFRvbWFzIEJlcm5kdHNzb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyogZm9yIGttYWxsb2MoKSBhbmQga2ZyZWUoKSAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGZvciBzdHJ1Y3Qgd2FpdF9xdWV1ZSBldGMgKi8KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBndWVzcyB3aGF0ICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBGb3IgcHV0X3VzZXIgYW5kIGdldF91c2VyICovCisKKyNpbmNsdWRlIDxhc20vZHNwNTZrLmg+CisKKy8qIG1pbm9yIGRldmljZXMgKi8KKyNkZWZpbmUgRFNQNTZLX0RFVl81NjAwMSAgICAgICAgMCAgICAvKiBUaGUgb25seSBkZXZpY2Ugc28gZmFyICovCisKKyNkZWZpbmUgVElNRU9VVCAgICAxMCAgIC8qIEhvc3QgcG9ydCB0aW1lb3V0IGluIG51bWJlciBvZiB0cmllcyAqLworI2RlZmluZSBNQVhJTyAgICAyMDQ4ICAgLyogTWF4aW11bSBudW1iZXIgb2Ygd29yZHMgYmVmb3JlIHNsZWVwICovCisjZGVmaW5lIERTUDU2S19NQVhfQklOQVJZX0xFTkdUSCAoMyo2NCoxMDI0KQorCisjZGVmaW5lIERTUDU2S19UWF9JTlRfT04JZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciB8PSAgRFNQNTZLX0lDUl9UUkVRCisjZGVmaW5lIERTUDU2S19SWF9JTlRfT04JZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciB8PSAgRFNQNTZLX0lDUl9SUkVRCisjZGVmaW5lIERTUDU2S19UWF9JTlRfT0ZGCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgJj0gfkRTUDU2S19JQ1JfVFJFUQorI2RlZmluZSBEU1A1NktfUlhfSU5UX09GRglkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaWNyICY9IH5EU1A1NktfSUNSX1JSRVEKKworI2RlZmluZSBEU1A1NktfVFJBTlNNSVQJCShkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaXNyICYgRFNQNTZLX0lTUl9UWERFKQorI2RlZmluZSBEU1A1NktfUkVDRUlWRQkJKGRzcDU2a19ob3N0X2ludGVyZmFjZS5pc3IgJiBEU1A1NktfSVNSX1JYREYpCisKKyNkZWZpbmUgaGFuZHNoYWtlKGNvdW50LCBtYXhpbywgdGltZW91dCwgRU5BQkxFLCBmKSBcCit7IFwKKwlsb25nIGksIHQsIG07IFwKKwl3aGlsZSAoY291bnQgPiAwKSB7IFwKKwkJbSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50LCBtYXhpbyk7IFwKKwkJZm9yIChpID0gMDsgaSA8IG07IGkrKykgeyBcCisJCQlmb3IgKHQgPSAwOyB0IDwgdGltZW91dCAmJiAhRU5BQkxFOyB0KyspIFwKKwkJCQltc2xlZXAoMjApOyBcCisJCQlpZighRU5BQkxFKSBcCisJCQkJcmV0dXJuIC1FSU87IFwKKwkJCWY7IFwKKwkJfSBcCisJCWNvdW50IC09IG07IFwKKwkJaWYgKG0gPT0gbWF4aW8pIG1zbGVlcCgyMCk7IFwKKwl9IFwKK30KKworI2RlZmluZSB0eF93YWl0KG4pIFwKK3sgXAorCWludCB0OyBcCisJZm9yKHQgPSAwOyB0IDwgbiAmJiAhRFNQNTZLX1RSQU5TTUlUOyB0KyspIFwKKwkJbXNsZWVwKDEwKTsgXAorCWlmKCFEU1A1NktfVFJBTlNNSVQpIHsgXAorCQlyZXR1cm4gLUVJTzsgXAorCX0gXAorfQorCisjZGVmaW5lIHJ4X3dhaXQobikgXAoreyBcCisJaW50IHQ7IFwKKwlmb3IodCA9IDA7IHQgPCBuICYmICFEU1A1NktfUkVDRUlWRTsgdCsrKSBcCisJCW1zbGVlcCgxMCk7IFwKKwlpZighRFNQNTZLX1JFQ0VJVkUpIHsgXAorCQlyZXR1cm4gLUVJTzsgXAorCX0gXAorfQorCisvKiBEU1A1NjAwMSBib290c3RyYXAgY29kZSAqLworc3RhdGljIGNoYXIgYm9vdHN0cmFwW10gPSB7CisJMHgwYywgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDYwLCAweGY0LCAweDAwLCAweDAwLCAweDAwLCAweDRmLCAweDYxLCAweGY0LAorCTB4MDAsIDB4MDAsIDB4N2UsIDB4YTksIDB4MDYsIDB4MmUsIDB4ODAsIDB4MDAsIDB4MDAsIDB4NDcsCisJMHgwNywgMHhkOCwgMHg4NCwgMHgwNywgMHg1OSwgMHg4NCwgMHgwOCwgMHhmNCwgMHhhOCwgMHgwMCwKKwkweDAwLCAweDA0LCAweDA4LCAweGY0LCAweGJmLCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweGZlLAorCTB4YjgsIDB4MGEsIDB4ZjAsIDB4ODAsIDB4MDAsIDB4N2UsIDB4YTksIDB4MDgsIDB4ZjQsIDB4YTAsCisJMHgwMCwgMHgwMCwgMHgwMSwgMHgwOCwgMHhmNCwgMHhiZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwKKwkweGE5LCAweDgwLCAweDAwLCAweDdlLCAweGFkLCAweDA4LCAweDRlLCAweDJiLCAweDQ0LCAweGY0LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NDQsIDB4ZjQsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDEsCisJMHgwZSwgMHhhMCwgMHgwMCwgMHgwYSwgMHhhOSwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhiNSwgMHgwOCwKKwkweDUwLCAweDJiLCAweDBhLCAweGE5LCAweDgwLCAweDAwLCAweDdlLCAweGI4LCAweDA4LCAweDQ2LAorCTB4MmIsIDB4NDQsIDB4ZjQsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MGEsIDB4ZjAsIDB4YWEsCisJMHgwMCwgMHg3ZSwgMHhjOSwgMHgyMCwgMHgwMCwgMHg0NSwgMHgwYSwgMHhmMCwgMHhhYSwgMHgwMCwKKwkweDdlLCAweGQwLCAweDA2LCAweGM2LCAweDAwLCAweDAwLCAweDdlLCAweGM2LCAweDBhLCAweGE5LAorCTB4ODAsIDB4MDAsIDB4N2UsIDB4YzQsIDB4MDgsIDB4NTgsIDB4NmIsIDB4MGEsIDB4ZjAsIDB4ODAsCisJMHgwMCwgMHg3ZSwgMHhhZCwgMHgwNiwgMHhjNiwgMHgwMCwgMHgwMCwgMHg3ZSwgMHhjZCwgMHgwYSwKKwkweGE5LCAweDgwLCAweDAwLCAweDdlLCAweGNiLCAweDA4LCAweDU4LCAweGFiLCAweDBhLCAweGYwLAorCTB4ODAsIDB4MDAsIDB4N2UsIDB4YWQsIDB4MDYsIDB4YzYsIDB4MDAsIDB4MDAsIDB4N2UsIDB4ZDQsCisJMHgwYSwgMHhhOSwgMHg4MCwgMHgwMCwgMHg3ZSwgMHhkMiwgMHgwOCwgMHg1OCwgMHhlYiwgMHgwYSwKKwkweGYwLCAweDgwLCAweDAwLCAweDdlLCAweGFkfTsKK3N0YXRpYyBpbnQgc2l6ZW9mX2Jvb3RzdHJhcCA9IDM3NTsKKworCitzdGF0aWMgc3RydWN0IGRzcDU2a19kZXZpY2UgeworCWxvbmcgaW5fdXNlOworCWxvbmcgbWF4aW8sIHRpbWVvdXQ7CisJaW50IHR4X3dzaXplLCByeF93c2l6ZTsKK30gZHNwNTZrOworCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqZHNwNTZrX2NsYXNzOworCitzdGF0aWMgaW50IGRzcDU2a19yZXNldCh2b2lkKQoreworCXVfY2hhciBzdGF0dXM7CisJCisJLyogUG93ZXIgZG93biB0aGUgRFNQICovCisJc291bmRfeW0ucmRfZGF0YV9yZWdfc2VsID0gMTQ7CisJc3RhdHVzID0gc291bmRfeW0ucmRfZGF0YV9yZWdfc2VsICYgMHhlZjsKKwlzb3VuZF95bS53ZF9kYXRhID0gc3RhdHVzOworCXNvdW5kX3ltLndkX2RhdGEgPSBzdGF0dXMgfCAweDEwOworICAKKwl1ZGVsYXkoMTApOworICAKKwkvKiBQb3dlciB1cCB0aGUgRFNQICovCisJc291bmRfeW0ucmRfZGF0YV9yZWdfc2VsID0gMTQ7CisJc291bmRfeW0ud2RfZGF0YSA9IHNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCAmIDB4ZWY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc3A1NmtfdXBsb2FkKHVfY2hhciAqYmluLCBpbnQgbGVuKQoreworCWludCBpOworCXVfY2hhciAqcDsKKwkKKwlkc3A1NmtfcmVzZXQoKTsKKyAgCisJcCA9IGJvb3RzdHJhcDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mX2Jvb3RzdHJhcC8zOyBpKyspIHsKKwkJLyogdHhfd2FpdCgxMCk7ICovCisJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbMV0gPSAqcCsrOworCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzJdID0gKnArKzsKKwkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlszXSA9ICpwKys7CisJfQorCWZvciAoOyBpIDwgNTEyOyBpKyspIHsKKwkJLyogdHhfd2FpdCgxMCk7ICovCisJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbMV0gPSAwOworCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzJdID0gMDsKKwkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlszXSA9IDA7CisJfQorICAKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdHhfd2FpdCgxMCk7CisJCWdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbMV0sIGJpbisrKTsKKwkJZ2V0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsyXSwgYmluKyspOworCQlnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzNdLCBiaW4rKyk7CisJfQorCisJdHhfd2FpdCgxMCk7CisJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEubCA9IDM7ICAgIC8qIE1hZ2ljIGV4ZWN1dGUgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBkc3A1NmtfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpICYgMHgwZjsKKworCXN3aXRjaChkZXYpCisJeworCWNhc2UgRFNQNTZLX0RFVl81NjAwMToKKwl7CisKKwkJbG9uZyBuOworCisJCS8qIERvbid0IGRvIGFueXRoaW5nIGlmIG5vdGhpbmcgaXMgdG8gYmUgZG9uZSAqLworCQlpZiAoIWNvdW50KSByZXR1cm4gMDsKKworCQluID0gMDsKKwkJc3dpdGNoIChkc3A1Nmsucnhfd3NpemUpIHsKKwkJY2FzZSAxOiAgLyogOCBiaXQgKi8KKwkJeworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfUkVDRUlWRSwKKwkJCQkgIHB1dF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbM10sIGJ1ZituKyspKTsKKwkJCXJldHVybiBuOworCQl9CisJCWNhc2UgMjogIC8qIDE2IGJpdCAqLworCQl7CisJCQlzaG9ydCAqZGF0YTsKKworCQkJY291bnQgLz0gMjsKKwkJCWRhdGEgPSAoc2hvcnQqKSBidWY7CisJCQloYW5kc2hha2UoY291bnQsIGRzcDU2ay5tYXhpbywgZHNwNTZrLnRpbWVvdXQsIERTUDU2S19SRUNFSVZFLAorCQkJCSAgcHV0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEud1sxXSwgZGF0YStuKyspKTsKKwkJCXJldHVybiAyKm47CisJCX0KKwkJY2FzZSAzOiAgLyogMjQgYml0ICovCisJCXsKKwkJCWNvdW50IC89IDM7CisJCQloYW5kc2hha2UoY291bnQsIGRzcDU2ay5tYXhpbywgZHNwNTZrLnRpbWVvdXQsIERTUDU2S19SRUNFSVZFLAorCQkJCSAgcHV0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlsxXSwgYnVmK24rKyk7CisJCQkJICBwdXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzJdLCBidWYrbisrKTsKKwkJCQkgIHB1dF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbM10sIGJ1ZituKyspKTsKKwkJCXJldHVybiAzKm47CisJCX0KKwkJY2FzZSA0OiAgLyogMzIgYml0ICovCisJCXsKKwkJCWxvbmcgKmRhdGE7CisKKwkJCWNvdW50IC89IDQ7CisJCQlkYXRhID0gKGxvbmcqKSBidWY7CisJCQloYW5kc2hha2UoY291bnQsIGRzcDU2ay5tYXhpbywgZHNwNTZrLnRpbWVvdXQsIERTUDU2S19SRUNFSVZFLAorCQkJCSAgcHV0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEubCwgZGF0YStuKyspKTsKKwkJCXJldHVybiA0Km47CisJCX0KKwkJfQorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkRTUDU2ayBkcml2ZXI6IFVua25vd24gbWlub3IgZGV2aWNlOiAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRzcDU2a193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisKKwlzd2l0Y2goZGV2KQorCXsKKwljYXNlIERTUDU2S19ERVZfNTYwMDE6CisJeworCQlsb25nIG47CisKKwkJLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgbm90aGluZyBpcyB0byBiZSBkb25lICovCisJCWlmICghY291bnQpIHJldHVybiAwOworCisJCW4gPSAwOworCQlzd2l0Y2ggKGRzcDU2ay50eF93c2l6ZSkgeworCQljYXNlIDE6ICAvKiA4IGJpdCAqLworCQl7CisJCQloYW5kc2hha2UoY291bnQsIGRzcDU2ay5tYXhpbywgZHNwNTZrLnRpbWVvdXQsIERTUDU2S19UUkFOU01JVCwKKwkJCQkgIGdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbM10sIGJ1ZituKyspKTsKKwkJCXJldHVybiBuOworCQl9CisJCWNhc2UgMjogIC8qIDE2IGJpdCAqLworCQl7CisJCQljb25zdCBzaG9ydCAqZGF0YTsKKworCQkJY291bnQgLz0gMjsKKwkJCWRhdGEgPSAoY29uc3Qgc2hvcnQgKilidWY7CisJCQloYW5kc2hha2UoY291bnQsIGRzcDU2ay5tYXhpbywgZHNwNTZrLnRpbWVvdXQsIERTUDU2S19UUkFOU01JVCwKKwkJCQkgIGdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLndbMV0sIGRhdGErbisrKSk7CisJCQlyZXR1cm4gMipuOworCQl9CisJCWNhc2UgMzogIC8qIDI0IGJpdCAqLworCQl7CisJCQljb3VudCAvPSAzOworCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfVFJBTlNNSVQsCisJCQkJICBnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS5iWzFdLCBidWYrbisrKTsKKwkJCQkgIGdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmJbMl0sIGJ1ZituKyspOworCQkJCSAgZ2V0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEuYlszXSwgYnVmK24rKykpOworCQkJcmV0dXJuIDMqbjsKKwkJfQorCQljYXNlIDQ6ICAvKiAzMiBiaXQgKi8KKwkJeworCQkJY29uc3QgbG9uZyAqZGF0YTsKKworCQkJY291bnQgLz0gNDsKKwkJCWRhdGEgPSAoY29uc3QgbG9uZyAqKWJ1ZjsKKwkJCWhhbmRzaGFrZShjb3VudCwgZHNwNTZrLm1heGlvLCBkc3A1NmsudGltZW91dCwgRFNQNTZLX1RSQU5TTUlULAorCQkJCSAgZ2V0X3VzZXIoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmRhdGEubCwgZGF0YStuKyspKTsKKwkJCXJldHVybiA0Km47CisJCX0KKwkJfQorCisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkRTUDU2ayBkcml2ZXI6IFVua25vd24gbWlub3IgZGV2aWNlOiAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHNwNTZrX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCisJc3dpdGNoKGRldikKKwl7CisJY2FzZSBEU1A1NktfREVWXzU2MDAxOgorCisJCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBEU1A1NktfVVBMT0FEOgorCQl7CisJCQljaGFyICpiaW47CisJCQlpbnQgciwgbGVuOworCQkJc3RydWN0IGRzcDU2a191cGxvYWQgKmJpbmFyeSA9IChzdHJ1Y3QgZHNwNTZrX3VwbG9hZCAqKSBhcmc7CisgICAgCisJCQlpZihnZXRfdXNlcihsZW4sICZiaW5hcnktPmxlbikgPCAwKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYoZ2V0X3VzZXIoYmluLCAmYmluYXJ5LT5iaW4pIDwgMCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJCQlpZiAobGVuID09IDApIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsgICAgICAvKiBub3RoaW5nIHRvIHVwbG9hZD8hPyAqLworCQkJfQorCQkJaWYgKGxlbiA+IERTUDU2S19NQVhfQklOQVJZX0xFTkdUSCkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorICAgIAorCQkJciA9IGRzcDU2a191cGxvYWQoYmluLCBsZW4pOworCQkJaWYgKHIgPCAwKSB7CisJCQkJcmV0dXJuIHI7CisJCQl9CisgICAgCisJCQlicmVhazsKKwkJfQorCQljYXNlIERTUDU2S19TRVRfVFhfV1NJWkU6CisJCQlpZiAoYXJnID4gNCB8fCBhcmcgPCAxKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZHNwNTZrLnR4X3dzaXplID0gKGludCkgYXJnOworCQkJYnJlYWs7CisJCWNhc2UgRFNQNTZLX1NFVF9SWF9XU0laRToKKwkJCWlmIChhcmcgPiA0IHx8IGFyZyA8IDEpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlkc3A1Nmsucnhfd3NpemUgPSAoaW50KSBhcmc7CisJCQlicmVhazsKKwkJY2FzZSBEU1A1NktfSE9TVF9GTEFHUzoKKwkJeworCQkJaW50IGRpciwgb3V0LCBzdGF0dXM7CisJCQlzdHJ1Y3QgZHNwNTZrX2hvc3RfZmxhZ3MgKmhmID0gKHN0cnVjdCBkc3A1NmtfaG9zdF9mbGFncyopIGFyZzsKKyAgICAKKwkJCWlmKGdldF91c2VyKGRpciwgJmhmLT5kaXIpIDwgMCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmKGdldF91c2VyKG91dCwgJmhmLT5vdXQpIDwgMCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKChkaXIgJiAweDEpICYmIChvdXQgJiAweDEpKQorCQkJCWRzcDU2a19ob3N0X2ludGVyZmFjZS5pY3IgfD0gRFNQNTZLX0lDUl9IRjA7CisJCQllbHNlIGlmIChkaXIgJiAweDEpCisJCQkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmPSB+RFNQNTZLX0lDUl9IRjA7CisJCQlpZiAoKGRpciAmIDB4MikgJiYgKG91dCAmIDB4MikpCisJCQkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciB8PSBEU1A1NktfSUNSX0hGMTsKKwkJCWVsc2UgaWYgKGRpciAmIDB4MikKKwkJCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaWNyICY9IH5EU1A1NktfSUNSX0hGMTsKKworCQkJc3RhdHVzID0gMDsKKwkJCWlmIChkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaWNyICYgRFNQNTZLX0lDUl9IRjApIHN0YXR1cyB8PSAweDE7CisJCQlpZiAoZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmIERTUDU2S19JQ1JfSEYxKSBzdGF0dXMgfD0gMHgyOworCQkJaWYgKGRzcDU2a19ob3N0X2ludGVyZmFjZS5pc3IgJiBEU1A1NktfSVNSX0hGMikgc3RhdHVzIHw9IDB4NDsKKwkJCWlmIChkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaXNyICYgRFNQNTZLX0lTUl9IRjMpIHN0YXR1cyB8PSAweDg7CisKKwkJCXJldHVybiBwdXRfdXNlcihzdGF0dXMsICZoZi0+c3RhdHVzKTsKKwkJfQorCQljYXNlIERTUDU2S19IT1NUX0NNRDoKKwkJCWlmIChhcmcgPiAzMSB8fCBhcmcgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmN2ciA9ICh1X2NoYXIpKChhcmcgJiBEU1A1NktfQ1ZSX0hWX01BU0spIHwKKwkJCQkJCQkgICAgIERTUDU2S19DVlJfSEMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiRFNQNTZrIGRyaXZlcjogVW5rbm93biBtaW5vciBkZXZpY2U6ICVkXG4iLCBkZXYpOworCQlyZXR1cm4gLUVOWElPOworCX0KK30KKworLyogQXMgb2YgMi4xLjI2IHRoaXMgc2hvdWxkIGJlIGRzcDU2a19wb2xsLAorICogYnV0IGhvdyBkbyBJIHRoZW4gY2hlY2sgZGV2aWNlIG1pbm9yIG51bWJlcj8KKyAqIERvIEkgbmVlZCB0aGlzIGZ1bmN0aW9uIGF0IGFsbD8/PworICovCisjaWYgMAorc3RhdGljIHVuc2lnbmVkIGludCBkc3A1NmtfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlpbnQgZGV2ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSAmIDB4MGY7CisKKwlzd2l0Y2goZGV2KQorCXsKKwljYXNlIERTUDU2S19ERVZfNTYwMDE6CisJCS8qIHBvbGxfd2FpdChmaWxlLCA/Pz8sIHdhaXQpOyAqLworCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STSB8IFBPTExPVVQ7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIkRTUDU2ayBkcml2ZXI6IFVua25vd24gbWlub3IgZGV2aWNlOiAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZHNwNTZrX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCisJc3dpdGNoKGRldikKKwl7CisJY2FzZSBEU1A1NktfREVWXzU2MDAxOgorCisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkc3A1NmsuaW5fdXNlKSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJZHNwNTZrLnRpbWVvdXQgPSBUSU1FT1VUOworCQlkc3A1NmsubWF4aW8gPSBNQVhJTzsKKwkJZHNwNTZrLnJ4X3dzaXplID0gZHNwNTZrLnR4X3dzaXplID0gNDsgCisKKwkJRFNQNTZLX1RYX0lOVF9PRkY7CisJCURTUDU2S19SWF9JTlRfT0ZGOworCisJCS8qIFplcm8gaG9zdCBmbGFncyAqLworCQlkc3A1NmtfaG9zdF9pbnRlcmZhY2UuaWNyICY9IH5EU1A1NktfSUNSX0hGMDsKKwkJZHNwNTZrX2hvc3RfaW50ZXJmYWNlLmljciAmPSB+RFNQNTZLX0lDUl9IRjE7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc3A1NmtfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisKKwlzd2l0Y2goZGV2KQorCXsKKwljYXNlIERTUDU2S19ERVZfNTYwMDE6CisJCWNsZWFyX2JpdCgwLCAmZHNwNTZrLmluX3VzZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiRFNQNTZrIGRyaXZlcjogVW5rbm93biBtaW5vciBkZXZpY2U6ICVkXG4iLCBkZXYpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkc3A1NmtfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gZHNwNTZrX3JlYWQsCisJLndyaXRlCQk9IGRzcDU2a193cml0ZSwKKwkuaW9jdGwJCT0gZHNwNTZrX2lvY3RsLAorCS5vcGVuCQk9IGRzcDU2a19vcGVuLAorCS5yZWxlYXNlCT0gZHNwNTZrX3JlbGVhc2UsCit9OworCisKKy8qKioqKiogSW5pdCBhbmQgbW9kdWxlIGZ1bmN0aW9ucyAqKioqKiovCisKK3N0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIkRTUDU2ayBkcml2ZXIgaW5zdGFsbGVkXG4iOworCitzdGF0aWMgaW50IF9faW5pdCBkc3A1NmtfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmKCFNQUNIX0lTX0FUQVJJIHx8ICFBVEFSSUhXX1BSRVNFTlQoRFNQNTZLKSkgeworCQlwcmludGsoIkRTUDU2ayBkcml2ZXI6IEhhcmR3YXJlIG5vdCBwcmVzZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYocmVnaXN0ZXJfY2hyZGV2KERTUDU2S19NQUpPUiwgImRzcDU2ayIsICZkc3A1NmtfZm9wcykpIHsKKwkJcHJpbnRrKCJEU1A1NmsgZHJpdmVyOiBVbmFibGUgdG8gcmVnaXN0ZXIgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRzcDU2a19jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJkc3A1NmsiKTsKKwlpZiAoSVNfRVJSKGRzcDU2a19jbGFzcykpIHsKKwkJZXJyID0gUFRSX0VSUihkc3A1NmtfY2xhc3MpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGRzcDU2a19jbGFzcywgTUtERVYoRFNQNTZLX01BSk9SLCAwKSwgTlVMTCwgImRzcDU2ayIpOworCisJZXJyID0gZGV2ZnNfbWtfY2RldihNS0RFVihEU1A1NktfTUFKT1IsIDApLAorCQkgICAgICBTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsICJkc3A1NmsiKTsKKwlpZihlcnIpCisJCWdvdG8gb3V0X2NsYXNzOworCisJcHJpbnRrKGJhbm5lcik7CisJZ290byBvdXQ7CisKK291dF9jbGFzczoKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihEU1A1NktfTUFKT1IsIDApKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShkc3A1NmtfY2xhc3MpOworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihEU1A1NktfTUFKT1IsICJkc3A1NmsiKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorbW9kdWxlX2luaXQoZHNwNTZrX2luaXRfZHJpdmVyKTsKKworc3RhdGljIHZvaWQgX19leGl0IGRzcDU2a19jbGVhbnVwX2RyaXZlcih2b2lkKQoreworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKERTUDU2S19NQUpPUiwgMCkpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KGRzcDU2a19jbGFzcyk7CisJdW5yZWdpc3Rlcl9jaHJkZXYoRFNQNTZLX01BSk9SLCAiZHNwNTZrIik7CisJZGV2ZnNfcmVtb3ZlKCJkc3A1NmsiKTsKK30KK21vZHVsZV9leGl0KGRzcDU2a19jbGVhbnVwX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kdGxrLmMgYi9kcml2ZXJzL2NoYXIvZHRsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwM2U0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHRsay5jCkBAIC0wLDAgKzEsNjU5IEBACisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gbGludXgtYyAtKi0KKyAqIGR0bGsuYyAtIERvdWJsZVRhbGsgUEMgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIE9yaWdpbmFsIGF1dGhvcjogQ2hyaXMgUGFsbG90dGEgPGNocmlzQGFsbG1lZGlhLmNvbT4KKyAqIEN1cnJlbnQgbWFpbnRhaW5lcjogSmltIFZhbiBaYW5kdCA8anJ2QHZhbnphbmR0Lm12LmNvbT4KKyAqIAorICogMjAwMC0wMy0xOCBKaW0gVmFuIFphbmR0OiBGaXggcG9sbGluZy4KKyAqICBFbGltaW5hdGUgZHRsa190aW1lcl9hY3RpdmUgZmxhZyBhbmQgc2VwYXJhdGUgZHRsa19zdG9wX3RpbWVyCisgKiAgZnVuY3Rpb24uICBEb24ndCByZXN0YXJ0IHRpbWVyIGluIGR0bGtfdGltZXJfdGljay4gIFJlc3RhcnQgdGltZXIKKyAqICBpbiBkdGxrX3BvbGwgYWZ0ZXIgZXZlcnkgcG9sbC4gIGR0bGtfcG9sbCByZXR1cm5zIG1hc2sgKGR1aCkuCisgKiAgRWxpbWluYXRlIHVudXNlZCBmdW5jdGlvbiBkdGxrX3dyaXRlX2J5dGUuICBNaXNjLiBjb2RlIGNsZWFudXBzLgorICovCisKKy8qIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgRG91YmxlVGFsayBQQywgYSBzcGVlY2ggc3ludGhlc2l6ZXIKKyAgIG1hbnVmYWN0dXJlZCBieSBSQyBTeXN0ZW1zIChodHRwOi8vd3d3LnJjc3lzLmNvbS8pLiAgSXQgd2FzIHdyaXR0ZW4KKyAgIGJhc2VkIG9uIGRvY3VtZW50YXRpb24gaW4gdGhlaXIgVXNlcidzIE1hbnVhbCBmaWxlIGFuZCBEZXZlbG9wZXIncworICAgVG9vbHMgZGlzay4KKworICAgVGhlIERvdWJsZVRhbGsgUEMgY29udGFpbnMgZm91ciB2b2ljZSBzeW50aGVzaXplcnM6IHRleHQtdG8tc3BlZWNoCisgICAoVFRTKSwgbGluZWFyIHByZWRpY3RpdmUgY29kaW5nIChMUEMpLCBQQ00vQURQQ00sIGFuZCBDVlNELiAgSXQKKyAgIGFsc28gaGFzIGEgdG9uZSBnZW5lcmF0b3IuICBPdXRwdXQgZGF0YSBmb3IgTFBDIGFyZSB3cml0dGVuIHRvIHRoZQorICAgTFBDIHBvcnQsIGFuZCBvdXRwdXQgZGF0YSBmb3IgdGhlIG90aGVyIG1vZGVzIGFyZSB3cml0dGVuIHRvIHRoZQorICAgVFRTIHBvcnQuCisKKyAgIFR3byBraW5kcyBvZiBkYXRhIGNhbiBiZSByZWFkIGZyb20gdGhlIERvdWJsZVRhbGs6IHN0YXR1cworICAgaW5mb3JtYXRpb24gKGluIHJlc3BvbnNlIHRvIHRoZSAiXDAwMT8iIGludGVycm9nYXRpb24gY29tbWFuZCkgaXMKKyAgIHJlYWQgZnJvbSB0aGUgVFRTIHBvcnQsIGFuZCBpbmRleCBtYXJrZXJzICh3aGljaCBtYXJrIHRoZSBwcm9ncmVzcworICAgb2YgdGhlIHNwZWVjaCkgYXJlIHJlYWQgZnJvbSB0aGUgTFBDIHBvcnQuICBOb3QgYWxsIG1vZGVscyBvZiB0aGUKKyAgIERvdWJsZVRhbGsgUEMgaW1wbGVtZW50IGluZGV4IG1hcmtlcnMuICBCb3RoIHRoZSBUVFMgYW5kIExQQyBwb3J0cworICAgY2FuIGFsc28gZGlzcGxheSBzdGF0dXMgZmxhZ3MuCisKKyAgIFRoZSBEb3VibGVUYWxrIFBDIGdlbmVyYXRlcyBubyBpbnRlcnJ1cHRzLgorCisgICBUaGVzZSBjaGFyYWN0ZXJpc3RpY3MgYXJlIG1hcHBlZCBpbnRvIHRoZSBVbml4IHN0cmVhbSBJL08gbW9kZWwgYXMKKyAgIGZvbGxvd3M6CisKKyAgICJ3cml0ZSIgc2VuZHMgYnl0ZXMgdG8gdGhlIFRUUyBwb3J0LiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCisgICB0aGUgdXNlciBwcm9ncmFtIHRvIHN3aXRjaCBtb2RlcyBhbW9uZyBUVFMsIFBDTS9BRFBDTSwgYW5kIENWU0QuCisgICBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiBmb3IgdXNlIHdpdGggdGhlIHRleHQtdG8tc3BlZWNoCisgICBzeW50aGVzaXplci4gIElmIExQQyBvdXRwdXQgaXMgbmVlZGVkIHNvbWUgZGF5LCBvdGhlciBtaW5vciBkZXZpY2UKKyAgIG51bWJlcnMgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IGFtb25nIG91dHB1dCBtb2Rlcy4KKworICAgInJlYWQiIGdldHMgaW5kZXggbWFya2VycyBmcm9tIHRoZSBMUEMgcG9ydC4gIElmIHRoZSBkZXZpY2UgZG9lcworICAgbm90IGltcGxlbWVudCBpbmRleCBtYXJrZXJzLCB0aGUgcmVhZCB3aWxsIGZhaWwgd2l0aCBlcnJvciBFSU5WQUwuCisKKyAgIFN0YXR1cyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdXNpbmcgdGhlIERUTEtfSU5URVJST0dBVEUgaW9jdGwuCisKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgS0VSTkVMCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiBmb3IgdmVyaWZ5X2FyZWEgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiBmb3IgLUVCVVNZICovCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIGZvciByZXF1ZXN0X3JlZ2lvbiAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIGZvciBsb29wc19wZXJfamlmZnkgKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIGZvciBpbmJfcCwgb3V0Yl9wLCBpbmIsIG91dGIsIGV0Yy4gKi8KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBmb3IgZ2V0X3VzZXIsIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CQkvKiBmb3Igd2FpdF9xdWV1ZSAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIGZvciBfX2luaXQsIG1vZHVsZV97aW5pdCxleGl0fSAqLworI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4JCS8qIGZvciBQT0xMSU4sIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9kdGxrLmg+CQkvKiBsb2NhbCBoZWFkZXIgZmlsZSBmb3IgRG91YmxlVGFsayB2YWx1ZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaWZkZWYgVFJBQ0lORworI2RlZmluZSBUUkFDRV9URVhUKHN0cikgcHJpbnRrKHN0cik7CisjZGVmaW5lIFRSQUNFX1JFVCBwcmludGsoIikiKQorI2Vsc2UJCQkJLyogIVRSQUNJTkcgKi8KKyNkZWZpbmUgVFJBQ0VfVEVYVChzdHIpICgodm9pZCkgMCkKKyNkZWZpbmUgVFJBQ0VfUkVUICgodm9pZCkgMCkKKyNlbmRpZgkJCQkvKiBUUkFDSU5HICovCisKKworc3RhdGljIGludCBkdGxrX21ham9yOworc3RhdGljIGludCBkdGxrX3BvcnRfbHBjOworc3RhdGljIGludCBkdGxrX3BvcnRfdHRzOworc3RhdGljIGludCBkdGxrX2J1c3k7CitzdGF0aWMgaW50IGR0bGtfaGFzX2luZGV4aW5nOworc3RhdGljIHVuc2lnbmVkIGludCBkdGxrX3BvcnRsaXN0W10gPQorezB4MjVlLCAweDI5ZSwgMHgyZGUsIDB4MzFlLCAweDM1ZSwgMHgzOWUsIDB9Oworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGR0bGtfcHJvY2Vzc19saXN0Oworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGR0bGtfdGltZXI7CisKKy8qIHByb3RvdHlwZXMgZm9yIGZpbGVfb3BlcmF0aW9ucyBzdHJ1Y3QgKi8KK3N0YXRpYyBzc2l6ZV90IGR0bGtfcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLAorCQkJIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqIHBwb3MpOworc3RhdGljIHNzaXplX3QgZHRsa193cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLAorCQkJICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKiBwcG9zKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHRsa19wb2xsKHN0cnVjdCBmaWxlICosIHBvbGxfdGFibGUgKik7CitzdGF0aWMgaW50IGR0bGtfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IGR0bGtfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IGR0bGtfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHRsa19mb3BzID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gZHRsa19yZWFkLAorCS53cml0ZQkJPSBkdGxrX3dyaXRlLAorCS5wb2xsCQk9IGR0bGtfcG9sbCwKKwkuaW9jdGwJCT0gZHRsa19pb2N0bCwKKwkub3BlbgkJPSBkdGxrX29wZW4sCisJLnJlbGVhc2UJPSBkdGxrX3JlbGVhc2UsCit9OworCisvKiBsb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IGR0bGtfZGV2X3Byb2JlKHZvaWQpOworc3RhdGljIHN0cnVjdCBkdGxrX3NldHRpbmdzICpkdGxrX2ludGVycm9nYXRlKHZvaWQpOworc3RhdGljIGludCBkdGxrX3JlYWRhYmxlKHZvaWQpOworc3RhdGljIGNoYXIgZHRsa19yZWFkX2xwYyh2b2lkKTsKK3N0YXRpYyBjaGFyIGR0bGtfcmVhZF90dHModm9pZCk7CitzdGF0aWMgaW50IGR0bGtfd3JpdGVhYmxlKHZvaWQpOworc3RhdGljIGNoYXIgZHRsa193cml0ZV9ieXRlcyhjb25zdCBjaGFyICpidWYsIGludCBuKTsKK3N0YXRpYyBjaGFyIGR0bGtfd3JpdGVfdHRzKGNoYXIpOworLyoKKyAgIHN0YXRpYyB2b2lkIGR0bGtfaGFuZGxlX2Vycm9yKGNoYXIsIGNoYXIsIHVuc2lnbmVkIGludCk7CisgKi8KK3N0YXRpYyB2b2lkIGR0bGtfdGltZXJfdGljayh1bnNpZ25lZCBsb25nIGRhdGEpOworCitzdGF0aWMgc3NpemVfdCBkdGxrX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJY2hhciBjaDsKKwlpbnQgaSA9IDAsIHJldHJpZXM7CisKKwlUUkFDRV9URVhUKCIoZHRsa19yZWFkIik7CisJLyogIHByaW50aygiRG91YmxlVGFsayBQQyAtIGR0bGtfcmVhZCgpXG4iKTsgKi8KKworCWlmIChtaW5vciAhPSBEVExLX01JTk9SIHx8ICFkdGxrX2hhc19pbmRleGluZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgbG9vcHNfcGVyX2ppZmZ5OyByZXRyaWVzKyspIHsKKwkJd2hpbGUgKGkgPCBjb3VudCAmJiBkdGxrX3JlYWRhYmxlKCkpIHsKKwkJCWNoID0gZHRsa19yZWFkX2xwYygpOworCQkJLyogICAgICAgIHByaW50aygiZHRsa19yZWFkKCkgcmVhZHMgMHglMDJ4XG4iLCBjaCk7ICovCisJCQlpZiAocHV0X3VzZXIoY2gsIGJ1ZisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWkrKzsKKwkJfQorCQlpZiAoaSkKKwkJCXJldHVybiBpOworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlicmVhazsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKKwl9CisJaWYgKHJldHJpZXMgPT0gbG9vcHNfcGVyX2ppZmZ5KQorCQlwcmludGsoS0VSTl9FUlIgImR0bGtfcmVhZCB0aW1lcyBvdXRcbiIpOworCVRSQUNFX1JFVDsKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIHNzaXplX3QgZHRsa193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCWludCBpID0gMCwgcmV0cmllcyA9IDAsIGNoOworCisJVFJBQ0VfVEVYVCgiKGR0bGtfd3JpdGUiKTsKKyNpZmRlZiBUUkFDSU5HCisJcHJpbnRrKCIgXCIiKTsKKwl7CisJCWludCBpLCBjaDsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWlmIChnZXRfdXNlcihjaCwgYnVmICsgaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoJyAnIDw9IGNoICYmIGNoIDw9ICd+JykKKwkJCQlwcmludGsoIiVjIiwgY2gpOworCQkJZWxzZQorCQkJCXByaW50aygiXFwlMDNvIiwgY2gpOworCQl9CisJCXByaW50aygiXCIiKTsKKwl9CisjZW5kaWYKKworCWlmIChpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpICE9IERUTEtfTUlOT1IpCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKGkgPCBjb3VudCAmJiAhZ2V0X3VzZXIoY2gsIGJ1ZikgJiYKKwkJICAgICAgIChjaCA9PSBEVExLX0NMRUFSIHx8IGR0bGtfd3JpdGVhYmxlKCkpKSB7CisJCQlkdGxrX3dyaXRlX3R0cyhjaCk7CisJCQlidWYrKzsKKwkJCWkrKzsKKwkJCWlmIChpICUgNSA9PSAwKQorCQkJCS8qIFdlIHlpZWxkIG91ciB0aW1lIHVudGlsIHNjaGVkdWxlZAorCQkJCSAgIGFnYWluLiAgVGhpcyByZWR1Y2VzIHRoZSB0cmFuc2ZlcgorCQkJCSAgIHJhdGUgdG8gNTAwIGJ5dGVzL3NlYywgYnV0IHRoYXQncworCQkJCSAgIHN0aWxsIGVub3VnaCB0byBrZWVwIHVwIHdpdGggdGhlCisJCQkJICAgc3BlZWNoIHN5bnRoZXNpemVyLiAqLworCQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEpOworCQkJZWxzZSB7CisJCQkJLyogdGhlIFJEWSBiaXQgZ29lcyB6ZXJvIDItMyB1c2VjCisJCQkJICAgYWZ0ZXIgd3JpdGluZywgYW5kIGdvZXMgMSBhZ2FpbgorCQkJCSAgIDE4MC0xOTAgdXNlYyBsYXRlci4gIEhlcmUsIHdlIHdhaXQKKwkJCQkgICB1cCB0byAyNTAgdXNlYyBmb3IgdGhlIFJEWSBiaXQgdG8KKwkJCQkgICBnbyBub256ZXJvLiAqLworCQkJCWZvciAocmV0cmllcyA9IDA7CisJCQkJICAgICByZXRyaWVzIDwgbG9vcHNfcGVyX2ppZmZ5IC8gKDQwMDAvSFopOworCQkJCSAgICAgcmV0cmllcysrKQorCQkJCQlpZiAoaW5iX3AoZHRsa19wb3J0X3R0cykgJgorCQkJCQkgICAgVFRTX1dSSVRBQkxFKQorCQkJCQkJYnJlYWs7CisJCQl9CisJCQlyZXRyaWVzID0gMDsKKwkJfQorCQlpZiAoaSA9PSBjb3VudCkKKwkJCXJldHVybiBpOworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlicmVhazsKKworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxKTsKKworCQlpZiAoKytyZXRyaWVzID4gMTAgKiBIWikgeyAvKiB3YWl0IG5vIG1vcmUgdGhhbiAxMCBzZWMKKwkJCQkJICAgICAgZnJvbSBsYXN0IHdyaXRlICovCisJCQlwcmludGsoImR0bGs6IHdyaXRlIHRpbWVvdXQuICAiCisJCQkgICAgICAgImluYl9wKGR0bGtfcG9ydF90dHMpID0gMHglMDJ4XG4iLAorCQkJICAgICAgIGluYl9wKGR0bGtfcG9ydF90dHMpKTsKKwkJCVRSQUNFX1JFVDsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJVFJBQ0VfUkVUOworCXJldHVybiAtRUFHQUlOOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGR0bGtfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJaW50IG1hc2sgPSAwOworCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKKworCVRSQUNFX1RFWFQoIiBkdGxrX3BvbGwiKTsKKwkvKgorCSAgIHN0YXRpYyBsb25nIGludCBqOworCSAgIHByaW50aygiLiIpOworCSAgIHByaW50aygiPCVsZD4iLCBqaWZmaWVzLWopOworCSAgIGo9amlmZmllczsKKwkgKi8KKwlwb2xsX3dhaXQoZmlsZSwgJmR0bGtfcHJvY2Vzc19saXN0LCB3YWl0KTsKKworCWlmIChkdGxrX2hhc19pbmRleGluZyAmJiBkdGxrX3JlYWRhYmxlKCkpIHsKKwkgICAgICAgIGRlbF90aW1lcigmZHRsa190aW1lcik7CisJCW1hc2sgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZHRsa193cml0ZWFibGUoKSkgeworCSAgICAgICAgZGVsX3RpbWVyKCZkdGxrX3RpbWVyKTsKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisJLyogdGhlcmUgYXJlIG5vIGV4Y2VwdGlvbiBjb25kaXRpb25zICovCisKKwkvKiBUaGVyZSB3b24ndCBiZSBhbnkgaW50ZXJydXB0cywgc28gd2Ugc2V0IGEgdGltZXIgaW5zdGVhZC4gKi8KKwlleHBpcmVzID0gamlmZmllcyArIDMqSFogLyAxMDA7CisJbW9kX3RpbWVyKCZkdGxrX3RpbWVyLCBleHBpcmVzKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdm9pZCBkdGxrX3RpbWVyX3RpY2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVRSQUNFX1RFWFQoIiBkdGxrX3RpbWVyX3RpY2siKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmR0bGtfcHJvY2Vzc19saXN0KTsKK30KKworc3RhdGljIGludCBkdGxrX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwljaGFyIF9fdXNlciAqYXJncCA9IChjaGFyIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHRsa19zZXR0aW5ncyAqc3A7CisJY2hhciBwb3J0dmFsOworCVRSQUNFX1RFWFQoIiBkdGxrX2lvY3RsIik7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBEVExLX0lOVEVSUk9HQVRFOgorCQlzcCA9IGR0bGtfaW50ZXJyb2dhdGUoKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBzcCwgc2l6ZW9mKHN0cnVjdCBkdGxrX3NldHRpbmdzKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIERUTEtfU1RBVFVTOgorCQlwb3J0dmFsID0gaW5iX3AoZHRsa19wb3J0X3R0cyk7CisJCXJldHVybiBwdXRfdXNlcihwb3J0dmFsLCBhcmdwKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBkdGxrX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJVFJBQ0VfVEVYVCgiKGR0bGtfb3BlbiIpOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisJc3dpdGNoIChpbWlub3IoaW5vZGUpKSB7CisJY2FzZSBEVExLX01JTk9SOgorCQlpZiAoZHRsa19idXN5KQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTlhJTzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHRsa19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCVRSQUNFX1RFWFQoIihkdGxrX3JlbGVhc2UiKTsKKworCXN3aXRjaCAoaW1pbm9yKGlub2RlKSkgeworCWNhc2UgRFRMS19NSU5PUjoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJVFJBQ0VfUkVUOworCQorCWRlbF90aW1lcigmZHRsa190aW1lcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgZHRsa19pbml0KHZvaWQpCit7CisJZHRsa19wb3J0X2xwYyA9IDA7CisJZHRsa19wb3J0X3R0cyA9IDA7CisJZHRsa19idXN5ID0gMDsKKwlkdGxrX21ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsICJkdGxrIiwgJmR0bGtfZm9wcyk7CisJaWYgKGR0bGtfbWFqb3IgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkRvdWJsZVRhbGsgUEMgLSBjYW5ub3QgcmVnaXN0ZXIgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChkdGxrX2Rldl9wcm9iZSgpID09IDApCisJCXByaW50aygiLCBNQUpPUiAlZFxuIiwgZHRsa19tYWpvcik7CisKKwlkZXZmc19ta19jZGV2KE1LREVWKGR0bGtfbWFqb3IsIERUTEtfTUlOT1IpLAorCQkgICAgICAgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLCAiZHRsayIpOworCisJaW5pdF90aW1lcigmZHRsa190aW1lcik7CisJZHRsa190aW1lci5mdW5jdGlvbiA9IGR0bGtfdGltZXJfdGljazsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkdGxrX3Byb2Nlc3NfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGR0bGtfY2xlYW51cCAodm9pZCkKK3sKKwlkdGxrX3dyaXRlX2J5dGVzKCJnb29kYnllIiwgOCk7CisJbXNsZWVwX2ludGVycnVwdGlibGUoNTAwKTsJCS8qIG5hcCAwLjUwIHNlYyBidXQKKwkJCQkJCSAgIGNvdWxkIGJlIGF3YWtlbmVkCisJCQkJCQkgICBlYXJsaWVyIGJ5CisJCQkJCQkgICBzaWduYWxzLi4uICovCisKKwlkdGxrX3dyaXRlX3R0cyhEVExLX0NMRUFSKTsKKwl1bnJlZ2lzdGVyX2NocmRldihkdGxrX21ham9yLCAiZHRsayIpOworCWRldmZzX3JlbW92ZSgiZHRsayIpOworCXJlbGVhc2VfcmVnaW9uKGR0bGtfcG9ydF9scGMsIERUTEtfSU9fRVhURU5UKTsKK30KKworbW9kdWxlX2luaXQoZHRsa19pbml0KTsKK21vZHVsZV9leGl0KGR0bGtfY2xlYW51cCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGR0bGtfcmVhZGFibGUodm9pZCkKK3sKKyNpZmRlZiBUUkFDSU5HCisJcHJpbnRrKCIgZHRsa19yZWFkYWJsZT0ldUAldSIsIGluYl9wKGR0bGtfcG9ydF9scGMpICE9IDB4N2YsIGppZmZpZXMpOworI2VuZGlmCisJcmV0dXJuIGluYl9wKGR0bGtfcG9ydF9scGMpICE9IDB4N2Y7Cit9CisKK3N0YXRpYyBpbnQgZHRsa193cml0ZWFibGUodm9pZCkKK3sKKwkvKiBUUkFDRV9URVhUKCIgZHRsa193cml0ZWFibGUiKTsgKi8KKyNpZmRlZiBUUkFDSU5HTU9SRQorCXByaW50aygiIGR0bGtfd3JpdGVhYmxlPSV1IiwgKGluYl9wKGR0bGtfcG9ydF90dHMpICYgVFRTX1dSSVRBQkxFKSE9MCk7CisjZW5kaWYKKwlyZXR1cm4gaW5iX3AoZHRsa19wb3J0X3R0cykgJiBUVFNfV1JJVEFCTEU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGR0bGtfZGV2X3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRlc3R2YWwgPSAwOworCWludCBpID0gMDsKKwlzdHJ1Y3QgZHRsa19zZXR0aW5ncyAqc3A7CisKKwlpZiAoZHRsa19wb3J0X2xwYyB8IGR0bGtfcG9ydF90dHMpCisJCXJldHVybiAtRUJVU1k7CisKKwlmb3IgKGkgPSAwOyBkdGxrX3BvcnRsaXN0W2ldOyBpKyspIHsKKyNpZiAwCisJCXByaW50aygiRG91YmxlVGFsayBQQyAtIFBvcnQgJTAzeCA9ICUwNHhcbiIsCisJCSAgICAgICBkdGxrX3BvcnRsaXN0W2ldLCAodGVzdHZhbCA9IGlud19wKGR0bGtfcG9ydGxpc3RbaV0pKSk7CisjZW5kaWYKKworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGR0bGtfcG9ydGxpc3RbaV0sIERUTEtfSU9fRVhURU5ULCAKKwkJCSAgICAgICAiZHRsayIpKQorCQkJY29udGludWU7CisJCXRlc3R2YWwgPSBpbndfcChkdGxrX3BvcnRsaXN0W2ldKTsKKwkJaWYgKCh0ZXN0dmFsICY9IDB4ZmJmZikgPT0gMHgxMDdmKSB7CisJCQlkdGxrX3BvcnRfbHBjID0gZHRsa19wb3J0bGlzdFtpXTsKKwkJCWR0bGtfcG9ydF90dHMgPSBkdGxrX3BvcnRfbHBjICsgMTsKKworCQkJc3AgPSBkdGxrX2ludGVycm9nYXRlKCk7CisJCQlwcmludGsoIkRvdWJsZVRhbGsgUEMgYXQgJTAzeC0lMDN4LCAiCisJCQkgICAgICAgIlJPTSB2ZXJzaW9uICVzLCBzZXJpYWwgbnVtYmVyICV1IiwKKwkJCSAgICAgICBkdGxrX3BvcnRsaXN0W2ldLCBkdGxrX3BvcnRsaXN0W2ldICsKKwkJCSAgICAgICBEVExLX0lPX0VYVEVOVCAtIDEsCisJCQkgICAgICAgc3AtPnJvbV92ZXJzaW9uLCBzcC0+c2VyaWFsX251bWJlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1dCBMUEMgcG9ydCBpbnRvIGtub3duIHN0YXRlLCBzbworCQkJICAgZHRsa19yZWFkYWJsZSgpIGdpdmVzIHZhbGlkIHJlc3VsdCAqLworCQkJb3V0Yl9wKDB4ZmYsIGR0bGtfcG9ydF9scGMpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogSU5JVCBzdHJpbmcgYW5kIGluZGV4IG1hcmtlciAqLworCQkJZHRsa193cml0ZV9ieXRlcygiXDAzNlwxQFwwXDAwMTJJXHIiLCA4KTsKKwkJCS8qIHBvc3RpbmcgYW4gaW5kZXggdGFrZXMgMTggbXNlYy4gIEhlcmUsIHdlCisJCQkgICB3YWl0IHVwIHRvIDEwMCBtc2VjIHRvIHNlZSB3aGV0aGVyIGl0CisJCQkgICBhcHBlYXJzLiAqLworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKKwkJCWR0bGtfaGFzX2luZGV4aW5nID0gZHRsa19yZWFkYWJsZSgpOworI2lmZGVmIFRSQUNJTkcKKwkJCXByaW50aygiLCBpbmRleGluZyAlZFxuIiwgZHRsa19oYXNfaW5kZXhpbmcpOworI2VuZGlmCisjaWZkZWYgSU5TQ09QRQorCQkJeworLyogVGhpcyBtYWNybyByZWNvcmRzIHRlbiBzYW1wbGVzIHJlYWQgZnJvbSB0aGUgTFBDIHBvcnQsIGZvciBsYXRlciBkaXNwbGF5ICovCisjZGVmaW5lIExPT0sJCQkJCVwKK2ZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQkJCVwKKyAgewkJCQkJCVwKKyAgICBidWZmZXJbYisrXSA9IGluYl9wKGR0bGtfcG9ydF9scGMpOwkJXAorICAgIF9fZGVsYXkobG9vcHNfcGVyX2ppZmZ5LygxMDAwMDAwL0haKSk7ICAgICAgICAgICAgIFwKKyAgfQorCQkJCWNoYXIgYnVmZmVyWzEwMDBdOworCQkJCWludCBiID0gMCwgaSwgajsKKworCQkJCUxPT0sKKwkJCQlvdXRiX3AoMHhmZiwgZHRsa19wb3J0X2xwYyk7CisJCQkJYnVmZmVyW2IrK10gPSAwOworCQkJCUxPT0sKKwkJCQlkdGxrX3dyaXRlX2J5dGVzKCJcMDAxMklcciIsIDQpOworCQkJCWJ1ZmZlcltiKytdID0gMDsKKwkJCQlfX2RlbGF5KDUwICogbG9vcHNfcGVyX2ppZmZ5IC8gKDEwMDAvSFopKTsKKwkJCQlvdXRiX3AoMHhmZiwgZHRsa19wb3J0X2xwYyk7CisJCQkJYnVmZmVyW2IrK10gPSAwOworCQkJCUxPT0sKKworCQkJCXByaW50aygiXG4iKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgYjsgaisrKQorCQkJCQlwcmludGsoIiAlMDJ4IiwgYnVmZmVyW2pdKTsKKwkJCQlwcmludGsoIlxuIik7CisJCQl9CisjZW5kaWYJCQkJLyogSU5TQ09QRSAqLworCisjaWZkZWYgT1VUU0NPUEUKKwkJCXsKKy8qIFRoaXMgbWFjcm8gcmVjb3JkcyB0ZW4gc2FtcGxlcyByZWFkIGZyb20gdGhlIFRUUyBwb3J0LCBmb3IgbGF0ZXIgZGlzcGxheSAqLworI2RlZmluZSBMT09LCQkJCQlcCitmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykJCQlcCisgIHsJCQkJCQlcCisgICAgYnVmZmVyW2IrK10gPSBpbmJfcChkdGxrX3BvcnRfdHRzKTsJCVwKKyAgICBfX2RlbGF5KGxvb3BzX3Blcl9qaWZmeS8oMTAwMDAwMC9IWikpOyAgLyogMSB1cyAqLyBcCisgIH0KKwkJCQljaGFyIGJ1ZmZlclsxMDAwXTsKKwkJCQlpbnQgYiA9IDAsIGksIGo7CisKKwkJCQltZGVsYXkoMTApOwkvKiAxMCBtcyAqLworCQkJCUxPT0sKKwkJCQlvdXRiX3AoMHgwMywgZHRsa19wb3J0X3R0cyk7CisJCQkJYnVmZmVyW2IrK10gPSAwOworCQkJCUxPT0sKKwkJCQlMT09LCisKKwkJCQlwcmludGsoIlxuIik7CisJCQkJZm9yIChqID0gMDsgaiA8IGI7IGorKykKKwkJCQkJcHJpbnRrKCIgJTAyeCIsIGJ1ZmZlcltqXSk7CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorI2VuZGlmCQkJCS8qIE9VVFNDT1BFICovCisKKwkJCWR0bGtfd3JpdGVfYnl0ZXMoIkRvdWJsZSBUYWxrIGZvdW5kIiwgMTgpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbihkdGxrX3BvcnRsaXN0W2ldLCBEVExLX0lPX0VYVEVOVCk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiXG5Eb3VibGVUYWxrIFBDIC0gbm90IGZvdW5kXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoKKyAgIHN0YXRpYyB2b2lkIGR0bGtfaGFuZGxlX2Vycm9yKGNoYXIgb3AsIGNoYXIgcmMsIHVuc2lnbmVkIGludCBtaW5vcikKKyAgIHsKKyAgIHByaW50ayhLRVJOX0lORk8iXG5Eb3VibGVUYWxrIFBDIC0gTUlOT1I6ICVkLCBPUENPREU6ICVkLCBFUlJPUjogJWRcbiIsIAorICAgbWlub3IsIG9wLCByYyk7CisgICByZXR1cm47CisgICB9CisgKi8KKworLyogaW50ZXJyb2dhdGUgdGhlIERvdWJsZVRhbGsgUEMgYW5kIHJldHVybiBpdHMgc2V0dGluZ3MgKi8KK3N0YXRpYyBzdHJ1Y3QgZHRsa19zZXR0aW5ncyAqZHRsa19pbnRlcnJvZ2F0ZSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgKnQ7CisJc3RhdGljIGNoYXIgYnVmW3NpemVvZihzdHJ1Y3QgZHRsa19zZXR0aW5ncykgKyAxXTsKKwlpbnQgdG90YWwsIGk7CisJc3RhdGljIHN0cnVjdCBkdGxrX3NldHRpbmdzIHN0YXR1czsKKwlUUkFDRV9URVhUKCIoZHRsa19pbnRlcnJvZ2F0ZSIpOworCWR0bGtfd3JpdGVfYnl0ZXMoIlwwMzBcMDAxPyIsIDMpOworCWZvciAodG90YWwgPSAwLCBpID0gMDsgaSA8IDUwOyBpKyspIHsKKwkJYnVmW3RvdGFsXSA9IGR0bGtfcmVhZF90dHMoKTsKKwkJaWYgKHRvdGFsID4gMiAmJiBidWZbdG90YWxdID09IDB4N2YpCisJCQlicmVhazsKKwkJaWYgKHRvdGFsIDwgc2l6ZW9mKHN0cnVjdCBkdGxrX3NldHRpbmdzKSkKKwkJCXRvdGFsKys7CisJfQorCS8qCisJICAgaWYgKGk9PTUwKSBwcmludGsoImludGVycm9nYXRlKCkgcmVhZCBvdmVycnVuXG4iKTsKKwkgICBmb3IgKGk9MDsgaTxzaXplb2YoYnVmKTsgaSsrKQorCSAgIHByaW50aygiICUwMngiLCBidWZbaV0pOworCSAgIHByaW50aygiXG4iKTsKKwkgKi8KKwl0ID0gYnVmOworCXN0YXR1cy5zZXJpYWxfbnVtYmVyID0gdFswXSArIHRbMV0gKiAyNTY7IC8qIHNlcmlhbCBudW1iZXIgaXMKKwkJCQkJCSAgICAgbGl0dGxlIGVuZGlhbiAqLworCXQgKz0gMjsKKworCWkgPSAwOworCXdoaWxlICgqdCAhPSAnXHInKSB7CisJCXN0YXR1cy5yb21fdmVyc2lvbltpXSA9ICp0OworCQlpZiAoaSA8IHNpemVvZihzdGF0dXMucm9tX3ZlcnNpb24pIC0gMSkKKwkJCWkrKzsKKwkJdCsrOworCX0KKwlzdGF0dXMucm9tX3ZlcnNpb25baV0gPSAwOworCXQrKzsKKworCXN0YXR1cy5tb2RlID0gKnQrKzsKKwlzdGF0dXMucHVuY19sZXZlbCA9ICp0Kys7CisJc3RhdHVzLmZvcm1hbnRfZnJlcSA9ICp0Kys7CisJc3RhdHVzLnBpdGNoID0gKnQrKzsKKwlzdGF0dXMuc3BlZWQgPSAqdCsrOworCXN0YXR1cy52b2x1bWUgPSAqdCsrOworCXN0YXR1cy50b25lID0gKnQrKzsKKwlzdGF0dXMuZXhwcmVzc2lvbiA9ICp0Kys7CisJc3RhdHVzLmV4dF9kaWN0X2xvYWRlZCA9ICp0Kys7CisJc3RhdHVzLmV4dF9kaWN0X3N0YXR1cyA9ICp0Kys7CisJc3RhdHVzLmZyZWVfcmFtID0gKnQrKzsKKwlzdGF0dXMuYXJ0aWN1bGF0aW9uID0gKnQrKzsKKwlzdGF0dXMucmV2ZXJiID0gKnQrKzsKKwlzdGF0dXMuZW9iID0gKnQrKzsKKwlzdGF0dXMuaGFzX2luZGV4aW5nID0gZHRsa19oYXNfaW5kZXhpbmc7CisJVFJBQ0VfUkVUOworCXJldHVybiAmc3RhdHVzOworfQorCitzdGF0aWMgY2hhciBkdGxrX3JlYWRfdHRzKHZvaWQpCit7CisJaW50IHBvcnR2YWwsIHJldHJpZXMgPSAwOworCWNoYXIgY2g7CisJVFJBQ0VfVEVYVCgiKGR0bGtfcmVhZF90dHMiKTsKKworCS8qIHZlcmlmeSBEVCBpcyByZWFkeSwgcmVhZCBjaGFyLCB3YWl0IGZvciBBQ0sgKi8KKwlkbyB7CisJCXBvcnR2YWwgPSBpbmJfcChkdGxrX3BvcnRfdHRzKTsKKwl9IHdoaWxlICgocG9ydHZhbCAmIFRUU19SRUFEQUJMRSkgPT0gMCAmJgorCQkgcmV0cmllcysrIDwgRFRMS19NQVhfUkVUUklFUyk7CisJaWYgKHJldHJpZXMgPT0gRFRMS19NQVhfUkVUUklFUykKKwkJcHJpbnRrKEtFUk5fRVJSICJkdGxrX3JlYWRfdHRzKCkgdGltZW91dFxuIik7CisKKwljaCA9IGluYl9wKGR0bGtfcG9ydF90dHMpOwkvKiBpbnB1dCBmcm9tIFRUUyBwb3J0ICovCisJY2ggJj0gMHg3ZjsKKwlvdXRiX3AoY2gsIGR0bGtfcG9ydF90dHMpOworCisJcmV0cmllcyA9IDA7CisJZG8geworCQlwb3J0dmFsID0gaW5iX3AoZHRsa19wb3J0X3R0cyk7CisJfSB3aGlsZSAoKHBvcnR2YWwgJiBUVFNfUkVBREFCTEUpICE9IDAgJiYKKwkJIHJldHJpZXMrKyA8IERUTEtfTUFYX1JFVFJJRVMpOworCWlmIChyZXRyaWVzID09IERUTEtfTUFYX1JFVFJJRVMpCisJCXByaW50ayhLRVJOX0VSUiAiZHRsa19yZWFkX3R0cygpIHRpbWVvdXRcbiIpOworCisJVFJBQ0VfUkVUOworCXJldHVybiBjaDsKK30KKworc3RhdGljIGNoYXIgZHRsa19yZWFkX2xwYyh2b2lkKQoreworCWludCByZXRyaWVzID0gMDsKKwljaGFyIGNoOworCVRSQUNFX1RFWFQoIihkdGxrX3JlYWRfbHBjIik7CisKKwkvKiBubyBuZWVkIHRvIHRlc3QgLS0gdGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBwb3J0IGlzIHJlYWRhYmxlICovCisKKwljaCA9IGluYl9wKGR0bGtfcG9ydF9scGMpOwkvKiBpbnB1dCBmcm9tIExQQyBwb3J0ICovCisKKwlvdXRiX3AoMHhmZiwgZHRsa19wb3J0X2xwYyk7CisKKwkvKiBhY2tub3dsZWRnaW5nIGEgcmVhZCB0YWtlcyAzLTQKKwkgICB1c2VjLiAgSGVyZSwgd2Ugd2FpdCB1cCB0byAyMCB1c2VjCisJICAgZm9yIHRoZSBhY2tub3dsZWRnZW1lbnQgKi8KKwlyZXRyaWVzID0gKGxvb3BzX3Blcl9qaWZmeSAqIDIwKSAvICgxMDAwMDAwL0haKTsKKwl3aGlsZSAoaW5iX3AoZHRsa19wb3J0X2xwYykgIT0gMHg3ZiAmJiAtLXJldHJpZXMgPiAwKTsKKwlpZiAocmV0cmllcyA9PSAwKQorCQlwcmludGsoS0VSTl9FUlIgImR0bGtfcmVhZF9scGMoKSB0aW1lb3V0XG4iKTsKKworCVRSQUNFX1JFVDsKKwlyZXR1cm4gY2g7Cit9CisKKy8qIHdyaXRlIG4gYnl0ZXMgdG8gdHRzIHBvcnQgKi8KK3N0YXRpYyBjaGFyIGR0bGtfd3JpdGVfYnl0ZXMoY29uc3QgY2hhciAqYnVmLCBpbnQgbikKK3sKKwljaGFyIHZhbCA9IDA7CisJLyogIHByaW50aygiZHRsa193cml0ZV9ieXRlcyhcIiUtKnNcIiwgJWQpXG4iLCBuLCBidWYsIG4pOyAqLworCVRSQUNFX1RFWFQoIihkdGxrX3dyaXRlX2J5dGVzIik7CisJd2hpbGUgKG4tLSA+IDApCisJCXZhbCA9IGR0bGtfd3JpdGVfdHRzKCpidWYrKyk7CisJVFJBQ0VfUkVUOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBjaGFyIGR0bGtfd3JpdGVfdHRzKGNoYXIgY2gpCit7CisJaW50IHJldHJpZXMgPSAwOworI2lmZGVmIFRSQUNJTkdNT1JFCisJcHJpbnRrKCIgIGR0bGtfd3JpdGVfdHRzKCIpOworCWlmICgnICcgPD0gY2ggJiYgY2ggPD0gJ34nKQorCQlwcmludGsoIiclYyciLCBjaCk7CisJZWxzZQorCQlwcmludGsoIjB4JTAyeCIsIGNoKTsKKyNlbmRpZgorCWlmIChjaCAhPSBEVExLX0NMRUFSKQkvKiBubyBmbG93IGNvbnRyb2wgZm9yIENMRUFSIGNvbW1hbmQgKi8KKwkJd2hpbGUgKChpbmJfcChkdGxrX3BvcnRfdHRzKSAmIFRUU19XUklUQUJMRSkgPT0gMCAmJgorCQkgICAgICAgcmV0cmllcysrIDwgRFRMS19NQVhfUkVUUklFUykJLyogRFQgcmVhZHk/ICovCisJCQk7CisJaWYgKHJldHJpZXMgPT0gRFRMS19NQVhfUkVUUklFUykKKwkJcHJpbnRrKEtFUk5fRVJSICJkdGxrX3dyaXRlX3R0cygpIHRpbWVvdXRcbiIpOworCisJb3V0Yl9wKGNoLCBkdGxrX3BvcnRfdHRzKTsJLyogb3V0cHV0IHRvIFRUUyBwb3J0ICovCisJLyogdGhlIFJEWSBiaXQgZ29lcyB6ZXJvIDItMyB1c2VjIGFmdGVyIHdyaXRpbmcsIGFuZCBnb2VzCisJICAgMSBhZ2FpbiAxODAtMTkwIHVzZWMgbGF0ZXIuICBIZXJlLCB3ZSB3YWl0IHVwIHRvIDEwCisJICAgdXNlYyBmb3IgdGhlIFJEWSBiaXQgdG8gZ28gemVyby4gKi8KKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgbG9vcHNfcGVyX2ppZmZ5IC8gKDEwMDAwMC9IWik7IHJldHJpZXMrKykKKwkJaWYgKChpbmJfcChkdGxrX3BvcnRfdHRzKSAmIFRUU19XUklUQUJMRSkgPT0gMCkKKwkJCWJyZWFrOworCisjaWZkZWYgVFJBQ0lOR01PUkUKKwlwcmludGsoIilcbiIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lYzMxMDRfa2V5Yi5jIGIvZHJpdmVycy9jaGFyL2VjMzEwNF9rZXliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlZDY2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9lYzMxMDRfa2V5Yi5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL2VjMzEwNF9rZXliLmMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAwIFBoaWxpcHAgUnVtcGYgPHBydW1wZkB0dXgub3JnPgorICoKKyAqIGJhc2VkIG9uIGxpbnV4L2RyaXZlcnMvY2hhci9wY19rZXliLmMsIHdoaWNoIGhhZCB0aGUgZm9sbG93aW5nIGNvbW1lbnRzOgorICoKKyAqIFNlcGFyYXRpb24gb2YgdGhlIFBDIGxvdy1sZXZlbCBwYXJ0IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiwgTWF5IDE5OTcKKyAqIFNlZSBrZXlib2FyZC5jIGZvciB0aGUgd2hvbGUgaGlzdG9yeS4KKyAqCisgKiBNYWpvciBjbGVhbnVwIGJ5IE1hcnRpbiBNYXJlcywgTWF5IDE5OTcKKyAqCisgKiBDb21iaW5lZCB0aGUga2V5Ym9hcmQgYW5kIFBTLzIgbW91c2UgaGFuZGxpbmcgaW50byBvbmUgZmlsZSwKKyAqIGJlY2F1c2UgdGhleSBzaGFyZSB0aGUgc2FtZSBoYXJkd2FyZS4KKyAqIEpvaGFuIE15cmVlbiA8amVtQGlraS5maT4gMTk5OC0xMC0wOC4KKyAqCisgKiBDb2RlIGZpeGVzIHRvIGhhbmRsZSBtb3VzZSBBQ0tzIHByb3Blcmx5LgorICogQy4gU2NvdHQgQW5hbmlhbiA8Y2FuYW5pYW5AYWx1bW5pLnByaW5jZXRvbi5lZHU+IDE5OTktMDEtMjkuCisgKi8KKy8qIEVDMzEwNCBub3RlOgorICogVGhpcyBjb2RlIHdhcyB3cml0dGVuIHdpdGhvdXQgYW55IGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIEVDMzEwNCBjaGlwLiAgV2hpbGUKKyAqIEkgaG9wZSBJIGdvdCBtb3N0IG9mIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IHJpZ2h0LCB0aGUgcmVnaXN0ZXIgbmFtZXMgSSB1c2UKKyAqIGFyZSBtb3N0IGxpa2VseSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmcm9tIHRob3NlIGluIHRoZSBjaGlwIGRvY3VtZW50YXRpb24uCisgKgorICogSWYgeW91IGhhdmUgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEVDMzEwNCwgcGxlYXNlIHRlbGwgbWUKKyAqIChwcnVtcGZAdHV4Lm9yZykuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2tleWJvYXJkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9lYzMxMDQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBTb21lIGNvbmZpZ3VyYXRpb24gc3dpdGNoZXMgYXJlIHByZXNlbnQgaW4gdGhlIGluY2x1ZGUgZmlsZS4uLiAqLworCisjaW5jbHVkZSA8bGludXgvcGNfa2V5Yi5oPgorCisjZGVmaW5lIE1TUl9DVFMgMHgxMAorI2RlZmluZSBNQ1JfUlRTIDB4MDIKKyNkZWZpbmUgTFNSX0RSIDB4MDEKKyNkZWZpbmUgTFNSX0JPVEhfRU1QVFkgMHg2MAorCitzdGF0aWMgc3RydWN0IGU1X3N0cnVjdCB7CisJdTggcGFja2V0WzhdOworCWludCBwb3M7CisJaW50IGxlbmd0aDsKKworCXU4IGNhY2hlZF9tY3I7CisJdTggbGFzdF9tc3I7Cit9IGVjMzEwNF9rZXliOworCQorLyogU2ltcGxlIHRyYW5zbGF0aW9uIHRhYmxlIGZvciB0aGUgU3lzUnEga2V5cyAqLworCisKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKK3Vuc2lnbmVkIGNoYXIgZWMzMTA0X2tiZF9zeXNycV94bGF0ZVsxMjhdID0KKwkiXDAwMFwwMzMxMjM0NTY3ODkwLT1cMTc3XHQiCQkJLyogMHgwMCAtIDB4MGYgKi8KKwkicXdlcnR5dWlvcFtdXHJcMDAwYXMiCQkJCS8qIDB4MTAgLSAweDFmICovCisJImRmZ2hqa2w7J2BcMDAwXFx6eGN2IgkJCQkvKiAweDIwIC0gMHgyZiAqLworCSJibm0sLi9cMDAwKlwwMDAgXDAwMFwyMDFcMjAyXDIwM1wyMDRcMjA1IgkvKiAweDMwIC0gMHgzZiAqLworCSJcMjA2XDIwN1wyMTBcMjExXDIxMlwwMDBcMDAwNzg5LTQ1NisxIgkJLyogMHg0MCAtIDB4NGYgKi8KKwkiMjMwXDE3N1wwMDBcMDAwXDIxM1wyMTRcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiAvKiAweDUwIC0gMHg1ZiAqLworCSJcclwwMDAvIjsJCQkJCS8qIDB4NjAgLSAweDZmICovCisjZW5kaWYKKworc3RhdGljIHZvaWQga2JkX3dyaXRlX2NvbW1hbmRfdyhpbnQgZGF0YSk7CitzdGF0aWMgdm9pZCBrYmRfd3JpdGVfb3V0cHV0X3coaW50IGRhdGEpOworI2lmZGVmIENPTkZJR19QU01PVVNFCitzdGF0aWMgdm9pZCBhdXhfd3JpdGVfYWNrKGludCB2YWwpOworc3RhdGljIHZvaWQgX19hdXhfd3JpdGVfYWNrKGludCB2YWwpOworI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2JkX2NvbnRyb2xsZXJfbG9jayk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBoYW5kbGVfa2JkX2V2ZW50KHZvaWQpOworCisvKiB1c2VkIG9ubHkgYnkgc2VuZF9kYXRhIC0gc2V0IGJ5IGtleWJvYXJkX2ludGVycnVwdCAqLworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgcmVwbHlfZXhwZWN0ZWQ7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBhY2tub3dsZWRnZTsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJlc2VuZDsKKworCitpbnQgZWMzMTA0X2tiZF9zZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSwgdW5zaWduZWQgaW50IGtleWNvZGUpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBlYzMxMDRfa2JkX2dldGtleWNvZGUodW5zaWduZWQgaW50IHNjYW5jb2RlKQoreworCXJldHVybiAwOworfQorCisKKy8qIHllcywgaXQgcHJvYmFibHkgd291bGQgYmUgZmFzdGVyIHRvIHVzZSBhbiBhcnJheS4gIEkgZG9uJ3QgY2FyZS4gKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGVjMzEwNF9zY2FuMmtleSh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlKQoreworCXN3aXRjaCAoc2NhbmNvZGUpIHsKKwljYXNlICAxOiAvKiAnYCcgKi8KKwkJcmV0dXJuIDQxOworCQkKKwljYXNlICAyIC4uLiAyNzoKKwkJcmV0dXJuIHNjYW5jb2RlOworCQkKKwljYXNlIDI4OiAvKiAnXFwnICovCisJCXJldHVybiA0MzsKKworCWNhc2UgMjkgLi4uIDM5OgorCQlyZXR1cm4gc2NhbmNvZGUgKyAxOworCisJY2FzZSA0MDogLyogJ1xyJyAqLworCQlyZXR1cm4gMjg7CisKKwljYXNlIDQxIC4uLiA1MDoKKwkJcmV0dXJuIHNjYW5jb2RlICsgMzsKKworCWNhc2UgNTE6IC8qICcgJyAqLworCQlyZXR1cm4gNTc7CisJCQorCWNhc2UgNTI6IC8qIGVzY2FwZSAqLworCQlyZXR1cm4gMTsKKworCWNhc2UgNTQ6IC8qIGluc2VydC9kZWxldGUgKGxhYmVsbGVkIGRlbGV0ZSkgKi8KKwkJLyogdGhpcyBzaG91bGQgYXJndWFibHkgYmUgMTEwLCBidXQgSSdkIGxpa2UgdG8gaGF2ZSBjdHJsLWFsdC1kZWwKKwkJICogd29ya2luZyB3aXRoIGEgc3RhbmRhcmQga2V5bWFwICovCisJCXJldHVybiAxMTE7CisKKwljYXNlIDU1OiAvKiBsZWZ0ICovCisJCXJldHVybiAxMDU7CisJY2FzZSA1NjogLyogaG9tZSAqLworCQlyZXR1cm4gMTAyOworCWNhc2UgNTc6IC8qIGVuZCAqLworCQlyZXR1cm4gMTA3OworCWNhc2UgNTg6IC8qIHVwICovCisJCXJldHVybiAxMDM7CisJY2FzZSA1OTogLyogZG93biAqLworCQlyZXR1cm4gMTA4OworCWNhc2UgNjA6IC8qIHBndXAgKi8KKwkJcmV0dXJuIDEwNDsKKwljYXNlIDYxOiAvKiBwZ2Rvd24gKi8KKwkJcmV0dXJuIDEwOTsKKwljYXNlIDYyOiAvKiByaWdodCAqLworCQlyZXR1cm4gMTA2OworCisJY2FzZSA3OSAuLi4gODg6IC8qIGYxIC0gZjEwICovCisJCXJldHVybiBzY2FuY29kZSAtIDIwOworCisJY2FzZSA4OSAuLi4gOTA6IC8qIGYxMSAtIGYxMiAqLworCQlyZXR1cm4gc2NhbmNvZGUgLSAyOworCisJY2FzZSA5MTogLyogbGVmdCBzaGlmdCAqLworCQlyZXR1cm4gNDI7CisKKwljYXNlIDkyOiAvKiByaWdodCBzaGlmdCAqLworCQlyZXR1cm4gNTQ7CisKKwljYXNlIDkzOiAvKiBsZWZ0IGFsdCAqLworCQlyZXR1cm4gNTY7CisJY2FzZSA5NDogLyogcmlnaHQgYWx0ICovCisJCXJldHVybiAxMDA7CisJY2FzZSA5NTogLyogbGVmdCBjdHJsICovCisJCXJldHVybiAyOTsKKwljYXNlIDk2OiAvKiByaWdodCBjdHJsICovCisJCXJldHVybiA5NzsKKworCWNhc2UgOTc6IC8qIGNhcHMgbG9jayAqLworCQlyZXR1cm4gNTg7CisJY2FzZSAxMDI6IC8qIGxlZnQgd2luZG93cyAqLworCQlyZXR1cm4gMTI1OworCWNhc2UgMTAzOiAvKiByaWdodCB3aW5kb3dzICovCisJCXJldHVybiAxMjY7CisKKwljYXNlIDEwNjogLyogRm4gKi8KKwkJLyogdGhpcyBpcyB3cm9uZy4gKi8KKwkJcmV0dXJuIDg0OworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCQkKK2ludCBlYzMxMDRfa2JkX3RyYW5zbGF0ZSh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlLCB1bnNpZ25lZCBjaGFyICprZXljb2RlLAorCQkgICAgY2hhciByYXdfbW9kZSkKK3sKKwlzY2FuY29kZSAmPSAweDdmOworCisJKmtleWNvZGUgPSBlYzMxMDRfc2NhbjJrZXkoc2NhbmNvZGUpOworCisgCXJldHVybiAxOworfQorCitjaGFyIGVjMzEwNF9rYmRfdW5leHBlY3RlZF91cCh1bnNpZ25lZCBjaGFyIGtleWNvZGUpCit7CisJcmV0dXJuIDAyMDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfa2V5Ym9hcmRfZXZlbnQodW5zaWduZWQgY2hhciBzY2FuY29kZSkKK3sKKyNpZmRlZiBDT05GSUdfVlQKKwloYW5kbGVfc2NhbmNvZGUoc2NhbmNvZGUsICEoc2NhbmNvZGUgJiAweDgwKSk7CisjZW5kaWYJCQkJCisJdGFza2xldF9zY2hlZHVsZSgma2V5Ym9hcmRfdGFza2xldCk7Cit9CQorCit2b2lkIGVjMzEwNF9rYmRfbGVkcyh1bnNpZ25lZCBjaGFyIGxlZHMpCit7Cit9CisKK3N0YXRpYyB1OCBlNV9jaGVja3N1bSh1OCAqcGFja2V0LCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdTggc3VtID0gMDsKKworCWZvciAoaT0wOyBpPGNvdW50OyBpKyspCisJCXN1bSBePSBwYWNrZXRbaV07CisJCQorCWlmIChzdW0gJiAweDgwKQorCQlzdW0gXj0gMHhjMDsKKworCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyB2b2lkIGU1X3dhaXRfZm9yX2N0cyhzdHJ1Y3QgZTVfc3RydWN0ICprKQoreworCXU4IG1zcjsKKwkJCisJZG8geworCQltc3IgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9NU1IpOworCX0gd2hpbGUgKCEobXNyICYgTVNSX0NUUykpOworfQorCisKK3N0YXRpYyB2b2lkIGU1X3NlbmRfYnl0ZSh1OCBieXRlLCBzdHJ1Y3QgZTVfc3RydWN0ICprKQoreworCXU4IHN0YXR1czsKKwkJCisJZG8geworCQlzdGF0dXMgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9MU1IpOworCX0gd2hpbGUgKChzdGF0dXMgJiBMU1JfQk9USF9FTVBUWSkgIT0gTFNSX0JPVEhfRU1QVFkpOworCQorCXByaW50aygiPCUwMng+IiwgYnl0ZSk7CisKKwljdHJsX291dGIoYnl0ZSwgRUMzMTA0X1NFUjRfREFUQSk7CisKKwlkbyB7CisJCXN0YXR1cyA9IGN0cmxfaW5iKEVDMzEwNF9TRVI0X0xTUik7CisJfSB3aGlsZSAoKHN0YXR1cyAmIExTUl9CT1RIX0VNUFRZKSAhPSBMU1JfQk9USF9FTVBUWSk7CisJCit9CisKK3N0YXRpYyBpbnQgZTVfc2VuZF9wYWNrZXQodTggKnBhY2tldCwgaW50IGNvdW50LCBzdHJ1Y3QgZTVfc3RydWN0ICprKQoreworCWludCBpOworCisJZGlzYWJsZV9pcnEoRUMzMTA0X0lSUV9TRVI0KTsKKwkKKwlpZiAoay0+Y2FjaGVkX21jciAmIE1DUl9SVFMpIHsKKwkJcHJpbnRrKCJlNV9zZW5kX3BhY2tldDogdG9vIHNsb3dcbiIpOworCQllbmFibGVfaXJxKEVDMzEwNF9JUlFfU0VSNCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWstPmNhY2hlZF9tY3IgfD0gTUNSX1JUUzsKKwljdHJsX291dGIoay0+Y2FjaGVkX21jciwgRUMzMTA0X1NFUjRfTUNSKTsKKworCWU1X3dhaXRfZm9yX2N0cyhrKTsKKworCXByaW50aygicDogIik7CisKKwlmb3IoaT0wOyBpPGNvdW50OyBpKyspCisJCWU1X3NlbmRfYnl0ZShwYWNrZXRbaV0sIGspOworCisJZTVfc2VuZF9ieXRlKGU1X2NoZWNrc3VtKHBhY2tldCwgY291bnQpLCBrKTsKKworCXByaW50aygiXG4iKTsKKworCXVkZWxheSgxNTAwKTsKKworCWstPmNhY2hlZF9tY3IgJj0gfk1DUl9SVFM7CisJY3RybF9vdXRiKGstPmNhY2hlZF9tY3IsIEVDMzEwNF9TRVI0X01DUik7CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCisJCisKKwllbmFibGVfaXJxKEVDMzEwNF9JUlFfU0VSNCk7CisKKwkKKworCXJldHVybiAwOworfQorCisvKgorICogRTUgcGFja2V0cyB3ZSBrbm93IGFib3V0OgorICogRTUtPmhvc3QgMHg4MCAweDA1IDxjaGVja3N1bT4gLSByZXNlbmQgcGFja2V0CisgKiBob3N0LT5FNSAweDgzIDB4NDMgPGNvbnRyYXN0PiAtIHNldCBMQ0QgY29udHJhc3QKKyAqIGhvc3QtPkU1IDB4ODUgMHg0MSAweDAyIDxicmlnaHRuZXNzPiAweDAyIC0gc2V0IExDRCBiYWNrbGlnaHQKKyAqIEU1LT5ob3N0IDB4ODcgPHBzMiBwYWNrZXQ+IDB4MDAgPGNoZWNrc3VtPiAtIGV4dGVybmFsIFBTMiAKKyAqIEU1LT5ob3N0IDB4ODggPHNjYW5jb2RlPiA8Y2hlY2tzdW0+IC0ga2V5IHByZXNzCisgKi8KKworc3RhdGljIHZvaWQgZTVfcmVjZWl2ZShzdHJ1Y3QgZTVfc3RydWN0ICprKQoreworCWstPnBhY2tldFtrLT5wb3MrK10gPSBjdHJsX2luYihFQzMxMDRfU0VSNF9EQVRBKTsKKworCWlmIChrLT5wb3MgPT0gMSkgeworCQlzd2l0Y2goay0+cGFja2V0WzBdKSB7CisJCWNhc2UgMHg4MDoKKwkJCWstPmxlbmd0aCA9IDM7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDB4ODc6IC8qIFBTMiBleHQgKi8KKwkJCWstPmxlbmd0aCA9IDY7CisJCQlicmVhazsKKworCQljYXNlIDB4ODg6IC8qIGtleWJvYXJkICovCisJCQlrLT5sZW5ndGggPSAzOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWstPmxlbmd0aCA9IDE7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1bmtub3duIEU1IHBhY2tldCAlMDJ4XG4iLAorCQkJICAgICAgIGstPnBhY2tldFswXSk7CisJCX0KKwl9CisKKwlpZiAoay0+cG9zID09IGstPmxlbmd0aCkgeworCQlpbnQgaTsKKworCQlpZiAoZTVfY2hlY2tzdW0oay0+cGFja2V0LCBrLT5sZW5ndGgpICE9IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFNTogd3JvbmcgY2hlY2tzdW1cbiIpOworCisjaWYgMAorCQlwcmludGsoIkU1IHBhY2tldCBbIik7CisJCWZvcihpPTA7IGk8ay0+bGVuZ3RoOyBpKyspIHsKKwkJCXByaW50aygiJTAyeCAiLCBrLT5wYWNrZXRbaV0pOworCQl9CisKKwkJcHJpbnRrKCIoJTAyeCldXG4iLCBlNV9jaGVja3N1bShrLT5wYWNrZXQsIGstPmxlbmd0aC0xKSk7CisjZW5kaWYKKworCQlzd2l0Y2goay0+cGFja2V0WzBdKSB7CisJCWNhc2UgMHg4MDoKKwkJY2FzZSAweDg4OgorCQkJaGFuZGxlX2tleWJvYXJkX2V2ZW50KGstPnBhY2tldFsxXSk7CisJCQlicmVhazsKKwkJfQorCisJCWstPnBvcyA9IGstPmxlbmd0aCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBlYzMxMDRfa2V5Yl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGU1X3N0cnVjdCAqayA9ICZlYzMxMDRfa2V5YjsKKwl1OCBtc3IsIGxzcjsKKworCW1zciA9IGN0cmxfaW5iKEVDMzEwNF9TRVI0X01TUik7CisJCisJaWYgKChtc3IgJiBNU1JfQ1RTKSAmJiAhKGstPmxhc3RfbXNyICYgTVNSX0NUUykpIHsKKwkJaWYgKGstPmNhY2hlZF9tY3IgJiBNQ1JfUlRTKQorCQkJcHJpbnRrKCJjb25mdXNlZDogUlRTIGFscmVhZHkgaGlnaFxuIik7CisJCS8qIENUUyB3ZW50IGhpZ2guICBTZW5kIFJUUy4gKi8KKwkJay0+Y2FjaGVkX21jciB8PSBNQ1JfUlRTOworCQkKKwkJY3RybF9vdXRiKGstPmNhY2hlZF9tY3IsIEVDMzEwNF9TRVI0X01DUik7CisJfSBlbHNlIGlmICgoIShtc3IgJiBNU1JfQ1RTKSkgJiYgKGstPmxhc3RfbXNyICYgTVNSX0NUUykpIHsKKwkJLyogQ1RTIHdlbnQgbG93LiAqLworCQlpZiAoIShrLT5jYWNoZWRfbWNyICYgTUNSX1JUUykpCisJCQlwcmludGsoImNvbmZ1c2VkOiBSVFMgYWxyZWFkeSBsb3dcbiIpOworCisJCWstPmNhY2hlZF9tY3IgJj0gfk1DUl9SVFM7CisKKwkJY3RybF9vdXRiKGstPmNhY2hlZF9tY3IsIEVDMzEwNF9TRVI0X01DUik7CisJfQorCisJay0+bGFzdF9tc3IgPSBtc3I7CisKKwlsc3IgPSBjdHJsX2luYihFQzMxMDRfU0VSNF9MU1IpOworCisJaWYgKGxzciAmIExTUl9EUikKKwkJZTVfcmVjZWl2ZShrKTsKK30KKworc3RhdGljIHZvaWQgZWMzMTA0X2tleWJfY2xlYXJfc3RhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgZTVfc3RydWN0ICprID0gJmVjMzEwNF9rZXliOworCXU4IG1zciwgbHNyOworCQorCS8qIHdlIHdhbnQgQ1RTIHRvIGJlIGxvdyAqLworCWstPmxhc3RfbXNyID0gMDsKKworCWZvciAoOzspIHsKKwkJbXNsZWVwKDEwMCk7CisKKwkJbXNyID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfTVNSKTsKKwkKKwkJbHNyID0gY3RybF9pbmIoRUMzMTA0X1NFUjRfTFNSKTsKKwkJCisJCWlmIChsc3IgJiBMU1JfRFIpIHsKKwkJCWU1X3JlY2VpdmUoayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgobXNyICYgTVNSX0NUUykgJiYgIShrLT5sYXN0X21zciAmIE1TUl9DVFMpKSB7CisJCQlpZiAoay0+Y2FjaGVkX21jciAmIE1DUl9SVFMpCisJCQkJcHJpbnRrKCJjb25mdXNlZDogUlRTIGFscmVhZHkgaGlnaFxuIik7CisJCQkvKiBDVFMgd2VudCBoaWdoLiAgU2VuZCBSVFMuICovCisJCQlrLT5jYWNoZWRfbWNyIHw9IE1DUl9SVFM7CisJCQorCQkJY3RybF9vdXRiKGstPmNhY2hlZF9tY3IsIEVDMzEwNF9TRVI0X01DUik7CisJCX0gZWxzZSBpZiAoKCEobXNyICYgTVNSX0NUUykpICYmIChrLT5sYXN0X21zciAmIE1TUl9DVFMpKSB7CisJCQkvKiBDVFMgd2VudCBsb3cuICovCisJCQlpZiAoIShrLT5jYWNoZWRfbWNyICYgTUNSX1JUUykpCisJCQkJcHJpbnRrKCJjb25mdXNlZDogUlRTIGFscmVhZHkgbG93XG4iKTsKKwkJCQorCQkJay0+Y2FjaGVkX21jciAmPSB+TUNSX1JUUzsKKwkJCQorCQkJY3RybF9vdXRiKGstPmNhY2hlZF9tY3IsIEVDMzEwNF9TRVI0X01DUik7CisJCX0gZWxzZQorCQkJYnJlYWs7CisKKwkJay0+bGFzdF9tc3IgPSBtc3I7CisKKwkJY29udGludWU7CisJfQorfQorCit2b2lkIF9faW5pdCBlYzMxMDRfa2JkX2luaXRfaHcodm9pZCkKK3sKKwllYzMxMDRfa2V5Yi5sYXN0X21zciA9IGN0cmxfaW5iKEVDMzEwNF9TRVI0X01TUik7CisJZWMzMTA0X2tleWIuY2FjaGVkX21jciA9IGN0cmxfaW5iKEVDMzEwNF9TRVI0X01DUik7CisKKwllYzMxMDRfa2V5Yl9jbGVhcl9zdGF0ZSgpOworCisJLyogT2ssIGZpbmFsbHkgYWxsb2NhdGUgdGhlIElSUSwgYW5kIG9mZiB3ZSBnby4uICovCisJcmVxdWVzdF9pcnEoRUMzMTA0X0lSUV9TRVI0LCBlYzMxMDRfa2V5Yl9pbnRlcnJ1cHQsIDAsICJrZXlib2FyZCIsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VmaXJ0Yy5jIGIvZHJpdmVycy9jaGFyL2VmaXJ0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOTBlN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZWZpcnRjLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBFRkkgVGltZSBTZXJ2aWNlcyBEcml2ZXIgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IEhld2xldHQtUGFja2FyZCBDbworICogQ29weXJpZ2h0IChDKSAxOTk5IFN0ZXBoYW5lIEVyYW5pYW4gPGVyYW5pYW5AaHBsLmhwLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBza2VsZXRvbiBmcm9tIHRoZSBkcml2ZXJzL2NoYXIvcnRjLmMgZHJpdmVyIGJ5IFAuIEdvcnRtYWtlcgorICoKKyAqIFRoaXMgY29kZSBwcm92aWRlcyBhbiBhcmNoaXRlY3RlZCAmIHBvcnRhYmxlIGludGVyZmFjZSB0byB0aGUgcmVhbCB0aW1lCisgKiBjbG9jayBieSB1c2luZyBFRkkgaW5zdGVhZCBvZiBkaXJlY3QgYml0IGZpZGRsaW5nLiBUaGUgZnVuY3Rpb25hbGl0aWVzIGFyZSAKKyAqIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBydGMuYyBkcml2ZXIuIFRoZSBvbmx5IHdheSB0byB0YWxrIHRvIHRoZSBkZXZpY2UgCisgKiBpcyBieSB1c2luZyBpb2N0bCgpLiBUaGVyZSBpcyBhIC9wcm9jIGludGVyZmFjZSB3aGljaCBwcm92aWRlcyB0aGUgcmF3IAorICogaW5mb3JtYXRpb24uCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCB3ZSBoYXZlIGtlcHQgdGhlIEFQSSBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUKKyAqIGxlZ2FjeSBSVEMuIFRoZSBzdGFuZGFyZCAvc2Jpbi9od2Nsb2NrIHByb2dyYW0gc2hvdWxkIHdvcmsgbm9ybWFsbHkgCisgKiB3aGVuIHVzZWQgdG8gZ2V0L3NldCB0aGUgdGltZS4KKyAqCisgKiBOT1RFUzoKKyAqCS0gTG9ja2luZyBpcyByZXF1aXJlZCBmb3Igc2FmZSBleGVjdXRpb24gb2YgRUZJIGNhbGxzIHdpdGggcmVnYXJkcworICoJICB0byBpbnRlcnJydXB0cyBhbmQgU01QLgorICoKKyAqIFRPRE8gKERlY2VtYmVyIDE5OTkpOgorICogCS0gcHJvdmlkZSB0aGUgQVBJIHRvIHNldC9nZXQgdGhlIFdha2VVcCBBbGFybSAoZGlmZmVyZW50IGZyb20gdGhlCisgKgkgIHJ0Yy5jIGFsYXJtKS4KKyAqCS0gU01QIHRlc3RpbmcKKyAqIAktIEFkZCBtb2R1bGUgc3VwcG9ydAorICovCisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIEVGSV9SVENfVkVSU0lPTgkJIjAuNCIKKworI2RlZmluZSBFRklfSVNEU1QgKEVGSV9USU1FX0FESlVTVF9EQVlMSUdIVHxFRklfVElNRV9JTl9EQVlMSUdIVCkKKy8qCisgKiBFRkkgRXBvY2ggaXMgMS8xLzE5OTgKKyAqLworI2RlZmluZSBFRklfUlRDX0VQT0NICQkxOTk4CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZWZpX3J0Y19sb2NrKTsKKworc3RhdGljIGludCBlZmlfcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworI2RlZmluZSBpc19sZWFwKHllYXIpIFwKKyAgICAgICAgICAoKHllYXIpICUgNCA9PSAwICYmICgoeWVhcikgJSAxMDAgIT0gMCB8fCAoeWVhcikgJSA0MDAgPT0gMCkpCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgX19tb25feWRheVsyXVsxM10gPQoreworCS8qIE5vcm1hbCB5ZWFycy4gICovCisJeyAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCwgMzY1IH0sCisJLyogTGVhcCB5ZWFycy4gICovICAKKwl7IDAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1LCAzNjYgfQorfTsKKworLyoKKyAqIHJldHVybnMgZGF5IG9mIHRoZSB5ZWFyIFswLTM2NV0KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2NvbXB1dGVfeWRheShlZmlfdGltZV90ICplZnQpCit7CisJLyogZWZpX3RpbWVfdC5tb250aCBpcyBpbiB0aGUgWzEtMTJdIHNvLCB3ZSBuZWVkIC0xICovCisJcmV0dXJuICBfX21vbl95ZGF5W2lzX2xlYXAoZWZ0LT55ZWFyKV1bZWZ0LT5tb250aC0xXSsgZWZ0LT5kYXkgLTE7Cit9CisvKgorICogcmV0dXJucyBkYXkgb2YgdGhlIHdlZWsgWzAtNl0gMD1TdW5kYXkKKyAqCisgKiBEb24ndCB0cnkgdG8gcHJvdmlkZSBhIHllYXIgdGhhdCdzIGJlZm9yZSAxOTk4LCBwbGVhc2UgIQorICovCitzdGF0aWMgaW50Citjb21wdXRlX3dkYXkoZWZpX3RpbWVfdCAqZWZ0KQoreworCWludCB5OworCWludCBuZGF5cyA9IDA7CisKKwlpZiAoIGVmdC0+eWVhciA8IDE5OTggKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWZpcnRjOiBFRkkgeWVhciA8IDE5OTgsIGludmFsaWQgZGF0ZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IoeT1FRklfUlRDX0VQT0NIOyB5IDwgZWZ0LT55ZWFyOyB5KysgKSB7CisJCW5kYXlzICs9IDM2NSArIChpc19sZWFwKHkpID8gMSA6IDApOworCX0KKwluZGF5cyArPSBjb21wdXRlX3lkYXkoZWZ0KTsKKworCS8qCisJICogND0xLzEvMTk5OCB3YXMgYSBUaHVyc2RheQorCSAqLworCXJldHVybiAobmRheXMgKyA0KSAlIDc7Cit9CisKK3N0YXRpYyB2b2lkCitjb252ZXJ0X3RvX2VmaV90aW1lKHN0cnVjdCBydGNfdGltZSAqd3RpbWUsIGVmaV90aW1lX3QgKmVmdCkKK3sKKworCWVmdC0+eWVhcgk9IHd0aW1lLT50bV95ZWFyICsgMTkwMDsKKwllZnQtPm1vbnRoCT0gd3RpbWUtPnRtX21vbiArIDE7IAorCWVmdC0+ZGF5CT0gd3RpbWUtPnRtX21kYXk7CisJZWZ0LT5ob3VyCT0gd3RpbWUtPnRtX2hvdXI7CisJZWZ0LT5taW51dGUJPSB3dGltZS0+dG1fbWluOworCWVmdC0+c2Vjb25kIAk9IHd0aW1lLT50bV9zZWM7CisJZWZ0LT5uYW5vc2Vjb25kID0gMDsgCisJZWZ0LT5kYXlsaWdodAk9IHd0aW1lLT50bV9pc2RzdCA/IEVGSV9JU0RTVDogMDsKKwllZnQtPnRpbWV6b25lCT0gRUZJX1VOU1BFQ0lGSUVEX1RJTUVaT05FOworfQorCitzdGF0aWMgdm9pZAorY29udmVydF9mcm9tX2VmaV90aW1lKGVmaV90aW1lX3QgKmVmdCwgc3RydWN0IHJ0Y190aW1lICp3dGltZSkKK3sKKwltZW1zZXQod3RpbWUsIDAsIHNpemVvZigqd3RpbWUpKTsKKwl3dGltZS0+dG1fc2VjICA9IGVmdC0+c2Vjb25kOworCXd0aW1lLT50bV9taW4gID0gZWZ0LT5taW51dGU7CisJd3RpbWUtPnRtX2hvdXIgPSBlZnQtPmhvdXI7CisJd3RpbWUtPnRtX21kYXkgPSBlZnQtPmRheTsKKwl3dGltZS0+dG1fbW9uICA9IGVmdC0+bW9udGggLSAxOworCXd0aW1lLT50bV95ZWFyID0gZWZ0LT55ZWFyIC0gMTkwMDsKKworCS8qIGRheSBvZiB0aGUgd2VlayBbMC02XSwgU3VuZGF5PTAgKi8KKwl3dGltZS0+dG1fd2RheSA9IGNvbXB1dGVfd2RheShlZnQpOworCisJLyogZGF5IGluIHRoZSB5ZWFyIFsxLTM2NV0qLworCXd0aW1lLT50bV95ZGF5ID0gY29tcHV0ZV95ZGF5KGVmdCk7CisKKworCXN3aXRjaCAoZWZ0LT5kYXlsaWdodCAmIEVGSV9JU0RTVCkgeworCQljYXNlIEVGSV9JU0RTVDoKKwkJCXd0aW1lLT50bV9pc2RzdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBFRklfVElNRV9BREpVU1RfREFZTElHSFQ6CisJCQl3dGltZS0+dG1faXNkc3QgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl3dGltZS0+dG1faXNkc3QgPSAtMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2VmaV9ydGNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisKKwllZmlfc3RhdHVzX3QJc3RhdHVzOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJZWZpX3RpbWVfdAllZnQ7CisJZWZpX3RpbWVfY2FwX3QJY2FwOworCXN0cnVjdCBydGNfdGltZQl3dGltZTsKKwlzdHJ1Y3QgcnRjX3drYWxybSBfX3VzZXIgKmV3cDsKKwl1bnNpZ25lZCBjaGFyCWVuYWJsZWQsIHBlbmRpbmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFJUQ19VSUVfT046CisJCWNhc2UgUlRDX1VJRV9PRkY6CisJCWNhc2UgUlRDX1BJRV9PTjoKKwkJY2FzZSBSVENfUElFX09GRjoKKwkJY2FzZSBSVENfQUlFX09OOgorCQljYXNlIFJUQ19BSUVfT0ZGOgorCQljYXNlIFJUQ19BTE1fU0VUOgorCQljYXNlIFJUQ19BTE1fUkVBRDoKKwkJY2FzZSBSVENfSVJRUF9SRUFEOgorCQljYXNlIFJUQ19JUlFQX1NFVDoKKwkJY2FzZSBSVENfRVBPQ0hfUkVBRDoKKwkJY2FzZSBSVENfRVBPQ0hfU0VUOgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2FzZSBSVENfUkRfVElNRToKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVmaV9ydGNfbG9jaywgZmxhZ3MpOworCisJCQlzdGF0dXMgPSBlZmkuZ2V0X3RpbWUoJmVmdCwgJmNhcCk7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVmaV9ydGNfbG9jayxmbGFncyk7CisKKwkJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQkJcHJpbnRrKEtFUk5fRVJSICJlZml0aW1lOiBjYW4ndCByZWFkIHRpbWVcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQljb252ZXJ0X2Zyb21fZWZpX3RpbWUoJmVmdCwgJnd0aW1lKTsKKworIAkJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmd3RpbWUsCisJCQkJCSAgICBzaXplb2YgKHN0cnVjdCBydGNfdGltZSkpID8gLSBFRkFVTFQgOiAwOworCisJCWNhc2UgUlRDX1NFVF9USU1FOgorCisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkgcmV0dXJuIC1FQUNDRVM7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmd3RpbWUsIChzdHJ1Y3QgcnRjX3RpbWUgX191c2VyICopYXJnLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQljb252ZXJ0X3RvX2VmaV90aW1lKCZ3dGltZSwgJmVmdCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlZmlfcnRjX2xvY2ssIGZsYWdzKTsKKworCQkJc3RhdHVzID0gZWZpLnNldF90aW1lKCZlZnQpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZmlfcnRjX2xvY2ssZmxhZ3MpOworCisJCQlyZXR1cm4gc3RhdHVzID09IEVGSV9TVUNDRVNTID8gMCA6IC1FSU5WQUw7CisKKwkJY2FzZSBSVENfV0tBTE1fU0VUOgorCisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkgcmV0dXJuIC1FQUNDRVM7CisKKwkJCWV3cCA9IChzdHJ1Y3QgcnRjX3drYWxybSBfX3VzZXIgKilhcmc7CisKKwkJCWlmICggIGdldF91c2VyKGVuYWJsZWQsICZld3AtPmVuYWJsZWQpCisJCQkgICB8fCBjb3B5X2Zyb21fdXNlcigmd3RpbWUsICZld3AtPnRpbWUsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWNvbnZlcnRfdG9fZWZpX3RpbWUoJnd0aW1lLCAmZWZ0KTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVmaV9ydGNfbG9jaywgZmxhZ3MpOworCQkJLyoKKwkJCSAqIFhYWCBGaXhtZToKKwkJCSAqIEFzIG9mIEVGSSAwLjkyIHdpdGggdGhlIGZpcm13YXJlIEkgaGF2ZSBvbiBteQorCQkJICogbWFjaGluZSB0aGlzIGNhbGwgZG9lcyBub3Qgc2VlbSB0byB3b3JrIHF1aXRlCisJCQkgKiByaWdodAorCQkJICovCisJCQlzdGF0dXMgPSBlZmkuc2V0X3dha2V1cF90aW1lKChlZmlfYm9vbF90KWVuYWJsZWQsICZlZnQpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZmlfcnRjX2xvY2ssZmxhZ3MpOworCisJCQlyZXR1cm4gc3RhdHVzID09IEVGSV9TVUNDRVNTID8gMCA6IC1FSU5WQUw7CisKKwkJY2FzZSBSVENfV0tBTE1fUkQ6CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlZmlfcnRjX2xvY2ssIGZsYWdzKTsKKworCQkJc3RhdHVzID0gZWZpLmdldF93YWtldXBfdGltZSgoZWZpX2Jvb2xfdCAqKSZlbmFibGVkLCAoZWZpX2Jvb2xfdCAqKSZwZW5kaW5nLCAmZWZ0KTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWZpX3J0Y19sb2NrLGZsYWdzKTsKKworCQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKwkJCWV3cCA9IChzdHJ1Y3QgcnRjX3drYWxybSBfX3VzZXIgKilhcmc7CisKKwkJCWlmICggIHB1dF91c2VyKGVuYWJsZWQsICZld3AtPmVuYWJsZWQpCisJCQkgICB8fCBwdXRfdXNlcihwZW5kaW5nLCAmZXdwLT5wZW5kaW5nKSkgcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWNvbnZlcnRfZnJvbV9lZmlfdGltZSgmZWZ0LCAmd3RpbWUpOworCisJCQlyZXR1cm4gY29weV90b191c2VyKCZld3AtPnRpbWUsICZ3dGltZSwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSA/IC1FRkFVTFQgOiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqCVdlIGVuZm9yY2Ugb25seSBvbmUgdXNlciBhdCBhIHRpbWUgaGVyZSB3aXRoIHRoZSBvcGVuL2Nsb3NlLgorICoJQWxzbyBjbGVhciB0aGUgcHJldmlvdXMgaW50ZXJydXB0IGRhdGEgb24gYW4gb3BlbiwgYW5kIGNsZWFuCisgKgl1cCB0aGluZ3Mgb24gYSBjbG9zZS4KKyAqLworCitzdGF0aWMgaW50CitlZmlfcnRjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKiBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZQorCSAqIFdlIGRvIGFjY2VwdCBtdWx0aXBsZSBvcGVuIGZpbGVzIGF0IHRoZSBzYW1lIHRpbWUgYXMgd2UKKwkgKiBzeW5jaHJvbml6ZSBvbiB0aGUgcGVyIGNhbGwgb3BlcmF0aW9uLgorCSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlZmlfcnRjX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisvKgorICoJVGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHdlIHN1cHBvcnQuCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZWZpX3J0Y19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gZWZpX3J0Y19pb2N0bCwKKwkub3BlbgkJPSBlZmlfcnRjX29wZW4sCisJLnJlbGVhc2UJPSBlZmlfcnRjX2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGVmaV9ydGNfZGV2PQoreworCUVGSV9SVENfTUlOT1IsCisJImVmaXJ0YyIsCisJJmVmaV9ydGNfZm9wcworfTsKKworLyoKKyAqCVdlIGV4cG9ydCBSQVcgRUZJIGluZm9ybWF0aW9uIHRvIC9wcm9jL2RyaXZlci9lZmlydGMKKyAqLworc3RhdGljIGludAorZWZpX3J0Y19nZXRfc3RhdHVzKGNoYXIgKmJ1ZikKK3sKKwllZmlfdGltZV90IAllZnQsIGFsbTsKKwllZmlfdGltZV9jYXBfdAljYXA7CisJY2hhcgkJKnAgPSBidWY7CisJZWZpX2Jvb2xfdAllbmFibGVkLCBwZW5kaW5nOwkKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJbWVtc2V0KCZlZnQsIDAsIHNpemVvZihlZnQpKTsKKwltZW1zZXQoJmFsbSwgMCwgc2l6ZW9mKGFsbSkpOworCW1lbXNldCgmY2FwLCAwLCBzaXplb2YoY2FwKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWZpX3J0Y19sb2NrLCBmbGFncyk7CisKKwllZmkuZ2V0X3RpbWUoJmVmdCwgJmNhcCk7CisJZWZpLmdldF93YWtldXBfdGltZSgmZW5hYmxlZCwgJnBlbmRpbmcsICZhbG0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWZpX3J0Y19sb2NrLGZsYWdzKTsKKworCXAgKz0gc3ByaW50ZihwLAorCQkgICAgICJUaW1lICAgICAgICAgICA6ICV1OiV1OiV1LiUwOXVcbiIKKwkJICAgICAiRGF0ZSAgICAgICAgICAgOiAldS0ldS0ldVxuIgorCQkgICAgICJEYXlsaWdodCAgICAgICA6ICV1XG4iLAorCQkgICAgIGVmdC5ob3VyLCBlZnQubWludXRlLCBlZnQuc2Vjb25kLCBlZnQubmFub3NlY29uZCwgCisJCSAgICAgZWZ0LnllYXIsIGVmdC5tb250aCwgZWZ0LmRheSwKKwkJICAgICBlZnQuZGF5bGlnaHQpOworCisJaWYgKGVmdC50aW1lem9uZSA9PSBFRklfVU5TUEVDSUZJRURfVElNRVpPTkUpCisJCXAgKz0gc3ByaW50ZihwLCAiVGltZXpvbmUgICAgICAgOiB1bnNwZWNpZmllZFxuIik7CisJZWxzZQorCQkvKiBYWFggZml4bWU6IGNvbnZlcnQgdG8gc3RyaW5nPyAqLworCQlwICs9IHNwcmludGYocCwgIlRpbWV6b25lICAgICAgIDogJXVcbiIsIGVmdC50aW1lem9uZSk7CisJCQorCisJcCArPSBzcHJpbnRmKHAsCisJCSAgICAgIkFsYXJtIFRpbWUgICAgIDogJXU6JXU6JXUuJTA5dVxuIgorCQkgICAgICJBbGFybSBEYXRlICAgICA6ICV1LSV1LSV1XG4iCisJCSAgICAgIkFsYXJtIERheWxpZ2h0IDogJXVcbiIKKwkJICAgICAiRW5hYmxlZCAgICAgICAgOiAlc1xuIgorCQkgICAgICJQZW5kaW5nICAgICAgICA6ICVzXG4iLAorCQkgICAgIGFsbS5ob3VyLCBhbG0ubWludXRlLCBhbG0uc2Vjb25kLCBhbG0ubmFub3NlY29uZCwgCisJCSAgICAgYWxtLnllYXIsIGFsbS5tb250aCwgYWxtLmRheSwgCisJCSAgICAgYWxtLmRheWxpZ2h0LAorCQkgICAgIGVuYWJsZWQgPT0gMSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgICBwZW5kaW5nID09IDEgPyAieWVzIiA6ICJubyIpOworCisJaWYgKGVmdC50aW1lem9uZSA9PSBFRklfVU5TUEVDSUZJRURfVElNRVpPTkUpCisJCXAgKz0gc3ByaW50ZihwLCAiVGltZXpvbmUgICAgICAgOiB1bnNwZWNpZmllZFxuIik7CisJZWxzZQorCQkvKiBYWFggZml4bWU6IGNvbnZlcnQgdG8gc3RyaW5nPyAqLworCQlwICs9IHNwcmludGYocCwgIlRpbWV6b25lICAgICAgIDogJXVcbiIsIGFsbS50aW1lem9uZSk7CisKKwkvKgorCSAqIG5vdyBwcmludHMgdGhlIGNhcGFiaWxpdGllcworCSAqLworCXAgKz0gc3ByaW50ZihwLAorCQkgICAgICJSZXNvbHV0aW9uICAgICA6ICV1XG4iCisJCSAgICAgIkFjY3VyYWN5ICAgICAgIDogJXVcbiIKKwkJICAgICAiU2V0c3RvWmVybyAgICAgOiAldVxuIiwKKwkJICAgICAgY2FwLnJlc29sdXRpb24sIGNhcC5hY2N1cmFjeSwgY2FwLnNldHNfdG9femVybyk7CisKKwlyZXR1cm4gIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQKK2VmaV9ydGNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgaW50IGxlbiA9IGVmaV9ydGNfZ2V0X3N0YXR1cyhwYWdlKTsKKyAgICAgICAgaWYgKGxlbiA8PSBvZmYrY291bnQpICplb2YgPSAxOworICAgICAgICAqc3RhcnQgPSBwYWdlICsgb2ZmOworICAgICAgICBsZW4gLT0gb2ZmOworICAgICAgICBpZiAobGVuPmNvdW50KSBsZW4gPSBjb3VudDsKKyAgICAgICAgaWYgKGxlbjwwKSBsZW4gPSAwOworICAgICAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IF9faW5pdCAKK2VmaV9ydGNfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXI7CisKKwlwcmludGsoS0VSTl9JTkZPICJFRkkgVGltZSBTZXJ2aWNlcyBEcml2ZXIgdiVzXG4iLCBFRklfUlRDX1ZFUlNJT04pOworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmZWZpX3J0Y19kZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlZmlydGM6IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCisJCQkJRUZJX1JUQ19NSU5PUik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGlyID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAoImRyaXZlci9lZmlydGMiLCAwLCBOVUxMLAorCQkJICAgICAgICAgICAgICBlZmlfcnRjX3JlYWRfcHJvYywgTlVMTCk7CisJaWYgKGRpciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWZpcnRjOiBjYW4ndCBjcmVhdGUgL3Byb2MvZHJpdmVyL2VmaXJ0Yy5cbiIpOworCQltaXNjX2RlcmVnaXN0ZXIoJmVmaV9ydGNfZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitlZmlfcnRjX2V4aXQodm9pZCkKK3sKKwkvKiBub3QgeWV0IHVzZWQgKi8KK30KKworbW9kdWxlX2luaXQoZWZpX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KGVmaV9ydGNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lcGNhLmMgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjVlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCkBAIC0wLDAgKzEsMzc4OSBAQAorLyoKKworIAorCUNvcHlyaWdodCAoQykgMTk5NiAgRGlnaSBJbnRlcm5hdGlvbmFsLgorIAorCUZvciB0ZWNobmljYWwgc3VwcG9ydCBwbGVhc2UgZW1haWwgZGlnaUxpbnV4QGRnaWkuY29tIG9yCisJY2FsbCBEaWdpIHRlY2ggc3VwcG9ydCBhdCAoNjEyKSA5MTItMzQ1NgorCisJTXVjaCBvZiB0aGlzIGRlc2lnbiBhbmQgY29kZSBjYW1lIGZyb20gZXBjYS5jIHdoaWNoIHdhcyAKKwljb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgVHJveSBEZSBKb25naCwgYW5kIHN1YnNxdWVudGx5IAorCW1vZGlmaWVkIGJ5IERhdmlkIE51Z2VudCwgQ2hyaXN0b3BoIExhbWV0ZXIsIE1pa2UgTWNMYWdhbi4gCisgCisgCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIAlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIAlhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIAlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBTZWUgUkVBRE1FLmVwY2EgZm9yIGNoYW5nZSBoaXN0b3J5IC0tREFUKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCisjZGVmaW5lIEVOQUJMRV9QQ0kKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyNkZWZpbmUgcHV0VXNlcihhcmcxLCBhcmcyKSBwdXRfdXNlcihhcmcxLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcyKQorI2RlZmluZSBnZXRVc2VyKGFyZzEsIGFyZzIpIGdldF91c2VyKGFyZzEsICh1bnNpZ25lZCBfX3VzZXIgKilhcmcyKQorCisjaWZkZWYgRU5BQkxFX1BDSQorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgImRpZ2lQQ0kuaCIKKyNlbmRpZiAvKiBFTkFCTEVfUENJICovCisKKyNpbmNsdWRlICJkaWdpMS5oIgorI2luY2x1ZGUgImRpZ2lGZXAxLmgiCisjaW5jbHVkZSAiZXBjYS5oIgorI2luY2x1ZGUgImVwY2Fjb25maWcuaCIKKworI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKKyMgIGVycm9yIEZJWE1FOiB0aGlzIGRyaXZlciBvbmx5IHdvcmtzIG9uIDMyLWJpdCBwbGF0Zm9ybXMKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVkVSU0lPTiAgICAgICAgICAgICIxLjMuMC4xLUxLIgorCisvKiBUaGlzIG1ham9yIG5lZWRzIHRvIGJlIHN1Ym1pdHRlZCB0byBMaW51eCB0byBqb2luIHRoZSBtYWpvcnMgbGlzdCAqLworCisjZGVmaW5lIERJR0lJTkZPTUFKT1IgICAgICAgMzUgIC8qIEZvciBEaWdpIHNwZWNpZmljIGlvY3RsICovIAorCisKKyNkZWZpbmUgTUFYQ0FSRFMgNworI2RlZmluZSBlcGNhYXNzZXJ0KHgsIG1zZykgIGlmICghKHgpKSBlcGNhX2Vycm9yKF9fTElORV9fLCBtc2cpCisKKyNkZWZpbmUgUEZYICJlcGNhOiAiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGdsb2JhbCBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjaGFyIG1lc2dbMTAwXTsKK3N0YXRpYyBpbnQgbmJkZXZzLCBudW1fY2FyZHMsIGxpbG9jb25maWc7CitzdGF0aWMgaW50IGRpZ2lfcG9sbGVyX2luaGliaXRlZCA9IDEgOworCitzdGF0aWMgaW50IHNldHVwX2Vycm9yX2NvZGU7CitzdGF0aWMgaW50IGludmFsaWRfbGlsb19jb25maWc7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUFYQk9BUkRTIGlzIHR5cGljYWxseSAxMiwgYnV0IElTQSBhbmQgRUlTQSBjYXJkcyBhcmUgcmVzdHJpY3RlZCB0byAKKwk3IGJlbG93LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHN0cnVjdCBib2FyZF9pbmZvIGJvYXJkc1tNQVhCT0FSRFNdOworCisKKy8qIC0tLS0tLS0tLS0tLS0gQmVnaW4gc3RydWN0dXJlcyB1c2VkIGZvciBkcml2ZXIgcmVnaXN0ZXJhdGlvbiAtLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcGNfZHJpdmVyOworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpwY19pbmZvOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gRGlnaSBzcGVjaWZpYyBzdHJ1Y3R1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWRpZ2lfY2hhbm5lbHMgcmVwcmVzZW50cyBhbiBhcnJheSBvZiBzdHJ1Y3R1cmVzIHRoYXQga2VlcCB0cmFjayBvZgorCWVhY2ggY2hhbm5lbCBvZiB0aGUgRGlnaSBwcm9kdWN0LiAgSW5mb3JtYXRpb24gc3VjaCBhcyB0cmFuc21pdCBhbmQKKwlyZWNlaXZlIHBvaW50ZXJzLCB0ZXJtaW8gZGF0YSwgYW5kIHNpZ25hbCBkZWZpbml0aW9ucyAoRFRSLCBDVFMsIGV0YyAuLi4pCisJYXJlIHN0b3JlZCBoZXJlLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgTk9UIHVzZWQgdG8gb3ZlcmxheSB0aGUgY2FyZHMgCisJcGh5c2ljYWwgY2hhbm5lbCBzdHJ1Y3R1cmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAKK3N0YXRpYyBzdHJ1Y3QgY2hhbm5lbCBkaWdpX2NoYW5uZWxzW01BWF9BTExPQ107CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhcmRfcHRyIGlzIGFuIGFycmF5IHVzZWQgdG8gaG9sZCB0aGUgYWRkcmVzcyBvZiB0aGUKKwlmaXJzdCBjaGFubmVsIHN0cnVjdHVyZSBvZiBlYWNoIGNhcmQuICBUaGlzIGFycmF5IHdpbGwgaG9sZAorCXRoZSBhZGRyZXNzZXMgb2YgdmFyaW91cyBjaGFubmVscyBsb2NhdGVkIGluIGRpZ2lfY2hhbm5lbHMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCBjaGFubmVsICpjYXJkX3B0cltNQVhDQVJEU107CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBlcGNhX3RpbWVyOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlCZWdpbiBnZW5lcmljIG1lbW9yeSBmdW5jdGlvbnMuICBUaGVzZSBmdW5jdGlvbnMgd2lsbCBiZSBhbGlhcworCShwb2ludCBhdCkgbW9yZSBzcGVjaWZpYyBmdW5jdGlvbnMgZGVwZW5kZW50IG9uIHRoZSBib2FyZCBiZWluZworCWNvbmZpZ3VyZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCQorc3RhdGljIGlubGluZSB2b2lkIG1lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIGlubGluZSB2b2lkIGdsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHR4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKKworLyogLS0tLSBCZWdpbiBtb3JlICdzcGVjaWZpYycgbWVtb3J5IGZ1bmN0aW9ucyBmb3IgY3hfbGlrZSBwcm9kdWN0cyAtLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKKworLyogLS0tLS0tIEJlZ2luIG1vcmUgJ3NwZWNpZmljJyBtZW1vcnkgZnVuY3Rpb25zIGZvciB0aGUgcGN4ZSAtLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CisKKy8qIC0tLS0gQmVnaW4gbW9yZSAnc3BlY2lmaWMnIG1lbW9yeSBmdW5jdGlvbnMgZm9yIHRoZSBwYzY0eGUgYW5kIHBjeGkgLS0tLSAqLworLyogTm90ZSA6IHBjNjR4ZSBhbmQgcGN4aSBzaGFyZSB0aGUgc2FtZSB3aW5kb3dpbmcgcm91dGluZXMgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKKworLyogLSBCZWdpbiAnc3BlY2lmaWMnIGRvIG5vdGhpbmcgbWVtb3J5IGZ1bmN0aW9ucyBuZWVkZWQgZm9yIHNvbWUgY2FyZHMgLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X2Fzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X2Fzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRlY2xhcmUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNoYW5uZWwgKnZlcmlmeUNoYW5uZWwocmVnaXN0ZXIgc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgaW5saW5lIHZvaWQgcGNfc2NoZWRfZXZlbnQoc3RydWN0IGNoYW5uZWwgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGVwY2FfZXJyb3IoaW50LCBjaGFyICopOworc3RhdGljIHZvaWQgcGNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBzaHV0ZG93bihzdHJ1Y3QgY2hhbm5lbCAqKTsKK3N0YXRpYyB2b2lkIHBjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIHBjX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICosIHVuc2lnbmVkIGNoYXIpOworc3RhdGljIGludCBwY193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIGludCBwY19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBwY19mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBwY19mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY2hhbm5lbCAqKTsKK3N0YXRpYyBpbnQgcGNfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyB2b2lkIHBvc3RfZmVwX2luaXQodW5zaWduZWQgaW50IGNyZCk7CitzdGF0aWMgdm9pZCBlcGNhcG9sbCh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIGRvZXZlbnQoaW50KTsKK3N0YXRpYyB2b2lkIGZlcGNtZChzdHJ1Y3QgY2hhbm5lbCAqLCBpbnQsIGludCwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgdW5zaWduZWQgdGVybWlvczJkaWdpX2goc3RydWN0IGNoYW5uZWwgKmNoLCB1bnNpZ25lZCk7CitzdGF0aWMgdW5zaWduZWQgdGVybWlvczJkaWdpX2koc3RydWN0IGNoYW5uZWwgKmNoLCB1bnNpZ25lZCk7CitzdGF0aWMgdW5zaWduZWQgdGVybWlvczJkaWdpX2Moc3RydWN0IGNoYW5uZWwgKmNoLCB1bnNpZ25lZCk7CitzdGF0aWMgdm9pZCBlcGNhcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGNoYW5uZWwgKik7CitzdGF0aWMgdm9pZCByZWNlaXZlX2RhdGEoc3RydWN0IGNoYW5uZWwgKik7CitzdGF0aWMgaW50IHBjX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IGluZm9faW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHBjX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCB0ZXJtaW9zICopOworc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICopOworc3RhdGljIHZvaWQgcGNfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIHBjX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgcGNfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOworc3RhdGljIHZvaWQgcGNfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRpZ2lfc2VuZF9icmVhayhzdHJ1Y3QgY2hhbm5lbCAqY2gsIGludCBtc2VjKTsKK3N0YXRpYyB2b2lkIHNldHVwX2VtcHR5X2V2ZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBjaGFubmVsICpjaCk7Cit2b2lkIGVwY2Ffc2V0dXAoY2hhciAqLCBpbnQgKik7Cit2b2lkIGNvbnNvbGVfcHJpbnQoY29uc3QgY2hhciAqKTsKKworc3RhdGljIGludCBnZXRfdGVybWlvKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCB0ZXJtaW8gX191c2VyICopOworc3RhdGljIGludCBwY193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CitpbnQgcGNfaW5pdCh2b2lkKTsKKworI2lmZGVmIEVOQUJMRV9QQ0kKK3N0YXRpYyBpbnQgaW5pdF9QQ0kodm9pZCk7CisjZW5kaWYgLyogRU5BQkxFX1BDSSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVRhYmxlIG9mIGZ1bmN0aW9ucyBmb3IgZWFjaCBib2FyZCB0byBoYW5kbGUgbWVtb3J5LiAgTWFudGFpbmluZyAKKwlwYXJhbGxlbGlzbSBpcyBhICp2ZXJ5KiBnb29kIGlkZWEgaGVyZS4gIFRoZSBpZGVhIGlzIGZvciB0aGUgCisJcnVudGltZSBjb2RlIHRvIGJsaW5kbHkgY2FsbCB0aGVzZSBmdW5jdGlvbnMsIG5vdCBrbm93aW5nL2NhcmluZyAgICAKKwlhYm91dCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZS4gIFRoaXMgc3R1ZmYgc2hvdWxkIGNvbnRhaW4gbm8KKwljb25kaXRpb25hbHM7IGlmIG1vcmUgZnVuY3Rpb25hbGl0eSBpcyBuZWVkZWQgYSBkaWZmZXJlbnQgZW50cnkKKwlzaG91bGQgYmUgZXN0YWJsaXNoZWQuICBUaGVzZSBjYWxscyBhcmUgdGhlIGludGVyZmFjZSBjYWxscyBhbmQgCisJYXJlIHRoZSBvbmx5IGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBhY2Nlc3NlZC4gIEFueW9uZSBjYXVnaHQKKwltYWtpbmcgZGlyZWN0IGNhbGxzIGRlc2VydmVzIHdoYXQgdGhleSBnZXQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7CisJKGItPm1lbXdpbm9uKShiLCB3aW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworCShiLT5tZW13aW5vZmYpKGIsIHdpbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJKGNoLT5ib2FyZC0+Z2xvYmFsd2lub24pKGNoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCShjaC0+Ym9hcmQtPnJ4d2lub24pKGNoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHR4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCShjaC0+Ym9hcmQtPnR4d2lub24pKGNoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJKGNoLT5ib2FyZC0+bWVtb2ZmKShjaCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0Z3dpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwkoY2gtPmJvYXJkLT5hc3NlcnRnd2lub24pKGNoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJKGNoLT5ib2FyZC0+YXNzZXJ0bWVtb2ZmKShjaCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBDWEVNIHdpbmRvd2luZyBpcyB0aGUgc2FtZSBhcyB0aGF0IHVzZWQgaW4gdGhlIFBDWFIgCisJYW5kIENYIHNlcmllcyBjYXJkcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7CisgICAgICAgIG91dGJfcChGRVBXSU58d2luLCAoaW50KWItPnBvcnQgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3sKKwlvdXRiX3AoMCwgKGludCliLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJb3V0Yl9wKCBGRVBXSU4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwlvdXRiX3AoY2gtPnJ4d2luLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJb3V0Yl9wKGNoLT50eHdpbiwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJb3V0Yl9wKDAsIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjeGUgbWVtb3J5IHdpbmRvdyBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7CisgICAgICAgICAgICAgICBvdXRiX3AoRkVQV0lOIHwgd2luLCAoaW50KWItPnBvcnQgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQoreworCW91dGJfcChpbmIoKGludCliLT5wb3J0KSAmIH5GRVBNRU0sCisJICAgICAgICAgICAoaW50KWItPnBvcnQgKyAxKTsKKwlvdXRiX3AoMCwgKGludCliLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwlvdXRiX3AoIEZFUFdJTiwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGVfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJCW91dGJfcChjaC0+cnh3aW4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworCQlvdXRiX3AoY2gtPnR4d2luLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcCgwLCAoaW50KWNoLT5ib2FyZC0+cG9ydCk7CisJb3V0Yl9wKDAsIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0gQmVnaW4gcGM2NHhlIGFuZCBwY3hpIG1lbW9yeSB3aW5kb3cgc3R1ZmYgLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7CisgICAgICAgICAgICAgICBvdXRiX3AoaW5iKChpbnQpYi0+cG9ydCkgfCBGRVBNRU0sIChpbnQpYi0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3sKKwlvdXRiX3AoaW5iKChpbnQpYi0+cG9ydCkgJiB+RkVQTUVNLCAoaW50KWItPnBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJb3V0Yl9wKEZFUE1FTSwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwkJb3V0Yl9wKEZFUE1FTSwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwkJb3V0Yl9wKEZFUE1FTSwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQoreworCW91dGJfcCgwLCAoaW50KWNoLT5ib2FyZC0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX2Fzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7CisJZXBjYWFzc2VydChpbmIoKGludCljaC0+Ym9hcmQtPnBvcnQpICYgRkVQTUVNLCAiR2xvYmFsIG1lbW9yeSBvZmYiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjeGlfYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKKwllcGNhYXNzZXJ0KCEoaW5iKChpbnQpY2gtPmJvYXJkLT5wb3J0KSAmIEZFUE1FTSksICJNZW1vcnkgb24iKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTm90IGFsbCBvZiB0aGUgY2FyZHMgbmVlZCBzcGVjaWZpYyBtZW1vcnkgd2luZG93aW5nIHJvdXRpbmVzLiAgU29tZQorCWNhcmRzIChTdWNoIGFzIFBDSSkgbmVlZHMgbm8gd2luZG93aW5nIHJvdXRpbmVzIGF0IGFsbC4gIFdlIHByb3ZpZGUKKwl0aGVzZSBkbyBub3RoaW5nIHJvdXRpbmVzIHNvIHRoYXQgdGhlIHNhbWUgY29kZSBiYXNlIGNhbiBiZSB1c2VkLgorCVRoZSBkcml2ZXIgd2lsbCBBTFdBWVMgY2FsbCBhIHdpbmRvd2luZyByb3V0aW5lIGlmIGl0IHRoaW5rcyBpdCBuZWVkcworCXRvOyByZWdhcmRsZXNzIG9mIHRoZSBjYXJkLiAgSG93ZXZlciwgZGVwZW5kZW50IG9uIHRoZSBjYXJkIHRoZSByb3V0aW5lCisJbWF5IG9yIG1heSBub3QgZG8gYW55dGhpbmcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bW15X2Fzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQoreworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiB2ZXJpZnlDaGFubmVsIGZ1bmN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjaGFubmVsICp2ZXJpZnlDaGFubmVsKHJlZ2lzdGVyIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHZlcmlmeUNoYW5uZWwgKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVRoaXMgcm91dGluZSBiYXNpY2FsbHkgcHJvdmlkZXMgYSBzYW5pdHkgY2hlY2suICBJdCBpbnN1cmVzIHRoYXQKKwkJdGhlIGNoYW5uZWwgcmV0dXJuZWQgaXMgd2l0aGluIHRoZSBwcm9wZXIgcmFuZ2Ugb2YgYWRkcmVzc2VzIGFzCisJCXdlbGwgYXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQuICBJZiBzb21lIGJvZ3VzIGluZm8gZ2V0cyBwYXNzZWQgaW4KKwkJdGhyb3VnaCB0dHktPmRyaXZlcl9kYXRhIHRoaXMgc2hvdWxkIGNhdGNoIGl0LgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKHR0eSkgCisJeyAvKiBCZWdpbiBpZiB0dHkgKi8KKworCQlyZWdpc3RlciBzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKil0dHktPmRyaXZlcl9kYXRhOworCisJCWlmICgoY2ggPj0gJmRpZ2lfY2hhbm5lbHNbMF0pICYmIChjaCA8ICZkaWdpX2NoYW5uZWxzW25iZGV2c10pKSAKKwkJeworCQkJaWYgKGNoLT5tYWdpYyA9PSBFUENBX01BR0lDKQorCQkJCXJldHVybiBjaDsKKwkJfQorCisJfSAvKiBFbmQgaWYgdHR5ICovCisKKwkvKiBFbHNlIHJldHVybiBhIE5VTEwgZm9yIGludmFsaWQgKi8KKwlyZXR1cm4gTlVMTDsKKworfSAvKiBFbmQgdmVyaWZ5Q2hhbm5lbCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfc2NoZWRfZXZlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGNfc2NoZWRfZXZlbnQoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgZXZlbnQpCit7IC8qIEJlZ2luIHBjX3NjaGVkX2V2ZW50ICovCisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJV2UgY2FsbCB0aGlzIHRvIHNjaGVkdWxlIGludGVycnVwdCBwcm9jZXNzaW5nIG9uIHNvbWUgZXZlbnQuICBUaGUgCisJCWtlcm5lbCBzZWVzIG91ciByZXF1ZXN0IGFuZCBjYWxscyB0aGUgcmVsYXRlZCByb3V0aW5lIGluIE9VUiBkcml2ZXIuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwljaC0+ZXZlbnQgfD0gMSA8PCBldmVudDsKKwlzY2hlZHVsZV93b3JrKCZjaC0+dHF1ZXVlKTsKKworCit9IC8qIEVuZCBwY19zY2hlZF9ldmVudCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZXBjYV9lcnJvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGVwY2FfZXJyb3IoaW50IGxpbmUsIGNoYXIgKm1zZykKK3sgLyogQmVnaW4gZXBjYV9lcnJvciAqLworCisJcHJpbnRrKEtFUk5fRVJSICJlcGNhX2Vycm9yIChEaWdpKTogbGluZSA9ICVkICVzXG4iLGxpbmUsbXNnKTsKKwlyZXR1cm47CisKK30gLyogRW5kIGVwY2FfZXJyb3IgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2Nsb3NlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIHBjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7IC8qIEJlZ2luIHBjX2Nsb3NlICovCisKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAorCXsgLyogQmVnaW4gaWYgY2ggIT0gTlVMTCAqLworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgCisJCXsKKwkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBjaGFubmVsIGlzIG9wZW4gbW9yZSB0aGFuIG9uY2UgKi8KKwkJaWYgKGNoLT5jb3VudC0tID4gMSkgCisJCXsgLyogQmVnaW4gY2hhbm5lbCBpcyBvcGVuIG1vcmUgdGhhbiBvbmNlICovCisKKwkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlSZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZy4gIFNvbWVvbmUgbWlnaHQgc3RpbGwgYmUgdXNpbmcKKwkJCQl0aGUgY2hhbm5lbC4KKwkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlyZXR1cm47CisJCX0gLyogRW5kIGNoYW5uZWwgaXMgb3BlbiBtb3JlIHRoYW4gb25jZSAqLworCisJCS8qIFBvcnQgb3BlbiBvbmx5IG9uY2UgZ28gYWhlYWQgd2l0aCBzaHV0ZG93biAmIHJlc2V0ICovCisKKwkJaWYgKGNoLT5jb3VudCA8IDApIAorCQl7CisJCQljaC0+Y291bnQgPSAwOworCQl9CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlMZXQgdGhlIHJlc3Qgb2YgdGhlIGRyaXZlciBrbm93IHRoZSBjaGFubmVsIGlzIGJlaW5nIGNsb3NlZC4KKwkJCVRoaXMgYmVjb21lcyBpbXBvcnRhbnQgaWYgYW4gb3BlbiBpcyBhdHRlbXB0ZWQgYmVmb3JlIGNsb3NlIAorCQkJaXMgZmluaXNoZWQuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisJCisJCXR0eS0+Y2xvc2luZyA9IDE7CisKKwkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIAorCQl7CisJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLworCQkJc2V0dXBfZW1wdHlfZXZlbnQodHR5LCBjaCk7CQkKKwkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAzMDAwKTsgLyogMzAgc2Vjb25kcyB0aW1lb3V0ICovCisJCX0KKwkKKwkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwkJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisJCXNodXRkb3duKGNoKTsKKwkJdHR5LT5jbG9zaW5nID0gMDsKKwkJY2gtPmV2ZW50ID0gMDsKKwkJY2gtPnR0eSA9IE5VTEw7CisKKwkJaWYgKGNoLT5ibG9ja2VkX29wZW4pIAorCQl7IC8qIEJlZ2luIGlmIGJsb2NrZWRfb3BlbiAqLworCisJCQlpZiAoY2gtPmNsb3NlX2RlbGF5KSAKKwkJCXsKKwkJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoLT5jbG9zZV9kZWxheSkpOworCQkJfQorCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOworCisJCX0gLyogRW5kIGlmIGJsb2NrZWRfb3BlbiAqLworCisJCWNoLT5hc3luY2ZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0lOSVRJQUxJWkVEIHwgCisJCSAgICAgICAgICAgICAgICAgICAgICBBU1lOQ19DTE9TSU5HKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2xvc2Vfd2FpdCk7CisKKworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCX0gLyogRW5kIGlmIGNoICE9IE5VTEwgKi8KKworfSAvKiBFbmQgcGNfY2xvc2UgKi8gCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBzaHV0ZG93biAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBzaHV0ZG93bihzdHJ1Y3QgY2hhbm5lbCAqY2gpCit7IC8qIEJlZ2luIHNodXRkb3duICovCisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCisJaWYgKCEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIAorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlnbG9iYWx3aW5vbihjaCk7CisKKwliYyA9IGNoLT5icmRjaGFuOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUluIG9yZGVyIGZvciBhbiBldmVudCB0byBiZSBnZW5lcmF0ZWQgb24gdGhlIHJlY2VpcHQgb2YgZGF0YSB0aGUKKwkJaWRhdGEgZmxhZyBtdXN0IGJlIHNldC4gU2luY2Ugd2UgYXJlIHNodXR0aW5nIGRvd24sIHRoaXMgaXMgbm90IAorCQluZWNlc3NhcnkgY2xlYXIgdGhpcyBmbGFnLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKKworCWlmIChiYykKKwkJYmMtPmlkYXRhID0gMDsKKworCXR0eSA9IGNoLT50dHk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgSWYgd2UncmUgYSBtb2RlbSBjb250cm9sIGRldmljZSBhbmQgSFVQQ0wgaXMgb24sIGRyb3AgUlRTICYgRFRSLgorIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgCisJeworCQljaC0+b21vZGVtICY9IH4oY2gtPm1fcnRzIHwgY2gtPm1fZHRyKTsKKwkJZmVwY21kKGNoLCBTRVRNT0RFTSwgMCwgY2gtPm1fZHRyIHwgY2gtPm1fcnRzLCAxMCwgMSk7CisJfQorCisJbWVtb2ZmKGNoKTsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGUgY2hhbm5lbCBoYXMgb2ZmaWNpYWx5IGJlZW4gY2xvc2VkLiAgVGhlIG5leHQgdGltZSBpdCBpcyBvcGVuZWQKKwkJaXQgd2lsbCBoYXZlIHRvIHJlaW5pdGlhbGl6ZWQuICBTZXQgYSBmbGFnIHRvIGluZGljYXRlIHRoaXMuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogUHJldmVudCBmdXR1cmUgRGlnaSBwcm9ncmFtbWVkIGludGVycnVwdHMgZnJvbSBjb21pbmcgYWN0aXZlICovCisKKwljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKK30gLyogRW5kIHNodXRkb3duICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19oYW5ndXAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGNfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHBjX2hhbmd1cCAqLworCisJc3RydWN0IGNoYW5uZWwgKmNoOworCQorCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAorCXsgLyogQmVnaW4gaWYgY2ggIT0gTlVMTCAqLworCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc2F2ZV9mbGFncyhmbGFncyk7CisJCWNsaSgpOworCQlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisJCXNodXRkb3duKGNoKTsKKworCQljaC0+dHR5ICAgPSBOVUxMOworCQljaC0+ZXZlbnQgPSAwOworCQljaC0+Y291bnQgPSAwOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJY2gtPmFzeW5jZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFIHwgQVNZTkNfSU5JVElBTElaRUQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOworCisJfSAvKiBFbmQgaWYgY2ggIT0gTlVMTCAqLworCit9IC8qIEVuZCBwY19oYW5ndXAgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX3dyaXRlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ5dGVzQXZhaWxhYmxlKQoreyAvKiBCZWdpbiBwY193cml0ZSAqLworCisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGhlYWQsIHRhaWw7CisJcmVnaXN0ZXIgaW50IGRhdGFMZW47CisJcmVnaXN0ZXIgaW50IHNpemU7CisJcmVnaXN0ZXIgaW50IGFtb3VudENvcGllZDsKKworCisJc3RydWN0IGNoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlbWFpbjsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJcGNfd3JpdGUgaXMgcHJpbWFyaWx5IGNhbGxlZCBkaXJlY3RseSBieSB0aGUga2VybmVsIHJvdXRpbmUKKwkJdHR5X3dyaXRlIChUaG91Z2ggaXQgY2FuIGFsc28gYmUgY2FsbGVkIGJ5IHB1dF9jaGFyKSBmb3VuZCBpbgorCQl0dHlfaW8uYy4gIHBjX3dyaXRlIGlzIHBhc3NlZCBhIGxpbmUgZGlzY2lwbGluZSBidWZmZXIgd2hlcmUgCisJCXRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3V0IGlzIHN0b3JlZC4gIFRoZSBsaW5lIGRpc2NpcGxpbmUgCisJCWltcGxlbWVudGF0aW9uIGl0c2VsZiBpcyBkb25lIGF0IHRoZSBrZXJuZWwgbGV2ZWwgYW5kIGlzIG5vdCAKKwkJYnJvdWdodCBpbnRvIHRoZSBkcml2ZXIuICAKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIE1ha2UgYSBwb2ludGVyIHRvIHRoZSBjaGFubmVsIGRhdGEgc3RydWN0dXJlIGZvdW5kIG9uIHRoZSBib2FyZC4gKi8KKworCWJjICAgPSBjaC0+YnJkY2hhbjsKKwlzaXplID0gY2gtPnR4YnVmc2l6ZTsKKworCWFtb3VudENvcGllZCA9IDA7CisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwlnbG9iYWx3aW5vbihjaCk7CisKKwloZWFkID0gYmMtPnRpbiAmIChzaXplIC0gMSk7CisJdGFpbCA9IGJjLT50b3V0OworCisJaWYgKHRhaWwgIT0gYmMtPnRvdXQpCisJCXRhaWwgPSBiYy0+dG91dDsKKwl0YWlsICY9IChzaXplIC0gMSk7CisKKwkvKglJZiBoZWFkID49IHRhaWwsIGhlYWQgaGFzIG5vdCB3cmFwcGVkIGFyb3VuZC4gKi8gCisJaWYgKGhlYWQgPj0gdGFpbCkgCisJeyAvKiBCZWdpbiBoZWFkIGhhcyBub3Qgd3JhcHBlZCAqLworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJcmVtYWluIChtdWNoIGxpa2UgZGF0YUxlbiBhYm92ZSkgcmVwcmVzZW50cyB0aGUgdG90YWwgYW1vdW50IG9mCisJCQlzcGFjZSBhdmFpbGFibGUgb24gdGhlIGNhcmQgZm9yIGRhdGEuICBIZXJlIGRhdGFMZW4gcmVwcmVzZW50cworCQkJdGhlIHNwYWNlIGV4aXN0aW5nIGJldHdlZW4gdGhlIGhlYWQgcG9pbnRlciBhbmQgdGhlIGVuZCBvZiAKKwkJCWJ1ZmZlci4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgYSBtZW1jcHkgY2Fubm90IGJlIHRvbGQgdG8KKwkJCWF1dG9tYXRpY2FsbHkgd3JhcCBhcm91bmQgd2hlbiBpdCBoaXRzIHRoZSBidWZmZXIgZW5kLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisKKwkJZGF0YUxlbiA9IHNpemUgLSBoZWFkOworCQlyZW1haW4gPSBzaXplIC0gKGhlYWQgLSB0YWlsKSAtIDE7CisKKwl9IC8qIEVuZCBoZWFkIGhhcyBub3Qgd3JhcHBlZCAqLworCWVsc2UgCisJeyAvKiBCZWdpbiBoZWFkIGhhcyB3cmFwcGVkIGFyb3VuZCAqLworCisJCXJlbWFpbiA9IHRhaWwgLSBoZWFkIC0gMTsKKwkJZGF0YUxlbiA9IHJlbWFpbjsKKworCX0gLyogRW5kIGhlYWQgaGFzIHdyYXBwZWQgYXJvdW5kICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlDaGVjayB0aGUgc3BhY2Ugb24gdGhlIGNhcmQuICBJZiB3ZSBoYXZlIG1vcmUgZGF0YSB0aGFuIAorCQkJc3BhY2U7IHJlZHVjZSB0aGUgYW1vdW50IG9mIGRhdGEgdG8gZml0IHRoZSBzcGFjZS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlieXRlc0F2YWlsYWJsZSA9IG1pbihyZW1haW4sIGJ5dGVzQXZhaWxhYmxlKTsKKworCXR4d2lub24oY2gpOworCXdoaWxlIChieXRlc0F2YWlsYWJsZSA+IDApIAorCXsgLyogQmVnaW4gd2hpbGUgdGhlcmUgaXMgZGF0YSB0byBjb3B5IG9udG8gY2FyZCAqLworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlJZiBoZWFkIGlzIG5vdCB3cmFwcGVkLCB0aGUgYmVsb3cgd2lsbCBtYWtlIHN1cmUgdGhlIGZpcnN0IAorCQkJZGF0YSBjb3B5IGZpbGxzIHRvIHRoZSBlbmQgb2YgY2FyZCBidWZmZXIuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlkYXRhTGVuID0gbWluKGJ5dGVzQXZhaWxhYmxlLCBkYXRhTGVuKTsKKwkJbWVtY3B5KGNoLT50eHB0ciArIGhlYWQsIGJ1ZiwgZGF0YUxlbik7CisJCWJ1ZiArPSBkYXRhTGVuOworCQloZWFkICs9IGRhdGFMZW47CisJCWFtb3VudENvcGllZCArPSBkYXRhTGVuOworCQlieXRlc0F2YWlsYWJsZSAtPSBkYXRhTGVuOworCisJCWlmIChoZWFkID49IHNpemUpIAorCQl7CisJCQloZWFkID0gMDsKKwkJCWRhdGFMZW4gPSB0YWlsOworCQl9CisKKwl9IC8qIEVuZCB3aGlsZSB0aGVyZSBpcyBkYXRhIHRvIGNvcHkgb250byBjYXJkICovCisKKwljaC0+c3RhdHVzZmxhZ3MgfD0gVFhCVVNZOworCWdsb2JhbHdpbm9uKGNoKTsKKwliYy0+dGluID0gaGVhZDsKKworCWlmICgoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgPT0gMCkgCisJeworCQljaC0+c3RhdHVzZmxhZ3MgfD0gTE9XV0FJVDsKKwkJYmMtPmlsb3cgPSAxOworCX0KKwltZW1vZmYoY2gpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKGFtb3VudENvcGllZCk7CisKK30gLyogRW5kIHBjX3dyaXRlICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19wdXRfY2hhciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGMpCit7IC8qIEJlZ2luIHBjX3B1dF9jaGFyICovCisKKyAgIAorCXBjX3dyaXRlKHR0eSwgJmMsIDEpOworCXJldHVybjsKKworfSAvKiBFbmQgcGNfcHV0X2NoYXIgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX3dyaXRlX3Jvb20gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBwY193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHBjX3dyaXRlX3Jvb20gKi8KKworCWludCByZW1haW47CisJc3RydWN0IGNoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGhlYWQsIHRhaWw7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCisJcmVtYWluID0gMDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAorCXsKKwkJc2F2ZV9mbGFncyhmbGFncyk7CisJCWNsaSgpOworCQlnbG9iYWx3aW5vbihjaCk7CisKKwkJYmMgICA9IGNoLT5icmRjaGFuOworCQloZWFkID0gYmMtPnRpbiAmIChjaC0+dHhidWZzaXplIC0gMSk7CisJCXRhaWwgPSBiYy0+dG91dDsKKworCQlpZiAodGFpbCAhPSBiYy0+dG91dCkKKwkJCXRhaWwgPSBiYy0+dG91dDsKKwkJLyogV3JhcCB0YWlsIGlmIG5lY2Vzc2FyeSAqLworCQl0YWlsICY9IChjaC0+dHhidWZzaXplIC0gMSk7CisKKwkJaWYgKChyZW1haW4gPSB0YWlsIC0gaGVhZCAtIDEpIDwgMCApCisJCQlyZW1haW4gKz0gY2gtPnR4YnVmc2l6ZTsKKworCQlpZiAocmVtYWluICYmIChjaC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKSA9PSAwKSAKKwkJeworCQkJY2gtPnN0YXR1c2ZsYWdzIHw9IExPV1dBSVQ7CisJCQliYy0+aWxvdyA9IDE7CisJCX0KKwkJbWVtb2ZmKGNoKTsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJfQorCisJLyogUmV0dXJuIGhvdyBtdWNoIHJvb20gaXMgbGVmdCBvbiBjYXJkICovCisJcmV0dXJuIHJlbWFpbjsKKworfSAvKiBFbmQgcGNfd3JpdGVfcm9vbSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfY2hhcnNfaW5fYnVmZmVyICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHBjX2NoYXJzX2luX2J1ZmZlciAqLworCisJaW50IGNoYXJzOworCXVuc2lnbmVkIGludCBjdGFpbCwgaGVhZCwgdGFpbDsKKwlpbnQgcmVtYWluOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNoYW5uZWwgKmNoOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgPT0gTlVMTCkKKwkJcmV0dXJuKDApOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJZ2xvYmFsd2lub24oY2gpOworCisJYmMgPSBjaC0+YnJkY2hhbjsKKwl0YWlsID0gYmMtPnRvdXQ7CisJaGVhZCA9IGJjLT50aW47CisJY3RhaWwgPSBjaC0+bWFpbGJveC0+Y291dDsKKworCWlmICh0YWlsID09IGhlYWQgJiYgY2gtPm1haWxib3gtPmNpbiA9PSBjdGFpbCAmJiBiYy0+dGJ1c3kgPT0gMCkKKwkJY2hhcnMgPSAwOworCWVsc2UgCisJeyAvKiBCZWdpbiBpZiBzb21lIHNwYWNlIG9uIHRoZSBjYXJkIGhhcyBiZWVuIHVzZWQgKi8KKworCQloZWFkID0gYmMtPnRpbiAmIChjaC0+dHhidWZzaXplIC0gMSk7CisJCXRhaWwgJj0gKGNoLT50eGJ1ZnNpemUgLSAxKTsKKworCQkvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCVRoZSBsb2dpYyBoZXJlIGlzIGJhc2ljYWxseSBvcHBvc2l0ZSBvZiB0aGUgYWJvdmUgcGNfd3JpdGVfcm9vbQorCQkJaGVyZSB3ZSBhcmUgZmluZGluZyB0aGUgYW1vdW50IG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgZmlsbGVkLgorCQkJTm90IHRoZSBhbW91bnQgb2YgYnl0ZXMgZW1wdHkuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlpZiAoKHJlbWFpbiA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwICkKKwkJCXJlbWFpbiArPSBjaC0+dHhidWZzaXplOworCisJCWNoYXJzID0gKGludCkoY2gtPnR4YnVmc2l6ZSAtIHJlbWFpbik7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisJCQlNYWtlIGl0IHBvc3NpYmxlIHRvIHdha2V1cCBhbnl0aGluZyB3YWl0aW5nIGZvciBvdXRwdXQKKwkJCWluIHR0eV9pb2N0bC5jLCBldGMuCisKKwkJCUlmIG5vdCBhbHJlYWR5IHNldC4gIFNldHVwIGFuIGV2ZW50IHRvIGluZGljYXRlIHdoZW4gdGhlCisJCQl0cmFuc21pdCBidWZmZXIgZW1wdGllcyAKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlpZiAoIShjaC0+c3RhdHVzZmxhZ3MgJiBFTVBUWVdBSVQpKQorCQkJc2V0dXBfZW1wdHlfZXZlbnQodHR5LGNoKTsKKworCX0gLyogRW5kIGlmIHNvbWUgc3BhY2Ugb24gdGhlIGNhcmQgaGFzIGJlZW4gdXNlZCAqLworCisJbWVtb2ZmKGNoKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCS8qIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyByZXNpZGluZyBvbiBjYXJkLiAqLworCXJldHVybihjaGFycyk7CisKK30gLyogRW5kIHBjX2NoYXJzX2luX2J1ZmZlciAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfZmx1c2hfYnVmZmVyICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBjX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAvKiBCZWdpbiBwY19mbHVzaF9idWZmZXIgKi8KKworCXVuc2lnbmVkIGludCB0YWlsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNoYW5uZWwgKmNoOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwlnbG9iYWx3aW5vbihjaCk7CisKKwliYyAgID0gY2gtPmJyZGNoYW47CisJdGFpbCA9IGJjLT50b3V0OworCisJLyogSGF2ZSBGRVAgbW92ZSB0b3V0IHBvaW50ZXI7IGVmZmVjdGl2ZWx5IGZsdXNoaW5nIHRyYW5zbWl0IGJ1ZmZlciAqLworCisJZmVwY21kKGNoLCBTVE9VVCwgKHVuc2lnbmVkKSB0YWlsLCAwLCAwLCAwKTsKKworCW1lbW9mZihjaCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworCit9IC8qIEVuZCBwY19mbHVzaF9idWZmZXIgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2ZsdXNoX2NoYXJzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBjX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHBjX2ZsdXNoX2NoYXJzICovCisKKwlzdHJ1Y3QgY2hhbm5lbCAqIGNoOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCisJeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlJZiBub3QgYWxyZWFkeSBzZXQgYW5kIHRoZSB0cmFuc21pdHRlciBpcyBidXN5IHNldHVwIGFuIGV2ZW50CisJCQl0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBlbXB0aWVzLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKChjaC0+c3RhdHVzZmxhZ3MgJiBUWEJVU1kpICYmICEoY2gtPnN0YXR1c2ZsYWdzICYgRU1QVFlXQUlUKSkKKwkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CisKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJfQorCit9IC8qIEVuZCBwY19mbHVzaF9jaGFycyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gYmxvY2tfdGlsX3JlYWR5ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBjaGFubmVsICpjaCkKK3sgLyogQmVnaW4gYmxvY2tfdGlsX3JlYWR5ICovCisKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LGN1cnJlbnQpOworCWludAlyZXR2YWwsIGRvX2Nsb2NhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCisJeworCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJZWxzZQorCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwkKKwkJcmV0dXJuKHJldHZhbCk7CisJfQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisJCUlmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKKwkJdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAKKwl7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmNoLT5jbG9zZV93YWl0KTsKKworCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWVsc2UKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAKKwl7CisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCSAgCSBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQKKwkgIAkgYW5kIHRoZW4gZXhpdC4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCisJCXJldHVybiAwOworCX0KKworCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKKwkJZG9fY2xvY2FsID0gMTsKKwkKKyAgIC8qIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lIGZyZWUgKi8KKwkKKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZjaC0+b3Blbl93YWl0LCAmd2FpdCk7CisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKworCS8qIFdlIGRlYyBjb3VudCBzbyB0aGF0IHBjX2Nsb3NlIHdpbGwga25vdyB3aGVuIHRvIGZyZWUgdGhpbmdzICovCisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQljaC0+Y291bnQtLTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJY2gtPmJsb2NrZWRfb3BlbisrOworCisJd2hpbGUoMSkgCisJeyAvKiBCZWdpbiBmb3JldmVyIHdoaWxlICAqLworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIAorCQl7CisJCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwkKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJiAKKwkJCSAgKGRvX2Nsb2NhbCB8fCAoY2gtPmltb2RlbSAmIGNoLT5kY2QpKSkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgCisJCXsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlBbGxvdyBzb21lb25lIGVsc2UgdG8gYmUgc2NoZWR1bGVkLiAgV2Ugd2lsbCBvY2Nhc2lvbmFsbHkgZ28KKwkJCXRocm91Z2ggdGhpcyBsb29wIHVudGlsIG9uZSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBjaGFuZ2UuCisJCQlUaGUgYmVsb3cgc2NoZWR1bGUgY2FsbCB3aWxsIGFsbG93IG90aGVyIHByb2Nlc3NlcyB0byBlbnRlciBhbmQKKwkJCXByZXZlbnQgdGhpcyBsb29wIGZyb20gaG9nZ2luZyB0aGUgY3B1LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkJc2NoZWR1bGUoKTsKKworCX0gLyogRW5kIGZvcmV2ZXIgd2hpbGUgICovCisKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2gtPm9wZW5fd2FpdCwgJndhaXQpOworCWNsaSgpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJY2gtPmNvdW50Kys7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwljaC0+YmxvY2tlZF9vcGVuLS07CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKworCXJldHVybiAwOworCit9IC8qIEVuZCBibG9ja190aWxfcmVhZHkgKi8JCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19vcGVuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGNfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7IC8qIEJlZ2luIHBjX29wZW4gKi8KKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsaW5lLCByZXR2YWwsIGJvYXJkbnVtOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaGVhZDsKKworCWxpbmUgPSB0dHktPmluZGV4OworCWlmIChsaW5lIDwgMCB8fCBsaW5lID49IG5iZGV2cykgCisJeworCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuIDogbGluZSBvdXQgb2YgcmFuZ2UgaW4gcGNfb3BlblxuIik7CisJCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisKKwljaCA9ICZkaWdpX2NoYW5uZWxzW2xpbmVdOworCWJvYXJkbnVtID0gY2gtPmJvYXJkbnVtOworCisJLyogQ2hlY2sgc3RhdHVzIG9mIGJvYXJkIGNvbmZpZ3VyZWQgaW4gc3lzdGVtLiAgKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUkgY2hlY2sgdG8gc2VlIGlmIHRoZSBlcGNhX3NldHVwIHJvdXRpbmUgZGV0ZWN0ZWQgYW4gdXNlciBlcnJvci4gIAorCQlJdCBtaWdodCBiZSBiZXR0ZXIgdG8gcHV0IHRoaXMgaW4gcGNfaW5pdCwgYnV0IGZvciB0aGUgbW9tZW50IGl0CisJCWdvZXMgaGVyZS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoaW52YWxpZF9saWxvX2NvbmZpZykKKwl7CisJCWlmIChzZXR1cF9lcnJvcl9jb2RlICYgSU5WQUxJRF9CT0FSRF9UWVBFKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBib2FyZCB0eXBlIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOworCisJCWlmIChzZXR1cF9lcnJvcl9jb2RlICYgSU5WQUxJRF9OVU1fUE9SVFMpCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuOiBJbnZhbGlkIG51bWJlciBvZiBwb3J0cyBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKKworCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfTUVNX0JBU0UpCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIG1lbW9yeSBhZGRyZXNzIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOworCisJCWlmIChzZXR1cF9lcnJvcl9jb2RlICYgSU5WQUxJRF9QT1JUX0JBU0UpCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIHBvcnQgYWRkcmVzcyBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKKworCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfQk9BUkRfU1RBVFVTKQorCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBib2FyZCBzdGF0dXMgc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7CisKKwkJaWYgKHNldHVwX2Vycm9yX2NvZGUgJiBJTlZBTElEX0FMVFBJTikKKwkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW46IEludmFsaWQgYm9hcmQgYWx0cGluIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOworCisJCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOyAgIC8qIE1hcmsgdGhpcyBkZXZpY2UgYXMgJ2Rvd24nICovCisJCXJldHVybigtRU5PREVWKTsKKwl9CisKKwlpZiAoKGJvYXJkbnVtID49IG51bV9jYXJkcykgfHwgKGJvYXJkc1tib2FyZG51bV0uc3RhdHVzID09IERJU0FCTEVEKSkgCisJeworCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsgICAvKiBNYXJrIHRoaXMgZGV2aWNlIGFzICdkb3duJyAqLworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCQorCWlmICgoIGJjID0gY2gtPmJyZGNoYW4pID09IDApIAorCXsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCXJldHVybigtRU5PREVWKTsKKwl9CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJRXZlcnkgdGltZSBhIGNoYW5uZWwgaXMgb3BlbmVkLCBpbmNyZW1lbnQgYSBjb3VudGVyLiAgVGhpcyBpcyAKKwkJbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgZG8gbm90IHdpc2ggdG8gZmx1c2ggYW5kIHNodXRkb3duIHRoZSBjaGFubmVsCisJCXVudGlsIHRoZSBsYXN0IGFwcCBob2xkaW5nIHRoZSBjaGFubmVsIG9wZW4sIGNsb3NlcyBpdC4JIAkKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWNoLT5jb3VudCsrOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlTZXQgYSBrZXJuZWwgc3RydWN0dXJlcyBwb2ludGVyIHRvIG91ciBsb2NhbCBjaGFubmVsIAorCQlzdHJ1Y3R1cmUuICBUaGlzIHdheSB3ZSBjYW4gZ2V0IHRvIGl0IHdoZW4gcGFzc2VkIG9ubHkKKwkJYSB0dHkgc3RydWN0LgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJdHR5LT5kcml2ZXJfZGF0YSA9IGNoOworCQorCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGUgY2hhbm5lbCBoYXMgYmVlbiBvcGVuZWQsIGluaXRpYWxpemUKKwkJdGhlIHR0eS0+dGVybWlvcyBzdHJ1Y3Qgb3RoZXJ3aXNlIGxldCBwY19jbG9zZSBoYW5kbGUgaXQuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJZ2xvYmFsd2lub24oY2gpOworCWNoLT5zdGF0dXNmbGFncyA9IDA7CisKKwkvKiBTYXZlIGJvYXJkcyBjdXJyZW50IG1vZGVtIHN0YXR1cyAqLworCWNoLT5pbW9kZW0gPSBiYy0+bXN0YXQ7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgU2V0IHJlY2VpdmUgaGVhZCBhbmQgdGFpbCBwdHJzIHRvIGVhY2ggb3RoZXIuICBUaGlzIGluZGljYXRlcworCSAgIG5vIGRhdGEgYXZhaWxhYmxlIHRvIHJlYWQuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwloZWFkID0gYmMtPnJpbjsKKwliYy0+cm91dCA9IGhlYWQ7CisKKwkvKiBTZXQgdGhlIGNoYW5uZWxzIGFzc29jaWF0ZWQgdHR5IHN0cnVjdHVyZSAqLworCWNoLT50dHkgPSB0dHk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGUgYmVsb3cgcm91dGluZSBnZW5lcmFsbHkgc2V0cyB1cCBwYXJpdHksIGJhdWQsIGZsb3cgY29udHJvbCAKKwkJaXNzdWVzLCBldGMuLi4uIEl0IGVmZmVjdCBib3RoIGNvbnRyb2wgZmxhZ3MgYW5kIGlucHV0IGZsYWdzLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJZXBjYXBhcmFtKHR0eSxjaCk7CisKKwljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwltZW1vZmYoY2gpOworCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBjaCk7CisJaWYgKHJldHZhbCkKKwl7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlTZXQgdGhpcyBhZ2FpbiBpbiBjYXNlIGEgaGFuZ3VwIHNldCBpdCB0byB6ZXJvIHdoaWxlIHRoaXMgCisJCW9wZW4oKSB3YXMgd2FpdGluZyBmb3IgdGhlIGxpbmUuLi4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwljaC0+dHR5ID0gdHR5OworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJZ2xvYmFsd2lub24oY2gpOworCisJLyogRW5hYmxlIERpZ2kgRGF0YSBldmVudHMgKi8KKwliYy0+aWRhdGEgPSAxOworCisJbWVtb2ZmKGNoKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybiAwOworCit9IC8qIEVuZCBwY19vcGVuICovCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGVwY2FfbW9kdWxlX2luaXQodm9pZCkKK3sgLyogQmVnaW4gaW5pdF9tb2R1bGUgKi8KKworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworCXBjX2luaXQoKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKDApOworfQorCittb2R1bGVfaW5pdChlcGNhX21vZHVsZV9pbml0KTsKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX1BDSQorc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGVwY2FfZHJpdmVyOworI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGNsZWFudXBfbW9kdWxlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlcGNhX21vZHVsZV9leGl0KHZvaWQpCit7CisKKwlpbnQgICAgICAgICAgICAgICBjb3VudCwgY3JkOworCXN0cnVjdCBib2FyZF9pbmZvICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbCAgICAqY2g7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisKKwlkZWxfdGltZXJfc3luYygmZXBjYV90aW1lcik7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworCWlmICgodHR5X3VucmVnaXN0ZXJfZHJpdmVyKHBjX2RyaXZlcikpIHx8ICAKKwkgICAgKHR0eV91bnJlZ2lzdGVyX2RyaXZlcihwY19pbmZvKSkpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICI8RXJyb3I+IC0gRElHSSA6IGNsZWFudXBfbW9kdWxlIGZhaWxlZCB0byB1bi1yZWdpc3RlciB0dHkgZHJpdmVyXG4iKTsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybjsKKwl9CisJcHV0X3R0eV9kcml2ZXIocGNfZHJpdmVyKTsKKwlwdXRfdHR5X2RyaXZlcihwY19pbmZvKTsKKworCWZvciAoY3JkID0gMDsgY3JkIDwgbnVtX2NhcmRzOyBjcmQrKykgCisJeyAvKiBCZWdpbiBmb3IgZWFjaCBjYXJkICovCisKKwkJYmQgPSAmYm9hcmRzW2NyZF07CisKKwkJaWYgKCFiZCkKKwkJeyAvKiBCZWdpbiBzYW5pdHkgY2hlY2sgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIERpZ2kgOiBjbGVhbnVwX21vZHVsZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuOworCQl9IC8qIEVuZCBzYW5pdHkgY2hlY2sgKi8KKworCQljaCA9IGNhcmRfcHRyW2NyZF07IAorCisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGJkLT5udW1wb3J0czsgY291bnQrKywgY2grKykgCisJCXsgLyogQmVnaW4gZm9yIGVhY2ggcG9ydCAqLworCisJCQlpZiAoY2gpIAorCQkJeworCQkJCWlmIChjaC0+dHR5KQorCQkJCQl0dHlfaGFuZ3VwKGNoLT50dHkpOworCQkJCWtmcmVlKGNoLT50bXBfYnVmKTsKKwkJCX0KKworCQl9IC8qIEVuZCBmb3IgZWFjaCBwb3J0ICovCisJfSAvKiBFbmQgZm9yIGVhY2ggY2FyZCAqLworCisjaWZkZWYgRU5BQkxFX1BDSQorCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJmVwY2FfZHJpdmVyKTsKKyNlbmRpZgorCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKK30KK21vZHVsZV9leGl0KGVwY2FfbW9kdWxlX2V4aXQpOworI2VuZGlmIC8qIE1PRFVMRSAqLworCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHBjX29wcyA9IHsKKwkub3BlbiA9IHBjX29wZW4sCisJLmNsb3NlID0gcGNfY2xvc2UsCisJLndyaXRlID0gcGNfd3JpdGUsCisJLndyaXRlX3Jvb20gPSBwY193cml0ZV9yb29tLAorCS5mbHVzaF9idWZmZXIgPSBwY19mbHVzaF9idWZmZXIsCisJLmNoYXJzX2luX2J1ZmZlciA9IHBjX2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfY2hhcnMgPSBwY19mbHVzaF9jaGFycywKKwkucHV0X2NoYXIgPSBwY19wdXRfY2hhciwKKwkuaW9jdGwgPSBwY19pb2N0bCwKKwkuc2V0X3Rlcm1pb3MgPSBwY19zZXRfdGVybWlvcywKKwkuc3RvcCA9IHBjX3N0b3AsCisJLnN0YXJ0ID0gcGNfc3RhcnQsCisJLnRocm90dGxlID0gcGNfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBwY191bnRocm90dGxlLAorCS5oYW5ndXAgPSBwY19oYW5ndXAsCit9OworCitzdGF0aWMgaW50IGluZm9fb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgaW5mb19vcHMgPSB7CisJLm9wZW4gPSBpbmZvX29wZW4sCisJLmlvY3RsID0gaW5mb19pb2N0bCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19pbml0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBfX2luaXQgcGNfaW5pdCh2b2lkKQoreyAvKiBCZWdpbiBwY19pbml0ICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXBjX2luaXQgaXMgY2FsbGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGR1cmluZyBib290IHVwIHByaW9yIHRvCisJCWFueSBvcGVuIGNhbGxzIGJlaW5nIG1hZGUuICBJbiB0aGUgb2xkZXIgdmVyc2lvbnMgb2YgTGludXggKFByaW9yCisJCXRvIDIuMC4wKSBhbiBlbnRyeSBpcyBtYWRlIGludG8gdHR5X2lvLmMuICBBIHBvaW50ZXIgdG8gdGhlIGxhc3QKKwkJbWVtb3J5IGxvY2F0aW9uIChmcm9tIGtlcm5lbCBzcGFjZSkgdXNlZCAoa21lbV9zdGFydCkgaXMgcGFzc2VkCisJCXRvIHBjX2luaXQuICBJdCBpcyBwY19pbml0cyByZXNwb25zaWJpbGl0eSB0byBtb2RpZnkgdGhpcyB2YWx1ZSAKKwkJZm9yIGFueSBtZW1vcnkgdGhhdCB0aGUgRGlnaSBkcml2ZXIgbWlnaHQgbmVlZCBhbmQgdGhlbiByZXR1cm4KKwkJdGhpcyB2YWx1ZSB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIEZvciBleGFtcGxlIGlmIHRoZSBkcml2ZXIKKwkJd2lzaGVzIHRvIGFsbG9jYXRlIDFLIG9mIGtlcm5lbCBtZW1vcnksIHBjX2luaXQgd291bGQgcmV0dXJuIAorCQkoa21lbV9zdGFydCArIDEwMjQpLiAgVGhpcyBtZW1vcnkgKEJldHdlZW4ga21lbV9zdGFydCBhbmQga21lbV9zdGFydAorCQkrIDEwMjQpIHdvdWxkIHRoZW4gYmUgYXZhaWxhYmxlIGZvciB1c2UgZXhjbHVzaXZlbHkgYnkgdGhlIGRyaXZlci4gIAorCQlJbiB0aGlzIGNhc2Ugb3VyIGRyaXZlciBkb2VzIG5vdCBhbGxvY2F0ZSBhbnkgb2YgdGhpcyBrZXJuZWwgCisJCW1lbW9yeS4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJdWxvbmcgZmxhZ3M7CisJaW50IGNyZDsKKwlzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7CisJdW5zaWduZWQgY2hhciBib2FyZF9pZCA9IDA7CisKKyNpZmRlZiBFTkFCTEVfUENJCisJaW50IHBjaV9ib2FyZHNfZm91bmQsIHBjaV9jb3VudDsKKworCXBjaV9jb3VudCA9IDA7CisjZW5kaWYgLyogRU5BQkxFX1BDSSAqLworCisJcGNfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNQVhfQUxMT0MpOworCWlmICghcGNfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjX2luZm8gPSBhbGxvY190dHlfZHJpdmVyKE1BWF9BTExPQyk7CisJaWYgKCFwY19pbmZvKSB7CisJCXB1dF90dHlfZHJpdmVyKHBjX2RyaXZlcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUlmIGVwY2Ffc2V0dXAgaGFzIG5vdCBiZWVuIHJhbiBieSBMSUxPIHNldCBudW1fY2FyZHMgdG8gZGVmYXVsdHM7IGNvcHkKKwkJYm9hcmQgc3RydWN0dXJlIGRlZmluZWQgYnkgZGlnaUNvbmZpZyBpbnRvIGRyaXZlcnMgYm9hcmQgc3RydWN0dXJlLgorCQlOb3RlIDogSWYgTElMTyBoYXMgcmFuIGVwY2Ffc2V0dXAgdGhlbiBlcGNhX3NldHVwIHdpbGwgaGFuZGxlIGRlZmluaW5nCisJCW51bV9jYXJkcyBhcyB3ZWxsIGFzIGNvcHlpbmcgdGhlIGRhdGEgaW50byB0aGUgYm9hcmQgc3RydWN0dXJlLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaWYgKCFsaWxvY29uZmlnKQorCXsgLyogQmVnaW4gZHJpdmVyIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdmlhLiBlcGNhY29uZmlnICovCisKKwkJbmJkZXZzID0gTkJERVZTOworCQludW1fY2FyZHMgPSBOVU1DQVJEUzsKKwkJbWVtY3B5KCh2b2lkICopJmJvYXJkcywgKHZvaWQgKikmc3RhdGljX2JvYXJkcywKKwkJICAgICAgIChzaXplb2Yoc3RydWN0IGJvYXJkX2luZm8pICogTlVNQ0FSRFMpKTsKKwl9IC8qIEVuZCBkcml2ZXIgaGFzIGJlZW4gY29uZmlndXJlZCB2aWEuIGVwY2Fjb25maWcgKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCU5vdGUgOiBJZiBsaWxvIHdhcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGFuZCB0aGUgCisJCWlnbm9yZSBlcGNhY29uZmlnIG9wdGlvbiB3YXMgY2hvb3NlbiAoZGlnaWVwY2E9MikgdGhlbiAKKwkJbmJkZXZzIGFuZCBudW1fY2FyZHMgd2lsbCBlcXVhbCAwIGF0IHRoaXMgcG9pbnQuICBUaGlzIGlzCisJCW9rYXk7IFBDSSBjYXJkcyB3aWxsIHN0aWxsIGJlIHBpY2tlZCB1cCBpZiBkZXRlY3RlZC4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlTZXQgdXAgaW50ZXJydXB0LCB3ZSB3aWxsIHdvcnJ5IGFib3V0IG1lbW9yeSBhbGxvY2F0aW9uIGluCisJCXBvc3RfZmVwX2luaXQuIAorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKwlwcmludGsoS0VSTl9JTkZPICJESUdJIGVwY2EgZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkLlxuIixWRVJTSU9OKTsKKworI2lmZGVmIEVOQUJMRV9QQ0kKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlOT1RFIDogVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgbnVtYmVyIG9mIHBvcnRzIGZvdW5kIGluIAorCQkgICAgICAgdGhlIGJvYXJkcyBhcnJheSBpcyBjb3JyZWN0LiAgVGhpcyBjb3VsZCBiZSB3cm9uZyBpZgorCQkgICAgICAgdGhlIGNhcmQgaW4gcXVlc3Rpb24gaXMgUENJIChBbmQgdGhlcmVmb3JlIGhhcyBubyBwb3J0cyAKKwkJICAgICAgIGVudHJ5IGluIHRoZSBib2FyZHMgc3RydWN0dXJlLikgIFRoZSByZXN0IG9mIHRoZSAKKwkJICAgICAgIGluZm9ybWF0aW9uIHdpbGwgYmUgdmFsaWQgZm9yIFBDSSBiZWNhdXNlIHRoZSBiZWdpbm5pbmcKKwkJICAgICAgIG9mIHBjX2luaXQgc2NhbnMgZm9yIFBDSSBhbmQgZGV0ZXJtaW5lcyBpL28gYW5kIGJhc2UKKwkJICAgICAgIG1lbW9yeSBhZGRyZXNzZXMuICBJIGFtIG5vdCBzdXJlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIAorCQkgICAgICAgcmVhZCB0aGUgbnVtYmVyIG9mIHBvcnRzIHN1cHBvcnRlZCBieSB0aGUgY2FyZCBwcmlvciB0bworCQkgICAgICAgaXQgYmVpbmcgYm9vdGVkIChTaW5jZSB0aGF0IGlzIHRoZSBzdGF0ZSBpdCBpcyBpbiB3aGVuIAorCQkgICAgICAgcGNfaW5pdCBpcyBydW4pLiAgQmVjYXVzZSBpdCBpcyBub3QgcG9zc2libGUgdG8gcXVlcnkgdGhlCisJCSAgICAgICBudW1iZXIgb2Ygc3VwcG9ydGVkIHBvcnRzIHVudGlsIGFmdGVyIHRoZSBjYXJkIGhhcyBib290ZWQ7CisJCSAgICAgICB3ZSBhcmUgcmVxdWlyZWQgdG8gY2FsY3VsYXRlIHRoZSBjYXJkX3B0cnMgYXMgdGhlIGNhcmQgaXMJIAorCQkgICAgICAgaXMgaW5pdGlhbGl6ZWQgKEluc2lkZSBwb3N0X2ZlcF9pbml0KS4gIFRoZSBuZWdhdGl2ZSB0aGluZworCQkgICAgICAgYWJvdXQgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGRpZ2lEbG9hZCdzIGNhbGwgdG8gR0VUX0lORk8KKwkJICAgICAgIHdpbGwgaGF2ZSBhIGJhZCBwb3J0IHZhbHVlLiAgKFNpbmNlIHRoaXMgaXMgY2FsbGVkIHByaW9yCisJCSAgICAgICB0byBwb3N0X2ZlcF9pbml0LikKKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAKKwlwY2lfYm9hcmRzX2ZvdW5kID0gMDsKKwlpZihudW1fY2FyZHMgPCBNQVhCT0FSRFMpCisJCXBjaV9ib2FyZHNfZm91bmQgKz0gaW5pdF9QQ0koKTsKKwludW1fY2FyZHMgKz0gcGNpX2JvYXJkc19mb3VuZDsKKworI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KKworCXBjX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlwY19kcml2ZXItPm5hbWUgPSAidHR5RCI7IAorCXBjX2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ0dHMvRCI7CisJcGNfZHJpdmVyLT5tYWpvciA9IERJR0lfTUFKT1I7IAorCXBjX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCXBjX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJcGNfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXBjX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXBjX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfaWZsYWcgPSAwOworCXBjX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb2ZsYWcgPSAwOworCXBjX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgQ0xPQ0FMIHwgSFVQQ0w7CisJcGNfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19sZmxhZyA9IDA7CisJcGNfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKHBjX2RyaXZlciwgJnBjX29wcyk7CisKKwlwY19pbmZvLT5vd25lciA9IFRISVNfTU9EVUxFOworCXBjX2luZm8tPm5hbWUgPSAiZGlnaV9jdGwiOworCXBjX2luZm8tPm1ham9yID0gRElHSUlORk9NQUpPUjsKKwlwY19pbmZvLT5taW5vcl9zdGFydCA9IDA7CisJcGNfaW5mby0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJcGNfaW5mby0+c3VidHlwZSA9IFNFUklBTF9UWVBFX0lORk87CisJcGNfaW5mby0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXBjX2luZm8tPmluaXRfdGVybWlvcy5jX2lmbGFnID0gMDsKKwlwY19pbmZvLT5pbml0X3Rlcm1pb3MuY19vZmxhZyA9IDA7CisJcGNfaW5mby0+aW5pdF90ZXJtaW9zLmNfbGZsYWcgPSAwOworCXBjX2luZm8tPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMOworCXBjX2luZm8tPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMocGNfaW5mbywgJmluZm9fb3BzKTsKKworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspIAorCXsgLyogQmVnaW4gZm9yIGVhY2ggY2FyZCAqLworCisJCS8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCVRoaXMgaXMgd2hlcmUgdGhlIGFwcHJvcHJpYXRlIG1lbW9yeSBoYW5kbGVycyBmb3IgdGhlIGhhcmR3YXJlIGlzCisJCQlzZXQuICBFdmVyeXRoaW5nIGF0IHJ1bnRpbWUgYmxpbmRseSBqdW1wcyB0aHJvdWdoIHRoZXNlIHZlY3RvcnMuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQkvKiBkZWZpbmVkIGluIGVwY2Fjb25maWcuaCAqLworCQliZCA9ICZib2FyZHNbY3JkXTsKKworCQlzd2l0Y2ggKGJkLT50eXBlKQorCQl7IC8qIEJlZ2luIHN3aXRjaCBvbiBiZC0+dHlwZSB7Ym9hcmQgdHlwZX0gKi8KKwkJCWNhc2UgUENYRU06CisJCQljYXNlIEVJU0FYRU06CisJCQkJYmQtPm1lbXdpbm9uICAgICA9IHBjeGVtX21lbXdpbm9uIDsKKwkJCQliZC0+bWVtd2lub2ZmICAgID0gcGN4ZW1fbWVtd2lub2ZmIDsKKwkJCQliZC0+Z2xvYmFsd2lub24gID0gcGN4ZW1fZ2xvYmFsd2lub24gOworCQkJCWJkLT50eHdpbm9uICAgICAgPSBwY3hlbV90eHdpbm9uIDsKKwkJCQliZC0+cnh3aW5vbiAgICAgID0gcGN4ZW1fcnh3aW5vbiA7CisJCQkJYmQtPm1lbW9mZiAgICAgICA9IHBjeGVtX21lbW9mZiA7CisJCQkJYmQtPmFzc2VydGd3aW5vbiA9IGR1bW15X2Fzc2VydGd3aW5vbjsKKwkJCQliZC0+YXNzZXJ0bWVtb2ZmID0gZHVtbXlfYXNzZXJ0bWVtb2ZmOworCQkJCWJyZWFrOworCisJCQljYXNlIFBDSVhFTToKKwkJCWNhc2UgUENJWFJKOgorCQkJY2FzZSBQQ0lYUjoKKwkJCQliZC0+bWVtd2lub24gICAgID0gZHVtbXlfbWVtd2lub247CisJCQkJYmQtPm1lbXdpbm9mZiAgICA9IGR1bW15X21lbXdpbm9mZjsKKwkJCQliZC0+Z2xvYmFsd2lub24gID0gZHVtbXlfZ2xvYmFsd2lub247CisJCQkJYmQtPnR4d2lub24gICAgICA9IGR1bW15X3R4d2lub247CisJCQkJYmQtPnJ4d2lub24gICAgICA9IGR1bW15X3J4d2lub247CisJCQkJYmQtPm1lbW9mZiAgICAgICA9IGR1bW15X21lbW9mZjsKKwkJCQliZC0+YXNzZXJ0Z3dpbm9uID0gZHVtbXlfYXNzZXJ0Z3dpbm9uOworCQkJCWJkLT5hc3NlcnRtZW1vZmYgPSBkdW1teV9hc3NlcnRtZW1vZmY7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUENYRToKKwkJCWNhc2UgUENYRVZFOgorCisJCQkJYmQtPm1lbXdpbm9uICAgICA9IHBjeGVfbWVtd2lub247CisJCQkJYmQtPm1lbXdpbm9mZiAgICA9IHBjeGVfbWVtd2lub2ZmOworCQkJCWJkLT5nbG9iYWx3aW5vbiAgPSBwY3hlX2dsb2JhbHdpbm9uOworCQkJCWJkLT50eHdpbm9uICAgICAgPSBwY3hlX3R4d2lub247CisJCQkJYmQtPnJ4d2lub24gICAgICA9IHBjeGVfcnh3aW5vbjsKKwkJCQliZC0+bWVtb2ZmICAgICAgID0gcGN4ZV9tZW1vZmY7CisJCQkJYmQtPmFzc2VydGd3aW5vbiA9IGR1bW15X2Fzc2VydGd3aW5vbjsKKwkJCQliZC0+YXNzZXJ0bWVtb2ZmID0gZHVtbXlfYXNzZXJ0bWVtb2ZmOworCQkJCWJyZWFrOworCisJCQljYXNlIFBDWEk6CisJCQljYXNlIFBDNjRYRToKKworCQkJCWJkLT5tZW13aW5vbiAgICAgPSBwY3hpX21lbXdpbm9uOworCQkJCWJkLT5tZW13aW5vZmYgICAgPSBwY3hpX21lbXdpbm9mZjsKKwkJCQliZC0+Z2xvYmFsd2lub24gID0gcGN4aV9nbG9iYWx3aW5vbjsKKwkJCQliZC0+dHh3aW5vbiAgICAgID0gcGN4aV90eHdpbm9uOworCQkJCWJkLT5yeHdpbm9uICAgICAgPSBwY3hpX3J4d2lub247CisJCQkJYmQtPm1lbW9mZiAgICAgICA9IHBjeGlfbWVtb2ZmOworCQkJCWJkLT5hc3NlcnRnd2lub24gPSBwY3hpX2Fzc2VydGd3aW5vbjsKKwkJCQliZC0+YXNzZXJ0bWVtb2ZmID0gcGN4aV9hc3NlcnRtZW1vZmY7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisKKwkJfSAvKiBFbmQgc3dpdGNoIG9uIGJkLT50eXBlICovCisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlTb21lIGNhcmRzIG5lZWQgYSBtZW1vcnkgc2VnbWVudCB0byBiZSBkZWZpbmVkIGZvciB1c2UgaW4gCisJCQl0cmFuc21pdCBhbmQgcmVjZWl2ZSB3aW5kb3dpbmcgb3BlcmF0aW9ucy4gIFRoZXNlIGJvYXJkcworCQkJYXJlIGxpc3RlZCBpbiB0aGUgYmVsb3cgc3dpdGNoLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIFhJIHRoZQorCQkJYW1vdW50IG9mIG1lbW9yeSBvbiB0aGUgYm9hcmQgaXMgdmFyaWFibGUgc28gdGhlIG1lbW9yeV9zZWcKKwkJCWlzIGFsc28gdmFyaWFibGUuICBUaGlzIGNvZGUgZGV0ZXJtaW5lcyB3aGF0IHRoZXkgc2VnbWVudCAKKwkJCXNob3VsZCBiZS4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlzd2l0Y2ggKGJkLT50eXBlKQorCQl7IC8qIEJlZ2luIHN3aXRjaCBvbiBiZC0+dHlwZSB7Ym9hcmQgdHlwZX0gKi8KKworCQkJY2FzZSBQQ1hFOgorCQkJY2FzZSBQQ1hFVkU6CisJCQljYXNlIFBDNjRYRToKKwkJCQliZC0+bWVtb3J5X3NlZyA9IDB4ZjAwMDsKKwkJCWJyZWFrOworCisJCQljYXNlIFBDWEk6CisJCQkJYm9hcmRfaWQgPSBpbmIoKGludCliZC0+cG9ydCk7CisJCQkJaWYgKChib2FyZF9pZCAmIDB4MSkgPT0gMHgxKSAKKwkJCQl7IC8qIEJlZ2luIGl0J3MgYW4gWEkgY2FyZCAqLyAKKworCQkJCQkvKiBJcyBpdCBhIDY0SyBib2FyZCAqLworCQkJCQlpZiAoKGJvYXJkX2lkICYgMHgzMCkgPT0gMCkgCisJCQkJCQliZC0+bWVtb3J5X3NlZyA9IDB4ZjAwMDsKKworCQkJCQkvKiBJcyBpdCBhIDEyOEsgYm9hcmQgKi8KKwkJCQkJaWYgKChib2FyZF9pZCAmIDB4MzApID09IDB4MTApIAorCQkJCQkJYmQtPm1lbW9yeV9zZWcgPSAweGUwMDA7CisKKwkJCQkJLyogSXMgaXMgYSAyNTZLIGJvYXJkICovCQorCQkJCQlpZiAoKGJvYXJkX2lkICYgMHgzMCkgPT0gMHgyMCkgCisJCQkJCQliZC0+bWVtb3J5X3NlZyA9IDB4YzAwMDsKKworCQkJCQkvKiBJcyBpdCBhIDUxMksgYm9hcmQgKi8KKwkJCQkJaWYgKChib2FyZF9pZCAmIDB4MzApID09IDB4MzApIAorCQkJCQkJYmQtPm1lbW9yeV9zZWcgPSAweDgwMDA7CisKKwkJCQl9IC8qIEVuZCBpdCBpcyBhbiBYSSBjYXJkICovCisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gQm9hcmQgYXQgMHgleCBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBYSVxuIiwoaW50KWJkLT5wb3J0KTsKKwkJCQl9CisJCQlicmVhazsKKworCQl9IC8qIEVuZCBzd2l0Y2ggb24gYmQtPnR5cGUgKi8KKworCX0gLyogRW5kIGZvciBlYWNoIGNhcmQgKi8KKworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHBjX2RyaXZlcikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBEaWdpIFBDLyBkcml2ZXIiKTsKKworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHBjX2luZm8pKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgRGlnaSBQQy8gaW5mbyAiKTsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICBTdGFydCB1cCB0aGUgcG9sbGVyIHRvIGNoZWNrIGZvciBldmVudHMgb24gYWxsIGVuYWJsZWQgYm9hcmRzCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaW5pdF90aW1lcigmZXBjYV90aW1lcik7CisJZXBjYV90aW1lci5mdW5jdGlvbiA9IGVwY2Fwb2xsOworCW1vZF90aW1lcigmZXBjYV90aW1lciwgamlmZmllcyArIEhaLzI1KTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuIDA7CisKK30gLyogRW5kIHBjX2luaXQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBvc3RfZmVwX2luaXQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcG9zdF9mZXBfaW5pdCh1bnNpZ25lZCBpbnQgY3JkKQoreyAvKiBCZWdpbiBwb3N0X2ZlcF9pbml0ICovCisKKwlpbnQgaTsKKwl1bmNoYXIgKm1lbWFkZHI7CisJdm9sYXRpbGUgc3RydWN0IGdsb2JhbF9kYXRhICpnZDsKKwlzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXN0cnVjdCBjaGFubmVsICpjaDsgCisJaW50IHNocmlua21lbSA9IDAsIGxvd3dhdGVyIDsgCisgCisJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhpcyBjYWxsIGlzIG1hZGUgYnkgdGhlIHVzZXIgdmlhLiB0aGUgaW9jdGwgY2FsbCBESUdJX0lOSVQuCisJCUl0IGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIGFsbCB0aGUgY2FyZCBzcGVjaWZpYyBzdHVmZi4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJYmQgPSAmYm9hcmRzW2NyZF07CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJZiB0aGlzIGlzIGEgUENJIGJvYXJkLCBnZXQgdGhlIHBvcnQgaW5mby4gIFJlbWVtYmVyIFBDSSBjYXJkcworCQlkbyBub3QgaGF2ZSBlbnRyaWVzIGludG8gdGhlIGVwY2Fjb25maWcuaCBmaWxlLCBzbyB3ZSBjYW4ndCBnZXQgCisJCXRoZSBudW1iZXIgb2YgcG9ydHMgZnJvbSBpdC4gIFVuZm9ydHVuZXRseSwgdGhpcyBtZWFucyB0aGF0IGFueW9uZQorCQlkb2luZyBhIERJR0lfR0VUSU5GTyBiZWZvcmUgdGhlIGJvYXJkIGhhcyBib290ZWQgd2lsbCBnZXQgYW4gaW52YWxpZAorCQludW1iZXIgb2YgcG9ydHMgcmV0dXJuZWQgKEl0IHNob3VsZCByZXR1cm4gMCkuICBDYWxscyB0byBESUdJX0dFVElORk8KKwkJYWZ0ZXIgRElHSV9JTklUIGhhcyBiZWVuIGNhbGxlZCB3aWxsIHJldHVybiB0aGUgcHJvcGVyIHZhbHVlcy4gCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKGJkLT50eXBlID49IFBDSVhFTSkgLyogSWYgdGhlIGJvYXJkIGluIHF1ZXN0aW9uIGlzIFBDSSAqLworCXsgLyogQmVnaW4gZ2V0IFBDSSBudW1iZXIgb2YgcG9ydHMgKi8KKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJQmVsb3cgd2UgdXNlIFhFTVBPUlRTIGFzIGEgbWVtb3J5IG9mZnNldCByZWdhcmRsZXNzIG9mIHdoaWNoIFBDSQorCQkJY2FyZCBpdCBpcy4gIFRoaXMgaXMgYmVjYXVzZSBhbGwgb2YgdGhlIHN1cHBvcnRlZCBQQ0kgY2FyZHMgaGF2ZQorCQkJdGhlIHNhbWUgbWVtb3J5IG9mZnNldCBmb3IgdGhlIGNoYW5uZWwgZGF0YS4gIFRoaXMgd2lsbCBoYXZlIHRvIGJlCisJCQljaGFuZ2VkIGlmIHdlIGV2ZXIgZGV2ZWxvcCBhIFBDSS9YRSBjYXJkLiAgTk9URSA6IFRoZSBGRVAgbWFudWFsCisJCQlzdGF0ZXMgdGhhdCB0aGUgcG9ydCBvZmZzZXQgaXMgMHhDMjIgYXMgb3Bwb3NlZCB0byAweEMwMi4gIFRoaXMgaXMKKwkJCW9ubHkgdHJ1ZSBmb3IgUEMvWEUsIGFuZCBQQy9YSSBjYXJkczsgbm90IGZvciB0aGUgWEVNLCBvciBDWCBzZXJpZXMuCisJCQlPbiB0aGUgUENJIGNhcmRzIHRoZSBudW1iZXIgb2YgcG9ydHMgaXMgZGV0ZXJtaW5lZCBieSByZWFkaW5nIGEgCisJCQlJRCBQUk9NIGxvY2F0ZWQgaW4gdGhlIGJveCBhdHRhY2hlZCB0byB0aGUgY2FyZC4gIFRoZSBjYXJkIGNhbiB0aGVuCisJCQlkZXRlcm1pbmUgdGhlIGluZGV4IHRoZSBpZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwb3J0cyBhdmFpbGFibGUuCisJCQkoRllJIC0gVGhlIGlkIHNob3VsZCBiZSBsb2NhdGVkIGF0IDB4MWFjIChBbmQgbWF5IHVzZSB1cCB0byA0IGJ5dGVzCisJCQlpZiB0aGUgYm94IGluIHF1ZXN0aW9uIGlzIGEgWEVNIG9yIENYKSkuICAKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovIAorCisJCWJkLT5udW1wb3J0cyA9ICh1bnNpZ25lZCBzaG9ydCkqKHVuc2lnbmVkIGNoYXIgKilidXNfdG9fdmlydCgodW5zaWduZWQgbG9uZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmQtPnJlX21hcF9tZW1iYXNlICsgWEVNUE9SVFMpKTsKKworCQkKKwkJZXBjYWFzc2VydChiZC0+bnVtcG9ydHMgPD0gNjQsIlBDSSByZXR1cm5lZCBhIGludmFsaWQgbnVtYmVyIG9mIHBvcnRzIik7CisJCW5iZGV2cyArPSAoYmQtPm51bXBvcnRzKTsKKworCX0gLyogRW5kIGdldCBQQ0kgbnVtYmVyIG9mIHBvcnRzICovCisKKwlpZiAoY3JkICE9IDApCisJCWNhcmRfcHRyW2NyZF0gPSBjYXJkX3B0cltjcmQtMV0gKyBib2FyZHNbY3JkLTFdLm51bXBvcnRzOworCWVsc2UKKwkJY2FyZF9wdHJbY3JkXSA9ICZkaWdpX2NoYW5uZWxzW2NyZF07IC8qIDwtIEZvciBjYXJkIDAgb25seSAqLworCisJY2ggPSBjYXJkX3B0cltjcmRdOworCisKKwllcGNhYXNzZXJ0KGNoIDw9ICZkaWdpX2NoYW5uZWxzW25iZGV2cyAtIDFdLCAiY2ggb3V0IG9mIHJhbmdlIik7CisKKwltZW1hZGRyID0gKHVuY2hhciAqKWJkLT5yZV9tYXBfbWVtYmFzZTsKKworCS8qIAorCSAgIFRoZSBiZWxvdyBjb21tYW5kIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG5ld2VyIGtlcm5lbHMgKDIuMS54IGFuZAorCSAgIHVwKSBkbyBub3QgaGF2ZSBhIDE6MSB2aXJ0dWFsIHRvIHBoeXNpY2FsIG1hcHBpbmcuICBUaGUgYmVsb3cKKwkgICBjYWxsIGFkanVzdCBmb3IgdGhhdC4KKwkqLworCisJbWVtYWRkciA9ICh1bnNpZ25lZCBjaGFyICopYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpbWVtYWRkcik7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGUgYmVsb3cgYXNzaWdubWVudCB3aWxsIHNldCBiYyB0byBwb2ludCBhdCB0aGUgQkVHSU5JTkcgb2YKKwkJdGhlIGNhcmRzIGNoYW5uZWwgc3RydWN0dXJlcy4gIEZvciAxIGNhcmQgdGhlcmUgd2lsbCBiZSBiZXR3ZWVuCisJCTggYW5kIDY0IG9mIHRoZXNlIHN0cnVjdHVyZXMuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWJjID0gKHZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICopKCh1bG9uZyltZW1hZGRyICsgQ0hBTlNUUlVDVCk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVRoZSBiZWxvdyBhc3NpZ25tZW50IHdpbGwgc2V0IGdkIHRvIHBvaW50IGF0IHRoZSBCRUdJTklORyBvZgorCQlnbG9iYWwgbWVtb3J5IGFkZHJlc3MgMHhjMDAuICBUaGUgZmlyc3QgZGF0YSBpbiB0aGF0IGdsb2JhbAorCQltZW1vcnkgYWN0dWFsbHkgc3RhcnRzIGF0IGFkZHJlc3MgMHhjMWEuICBUaGUgY29tbWFuZCBpbiAKKwkJcG9pbnRlciBiZWdpbnMgYXQgMHhkMTAuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJZ2QgPSAodm9sYXRpbGUgc3RydWN0IGdsb2JhbF9kYXRhICopKCh1bG9uZyltZW1hZGRyICsgR0xPQkFMKTsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVhFUE9SVFMgKGFkZHJlc3MgMHhjMjIpIHBvaW50cyBhdCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRoZQorCQljYXJkIHN1cHBvcnRzLiAoRm9yIDY0WEUsIFhJLCBYRU0sIGFuZCBYUiB1c2UgMHhjMDIpCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoKGJkLT50eXBlID09IFBDWEVWRSkgfCAoYmQtPnR5cGUgPT0gUENYRSkpICYmCisJICAgICgqKHVzaG9ydCAqKSgodWxvbmcpbWVtYWRkciArIFhFUE9SVFMpIDwgMykpCisJCXNocmlua21lbSA9IDE7CisJaWYgKGJkLT50eXBlIDwgUENJWEVNKQorCQlpZiAoIXJlcXVlc3RfcmVnaW9uKChpbnQpYmQtPnBvcnQsIDQsIGJvYXJkX2Rlc2NbYmQtPnR5cGVdKSkKKwkJCXJldHVybjsJCQorCisJbWVtd2lub24oYmQsIDApOworCisJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVJlbWVtYmVyIGNoIGlzIHRoZSBtYWluIGRyaXZlcnMgY2hhbm5lbHMgc3RydWN0dXJlLCB3aGlsZSBiYyBpcyAKKwkgICB0aGUgY2FyZHMgY2hhbm5lbCBzdHJ1Y3R1cmUuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBGb3IgZXZlcnkgcG9ydCBvbiB0aGUgY2FyZCBkbyAuLi4uLiAqLworCisJZm9yIChpID0gMDsgaSA8IGJkLT5udW1wb3J0czsgaSsrLCBjaCsrLCBiYysrKSAKKwl7IC8qIEJlZ2luIGZvciBlYWNoIHBvcnQgKi8KKworCQljaC0+YnJkY2hhbiAgICAgICAgPSBiYzsKKwkJY2gtPm1haWxib3ggICAgICAgID0gZ2Q7IAorCQlJTklUX1dPUksoJmNoLT50cXVldWUsIGRvX3NvZnRpbnQsIGNoKTsKKwkJY2gtPmJvYXJkICAgICAgICAgID0gJmJvYXJkc1tjcmRdOworCisJCXN3aXRjaCAoYmQtPnR5cGUpCisJCXsgLyogQmVnaW4gc3dpdGNoIGJkLT50eXBlICovCisKKwkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlTaW5jZSBzb21lIG9mIHRoZSBib2FyZHMgdXNlIGRpZmZlcmVudCBiaXRtYXBzIGZvciB0aGVpcgorCQkJCWNvbnRyb2wgc2lnbmFscyB3ZSBjYW5ub3QgaGFyZCBjb2RlIHRoZXNlIHZhbHVlcyBhbmQgcmV0YWluCisJCQkJcG9ydGFiaWxpdHkuICBXZSB2aXJ0dWFsaXplIHRoaXMgZGF0YSBoZXJlLgorCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCQkJY2FzZSBFSVNBWEVNOgorCQkJY2FzZSBQQ1hFTToKKwkJCWNhc2UgUENJWEVNOgorCQkJY2FzZSBQQ0lYUko6CisJCQljYXNlIFBDSVhSOgorCQkJCWNoLT5tX3J0cyA9IDB4MDIgOworCQkJCWNoLT5tX2RjZCA9IDB4ODAgOyAKKwkJCQljaC0+bV9kc3IgPSAweDIwIDsKKwkJCQljaC0+bV9jdHMgPSAweDEwIDsKKwkJCQljaC0+bV9yaSAgPSAweDQwIDsKKwkJCQljaC0+bV9kdHIgPSAweDAxIDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ1hFOgorCQkJY2FzZSBQQ1hFVkU6CisJCQljYXNlIFBDWEk6CisJCQljYXNlIFBDNjRYRToKKwkJCQljaC0+bV9ydHMgPSAweDAyIDsKKwkJCQljaC0+bV9kY2QgPSAweDA4IDsgCisJCQkJY2gtPm1fZHNyID0gMHgxMCA7CisJCQkJY2gtPm1fY3RzID0gMHgyMCA7CisJCQkJY2gtPm1fcmkgID0gMHg0MCA7CisJCQkJY2gtPm1fZHRyID0gMHg4MCA7CisJCQkJYnJlYWs7CisJCisJCX0gLyogRW5kIHN3aXRjaCBiZC0+dHlwZSAqLworCisJCWlmIChib2FyZHNbY3JkXS5hbHRwaW4pIAorCQl7CisJCQljaC0+ZHNyID0gY2gtPm1fZGNkOworCQkJY2gtPmRjZCA9IGNoLT5tX2RzcjsKKwkJCWNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgfD0gRElHSV9BTFRQSU47CisJCX0KKwkJZWxzZSAKKwkJeyAKKwkJCWNoLT5kY2QgPSBjaC0+bV9kY2Q7CisJCQljaC0+ZHNyID0gY2gtPm1fZHNyOworCQl9CisJCisJCWNoLT5ib2FyZG51bSAgID0gY3JkOworCQljaC0+Y2hhbm5lbG51bSA9IGk7CisJCWNoLT5tYWdpYyAgICAgID0gRVBDQV9NQUdJQzsKKwkJY2gtPnR0eSAgICAgICAgPSBOVUxMOworCisJCWlmIChzaHJpbmttZW0pIAorCQl7CisJCQlmZXBjbWQoY2gsIFNFVEJVRkZFUiwgMzIsIDAsIDAsIDApOworCQkJc2hyaW5rbWVtID0gMDsKKwkJfQorCisJCXN3aXRjaCAoYmQtPnR5cGUpCisJCXsgLyogQmVnaW4gc3dpdGNoIGJkLT50eXBlICovCisKKwkJCWNhc2UgUENJWEVNOgorCQkJY2FzZSBQQ0lYUko6CisJCQljYXNlIFBDSVhSOgorCQkJCS8qIENvdmVyIGFsbCB0aGUgMk1FRyBjYXJkcyAqLworCQkJCWNoLT50eHB0ciA9IG1lbWFkZHIgKyAoKChiYy0+dHNlZykgPDwgNCkgJiAweDFmZmZmZik7CisJCQkJY2gtPnJ4cHRyID0gbWVtYWRkciArICgoKGJjLT5yc2VnKSA8PCA0KSAmIDB4MWZmZmZmKTsKKwkJCQljaC0+dHh3aW4gPSBGRVBXSU4gfCAoKGJjLT50c2VnKSA+PiAxMSk7CisJCQkJY2gtPnJ4d2luID0gRkVQV0lOIHwgKChiYy0+cnNlZykgPj4gMTEpOworCQkJCWJyZWFrOworCisJCQljYXNlIFBDWEVNOgorCQkJY2FzZSBFSVNBWEVNOgorCQkJCS8qIENvdmVyIGFsbCB0aGUgMzJLIHdpbmRvd2VkIGNhcmRzICovCisJCQkJLyogTWFzayBlcXVhbCB0byB3aW5kb3cgc2l6ZSAtIDEgKi8KKwkJCQljaC0+dHhwdHIgPSBtZW1hZGRyICsgKCgoYmMtPnRzZWcpIDw8IDQpICYgMHg3ZmZmKTsKKwkJCQljaC0+cnhwdHIgPSBtZW1hZGRyICsgKCgoYmMtPnJzZWcpIDw8IDQpICYgMHg3ZmZmKTsKKwkJCQljaC0+dHh3aW4gPSBGRVBXSU4gfCAoKGJjLT50c2VnKSA+PiAxMSk7CisJCQkJY2gtPnJ4d2luID0gRkVQV0lOIHwgKChiYy0+cnNlZykgPj4gMTEpOworCQkJCWJyZWFrOworCisJCQljYXNlIFBDWEVWRToKKwkJCWNhc2UgUENYRToKKwkJCQljaC0+dHhwdHIgPSBtZW1hZGRyICsgKCgoYmMtPnRzZWcgLSBiZC0+bWVtb3J5X3NlZykgPDwgNCkgJiAweDFmZmYpOworCQkJCWNoLT50eHdpbiA9IEZFUFdJTiB8ICgoYmMtPnRzZWcgLSBiZC0+bWVtb3J5X3NlZykgPj4gOSk7CisJCQkJY2gtPnJ4cHRyID0gbWVtYWRkciArICgoKGJjLT5yc2VnIC0gYmQtPm1lbW9yeV9zZWcpIDw8IDQpICYgMHgxZmZmKTsKKwkJCQljaC0+cnh3aW4gPSBGRVBXSU4gfCAoKGJjLT5yc2VnIC0gYmQtPm1lbW9yeV9zZWcpID4+OSApOworCQkJCWJyZWFrOworCisJCQljYXNlIFBDWEk6CisJCQljYXNlIFBDNjRYRToKKwkJCQljaC0+dHhwdHIgPSBtZW1hZGRyICsgKChiYy0+dHNlZyAtIGJkLT5tZW1vcnlfc2VnKSA8PCA0KTsKKwkJCQljaC0+cnhwdHIgPSBtZW1hZGRyICsgKChiYy0+cnNlZyAtIGJkLT5tZW1vcnlfc2VnKSA8PCA0KTsKKwkJCQljaC0+dHh3aW4gPSBjaC0+cnh3aW4gPSAwOworCQkJCWJyZWFrOworCisJCX0gLyogRW5kIHN3aXRjaCBiZC0+dHlwZSAqLworCisJCWNoLT50eGJ1ZmhlYWQgPSAwOworCQljaC0+dHhidWZzaXplID0gYmMtPnRtYXggKyAxOworCQorCQljaC0+cnhidWZoZWFkID0gMDsKKwkJY2gtPnJ4YnVmc2l6ZSA9IGJjLT5ybWF4ICsgMTsKKwkKKwkJbG93d2F0ZXIgPSBjaC0+dHhidWZzaXplID49IDIwMDAgPyAxMDI0IDogKGNoLT50eGJ1ZnNpemUgLyAyKTsKKworCQkvKiBTZXQgdHJhbnNtaXR0ZXIgbG93IHdhdGVyIG1hcmsgKi8KKwkJZmVwY21kKGNoLCBTVFhMV0FURVIsIGxvd3dhdGVyLCAwLCAxMCwgMCk7CisKKwkJLyogU2V0IHJlY2VpdmVyIGxvdyB3YXRlciBtYXJrICovCisKKwkJZmVwY21kKGNoLCBTUlhMV0FURVIsIChjaC0+cnhidWZzaXplIC8gNCksIDAsIDEwLCAwKTsKKworCQkvKiBTZXQgcmVjZWl2ZXIgaGlnaCB3YXRlciBtYXJrICovCisKKwkJZmVwY21kKGNoLCBTUlhIV0FURVIsICgzICogY2gtPnJ4YnVmc2l6ZSAvIDQpLCAwLCAxMCwgMCk7CisKKwkJYmMtPmVkZWxheSA9IDEwMDsKKwkJYmMtPmlkYXRhID0gMTsKKwkKKwkJY2gtPnN0YXJ0YyAgPSBiYy0+c3RhcnRjOworCQljaC0+c3RvcGMgICA9IGJjLT5zdG9wYzsKKwkJY2gtPnN0YXJ0Y2EgPSBiYy0+c3RhcnRjYTsKKwkJY2gtPnN0b3BjYSAgPSBiYy0+c3RvcGNhOworCQorCQljaC0+ZmVwY2ZsYWcgPSAwOworCQljaC0+ZmVwaWZsYWcgPSAwOworCQljaC0+ZmVwb2ZsYWcgPSAwOworCQljaC0+ZmVwc3RhcnRjID0gMDsKKwkJY2gtPmZlcHN0b3BjID0gMDsKKwkJY2gtPmZlcHN0YXJ0Y2EgPSAwOworCQljaC0+ZmVwc3RvcGNhID0gMDsKKwkKKwkJY2gtPmNsb3NlX2RlbGF5ID0gNTA7CisJCWNoLT5jb3VudCA9IDA7CisJCWNoLT5ibG9ja2VkX29wZW4gPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNsb3NlX3dhaXQpOworCQljaC0+dG1wX2J1ZiA9IGttYWxsb2MoY2gtPnR4YnVmc2l6ZSxHRlBfS0VSTkVMKTsKKwkJaWYgKCEoY2gtPnRtcF9idWYpKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIlBPU1QgRkVQIElOSVQgOiBrbWFsbG9jIGZhaWxlZCBmb3IgcG9ydCAweCV4XG4iLGkpOworCQkJcmVsZWFzZV9yZWdpb24oKGludCliZC0+cG9ydCwgNCk7CisJCQl3aGlsZShpLS0gPiAwKQorCQkJCWtmcmVlKChjaC0tKS0+dG1wX2J1Zik7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZSAKKwkJCW1lbXNldCgodm9pZCAqKWNoLT50bXBfYnVmLDAsY2gtPnR4YnVmc2l6ZSk7CisJfSAvKiBFbmQgZm9yIGVhY2ggcG9ydCAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAKKwkgICAgICAgICJEaWdpIFBDL1h4IERyaXZlciBWJXM6ICAlcyBJL08gPSAweCVseCBNZW0gPSAweCVseCBQb3J0cyA9ICVkXG4iLCAKKwkgICAgICAgIFZFUlNJT04sIGJvYXJkX2Rlc2NbYmQtPnR5cGVdLCAobG9uZyliZC0+cG9ydCwgKGxvbmcpYmQtPm1lbWJhc2UsIGJkLT5udW1wb3J0cyk7CisJc3ByaW50ZihtZXNnLCAKKwkgICAgICAgICJEaWdpIFBDL1h4IERyaXZlciBWJXM6ICAlcyBJL08gPSAweCVseCBNZW0gPSAweCVseCBQb3J0cyA9ICVkXG4iLCAKKwkgICAgICAgIFZFUlNJT04sIGJvYXJkX2Rlc2NbYmQtPnR5cGVdLCAobG9uZyliZC0+cG9ydCwgKGxvbmcpYmQtPm1lbWJhc2UsIGJkLT5udW1wb3J0cyk7CisJY29uc29sZV9wcmludChtZXNnKTsKKworCW1lbXdpbm9mZihiZCwgMCk7CisKK30gLyogRW5kIHBvc3RfZmVwX2luaXQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGVwY2Fwb2xsICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZXBjYXBvbGwodW5zaWduZWQgbG9uZyBpZ25vcmVkKQoreyAvKiBCZWdpbiBlcGNhcG9sbCAqLworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY3JkOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBoZWFkLCB0YWlsOworCXN0cnVjdCBjaGFubmVsICpjaDsKKwlzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgdXBvbiBldmVyeSB0aW1lciBpbnRlcnJ1cHQuICBFdmVuIHRob3VnaAorCQl0aGUgRGlnaSBzZXJpZXMgY2FyZHMgYXJlIGNhcGFibGUgb2YgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzIHRoaXMgCisJCW1ldGhvZCBvZiBub24tbG9vcGluZyBwb2xsaW5nIGlzIG1vcmUgZWZmaWNpZW50LiAgVGhpcyByb3V0aW5lCisJCWNoZWNrcyBmb3IgY2FyZCBnZW5lcmF0ZWQgZXZlbnRzIChTdWNoIGFzIHJlY2VpdmUgZGF0YSwgYXJlIHRyYW5zbWl0CisJCWJ1ZmZlciBlbXB0eSkgYW5kIGFjdHMgb24gdGhvc2UgZXZlbnRzLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspIAorCXsgLyogQmVnaW4gZm9yIGVhY2ggY2FyZCAqLworCisJCWJkID0gJmJvYXJkc1tjcmRdOworCQljaCA9IGNhcmRfcHRyW2NyZF07CisKKwkJaWYgKChiZC0+c3RhdHVzID09IERJU0FCTEVEKSB8fCBkaWdpX3BvbGxlcl9pbmhpYml0ZWQpCisJCQljb250aW51ZTsgLyogQmVnaW4gbG9vcCBuZXh0IGludGVyYXRpb24gKi8KKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJYXNzZXJ0bWVtb2ZmIGlzIG5vdCBuZWVkZWQgaGVyZTsgaW5kZWVkIGl0IGlzIGFuIGVtcHR5IHN1YnJvdXRpbmUuCisJCQlJdCBpcyBiZWluZyBrZXB0IGJlY2F1c2UgZnV0dXJlIGJvYXJkcyBtYXkgbmVlZCB0aGlzIGFzIHdlbGwgYXMKKwkJCXNvbWUgbGVnYWN5IGJvYXJkcy4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWFzc2VydG1lbW9mZihjaCk7CisKKwkJZ2xvYmFsd2lub24oY2gpOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSW4gdGhpcyBjYXNlIGhlYWQgYW5kIHRhaWwgYWN0dWFsbHkgcmVmZXIgdG8gdGhlIGV2ZW50IHF1ZXVlIG5vdAorCQkJdGhlIHRyYW5zbWl0IG9yIHJlY2VpdmUgcXVldWUuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQloZWFkID0gY2gtPm1haWxib3gtPmVpbjsKKwkJdGFpbCA9IGNoLT5tYWlsYm94LT5lb3V0OworCQkKKwkJLyogSWYgaGVhZCBpc24ndCBlcXVhbCB0byB0YWlsIHdlIGhhdmUgYW4gZXZlbnQgKi8KKworCQlpZiAoaGVhZCAhPSB0YWlsKQorCQkJZG9ldmVudChjcmQpOworCisJCW1lbW9mZihjaCk7CisKKwl9IC8qIEVuZCBmb3IgZWFjaCBjYXJkICovCisKKwltb2RfdGltZXIoJmVwY2FfdGltZXIsIGppZmZpZXMgKyAoSFogLyAyNSkpOworCisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9IC8qIEVuZCBlcGNhcG9sbCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZG9ldmVudCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGRvZXZlbnQoaW50IGNyZCkKK3sgLyogQmVnaW4gZG9ldmVudCAqLworCisJdm9sYXRpbGUgdW5jaGFyICpldmVudGJ1ZjsKKwlzdHJ1Y3QgY2hhbm5lbCAqY2gsICpjaGFuMDsKKwlzdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXJlZ2lzdGVyIHZvbGF0aWxlIHVuc2lnbmVkIGludCB0YWlsLCBoZWFkOworCXJlZ2lzdGVyIGludCBldmVudCwgY2hhbm5lbDsKKwlyZWdpc3RlciBpbnQgbXN0YXQsIGxzdGF0OworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlUaGlzIHN1YnJvdXRpbmUgaXMgY2FsbGVkIGJ5IGVwY2Fwb2xsIHdoZW4gYW4gZXZlbnQgaXMgZGV0ZWN0ZWQgCisJCWluIHRoZSBldmVudCBxdWV1ZS4gIFRoaXMgcm91dGluZSByZXNwb25kcyB0byB0aG9zZSBldmVudHMuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwliZCA9ICZib2FyZHNbY3JkXTsKKworCWNoYW4wID0gY2FyZF9wdHJbY3JkXTsKKwllcGNhYXNzZXJ0KGNoYW4wIDw9ICZkaWdpX2NoYW5uZWxzW25iZGV2cyAtIDFdLCAiY2ggb3V0IG9mIHJhbmdlIik7CisKKwlhc3NlcnRnd2lub24oY2hhbjApOworCisJd2hpbGUgKCh0YWlsID0gY2hhbjAtPm1haWxib3gtPmVvdXQpICE9IChoZWFkID0gY2hhbjAtPm1haWxib3gtPmVpbikpIAorCXsgLyogQmVnaW4gd2hpbGUgc29tZXRoaW5nIGluIGV2ZW50IHF1ZXVlICovCisKKwkJYXNzZXJ0Z3dpbm9uKGNoYW4wKTsKKworCQlldmVudGJ1ZiA9ICh2b2xhdGlsZSB1bmNoYXIgKilidXNfdG9fdmlydCgodWxvbmcpKGJkLT5yZV9tYXBfbWVtYmFzZSArIHRhaWwgKyBJU1RBUlQpKTsKKworCQkvKiBHZXQgdGhlIGNoYW5uZWwgdGhlIGV2ZW50IG9jY3VycmVkIG9uICovCisJCWNoYW5uZWwgPSBldmVudGJ1ZlswXTsKKworCQkvKiBHZXQgdGhlIGFjdHVhbCBldmVudCBjb2RlIHRoYXQgb2NjdXJyZWQgKi8KKwkJZXZlbnQgPSBldmVudGJ1ZlsxXTsKKworCQkvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJVGhlIHR3byBhc3NpZ25tZW50cyBiZWxvdyBnZXQgdGhlIGN1cnJlbnQgbW9kZW0gc3RhdHVzIChtc3RhdCkKKwkJCWFuZCB0aGUgcHJldmlvdXMgbW9kZW0gc3RhdHVzIChsc3RhdCkuICBUaGVzZSBhcmUgdXNlZnVsIGJlY3Vhc2UKKwkJCWFuIGV2ZW50IGNvdWxkIHNpZ25hbCBhIGNoYW5nZSBpbiBtb2RlbSBzaWduYWxzIGl0c2VsZi4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCW1zdGF0ID0gZXZlbnRidWZbMl07CisJCWxzdGF0ID0gZXZlbnRidWZbM107CisKKwkJY2ggPSBjaGFuMCArIGNoYW5uZWw7CisKKwkJaWYgKCh1bnNpZ25lZCljaGFubmVsID49IGJkLT5udW1wb3J0cyB8fCAhY2gpIAorCQl7IAorCQkJaWYgKGNoYW5uZWwgPj0gYmQtPm51bXBvcnRzKQorCQkJCWNoID0gY2hhbjA7CisJCQliYyA9IGNoLT5icmRjaGFuOworCQkJZ290byBuZXh0OworCQl9CisKKwkJaWYgKChiYyA9IGNoLT5icmRjaGFuKSA9PSBOVUxMKQorCQkJZ290byBuZXh0OworCisJCWlmIChldmVudCAmIERBVEFfSU5EKSAKKwkJeyAvKiBCZWdpbiBEQVRBX0lORCAqLworCisJCQlyZWNlaXZlX2RhdGEoY2gpOworCQkJYXNzZXJ0Z3dpbm9uKGNoKTsKKworCQl9IC8qIEVuZCBEQVRBX0lORCAqLworCQkvKiBlbHNlICovLyogRml4IGZvciBEQ0QgdHJhbnNpdGlvbiBtaXNzZWQgYnVnICovCisJCWlmIChldmVudCAmIE1PREVNQ0hHX0lORCkgCisJCXsgLyogQmVnaW4gTU9ERU1DSEdfSU5EICovCisKKwkJCS8qIEEgbW9kZW0gc2lnbmFsIGNoYW5nZSBoYXMgYmVlbiBpbmRpY2F0ZWQgKi8KKworCQkJY2gtPmltb2RlbSA9IG1zdGF0OworCisJCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgCisJCQl7CisJCQkJaWYgKG1zdGF0ICYgY2gtPmRjZCkgIC8qIFdlIGFyZSBub3cgcmVjZWl2aW5nIGRjZCAqLworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOworCQkJCWVsc2UKKwkJCQkJcGNfc2NoZWRfZXZlbnQoY2gsIEVQQ0FfRVZFTlRfSEFOR1VQKTsgLyogTm8gZGNkOyBoYW5ndXAgKi8KKwkJCX0KKworCQl9IC8qIEVuZCBNT0RFTUNIR19JTkQgKi8KKworCQl0dHkgPSBjaC0+dHR5OworCQlpZiAodHR5KSAKKwkJeyAvKiBCZWdpbiBpZiB2YWxpZCB0dHkgKi8KKworCQkJaWYgKGV2ZW50ICYgQlJFQUtfSU5EKSAKKwkJCXsgLyogQmVnaW4gaWYgQlJFQUtfSU5EICovCisKKwkJCQkvKiBBIGJyZWFrIGhhcyBiZWVuIGluZGljYXRlZCAqLworCisJCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKworCQkJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCisJCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsgCisKKwkJCX0gLyogRW5kIGlmIEJSRUFLX0lORCAqLworCQkJZWxzZQorCQkJaWYgKGV2ZW50ICYgTE9XVFhfSU5EKSAKKwkJCXsgLyogQmVnaW4gTE9XVFhfSU5EICovCisKKwkJCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgCisJCQkJeyAvKiBCZWdpbiBpZiBMT1dXQUlUICovCisKKwkJCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5MT1dXQUlUOworCQkJCQl0dHlfd2FrZXVwKHR0eSk7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKworCQkJCX0gLyogRW5kIGlmIExPV1dBSVQgKi8KKworCQkJfSAvKiBFbmQgTE9XVFhfSU5EICovCisJCQllbHNlCisJCQlpZiAoZXZlbnQgJiBFTVBUWVRYX0lORCkgCisJCQl7IC8qIEJlZ2luIEVNUFRZVFhfSU5EICovCisKKwkJCQkvKiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCBieSBzZXR1cF9lbXB0eV9ldmVudCAqLworCisJCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5UWEJVU1k7CisJCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIEVNUFRZV0FJVCkgCisJCQkJeyAvKiBCZWdpbiBpZiBFTVBUWVdBSVQgKi8KKworCQkJCQljaC0+c3RhdHVzZmxhZ3MgJj0gfkVNUFRZV0FJVDsKKwkJCQkJdHR5X3dha2V1cCh0dHkpOworCisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKworCQkJCX0gLyogRW5kIGlmIEVNUFRZV0FJVCAqLworCisJCQl9IC8qIEVuZCBFTVBUWVRYX0lORCAqLworCisJCX0gLyogRW5kIGlmIHZhbGlkIHR0eSAqLworCisKKwluZXh0OgorCQlnbG9iYWx3aW5vbihjaCk7CisKKwkJaWYgKCFiYykKKwkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGJjID09IE5VTEwgaW4gZG9ldmVudCFcbiIpOworCQllbHNlIAorCQkJYmMtPmlkYXRhID0gMTsKKworCQljaGFuMC0+bWFpbGJveC0+ZW91dCA9ICh0YWlsICsgNCkgJiAoSU1BWCAtIElTVEFSVCAtIDQpOworCQlnbG9iYWx3aW5vbihjaGFuMCk7CisKKwl9IC8qIEVuZCB3aGlsZSBzb21ldGhpbmcgaW4gZXZlbnQgcXVldWUgKi8KKworfSAvKiBFbmQgZG9ldmVudCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZmVwY21kICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZmVwY21kKHN0cnVjdCBjaGFubmVsICpjaCwgaW50IGNtZCwgaW50IHdvcmRfb3JfYnl0ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZTIsIGludCBuY21kcywgaW50IGJ5dGVjbWQpCit7IC8qIEJlZ2luIGZlcGNtZCAqLworCisJdW5jaGFyICptZW1hZGRyOworCXVuc2lnbmVkIGludCBoZWFkLCBjbWRUYWlsLCBjbWRTdGFydCwgY21kTWF4OworCWxvbmcgY291bnQ7CisJaW50IG47CisKKwkvKiBUaGlzIGlzIHRoZSByb3V0aW5lIGluIHdoaWNoIGNvbW1hbmRzIG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhcmQuICovCisKKwlpZiAoY2gtPmJvYXJkLT5zdGF0dXMgPT0gRElTQUJMRUQpCisJeworCQlyZXR1cm47CisJfQorCisJYXNzZXJ0Z3dpbm9uKGNoKTsKKworCS8qIFJlbWVtYmVyIGhlYWQgKEFzIHdlbGwgYXMgbWF4KSBpcyBqdXN0IGFuIG9mZnNldCBub3QgYSBiYXNlIGFkZHIgKi8KKwloZWFkID0gY2gtPm1haWxib3gtPmNpbjsKKworCS8qIGNtZFN0YXJ0IGlzIGEgYmFzZSBhZGRyZXNzICovCisJY21kU3RhcnQgPSBjaC0+bWFpbGJveC0+Y3N0YXJ0OworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVdlIGRvIHRoZSBhZGRpdGlvbiBiZWxvdyBiZWNhdXNlIHdlIGRvIG5vdCB3YW50IGEgbWF4IHBvaW50ZXIgCisJCXJlbGF0aXZlIHRvIGNtZFN0YXJ0LiAgV2Ugd2FudCBhIG1heCBwb2ludGVyIHRoYXQgcG9pbnRzIGF0IHRoZSAKKwkJcGh5c2ljYWwgZW5kIG9mIHRoZSBjb21tYW5kIHF1ZXVlLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwljbWRNYXggPSAoY21kU3RhcnQgKyA0ICsgKGNoLT5tYWlsYm94LT5jbWF4KSk7CisKKwltZW1hZGRyID0gY2gtPmJvYXJkLT5yZV9tYXBfbWVtYmFzZTsKKworCS8qIAorCSAgIFRoZSBiZWxvdyBjb21tYW5kIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG5ld2VyIGtlcm5lbHMgKDIuMS54IGFuZAorCSAgIHVwKSBkbyBub3QgaGF2ZSBhIDE6MSB2aXJ0dWFsIHRvIHBoeXNpY2FsIG1hcHBpbmcuICBUaGUgYmVsb3cKKwkgICBjYWxsIGFkanVzdCBmb3IgdGhhdC4KKwkqLworCisJbWVtYWRkciA9ICh1bnNpZ25lZCBjaGFyICopYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpbWVtYWRkcik7CisKKwlpZiAoaGVhZCA+PSAoY21kTWF4IC0gY21kU3RhcnQpIHx8IChoZWFkICYgMDMpKSAKKwl7CisJCXByaW50ayhLRVJOX0VSUiAibGluZSAlZDogT3V0IG9mIHJhbmdlLCBjbWQgPSAleCwgaGVhZCA9ICV4XG4iLCBfX0xJTkVfXywgCisgICAgICAgICAgICAgIGNtZCwgaGVhZCk7CisJCXByaW50ayhLRVJOX0VSUiAibGluZSAlZDogT3V0IG9mIHJhbmdlLCBjbWRNYXggPSAleCwgY21kU3RhcnQgPSAleFxuIiwgX19MSU5FX18sIAorICAgICAgICAgICAgICBjbWRNYXgsIGNtZFN0YXJ0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChieXRlY21kKSAKKwl7CisJCSoodm9sYXRpbGUgdW5jaGFyICopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAwKSA9ICh1bmNoYXIpY21kOworCisJCSoodm9sYXRpbGUgdW5jaGFyICopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAxKSA9ICh1bmNoYXIpY2gtPmNoYW5uZWxudW07CisJCS8qIEJlbG93IHdvcmRfb3JfYnl0ZSBpcyBiaXRzIHRvIHNldCAqLworCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMikgPSAodW5jaGFyKXdvcmRfb3JfYnl0ZTsKKwkJLyogQmVsb3cgYnl0ZTIgaXMgYml0cyB0byByZXNldCAqLworCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMykgPSAodW5jaGFyKWJ5dGUyOworCisJfSAKKwllbHNlIAorCXsKKwkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDApID0gKHVuY2hhciljbWQ7CisJCSoodm9sYXRpbGUgdW5jaGFyICopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAxKSA9ICh1bmNoYXIpY2gtPmNoYW5uZWxudW07CisJCSoodm9sYXRpbGUgdXNob3J0KikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDIpID0gKHVzaG9ydCl3b3JkX29yX2J5dGU7CisJfQorCisJaGVhZCA9IChoZWFkICsgNCkgJiAoY21kTWF4IC0gY21kU3RhcnQgLSA0KTsKKwljaC0+bWFpbGJveC0+Y2luID0gaGVhZDsKKworCWNvdW50ID0gRkVQVElNRU9VVDsKKworCWZvciAoOzspIAorCXsgLyogQmVnaW4gZm9yZXZlciBsb29wICovCisKKwkJY291bnQtLTsKKwkJaWYgKGNvdW50ID09IDApIAorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBGZXAgbm90IHJlc3BvbmRpbmcgaW4gZmVwY21kKClcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJaGVhZCA9IGNoLT5tYWlsYm94LT5jaW47CisJCWNtZFRhaWwgPSBjaC0+bWFpbGJveC0+Y291dDsKKworCQluID0gKGhlYWQgLSBjbWRUYWlsKSAmIChjbWRNYXggLSBjbWRTdGFydCAtIDQpOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUJhc2ljYWxseSB0aGlzIHdpbGwgYnJlYWsgd2hlbiB0aGUgRkVQIGFja25vd2xlZGdlcyB0aGUgCisJCQljb21tYW5kIGJ5IGluY3JlbWVudGluZyBjbWRUYWlsIChNYWtpbmcgaXQgZXF1YWwgdG8gaGVhZCkuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlpZiAobiA8PSBuY21kcyAqIChzaXplb2Yoc2hvcnQpICogNCkpCisJCQlicmVhazsgLyogV2VsbCBuZWFybHkgZm9yZXZlciA6LSkgKi8KKworCX0gLyogRW5kIGZvcmV2ZXIgbG9vcCAqLworCit9IC8qIEVuZCBmZXBjbWQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJRGlnaSBwcm9kdWN0cyB1c2UgZmllbGRzIGluIHRoZWlyIGNoYW5uZWxzIHN0cnVjdHVyZXMgdGhhdCBhcmUgdmVyeQorCXNpbWlsYXIgdG8gdGhlIGNfY2ZsYWcgYW5kIGNfaWZsYWcgZmllbGRzIHR5cGljYWxseSBmb3VuZCBpbiBVTklYCisJdGVybWlvcyBzdHJ1Y3R1cmVzLiAgVGhlIGJlbG93IHRocmVlIHJvdXRpbmVzIGFsbG93IG1hcHBpbmdzIAorCWJldHdlZW4gdGhlc2UgaGFyZHdhcmUgImZsYWdzIiBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBMaW51eCBmbGFncy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiB0ZXJtaW9zMmRpZ2lfaCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgdGVybWlvczJkaWdpX2goc3RydWN0IGNoYW5uZWwgKmNoLCB1bnNpZ25lZCBjZmxhZykKK3sgLyogQmVnaW4gdGVybWlvczJkaWdpX2ggKi8KKworCXVuc2lnbmVkIHJlcyA9IDA7CisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSAKKwl7CisJCWNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgfD0gKFJUU1BBQ0UgfCBDVFNQQUNFKTsKKwkJcmVzIHw9ICgoY2gtPm1fY3RzKSB8IChjaC0+bV9ydHMpKTsKKwl9CisKKwlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIFJUU1BBQ0UpCisJCXJlcyB8PSBjaC0+bV9ydHM7CisKKwlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERUUlBBQ0UpCisJCXJlcyB8PSBjaC0+bV9kdHI7CisKKwlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIENUU1BBQ0UpCisJCXJlcyB8PSBjaC0+bV9jdHM7CisKKwlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERTUlBBQ0UpCisJCXJlcyB8PSBjaC0+ZHNyOworCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBEQ0RQQUNFKQorCQlyZXMgfD0gY2gtPmRjZDsKKworCWlmIChyZXMgJiAoY2gtPm1fcnRzKSkKKwkJY2gtPmRpZ2lleHQuZGlnaV9mbGFncyB8PSBSVFNQQUNFOworCisJaWYgKHJlcyAmIChjaC0+bV9jdHMpKQorCQljaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzIHw9IENUU1BBQ0U7CisKKwlyZXR1cm4gcmVzOworCit9IC8qIEVuZCB0ZXJtaW9zMmRpZ2lfaCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdGVybWlvczJkaWdpX2kgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB1bnNpZ25lZCB0ZXJtaW9zMmRpZ2lfaShzdHJ1Y3QgY2hhbm5lbCAqY2gsIHVuc2lnbmVkIGlmbGFnKQoreyAvKiBCZWdpbiB0ZXJtaW9zMmRpZ2lfaSAqLworCisJdW5zaWduZWQgcmVzID0gaWZsYWcgJiAoSUdOQlJLIHwgQlJLSU5UIHwgSUdOUEFSIHwgUEFSTVJLIHwgCisJICAgICAgICAgICAgICAgICAgICAgICAgSU5QQ0sgfCBJU1RSSVB8SVhPTnxJWEFOWXxJWE9GRik7CisJCisJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBESUdJX0FJWE9OKQorCQlyZXMgfD0gSUFJWE9OOworCXJldHVybiByZXM7CisKK30gLyogRW5kIHRlcm1pb3MyZGlnaV9pICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiB0ZXJtaW9zMmRpZ2lfYyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgdGVybWlvczJkaWdpX2Moc3RydWN0IGNoYW5uZWwgKmNoLCB1bnNpZ25lZCBjZmxhZykKK3sgLyogQmVnaW4gdGVybWlvczJkaWdpX2MgKi8KKworCXVuc2lnbmVkIHJlcyA9IDA7CisKKyNpZmRlZiBTUEVFRF9IQUNLCisJLyogQ0w6IEhBQ0sgdG8gZm9yY2UgMTE1MjAwIGF0IDM4NDAwIGFuZCA1NzYwMCBhdCAxOTIwMCBCYXVkICovCisJaWYgKChjZmxhZyAmIENCQVVEKT09IEIzODQwMCkgY2ZsYWc9Y2ZsYWcgLSBCMzg0MDAgKyBCMTE1MjAwOworCWlmICgoY2ZsYWcgJiBDQkFVRCk9PSBCMTkyMDApIGNmbGFnPWNmbGFnIC0gQjE5MjAwICsgQjU3NjAwOworI2VuZGlmIC8qIFNQRUVEX0hBQ0sgKi8KKworCWlmIChjZmxhZyAmIENCQVVERVgpCisJeyAvKiBCZWdpbiBkZXRlY3RlZCBDQkFVREVYICovCisKKwkJY2gtPmRpZ2lleHQuZGlnaV9mbGFncyB8PSBESUdJX0ZBU1Q7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgICBIVVBDTCBiaXQgaXMgdXNlZCBieSBGRVAgdG8gaW5kaWNhdGUgZmFzdCBiYXVkCisJCSAgIHRhYmxlIGlzIHRvIGJlIHVzZWQuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJcmVzIHw9IEZFUF9IVVBDTDsKKworCX0gLyogRW5kIGRldGVjdGVkIENCQVVERVggKi8KKwllbHNlIGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJj0gfkRJR0lfRkFTVDsgCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUNCQVVEIGhhcyBiaXQgcG9zaXRpb24gMHgxMDAwIHNldCB0aGVzZSBkYXlzIHRvIGluZGljYXRlIExpbnV4CisJCWJhdWQgcmF0ZSByZW1hcC4gIERpZ2kgaGFyZHdhcmUgY2FuJ3QgaGFuZGxlIHRoZSBiaXQgYXNzaWdubWVudC4KKwkJKFdlIHVzZSBhIGRpZmZlcmVudCBiaXQgYXNzaWdubWVudCBmb3IgaGlnaCBzcGVlZC4pLiAgQ2xlYXIgdGhpcworCQliaXQgb3V0LgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlyZXMgfD0gY2ZsYWcgJiAoKENCQVVEIF4gQ0JBVURFWCkgfCBQQVJPREQgfCBQQVJFTkIgfCBDU1RPUEIgfCBDU0laRSk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVRoaXMgZ2V0cyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgRGlnaSBjYXJkcyBoYXZlIHRoZWlyIG93bgorCQlyZXByZXNlbnRhdGlvbiBvZiBjX2NmbGFncyBjb250cm9saW5nIGJhdWQgcmF0ZS4gIEZvciB0aGUgbW9zdAorCQlwYXJ0IHRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBMaW51eCBpbXBsZW1lbnRhdGlvbi4gIEhvd2V2ZXI7CisJCURpZ2kgc3VwcG9ydHMgb25lIHJhdGUgKDc2ODAwKSB0aGF0IExpbnV4IGRvZXNuJ3QuICBUaGlzIG1lYW5zIAorCQl0aGF0IHRoZSBjX2NmbGFnIGVudHJ5IHRoYXQgd291bGQgbm9ybWFsbHkgbWVhbiA3NjgwMCBmb3IgRGlnaQorCQlhY3R1YWxseSBtZWFucyAxMTUyMDAgdW5kZXIgTGludXguICBXaXRob3V0IHRoZSBiZWxvdyBtYXBwaW5nLAorCQlhIHN0dHkgMTE1MjAwIHdvdWxkIG9ubHkgZHJpdmUgdGhlIGJvYXJkIGF0IDc2ODAwLiAgU2luY2UgCisJCXRoZSByYXRlIDIzMDQwMCBpcyBhbHNvIGZvdW5kIGFmdGVyIDc2ODAwLCB0aGUgc2FtZSBwcm9ibGVtIGFmZmxpY3RzCQorCQl1cyB3aGVuIHdlIGNob29zZSBhIHJhdGUgb2YgMjMwNDAwLiAgV2l0aG91dCB0aGUgYmVsb3cgbW9kaWZpY2lhdGlvbgorCQlzdHR5IDIzMDQwMCB3b3VsZCBhY3R1YWxseSBnaXZlIHVzIDExNTIwMC4KKworCQlUaGVyZSBhcmUgdHdvIGFkZGl0aW9uYWwgZGlmZmVyZW5jZXMuICBUaGUgTGludXggdmFsdWUgZm9yIENMT0NBTAorCQkoMHg4MDA7IDAwMDQwMDApIGhhcyBubyBtZWFuaW5nIHRvIHRoZSBEaWdpIGhhcmR3YXJlLiAgQWxzbyBpbiAKKwkJbGF0ZXIgcmVsZWFzZXMgb2YgTGludXg7IHRoZSBDQkFVRCBkZWZpbmUgaGFzIENCQVVERVggKDB4MTAwMDsKKwkJMDAxMDAwMCkgb3JlZCBpbnRvIGl0IChDQkFVRCA9IDB4MTAwZiBhcyBvcHBvc2VkIHRvIDB4ZikuIENCQVVERVgKKwkJc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGEgc2NyZWVuZWQgb3V0IHByaW9yIHRvIHRlcm1pb3MyZGlnaV9jIAorCQlyZXR1cm5pbmcuICBTaW5jZSBDTE9DQUwgaXNuJ3QgdXNlZCBieSB0aGUgYm9hcmQgdGhpcyBjYW4gYmUKKwkJaWdub3JlZCBhcyBsb25nIGFzIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyB1c2VkIG9ubHkgYnkgRGlnaSBoYXJkd2FyZS4gCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmIChjZmxhZyAmIENCQVVERVgpCisJeworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlUaGUgYmVsb3cgY29kZSBpcyB0cnlpbmcgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBiYXVkIHJhdGVzCisJCQkxMTUyMDAgYW5kIDIzMDQwMCBhcmUgcmVtYXBwZWQuICBXZSB1c2UgZXhjbHVzaXZlIG9yIGJlY2F1c2UKKwkJCXRoZSB2YXJpb3VzIGJhdWQgcmF0ZXMgc2hhcmUgY29tbW9uIGJpdCBwb3NpdGlvbnMgYW5kIHRoZXJlZm9yZQorCQkJY2FuJ3QgYmUgdGVzdGVkIGZvciBlYXNpbHkuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJCQkKKwkJaWYgKCghKChjZmxhZyAmIDB4NykgXiAoQjExNTIwMCAmIH5DQkFVREVYKSkpIHx8IAorCQkgICAgKCEoKGNmbGFnICYgMHg3KSBeIChCMjMwNDAwICYgfkNCQVVERVgpKSkpCisJCXsKKwkJCXJlcyArPSAxOworCQl9CisJfQorCisJcmV0dXJuIHJlczsKKworfSAvKiBFbmQgdGVybWlvczJkaWdpX2MgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGVwY2FwYXJhbSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZXBjYXBhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBjaGFubmVsICpjaCkKK3sgLyogQmVnaW4gZXBjYXBhcmFtICovCisKKwl1bnNpZ25lZCBpbnQgY21kSGVhZDsKKwlzdHJ1Y3QgdGVybWlvcyAqdHM7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXVuc2lnbmVkIG12YWwsIGhmbG93LCBjZmxhZywgaWZsYWc7CisKKwliYyA9IGNoLT5icmRjaGFuOworCWVwY2Fhc3NlcnQoYmMgIT0wLCAiYmMgb3V0IG9mIHJhbmdlIik7CisKKwlhc3NlcnRnd2lub24oY2gpOworCisJdHMgPSB0dHktPnRlcm1pb3M7CisKKwlpZiAoKHRzLT5jX2NmbGFnICYgQ0JBVUQpID09IDApIAorCXsgLyogQmVnaW4gQ0JBVUQgZGV0ZWN0ZWQgKi8KKworCQljbWRIZWFkID0gYmMtPnJpbjsKKwkJYmMtPnJvdXQgPSBjbWRIZWFkOworCQljbWRIZWFkID0gYmMtPnRpbjsKKworCQkvKiBDaGFuZ2luZyBiYXVkIGluIG1pZC1zdHJlYW0gdHJhbnNtaXNzaW9uIGNhbiBiZSB3b25kZXJmdWwgKi8KKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlGbHVzaCBjdXJyZW50IHRyYW5zbWl0IGJ1ZmZlciBieSBzZXR0aW5nIGNtZFRhaWwgcG9pbnRlciAodG91dCkKKwkJCXRvIGNtZEhlYWQgcG9pbnRlciAodGluKS4gIEhvcGVmdWxseSB0aGUgdHJhbnNtaXQgYnVmZmVyIGlzIGVtcHR5LgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWZlcGNtZChjaCwgU1RPVVQsICh1bnNpZ25lZCkgY21kSGVhZCwgMCwgMCwgMCk7CisJCW12YWwgPSAwOworCisJfSAvKiBFbmQgQ0JBVUQgZGV0ZWN0ZWQgKi8KKwllbHNlIAorCXsgLyogQmVnaW4gQ0JBVUQgbm90IGRldGVjdGVkICovCisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJY19jZmxhZ3MgaGF2ZSBjaGFuZ2VkIGJ1dCB0aGF0IGNoYW5nZSBoYWQgbm90aGluZyB0byBkbyB3aXRoIEJBVUQuCisJCQlQcm9wYWdhdGUgdGhlIGNoYW5nZSB0byB0aGUgY2FyZC4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKKworCQljZmxhZyA9IHRlcm1pb3MyZGlnaV9jKGNoLCB0cy0+Y19jZmxhZyk7CisKKwkJaWYgKGNmbGFnICE9IGNoLT5mZXBjZmxhZykgCisJCXsKKwkJCWNoLT5mZXBjZmxhZyA9IGNmbGFnOworCQkJLyogU2V0IGJhdWQgcmF0ZSwgY2hhciBzaXplLCBzdG9wIGJpdHMsIHBhcml0eSAqLworCQkJZmVwY21kKGNoLCBTRVRDVFJMRkxBR1MsICh1bnNpZ25lZCkgY2ZsYWcsIDAsIDAsIDApOworCQl9CisKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlJZiB0aGUgdXNlciBoYXMgbm90IGZvcmNlZCBDTE9DQUwgYW5kIGlmIHRoZSBkZXZpY2UgaXMgbm90IGEgCisJCQlDQUxMT1VUIGRldmljZSAoV2hpY2ggaXMgYWx3YXlzIENMT0NBTCkgd2Ugc2V0IGZsYWdzIHN1Y2ggdGhhdAorCQkJdGhlIGRyaXZlciB3aWxsIHdhaXQgb24gY2FycmllciBkZXRlY3QuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlpZiAodHMtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCXsgLyogQmVnaW4gaXQgaXMgYSBjdWQgZGV2aWNlIG9yIGEgdHR5RCBkZXZpY2Ugd2l0aCBDTE9DQUwgb24gKi8KKwkJCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwkJfSAvKiBFbmQgaXQgaXMgYSBjdWQgZGV2aWNlIG9yIGEgdHR5RCBkZXZpY2Ugd2l0aCBDTE9DQUwgb24gKi8KKwkJZWxzZQorCQl7IC8qIEJlZ2luIGl0IGlzIGEgdHR5RCBkZXZpY2UgKi8KKwkJCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCQl9IC8qIEVuZCBpdCBpcyBhIHR0eUQgZGV2aWNlICovCisKKwkJbXZhbCA9IGNoLT5tX2R0ciB8IGNoLT5tX3J0czsKKworCX0gLyogRW5kIENCQVVEIG5vdCBkZXRlY3RlZCAqLworCisJaWZsYWcgPSB0ZXJtaW9zMmRpZ2lfaShjaCwgdHMtPmNfaWZsYWcpOworCisJLyogQ2hlY2sgaW5wdXQgbW9kZSBmbGFncyAqLworCisJaWYgKGlmbGFnICE9IGNoLT5mZXBpZmxhZykgCisJeworCQljaC0+ZmVwaWZsYWcgPSBpZmxhZzsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUNvbW1hbmQgc2V0cyBjaGFubmVscyBpZmxhZyBzdHJ1Y3R1cmUgb24gdGhlIGJvYXJkLiBTdWNoIHRoaW5ncyAKKwkJCWFzIGlucHV0IHNvZnQgZmxvdyBjb250cm9sLCBoYW5kbGluZyBvZiBwYXJpdHkgZXJyb3JzLCBhbmQKKwkJCWJyZWFrIGhhbmRsaW5nIGFyZSBhbGwgc2V0IGhlcmUuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQkvKiBicmVhayBoYW5kbGluZywgcGFyaXR5IGhhbmRsaW5nLCBpbnB1dCBzdHJpcHBpbmcsIGZsb3cgY29udHJvbCBjaGFycyAqLworCQlmZXBjbWQoY2gsIFNFVElGTEFHUywgKHVuc2lnbmVkIGludCkgY2gtPmZlcGlmbGFnLCAwLCAwLCAwKTsKKwl9CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJU2V0IHRoZSBib2FyZCBtaW50IHZhbHVlIGZvciB0aGlzIGNoYW5uZWwuICBUaGlzIHdpbGwgY2F1c2UgaGFyZHdhcmUKKwkJZXZlbnRzIHRvIGJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgdGhlIERDRCBzaWduYWwgKERlc2NyaWJlZCBpbiBtaW50KSAKKwkJY2hhbmdlcy4JCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWJjLT5taW50ID0gY2gtPmRjZDsKKworCWlmICgodHMtPmNfY2ZsYWcgJiBDTE9DQUwpIHx8IChjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICYgRElHSV9GT1JDRURDRCkpCisJCWlmIChjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICYgRElHSV9GT1JDRURDRCkKKwkJCWJjLT5taW50ID0gMDsKKworCWNoLT5pbW9kZW0gPSBiYy0+bXN0YXQ7CisKKwloZmxvdyA9IHRlcm1pb3MyZGlnaV9oKGNoLCB0cy0+Y19jZmxhZyk7CisKKwlpZiAoaGZsb3cgIT0gY2gtPmhmbG93KSAKKwl7CisJCWNoLT5oZmxvdyA9IGhmbG93OworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlIYXJkIGZsb3cgY29udHJvbCBoYXMgYmVlbiBzZWxlY3RlZCBidXQgdGhlIGJvYXJkIGlzIG5vdAorCQkJdXNpbmcgaXQuICBBY3RpdmF0ZSBoYXJkIGZsb3cgY29udHJvbCBub3cuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJZmVwY21kKGNoLCBTRVRIRkxPVywgaGZsb3csIDB4ZmYsIDAsIDEpOworCX0KKwkKKworCW12YWwgXj0gY2gtPm1vZGVtZmFrZSAmIChtdmFsIF4gY2gtPm1vZGVtKTsKKworCWlmIChjaC0+b21vZGVtIF4gbXZhbCkgCisJeworCQljaC0+b21vZGVtID0gbXZhbDsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJVGhlIGJlbG93IGNvbW1hbmQgc2V0cyB0aGUgRFRSIGFuZCBSVFMgbXN0YXQgc3RydWN0dXJlLiAgSWYKKwkJCWhhcmQgZmxvdyBjb250cm9sIGlzIE5PVCBhY3RpdmUgdGhlc2UgY2hhbmdlcyB3aWxsIGRyaXZlIHRoZQorCQkJb3V0cHV0IG9mIHRoZSBhY3R1YWwgRFRSIGFuZCBSVFMgbGluZXMuICBJZiBoYXJkIGZsb3cgY29udHJvbCAKKwkJCWlzIGFjdGl2ZSwgdGhlIGNoYW5nZXMgd2lsbCBiZSBzYXZlZCBpbiB0aGUgbXN0YXQgc3RydWN0dXJlIGFuZAorCQkJb25seSBhc3NlcnRlZCB3aGVuIGhhcmQgZmxvdyBjb250cm9sIGlzIHR1cm5lZCBvZmYuIAorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCS8qIEZpcnN0IHJlc2V0IERUUiAmIFJUUzsgdGhlbiBzZXQgdGhlbSAqLworCQlmZXBjbWQoY2gsIFNFVE1PREVNLCAwLCAoKGNoLT5tX2R0cil8KGNoLT5tX3J0cykpLCAwLCAxKTsKKwkJZmVwY21kKGNoLCBTRVRNT0RFTSwgbXZhbCwgMCwgMCwgMSk7CisKKwl9CisKKwlpZiAoY2gtPnN0YXJ0YyAhPSBjaC0+ZmVwc3RhcnRjIHx8IGNoLT5zdG9wYyAhPSBjaC0+ZmVwc3RvcGMpIAorCXsKKwkJY2gtPmZlcHN0YXJ0YyA9IGNoLT5zdGFydGM7CisJCWNoLT5mZXBzdG9wYyA9IGNoLT5zdG9wYzsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCVRoZSBYT04gLyBYT0ZGIGNoYXJhY3RlcnMgaGF2ZSBjaGFuZ2VkOyBwcm9wYWdhdGUgdGhlc2UKKwkJCWNoYW5nZXMgdG8gdGhlIGNhcmQuCQorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlmZXBjbWQoY2gsIFNPTk9GRkMsIGNoLT5mZXBzdGFydGMsIGNoLT5mZXBzdG9wYywgMCwgMSk7CisJfQorCisJaWYgKGNoLT5zdGFydGNhICE9IGNoLT5mZXBzdGFydGNhIHx8IGNoLT5zdG9wY2EgIT0gY2gtPmZlcHN0b3BjYSkgCisJeworCQljaC0+ZmVwc3RhcnRjYSA9IGNoLT5zdGFydGNhOworCQljaC0+ZmVwc3RvcGNhID0gY2gtPnN0b3BjYTsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCVNpbWlsYXIgdG8gdGhlIGFib3ZlLCB0aGlzIHRpbWUgdGhlIGF1eGlsYXJseSBYT04gLyBYT0ZGIAorCQkJY2hhcmFjdGVycyBoYXZlIGNoYW5nZWQ7IHByb3BhZ2F0ZSB0aGVzZSBjaGFuZ2VzIHRvIHRoZSBjYXJkLgorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCQlmZXBjbWQoY2gsIFNBVVhPTk9GRkMsIGNoLT5mZXBzdGFydGNhLCBjaC0+ZmVwc3RvcGNhLCAwLCAxKTsKKwl9CisKK30gLyogRW5kIGVwY2FwYXJhbSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcmVjZWl2ZV9kYXRhICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCByZWNlaXZlX2RhdGEoc3RydWN0IGNoYW5uZWwgKmNoKQoreyAvKiBCZWdpbiByZWNlaXZlX2RhdGEgKi8KKworCXVuY2hhciAqcnB0cjsKKwlzdHJ1Y3QgdGVybWlvcyAqdHMgPSBOVUxMOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXJlZ2lzdGVyIGludCBkYXRhVG9SZWFkLCB3cmFwZ2FwLCBieXRlc0F2YWlsYWJsZTsKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgdGFpbCwgaGVhZDsKKwl1bnNpZ25lZCBpbnQgd3JhcG1hc2s7CisJaW50IHJjOworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBkb2ludCB3aGVuIGEgcmVjZWl2ZSBkYXRhIGV2ZW50IAorCQloYXMgdGFrZW4gcGxhY2UuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJZ2xvYmFsd2lub24oY2gpOworCisJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFJYU1RPUFBFRCkKKwkJcmV0dXJuOworCisJdHR5ID0gY2gtPnR0eTsKKwlpZiAodHR5KQorCQl0cyA9IHR0eS0+dGVybWlvczsKKworCWJjID0gY2gtPmJyZGNoYW47CisKKwlpZiAoIWJjKSAKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGJjIGlzIE5VTEwgaW4gcmVjZWl2ZV9kYXRhIVxuIik7CisJCXJldHVybjsKKwl9CisKKwl3cmFwbWFzayA9IGNoLT5yeGJ1ZnNpemUgLSAxOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCQlHZXQgdGhlIGhlYWQgYW5kIHRhaWwgcG9pbnRlcnMgdG8gdGhlIHJlY2VpdmVyIHF1ZXVlLiAgV3JhcCB0aGUgCisJCWhlYWQgcG9pbnRlciBpZiBpdCBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwloZWFkID0gYmMtPnJpbjsKKwloZWFkICY9IHdyYXBtYXNrOworCXRhaWwgPSBiYy0+cm91dCAmIHdyYXBtYXNrOworCisJYnl0ZXNBdmFpbGFibGUgPSAoaGVhZCAtIHRhaWwpICYgd3JhcG1hc2s7CisKKwlpZiAoYnl0ZXNBdmFpbGFibGUgPT0gMCkKKwkJcmV0dXJuOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgSWYgQ1JFQUQgYml0IGlzIG9mZiBvciBkZXZpY2Ugbm90IG9wZW4sIHNldCBUWCB0YWlsIHRvIGhlYWQKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICghdHR5IHx8ICF0cyB8fCAhKHRzLT5jX2NmbGFnICYgQ1JFQUQpKSAKKwl7CisJCWJjLT5yb3V0ID0gaGVhZDsKKwkJcmV0dXJuOworCX0KKworCWlmICh0dHktPmZsaXAuY291bnQgPT0gVFRZX0ZMSVBCVUZfU0laRSkgCisJCXJldHVybjsKKworCWlmIChiYy0+b3J1bikgCisJeworCQliYy0+b3J1biA9IDA7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm92ZXJydW4hIERpZ2lCb2FyZCBkZXZpY2UgJXNcbiIsdHR5LT5uYW1lKTsKKwl9CisKKwlyeHdpbm9uKGNoKTsKKwlycHRyID0gdHR5LT5mbGlwLmNoYXJfYnVmX3B0cjsKKwlyYyA9IHR0eS0+ZmxpcC5jb3VudDsKKworCXdoaWxlIChieXRlc0F2YWlsYWJsZSA+IDApIAorCXsgLyogQmVnaW4gd2hpbGUgdGhlcmUgaXMgZGF0YSBvbiB0aGUgY2FyZCAqLworCisJCXdyYXBnYXAgPSAoaGVhZCA+PSB0YWlsKSA/IGhlYWQgLSB0YWlsIDogY2gtPnJ4YnVmc2l6ZSAtIHRhaWw7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlFdmVuIGlmIGhlYWQgaGFzIHdyYXBwZWQgYXJvdW5kIG9ubHkgcmVwb3J0IHRoZSBhbW91bnQgb2YKKwkJCWRhdGEgdG8gYmUgZXF1YWwgdG8gdGhlIHNpemUgLSB0YWlsLiAgUmVtZW1iZXIgbWVtY3B5IGNhbid0CisJCQlhdXRvbWF0aWNseSB3cmFwIGFyb3VuZCB0aGUgcmVjZWl2ZSBidWZmZXIuCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJZGF0YVRvUmVhZCA9ICh3cmFwZ2FwIDwgYnl0ZXNBdmFpbGFibGUpID8gd3JhcGdhcCA6IGJ5dGVzQXZhaWxhYmxlOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAgIE1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgYnVmZmVyCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKChyYyArIGRhdGFUb1JlYWQpID4gVFRZX0ZMSVBCVUZfU0laRSkKKwkJCWRhdGFUb1JlYWQgPSBUVFlfRkxJUEJVRl9TSVpFIC0gcmM7CisKKwkJaWYgKGRhdGFUb1JlYWQgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJTW92ZSBkYXRhIHJlYWQgZnJvbSBvdXIgY2FyZCBpbnRvIHRoZSBsaW5lIGRpc2NpcGxpbmVzIGJ1ZmZlcgorCQkJZm9yIHRyYW5zbGF0aW9uIGlmIG5lY2Vzc2FyeS4KKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJaWYgKChtZW1jcHkocnB0ciwgY2gtPnJ4cHRyICsgdGFpbCwgZGF0YVRvUmVhZCkpICE9IHJwdHIpCisJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSByZWNlaXZlX2RhdGEgOiBtZW1jcHkgZmFpbGVkXG4iKTsKKwkJCQorCQlyYyAgICs9IGRhdGFUb1JlYWQ7CisJCXJwdHIgKz0gZGF0YVRvUmVhZDsKKwkJdGFpbCA9ICh0YWlsICsgZGF0YVRvUmVhZCkgJiB3cmFwbWFzazsKKwkJYnl0ZXNBdmFpbGFibGUgLT0gZGF0YVRvUmVhZDsKKworCX0gLyogRW5kIHdoaWxlIHRoZXJlIGlzIGRhdGEgb24gdGhlIGNhcmQgKi8KKworCisJdHR5LT5mbGlwLmNvdW50ID0gcmM7CisJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IHJwdHI7CisJZ2xvYmFsd2lub24oY2gpOworCWJjLT5yb3V0ID0gdGFpbDsKKworCS8qIE11c3QgYmUgY2FsbGVkIHdpdGggZ2xvYmFsIGRhdGEgKi8KKwl0dHlfc2NoZWR1bGVfZmxpcChjaC0+dHR5KTsgCisJcmV0dXJuOworCit9IC8qIEVuZCByZWNlaXZlX2RhdGEgKi8KKworc3RhdGljIGludCBpbmZvX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSAKKwl7IC8qIEJlZ2luIHN3aXRjaCBjbWQgKi8KKworCQljYXNlIERJR0lfR0VUSU5GTzoKKwkJeyAvKiBCZWdpbiBjYXNlIERJR0lfR0VUSU5GTyAqLworCisJCQlzdHJ1Y3QgZGlnaV9pbmZvIGRpIDsKKwkJCWludCBicmQ7CisKKwkJCWdldFVzZXIoYnJkLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisKKwkJCWlmICgoYnJkIDwgMCkgfHwgKGJyZCA+PSBudW1fY2FyZHMpIHx8IChudW1fY2FyZHMgPT0gMCkpCisJCQkJcmV0dXJuICgtRU5PREVWKTsKKworCQkJbWVtc2V0KCZkaSwgMCwgc2l6ZW9mKGRpKSk7CisKKwkJCWRpLmJvYXJkID0gYnJkIDsgCisJCQlkaS5zdGF0dXMgPSBib2FyZHNbYnJkXS5zdGF0dXM7CisJCQlkaS50eXBlID0gYm9hcmRzW2JyZF0udHlwZSA7CisJCQlkaS5udW1wb3J0cyA9IGJvYXJkc1ticmRdLm51bXBvcnRzIDsKKwkJCWRpLnBvcnQgPSBib2FyZHNbYnJkXS5wb3J0IDsKKwkJCWRpLm1lbWJhc2UgPSBib2FyZHNbYnJkXS5tZW1iYXNlIDsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZkaSwgc2l6ZW9mIChkaSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisKKwkJfSAvKiBFbmQgY2FzZSBESUdJX0dFVElORk8gKi8KKworCQljYXNlIERJR0lfUE9MTEVSOgorCQl7IC8qIEJlZ2luIGNhc2UgRElHSV9QT0xMRVIgKi8KKworCQkJaW50IGJyZCA9IGFyZyAmIDB4ZmYwMDAwMDAgPj4gMTYgOyAKKwkJCXVuc2lnbmVkIGNoYXIgc3RhdGUgPSBhcmcgJiAweGZmIDsgCisKKwkJCWlmICgoYnJkIDwgMCkgfHwgKGJyZCA+PSBudW1fY2FyZHMpKQorCQkJeworCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIERJR0kgUE9MTEVSIDogYnJkIG5vdCB2YWxpZCFcbiIpOworCQkJCXJldHVybiAoLUVOT0RFVik7CisJCQl9CisKKwkJCWRpZ2lfcG9sbGVyX2luaGliaXRlZCA9IHN0YXRlIDsKKwkJCWJyZWFrIDsgCisKKwkJfSAvKiBFbmQgY2FzZSBESUdJX1BPTExFUiAqLworCisJCWNhc2UgRElHSV9JTklUOgorCQl7IC8qIEJlZ2luIGNhc2UgRElHSV9JTklUICovCisKKwkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCVRoaXMgY2FsbCBpcyBtYWRlIGJ5IHRoZSBhcHBzIHRvIGNvbXBsZXRlIHRoZSBpbml0aWxpemF0aW9uCisJCQkJb2YgdGhlIGJvYXJkKHMpLiAgVGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nCisJCQkJdGhlIGNhcmQgdG8gaXRzIGluaXRpYWwgc3RhdGUgYW5kIHNldHRpbmcgdGhlIGRyaXZlcnMgY29udHJvbAorCQkJCWZpZWxkcyB0byB0aGUgc3V0aWFubGUgc2V0dGluZ3MgZm9yIHRoZSBjYXJkIGluIHF1ZXN0aW9uLgorCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCQkKKwkJCWludCBjcmQgOyAKKwkJCWZvciAoY3JkID0gMDsgY3JkIDwgbnVtX2NhcmRzOyBjcmQrKykgCisJCQkJcG9zdF9mZXBfaW5pdCAoY3JkKTsKKworCQkJYnJlYWsgOyAKKworCQl9IC8qIEVuZCBjYXNlIERJR0lfSU5JVCAqLworCisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwl9IC8qIEVuZCBzd2l0Y2ggY21kICovCisJcmV0dXJuICgwKSA7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfaW9jdGwgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGNfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXVuc2lnbmVkIGludCBtc3RhdCwgbWZsYWcgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY2gpCisJCWJjID0gY2gtPmJyZGNoYW47CisJZWxzZQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gY2ggaXMgTlVMTCBpbiBwY190aW9jbWdldCFcbiIpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJZ2xvYmFsd2lub24oY2gpOworCW1zdGF0ID0gYmMtPm1zdGF0OworCW1lbW9mZihjaCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlpZiAobXN0YXQgJiBjaC0+bV9kdHIpCisJCW1mbGFnIHw9IFRJT0NNX0RUUjsKKworCWlmIChtc3RhdCAmIGNoLT5tX3J0cykKKwkJbWZsYWcgfD0gVElPQ01fUlRTOworCisJaWYgKG1zdGF0ICYgY2gtPm1fY3RzKQorCQltZmxhZyB8PSBUSU9DTV9DVFM7CisKKwlpZiAobXN0YXQgJiBjaC0+ZHNyKQorCQltZmxhZyB8PSBUSU9DTV9EU1I7CisKKwlpZiAobXN0YXQgJiBjaC0+bV9yaSkKKwkJbWZsYWcgfD0gVElPQ01fUkk7CisKKwlpZiAobXN0YXQgJiBjaC0+ZGNkKQorCQltZmxhZyB8PSBUSU9DTV9DRDsKKworCXJldHVybiBtZmxhZzsKK30KKworc3RhdGljIGludCBwY190aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFjaCkgeworCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBjaCBpcyBOVUxMIGluIHBjX3Rpb2Ntc2V0IVxuIik7CisJCXJldHVybigtRUlOVkFMKTsKKwl9CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwkvKgorCSAqIEkgdGhpbmsgdGhpcyBtb2RlbWZha2Ugc3R1ZmYgaXMgYnJva2VuLiAgSXQgZG9lc24ndAorCSAqIGNvcnJlY3RseSByZWZsZWN0IHRoZSBiZWhhdmlvdXIgZGVzaXJlZCBieSB0aGUgVElPQ00qCisJICogaW9jdGxzLiAgVGhlcmVmb3JlIHRoaXMgaXMgcHJvYmFibHkgYnJva2VuLgorCSAqLworCWlmIChzZXQgJiBUSU9DTV9SVFMpIHsKKwkJY2gtPm1vZGVtZmFrZSB8PSBjaC0+bV9ydHM7CisJCWNoLT5tb2RlbSB8PSBjaC0+bV9ydHM7CisJfQorCWlmIChzZXQgJiBUSU9DTV9EVFIpIHsKKwkJY2gtPm1vZGVtZmFrZSB8PSBjaC0+bV9kdHI7CisJCWNoLT5tb2RlbSB8PSBjaC0+bV9kdHI7CisJfQorCWlmIChjbGVhciAmIFRJT0NNX1JUUykgeworCQljaC0+bW9kZW1mYWtlIHw9IGNoLT5tX3J0czsKKwkJY2gtPm1vZGVtICY9IH5jaC0+bV9ydHM7CisJfQorCWlmIChjbGVhciAmIFRJT0NNX0RUUikgeworCQljaC0+bW9kZW1mYWtlIHw9IGNoLT5tX2R0cjsKKwkJY2gtPm1vZGVtICY9IH5jaC0+bV9kdHI7CisJfQorCisJZ2xvYmFsd2lub24oY2gpOworCisJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVRoZSBiZWxvdyByb3V0aW5lIGdlbmVyYWxseSBzZXRzIHVwIHBhcml0eSwgYmF1ZCwgZmxvdyBjb250cm9sCisJCWlzc3VlcywgZXRjLi4uLiBJdCBlZmZlY3QgYm90aCBjb250cm9sIGZsYWdzIGFuZCBpbnB1dCBmbGFncy4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWVwY2FwYXJhbSh0dHksY2gpOworCW1lbW9mZihjaCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7IC8qIEJlZ2luIHBjX2lvY3RsICovCisKKwlkaWdpZmxvd190IGRmbG93OworCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWZsYWcsIG1zdGF0OworCXVuc2lnbmVkIGNoYXIgc3RhcnRjLCBzdG9wYzsKKwl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJCisJaWYgKGNoKQorCQliYyA9IGNoLT5icmRjaGFuOworCWVsc2UgCisJeworCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBjaCBpcyBOVUxMIGluIHBjX2lvY3RsIVxuIik7CisJCXJldHVybigtRUlOVkFMKTsKKwl9CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJRm9yIFBPU0lYIGNvbXBsaWFuY2Ugd2UgbmVlZCB0byBhZGQgbW9yZSBpb2N0bHMuICBTZWUgdHR5X2lvY3RsLmMKKwkJaW4gL3Vzci9zcmMvbGludXgvZHJpdmVycy9jaGFyIGZvciBhIGdvb2QgZXhhbXBsZS4gIEluIHBhcnRpY3VsYXIgCisJCXRoaW5rIGFib3V0IGFkZGluZyBUQ1NFVEFGLCBUQ1NFVEFXLCBUQ1NFVEEsIFRDU0VUU0YsIFRDU0VUU1csIFRDU0VUUy4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlzd2l0Y2ggKGNtZCkgCisJeyAvKiBCZWdpbiBzd2l0Y2ggY21kICovCisKKwkJY2FzZSBUQ0dFVFM6CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIAorCQkJCQkgdHR5LT50ZXJtaW9zLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybigwKTsKKworCQljYXNlIFRDR0VUQToKKwkJCXJldHVybiBnZXRfdGVybWlvKHR0eSwgYXJncCk7CisKKwkJY2FzZSBUQ1NCUks6CS8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCisJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCS8qIFNldHVwIGFuIGV2ZW50IHRvIGluZGljYXRlIHdoZW4gdGhlIHRyYW5zbWl0IGJ1ZmZlciBlbXB0aWVzICovCisKKwkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CQkKKwkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJCWlmICghYXJnKQorCQkJCWRpZ2lfc2VuZF9icmVhayhjaCwgSFovNCk7ICAgIC8qIDEvNCBzZWNvbmQgKi8KKwkJCXJldHVybiAwOworCisJCWNhc2UgVENTQlJLUDoJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLworCisJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCS8qIFNldHVwIGFuIGV2ZW50IHRvIGluZGljYXRlIHdoZW4gdGhlIHRyYW5zbWl0IGJ1ZmZlciBlbXB0aWVzICovCisKKwkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CQkKKwkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJCWRpZ2lfc2VuZF9icmVhayhjaCwgYXJnID8gYXJnKihIWi8xMCkgOiBIWi80KTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCQkJaWYgKHB1dF91c2VyKENfQ0xPQ0FMKHR0eSk/MTowLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUSU9DU1NPRlRDQVI6CisJCXsKKwkJCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCQkJaWYgKGdldF91c2VyKHZhbHVlLCAodW5zaWduZWQgX191c2VyICopYXJncCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkJCSgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJCSAodmFsdWUgPyBDTE9DQUwgOiAwKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVElPQ01PREc6CisJCQltZmxhZyA9IHBjX3Rpb2NtZ2V0KHR0eSwgZmlsZSk7CisJCQlpZiAocHV0X3VzZXIobWZsYWcsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisKKwkJY2FzZSBUSU9DTU9EUzoKKwkJCWlmIChnZXRfdXNlcihtc3RhdCwgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIHBjX3Rpb2Ntc2V0KHR0eSwgZmlsZSwgbXN0YXQsIH5tc3RhdCk7CisKKwkJY2FzZSBUSU9DU0RUUjoKKwkJCWNoLT5vbW9kZW0gfD0gY2gtPm1fZHRyOworCQkJY2xpKCk7CisJCQlnbG9iYWx3aW5vbihjaCk7CisJCQlmZXBjbWQoY2gsIFNFVE1PREVNLCBjaC0+bV9kdHIsIDAsIDEwLCAxKTsKKwkJCW1lbW9mZihjaCk7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVElPQ0NEVFI6CisJCQljaC0+b21vZGVtICY9IH5jaC0+bV9kdHI7CisJCQljbGkoKTsKKwkJCWdsb2JhbHdpbm9uKGNoKTsKKwkJCWZlcGNtZChjaCwgU0VUTU9ERU0sIDAsIGNoLT5tX2R0ciwgMTAsIDEpOworCQkJbWVtb2ZmKGNoKTsKKwkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBESUdJX0dFVEE6CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaC0+ZGlnaWV4dCwgc2l6ZW9mKGRpZ2lfdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisKKwkJY2FzZSBESUdJX1NFVEFXOgorCQljYXNlIERJR0lfU0VUQUY6CisJCQlpZiAoKGNtZCkgPT0gKERJR0lfU0VUQVcpKSAKKwkJCXsKKwkJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLworCisJCQkJc2V0dXBfZW1wdHlfZXZlbnQodHR5LGNoKTsJCQorCQkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJCX0KKwkJCWVsc2UgCisJCQl7CisJCQkJLyogbGRpc2MgbG9jayBhbHJlYWR5IGhlbGQgaW4gaW9jdGwgKi8KKwkJCQlpZiAodHR5LT5sZGlzYy5mbHVzaF9idWZmZXIpCisJCQkJCXR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKHR0eSk7CisJCQl9CisKKwkJCS8qIEZhbGwgVGhydSAqLworCisJCWNhc2UgRElHSV9TRVRBOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaC0+ZGlnaWV4dCwgYXJncCwgc2l6ZW9mKGRpZ2lfdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJCisJCQlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERJR0lfQUxUUElOKSAKKwkJCXsKKwkJCQljaC0+ZGNkID0gY2gtPm1fZHNyOworCQkJCWNoLT5kc3IgPSBjaC0+bV9kY2Q7CisJCQl9IAorCQkJZWxzZSAKKwkJCXsKKwkJCQljaC0+ZGNkID0gY2gtPm1fZGNkOworCQkJCWNoLT5kc3IgPSBjaC0+bV9kc3I7CisJCQl9CisJCQorCQkJY2xpKCk7CisJCQlnbG9iYWx3aW5vbihjaCk7CisKKwkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJVGhlIGJlbG93IHJvdXRpbmUgZ2VuZXJhbGx5IHNldHMgdXAgcGFyaXR5LCBiYXVkLCBmbG93IGNvbnRyb2wgCisJCQkJaXNzdWVzLCBldGMuLi4uIEl0IGVmZmVjdCBib3RoIGNvbnRyb2wgZmxhZ3MgYW5kIGlucHV0IGZsYWdzLgorCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCQllcGNhcGFyYW0odHR5LGNoKTsKKwkJCW1lbW9mZihjaCk7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElHSV9HRVRGTE9XOgorCQljYXNlIERJR0lfR0VUQUZMT1c6CisJCQljbGkoKTsJCisJCQlnbG9iYWx3aW5vbihjaCk7CisJCQlpZiAoKGNtZCkgPT0gKERJR0lfR0VURkxPVykpIAorCQkJeworCQkJCWRmbG93LnN0YXJ0YyA9IGJjLT5zdGFydGM7CisJCQkJZGZsb3cuc3RvcGMgPSBiYy0+c3RvcGM7CisJCQl9CisJCQllbHNlIAorCQkJeworCQkJCWRmbG93LnN0YXJ0YyA9IGJjLT5zdGFydGNhOworCQkJCWRmbG93LnN0b3BjID0gYmMtPnN0b3BjYTsKKwkJCX0KKwkJCW1lbW9mZihjaCk7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZGZsb3csIHNpemVvZihkZmxvdykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisKKwkJY2FzZSBESUdJX1NFVEFGTE9XOgorCQljYXNlIERJR0lfU0VURkxPVzoKKwkJCWlmICgoY21kKSA9PSAoRElHSV9TRVRGTE9XKSkgCisJCQl7CisJCQkJc3RhcnRjID0gY2gtPnN0YXJ0YzsKKwkJCQlzdG9wYyA9IGNoLT5zdG9wYzsKKwkJCX0gCisJCQllbHNlIAorCQkJeworCQkJCXN0YXJ0YyA9IGNoLT5zdGFydGNhOworCQkJCXN0b3BjID0gY2gtPnN0b3BjYTsKKwkJCX0KKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkZmxvdywgYXJncCwgc2l6ZW9mKGRmbG93KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChkZmxvdy5zdGFydGMgIT0gc3RhcnRjIHx8IGRmbG93LnN0b3BjICE9IHN0b3BjKSAKKwkJCXsgLyogQmVnaW4gIGlmIHNldGZsb3cgdG9nZ2xlZCAqLworCQkJCWNsaSgpOworCQkJCWdsb2JhbHdpbm9uKGNoKTsKKworCQkJCWlmICgoY21kKSA9PSAoRElHSV9TRVRGTE9XKSkgCisJCQkJeworCQkJCQljaC0+ZmVwc3RhcnRjID0gY2gtPnN0YXJ0YyA9IGRmbG93LnN0YXJ0YzsKKwkJCQkJY2gtPmZlcHN0b3BjID0gY2gtPnN0b3BjID0gZGZsb3cuc3RvcGM7CisJCQkJCWZlcGNtZChjaCwgU09OT0ZGQywgY2gtPmZlcHN0YXJ0YywgY2gtPmZlcHN0b3BjLCAwLCAxKTsKKwkJCQl9IAorCQkJCWVsc2UgCisJCQkJeworCQkJCQljaC0+ZmVwc3RhcnRjYSA9IGNoLT5zdGFydGNhID0gZGZsb3cuc3RhcnRjOworCQkJCQljaC0+ZmVwc3RvcGNhICA9IGNoLT5zdG9wY2EgPSBkZmxvdy5zdG9wYzsKKwkJCQkJZmVwY21kKGNoLCBTQVVYT05PRkZDLCBjaC0+ZmVwc3RhcnRjYSwgY2gtPmZlcHN0b3BjYSwgMCwgMSk7CisJCQkJfQorCisJCQkJaWYJKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkKKwkJCQkJcGNfc3RhcnQodHR5KTsKKworCQkJCW1lbW9mZihjaCk7CisJCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwkJCX0gLyogRW5kIGlmIHNldGZsb3cgdG9nZ2xlZCAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwl9IC8qIEVuZCBzd2l0Y2ggY21kICovCisKKwlyZXR1cm4gMDsKKworfSAvKiBFbmQgcGNfaW9jdGwgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX3NldF90ZXJtaW9zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7IC8qIEJlZ2luIHBjX3NldF90ZXJtaW9zICovCisKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAorCXsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJZ2xvYmFsd2lub24oY2gpOworCQllcGNhcGFyYW0odHR5LCBjaCk7CisJCW1lbW9mZihjaCk7CisKKwkJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJCQkgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSA9PSAwKSkKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisKKwkJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmCisJCQkgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOworCisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJfSAvKiBFbmQgaWYgY2hhbm5lbCB2YWxpZCAqLworCit9IC8qIEVuZCBwY19zZXRfdGVybWlvcyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZG9fc29mdGludCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK3sgLyogQmVnaW4gZG9fc29mdGludCAqLworCisJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIHByaXZhdGVfOworCQorCisJLyogQ2FsbGVkIGluIHJlc3BvbnNlIHRvIGEgbW9kZW0gY2hhbmdlIGV2ZW50ICovCisKKwlpZiAoY2ggJiYgY2gtPm1hZ2ljID09IEVQQ0FfTUFHSUMpIAorCXsgLyogQmVnaW4gRVBDQV9NQUdJQyAqLworCisJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBjaC0+dHR5OworCisJCWlmICh0dHkgJiYgdHR5LT5kcml2ZXJfZGF0YSkgCisJCXsgCisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVQQ0FfRVZFTlRfSEFOR1VQLCAmY2gtPmV2ZW50KSkgCisJCQl7IC8qIEJlZ2luIGlmIGNsZWFyX2JpdCAqLworCisJCQkJdHR5X2hhbmd1cCh0dHkpOwkvKiBGSVhNRTogbW9kdWxlIHJlbW92YWwgcmFjZSBoZXJlIC0gQUtQTSAqLworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7CisJCQkJY2gtPmFzeW5jZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisKKwkJCX0gLyogRW5kIGlmIGNsZWFyX2JpdCAqLworCQl9CisKKwl9IC8qIEVuZCBFUENBX01BR0lDICovCit9IC8qIEVuZCBkb19zb2Z0aW50ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXBjX3N0b3AgYW5kIHBjX3N0YXJ0IHByb3ZpZGUgc29mdHdhcmUgZmxvdyBjb250cm9sIHRvIHRoZSAKKwlyb3V0aW5lIGFuZCB0aGUgcGNfaW9jdGwgcm91dGluZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX3N0b3AgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBjX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sgLyogQmVnaW4gcGNfc3RvcCAqLworCisJc3RydWN0IGNoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIHZhbGlkIGNoYW5uZWwgKi8KKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsgCisJCWNsaSgpOworCisJCWlmICgoY2gtPnN0YXR1c2ZsYWdzICYgVFhTVE9QUEVEKSA9PSAwKSAKKwkJeyAvKiBCZWdpbiBpZiB0cmFuc21pdCBzdG9wIHJlcXVlc3RlZCAqLworCisJCQlnbG9iYWx3aW5vbihjaCk7CisKKwkJCS8qIFNUT1AgdHJhbnNtaXR0aW5nIG5vdyAhISAqLworCisJCQlmZXBjbWQoY2gsIFBBVVNFVFgsIDAsIDAsIDAsIDApOworCisJCQljaC0+c3RhdHVzZmxhZ3MgfD0gVFhTVE9QUEVEOworCQkJbWVtb2ZmKGNoKTsKKworCQl9IC8qIEVuZCBpZiB0cmFuc21pdCBzdG9wIHJlcXVlc3RlZCAqLworCisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJfSAvKiBFbmQgaWYgdmFsaWQgY2hhbm5lbCAqLworCit9IC8qIEVuZCBwY19zdG9wICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19zdGFydCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGNfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sgLyogQmVnaW4gcGNfc3RhcnQgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAorCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAorCXsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLworCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc2F2ZV9mbGFncyhmbGFncyk7CisJCWNsaSgpOworCisJCS8qIEp1c3QgaW4gY2FzZSBvdXRwdXQgd2FzIHJlc3VtZWQgYmVjYXVzZSBvZiBhIGNoYW5nZSBpbiBEaWdpLWZsb3cgKi8KKwkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkgCisJCXsgLyogQmVnaW4gdHJhbnNtaXQgcmVzdW1lIHJlcXVlc3RlZCAqLworCisJCQl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisKKwkJCWdsb2JhbHdpbm9uKGNoKTsKKwkJCWJjID0gY2gtPmJyZGNoYW47CisJCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkKKwkJCQliYy0+aWxvdyA9IDE7CisKKwkJCS8qIE9rYXksIHlvdSBjYW4gc3RhcnQgdHJhbnNtaXR0aW5nIGFnYWluLi4uICovCisKKwkJCWZlcGNtZChjaCwgUkVTVU1FVFgsIDAsIDAsIDAsIDApOworCisJCQljaC0+c3RhdHVzZmxhZ3MgJj0gflRYU1RPUFBFRDsKKwkJCW1lbW9mZihjaCk7CisKKwkJfSAvKiBFbmQgdHJhbnNtaXQgcmVzdW1lIHJlcXVlc3RlZCAqLworCisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJfSAvKiBFbmQgaWYgY2hhbm5lbCB2YWxpZCAqLworCit9IC8qIEVuZCBwY19zdGFydCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlUaGUgYmVsb3cgcm91dGluZXMgcGNfdGhyb3R0bGUgYW5kIHBjX3VudGhyb3R0bGUgYXJlIHVzZWQgCisJdG8gc2xvdyAoQW5kIHJlc3VtZSkgdGhlIHJlY2VpcHQgb2YgZGF0YSBpbnRvIHRoZSBrZXJuZWxzCisJcmVjZWl2ZSBidWZmZXJzLiAgVGhlIGV4YWN0IG9jY3VycmVuY2Ugb2YgdGhpcyBkZXBlbmRzIG9uIHRoZQorCXNpemUgb2YgdGhlIGtlcm5lbHMgcmVjZWl2ZSBidWZmZXIgYW5kIHdoYXQgdGhlICd3YXRlcm1hcmtzJworCWFyZSBzZXQgdG8gZm9yIHRoYXQgYnVmZmVyLiAgU2VlIHRoZSBuX3R0eXMuYyBmaWxlIGZvciBtb3JlCisJZGV0YWlscy4gCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdGhyb3R0bGUgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBjX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreyAvKiBCZWdpbiBwY190aHJvdHRsZSAqLworCisJc3RydWN0IGNoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKKwkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKKwl7IC8qIEJlZ2luIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKworCQlpZiAoKGNoLT5zdGF0dXNmbGFncyAmIFJYU1RPUFBFRCkgPT0gMCkKKwkJeworCQkJZ2xvYmFsd2lub24oY2gpOworCQkJZmVwY21kKGNoLCBQQVVTRVJYLCAwLCAwLCAwLCAwKTsKKworCQkJY2gtPnN0YXR1c2ZsYWdzIHw9IFJYU1RPUFBFRDsKKwkJCW1lbW9mZihjaCk7CisJCX0KKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwl9IC8qIEVuZCBpZiBjaGFubmVsIHZhbGlkICovCisKK30gLyogRW5kIHBjX3Rocm90dGxlICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiB1bnRocm90dGxlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwY191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7IC8qIEJlZ2luIHBjX3VudGhyb3R0bGUgKi8KKworCXN0cnVjdCBjaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CisJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCisJeyAvKiBCZWdpbiBpZiBjaGFubmVsIHZhbGlkICovCisKKworCQkvKiBKdXN0IGluIGNhc2Ugb3V0cHV0IHdhcyByZXN1bWVkIGJlY2F1c2Ugb2YgYSBjaGFuZ2UgaW4gRGlnaS1mbG93ICovCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKworCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgUlhTVE9QUEVEKSAKKwkJeworCisJCQlnbG9iYWx3aW5vbihjaCk7CisJCQliYyA9IGNoLT5icmRjaGFuOworCQkJZmVwY21kKGNoLCBSRVNVTUVSWCwgMCwgMCwgMCwgMCk7CisKKwkJCWNoLT5zdGF0dXNmbGFncyAmPSB+UlhTVE9QUEVEOworCQkJbWVtb2ZmKGNoKTsKKwkJfQorCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCX0gLyogRW5kIGlmIGNoYW5uZWwgdmFsaWQgKi8KKworfSAvKiBFbmQgcGNfdW50aHJvdHRsZSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZGlnaV9zZW5kX2JyZWFrICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGRpZ2lfc2VuZF9icmVhayhzdHJ1Y3QgY2hhbm5lbCAqY2gsIGludCBtc2VjKQoreyAvKiBCZWdpbiBkaWdpX3NlbmRfYnJlYWsgKi8KKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlnbG9iYWx3aW5vbihjaCk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKwkgICBNYXliZSBJIHNob3VsZCBzZW5kIGFuIGluZmluaXRlIGJyZWFrIGhlcmUsIHNjaGVkdWxlKCkgZm9yCisJICAgbXNlYyBhbW91bnQgb2YgdGltZSwgYW5kIHRoZW4gc3RvcCB0aGUgYnJlYWsuICBUaGlzIHdheSwKKwkgICB0aGUgdXNlciBjYW4ndCBzY3JldyB1cCB0aGUgRkVQIGJ5IGNhdXNpbmcgZGlnaV9zZW5kX2JyZWFrKCkKKwkgICB0byBiZSBjYWxsZWQgKGkuZS4gdmlhIGFuIGlvY3RsKCkpIG1vcmUgdGhhbiBvbmNlIGluIG1zZWMgYW1vdW50IAorCSAgIG9mIHRpbWUuICBUcnkgdGhpcyBmb3Igbm93Li4uCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlmZXBjbWQoY2gsIFNFTkRCUkVBSywgbXNlYywgMCwgMTAsIDApOworCW1lbW9mZihjaCk7CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworfSAvKiBFbmQgZGlnaV9zZW5kX2JyZWFrICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBzZXR1cF9lbXB0eV9ldmVudCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgc2V0dXBfZW1wdHlfZXZlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGNoYW5uZWwgKmNoKQoreyAvKiBCZWdpbiBzZXR1cF9lbXB0eV9ldmVudCAqLworCisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjID0gY2gtPmJyZGNoYW47CisJdW5zaWduZWQgbG9uZyBpbnQgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlnbG9iYWx3aW5vbihjaCk7CisJY2gtPnN0YXR1c2ZsYWdzIHw9IEVNUFRZV0FJVDsKKwkKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJV2hlbiBzZXQgdGhlIGllbXB0eSBmbGFnIHJlcXVlc3QgYSBldmVudCB0byBiZSBnZW5lcmF0ZWQgd2hlbiB0aGUgCisJCXRyYW5zbWl0IGJ1ZmZlciBpcyBlbXB0eSAoSWYgdGhlcmUgaXMgbm8gQlJFQUsgaW4gcHJvZ3Jlc3MpLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJYmMtPmllbXB0eSA9IDE7CisJbWVtb2ZmKGNoKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworfSAvKiBFbmQgc2V0dXBfZW1wdHlfZXZlbnQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGdldF90ZXJtaW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBnZXRfdGVybWlvKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvIF9fdXNlciAqIHRlcm1pbykKK3sgLyogQmVnaW4gZ2V0X3Rlcm1pbyAqLworCXJldHVybiBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pbyh0ZXJtaW8sIHR0eS0+dGVybWlvcyk7Cit9IC8qIEVuZCBnZXRfdGVybWlvICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGVwY2Ffc2V0dXAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIGVwY2Ffc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7IC8qIEJlZ2luIGVwY2Ffc2V0dXAgKi8KKworCXN0cnVjdCBib2FyZF9pbmZvIGJvYXJkOworCWludCAgICAgICAgICAgICAgIGluZGV4LCBsb29wLCBsYXN0OworCWNoYXIgICAgICAgICAgICAgICp0ZW1wLCAqdDI7CisJdW5zaWduZWQgICAgICAgICAgbGVuOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlJZiB0aGlzIHJvdXRpbmUgbG9va3MgYSBsaXR0bGUgc3RyYW5nZSBpdCBpcyBiZWNhdXNlIGl0IGlzIG9ubHkgY2FsbGVkCisJCWlmIGEgTElMTyBhcHBlbmQgY29tbWFuZCBpcyBnaXZlbiB0byBib290IHRoZSBrZXJuZWwgd2l0aCBwYXJhbWV0ZXJzLiAgCisJCUluIHRoaXMgd2F5LCB3ZSBjYW4gcHJvdmlkZSB0aGUgdXNlciBhIG1ldGhvZCBvZiBjaGFuZ2luZyBoaXMgYm9hcmQKKwkJY29uZmlndXJhdGlvbiB3aXRob3V0IHJlYnVpbGRpbmcgdGhlIGtlcm5lbC4KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWlmICghbGlsb2NvbmZpZykgCisJCWxpbG9jb25maWcgPSAxOyAKKworCW1lbXNldCgmYm9hcmQsIDAsIHNpemVvZihib2FyZCkpOworCisJLyogQXNzdW1lIHRoZSBkYXRhIGlzIGludCBmaXJzdCwgbGF0ZXIgd2UgY2FuIGNoYW5nZSBpdCAqLworCS8qIEkgdGhpbmsgdGhhdCBhcnJheSBwb3NpdGlvbiAwIG9mIGludHMgaG9sZHMgdGhlIG51bWJlciBvZiBhcmdzICovCisJZm9yIChsYXN0ID0gMCwgaW5kZXggPSAxOyBpbmRleCA8PSBpbnRzWzBdOyBpbmRleCsrKQorCQlzd2l0Y2goaW5kZXgpCisJCXsgLyogQmVnaW4gcGFyc2Ugc3dpdGNoICovCisKKwkJCWNhc2UgMToKKwkJCQlib2FyZC5zdGF0dXMgPSBpbnRzW2luZGV4XTsKKwkJCQkKKwkJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJV2UgY2hlY2sgZm9yIDIgKEFzIG9wcG9zZWQgdG8gMTsgYmVjYXVzZSAyIGlzIGEgZmxhZworCQkJCQlpbnN0cnVjdGluZyB0aGUgZHJpdmVyIHRvIGlnbm9yZSBlcGNhY29uZmlnLikgIEZvciB0aGlzCisJCQkJCXJlYXNvbiB3ZSBjaGVjayBmb3IgMi4KKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisJCQkJaWYgKGJvYXJkLnN0YXR1cyA9PSAyKQorCQkJCXsgLyogQmVnaW4gaWdub3JlIGVwY2Fjb25maWcgYXMgd2VsbCBhcyBsaWxvIGNtZCBsaW5lICovCisJCQkJCW5iZGV2cyA9IDA7CisJCQkJCW51bV9jYXJkcyA9IDA7CisJCQkJCXJldHVybjsKKwkJCQl9IC8qIEVuZCBpZ25vcmUgZXBjYWNvbmZpZyBhcyB3ZWxsIGFzIGxpbG8gY21kIGxpbmUgKi8KKwkKKwkJCQlpZiAoYm9hcmQuc3RhdHVzID4gMikKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgc3RhdHVzIDB4JXhcbiIsIGJvYXJkLnN0YXR1cyk7CisJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOworCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQk9BUkRfU1RBVFVTOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOgorCQkJCWJvYXJkLnR5cGUgPSBpbnRzW2luZGV4XTsKKwkJCQlpZiAoYm9hcmQudHlwZSA+PSBQQ0lYRU0pIAorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCB0eXBlIDB4JXhcbiIsIGJvYXJkLnR5cGUpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0JPQVJEX1RZUEU7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDM6CisJCQkJYm9hcmQuYWx0cGluID0gaW50c1tpbmRleF07CisJCQkJaWYgKGJvYXJkLmFsdHBpbiA+IDEpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIGFsdHBpbiAweCV4XG4iLCBib2FyZC5hbHRwaW4pOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0FMVFBJTjsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNDoKKwkJCQlib2FyZC5udW1wb3J0cyA9IGludHNbaW5kZXhdOworCQkJCWlmICgoYm9hcmQubnVtcG9ydHMgPCAyKSB8fCAoYm9hcmQubnVtcG9ydHMgPiAyNTYpKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCBudW1wb3J0cyAweCV4XG4iLCBib2FyZC5udW1wb3J0cyk7CisJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOworCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfTlVNX1BPUlRTOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCW5iZGV2cyArPSBib2FyZC5udW1wb3J0czsKKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNToKKwkJCQlib2FyZC5wb3J0ID0gKHVuc2lnbmVkIGNoYXIgKilpbnRzW2luZGV4XTsKKwkJCQlpZiAoaW50c1tpbmRleF0gPD0gMCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgaW8gcG9ydCAweCV4XG4iLCAodW5zaWduZWQgaW50KWJvYXJkLnBvcnQpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX1BPUlRfQkFTRTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlsYXN0ID0gaW5kZXg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNjoKKwkJCQlib2FyZC5tZW1iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilpbnRzW2luZGV4XTsKKwkJCQlpZiAoaW50c1tpbmRleF0gPD0gMCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgbWVtb3J5IGJhc2UgMHgleFxuIiwodW5zaWduZWQgaW50KWJvYXJkLm1lbWJhc2UpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX01FTV9CQVNFOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBUb28gbWFueSBpbnRlZ2VyIHBhcm1zXG4iKTsKKwkJCQlyZXR1cm47CisKKwkJfSAvKiBFbmQgcGFyc2Ugc3dpdGNoICovCisKKwl3aGlsZSAoc3RyICYmICpzdHIpIAorCXsgLyogQmVnaW4gd2hpbGUgdGhlcmUgaXMgYSBzdHJpbmcgYXJnICovCisKKwkJLyogZmluZCB0aGUgbmV4dCBjb21tYSBvciB0ZXJtaW5hdG9yICovCisJCXRlbXAgPSBzdHI7CisKKwkJLyogV2hpbGUgc3RyaW5nIGlzIG5vdCBudWxsLCBhbmQgYSBjb21tYSBoYXNuJ3QgYmVlbiBmb3VuZCAqLworCQl3aGlsZSAoKnRlbXAgJiYgKCp0ZW1wICE9ICcsJykpCisJCQl0ZW1wKys7CisKKwkJaWYgKCEqdGVtcCkKKwkJCXRlbXAgPSBOVUxMOworCQllbHNlCisJCQkqdGVtcCsrID0gMDsKKworCQkvKiBTZXQgaW5kZXggdG8gdGhlIG51bWJlciBvZiBhcmdzICsgMSAqLworCQlpbmRleCA9IGxhc3QgKyAxOworCisJCXN3aXRjaChpbmRleCkKKwkJeworCQkJY2FzZSAxOgorCQkJCWxlbiA9IHN0cmxlbihzdHIpOworCQkJCWlmIChzdHJuY21wKCJEaXNhYmxlIiwgc3RyLCBsZW4pID09IDApIAorCQkJCQlib2FyZC5zdGF0dXMgPSAwOworCQkJCWVsc2UKKwkJCQlpZiAoc3RybmNtcCgiRW5hYmxlIiwgc3RyLCBsZW4pID09IDApCisJCQkJCWJvYXJkLnN0YXR1cyA9IDE7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBzdGF0dXMgJXNcbiIsIHN0cik7CisJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOworCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQk9BUkRfU1RBVFVTOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOgorCisJCQkJZm9yKGxvb3AgPSAwOyBsb29wIDwgRVBDQV9OVU1fVFlQRVM7IGxvb3ArKykKKwkJCQkJaWYgKHN0cmNtcChib2FyZF9kZXNjW2xvb3BdLCBzdHIpID09IDApCisJCQkJCQlicmVhazsKKworCisJCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCUlmIHRoZSBpbmRleCBpbmNyZW1lbnRlZCBhYm92ZSByZWZlcnMgdG8gYSBsZWdpdGFtYXRlIGJvYXJkIAorCQkJCQl0eXBlIHNldCBpdCBoZXJlLiAKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCQkJaWYgKGluZGV4IDwgRVBDQV9OVU1fVFlQRVMpIAorCQkJCQlib2FyZC50eXBlID0gbG9vcDsKKwkJCQllbHNlCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIHR5cGU6ICVzXG4iLCBzdHIpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX0JPQVJEX1RZUEU7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDM6CisJCQkJbGVuID0gc3RybGVuKHN0cik7CisJCQkJaWYgKHN0cm5jbXAoIkRpc2FibGUiLCBzdHIsIGxlbikgPT0gMCkgCisJCQkJCWJvYXJkLmFsdHBpbiA9IDA7CisJCQkJZWxzZQorCQkJCWlmIChzdHJuY21wKCJFbmFibGUiLCBzdHIsIGxlbikgPT0gMCkKKwkJCQkJYm9hcmQuYWx0cGluID0gMTsKKwkJCQllbHNlCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGFsdHBpbiAlc1xuIiwgc3RyKTsKKwkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CisJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9BTFRQSU47CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDQ6CisJCQkJdDIgPSBzdHI7CisJCQkJd2hpbGUgKGlzZGlnaXQoKnQyKSkKKwkJCQkJdDIrKzsKKworCQkJCWlmICgqdDIpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIHBvcnQgY291bnQgJXNcbiIsIHN0cik7CisJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOworCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfTlVNX1BPUlRTOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCVRoZXJlIGlzIG5vdCBhIG1hbiBwYWdlIGZvciBzaW1wbGVfc3RydG91bCBidXQgdGhlIGNvZGUgY2FuIGJlIAorCQkJCQlmb3VuZCBpbiB2c3ByaW50Zi5jLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBzdHJpbmcgdG8gCisJCQkJCXRyYW5zbGF0ZSAoVG8gYW4gdW5zaWduZWQgbG9uZyBvYnZpb3VzbHkpLCAgdGhlIHNlY29uZCBhcmd1bWVudAorCQkJCQljYW4gYmUgdGhlIGFkZHJlc3Mgb2YgYW55IGNoYXJhY3RlciB2YXJpYWJsZSBvciBhIE5VTEwuICBJZiBhCisJCQkJCXZhcmlhYmxlIGlzIGdpdmVuLCB0aGUgZW5kIHBvaW50ZXIgb2YgdGhlIHN0cmluZyB3aWxsIGJlIHN0b3JlZCAKKwkJCQkJaW4gdGhhdCB2YXJpYWJsZTsgaWYgYSBOVUxMIGlzIGdpdmVuIHRoZSBlbmQgcG9pbnRlciB3aWxsIAorCQkJCQlub3QgYmUgcmV0dXJuZWQuICBUaGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgYmFzZSB0byB1c2UuICBJZiAKKwkJCQkJYSAwIGlzIGluZGljYXRlZCwgdGhlIHJvdXRpbmUgd2lsbCBhdHRlbXB0IHRvIGRldGVybWluZSB0aGUgCisJCQkJCXByb3BlciBiYXNlIGJ5IGxvb2tpbmcgYXQgdGhlIHZhbHVlcyBwcmVmaXggKEEgJzAnIGZvciBvY3RhbCwKKwkJCQkJYSAneCcgZm9yIGhleCwgZXRjIC4uLiAgSWYgYSB2YWx1ZSBpcyBnaXZlbiBpdCB3aWxsIHVzZSB0aGF0IAorCQkJCQl2YWx1ZSBhcyB0aGUgYmFzZS4gCisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKKwkJCQlib2FyZC5udW1wb3J0cyA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMCk7CisJCQkJbmJkZXZzICs9IGJvYXJkLm51bXBvcnRzOworCQkJCWxhc3QgPSBpbmRleDsKKwkJCQlicmVhazsKKworCQkJY2FzZSA1OgorCQkJCXQyID0gc3RyOworCQkJCXdoaWxlIChpc3hkaWdpdCgqdDIpKQorCQkJCQl0MisrOworCisJCQkJaWYgKCp0MikKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgaS9vIGFkZHJlc3MgJXNcbiIsIHN0cik7CisJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOworCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfUE9SVF9CQVNFOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJYm9hcmQucG9ydCA9ICh1bnNpZ25lZCBjaGFyICopc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAxNik7CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQljYXNlIDY6CisJCQkJdDIgPSBzdHI7CisJCQkJd2hpbGUgKGlzeGRpZ2l0KCp0MikpCisJCQkJCXQyKys7CisKKwkJCQlpZiAoKnQyKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBtZW1vcnkgYmFzZSAlc1xuIixzdHIpOworCQkJCQlpbnZhbGlkX2xpbG9fY29uZmlnID0gMTsKKwkJCQkJc2V0dXBfZXJyb3JfY29kZSB8PSBJTlZBTElEX01FTV9CQVNFOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJYm9hcmQubWVtYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAxNik7CisJCQkJbGFzdCA9IGluZGV4OworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAiUEMvWHg6IFRvbyBtYW55IHN0cmluZyBwYXJtc1xuIik7CisJCQkJcmV0dXJuOworCQl9CisJCXN0ciA9IHRlbXA7CisKKwl9IC8qIEVuZCB3aGlsZSB0aGVyZSBpcyBhIHN0cmluZyBhcmcgKi8KKworCisJaWYgKGxhc3QgPCA2KSAgCisJeworCQlwcmludGsoS0VSTl9FUlIgIlBDL1h4OiBJbnN1ZmZpY2llbnQgcGFybXMgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuOworCX0KKyAKKwkvKiBJIHNob3VsZCBSRUFMTFkgdmFsaWRhdGUgdGhlIHN0dWZmIGhlcmUgKi8KKworCS8qIENvcGllcyBvdXIgbG9jYWwgY29weSBvZiBib2FyZCBpbnRvIGJvYXJkcyAqLworCW1lbWNweSgodm9pZCAqKSZib2FyZHNbbnVtX2NhcmRzXSwodm9pZCAqKSZib2FyZCwgc2l6ZW9mKGJvYXJkKSk7CisKKworCS8qIERvZXMgdGhpcyBnZXQgY2FsbGVkIG9uY2UgcGVyIGxpbG8gYXJnIGFyZSB3aGF0ID8gKi8KKworCXByaW50ayhLRVJOX0lORk8gIlBDL1h4OiBBZGRlZCBib2FyZCAlaSwgJXMgJWkgcG9ydHMgYXQgMHglNC40WCBiYXNlIDB4JTYuNlhcbiIsIAorCQludW1fY2FyZHMsIGJvYXJkX2Rlc2NbYm9hcmQudHlwZV0sIAorCQlib2FyZC5udW1wb3J0cywgKGludClib2FyZC5wb3J0LCAodW5zaWduZWQgaW50KSBib2FyZC5tZW1iYXNlKTsKKworCW51bV9jYXJkcysrOworCit9IC8qIEVuZCBlcGNhX3NldHVwICovCisKKworCisjaWZkZWYgRU5BQkxFX1BDSQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGluaXRfUENJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSBlcGljX2JvYXJkX3R5cGVzIHsKKwlicmRfeHIgPSAwLAorCWJyZF94ZW0sCisJYnJkX2N4LAorCWJyZF94cmosCit9OworCisKKy8qIGluZGV4ZWQgZGlyZWN0bHkgYnkgZXBpY19ib2FyZF90eXBlcyBlbnVtICovCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIGJvYXJkX3R5cGU7CisJdW5zaWduZWQgYmFyX2lkeDsJCS8qIFBDSSBiYXNlIGFkZHJlc3MgcmVnaW9uICovCit9IGVwY2FfaW5mb190YmxbXSA9IHsKKwl7IFBDSVhSLCAwLCB9LAorCXsgUENJWEVNLCAwLCB9LAorCXsgUENJQ1gsIDAsIH0sCisJeyBQQ0lYUkosIDIsIH0sCit9OworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVwY2FfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgYm9hcmRfbnVtID0gLTE7CisJaW50IGJvYXJkX2lkeCwgaW5mb19pZHggPSBlbnQtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKwlib2FyZF9udW0rKzsKKwlib2FyZF9pZHggPSBib2FyZF9udW0gKyBudW1fY2FyZHM7CisJaWYgKGJvYXJkX2lkeCA+PSBNQVhCT0FSRFMpCisJCWdvdG8gZXJyX291dDsKKwkKKwlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCBlcGNhX2luZm9fdGJsW2luZm9faWR4XS5iYXJfaWR4KTsKKwlpZiAoIWFkZHIpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIlBDSSByZWdpb24gIyVkIG5vdCBhdmFpbGFibGUgKHNpemUgMClcbiIsCisJCQllcGNhX2luZm9fdGJsW2luZm9faWR4XS5iYXJfaWR4KTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWJvYXJkc1tib2FyZF9pZHhdLnN0YXR1cyA9IEVOQUJMRUQ7CisJYm9hcmRzW2JvYXJkX2lkeF0udHlwZSA9IGVwY2FfaW5mb190YmxbaW5mb19pZHhdLmJvYXJkX3R5cGU7CisJYm9hcmRzW2JvYXJkX2lkeF0ubnVtcG9ydHMgPSAweDA7CisJYm9hcmRzW2JvYXJkX2lkeF0ucG9ydCA9CisJCSh1bnNpZ25lZCBjaGFyICopKChjaGFyICopIGFkZHIgKyBQQ0lfSU9fT0ZGU0VUKTsKKwlib2FyZHNbYm9hcmRfaWR4XS5tZW1iYXNlID0KKwkJKHVuc2lnbmVkIGNoYXIgKikoKGNoYXIgKikgYWRkcik7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbiAoYWRkciArIFBDSV9JT19PRkZTRVQsIDB4MjAwMDAwLCAiZXBjYSIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJyZXNvdXJjZSAweCV4IEAgMHglbHggdW5hdmFpbGFibGVcbiIsCisJCQkweDIwMDAwMCwgYWRkciArIFBDSV9JT19PRkZTRVQpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJYm9hcmRzW2JvYXJkX2lkeF0ucmVfbWFwX3BvcnQgPSBpb3JlbWFwKGFkZHIgKyBQQ0lfSU9fT0ZGU0VULCAweDIwMDAwMCk7CisJaWYgKCFib2FyZHNbYm9hcmRfaWR4XS5yZV9tYXBfcG9ydCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IG1hcCAweCV4IEAgMHglbHhcbiIsCisJCQkweDIwMDAwMCwgYWRkciArIFBDSV9JT19PRkZTRVQpOworCQlnb3RvIGVycl9vdXRfZnJlZV9wY2lpbzsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbiAoYWRkciwgMHgyMDAwMDAsICJlcGNhIikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInJlc291cmNlIDB4JXggQCAweCVseCB1bmF2YWlsYWJsZVxuIiwKKwkJCTB4MjAwMDAwLCBhZGRyKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfaW91bm1hcDsKKwl9CisKKwlib2FyZHNbYm9hcmRfaWR4XS5yZV9tYXBfbWVtYmFzZSA9IGlvcmVtYXAoYWRkciwgMHgyMDAwMDApOworCWlmICghYm9hcmRzW2JvYXJkX2lkeF0ucmVfbWFwX21lbWJhc2UpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCBtYXAgMHgleCBAIDB4JWx4XG4iLAorCQkJMHgyMDAwMDAsIGFkZHIgKyBQQ0lfSU9fT0ZGU0VUKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbWVtcmVnaW9uOworCX0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCUkgZG9uJ3Qga25vdyB3aGF0IHRoZSBiZWxvdyBkb2VzLCBidXQgdGhlIGhhcmR3YXJlIGd1eXMgc2F5CisJCWl0cyByZXF1aXJlZCBvbiBldmVyeXRoaW5nIGV4Y2VwdCBQTFggKEluIHRoaXMgY2FzZSBYUkopLgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlpZiAoaW5mb19pZHggIT0gYnJkX3hyaikgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MCwgMCk7ICAKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDYsIDApOworCX0KKwkKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX21lbXJlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24gKGFkZHIsIDB4MjAwMDAwKTsKK2Vycl9vdXRfZnJlZV9pb3VubWFwOgorCWlvdW5tYXAgKGJvYXJkc1tib2FyZF9pZHhdLnJlX21hcF9wb3J0KTsKK2Vycl9vdXRfZnJlZV9wY2lpbzoKKwlyZWxlYXNlX21lbV9yZWdpb24gKGFkZHIgKyBQQ0lfSU9fT0ZGU0VULCAweDIwMDAwMCk7CitlcnJfb3V0OgorCXJldHVybiAtRU5PREVWOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBlcGNhX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfRElHSSwgUENJX0RFVklDRV9YUiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgYnJkX3hyIH0sCisJeyBQQ0lfVkVORE9SX0RJR0ksIFBDSV9ERVZJQ0VfWEVNLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBicmRfeGVtIH0sCisJeyBQQ0lfVkVORE9SX0RJR0ksIFBDSV9ERVZJQ0VfQ1gsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGJyZF9jeCB9LAorCXsgUENJX1ZFTkRPUl9ESUdJLCBQQ0lfREVWSUNFX1hSSiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgYnJkX3hyaiB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGVwY2FfcGNpX3RibCk7CisKK2ludCBfX2luaXQgaW5pdF9QQ0kgKHZvaWQpCit7IC8qIEJlZ2luIGluaXRfUENJICovCisJbWVtc2V0ICgmZXBjYV9kcml2ZXIsIDAsIHNpemVvZiAoZXBjYV9kcml2ZXIpKTsKKwllcGNhX2RyaXZlci5uYW1lID0gImVwY2EiOworCWVwY2FfZHJpdmVyLmlkX3RhYmxlID0gZXBjYV9wY2lfdGJsOworCWVwY2FfZHJpdmVyLnByb2JlID0gZXBjYV9pbml0X29uZTsKKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlcGNhX2RyaXZlcik7Cit9IC8qIEVuZCBpbml0X1BDSSAqLworCisjZW5kaWYgLyogRU5BQkxFX1BDSSAqLworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXBjYS5oIGIvZHJpdmVycy9jaGFyL2VwY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjIwNWVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2VwY2EuaApAQCAtMCwwICsxLDE2NSBAQAorI2RlZmluZSBYRU1QT1JUUyAgICAweEMwMgorI2RlZmluZSBYRVBPUlRTICAgICAweEMyMgorCisjZGVmaW5lIE1BWF9BTExPQyAgIDB4MTAwCisKKyNkZWZpbmUgTUFYQk9BUkRTICAgMTIKKyNkZWZpbmUgRkVQQ09ERVNFRyAgMHgwMjAwTAorI2RlZmluZSBGRVBDT0RFICAgICAweDIwMDBMCisjZGVmaW5lIEJJT1NDT0RFICAgIDB4ZjgwMEwKKworI2RlZmluZSBNSVNDR0xPQkFMICAweDBDMDBMCisjZGVmaW5lIE5QT1JUICAgICAgIDB4MEMyMkwKKyNkZWZpbmUgTUJPWCAgICAgICAgMHgwQzQwTAorI2RlZmluZSBQT1JUQkFTRSAgICAweDBDOTBMCisKKy8qIEJlZ2luIGNvZGUgZGVmaW5lcyB1c2VkIGZvciBlcGNhX3NldHVwICovCisKKyNkZWZpbmUgSU5WQUxJRF9CT0FSRF9UWVBFICAgMHgxCisjZGVmaW5lIElOVkFMSURfTlVNX1BPUlRTICAgIDB4MgorI2RlZmluZSBJTlZBTElEX01FTV9CQVNFICAgICAweDQKKyNkZWZpbmUgSU5WQUxJRF9QT1JUX0JBU0UgICAgMHg4CisjZGVmaW5lIElOVkFMSURfQk9BUkRfU1RBVFVTIDB4MTAKKyNkZWZpbmUgSU5WQUxJRF9BTFRQSU4gICAgICAgMHgyMAorCisvKiBFbmQgY29kZSBkZWZpbmVzIHVzZWQgZm9yIGVwY2Ffc2V0dXAgKi8KKworCisjZGVmaW5lIEZFUENMUiAgICAgIDB4MDAKKyNkZWZpbmUgRkVQTUVNICAgICAgMHgwMgorI2RlZmluZSBGRVBSU1QgICAgICAweDA0CisjZGVmaW5lIEZFUElOVCAgICAgIDB4MDgKKyNkZWZpbmUJRkVQTUFTSyAgICAgMHgwZQorI2RlZmluZQlGRVBXSU4gICAgICAweDgwCisKKyNkZWZpbmUgUENYRSAgICAwCisjZGVmaW5lIFBDWEVWRSAgMQorI2RlZmluZSBQQ1hFTSAgIDIgICAKKyNkZWZpbmUgRUlTQVhFTSAzCisjZGVmaW5lIFBDNjRYRSAgNAorI2RlZmluZSBQQ1hJICAgIDUKKyNkZWZpbmUgUENJWEVNICA3CisjZGVmaW5lIFBDSUNYICAgOAorI2RlZmluZSBQQ0lYUiAgIDkKKyNkZWZpbmUgUENJWFJKICAxMAorI2RlZmluZSBFUENBX05VTV9UWVBFUyA2CisKKworc3RhdGljIGNoYXIgKmJvYXJkX2Rlc2NbXSA9IAoreworCSJQQy9YZSIsCisJIlBDL1hldmUiLAorCSJQQy9YZW0iLAorCSJFSVNBL1hlbSIsCisJIlBDLzY0WGUiLAorCSJQQy9YaSIsCisJInVua25vd24iLAorCSJQQ0kvWGVtIiwKKwkiUENJL0NYIiwKKwkiUENJL1hyIiwKKwkiUENJL1hyaiIsCit9OworCisjZGVmaW5lIFNUQVJUQyAgICAgIDAyMQorI2RlZmluZSBTVE9QQyAgICAgICAwMjMKKyNkZWZpbmUgSUFJWE9OICAgICAgMHgyMDAwCisKKworI2RlZmluZSBUWFNUT1BQRUQgIDB4MQorI2RlZmluZSBMT1dXQUlUICAgIDB4MgorI2RlZmluZSBFTVBUWVdBSVQgIDB4NAorI2RlZmluZSBSWFNUT1BQRUQgIDB4OAorI2RlZmluZSBUWEJVU1kgICAgIDB4MTAKKworI2RlZmluZSBESVNBQkxFRCAgIDAKKyNkZWZpbmUgRU5BQkxFRCAgICAxCisjZGVmaW5lIE9GRiAgICAgICAgMAorI2RlZmluZSBPTiAgICAgICAgIDEKKworI2RlZmluZSBGRVBUSU1FT1VUIDIwMDAwMCAgCisjZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTCAgMQorI2RlZmluZSBTRVJJQUxfVFlQRV9JTkZPICAgIDMKKyNkZWZpbmUgRVBDQV9FVkVOVF9IQU5HVVAgICAxCisjZGVmaW5lIEVQQ0FfTUFHSUMgICAgICAgICAgMHg1YzZkZjEwNEwKKworc3RydWN0IGNoYW5uZWwgCit7CisJbG9uZyAgIG1hZ2ljOworCXVuY2hhciBib2FyZG51bTsKKwl1bmNoYXIgY2hhbm5lbG51bTsKKwl1bmNoYXIgb21vZGVtOyAgICAgICAgIC8qIEZFUCBvdXRwdXQgbW9kZW0gc3RhdHVzICAgICAqLworCXVuY2hhciBpbW9kZW07ICAgICAgICAgLyogRkVQIGlucHV0IG1vZGVtIHN0YXR1cyAgICAgICovCisJdW5jaGFyIG1vZGVtZmFrZTsgICAgICAvKiBNb2RlbSB2YWx1ZXMgdG8gYmUgZm9yY2VkICAgKi8KKwl1bmNoYXIgbW9kZW07ICAgICAgICAgIC8qIEZvcmNlIHZhbHVlcyAgICAgICAgICAgICAgICAqLworCXVuY2hhciBoZmxvdzsKKwl1bmNoYXIgZHNyOworCXVuY2hhciBkY2Q7CisJdW5jaGFyIG1fcnRzIDsgCQkvKiBUaGUgYml0cyB1c2VkIGluIHdoYXRldmVyIEZFUCAqLworCXVuY2hhciBtX2RjZCA7CQkvKiBpcyBpbmRpZ2lub3VzIHRvIHRoaXMgYm9hcmQgdG8gKi8KKwl1bmNoYXIgbV9kc3IgOwkJLyogcmVwcmVzZW50IGVhY2ggb2YgdGhlIHBoeXNpY2FsICovCisJdW5jaGFyIG1fY3RzIDsJCS8qIGhhbmRzaGFrZSBsaW5lcyAqLworCXVuY2hhciBtX3JpIDsKKwl1bmNoYXIgbV9kdHIgOworCXVuY2hhciBzdG9wYzsKKwl1bmNoYXIgc3RhcnRjOworCXVuY2hhciBzdG9wY2E7CisJdW5jaGFyIHN0YXJ0Y2E7CisJdW5jaGFyIGZlcHN0b3BjOworCXVuY2hhciBmZXBzdGFydGM7CisJdW5jaGFyIGZlcHN0b3BjYTsKKwl1bmNoYXIgZmVwc3RhcnRjYTsKKwl1bmNoYXIgdHh3aW47CisJdW5jaGFyIHJ4d2luOworCXVzaG9ydCBmZXBpZmxhZzsKKwl1c2hvcnQgZmVwY2ZsYWc7CisJdXNob3J0IGZlcG9mbGFnOworCXVzaG9ydCB0eGJ1ZmhlYWQ7CisJdXNob3J0IHR4YnVmc2l6ZTsKKwl1c2hvcnQgcnhidWZoZWFkOworCXVzaG9ydCByeGJ1ZnNpemU7CisJaW50ICAgIGNsb3NlX2RlbGF5OworCWludCAgICBjb3VudDsKKwlpbnQgICAgYmxvY2tlZF9vcGVuOworCXVsb25nICBldmVudDsKKwlpbnQgICAgYXN5bmNmbGFnczsKKwl1aW50ICAgZGV2OworCXVsb25nICBzdGF0dXNmbGFnczsKKwl1bG9uZyAgY19pZmxhZzsKKwl1bG9uZyAgY19jZmxhZzsKKwl1bG9uZyAgY19sZmxhZzsKKwl1bG9uZyAgY19vZmxhZzsKKwl1bmNoYXIgKnR4cHRyOworCXVuY2hhciAqcnhwdHI7CisJdW5jaGFyICp0bXBfYnVmOworCXN0cnVjdCBib2FyZF9pbmZvICAgICAgICAgICAqYm9hcmQ7CisJdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gICpicmRjaGFuOworCXN0cnVjdCBkaWdpX3N0cnVjdCAgICAgICAgICBkaWdpZXh0OworCXN0cnVjdCB0dHlfc3RydWN0ICAgICAgICAgICAqdHR5OworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgICAgICBvcGVuX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgICAgIGNsb3NlX3dhaXQ7CisJc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICAgICAgdHF1ZXVlOworCXZvbGF0aWxlIHN0cnVjdCBnbG9iYWxfZGF0YSAqbWFpbGJveDsKK307CisKK3N0cnVjdCBib2FyZF9pbmZvCQoreworCXVuY2hhciBzdGF0dXM7CisJdW5jaGFyIHR5cGU7CisJdW5jaGFyIGFsdHBpbjsKKwl1c2hvcnQgbnVtcG9ydHM7CisJdW5jaGFyICpwb3J0OworCXVuY2hhciAqbWVtYmFzZTsKKwl1bmNoYXIgX19pb21lbSAqcmVfbWFwX3BvcnQ7CisJdW5jaGFyICpyZV9tYXBfbWVtYmFzZTsKKwl1bG9uZyAgbWVtb3J5X3NlZzsKKwl2b2lkICggKiBtZW13aW5vbiApCShzdHJ1Y3QgYm9hcmRfaW5mbyAqLCB1bnNpZ25lZCBpbnQpIDsKKwl2b2lkICggKiBtZW13aW5vZmYgKSAJKHN0cnVjdCBib2FyZF9pbmZvICosIHVuc2lnbmVkIGludCkgOworCXZvaWQgKCAqIGdsb2JhbHdpbm9uICkJKHN0cnVjdCBjaGFubmVsICopIDsKKwl2b2lkICggKiB0eHdpbm9uICkgCShzdHJ1Y3QgY2hhbm5lbCAqKSA7CisJdm9pZCAoICogcnh3aW5vbiApCShzdHJ1Y3QgY2hhbm5lbCAqKSA7CisJdm9pZCAoICogbWVtb2ZmICkJKHN0cnVjdCBjaGFubmVsICopIDsKKwl2b2lkICggKiBhc3NlcnRnd2lub24gKQkoc3RydWN0IGNoYW5uZWwgKikgOworCXZvaWQgKCAqIGFzc2VydG1lbW9mZiApCShzdHJ1Y3QgY2hhbm5lbCAqKSA7CisJdW5jaGFyIHBvbGxlcl9pbmhpYml0ZWQgOworfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2Fjb25maWcuaCBiL2RyaXZlcnMvY2hhci9lcGNhY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkZWMwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9lcGNhY29uZmlnLmgKQEAgLTAsMCArMSw3IEBACisjZGVmaW5lIE5VTUNBUkRTIDAKKyNkZWZpbmUgTkJERVZTIDAKKworc3RydWN0IGJvYXJkX2luZm8gc3RhdGljX2JvYXJkc1tOVU1DQVJEU109eworfTsKKworLyogRE8gTk9UIEhBTkQgRURJVCBUSElTIEZJTEUhICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXNwLmMgYi9kcml2ZXJzL2NoYXIvZXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1M2QyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZXNwLmMKQEAgLTAsMCArMSwyNjMwIEBACisvKgorICogIGVzcC5jIC0gZHJpdmVyIGZvciBIYXllcyBFU1Agc2VyaWFsIGNhcmRzCisgKgorICogIC0tLSBOb3RpY2VzIGZyb20gc2VyaWFsLmMsIHVwb24gd2hpY2ggdGhpcyBkcml2ZXIgaXMgYmFzZWQgLS0tCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgRXh0ZW5zaXZlbHkgcmV3cml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDgvMTYvOTIgLS0gOS8xNC85Mi4gIE5vdworICogIG11Y2ggbW9yZSBleHRlbnNpYmxlIHRvIHN1cHBvcnQgb3RoZXIgc2VyaWFsIGNhcmRzIGJhc2VkIG9uIHRoZQorICogIDE2NDUwLzE2NTUwQSBVQVJUJ3MuICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgQVNUIEZvdXJQb3J0IGFuZCB0aGUKKyAqICBBY2NlbnQgQXN5bmMgYm9hcmQuICAKKyAqCisgKiAgc2V0X3NlcmlhbF9pbmZvIGZpeGVkIHRvIHNldCB0aGUgZmxhZ3MsIGN1c3RvbSBkaXZpc29yLCBhbmQgdWFydAorICogCXR5cGUgZmllbGRzLiAgRml4IHN1Z2dlc3RlZCBieSBNaWNoYWVsIEsuIEpvaG5zb24gMTIvMTIvOTIuCisgKgorICogIDExLzk1OiBUSU9DTUlXQUlULCBUSU9DR0lDT1VOVCBieSBBbmdlbG8gSGFyaXRzaXMgPGFoQGRvYy5pYy5hYy51az4KKyAqCisgKiAgMDMvOTY6IE1vZHVsYXJpc2VkIGJ5IEFuZ2VsbyBIYXJpdHNpcyA8YWhAZG9jLmljLmFjLnVrPgorICoKKyAqICByc19zZXRfdGVybWlvcyBmaXhlZCB0byBsb29rIGFsc28gZm9yIGNoYW5nZXMgb2YgdGhlIGlucHV0CisgKiAgICAgIGZsYWdzIElOUENLLCBCUktJTlQsIFBBUk1SSywgSUdOUEFSIGFuZCBJR05CUksuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVybmQgQW5o77+9cGwgMDUvMTcvOTYuCisgKgorICogLS0tIEVuZCBvZiBub3RpY2VzIGZyb20gc2VyaWFsLmMgLS0tCisgKgorICogU3VwcG9ydCBmb3IgdGhlIEVTUCBzZXJpYWwgY2FyZCBieSBBbmRyZXcgSi4gUm9iaW5zb24KKyAqICAgICA8YXJvYmluc29Abnl4Lm5ldD4gKENhcmQgZGV0ZWN0aW9uIHJvdXRpbmUgdGFrZW4gZnJvbSBhIHBhdGNoCisgKiAgICAgYnkgRGVubmlzIEouIEJveWxhbikuICBQYXRjaGVzIHRvIGFsbG93IHVzZSB3aXRoIDIuMS54IGNvbnRyaWJ1dGVkCisgKiAgICAgYnkgQ2hyaXMgRmF5bG9yLgorICoKKyAqIE1vc3QgcmVjZW50IGNoYW5nZXM6IChBbmRyZXcgSi4gUm9iaW5zb24pCisgKiAgIFN1cHBvcnQgZm9yIFBJTyBtb2RlLiAgVGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byB3b3JrIHByb3Blcmx5IHdpdGgKKyAqICAgICBtdWx0aXBvcnQgY2FyZHMuCisgKgorICogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IC0KKyAqIHNldmVyYWwgY2xlYW51cHMsIHVzZSBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdCwgZXRjCisgKgorICogVGhpcyBtb2R1bGUgZXhwb3J0cyB0aGUgZm9sbG93aW5nIHJzMjMyIGlvIGZ1bmN0aW9uczoKKyAqCisgKglpbnQgZXNwc2VyaWFsX2luaXQodm9pZCk7CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvaGF5ZXNlc3AuaD4KKworI2RlZmluZSBOUl9QT1JUUyA2NAkvKiBtYXhpbXVtIG51bWJlciBvZiBwb3J0cyAqLworI2RlZmluZSBOUl9QUklNQVJZIDgJLyogbWF4aW11bSBudW1iZXIgb2YgcHJpbWFyeSBwb3J0cyAqLworI2RlZmluZSBSRUdJT05fU0laRSA4ICAgLyogc2l6ZSBvZiBpbyByZWdpb24gdG8gcmVxdWVzdCAqLworCisvKiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBjYW4gYmUgc2V0IGJ5IGdpdmluZyBtb2R1bGUgb3B0aW9ucyAqLworc3RhdGljIGludCBpcnFbTlJfUFJJTUFSWV07CS8qIElSUSBmb3IgZWFjaCBiYXNlIHBvcnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGl2aXNvcltOUl9QUklNQVJZXTsgLyogY3VzdG9tIGRpdmlzb3IgZm9yIGVhY2ggcG9ydCAqLworc3RhdGljIHVuc2lnbmVkIGludCBkbWEgPSBFU1BfRE1BX0NIQU5ORUw7IC8qIERNQSBjaGFubmVsICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJ4X3RyaWdnZXIgPSBFU1BfUlhfVFJJR0dFUjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHhfdHJpZ2dlciA9IEVTUF9UWF9UUklHR0VSOworc3RhdGljIHVuc2lnbmVkIGludCBmbG93X29mZiA9IEVTUF9GTE9XX09GRjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmxvd19vbiA9IEVTUF9GTE9XX09OOworc3RhdGljIHVuc2lnbmVkIGludCByeF90aW1lb3V0ID0gRVNQX1JYX1RNT1VUOworc3RhdGljIHVuc2lnbmVkIGludCBwaW9fdGhyZXNob2xkID0gRVNQX1BJT19USFJFU0hPTEQ7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShkaXZpc29yLCB1aW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShkbWEsIHVpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X3RyaWdnZXIsIHVpbnQsIDApOworbW9kdWxlX3BhcmFtKHR4X3RyaWdnZXIsIHVpbnQsIDApOworbW9kdWxlX3BhcmFtKGZsb3dfb2ZmLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbShmbG93X29uLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF90aW1lb3V0LCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbShwaW9fdGhyZXNob2xkLCB1aW50LCAwKTsKKworLyogRU5EICovCisKK3N0YXRpYyBjaGFyICpkbWFfYnVmZmVyOworc3RhdGljIGludCBkbWFfYnl0ZXM7CitzdGF0aWMgc3RydWN0IGVzcF9waW9fYnVmZmVyICpmcmVlX3Bpb19idWY7CisKKyNkZWZpbmUgRE1BX0JVRkZFUl9TWiAxMDI0CisKKyNkZWZpbmUgV0FLRVVQX0NIQVJTIDEwMjQKKworc3RhdGljIGNoYXIgc2VyaWFsX25hbWVbXSBfX2luaXRkYXRhID0gIkVTUCBzZXJpYWwgZHJpdmVyIjsKK3N0YXRpYyBjaGFyIHNlcmlhbF92ZXJzaW9uW10gX19pbml0ZGF0YSA9ICIyLjIiOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmVzcF9kcml2ZXI7CisKKy8qIHNlcmlhbCBzdWJ0eXBlIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTAkxCisKKy8qCisgKiBTZXJpYWwgZHJpdmVyIGNvbmZpZ3VyYXRpb24gc2VjdGlvbi4gIEhlcmUgYXJlIHRoZSB2YXJpb3VzIG9wdGlvbnM6CisgKgorICogU0VSSUFMX1BBUkFOT0lBX0NIRUNLCisgKiAJCUNoZWNrIHRoZSBtYWdpYyBudW1iZXIgZm9yIHRoZSBlc3Bfc3RydWN0dXJlIHdoZXJlCisgKiAJCWV2ZXIgcG9zc2libGUuCisgKi8KKworI3VuZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSworI2RlZmluZSBTRVJJQUxfRE9fUkVTVEFSVAorCisjdW5kZWYgU0VSSUFMX0RFQlVHX0lOVFIKKyN1bmRlZiBTRVJJQUxfREVCVUdfT1BFTgorI3VuZGVmIFNFUklBTF9ERUJVR19GTE9XCisKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChTRVJJQUxfREVCVUdfTUNPVU5UKQorI2RlZmluZSBEQkdfQ05UKHMpIHByaW50aygiKCVzKTogWyV4XSByZWZjPSVkLCBzZXJjPSVkLCB0dHljPSVkIC0+ICVzXG4iLCBcCisgdHR5LT5uYW1lLCAoaW5mby0+ZmxhZ3MpLCBzZXJpYWxfZHJpdmVyLnJlZmNvdW50LGluZm8tPmNvdW50LHR0eS0+Y291bnQscykKKyNlbHNlCisjZGVmaW5lIERCR19DTlQocykKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGVzcF9zdHJ1Y3QgKnBvcnRzOworCitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8pOworc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICosIGludCk7CisKKy8qCisgKiBUaGUgRVNQIGNhcmQgaGFzIGEgY2xvY2sgcmF0ZSBvZiAxNC43NDU2IE1IeiAodGhhdCBpcywgMioqRVNQQ19TQ0FMRQorICogdGltZXMgdGhlIG5vcm1hbCAxLjg0MzIgTWh6IGNsb2NrIG9mIG1vc3Qgc2VyaWFsIGJvYXJkcykuCisgKi8KKyNkZWZpbmUgQkFTRV9CQVVEICgoMTg0MzIwMCAvIDE2KSAqICgxIDw8IEVTUENfU0NBTEUpKQorCisvKiBTdGFuZGFyZCBDT00gZmxhZ3MgKGV4Y2VwdCBmb3IgQ09NNCwgYmVjYXVzZSBvZiB0aGUgODUxNCBwcm9ibGVtKSAqLworI2RlZmluZSBTVERfQ09NX0ZMQUdTIChBU1lOQ19CT09UX0FVVE9DT05GIHwgQVNZTkNfU0tJUF9URVNUKQorCisvKgorICogdG1wX2J1ZiBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBieSBzZXJpYWxfd3JpdGUuICBXZSBuZWVkIHRvCisgKiBsb2NrIGl0IGluIGNhc2UgdGhlIG1lbWNweV9mcm9tZnMgYmxvY2tzIHdoaWxlIHN3YXBwaW5nIGluIGEgcGFnZSwKKyAqIGFuZCBzb21lIG90aGVyIHByb2dyYW0gdHJpZXMgdG8gZG8gYSBzZXJpYWwgd3JpdGUgYXQgdGhlIHNhbWUgdGltZS4KKyAqIFNpbmNlIHRoZSBsb2NrIHdpbGwgb25seSBjb21lIHVuZGVyIGNvbnRlbnRpb24gd2hlbiB0aGUgc3lzdGVtIGlzCisgKiBzd2FwcGluZyBhbmQgYXZhaWxhYmxlIG1lbW9yeSBpcyBsb3csIGl0IG1ha2VzIHNlbnNlIHRvIHNoYXJlIG9uZQorICogYnVmZmVyIGFjcm9zcyBhbGwgdGhlIHNlcmlhbCBwb3J0cywgc2luY2UgaXQgc2lnbmlmaWNhbnRseSBzYXZlcworICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKKworc3RhdGljIGlubGluZSBpbnQgc2VyaWFsX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAorCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSworCXN0YXRpYyBjb25zdCBjaGFyIGJhZG1hZ2ljW10gPSBLRVJOX1dBUk5JTkcKKwkJIldhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIHNlcmlhbCBzdHJ1Y3QgKCVzKSBpbiAlc1xuIjsKKwlzdGF0aWMgY29uc3QgY2hhciBiYWRpbmZvW10gPSBLRVJOX1dBUk5JTkcKKwkJIldhcm5pbmc6IG51bGwgZXNwX3N0cnVjdCBmb3IgKCVzKSBpbiAlc1xuIjsKKworCWlmICghaW5mbykgeworCQlwcmludGsoYmFkaW5mbywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoaW5mby0+bWFnaWMgIT0gRVNQX01BR0lDKSB7CisJCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZXJpYWxfaW4oc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGluYihpbmZvLT5wb3J0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNlcmlhbF9vdXQoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sIGludCBvZmZzZXQsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCW91dGIodmFsdWUsIGluZm8tPnBvcnQrb2Zmc2V0KTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnNfc3RvcCgpIGFuZCByc19zdGFydCgpCisgKgorICogVGhpcyByb3V0aW5lcyBhcmUgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIG9yIHJlc2V0dGluZyB0dHktPnN0b3BwZWQuCisgKiBUaGV5IGVuYWJsZSBvciBkaXNhYmxlIHRyYW5zbWl0dGVyIGludGVycnVwdHMsIGFzIG5lY2Vzc2FyeS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByc19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3N0b3AiKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpZiAoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkgeworCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByc19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfc3RhcnQiKSkKKwkJcmV0dXJuOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPnhtaXRfY250ICYmIGluZm8tPnhtaXRfYnVmICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhlcmUgc3RhcnRzIHRoZSBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZXMuICBBbGwgb2YgdGhlIGZvbGxvd2luZworICogc3Vicm91dGluZXMgYXJlIGRlY2xhcmVkIGFzIGlubGluZSBhbmQgYXJlIGZvbGRlZCBpbnRvCisgKiByc19pbnRlcnJ1cHQoKS4gIFRoZXkgd2VyZSBzZXBhcmF0ZWQgb3V0IGZvciByZWFkYWJpbGl0eSdzIHNha2UuCisgKgorICogTm90ZTogcnNfaW50ZXJydXB0KCkgaXMgYSAiZmFzdCIgaW50ZXJydXB0LCB3aGljaCBtZWFucyB0aGF0IGl0CisgKiBydW5zIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgb2ZmLiAgUGVvcGxlIHdobyBtYXkgd2FudCB0byBtb2RpZnkKKyAqIHJzX2ludGVycnVwdCgpIHNob3VsZCB0cnkgdG8ga2VlcCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYXMgZmFzdCBhcworICogcG9zc2libGUuICBBZnRlciB5b3UgYXJlIGRvbmUgbWFraW5nIG1vZGlmaWNhdGlvbnMsIGl0IGlzIG5vdCBhIGJhZAorICogaWRlYSB0byBkbzoKKyAqIAorICogZ2NjIC1TIC1ES0VSTkVMIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIHNlcmlhbC5jCisgKgorICogYW5kIGxvb2sgYXQgdGhlIHJlc3VsdGluZyBhc3NlbWJsZSBjb2RlIGluIHNlcmlhbC5zLgorICoKKyAqIAkJCQktIFRlZCBUcydvICh0eXRzb0BtaXQuZWR1KSwgNy1NYXItOTMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBzY2hlZHVsZQorICogcHJvY2Vzc2luZyBpbiB0aGUgc29mdHdhcmUgaW50ZXJydXB0IHBvcnRpb24gb2YgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJzX3NjaGVkX2V2ZW50KHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAorCQkJCSAgaW50IGV2ZW50KQoreworCWluZm8tPmV2ZW50IHw9IDEgPDwgZXZlbnQ7CisJc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsKK30KKworc3RhdGljIERFRklORV9TUElOTE9DSyhwaW9fbG9jayk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGVzcF9waW9fYnVmZmVyICpnZXRfcGlvX2J1ZmZlcih2b2lkKQoreworCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGlvX2xvY2ssIGZsYWdzKTsKKwlpZiAoZnJlZV9waW9fYnVmKSB7CisJCWJ1ZiA9IGZyZWVfcGlvX2J1ZjsKKwkJZnJlZV9waW9fYnVmID0gYnVmLT5uZXh0OworCX0gZWxzZSB7CisJCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlc3BfcGlvX2J1ZmZlciksIEdGUF9BVE9NSUMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW9fbG9jaywgZmxhZ3MpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWxlYXNlX3Bpb19idWZmZXIoc3RydWN0IGVzcF9waW9fYnVmZmVyICpidWYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGlvX2xvY2ssIGZsYWdzKTsKKwlidWYtPm5leHQgPSBmcmVlX3Bpb19idWY7CisJZnJlZV9waW9fYnVmID0gYnVmOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpb19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWNlaXZlX2NoYXJzX3BpbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywgaW50IG51bV9ieXRlcykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCWludCBpOworCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqcGlvX2J1ZjsKKwlzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKmVycl9idWY7CisJdW5zaWduZWQgY2hhciBzdGF0dXNfbWFzazsKKworCXBpb19idWYgPSBnZXRfcGlvX2J1ZmZlcigpOworCisJaWYgKCFwaW9fYnVmKQorCQlyZXR1cm47CisKKwllcnJfYnVmID0gZ2V0X3Bpb19idWZmZXIoKTsKKworCWlmICghZXJyX2J1ZikgeworCQlyZWxlYXNlX3Bpb19idWZmZXIocGlvX2J1Zik7CisJCXJldHVybjsKKwl9CisKKwlzdGF0dXNfbWFzayA9IChpbmZvLT5yZWFkX3N0YXR1c19tYXNrID4+IDIpICYgMHgwNzsKKwkJCisJZm9yIChpID0gMDsgaSA8IG51bV9ieXRlcyAtIDE7IGkgKz0gMikgeworCQkqKCh1bnNpZ25lZCBzaG9ydCAqKShwaW9fYnVmLT5kYXRhICsgaSkpID0KKwkJCWludyhpbmZvLT5wb3J0ICsgVUFSVF9FU0lfUlgpOworCQllcnJfYnVmLT5kYXRhW2ldID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1JXUyk7CisJCWVycl9idWYtPmRhdGFbaSArIDFdID0gKGVycl9idWYtPmRhdGFbaV0gPj4gMykgJiBzdGF0dXNfbWFzazsKKwkJZXJyX2J1Zi0+ZGF0YVtpXSAmPSBzdGF0dXNfbWFzazsKKwl9CisKKwlpZiAobnVtX2J5dGVzICYgMHgwMDAxKSB7CisJCXBpb19idWYtPmRhdGFbbnVtX2J5dGVzIC0gMV0gPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfUlgpOworCQllcnJfYnVmLT5kYXRhW251bV9ieXRlcyAtIDFdID0KKwkJCShzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfUldTKSA+PiAzKSAmIHN0YXR1c19tYXNrOworCX0KKworCS8qIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHN0aWxsIG9rIHNpbmNlIGludGVycnVwdHMgd2VyZSBlbmFibGVkICovCisJdHR5ID0gaW5mby0+dHR5OworCisJaWYgKCF0dHkpIHsKKwkJcmVsZWFzZV9waW9fYnVmZmVyKHBpb19idWYpOworCQlyZWxlYXNlX3Bpb19idWZmZXIoZXJyX2J1Zik7CisJCWluZm8tPnN0YXRfZmxhZ3MgJj0gfkVTUF9TVEFUX1JYX1RJTUVPVVQ7CisJCXJldHVybjsKKwl9CisKKwlzdGF0dXNfbWFzayA9IChpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgPj4gMikgJiAweDA3OworCisJZm9yIChpID0gMDsgaSA8IG51bV9ieXRlczsgaSsrKSB7CisJCWlmICghKGVycl9idWYtPmRhdGFbaV0gJiBzdGF0dXNfbWFzaykpIHsKKwkJCSoodHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrKSA9IHBpb19idWYtPmRhdGFbaV07CisKKwkJCWlmIChlcnJfYnVmLT5kYXRhW2ldICYgMHgwNCkgeworCQkJCSoodHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrKSA9IFRUWV9CUkVBSzsKKworCQkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSykKKwkJCQkJZG9fU0FLKHR0eSk7CisJCQl9CisJCQllbHNlIGlmIChlcnJfYnVmLT5kYXRhW2ldICYgMHgwMikKKwkJCQkqKHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKykgPSBUVFlfRlJBTUU7CisJCQllbHNlIGlmIChlcnJfYnVmLT5kYXRhW2ldICYgMHgwMSkKKwkJCQkqKHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKykgPSBUVFlfUEFSSVRZOworCQkJZWxzZQorCQkJCSoodHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrKSA9IDA7CisJCQorCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCX0KKwl9CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKworCWluZm8tPnN0YXRfZmxhZ3MgJj0gfkVTUF9TVEFUX1JYX1RJTUVPVVQ7CisJcmVsZWFzZV9waW9fYnVmZmVyKHBpb19idWYpOworCXJlbGVhc2VfcGlvX2J1ZmZlcihlcnJfYnVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlY2VpdmVfY2hhcnNfZG1hKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgbnVtX2J5dGVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW5mby0+c3RhdF9mbGFncyAmPSB+RVNQX1NUQVRfUlhfVElNRU9VVDsKKwlkbWFfYnl0ZXMgPSBudW1fYnl0ZXM7CisJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ETUFfUlg7CisJCisJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKyAgICAgICAgZGlzYWJsZV9kbWEoZG1hKTsKKyAgICAgICAgY2xlYXJfZG1hX2ZmKGRtYSk7CisgICAgICAgIHNldF9kbWFfbW9kZShkbWEsIERNQV9NT0RFX1JFQUQpOworICAgICAgICBzZXRfZG1hX2FkZHIoZG1hLCBpc2FfdmlydF90b19idXMoZG1hX2J1ZmZlcikpOworICAgICAgICBzZXRfZG1hX2NvdW50KGRtYSwgZG1hX2J5dGVzKTsKKyAgICAgICAgZW5hYmxlX2RtYShkbWEpOworICAgICAgICByZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKyAgICAgICAgCisgICAgICAgIHNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NUQVJUX0RNQV9SWCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWNlaXZlX2NoYXJzX2RtYV9kb25lKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAorCQkJCQkgICAgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCWludCBudW1fYnl0ZXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwkKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRtYSk7CisJY2xlYXJfZG1hX2ZmKGRtYSk7CisKKwlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9ETUFfUlg7CisJbnVtX2J5dGVzID0gZG1hX2J5dGVzIC0gZ2V0X2RtYV9yZXNpZHVlKGRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCisJaW5mby0+aWNvdW50LnJ4ICs9IG51bV9ieXRlczsKKworCW1lbWNweSh0dHktPmZsaXAuY2hhcl9idWZfcHRyLCBkbWFfYnVmZmVyLCBudW1fYnl0ZXMpOworCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gbnVtX2J5dGVzOworCXR0eS0+ZmxpcC5jb3VudCArPSBudW1fYnl0ZXM7CisJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIDAsIG51bV9ieXRlcyk7CisJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBudW1fYnl0ZXM7CisKKwlpZiAobnVtX2J5dGVzID4gMCkgeworCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyLS07CisKKwkJc3RhdHVzICY9ICgweDFjICYgaW5mby0+cmVhZF9zdGF0dXNfbWFzayk7CisKKwkJaWYgKHN0YXR1cyAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzaykgeworCQkJdHR5LT5mbGlwLmNvdW50LS07CisJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyLS07CisJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyLS07CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgxMCkgeworCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfQlJFQUs7CisJCQkoaW5mby0+aWNvdW50LmJyaykrKzsKKwkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSykKKwkJCQlkb19TQUsodHR5KTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiAweDA4KSB7CisJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9GUkFNRTsKKwkJCShpbmZvLT5pY291bnQuZnJhbWUpKys7CisJCX0KKwkJZWxzZSBpZiAoc3RhdHVzICYgMHgwNCkgeworCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfUEFSSVRZOworCQkJKGluZm8tPmljb3VudC5wYXJpdHkpKys7CisJCX0KKworCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CisJCQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwl9CisKKwlpZiAoZG1hX2J5dGVzICE9IG51bV9ieXRlcykgeworCQludW1fYnl0ZXMgPSBkbWFfYnl0ZXMgLSBudW1fYnl0ZXM7CisJCWRtYV9ieXRlcyA9IDA7CisJCXJlY2VpdmVfY2hhcnNfZG1hKGluZm8sIG51bV9ieXRlcyk7CisJfSBlbHNlCisJCWRtYV9ieXRlcyA9IDA7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgaW5mby0+bG9jayAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNtaXRfY2hhcnNfcGlvKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAorCQkJCQlpbnQgc3BhY2VfYXZhaWwpCit7CisJaW50IGk7CisJc3RydWN0IGVzcF9waW9fYnVmZmVyICpwaW9fYnVmOworCisJcGlvX2J1ZiA9IGdldF9waW9fYnVmZmVyKCk7CisKKwlpZiAoIXBpb19idWYpCisJCXJldHVybjsKKworCXdoaWxlIChzcGFjZV9hdmFpbCAmJiBpbmZvLT54bWl0X2NudCkgeworCQlpZiAoaW5mby0+eG1pdF90YWlsICsgc3BhY2VfYXZhaWwgPD0gRVNQX1hNSVRfU0laRSkgeworCQkJbWVtY3B5KHBpb19idWYtPmRhdGEsCisJCQkgICAgICAgJihpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWxdKSwKKwkJCSAgICAgICBzcGFjZV9hdmFpbCk7CisJCX0gZWxzZSB7CisJCQlpID0gRVNQX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfdGFpbDsKKwkJCW1lbWNweShwaW9fYnVmLT5kYXRhLAorCQkJICAgICAgICYoaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXSksIGkpOworCQkJbWVtY3B5KCYocGlvX2J1Zi0+ZGF0YVtpXSksIGluZm8tPnhtaXRfYnVmLAorCQkJICAgICAgIHNwYWNlX2F2YWlsIC0gaSk7CisJCX0KKworCQlpbmZvLT54bWl0X2NudCAtPSBzcGFjZV9hdmFpbDsKKwkJaW5mby0+eG1pdF90YWlsID0gKGluZm8tPnhtaXRfdGFpbCArIHNwYWNlX2F2YWlsKSAmCisJCQkoRVNQX1hNSVRfU0laRSAtIDEpOworCisJCWZvciAoaSA9IDA7IGkgPCBzcGFjZV9hdmFpbCAtIDE7IGkgKz0gMikgeworCQkJb3V0dygqKCh1bnNpZ25lZCBzaG9ydCAqKShwaW9fYnVmLT5kYXRhICsgaSkpLAorCQkJICAgICBpbmZvLT5wb3J0ICsgVUFSVF9FU0lfVFgpOworCQl9CisKKwkJaWYgKHNwYWNlX2F2YWlsICYgMHgwMDAxKQorCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9UWCwKKwkJCQkgICBwaW9fYnVmLT5kYXRhW3NwYWNlX2F2YWlsIC0gMV0pOworCisJCWlmIChpbmZvLT54bWl0X2NudCkgeworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfTk9fQ09NTUFORCk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVFhfQVZBSUwpOworCQkJc3BhY2VfYXZhaWwgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDEpIDw8IDg7CisJCQlzcGFjZV9hdmFpbCB8PSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOworCisJCQlpZiAoc3BhY2VfYXZhaWwgPiBpbmZvLT54bWl0X2NudCkKKwkJCQlzcGFjZV9hdmFpbCA9IGluZm8tPnhtaXRfY250OworCQl9CisJfQorCisJaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7CisJCXJzX3NjaGVkX2V2ZW50KGluZm8sIEVTUF9FVkVOVF9XUklURV9XQUtFVVApOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKKwkJcHJpbnRrKCJUSFJFLi4uIik7CisjZW5kaWYKKworCQlpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCkgeworCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLAorCQkJCSAgIEVTSV9TRVRfU1JWX01BU0spOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOworCQl9CisJfQorCisJcmVsZWFzZV9waW9fYnVmZmVyKHBpb19idWYpOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIGluZm8tPmxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc21pdF9jaGFyc19kbWEoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sIGludCBudW1fYnl0ZXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlkbWFfYnl0ZXMgPSBudW1fYnl0ZXM7CisKKwlpZiAoaW5mby0+eG1pdF90YWlsICsgZG1hX2J5dGVzIDw9IEVTUF9YTUlUX1NJWkUpIHsKKwkJbWVtY3B5KGRtYV9idWZmZXIsICYoaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXSksCisJCSAgICAgICBkbWFfYnl0ZXMpOworCX0gZWxzZSB7CisJCWludCBpID0gRVNQX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfdGFpbDsKKwkJbWVtY3B5KGRtYV9idWZmZXIsICYoaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXSksCisJCQlpKTsKKwkJbWVtY3B5KCYoZG1hX2J1ZmZlcltpXSksIGluZm8tPnhtaXRfYnVmLCBkbWFfYnl0ZXMgLSBpKTsKKwl9CisKKwlpbmZvLT54bWl0X2NudCAtPSBkbWFfYnl0ZXM7CisJaW5mby0+eG1pdF90YWlsID0gKGluZm8tPnhtaXRfdGFpbCArIGRtYV9ieXRlcykgJiAoRVNQX1hNSVRfU0laRSAtIDEpOworCisJaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7CisJCXJzX3NjaGVkX2V2ZW50KGluZm8sIEVTUF9FVkVOVF9XUklURV9XQUtFVVApOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKKwkJcHJpbnRrKCJUSFJFLi4uIik7CisjZW5kaWYKKworCQlpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCkgeworCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwkJfQorCX0KKworCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfRE1BX1RYOworCQorCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisgICAgICAgIGRpc2FibGVfZG1hKGRtYSk7CisgICAgICAgIGNsZWFyX2RtYV9mZihkbWEpOworICAgICAgICBzZXRfZG1hX21vZGUoZG1hLCBETUFfTU9ERV9XUklURSk7CisgICAgICAgIHNldF9kbWFfYWRkcihkbWEsIGlzYV92aXJ0X3RvX2J1cyhkbWFfYnVmZmVyKSk7CisgICAgICAgIHNldF9kbWFfY291bnQoZG1hLCBkbWFfYnl0ZXMpOworICAgICAgICBlbmFibGVfZG1hKGRtYSk7CisgICAgICAgIHJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworICAgICAgICAKKyAgICAgICAgc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU1RBUlRfRE1BX1RYKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zbWl0X2NoYXJzX2RtYV9kb25lKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQoreworCWludCBudW1fYnl0ZXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKworCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoZG1hKTsKKwljbGVhcl9kbWFfZmYoZG1hKTsKKworCW51bV9ieXRlcyA9IGRtYV9ieXRlcyAtIGdldF9kbWFfcmVzaWR1ZShkbWEpOworCWluZm8tPmljb3VudC50eCArPSBkbWFfYnl0ZXM7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisKKwlpZiAoZG1hX2J5dGVzICE9IG51bV9ieXRlcykgeworCQlkbWFfYnl0ZXMgLT0gbnVtX2J5dGVzOworCQltZW1tb3ZlKGRtYV9idWZmZXIsIGRtYV9idWZmZXIgKyBudW1fYnl0ZXMsIGRtYV9ieXRlcyk7CisJCQorCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworICAgICAgICAJZGlzYWJsZV9kbWEoZG1hKTsKKyAgICAgICAgCWNsZWFyX2RtYV9mZihkbWEpOworICAgICAgICAJc2V0X2RtYV9tb2RlKGRtYSwgRE1BX01PREVfV1JJVEUpOworICAgICAgICAJc2V0X2RtYV9hZGRyKGRtYSwgaXNhX3ZpcnRfdG9fYnVzKGRtYV9idWZmZXIpKTsKKyAgICAgICAgCXNldF9kbWFfY291bnQoZG1hLCBkbWFfYnl0ZXMpOworICAgICAgICAJZW5hYmxlX2RtYShkbWEpOworICAgICAgICAJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisgICAgICAgIAkKKyAgICAgICAgCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NUQVJUX0RNQV9UWCk7CisJfSBlbHNlIHsKKwkJZG1hX2J5dGVzID0gMDsKKwkJaW5mby0+c3RhdF9mbGFncyAmPSB+RVNQX1NUQVRfRE1BX1RYOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbykKK3sKKwlpbnQJc3RhdHVzOworCQorCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9VQVJUX1NUQVQpOworCXN0YXR1cyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMik7CisKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQU5ZX0RFTFRBKSB7CisJCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQorCQkJaW5mby0+aWNvdW50LnJuZysrOworCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKKwkJCWluZm8tPmljb3VudC5kc3IrKzsKKwkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpCisJCQlpbmZvLT5pY291bnQuZGNkKys7CisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQorCQkJaW5mby0+aWNvdW50LmN0cysrOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwl9CisKKwlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpICYmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKSkgeworI2lmIChkZWZpbmVkKFNFUklBTF9ERUJVR19PUEVOKSB8fCBkZWZpbmVkKFNFUklBTF9ERUJVR19JTlRSKSkKKwkJcHJpbnRrKCJ0dHlzJWQgQ0Qgbm93ICVzLi4uIiwgaW5mby0+bGluZSwKKwkJICAgICAgIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpID8gIm9uIiA6ICJvZmYiKTsKKyNlbmRpZgkJCisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJCWVsc2UgeworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJCQlwcmludGsoInNjaGVkdWxpbmcgaGFuZ3VwLi4uIik7CisjZW5kaWYKKwkJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZV9oYW5ndXApOworCQl9CisJfQorfQorCisvKgorICogVGhpcyBpcyB0aGUgc2VyaWFsIGRyaXZlcidzIGludGVycnVwdCByb3V0aW5lCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCByc19pbnRlcnJ1cHRfc2luZ2xlKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvOworCXVuc2lnbmVkIGVycl9zdGF0dXM7CisJdW5zaWduZWQgaW50IHNjcmF0Y2g7CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgorCXByaW50aygicnNfaW50ZXJydXB0X3NpbmdsZSglZCkuLi4iLCBpcnEpOworI2VuZGlmCisJaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKWRldl9pZDsKKwllcnJfc3RhdHVzID0gMDsKKwlzY3JhdGNoID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NJRCk7CisKKwlzcGluX2xvY2soJmluZm8tPmxvY2spOworCQorCWlmICghaW5mby0+dHR5KSB7CisJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChzY3JhdGNoICYgMHgwNCkgeyAvKiBlcnJvciAqLworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfRVJSX1NUQVQpOworCQllcnJfc3RhdHVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKTsKKwkJc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKKworCQlpZiAoZXJyX3N0YXR1cyAmIDB4MDEpCisJCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX1JYX1RJTUVPVVQ7CisKKwkJaWYgKGVycl9zdGF0dXMgJiAweDIwKSAvKiBVQVJUIHN0YXR1cyAqLworCQkJY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8pOworCisJCWlmIChlcnJfc3RhdHVzICYgMHg4MCkgLyogU3RhcnQgYnJlYWsgKi8KKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+YnJlYWtfd2FpdCk7CisJfQorCQkKKwlpZiAoKHNjcmF0Y2ggJiAweDg4KSB8fCAvKiBETUEgY29tcGxldGVkIG9yIHRpbWVkIG91dCAqLworCSAgICAoZXJyX3N0YXR1cyAmIDB4MWMpIC8qIHJlY2VpdmUgZXJyb3IgKi8pIHsKKwkJaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ETUFfUlgpCisJCQlyZWNlaXZlX2NoYXJzX2RtYV9kb25lKGluZm8sIGVycl9zdGF0dXMpOworCQllbHNlIGlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfRE1BX1RYKQorCQkJdHJhbnNtaXRfY2hhcnNfZG1hX2RvbmUoaW5mbyk7CisJfQorCisJaWYgKCEoaW5mby0+c3RhdF9mbGFncyAmIChFU1BfU1RBVF9ETUFfUlggfCBFU1BfU1RBVF9ETUFfVFgpKSAmJgorCSAgICAoKHNjcmF0Y2ggJiAweDAxKSB8fCAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX1JYX1RJTUVPVVQpKSAmJgorCSAgICAoaW5mby0+SUVSICYgVUFSVF9JRVJfUkRJKSkgeworCQlpbnQgbnVtX2J5dGVzOworCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfUlhfQVZBSUwpOworCQludW1fYnl0ZXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDEpIDw8IDg7CisJCW51bV9ieXRlcyB8PSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOworCisJCWlmIChudW1fYnl0ZXMgPiAoVFRZX0ZMSVBCVUZfU0laRSAtIGluZm8tPnR0eS0+ZmxpcC5jb3VudCkpCisJCSAgbnVtX2J5dGVzID0gVFRZX0ZMSVBCVUZfU0laRSAtIGluZm8tPnR0eS0+ZmxpcC5jb3VudDsKKworCQlpZiAobnVtX2J5dGVzKSB7CisJCQlpZiAoZG1hX2J5dGVzIHx8CisJCQkgICAgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9VU0VfUElPKSB8fAorCQkJICAgIChudW1fYnl0ZXMgPD0gaW5mby0+Y29uZmlnLnBpb190aHJlc2hvbGQpKQorCQkJCXJlY2VpdmVfY2hhcnNfcGlvKGluZm8sIG51bV9ieXRlcyk7CisJCQllbHNlCisJCQkJcmVjZWl2ZV9jaGFyc19kbWEoaW5mbywgbnVtX2J5dGVzKTsKKwkJfQorCX0KKwkKKwlpZiAoIShpbmZvLT5zdGF0X2ZsYWdzICYgKEVTUF9TVEFUX0RNQV9SWCB8IEVTUF9TVEFUX0RNQV9UWCkpICYmCisJICAgIChzY3JhdGNoICYgMHgwMikgJiYgKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CisJCWlmICgoaW5mby0+eG1pdF9jbnQgPD0gMCkgfHwgaW5mby0+dHR5LT5zdG9wcGVkKSB7CisJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOworCQl9IGVsc2UgeworCQkJaW50IG51bV9ieXRlczsKKworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfTk9fQ09NTUFORCk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVFhfQVZBSUwpOworCQkJbnVtX2J5dGVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OworCQkJbnVtX2J5dGVzIHw9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMik7CisKKwkJCWlmIChudW1fYnl0ZXMgPiBpbmZvLT54bWl0X2NudCkKKwkJCQludW1fYnl0ZXMgPSBpbmZvLT54bWl0X2NudDsKKworCQkJaWYgKG51bV9ieXRlcykgeworCQkJCWlmIChkbWFfYnl0ZXMgfHwKKwkJCQkgICAgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9VU0VfUElPKSB8fAorCQkJCSAgICAobnVtX2J5dGVzIDw9IGluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkKSkKKwkJCQkJdHJhbnNtaXRfY2hhcnNfcGlvKGluZm8sIG51bV9ieXRlcyk7CisJCQkJZWxzZQorCQkJCQl0cmFuc21pdF9jaGFyc19kbWEoaW5mbywgbnVtX2J5dGVzKTsKKwkJCX0KKwkJfQorCX0KKworCWluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKKworI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCisJcHJpbnRrKCJlbmQuXG4iKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBIZXJlIGVuZHMgdGhlIHNlcmlhbCBpbnRlcnJ1cHQgcm91dGluZXMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdAkqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKSBwcml2YXRlXzsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCQorCXR0eSA9IGluZm8tPnR0eTsKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFU1BfRVZFTlRfV1JJVEVfV0FLRVVQLCAmaW5mby0+ZXZlbnQpKSB7CisJCXR0eV93YWtldXAodHR5KTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlIHNjaGVkdWxlciB0cXVldWUgd2hlbiB0aGUgaW50ZXJydXB0CisgKiByb3V0aW5lIGhhcyBzaWduYWxsZWQgdGhhdCBhIGhhbmd1cCBoYXMgb2NjdXJyZWQuICBUaGUgcGF0aCBvZgorICogaGFuZ3VwIHByb2Nlc3NpbmcgaXM6CisgKgorICogCXNlcmlhbCBpbnRlcnJ1cHQgcm91dGluZSAtPiAoc2NoZWR1bGVyIHRxdWV1ZSkgLT4KKyAqIAlkb19zZXJpYWxfaGFuZ3VwKCkgLT4gdHR5LT5oYW5ndXAoKSAtPiBlc3BfaGFuZ3VwKCkKKyAqIAorICovCitzdGF0aWMgdm9pZCBkb19zZXJpYWxfaGFuZ3VwKHZvaWQgKnByaXZhdGVfKQoreworCXN0cnVjdCBlc3Bfc3RydWN0CSppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJCisJdHR5ID0gaW5mby0+dHR5OworCWlmICh0dHkpCisJCXR0eV9oYW5ndXAodHR5KTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG93IGxldmVsIHV0aWxpdHkgc3Vicm91dGluZXMgZm9yIHRoZSBzZXJpYWwgZHJpdmVyOiAgcm91dGluZXMgdG8KKyAqIGZpZ3VyZSBvdXQgdGhlIGFwcHJvcHJpYXRlIHRpbWVvdXQgZm9yIGFuIGludGVycnVwdCBjaGFpbiwgcm91dGluZXMKKyAqIHRvIGluaXRpYWxpemUgYW5kIHN0YXJ0dXAgYSBzZXJpYWwgcG9ydCwgYW5kIHJvdXRpbmVzIHRvIHNodXRkb3duIGEKKyAqIHNlcmlhbCBwb3J0LiAgVXNlZnVsIHN0dWZmIGxpa2UgdGhhdC4KKyAqCisgKiBDYWxsZXIgc2hvdWxkIGhvbGQgbG9jaworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGVzcF9iYXNpY19pbml0KHN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbykKK3sKKwkvKiBwdXQgRVNQQyBpbiBlbmhhbmNlZCBtb2RlICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX01PREUpOworCQorCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfTkVWRVJfRE1BKQorCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDEpOworCWVsc2UKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDMxKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmb3Igbm93ICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDApOworCisJLyogc2V0IGludGVycnVwdCBhbmQgRE1BIGNoYW5uZWwgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfSVJRKTsKKworCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfTkVWRVJfRE1BKQorCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDEpOworCWVsc2UKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAoZG1hIDw8IDQpIHwgMHgwMSk7CisKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRU5IX0lSUSk7CisKKwlpZiAoaW5mby0+bGluZSAlIDgpCS8qIHNlY29uZGFyeSBwb3J0ICovCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwZCk7CS8qIHNoYXJlZCAqLworCWVsc2UgaWYgKGluZm8tPmlycSA9PSA5KQorCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDIpOworCWVsc2UKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5pcnEpOworCisJLyogc2V0IGVycm9yIHN0YXR1cyBtYXNrIChjaGVjayB0aGlzKSAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9FUlJfTUFTSyk7CisKKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweGExKTsKKwllbHNlCisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhiZCk7CisKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDApOworCisJLyogc2V0IERNQSB0aW1lb3V0ICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0RNQV9UTU9VVCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweGZmKTsKKworCS8qIHNldCBGSUZPIHRyaWdnZXIgbGV2ZWxzICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1RSSUdHRVIpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnJ4X3RyaWdnZXIgPj4gOCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcucnhfdHJpZ2dlcik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcudHhfdHJpZ2dlciA+PiA4KTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy50eF90cmlnZ2VyKTsKKworCS8qIFNldCBjbG9jayBzY2FsaW5nIGFuZCB3YWl0IHN0YXRlcyAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9QUkVTQ0FMQVIpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwNCB8IEVTUENfU0NBTEUpOworCisJLyogc2V0IHJlaW50ZXJydXB0IHBhY2luZyAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9SRUlOVFIpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhmZik7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnR1cChzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQJcmV0dmFsPTA7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1fY2hhcnM7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQorCQlnb3RvIG91dDsKKworCWlmICghaW5mby0+eG1pdF9idWYpIHsKKwkJaW5mby0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJaWYgKCFpbmZvLT54bWl0X2J1ZikKKwkJCWdvdG8gb3V0OworCX0KKworI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJzdGFydGluZyB1cCB0dHlzJWQgKGlycSAlZCkuLi4iLCBpbmZvLT5saW5lLCBpbmZvLT5pcnEpOworI2VuZGlmCisKKwkvKiBGbHVzaCB0aGUgUlggYnVmZmVyLiAgVXNpbmcgdGhlIEVTSSBmbHVzaCBjb21tYW5kIG1heSBjYXVzZSAqLworCS8qIHdpbGQgaW50ZXJydXB0cywgc28gcmVhZCBhbGwgdGhlIGRhdGEgaW5zdGVhZC4gKi8KKworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9SWF9BVkFJTCk7CisJbnVtX2NoYXJzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OworCW51bV9jaGFycyB8PSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOworCisJd2hpbGUgKG51bV9jaGFycyA+IDEpIHsKKwkJaW53KGluZm8tPnBvcnQgKyBVQVJUX0VTSV9SWCk7CisJCW51bV9jaGFycyAtPSAyOworCX0KKworCWlmIChudW1fY2hhcnMpCisJCXNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9SWCk7CisKKwkvKiBzZXQgcmVjZWl2ZSBjaGFyYWN0ZXIgdGltZW91dCAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9SWF9USU1FT1VUKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5yeF90aW1lb3V0KTsKKworCS8qIGNsZWFyIGFsbCBmbGFncyBleGNlcHQgdGhlICJuZXZlciBETUEiIGZsYWcgKi8KKwlpbmZvLT5zdGF0X2ZsYWdzICY9IEVTUF9TVEFUX05FVkVSX0RNQTsKKworCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfTkVWRVJfRE1BKQorCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX1VTRV9QSU87CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBJUlEKKwkgKi8KKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGluZm8tPmlycSwgcnNfaW50ZXJydXB0X3NpbmdsZSwgU0FfU0hJUlEsCisJCQkgICAgICJlc3Agc2VyaWFsIiwgaW5mbyk7CisKKwlpZiAocmV0dmFsKSB7CisJCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCQlpZiAoaW5mby0+dHR5KQorCQkJCXNldF9iaXQoVFRZX0lPX0VSUk9SLAorCQkJCQkmaW5mby0+dHR5LT5mbGFncyk7CisJCQlyZXR2YWwgPSAwOworCQl9CisJCWdvdG8gb3V0X3VubG9ja2VkOworCX0KKworCWlmICghKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9VU0VfUElPKSAmJiAhZG1hX2J1ZmZlcikgeworCQlkbWFfYnVmZmVyID0gKGNoYXIgKilfX2dldF9kbWFfcGFnZXMoCisJCQlHRlBfS0VSTkVMLCBnZXRfb3JkZXIoRE1BX0JVRkZFUl9TWikpOworCisJCS8qIHVzZSBQSU8gbW9kZSBpZiBETUEgYnVmL2NoYW4gY2Fubm90IGJlIGFsbG9jYXRlZCAqLworCQlpZiAoIWRtYV9idWZmZXIpCisJCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX1VTRV9QSU87CisJCWVsc2UgaWYgKHJlcXVlc3RfZG1hKGRtYSwgImVzcCBzZXJpYWwiKSkgeworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylkbWFfYnVmZmVyLAorCQkJCSAgIGdldF9vcmRlcihETUFfQlVGRkVSX1NaKSk7CisJCQlkbWFfYnVmZmVyID0gTlVMTDsKKwkJCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfVVNFX1BJTzsKKwkJfQorCQkJCisJfQorCisJaW5mby0+TUNSID0gVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfT1VUMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5NQ1IpOworCQorCS8qCisJICogRmluYWxseSwgZW5hYmxlIGludGVycnVwdHMKKwkgKi8KKwkvKiBpbmZvLT5JRVIgPSBVQVJUX0lFUl9NU0kgfCBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJOyAqLworCWluZm8tPklFUiA9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREkgfCBVQVJUX0lFUl9ETUFfVE1PVVQgfAorCQkJVUFSVF9JRVJfRE1BX1RDOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOworCQorCWlmIChpbmZvLT50dHkpCisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIHR0eS0+YWx0X3NwZWVkIGtsdWRnZQorCSAqLworCWlmIChpbmZvLT50dHkpIHsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDU3NjAwOworCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfU0hJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSAyMzA0MDA7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDQ2MDgwMDsKKwl9CisJCisJLyoKKwkgKiBzZXQgdGhlIHNwZWVkIG9mIHRoZSBzZXJpYWwgcG9ydAorCSAqLworCWNoYW5nZV9zcGVlZChpbmZvKTsKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwlyZXR1cm4gMDsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK291dF91bmxvY2tlZDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIGFuZAorICogRFRSIGlzIGRyb3BwZWQgaWYgdGhlIGhhbmd1cCBvbiBjbG9zZSB0ZXJtaW8gZmxhZyBpcyBvbi4KKyAqLworc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3MsIGY7CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJcmV0dXJuOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KKwlwcmludGsoIlNodXR0aW5nIGRvd24gc2VyaWFsIHBvcnQgJWQgKGlycSAlZCkuLi4uIiwgaW5mby0+bGluZSwKKwkgICAgICAgaW5mby0+aXJxKTsKKyNlbmRpZgorCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBjbGVhciBkZWx0YV9tc3Jfd2FpdCBxdWV1ZSB0byBhdm9pZCBtZW0gbGVha3M6IHdlIG1heSBmcmVlIHRoZSBpcnEKKwkgKiBoZXJlIHNvIHRoZSBxdWV1ZSBtaWdodCBuZXZlciBiZSB3YWtlbiB1cAorCSAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+YnJlYWtfd2FpdCk7CisKKwkvKiBzdG9wIGEgRE1BIHRyYW5zZmVyIG9uIHRoZSBwb3J0IGJlaW5nIGNsb3NlZCAqLworCS8qIERNQSBsb2NrIGlzIGhpZ2hlciBwcmlvcml0eSBhbHdheXMgKi8KKwlpZiAoaW5mby0+c3RhdF9mbGFncyAmIChFU1BfU1RBVF9ETUFfUlggfCBFU1BfU1RBVF9ETUFfVFgpKSB7CisJCWY9Y2xhaW1fZG1hX2xvY2soKTsKKwkJZGlzYWJsZV9kbWEoZG1hKTsKKwkJY2xlYXJfZG1hX2ZmKGRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZik7CisJCQorCQlkbWFfYnl0ZXMgPSAwOworCX0KKwkKKwkvKgorCSAqIEZyZWUgdGhlIElSUQorCSAqLworCWZyZWVfaXJxKGluZm8tPmlycSwgaW5mbyk7CisKKwlpZiAoZG1hX2J1ZmZlcikgeworCQlzdHJ1Y3QgZXNwX3N0cnVjdCAqY3VycmVudF9wb3J0ID0gcG9ydHM7CisKKwkJd2hpbGUgKGN1cnJlbnRfcG9ydCkgeworCQkJaWYgKChjdXJyZW50X3BvcnQgIT0gaW5mbykgJiYKKwkJCSAgICAoY3VycmVudF9wb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJCQlicmVhazsKKworCQkJY3VycmVudF9wb3J0ID0gY3VycmVudF9wb3J0LT5uZXh0X3BvcnQ7CisJCX0KKworCQlpZiAoIWN1cnJlbnRfcG9ydCkgeworCQkJZnJlZV9kbWEoZG1hKTsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpZG1hX2J1ZmZlciwKKwkJCQkgICBnZXRfb3JkZXIoRE1BX0JVRkZFUl9TWikpOworCQkJZG1hX2J1ZmZlciA9IE5VTEw7CisJCX0JCQorCX0KKworCWlmIChpbmZvLT54bWl0X2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluZm8tPnhtaXRfYnVmKTsKKwkJaW5mby0+eG1pdF9idWYgPSBOVUxMOworCX0KKworCWluZm8tPklFUiA9IDA7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDApOworCisJaWYgKCFpbmZvLT50dHkgfHwgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSkKKwkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSfFVBUlRfTUNSX1JUUyk7CisKKwlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX09VVDI7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5NQ1IpOworCisJaWYgKGluZm8tPnR0eSkKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwkKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIFVBUlQgZGl2aXNvciByZWdpc3RlcnMgdG8gbWF0Y2gKKyAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgorICovCitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8pCit7CisJdW5zaWduZWQgc2hvcnQgcG9ydDsKKwlpbnQJcXVvdCA9IDA7CisJdW5zaWduZWQgY2ZsYWcsY3ZhbDsKKwlpbnQJYmF1ZCwgYml0czsKKwl1bnNpZ25lZCBjaGFyIGZsb3cxID0gMCwgZmxvdzIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJcG9ydCA9IGluZm8tPnBvcnQ7CisJCisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwkgICAgICBjYXNlIENTNTogY3ZhbCA9IDB4MDA7IGJpdHMgPSA3OyBicmVhazsKKwkgICAgICBjYXNlIENTNjogY3ZhbCA9IDB4MDE7IGJpdHMgPSA4OyBicmVhazsKKwkgICAgICBjYXNlIENTNzogY3ZhbCA9IDB4MDI7IGJpdHMgPSA5OyBicmVhazsKKwkgICAgICBjYXNlIENTODogY3ZhbCA9IDB4MDM7IGJpdHMgPSAxMDsgYnJlYWs7CisJICAgICAgZGVmYXVsdDogIGN2YWwgPSAweDAwOyBiaXRzID0gNzsgYnJlYWs7CisJfQorCWlmIChjZmxhZyAmIENTVE9QQikgeworCQljdmFsIHw9IDB4MDQ7CisJCWJpdHMrKzsKKwl9CisJaWYgKGNmbGFnICYgUEFSRU5CKSB7CisJCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOworCQliaXRzKys7CisJfQorCWlmICghKGNmbGFnICYgUEFST0REKSkKKwkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOworI2lmZGVmIENNU1BBUgorCWlmIChjZmxhZyAmIENNU1BBUikKKwkJY3ZhbCB8PSBVQVJUX0xDUl9TUEFSOworI2VuZGlmCisKKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwlpZiAoYmF1ZCA9PSAzODQwMCAmJgorCSAgICAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSkKKwkJcXVvdCA9IGluZm8tPmN1c3RvbV9kaXZpc29yOworCWVsc2UgeworCQlpZiAoYmF1ZCA9PSAxMzQpCisJCQkvKiBTcGVjaWFsIGNhc2Ugc2luY2UgMTM0IGlzIHJlYWxseSAxMzQuNSAqLworCQkJcXVvdCA9ICgyKkJBU0VfQkFVRCAvIDI2OSk7CisJCWVsc2UgaWYgKGJhdWQpCisJCQlxdW90ID0gQkFTRV9CQVVEIC8gYmF1ZDsKKwl9CisJLyogSWYgdGhlIHF1b3RpZW50IGlzIGV2ZXIgemVybywgZGVmYXVsdCB0byA5NjAwIGJwcyAqLworCWlmICghcXVvdCkKKwkJcXVvdCA9IEJBU0VfQkFVRCAvIDk2MDA7CisJCisJaW5mby0+dGltZW91dCA9ICgoMTAyNCAqIEhaICogYml0cyAqIHF1b3QpIC8gQkFTRV9CQVVEKSArIChIWiAvIDUwKTsKKworCS8qIENUUyBmbG93IGNvbnRyb2wgZmxhZyBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgKi8KKwkvKiBpbmZvLT5JRVIgJj0gflVBUlRfSUVSX01TSTsgKi8KKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCQkvKiBpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOyAqLworCQlmbG93MSA9IDB4MDQ7CisJCWZsb3cyID0gMHgxMDsKKwl9IGVsc2UKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOworCWlmIChjZmxhZyAmIENMT0NBTCkKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCWVsc2UgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKwkJLyogaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsgKi8KKwl9CisKKwkvKgorCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZworCSAqLworI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCisKKwlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9USFJFIHwgVUFSVF9MU1JfRFI7CisJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOworCWlmIChJX0JSS0lOVChpbmZvLT50dHkpIHx8IElfUEFSTVJLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CisJCisJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKKyNpZiAwCisJLyogVGhpcyBzaG91bGQgYmUgc2FmZSwgYnV0IGZvciBzb21lIGJyb2tlbiBiaXRzIG9mIGhhcmR3YXJlLi4uICovCisJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7CisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfUEUgfCBVQVJUX0xTUl9GRTsKKwl9CisjZW5kaWYKKwlpZiAoSV9JR05CUksoaW5mby0+dHR5KSkgeworCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CisJCS8qCisJCSAqIElmIHdlJ3JlIGlnbm9yZSBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsIGlnbm9yZSAKKwkJICogb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KKwkJICovCisJCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKSB7CisJCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfT0UgfCBcCisJCQkJVUFSVF9MU1JfUEUgfCBVQVJUX0xTUl9GRTsKKwkJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfT0UgfCBcCisJCQkJVUFSVF9MU1JfUEUgfCBVQVJUX0xTUl9GRTsKKwkJfQorCX0KKworCWlmIChJX0lYT0ZGKGluZm8tPnR0eSkpCisJCWZsb3cxIHw9IDB4ODE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCS8qIHNldCBiYXVkICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0JBVUQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgcXVvdCA+PiA4KTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIHF1b3QgJiAweGZmKTsKKworCS8qIHNldCBkYXRhIGJpdHMsIHBhcml0eSwgZXRjLiAqLworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9MQ1IpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgY3ZhbCk7CisKKwkvKiBFbmFibGUgZmxvdyBjb250cm9sICovCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0ZMT1dfQ05UTCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBmbG93MSk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBmbG93Mik7CisKKwkvKiBzZXQgZmxvdyBjb250cm9sIGNoYXJhY3RlcnMgKFhPTi9YT0ZGIG9ubHkpICovCisJaWYgKElfSVhPRkYoaW5mby0+dHR5KSkgeworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRkxPV19DSEFSUyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgU1RBUlRfQ0hBUihpbmZvLT50dHkpKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBTVE9QX0NIQVIoaW5mby0+dHR5KSk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgxMCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgyMSk7CisJCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCQkJY2FzZSBDUzU6CisJCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDFmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1M2OgorCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgzZik7CisJCQkJYnJlYWs7CisJCQljYXNlIENTNzoKKwkJCWNhc2UgQ1M4OgorCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHg3Zik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhmZik7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBTZXQgaGlnaC9sb3cgd2F0ZXIgKi8KKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRkxPV19MVkwpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLmZsb3dfb2ZmID4+IDgpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLmZsb3dfb2ZmKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5mbG93X29uID4+IDgpOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLmZsb3dfb24pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByc19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19wdXRfY2hhciIpKQorCQlyZXR1cm47CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPnhtaXRfY250IDwgRVNQX1hNSVRfU0laRSAtIDEpIHsKKwkJaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7CisJCWluZm8tPnhtaXRfaGVhZCAmPSBFU1BfWE1JVF9TSVpFLTE7CisJCWluZm8tPnhtaXRfY250Kys7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2ZsdXNoX2NoYXJzIikpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgIWluZm8tPnhtaXRfYnVmKQorCQlnb3RvIG91dDsKKworCWlmICghKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CisJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCByc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludAljLCB0LCByZXQgPSAwOworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc193cml0ZSIpKQorCQlyZXR1cm4gMDsKKworCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZiB8fCAhdG1wX2J1ZikKKwkJcmV0dXJuIDA7CisJICAgIAorCXdoaWxlICgxKSB7CisJCS8qIFRoYW5rcyB0byBSLiBXb2xmZiBmb3Igc3VnZ2VzdGluZyBob3cgdG8gZG8gdGhpcyB3aXRoICovCisJCS8qIGludGVycnVwdHMgZW5hYmxlZCAqLworCisJCWMgPSBjb3VudDsKKwkJdCA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDE7CisJCQorCQlpZiAodCA8IGMpCisJCQljID0gdDsKKworCQl0ID0gRVNQX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfaGVhZDsKKwkJCisJCWlmICh0IDwgYykKKwkJCWMgPSB0OworCisJCWlmIChjIDw9IDApCisJCQlicmVhazsKKworCQltZW1jcHkoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X2hlYWQsIGJ1ZiwgYyk7CisKKwkJaW5mby0+eG1pdF9oZWFkID0gKGluZm8tPnhtaXRfaGVhZCArIGMpICYgKEVTUF9YTUlUX1NJWkUtMSk7CisJCWluZm8tPnhtaXRfY250ICs9IGM7CisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQlyZXQgKz0gYzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJaWYgKGluZm8tPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIShpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJzX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50CXJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd3JpdGVfcm9vbSIpKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlyZXQgPSBFU1BfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJzX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkJCQkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2NoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHJzX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfZmx1c2hfYnVmZmVyIikpCisJCXJldHVybjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByc190aHJvdHRsZSgpCisgKiAKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHVwcGVyLWxheWVyIHR0eSBsYXllciB0byBzaWduYWwgdGhhdAorICogaW5jb21pbmcgY2hhcmFjdGVycyBzaG91bGQgYmUgdGhyb3R0bGVkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyB2b2lkIHJzX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQorCWNoYXIJYnVmWzY0XTsKKwkKKwlwcmludGsoInRocm90dGxlICVzOiAlZC4uLi5cbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSwKKwkgICAgICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7CisjZW5kaWYKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfdGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1JESTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUlhfVElNRU9VVCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJzX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCisJY2hhcglidWZbNjRdOworCQorCXByaW50aygidW50aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3VudGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1JESTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUlhfVElNRU9VVCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcucnhfdGltZW91dCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByc19pb2N0bCgpIGFuZCBmcmllbmRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50IGdldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8sCisJCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworICAKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCXRtcC50eXBlID0gUE9SVF8xNjU1MEE7CisJdG1wLmxpbmUgPSBpbmZvLT5saW5lOworCXRtcC5wb3J0ID0gaW5mby0+cG9ydDsKKwl0bXAuaXJxID0gaW5mby0+aXJxOworCXRtcC5mbGFncyA9IGluZm8tPmZsYWdzOworCXRtcC54bWl0X2ZpZm9fc2l6ZSA9IDEwMjQ7CisJdG1wLmJhdWRfYmFzZSA9IEJBU0VfQkFVRDsKKwl0bXAuY2xvc2VfZGVsYXkgPSBpbmZvLT5jbG9zZV9kZWxheTsKKwl0bXAuY2xvc2luZ193YWl0ID0gaW5mby0+Y2xvc2luZ193YWl0OworCXRtcC5jdXN0b21fZGl2aXNvciA9IGluZm8tPmN1c3RvbV9kaXZpc29yOworCXRtcC5odWI2ID0gMDsKKwlpZiAoY29weV90b191c2VyKHJldGluZm8sJnRtcCxzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2VzcF9jb25maWcoc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvLAorCQkJICBzdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IGhheWVzX2VzcF9jb25maWcgdG1wOworICAKKwlpZiAoIXJldGluZm8pCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAucnhfdGltZW91dCA9IGluZm8tPmNvbmZpZy5yeF90aW1lb3V0OworCXRtcC5yeF90cmlnZ2VyID0gaW5mby0+Y29uZmlnLnJ4X3RyaWdnZXI7CisJdG1wLnR4X3RyaWdnZXIgPSBpbmZvLT5jb25maWcudHhfdHJpZ2dlcjsKKwl0bXAuZmxvd19vZmYgPSBpbmZvLT5jb25maWcuZmxvd19vZmY7CisJdG1wLmZsb3dfb24gPSBpbmZvLT5jb25maWcuZmxvd19vbjsKKwl0bXAucGlvX3RocmVzaG9sZCA9IGluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkOworCXRtcC5kbWFfY2hhbm5lbCA9IChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfTkVWRVJfRE1BID8gMCA6IGRtYSk7CisKKwlyZXR1cm4gY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbywKKwkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3X2luZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKKwlzdHJ1Y3QgZXNwX3N0cnVjdCBvbGRfaW5mbzsKKwl1bnNpZ25lZCBpbnQgY2hhbmdlX2lycTsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqY3VycmVudF9hc3luYzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCxuZXdfaW5mbyxzaXplb2YobmV3X3NlcmlhbCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlvbGRfaW5mbyA9ICppbmZvOworCisJaWYgKChuZXdfc2VyaWFsLnR5cGUgIT0gUE9SVF8xNjU1MEEpIHx8CisJICAgIChuZXdfc2VyaWFsLmh1YjYpIHx8CisJICAgIChpbmZvLT5wb3J0ICE9IG5ld19zZXJpYWwucG9ydCkgfHwKKwkgICAgKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IEJBU0VfQkFVRCkgfHwKKwkgICAgKG5ld19zZXJpYWwuaXJxID4gMTUpIHx8CisJICAgIChuZXdfc2VyaWFsLmlycSA8IDIpIHx8CisJICAgIChuZXdfc2VyaWFsLmlycSA9PSA2KSB8fAorCSAgICAobmV3X3NlcmlhbC5pcnEgPT0gOCkgfHwKKwkgICAgKG5ld19zZXJpYWwuaXJxID09IDEzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljaGFuZ2VfaXJxID0gbmV3X3NlcmlhbC5pcnEgIT0gaW5mby0+aXJxOworCisJaWYgKGNoYW5nZV9pcnEgJiYgKGluZm8tPmxpbmUgJSA4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKGNoYW5nZV9pcnEgfHwgCisJCSAgICAobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwKKwkJICAgICgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOworCX0gZWxzZSB7CisJCWlmIChuZXdfc2VyaWFsLmlycSA9PSAyKQorCQkJbmV3X3NlcmlhbC5pcnEgPSA5OworCisJCWlmIChjaGFuZ2VfaXJxKSB7CisJCQljdXJyZW50X2FzeW5jID0gcG9ydHM7CisKKwkJCXdoaWxlIChjdXJyZW50X2FzeW5jKSB7CisJCQkJaWYgKChjdXJyZW50X2FzeW5jLT5saW5lID49IGluZm8tPmxpbmUpICYmCisJCQkJICAgIChjdXJyZW50X2FzeW5jLT5saW5lIDwgKGluZm8tPmxpbmUgKyA4KSkpIHsKKwkJCQkJaWYgKGN1cnJlbnRfYXN5bmMgPT0gaW5mbykgeworCQkJCQkJaWYgKGN1cnJlbnRfYXN5bmMtPmNvdW50ID4gMSkKKwkJCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRfYXN5bmMtPmNvdW50KQorCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisKKwkJCQljdXJyZW50X2FzeW5jID0gY3VycmVudF9hc3luYy0+bmV4dF9wb3J0OworCQkJfQorCQl9CisKKwkJLyoKKwkJICogT0ssIHBhc3QgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkb25lLgorCQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCisJCSAqLworCisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAorCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKKwkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOworCQlpbmZvLT5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiBIWi8xMDA7CisJCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFovMTAwOworCisJCWlmIChjaGFuZ2VfaXJxKSB7CisJCQkvKgorCQkJICogV2UgbmVlZCB0byBzaHV0ZG93biB0aGUgc2VyaWFsIHBvcnQgYXQgdGhlIG9sZAorCQkJICogcG9ydC9pcnEgY29tYmluYXRpb24uCisJCQkgKi8KKwkJCXNodXRkb3duKGluZm8pOworCisJCQljdXJyZW50X2FzeW5jID0gcG9ydHM7CisKKwkJCXdoaWxlIChjdXJyZW50X2FzeW5jKSB7CisJCQkJaWYgKChjdXJyZW50X2FzeW5jLT5saW5lID49IGluZm8tPmxpbmUpICYmCisJCQkJICAgIChjdXJyZW50X2FzeW5jLT5saW5lIDwgKGluZm8tPmxpbmUgKyA4KSkpCisJCQkJCWN1cnJlbnRfYXN5bmMtPmlycSA9IG5ld19zZXJpYWwuaXJxOworCisJCQkJY3VycmVudF9hc3luYyA9IGN1cnJlbnRfYXN5bmMtPm5leHRfcG9ydDsKKwkJCX0KKworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0VOSF9JUlEpOworCQkJaWYgKGluZm8tPmlycSA9PSA5KQorCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMik7CisJCQllbHNlCisJCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5pcnEpOworCQl9CisJfQorCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJaWYgKCgob2xkX2luZm8uZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0KKwkJICAgICAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHx8CisJCSAgICAob2xkX2luZm8uY3VzdG9tX2Rpdmlzb3IgIT0gaW5mby0+Y3VzdG9tX2Rpdmlzb3IpKSB7CisJCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDU3NjAwOworCQkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOworCQkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfU0hJKQorCQkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOworCQkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKKwkJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDQ2MDgwMDsKKwkJCWNoYW5nZV9zcGVlZChpbmZvKTsKKwkJfQorCX0gZWxzZQorCQlyZXR2YWwgPSBzdGFydHVwKGluZm8pOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBzZXRfZXNwX2NvbmZpZyhzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8sCisJCQkgIHN0cnVjdCBoYXllc19lc3BfY29uZmlnIF9fdXNlciAqIG5ld19pbmZvKQoreworCXN0cnVjdCBoYXllc19lc3BfY29uZmlnIG5ld19jb25maWc7CisJdW5zaWduZWQgaW50IGNoYW5nZV9kbWE7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmN1cnJlbnRfYXN5bmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFBlcmhhcHMgYSBub24tc3lzYWRtaW4gdXNlciBzaG91bGQgYmUgYWJsZSB0byBkbyBzb21lIG9mIHRoZXNlICovCisJLyogb3BlcmF0aW9ucy4gIEkgaGF2ZW4ndCBkZWNpZGVkIHlldC4gKi8KKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2NvbmZpZywgbmV3X2luZm8sIHNpemVvZihuZXdfY29uZmlnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChuZXdfY29uZmlnLmZsb3dfb24gPj0gbmV3X2NvbmZpZy5mbG93X29mZikgfHwKKwkgICAgKG5ld19jb25maWcucnhfdHJpZ2dlciA8IDEpIHx8CisJICAgIChuZXdfY29uZmlnLnR4X3RyaWdnZXIgPCAxKSB8fAorCSAgICAobmV3X2NvbmZpZy5mbG93X29mZiA8IDEpIHx8CisJICAgIChuZXdfY29uZmlnLmZsb3dfb24gPCAxKSB8fAorCSAgICAobmV3X2NvbmZpZy5yeF90cmlnZ2VyID4gMTAyMykgfHwKKwkgICAgKG5ld19jb25maWcudHhfdHJpZ2dlciA+IDEwMjMpIHx8CisJICAgIChuZXdfY29uZmlnLmZsb3dfb2ZmID4gMTAyMykgfHwKKwkgICAgKG5ld19jb25maWcuZmxvd19vbiA+IDEwMjMpIHx8CisJICAgIChuZXdfY29uZmlnLnBpb190aHJlc2hvbGQgPCAwKSB8fAorCSAgICAobmV3X2NvbmZpZy5waW9fdGhyZXNob2xkID4gMTAyNCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChuZXdfY29uZmlnLmRtYV9jaGFubmVsICE9IDEpICYmIChuZXdfY29uZmlnLmRtYV9jaGFubmVsICE9IDMpKQorCQluZXdfY29uZmlnLmRtYV9jaGFubmVsID0gMDsKKworCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfTkVWRVJfRE1BKQorCQljaGFuZ2VfZG1hID0gbmV3X2NvbmZpZy5kbWFfY2hhbm5lbDsKKwllbHNlCisJCWNoYW5nZV9kbWEgPSAobmV3X2NvbmZpZy5kbWFfY2hhbm5lbCAhPSBkbWEpOworCisJaWYgKGNoYW5nZV9kbWEpIHsKKwkJaWYgKG5ld19jb25maWcuZG1hX2NoYW5uZWwpIHsKKwkJCS8qIFBJTyBtb2RlIHRvIERNQSBtb2RlIHRyYW5zaXRpb24gT1IgKi8KKwkJCS8qIGNoYW5nZSBjdXJyZW50IERNQSBjaGFubmVsICovCisJCQkKKwkJCWN1cnJlbnRfYXN5bmMgPSBwb3J0czsKKworCQkJd2hpbGUgKGN1cnJlbnRfYXN5bmMpIHsKKwkJCQlpZiAoY3VycmVudF9hc3luYyA9PSBpbmZvKSB7CisJCQkJCWlmIChjdXJyZW50X2FzeW5jLT5jb3VudCA+IDEpCisJCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCX0gZWxzZSBpZiAoY3VycmVudF9hc3luYy0+Y291bnQpCisJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJCQorCQkJCWN1cnJlbnRfYXN5bmMgPQorCQkJCQljdXJyZW50X2FzeW5jLT5uZXh0X3BvcnQ7CisJCQl9CisKKwkJCXNodXRkb3duKGluZm8pOworCQkJZG1hID0gbmV3X2NvbmZpZy5kbWFfY2hhbm5lbDsKKwkJCWluZm8tPnN0YXRfZmxhZ3MgJj0gfkVTUF9TVEFUX05FVkVSX0RNQTsKKwkJCQorICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsIHBvcnRzIG11c3QgdXNlIHRoZSBzYW1lIERNQSBjaGFubmVsICovCisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQljdXJyZW50X2FzeW5jID0gcG9ydHM7CisKKwkJCXdoaWxlIChjdXJyZW50X2FzeW5jKSB7CisJCQkJZXNwX2Jhc2ljX2luaXQoY3VycmVudF9hc3luYyk7CisJCQkJY3VycmVudF9hc3luYyA9IGN1cnJlbnRfYXN5bmMtPm5leHRfcG9ydDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERNQSBtb2RlIHRvIFBJTyBtb2RlIG9ubHkgKi8KKwkJCQorCQkJaWYgKGluZm8tPmNvdW50ID4gMSkKKwkJCQlyZXR1cm4gLUVCVVNZOworCisJCQlzaHV0ZG93bihpbmZvKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX05FVkVSX0RNQTsKKwkJCWVzcF9iYXNpY19pbml0KGluZm8pOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQl9CisJfQorCisJaW5mby0+Y29uZmlnLnBpb190aHJlc2hvbGQgPSBuZXdfY29uZmlnLnBpb190aHJlc2hvbGQ7CisKKwlpZiAoKG5ld19jb25maWcuZmxvd19vZmYgIT0gaW5mby0+Y29uZmlnLmZsb3dfb2ZmKSB8fAorCSAgICAobmV3X2NvbmZpZy5mbG93X29uICE9IGluZm8tPmNvbmZpZy5mbG93X29uKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWluZm8tPmNvbmZpZy5mbG93X29mZiA9IG5ld19jb25maWcuZmxvd19vZmY7CisJCWluZm8tPmNvbmZpZy5mbG93X29uID0gbmV3X2NvbmZpZy5mbG93X29uOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9GTE9XX0xWTCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5mbG93X29mZiA+PiA4KTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBuZXdfY29uZmlnLmZsb3dfb2ZmKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBuZXdfY29uZmlnLmZsb3dfb24gPj4gOCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5mbG93X29uKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCX0KKworCWlmICgobmV3X2NvbmZpZy5yeF90cmlnZ2VyICE9IGluZm8tPmNvbmZpZy5yeF90cmlnZ2VyKSB8fAorCSAgICAobmV3X2NvbmZpZy50eF90cmlnZ2VyICE9IGluZm8tPmNvbmZpZy50eF90cmlnZ2VyKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWluZm8tPmNvbmZpZy5yeF90cmlnZ2VyID0gbmV3X2NvbmZpZy5yeF90cmlnZ2VyOworCQlpbmZvLT5jb25maWcudHhfdHJpZ2dlciA9IG5ld19jb25maWcudHhfdHJpZ2dlcjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1RSSUdHRVIpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsCisJCQkgICBuZXdfY29uZmlnLnJ4X3RyaWdnZXIgPj4gOCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5yeF90cmlnZ2VyKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAorCQkJICAgbmV3X2NvbmZpZy50eF90cmlnZ2VyID4+IDgpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcudHhfdHJpZ2dlcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAobmV3X2NvbmZpZy5yeF90aW1lb3V0ICE9IGluZm8tPmNvbmZpZy5yeF90aW1lb3V0KSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJaW5mby0+Y29uZmlnLnJ4X3RpbWVvdXQgPSBuZXdfY29uZmlnLnJ4X3RpbWVvdXQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGluZm8tPklFUiAmIFVBUlRfSUVSX1JESSkgeworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLAorCQkJCSAgIEVTSV9TRVRfUlhfVElNRU9VVCk7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsCisJCQkJICAgbmV3X2NvbmZpZy5yeF90aW1lb3V0KTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBnZXRfbHNyX2luZm8gLSBnZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgaW5mbworICoKKyAqIFB1cnBvc2U6IExldCB1c2VyIGNhbGwgaW9jdGwoKSB0byBnZXQgaW5mbyB3aGVuIHRoZSBVQVJUIHBoeXNpY2FsbHkKKyAqIAkgICAgaXMgZW1wdGllZC4gIE9uIGJ1cyB0eXBlcyBsaWtlIFJTNDg1LCB0aGUgdHJhbnNtaXR0ZXIgbXVzdAorICogCSAgICByZWxlYXNlIHRoZSBidXMgYWZ0ZXIgdHJhbnNtaXR0aW5nLiBUaGlzIG11c3QgYmUgZG9uZSB3aGVuCisgKiAJICAgIHRoZSB0cmFuc21pdCBzaGlmdCByZWdpc3RlciBpcyBlbXB0eSwgbm90IGJlIGRvbmUgd2hlbiB0aGUKKyAqIAkgICAgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBpcyBlbXB0eS4gIFRoaXMgZnVuY3Rpb25hbGl0eQorICogCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4gCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2xzcl9pbmZvKHN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbywgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVUFSVF9TVEFUKTsKKwlzdGF0dXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSAoKHN0YXR1cyAmIFVBUlRfTFNSX1RFTVQpID8gVElPQ1NFUl9URU1UIDogMCk7CisJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCx2YWx1ZSk7Cit9CisKKworc3RhdGljIGludCBlc3BfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGNvbnRyb2wsIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJCXJldHVybiAtRU5PREVWOworCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJcmV0dXJuIC1FSU87CisKKwljb250cm9sID0gaW5mby0+TUNSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVUFSVF9TVEFUKTsKKwlzdGF0dXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAgICAoKGNvbnRyb2wgJiBVQVJUX01DUl9SVFMpID8gVElPQ01fUlRTIDogMCkKKwkJfCAoKGNvbnRyb2wgJiBVQVJUX01DUl9EVFIpID8gVElPQ01fRFRSIDogMCkKKwkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9EQ0QpID8gVElPQ01fQ0FSIDogMCkKKwkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9SSSkgPyBUSU9DTV9STkcgOiAwKQorCQl8ICgoc3RhdHVzICAmIFVBUlRfTVNSX0RTUikgPyBUSU9DTV9EU1IgOiAwKQorCQl8ICgoc3RhdHVzICAmIFVBUlRfTVNSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKK30KKworc3RhdGljIGludCBlc3BfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJCXJldHVybiAtRU5PREVWOworCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfRFRSOworCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfRFRSOworCisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5NQ1IpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogcnNfYnJlYWsoKSAtLS0gcm91dGluZSB3aGljaCB0dXJucyB0aGUgYnJlYWsgaGFuZGxpbmcgb24gb3Igb2ZmCisgKi8KK3N0YXRpYyB2b2lkIGVzcF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiZXNwX2JyZWFrIikpCisJCXJldHVybjsKKworCWlmIChicmVha19zdGF0ZSA9PSAtMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9JU1NVRV9CUkVBSyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCQkvKiBGSVhNRSAtIG5ldyBzdHlsZSB3YWl0IG5lZWRlZCBoZXJlICovCisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmJyZWFrX3dhaXQpOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0lTU1VFX0JSRUFLKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIGludCByc19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXYsIGNub3c7CS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCisJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICpwX2N1c2VyOwkvKiB1c2VyIHNwYWNlICovCisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DU1NFUklBTCkgJiYKKwkgICAgKGNtZCAhPSBUSU9DU0VSQ09ORklHKSAmJiAoY21kICE9IFRJT0NTRVJHV0lMRCkgICYmCisJICAgIChjbWQgIT0gVElPQ1NFUlNXSUxEKSAmJiAoY21kICE9IFRJT0NTRVJHU1RSVUNUKSAmJgorCSAgICAoY21kICE9IFRJT0NNSVdBSVQpICYmIChjbWQgIT0gVElPQ0dJQ09VTlQpICYmCisJICAgIChjbWQgIT0gVElPQ0dIQVlFU0VTUCkgJiYgKGNtZCAhPSBUSU9DU0hBWUVTRVNQKSkgeworCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCSAgICByZXR1cm4gLUVJTzsKKwl9CisJCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBUSU9DR1NFUklBTDoKKwkJCXJldHVybiBnZXRfc2VyaWFsX2luZm8oaW5mbywgYXJncCk7CisJCWNhc2UgVElPQ1NTRVJJQUw6CisJCQlyZXR1cm4gc2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOworCQljYXNlIFRJT0NTRVJDT05GSUc6CisJCQkvKiBkbyBub3QgcmVjb25maWd1cmUgYWZ0ZXIgaW5pdGlhbCBjb25maWd1cmF0aW9uICovCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJT0NTRVJHV0lMRDoKKwkJCXJldHVybiBwdXRfdXNlcigwTCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7CisKKwkJY2FzZSBUSU9DU0VSR0VUTFNSOiAvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkJCSAgICByZXR1cm4gZ2V0X2xzcl9pbmZvKGluZm8sIGFyZ3ApOworCisJCWNhc2UgVElPQ1NFUlNXSUxEOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKiBXYWl0IGZvciBhbnkgb2YgdGhlIDQgbW9kZW0gaW5wdXRzIChEQ0QsUkksRFNSLENUUykgdG8gY2hhbmdlCisJCSAqIC0gbWFzayBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdAorIAkJICogICAodXNlIHwnZWQgVElPQ01fUk5HL0RTUi9DRC9DVFMgZm9yIG1hc2tpbmcpCisJCSAqIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCisJCSAqLworCQkgY2FzZSBUSU9DTUlXQUlUOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJCWNwcmV2ID0gaW5mby0+aWNvdW50OwkvKiBub3RlIHRoZSBjb3VudGVycyBvbiBlbnRyeSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQkJd2hpbGUgKDEpIHsKKwkJCQkvKiBGSVhNRTogY29udmVydCB0byBuZXcgc3R5bGUgd2FrZXVwICovCisJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCQkJCS8qIHNlZSBpZiBhIHNpZ25hbCBkaWQgaXQgKi8KKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJCQljbm93ID0gaW5mby0+aWNvdW50OwkvKiBhdG9taWMgY29weSAqLworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAoY25vdy5ybmcgPT0gY3ByZXYucm5nICYmCisJCQkJICAgIGNub3cuZHNyID09IGNwcmV2LmRzciAmJiAKKwkJCQkgICAgY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmCisJCQkJICAgIGNub3cuY3RzID09IGNwcmV2LmN0cykKKwkJCQkJcmV0dXJuIC1FSU87IC8qIG5vIGNoYW5nZSA9PiBlcnJvciAqLworCQkJCWlmICgoKGFyZyAmIFRJT0NNX1JORykgJiYKKwkJCQkgICAgIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAorCQkJCSAgICAgKChhcmcgJiBUSU9DTV9EU1IpICYmCisJCQkJICAgICAgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8CisJCQkJICAgICAoKGFyZyAmIFRJT0NNX0NEKSAmJgorCQkJCSAgICAgIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fAorCQkJCSAgICAgKChhcmcgJiBUSU9DTV9DVFMpICYmCisJCQkJICAgICAgKGNub3cuY3RzICE9IGNwcmV2LmN0cykpICkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJY3ByZXYgPSBjbm93OworCQkJfQorCQkJLyogTk9UUkVBQ0hFRCAqLworCisJCS8qIAorCQkgKiBHZXQgY291bnRlciBvZiBpbnB1dCBzZXJpYWwgbGluZSBpbnRlcnJ1cHRzIChEQ0QsUkksRFNSLENUUykKKwkJICogUmV0dXJuOiB3cml0ZSBjb3VudGVycyB0byB0aGUgdXNlciBwYXNzZWQgY291bnRlciBzdHJ1Y3QKKwkJICogTkI6IGJvdGggMS0+MCBhbmQgMC0+MSB0cmFuc2l0aW9ucyBhcmUgY291bnRlZCBleGNlcHQgZm9yCisJCSAqICAgICBSSSB3aGVyZSBvbmx5IDAtPjEgaXMgY291bnRlZC4KKwkJICovCisJCWNhc2UgVElPQ0dJQ09VTlQ6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQkJY25vdyA9IGluZm8tPmljb3VudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJCXBfY3VzZXIgPSBhcmdwOworCQkJaWYgKHB1dF91c2VyKGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKSB8fAorCQkJICAgIHB1dF91c2VyKGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKSB8fAorCQkJICAgIHB1dF91c2VyKGNub3cucm5nLCAmcF9jdXNlci0+cm5nKSB8fAorCQkJICAgIHB1dF91c2VyKGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0dXJuIDA7CisJY2FzZSBUSU9DR0hBWUVTRVNQOgorCQlyZXR1cm4gZ2V0X2VzcF9jb25maWcoaW5mbywgYXJncCk7CisJY2FzZSBUSU9DU0hBWUVTRVNQOgorCQlyZXR1cm4gc2V0X2VzcF9jb25maWcoaW5mbywgYXJncCk7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCisJICAgICYmICggICBSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpIAorCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQorCQlyZXR1cm47CisKKwljaGFuZ2Vfc3BlZWQoaW5mbyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQlpbmZvLT5NQ1IgJj0gfihVQVJUX01DUl9EVFJ8VUFSVF9NQ1JfUlRTKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPk1DUik7CisJfQorCisJLyogSGFuZGxlIHRyYW5zaXRpb24gYXdheSBmcm9tIEIwIHN0YXR1cyAqLworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmCisJCSh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKKwkJaW5mby0+TUNSIHw9IChVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwkvKiBIYW5kbGUgdHVybmluZyBvZiBDUlRTQ1RTICovCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJcnNfc3RhcnQodHR5KTsKKwl9Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJzX2Nsb3NlKCkKKyAqIAorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBzZXJpYWwgcG9ydCBnZXRzIGNsb3NlZC4gIEZpcnN0LCB3ZQorICogd2FpdCBmb3IgdGhlIGxhc3QgcmVtYWluaW5nIGRhdGEgdG8gYmUgc2VudC4gIFRoZW4sIHdlIHVubGluayBpdHMKKyAqIGFzeW5jIHN0cnVjdHVyZSBmcm9tIHRoZSBpbnRlcnJ1cHQgY2hhaW4gaWYgbmVjZXNzYXJ5LCBhbmQgd2UgZnJlZQorICogdGhhdCBJUlEgaWYgbm90aGluZyBpcyBsZWZ0IGluIHRoZSBjaGFpbi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpbmZvIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19jbG9zZSIpKQorCQlyZXR1cm47CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlEQkdfQ05UKCJiZWZvcmUgREVDLWh1bmciKTsKKwkJZ290byBvdXQ7CisJfQorCQorI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCisJcHJpbnRrKCJyc19jbG9zZSB0dHlzJWQsIGNvdW50ID0gJWRcbiIsIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoaW5mby0+Y291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBJbmZvLT5jb3VudCBzaG91bGQgYWx3YXlzCisJCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KKwkJICogb25lLCB3ZSd2ZSBnb3QgcmVhbCBwcm9ibGVtcywgc2luY2UgaXQgbWVhbnMgdGhlCisJCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgorCQkgKi8KKwkJcHJpbnRrKCJyc19jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKKwkJICAgICAgICJpbmZvLT5jb3VudCBpcyAlZFxuIiwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDE7CisJfQorCWlmICgtLWluZm8tPmNvdW50IDwgMCkgeworCQlwcmludGsoInJzX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQgZm9yIHR0eXMlZDogJWRcbiIsCisJCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisJCWluZm8tPmNvdW50ID0gMDsKKwl9CisJaWYgKGluZm8tPmNvdW50KSB7CisJCURCR19DTlQoImJlZm9yZSBERUMtMiIpOworCQlnb3RvIG91dDsKKwl9CisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkvKgorCSAqIE5vdyB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXQgYnVmZmVyIHRvIGNsZWFyOyBhbmQgd2Ugbm90aWZ5IAorCSAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKwlpZiAoaW5mby0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+Y2xvc2luZ193YWl0KTsKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2Ugc3RvcCBhY2NlcHRpbmcgaW5wdXQuICBUbyBkbyB0aGlzLCB3ZQorCSAqIGRpc2FibGUgdGhlIHJlY2VpdmUgbGluZSBzdGF0dXMgaW50ZXJydXB0cywgYW5kIHRlbGwgdGhlCisJICogaW50ZXJydXB0IGRyaXZlciB0byBzdG9wIGNoZWNraW5nIHRoZSBkYXRhIHJlYWR5IGJpdCBpbiB0aGUKKwkgKiBsaW5lIHN0YXR1cyByZWdpc3Rlci4KKwkgKi8KKwkvKiBpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1JMU0k7ICovCisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9SREk7CisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayAmPSB+VUFSVF9MU1JfRFI7CisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7CisKKwkJLyogZGlzYWJsZSByZWNlaXZlIHRpbWVvdXQgKi8KKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1JYX1RJTUVPVVQpOworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDApOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgorCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKKwkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKKwkJICovCisJCXJzX3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPnRpbWVvdXQpOworCX0KKwlzaHV0ZG93bihpbmZvKTsKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCXR0eS0+Y2xvc2luZyA9IDA7CisJaW5mby0+ZXZlbnQgPSAwOworCWluZm8tPnR0eSA9IE5VTEw7CisKKwlpZiAoaW5mby0+YmxvY2tlZF9vcGVuKSB7CisJCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhpbmZvLT5jbG9zZV9kZWxheSkpOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwl9CisJaW5mby0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJcmV0dXJuOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByc193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzLCBjaGFyX3RpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd2FpdF91bnRpbF9zZW50IikpCisJCXJldHVybjsKKworCW9yaWdfamlmZmllcyA9IGppZmZpZXM7CisJY2hhcl90aW1lID0gKChpbmZvLT50aW1lb3V0IC0gSFogLyA1MCkgLyAxMDI0KSAvIDU7CisKKwlpZiAoIWNoYXJfdGltZSkKKwkJY2hhcl90aW1lID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfTk9fQ09NTUFORCk7CisJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1RYX0FWQUlMKTsKKworCXdoaWxlICgoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSAhPSAweDAzKSB8fAorCQkoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKSAhPSAweGZmKSkgeworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKworCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQorCQkJYnJlYWs7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfTk9fQ09NTUFORCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9UWF9BVkFJTCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworfQorCisvKgorICogZXNwX2hhbmd1cCgpIC0tLSBjYWxsZWQgYnkgdHR5X2hhbmd1cCgpIHdoZW4gYSBoYW5ndXAgaXMgc2lnbmFsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGVzcF9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm8gPSAoc3RydWN0IGVzcF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiZXNwX2hhbmd1cCIpKQorCQlyZXR1cm47CisJCisJcnNfZmx1c2hfYnVmZmVyKHR0eSk7CisJc2h1dGRvd24oaW5mbyk7CisJaW5mby0+ZXZlbnQgPSAwOworCWluZm8tPmNvdW50ID0gMDsKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlpbmZvLT50dHkgPSBOVUxMOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZXNwX29wZW4oKSBhbmQgZnJpZW5kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgIHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludAkJcmV0dmFsOworCWludAkJZG9fY2xvY2FsID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkgICAgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKKwkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCisJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJZWxzZQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKyNlbHNlCisJCXJldHVybiAtRUFHQUlOOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAorCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KKwkgKi8KKwlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCSAgICAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAwOworCX0KKworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvX2Nsb2NhbCA9IDE7CisKKwkvKgorCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisJICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisJICogcnNfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCisJICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KKwkgKi8KKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jazogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAorCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgCisJCWluZm8tPmNvdW50LS07CisJaW5mby0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKKwkJCXVuc2lnbmVkIGludCBzY3JhdGNoOworCisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9SRUFEX1VBUlQpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7CisJCQlzY3JhdGNoID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7CisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsCisJCQkJc2NyYXRjaCB8IFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyk7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKyNpZmRlZiBTRVJJQUxfRE9fUkVTVEFSVAorCQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsJCisjZWxzZQorCQkJcmV0dmFsID0gLUVBR0FJTjsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVUFSVF9TVEFUKTsKKwkJaWYgKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMikgJiBVQVJUX01TUl9EQ0QpCisJCQlkb19jbG9jYWwgPSAxOworCisJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKwkJICAgIChkb19jbG9jYWwpKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCQlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBibG9ja2luZzogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAorCQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlpbmZvLT5jb3VudCsrOworCWluZm8tPmJsb2NrZWRfb3Blbi0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCisJICAgICAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwlyZXR1cm4gMDsKK30JCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGEgc2VyaWFsIHBvcnQgaXMgb3BlbmVkLiAgSXQKKyAqIGVuYWJsZXMgaW50ZXJydXB0cyBmb3IgYSBzZXJpYWwgcG9ydCwgbGlua2luZyBpbiBpdHMgYXN5bmMgc3RydWN0dXJlIGludG8KKyAqIHRoZSBJUlEgY2hhaW4uICAgSXQgYWxzbyBwZXJmb3JtcyB0aGUgc2VyaWFsLXNwZWNpZmljCisgKiBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHR0eSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgZXNwX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBlc3Bfc3RydWN0CSppbmZvOworCWludCAJCQlyZXR2YWwsIGxpbmU7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlpZiAoKGxpbmUgPCAwKSB8fCAobGluZSA+PSBOUl9QT1JUUykpCisJCXJldHVybiAtRU5PREVWOworCisJLyogZmluZCB0aGUgcG9ydCBpbiB0aGUgY2hhaW4gKi8KKworCWluZm8gPSBwb3J0czsKKworCXdoaWxlIChpbmZvICYmIChpbmZvLT5saW5lICE9IGxpbmUpKQorCQlpbmZvID0gaW5mby0+bmV4dF9wb3J0OworCisJaWYgKCFpbmZvKSB7CisJCXNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJlc3Bfb3BlbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiZXNwX29wZW4gJXMsIGNvdW50ID0gJWRcbiIsIHR0eS0+bmFtZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpbmZvLT5jb3VudCsrOworCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOworCWluZm8tPnR0eSA9IHR0eTsKKworCWlmICghdG1wX2J1ZikgeworCQl0bXBfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXRtcF9idWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisJLyoKKwkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAorCSAqLworCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOworCWlmIChyZXR2YWwpIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCQlwcmludGsoImVzcF9vcGVuIHJldHVybmluZyBhZnRlciBibG9ja190aWxfcmVhZHkgd2l0aCAlZFxuIiwKKwkJICAgICAgIHJldHZhbCk7CisjZW5kaWYKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiZXNwX29wZW4gJXMgc3VjY2Vzc2Z1bC4uLiIsIHR0eS0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZXNwc2VyaWFsX2luaXQoKSBhbmQgZnJpZW5kcworICoKKyAqIGVzcHNlcmlhbF9pbml0KCkgaXMgY2FsbGVkIGF0IGJvb3QtdGltZSB0byBpbml0aWFsaXplIHRoZSBzZXJpYWwgZHJpdmVyLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBwcmludHMgb3V0IHRoZSBhcHByb3ByaWF0ZSBzZXJpYWwgZHJpdmVyIHZlcnNpb24KKyAqIG51bWJlciwgYW5kIGlkZW50aWZpZXMgd2hpY2ggb3B0aW9ucyB3ZXJlIGNvbmZpZ3VyZWQgaW50byB0aGlzCisgKiBkcml2ZXIuCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaG93X3NlcmlhbF92ZXJzaW9uKHZvaWQpCit7CisgCXByaW50ayhLRVJOX0lORk8gIiVzIHZlcnNpb24gJXMgKERNQSAldSlcbiIsCisJCXNlcmlhbF9uYW1lLCBzZXJpYWxfdmVyc2lvbiwgZG1hKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgZXNwc2VyaWFsX2luaXQoKSB0byBpbml0aWFsaXplIGEgc3BlY2lmaWMgc2VyaWFsCisgKiBwb3J0LgorICovCitzdGF0aWMgaW5saW5lIGludCBhdXRvY29uZmlnKHN0cnVjdCBlc3Bfc3RydWN0ICogaW5mbykKK3sKKwlpbnQgcG9ydF9kZXRlY3RlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW5mby0+cG9ydCwgUkVHSU9OX1NJWkUsICJlc3Agc2VyaWFsIikpCisJCXJldHVybiAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwkvKgorCSAqIENoZWNrIGZvciBFU1AgY2FyZAorCSAqLworCisJaWYgKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9CQVNFKSA9PSAweGYzKSB7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgMHgwMCk7CisJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgMHgwMSk7CisKKwkJaWYgKChzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpICYgMHg3MCkgPT0gMHgyMCkgeworCQkJcG9ydF9kZXRlY3RlZCA9IDE7CisKKwkJCWlmICghKGluZm8tPmlycSkpIHsKKwkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIDB4MDIpOworCisJCQkJaWYgKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgJiAweDAxKQorCQkJCQlpbmZvLT5pcnEgPSAzOworCQkJCWVsc2UKKwkJCQkJaW5mby0+aXJxID0gNDsKKwkJCX0KKworCisJCQkvKiBwdXQgY2FyZCBpbiBlbmhhbmNlZCBtb2RlICovCisJCQkvKiB0aGlzIHByZXZlbnRzIGFjY2VzcyB0aHJvdWdoICovCisJCQkvKiB0aGUgIm9sZCIgSU8gcG9ydHMgKi8KKwkJCWVzcF9iYXNpY19pbml0KGluZm8pOworCisJCQkvKiBjbGVhciBvdXQgTUNSICovCisJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKKwkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOworCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKKwkJfQorCX0KKwlpZiAoIXBvcnRfZGV0ZWN0ZWQpCisJCXJlbGVhc2VfcmVnaW9uKGluZm8tPnBvcnQsIFJFR0lPTl9TSVpFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKHBvcnRfZGV0ZWN0ZWQpOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGVzcF9vcHMgPSB7CisJLm9wZW4gPSBlc3Bfb3BlbiwKKwkuY2xvc2UgPSByc19jbG9zZSwKKwkud3JpdGUgPSByc193cml0ZSwKKwkucHV0X2NoYXIgPSByc19wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSByc19mbHVzaF9jaGFycywKKwkud3JpdGVfcm9vbSA9IHJzX3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IHJzX2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gcnNfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCA9IHJzX2lvY3RsLAorCS50aHJvdHRsZSA9IHJzX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gcnNfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MgPSByc19zZXRfdGVybWlvcywKKwkuc3RvcCA9IHJzX3N0b3AsCisJLnN0YXJ0ID0gcnNfc3RhcnQsCisJLmhhbmd1cCA9IGVzcF9oYW5ndXAsCisJLmJyZWFrX2N0bCA9IGVzcF9icmVhaywKKwkud2FpdF91bnRpbF9zZW50ID0gcnNfd2FpdF91bnRpbF9zZW50LAorCS50aW9jbWdldCA9IGVzcF90aW9jbWdldCwKKwkudGlvY21zZXQgPSBlc3BfdGlvY21zZXQsCit9OworCisvKgorICogVGhlIHNlcmlhbCBkcml2ZXIgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUhCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVzcHNlcmlhbF9pbml0KHZvaWQpCit7CisJaW50IGksIG9mZnNldDsKKwlzdHJ1Y3QgZXNwX3N0cnVjdCAqIGluZm87CisJc3RydWN0IGVzcF9zdHJ1Y3QgKmxhc3RfcHJpbWFyeSA9IE5VTEw7CisJaW50IGVzcFtdID0gezB4MTAwLDB4MTQwLDB4MTgwLDB4MjAwLDB4MjQwLDB4MjgwLDB4MzAwLDB4MzgwfTsKKworCWVzcF9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE5SX1BPUlRTKTsKKwlpZiAoIWVzcF9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCQorCWZvciAoaSA9IDA7IGkgPCBOUl9QUklNQVJZOyBpKyspIHsKKwkJaWYgKGlycVtpXSAhPSAwKSB7CisJCQlpZiAoKGlycVtpXSA8IDIpIHx8IChpcnFbaV0gPiAxNSkgfHwgKGlycVtpXSA9PSA2KSB8fAorCQkJICAgIChpcnFbaV0gPT0gOCkgfHwgKGlycVtpXSA9PSAxMykpCisJCQkJaXJxW2ldID0gMDsKKwkJCWVsc2UgaWYgKGlycVtpXSA9PSAyKQorCQkJCWlycVtpXSA9IDk7CisJCX0KKwl9CisKKwlpZiAoKGRtYSAhPSAxKSAmJiAoZG1hICE9IDMpKQorCQlkbWEgPSAwOworCisJaWYgKChyeF90cmlnZ2VyIDwgMSkgfHwgKHJ4X3RyaWdnZXIgPiAxMDIzKSkKKwkJcnhfdHJpZ2dlciA9IDc2ODsKKworCWlmICgodHhfdHJpZ2dlciA8IDEpIHx8ICh0eF90cmlnZ2VyID4gMTAyMykpCisJCXR4X3RyaWdnZXIgPSA3Njg7CisKKwlpZiAoKGZsb3dfb2ZmIDwgMSkgfHwgKGZsb3dfb2ZmID4gMTAyMykpCisJCWZsb3dfb2ZmID0gMTAxNjsKKwkKKwlpZiAoKGZsb3dfb24gPCAxKSB8fCAoZmxvd19vbiA+IDEwMjMpKQorCQlmbG93X29uID0gOTQ0OworCisJaWYgKChyeF90aW1lb3V0IDwgMCkgfHwgKHJ4X3RpbWVvdXQgPiAyNTUpKQorCQlyeF90aW1lb3V0ID0gMTI4OworCQorCWlmIChmbG93X29uID49IGZsb3dfb2ZmKQorCQlmbG93X29uID0gZmxvd19vZmYgLSAxOworCisJc2hvd19zZXJpYWxfdmVyc2lvbigpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KKwkKKwllc3BfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCWVzcF9kcml2ZXItPm5hbWUgPSAidHR5UCI7CisJZXNwX2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ0dHMvUCI7CisJZXNwX2RyaXZlci0+bWFqb3IgPSBFU1BfSU5fTUFKT1I7CisJZXNwX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCWVzcF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWVzcF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJZXNwX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCWVzcF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCWVzcF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoZXNwX2RyaXZlciwgJmVzcF9vcHMpOworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKGVzcF9kcml2ZXIpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCByZWdpc3RlciBlc3Agc2VyaWFsIGRyaXZlciIpOworCQlwdXRfdHR5X2RyaXZlcihlc3BfZHJpdmVyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlc3Bfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWluZm8pCisJeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZXNwIHNlcmlhbCBkZXZpY2UgaW5mb3JtYXRpb25cbiIpOworCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoZXNwX2RyaXZlcik7CisJCXB1dF90dHlfZHJpdmVyKGVzcF9kcml2ZXIpOworCQlyZXR1cm4gMTsKKwl9CisKKwltZW1zZXQoKHZvaWQgKilpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGVzcF9zdHJ1Y3QpKTsKKwkvKiByeF90cmlnZ2VyLCB0eF90cmlnZ2VyIGFyZSBuZWVkZWQgYnkgYXV0b2NvbmZpZyAqLworCWluZm8tPmNvbmZpZy5yeF90cmlnZ2VyID0gcnhfdHJpZ2dlcjsKKwlpbmZvLT5jb25maWcudHhfdHJpZ2dlciA9IHR4X3RyaWdnZXI7CisKKwlpID0gMDsKKwlvZmZzZXQgPSAwOworCisJZG8geworCQlpbmZvLT5wb3J0ID0gZXNwW2ldICsgb2Zmc2V0OworCQlpbmZvLT5pcnEgPSBpcnFbaV07CisJCWluZm8tPmxpbmUgPSAoaSAqIDgpICsgKG9mZnNldCAvIDgpOworCisJCWlmICghYXV0b2NvbmZpZyhpbmZvKSkgeworCQkJaSsrOworCQkJb2Zmc2V0ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSAoZGl2aXNvcltpXSA+PiAob2Zmc2V0IC8gMikpICYgMHhmOworCQlpbmZvLT5mbGFncyA9IFNURF9DT01fRkxBR1M7CisJCWlmIChpbmZvLT5jdXN0b21fZGl2aXNvcikKKwkJCWluZm8tPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOworCQlpbmZvLT5tYWdpYyA9IEVTUF9NQUdJQzsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSAzMCpIWjsKKwkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWUsIGRvX3NvZnRpbnQsIGluZm8pOworCQlJTklUX1dPUksoJmluZm8tPnRxdWV1ZV9oYW5ndXAsIGRvX3NlcmlhbF9oYW5ndXAsIGluZm8pOworCQlpbmZvLT5jb25maWcucnhfdGltZW91dCA9IHJ4X3RpbWVvdXQ7CisJCWluZm8tPmNvbmZpZy5mbG93X29uID0gZmxvd19vbjsKKwkJaW5mby0+Y29uZmlnLmZsb3dfb2ZmID0gZmxvd19vZmY7CisJCWluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkID0gcGlvX3RocmVzaG9sZDsKKwkJaW5mby0+bmV4dF9wb3J0ID0gcG9ydHM7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmJyZWFrX3dhaXQpOworCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CisJCXBvcnRzID0gaW5mbzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidHR5UCVkIGF0IDB4JTA0eCAoaXJxID0gJWQpIGlzIGFuIEVTUCAiLAorCQkJaW5mby0+bGluZSwgaW5mby0+cG9ydCwgaW5mby0+aXJxKTsKKworCQlpZiAoaW5mby0+bGluZSAlIDgpIHsKKwkJCXByaW50aygic2Vjb25kYXJ5IHBvcnRcbiIpOworCQkJLyogOCBwb3J0IGNhcmRzIGNhbid0IGRvIERNQSAqLworCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ORVZFUl9ETUE7CisKKwkJCWlmIChsYXN0X3ByaW1hcnkpCisJCQkJbGFzdF9wcmltYXJ5LT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX05FVkVSX0RNQTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygicHJpbWFyeSBwb3J0XG4iKTsKKwkJCWxhc3RfcHJpbWFyeSA9IGluZm87CisJCQlpcnFbaV0gPSBpbmZvLT5pcnE7CisJCX0KKworCQlpZiAoIWRtYSkKKwkJCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfTkVWRVJfRE1BOworCisJCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXNwX3N0cnVjdCksIEdGUF9LRVJORUwpOworCQlpZiAoIWluZm8pCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBlc3Agc2VyaWFsIGRldmljZSBpbmZvcm1hdGlvblxuIik7IAorCisJCQkvKiBhbGxvdyB1c2Ugb2YgdGhlIGFscmVhZHkgZGV0ZWN0ZWQgcG9ydHMgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJbWVtc2V0KCh2b2lkICopaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBlc3Bfc3RydWN0KSk7CisJCS8qIHJ4X3RyaWdnZXIsIHR4X3RyaWdnZXIgYXJlIG5lZWRlZCBieSBhdXRvY29uZmlnICovCisJCWluZm8tPmNvbmZpZy5yeF90cmlnZ2VyID0gcnhfdHJpZ2dlcjsKKwkJaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPSB0eF90cmlnZ2VyOworCisJCWlmIChvZmZzZXQgPT0gNTYpIHsKKwkJCWkrKzsKKwkJCW9mZnNldCA9IDA7CisJCX0gZWxzZSB7CisJCQlvZmZzZXQgKz0gODsKKwkJfQorCX0gd2hpbGUgKGkgPCBOUl9QUklNQVJZKTsKKworCS8qIGZyZWUgdGhlIGxhc3QgcG9ydCBtZW1vcnkgYWxsb2NhdGlvbiAqLworCWtmcmVlKGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlc3BzZXJpYWxfZXhpdCh2b2lkKSAKK3sKKwlpbnQgZTE7CisJc3RydWN0IGVzcF9zdHJ1Y3QgKnRlbXBfYXN5bmM7CisJc3RydWN0IGVzcF9waW9fYnVmZmVyICpwaW9fYnVmOworCisJLyogcHJpbnRrKCJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIHNlcmlhbF9uYW1lLCBzZXJpYWxfdmVyc2lvbik7ICovCisJaWYgKChlMSA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihlc3BfZHJpdmVyKSkpCisJCXByaW50aygiU0VSSUFMOiBmYWlsZWQgdG8gdW5yZWdpc3RlciBzZXJpYWwgZHJpdmVyICglZClcbiIsCisJCSAgICAgICBlMSk7CisJcHV0X3R0eV9kcml2ZXIoZXNwX2RyaXZlcik7CisKKwl3aGlsZSAocG9ydHMpIHsKKwkJaWYgKHBvcnRzLT5wb3J0KSB7CisJCQlyZWxlYXNlX3JlZ2lvbihwb3J0cy0+cG9ydCwgUkVHSU9OX1NJWkUpOworCQl9CisJCXRlbXBfYXN5bmMgPSBwb3J0cy0+bmV4dF9wb3J0OworCQlrZnJlZShwb3J0cyk7CisJCXBvcnRzID0gdGVtcF9hc3luYzsKKwl9CisKKwlpZiAoZG1hX2J1ZmZlcikKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylkbWFfYnVmZmVyLAorCQkJZ2V0X29yZGVyKERNQV9CVUZGRVJfU1opKTsKKworCWlmICh0bXBfYnVmKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisKKwl3aGlsZSAoZnJlZV9waW9fYnVmKSB7CisJCXBpb19idWYgPSBmcmVlX3Bpb19idWYtPm5leHQ7CisJCWtmcmVlKGZyZWVfcGlvX2J1Zik7CisJCWZyZWVfcGlvX2J1ZiA9IHBpb19idWY7CisJfQorfQorCittb2R1bGVfaW5pdChlc3BzZXJpYWxfaW5pdCk7Cittb2R1bGVfZXhpdChlc3BzZXJpYWxfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9mdGFwZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkM2VjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZwpAQCAtMCwwICsxLDM0MCBAQAorIworIyBGdGFwZSBjb25maWd1cmF0aW9uCisjCitjb25maWcgWkZUQVBFCisJdHJpc3RhdGUgIlpmdGFwZSwgdGhlIFZGUyBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBGVEFQRQorCS0tLWhlbHAtLS0KKwkgIE5vcm1hbGx5LCB5b3Ugd2FudCB0byBzYXkgWSBvciBNLiBET04nVCBzYXkgTiBoZXJlIG9yIHlvdQorCSAgV09OJ1QgQkUgQUJMRSBUTyBVU0UgWU9VUiBGTE9QUFkgVEFQRSBEUklWRS4KKworCSAgVGhlIGZ0YXBlIG1vZHVsZSBpdHNlbGYgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSByb3V0aW5lcyBuZWNlc3NhcnkKKwkgIHRvIGludGVyZmFjZSB3aXRoIHRoZSBrZXJuZWwgVkZTIGxheWVyIChpLmUuIHRvIGFjdHVhbGx5IHdyaXRlIGRhdGEKKwkgIHRvIGFuZCByZWFkIGRhdGEgZnJvbSB0aGUgdGFwZSBkcml2ZSkuICBJbnN0ZWFkIHRoZSBmaWxlIHN5c3RlbQorCSAgaW50ZXJmYWNlIChpLmUuIHRoZSBoYXJkd2FyZSBpbmRlcGVuZGVudCBwYXJ0IG9mIHRoZSBkcml2ZXIpIGhhcworCSAgYmVlbiBtb3ZlZCB0byBhIHNlcGFyYXRlIG1vZHVsZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgemZ0YXBlLgorCisJICBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgeW91IHNheSBZIG9yIE0gaGVyZSwgYW4gYWRkaXRpb25hbCBydW50aW1lCisJICBsb2FkYWJsZSBtb2R1bGUgY2FsbGVkIGB6ZnQtY29tcHJlc3Nvcicgd2hpY2ggY29udGFpbnMgY29kZSB0bworCSAgc3VwcG9ydCB1c2VyIHRyYW5zcGFyZW50IG9uLXRoZS1mbHkgY29tcHJlc3Npb24gYmFzZWQgb24gUm9zcworCSAgV2lsbGlhbSdzIGx6cnczIGFsZ29yaXRobSB3aWxsIGJlIHByb2R1Y2VkLiAgSWYgeW91IGhhdmUgZW5hYmxlZCB0aGUKKwkgIGtlcm5lbCBtb2R1bGUgbG9hZGVyIChpLmUuIGhhdmUgc2FpZCBZIHRvICJLZXJuZWwgbW9kdWxlIGxvYWRlcgorCSAgc3VwcG9ydCIsIGFib3ZlKSB0aGVuIGB6ZnQtY29tcHJlc3Nvcicgd2lsbCBiZSBsb2FkZWQKKwkgIGF1dG9tYXRpY2FsbHkgYnkgemZ0YXBlIHdoZW4gbmVlZGVkLgorCisJICBEZXNwaXRlIGl0cyBuYW1lLCB6ZnRhcGUgZG9lcyBOT1QgdXNlIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQuICBUaGUKKwkgIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IGNvbnRhaW5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YKKwkgIHRoZSBtb3N0IGltcG9ydGFudCBjaGFuZ2VzIGluIHRoZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgY29tcGFyZWQgdG8KKwkgIHByZXZpb3VzIHZlcnNpb25zIG9mIGZ0YXBlLiAgVGhlIGZ0YXBlIGhvbWUgcGFnZQorCSAgPGh0dHA6Ly93d3cuaW5zdG1hdGgucnd0aC1hYWNoZW4uZGUvfmhlaW5lL2Z0YXBlLz4gY29udGFpbnMKKwkgIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisKKwkgIElNUE9SVEFOVCBOT1RFOiB6ZnRhcGUgY2FuIHJlYWQgYXJjaGl2ZXMgY3JlYXRlZCBieSBwcmV2aW91cworCSAgdmVyc2lvbnMgb2YgZnRhcGUgYW5kIHByb3ZpZGUgZmlsZSBtYXJrIHN1cHBvcnQgKGkuZS4gZmFzdCBza2lwcGluZworCSAgYmV0d2VlbiB0YXBlIGFyY2hpdmVzKSBidXQgcHJldmlvdXMgdmVyc2lvbiBvZiBmdGFwZSB3aWxsIGxhY2sgZmlsZQorCSAgbWFyayBzdXBwb3J0IHdoZW4gcmVhZGluZyBhcmNoaXZlcyBwcm9kdWNlZCBieSB6ZnRhcGUuCisKK2NvbmZpZyBaRlRfREZMVF9CTEtfU1oKKwlpbnQgIkRlZmF1bHQgYmxvY2sgc2l6ZSIKKwlkZXBlbmRzIG9uIFpGVEFQRQorCWRlZmF1bHQgIjEwMjQwIgorCS0tLWhlbHAtLS0KKwkgIElmIHVuc3VyZSBsZWF2ZSB0aGlzIGF0IGl0cyBkZWZhdWx0IHZhbHVlLCBpLmUuIDEwMjQwLiBOb3RlIHRoYXQKKwkgIHlvdSBzcGVjaWZ5IG9ubHkgdGhlIGRlZmF1bHQgYmxvY2sgc2l6ZSBoZXJlLiBUaGUgYmxvY2sgc2l6ZSBjYW4gYmUKKwkgIGNoYW5nZWQgYXQgcnVuIHRpbWUgdXNpbmcgdGhlIE1UU0VUQkxLIHRhcGUgb3BlcmF0aW9uIHdpdGggdGhlCisJICBNVElPQ1RPUCBpb2N0bCAoaS5lLiB3aXRoICJtdCAtZiAvZGV2L3FmdDAgc2V0YmxrICNCTEtTWiIgZnJvbSB0aGUKKwkgIHNoZWxsIGNvbW1hbmQgbGluZSkuCisKKwkgIFRoZSBwcm9iYWJseSBtb3N0IHN0cmlraW5nIGRpZmZlcmVuY2UgYmV0d2VlbiB6ZnRhcGUgYW5kIHByZXZpb3VzCisJICB2ZXJzaW9ucyBvZiBmdGFwZSBpcyB0aGUgZmFjdCB0aGF0IGFsbCBkYXRhIG11c3QgYmUgd3JpdHRlbiBvciByZWFkCisJICBpbiBtdWx0aXBsZXMgb2YgYSBmaXhlZCBibG9jayBzaXplLiBUaGUgYmxvY2sgc2l6ZSBkZWZhdWx0cyB0bworCSAgMTAyNDAgd2hpY2ggaXMgd2hhdCBHTlUgdGFyIHVzZXMuIFRoZSB2YWx1ZXMgZm9yIHRoZSBibG9jayBzaXplCisJICBzaG91bGQgYmUgZWl0aGVyIDEgb3IgbXVsdGlwbGVzIG9mIDEwMjQgdXAgdG8gYSBtYXhpbXVtIHZhbHVlIG9mCisJICA2MzQ4OCAoaS5lLiA2MiBLKS4gSWYgeW91IHNwZWNpZnkgYDEnIHRoZW4gemZ0YXBlJ3MgYnVpbHRpbgorCSAgY29tcHJlc3Npb24gd2lsbCBiZSBkaXNhYmxlZC4KKworCSAgUmVhc29uYWJsZSB2YWx1ZXMgYXJlIGAxMDI0MCcgKEdOVSB0YXIncyBkZWZhdWx0IGJsb2NrIHNpemUpLAorCSAgYDUxMjAnIChhZmlvJ3MgZGVmYXVsdCBibG9jayBzaXplKSwgYDMyNzY4JyAoZGVmYXVsdCBibG9jayBzaXplIHNvbWUKKwkgIGJhY2t1cCBwcm9ncmFtcyBhc3N1bWUgZm9yIFNDU0kgdGFwZSBkcml2ZXMpIG9yIGAxJyAobm8gcmVzdHJpY3Rpb24KKwkgIG9uIGJsb2NrIHNpemUsIGJ1dCBkaXNhYmxlcyBidWlsdGluIGNvbXByZXNzaW9uKS4KKworY29tbWVudCAiVGhlIGNvbXByZXNzb3Igd2lsbCBiZSBidWlsdCBhcyBhIG1vZHVsZSBvbmx5ISIKKwlkZXBlbmRzIG9uIEZUQVBFICYmIFpGVEFQRQorCitjb25maWcgWkZUX0NPTVBSRVNTT1IKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gRlRBUEUhPW4gJiYgWkZUQVBFIT1uCisJZGVmYXVsdCBtCisKK2NvbmZpZyBGVF9OUl9CVUZGRVJTCisJaW50ICJOdW1iZXIgb2YgZnRhcGUgYnVmZmVycyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEZUQVBFICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgIjMiCisJaGVscAorCSAgUGxlYXNlIGxlYXZlIHRoaXMgYXQgYDMnIHVubGVzcyB5b3UgUkVBTExZIGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorCSAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhpcyB2YWx1ZS4gVmFsdWVzIGJlbG93IDMgbWFrZSB0aGUKKwkgIHByb3BlciB1c2Ugb2YgZnRhcGUgaW1wb3NzaWJsZSwgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzIGFyZSBhIHdhc3RlIG9mCisJICBtZW1vcnkuIFlvdSBjYW4gY2hhbmdlIHRoZSBhbW91bnQgb2YgRE1BIG1lbW9yeSB1c2VkIGJ5IGZ0YXBlIGF0CisJICBydW50aW1lIHdpdGggIm10IC1mIC9kZXYvcWZ0MCBzZXRkcnZidWZmZXIgI05VTUJVRkZFUlMiLiBFYWNoIGJ1ZmZlcgorCSAgd2FzdGVzIDMyIEtCIG9mIG1lbW9yeS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1lbW9yeSBjYW5ub3QgYmUKKwkgIHN3YXBwZWQgb3V0LgorCitjb25maWcgRlRfUFJPQ19GUworCWJvb2wgIkVuYWJsZSBwcm9jZnMgc3RhdHVzIHJlcG9ydCAoKzJrYikiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiBQUk9DX0ZTCisJLS0taGVscC0tLQorCSAgT3B0aW9uYWwuIFNheWluZyBZIHdpbGwgcmVzdWx0IGluIGNyZWF0aW9uIG9mIGEgZGlyZWN0b3J5CisJICBgL3Byb2MvZnRhcGUnIHVuZGVyIHRoZSAvcHJvYyBmaWxlIHN5c3RlbS4gVGhlIGZpbGVzIGNhbiBiZSB2aWV3ZWQKKwkgIHdpdGggeW91ciBmYXZvcml0ZSBwYWdlciAoaS5lLiB1c2UgIm1vcmUgL3Byb2MvZnRhcGUvaGlzdG9yeSIgb3IKKwkgICJsZXNzIC9wcm9jL2Z0YXBlL2hpc3RvcnkiIG9yIHNpbXBseSAiY2F0IC9wcm9jL2Z0YXBlL2hpc3RvcnkiKS4gVGhlCisJICBmaWxlIHdpbGwgY29udGFpbiBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zZXJ0ZWQKKwkgIGNhcnRyaWRnZSwgdGhlIGtlcm5lbCBkcml2ZXIsIHlvdXIgdGFwZSBkcml2ZSwgdGhlIGZsb3BweSBkaXNrCisJICBjb250cm9sbGVyIGFuZCB0aGUgZXJyb3IgaGlzdG9yeSBmb3IgdGhlIG1vc3QgcmVjZW50IHVzZSBvZiB0aGUKKwkgIGtlcm5lbCBkcml2ZXIuIFNheWluZyBZIHdpbGwgZW5sYXJnZSB0aGUgc2l6ZSBvZiB0aGUgZnRhcGUgZHJpdmVyCisJICBieSBhcHByb3hpbWF0ZWx5IDIgS0IuCisKKwkgIFdBUk5JTkc6IFdoZW4gY29tcGlsaW5nIGZ0YXBlIGFzIGEgbW9kdWxlIChpLmUuIHNheWluZyBNIHRvICJGbG9wcHkKKwkgIHRhcGUgZHJpdmUiKSBpdCBpcyBkYW5nZXJvdXMgdG8gdXNlIGZ0YXBlJ3MgL3Byb2MgZmlsZSBzeXN0ZW0KKwkgIGludGVyZmFjZS4gQWNjZXNzaW5nIGAvcHJvYy9mdGFwZScgd2hpbGUgdGhlIG1vZHVsZSBpcyB1bmxvYWRlZCB3aWxsCisJICByZXN1bHQgaW4gYSBrZXJuZWwgT29wcy4gVGhpcyBjYW5ub3QgYmUgZml4ZWQgZnJvbSBpbnNpZGUgZnRhcGUuCisKK2Nob2ljZQorCXByb21wdCAiRGVidWdnaW5nIG91dHB1dCIKKwlkZXBlbmRzIG9uIEZUQVBFCisJZGVmYXVsdCBGVF9OT1JNQUxfREVCVUcKKworY29uZmlnIEZUX05PUk1BTF9ERUJVRworCWJvb2wgIk5vcm1hbCIKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBjb250cm9scyB0aGUgYW1vdW50IG9mIGRlYnVnZ2luZyBvdXRwdXQgdGhlIGZ0YXBlIGRyaXZlcgorCSAgaXMgQUJMRSB0byBwcm9kdWNlOyBpdCBkb2VzIG5vdCBpbmNyZWFzZSBvciBkaW1pbmlzaCB0aGUgZGVidWdnaW5nCisJICBsZXZlbCBpdHNlbGYuIElmIHVuc3VyZSwgbGVhdmUgdGhpcyBhdCBpdHMgZGVmYXVsdCBzZXR0aW5nLAorCSAgaS5lLiBjaG9vc2UgIk5vcm1hbCIuCisKKwkgIEZ0YXBlIGNhbiBwcmludCBsb3RzIG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIGNvbnNvbGUKKwkgIHJlc3AuIGtlcm5lbCBsb2cgZmlsZXMuIFJlZHVjaW5nIHRoZSBhbW91bnQgb2YgcG9zc2libGUgZGVidWdnaW5nCisJICBvdXRwdXQgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUga2VybmVsIG1vZHVsZSBieSBzb21lIEtCLCBzbyBpdCBtaWdodAorCSAgYmUgYSBnb29kIGlkZWEgdG8gdXNlICJOb25lIiBmb3IgZW1lcmdlbmN5IGJvb3QgZmxvcHBpZXMuCisKKwkgIElmIHlvdSB3YW50IHRvIHNhdmUgbWVtb3J5IHRoZW4gdGhlIGZvbGxvd2luZyBzdHJhdGVneSBpcworCSAgcmVjb21tZW5kZWQ6IGxlYXZlIHRoaXMgb3B0aW9uIGF0IGl0cyBkZWZhdWx0IHNldHRpbmcgIk5vcm1hbCIgdW50aWwKKwkgIHlvdSBrbm93IHRoYXQgdGhlIGRyaXZlciB3b3JrcyBhcyBleHBlY3RlZCwgYWZ0ZXJ3YXJkcyByZWNvbmZpZ3VyZQorCSAgdGhlIGtlcm5lbCwgdGhpcyB0aW1lIHNwZWNpZnlpbmcgIlJlZHVjZWQiIG9yICJOb25lIiBhbmQgcmVjb21waWxlCisJICBhbmQgaW5zdGFsbCB0aGUga2VybmVsIGFzIHVzdWFsLiBOb3RlIHRoYXQgY2hvb3NpbmcgIkV4Y2Vzc2l2ZSIKKwkgIGRlYnVnZ2luZyBvdXRwdXQgZG9lcyBub3QgaW5jcmVhc2UgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0CisJICBwcmludGVkIHRvIHRoZSBjb25zb2xlIGJ1dCBvbmx5IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHByb2R1Y2UKKwkgICJFeGNlc3NpdmUiIGRlYnVnZ2luZyBvdXRwdXQuCisKKwkgIFBsZWFzZSByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vZnRhcGUudHh0PiBmb3IgYSBzaG9ydCBkZXNjcmlwdGlvbgorCSAgaG93IHRvIGNvbnRyb2wgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0LgorCitjb25maWcgRlRfRlVMTF9ERUJVRworCWJvb2wgIkV4Y2Vzc2l2ZSIKKwloZWxwCisJICBFeHRyZW1lbHkgdmVyYm9zZSBvdXRwdXQgZm9yIGRyaXZlciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisKK2NvbmZpZyBGVF9OT19UUkFDRQorCWJvb2wgIlJlZHVjZWQiCisJaGVscAorCSAgUmVkdWNlZCB0YXBlIGRyaXZlciBkZWJ1Z2dpbmcgb3V0cHV0LgorCitjb25maWcgRlRfTk9fVFJBQ0VfQVRfQUxMCisJYm9vbCAiTm9uZSIKKwloZWxwCisJICBTdXBwcmVzcyBhbGwgZGVidWdnaW5nIG91dHB1dCBmcm9tIHRoZSB0YXBlIGRyaXZlLgorCitlbmRjaG9pY2UKKworY29tbWVudCAiSGFyZHdhcmUgY29uZmlndXJhdGlvbiIKKwlkZXBlbmRzIG9uIEZUQVBFCisKK2Nob2ljZQorCXByb21wdCAiRmxvcHB5IHRhcGUgY29udHJvbGxlcnMiCisJZGVwZW5kcyBvbiBGVEFQRQorCWRlZmF1bHQgRlRfU1REX0ZEQworCitjb25maWcgRlRfU1REX0ZEQworCWJvb2wgIlN0YW5kYXJkIgorCS0tLWhlbHAtLS0KKwkgIE9ubHkgY2hhbmdlIHRoaXMgc2V0dGluZyBpZiB5b3UgaGF2ZSBhIHNwZWNpYWwgY29udHJvbGxlci4gSWYgeW91CisJICBkaWRuJ3QgcGx1ZyBhbnkgYWRkLW9uIGNhcmQgaW50byB5b3VyIGNvbXB1dGVyIHN5c3RlbSBidXQganVzdAorCSAgcGx1Z2dlZCB0aGUgZmxvcHB5IHRhcGUgY2FibGUgaW50byB0aGUgYWxyZWFkeSBleGlzdGluZyBmbG9wcHkgZHJpdmUKKwkgIGNvbnRyb2xsZXIgdGhlbiB5b3UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgc2V0dGluZywKKwkgIGkuZS4gY2hvb3NlICJTdGFuZGFyZCIuCisKKwkgIENob29zZSAiTUFDSC0yIiBpZiB5b3UgaGF2ZSBhIE1vdW50YWluIE1hY2gtMiBjb250cm9sbGVyLgorCSAgQ2hvb3NlICJGQy0xMC9GQy0yMCIgaWYgeW91IGhhdmUgYSBDb2xvcmFkbyBGQy0xMCBvciBGQy0yMAorCSAgY29udHJvbGxlci4KKwkgIENob29zZSAiQWx0LzgyMDc4IiBpZiB5b3UgaGF2ZSBhbm90aGVyIGNvbnRyb2xsZXIgdGhhdCBpcyBsb2NhdGVkIGF0CisJICBhbiBJTyBiYXNlIGFkZHJlc3MgZGlmZmVyZW50IGZyb20gdGhlIHN0YW5kYXJkIGZsb3BweSBkcml2ZQorCSAgY29udHJvbGxlcidzIGJhc2UgYWRkcmVzcyBvZiBgMHgzZjAnLCBvciB1c2VzIGFuIElSUSAoaW50ZXJydXB0KQorCSAgY2hhbm5lbCBkaWZmZXJlbnQgZnJvbSBgNicsIG9yIGEgRE1BIGNoYW5uZWwgZGlmZmVyZW50IGZyb20KKwkgIGAyJy4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGFueSBjb250cm9sbGVyIGNhcmQgdGhhdCBpcyBiYXNlZCBvbgorCSAgSW50ZWwncyA4MjA3OCBGREMgc3VjaCBhcyBTZWFnYXRlJ3MsIEV4YWJ5dGUncyBhbmQgSW9tZWdhJ3MgImhpZ2gKKwkgIHNwZWVkIiBjb250cm9sbGVycy4KKworCSAgSWYgeW91IGNob29zZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAiU3RhbmRhcmQiIHRoZW4gcGxlYXNlIG1ha2UKKwkgIHN1cmUgdGhhdCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBJTyBiYXNlIGFkZHJlc3MgYW5kIHRoZSBJUlEgYW5kIERNQQorCSAgY2hhbm5lbCBpbiB0aGUgY29uZmlndXJhdGlvbiBtZW51cyBiZWxvdyBhcmUgY29ycmVjdC4gVXNlIHRoZSBtYW51YWwKKwkgIG9mIHlvdXIgdGFwZSBkcml2ZSB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3Qgc2V0dGluZ3MhCisKKwkgIElmIHlvdSBhcmUgYWxyZWFkeSBzdWNjZXNzZnVsbHkgdXNpbmcgeW91ciB0YXBlIGRyaXZlIHdpdGggYW5vdGhlcgorCSAgb3BlcmF0aW5nIHN5c3RlbSB0aGVuIHlvdSBkZWZpbml0ZWx5IHNob3VsZCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MKKwkgIGZvciB0aGUgSU8gYmFzZSwgdGhlIElSUSBhbmQgRE1BIGNoYW5uZWwgdGhhdCBoYXZlIHByb3ZlbiB0byB3b3JrCisJICB3aXRoIHRoYXQgb3RoZXIgT1MuCisKKwkgIE5vdGUgdGhhdCB0aGlzIG1lbnUgbGV0cyB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yCisJICB0aGUgaGFyZHdhcmUgc2V0dXAuIFRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGNhbiBiZSBjaGFuZ2VkIGF0CisJICBib290IHRpbWUgKHdoZW4gZnRhcGUgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBpLmUuIGlmIHlvdQorCSAgaGF2ZSBzYWlkIFkgdG8gIkZsb3BweSB0YXBlIGRyaXZlIikgb3IgbW9kdWxlIGxvYWQgdGltZSAoaS5lLiBpZiB5b3UKKwkgIGhhdmUgc2FpZCBNIHRvICJGbG9wcHkgdGFwZSBkcml2ZSIpLgorCisJICBQbGVhc2UgcmVhZCBhbHNvIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vZnRhcGUudHh0PiB3aGljaAorCSAgY29udGFpbnMgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgYXQKKwkgIGJvb3Qgb3IgbG9hZCB0aW1lLiBJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBmbG9wcHkgdGFwZSBkcml2ZSBvbiBhCisJICBQQ0ktYnVzIGJhc2VkIHN5c3RlbSwgcGxlYXNlIHJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOmRyaXZlcnMvY2hhci9mdGFwZS9SRUFETUUuUENJPi4KKworY29uZmlnIEZUX01BQ0gyCisJYm9vbCAiTUFDSC0yIgorCitjb25maWcgRlRfUFJPQkVfRkMxMAorCWJvb2wgIkZDLTEwL0ZDLTIwIgorCitjb25maWcgRlRfQUxUX0ZEQworCWJvb2wgIkFsdC84MjA3OCIKKworZW5kY2hvaWNlCisKK2NvbW1lbnQgIkNvbnN1bHQgdGhlIG1hbnVhbHMgb2YgeW91ciB0YXBlIGRyaXZlIGZvciB0aGUgY29ycmVjdCBzZXR0aW5ncyEiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiAhRlRfU1REX0ZEQworCitjb25maWcgRlRfRkRDX0JBU0UKKwloZXggIklPIGJhc2Ugb2YgdGhlIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiAhRlRfU1REX0ZEQworCWRlZmF1bHQgIjAiCisJLS0taGVscC0tLQorCSAgWW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSBhIHZhbHVlIGlmIHRoZSBmb2xsb3dpbmcgZGVmYXVsdAorCSAgc2V0dGluZ3MgZm9yIHRoZSBiYXNlIElPIGFkZHJlc3MgYXJlIGNvcnJlY3Q6CisJICA8PDwgTUFDSC0yICAgICA6IDB4MUUwID4+PgorCSAgPDw8IEZDLTEwL0ZDLTIwOiAweDE4MCA+Pj4KKwkgIDw8PCBTZWNvbmRhcnkgIDogMHgzNzAgPj4+CisJICBTZWNvbmRhcnkgcmVmZXJzIHRvIGEgc2Vjb25kYXJ5IEZEQyBjb250cm9sbGVyIGxpa2UgdGhlICJoaWdoIHNwZWVkIgorCSAgY29udHJvbGxlcnMgZGVsaXZlcmVkIGJ5IFNlYWdhdGUgb3IgRXhhYnl0ZSBvciBJb21lZ2EncyBEaXR0byBEYXNoLgorCSAgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXR0aW5nIGZvciB0aGUgSU8gYmFzZSBhZGRyZXNzCisJICBzcGVjaWZpZWQgaGVyZSBpcyBjb3JyZWN0LiBVU0UgVEhFIE1BTlVBTCBPRiBZT1VSIFRBUEUgRFJJVkUgT1IKKwkgIENPTlRST0xMRVIgQ0FSRCBUTyBERVRFUk1JTkUgVEhFIENPUlJFQ1QgU0VUVElORy4gSWYgeW91IGFyZSBhbHJlYWR5CisJICBzdWNjZXNzZnVsbHkgdXNpbmcgdGhlIHRhcGUgZHJpdmUgd2l0aCBhbm90aGVyIG9wZXJhdGluZyBzeXN0ZW0gdGhlbgorCSAgeW91IGRlZmluaXRlbHkgc2hvdWxkIHVzZSB0aGUgc2FtZSBzZXR0aW5ncyBmb3IgdGhlIElPIGJhc2UgdGhhdCBoYXMKKwkgIHByb3ZlbiB0byB3b3JrIHdpdGggdGhhdCBvdGhlciBPUy4KKworCSAgTm90ZSB0aGF0IHRoaXMgbWVudSBsZXRzIHlvdSBzcGVjaWZ5IG9ubHkgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IKKwkgIHRoZSBJTyBiYXNlLiBUaGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBjYW4gYmUgY2hhbmdlZCBhdCBib290IHRpbWUKKwkgICh3aGVuIGZ0YXBlIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwgaS5lLiBpZiB5b3Ugc3BlY2lmaWVkIFkgdG8KKwkgICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91IGhhdmUgc2FpZCBNIHRvCisJICAiRmxvcHB5IHRhcGUgZHJpdmUiKS4KKworCSAgUGxlYXNlIHJlYWQgYWxzbyB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gd2hpY2gKKwkgIGNvbnRhaW5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGF0CisJICBib290IG9yIGxvYWQgdGltZS4KKworY29uZmlnIEZUX0ZEQ19JUlEKKwlpbnQgIklSUSBjaGFubmVsIG9mIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKKwlkZWZhdWx0ICIwIgorCS0tLWhlbHAtLS0KKwkgIFlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSB2YWx1ZSBpZiB0aGUgZm9sbG93aW5nIGRlZmF1bHQKKwkgIHNldHRpbmdzIGZvciB0aGUgaW50ZXJydXB0IGNoYW5uZWwgYXJlIGNvcnJlY3Q6CisJICA8PDwgTUFDSC0yICAgICA6IDYgPj4+CisJICA8PDwgRkMtMTAvRkMtMjA6IDkgPj4+CisJICA8PDwgU2Vjb25kYXJ5ICA6IDYgPj4+CisJICBTZWNvbmRhcnkgcmVmZXJzIHRvIHNlY29uZGFyeSBhIEZEQyBjb250cm9sbGVyIGxpa2UgdGhlICJoaWdoIHNwZWVkIgorCSAgY29udHJvbGxlcnMgZGVsaXZlcmVkIGJ5IFNlYWdhdGUgb3IgRXhhYnl0ZSBvciBJb21lZ2EncyBEaXR0byBEYXNoLgorCSAgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXR0aW5nIGZvciB0aGUgSU8gYmFzZSBhZGRyZXNzCisJICBzcGVjaWZpZWQgaGVyZSBpcyBjb3JyZWN0LiBVU0UgVEhFIE1BTlVBTCBPRiBZT1VSIFRBUEUgRFJJVkUgT1IKKwkgIENPTlRST0xMRVIgQ0FSRCBUTyBERVRFUk1JTkUgVEhFIENPUlJFQ1QgU0VUVElORy4gSWYgeW91IGFyZSBhbHJlYWR5CisJICBzdWNjZXNzZnVsbHkgdXNpbmcgdGhlIHRhcGUgZHJpdmUgd2l0aCBhbm90aGVyIG9wZXJhdGluZyBzeXN0ZW0gdGhlbgorCSAgeW91IGRlZmluaXRlbHkgc2hvdWxkIHVzZSB0aGUgc2FtZSBzZXR0aW5ncyBmb3IgdGhlIElPIGJhc2UgdGhhdCBoYXMKKwkgIHByb3ZlbiB0byB3b3JrIHdpdGggdGhhdCBvdGhlciBPUy4KKworCSAgTm90ZSB0aGF0IHRoaXMgbWVudSBsZXRzIHlvdSBzcGVjaWZ5IG9ubHkgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IKKwkgIHRoZSBJUlEgY2hhbm5lbC4gVGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGNoYW5nZWQgYXQgYm9vdAorCSAgdGltZSAod2hlbiBmdGFwZSBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsIGkuZS4gaWYgeW91IHNhaWQgWSB0bworCSAgIkZsb3BweSB0YXBlIGRyaXZlIikgb3IgbW9kdWxlIGxvYWQgdGltZSAoaS5lLiBpZiB5b3Ugc2FpZCBNIHRvCisJICAiRmxvcHB5IHRhcGUgZHJpdmUiKS4KKworCSAgUGxlYXNlIHJlYWQgYWxzbyB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gd2hpY2gKKwkgIGNvbnRhaW5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGF0CisJICBib290IG9yIGxvYWQgdGltZS4KKworY29uZmlnIEZUX0ZEQ19ETUEKKwlpbnQgIkRNQSBjaGFubmVsIG9mIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKKwlkZWZhdWx0ICIwIgorCS0tLWhlbHAtLS0KKwkgIFlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSB2YWx1ZSBpZiB0aGUgZm9sbG93aW5nIGRlZmF1bHQKKwkgIHNldHRpbmdzIGZvciB0aGUgRE1BIGNoYW5uZWwgYXJlIGNvcnJlY3Q6CisJICA8PDwgTUFDSC0yICAgICA6IDIgPj4+CisJICA8PDwgRkMtMTAvRkMtMjA6IDMgPj4+CisJICA8PDwgU2Vjb25kYXJ5ICA6IDIgPj4+CisJICBTZWNvbmRhcnkgcmVmZXJzIHRvIGEgc2Vjb25kYXJ5IEZEQyBjb250cm9sbGVyIGxpa2UgdGhlICJoaWdoIHNwZWVkIgorCSAgY29udHJvbGxlcnMgZGVsaXZlcmVkIGJ5IFNlYWdhdGUgb3IgRXhhYnl0ZSBvciBJb21lZ2EncyBEaXR0byBEYXNoLgorCSAgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXR0aW5nIGZvciB0aGUgSU8gYmFzZSBhZGRyZXNzCisJICBzcGVjaWZpZWQgaGVyZSBpcyBjb3JyZWN0LiBVU0UgVEhFIE1BTlVBTCBPRiBZT1VSIFRBUEUgRFJJVkUgT1IKKwkgIENPTlRST0xMRVIgQ0FSRCBUTyBERVRFUk1JTkUgVEhFIENPUlJFQ1QgU0VUVElORy4gSWYgeW91IGFyZSBhbHJlYWR5CisJICBzdWNjZXNzZnVsbHkgdXNpbmcgdGhlIHRhcGUgZHJpdmUgd2l0aCBhbm90aGVyIG9wZXJhdGluZyBzeXN0ZW0gdGhlbgorCSAgeW91IGRlZmluaXRlbHkgc2hvdWxkIHVzZSB0aGUgc2FtZSBzZXR0aW5ncyBmb3IgdGhlIElPIGJhc2UgdGhhdCBoYXMKKwkgIHByb3ZlbiB0byB3b3JrIHdpdGggdGhhdCBvdGhlciBPUy4KKworCSAgTm90ZSB0aGF0IHRoaXMgbWVudSBsZXRzIHlvdSBzcGVjaWZ5IG9ubHkgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IKKwkgIHRoZSBETUEgY2hhbm5lbC4gVGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGNoYW5nZWQgYXQgYm9vdAorCSAgdGltZSAod2hlbiBmdGFwZSBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsIGkuZS4gaWYgeW91IHNhaWQgWSB0bworCSAgIkZsb3BweSB0YXBlIGRyaXZlIikgb3IgbW9kdWxlIGxvYWQgdGltZSAoaS5lLiBpZiB5b3Ugc2FpZCBNIHRvCisJICAiRmxvcHB5IHRhcGUgZHJpdmUiKS4KKworCSAgUGxlYXNlIHJlYWQgYWxzbyB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gd2hpY2gKKwkgIGNvbnRhaW5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGF0CisJICBib290IG9yIGxvYWQgdGltZS4KKworY29uZmlnIEZUX0ZEQ19USFIKKwlpbnQgIkRlZmF1bHQgRklGTyB0aHJlc2hvbGQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBGVEFQRSAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0ICI4IgorCWhlbHAKKwkgIFNldCB0aGUgRklGTyB0aHJlc2hvbGQgb2YgdGhlIEZEQy4gSWYgdGhpcyBpcyBoaWdoZXIgdGhlIERNQQorCSAgY29udHJvbGxlciBtYXkgc2VydmUgdGhlIEZEQyBhZnRlciBhIGhpZ2hlciBsYXRlbmN5IHRpbWUuIElmIHRoaXMgaXMKKwkgIGxvd2VyLCBmZXdlciBETUEgdHJhbnNmZXJzIG9jY3VyIGxlYWRpbmcgdG8gbGVzcyBidXMgY29udGVudGlvbi4KKwkgIFlvdSBtYXkgdHJ5IHRvIHR1bmUgdGhpcyBpZiBmdGFwZSBhbm5veXMgeW91IHdpdGggInJlZHVjZWQgZGF0YQorCSAgcmF0ZSBiZWNhdXNlIG9mIGV4Y2Vzc2l2ZSBvdmVycnVuIGVycm9ycyIgbWVzc2FnZXMuIEhvd2V2ZXIsIHRoaXMKKwkgIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIHRvbyBtdWNoIGVmZmVjdC4KKworCSAgSWYgdW5zdXJlLCBkb24ndCB0b3VjaCB0aGUgaW5pdGlhbCB2YWx1ZSwgaS5lLiBsZWF2ZSBpdCBhdCAiOCIuCisKK2NvbmZpZyBGVF9GRENfTUFYX1JBVEUKKwlpbnQgIk1heGltYWwgZGF0YSByYXRlIHRvIHVzZSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEZUQVBFICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgIjIwMDAiCisJLS0taGVscC0tLQorCSAgV2l0aCBzb21lIG1vdGhlcmJvYXJkL0ZEQyBjb21iaW5hdGlvbnMgZnRhcGUgd2lsbCBub3QgYmUgYWJsZSB0bworCSAgcnVuIHlvdXIgRkRDL3RhcGUgZHJpdmUgY29tYmluYXRpb24gYXQgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlCisJICBzcGVlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB5b3UnbGwgZW5jb3VudGVyICJyZWR1Y2VkIGRhdGEgcmF0ZQorCSAgYmVjYXVzZSBvZiBleGNlc3NpdmUgb3ZlcnJ1biBlcnJvcnMiIG1lc3NhZ2VzIGFuZCBsb3RzIG9mIHJldHJpZXMKKwkgIGJlZm9yZSBmdGFwZSBmaW5hbGx5IGRlY2lkZXMgdG8gcmVkdWNlIHRoZSBkYXRhIHJhdGUuCisKKwkgIEluIHRoaXMgY2FzZSBpdCBtaWdodCBiZSBkZXNpcmFibGUgdG8gdGVsbCBmdGFwZSBiZWZvcmVoYW5kIHRoYXQKKwkgIGl0IG5lZWQgbm90IHRyeSB0byBydW4gdGhlIHRhcGUgZHJpdmUgYXQgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlCisJICBzcGVlZC4gSWYgdW5zdXJlLCBsZWF2ZSB0aGlzIGRpc2FibGVkLCBpLmUuIGxlYXZlIGl0IGF0IDIwMDAKKwkgIGJpdHMvc2VjLgorCitjb25maWcgRlRfQUxQSEFfQ0xPQ0sKKwlpbnQgIkNQVSBjbG9jayBmcmVxdWVuY3kgb2YgeW91ciBERUMgQWxwaGEiIGlmIEFMUEhBCisJZGVwZW5kcyBvbiBGVEFQRQorCWRlZmF1bHQgIjAiCisJaGVscAorCSAgT24gc29tZSBERUMgQWxwaGEgbWFjaGluZXMgdGhlIENQVSBjbG9jayBmcmVxdWVuY3kgY2Fubm90IGJlCisJICBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHksIHNvIHlvdSBuZWVkIHRvIHNwZWNpZnkgaXQgaGVyZSBPTkxZIGlmCisJICBydW5uaW5nIGEgREVDIEFscGhhLCBvdGhlcndpc2UgdGhpcyBzZXR0aW5nIGhhcyBubyBlZmZlY3QuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9mdGFwZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTY3ZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzIEhlaW5lLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisjCisjICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9NYWtlZmlsZSx2ICQKKyMgJFJldmlzaW9uOiAxLjQgJAorIyAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxNzo1NiAkCisjCisjICAgICAgTWFrZWZpbGUgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciBmb3IKKyMgICAgICBMaW51eC4KKyMKKworb2JqLSQoQ09ORklHX0ZUQVBFKQkJKz0gbG93bGV2ZWwvCitvYmotJChDT05GSUdfWkZUQVBFKQkJKz0gemZ0YXBlLworb2JqLSQoQ09ORklHX1pGVF9DT01QUkVTU09SKQkrPSBjb21wcmVzc29yLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL1JFQURNRS5QQ0kgYi9kcml2ZXJzL2NoYXIvZnRhcGUvUkVBRE1FLlBDSQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGRlMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL1JFQURNRS5QQ0kKQEAgLTAsMCArMSw4MSBAQAorU29tZSBub3RlcyBmb3IgZnRhcGUgdXNlcnMgd2l0aCBQQ0kgbW90aGVyYm9hcmRzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgcHJvYmxlbToKKy0tLS0tLS0tLS0tLQorCitUaGVyZSBoYXZlIGJlZW4gc29tZSBwcm9ibGVtIHJlcG9ydHMgZnJvbSBwZW9wbGUgdXNpbmcgUENJLWJ1cyBiYXNlZAorc3lzdGVtcyBnZXR0aW5nIG92ZXJydW4gZXJyb3JzLgorSSB3YXNuJ3QgYWJsZSB0byByZXByb2R1Y2UgdGhlc2UgdW50aWwgSSByYW4gZnRhcGUgb24gYSBJbnRlbCBQbGF0bworKFByZW1pZXJlIFBDSSBJSSkgbW90aGVyYm9hcmQgd2l0aCBiaW9zIHZlcnNpb24gMS4wMC4wOEFYMS4KK0l0IHR1cm5lZCBvdXQgdGhhdCBpZiBHQVQgKEd1YXJhbnRlZWQgQWNjZXNzIFRpbWluZykgaXMgZW5hYmxlZCAoPykKK2Z0YXBlIGdldHMgYSBsb3Qgb2Ygb3ZlcnJ1biBlcnJvcnMuCitUaGUgcHJvYmxlbSBkaXNhcHBlYXJzIHdoZW4gZGlzYWJsaW5nIEdBVCBpbiB0aGUgYmlvcy4KK05vdGUgdGhhdCBJbnRlbCByZW1vdmVkIHRoaXMgc2V0dGluZyAocGVybWFuZW50bHkgZGlzYWJsZWQpIGZyb20gdGhlCisxLjAwLjEwQVgxIGJpb3MgIQorCitJdCBsb29rcyBsaWtlIHRoYXQgaWYgR0FUIGlzIGVuYWJsZWQgdGhlcmUgYXJlIG9mdGVuIGxhcmdlIHBlcmlvZHMKKyhncmVhdGVyIHRoYW4gMTIwIHVzICE/Pykgb24gdGhlIElTQSBidXMgdGhhdCB0aGUgRE1BIGNvbnRyb2xsZXIgY2Fubm90CitzZXJ2aWNlIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyLgorSSBjYW5ub3QgaW1hZ2luZSB0aGlzIGJlaW5nIGFjY2VwdGFibGUgaW4gYSBkZWNlbnQgUENJIGltcGxlbWVudGF0aW9uLgorTWF5YmUgdGhpcyBpcyBhIGBmZWF0dXJlJyBvZiB0aGUgY2hpcHNldC4gSSBjYW4gb25seSBzcGVjdWxhdGUgd2h5CitJbnRlbCBjaG9vc2UgdG8gcmVtb3ZlIHRoZSBvcHRpb24gZnJvbSB0aGUgbGF0ZXN0IEJpb3MuLi4KKworVGhlIGxlc3NvbiBvZiB0aGlzIGFsbCBpcyB0aGF0IHRoZXJlIG1heSBiZSBvdGhlciBtb3RoZXJib2FyZAoraW1wbGVtZW50YXRpb25zIGhhdmluZyB0aGUgc2FtZSBvZiBzaW1pbGFyIHByb2JsZW1zLgorSWYgeW91IGV4cGVyaWVuY2UgYSBsb3Qgb2Ygb3ZlcnJ1biBlcnJvcnMgZHVyaW5nIGEgYmFja3VwIHRvIHRhcGUsCitzZWUgaWYgdGhlcmUgaXMgc29tZSBzZXR0aW5nIGluIHRoZSBCaW9zIHRoYXQgbWF5IGluZmx1ZW5jZSB0aGUKK2J1cyB0aW1pbmcuCisKK0kganVkZ2UgdGhpcyBhIGhhcmR3YXJlIHByb2JsZW0gYW5kIG5vdCBhIGxpbWl0YXRpb24gb2YgZnRhcGUgOy0pCitNeSBET1MgYmFja3VwIHNvZnR3YXJlIHNlZW1zIHRvIGJlIHN1ZmZlcmluZyBmcm9tIHRoZSBzYW1lIHByb2JsZW1zCithbmQgZXZlbiByZWZ1c2VzIHRvIHJ1biBhdCAxIE1icHMgIQorRnRhcGUgd2lsbCByZWR1Y2UgdGhlIGRhdGEtcmF0ZSBmcm9tIDEgTWJwcyB0byA1MDAgS2JwcyBpZiB0aGUgbnVtYmVyCitvZiBvdmVycnVuIGVycm9ycyBvbiBhIHRyYWNrIGV4Y2VlZHMgYSB0aHJlc2hvbGQuCisKKworUG9zc2libGUgc29sdXRpb25zOgorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTb21lIG9mIHRoZSBwcm9ibGVtcyB3ZXJlIHNvbHZlZCBieSB1cGdyYWRpbmcgdGhlIChmbGFzaCkgYmlvcy4KK090aGVyIHN1Z2dlc3QgdGhhdCBpdCBoYXMgdG8gZG8gd2l0aCB0aGUgRkRDIGJlaW5nIG9uIHRoZSBQQ0kKK2J1cywgYnV0IHRoYXQgaXMgbm90IHRoZSBjYXNlIHdpdGggdGhlIEludGVsIFByZW1pZXJlIElJIGJvYXJkcy4KK1tJZiB1cGdyYWRpbmcgdGhlIGJpb3MgZG9lc24ndCBzb2x2ZSB0aGUgcHJvYmxlbSB5b3UgY291bGQgdHJ5CithIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIgb24gdGhlIGlzYS1idXNdLgorCitIZXJlIGlzIGEgbGlzdCBvZiBzeXN0ZW1zIGFuZCByZWNvbW1lbmRlZCBCSU9TIHNldHRpbmdzOgorCisKKyAgICAgICAgSW50ZWwgUHJlbWllcmUgUENJIChSZXZlbmdlKToKKworQmlvcyB2ZXJzaW9uIDEuMDAuMDkuQUYyIGlzIHJlcG9ydGVkIHRvIHdvcmsuCisKKworCisgICAgICAgIEludGVsIFByZW1pZXJlIFBDSSBJSSAoUGxhdG8pOgorCitCaW9zIHZlcnNpb24gMS4wMC4xMC5BWDEgYW5kIHZlcnNpb24gMTEgYmV0YSBhcmUgb2suCitJZiB1c2luZyB2ZXJzaW9uIDEuMDAuMDguQVgxLCBHQVQgbXVzdCBiZSBkaXNhYmxlZCAhCisKKworCisgICAgICAgIEFTVVMgUENJL0ktU1AzRzoKKworUHJlZmVycmVkIHNldHRpbmdzOiAgICAgSVNBLUdBVC1tb2RlIDogZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQS1saW5lYnVmZmVyLW1vZGUgOiBzdGFuZGFyZAorICAgICAgICAgICAgICAgICAgICAgICAgSVNBLW1hc3RlcmJ1ZmZlci1tb2RlIDogc3RhbmRhcmQKKworCisgICAgICAgIERFTEwgRGltZW5zaW9uIFhQUyBQOTAKKworQmlvcyB2ZXJzaW9uIEEyIGlzIHJlcG9ydGVkIHRvIGJlIGJyb2tlbiwgd2hpbGUgYmlvcyB2ZXJzaW9uIEE1IHdvcmtzLgorWW91IGNhbiBnZXQgYSBmbGFzaCBiaW9zIHVwZ3JhZGUgZnJvbSBodHRwOi8vd3d3LmRlbGwuY29tCisKKworVG8gc2VlIGlmIHlvdSdyZSBoYXZpbmcgdGhlIEdBVCBwcm9ibGVtLCB0cnkgbWFraW5nIGEgYmFja3VwCit1bmRlciBET1MuIElmIGl0J3MgdmVyeSBzbG93IGFuZCBvZnRlbiByZXBvc2l0aW9ucyB5b3UncmUKK3Byb2JhYmx5IGhhdmluZyB0aGlzIHByb2JsZW0uCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tLy8tLQorIExvY2FsV29yZHM6ICBmdGFwZSBQQ0kgYmlvcyBHQVQgSVNBIERNQSBjaGlwc2V0IE1icHMgS2JwcyBGREMgaXNhIEFGIG9rIEFTVVMKKyBMb2NhbFdvcmRzOiAgU1AgbGluZWJ1ZmZlciBtYXN0ZXJidWZmZXIgWFBTIGh0dHAgd3d3IGNvbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL1JFTEVBU0UtTk9URVMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvUkVMRUFTRS1OT1RFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc5OWRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL1JFTEVBU0UtTk9URVMKQEAgLTAsMCArMSw5NjYgQEAKK0hleSwgRW1hY3MsIHdlJ3JlIC0qLVRleHQtKi0gbW9kZSEKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wNGQgMjUvMTEvOTcgPT09PT0KKy0gVGhlIGNvcnJlY3QgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnQgZm9yICJlbHNlIGlmIiBpcyAiI2VsaWYiIG5vdAorICAiZWxzaWYiLgorLSBOZWVkIHRvIGNhbGwgemZ0X3Jlc2V0X3Bvc2l0aW9uKCkgd2hlbiBvdmVyd3JpdGluZyBjYXJ0cmlkZ2VzCisgIHByZXZpb3VzbHkgd3JpdHRlbiB3aXRoIGZ0YXBlLTIueCwgc2Z0YXBlLCBvciBhbmNpZW50CisgIChwcmUtZnRhcGUtMy54KSB2ZXJzaW9ucyBvZiB6ZnRhcGUuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDRjIDE2LzExLzk3ID09PT09CistIGZkY19wcm9iZSgpIHdhcyBjYWxsaW5nIERVTVBSRUdTIHdpdGggYSByZXN1bHQgbGVuZ3RoIG9mICIxIiB3aGljaAorICB3YXMganVzdCBmaW5lLiBVbmRvIHByZXZpb3VzIGNoYW5nZS4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wNGIgMTQvMTEvOTcgPT09PT0KKworLSBwYXRjaGVzLzIueC54L2Zsb3BweS5jLmRpZmYgd2FzIHNvbWV3aGF0IGJyb2tlbiwgcmVsZWFzaW5nIGkvbworICByZWdpb25zIGl0IG5ldmVyIGhhZCBhbGxvY2F0ZWQuCistIGZkY19wcm9iZSgpIHdhcyBjYWxsaW5nIERVTVBSRUdTIHdpdGggYSByZXN1bHQgbGVuZ3RoIG9mICIxIiBpbnN0ZWFkCisgIG9mICIxMCIKKy0gV3JpdGluZyBkZWxldGVkIGRhdGEgbWFya3MgaWYgdGhlIGZpcnN0IHNlZ2VudHMgb24gdHJhY2sgemVybyBhcmUKKyAgc2hvdWxkIHdvcmsgbm93LgorLSBmdGZvcm1hdCBzaG91bGQgbm93IGJlIGFibGUgdG8gaGFuZGxlIHRob3NlIGNhc2VzIHdoZXJlIHRoZSB0YXBlCisgIGRyaXZlIHNldHMgdGhlIHJlYWQgb25seSBzdGF0dXMgYml0IChRSUMtNDAvODAgY2FydHJpZGdlcyB3aXRoCisgIFFJQy0zMDEwLzMwMjAgdGFwZSBkcml2ZXMpIGJlY2F1c2UgdGhlIGhlYWRlciBzZWdtZW50IGlzIGRhbWFnZWQuCistIHRoZSBNVElPQ0ZUQ01EIGlvY3RsIG1heSBub3cgYmUgaXNzdWVkIGJ5IHRoZSBzdXBlcnVzZXIgT05MWS4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wNGEgMTIvMTEvOTcgPT09PT0KKy0gRml4IGFuICJpbmZpbml0ZSBsb29wIGNhbid0IGJlIGtpbGxlZCBieSBzaWduYWwiIGJ1ZyBpbgorICBmdGFwZV9nZXRfZHJpdmVfc3RhdHVzKCkuIE9ubHkgcmVsZXZhbnQgd2hlbiB0cnlpbmcgdG8gYWNjZXNzCisgIGJ1Z2d5L21pc2NvbmZpZ3VyZWQgaGFyZHdhcmUKKy0gVHJ5IHRvIGNvbXBlbnNhdGUgYSBidWcgaW4gdGhlIEhQIENvbG9yYWRvIFQzMDAwJ3MgZmlybXdhcmU6IGl0CisgIGRvZXNuJ3Qgc2V0IHRoZSB3cml0ZSBwcm90ZWN0IGJpdCBmb3IgUUlDODAvUUlDNDAgY2FydHJpZGdlcy4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wNCAwNi8xMS85NyA9PT09PQorLSBJZiBwb3NpdGlvbmluZyB3aXRoIGZhc3Qgc2Vla2luZyBmYWlscyBmYWxsIGJhY2sgdG8gYSBzbG93IHNlZWsKKyAgYmVmb3JlIGdpdmluZyB1cC4KKy0gKG5lYXJseSkgbm8gcmV0cmllcyBvbiAibm8gZGF0YSBlcnJvcnMiIHdoZW4gdmVyaWZ5aW5nIGFmdGVyCisgIGZvcm1hdHRpbmcuIEltcHJvdmVkIHR1bmluZyBvZiB0aGUgYmFkIHNlY3RvciBtYXAgYWZ0ZXIgZm9ybWF0dGluZy4KKy0gdGhlIGRpcmVjdG9yeSBsYXlvdXQgaGFzIGNoYW5nZWQgYWdhaW4gdG8gYWxsb3cgZm9yIGVhc2llciBrZXJuZWwKKyAgaW50ZWdyYXRpb24KKy0gTW9kdWxlIHBhcmFtZXRlciAiZnRhcGVfdHJhY2luZyIgbm93IGlzIGNhbGxlZCAiZnRfdHJhY2luZyIgYmVjYXVzZQorICB0aGUgImZ0YXBlX3RyYWNpbmciIHZhcmlhYmxlIGhhcyB0aGUgdmVyc2lvbiBjaGVja3N1bSBhdHRhY2hlZCB0byBpdC4KKy0gYC9wcm9jL2Z0YXBlJyBpbnRlcmZhY2UgZm9yIDIuMC4qIGtlcm5lbHMuIGAvcHJvYy9mdGFwZScgbm8gbG9uZ2VyCisgIGlzIGEgZGlyZWN0b3J5IGJ1dCBhIGZpbGUgdGhhdCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGZvcm1lcmx5CisgIHByb3ZpZGVkIGluIHNlcGFyYXRlIGZpbGVzIHVuZGVyIHRoZSBgL3Byb2MvZnRhcGUvJyBkaXJlY3RvcnkuCistIE1vc3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBoYXZlIGJlZW4gcHJlZml4ZWQgYnkgIkNPTkZJR19GVF8iCisgIGluIHByZXBhcmF0aW9uIG9mIHRoZSBrZXJuZWwgaW5jbHVzaW9uLiBUaGUgTWFrZWZpbGVzIHVuZGVyCisgICIuL2Z0YXBlLyIgc2hvdWxkIGJlIGRpcmVjdGx5IHVzYWJsZSBieSB0aGUga2VybmVsLgorLSBUaGUgTU9EVkVSU0lPTlMgc3R1ZmYgaXMgbm93IGF1dG8tZGV0ZWN0ZWQuCistIEJyb2tlIGJhY2tzbGFzaGVkIG11bHRpIGxpbmUgb3B0aW9ucyBpbiBNQ09ORklHIGludG8gc2VwYXJhdGUgbGluZXMKKyAgdXNpbmcgR05VLW1ha2UncyAiKz0iIGZlYXR1cmUuCistIFRoZSBodG1sIGFuZCBkdmkgdmVyc2lvbiBvZiB0aGUgbWFudWFsIGlzIG5vdyBpbnN0YWxsZWQgdW5kZXIKKyAgJy91c3IvZG9jL2Z0YXBlYCB3aXRoICdtYWtlIGluc3RhbGxgCistIE5ldyBTTVAgZGVmaW5lIGluIE1DT05GSUcuIGZ0YXBlIHdvcmtzIHdpdGggU01QIGlmIHRoaXMgaXMgZGVmaW5lZC4KKy0gYXR0ZW1wdCB0byBjb3BlIHdpdGggImV4Y2Vzc2l2ZSBvdmVycnVuIGVycm9ycyIgYnkgZ3JhZHVhbGx5CisgIGluY3JlYXNpbmcgRkRDIEZJRk8gdGhyZXNob2xkLiBCdXQgdGhpcyBkb2Vzbid0IHNlZW0gdG8gaGF2ZSB0b28KKyAgbXVjaCBhbiBlZmZlY3QuCistIE5ldyBsb2FkIHRpbWUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgImZ0X2ZkY19yYXRlX2xpbWl0Ii4gSWYgeW91CisgIGVuY291bnRlciB0b28gbWFueSBvdmVycnVuIGVycm9ycyB3aXRoIGEgMk1iIGNvbnRyb2xsZXIgdGhlbiB5b3UKKyAgbWlnaHQgd2FudCB0byBzZXQgdGhpcyB0byAxMDAwLgorLSBvdmVycnVuIGVycm9ycyBvbiB0aGUgbGFzdCBzZWN0b3IgaW4gYSBzZWdtZW50IHNvbWV0aW1lcyByZXN1bHQgaW4KKyAgYSB6ZXJvIERNQSByZXNpZHVlLiBEdW5ubyB3aHksIGJ1dCBjb21wZW5zYXRlIGZvciBpdC4KKy0gdGhlcmUgd2VyZSBzdGlsbCBmZGNfcmVhZCgpIHRpbWVvdXQgZXJyb3JzLiBJIHRoaW5rIEkgaGF2ZSBmaXhlZCBpdAorICBub3csIHBsZWFzZSBGSVhNRS4KKy0gU29tZXRpbWVzIGZ0YXBlX3dyaXRlKCkgZmFpbGVkIHRvIHJlLXN0YXJ0IHRoZSB0YXBlIGRyaXZlIHdoZW4gYQorICBzZWdtZW50IHdpdGhvdXQgYSBnb29kIHNlY3RvciB3YXMgcmVhY2hlZCAoIndhaXQgZm9yIGVtcHR5IHNlZ21lbnQKKyAgZmFpbGVkIikuIFRoaXMgaXMgZml4ZWQuIEVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciA+IFFJQy0zMDEwLgorLSBzZnRhcGUgKGFrYSBmdGFwZS0yLngpIGhhcyB2YW5pc2hlZC4gSSBkaWRuJ3Qgd29yayBvbiBpdCBmb3IKKyAgYWdlcy4gSXQgaXMgcHJvYmFibHkgc3RpbGwgcG9zc2libGUgdG8gdXNlIHRoZSBvbGQgY29kZSB3aXRoCisgIGZ0YXBlLTMuMDQsIGlmIG9uZSByZWFsbHkgbmVlZHMgaXQgKEJVVCBSRUNPTVBJTEUgSVQpCistIHpmdGFwZSBubyBsb25nZXIgYWx0ZXJzIHRoZSBjb250ZW50cyBvZiBhbHJlYWR5IGV4aXN0aW5nIHZvbHVtZQorICB0YWJsZSBlbnRyaWVzLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byBmaWxsIGluIG1pc3NpbmcgZmllbGRzLAorICBsaWtlIHRpbWUgc3RhbXBzIHVzaW5nIHNvbWUgdXNlciBzcGFjZSBwcm9ncmFtLgorLSAuL2NvbnRyaWIvdnRibGMvIGNvbnRhaW5zIHN1Y2ggYSBwcm9ncmFtLgorLSBuZXcgcGVybCBzY3JpcHQgLi9jb250cmliL3NjcmlwdHMvbGlzdHRhcGUgdGhhdCBsaXN0IHRoZSBjb250ZW50cyBvZiBhCisgIGZsb3BweSB0YXBlIGNhcnRyaWRnZSBwYXJzaW5nIHRoZSBvdXRwdXQgb2YgIm10IHZvbGluZm8iICsgIm10IGZzZiIKKy0gdGhlIE1UV0VPRiBpbXBsZW1lbnRhdGlvbiBoYXMgY2hhbmdlZCBhIGxpdHRsZSBiaXQgKGFmdGVyIEkgaGFkIGEKKyAgbG9vayBhdCBhbWFuZGEpLiBDYWxsaW5nIE1UV0VPRiB3aGlsZSB0aGUgdGFwZSBpcyBzdGlsbCBoZWxkIG9wZW4KKyAgYWZ0ZXIgd3JpdGluZyBzb21ldGhpbmcgdG8gdGhlIHRhcGUgbm93IHdpbGwgdGVybWluYXRlIHRoZSBjdXJyZW50CisgIHZvbHVtZSwgYW5kIHN0YXJ0IGEgbmV3IG9uZSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKy0gdGhlIHZvbHVtZSB0YWJsZSBtYWludGFpbmVkIGJ5IHpmdGFwZSBub3cgaXMgYSBkb3VibHkgbGlua2VkIGxpc3QKKyAgdGhhdCBncm93cyBkeW5hbWljYWxseSBhcyBuZWVkZWQuCisKKyAgZm9ybWF0dGluZyBmbG9wcHkgdGFwZSBjYXJ0cmlkZ2VzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAqIHRoZXJlIGlzIGEgbmV3IHVzZXIgc3BhY2UgZm9ybWF0dGluZyBwcm9ncmFtIHRoYXQgZG9lcyBtb3N0IG9mIHRoZQorICAgIGRpcnR5IHdvcmsgaW4gdXNlciBzcGFjZSAoYXV0by1kZXRlY3QsIGNvbXB1dGluZyB0aGUgc2VjdG9yCisgICAgY29vcmRpbmF0ZXMsIGFkanVzdGluZyB0aW1lIHN0YW1wcyBhbmQgc3RhdGlzdGljcykuIEl0IGhhcyBhCisgICAgc2ltcGxlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UuCisgICogZnRhcGUtZm9ybWF0Lm8gaGFzIHZhbmlzaGVkLCBpdCBoYXMgYmVlbiBmb2xkZWQgaW50byB0aGUgbG93IGxldmVsCisgICAgZnRhcGUubyBtb2R1bGUsIGFuZCB0aGUgaW9jdGwgaW50ZXJmYWNlIGludG8gemZ0YXBlLm8uIE1vc3Qgb2YgdGhlCisgICAgY29tcGxpY2F0ZWQgc3R1ZmYgaGFzIGJlZW4gbW92ZWQgdG8gdXNlciBzcGFjZSwgc28gdGhlcmUgd2FzIG5vCisgICAgbmVlZCBmb3IgYSBzZXBhcmF0ZSBtb2R1bGUgYW55bW9yZS4KKyAgKiB0aGVyZSBpcyBhIG5ldyBpb2N0bCBNVElPQ0ZUQ01EIHRoYXQgc2VuZHMgYSBiYXJlIFFJQy0xMTcgY29tbWFuZAorICAgIHRvIHRoZSB0YXBlIGRyaXZlLgorICAqIHRoZXJlIGlzIGEgbmV3IG1tYXAoKSBmZWF0dXJlIHRvIG1hcCB0aGUgZG1hIGJ1ZmZlcnMgaW50byB1c2VyCisgICAgc3BhY2UgdG8gYmUgdXNlZCBieSB0aGUgdXNlciBsZXZlbCBmb3JtYXR0aW5nIHByb2dyYW0uCisgICogRm9ybWF0dGluZyBvZiB5ZXQgdW5mb3JtYXR0ZWQgb3IgdG90YWxseSBkZWdhdXNzZWQgY2FydHJpZGdlcworICAgIHNob3VsZCBiZSBwb3NzaWJsZSBub3cuIEZJWE1FLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAzYiwgPGZvcmdvdCB0aGUgZXhhY3QgZGF0ZT4gPT09PQorCitmdGFwZS0zLjAzYiB3YXMgcmVsZWFzZWQgYXMgYSBiZXRhIHJlbGVhc2Ugb25seS4gSXRzIG1haW4gbmV3IGZlYXR1cmUKK3dhcyBzdXBwb3J0IG9mIHRoZSBESVRUTy0yR0IgZHJpdmUuIFRoaXMgd2FzIG1hZGUgcG9zc2libGUgYnkgcmV2ZXJzZQorZW5naW5lZXJpbmcgZG9uZSBieSA8ZmlsbCBpbiBoaXMgbmFtZT4gYWZ0ZXIgSW9tZWdhIGZhaWxlZCB0byBzdXBwb3J0CitmdGFwZS4gQWx0aG91Z2ggdGhleSBoYWQgcHJvbWlzZWQgdG8gZG8gc28gKHRoaXMgbWFrZXMgbWUgZmVlbCBhIGJpdAorc2FkIGFuZCB1bmNvbWZvcnRhYmxlIGFib3V0IElvbWVnYSkuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDNhLCAyMi8wNS85NyA9PT09CisKKy0gRmluYWxseSBmaXhlZCBhdXRvLXVuLWxvYWRpbmcgb2YgbW9kdWxlcyBmb3Iga2VybmVscyA+IDIuMS4xOAorLSBBZGQgYW4gInVuaW5zdGFsbCIgdGFyZ2V0IHRvIHRoZSBNYWtlZmlsZQorLSByZW1vdmVkIHRoZSBrZHRpbWUgaGFjaworLSB0ZXhpMnd3dyBkaWRuJ3QgcHJvcGVybHkgc2V0IHRoZSBiYWNrLXJlZmVyZW5jZSBmcm9tIGEgZm9vdG5vdGUgYmFjaworICB0byB0aGUgcmVndWxhciB0ZXh0LgorCisgIHpmdGFwZSBzcGVjaWZpYworICAtLS0tLS0tLS0tLS0tLS0KKyAgKiBoaWRlIHRoZSBvbGQgY29tcHJlc3Npb24gbWFwIHZvbHVtZS4gVGFwZXIgZG9lc24ndCBhY2NlcHQgdGhlCisgICAgcHJlc2VuY2Ugb2Ygbm9uLVRhcGVyIHZvbHVtZXMgYW5kIFRhcGVyLXdyaXR0ZW4gdm9sdW1lIG9uIHRoZSBzYW1lCisgICAgdGFwZS4KKyAgKiBFT0QgKEVuZCBPZiBEYXRhKSBoYW5kbGluZyB3YXMgc3RpbGwgYnJva2VuOiB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IKKyAgICBpcyB0byByZXR1cm4gYSB6ZXJvIGJ5dGUgY291bnQgYXQgdGhlIGZpcnN0IGF0dGVtcHQgdG8gcmVhZCBwYXN0CisgICAgRU9ELCByZXR1cm4gYSB6ZXJvIGJ5dGUgY291bnQgYXQgdGhlIHNlY29uZCBhdHRlbXB0IHRvIHJlYWQgcGFzdAorICAgIEVPRCBhbmQgVEhFTiByZXR1cm4gLUVJTy4KKyAgCisgIGZ0YXBlLWZvcm1hdCBzcGVjaWZpYworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiBEZXRlY3Rpb24gb2YgUUlDLTQwIGNhcnRyaWRnZXMgaW4gc2VsZWN0X3RhcGVfZm9ybWF0KCkgd2FzIGJyb2tlbgorICAgIGFuZCBtYWRlIGl0IGltcG9zc2libGUgdG8gZm9ybWF0IFFJQy0zMDEwLzMwMjAgY2FydHJpZGdlcy4KKyAgKiBUaGVyZSBhcmUgc3RyYW5nZSAiVFItMSBFeHRyYSIgY2FydHJpZGdlcyBvdXQgdGhlcmUgd2hpY2ggd2VyZW4ndAorICAgIGRldGVjdGVkIHByb3Blcmx5IGJlY2F1c2UgdGhlIGRvbid0IHN0cmljdGx5IGNvbmZvcm0gdG8gdGhlCisgICAgUUlDLTgwLCBSZXYuIE4sIHNwZWMuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDMsIDMwLzA0Lzk3ID09PT09CisKKy0gUmVtb3ZlZCBrZXJuZWwgaW50ZWdyYXRpb24gY29kZSBmcm9tIHRoZSBwYWNrYWdlLiBJIHBsYW4gdG8gcHJvdmlkZQorICBhIHBhY2thZ2UgdGhhdCBjYW4gYmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBzdG9jayBrZXJuZWwgc2VwYXJhdGVseQorICAoaG9wZWZ1bGx5IHNvb24pLgorICBBcyBhIHJlc3VsdCwgYSBzaW1wbGUgYG1ha2UnIGNvbW1hbmQgbm93IHdpbGwgYnVpbGQgZXZlcnl0aGluZy4KKy0gQUxMIGNvbXBpbGUgdGltZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBmaWxlCisgIGBNQ09ORklHJy4KKy0gUXVpdGUgYSBmZXcgYGxvdyBsZXZlbCcgY2hhbmdlcyB0byBhbGxvdyBmb3JtYXR0aW5nIG9mIGNhcnRyaWRnZXMuCistIGZvcm1hdHRpbmcgaXMgaW1wbGVtZW50ZWQgYXMgYSBzZXBhcmF0ZSBtb2R1bGUgYGZ0YXBlLWZvcm1hdC5vJy4gVGhlCisgIG1vZGlmaWVkIGBtdCcgcHJvZ3JhbSBjb250YWlucyBzYW1wbGUgY29kZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgaXQuCistIFRoZSBWRlMgaW50ZXJmYWNlIGhhcyBiZWVuIG1vdmVkIGZyb20gdGhlIGBmdGFwZS5vJyBtb2R1bGUgdG8gdGhlCisgIGhpZ2ggbGV2ZWwgbW9kdWxlcyBgemZ0YXBlLm8nIHJlc3AuIGBzZnRhcGUubycuIGBmdGFwZS5vJyBjb250YWlucworICB0aGUgaGFyZHdhcmUgc3VwcG9ydCBvbmx5LgorLSBBIGJpdCBvZiAvcHJvYyBzdXBwb3J0IGZvciBrZXJuZWxzID4gMi4xLjI4CistIE1vdmVkIGRvY3VtZW50YXRpb24gdG8gRG9jIHN1YmRpci4gSU5TVEFMTCBub3cgY29udGFpbnMgc29tZSByZWFsCisgIGluc3RhbGxhdGlvbiBub3Rlcy4KKy0gYGluc3RhbGwnIHRhcmdldCBpbiBNYWtlZmlsZS4KKworemZ0YXBlIHNwZWNpZmljOgorLS0tLS0tLS0tLS0tLS0tLQorCistIHpmdGFwZSB3b3JrcyBmb3IgbGFyZ2UgY2FydHJpZGdlcyBub3cgKCA+IDJeMzEgYnl0ZXMpCistIE1USU9DVk9MSU5GTyBhbmQgTVRJT0NHRVRTSVpFIG5vdyByZXR1cm4gdGhlIHNpemUgaW4gS0lMT0JZVEVTLAorICBOTyBMT05HRVIgaW4gYnl0ZXMuCisKKy0gcGVybWlzc2lvbnMgZm9yIHdyaXRlIGFjY2VzcyB0byBhIGNhcnRyaWRnZSBoYXZlIGNoYW5nZWQ6CisgICogemZ0YXBlIG5vdyBhbHNvIHRha2VzIHRoZSBmaWxlIGFjY2VzcyBtb2RlIGludG8gYWNjb3VudAorICAqIHpmdGFwZSBubyBsb25nZXIgYWxsb3dzIHdyaXRpbmcgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmVjb3JkZWQKKyAgICBtZWRpYS4gVGhlIHRhcGUgaGFzIHRvIGJlIHBvc2l0aW9uZWQgYXQgQk9UIG9yIEVPRCBmb3Igd3JpdGUKKyAgICBhY2Nlc3MuCisKKy0gTVRCU0YgaGFzIGNoYW5nZWQuIEl0IHVzZWQgdG8gcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgcHJldmlvdXMgZmlsZSB3aGVuIGNhbGxlZCB3aXRoIGNvdW50IDEuIFRoaXMgd2FzIGRpZmZlcmVudCBmcm9tIHRoZQorICBleHBlY3RlZCBiZWhhdmlvciBmb3Igb3RoZXIgVW4qeCB0YXBlIGRyaXZlcnMgKGkuZS4gU0NTSSkuIE1UQlNGCisgIHdpdGggY291bnQgMSBzaG91bGQgbWVyZWx5IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQKKyAgdm9sdW1lLiBGaXhlZC4gQXMgYSByZXN1bHQsIGB0YXIgLS12ZXJpZnknIG5vdyBwcm9kdWNlcyB0aGUgZGVzaXJlZAorICByZXN1bHQ6IGl0IHZlcmlmaWVzIHRoZSBsYXN0IHdyaXR0ZW4gdm9sdW1lLCBub3QgdGhlIHByZS1sYXN0CisgIHdyaXR0ZW4gdm9sdW1lLgorCistIFRoZSBjb21wcmVzc2lvbiBtYXAgaGFzIHZhbmlzaGVkIC0tPiBubyBuZWVkIGZvciBgbXQgZXJhc2UnIGFueQorICBtb3JlLiBGYXN0IHNlZWtpbmcgaW4gYSBjb21wcmVzc2VkIHZvbHVtZSBpcyBzdGlsbCBiZSBwb3NzaWJsZSwgYnV0CisgIHRha2VzIHNsaWdodGx5IGxvbmdlci4gQXMgYSBzaWRlIGVmZmVjdCwgeW91IG1heSBleHBlcmllbmNlIGFuCisgIGFkZGl0aW9uYWwgdm9sdW1lIHNob3dpbmcgdXAgaW4gZnJvbnQgb2YgYWxsIG90aGVycyBmb3Igb2xkCisgIGNhcnRyaWRnZXMuIFRoaXMgaXMgdGhlIHRhcGUgdm9sdW1lIHRoYXQgaG9sZHMgdGhlIGNvbXByZXNzaW9uIG1hcC4KKworLSBUaGUgY29tcHJlc3Npb24gc3VwcG9ydCBmb3IgemZ0YXBlIGhhcyBiZWVuIG1vdmVkIHRvIGEgc2VwYXJhdGUKKyAgbW9kdWxlIGB6ZnQtY29tcHJlc3NvcicuIERPTidUIGZvcmdldCB0byBsb2FkIGl0IGJlZm9yZSB0cnlpbmcgdG8KKyAgcmVhZCBiYWNrIGNvbXByZXNzZWQgdm9sdW1lcy4gVGhlIHN0b2NrIGB6ZnRhcGUubycgbW9kdWxlIHByb2JlcyBmb3IKKyAgdGhlIG1vZHVsZSBgemZ0LWNvbXByZXNzb3InIHVzaW5nIHRoZSBrZXJuZWxkIG1lc3NhZ2UgY2hhbm5lbDsgeW91CisgIGhhdmUgdG8gaW5zdGFsbCBgemZ0LWNvbXByZXNzb3IubycgaW4gYSBwbGFjZSB3aGVyZSBtb2Rwcm9iZSBjYW4KKyAgZmluZCBpdCBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcy4KKworLSBOZXcgZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCB0cmllcyB0byBnZXQgdGhlIGJyb2tlbiBkb3duIEdNVCB0aW1lCisgIGZyb20gdXNlciBzcGFjZSB2aWEgYSBrZXJuZWwgZGFlbW9uIG1lc3NhZ2UgY2hhbm5lbC4gWW91IG5lZWQgdG8KKyAgY29tcGlsZSBhbmQgc3RhcnQgdGhlIGBrZHRpbWUnIGRhZW1vbiBjb250YWluZWQgaW4gdGhlIGNvbnRyaWIKKyAgZGlyZWN0b3J5IHRvIHVzZSBpdC4gTmVlZGVkICg/KSBmb3IgdGltZSBzdGFtcHMgaW4gdGhlIGhlYWRlcgorICBzZWdtZW50cyBhbmQgdGhlIHZvbHVtZSB0YWJsZS4KKworLSB2YXJpYWJsZSBibG9jayBzaXplIG1vZGUgdmlhIE1UU0VUQkxLIDAKKworLSBrZWVwIG1vZHVsZXMgbG9ja2VkIGluIG1lbW9yeSBhZnRlciB0aGUgYmxvY2sgc2l6ZSBoYXMgYmVlbiBjaGFuZ2VkCisKK3NmdGFwZSBzcGVjaWZpYzoKKy0tLS0tLS0tLS0tLS0tLS0KKworLSBlbmQgb2YgdGFwZSBoYW5kbGluZyBzaG91bGQgYmUgZml4ZWQsIGkuZS4gbXVsdGkgdm9sdW1lIGFyY2hpdmVzCisgIHdyaXR0ZW4gd2l0aCBgYWZpbycgY2FuIGJlIHJlYWQgYmFjayBub3cuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wMmEsIDA5LzAxLzk3ID09PT09CisKK05vIGJpZyBuZXdzOgorLSBjYWxsIHpmdF9pbml0KCkgcmVzcC4gc2Z0X2luaXQoKSB3aGVuIGNvbXBpbGluZyB0aGUgZW50aXJlIHN0dWZmCisgIGludG8gdGhlIGtlcm5lbCBpbWFnZS4KKy0gZml4IGJ1ZyBpbiBmdGFwZS1zZXR1cC5jIHdoZW4gTk9fVFJBQ0VfQVRfQUxMIHdhcyBkZWZpbmVkLgorLSBmaXggYnVnIGluIHNmdGFwZS1lb2YuYy96ZnRhcGUtZW9mLmMgZm9yIG9sZCBrZXJuZWxzICgxLjIuKikKKy0gYWRkIHN1cHBvcnQgZm9yIG5ldyBtb2R1bGUgaW50ZXJmYWNlIGZvciByZWNlbnQga2VybmVscworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0zLjAyLCAxNi8xMi85NiA9PT09PQorLSBGaXhlZCB0aGUgYEZEQyB1bmxvY2sgY29tbWFuZCBmYWlsZWQnIGJ1ZyBpbiBmZGMtaW8uYy4gV2hlbiB0aGUgRklGTworICB3YXMgYWxyZWFkeSBsb2NrZWQgd2hlbiBmdGFwZSB3YXMgbG9hZGVkLCBmdGFwZSBmYWlsZWQgdG8gdW5sb2NrIGl0LgorLSBGaXhlZCBjb21waWxhdGlvbiBvZiBgY29udHJpYi9nbnVtdCcuIEl0IG5vdyBmaW5kcyBgbXRpby5oJyBldmVuIGlmCisgIGZ0YXBlIGlzIE5PVCBpbmNsdWRlZCBpbnRvIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuCistIGZjLTEwLmM6IGluY2x1ZGUgPGFzbS9pby5oPiBmb3IgaW5iKCkgYW5kIG91dGIoKS4KKy0gZnRhcGUvc2Z0YXBlL3pmdGFwZTogYWxsIGdsb2JhbCB2YXJpYWJsZSBub3cgaGF2ZSBlaXRoZXIgYSBgZnRhcGVfJywKKyAgYSBgZnRfJywgYHNmdF8nLCBgemZ0Xycgb3IgYHFpY18nIHByZWZpeCB0byBwcmV2ZW50IG5hbWUgY2xhc2hlcworICB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgd2hlbiBpbmNsdWRpbmcgZnRhcGUgaW50byB0aGUga2VybmVsCisgIHNvdXJjZSB0cmVlLgorLSBLZXJuZWxkIHN1cHBvcnQgaGFzIGNoYW5nZWQuIGBmdGFwZScgbm93IHNlYXJjaGVzIGZvciBhIG1vZHVsZQorICBgZnRhcGUtZnJvbnRlbmQnIHdoZW4gbm9uZSBvZiB0aGUgZnJvbnRlbmQgKGBzZnRhcGUnIG9yIGB6ZnRhcGUnKSBpcworICBsb2FkZWQuIFBsZWFzZSByZWZlciB0byB0aGUgYEluc3RhbGxhdGlvbi9Mb2FkaW5nIGZ0YXBlJyBzZWN0aW9uIG9mCisgIHRoZSBUZVhpbmZvIG1hbnVhbC4KKy0gQWRkIGxvYWQgcmVzcC4gYm9vdC10aW1lIGNvbmZpZ3VyYXRpb24gb2YgZnRhcGUuIFRoZXJlIGFyZSBub3cKKyAgdmFyaWFibGVzIGZ0X2ZkY19iYXNlLCBmdF9mZGNfZG1hIGFuZCBmdF9mZGNfaXJxIGNvcnJlc3BvbmRpbmcgdG8KKyAgdGhlIGZvcm1lciBGRENfQkFTRSBldGMuIGNvbXBpbGUgdGltZSBkZWZpbml0aW9ucy4gT25lIGNhbiBhbHNvIHVzZQorICB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGlmIGl0IGlzCisgIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbC4gQWxzbywgdGhlIEZDLTEwL0ZDLTIwIHN1cHBvcnQgaXMgbG9hZC10aW1lCisgIGNvbmZpZ3VyYWJsZSBub3cgYXMgd2VsbCBhcyB0aGUgTUFDSC1JSSBoYWNrIChmdF9wcm9iZV9mYzEwLAorICByZXNwLiBmdF9tYWNoMikuIFBsZWFzZSByZWZlciB0byB0aGUgc2VjdGlvbiBgSW5zdGFsbGF0aW9uL0NvbmZpZ3VyZQorICBmdGFwZScgb2YgdGhlIFRlWGluZm8gbWFudWFsLgorLSBJIHJlbW92ZWQgdGhlIE1PRFZFUlNJT05TIG9wdGlvbiBmcm9tIGBNYWtlZmlsZS5tb2R1bGUnLiBMZXQgbWUgYWxvbmUKKyAgd2l0aCBmdGFwZSBhbmQgTU9EVkVSU0lPTlMgdW5sZXNzIHlvdSBpbmNsdWRlIHRoZSBmdGFwZSBzb3VyY2VzIGludG8KKyAgdGhlIGtlcm5lbCBzb3VyY2UgdHJlZS4KKy0gbmV3IHZlbmRvcnMgaW4gYHZlbmRvcnMuaCc6CisgICogSFAgQ29sb3JhZG8gVDMwMDAgCisgICogQ29tQnl0ZSBEb3VibGVQbGF5IChpbmNsdWRpbmcgYSBidWcgZml4IGZvciB0aGVpciBicm9rZW4KKyAgICBmb3JtYXR0aW5nIHNvZnR3YXJlLCB0aGFua3MgdG8gd2hyYXZlbkBuamFja24uY29tKQorICAqIElvbWVnYSBESVRUTyAyR0lHLiBOT1RFOiB0aGlzIGRyaXZlIGNhbm5vdCB3b3JrIHdpdGggZnRhcGUgYmVjYXVzZQorICAgIHRoZSBsb2dpY2FsIGRhdGEgbGF5b3V0IG9mIHRoZSBjYXJ0cmlkZ2VzIHVzZWQgYnkgdGhpcyBkcml2ZSBkb2VzCisgICAgTk9UIGNvbmZvcm0gdG8gdGhlIFFJQyBzdGFuZGFyZHMsIGl0IGlzIGEgc3BlY2lhbCBJb21lZ2Egc3BlY2lmaWMKKyAgICBmb3JtYXQuIEkndmUgc2VudCBtYWlsIHRvIElvbWVnYSBidXQgZGlkbid0IHJlY2VpdmUgYW4gYW5zd2VyCisgICAgeWV0LiBJZiB5b3Ugd2FudCB0aGlzIGRyaXZlIHRvIGJlIHN1cHBvcnRlZCBieSBmdGFwZSwgYXNrIElvbWVnYQorICAgIHRvIGdpdmUgbWUgaW5mb3JtYXRpb24gYWJvdXQgaXQuCistIHpmdGFwZToKKyAgKiByZS1pbnRyb2R1Y2VkIHRoZSBNVElPQ19aRlRBUEVfR0VUQkxLU1ogaW9jdGwgZm9yIGNvbXBhdGliaWxpdHkKKyAgICB3aXRoIHpmdGFwZSAxLjA2YSBhbmQgZWFybGllci4gUGxlYXNlIGRvbid0IHVzZSBpdCB3aGVuIHdyaXRpbmcKKyAgICBuZXcgc29mdHdhcmUsIHVzZSB0aGUgTVRJT0NWT0xJTkZPIGlvY3RsIGluc3RlYWQuCisgICogTWFqb3Igb3ZlcmhhdWwgb2YgdGhlIGNvZGUgdGhhdCB1cGRhdGVzIHRoZSBoZWFkZXIgc2VnbWVudHMuIE5ldmVyCisgICAgY2hhbmdlIHRoZSB0YXBlIGxhYmVsIHVubGVzcyBlcmFzaW5nIHRoZSB0YXBlLiBUaHVzIHdlIGFsbW9zdAorICAgIG5ldmVyIG5lZWQgdG8gd3JpdGUgdGhlIGhlYWRlciBzZWdtZW50cywgdW5sZXNzIHdlIHdvdWxkIG1vZGlmeQorICAgIHRoZSBiYWQgc2VjdG9yIG1hcCB3aGljaCBpc24ndCBkb25lIHlldC4gVXBkYXRpbmcgb2Ygdm9sdW1lIHRhYmxlCisgICAgYW5kIGNvbXByZXNzaW9uIG1hcCBtb3JlIHNlY3VyZSBub3cgYWx0aG91Z2ggaXQgdGFrZXMgYSBiaXQKKyAgICBsb25nZXIuCisgICogRml4ZWQgYnVnIHdoZW4gYWJvcnRpbmcgYSB3cml0ZSBvcGVyYXRpb24gd2l0aCBhIHNpZ25hbDogemZ0YXBlCisgICAgbm93IGZpbmlzaGVzIHRoZSBjdXJyZW50IHZvbHVtZSAoaS5lLiB3cml0ZXMgYW4gZW9mIG1hcmtlcikgYXQgdGhlCisgICAgY3VycmVudCBwb3NpdGlvbi4gSXQgZGlkbid0IGJlZm9yZSB3aGljaCBsZWQgdG8gc29tZWhvdyAqc3RyYW5nZSoKKyAgICBiZWhhdmlvciBpbiB0aGlzIGNhc2VzLgorICAqIEtlZXAgbW9kdWxlIGxvY2tlZCBpbiBtZW1vcnkgd2hlbiB1c2luZyBpdCB3aXRoICB0aGUgbm9uLXJld2luZGluZworICAgIGRldmljZXMgYW5kIHRoZSB0YXBlIGlzIG5vdCBsb2dpY2FsIGF0IEJPVC4gTmVlZGVkIGZvciBrZXJuZWxkCisgICAgc3VwcG9ydC4KKy0gc2Z0YXBlOgorICAqIEtlZXAgbW9kdWxlIGxvY2tlZCBpbiBtZW1vcnkgd2hlbiB1c2luZyBpdCB3aXRoICB0aGUgbm9uLXJld2luZGluZworICAgIGRldmljZXMgYW5kIHRoZSB0YXBlIGlzIG5vdCBsb2dpY2FsIGF0IEJPVC4gTmVlZGVkIGZvciBrZXJuZWxkCisgICAgc3VwcG9ydC4KKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMy4wMSwgMTQvMTEvOTYgPT09PT0KKworLSBGaXhlZCBzaWxseSBidWdzIGluIGZ0YXBlLTMuMDA6CisgICogTUFLRURFVi5mdGFwZTogbWFqb3IgZGV2aWNlIG51bWJlciBtdXN0IGJlIDI3LCBub3QgMjMgCisgICogc2Z0YXBlL3NmdGFwZS1yZWFkLmM6IHNmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50cygpIGNhbGxlZCAKKyAgICBpdHNlbGYgcmVjdXJzaXZlbHkgaW5zdGVhZCBvZiBjYWxsaW5nIGZ0YXBlX3JlYWRfaGVhZGVyX3NlZ21lbnQoKQorICAqIHpmdGFwZS9xaWMtdnRibC5oOiBjb252ZXJzaW9uIG9mIGZ0YXBlJ3MgZmlsZSBtYXJrcyB0byB6ZnRhcGUncworICAgIGludGVybmFsIHZvbHVtZSB0YWJsZSB3YXMgYnJva2VuLgorICAqIHBhdGNoZXMvMi54LngvbGludXgtMi4wLjIxLmRpZjogbXkgUkNTIChyZXNwLiBDVlMpIHN5c3RlbSByZXBsYWNlZAorICAgIHRoZSBgJFJldmlzb246JyBldGMuIG1hY3JvcyBpbiB0aGUgYGZ0YXBlLmgnIGNvbmNlcm5pbmcgcGFydCBvZiB0aGUKKyAgICBwYXRjaCA6LSggRml4ZWQuCisgICogaW5mby9mdGFwZS5pbmZvOiBGaXhlZCBtaXNzcGVsbGluZ3MgKGBjcCcgPC0+IGBjcCAtcicgZXRjLikKKyAgKiB3aGVuIGZ0YXBlL3NmdGFwZSBvciBmdGFwZS96ZnRhcGUgd2FzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCB0aGUKKyAgICB2YXJpYWJsZSBmdGFwZV9zdGF0dXMgd2FzIGRlY2xhcmVkIHR3aWNlLiBGaXhlZC4KKyAgKiByZW1vdmVkIHJlZmVyZW5jZSB0byB1bmRlY2xhcmVkIHZhcmlhYmxlIGtlcm5lbF92ZXJzaW9uIHdoZW4gbm90CisgICAgY29tcGlsaW5nIGFzIG1vZHVsZQorICAqIGZpeGVkIGEgYnVnIGludHJvZHVjZWQgYnkgdGhlIHVzZSBvZiBiaXQtZmllbGRzIGZvciBzb21lIGZsYWdzCisgICAgKGkuZS4gd3JpdGVfcHJvdGVjdGVkLCBub19jYXJ0cmlkZ2UsIGZvcm1hdHRlZCkKKyAgKiBmbGFnIGBoZWFkZXJfcmVhZCcgaXMgbm93IHJlc2V0IGNvcnJlY3RseSB0byB6ZXJvIHdoZW4gdGFwZSBpcworICAgIHJlbW92ZWQuCistIGZpeGVkIGEgYnVnIGluIHNmdGFwZS9zZnRhcGUtZW9mLmMgdGhhdCB3YXMgYWxyZWFkeSBpbiB0aGUgb3JpZ2luYWwKKyAgZnRhcGUgY29kZS4gTVRGU0YvQlNGIHdhcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiBwb3NpdGlvbmVkCisgIHJpZ2h0IGJlZm9yZSB0aGUgZmlsZSBtYXJrICh0aGluayBvZiB0YXIpCistIENoYW5nZWQgVFJBQ0UgbWFjcm9zIChmb2xsb3dpbmcgYSBzdWdnZXN0aW9uIG9mIE1hcmNpbiBEYWxlY2tpKSB0byB1c2UKKyAgdGhlIHByZWRlZmluZWQgX19GVU5DVElPTl9fIG1hY3JvIG9mIEdDQy4gU3BhcmVzIGFib3V0IDRrIG9mIGNvZGUuCistIGFkZGVkIG5ldyB2ZW5kb3IgaWQgZm9yIElvbWVnYSBESVRUTyAyR0lHCistIGZpeGVkIGEgYnVnIGFscmVhZHkgcHJlc2VudCBpbiB6ZnRhcGUtMS4wNiB3aGVuIGFib3J0aW5nIGEgd3JpdGUKKyAgd2l0aCBhIHNpZ25hbDogd2Ugbm93IGZpbmlzaCB0aGUgY3VycmVudCB2b2x1bWUgYXQgdGhhdAorICBwb3NpdGlvbi4gSGVhZGVyIHNlZ21lbnRzIHJlbWFpbiBOT1QgdXAgdG8gZGF0ZSB1bnRpbCBhbiBleHBsaWNpdCBjYWxsCisgIHRvIE1UUkVXIG9yIE1UT0ZGTCBpcyBkb25lLiAgCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTMuMDAsIDE0LzEwLzk2ID09PT09CisKKy0gTWVyZ2VkIGZ0YXBlIHdpdGggemZ0YXBlLiBUaGVyZSBhcmUgdGhyZWUgbW9kdWxlcyBub3c6CisgIGZ0YXBlIGZvciB0aGUgaGFyZHdhcmUgc3VwcG9ydCwgc2Z0YXBlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgIG9yaWdpbmFsIGZ0YXBlIGVvZiBtYXJrIHN0dWZmIGFuZCB6ZnRhcGUgdGhhdCBpbXBsZW1lbnRzIHpmdGFwZSdzIHdheQorICBvZiBoYW5kbGluZyB0aGluZ3MgKGNvbXByZXNzaW9uLCB2b2x1bWUgdGFibGUsIHRhcGUgYmxvY2tzIG9mCisgIGNvbnN0YW50IGxlbmd0aCkKKy0gRG9jdW1lbnRhdGlvbiBpbiBUZVhpbmZvIGZvcm1hdCBpbiB0aGUgYGluZm8nIHN1YmRpcmVjdG9yeS4KKy0gTmV3IGlvY3RscyBmb3IgemZ0YXBlLiBTZWUgemZ0YXBlL3pmdGFwZS5oCistIER1bW15IGZvcm1hdHRpbmcgaW9jdGwgZm9yIGZ0YXBlLiBTZWUgZnRhcGUuaAorLSBLZXJuZWwgcGF0Y2ggZmlsZXMgZm9yIHRoZSAyLiouKiBzZXJpZXMgdG8gaW5jbHVkZSBmdGFwZS0zLjAwIGluIHRoZQorICBrZXJuZWwgc291cmNlIHRyZWUuIFRoZXNlIGluY2x1ZGVzIGEga2VybmVsIGNvbXBhdGlibGUgQ29uZmlnLmluCisgIHNjcmlwdCBhbmQgZmFpcmx5IGxhcmdlIG9ubGluZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGtlcm5lbCBjb25maWd1cmUKKyAgc2NyaXB0LgorLSBTdXBwb3J0IGZvciBjb21waWxpbmcgd2l0aCBMaW51eC0xLjIuMTMuIAorLSBNb2RpZmllZCBHTlUgbXQgZnJvbSB0aGVpciBjcGlvIHBhY2thZ2UgdGhhdCBjYW4gaGFuZGxlIHRoZSBuZXcKKyAgaW9jdGxzLgorLSBmdGFwZS9zZnRhcGUvemZ0YXBlIGlzIGtlcm5lbGQgc2F2ZSBub3chCisKK05vdGVzIG9uIHNmdGFwZToKKy0gc2Z0YXBlIGltcGxlbWVudHMgdGhlIGVvZiBoYW5kbGluZyBjb2RlIG9mIHRoZSBvcmlnaW5hbCBmdGFwZS4gSWYKKyAgeW91IGxpa2UgdG8gc3RpY2sgd2l0aCB0aGUgb3JpZ2luYWwgZnRhcGUgc3R1ZmYsIHlvdSBoYXZlIHRvIHVzZQorICB0aGlzIG1vZHVsZSwgbm90IHpmdGFwZS4KKy0gc2Z0YXBlIGlzIGtlcm5lbGQgc2F2ZSwgdW5saWtlIHRoZSBvcmlnaW5hbCBmdGFwZS4KKy0gd2Uga2VlcCB0aGUgZW50aXJlIGhlYWRlciBzZWdtZW50IG5vdyBpbiBtZW1vcnksIHNvIG5vIG5lZWQgdG8gcmVhZAorICBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIGhlYWRlciBzZWdtZW50cy4gQWRkaXRpb25hbCBtZW1vcnkKKyAgY29uc3VtcHRpb246IDI1NiBieXRlcy4gCisKK05vdGVzIGZvciB6ZnRhcGU6CistIHpmdGFwZSBoYXMgc3VwcG9ydCBmb3IgdGFwZXMgd2l0aCBmb3JtYXQgY29kZSA2IG5vdywgd2hpY2ggdXNlIGEKKyAgc2xpZ2h0bHkgZGlmZmVyZW50IHZvbHVtZSB0YWJsZSBmb3JtYXQgY29tcGFyZWQgd2l0aCBvdGhlciBmbG9wcHkKKyAgdGFwZXMuCistIG5ldyBpb2N0bHMgZm9yIHpmdGFwZS4gSGF2ZSBhIGxvb2sgYXQgemZ0YXBlL3pmdGFwZS5oCistIFRoZSBpbnRlcm5hbCB2b2x1bWUgdGFibGUgcmVwcmVzZW50YXRpb24gaGFzIGNoYW5nZWQgZm9yIHpmdGFwZS4gT2xkCisgIGNhcnRyaWRnZXMgYXJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5LgorLSB6ZnRhcGUgbm8gbG9uZ2VyIHVzZXMgY29tcHJlc3Npb24gbWFwIHNlZ21lbnRzLCB3aGljaCBoYXZlIHZhbmlzaGVkCisgIGZyb20gdGhlIFFJQyBzcGVjcywgYnV0IGNyZWF0ZXMgdm9sdW1lIHRhYmxlIGVudHJ5IHRoYXQgcmVzZXJ2ZXMKKyAgZW5vdWdoIHNwYWNlIGZvciB0aGUgY29tcHJlc3Npb24gbWFwLiAKKy0gemZ0YXBlIGlzIGtlcm5lbGQgc2F2ZSBub3cuCistIHdlIGtlZXAgdGhlIGVudGlyZSBoZWFkZXIgc2VnbWVudCBub3cgaW4gbWVtb3J5LCBzbyBubyBuZWVkIHRvIHJlYWQKKyAgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBoZWFkZXIgc2VnbWVudHMuIEFkZGl0aW9uYWwgbWVtb3J5CisgIGNvbnN1bXB0aW9uOiAyNTYgYnl0ZXMuIAorCitOb3RlcyBmb3IgY29udHJpYi9nbnVtdDoKKy0gbW9kaWZpZWQgbXQgZnJvbSB0aGUgR05VIGNwaW8gcGFja2FnZSB0aGF0IHN1cHBvcnRzIGFsbCB0aGUgbmV3CisgIGlvY3RscyBvZiB6ZnRhcGUuCitOb3RlcyBmb3IgY29udHJpYi9zd2Fwb3V0OgorLSBUaGlzIGNvbnRhaW5zIHRoZSBzd2Fwb3V0LmMgcHJvZ3JhbSB0aGF0IHdhcyB3cml0dGVuIGJ5IEthaQorICBIYXJyZWtpbGRlLVBlZGVyc29uLiBJIHNpbXBseSBhZGRlZCBhIE1ha2VmaWxlLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjEwLCAxNC8xMC85NiA9PT09PQorCitUaGUgZnRhcGUgbWFpbnRhaW5lciBoYXMgY2hhbmdlZC4gCitLYWkgSGFycmVraWxkZS1QZXRlcnNlbiA8a2hwQGRvbHBoaW5pY3Mubm8+CitoYXMgcmVzaWduZWQgZnJvbSBtYWludGFpbmluZyBmdGFwZSwgYW5kIEksCitDbGF1cy1KdXN0dXMgSGVpbmUgPGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZT4sCitoYXZlIHRha2VuIG92ZXIuCisKKy0gQWRkZWQgc3VwcG9ydCBmb3IgdGFwZXMgd2l0aCBgZm9ybWF0IGNvZGUgNicsIGkuZS4gUUlDLTMwMjAgdGFwZXMKKyAgd2l0aCBtb3JlIHRoYW4gMl4xNiBzZWdtZW50cy4KKy0gbWVyZ2VkIGNoYW5nZXMgbWFkZSBieSBCYXMgTGFhcmhvdmVuIHdpdGggZnRhcGUtMi4wOS4gUmVmZXIKKyAgdG8gaGlzIHJlbGVhc2Ugbm90ZXMgYmVsb3cuIEkndmUgaW5jbHVkZWQgdGhlbSBpbnRvIHRoaXMKKyAgZmlsZSB1bmNoYW5nZWQgZm9yIHlvdXIgcmVmZXJlbmNlLgorLSBkaXNhYmxlZCBjYWxsIHN0YWNrIGJhY2sgdHJhY2UgZm9yIG5vdy4gVGhpcyBuZXcgZmVhdHVyZQorICBpbnRyb2R1Y2VkIGJ5IHRoZSBpbnRlcmltIHJlbGVhc2UgMi4wLnggc3RpbGwgc2VlbXMgdG8KKyAgYmUgYnVnZ3kuCistIFRyaWVkIHRvIG1pbmltaXplIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGZ0YXBlIHZlcnNpb24KKyAgdG8gYmUgaW5jbHVkZWQgaW50byB0aGUga2VybmVsIHNvdXJjZSB0cmVlIGFuZCB0aGUgc3RhbmRhbG9uZQorICBtb2R1bGUgdmVyc2lvbi4KKy0gUmVpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIExpbnV4LTEuMi4xMy4gUGxlYXNlIHJlZmVyIHRvIHRoZQorICBJbnN0YWxsLWd1aWRlLiAKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wOSwgMTYvMDYvOTYgPT09PT0KKworVGhlcmUgYXJlbid0IGFueSByZWFsbHkgYmlnIG5ld3MgaW4gdGhpcyByZWxlYXNlLCBtb3N0bHkganVzdCB0aGF0IEkKKyh0aGUgbWFpbnRhaW5lcikgaGF2ZSBjaGFuZ2VkIG15IGVtYWlsIGFkZHJlc3MgKGR1ZSB0byBhIG5ldyBqb2IpLiAgTXkKK25ldyBhZGRyZXNzIGlzIDxraHBAZG9scGhpbmljcy5ubz4KKworLSBUaGUgQ0xLXzQ4TUhaIGFuZCBGRENfODIwNzhTTCBvcHRpb25zIGhhcyBnb25lIChhbGwgMk1icHMgY2FyZHMgc2VlbQorICB0byB1c2UgYSA0OE1IeiBvc2NpbGxhdG9yIGFueXdheSBhbmQgSSBoYXZlbid0IGhlYXJkIG9mIGFuICdTTAorICBjaGlwIG91dCB0aGVyZSkuCistIFRoZSBTODIwNzhCIGhhcyBiZWVuIGBkb3duZ3JhZGVkJyB0byBpODIwNzdBQSBjb21wYWJpbGl0eS4KKy0gVEVTVElORyBvcHRpb24gcmV2aXZlZC4gIFJpZ2h0IG5vdywgaXQnbGwgZW5hYmxlIHRoZSAoc2VyaW91c2x5IGJyb2tlbikKKyAgMk1icHMgY29kZS4gIElmIHlvdSBlbmFibGUgaXQsIHlvdSdsbCBleHBlcmllbmNlIGEgdGFwZSBkcml2ZSB0aGF0J3MKKyAgKnJlYWxseSogb3V0IHRvIGx1bmNoIQorLSBTb21lIChib2xkKSBjaGFuZ2VzIGluIHRoZSBpbml0IGNvZGUuICBQbGVhc2Ugbm90aWZ5IG1lIGlmIHRoZXkKKyAgYnJlYWsgdGhpbmdzIGZvciB5b3UuCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDgsIDE0LzAzLzk2ID09PT09CisKK0lmIHlvdSBjb3JyZWN0IGEgcHJvYmxlbSB3aXRoIGZ0YXBlLCBwbGVhc2Ugc2VuZCB5b3VyIHBhdGNoIHRvCitraHBAZG9scGhpbmljcy5ubyB0b28uCisKKy0gVXBkYXRlZCB0byByZWZsZWN0IHRoYXQgTlJfTUVNX0xJU1RTIGlzIGdvbmUgaW4gMS4zLjc0CistIFRlYWMgNzAwIGFkZGVkIHRvIGxpc3Qgb2Yga25vd24gZHJpdmVzLgorLSBUaGUgcmVnaXN0ZXJlZCBkZXZpY2UgbmFtZSBpcyBub3cgImZ0IiByYXRoZXIgdGhhbiAiZnRhcGUiLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA3YSwgMTQvMDMvOTYgPT09PT0KKworQnVnZml4ZXMgYnkgTWFyY2luIERhbGVja2kgPGRhbGVja2lAbmFtdTAzLmd3ZGcuZGU+OgorLSBJbiB0aGUgbGFzdCByZWxlYXNlIGl0IGp1c3QgY29tcGlsZWQgYWdhaW5zdCAxLjMuNzA7CisgIG5vdyB0aGUgcGFyYW1zIHRvIHJlcXVlc3RfaXJxKCkgYW5kIGZyZWVfaXJxIGFyZSgpIGFyZSBmaXhlZCwgc28gaXQgYWxzbyAKKyAgd29ya3MgaW4gMS4zLjczIDotKQorLSBTdXBwb3J0IGZvciBtb2R1bGVzIGlzIG5vdyBjb3JyZWN0IGZvciBuZXdlciBrZXJuZWxzLgorCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA3LCAwNC8wMy85NiA9PT09PQorCisKKy0gZnRhcGUgdXBkYXRlZCB0byBjb21waWxlIGFnYWluc3QgMS4zLjcwLgorLSBJb21lZ2EgNzAwIGFuZCBXYW5ndGVrIDMyMDAgcmVjb2duaXNlZC4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA2YiwgMTMvMDIvOTYgPT09PT0KKworQW5vdGhlciBzaW1wbGUgYnVnZml4IHZlcnNpb24uCisKKy0gSnVtYm8gNzAwIHJlY29nbmlzZWQuCistIFR5cG8gaW4gdmVuZG9ycy5oIGZpeGVkLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDZhLCAxMC8wMi85NiA9PT09PQorCitUaGlzIHJlbGVhc2UgaXMgYSBzaW1wbGUgYnVnZml4IHZlcnNpb24uCisKKy0gTGludXgvU01QOiBmdGFwZSAqc2hvdWxkKiB3b3JrLgorLSBGQy0xMC8yMDogT25seSBhY2NlcHRzIElSUXMgMy03LCBvciA5LiAgSWYgSVJRIDksIHByb3Blcmx5IHRlbGwgdGhlIGNhcmQKKyAgdG8gdXNlIElSUSAyLiAgVGhhbmtzIHRvIEdyZWcgQ3JpZGVyIChnY3JpZGVyQGljbG5ldC5vcmcpIGZvciBmaW5kaW5nIGFuZAorICBsb2NhdGluZyB0aGlzIGJ1ZyBhbmQgdGVzdGluZyB0aGUgcGF0Y2guCistIEluc2lnaHQgZHJpdmUgcmVjb2duaXNlZCBjb3JyZWN0bHkgYWdhaW4uCistIE1vdG9yLW9uIHdha2V1cCB2ZXJzaW9uIG9mIHRoZSBJb21lZ2EgMjUwIGRyaXZlIGFkZGVkCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNiwgMjgvMDEvOTYgPT09PT0KKworU3BlY2lhbCB0aGFua3MgZ28gdG8gTmVhbCBGcmllZG1hbiBhbmQgU3RldmVuIFNvcmJvbSBmb3IgdGhlaXIKK2hlbHAgaW4gcHJvZHVjaW5nIGFuZCB0ZXN0aW5nIHRoaXMgcmVsZWFzZS4KKworSSBoYXZlIGNvbnRpbnVlZCB0byBjbGVhbiB1cCB0aGUgY29kZSwgd2l0aCBhbiBleWUgdG93YXJkcyBpbmNsdXNpb24KK29mIGZ0YXBlIGluIExpbnVzJyBvZmZpY2lhbCBrZXJuZWwgKEluIGZhY3QsIGFzIEkgdHlwZSB0aGlzLCBJIGFtCitydW5uaW5nIG9uIGEga2VybmVsIHdpdGggZnRhcGUgc3VwcG9ydCBzdGF0aWNhbGx5IGxpbmtlZCkuICBJIGhhdmUKK3Rlc3QtY29tcGlsZWQgZnRhcGUgYWdhaW5zdCBteSAxLjIuMTMgdHJlZSB3aXRob3V0IHByb2JsZW1zLgorSG9wZWZ1bGx5LCBldmVyeXRoaW5nIHNob3VsZCBiZSBPSyBmb3IgdGhlIHYxLjIueCBwZW9wbGUuCisKK1dBUk5JTkchIEFsYW4gQ294IGhhcyBtYWlsZWQgbWUgdGhhdCBmdGFwZSBkb2VzICpOT1QqIHdvcmsgd2l0aAorTGludXgvU01QLiAgSWYgeW91IHRyeSB0byBydW4gZnRhcGUgdW5kZXIgTGludXgvU01QLCBpdCB3aWxsIGNhdXNlIGEKK2tlcm5lbCBkZWFkbG9jayAod2hpY2ggaXMgd29yc2UgdGhhbiBhIHBhbmljKS4KKworLSBRSUMtMzAyMC9UUi0zOiAxTWJwcyBzdXBwb3J0IHdvcmtzLiAgTmVhbCBpcyBjYXBhYmxlIG9mIHJlYWRpbmcgYW5kCisgIHdyaXRpbmcgZGF0YSB0byBhIHRhcGUuICBmdGFwZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB0eXBlIG9mCisgIHRhcGUgKGUuZy4gVFItMyB2cyBRSUMtODApIGFuZCBtb3ZlIHRoZSBmZGMgaW4gYW5kIG91dCBvZgorICAicGVycGVuZGljdWxhciBtb2RlIiBhcyBuZWNlc3NhcnkuCistIDJNYnBzIHN1cHBvcnQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgc2luY2UgaXQgaXMgbm90IGZ1bGx5CisgIGRlYnVnZ2VkLiAgSWYgeW91IGFyZSBhZHZlbnR1cm91cywgcmVtb3ZlIC1ERkRDXzgyMDc4U0wgaW4gdGhlCisgIE1ha2VmaWxlIGFuZCBzZWUgd2hhdCBoYXBwZW5zIDotKQorLSBmZGMgZGV0ZWN0aW9uOiBzaWxseSBidWdzIHJlbW92ZWQgKE9ubHkgMk1icHMgZmRjcyB3ZXJlIGFmZmVjdGVkKQorICBhbmQgYWRkZWQgZGV0ZWN0aW9uIG9mIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBQQzg3NDQgZmRjIGNoaXAKKyAgKHVzZWQgaW4gdGhlIFBDODczeHggInN1cGVyLUlPIiBjaGlwcykuCistIFJlbW92ZWQgd2FybmluZyBhYm91dCBpbmNvbXBhdGlibGUgdHlwZXMgd2hlbiBjb21waWxpbmcgd2l0aCBMaW51eAorICAxLjIueC4KKy0gUkVBRE1FLlBDSSB1cGRhdGVkIHdpdGggaW5mbyBhYm91dCB0aGUgREVMTCBEaW1lbnNpb24gWFBTIFA5MC4KKy0gQ29ubm9yIFRTVDMyMDBSIGFkZGVkIHRvIGRldGVjdGVkIGRyaXZlcy4KKy0gYHN3YXBvdXQnIHV0aWxpdHkgYWRkZWQgdG8gZGlzdHJpYnV0aW9uLiAgSXQgd2lsbCBkaXJ0eSA1TWVnIG9mCisgIG1lbW9yeSwgdHJ5aW5nIHRvIHN3YXAgb3V0IG90aGVyIHByb2dyYW1zLiAgSnVzdCBzYXkgYG1ha2Ugc3dhcG91dCcKKyAgdG8gYnVpbGQgaXQuICBmdGFwZSB3aWxsIGRvIHRoaXMgYXV0b21hdGljYWxseSBSZWFsIFNvb24gTm93IChpZToKKyAgd2hlbiBJIGhhdmUgZm91bmQgb3V0IHdoaWNoIGtlcm5lbCBtZW1vcnkgYWxsb2MgZnVuY3Rpb24gdG8gY2FsbCkuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wNSwgMDgvMDEvOTYgPT09PT0KKworLSBGb3IgdjEuMi54IEtlcm5lbHMsIHlvdSBtdXN0IGFwcGx5IHRoZSBwYXRjaCBsaW51eC0xLjIva3N5bXMucGF0Y2ggdG8KKyAgdGhlIGtlcm5lbCBhbmQgcmVidWlsZCBpdCAoaXQgYWRkcyB0aGUgX19nZXRfZG1hX3BhZ2VzIHN5bWJvbCB0bworICBrc3ltcy5jKS4KKy0gSW5jbHVkZWQgbmV3IGFzbS1pMzg2L2lvLmggZmlsZSBmcm9tIHYxLjMueCBrZXJuZWwgc2VyaWVzLCB0byBlbmFibGUKKyAgZ2NjIHYuMi43LlsxMl0gdG8gY29tcGlsZSB2MS4yLngga2VybmVscyAobGludXgtMS4yL2lvLmgpLgorLSBNb2R1bGUgdmVyc2lvbnM6IElmIHlvdSB3aXNoIHRvIGNvbXBpbGUgZnRhcGUgYXMgYSB2ZXJzaW9uZWQgbW9kdWxlLAorICB5b3UgbXVzdCBmaXJzdCBjb21waWxlIHlvdXIga2VybmVsIHdpdGggQ09ORklHX01PRFZFUlNJT05TPXkuCisgIE90aGVyd2lzZSwgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCA8bGludXgvbW9kdmVyc2lvbnMuaD4gZG9lcyBub3QKKyAgZXhpc3QgKGlmIHRoYXQgaGFwcGVucywgYSBgdG91Y2ggbW9kdmVyc2lvbnMuaCcgd2lsbCBoZWxwIHlvdSBvdXQpLgorLSBDTEtfNDhNSFo6IG5ldyBkZWZpbmUgaW4gdGhlIE1ha2VmaWxlIChkZWZhdWx0OiBub24temVybykuICBJZiB5b3UgaGF2ZQorICBhIHRhcGUgY29udHJvbGxlciBjYXJkIHRoYXQgdXNlcyB0aGUgaTgyMDc4KC0xKSBjaGlwLCBidXQgY2Fubm90IGdldAorICBpdCB0byB3b3JrIHdpdGggZnRhcGUsIHRyeSBzZXQgaXQgdG8gMCAoYW5kIHBsZWFzZSByZXBvcnQgdGhpcykuCistIFFJQy0zMDEwLzMwMjA6IENvbXBsZXRlIHN1cHBvcnQgaXMgc3RpbGwgbWlzc2luZywgYnV0IHdpbGwgaG9wZWZ1bGx5CisgIGNvbWUgc29vbi4gIFN0ZXZlbiBTb3Jib20gaGFzIGtpbmRseSBwcm92aWRlZCBtZSB3aXRoIGhpbnRzIGFib3V0CisgIHRoaXMuICBXcml0aW5nIG9mIFFJQy0zMDIwIHRhcGVzIGRlZmluaXRlbHkgZG9lcyBOT1Qgd29yayAoZG8gbm90IHRyeQorICBpdCEgLSB0aGUgZHJpdmUgd2lsbCBub3QgYmUgaW4gInBlcnBlbmRpY3VsYXIgbW9kZSIgYW5kIHRoaXMgd2lsbCBydWluCisgIHRoZSBmb3JtYXR0aW5nIGluZm8gb24gdGhlIHRhcGUpLgorLSBmdGFwZV9udW1fYnVmZmVycyBpcyBvdXQgb2YgZmFzaGlvbjogdXNlIE5SX0JVRkZFUlMgaW5zdGVhZCAoYW5kCisgIHJlY29tcGlsZSBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgaXQgOi0pLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDQsIDAxLzAxLzk2ID09PT09CisKK1RoaXMgdmVyc2lvbiBieSBLYWkgSGFycmVraWxkZS1QZXRlcnNlbiA8a2hwQGRvbHBoaW5pY3Mubm8+CisKKy0gQUxFUlQhIFN1cHBvcnQgZm9yIEtlcm5lbHMgZWFybGllciB0aGVuIHYxLjEuODUgaXMgYWJvdXQgdG8gZ28gYXdheS4KKyAgSSBpbnRlbmQgdG8gY2xlYW4gdXAgc29tZSBvZiB0aGUgY29kZSAoZ2V0dGluZyByaWQgb2YgYW4gYW5ub3lpbmdseQorICBsYXJnZSBudW1iZXJzIG9mICNpZmRlZiBtb3N0bHkpLCB3aGljaCBtZWFucyB0aGF0IHN1cHBvcnQgZm9yCisgIHByZS0xLjEuODUga2VybmVscyBtdXN0IGdvIGFzIHdlbGwuCistIE5SX0ZUQVBFX0JVRkZFUlMgaXMgZ29uZTsgWW91IGNhbiBpbnN0ZWFkIHNlbGVjdCB0aGUgbnVtYmVyIG9mIGRtYQorICBidWZmZXJzIGJ5IHNheWluZyBgaW5zbW9kIGZ0YXBlLm8gZnRhcGVfbnVtX2J1ZmZlcj08bj4nIGluc3RlYWQuCistIENvbmZpZ3VyZSBzY3JpcHQgZ29uZS4gIGZ0YXBlIHdpbGwgbm93IGF1dG9tYWdpY2FsbHkgZGV0ZXJtaW5lIHlvdXIKKyAga2VybmVsIHZlcnNpb24gYnkgL3Vzci9pbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBpbnN0ZWFkLgorLSBDT05GSUdfTU9EVkVSU0lPTlMgbm93IHdvcmsuICBBbGwgY29tYmluYXRpb25zIG9mIHZlcnNpb25lZCAvCisgIHVudmVyc2lvbmVkIGtlcm5lbCBhbmQgZnRhcGUgbW9kdWxlIHdvcmtzIChhdCBsZWFzdCB3aXRoIG15IDEuMy41MgorICBrZXJuZWwpLgorLSBJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIGluc2VydGluZyBmdGFwZSBpbnRvIGFuIG9sZCAoMS4yLngpCisgIGtlcm5lbCAoZS5nLiBpbnNtb2Qgc2F5cyAiMS4yLjggZG9lcyBub3QgbWF0Y2ggMS4yLjgpLCByZWNvbXBpbGUKKyAgeW91ciBtb2R1bGVzIHV0aWxpdGllcyB3aXRoIHlvdXIgbmV3IGNvbXBpbGVyLgorLSBSZXZlYWwgVEIxNDAwIGRyaXZlIGFkZGVkIHRvIHZlbmRvcnMuaAorLSBTdXBwb3J0IGZvciB0aGUgaTgyMDc4LTEgKDJNYnBzKSBjaGlwIGlzIGNvbWluZyBhbG9uZy4gIFRoZQorICBiaWdnZXN0IHByb2JsZW0gaXMgdGhhdCBJIGRvbid0IGhhdmUgc3VjaCBhIGNhcmQsIHdoaWNoIG1ha2VzCisgIHRlc3RpbmcgLyBkZWJ1Z2dpbmcgc29tZXdoYXQgcHJvYmxlbWF0aWMuICBUaGUgc2Vjb25kIGJpZ2dlc3QKKyAgcHJvYmxlbSBpcyB0aGF0IEkgZG8gbm90IGhhdmUgdGhlIFFJQy0zMDEwLzMwMjAgc3RhbmRhcmRzIGVpdGhlci4KKyAgU3RhdHVzIHJpZ2h0IG5vdyBpcyB0aGF0IHRoZSBjaGlwIGlzIGRldGVjdGVkLCBhbmQgaXQgc2hvdWxkIGJlCisgIHBvc3NpYmxlIHRvIHB1dCBpdCBpbnRvIDJNYnBzIG1vZGUuICBIb3dldmVyLCBJIGRvIG5vdCBrbm93IHdoYXQKKyAgImV4dHJhcyIgYXJlIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgc3VwcG9ydC4gIEFsdGhvdWdoIHB1dHRpbmcgdGhlCisgIGk4MjA3OCBpbnRvIDFNYnBzIG1vZGUgb3VnaHQgdG8gd29yayBvdXQgb2YgdGhlIGJveCwgaXQgZG9lc24ndAorICAocmlnaHQgbm93LCBmdGFwZSBjb21wbGFpbnMgYWJvdXQgaWQgYW0gZXJyb3JzKS4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjA0YmV0YTUsIDI5LzEyLzk1ID09PT09CisKK0JhcyBvZmZsaW5lIGxpbnV4LXRhcGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciByZWFzb25zIG9ubHkga25vd24gdG8gdGhlIG1ham9yZG9tbyBtYWlsIGxpc3QgcHJvY2Vzc29yLCBCYXMgd2FzCitraWNrZWQgb2ZmIHRoZSBsaW51eC10YXBlIGxpc3Qgc29tZXRpbWUgZHVyaW5nIHRoZSBzdW1tZXIuICBCZWluZworb3ZlcndvcmtlZCBhdCBoaXMgZm9yLXBheSBqb2IsIGhlIGRpZG4ndCBub3RpY2UgaXQgbXVjaC4gIEluc3RlYWQgSQorKEthaSwga2hwQGRvbHBoaW5pY3Mubm8pIGhhcyB3b3JrZWQgb24gZnRhcGUgdG8gcHJvZHVjZSB0aGUgMi4wNChiZXRhKQordmVyc2lvbi4KKworemZ0YXBlCistLS0tLS0KK05vdGUgdGhhdCB0aGVyZSBleGlzdHMgYSBtdWNoIGltcHJvdmVkIHZlcnNpb24gb2YgZnRhcGUsIHdyaXR0ZW4gYnkKK0NsYXVzLUp1c3R1cyBIZWluZSA8Y2xhdXNAd2lsbGkubWF0aC5yd3RoLWFhY2hlbi5kZT4gd2hpY2ggaXMgbmFtZWQKK3pmdGFwZSwgd2hpY2ggY29uZm9ybXMgdG8gdGhlIFFJQy04MCBzcGVjcyBvbiBob3cgdG8gbWFyayBiYWNrdXBzLCBhbmQKK2lzIGNhcGFibGUgb2YgZG9pbmcgYXV0b21hdGljIGNvbXByZXNzaW9uLiAgSG93ZXZlciwgemZ0YXBlIG1ha2VzCitzdWJzdGFudGlhbCBjaGFuZ2VzIHRvIGZ0YXBlLCBhbmQgSSAoS2FpKSBoYXZlIHRoZXJlZm9yZSBkZWNsaW5lZCB0bworaW50ZWdyYXRlIHpmdGFwZSBpbnRvIGZ0YXBlLiAgSG9wZWZ1bGx5LCB0aGlzIHdpbGwgaGFwcGVuIHNvb24uCisKK0NPTkZJR19RSUMxMTcgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBiaWdnZXN0IGNoYW5nZSBvZiBhbGwgaXMgdGhhdCBmdGFwZSBub3cgd2lsbCBhbGxvY2F0ZSBpdHMgZG1hCitidWZmZXJzIHdoZW4gaXQgaXMgaW5zZXJ0ZWQuICBUaGUgbWVhbnMgdGhhdCB0aGUgQ09ORklHX1FJQzExNyBvcHRpb24KK2hhcyBkaXNhcHBlYXJlZCBmcm9tIHRoZSBMaW51eCBrZXJuZWwgYXMgb2YgdjEuMy4zNC4gIElmIHlvdSBoYXZlIGFuCitlYXJsaWVyIGtlcm5lbCwgc2ltcGx5IGFuc3dlciAnbm8nIHRvIHRoZSBxdWVzdGlvbiB3aWxsIGRvIHRoZSB0cmljaworKGlmIHlvdSBnZXQgY29tcGxhaW5zIGFib3V0IF9fZ2V0X2ZyZWVfcGFnZXMoKSBtaXNzaW5nLCBjb250YWN0IHRoZQorbGludXgtdGFwZSBtYWlsaW5nIGxpc3QpLgorCitOb3RlIHRoYXQgZnRhcGUtMi4wNGJldGEgd2lsbCB3b3JrIGVxdWFsbHkgd2VsbCBvbiBrZXJuZWxzIHdpdGggYW5kCit3aXRob3V0IGBmdGFwZSBzdXBwb3J0Jy4gIFRoZSBvbmx5IGNhdGNoIGlzLCB0aGF0IHlvdSB3aWxsIHdhc3RlCithcm91bmQgOTYtMTI4S2Igb2YgcHJlY2lvdXMgRE1BJ2FibGUgbWVtb3J5IG9uIGEgYm94IHRoYXQgaGFzIGZ0YXBlCitzdXBwb3J0IGNvbXBpbGVkIGluLgorCitOb3cgZm9yIHRoZSByZWFsIGNoYW5nZXM6CisKKy0gRkMtMjAgY2FuIG5vdyB1c2UgRE1BIGNoYW5uZWxzIDEsIDIsIGFuZCAzLiBUaGFua3MgdG8gRGFuaWVsCisgIENvaGVuLCBjYXRtYW5Ad3BpLmVkdS4KKy0gZnRhcGUgbm8gbG9uZ2VyIHJlcXVpcmVzIGEgKGdpZ2FudGljKSA5NktiIGJ1ZmZlciB0byBiZSBzdGF0aWNhbGx5CisgIGFsbG9jYXRlZCBieSB0aGUga2VybmVsLgorLSBBZGRlZCBuZXcgSW9tZWdhIGRyaXZlICg4ODgyKSB0byB2ZW5kb3JzLmgKKy0gLWZuby1zdHJlbmd0aC1yZWR1Y2UgYWRkZWQgdG8gTWFrZWZpbGUsIHNpbmNlIEdDQyBpcyBicm9rZW4uCistIGk4MjA3OC0xICgyTWJwcykgRkRDIHN1cHBvcnQgc3RhcnRlZC4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAzYiwgMjcvMDUvOTUgPT09PT0KKworLSBQcmV2ZW50ZWQgdmVyaWZ5X2FyZWEgdG8gcmV0dXJuIGVycm9yIGlmIGNhbGxlZCB3aXRoIHplcm8gbGVuZ3RoLgorLSBGaXhlZCBhIGJ1ZyBpbiBmbHVzaF9idWZmZXJzIHRoYXQgY2F1c2VkIHRvbyBtdWNoIHBhZGRpbmcgdG8gYmUKKyAgd3JpdHRlbiB3aGVuIGEgZmluYWwgc2VnbWVudCBoYWQgYmFkIHNlY3RvcnMuCistIEluY3JlYXNlZCBtYXhpbXVtIGZhc3Qtc2VlayBvdmVyc2hvb3QgdmFsdWUgZnJvbSA1IHRvIDEwIHNlZ21lbnRzLgorLSBCcmVha2luZyBsb29wIGFmdGVyIDUgcmV0cmllcyB3aGVuIHBvc2l0aW9uaW5nIGZhaWxzLgorLSBGaXhlZCB3cm9uZyBjYWxjdWxhdGlvbiBvZiB0YXBlIGxlbmd0aCBmb3IgUUlDLTMwMTAgYW5kIFFJQy0zMDIwCisgIHRhcGVzIChkZW5zaXRpZXMgd2VyZSBzd2FwcGVkKS4KKy0gRml4ZWQgd3JvbmcgY2FsY3VsYXRpb24gb2Ygb3ZlcnNob290IG9uIHNlZWtfZm9yd2FyZDogV3Jvbmcgc2lnbgorICBvZiBlcnJvci4KKy0gU3VwcHJlc3MgKGZhbHNlKSBlcnJvciBtZXNzYWdlIGR1ZSB0byBuZXcgdGFwZSBsb2FkZWQuCistIEFkZGVkIHR3byBuZXcgQ01TIGRyaXZlcyAoMTFjMyBhbmQgMTFjNSkgdG8gdmVuZG9ycy5oLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDNhLCAwOS8wNS85NSA9PT09PQorCistIEZpeGVkIGRpc3BsYXkgb2Ygb2xkIGVycm9yIChldmVuIGlmIGFscmVhZHkgY2xlYXJlZCkgaW4gZnRhcGVfb3Blbi4KKy0gSW1wcm92ZWQgdGFwZSBsZW5ndGggZGV0ZWN0aW9uLCBpb2N0bHMgd291bGQgZmFpbCBmb3IgNDI1IGZ0IHRhcGVzLgorICBVbnRpbCB0aGUgdGFwZSBsZW5ndGggaXMgY2FsY3VsYXRlZCB3aXRoIGRhdGEgZnJvbSB0aGUgaGVhZGVyCisgIHNlZ21lbnQsIHdlJ2xsIHVzZSB3b3JzdC1jYXNlIHZhbHVlcy4KKy0gQ2xlYXIgZW9mX21hcmsgYWZ0ZXIgcmV3aW5kaW5nIGlvY3Rscy4KKy0gRml4ZWQgd3JvbmcgdmVyc2lvbiBtZXNzYWdlICgyLjAzIGhhZCAyLjAyZyBpZCkuCistIEZpeGVkIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgZmRjIHRvIGJlIHJlc2V0IHZlcnkgZnJlcXVlbnRseS4KKyAgVGhpcyBzaG91bGRuJ3QgYWZmZWN0IG5vcm1hbCBvcGVyYXRpb24gYnV0IHRoZSB0aW1pbmcgb2YgdGhlCisgIHJlcG9ydCByb3V0aW5lcyBoYXMgY2hhbmdlZCBhZ2FpbiBhbmQgdGhhdCBtYXkgY2F1c2UgcHJvYmxlbXMuCisgIFdlJ2xsIGp1c3QgaGF2ZSB0byBmaW5kIG91dC4uLi4KKy0gSW1wbGVtZW50ZWQgY29ycmVjdCB3cml0ZSBwcmVjb21wZW5zYXRpb24gc2V0dGluZyBmb3IgUUlDLTMwMTAvMzAyMC4KKy0gQ2xlYW5lZCB1cCBmZGNfaW50ZXJydXB0X3dhaXQgcm91dGluZS4gSG9wZSBpdCBzdGlsbCB3b3JrcyA6LSkKKy0gRmluYWxseSByZW1vdmVkIChhbHJlYWR5IGRpc2FibGVkKSBzcGVjaWFsIGVvZiBtYXJrIGhhbmRsaW5nIGZvcgorICBnbnUgdGFyLgorLSBDaGFuZ2VkIG9yZGVyIG9mIGdldF9kbWFfcmVzaWR1ZSBhbmQgZGlzYWJsZV9kbWEgaW4gZmRjLWlzci5jCisgIGJlY2F1c2UgdGhlIGN1cnJlbnQgb3JkZXIgd291bGQgZmFpbCBvbiBhdCBsZWFzdCBvbmUgc3lzdGVtLgorICBXZSdyZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBvcmRlciBhZ2FpbiwgaG9wZSAoYW5kIGV4cGVjdCkgdGhpcworICBkb2Vzbid0IGJyZWFrIGFueSBvdGhlciBzeXN0ZW0uCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMywgMDcvMDUvOTUgPT09PT0KKworKENoYW5nZXMgcmVmZXIgdG8gdGhlIGZpcnN0IGZ0YXBlLTIuMDIgcmVsZWFzZSkKKworU3VwcG9ydCBmb3Igd2lkZSBhbmQgZXh0ZW5kZWQgbGVuZ3RoIHRhcGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBDb25uZXIgVFNNIDQyMCBhbmQgODUwIGRyaXZlcyBhcmUgcmVwb3J0ZWQgdG8gYmUgd29ya2luZy4KK0kgaGF2ZW4ndCByZWNlaXZlZCBhbnkgcmVwb3J0cyBhYm91dCBvdGhlciBicmFuZHM7IHRoZSBUU00gNDIwCithbmQgODUwIHNlZW0gdG8gYmUgdGhlIG1vc3Qgd2lkZWx5IHVzZWQgd2lkZSBkcml2ZXMuCitFeHRlbmRlZCBsZW5ndGggdGFwZXMgKDQyNSBmdCkgd2l0aCBub3JtYWwgUUlDLTgwIGRyaXZlcworYXJlIG9wZXJhdGluZyB0b28gKEF0IGxlYXN0IEkndmUgaGFkIG5vIHJlcG9ydHMgc3RhdGluZyBvdGhlcndpc2UpLgorX05vdF8geWV0IGNvbXBsZXRlbHkgc3VwcG9ydGVkIChhbHRob3VnaCB0aGV5IG1heSB3b3JrKSBhcmUKK1FJQy0zMDIwIGRyaXZlcyBhbmQgMiBNYnBzIGZsb3BweSBkaXNrIGNvbnRyb2xsZXJzIHdvbid0IHdvcmsgYXQKK3RoZSBoaWdoZXN0IHNwZWVkLgorSWYgc29tZW9uZSBpcyBraW5kIGVub3VnaCB0byBzZW5kIG1lIG9uZSBvZiB0aGVzZSwgSSdsbCBpbmNsdWRlCitzdXBwb3J0IGZvciBpdCB0b28gOy0pCisKK0Vhc2llciBjb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLQorUHJvYmxlbXMgZHVlIHRvIHdyb25nIHNldHRpbmdzIGluIHRoZSBNYWtlZmlsZSBhcmUgcHJldmVudGVkCitieSB1c2luZyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IHRoYXQgc2V0cyB0aGUgbmVjZXNzYXJ5IChrZXJuZWwKK3ZlcnNpb24gZGVwZW5kZW50KSBjb21waWxlIHRpbWUgb3B0aW9ucy4KK1RoaXMga2VybmVsIHZlcnNpb24gaXMgbm93IGRldGVybWluZWQgZnJvbSB0aGUgc291cmNlcyBmb3VuZAorYXQgL3Vzci9zcmMvbGludXgsIG9yIGlmIG5vdCBmb3VuZCwgdGhlIG9sZCB3YXkgdXNpbmcKKy9wcm9jL3ZlcnNpb24uCitWZXJzaW9uZWQgbW9kdWxlcyB3aWxsIGJlIHVzZWQgYXV0b21hdGljYWxseSB3aGVuIHN1cHBvcnRlZAorYnktIGFuZCBjb25maWd1cmVkIGluLSB0aGUga2VybmVsLgorTm90ZSB0aGF0IHRoZSBjdXJyZW50IG1vZHVsZXMgY29kZSAoMS4xLjg3KSBpcyBzdGlsbCBicm9rZW4KK2FuZCBfbmVlZHNfIHRoZSBmaXggaW5jbHVkZWQgaW4gdGhlIGluc21vZCBkaXJlY3RvcnkuCitQbGVhc2UgZG9uJ3Qgc2VuZCBtZSBhbnkgbW9yZSBPb3BzIHJlcG9ydHMgY2F1c2VkIGJ5IGluc21vZCA6LSgKKworUmVkdWNlZCBtb2R1bGUgc2l6ZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHN0YW5kYXJkIG1vZHVsZSBzaXplIGlzIG11Y2ggcmVkdWNlZCBhbmQgc29tZSBjb21waWxlIHRpbWUKK29wdGlvbnMgY2FuIGV2ZW4gcmVkdWNlIGl0IGZ1cnRoZXIuIChJIGRvbid0IHJlY29tbWVuZCB0aGlzCitmb3Igbm9ybWFsIHVzZSBidXQgaXQgY2FuIGJlIGhhbmR5IGZvciByZXNjdWUgZGlza2V0dGVzKQorCitPcHRpb246ICAgICAgICAgICBBcHByb3guIG1vZHVsZSBzaXplOgorCis8c3RhbmRhcmQ+ICAgICAgICAgICAgIDE1MCBLYgorTk9fVFJBQ0UgICAgICAgICAgICAgICAxMjUgS2IKK05PX1RSQUNFX0FUX0FMTCAgICAgICAgIDY3IEtiCisKKworTXVjaCBpbXByb3ZlZCBkcml2ZXIgaW50ZXJydXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01vc3QgcG9zc2libGUgbG9vcHMgaGF2ZSBiZWVuIGJyb2tlbiBhbmQgc2lnbmFsIGRldGVjdGlvbgoraGFzIGJlZW4gaW1wcm92ZWQuCitJbiBtb3N0IGNhc2VzIHRoZSBkcml2ZXIgY2FuIGJlIGFib3J0ZWQgYnkgXkMgKFNJR0lOVCkgYW5kCitTSUdLSUxMIChraWxsIC05KSB3aWxsIGdlbmVyYXRlIGJlIGEgc3VyZSBraWxsLgorKE5vdGUgdGhhdCBhYm9ydGluZyBhIHRhcGUgb3BlcmF0aW9uIG1heSBkYW1hZ2UgdGhlIGxhc3QKK2RhdGEgd3JpdHRlbiB0byB0YXBlKQorCitJbXByb3ZlZCBlcnJvciByZWNvdmVyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Z0YXBlIG5vdyByZXR1cm5zIGFuIGVycm9yIChFTk9EQVRBKSB0byB0aGUgYXBwbGljYXRpb24gaWYKK2Egc2VnbWVudCBwcm92ZXMgdG8gYmUgdW5yZWNvdmVyYWJsZSBhbmQgdGhlbiBza2lwcyB0aGUKK2JhZCBzZWdtZW50LgorVGhpcyBjYXVzZXMgbW9zdCBhcHBsaWNhdGlvbnMgdG8gY29udGludWUgdG8gd29yayAodGFyCithbmQgYWZpbykgbG9vc2luZyBvbmx5IGEgc21hbGwgYW1vdW50ICh1cCB0byAyOSBLYikgb2YgZGF0YS4KK1JldHJpZWQgcmVhZCBvcGVyYXRpb25zIHdpbGwgbm93IGJlIGRvbmUgc2xpZ2h0bHkgb2ZmLXRyYWNrCit0byBpbXByb3ZlIHRoZSBjaGFuY2Ugb2Ygc3VjY2Vzcy4gU2VyaW91cyBoZWFkIG9mZi10cmFjaworZXJyb3JzIHdpbGwgYmUgZGV0ZWN0ZWQuCisKK0ZDLTEwIGFuZCBGQy0yMCBjb250cm9sbGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGdGFwZSBub3cgc3VwcG9ydHMgYm90aCB0aGUgb2xkIENNUyBGQy0xMCBhbmQgdGhlIG5ld2VyIEZDLTIwCitjb250cm9sbGVycy4KK0JlY2F1c2UgdGhlIG9wZXJhdGlvbiBvZiB0aGVzZSBjYXJkcyBpcyBzdGlsbCB1bmRvY3VtZW50ZWQsCit0aHVzIGZhciB0aGV5IHdpbGwgb25seSB3b3JrIHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MgKFNlZQorTWFrZWZpbGUpLiBBbnkgZmVlZC1iYWNrIG9uIGhvdyB0byB1c2UgdGhlbSB3aXRoIG90aGVyIHNldHRpbmdzCit3aWxsIGJlIHdlbGNvbWUgIQorQ29tcGlsYXRpb24gd2lsbCBmYWlsIGlmIG9uZSBjaGFuZ2VzIHRoZSBzZXR0aW5ncyB0byBpbGxlZ2FsCit2YWx1ZXMuCisKK0tlcm5lbHMgYW5kIGNvbXBpbGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGdGFwZSBpcyBjdXJyZW50bHkgYmVpbmcgZGV2ZWxvcGVkIHVzaW5nIHRoZSAyLjUuOCBjb21waWxlci4KK1RoZSBvbGRlciAyLjQuNSBwcm9iYWJseSB3b3JrcyB0b28gKFNldCBvcHRpb24gaW4gTWFrZWZpbGUhKS4KK0kgaGF2ZSBubyBleHBlcmllbmNlIHdpdGggYW55IGxhdGVyIGNvbXBpbGVycyBub3IgRWxmIHN1cHBvcnQuCitBbnkgaW5mb3JtYXRpb24gb24gdGhpcyBpcyB3ZWxjb21lLgorVGhlIGxhdGVzdCBrZXJuZWwgSSBoYXZlIHRlc3RlZCBmdGFwZSB3aXRoIGlzIDEuMi42LgorCitDb21wcmVzc2lvbgorLS0tLS0tLS0tLS0KK0FuIGltcHJlc3NpdmUgY29sbGVjdGlvbiBvZiBjaGFuZ2VzIGZvciBmdGFwZSBpbmNsdWRpbmcKK29uLXRoZS1mbHkgY29tcHJlc3Npb24gaXMgc3RpbGwgbHlpbmcgb24gbXkgZGVzay4KK0lmIDIuMDMgcHJvdmVzIHRvIGJlIHJlbGlhYmxlIEkgbWlnaHQgc3RhcnQgaW50ZWdyYXRpbmcgdGhlc2UKK2J1dCBhcyB1c3VhbCwgSSdtIHNob3J0IGluIHRpbWUgOi0oCisKK0Zvcm1hdHRpbmcKKy0tLS0tLS0tLS0KK1RoZXJlIGlzIHN0aWxsIG5vIHdheSB0byBmb3JtYXQgdGFwZXMgdW5kZXIgTGludXguIEFzIGZhciBhcworSSBrbm93IGFsbCBhdHRlbXB0cyB0byB3cml0ZSBzdWNoIGEgcHJvZ3JhbSBoYXZlIGRpZWQgbm93LgorU2luY2UgZm9ybWF0dGVkIHRhcGVzIGFyZSByYXRoZXIgY29tbW9uIG5vdywgSSB0aGluayBhbGwgd2UKK25lZWQgaXMgYSB1dGlsaXR5IHRoYXQgd3JpdGVzIGEgd29yc3QgY2FzZSBwYXR0ZXJuIGFuZCB2ZXJpZmllcwordGhhdCB3aXRoIHRoZSBkcml2ZSBwdXQgaW4gdmVyaWZ5IG1vZGUsIHJlZHVjaW5nIG1hcmdpbnMuCitBbnkgdGFrZXJzID8KKworRnVydGhlcm1vcmUKKy0tLS0tLS0tLS0tCitDbGVhbmVkIHVwIG1lc3NhZ2VzLgorUHJlcGFyZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSB0YXBlIGRyaXZlcyBvbiBvbmUgZmRjLgorVGhhbmtzIHRvIGFsbCB0aGUgcGVvcGxlIHdobyBzZW50IGJ1ZyByZXBvcnRzIGFuZCBoZWxwZWQgbWUKK2ltcHJvdmUgdGhlIGRyaXZlci4gV2l0aG91dCB0cnlpbmcgdG8gYmUgY29tcGxldGUgSSdsbCBtZW50aW9uCitHYXJ5IEFuZGVyc29uICh3aXRob3V0IGhpcyBhY2N1cmF0ZSByZXBvcnRzIGFuZCB1bnJlbGlhYmxlCitoYXJkd2FyZSB0aGVyZSB3b3VsZG4ndCBiZSBhIDIuMDMpLCBTdGVmYW4gS25laWZlbCAoRkMtMjApLAorUm9iZXJ0IEJyb3VnaHRvbiAoRkMtMjAsIHlvdSB3ZXJlIGFsbW9zdCB0aGVyZSA7LSksIEJqb3JuCitFa3dhbGwgKGZvciB0aGUgdmVyc2lvbmVkIG1vZHVsZXMgYW5kIGJ1Z2d5IGluc21vZCA7LSksIFBldGVyCitGb3gsIENocmlzdG9waGVyIE9saXZlciwgUmFscGggV2hpdHRha2VyIGFuZCBub3QgdGhlIGxlYXN0CitMaW51cyBUb3J2YWxkcyAoZm9yIExpbnV4IGFuZCBrZWVwaW5nIG1lIGJ1c3kgYmVjYXVzZSBvZgorY2hhbmdlcyB0byB0aGUga2VybmVsIDstKQorVGhhbmtzIHRvIGFueW9uZSBJIGZvcmdvdCwgZm9yIHRoZSBidWcgcmVwb3J0cywgdGhlIGZ0YXBlCitiYXNoaW5nIGFuZCB0aGUgbWVudGFsIHN1cHBvcnQuLi4KKworCitUaGF0J3MgaXQgZm9yIG5vdy4gSGF2ZSBGdW4sCisKK0Jhcy4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAyZywgMDYvMDUvOTUgPT09PT0KKworLSBBZGRlZCBleHRyYSB0ZXN0IHRvIGJyZWFrIHJlYWQtaWQgbG9vcCB3aXRoIHNpZ25hbC4KKy0gQ2hhbmdlZCByZXdpbmQgY29kZSB0byBoYW5kbGUgbmVnYXRpdmUgb3ZlcnNob290IGZvciBkcml2ZXMKKyAgdGhhdCB0YWtlIHZlcnkgbG9uZyB0byBzdGFydCBvciBzdG9wLgorLSBMZXQgdXNlIG9mIGdldC9zZXQgaS9vLXJlZ2lvbnMgZGVwZW5kIG9uIGtlcm5lbCB2ZXJzaW9uLgorLSBDaGFuZ2VkIGNvZGUgdG8gdXNlIGEgbW9yZSBnZW5lcmFsIHRlc3QgZm9yIGNvbmRpdGlvbmFsCisgIGNvbXBpbGF0aW9ucyBkZXBlbmRpbmcgb24ga2VybmVsIHZlcnNpb24uCistIEltcHJvdmVkIG1pY3JvLXN0ZXAgZnVuY3Rpb25hbGl0eSB0byBnbyBvZmYtdHJhY2sgb25seQorICB3aGlsZSByZWFkaW5nIChpZCAmIGRhdGEpLgorLSBBZGRlZCBmYWlsdXJlIG9uIHRhcGUtbm90LXJlZmVyZW5jZWQgYml0IGluIGZ0YXBlX2NvbW1hbmQuCistIEFkZGVkIEZPUkVWRVIgb3B0aW9uIHRvIHJlYWQtd2FpdCByb3V0aW5lLgorLSBDaGFuZ2VkIHJlYWQtaWQgdG8gdXNlIHNob3J0ZXIgdGltZW91dCBjYXVzaW5nIHNtYWxsZXIKKyAgcmV3aW5kcyBvbiB0aW1lb3V0LgorLSBNYWRlIGtlcm5lbC1pbnRlcmZhY2UgZnVuY3Rpb25zIHN0YXRpYy4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAyZiwgMDMvMDUvOTUgPT09PT0KKworLSBBZGRlZCBzdXBwb3J0IGZvciBkdWFsIHRhcGUgZHJpdmVzIG9uIG15IHN5c3RlbSwgZXh0ZW5kZWQgQ29uZmlndXJlCisgIHNjcmlwdCB0byBkZXRlY3QgaG9zdCAnZG9kbycuCistIExvZyBtZWRpYSBkZWZlY3QgaW4gaGlzdG9yeSBpZiBlY2MgZmFpbGVkIGFuZCBubyBkYXRhIHdhcyByZXR1cm5lZC4KKy0gRml4ZWQgQ29uZmlndXJlIHNjcmlwdCB0aGF0IHdhcyBmYWlsaW5nIGZvciBrZXJuZWwgdmVyc2lvbnMgd2l0aAorICBkb3VibGUgZGlnaXQgdmVyc2lvbiBvciByZXZpc2lvbiBudW1iZXJzLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDJlLCAwMS8wNS85NSA9PT09PQorCistIEZpeGVkIHJlcG9zaXRpb24gbG9vcCBhdCBsb2dpY2FsIGVvdCAoZmFpbGluZyByZWFkX2lkKS4KKy0gRml4ZWQgMzQgc2VnbWVudCBvZmZzZXQgd2hlbiByZXdpbmRpbmcuCistIEFkZGVkIGZhc3Qgc2VlayBjYXBhYmlsaXR5IGZvciBtb3JlIHRoYW4gMjU1IHNlZ21lbnRzLgorLSBGaXhlZCB3cm9uZyBidXN5IHJlc3VsdCBmcm9tIGZ0YXBlX2NvbW1hbmQgY2F1c2luZyByZXZlcnNlCisgIHNlZWsgdG8gZmFpbC4KKy0gQWRkZWQgYnJlYWtvdXQgZnJvbSBpbmZpbml0ZSByZXdpbmQgbG9vcCAoaWYgc29tZXRoaW5nIGZhaWxzKS4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAyZCwgMzAvMDQvOTUgPT09PT0KKworLSBJbXByb3ZlZCBhYm9ydGlvbiBvbiBzaWduYWxzOiBJbnRlcnJ1cHQgd2lsbCBtYWtlIGEgZ3JhY2VmdWwKKyAgZXhpdCwgS2lsbCB3aWxsIGJlIGxlc3MgbmljZSBhbmQgc2hvdWxkIGJlIHVzZWQgaWYgZXZlcnl0aGluZworICBlbHNlIGZhaWxzLgorLSBJbmNsdWRlZCBjaGVjayBmb3IgdGFwZS1oZWFkIG9mZiB0cmFjay4KKy0gSW1wbGVtZW50ZWQgZXhpdCBmcm9tIHRhcGUtc3RhcnQgbG9vcC4KKy0gQWRkZWQga2VybmVsIGlvLXBvcnQgcmVnaXN0cmF0aW9uLgorLSBJbXBsZW1lbnRlZCBza2lwIG9mIGZhaWxpbmcgc2VnbWVudCAoRU5PREFUQSkgb24gZWNjIGZhaWx1cmUuCisgIFRoaXMgYWxsb3dzIGFmaW8gYW5kIHRhciB0byBjb250aW51ZSB3aGVuIHRoZSB0YXBlIGlzIGRhbWFnZWQuCistIE1hZGUgZGlzdGluY3Rpb24gYmV0d2VlbiBkcml2ZSBuYW1lcyB3aXRoIGRpZmZlcmVudCBjb2Rlcy4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAyYywgMjIvMDQvOTUgPT09PT0KKworLSBGaXhlZCB0b28gdGlnaHQgY29tbWFuZCBxdWV1ZWluZyBhZnRlciB0YXBlIHN0b3AvcGF1c2UgY29tbWFuZAorICBpc3N1ZWQgZnJvbSB3aXRoaW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAoU2hvd2VkIGFzIHRpbWVvdXQKKyAgb24gQWNrbm93bGVkZ2UgZXJyb3JzIGR1cmluZyByZXRyaWVzIG9uIHNvbWUgc3lzdGVtcykKKy0gVHJpZWQgdG8gZml4IHRpbWVvdXRzIHdoZW4gdXNpbmcgNDI1IGZ0IHRhcGUgYmVjYXVzZSB0aGUgZXh0ZW5kZWQKKyAgbGVuZ3RoIGRvZXNuJ3Qgc2VlbSB0byBiZSBkZXRlY3RlZCBieSB0aGUgaGFyZHdhcmUuCisgIFdlIG5vdyB1c2UgdGhlIGZvcm1hdCBjb2RlIGZyb20gdGhlIGhlYWRlciBzZWdtZW50IHNvIGFkanVzdCB0aGUKKyAgdGltaW5nIGFmdGVyIHJlYWRpbmcgdGhlIGhlYWRlciBzZWdtZW50LgorLSBGaXhlZCBzb21lIG1lc3NhZ2VzIHN0YXRpbmcgJ3VuZXhwZWN0ZWQgc29tZXRoaW5nLi4uJyBiZWluZyBub3QKKyAgdW5leHBlY3RlZCBhbnltb3JlLgorLSBTdGFydGVkIHByZXBhcmF0aW9ucyBmb3IgbWVyZ2Ugb2YgZHluYW1pYyBidWZmZXIgYWxsb2NhdGlvbiBhbmQKKyAgY29tcHJlc3Npb24gY29kZS4KKy0gQ2hhbmdlZCBzb21lIGRlYnVnIG1lc3NhZ2VzIHRvIGluY2x1ZGUgcmVsZXZhbnQgc2VnbWVudCBpbmZvcm1hdGlvbgorICBhdCBsZXZlbCA0LgorLSBJbmNsdWRlZCBlYXJseSBiYWlsLW91dCB3aGVuIGRyaXZlIG9mZmxpbmUsIHByZXZlbnRpbmcgYSBsb3Qgb2YKKyAgZmFsc2UgbWVzc2FnZXMuCistIE1vdmVkIGZ0YXBlX3BhcmFtZXRlcl94eHgoKSBvZmZzZXRzIGludG8gZnVuY3Rpb24gaW5zdGVhZCBvZiBpbiBjYWxscy4KKy0gUmVtb3ZlZCAnd2VpcmQsIGRyaXZlIGJ1c3kgYnV0IG5vIGRhdGEnIGVycm9yIHdoZW4gY2F1c2VkIGJ5CisgIGFuIGVycm9yIGR1cmluZyBhIHJlYWQtaWQuCistIEltcHJvdmVkICd0aW1lb3V0IG9uIGFja25vd2xlZGdlJyBkaWFnbm9zdGljcy4KKy0gTW92ZWQgTU9EVUxFIG9wdGlvbiBpbnRvIENvbmZpZ3VyZS4KKy0gUmVkdWNlZCBjb2RlIHNpemUgd2hlbiBubyB0cmFjaW5nIGF0IGFsbCB3YXMgc2V0IChDbGF1cyBIZWluZSkuCistIE5vIGxvbmdlciBsb2cgZXJyb3IgY29kZSAwIChubyBlcnJvcikgYXMgYW4gZXJyb3IuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmIsIDA5LzA0Lzk1ID09PT09CisKKy0gUmVsYXhlZCB0aW1pbmcgZm9yIHN0YXR1cyBvcGVyYXRpb24gYW5kIGRpc3BsYXlpbmcKKyAgYWJub3JtYWwgcmVzdWx0cy4gSG9wZWZ1bGx5IHRoaXMgc2hvd3Mgd2hhdCdzIGdvaW5nCisgIHdyb25nIHdpdGggdGhlIENvbm5lciBUU004NTBSIGRyaXZlcy4KKy0gQ3JlYXRlZCBzY3JpcHQgZm9yIGNvbmZpZ3VyYXRpb24sIHVzaW5nIHZlcnNpb24gbnVtYmVyCisgIG9mIGtlcm5lbCBzb3VyY2UgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgL3Byb2MvdmVyc2lvbi4KKy0gRml4ZWQgY29uZGl0aW9uYWxzIGluIGtlcm5lbC1pbnRlcmZhY2UuYy4KKy0gUmVtb3ZlZCB1bmF2b2lkYWJsZSBUUkFDRSBvdXRwdXQuCisKKworPT09PT0gUmVsZWFzZSBub3RlcyBmb3IgZnRhcGUtMi4wMmEsIDAxLzA0Lzk1ID09PT09CisKKy0gSW1wbGVtZW50ZWQgYG5ldy1zdHlsZScgKHZlcnNpb25lZCkgbW9kdWxlcyBzdXBwb3J0IGZvciBuZXcKKyAga2VybmVscy4KKy0gUmVkdWNlZCBzaXplIG9mIG1vZHVsZSBieSBtb3Zpbmcgc3RhdGljIGRhdGEgdG8gYnNzLgorLSBOb3cgdXNpbmcgdmVyc2lvbiBudW1iZXIgb2Yga2VybmVsIHNvdXJjZSBpbnN0ZWFkIG9mIHJ1bm5pbmcKKyAga2VybmVsIGZvciBrZXJuZWwgdmVyc2lvbnMgPj0gMS4xLjgyCistIEFkZGVkIGZlZWRiYWNrIG9uIGRyaXZlIHNwZWVkcyB0byB2ZW5kb3IgaW5mb3JtYXRpb24uCistIEluY2x1ZGVkIGZpeGVkIGluc21vZCBzb3VyY2VzIHRvIGRpc3RyaWJ1dGlvbiAoTGV0J3MgaG9wZQorICB0aGUgbW9kdWxlcyBkaXN0cmlidXRpb24gZ2V0IGZpeGVkIHNvb24gOi0vKS4KKworTm90ZSB0aGF0IEkgaGF2ZW4ndCB5ZXQgaW1wbGVtZW50ZWQgYW55IG9mIHRoZSBjb2RlIGV4dGVuc2lvbiBJCityZWNlaXZlZC4gSSBob3BlIHRvIGZpbmQgc29tZSB0aW1lIHRvIGRvIHRoaXMgc29vbi4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAyLCAxNS8wMS85NSA9PT09PQorCisKKy0gRml4ZWQgZmFpbGluZyByZXBvc2l0aW9uaW5nIHdoZW4gb3ZlcnNob290IHdhcyBpbmNyZW1lbnRlZC4KKy0gRml4ZWQgcmF0ZSBzZWxlY3Rpb246IEJlY2F1c2Ugb2YgYSBkZWZpY2llbmN5IGluIHRoZSBRSUMtMTE3CisgIHNwZWNpZmljYXRpb24gb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbm90IGltcGxlbWVudGVkCisgIGFuZCBhIGZhaWxpbmcgY29tbWFuZC4gVGhlcmVmb3Igd2Ugbm93IHRyeSB0byBmaW5kIG91dCBpZiB0aGUKKyAgZHJpdmUgZG9lcyBzdXBwb3J0IHRoaXMgY29tbWFuZCBiZWZvcmUgdXNhZ2UuCistIEZpeGVkIGVycm9yIHJldHJ5IHVzaW5nIHdyb25nIG9mZnNldCBpbiBmZGMtaXNyLgorLSBJbXByb3ZlZCByZXRyeSBjb2RlIHRvIHJldHJ5IG9ubHkgb25jZSBvbiBhIHNpbmdsZSBuby1kYXRhCisgIGVycm9yIGluIGEgc2VnbWVudC4KKy0gVmFsaWRhdGUgc2VjdG9yIG51bWJlciBleHRyYWN0ZWQgZnJvbSBlb2YgbWFyayBiZWNhdXNlIGFuCisgIGludmFsaWQgZmlsZSBtYXJrIChkdWUgdG8gPz8/KSBjb3VsZCBjYXVzZSBrZXJuZWwgcGFuaWMuCistIFNwbGl0IGZ0YXBlLWlvLmMgaW50byBmdGFwZS1pby5jIGFuZCBmdGFwZS1jdGwuYyBmaWxlcy4KKy0gQ29ycmVjdGVkIHRvbyBoaWdoIG1lZGlhIGVycm9yIGNvdW50IGFmdGVyIHdyaXRpbmcgdG8KKyAgYSBiYWQgdGFwZS4KKy0gQWRkZWQgI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+IGFnYWluIGJlY2F1c2Ugb2xkIGtlcm5lbCB2ZXJzaW9ucworICBuZWVkIGl0LgorLSBGaXhlZCBmZGMgbm90IGJlaW5nIGRpc2FibGVkIHdoZW4gb3BlbiBmYWlsZWQgYmVjYXVzZSBubyB0YXBlCisgIGRyaXZlIHdhcyBmb3VuZC4KKy0gRml4ZWQgcHJvYmxlbSB3aXRoIHNvZnQgZXJyb3IgaW4gc2VjdG9yIDMyIChzaGlmdCBvcGVyYXRvciB3aXRoCisgIHNoaWZ0Y291bnQgMzIgaXMgbm90IGRlZmluZWQpLgorCisKKz09PT09IFJlbGVhc2Ugbm90ZXMgZm9yIGZ0YXBlLTIuMDEsIDA4LzAxLzk1ID09PT09CisKKworLSBSZW1vdmVkIFRFU1RJTkcgc2V0dGluZyBmcm9tIGRpc3RyaWJ1dGVkIE1ha2VmaWxlLgorLSBGaXhlZCBgbXQgYXNmJyBmYWlsdXJlOiBSZXdpbmQgd2FzIGRlZmVycmVkIHRvIGNsb3NlIHdoaWNoCisgIG92ZXJydWxlZCB0aGUgZnNmIGlvY3RsLgorLSBQcmV2ZW50ZWQgbm9uLWludGVycnVwdGlibGUgY29tbWFuZHMgYmVpbmcgaW50ZXJydXB0ZWQuCistIEFkZGVkIG1pc3NpbmcgdGltZW91dC5wYXVzZSBzZXR0aW5nLgorLSBNYXhpbXVtIHRhcGUgc3BlZWQgcmVhZCBmcm9tIGRyaXZlIHR5cGUgaW5mb3JtYXRpb24gdGFibGUuCisgIElmIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgaW4gdGhlIHRhYmxlICgwKSB0aGUgZHJpdmUgd2lsbAorICBkZXRlcm1pbmUgdGhlIHNwZWVkIGl0c2VsZiBhbmQgcHV0IGEgbWVzc2FnZSBpbiB0aGUgbG9nZmlsZS4KKyAgVGhpcyBpbmZvcm1hdGlvbiBzaG91bGQgdGhlbiBiZSBhZGRlZCB0byB0aGUgdGFibGUgaW4gdGhlCisgIHZlbmRvcnMuaCBmaWxlIChhbmQgcmVwb3J0ZWQgdG8gbWUpLgorLSBBZGRlZCBjYWxsIHRvIGZ0YXBlX2luaXRfZHJpdmUgYWZ0ZXIgc29mdCByZXNldCBmb3IgdGhvc2UKKyAgKGFudGlxdWUpIGRyaXZlcyB0aGF0IGRvbid0IGRvIGFuIGltcGxpY2l0IHNlZWtfbG9hZF9wb2ludAorICBhZnRlciBhIHJlc2V0IG9yIHBvd2VyIHVwLgorLSBEb24ndCB0cnkgdG8gc2V0IGRhdGEgcmF0ZSBpZiByZXNldCBmYWlsZWQuCistIFByZXZlbnQgdXBkYXRlIG9mIHNlZWsgdmFyaWFibGVzIHdoZW4gc3RhcnRpbmcgZnJvbSB0aGUKKyAgYmVnaW5uaW5nIG9yIHRoZSBlbmQgb2YgdGhlIHRhcGUuCistIEZpeGVkIHdyb25nIGFkanVzdG1lbnQgb2Ygb3ZlcnNob290IGluIHNlZWtfZm9yd2FyZCgpLgorLSBBZGRlZCBzeW5jIHRvIE1ha2VmaWxlIChhZ2FpbikuCistIEFkZGVkIGNvZGUgdG8gZGlhZ25vc2UgdGltZXIgcHJvYmxlbXMgKGNhbGlici5jKS4KKy0gUmVwbGFjZWQgdGltZSBkaWZmZXJlbmNlcyBieSB0aW1lZGlmZiBjYWxscy4KKy0gUmVtb3ZlZCByZWZlcmVuY2UgdG8gZG9fZmxvcHB5IGZyb20gb2JqZWN0IGZvciByZWNlbnQga2VybmVscy4KKy0gRml4ZWQgd3JvbmcgZGlzcGxheSBvZiAnZmFpbGluZyBkbWEgY29udHJvbGxlcicgbWVzc2FnZS4KKy0gUmVtb3ZlZCB2YXJpb3VzIG5vIGxvbmdlciB1c2VkICNpbmNsdWRlIHN0YXRlbWVudHMuCistIEFkZGVkIG1heC4gdGFwZSBzcGVlZCB2YWx1ZSB0byB2ZW5kb3Itc3RydWN0LgorLSBDaGFuZ2VkIGZ0YXBlLWNvbW1hbmQgdG8gY2hlY2sgcHJlLWNvbmRpdGlvbnMgYW5kIHdhaXQKKyAgaWYgbmVlZGVkLgorLSBGdXJ0aGVyIHVwZGF0ZWQgcWljMTE3LmggdG8gcmV2IEcuCistIENvbWJpbmVkIGNvbW1hbmQgbmFtZSB0YWJsZSBhbmQgcmVzdHJpY3Rpb25zIHRhYmxlIHRvIG9uZS4KKyAgRXh0ZW5kZWQgdGhpcyB0YWJsZSB3aXRoIHNvbWUgbmV3IGZpZWxkcy4KKy0gSW5jcmVhc2VkIHRpbWVvdXQgb24gQWNrIHRpbWVyIHZhbHVlIGFuZCBpbmNsdWRlZCBjb2RlIHRvCisgIHJlcG9ydCBvdXQgb2Ygc3BlYyBiZWhhdmlvdXIuCistIEluY3JlYXNlZCByZXdpbmQgdGltZW91dCBtYXJnaW4gdG8gY2FsY3VsYXRlZCArIDIwJS4KKy0gSW1wcm92ZWQgZGF0YSByYXRlIHNlbGVjdGlvbiBzbyBpdCB3b24ndCBmYWlsIG9uIHNvbWUKKyAgb2xkZXIgKHByZSBzdGFuZGFyZCkgZHJpdmVzLgorLSBDaGFuZ2VkIGluaXRpYWxpc2F0aW9uIGNvZGUgc28gZHJpdmUgd2lsbCBiZSByZXdvdW5kIGlmIHRoZQorICBkcml2ZXIgaXMgcmVsb2FkZWQgYW5kIHRoZSB0YXBlIGlzIG5vdCBhdCBib3QuCistIE1vdmVkIHNvbWUgb2YgdGhlIGZsdXNoIG9wZXJhdGlvbnMgZnJvbSBjbG9zZSB0byB0aGUgaW9jdGxzLgorLSBBZGRlZCBleGl0IGNvZGUgdmFsdWUgdG8gZmFpbGluZyB2ZXJpZnkgYXJlYSBtZXNzYWdlLgorLSBMb29wIHVudGlsIHRhcGUgaGFsdGVkIGluIHNtYXJ0LXN0b3AuCistIEZhc3Qgc2VlayBoYW5kbGVkIHNwZWNpYWxseSBpZiBsb2NhdGVkIGF0IGJvdCBvciBlb3QuCistIEJlaW5nIG1vcmUgY29uc2VydmF0aXZlIG9uIG92ZXJzaG9vdCB2YWx1ZS4KKworCis9PT09PSBSZWxlYXNlIG5vdGVzIGZvciBmdGFwZS0yLjAwLCAzMS8xMi85NCA9PT09PQorCisgIFRoZSBJbnN0YWxsLWd1aWRlIGlzIGNvbXBsZXRlbHkgcmV3cml0dGVuIGFuZCBub3cgYWxzbyBpbmNsdWRlcworc29tZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBkcml2ZXIuIElmIHlvdSdyZSBlaXRoZXIgbmV3Cit0byBmdGFwZSBvciBuZXcgdG8gVW5peCB0YXBlIGRldmljZXMgbWFrZSBzdXJlIHRvIHJlYWQgaXQgIQorCisgIElmIHlvdSBvd24gYSBwY2kgc3lzdGVtIGFuZCBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggdGhlCitmdGFwZSBkcml2ZXIgbWFrZSBzdXJlIHRvIHJlYWQgdGhlIFJFQURNRS5QQ0kgZmlsZS4gSXQgY29udGFpbnMKK3NvbWUgaGludHMgb24gaG93IHRvIGZpeCB5b3VyIGhhcmR3YXJlLgorCisgIEZvciBhbnlib2R5IHdobyBoYXNuJ3Qgbm90aWNlZDogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZQorZHJpdmVyIGhhcyBiZWVuIGluY3JlbWVudGVkIChUaGUgbGF0ZXN0IHJlbGVhc2VkIHZlcnNpb24gaGFzCitiZWVuIHZlcnNpb24gMS4xNGQpLgorICBUaGlzIGhhcyBiZWVuIGRvbmUgZm9yIHR3byBtYWpvciByZWFzb25zOgorCisgIG8gIEEgbmV3IChiZXR0ZXIpIGVycm9yIHJlY292ZXJ5IHNjaGVtZSBpcyBpbXBsZW1lbnRlZC4KKyAgbyAgU3VwcG9ydCBmb3IgbmV3IGRyaXZlIHR5cGVzIGhhcyBiZWVuIGFkZGVkLgorCisgIEFsbCB0aGVzZSBpbXByb3ZlbWVudHMvY2hhbmdlcyB3aWxsIHByb2JhYmx5IGluY2x1ZGUgYSBjb3VwbGUKK29mIG5ldyAoYW5kIG9sZD8pIGJ1Z3MuIElmIHlvdSBlbmNvdW50ZXIgYW55IHByb2JsZW1zIHRoYXQgeW91IHRoaW5rCitJJ20gbm90IHlldCBhd2FyZSBvZiwgZmVlbCBmcmVlIHRvIHNlbmQgYSByZXBvcnQgdG8gPGJhc0B2aW1lYy5ubD4uCisgIEkgcmVjb21tZW5kIGtlZXBpbmcgYSB2ZXJzaW9uIG9mIGZ0YXBlLTEuMTRkIGF2YWlsYWJsZSwganVzdAoraW4gY2FzZSA7LSkKKworICBUaGlzIHZlcnNpb24gc2hvdWxkIHdvcmsgd2l0aCBhbGwga2VybmVsIHZlcnNpb25zIGZyb20gMS4wLjkgdXAKK3RvIDEuMS43MiAoYW5kIHByb2JhYmx5IGVhcmxpZXIgYW5kIGxhdGVyIHZlcnNpb25zIHRvbykuCisKKworTWFqb3IgbmV3IGZlYXR1cmVzOgorCistIEJldHRlciBoYW5kbGluZyBvZiB0YXBlcyB3aXRoIGRlZmVjdHM6IFdoZW4gYSBzZWN0b3IgcmVwZWF0ZWRseQorICAoU09GVF9SRVRSSUVTIGluIGZ0YXBlLmgpIGNhbm5vdCBiZSB3cml0dGVuIHRvIG9yIHJlYWQgZnJvbSBpdCBpcworICBtYXJrZWQgYXMgYW4gaGFyZCBlcnJvciBhbmQgZ2V0cyBza2lwcGVkLgorICBUaGUgZXJyb3IgY29ycmVjdGlvbiBjb2RlIGNhbiBoYW5kbGUgdXAgdG8gdGhyZWUgb2YgdGhlc2UgaGFyZAorICBlcnJvcnMgcHJvdmlkZWQgdGhlcmUgYXJlIG5vIG90aGVyIGVycm9ycyBpbiB0aGF0IHNlZ21lbnQgKDMyIEtiKS4KKyAgCistIEFsbG93cyB3cml0aW5nIHRvIHRhcGVzIHdpdGggZGVmZWN0cyAoYWx0aG91Z2ggdGhlIHJpc2sgb2YgbG9vc2luZworICBkYXRhIGluY3JlYXNlcyAhKQorICBMb29rIGZvciB0aGUgbWVkaWEtZGVmZWN0cyBlbnRyeSBwcmludGVkIHdpdGggdGhlIHN0YXRpc3RpY3Mgd2hlbgorICB0aGUgdGFwZSBpcyBjbG9zZWQuIEEgbm9uLXplcm8gdmFsdWUgaGVyZSBzaG93cyBhIGJhZCB0YXBlLgorICBbdGhlIGFjdHVhbCBjb3VudCBpcyB3cm9uZyAodG9vIGhpZ2gpLCB0aGlzIGlzIGEga25vd24gYnVnXS4KKworLSBVc2Ugb2YgYmFja3VwIGhlYWRlciBzZWdtZW50IGlmIGZpcnN0IG9uZSBpcyBmYWlsaW5nLgorCistIFN1cHBvcnQgZm9yIGV4dGVuZGVkIGxlbmd0aCB0YXBlcyB3aXRoIFFJQy04MDogYm90aCA0MjUgYW5kIDExMDAgZnQuCisgIDAuMjUgaW5jaCB0YXBlcyBhcmUgbm93IHJlY29nbml6ZWQgYW5kIGhhbmRsZWQuCisKKy0gU3VwcG9ydCBmb3IgbmV3IFFJQy04MCBkcml2ZXMgd2l0aCA4IG1tIGB3aWRlJyB0YXBlcyAoZS5nLiBDb25uZXIKKyAgVFNNIDQyMCkuCisKKy0gU3VwcG9ydCBmb3IgbmV3IFFJQy0zMDEwIGFuZCBRSUMtMzAyMCBkcml2ZXMgKGV4cGVyaW1lbnRhbCkgd2l0aAorICBib3RoIDAuMjUgaW5jaCBhbmQgOCBtbSB0YXBlcy4KKworU29tZSBtaW5vciBmZWF0dXJlcyB3ZXJlIGFkZGVkLCBhIGNvdXBsZSBvZiBzbWFsbCBidWdzIHdlcmUgZml4ZWQgYW5kCitwcm9iYWJseSBzb21lIG5ldyBvbmVzIGludHJvZHVjZWQgOy0pLgorCitbbHNlZWsoKSBkaWRuJ3QgbWFrZSBpdCBpbnRvIHRoaXMgdmVyc2lvbl0KKworSGF2ZSBmdW4sCisKK0Jhcy4KKy0tLS0KKyBMb2NhbFdvcmRzOiAgZnRhcGUgTUNPTkZJRyBtdCBWRlMgemZ0YXBlIHJlc3Agc2Z0YXBlIHByb2Mgc3ViZGlyIE1USU9DVk9MSU5GTworIExvY2FsV29yZHM6ICBNVElPQ0dFVFNJWkUgQk9UIEVPRCBNVEJTRiB6ZnQga2VybmVsZCBtb2Rwcm9iZSBrZHRpbWUgY29udHJpYiBUUgorIExvY2FsV29yZHM6ICBNVFNFVEJMSyBhZmlvIHVuaW5zdGFsbCB0ZXhpIHd3dyBFSU8gUUlDIGluaXQgc2Z0IGVvZiBha2EgZG1hIEdCCisgTG9jYWxXb3JkczogIFNJR0tJTEwgTVRJT0NGVENNRCBtbWFwIElvbWVnYSBGREMgZmRjIGlvIGdudW10IG10aW8gZmMgYXNtIGluYgorIExvY2FsV29yZHM6ICBvdXRiIGZ0IHFpYyBmcm9udGVuZCBUZVhpbmZvIGlycSBtYWNoIE1PRFZFUlNJT05TIENPTkZJRyBodG1sIGR2aQorIExvY2FsV29yZHM6ICB1c3IgZG9jIFNNUCBNYiBEdW5ubyBGSVhNRSB2dGJsYyBwZXJsIGxpc3R0YXBlIHZvbGluZm8gZnNmIE1UV0VPRgorIExvY2FsV29yZHM6ICBhbWFuZGEgZGVnYXVzc2VkIENvbUJ5dGUgRG91YmxlUGxheSB3aHJhdmVuIG5qYWNrbiBjb20gTVRJT0MgdnRibAorIExvY2FsV29yZHM6ICBHRVRCTEtTWiBNQUtFREVWIHpmdGFwZSdzIGxpbnV4IGRpZiBDVlMgUmV2aXNvbiBjcCBNVFJFVyBNVE9GRkwKKyBMb2NhbFdvcmRzOiAgTVRGU0YgQlNGIE1hcmNpbiBEYWxlY2tpIEdDQyBDb25maWcgY3BpbyBzd2Fwb3V0IEthaSBIYXJyZWtpbGRlCisgTG9jYWxXb3JkczogIFBlZGVyc29uIGtocCBkb2xwaGluaWNzIEp1c3R1cyBjbGF1cyBtb21vIHJ3dGggYWFjaGVuIExhYXJob3ZlbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJkNmM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvTWFrZWZpbGUKQEAgLTAsMCArMSwzMSBAQAorIworIyAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisjCisjICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9jb21wcmVzc29yL01ha2VmaWxlLHYgJAorIyAkUmV2aXNpb246IDEuMSAkCisjICREYXRlOiAxOTk3LzEwLzA1IDE5OjEyOjI4ICQKKyMKKyMgICAgICBNYWtlZmlsZSBmb3IgdGhlIG9wdGlvbmFsIGNvbXByZXNzb3IgZm9yIHRoIHpmdGFwZSBWRlMKKyMgICAgICBpbnRlcmZhY2UgdG8gdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvcgorIyAgICAgIExpbnV4LgorIworCitvYmotJChDT05GSUdfWkZUX0NPTVBSRVNTT1IpICs9IHpmdC1jb21wcmVzc29yLm8KKworemZ0LWNvbXByZXNzb3Itb2JqcyA6PSB6ZnRhcGUtY29tcHJlc3MubyBsenJ3My5vCisKK0NGTEFHU19senJ3My5vCTo9IC1PNiAtZnVucm9sbC1hbGwtbG9vcHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL2x6cnczLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci9senJ3My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzJhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci9senJ3My5jCkBAIC0wLDAgKzEsNzQzIEBACisvKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4xICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjEyOjI5ICQKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBSb3NzIFdpbGxpYW1zIGx6cnczIGFsZ29yaXRobS4gQWRhcHRpb24gZm9yIHpmdGFwZS4KKyAqCisgKi8KKworI2luY2x1ZGUgIi4uL2NvbXByZXNzb3IvbHpydzMuaCIgICAgICAgLyogRGVmaW5lcyBzaW5nbGUgZXhwb3J0ZWQgZnVuY3Rpb24gImNvbXByZXNzIi4gICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFpSVzMuQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBdXRob3IgIDogUm9zcyBXaWxsaWFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGF0ZSAgICA6IDMwLUp1bi0xOTkxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJlbGVhc2UgOiAxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZpbGUgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIExaUlczIGRhdGEgY29tcHJlc3Npb24gICAgICAgICAqLworLyogYWxnb3JpdGhtIGluIEMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgYWxnb3JpdGhtIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGFsZ29yaXRobSB0aGF0IHJ1bnMgZmFzdCAgICAqLworLyogYW5kIGdpdmVzIHJlYXNvbmFibGUgY29tcHJlc3Npb24uIFRoZSBhbGdvcml0aG0gaXMgYSBtZW1iZXIgb2YgdGhlIExlbXBlbCAgKi8KKy8qIFppdiBmYW1pbHkgb2YgYWxnb3JpdGhtcyBhbmQgYmFzZXMgaXRzIGNvbXByZXNzaW9uIG9uIHRoZSBwcmVzZW5jZSBpbiB0aGUgICovCisvKiBkYXRhIG9mIHJlcGVhdGVkIHN1YnN0cmluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgYWxnb3JpdGhtIGlzIHVucGF0ZW50ZWQgYW5kIHRoZSBjb2RlIGlzIHB1YmxpYyBkb21haW4uIEFzIHRoZSAgICAgICAgICovCisvKiBhbGdvcml0aG0gaXMgYmFzZWQgb24gdGhlIExaNzcgY2xhc3Mgb2YgYWxnb3JpdGhtcywgaXQgaXMgdW5saWtlbHkgdG8gYmUgICAqLworLyogdGhlIHN1YmplY3Qgb2YgYSBwYXRlbnQgY2hhbGxlbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbmxpa2UgdGhlIExaUlcxIGFuZCBMWlJXMS1BIGFsZ29yaXRobXMsIHRoZSBMWlJXMyBhbGdvcml0aG0gaXMgICAgICAgICAgICAqLworLyogZGV0ZXJtaW5pc3RpYyBhbmQgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCB0aGUgc2FtZSBjb21wcmVzc2VkICAgICAgICAgICAgICAgKi8KKy8qIHJlcHJlc2VudGF0aW9uIGZvciBhIGdpdmVuIGZpbGUgZWFjaCB0aW1lIGl0IGlzIHJ1bi4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIExaUlczIGFsZ29yaXRobSB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgICAgICAgICAgICAgICAgKi8KKy8qIGJ5IFJvc3MgV2lsbGlhbXMgb24gMzEtRGVjLTE5OTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSGVyZSBhcmUgdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhpcyBjb2RlLCBjb21waWxlZCB1bmRlciBUSElOSyBDIDQuMCAgICAgKi8KKy8qIGFuZCBydW5uaW5nIG9uIGEgTWFjLVNFICg4TUh6IDY4MDAwKSwgdG8gdGhlIHN0YW5kYXJkIGNhbGdhcnkgY29ycHVzLiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgKi8KKy8qICAgIHwgREFUQSBDT01QUkVTU0lPTiBURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgICB8ID09PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLworLyogICAgfCBUaW1lIG9mIHJ1biAgICAgOiBTdW4gMzAtSnVuLTE5OTEgMDk6MzFQTSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KKy8qICAgIHwgVGltaW5nIGFjY3VyYWN5IDogT25lIHBhcnQgaW4gMTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgICB8IENvbnRleHQgbGVuZ3RoICA6IDI2MjE0NCBieXRlcyAoPSAyNTYuMDAwMEspICAgICAgICAgICAgICAgICAgIHwgICAgICAqLworLyogICAgfCBUZXN0IHN1aXRlICAgICAgOiBDYWxnYXJ5IENvcnB1cyBTdWl0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgKi8KKy8qICAgIHwgRmlsZXMgaW4gc3VpdGUgIDogMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgICB8IEFsZ29yaXRobSAgICAgICA6IExaUlczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAqLworLyogICAgfCBOb3RlOiBBbGwgYXZlcmFnZXMgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgdW4tcm91bmRlZCB2YWx1ZXMuICB8ICAgICAgKi8KKy8qICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICovCisvKiAgICB8IEZpbGUgTmFtZSAgIExlbmd0aCAgQ3hCICBDb21MZW4gICVSZW1uICBCaXRzICBDb20gSy9zICBEZWMgSy9zIHwgICAgICAqLworLyogICAgfCAtLS0tLS0tLS0tICAtLS0tLS0gIC0tLSAgLS0tLS0tICAtLS0tLSAgLS0tLSAgLS0tLS0tLSAgLS0tLS0tLSB8ICAgICAgKi8KKy8qICAgIHwgcnB1czpCaWIuRCAgMTExMjYxICAgIDEgICA1NTAzMyAgIDQ5LjUgIDMuOTYgICAgMTkuNDYgICAgMzIuMjcgfCAgICAgICovCisvKiAgICB8IHVzOkJvb2sxLkQgIDc2ODc3MSAgICAzICA0Njc5NjIgICA2MC45ICA0Ljg3ICAgIDE3LjAzICAgIDMxLjA3IHwgICAgICAqLworLyogICAgfCB1czpCb29rMi5EICA2MTA4NTYgICAgMyAgMzE3MTAyICAgNTEuOSAgNC4xNSAgICAxOS4zOSAgICAzNC4xNSB8ICAgICAgKi8KKy8qICAgIHwgcnB1czpHZW8uRCAgMTAyNDAwICAgIDEgICA4MjQyNCAgIDgwLjUgIDYuNDQgICAgMTEuNjUgICAgMTguMTggfCAgICAgICovCisvKiAgICB8IHB1czpOZXdzLkQgIDM3NzEwOSAgICAyICAyMDU2NzAgICA1NC41ICA0LjM2ICAgIDE3LjE0ICAgIDI3LjQ3IHwgICAgICAqLworLyogICAgfCBwdXM6T2JqMS5EICAgMjE1MDQgICAgMSAgIDEzMDI3ICAgNjAuNiAgNC44NSAgICAxMy40MCAgICAxOC45NSB8ICAgICAgKi8KKy8qICAgIHwgcHVzOk9iajIuRCAgMjQ2ODE0ICAgIDEgIDExNjI4NiAgIDQ3LjEgIDMuNzcgICAgMTkuMzEgICAgMzAuMTAgfCAgICAgICovCisvKiAgICB8IHM6UGFwZXIxLkQgICA1MzE2MSAgICAxICAgMjc1MjIgICA1MS44ICA0LjE0ICAgIDE4LjYwICAgIDMxLjE1IHwgICAgICAqLworLyogICAgfCBzOlBhcGVyMi5EICAgODIxOTkgICAgMSAgIDQ1MTYwICAgNTQuOSAgNC40MCAgICAxOC40NSAgICAzMi44NCB8ICAgICAgKi8KKy8qICAgIHwgcnB1czpQaWMuRCAgNTEzMjE2ICAgIDIgIDEyMjM4OCAgIDIzLjggIDEuOTEgICAgMzUuMjkgICAgNTEuMDUgfCAgICAgICovCisvKiAgICB8IHVzOlByb2djLkQgICAzOTYxMSAgICAxICAgMTk2NjkgICA0OS43ICAzLjk3ICAgIDE4Ljg3ICAgIDMwLjY0IHwgICAgICAqLworLyogICAgfCB1czpQcm9nbC5EICAgNzE2NDYgICAgMSAgIDI4MjQ3ICAgMzkuNCAgMy4xNSAgICAyNC4zNCAgICA0MC42NiB8ICAgICAgKi8KKy8qICAgIHwgdXM6UHJvZ3AuRCAgIDQ5Mzc5ICAgIDEgICAxOTM3NyAgIDM5LjIgIDMuMTQgICAgMjMuOTEgICAgMzkuMjMgfCAgICAgICovCisvKiAgICB8IHVzOlRyYW5zLkQgICA5MzY5NSAgICAxICAgMzM0ODEgICAzNS43ICAyLjg2ICAgIDI1LjQ4ICAgIDQwLjM3IHwgICAgICAqLworLyogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgKi8KKy8qICAgIHwgQXZlcmFnZSAgICAgMjI0NDAxICAgIDEgIDExMDk1MyAgIDUwLjAgIDQuMDAgICAgMjAuMTcgICAgMzIuNzIgfCAgICAgICovCisvKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHJldHVybmVkIGJ5IHRoZSAiY29tcHJlc3MiIGZ1bmN0aW9uIGJlbG93IHdoZW4gICovCisvKiB0aGUgdXNlciBhc2tzIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAqLworLyogVGhlIG1vc3QgaW1wb3J0YW50IGZpZWxkIGluIHRoZSByZWNvcmQgaXMgdGhlIHdvcmtpbmcgbWVtb3J5IGZpZWxkIHdoaWNoICAgKi8KKy8qIHRlbGxzIHRoZSBjYWxsaW5nIHByb2dyYW0gaG93IG11Y2ggd29ya2luZyBtZW1vcnkgc2hvdWxkIGJlIHBhc3NlZCB0byAgICAgICovCisvKiAiY29tcHJlc3MiIHdoZW4gaXQgaXMgY2FsbGVkIHRvIHBlcmZvcm0gYSBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uLiAgICAqLworLyogTFpSVzMgdXNlcyB0aGUgc2FtZSBhbW91bnQgb2YgbWVtb3J5IGR1cmluZyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4gKi8KKy8qIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgc3RydWN0dXJlIHNlZSAiY29tcHJlc3MuaCIuICAgICAgICAgICAgICAgICAgICovCisgIAorI2RlZmluZSBVKFgpICAgICAgICAgICAgKChVTE9ORykgWCkKKyNkZWZpbmUgU0laRV9QX0JZVEUgICAgIChVKHNpemVvZihVQllURSAqKSkpCisjZGVmaW5lIFNJWkVfV09SRCAgICAgICAoVShzaXplb2YoVVdPUkQgICkpKQorI2RlZmluZSBBTElHTk1FTlRfRlVER0UgKFUoMTYpKQorI2RlZmluZSBNRU1fUkVRICggVSg0MDk2KSooU0laRV9QX0JZVEUpICsgQUxJR05NRU5UX0ZVREdFICkKKworc3RhdGljIHN0cnVjdCBjb21wcmVzc19pZGVudGl0eSBpZGVudGl0eSA9Cit7CisgVSgweDAzMkRERUE4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGdvcml0aG0gaWRlbnRpZmljYXRpb24gbnVtYmVyLiAqLworIE1FTV9SRVEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29ya2luZyBtZW1vcnkgKGJ5dGVzKSByZXF1aXJlZC4gKi8KKyAiTFpSVzMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAgICovCisgIjEuMCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uIG51bWJlciBvZiBhbGdvcml0aG0uICAgICAqLworICIzMS1EZWMtMTk5MCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0ZSBvZiBhbGdvcml0aG0uICAgICAgICAgICAgICAgKi8KKyAiUHVibGljIERvbWFpbiIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHlyaWdodCBub3RpY2UuICAgICAgICAgICAgICAgICovCisgIlJvc3MgTi4gV2lsbGlhbXMiLCAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRob3Igb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAqLworICJSZW5haXNzYW5jZSBTb2Z0d2FyZSIsICAgICAgICAgICAgICAgICAgLyogQWZmaWxpYXRpb24gb2YgYXV0aG9yLiAgICAgICAgICAgKi8KKyAiUHVibGljIERvbWFpbiIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciBvZiBhbGdvcml0aG0uICAgICAgICAgICAgICovCit9OworIAorTE9DQUwgdm9pZCBjb21wcmVzc19jb21wcmVzcyAgKFVCWVRFICosVUJZVEUgKixVTE9ORyxVQllURSAqLCBMT05HICopOworTE9DQUwgdm9pZCBjb21wcmVzc19kZWNvbXByZXNzKFVCWVRFICosVUJZVEUgKixMT05HLCBVQllURSAqLCBVTE9ORyAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyB0aGUgb25seSBmdW5jdGlvbiBleHBvcnRlZCBieSB0aGlzIG1vZHVsZS4gICAgICAgICAgICAgICAgKi8KKy8qIERlcGVuZGluZyBvbiBpdHMgZmlyc3QgcGFyYW1ldGVyLCB0aGUgZnVuY3Rpb24gY2FuIGJlIHJlcXVlc3RlZCB0byAgICAgICAgICovCisvKiBjb21wcmVzcyBhIGJsb2NrIG9mIG1lbW9yeSwgZGVjb21wcmVzcyBhIGJsb2NrIG9mIG1lbW9yeSwgb3IgdG8gaWRlbnRpZnkgICAqLworLyogaXRzZWxmLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUgImNvbXByZXNzLmgiLiAgICAgKi8KKworRVhQT1JUIHZvaWQgbHpydzNfY29tcHJlc3MoCisJVVdPUkQgICAgIGFjdGlvbiwgICAgICAvKiBBY3Rpb24gdG8gYmUgcGVyZm9ybWVkLgkJKi8KKwlVQllURSAgICp3cmtfbWVtLAkvKiBBZGRyZXNzIG9mIHdvcmtpbmcgbWVtb3J5IHdlIGNhbiB1c2UuKi8KKwlVQllURSAgICpzcmNfYWRyLAkvKiBBZGRyZXNzIG9mIGlucHV0IGRhdGEuCQkqLworCUxPTkcgICAgIHNyY19sZW4sCS8qIExlbmd0aCAgb2YgaW5wdXQgZGF0YS4JCSovCisJVUJZVEUgICAqZHN0X2FkciwJLyogQWRkcmVzcyB0byBwdXQgb3V0cHV0IGRhdGEuCQkqLworCXZvaWQgICpwX2RzdF9sZW4JLyogQWRkcmVzcyBvZiBsb25nd29yZCBmb3IgbGVuZ3RoIG9mIG91dHB1dCBkYXRhLiovCispCit7Cisgc3dpdGNoIChhY3Rpb24pCisgICB7CisgICAgY2FzZSBDT01QUkVTU19BQ1RJT05fSURFTlRJVFk6CisgICAgICAgKigoc3RydWN0IGNvbXByZXNzX2lkZW50aXR5ICoqKXBfZHN0X2xlbik9ICZpZGVudGl0eTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIENPTVBSRVNTX0FDVElPTl9DT01QUkVTUzoKKyAgICAgICBjb21wcmVzc19jb21wcmVzcyh3cmtfbWVtLHNyY19hZHIsc3JjX2xlbixkc3RfYWRyLChMT05HICopcF9kc3RfbGVuKTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIENPTVBSRVNTX0FDVElPTl9ERUNPTVBSRVNTOgorICAgICAgIGNvbXByZXNzX2RlY29tcHJlc3Mod3JrX21lbSxzcmNfYWRyLHNyY19sZW4sZHN0X2FkciwoTE9ORyAqKXBfZHN0X2xlbik7CisgICAgICAgYnJlYWs7CisgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQlJJRUYgREVTQ1JJUFRJT04gT0YgVEhFIExaUlczIEFMR09SSVRITSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgTFpSVzMgYWxnb3JpdGhtIGlzIGlkZW50aWNhbCB0byB0aGUgTFpSVzEtQSBhbGdvcml0aG0gZXhjZXB0IHRoYXQgICAgICAqLworLyogaW5zdGVhZCBvZiB0cmFuc21pdHRpbmcgaGlzdG9yeSBvZmZzZXRzLCBpdCB0cmFuc21pdHMgaGFzaCB0YWJsZSBpbmRleGVzLiAgKi8KKy8qIEluIG9yZGVyIHRvIGRlY29kZSB0aGUgaW5kZXhlcywgdGhlIGRlY29tcHJlc3NvciBtdXN0IG1haW50YWluIGFuICAgICAgICAgICovCisvKiBpZGVudGljYWwgaGFzaCB0YWJsZS4gQ29weSBpdGVtcyBhcmUgc3RyYWlnaHRmb3J3YXJkOndoZW4gdGhlIGRlY29tcHJlc3NvciAqLworLyogcmVjZWl2ZXMgYSBjb3B5IGl0ZW0sIGl0IHNpbXBseSBsb29rcyB1cCB0aGUgaGFzaCB0YWJsZSB0byB0cmFuc2xhdGUgdGhlICAgKi8KKy8qIGluZGV4IGludG8gYSBwb2ludGVyIGludG8gdGhlIGRhdGEgYWxyZWFkeSBkZWNvbXByZXNzZWQuIFRvIHVwZGF0ZSB0aGUgICAgICovCisvKiBoYXNoIHRhYmxlLCBpdCByZXBsYWNlcyB0aGUgc2FtZSB0YWJsZSBlbnRyeSB3aXRoIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgICAqLworLyogb2YgdGhlIG5ld2x5IGRlY29kZWQgcGhyYXNlLiBUaGUgdHJpY2t5IHBhcnQgaXMgd2l0aCBsaXRlcmFsIGl0ZW1zLCBmb3IgYXQgKi8KKy8qIHRoZSB0aW1lIHRoYXQgdGhlIGRlY29tcHJlc3NvciByZWNlaXZlcyBhIGxpdGVyYWwgaXRlbSB0aGUgZGVjb21wcmVzc29yICAgICovCisvKiBkb2VzIG5vdCBoYXZlIHRoZSB0aHJlZSBieXRlcyBpbiB0aGUgWml2ICh0aGF0IHRoZSBjb21wcmVzc29yIGhhcykgdG8gICAgICAqLworLyogcGVyZm9ybSB0aGUgdGhyZWUtYnl0ZSBoYXNoLiBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIGluIExaUlczLCBib3RoIHRoZSAgICAgKi8KKy8qIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBhcmUgd2lyZWQgdXAgc28gdGhhdCB0aGV5ICJidWZmZXIiIHRoZXNlICAgICAgICovCisvKiBsaXRlcmFscyBhbmQgdXBkYXRlIHRoZWlyIGhhc2ggdGFibGVzIG9ubHkgd2hlbiB0aHJlZSBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLworLyogVGhpcyBtYWtlcyB0aGUgbWF4aW11bSBidWZmZXJpbmcgMiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXBsYWNlbWVudCBvZiBvZmZzZXRzIGJ5IGhhc2ggdGFibGUgaW5kZXhlcyB5aWVsZHMgYSBmZXcgcGVyY2VudCBleHRyYSAgICAqLworLyogY29tcHJlc3Npb24gYXQgdGhlIGNvc3Qgb2Ygc29tZSBzcGVlZC4gTFpSVzMgaXMgc2xvd2VyIHRoYW4gTFpSVzEsIExaUlcxLUEgKi8KKy8qIGFuZCBMWlJXMiwgYnV0IHlpZWxkcyBiZXR0ZXIgY29tcHJlc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRXh0cmEgY29tcHJlc3Npb24gY291bGQgYmUgb2J0YWluZWQgYnkgdXNpbmcgYSBoYXNoIHRhYmxlIG9mIGRlcHRoIHR3by4gICAgKi8KKy8qIEhvd2V2ZXIsIGluY3JlYXNpbmcgdGhlIGRlcHRoIGFib3ZlIG9uZSBpbmN1cnMgYSBzaWduaWZpY2FudCBkZWNyZWFzZSBpbiAgICovCisvKiBjb21wcmVzc2lvbiBzcGVlZCB3aGljaCB3YXMgbm90IGNvbnNpZGVyZWQgd29ydGh3aGlsZS4gQW5vdGhlciByZWFzb24gZm9yICAqLworLyoga2VlcGluZyB0aGUgZGVwdGggZG93biB0byBvbmUgd2FzIHRvIGFsbG93IGVhc3kgY29tcGFyaXNvbiB3aXRoIHRoZSAgICAgICAgKi8KKy8qIExaUlcxLUEgYW5kIExaUlcyIGFsZ29yaXRobXMgc28gYXMgdG8gZGVtb25zdHJhdGUgdGhlIGV4YWN0IGVmZmVjdCBvZiB0aGUgICovCisvKiB1c2Ugb2YgZGlyZWN0IGhhc2ggaW5kZXhlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19ffDQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKl98PC0tLSsgICAvLS0tLSstLS1cICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8X19ffCAgICArLS0tfEhhc2ggICAgfCAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfF9fX3wgICAgICAgIHxGdW5jdGlvbnwgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHxfX198ICAgICAgICBcLS0tLS0tLS0vICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8X19ffDAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgKy0tLSsgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIEhhc2ggICAgICAgICstLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBUYWJsZSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAqLworLyogICAgICB8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCAgICAgICAgICAgICAgKi8KKy8qICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICovCisvKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfDEuLi4uLi4xOHwgICAgICB8ICAgICAgICAgICAgICAqLworLyogICAgICB8PC0tLS0tLS0gTGVtcGVsPUhpc3RvcnkgLS0tLS0tLS0tLS0tPnw8LS1aaXYtLT58ICAgICAgfCAgICAgICAgICAgICAgKi8KKy8qICAgICAgfCAgICAgKD1ieXRlcyBhbHJlYWR5IHByb2Nlc3NlZCkgICAgICB8PC1TdGlsbCB0byBnby0tPnwgICAgICAgICAgICAgICovCisvKiAgICAgIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5QVVQgQkxPQ0sgLS0tLS0tLS0tLS0tLS0tLS0tLT58ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBkaWFncmFtIGFib3ZlIGZvciBMWlJXMyBsb29rcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBkaWFncmFtIGZvciAgICAgICovCisvKiBMWlJXMS4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBpbiBMWlJXMywgdGhlIGNvbXByZXNzb3IgdHJhbnNtaXRzIGhhc2ggICAgICAqLworLyogdGFibGUgaW5kaWNlcyBpbnN0ZWFkIG9mIExlbXBlbCBvZmZzZXRzLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgICAgICAgICAgICAgKi8KKy8qIGRlY29tcHJlc3NvciBtdXN0IG1haW50YWluIGEgaGFzaCB0YWJsZSBhcyB3ZWxsIGFzIHRoZSBjb21wcmVzc29yIGFuZCBib3RoICovCisvKiBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCAiYnVmZmVyIiBsaXRlcmFscywgYXMgdGhlIGRlY29tcHJlc3NvciAgICAqLworLyogY2Fubm90IGhhc2ggcGhyYXNlcyBjb21tZW5jaW5nIHdpdGggYSBsaXRlcmFsIHVudGlsIGFub3RoZXIgdHdvIGJ5dGVzIGhhdmUgKi8KKy8qIGFycml2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExaUlczIEFsZ29yaXRobSBFeGVjdXRpb24gU3VtbWFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gSGFzaCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlIFppdiB0byB5aWVsZCBhIGhhc2ggdGFibGUgaW5kZXggaC4gICAqLworLyogIDIuIExvb2sgdXAgdGhlIGhhc2ggdGFibGUgeWllbGRpbmcgaGlzdG9yeSBwb2ludGVyIHAuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAzLiBNYXRjaCB3aGVyZSBwIHBvaW50cyB3aXRoIHRoZSBaaXYuIElmIHRoZXJlIGlzIGEgbWF0Y2ggb2YgdGhyZWUgb3IgICAgICovCisvKiAgICAgbW9yZSBieXRlcywgY29kZSB0aG9zZSBieXRlcyAoaW4gdGhlIFppdikgYXMgYSBjb3B5IGl0ZW0sIG90aGVyd2lzZSAgICAqLworLyogICAgIGNvZGUgdGhlIG5leHQgYnl0ZSBpbiB0aGUgWml2IGFzIGEgbGl0ZXJhbCBpdGVtLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA0LiBVcGRhdGUgdGhlIGhhc2ggdGFibGUgYXMgcG9zc2libGUgc3ViamVjdCB0byB0aGUgY29uc3RyYWludCB0aGF0IG9ubHkgICovCisvKiAgICAgcGhyYXNlcyBjb21tZW5jaW5nIHRocmVlIGJ5dGVzIGJhY2sgZnJvbSB0aGUgWml2IGNhbiBiZSBoYXNoZWQgYW5kICAgICAqLworLyogICAgIGVudGVyZWQgaW50byB0aGUgaGFzaCB0YWJsZS4gKFRoaXMgZW5hYmxlcyB0aGUgZGVjb21wcmVzc29yIHRvIGtlZXAgICAgKi8KKy8qICAgICBwYWNlKS4gU2VlIHRoZSBkZXNjcmlwdGlvbiBhbmQgY29kZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgQ09NUFJFU1NFRCBGSUxFIEZPUk1BVCAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIEEgY29tcHJlc3NlZCBmaWxlIGNvbnNpc3RzIG9mIGEgQ09QWSBGTEFHIGZvbGxvd2VkIGJ5IGEgUkVNQUlOREVSLiAgICAgICovCisvKiAgKiBUaGUgY29weSBmbGFnIENGIHVzZXMgdXAgZm91ciBieXRlcyB3aXRoIHRoZSBmaXJzdCBieXRlIGJlaW5nIHRoZSAgICAgICAqLworLyogICAgbGVhc3Qgc2lnbmlmaWNhbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIElmIENGPTEsIHRoZW4gdGhlIGNvbXByZXNzZWQgZmlsZSByZXByZXNlbnRzIHRoZSByZW1haW5kZXIgb2YgdGhlIGZpbGUgICovCisvKiAgICBleGFjdGx5LiBPdGhlcndpc2UgQ0Y9MCBhbmQgdGhlIHJlbWFpbmRlciBvZiB0aGUgZmlsZSBjb25zaXN0cyBvZiB6ZXJvICAqLworLyogICAgb3IgbW9yZSBHUk9VUFMsIGVhY2ggb2Ygd2hpY2ggcmVwcmVzZW50cyBvbmUgb3IgbW9yZSBieXRlcy4gICAgICAgICAgICAgKi8KKy8qICAqIEVhY2ggZ3JvdXAgY29uc2lzdHMgb2YgdHdvIGJ5dGVzIG9mIENPTlRST0wgaW5mb3JtYXRpb24gZm9sbG93ZWQgYnkgICAgICovCisvKiAgICBzaXh0ZWVuIElURU1zIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZ3JvdXAgd2hpY2ggY2FuIGNvbnRhaW4gZnJvbSBvbmUgICAgICAqLworLyogICAgdG8gc2l4dGVlbiBpdGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIEFuIGl0ZW0gY2FuIGJlIGVpdGhlciBhIExJVEVSQUwgaXRlbSBvciBhIENPUFkgaXRlbS4gICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBFYWNoIGl0ZW0gY29ycmVzcG9uZHMgdG8gYSBiaXQgaW4gdGhlIGNvbnRyb2wgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAqLworLyogICogVGhlIGZpcnN0IGNvbnRyb2wgYnl0ZSBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgOCBpdGVtcyBpbiB0aGUgZ3JvdXAgICAgKi8KKy8qICAgIHdpdGggYml0IDAgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgZ3JvdXAgYW5kIGJpdCA3IHRvICAgICovCisvKiAgICB0aGUgZWlnaHRoIGl0ZW0gaW4gdGhlIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICogVGhlIHNlY29uZCBjb250cm9sIGJ5dGUgY29ycmVzcG9uZHMgdG8gdGhlIHNlY29uZCA4IGl0ZW1zIGluIHRoZSBncm91cCAgKi8KKy8qICAgIHdpdGggYml0IDAgY29ycmVzcG9uZGluZyB0byB0aGUgbmludGggaXRlbSBpbiB0aGUgZ3JvdXAgYW5kIGJpdCA3IHRvICAgICovCisvKiAgICB0aGUgc2l4dGVlbnRoIGl0ZW0gaW4gdGhlIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICogQSB6ZXJvIGJpdCBpbiBhIGNvbnRyb2wgd29yZCBtZWFucyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0gaXMgYSAgICAgKi8KKy8qICAgIGxpdGVyYWwgaXRlbS4gQSBvbmUgYml0IGNvcnJlc3BvbmRzIHRvIGEgY29weSBpdGVtLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBBIGxpdGVyYWwgaXRlbSBjb25zaXN0cyBvZiBhIHNpbmdsZSBieXRlIHdoaWNoIHJlcHJlc2VudHMgaXRzZWxmLiAgICAgICAqLworLyogICogQSBjb3B5IGl0ZW0gY29uc2lzdHMgb2YgdHdvIGJ5dGVzIHRoYXQgcmVwcmVzZW50IGZyb20gMyB0byAxOCBieXRlcy4gICAgKi8KKy8qICAqIFRoZSBmaXJzdCAgYnl0ZSBpbiBhIGNvcHkgaXRlbSB3aWxsIGJlIGRlbm90ZWQgQzEuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBUaGUgc2Vjb25kIGJ5dGUgaW4gYSBjb3B5IGl0ZW0gd2lsbCBiZSBkZW5vdGVkIEMyLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICogQml0cyB3aWxsIGJlIHNlbGVjdGVkIHVzaW5nIHNxdWFyZSBicmFja2V0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZvciBleGFtcGxlOiBDMVswLi4zXSBpcyB0aGUgbG93IG5pYmJsZSBvZiB0aGUgZmlyc3QgY29udHJvbCBieXRlLiAgICAgICovCisvKiAgICBvZiBjb3B5IGl0ZW0gQzEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICogVGhlIExFTkdUSCBvZiBhIGNvcHkgaXRlbSBpcyBkZWZpbmVkIHRvIGJlIEMxWzAuLjNdKzMgd2hpY2ggaXMgYSBudW1iZXIgKi8KKy8qICAgIGluIHRoZSByYW5nZSBbMywxOF0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKiBUaGUgSU5ERVggb2YgYSBjb3B5IGl0ZW0gaXMgZGVmaW5lZCB0byBiZSBDMVs0Li43XSoyNTYrQzJbMC4uOF0gd2hpY2ggICAqLworLyogICAgaXMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLDQwOTVdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqIEEgY29weSBpdGVtIHJlcHJlc2VudHMgdGhlIHNlcXVlbmNlIG9mIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICB0ZXh0W1BPUy1PRkZTRVQuLlBPUy1PRkZTRVQrTEVOR1RILTFdIHdoZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgdGV4dCAgIGlzIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmluZy4gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIFBPUyAgICBpcyB0aGUgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlICAgICovCisvKiAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgYWxsIHRoZSBpdGVtcyBwcmVjZWVkaW5nIHRoZSBpdGVtICAqLworLyogICAgICAgICAgICAgICAgICAgYmVpbmcgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIE9GRlNFVCBpcyBvYnRhaW5lZCBmcm9tIElOREVYIGJ5IGxvb2tpbmcgdXAgdGhlIGhhc2ggdGFibGUuICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGZvbGxvd2luZyAjZGVmaW5lIGRlZmluZXMgdGhlIGxlbmd0aCBvZiB0aGUgY29weSBmbGFnIHRoYXQgYXBwZWFycyBhdCAgKi8KKy8qIHRoZSBzdGFydCBvZiB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgdmFsdWUgb2YgZm91ciBieXRlcyB3YXMgY2hvc2VuICAgICAgICovCisvKiBiZWNhdXNlIHRoZSBmYXN0X2NvcHkgcm91dGluZSBvbiBteSBNYWNpbnRvc2ggcnVucyBmYXN0ZXIgaWYgdGhlIHNvdXJjZSAgICAqLworLyogYW5kIGRlc3RpbmF0aW9uIGJsb2NrcyBhcmUgcmVsYXRpdmVseSBsb25nd29yZCBhbGlnbmVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBhY3R1YWwgZmxhZyBkYXRhIGFwcGVhcnMgaW4gdGhlIGZpcnN0IGJ5dGUuIFRoZSByZXN0IGFyZSB6ZXJvZWQgc28gYXMgICovCisvKiB0byBub3JtYWxpemUgdGhlIGNvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gKGkuZS4gbm90IG5vbi1kZXRlcm1pbmlzdGljKS4gICAqLworI2RlZmluZSBGTEFHX0JZVEVTIDQKKworLyogVGhlIGZvbGxvd2luZyAjZGVmaW5lcyBkZWZpbmUgdGhlIG1lYW5pbmcgb2YgdGhlIHZhbHVlcyBvZiB0aGUgY29weSAgICAgICAgKi8KKy8qIGZsYWcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb21wcmVzc2VkIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZMQUdfQ09NUFJFU1MgMCAgICAgLyogU2lnbmFscyB0aGF0IG91dHB1dCB3YXMgcmVzdWx0IG9mIGNvbXByZXNzaW9uLiAqLworI2RlZmluZSBGTEFHX0NPUFkgICAgIDEgICAgIC8qIFNpZ25hbHMgdGhhdCBvdXRwdXQgd2FzIHNpbXBseSBjb3BpZWQgb3Zlci4gICAgKi8KKworLyogVGhlIDY4MDAwIG1pY3JvcHJvY2Vzc29yIChvbiB3aGljaCB0aGlzIGFsZ29yaXRobSB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgKi8KKy8qIGlzIGZ1c3N5IGFib3V0IG5vbi1hbGlnbmVkIGFycmF5cyBvZiB3b3Jkcy4gVG8gYXZvaWQgdGhlc2UgcHJvYmxlbXMgdGhlICAgICovCisvKiBmb2xsb3dpbmcgbWFjcm8gY2FuIGJlIHVzZWQgdG8gIndhc3RlIiBmcm9tIDAgdG8gMyBieXRlcyBzbyBhcyB0byBhbGlnbiAgICAqLworLyogdGhlIGFyZ3VtZW50IHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUxPTkdfQUxJR05fVVAoWCkgKCgoKFVMT05HKVgpK3NpemVvZihVTE9ORyktMSkmfihzaXplb2YoVUxPTkcpLTEpKQorCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgZGVmaW5lcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gdW5jb21wcmVzc2VkIGl0ZW0uICovCisvKiBUaGlzIGRlZmluaXRpb24gbXVzdCBub3QgYmUgY2hhbmdlZDsgaXRzIHZhbHVlIGlzIGhhcmR3aXJlZCBpbnRvIHRoZSBjb2RlLiAqLworLyogVGhlIGxvbmdlc3QgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHNwYW5uZWQgYnkgYSBzaW5nbGUgaXRlbSBpcyAxOCAgICAgKi8KKy8qIGZvciB0aGUgbG9uZ2VzdCBjb3B5IGl0ZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWF9SQVdfSVRFTSAoMTgpCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgZGVmaW5lcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gdW5jb21wcmVzc2VkIGdyb3VwLiovCisvKiBUaGlzIGRlZmluaXRpb24gbXVzdCBub3QgYmUgY2hhbmdlZDsgaXRzIHZhbHVlIGlzIGhhcmR3aXJlZCBpbnRvIHRoZSBjb2RlLiAqLworLyogQSBncm91cCBjb250YWlucyBhdCBtb3N0IDE2IGl0ZW1zIHdoaWNoIGV4cGxhaW5zIHRoaXMgZGVmaW5pdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgTUFYX1JBV19HUk9VUCAoMTYqTUFYX1JBV19JVEVNKQorCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRlZmluZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tcHJlc3NlZCBncm91cC4gICAqLworLyogVGhpcyBkZWZpbml0aW9uIG11c3Qgbm90IGJlIGNoYW5nZWQ7IGl0cyB2YWx1ZSBpcyBoYXJkd2lyZWQgaW50byB0aGUgY29kZS4gKi8KKy8qIEEgY29tcHJlc3NlZCBncm91cCBjb25zaXN0cyBvZiB0d28gY29udHJvbCBieXRlcyBmb2xsb3dlZCBieSB1cCB0byAxNiAgICAgICovCisvKiBjb21wcmVzc2VkIGl0ZW1zIGVhY2ggb2Ygd2hpY2ggY2FuIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiB0d28gYnl0ZXMuICAgICAqLworI2RlZmluZSBNQVhfQ01QX0dST1VQICgyKzE2KjIpCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUuICAgICovCisvKiBUaGlzIGRlZmluaXRpb24gbXVzdCBub3QgYmUgY2hhbmdlZDsgaXRzIHZhbHVlIGlzIGhhcmR3aXJlZCBpbnRvIHRoZSBjb2RlLiAqLworI2RlZmluZSBIQVNIX1RBQkxFX0xFTkdUSCAoNDA5NikKKworLyogTFpSVzMsIHVubGlrZSBMWlJXMSgtQSksIG11c3QgaW5pdGlhbGl6ZSBpdHMgaGFzaCB0YWJsZSBzbyBhcyB0byBlbmFibGUgICAgKi8KKy8qIHRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgdG8gc3RheSBpbiBzdGVwIG1haW50YWluaW5nIGlkZW50aWNhbCBoYXNoICovCisvKiB0YWJsZXMuIEluIGFuIGVhcmx5IHZlcnNpb24gb2YgdGhlIGFsZ29yaXRobSwgdGhlIHRhYmxlcyB3ZXJlIHNpbXBseSAgICAgICAqLworLyogaW5pdGlhbGl6ZWQgdG8gemVybyBhbmQgYSBjaGVjayBmb3IgemVybyB3YXMgaW5jbHVkZWQganVzdCBiZWZvcmUgdGhlICAgICAgKi8KKy8qIG1hdGNoaW5nIGNvZGUuIEhvd2V2ZXIsIHRoaXMgdGVzdCBjb3N0cyB0aW1lLiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byAgICAgICovCisvKiBpbml0aWFsaXplIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSB0byBwb2ludCB0byBhIGNvbnN0YW50ICAgICAgICAqLworLyogc3RyaW5nLiBUaGUgZGVjb21wcmVzc29yIGRvZXMgdGhlIHNhbWUuIFRoaXMgc29sdXRpb24gcmVxdWlyZXMgbm8gZXh0cmEgICAgKi8KKy8qIHRlc3QuIFRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGRvIG5vdCBtYXR0ZXIgc28gbG9uZyBhcyB0aGUgc3RyaW5nIGlzICAgICovCisvKiB0aGUgc2FtZSBmb3IgdGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBhbmQgY29udGFpbnMgYXQgbGVhc3QgICAgICAgICAqLworLyogTUFYX1JBV19JVEVNIGJ5dGVzLiBJIGNob3NlIGNvbnNlY3V0aXZlIGRlY2ltYWwgZGlnaXRzIGJlY2F1c2UgdGhleSBkbyBub3QgKi8KKy8qIGhhdmUgd2hpdGUgc3BhY2UgcHJvYmxlbXMgKGUuZy4gdGhlcmUgaXMgbm8gY2hhbmNlIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgICovCisvKiByZXBsYWNlIG1vcmUgdGhhbiBvbmUgc3BhY2UgYnkgYSBUQUIpIGFuZCBiZWNhdXNlIHRoZXkgbWFrZSB0aGUgbGVuZ3RoIG9mICAqLworLyogdGhlIHN0cmluZyBvYnZpb3VzIGJ5IGluc3BlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1RBUlRfU1RSSU5HXzE4ICgoVUJZVEUgKikgIjEyMzQ1Njc4OTAxMjM0NTY3OCIpCisKKy8qIEluIHRoaXMgYWxnb3JpdGhtLCBoYXNoIHZhbHVlcyBoYXZlIHRvIGJlIGNhbGN1bGF0ZWQgYXQgbW9yZSB0aGFuIG9uZSAgICAgICovCisvKiBwb2ludC4gVGhlIGZvbGxvd2luZyBtYWNybyBuZWF0ZW5zIHRoZSBjb2RlIHVwIGZvciB0aGlzLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVNIKFBUUikgXAorICAgKCgoNDA1NDMqKCgoKihQVFIpKTw8OCleKCgqKChQVFIpKzEpKTw8NCleKCooKFBUUikrMikpKSk+PjQpICYgMHhGRkYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIElucHV0ICA6IEhhbmQgb3ZlciB0aGUgcmVxdWlyZWQgYW1vdW50IG9mIHdvcmtpbmcgbWVtb3J5IGluIHBfd3JrX21lbS4gICAgICovCisvKiBJbnB1dCAgOiBTcGVjaWZ5IGlucHV0IGJsb2NrIHVzaW5nIHBfc3JjX2ZpcnN0IGFuZCBzcmNfbGVuLiAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgIDogUG9pbnQgcF9kc3RfZmlyc3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBvdXRwdXQgem9uZSAoT1opLiAgICAgICAgICAgKi8KKy8qIElucHV0ICA6IFBvaW50IHBfZHN0X2xlbiB0byBhIFVMT05HIHRvIHJlY2VpdmUgdGhlIG91dHB1dCBsZW5ndGguICAgICAgICAgICovCisvKiBJbnB1dCAgOiBJbnB1dCBibG9jayBhbmQgb3V0cHV0IHpvbmUgbXVzdCBub3Qgb3ZlcmxhcC4gICAgICAgICAgICAgICAgICAgICAqLworLyogT3V0cHV0IDogTGVuZ3RoIG9mIG91dHB1dCBibG9jayB3cml0dGVuIHRvICpwX2RzdF9sZW4uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE91dHB1dCA6IE91dHB1dCBibG9jayBpbiBNZW1bcF9kc3RfZmlyc3QuLnBfZHN0X2ZpcnN0KypwX2RzdF9sZW4tMV0uIE1heSAgICovCisvKiBPdXRwdXQgOiB3cml0ZSBpbiBPWj1NZW1bcF9kc3RfZmlyc3QuLnBfZHN0X2ZpcnN0K3NyY19sZW4rTUFYX0NNUF9HUk9VUC0xXS4qLworLyogT3V0cHV0IDogVXBvbiBjb21wbGV0aW9uIGd1YXJhbnRlZWQgKnBfZHN0X2xlbjw9c3JjX2xlbitGTEFHX0JZVEVTLiAgICAgICAgKi8KK0xPQ0FMIHZvaWQgY29tcHJlc3NfY29tcHJlc3MoVUJZVEUgKnBfd3JrX21lbSwKKwkJCSAgICAgVUJZVEUgKnBfc3JjX2ZpcnN0LCBVTE9ORyAgc3JjX2xlbiwKKwkJCSAgICAgVUJZVEUgKnBfZHN0X2ZpcnN0LCBMT05HICAqcF9kc3RfbGVuKQoreworIC8qIHBfc3JjIGFuZCBwX2RzdCBzdGVwIHRocm91Z2ggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmxvY2tzLiAgICAgICAgICAgKi8KKyByZWdpc3RlciBVQllURSAqcF9zcmMgPSBwX3NyY19maXJzdDsKKyByZWdpc3RlciBVQllURSAqcF9kc3QgPSBwX2RzdF9maXJzdDsKKyAKKyAvKiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgbmV2ZXIgbW9kaWZpZWQgYW5kIGFyZSB1c2VkIGluIHRoZSAgICAgICAgICAgICovCisgLyogY2FsY3VsYXRpb25zIHRoYXQgZGV0ZXJtaW5lIHdoZW4gdGhlIG1haW4gbG9vcCB0ZXJtaW5hdGVzLiAgICAgICAgICAgICAgICAqLworIFVCWVRFICpwX3NyY19wb3N0ICA9IHBfc3JjX2ZpcnN0K3NyY19sZW47CisgVUJZVEUgKnBfZHN0X3Bvc3QgID0gcF9kc3RfZmlyc3Qrc3JjX2xlbjsKKyBVQllURSAqcF9zcmNfbWF4MSAgPSBwX3NyY19maXJzdCtzcmNfbGVuLU1BWF9SQVdfSVRFTTsKKyBVQllURSAqcF9zcmNfbWF4MTYgPSBwX3NyY19maXJzdCtzcmNfbGVuLU1BWF9SQVdfSVRFTSoxNjsKKyAKKyAvKiBUaGUgdmFyaWFibGVzICdwX2NvbnRyb2wnIGFuZCAnY29udHJvbCcgYXJlIHVzZWQgdG8gYnVmZmVyIGNvbnRyb2wgYml0cy4gICovCisgLyogQmVmb3JlIGVhY2ggZ3JvdXAgaXMgcHJvY2Vzc2VkLCB0aGUgbmV4dCB0d28gYnl0ZXMgb2YgdGhlIG91dHB1dCBibG9jayAgICAqLworIC8qIGFyZSBzZXQgYXNpZGUgZm9yIHRoZSBjb250cm9sIHdvcmQgZm9yIHRoZSBncm91cCBhYm91dCB0byBiZSBwcm9jZXNzZWQuICAgKi8KKyAvKiAncF9jb250cm9sJyBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhhdCB3b3JkLiBNZWFud2hpbGUsICAgICovCisgLyogJ2NvbnRyb2wnIGJ1ZmZlcnMgdGhlIGNvbnRyb2wgYml0cyBiZWluZyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nICAqLworIC8qIG9mIHRoZSBncm91cC4gSW5zdGVhZCBvZiBoYXZpbmcgYSBjb3VudGVyIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgaXRlbXMgKi8KKyAvKiBoYXZlIGJlZW4gcHJvY2Vzc2VkICg9dGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb250cm9sIHdvcmQpLCBhdCB0aGUgICAgICovCisgLyogc3RhcnQgb2YgZWFjaCBncm91cCwgdGhlIHRvcCB3b3JkIG9mICdjb250cm9sJyBpcyBmaWxsZWQgd2l0aCAxIGJpdHMuICAgICAqLworIC8qIEFzICdjb250cm9sJyBpcyBzaGlmdGVkIGZvciBlYWNoIGl0ZW0sIHRoZSAxIGJpdHMgaW4gdGhlIHRvcCB3b3JkIGFyZSAgICAgKi8KKyAvKiBhYnNvcmJlZCBvciBkZXN0cm95ZWQuIFdoZW4gdGhleSBhbGwgcnVuIG91dCAoaS5lLiB3aGVuIHRoZSB0b3Agd29yZCBpcyAgICovCisgLyogYWxsIHplcm8gYml0cywgd2Uga25vdyB0aGF0IHdlIGFyZSBhdCB0aGUgZW5kIG9mIGEgZ3JvdXAuICAgICAgICAgICAgICAgICAqLworIyBkZWZpbmUgVE9QV09SRCAweEZGRkYwMDAwCisgVUJZVEUgKnBfY29udHJvbDsKKyByZWdpc3RlciBVTE9ORyBjb250cm9sPVRPUFdPUkQ7CisgCisgLyogVEhlIHZhcmlhYmxlICdoYXNoJyBhbHdheXMgcG9pbnRzIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBoYXNoIHRhYmxlLiAqLworIFVCWVRFICoqaGFzaD0gKFVCWVRFICoqKSAgVUxPTkdfQUxJR05fVVAocF93cmtfbWVtKTsKKyAKKyAvKiBUaGUgZm9sbG93aW5nIHR3byB2YXJpYWJsZXMgcmVwcmVzZW50IHRoZSBsaXRlcmFsIGJ1ZmZlci4gcF9oMSBwb2ludHMgdG8gICovCisgLyogdGhlIGhhc2ggdGFibGUgZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUgeW91bmdlc3QgbGl0ZXJhbC4gcF9oMiBwb2ludHMgICAqLworIC8qIHRvIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlY29uZCB5b3VuZ2VzdCBsaXRlcmFsLiAgICAgKi8KKyAvKiBOb3RlOiBwX2gxPTA9PnBfaDI9MCBiZWNhdXNlIHplcm8gdmFsdWVzIGRlbm90ZSBhYnNlbmNlIG9mIGEgcGVuZGluZyAgICAgICovCisgLyogbGl0ZXJhbC4gVGhlIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybyBtZWFuaW5nIGFuIGVtcHR5ICJidWZmZXIiLiAqLworIFVCWVRFICoqcF9oMT1OVUxMOworIFVCWVRFICoqcF9oMj1OVUxMOworICAKKyAvKiBUbyBzdGFydCwgd2Ugd3JpdGUgdGhlIGZsYWcgYnl0ZXMuIEJlaW5nIG9wdGltaXN0aWMsIHdlIHNldCB0aGUgZmxhZyB0byAgICovCisgLyogRkxBR19DT01QUkVTUy4gVGhlIHJlbWFpbmluZyBmbGFnIGJ5dGVzIGFyZSB6ZXJvZWQgc28gYXMgdG8ga2VlcCB0aGUgICAgICAqLworIC8qIGFsZ29yaXRobSBkZXRlcm1pbmlzdGljLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAqcF9kc3QrKz1GTEFHX0NPTVBSRVNTOworIHtVV09SRCBpOyBmb3IgKGk9MjtpPD1GTEFHX0JZVEVTO2krKykgKnBfZHN0Kys9MDt9CisKKyAvKiBSZXNlcnZlIHRoZSBmaXJzdCB3b3JkIG9mIG91dHB1dCBhcyB0aGUgY29udHJvbCB3b3JkIGZvciB0aGUgZmlyc3QgZ3JvdXAuICovCisgLyogTm90ZTogVGhpcyBpcyB1bmRvbmUgYXQgdGhlIGVuZCBpZiB0aGUgaW5wdXQgYmxvY2sgaXMgZW1wdHkuICAgICAgICAgICAgICAqLworIHBfY29udHJvbD1wX2RzdDsgcF9kc3QrPTI7CisgCisgLyogSW5pdGlhbGl6ZSBhbGwgZWxlbWVudHMgb2YgdGhlIGhhc2ggdGFibGUgdG8gcG9pbnQgdG8gYSBjb25zdGFudCBzdHJpbmcuICAqLworIC8qIFVzZSBvZiBhbiB1bnJvbGxlZCBsb29wIHNwZWVkcyB0aGlzIHVwIGNvbnNpZGVyYWJseS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyB7VVdPUkQgaTsgVUJZVEUgKipwX2g9aGFzaDsKKyMgIGRlZmluZSBaSCAqcF9oKys9U1RBUlRfU1RSSU5HXzE4CisgIGZvciAoaT0wO2k8MjU2O2krKykgICAgIC8qIDI1Nj1IQVNIX1RBQkxFX0xFTkdUSC8xNi4gKi8KKyAgICB7Wkg7Wkg7Wkg7Wkg7CisgICAgIFpIO1pIO1pIO1pIOworICAgICBaSDtaSDtaSDtaSDsKKyAgICAgWkg7Wkg7Wkg7Wkg7fQorIH0KKworIC8qIFRoZSBtYWluIGxvb3AgcHJvY2Vzc2VzIGVpdGhlciAxIG9yIDE2IGl0ZW1zIHBlciBpdGVyYXRpb24uIEFzIGl0cyAgICAgICAgKi8KKyAvKiB0ZXJtaW5hdGlvbiBsb2dpYyBpcyBjb21wbGljYXRlZCwgSSBoYXZlIG9wdGVkIGZvciBhbiBpbmZpbml0ZSBsb29wICAgICAgICovCisgLyogc3RydWN0dXJlIGNvbnRhaW5pbmcgJ2JyZWFrJyBhbmQgJ2dvdG8nIHN0YXRlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAqLworIHdoaWxlIChUUlVFKQorICAgey8qIEJlZ2luIG1haW4gcHJvY2Vzc2luZyBsb29wLiAqLworICAgCisgICAgLyogTm90ZTogQWxsIHRoZSB2YXJpYWJsZXMgaGVyZSBleGNlcHQgdW5yb2xsIHNob3VsZCBiZSBkZWZpbmVkIHdpdGhpbiAgICAqLworICAgIC8qICAgICAgIHRoZSBpbm5lciBsb29wLiBVbmZvcnR1bmF0ZWx5IHRoZSBsb29wIGhhc24ndCBnb3QgYSBibG9jay4gICAgICAgKi8KKyAgICAgcmVnaXN0ZXIgVUJZVEUgKnA7ICAgICAgICAgLyogU2NhbnMgdGhyb3VnaCB0YXJnIHBocmFzZSBkdXJpbmcgbWF0Y2hpbmcuICovCisgICAgIHJlZ2lzdGVyIFVCWVRFICpwX3ppdj0gTlVMTCA7ICAgICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBvZiBjdXJyZW50IFppdi4gICAgICAgKi8KKyAgICAgcmVnaXN0ZXIgVVdPUkQgdW5yb2xsOyAgICAgLyogTG9vcCBjb3VudGVyIGZvciB1bnJvbGxlZCBpbm5lciBsb29wLiAgICAgICovCisgICAgIHJlZ2lzdGVyIFVXT1JEIGluZGV4OyAgICAgIC8qIEluZGV4IG9mIGN1cnJlbnQgaGFzaCB0YWJsZSBlbnRyeS4gICAgICAgICAqLworICAgICByZWdpc3RlciBVQllURSAqKnBfaDAgPSBOVUxMIDsgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBoYXNoIHRhYmxlIGVudHJ5LiAgICAgICAqLworICAgICAKKyAgICAvKiBUZXN0IGZvciBvdmVycnVuIGFuZCBqdW1wIHRvIG92ZXJydW4gY29kZSBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICovCisgICAgaWYgKHBfZHN0PnBfZHN0X3Bvc3QpCisgICAgICAgZ290byBvdmVycnVuOworICAgICAgIAorICAgIC8qIFRoZSBmb2xsb3dpbmcgY2FzY2FkZSBvZiBpZiBzdGF0ZW1lbnRzIGVmZmljaWVudGx5IGNhdGNoZXMgYW5kIGRlYWxzICAgKi8KKyAgICAvKiB3aXRoIHZhcnlpbmcgZGVncmVlcyBvZiBjbG9zZW5lc3MgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgYmxvY2suICAgICAgICovCisgICAgLyogV2hlbiB3ZSBnZXQgdmVyeSBjbG9zZSB0byB0aGUgZW5kLCB3ZSBzdG9wIHVwZGF0aW5nIHRoZSB0YWJsZSBhbmQgICAgICAqLworICAgIC8qIGNvZGUgdGhlIHJlbWFpbmluZyBieXRlcyBhcyBsaXRlcmFscy4gVGhpcyBtYWtlcyB0aGUgY29kZSBzaW1wbGVyLiAgICAgKi8KKyAgICB1bnJvbGw9MTY7CisgICAgaWYgKHBfc3JjPnBfc3JjX21heDE2KQorICAgICAgeworICAgICAgIHVucm9sbD0xOworICAgICAgIGlmIChwX3NyYz5wX3NyY19tYXgxKQorICAgICAgICAgeworICAgICAgICAgIGlmIChwX3NyYz09cF9zcmNfcG9zdCkKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgZ290byBsaXRlcmFsOworICAgICAgICAgfQorICAgICAgfQorICAgICAgICAgCisgICAgLyogVGhpcyBpbm5lciB1bnJvbGxlZCBsb29wIHByb2Nlc3NlcyAndW5yb2xsJyAod2hvc2UgdmFsdWUgaXMgZWl0aGVyIDEgICAqLworICAgIC8qIG9yIDE2KSBpdGVtcy4gSSBoYXZlIGNob3NlbiB0byBpbXBsZW1lbnQgdGhpcyBsb29wIHdpdGggbGFiZWxzIGFuZCAgICAgKi8KKyAgICAvKiBnb3RvcyB0byBoZWlnaHRlbiB0aGUgZWFzZSB3aXRoIHdoaWNoIHRoZSBsb29wIG1heSBiZSBpbXBsZW1lbnRlZCB3aXRoICovCisgICAgLyogYSBzaW5nbGUgZGVjcmVtZW50IGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb24gaW4gYXNzZW1ibHkgbGFuZ3VhZ2UgYW5kICAgICAqLworICAgIC8qIGFsc28gYmVjYXVzZSB0aGUgbGFiZWxzIGFjdCBhcyBoaWdobHkgcmVhZGFibGUgcGxhY2UgbWFya2Vycy4gICAgICAgICAgKi8KKyAgICAvKiAoQWxzbyBiZWNhdXNlIHdlIGp1bXAgaW50byB0aGUgbG9vcCBmb3IgZW5kZ2FtZSBsaXRlcmFscyAoc2VlIGFib3ZlKSkuICovCisgICAgCisgICAgYmVnaW5fdW5yb2xsZWRfbG9vcDoKKyAgICAKKyAgICAgICAvKiBUbyBwcm9jZXNzIHRoZSBuZXh0IHBocmFzZSwgd2UgaGFzaCB0aGUgbmV4dCB0aHJlZSBieXRlcyBhbmQgdXNlICAgICovCisgICAgICAgLyogdGhlIHJlc3VsdGFudCBoYXNoIHRhYmxlIGluZGV4IHRvIGxvb2sgdXAgdGhlIGhhc2ggdGFibGUuIEEgcG9pbnRlciAqLworICAgICAgIC8qIHRvIHRoZSBlbnRyeSBpcyBzdG9yZWQgaW4gcF9oMCBzbyBhcyB0byBhdm9pZCBhbiBhcnJheSBsb29rdXAuIFRoZSAgKi8KKyAgICAgICAvKiBoYXNoIHRhYmxlIGVudHJ5ICpwX2gwIGlzIGxvb2tlZCB1cCB5aWVsZGluZyBhIHBvaW50ZXIgcCB0byBhICAgICAgICovCisgICAgICAgLyogcG90ZW50aWFsIG1hdGNoIG9mIHRoZSBaaXYgaW4gdGhlIGhpc3RvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgIGluZGV4PUhBU0gocF9zcmMpOworICAgICAgIHBfaDA9Jmhhc2hbaW5kZXhdOworICAgICAgIHA9KnBfaDA7CisgICAgICAgCisgICAgICAgLyogSGF2aW5nIGxvb2tlZCB1cCB0aGUgY2FuZGlkYXRlIHBvc2l0aW9uLCB3ZSBhcmUgaW4gYSBwb3NpdGlvbiB0byAgICAqLworICAgICAgIC8qIGF0dGVtcHQgYSBtYXRjaC4gVGhlIG1hdGNoIGxvb3AgaGFzIGJlZW4gdW5yb2xsZWQgdXNpbmcgdGhlIFBTICAgICAgKi8KKyAgICAgICAvKiBtYWNybyBzbyB0aGF0IGZhaWx1cmUgd2l0aGluIHRoZSBmaXJzdCB0aHJlZSBieXRlcyBhdXRvbWF0aWNhbGx5ICAgICovCisgICAgICAgLyogcmVzdWx0cyBpbiB0aGUgbGl0ZXJhbCBicmFuY2ggYmVpbmcgdGFrZW4uIFRoZSBjb2RpbmcgaXMgc2ltcGxlLiAgICAqLworICAgICAgIC8qIHBfeml2IHNhdmVzIHBfc3JjIHNvIHdlIGNhbiBsZXQgcF9zcmMgd2FuZGVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyMgICAgICAgZGVmaW5lIFBTICpwKyshPSpwX3NyYysrCisgICAgICAgcF96aXY9cF9zcmM7CisgICAgICAgaWYgKFBTIHx8IFBTIHx8IFBTKQorICAgICAgICAgeworICAgICAgICAgIC8qIExpdGVyYWwuICovCisgICAgICAgICAgCisgICAgICAgICAgLyogQ29kZSB0aGUgbGl0ZXJhbCBieXRlIGFzIGl0c2VsZiBhbmQgYSB6ZXJvIGNvbnRyb2wgYml0LiAgICAgICAgICAqLworICAgICAgICAgIHBfc3JjPXBfeml2OyBsaXRlcmFsOiAqcF9kc3QrKz0qcF9zcmMrKzsgY29udHJvbCY9MHhGRkZFRkZGRjsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBXZSBoYXZlIGp1c3QgY29kZWQgYSBsaXRlcmFsLiBJZiB3ZSBoYWQgdHdvIHBlbmRpbmcgb25lcywgdGhhdCAgICovCisgICAgICAgICAgLyogbWFrZXMgdGhyZWUgYW5kIHdlIGNhbiB1cGRhdGUgdGhlIGhhc2ggdGFibGUuICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwX2gyIT0wKQorICAgICAgICAgICAgIHsqcF9oMj1wX3ppdi0yO30KKyAgICAgICAgICAgICAKKyAgICAgICAgICAvKiBJbiBhbnkgY2FzZSwgcm90YXRlIHRoZSBoYXNoIHRhYmxlIHBvaW50ZXJzIGZvciBuZXh0IHRpbWUuICovCisgICAgICAgICAgcF9oMj1wX2gxOyBwX2gxPXBfaDA7CisgICAgICAgICAgCisgICAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgIC8qIENvcHkgKi8KKyAgICAgICAgICAKKyAgICAgICAgICAvKiBNYXRjaCB1cCB0byAxNSByZW1haW5pbmcgYnl0ZXMgdXNpbmcgYW4gdW5yb2xsZWQgbG9vcCBhbmQgY29kZS4gKi8KKyNpZiAwCisgICAgICAgICAgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwgUFMgfHwKKyAgICAgICAgICBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBwX3NyYysrOworI2Vsc2UgICAgIAorICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICEoIFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8IFBTIHx8CisgICAgICAgICAgICAgICAgICBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyB8fCBQUyApIAorICAgICAgICAgICAgICkgcF9zcmMrKzsKKyNlbmRpZgorICAgICAgICAgICpwX2RzdCsrPSgoaW5kZXgmMHhGMDApPj40KXwoLS1wX3NyYy1wX3ppdi0zKTsKKyAgICAgICAgICAqcF9kc3QrKz1pbmRleCYweEZGOworICAgICAgICAgIAorICAgICAgICAgIC8qIEFzIHdlIGhhdmUganVzdCBjb2RlZCB0aHJlZSBieXRlcywgd2UgYXJlIG5vdyBpbiBhIHBvc2l0aW9uIHRvICAgKi8KKyAgICAgICAgICAvKiB1cGRhdGUgdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgbGl0ZXJhbCBieXRlcyB0aGF0IHdlcmUgcGVuZGluZyAgICovCisgICAgICAgICAgLyogdXBvbiB0aGUgYXJyaXZhbCBvZiBleHRyYSBjb250ZXh0IGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwX2gxIT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgIGlmIChwX2gyKQorICAgICAgICAgICAgICAgeypwX2gyPXBfeml2LTI7IHBfaDI9TlVMTDt9CisgICAgICAgICAgICAgKnBfaDE9cF96aXYtMTsgcF9oMT1OVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgLyogSW4gYW55IGNhc2UsIHdlIGNhbiB1cGRhdGUgdGhlIGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgICAqLworICAgICAgICAgIC8qIHBvc2l0aW9uIGFzIHdlIGp1c3QgY29kZWQgYXQgbGVhc3QgdGhyZWUgYnl0ZXMgaW4gYSBjb3B5IGl0ZW1zLiAgKi8KKyAgICAgICAgICAqcF9oMD1wX3ppdjsKKyAgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgICBjb250cm9sPj49MTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAvKiBUaGlzIGxvb3AgaXMgYWxsIHNldCB1cCBmb3IgYSBkZWNyZW1lbnQgYW5kIGp1bXAgaW5zdHJ1Y3Rpb24hICovCisjaWZuZGVmIGxpbnV4CitgICAgIGVuZF91bnJvbGxlZF9sb29wOiBpZiAoLS11bnJvbGwpIGdvdG8gYmVnaW5fdW5yb2xsZWRfbG9vcDsKKyNlbHNlCisgICAgLyogZW5kX3Vucm9sbGVkX2xvb3A6ICovIGlmICgtLXVucm9sbCkgZ290byBiZWdpbl91bnJvbGxlZF9sb29wOworI2VuZGlmCisKKyAgICAvKiBBdCB0aGlzIHBvaW50IGl0IHdpbGwgbmVhcmx5IGFsd2F5cyBiZSB0aGUgZW5kIG9mIGEgZ3JvdXAgaW4gd2hpY2ggICAgICovCisgICAgLyogY2FzZSwgd2UgaGF2ZSB0byBkbyBzb21lIGNvbnRyb2wtd29yZCBwcm9jZXNzaW5nLiBIb3dldmVyLCBuZWFyIHRoZSAgICAqLworICAgIC8qIGVuZCBvZiB0aGUgaW5wdXQgYmxvY2ssIHRoZSBpbm5lciB1bnJvbGxlZCBsb29wIGlzIG9ubHkgZXhlY3V0ZWQgb25jZS4gKi8KKyAgICAvKiBUaGlzIG5lY2Vzc2l0YXRlcyB0aGUgJ2lmJyB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKChjb250cm9sJlRPUFdPUkQpPT0wKQorICAgICAgeworICAgICAgIC8qIFdyaXRlIHRoZSBjb250cm9sIHdvcmQgdG8gdGhlIHBsYWNlIHdlIHNhdmVkIGZvciBpdCBpbiB0aGUgb3V0cHV0LiAqLworICAgICAgICpwX2NvbnRyb2wrKz0gIGNvbnRyb2wgICAgICYweEZGOworICAgICAgICpwX2NvbnRyb2wgID0gKGNvbnRyb2w+PjgpICYweEZGOworCisgICAgICAgLyogUmVzZXJ2ZSB0aGUgbmV4dCB3b3JkIGluIHRoZSBvdXRwdXQgYmxvY2sgZm9yIHRoZSBjb250cm9sIHdvcmQgKi8KKyAgICAgICAvKiBmb3IgdGhlIGdyb3VwIGFib3V0IHRvIGJlIHByb2Nlc3NlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgIHBfY29udHJvbD1wX2RzdDsgcF9kc3QrPTI7CisgICAgICAgCisgICAgICAgLyogUmVzZXQgdGhlIGNvbnRyb2wgYml0cyBidWZmZXIuICovCisgICAgICAgY29udHJvbD1UT1BXT1JEOworICAgICAgfQorICAgICAgICAgIAorICAgfSAvKiBFbmQgbWFpbiBwcm9jZXNzaW5nIGxvb3AuICovCisgICAKKyAvKiBBZnRlciB0aGUgbWFpbiBwcm9jZXNzaW5nIGxvb3AgaGFzIGV4ZWN1dGVkLCBhbGwgdGhlIGlucHV0IGJ5dGVzIGhhdmUgICAgICovCisgLyogYmVlbiBwcm9jZXNzZWQuIEhvd2V2ZXIsIHRoZSBjb250cm9sIHdvcmQgaGFzIHN0aWxsIHRvIGJlIHdyaXR0ZW4gdG8gdGhlICAqLworIC8qIHdvcmQgcmVzZXJ2ZWQgZm9yIGl0IGluIHRoZSBvdXRwdXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBtb3N0IHJlY2VudCBncm91cC4gKi8KKyAvKiBCZWZvcmUgd3JpdGluZywgdGhlIGNvbnRyb2wgd29yZCBoYXMgdG8gYmUgc2hpZnRlZCBzbyB0aGF0IGFsbCB0aGUgYml0cyAgICovCisgLyogYXJlIGluIHRoZSByaWdodCBwbGFjZS4gVGhlICJlbXB0eSIgYml0IHBvc2l0aW9ucyBhcmUgZmlsbGVkIHdpdGggMXMgICAgICAqLworIC8qIHdoaWNoIHBhcnRpYWxseSBmaWxsIHRoZSB0b3Agd29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyB3aGlsZShjb250cm9sJlRPUFdPUkQpIGNvbnRyb2w+Pj0xOworICpwX2NvbnRyb2wrKz0gY29udHJvbCAgICAgJjB4RkY7CisgKnBfY29udHJvbCsrPShjb250cm9sPj44KSAmMHhGRjsKKyAKKyAvKiBJZiB0aGUgbGFzdCBncm91cCBjb250YWluZWQgbm8gaXRlbXMsIGRlbGV0ZSB0aGUgY29udHJvbCB3b3JkIHRvby4gICAgICAgICovCisgaWYgKHBfY29udHJvbD09cF9kc3QpIHBfZHN0LT0yOworIAorIC8qIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIG91dHB1dCBibG9jayB0byB0aGUgZHN0X2xlbiBwYXJhbWV0ZXIgYW5kIHJldHVybi4gKi8KKyAqcF9kc3RfbGVuPXBfZHN0LXBfZHN0X2ZpcnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIHJldHVybjsKKyAKKyAvKiBKdW1wIGhlcmUgYXMgc29vbiBhcyBhbiBvdmVycnVuIGlzIGRldGVjdGVkLiBBbiBvdmVycnVuIGlzIGRlZmluZWQgdG8gICAgICovCisgLyogaGF2ZSBvY2N1cnJlZCBpZiBwX2RzdD5wX2RzdF9maXJzdCtzcmNfbGVuLiBUaGF0IGlzLCB0aGUgbW9tZW50IHRoZSAgICAgICAqLworIC8qIGxlbmd0aCBvZiB0aGUgb3V0cHV0IHdyaXR0ZW4gc28gZmFyIGV4Y2VlZHMgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYmxvY2suKi8KKyAvKiBUaGUgYWxnb3JpdGhtIGNoZWNrcyBmb3Igb3ZlcnJ1bnMgYXQgbGVhc3QgYXQgdGhlIGVuZCBvZiBlYWNoIGdyb3VwICAgICAgICovCisgLyogd2hpY2ggbWVhbnMgdGhhdCB0aGUgbWF4aW11bSBvdmVycnVuIGlzIE1BWF9DTVBfR1JPVVAgYnl0ZXMuICAgICAgICAgICAgICAqLworIC8qIE9uY2UgYW4gb3ZlcnJ1biBvY2N1cnMsIHRoZSBvbmx5IHRoaW5nIHRvIGRvIGlzIHRvIHNldCB0aGUgY29weSBmbGFnIGFuZCAgKi8KKyAvKiBjb3B5IHRoZSBpbnB1dCBvdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgb3ZlcnJ1bjoKKyNpZiAwCisgKnBfZHN0X2ZpcnN0PUZMQUdfQ09QWTsKKyBmYXN0X2NvcHkocF9zcmNfZmlyc3QscF9kc3RfZmlyc3QrRkxBR19CWVRFUyxzcmNfbGVuKTsKKyAqcF9kc3RfbGVuPXNyY19sZW4rRkxBR19CWVRFUzsKKyNlbHNlCisgZmFzdF9jb3B5KHBfc3JjX2ZpcnN0LHBfZHN0X2ZpcnN0LHNyY19sZW4pOworICpwX2RzdF9sZW49IC1zcmNfbGVuOyAvKiByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgdG8gaW5kaWNhdGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnB1dCAgOiBIYW5kIG92ZXIgdGhlIHJlcXVpcmVkIGFtb3VudCBvZiB3b3JraW5nIG1lbW9yeSBpbiBwX3dya19tZW0uICAgICAqLworLyogSW5wdXQgIDogU3BlY2lmeSBpbnB1dCBibG9jayB1c2luZyBwX3NyY19maXJzdCBhbmQgc3JjX2xlbi4gICAgICAgICAgICAgICAgKi8KKy8qIElucHV0ICA6IFBvaW50IHBfZHN0X2ZpcnN0IHRvIHRoZSBzdGFydCBvZiB0aGUgb3V0cHV0IHpvbmUuICAgICAgICAgICAgICAgICovCisvKiBJbnB1dCAgOiBQb2ludCBwX2RzdF9sZW4gdG8gYSBVTE9ORyB0byByZWNlaXZlIHRoZSBvdXRwdXQgbGVuZ3RoLiAgICAgICAgICAqLworLyogSW5wdXQgIDogSW5wdXQgYmxvY2sgYW5kIG91dHB1dCB6b25lIG11c3Qgbm90IG92ZXJsYXAuIFVzZXIga25vd3MgICAgICAgICAgKi8KKy8qIElucHV0ICA6IHVwcGVyYm91bmQgb24gb3V0cHV0IGJsb2NrIGxlbmd0aCBmcm9tIGVhcmxpZXIgY29tcHJlc3Npb24uICAgICAgICovCisvKiBJbnB1dCAgOiBJbiBhbnkgY2FzZSwgbWF4aW11bSBleHBhbnNpb24gcG9zc2libGUgaXMgbmluZSB0aW1lcy4gICAgICAgICAgICAqLworLyogT3V0cHV0IDogTGVuZ3RoIG9mIG91dHB1dCBibG9jayB3cml0dGVuIHRvICpwX2RzdF9sZW4uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE91dHB1dCA6IE91dHB1dCBibG9jayBpbiBNZW1bcF9kc3RfZmlyc3QuLnBfZHN0X2ZpcnN0KypwX2RzdF9sZW4tMV0uICAgICAgICovCisvKiBPdXRwdXQgOiBXcml0ZXMgb25seSAgaW4gTWVtW3BfZHN0X2ZpcnN0Li5wX2RzdF9maXJzdCsqcF9kc3RfbGVuLTFdLiAgICAgICAqLworTE9DQUwgdm9pZCBjb21wcmVzc19kZWNvbXByZXNzKCBVQllURSAqcF93cmtfbWVtLAorCQkJCVVCWVRFICpwX3NyY19maXJzdCwgTE9ORyAgIHNyY19sZW4sCisJCQkJVUJZVEUgKnBfZHN0X2ZpcnN0LCBVTE9ORyAqcF9kc3RfbGVuKQoreworIC8qIEJ5dGUgcG9pbnRlcnMgcF9zcmMgYW5kIHBfZHN0IHNjYW4gdGhyb3VnaCB0aGUgaW5wdXQgYW5kIG91dHB1dCBibG9ja3MuICAgKi8KKyByZWdpc3RlciBVQllURSAqcF9zcmMgPSBwX3NyY19maXJzdCtGTEFHX0JZVEVTOworIHJlZ2lzdGVyIFVCWVRFICpwX2RzdCA9IHBfZHN0X2ZpcnN0OworIC8qIHdlIG5lZWQgdG8gYXZvaWQgYSBTRUdWIHdoZW4gdHJ5aW5nIHRvIHVuY29tcHJlc3MgY29ycnVwdCBkYXRhICovCisgcmVnaXN0ZXIgVUJZVEUgKnBfZHN0X3Bvc3QgPSBwX2RzdF9maXJzdCArICpwX2RzdF9sZW47CisKKyAvKiBUaGUgZm9sbG93aW5nIHR3byB2YXJpYWJsZXMgYXJlIG5ldmVyIG1vZGlmaWVkIGFuZCBhcmUgdXNlZCB0byBjb250cm9sICAgICovCisgLyogdGhlIG1haW4gbG9vcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIFVCWVRFICpwX3NyY19wb3N0ICA9IHBfc3JjX2ZpcnN0K3NyY19sZW47CisgVUJZVEUgKnBfc3JjX21heDE2ID0gcF9zcmNfZmlyc3Qrc3JjX2xlbi0oTUFYX0NNUF9HUk9VUC0yKTsKKyAKKyAvKiBUaGUgaGFzaCB0YWJsZSBpcyB0aGUgb25seSByZXNpZGVudCBvZiB0aGUgd29ya2luZyBtZW1vcnkuIFRoZSBoYXNoIHRhYmxlICovCisgLyogY29udGFpbnMgSEFTSF9UQUJMRV9MRU5HVEg9NDA5NiBwb2ludGVycyB0byBwb3NpdGlvbnMgaW4gdGhlIGhpc3RvcnkuIFRvICAqLworIC8qIGtlZXAgTWFjaW50b3NoZXMgaGFwcHksIGl0IGlzIGxvbmd3b3JkIGFsaWduZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyBVQllURSAqKmhhc2ggPSAoVUJZVEUgKiopIFVMT05HX0FMSUdOX1VQKHBfd3JrX21lbSk7CisKKyAvKiBUaGUgdmFyaWFibGUgJ2NvbnRyb2wnIGlzIHVzZWQgdG8gYnVmZmVyIHRoZSBjb250cm9sIGJpdHMgd2hpY2ggYXBwZWFyIGluICovCisgLyogZ3JvdXBzIG9mIDE2IGJpdHMgKGNvbnRyb2wgd29yZHMpIGF0IHRoZSBzdGFydCBvZiBlYWNoIGNvbXByZXNzZWQgZ3JvdXAuICAqLworIC8qIFdoZW4gZWFjaCBncm91cCBpcyByZWFkLCBiaXQgMTYgb2YgdGhlIHJlZ2lzdGVyIGlzIHNldCB0byBvbmUuIFdoZW5ldmVyICAgKi8KKyAvKiBhIG5ldyBiaXQgaXMgbmVlZGVkLCB0aGUgcmVnaXN0ZXIgaXMgc2hpZnRlZCByaWdodC4gV2hlbiB0aGUgdmFsdWUgb2YgdGhlICovCisgLyogcmVnaXN0ZXIgYmVjb21lcyAxLCB3ZSBrbm93IHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgYSBncm91cC4gICAgICAqLworIC8qIEluaXRpYWxpemluZyB0aGUgcmVnaXN0ZXIgdG8gMSB0aHVzIGluc3RydWN0cyB0aGUgY29kZSB0byBmb2xsb3cgdGhhdCBpdCAgKi8KKyAvKiBzaG91bGQgcmVhZCBhIG5ldyBjb250cm9sIHdvcmQgaW1tZWRpYXRlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgcmVnaXN0ZXIgVUxPTkcgY29udHJvbD0xOworIAorIC8qIFRoZSB2YWx1ZSBvZiAnbGl0ZXJhbHMnIGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2UgMC4uMy4gSXQgaXMgdGhlIG51bWJlciBvZiAgKi8KKyAvKiBjb25zZWN1dGl2ZSBsaXRlcmFsIGl0ZW1zIGp1c3Qgc2Vlbi4gV2UgaGF2ZSB0byByZWNvcmQgdGhpcyBudW1iZXIgc28gYXMgICovCisgLyogdG8ga25vdyB3aGVuIHRvIHVwZGF0ZSB0aGUgaGFzaCB0YWJsZS4gV2hlbiBsaXRlcmFscyBnZXRzIHRvIDMsIHRoZXJlICAgICAqLworIC8qIGhhdmUgYmVlbiB0aHJlZSBjb25zZWN1dGl2ZSBsaXRlcmFscyBhbmQgd2UgY2FuIHVwZGF0ZSBhdCB0aGUgcG9zaXRpb24gb2YgKi8KKyAvKiB0aGUgb2xkZXN0IG9mIHRoZSB0aHJlZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgcmVnaXN0ZXIgVVdPUkQgbGl0ZXJhbHM9MDsKKyAKKyAvKiBDaGVjayB0aGUgbGVhZGluZyBjb3B5IGZsYWcgdG8gc2VlIGlmIHRoZSBjb21wcmVzc29yIGNob3NlIHRvIHVzZSBhIGNvcHkgICovCisgLyogb3BlcmF0aW9uIGluc3RlYWQgb2YgYSBjb21wcmVzc2lvbiBvcGVyYXRpb24uIElmIGEgY29weSBvcGVyYXRpb24gd2FzICAgICAqLworIC8qIHVzZWQsIHRoZW4gYWxsIHdlIG5lZWQgdG8gZG8gaXMgY29weSB0aGUgZGF0YSBvdmVyLCBzZXQgdGhlIG91dHB1dCBsZW5ndGggKi8KKyAvKiBhbmQgcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgMAorIGlmICgqcF9zcmNfZmlyc3Q9PUZMQUdfQ09QWSkKKyAgIHsKKyAgICBmYXN0X2NvcHkocF9zcmNfZmlyc3QrRkxBR19CWVRFUyxwX2RzdF9maXJzdCxzcmNfbGVuLUZMQUdfQllURVMpOworICAgICpwX2RzdF9sZW49c3JjX2xlbi1GTEFHX0JZVEVTOworICAgIHJldHVybjsKKyAgIH0KKyNlbHNlCisgIGlmICggc3JjX2xlbiA8IDAgKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZhc3RfY29weShwX3NyY19maXJzdCxwX2RzdF9maXJzdCwtc3JjX2xlbiApOworICAgKnBfZHN0X2xlbiA9IChVTE9ORyktc3JjX2xlbjsKKyAgIHJldHVybjsKKyAgfQorI2VuZGlmCisgICAKKyAvKiBJbml0aWFsaXplIGFsbCBlbGVtZW50cyBvZiB0aGUgaGFzaCB0YWJsZSB0byBwb2ludCB0byBhIGNvbnN0YW50IHN0cmluZy4gICovCisgLyogVXNlIG9mIGFuIHVucm9sbGVkIGxvb3Agc3BlZWRzIHRoaXMgdXAgY29uc2lkZXJhYmx5LiAgICAgICAgICAgICAgICAgICAgICAqLworIHtVV09SRCBpOyBVQllURSAqKnBfaD1oYXNoOworIyAgZGVmaW5lIFpKICpwX2grKz1TVEFSVF9TVFJJTkdfMTgKKyAgZm9yIChpPTA7aTwyNTY7aSsrKSAgICAgLyogMjU2PUhBU0hfVEFCTEVfTEVOR1RILzE2LiAqLworICAgIHtaSjtaSjtaSjtaSjsKKyAgICAgWko7Wko7Wko7Wko7CisgICAgIFpKO1pKO1pKO1pKOworICAgICBaSjtaSjtaSjtaSjt9CisgfQorCisgLyogVGhlIG91dGVyIGxvb3AgcHJvY2Vzc2VzIGVpdGhlciAxIG9yIDE2IGl0ZW1zIHBlciBpdGVyYXRpb24gZGVwZW5kaW5nIG9uICAqLworIC8qIGhvdyBjbG9zZSBwX3NyYyBpcyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyB3aGlsZSAocF9zcmMhPXBfc3JjX3Bvc3QpCisgICB7LyogU3RhcnQgb2Ygb3V0ZXIgbG9vcCAqLworICAgCisgICAgcmVnaXN0ZXIgVVdPUkQgdW5yb2xsOyAgIC8qIENvdW50cyB1bnJvbGxlZCBsb29wIGV4ZWN1dGlvbnMuICAgICAgICAgICAgICAqLworICAgIAorICAgIC8qIFdoZW4gJ2NvbnRyb2wnIGhhcyB0aGUgdmFsdWUgMSwgaXQgbWVhbnMgdGhhdCB0aGUgMTYgYnVmZmVyZWQgY29udHJvbCAgKi8KKyAgICAvKiBiaXRzIHRoYXQgd2VyZSByZWFkIGluIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBncm91cCBoYXZlIGFsbCBiZWVuICovCisgICAgLyogc2hpZnRlZCBvdXQgYW5kIHRoYXQgYWxsIHRoYXQgaXMgbGVmdCBpcyB0aGUgMSBiaXQgdGhhdCB3YXMgaW5qZWN0ZWQgICAqLworICAgIC8qIGludG8gYml0IDE2IGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBncm91cC4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kICAgKi8KKyAgICAvKiBvZiBhIGdyb3VwLCB3ZSBoYXZlIHRvIGxvYWQgYSBuZXcgY29udHJvbCB3b3JkIGFuZCBpbmplY3QgYSBuZXcgMSBiaXQuICovCisgICAgaWYgKGNvbnRyb2w9PTEpCisgICAgICB7CisgICAgICAgY29udHJvbD0weDEwMDAwfCpwX3NyYysrOworICAgICAgIGNvbnRyb2x8PSgqcF9zcmMrKyk8PDg7CisgICAgICB9CisKKyAgICAvKiBJZiBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGFyZSB3aXRoaW4gMTYgZ3JvdXBzIGZyb20gdGhlIGVuZCBvZiB0aGUgICAgICovCisgICAgLyogaW5wdXQsIGV4ZWN1dGUgdGhlIHVucm9sbGVkIGxvb3Agb25seSBvbmNlLCBlbHNlIHByb2Nlc3MgYSB3aG9sZSBncm91cCAqLworICAgIC8qIG9mIDE2IGl0ZW1zIGJ5IGxvb3BpbmcgMTYgdGltZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnJvbGw9IHBfc3JjPD1wX3NyY19tYXgxNiA/IDE2IDogMTsKKworICAgIC8qIFRoaXMgaW5uZXIgbG9vcCBwcm9jZXNzZXMgb25lIHBocmFzZSAoaXRlbSkgcGVyIGl0ZXJhdGlvbi4gKi8KKyAgICB3aGlsZSAodW5yb2xsLS0pCisgICAgICB7IC8qIEJlZ2luIHVucm9sbGVkIGlubmVyIGxvb3AuICovCisgICAgICAKKyAgICAgICAvKiBQcm9jZXNzIGEgbGl0ZXJhbCBvciBjb3B5IGl0ZW0gZGVwZW5kaW5nIG9uIHRoZSBuZXh0IGNvbnRyb2wgYml0LiAqLworICAgICAgIGlmIChjb250cm9sJjEpCisgICAgICAgICB7CisgICAgICAgICAgLyogQ29weSBpdGVtLiAqLworICAgICAgICAgIAorICAgICAgICAgIHJlZ2lzdGVyIFVCWVRFICpwOyAgICAgICAgICAgLyogUG9pbnRzIHRvIHBsYWNlIGZyb20gd2hpY2ggdG8gY29weS4gKi8KKyAgICAgICAgICByZWdpc3RlciBVV09SRCBsZW5tdDsgICAgICAgIC8qIExlbmd0aCBvZiBjb3B5IGl0ZW0gbWludXMgdGhyZWUuICAgICovCisgICAgICAgICAgcmVnaXN0ZXIgVUJZVEUgKipwX2h0ZTsgICAgICAvKiBQb2ludGVyIHRvIGN1cnJlbnQgaGFzaCB0YWJsZSBlbnRyeS4qLworICAgICAgICAgIHJlZ2lzdGVyIFVCWVRFICpwX3ppdj1wX2RzdDsgLyogUG9pbnRlciB0byBzdGFydCBvZiBjdXJyZW50IFppdi4gICAgKi8KKyAgICAgICAgICAKKyAgICAgICAgICAvKiBSZWFkIGFuZCBkaXNtYW50bGUgdGhlIGNvcHkgd29yZC4gV29yayBvdXQgZnJvbSB3aGVyZSB0byBjb3B5LiAgICovCisgICAgICAgICAgbGVubXQ9KnBfc3JjKys7CisgICAgICAgICAgcF9odGU9Jmhhc2hbKChsZW5tdCYweEYwKTw8NCl8KnBfc3JjKytdOworICAgICAgICAgIHA9KnBfaHRlOworICAgICAgICAgIGxlbm10Jj0weEY7CisgICAgICAgICAgCisgICAgICAgICAgLyogTm93IHBlcmZvcm0gdGhlIGNvcHkgdXNpbmcgYSBoYWxmIHVucm9sbGVkIGxvb3AuICovCisgICAgICAgICAgKnBfZHN0Kys9KnArKzsKKyAgICAgICAgICAqcF9kc3QrKz0qcCsrOworICAgICAgICAgICpwX2RzdCsrPSpwKys7CisgICAgICAgICAgd2hpbGUgKGxlbm10LS0pCisgICAgICAgICAgICAgKnBfZHN0Kys9KnArKzsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgLyogQmVjYXVzZSB3ZSBoYXZlIGp1c3QgcmVjZWl2ZWQgMyBvciBtb3JlIGJ5dGVzIGluIGEgY29weSBpdGVtICAgICAqLworICAgICAgICAgIC8qICh3aG9zZSBieXRlcyB3ZSBoYXZlIGp1c3QgaW5zdGFsbGVkIGluIHRoZSBvdXRwdXQpLCB3ZSBhcmUgbm93ICAgKi8KKyAgICAgICAgICAvKiBpbiBhIHBvc2l0aW9uIHRvIGZsdXNoIGFsbCB0aGUgcGVuZGluZyBsaXRlcmFsIGhhc2hpbmdzIHRoYXQgaGFkICovCisgICAgICAgICAgLyogYmVlbiBwb3N0cG9uZWQgZm9yIGxhY2sgb2YgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIGlmIChsaXRlcmFscz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgIHJlZ2lzdGVyIFVCWVRFICpyPXBfeml2LWxpdGVyYWxzOworICAgICAgICAgICAgIGhhc2hbSEFTSChyKV09cjsKKyAgICAgICAgICAgICBpZiAobGl0ZXJhbHM9PTIpCisgICAgICAgICAgICAgICAge3IrKzsgaGFzaFtIQVNIKHIpXT1yO30KKyAgICAgICAgICAgICBsaXRlcmFscz0wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgLyogSW4gYW55IGNhc2UsIHdlIGNhbiBpbW1lZGlhdGVseSB1cGRhdGUgdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgICAqLworICAgICAgICAgIC8qIGN1cnJlbnQgcG9zaXRpb24uIFdlIGRvbid0IG5lZWQgdG8gZG8gYSBIQVNIKC4uLikgdG8gd29yayBvdXQgICAgKi8KKyAgICAgICAgICAvKiB3aGVyZSB0byBwdXQgdGhlIHBvaW50ZXIsIGFzIHRoZSBjb21wcmVzc29yIGp1c3QgdG9sZCB1cyEhISAgICAgICovCisgICAgICAgICAgKnBfaHRlPXBfeml2OworICAgICAgICAgIAorICAgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAvKiBMaXRlcmFsIGl0ZW0uICovCisgICAgICAgICAgCisgICAgICAgICAgLyogQ29weSBvdmVyIHRoZSBsaXRlcmFsIGJ5dGUuICovCisgICAgICAgICAgKnBfZHN0Kys9KnBfc3JjKys7CisgICAgICAgICAgCisgICAgICAgICAgLyogSWYgd2Ugbm93IGhhdmUgdGhyZWUgbGl0ZXJhbHMgd2FpdGluZyB0byBiZSBoYXNoZWQgaW50byB0aGUgaGFzaCAqLworICAgICAgICAgIC8qIHRhYmxlLCB3ZSBjYW4gZG8gb25lIG9mIHRoZW0gbm93IChiZWNhdXNlIHRoZXJlIGFyZSB0aHJlZSkuICAgICAgKi8KKyAgICAgICAgICBpZiAoKytsaXRlcmFscyA9PSAzKQorICAgICAgICAgICAgIHtyZWdpc3RlciBVQllURSAqcD1wX2RzdC0zOyBoYXNoW0hBU0gocCldPXA7IGxpdGVyYWxzPTI7fQorICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgIC8qIFNoaWZ0IHRoZSBjb250cm9sIGJ1ZmZlciBzbyB0aGUgbmV4dCBjb250cm9sIGJpdCBpcyBpbiBiaXQgMC4gKi8KKyAgICAgICBjb250cm9sPj49MTsKKyNpZiAxCisgICAgICAgaWYgKHBfZHN0ID4gcF9kc3RfcG9zdCkgCisgICAgICAgeworCSAgICAgICAvKiBTaGl0OiB3ZSB0cmllZCB0byBkZWNvbXByZXNzIGNvcnJ1cHQgZGF0YSAqLworCSAgICAgICAqcF9kc3RfbGVuID0gMDsKKwkgICAgICAgcmV0dXJuOworICAgICAgIH0KKyNlbmRpZgorICAgICAgfSAvKiBFbmQgdW5yb2xsZWQgaW5uZXIgbG9vcC4gKi8KKyAgICAgICAgICAgICAgIAorICAgfSAvKiBFbmQgb2Ygb3V0ZXIgbG9vcCAqLworICAgCisgLyogV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgZGVjb21wcmVzc2VkIGRhdGEgYmVmb3JlIHJldHVybmluZy4gKi8KKyAgKnBfZHN0X2xlbj1wX2RzdC1wX2RzdF9maXJzdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBvZiBMWlJXMy5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvbHpydzMuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL2x6cnczLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzZmViYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL2x6cnczLmgKQEAgLTAsMCArMSwyNTMgQEAKKyNpZm5kZWYgX0xaUlczX0gKKyNkZWZpbmUgX0xaUlczX0gKKy8qCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvY29tcHJlc3Nvci9senJ3My5oLHYgJAorICogJFJldmlzaW9uOiAxLjEgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTI6MzAgJAorICoKKyAqICBpbmNsdWRlIGZpbGVzIGZvciBsenJ3My4gT25seSBzbGlnaHR5IG1vZGlmaWVkIGZyb20gdGhlIG9yaWdpbmFsCisgKiAgdmVyc2lvbi4gQXNzZW1ibGVzIHRoZSB0aHJlZSBpbmNsdWRlIGZpbGVzIGNvbXByZXNzLmgsIHBvcnQuaCBhbmQKKyAqICBmYXN0Y29weS5oIGZyb20gdGhlIG9yaWdpbmFsIGx6cnczIHBhY2thZ2UuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUFJFU1MuSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBdXRob3IgOiBSb3NzIFdpbGxpYW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGF0ZSAgIDogRGVjZW1iZXIgMTk4OS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byBhIHNldCBvZiBmdW5jdGlvbnMgY2FsbGVkICAgICAgICAqLworLyogJ2NvbXByZXNzJywgZWFjaCBtZW1iZXIgb2Ygd2hpY2ggaW1wbGVtZW50cyBhIHBhcnRpY3VsYXIgZGF0YSBjb21wcmVzc2lvbiAgKi8KKy8qIGFsZ29yaXRobS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm9ybWFsbHkgaW4gQyBwcm9ncmFtbWluZywgZm9yIGVhY2ggLkggZmlsZSwgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIC5DICAgKi8KKy8qIGZpbGUgdGhhdCBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbnMgcHJvbWlzZWQgaW4gdGhlIC5IIGZpbGUuICAgICAgICAgICAgICAgICovCisvKiBIZXJlLCB0aGVyZSBhcmUgbWFueSAuQyBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaGVhZGVyIGZpbGUuICAgICAgICAgICAqLworLyogRWFjaCBjb21mb3JtaW5nIGltcGxlbWVudGF0aW9uIGZpbGUgY29udGFpbnMgYSBzaW5nbGUgZnVuY3Rpb24gICAgICAgICAgICAgKi8KKy8qIGNhbGxlZCAnY29tcHJlc3MnIHRoYXQgaW1wbGVtZW50cyBhIHNpbmdsZSBkYXRhIGNvbXByZXNzaW9uICAgICAgICAgICAgICAgICovCisvKiBhbGdvcml0aG0gdGhhdCBjb25mb3JtcyB3aXRoIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoaXMgaGVhZGVyIGZpbGUuICAqLworLyogT25seSBvbmUgYWxnb3JpdGhtIGNhbiBiZSBsaW5rZWQgaW4gYXQgYSB0aW1lIGluIHRoaXMgb3JnYW5pemF0aW9uLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OIE9GIEZVTkNUSU9OIENPTVBSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFN1bW1hcnkgb2YgRnVuY3Rpb24gQ29tcHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIGFjdGlvbiB0aGF0ICdjb21wcmVzcycgdGFrZXMgZGVwZW5kcyBvbiBpdHMgZmlyc3QgYXJndW1lbnQgY2FsbGVkICAgICAgKi8KKy8qICdhY3Rpb24nLiAgVGhlIGZ1bmN0aW9uIHByb3ZpZGVzIHRocmVlIGFjdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFsZ29yaXRobS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0gQ29tcHJlc3MgICBhIGJsb2NrIG9mIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtIERlY29tcHJlc3MgYSBibG9jayBvZiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogU2VlIHRoZSBmb3JtYWwgQyBkZWZpbml0aW9uIGxhdGVyIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDb25zdGFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENPTVBSRVNTX09WRVJSVU46IFRoZSBjb25zdGFudCBDT01QUkVTU19PVkVSUlVOIGRlZmluZXMgYnkgaG93IG1hbnkgYnl0ZXMgICovCisvKiBhbiBhbGdvcml0aG0gaXMgYWxsb3dlZCB0byBleHBhbmQgYSBibG9jayBkdXJpbmcgYSBjb21wcmVzc2lvbiBvcGVyYXRpb24uICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFsdGhvdWdoIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgdXN1YWxseSBjb21wcmVzcyBkYXRhLCB0aGVyZSB3aWxsIGFsd2F5cyAgICovCisvKiBiZSBkYXRhIHRoYXQgYSBnaXZlbiBjb21wcmVzc29yIHdpbGwgZXhwYW5kICh0aGlzIGNhbiBiZSBwcm92ZW4pLiAgICAgICAgICAqLworLyogRm9ydHVuYXRlbHksIHRoZSBkZWdyZWUgb2YgZXhwYW5zaW9uIGNhbiBiZSBsaW1pdGVkIHRvIGEgc2luZ2xlIGJpdCwgYnkgICAgKi8KKy8qIGNvcHlpbmcgb3ZlciB0aGUgaW5wdXQgZGF0YSBpZiB0aGUgZGF0YSBnZXRzIGJpZ2dlciBkdXJpbmcgY29tcHJlc3Npb24uICAgICovCisvKiBUbyBhbGxvdyBmb3IgdGhpcyBwb3NzaWJpbGl0eSwgdGhlIGZpcnN0IGJpdCBvZiBhIGNvbXByZXNzZWQgICAgICAgICAgICAgICAqLworLyogcmVwcmVzZW50YXRpb24gY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgICAgICAgICAgICAgICAgKi8KKy8qIGlucHV0IGRhdGEgd2FzIGNvcGllZCBvdmVyLCBvciB0cnVseSBjb21wcmVzc2VkLiBJbiBwcmFjdGljZSwgdGhlIGZpcnN0ICAgICovCisvKiBieXRlIHdvdWxkIGJlIHVzZWQgdG8gc3RvcmUgdGhpcyBiaXQgc28gYXMgdG8gbWFpbnRhaW4gYnl0ZSBhbGlnbm1lbnQuICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuZm9ydHVuYXRlbHksIGluIGdlbmVyYWwsIHRoZSBvbmx5IHdheSB0byB0ZWxsIGlmIGFuIGFsZ29yaXRobSB3aWxsICAgICAgICovCisvKiBleHBhbmQgYSBwYXJ0aWN1bGFyIGJsb2NrIG9mIGRhdGEgaXMgdG8gcnVuIHRoZSBhbGdvcml0aG0gb24gdGhlIGRhdGEuICAgICAqLworLyogSWYgdGhlIGFsZ29yaXRobSBkb2VzIG5vdCBjb250aW51b3VzbHkgbW9uaXRvciBob3cgbWFueSBvdXRwdXQgYnl0ZXMgaXQgICAgKi8KKy8qIGhhcyB3cml0dGVuLCBpdCBtaWdodCB3cml0ZSBhbiBvdXRwdXQgYmxvY2sgZmFyIGxhcmdlciB0aGFuIHRoZSBpbnB1dCAgICAgICovCisvKiBibG9jayBiZWZvcmUgcmVhbGl6aW5nIHRoYXQgaXQgaGFzIGRvbmUgc28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT24gdGhlIG90aGVyIGhhbmQsIGNvbnRpbnVvdXMgY2hlY2tzIG9uIG91dHB1dCBsZW5ndGggYXJlIGluZWZmaWNpZW50LiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBjYXRlciBmb3IgYWxsIHRoZXNlIHByb2JsZW1zLCB0aGlzIGludGVyZmFjZSBkZWZpbml0aW9uOiAgICAgICAgICAgICAgICAqLworLyogPiBBbGxvd3MgYSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gcmV0dXJuIGFuIG91dHB1dCBibG9jayB0aGF0IGlzIHVwIHRvICAgKi8KKy8qICAgQ09NUFJFU1NfT1ZFUlJVTiBieXRlcyBsb25nZXIgdGhhbiB0aGUgaW5wdXQgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IEFsbG93cyBhIGNvbXByZXNzaW9uIGFsZ29yaXRobSB0byB3cml0ZSB1cCB0byBDT01QUkVTU19PVkVSUlVOIGJ5dGVzICAgICAqLworLyogICBtb3JlIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYmxvY2sgdG8gdGhlIG1lbW9yeSBvZiB0aGUgb3V0cHV0ICAgICAgKi8KKy8qICAgYmxvY2sgcmVnYXJkbGVzcyBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYmxvY2sgZXZlbnR1YWxseSByZXR1cm5lZC4gICovCisvKiAgIFRoaXMgYWxsb3dzIGFuIGFsZ29yaXRobSB0byBvdmVycnVuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJsb2NrIGluIHRoZSAqLworLyogICBvdXRwdXQgYmxvY2sgYnkgdXAgdG8gQ09NUFJFU1NfT1ZFUlJVTiBieXRlcyBiZXR3ZWVuIGV4cGFuc2lvbiBjaGVja3MuICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgcHJvYmxlbSBkb2VzIG5vdCBhcmlzZSBmb3IgZGVjb21wcmVzc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElkZW50aXR5IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBhY3Rpb24gbXVzdCBiZSBDT01QUkVTU19BQ1RJT05fSURFTlRJVFkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gcF9kc3RfbGVuIG11c3QgcG9pbnQgdG8gYSBsb25nd29yZCB0byByZWNlaXZlIGEgbG9uZ3dvcmQgYWRkcmVzcy4gICAgICAgICovCisvKiA+IFRoZSB2YWx1ZSBvZiB0aGUgb3RoZXIgcGFyYW1ldGVycyBkb2VzIG5vdCBtYXR0ZXIuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBBZnRlciBleGVjdXRpb24sIHRoZSBsb25nd29yZCB0aGF0IHBfZHN0X2xlbiBwb2ludHMgdG8gd2lsbCBiZSBhIHBvaW50ZXIgKi8KKy8qICAgdG8gYSBzdHJ1Y3R1cmUgb2YgdHlwZSBjb21wcmVzc19pZGVudGl0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRodXMsIGZvciBleGFtcGxlLCBhZnRlciB0aGUgY2FsbCwgKCpwX2RzdF9sZW4pLT5tZW1vcnkgd2lsbCByZXR1cm4gdGhlICAqLworLyogICBudW1iZXIgb2YgYnl0ZXMgb2Ygd29ya2luZyBtZW1vcnkgdGhhdCB0aGUgYWxnb3JpdGhtIHJlcXVpcmVzIHRvIHJ1bi4gICAgKi8KKy8qID4gVGhlIHZhbHVlcyBvZiB0aGUgaWRlbnRpdHkgc3RydWN0dXJlIHJldHVybmVkIGFyZSBmaXhlZCBjb25zdGFudCAgICAgICAgICovCisvKiAgIGF0dHJpYnV0ZXMgb2YgdGhlIGFsZ29yaXRobSBhbmQgbXVzdCBub3QgdmFyeSBmcm9tIGNhbGwgdG8gY2FsbC4gICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvbW1vbiBSZXF1aXJlbWVudHMgZm9yIENvbXByZXNzaW9uIGFuZCBEZWNvbXByZXNzaW9uIEFjdGlvbnMgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAqLworLyogPiB3cmtfbWVtIG11c3QgcG9pbnQgdG8gYW4gdW51c2VkIGJsb2NrIG9mIG1lbW9yeSBvZiBhIGxlbmd0aCBzcGVjaWZpZWQgaW4gKi8KKy8qICAgdGhlIGFsZ29yaXRobSdzIGlkZW50aXR5IGJsb2NrLiBUaGUgaWRlbnRpdHkgYmxvY2sgY2FuIGJlIG9idGFpbmVkIGJ5ICAgICovCisvKiAgIG1ha2luZyBhIHNlcGFyYXRlIGNhbGwgdG8gY29tcHJlc3MsIHNwZWNpZnlpbmcgdGhlIGlkZW50aXR5IGFjdGlvbi4gICAgICAqLworLyogPiBUaGUgSU5QVVQgQkxPQ0sgaXMgZGVmaW5lZCB0byBiZSBNZW1vcnlbc3JjX2FkZHIsc3JjX2FkZHIrc3JjX2xlbi0xXS4gICAgKi8KKy8qID4gZHN0X2xlbiB3aWxsIGJlIHVzZWQgdG8gZGVub3RlICpwX2RzdF9sZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IGRzdF9sZW4gaXMgbm90IHJlYWQgYnkgY29tcHJlc3MsIG9ubHkgd3JpdHRlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBUaGUgdmFsdWUgb2YgZHN0X2xlbiBpcyBkZWZpbmVkIG9ubHkgdXBvbiB0ZXJtaW5hdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KKy8qID4gVGhlIE9VVFBVVCBCTE9DSyBpcyBkZWZpbmVkIHRvIGJlIE1lbW9yeVtkc3RfYWRkcixkc3RfYWRkcitkc3RfbGVuLTFdLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29tcHJlc3Npb24gQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IGFjdGlvbiBtdXN0IGJlIENPTVBSRVNTX0FDVElPTl9DT01QUkVTUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBzcmNfbGVuIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLENPTVBSRVNTX01BWF9PUkddLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gVGhlIE9VVFBVVCBaT05FIGlzIGRlZmluZWQgdG8gYmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE1lbW9yeVtkc3RfYWRkcixkc3RfYWRkcitzcmNfbGVuLTErQ09NUFJFU1NfT1ZFUlJVTl0uICAgICAgICAgICAgICAgICAqLworLyogPiBUaGUgZnVuY3Rpb24gY2FuIG1vZGlmeSBhbnkgcGFydCBvZiB0aGUgb3V0cHV0IHpvbmUgcmVnYXJkbGVzcyBvZiB0aGUgICAgKi8KKy8qICAgZmluYWwgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBpbnB1dCBibG9jayBhbmQgdGhlIG91dHB1dCB6b25lIG11c3Qgbm90IG92ZXJsYXAuICAgICAgICAgICAgICAgICAgICAqLworLyogPiBkc3RfbGVuIHdpbGwgYmUgaW4gdGhlIHJhbmdlIFswLHNyY19sZW4rQ09NUFJFU1NfT1ZFUlJVTl0uICAgICAgICAgICAgICAgKi8KKy8qID4gZHN0X2xlbiB3aWxsIGJlIGluIHRoZSByYW5nZSBbMCxDT01QUkVTU19NQVhfQ09NXSAoZnJvbSBwcmV2IGZhY3QpLiAgICAgICovCisvKiA+IFRoZSBvdXRwdXQgYmxvY2sgd2lsbCBjb25zaXN0IG9mIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0IGJsb2NrLiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlY29tcHJlc3Npb24gQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBhY3Rpb24gbXVzdCBiZSBDT01QUkVTU19BQ1RJT05fREVDT01QUkVTUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gVGhlIGlucHV0IGJsb2NrIG11c3QgYmUgdGhlIHJlc3VsdCBvZiBhbiBlYXJsaWVyIGNvbXByZXNzaW9uIG9wZXJhdGlvbi4gICovCisvKiA+IElmIHRoZSBwcmV2aW91cyBmYWN0IGlzIHRydWUsIHRoZSBmb2xsb3dpbmcgZmFjdHMgbXVzdCBhbHNvIGJlIHRydWU6ICAgICAqLworLyogICA+IHNyY19sZW4gd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWzAsQ09NUFJFU1NfTUFYX0NPTV0uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgPiBkc3RfbGVuIHdpbGwgYmUgaW4gdGhlIHJhbmdlIFswLENPTVBSRVNTX01BWF9PUkddLiAgICAgICAgICAgICAgICAgICAgICovCisvKiA+IFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJsb2NrcyBtdXN0IG5vdCBvdmVybGFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPiBPbmx5IHRoZSBvdXRwdXQgYmxvY2sgaXMgbW9kaWZpZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gVXBvbiB0ZXJtaW5hdGlvbiwgdGhlIG91dHB1dCBibG9jayB3aWxsIGNvbnNpc3Qgb2YgdGhlIGJ5dGVzIGNvbnRhaW5lZCAgICovCisvKiAgIGluIHRoZSBpbnB1dCBibG9jayBwYXNzZWQgdG8gdGhlIGVhcmxpZXIgY29tcHJlc3Npb24gb3BlcmF0aW9uLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1JULkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgbW9kdWxlIGNvbnRhaW5zIG1hY3JvIGRlZmluaXRpb25zIGFuZCB0eXBlcyB0aGF0IGFyZSBsaWtlbHkgdG8gICAgICAgICovCisvKiBjaGFuZ2UgYmV0d2VlbiBjb21wdXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRE9ORV9QT1JUICAgICAgIC8qIE9ubHkgZG8gdGhpcyBpZiBub3QgcHJldmlvdXNseSBkb25lLiAgICAgICAgICAgICAgICovCisKKyAgICNpZmRlZiBUSElOS19DCisgICAgICAjZGVmaW5lIFVCWVRFIHVuc2lnbmVkIGNoYXIgICAgICAvKiBVbnNpZ25lZCBieXRlICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgI2RlZmluZSBVV09SRCB1bnNpZ25lZCBpbnQgICAgICAgLyogVW5zaWduZWQgd29yZCAoMiBieXRlcykgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgVUxPTkcgdW5zaWduZWQgbG9uZyAgICAgIC8qIFVuc2lnbmVkIHdvcmQgKDQgYnl0ZXMpICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lIEJPT0wgIHVuc2lnbmVkIGNoYXIgICAgICAvKiBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgI2RlZmluZSBGT1BFTl9CSU5BUllfUkVBRCAgInJiIiAgLyogTW9kZSBzdHJpbmcgZm9yIGJpbmFyeSByZWFkaW5nLiAgICAgKi8KKyAgICAgICNkZWZpbmUgRk9QRU5fQklOQVJZX1dSSVRFICJ3YiIgIC8qIE1vZGUgc3RyaW5nIGZvciBiaW5hcnkgd3JpdGluZy4gICAgICovCisgICAgICAjZGVmaW5lIEZPUEVOX1RFWFRfQVBQRU5EICAiYSIgICAvKiBNb2RlIHN0cmluZyBmb3IgdGV4dCBhcHBlbmRpbmcuICAgICAqLworICAgICAgI2RlZmluZSBSRUFMIGRvdWJsZSAgICAgICAgICAgICAgLyogVVNlZCBmb3IgZmxvYXRpbmcgcG9pbnQgc3R1ZmYuICAgICAgKi8KKyAgICNlbmRpZgorICAgI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQobGludXgpCisgICAgICAjZGVmaW5lIFVCWVRFIF9fdTggICAgICAgICAgICAgICAvKiBVbnNpZ25lZCBieXRlICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgI2RlZmluZSBVV09SRCBfX3UxNiAgICAgICAgICAgICAgLyogVW5zaWduZWQgd29yZCAoMiBieXRlcykgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgVUxPTkcgX191MzIgICAgICAgICAgICAgIC8qIFVuc2lnbmVkIHdvcmQgKDQgYnl0ZXMpICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lIExPTkcgIF9fczMyICAgICAgICAgICAgICAvKiBTaWduZWQgICB3b3JkICg0IGJ5dGVzKSAgICAgICAgICAgICAqLworICAgICAgI2RlZmluZSBCT09MICBpcyBub3QgdXNlZCBoZXJlICAgLyogQm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICNkZWZpbmUgRk9QRU5fQklOQVJZX1JFQUQgIG5vdCB1c2VkICAvKiBNb2RlIHN0cmluZyBmb3IgYmluYXJ5IHJlYWRpbmcuICovCisgICAgICAjZGVmaW5lIEZPUEVOX0JJTkFSWV9XUklURSBub3QgdXNlZCAgLyogTW9kZSBzdHJpbmcgZm9yIGJpbmFyeSB3cml0aW5nLiAqLworICAgICAgI2RlZmluZSBGT1BFTl9URVhUX0FQUEVORCAgbm90IHVzZWQgIC8qIE1vZGUgc3RyaW5nIGZvciB0ZXh0IGFwcGVuZGluZy4gKi8KKyAgICAgICNkZWZpbmUgUkVBTCBub3QgdXNlZCAgICAgICAgICAgICAgICAvKiBVU2VkIGZvciBmbG9hdGluZyBwb2ludCBzdHVmZi4gICovCisgICAgICAjaWZuZGVmIFRSVUUKKyAgICAgICNkZWZpbmUgVFJVRSAxCisgICAgICAjZW5kaWYKKyAgICNlbmRpZgorCisgICAjZGVmaW5lIERPTkVfUE9SVCAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBkbyBhbGwgdGhpcyBhZ2Fpbi4gICAgICAgICAgICAqLworICAgI2RlZmluZSBNQUxMT0NfRkFJTCBOVUxMICAgICAgICAgICAgLyogRmFpbHVyZSBzdGF0dXMgZnJvbSBtYWxsb2MoKSAgICAgICAgKi8KKyAgICNkZWZpbmUgTE9DQUwgc3RhdGljICAgICAgICAgICAgICAgIC8qIEZvciBub24tZXhwb3J0ZWQgcm91dGluZXMuICAgICAgICAgICovCisgICAjZGVmaW5lIEVYUE9SVCAgICAgICAgICAgICAgICAgICAgICAvKiBTaWduYWxzIGV4cG9ydGVkIGZ1bmN0aW9uLiAgICAgICAgICAqLworICAgI2RlZmluZSB0aGVuICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlZnVsIGZvciBhbGlnbmluZyBpZnMuICAgICAgICAgICAgKi8KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBvZiBQT1JULkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDT01QUkVTU19BQ1RJT05fSURFTlRJVFkgICAwCisjZGVmaW5lIENPTVBSRVNTX0FDVElPTl9DT01QUkVTUyAgIDEKKyNkZWZpbmUgQ09NUFJFU1NfQUNUSU9OX0RFQ09NUFJFU1MgMgorCisjZGVmaW5lIENPTVBSRVNTX09WRVJSVU4gMTAyNAorI2RlZmluZSBDT01QUkVTU19NQVhfQ09NIDB4NzAwMDAwMDAKKyNkZWZpbmUgQ09NUFJFU1NfTUFYX09SRyAoQ09NUFJFU1NfTUFYX0NPTS1DT01QUkVTU19PVkVSUlVOKQorCisjZGVmaW5lIENPTVBSRVNTX01BWF9TVFJMRU4gMjU1CisKKy8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbGdvcml0aG0uICAgICAgICAgKi8KKy8qID4gVGhlIHRvcCBiaXQgb2YgaWQgbXVzdCBiZSB6ZXJvLiBUaGUgcmVtYWluaW5nIGJpdHMgbXVzdCBiZSBjaG9zZW4gYnkgICAgKi8KKy8qICAgdGhlIGF1dGhvciBvZiB0aGUgYWxnb3JpdGhtIGJ5IHRvc3NpbmcgYSBjb2luIDMxIHRpbWVzLiAgICAgICAgICAgICAgICAgKi8KKy8qID4gVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWVzdGVkIGJ5IHRoZSBhbGdvcml0aG0gaXMgc3BlY2lmaWVkIGluIGJ5dGVzICAgKi8KKy8qICAgYW5kIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDB4NzAwMDAwMDBdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID4gQWxsIHN0cmluZ3MgcyBtdXN0IGJlIHN1Y2ggdGhhdCBzdHJsZW4ocyk8PUNPTVBSRVNTX01BWF9TVFJMRU4uICAgICAgICAgKi8KK3N0cnVjdCBjb21wcmVzc19pZGVudGl0eQorICB7CisgICBVTE9ORyBpZDsgICAgICAgICAgIC8qIElkZW50aWZ5aW5nIG51bWJlciBvZiBhbGdvcml0aG0uICAgICAgICAgICAgKi8KKyAgIFVMT05HIG1lbW9yeTsgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHdvcmtpbmcgbWVtb3J5IHJlcXVpcmVkLiAqLworCisgICBjaGFyICAqbmFtZTsgICAgICAgIC8qIE5hbWUgb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIGNoYXIgICp2ZXJzaW9uOyAgICAgLyogVmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgY2hhciAgKmRhdGU7ICAgICAgICAvKiBEYXRlIG9mIHJlbGVhc2Ugb2YgdGhpcyB2ZXJzaW9uLiAgICAgICAgICAgICovCisgICBjaGFyICAqY29weXJpZ2h0OyAgIC8qIENvcHlyaWdodCBtZXNzYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgY2hhciAgKmF1dGhvcjsgICAgICAvKiBBdXRob3Igb2YgYWxnb3JpdGhtLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICBjaGFyICAqYWZmaWxpYXRpb247IC8qIEFmZmlsaWF0aW9uIG9mIGF1dGhvci4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIGNoYXIgICp2ZW5kb3I7ICAgICAgLyogV2hlcmUgdGhlIGFsZ29yaXRobSBjYW4gYmUgb2J0YWluZWQuICAgICAgICAqLworICB9OworCit2b2lkICBsenJ3M19jb21wcmVzcyggICAgICAgIC8qIFNpbmdsZSBmdW5jdGlvbiBpbnRlcmZhY2UgdG8gY29tcHJlc3Npb24gYWxnb3JpdGhtLiAqLworVVdPUkQgICAgIGFjdGlvbiwgICAgICAvKiBBY3Rpb24gdG8gYmUgcGVyZm9ybWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK1VCWVRFICAgKndya19tZW0sICAgICAgLyogV29ya2luZyBtZW1vcnkgdGVtcG9yYXJpbHkgZ2l2ZW4gdG8gcm91dGluZSB0byB1c2UuICovCitVQllURSAgICpzcmNfYWRyLCAgICAgIC8qIEFkZHJlc3Mgb2YgaW5wdXQgIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworTE9ORyAgICAgc3JjX2xlbiwgICAgICAvKiBMZW5ndGggIG9mIGlucHV0ICBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK1VCWVRFICAgKmRzdF9hZHIsICAgICAgLyogQWRkcmVzcyBvZiBvdXRwdXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkICAqcF9kc3RfbGVuICAgICAgIC8qIFBvaW50ZXIgdG8gYSBsb25nd29yZCB3aGVyZSByb3V0aW5lIHdpbGwgd3JpdGU6ICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBJZiBhY3Rpb249Li5JREVOVElUWSAgID0+IEFkciBvZiBpZCBzdHJ1Y3R1cmUuICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogICAgSWYgYWN0aW9uPS4uQ09NUFJFU1MgICA9PiBMZW5ndGggb2Ygb3V0cHV0IGRhdGEuICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIElmIGFjdGlvbj0uLkRFQ09NUFJFU1MgPT4gTGVuZ3RoIG9mIG91dHB1dCBkYXRhLiAqLworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgb2YgQ09NUFJFU1MuSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0X2NvcHkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBmdW5jdGlvbiBjb3BpZXMgYSBibG9jayBvZiBtZW1vcnkgdmVyeSBxdWlja2x5LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBleGFjdCBzcGVlZCBkZXBlbmRzIG9uIHRoZSByZWxhdGl2ZSBhbGlnbm1lbnQgb2YgdGhlIGJsb2NrcyBvZiBtZW1vcnkuICovCisvKiBQUkUgIDogMDw9c3JjX2xlbjw9KDJeMzIpLTEgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUFJFICA6IFNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmxvY2tzIG11c3Qgbm90IG92ZXJsYXAuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBPU1QgOiBNRU1bZHN0X2Fkcixkc3RfYWRyK3NyY19sZW4tMV09TUVNW3NyY19hZHIsc3JjX2FkcitzcmNfbGVuLTFdLiAgICAgICovCisvKiBQT1NUIDogTUVNW2RzdF9hZHIsZHN0X2FkcitzcmNfbGVuLTFdIGlzIHRoZSBvbmx5IG1lbW9yeSBjaGFuZ2VkLiAgICAgICAgICAqLworCisjZGVmaW5lIGZhc3RfY29weShzcmMsZHN0LGxlbikgbWVtY3B5KGRzdCxzcmMsbGVuKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIGZhc3RfY29weS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci96ZnRhcGUtY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjBhMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmMKQEAgLTAsMCArMSwxMjAzIEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgVVNBLgorIAorICoKKyAqICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBhICJnZW5lcmljIiBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgKgorICogICAgIHpmdGFwZS1kcml2ZXIgYW5kIGEgY29tcHJlc3Npb24tYWxnb3JpdGhtLiBUaGUgKgorICogICAgIGNvbXByZXNzaW9uLWFsZ29yaXRobSBjdXJyZW50bHkgdXNlZCBpcyBhIExaNzcuIEkgdXNlIHRoZSAqCisgKiAgICAgaW1wbGVtZW50YXRpb24gbHpydzMgYnkgUm9zcyBOLiBXaWxsaWFtcyAoUmVuYWlzc2FuY2UgKgorICogICAgIFNvZnR3YXJlKS4gVGhlIGNvbXByZXNzaW9uIHByb2dyYW0gaXRzZWxmIGlzIGluIHRoZSBmaWxlCisgKiAgICAgbHpydzMuYyAqIGFuZCBsenJ3My5oLiAgVG8gYWRvcHQgYW5vdGhlciBjb21wcmVzc2lvbiBhbGdvcml0aG0KKyAqICAgICB0aGUgZnVuY3Rpb25zICogemZ0X2NvbXByZXNzKCkgYW5kIHpmdF91bmNvbXByZXNzKCkgbXVzdCBiZQorICogICAgIGNoYW5nZWQgKiBhcHByb3ByaWF0ZWx5LiBTZWUgYmVsb3cuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisjaW5jbHVkZSAiLi4vY29tcHJlc3Nvci9senJ3My5oIgorCisvKgorICogICBnbG9iYWwgdmFyaWFibGVzCisgKi8KKworLyogSSBoYW5kbGUgdGhlIGFsbG9jYXRpb24gb2YgdGhpcyBidWZmZXIgYXMgYSBzcGVjaWFsIGNhc2UsIGJlY2F1c2UKKyAqIGl0J3Mgc2l6ZSB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSB0YXBlIGxlbmd0aCBpbnNlcnRlZC4KKyAqLworCisvKiBsb2NhbCB2YXJpYWJsZXMgCisgKi8KK3N0YXRpYyB2b2lkICp6ZnRjX3dya19tZW0gPSBOVUxMOworc3RhdGljIF9fdTggKnpmdGNfYnVmICAgICA9IE5VTEw7CitzdGF0aWMgdm9pZCAqemZ0Y19zY3JhdGNoX2J1ZiAgPSBOVUxMOworCisvKiBjb21wcmVzc2lvbiBzdGF0aXN0aWNzIAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHpmdGNfd3JfdW5jb21wcmVzc2VkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgemZ0Y193cl9jb21wcmVzc2VkICAgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCB6ZnRjX3JkX3VuY29tcHJlc3NlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHpmdGNfcmRfY29tcHJlc3NlZCAgID0gMDsKKworLyogZm9yd2FyZCAqLworc3RhdGljIGludCAgemZ0Y193cml0ZShpbnQgKndyaXRlX2NudCwKKwkJICAgICAgIF9fdTggKmRzdF9idWYsIGNvbnN0IGludCBzZWdfc3osCisJCSAgICAgICBjb25zdCBfX3U4IF9fdXNlciAqc3JjX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sCisJCSAgICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7CitzdGF0aWMgaW50ICB6ZnRjX3JlYWQoaW50ICpyZWFkX2NudCwKKwkJICAgICAgX191OCAgX191c2VyICpkc3RfYnVmLCBjb25zdCBpbnQgdG9fZG8sCisJCSAgICAgIGNvbnN0IF9fdTggKnNyY19idWYsIGNvbnN0IGludCBzZWdfc3osCisJCSAgICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKTsKK3N0YXRpYyBpbnQgIHpmdGNfc2Vlayh1bnNpZ25lZCBpbnQgbmV3X2Jsb2NrX3BvcywgCisJCSAgICAgIHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLAorCQkgICAgICBfX3U4ICpidWZmZXIpOworc3RhdGljIHZvaWQgemZ0Y19sb2NrICAgKHZvaWQpOworc3RhdGljIHZvaWQgemZ0Y19yZXNldCAgKHZvaWQpOworc3RhdGljIHZvaWQgemZ0Y19jbGVhbnVwKHZvaWQpOworc3RhdGljIHZvaWQgemZ0Y19zdGF0cyAgICAgICh2b2lkKTsKKworLyogY29tcHJlc3NlZCBzZWdtZW50LiBUaGlzIGNvbmZvcm1zIHRvIFFJQy04MC1NQywgUmV2aXNpb24gSy4KKyAqIAorICogUmV2LiBLIGFwcGxpZXMgdG8gdGFwZXMgd2l0aCBgZml4ZWQgbGVuZ3RoIGZvcm1hdCcgd2hpY2ggaXMKKyAqIGluZGljYXRlZCBieSBmb3JtYXQgY29kZSAyLDMgYW5kIDUuIFNlZSBiZWxvdyBmb3IgZm9ybWF0IGNvZGUgNCBhbmQgNgorICoKKyAqIDIgYnl0ZXM6IG9mZnNldCBvZiBjb21wcmVzc2lvbiBzZWdtZW50IHN0cnVjdHVyZQorICogICAgICAgICAgMjlrID4gb2Zmc2V0ID49IDI5ay0xODogZGF0YSBmcm9tIHByZXZpb3VzIHNlZ21lbnQgZW5zIGluIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgYW5kIG5vIGNvbXByZXNzZWQgYmxvY2sgc3RhcnRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIHNlZ21lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID09IDA6IGRhdGEgZnJvbSBwcmV2aW91cyBzZWdtZW50IG9jY3VwaWVzIGVudGlyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCBhbmQgY29udGludWVzIGluIG5leHQgc2VnbWVudAorICogbiBieXRlczogcmVtYWluZGVyIGZyb20gcHJldmlvdXMgc2VnbWVudAorICogCisgKiBSZXYuIEs6ICAKKyAqIDQgYnl0ZXM6IDQgYnl0ZXM6IGZpbGVzIHNldCBieXRlIG9mZnNldAorICogUG9zdCBSZXYuIEsgYW5kIFFJQy0zMDIwLzMwMjA6CisgKiA4IGJ5dGVzOiA4IGJ5dGVzOiBmaWxlcyBzZXQgYnl0ZSBvZmZzZXQKKyAqIDIgYnl0ZXM6IGJ5dGUgY291bnQgTiAoYW1vdW50IG9mIGRhdGEgZm9sbG93aW5nKQorICogICAgICAgICAgYml0IDE1IGlzIHNldCBpZiBkYXRhIGlzIGNvbXByZXNzZWQsIGJpdCAxNSBpcyBub3QKKyAqICAgICAgICAgIHNldCBpZiBkYXRhIGlzIHVuY29tcHJlc3NlZAorICogTiBieXRlczogZGF0YSAoYXMgbXVjaCBhcyBzcGVjaWZpZWQgaW4gdGhlIGJ5dGUgY291bnQpCisgKiAyIGJ5dGVzOiBieXRlIGNvdW50IE5fMSBvZiBuZXh0IGNsdXN0ZXIKKyAqIE5fMSBieXRlczogZGF0YSBvZiBuZXh0IGNsdXNldAorICogMiBieXRlczogYnl0ZSBjb3VudCBOXzIgb2YgbmV4dCBjbHVzdGVyCisgKiBOXzIgYnl0ZXM6IC4uLiAgCisgKgorICogTm90ZSB0aGF0IHRoZSBgTicgYnl0ZSBjb3VudCBhY2NvdW50cyBvbmx5IGZvciB0aGUgYnl0ZXMgdGhhdCBpbiB0aGUKKyAqIGN1cnJlbnQgc2VnbWVudCBpZiB0aGUgY2x1c3RlciBzcGFucyB0byB0aGUgbmV4dCBzZWdtZW50LgorICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisJaW50IGNtcHJfcG9zOyAgICAgICAgICAgICAvKiBhY3R1YWwgcG9zaXRpb24gaW4gY29tcHJlc3Npb24gYnVmZmVyICovCisJaW50IGNtcHJfc3o7ICAgICAgICAgICAgICAvKiB3aGF0IGlzIGxlZnQgaW4gdGhlIGNvbXByZXNzaW9uIGJ1ZmZlcgorCQkJCSAgICogd2hlbiBjb3B5aW5nIHRoZSBjb21wcmVzc2VkIGRhdGEgdG8gdGhlCisJCQkJICAgKiBkZWJsb2NrIGJ1ZmZlcgorCQkJCSAgICovCisJdW5zaWduZWQgaW50IGZpcnN0X2Jsb2NrOyAvKiBsb2NhdGlvbiBvZiBoZWFkZXIgaW5mb3JtYXRpb24gaW4KKwkJCQkgICAqIHRoaXMgc2VnbWVudAorCQkJCSAgICovCisJdW5zaWduZWQgaW50IGNvdW50OyAgICAgICAvKiBhbW91bnQgb2YgZGF0YSBvZiBjdXJyZW50IGJsb2NrCisJCQkJICAgKiBjb250YWluZWQgaW4gY3VycmVudCBzZWdtZW50IAorCQkJCSAgICovCisJdW5zaWduZWQgaW50IG9mZnNldDsgICAgICAvKiBvZmZzZXQgaW4gY3VycmVudCBzZWdtZW50ICovCisJdW5zaWduZWQgaW50IHNwYW5zOjE7ICAgICAvKiBtaWdodCBjb250aW51ZSBpbiBuZXh0IHNlZ21lbnQgKi8KKwl1bnNpZ25lZCBpbnQgdW5jbXByOyAgICAgIC8qIDB4ODAwMCBpZiB0aGlzIGJsb2NrIGNvbnRhaW5zCisJCQkJICAgKiB1bmNvbXByZXNzZWQgZGF0YSAKKwkJCQkgICAqLworCV9fczY0IGZvZmZzOyAgICAgICAgICAgICAgLyogZmlsZSBzZXQgYnl0ZSBvZmZzZXQsIHNhbWUgYXMgaW4gCisJCQkJICAgKiBjb21wcmVzc2lvbiBtYXAgc2VnbWVudAorCQkJCSAgICovCit9IGNtcHJfaW5mbzsKKworc3RhdGljIGNtcHJfaW5mbyBjc2VnOyAvKiBzdGF0aWMgZGF0YS4gTXVzdCBiZSBrZXB0IHVwdG9kYXRlIGFuZCBzaGFyZWQgYnkgCisJCQkqIHJlYWQsIHdyaXRlIGFuZCBzZWVrIGZ1bmN0aW9ucworCQkJKi8KKworI2RlZmluZSBEVU1QX0NNUFJfSU5GTyhsZXZlbCwgbXNnLCBpbmZvKQkJCQlcCisJVFJBQ0UobGV2ZWwsIG1zZyAiXG4iCQkJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiY21wcl9wb3MgICA6ICVkXG4iCQkJCVwKKwkgICAgICBLRVJOX0lORk8gImNtcHJfc3ogICAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJmaXJzdF9ibG9jazogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiY291bnQgICAgICA6ICVkXG4iCQkJCVwKKwkgICAgICBLRVJOX0lORk8gIm9mZnNldCAgICAgOiAlZFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJzcGFucyAgICAgIDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAidW5jbXByICAgICA6IDB4JTA0eFxuIgkJCQlcCisJICAgICAgS0VSTl9JTkZPICJmb2ZmcyAgICAgIDogIiBMTF9YLAkJCQlcCisJICAgICAgKGluZm8pLT5jbXByX3BvcywgKGluZm8pLT5jbXByX3N6LCAoaW5mbyktPmZpcnN0X2Jsb2NrLAlcCisJICAgICAgKGluZm8pLT5jb3VudCwgKGluZm8pLT5vZmZzZXQsIChpbmZvKS0+c3BhbnMgPT0gMSwJXAorCSAgICAgIChpbmZvKS0+dW5jbXByLCBMTCgoaW5mbyktPmZvZmZzKSkKKworLyogICBkaXNwYXRjaCBjb21wcmVzc2lvbiBzZWdtZW50IGluZm8sIHJldHVybiBlcnJvciBjb2RlCisgKiAgCisgKiAgIGFmdGVyd2FyZHMsIGNzZWctPm9mZnNldCBwb2ludHMgdG8gc3RhcnQgb2YgZGF0YSBvZiB0aGUgTkVYVAorICogICBjb21wcmVzc2VkIGJsb2NrLCBhbmQgY3NlZy0+Y291bnQgY29udGFpbnMgdGhlIGFtb3VudCBvZiBkYXRhCisgKiAgIGxlZnQgaW4gdGhlIGFjdHVhbCBjb21wcmVzc2VkIGJsb2NrLiBjc2VnLT5zcGFucyBpcyBzZXQgdG8gMSBpZgorICogICB0aGUgYmxvY2sgaXMgY29udGludWVkIGluIHRoZSBmb2xsb3dpbmcgc2VnbWVudC4gT3RoZXJ3aXNlIGl0IGlzCisgKiAgIHNldCB0byAwLiAKKyAqLworc3RhdGljIGludCBnZXRfY3NlZyAoY21wcl9pbmZvICpjaW5mbywgY29uc3QgX191OCAqYnVmZiwgCisJCSAgICAgY29uc3QgdW5zaWduZWQgaW50IHNlZ19zeiwKKwkJICAgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisgCWNpbmZvLT5maXJzdF9ibG9jayA9IEdFVDIoYnVmZiwgMCk7CisJaWYgKGNpbmZvLT5maXJzdF9ibG9jayA9PSAwKSB7IC8qIGRhdGEgc3BhbnMgdG8gbmV4dCBzZWdtZW50ICovCisJCWNpbmZvLT5jb3VudCAgPSBzZWdfc3ogLSBzaXplb2YoX191MTYpOworCQljaW5mby0+b2Zmc2V0ID0gc2VnX3N6OworCQljaW5mby0+c3BhbnMgPSAxOworCX0gZWxzZSB7IC8qIGNsdXN0ZXIgZGVmaW5ldGVseSBlbmRzIGluIHRoaXMgc2VnbWVudCAqLworCQlpZiAoY2luZm8tPmZpcnN0X2Jsb2NrID4gc2VnX3N6KSB7CisJCQkvKiBkYXRhIGNvcnJ1cHRlZCAqLworCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJjb3JydXB0ZWQgZGF0YTpcbiIKKwkJCQkgICAgS0VSTl9JTkZPICJzZWdtZW50IHNpemU6ICVkXG4iCisJCQkJICAgIEtFUk5fSU5GTyAiZmlyc3QgYmxvY2sgOiAlZCIsCisJCQkJICAgIHNlZ19zeiwgY2luZm8tPmZpcnN0X2Jsb2NrKTsKKwkJfQorCSAgICAgICAgY2luZm8tPmNvdW50ICA9IGNpbmZvLT5maXJzdF9ibG9jayAtIHNpemVvZihfX3UxNik7CisJCWNpbmZvLT5vZmZzZXQgPSBjaW5mby0+Zmlyc3RfYmxvY2s7CisJCWNpbmZvLT5zcGFucyA9IDA7CisJfQorCS8qIG5vdyBnZXQgdGhlIG9mZnNldCB0aGUgZmlyc3QgYmxvY2sgc2hvdWxkIGhhdmUgaW4gdGhlCisJICogdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorCSAqCisJICogRm9yIHRoaXMgbWFnaWMgYDE4JyByZWZlciB0byBDUkYtMyBzdGFuZGFyZCBvciBRSUMtODBNQywKKwkgKiBSZXYuIEsuICAKKwkgKi8KKwlpZiAoKHNlZ19zeiAtIGNpbmZvLT5vZmZzZXQpID4gMTgpIHsKKwkJaWYgKHZvbHVtZS0+cWljMTEzKSB7IC8qID4gcmV2aXNpb24gSyAqLworCQkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJOZXcgUUlDLTExMyBjb21wbGlhbmNlIik7CisJCQljaW5mby0+Zm9mZnMgPSBHRVQ4KGJ1ZmYsIGNpbmZvLT5vZmZzZXQpOworCQkJY2luZm8tPm9mZnNldCArPSBzaXplb2YoX19zNjQpOyAKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKC8qIGZ0X3RfZGF0YV9mbG93ICovIGZ0X3Rfbm9pc2UsICJwcmUgUUlDLTExMyB2ZXJzaW9uIik7CisJCQljaW5mby0+Zm9mZnMgICA9IChfX3M2NClHRVQ0KGJ1ZmYsIGNpbmZvLT5vZmZzZXQpOworCQkJY2luZm8tPm9mZnNldCArPSBzaXplb2YoX191MzIpOyAKKwkJfQorCX0KKwlpZiAoY2luZm8tPmZvZmZzID4gdm9sdW1lLT5zaXplKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiSW5jb25zaXN0ZW5jeTpcbiIKKwkJCSAgICBLRVJOX0lORk8gIm9mZnNldCBpbiBjdXJyZW50IHZvbHVtZTogJWRcbiIKKwkJCSAgICBLRVJOX0lORk8gInNpemUgb2YgY3VycmVudCB2b2x1bWUgIDogJWQiLAorCQkJICAgIChpbnQpKGNpbmZvLT5mb2Zmcz4+MTApLCAoaW50KSh2b2x1bWUtPnNpemU+PjEwKSk7CisJfQorCWlmIChjaW5mby0+Y21wcl9wb3MgKyBjaW5mby0+Y291bnQgPiB2b2x1bWUtPmJsa19zeikgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgIkluY29uc2lzdGVuY3k6XG4iCisJCQkgICAgS0VSTl9JTkZPICJibG9jayBzaXplIDogJWRcbiIKKwkJCSAgICBLRVJOX0lORk8gImRhdGEgcmVjb3JkOiAlZCIsCisJCQkgICAgdm9sdW1lLT5ibGtfc3osIGNpbmZvLT5jbXByX3BvcyArIGNpbmZvLT5jb3VudCk7CisJfQorCURVTVBfQ01QUl9JTkZPKGZ0X3Rfbm9pc2UgLyogZnRfdF9hbnkgKi8sICIiLCBjaW5mbyk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgVGhpcyBvbmUgaXMgY2FsbGVkLCB3aGVuIGEgbmV3IGNsdXN0ZXIgc3RhcnRzIGluIHNhbWUgc2VnbWVudC4KKyAqICAKKyAqICBOb3RlOiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjbHVzdGVyIGluIHRoZSBjdXJyZW50IHNlZ21lbnQsIHdlIG11c3QKKyAqICBub3QgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgbW9yZSB0aGFuIDE4IGJ5dGVzIGF2YWlsYWJsZSBiZWNhdXNlCisgKiAgdGhpcyBoYXZlIGFscmVhZHkgYmVlbiBkb25lIGluIGdldF9jc2VnKCkgYW5kIHRoZXJlIG1heSBiZSBsZXNzCisgKiAgdGhhbiAxOCBieXRlcyBhdmFpbGFibGUgZHVlIHRvIGhlYWRlciBpbmZvcm1hdGlvbi4KKyAqIAorICovCitzdGF0aWMgdm9pZCBnZXRfbmV4dF9jbHVzdGVyKGNtcHJfaW5mbyAqY2x1c3RlciwgY29uc3QgX191OCAqYnVmZiwgCisJCQkgICAgIGNvbnN0IGludCBzZWdfc3osIGNvbnN0IGludCBmaW5pc2gpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoc2VnX3N6IC0gY2x1c3Rlci0+b2Zmc2V0ID4gMTggfHwgY2x1c3Rlci0+Zm9mZnMgIT0gMCkgeworCQljbHVzdGVyLT5jb3VudCAgID0gR0VUMihidWZmLCBjbHVzdGVyLT5vZmZzZXQpOworCQljbHVzdGVyLT51bmNtcHIgID0gY2x1c3Rlci0+Y291bnQgJiAweDgwMDA7CisJCWNsdXN0ZXItPmNvdW50ICAtPSBjbHVzdGVyLT51bmNtcHI7CisJCWNsdXN0ZXItPm9mZnNldCArPSBzaXplb2YoX191MTYpOworCQljbHVzdGVyLT5mb2ZmcyAgID0gMDsKKwkJaWYgKChjbHVzdGVyLT5vZmZzZXQgKyBjbHVzdGVyLT5jb3VudCkgPCBzZWdfc3opIHsKKwkJCWNsdXN0ZXItPnNwYW5zID0gMDsKKwkJfSBlbHNlIGlmIChjbHVzdGVyLT5vZmZzZXQgKyBjbHVzdGVyLT5jb3VudCA9PSBzZWdfc3opIHsKKwkJCWNsdXN0ZXItPnNwYW5zID0gIWZpbmlzaDsKKwkJfSBlbHNlIHsKKwkJCS8qIGVpdGhlciBhbiBlcnJvciBvciBhIHZvbHVtZSB3cml0dGVuIGJ5IGFuIAorCQkJICogb2xkIHZlcnNpb24uIElmIHRoaXMgaXMgYSBkYXRhIGVycm9yLCB0aGVuIHdlJ2xsCisJCQkgKiBjYXRjaCBpdCBsYXRlci4KKwkJCSAqLworCQkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJFaXRoZXIgZXJyb3Igb3Igb2xkIHZvbHVtZSIpOworCQkJY2x1c3Rlci0+c3BhbnMgPSAxOworCQkJY2x1c3Rlci0+Y291bnQgPSBzZWdfc3ogLSBjbHVzdGVyLT5vZmZzZXQ7CisJCX0KKwl9IGVsc2UgeworCQljbHVzdGVyLT5jb3VudCA9IDA7CisJCWNsdXN0ZXItPnNwYW5zID0gMDsKKwkJY2x1c3Rlci0+Zm9mZnMgPSAwOworCX0KKwlEVU1QX0NNUFJfSU5GTyhmdF90X25vaXNlIC8qIGZ0X3RfYW55ICovICwgIiIsIGNsdXN0ZXIpOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIHpmdGNfbG9jayh2b2lkKQoreworfQorCisvKiAgdGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgZm9yIHpmdGFwZV9yZXNldF9wb3NpdGlvbiBpbiB6ZnRhcGUtaW8uYyAKKyAqLworc3RhdGljIHZvaWQgemZ0Y19yZXNldCh2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJbWVtc2V0KCh2b2lkICopJmNzZWcsICdcMCcsIHNpemVvZihjc2VnKSk7CisJemZ0Y19zdGF0cygpOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyBpbnQgY21wcl9tZW1faW5pdGlhbGl6ZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBhbGxvY19ibGtzeiA9IDA7CisKK3N0YXRpYyBpbnQgemZ0X2FsbG9jYXRlX2NtcHJfbWVtKHVuc2lnbmVkIGludCBibGtzeikKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChjbXByX21lbV9pbml0aWFsaXplZCAmJiBibGtzeiA9PSBhbGxvY19ibGtzeikgeworCQlUUkFDRV9FWElUIDA7CisJfQorCVRSQUNFX0NBVENIKHpmdF92bWFsbG9jX29uY2UoJnpmdGNfd3JrX21lbSwgQ01QUl9XUktfTUVNX1NJWkUpLAorCQkgICAgemZ0Y19jbGVhbnVwKCkpOworCVRSQUNFX0NBVENIKHpmdF92bWFsbG9jX2Fsd2F5cygmemZ0Y19idWYsIGJsa3N6ICsgQ01QUl9PVkVSUlVOKSwKKwkJICAgIHpmdGNfY2xlYW51cCgpKTsKKwlhbGxvY19ibGtzeiA9IGJsa3N6OworCVRSQUNFX0NBVENIKHpmdF92bWFsbG9jX2Fsd2F5cygmemZ0Y19zY3JhdGNoX2J1ZiwgYmxrc3orQ01QUl9PVkVSUlVOKSwKKwkJICAgIHpmdGNfY2xlYW51cCgpKTsKKwljbXByX21lbV9pbml0aWFsaXplZCA9IDE7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgdm9pZCB6ZnRjX2NsZWFudXAodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXpmdF92ZnJlZSgmemZ0Y193cmtfbWVtLCBDTVBSX1dSS19NRU1fU0laRSk7CisJemZ0X3ZmcmVlKCZ6ZnRjX2J1ZiwgYWxsb2NfYmxrc3ogKyBDTVBSX09WRVJSVU4pOworCXpmdF92ZnJlZSgmemZ0Y19zY3JhdGNoX2J1ZiwgYWxsb2NfYmxrc3ogKyBDTVBSX09WRVJSVU4pOworCWNtcHJfbWVtX2luaXRpYWxpemVkID0gYWxsb2NfYmxrc3ogPSAwOworCVRSQUNFX0VYSVQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zICJmdGFwZV9jb21wcmVzcygpIiBhbmQgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAiZnRhcGVfdW5jb21wcmVzcygpIiBhcmUgdGhlIGludGVyZmFjZSB0byB0aGUgYWN0dWFsIGNvbXByZXNzaW9uICAgICAgICAgKgorICogIGFsZ29yaXRobSAoaS5lLiB0aGV5IGFyZSBjYWxsaW5nIHRoZSAiY29tcHJlc3MoKSIgZnVuY3Rpb24gZnJvbSAgICAgICAgICAqCisgKiAgdGhlIGx6cnczIHBhY2thZ2UgZm9yIG5vdykuIFRoZXNlIHJvdXRpbmVzIGNvdWxkIHF1aXRlIGVhc2lseSBiZSAgICAgICAgICoKKyAqICBjaGFuZ2VkIHRvIGFkb3B0IGFub3RoZXIgY29tcHJlc3Npb24gYWxnb3JpdGhtIGluc3RlYWQgb2YgbHpydzMsICAgICAgICAgKgorICogIHdoaWNoIGN1cnJlbnRseSBpcyB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY2FsbGVkIGJ5IHpmdF9jb21wcmVzc193cml0ZSgpIHRvIHBlcmZvcm0gdGhlIGNvbXByZXNzaW9uLiBNdXN0CisgKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAqCisgKiBOT1RFOiBUaGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIHNob3VsZCBub3QgZXhjZWVkIHRoZSBzaXplIG9mCisgKiAgICAgICB0aGUgdW5jb21wcmVzc2VkIGRhdGEuIE1vc3QgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBoYXZlIG1lYW5zCisgKiAgICAgICB0byBzdG9yZSBkYXRhIHVuY2hhbmdlZCBpZiB0aGUgImNvbXByZXNzZWQiIGRhdGEgYW1vdW50IHdvdWxkCisgKiAgICAgICBleGNlZWQgdGhlIG9yaWdpbmFsIG9uZS4gTW9zdGx5IHRoaXMgaXMgZG9uZSBieSBzdG9yaW5nIHNvbWUKKyAqICAgICAgIGZsYWctYnl0ZXMgaW4gZnJvbnQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSB0byBpbmRpY2F0ZSBpZiBpdAorICogICAgICAgaXMgY29tcHJlc3NlZCBvciBub3QuIFRodXMgdGhlIHdvcnN0IGNvbXByZXNzaW9uIHJlc3VsdAorICogICAgICAgbGVuZ3RoIGlzIHRoZSBvcmlnaW5hbCBsZW5ndGggcGx1cyB0aG9zZSBmbGFnLWJ5dGVzLgorICoKKyAqICAgICAgIFdlIGRvbid0IHdhbnQgdGhhdCwgYXMgdGhlIFFJQy04MCBzdGFuZGFyZCBwcm92aWRlcyBhIG1lYW5zCisgKiAgICAgICBvZiBtYXJraW5nIHVuY29tcHJlc3NlZCBibG9ja3MgYnkgc2ltcGx5IHNldHRpbmcgYml0IDE1IG9mCisgKiAgICAgICB0aGUgY29tcHJlc3NlZCBibG9jaydzIGxlbmd0aC4gVGh1cyBhIGNvbXBlc3NlZCBibG9jayBjYW4KKyAqICAgICAgIGhhdmUgYXQgbW9zdCBhIGxlbmd0aCBvZiAyXjE1LTEgYnl0ZXMuIFRoZSBRSUMtODAgc3RhbmRhcmQKKyAqICAgICAgIHJlc3RyaWN0cyB0aGUgYmxvY2stbGVuZ3RoIGV2ZW4gZnVydGhlciwgYWxsb3dpbmcgb25seSAyOWsgLQorICogICAgICAgNiBieXRlcy4KKyAqCisgKiAgICAgICBDdXJyZW50bHksIHRoZSBtYXhpbXVtIGJsb2Nrc2l6ZSB1c2VkIGJ5IHpmdGFwZSBpcyAyOGsuCisgKgorICogICAgICAgSW4gc2hvcnQ6IGRvbid0IGV4Y2VlZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dC1wYWNrYWdlLCBzZXQKKyAqICAgICAgIGJpdCAxNSBvZiB0aGUgY29tcHJlc3NlZCBzaXplIHRvIDEgaWYgeW91IGhhdmUgY29waWVkIGRhdGEKKyAqICAgICAgIGluc3RlYWQgb2YgY29tcHJlc3NpbmcgaXQuCisgKi8KK3N0YXRpYyBpbnQgemZ0X2NvbXByZXNzKF9fdTggKmluX2J1ZmZlciwgdW5zaWduZWQgaW50IGluX3N6LCBfX3U4ICpvdXRfYnVmZmVyKQoreyAKKwlfX3MzMiBjb21wcmVzc2VkX3N6OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCisJbHpydzNfY29tcHJlc3MoQ09NUFJFU1NfQUNUSU9OX0NPTVBSRVNTLCB6ZnRjX3dya19tZW0sCisJCSAgICAgICBpbl9idWZmZXIsIGluX3N6LCBvdXRfYnVmZmVyLCAmY29tcHJlc3NlZF9zeik7CisJaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgeworCQkvKiAgdGhlIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUgdGhpcyBhd2F5IHdoZW4KKwkJICogIGNvbXBpbGVkIHdpdGggTk9fVFJBQ0VfQVRfQUxMIG9wdGlvbgorCQkgKi8KKwkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJcbiIKKwkJICAgICAgS0VSTl9JTkZPICJiZWZvcmUgY29tcHJlc3Npb246ICVkIGJ5dGVzXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiYWZ0ZXIgY29tcHJlc2lzb24gOiAlZCBieXRlcyIsIAorCQkgICAgICBpbl9zeiwgCisJCSAgICAgIChpbnQpKGNvbXByZXNzZWRfc3ogPCAwIAorCQkgICAgICA/IC1jb21wcmVzc2VkX3N6IDogY29tcHJlc3NlZF9zeikpOworCQkvKiAgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzCisJCSAqLworCQl6ZnRjX3dyX2NvbXByZXNzZWQgICArPSAoY29tcHJlc3NlZF9zeiA8IDAgCisJCQkJCSAgID8gLWNvbXByZXNzZWRfc3ogOiBjb21wcmVzc2VkX3N6KTsKKwkJemZ0Y193cl91bmNvbXByZXNzZWQgKz0gaW5fc3o7CisJfQorCVRSQUNFX0VYSVQgKGludCljb21wcmVzc2VkX3N6OworfQorCisvKiBjYWxsZWQgYnkgemZ0X2NvbXByZXNzX3JlYWQoKSB0byBkZWNvbXByZXNzIHRoZSBkYXRhLiBNdXN0CisgKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGRlY29tcHJlc3NlZCBkYXRhIGZvciBzYW5pdHkgY2hlY2tzCisgKiAoY29tcGFyZWQgd2l0aCB6ZnRfYmxrX3N6KQorICoKKyAqIE5PVEU6IFJlYWQgdGhlIG5vdGUgZm9yIHpmdF9jb21wcmVzcygpIGFib3ZlISAgSWYgYml0IDE1IG9mIHRoZQorICogICAgICAgcGFyYW1ldGVyIGluX3N6IGlzIHNldCwgdGhlbiB0aGUgZGF0YSBpbiBpbl9idWZmZXIgaXNuJ3QKKyAqICAgICAgIGNvbXByZXNzZWQsIHdoaWNoIG11c3QgYmUgaGFuZGxlZCBieSB0aGUgdW4tY29tcHJlc3Npb24KKyAqICAgICAgIGFsZ29yaXRobS4gKEkgY2hhbmdlZCBsenJ3MyB0byBoYW5kbGUgdGhpcy4pCisgKgorICogIFRoZSBwYXJhbWV0ZXIgbWF4X291dF9zeiBpcyBuZWVkZWQgdG8gcHJldmVudCBidWZmZXIgb3ZlcnJ1bnMgd2hlbiAKKyAqICB1bmNvbXByZXNzaW5nIGNvcnJ1cHQgZGF0YS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB6ZnRfdW5jb21wcmVzcyhfX3U4ICppbl9idWZmZXIsIAorCQkJCSAgIGludCBpbl9zeiwgCisJCQkJICAgX191OCAqb3V0X2J1ZmZlciwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbWF4X291dF9zeikKK3sgCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJbHpydzNfY29tcHJlc3MoQ09NUFJFU1NfQUNUSU9OX0RFQ09NUFJFU1MsIHpmdGNfd3JrX21lbSwKKwkJICAgICAgIGluX2J1ZmZlciwgKF9fczMyKWluX3N6LAorCQkgICAgICAgb3V0X2J1ZmZlciwgKF9fdTMyICopJm1heF9vdXRfc3opOworCQorCWlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2luZm8pIHsKKwkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJcbiIKKwkJICAgICAgS0VSTl9JTkZPICJiZWZvcmUgZGVjb21wcmVzc2lvbjogJWQgYnl0ZXNcbiIKKwkJICAgICAgS0VSTl9JTkZPICJhZnRlciBkZWNvbXByZXNzaW9uIDogJWQgYnl0ZXMiLCAKKwkJICAgICAgaW5fc3ogPCAwID8gLWluX3N6IDogaW5fc3osKGludCltYXhfb3V0X3N6KTsKKwkJLyogIGZvciBzdGF0aXN0aWNhbCBwdXJwb3NlcworCQkgKi8KKwkJemZ0Y19yZF9jb21wcmVzc2VkICAgKz0gaW5fc3ogPCAwID8gLWluX3N6IDogaW5fc3o7CisJCXpmdGNfcmRfdW5jb21wcmVzc2VkICs9IG1heF9vdXRfc3o7CisJfQorCVRSQUNFX0VYSVQgKHVuc2lnbmVkIGludCltYXhfb3V0X3N6OworfQorCisvKiBwcmludCBzb21lIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGVmZmljaWVuY3kgb2YgdGhlIGNvbXByZXNzaW9uIHRvCisgKiB0aGUga2VybmVsIGxvZyAKKyAqLworc3RhdGljIHZvaWQgemZ0Y19zdGF0cyh2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKFRSQUNFX0xFVkVMIDwgZnRfdF9pbmZvKSB7CisJCVRSQUNFX0VYSVQ7CisJfQorCWlmICh6ZnRjX3dyX3VuY29tcHJlc3NlZCAhPSAwKSB7CisJCWlmICh6ZnRjX3dyX2NvbXByZXNzZWQgPiAoMTw8MTQpKSB7CisJCQlUUkFDRShmdF90X2luZm8sICJjb21wcmVzc2lvbiBzdGF0aXN0aWNzICh3cml0aW5nKTpcbiIKKwkJCSAgICAgIEtFUk5fSU5GTyAiIGNvbXByLi91bmNtcHIuICAgOiAlM2QgJSUiLAorCQkJICAgICAgKCgoemZ0Y193cl9jb21wcmVzc2VkPj4xMCkgKiAxMDApCisJCQkgICAgICAgLyAoemZ0Y193cl91bmNvbXByZXNzZWQ+PjEwKSkpOworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9pbmZvLCAiY29tcHJlc3Npb24gc3RhdGlzdGljcyAod3JpdGluZyk6XG4iCisJCQkgICAgICBLRVJOX0lORk8gIiBjb21wci4vdW5jbXByLiAgIDogJTNkICUlIiwKKwkJCSAgICAgICgoemZ0Y193cl9jb21wcmVzc2VkICogMTAwKQorCQkJICAgICAgIC8gemZ0Y193cl91bmNvbXByZXNzZWQpKTsKKwkJfQorCX0KKwlpZiAoemZ0Y19yZF91bmNvbXByZXNzZWQgIT0gMCkgeworCQlpZiAoemZ0Y19yZF9jb21wcmVzc2VkID4gKDE8PDE0KSkgeworCQkJVFJBQ0UoZnRfdF9pbmZvLCAiY29tcHJlc3Npb24gc3RhdGlzdGljcyAocmVhZGluZyk6XG4iCisJCQkgICAgICBLRVJOX0lORk8gIiBjb21wci4vdW5jbXByLiAgIDogJTNkICUlIiwKKwkJCSAgICAgICgoKHpmdGNfcmRfY29tcHJlc3NlZD4+MTApICogMTAwKQorCQkJICAgICAgIC8gKHpmdGNfcmRfdW5jb21wcmVzc2VkPj4xMCkpKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgImNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKHJlYWRpbmcpOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICIgY29tcHIuL3VuY21wci4gICA6ICUzZCAlJSIsCisJCQkgICAgICAoKHpmdGNfcmRfY29tcHJlc3NlZCAqIDEwMCkKKwkJCSAgICAgICAvIHpmdGNfcmRfdW5jb21wcmVzc2VkKSk7CisJCX0KKwl9CisJLyogb25seSBwcmludCBpdCBvbmNlOiAqLworCXpmdGNfd3JfdW5jb21wcmVzc2VkID0gCisJCXpmdGNfd3JfY29tcHJlc3NlZCAgPQorCQl6ZnRjX3JkX3VuY29tcHJlc3NlZCA9CisJCXpmdGNfcmRfY29tcHJlc3NlZCAgID0gMDsKKwlUUkFDRV9FWElUOworfQorCisvKiBzdGFydCBuZXcgY29tcHJlc3NlZCBibG9jayAKKyAqLworc3RhdGljIGludCBzdGFydF9uZXdfY3NlZyhjbXByX2luZm8gKmNsdXN0ZXIsIAorCQkJICBjaGFyICpkc3RfYnVmLCAKKwkJCSAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGludCBibGtfc3osCisJCQkgIGNvbnN0IGNoYXIgKnNyY19idWYsCisJCQkgIGNvbnN0IGludCB0aGlzX3NlZ3Nfc3osCisJCQkgIGNvbnN0IGludCBxaWMxMTMpCit7CisJaW50IHNpemVfbGVmdDsKKwlpbnQgY3BfY250OworCWludCBidWZfcG9zOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJc2l6ZV9sZWZ0ID0gdGhpc19zZWdzX3N6IC0gc2l6ZW9mKF9fdTE2KSAtIGNsdXN0ZXItPmNtcHJfc3o7CisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csIlxuIiAKKwkgICAgICBLRVJOX0lORk8gInNlZ21lbnQgc2l6ZSAgIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gImNvbXByZXNzZWRfc3o6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJzaXplX2xlZnQgICAgICA6ICVkIiwKKwkgICAgICB0aGlzX3NlZ3Nfc3osIGNsdXN0ZXItPmNtcHJfc3osIHNpemVfbGVmdCk7CisJaWYgKHNpemVfbGVmdCA+IDE4KSB7IC8qIHN0YXJ0IGEgbmV3IGNsdXNldGVyICovCisJCWNwX2NudCA9IGNsdXN0ZXItPmNtcHJfc3o7CisJCWNsdXN0ZXItPmNtcHJfc3ogPSAwOworCQlidWZfcG9zID0gY3BfY250ICsgc2l6ZW9mKF9fdTE2KTsKKwkJUFVUMihkc3RfYnVmLCAwLCBidWZfcG9zKTsKKworCQlpZiAocWljMTEzKSB7CisJCQlfX3M2NCBmb2ZmcyA9IHBvcy0+dm9sdW1lX3BvczsKKwkJCWlmIChjcF9jbnQpIGZvZmZzICs9IChfX3M2NClibGtfc3o7CisKKwkJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAibmV3IHN0eWxlIFFJQy0xMTMgaGVhZGVyIik7CisJCQlQVVQ4KGRzdF9idWYsIGJ1Zl9wb3MsIGZvZmZzKTsKKwkJCWJ1Zl9wb3MgKz0gc2l6ZW9mKF9fczY0KTsKKwkJfSBlbHNlIHsKKwkJCV9fdTMyIGZvZmZzID0gKF9fdTMyKXBvcy0+dm9sdW1lX3BvczsKKwkJCWlmIChjcF9jbnQpIGZvZmZzICs9IChfX3UzMilibGtfc3o7CisJCQkKKwkJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAib2xkIHN0eWxlIFFJQy04ME1DIGhlYWRlciIpOworCQkJUFVUNChkc3RfYnVmLCBidWZfcG9zLCBmb2Zmcyk7CisJCQlidWZfcG9zICs9IHNpemVvZihfX3UzMik7CisJCX0KKwl9IGVsc2UgaWYgKHNpemVfbGVmdCA+PSAwKSB7CisJCWNwX2NudCA9IGNsdXN0ZXItPmNtcHJfc3o7CisJCWNsdXN0ZXItPmNtcHJfc3ogPSAwOworCQlidWZfcG9zID0gY3BfY250ICsgc2l6ZW9mKF9fdTE2KTsKKwkJUFVUMihkc3RfYnVmLCAwLCBidWZfcG9zKTsgIAorCQkvKiB6ZXJvIHVudXNlZCBwYXJ0IG9mIHNlZ21lbnQuICovCisJCW1lbXNldChkc3RfYnVmICsgYnVmX3BvcywgJ1wwJywgc2l6ZV9sZWZ0KTsKKwkJYnVmX3BvcyA9IHRoaXNfc2Vnc19zejsKKwl9IGVsc2UgeyAvKiBuZWVkIGVudGlyZSBzZWdtZW50IGFuZCBtb3JlIHNwYWNlICovCisJCVBVVDIoZHN0X2J1ZiwgMCwgMCk7IAorCQljcF9jbnQgPSB0aGlzX3NlZ3Nfc3ogLSBzaXplb2YoX191MTYpOworCQljbHVzdGVyLT5jbXByX3N6ICAtPSBjcF9jbnQ7CisJCWJ1Zl9wb3MgPSB0aGlzX3NlZ3Nfc3o7CisJfQorCW1lbWNweShkc3RfYnVmICsgc2l6ZW9mKF9fdTE2KSwgc3JjX2J1ZiArIGNsdXN0ZXItPmNtcHJfcG9zLCBjcF9jbnQpOworCWNsdXN0ZXItPmNtcHJfcG9zICs9IGNwX2NudDsKKwlUUkFDRV9FWElUIGJ1Zl9wb3M7Cit9CisKKy8qIHJldHVybi12YWx1ZTogdGhlIG51bWJlciBvZiBieXRlcyByZW1vdmVkIGZyb20gdGhlIHVzZXItYnVmZmVyCisgKiAgICAgICAgICAgICAgIGBzcmNfYnVmJyBvciBlcnJvciBjb2RlCisgKgorICogIGludCAqd3JpdGVfY250ICAgICAgICAgICA6IGhvdyBtdWNoIGFjdHVhbGx5IGhhcyBiZWVuIG1vdmVkIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWYuIE5lZWQgbm90IGJlIGluaXRpYWxpemVkIHdoZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByZXR1cm5zIHdpdGggYW4gZXJyb3IgY29kZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZWdhdGl2IHJldHVybiB2YWx1ZSkgCisgKiAgX191OCAqZHN0X2J1ZiAgICAgICAgICAgIDoga2VybmVsIHNwYWNlIGJ1ZmZlciB3aGVyZSB0aGUgaGFzIHRvIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkIHRvLiBUaGUgY29udGVudHMgb2YgdGhpcyBidWZmZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29lcyB0byBhIHNwZWNpZmljIHNlZ21lbnQuCisgKiAgY29uc3QgaW50IHNlZ19zeiAgICAgICAgIDogdGhlIHNpemUgb2YgdGhlIHNlZ21lbnQgZHN0X2J1ZiB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkIHRvLgorICogIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zICA6IHN0cnVjdCBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IHZvbHVtZSAoYnl0ZSBwb3NpdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50IGlkIG9mIGN1cnJlbnQgc2VnbWVudCBldGMpCisgKiAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZTogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgdm9sdW1lLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgZXRjLgorICogIGNvbnN0IF9fdTggKnNyY19idWYgICAgICA6IHVzZXIgc3BhY2UgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0aGUgdXNlciB3YW50cyB0byBiZSB3cml0dGVuIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwZS4KKyAqICBjb25zdCBpbnQgcmVxX2xlbiAgICAgICAgOiB0aGUgYW1vdW50IG9mIGRhdGEgdGhlIHVzZXIgd2FudHMgdG8gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuIHRvIHRhcGUuCisgKi8KK3N0YXRpYyBpbnQgemZ0Y193cml0ZShpbnQgKndyaXRlX2NudCwKKwkJICAgICAgX191OCAqZHN0X2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKKwkJICAgICAgY29uc3QgX191OCBfX3VzZXIgKnNyY19idWYsIGNvbnN0IGludCByZXFfbGVuLAorCQkgICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sKKwlpbnQgcmVxX2xlbl9sZWZ0ID0gcmVxX2xlbjsKKwlpbnQgcmVzdWx0OworCWludCBsZW5fbGVmdDsKKwlpbnQgYnVmX3Bvc193cml0ZSA9IHBvcy0+c2VnX2J5dGVfcG9zOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCS8qIE5vdGU6IHdlIGRvIG5vdCB1bmxvY2sgdGhlIG1vZHVsZSBiZWNhdXNlCisJICogdGhlcmUgYXJlIHNvbWUgdmFsdWVzIGNhY2hlZCBpbiB0aGF0IGBjc2VnJyB2YXJpYWJsZS4gIFdlCisJICogZG9uJ3QgZG9uJ3Qgd2FudCB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGJlaW5nCisJICogdW5sb2FkZWQgYnkga2VybmVsZCBldmVuIHdoZW4gdGhlIHRhcGUgaXMgZnVsbCBvciB3aGVuIHdlCisJICogY2Fubm90IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkuCisJICovCisJaWYgKHBvcy0+dGFwZV9wb3MgPiAodm9sdW1lLT5zaXplLXZvbHVtZS0+YmxrX3N6LVpGVF9DTVBSX09WRVJIRUFEKSkgeworCQlUUkFDRV9FWElUIC1FTk9TUEM7CisJfSAgICAKKwlpZiAoemZ0X2FsbG9jYXRlX2NtcHJfbWVtKHZvbHVtZS0+YmxrX3N6KSA8IDApIHsKKwkJLyogc2hvdWxkIHdlIHVubG9jayB0aGUgbW9kdWxlPyBCdXQgaXQgc2hvdWxkbid0IAorCQkgKiBiZSBsb2NrZWQgYW55d2F5IC4uLgorCQkgKi8KKwkJVFJBQ0VfRVhJVCAtRU5PTUVNOworCX0KKwlpZiAoYnVmX3Bvc193cml0ZSA9PSAwKSB7IC8qIGZpbGwgYSBuZXcgc2VnbWVudCAqLworCQkqd3JpdGVfY250ID0gYnVmX3Bvc193cml0ZSA9IHN0YXJ0X25ld19jc2VnKCZjc2VnLAorCQkJCQkJCSAgICBkc3RfYnVmLAorCQkJCQkJCSAgICBwb3MsCisJCQkJCQkJICAgIHZvbHVtZS0+YmxrX3N6LAorCQkJCQkJCSAgICB6ZnRjX2J1ZiwgCisJCQkJCQkJICAgIHNlZ19zeiwKKwkJCQkJCQkgICAgdm9sdW1lLT5xaWMxMTMpOworCQlpZiAoY3NlZy5jbXByX3N6ID09IDAgJiYgY3NlZy5jbXByX3BvcyAhPSAwKSB7CisJCQlyZXFfbGVuX2xlZnQgLT0gcmVzdWx0ID0gdm9sdW1lLT5ibGtfc3o7CisJCQljc2VnLmNtcHJfcG9zICA9IDA7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJKndyaXRlX2NudCA9IHJlc3VsdCA9IDA7CisJfQorCQorCWxlbl9sZWZ0ID0gc2VnX3N6IC0gYnVmX3Bvc193cml0ZTsKKwl3aGlsZSAoKHJlcV9sZW5fbGVmdCA+IDApICYmIChsZW5fbGVmdCA+IDE4KSkgeworCQkvKiBub3cgd2UgaGF2ZSBzb21lIHNpemUgbGVmdCBmb3IgYSBuZXcgY29tcHJlc3NlZAorCQkgKiBibG9jay4gIFdlIGtub3csIHRoYXQgdGhlIGNvbXByZXNzaW9uIGJ1ZmZlciBpcworCQkgKiBlbXB0eSAoZWxzZSB0aGVyZSB3b3VsZG4ndCBiZSBhbnkgc3BhY2UgbGVmdCkuICAKKwkJICovCisJCWlmIChjb3B5X2Zyb21fdXNlcih6ZnRjX3NjcmF0Y2hfYnVmLCBzcmNfYnVmICsgcmVzdWx0LCAKKwkJCQkgICB2b2x1bWUtPmJsa19zeikgIT0gMCkgeworCQkJVFJBQ0VfRVhJVCAtRUZBVUxUOworCQl9CisJCXJlcV9sZW5fbGVmdCAtPSB2b2x1bWUtPmJsa19zejsKKwkJY3NlZy5jbXByX3N6ID0gemZ0X2NvbXByZXNzKHpmdGNfc2NyYXRjaF9idWYsIHZvbHVtZS0+YmxrX3N6LCAKKwkJCQkJICAgIHpmdGNfYnVmKTsKKwkJaWYgKGNzZWcuY21wcl9zeiA8IDApIHsKKwkJCWNzZWcudW5jbXByID0gMHg4MDAwOworCQkJY3NlZy5jbXByX3N6ID0gLWNzZWcuY21wcl9zejsKKwkJfSBlbHNlIHsKKwkJCWNzZWcudW5jbXByID0gMDsKKwkJfQorCQkvKiBpbmNyZW1lbnQgInJlc3VsdCIgaWZmIHdlIGNvcGllZCB0aGUgZW50aXJlCisJCSAqIGNvbXByZXNzZWQgYmxvY2sgdG8gdGhlIHpmdF9kZWJsb2NrX2J1ZiAKKwkJICovCisJCWxlbl9sZWZ0IC09IHNpemVvZihfX3UxNik7CisJCWlmIChsZW5fbGVmdCA+PSBjc2VnLmNtcHJfc3opIHsKKwkJCWxlbl9sZWZ0IC09IGNzZWcuY291bnQgPSBjc2VnLmNtcHJfc3o7CisJCQljc2VnLmNtcHJfcG9zID0gY3NlZy5jbXByX3N6ID0gMDsKKwkJCXJlc3VsdCArPSB2b2x1bWUtPmJsa19zejsKKwkJfSBlbHNlIHsKKwkJCWNzZWcuY21wcl9zeiAgICAgICAtPSAKKwkJCQljc2VnLmNtcHJfcG9zID0KKwkJCQljc2VnLmNvdW50ICAgID0gbGVuX2xlZnQ7CisJCQlsZW5fbGVmdCA9IDA7CisJCX0KKwkJUFVUMihkc3RfYnVmLCBidWZfcG9zX3dyaXRlLCBjc2VnLnVuY21wciB8IGNzZWcuY291bnQpOworCQlidWZfcG9zX3dyaXRlICs9IHNpemVvZihfX3UxNik7CisJCW1lbWNweShkc3RfYnVmICsgYnVmX3Bvc193cml0ZSwgemZ0Y19idWYsIGNzZWcuY291bnQpOworCQlidWZfcG9zX3dyaXRlICs9IGNzZWcuY291bnQ7CisJCSp3cml0ZV9jbnQgICAgKz0gY3NlZy5jb3VudCArIHNpemVvZihfX3UxNik7CisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwl9CisJLyogZXJhc2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudCBpZiBsZXNzIHRoYW4gMTggYnl0ZXMKKwkgKiBsZWZ0ICgxOCBieXRlcyBpcyBkdWUgdG8gdGhlIFFJQy04MCBzdGFuZGFyZCkgCisJICovCisJaWYgKGxlbl9sZWZ0IDw9IDE4KSB7CisJCW1lbXNldChkc3RfYnVmICsgYnVmX3Bvc193cml0ZSwgJ1wwJywgbGVuX2xlZnQpOworCQkoKndyaXRlX2NudCkgKz0gbGVuX2xlZnQ7CisJfQorCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAicmV0dXJuaW5nICVkIiwgcmVzdWx0KTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30gICAKKworLyogb3V0OgorICoKKyAqIGludCAqcmVhZF9jbnQ6IHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgcmVtb3ZlZCBmcm9tIHRoZSB6ZnRfZGVibG9ja19idWYKKyAqICAgICAgICAgICAgICAgIChyZXN1bHQpCisgKiBpbnQgKnRvX2RvICAgOiB0aGUgcmVtYWluaW5nIHNpemUgb2YgdGhlIHJlYWQtcmVxdWVzdC4KKyAqCisgKiBpbjoKKyAqCisgKiBjaGFyICpidWZmICAgICAgICAgIDogYnVmZiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgdXNlcgorICogICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgdGhhdCBoYXNuJ3QgYmVlbiBmaWxsZWQgd2l0aCBkYXRhIHlldC4KKworICogaW50IGJ1Zl9wb3NfcmVhZCAgICA6IGNvcHkgb2YgZnJvbSBfZnRhcGVfcmVhZCgpCisgKiBpbnQgYnVmX2xlbl9yZWFkICAgIDogY29weSBvZiBidWZfbGVuX3JkIGZyb20gX2Z0YXBlX3JlYWQoKQorICogY2hhciAqemZ0X2RlYmxvY2tfYnVmOiB6ZnRfZGVibG9ja19idWYKKyAqIHVuc2lnbmVkIHNob3J0IGJsa19zejogdGhlIGJsb2NrIHNpemUgdmFsaWQgZm9yIHRoaXMgdm9sdW1lLCBtYXkgZGlmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHpmdF9ibGtfc3ouCisgKiBpbnQgZmluaXNoOiBpZiAhPSAwIG1lYW5zIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBzZWdtZW50IGJlbG9uZ2luZworICogIHRvIHRoaXMgdm9sdW1lCisgKiByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSBhY3R1YWxseSBjb3BpZWQgdG8gdGhlIHVzZXItYnVmZmVyCisgKgorICogdG9fZG8gTVVTVCBOT1QgU0hSSU5LIGV4Y2VwdCB0byBpbmRpY2F0ZSBhbiBFT0YuIEluIHRoaXMgY2FzZSAqdG9fZG8gaGFzIHRvCisgKiBiZSBzZXQgdG8gMCAKKyAqLworc3RhdGljIGludCB6ZnRjX3JlYWQgKGludCAqcmVhZF9jbnQsIAorCQkgICAgICBfX3U4ICBfX3VzZXIgKmRzdF9idWYsIGNvbnN0IGludCB0b19kbywgCisJCSAgICAgIGNvbnN0IF9fdTggKnNyY19idWYsIGNvbnN0IGludCBzZWdfc3osIAorCQkgICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKK3sgICAgICAgICAgCisJaW50IHVuY29tcHJlc3NlZF9zejsgICAgICAgICAKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcmVtYWluaW5nID0gdG9fZG87CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRV9DQVRDSCh6ZnRfYWxsb2NhdGVfY21wcl9tZW0odm9sdW1lLT5ibGtfc3opLCk7CisJaWYgKHBvcy0+c2VnX2J5dGVfcG9zID09IDApIHsKKwkJLyogbmV3IHNlZ21lbnQganVzdCByZWFkCisJCSAqLworCQlUUkFDRV9DQVRDSChnZXRfY3NlZygmY3NlZywgc3JjX2J1Ziwgc2VnX3N6LCB2b2x1bWUpLAorCQkJICAgICpyZWFkX2NudCA9IDApOworCQltZW1jcHkoemZ0Y19idWYgKyBjc2VnLmNtcHJfcG9zLCBzcmNfYnVmICsgc2l6ZW9mKF9fdTE2KSwgCisJCSAgICAgICBjc2VnLmNvdW50KTsKKwkJY3NlZy5jbXByX3BvcyArPSBjc2VnLmNvdW50OworCQkqcmVhZF9jbnQgICAgICA9IGNzZWcub2Zmc2V0OworCQlEVU1QX0NNUFJfSU5GTyhmdF90X25vaXNlIC8qIGZ0X3RfYW55ICovLCAiIiwgJmNzZWcpOworCX0gZWxzZSB7CisJCSpyZWFkX2NudCA9IDA7CisJfQorCS8qIGxvb3AgYW5kIHVuY29tcHJlc3MgdW50aWwgdXNlciBidWZmZXIgZnVsbCBvcgorCSAqIGRlYmxvY2stYnVmZmVyIGVtcHR5IAorCSAqLworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiY29tcHJlc3NlZF9zejogJWQsIGNvbXBvcyA6ICVkLCAqcmVhZF9jbnQ6ICVkIiwKKwkgICAgICBjc2VnLmNtcHJfc3osIGNzZWcuY21wcl9wb3MsICpyZWFkX2NudCk7CisJd2hpbGUgKChjc2VnLnNwYW5zID09IDApICYmIChyZW1haW5pbmcgPiAwKSkgeworCQlpZiAoY3NlZy5jbXByX3BvcyAgIT0gMCkgeyAvKiBjbXByIGJ1ZiBpcyBub3QgZW1wdHkgKi8KKwkJCXVuY29tcHJlc3NlZF9zeiA9IAorCQkJCXpmdF91bmNvbXByZXNzKHpmdGNfYnVmLAorCQkJCQkgICAgICAgY3NlZy51bmNtcHIgPT0gMHg4MDAwID8KKwkJCQkJICAgICAgIC1jc2VnLmNtcHJfcG9zIDogY3NlZy5jbXByX3BvcywKKwkJCQkJICAgICAgIHpmdGNfc2NyYXRjaF9idWYsCisJCQkJCSAgICAgICB2b2x1bWUtPmJsa19zeik7CisJCQlpZiAodW5jb21wcmVzc2VkX3N6ICE9IHZvbHVtZS0+YmxrX3N6KSB7CisJCQkJKnJlYWRfY250ID0gMDsKKwkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X3dhcm4sCisJCQkJICAgICAgIlVuY29tcHJlc3NlZCBibGsgKCVkKSAhPSBibGsgc2l6ZSAoJWQpIiwKKwkJCQkgICAgICB1bmNvbXByZXNzZWRfc3osIHZvbHVtZS0+YmxrX3N6KTsKKwkJCX0gICAgICAgCisJCQlpZiAoY29weV90b191c2VyKGRzdF9idWYgKyByZXN1bHQsIAorCQkJCQkgemZ0Y19zY3JhdGNoX2J1ZiwgCisJCQkJCSB1bmNvbXByZXNzZWRfc3opICE9IDAgKSB7CisJCQkJVFJBQ0VfRVhJVCAtRUZBVUxUOworCQkJfQorCQkJcmVtYWluaW5nICAgICAgLT0gdW5jb21wcmVzc2VkX3N6OworCQkJcmVzdWx0ICAgICArPSB1bmNvbXByZXNzZWRfc3o7CisJCQljc2VnLmNtcHJfcG9zICA9IDA7CisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCWlmIChyZW1haW5pbmcgPiAwKSB7CisJCQlnZXRfbmV4dF9jbHVzdGVyKCZjc2VnLCBzcmNfYnVmLCBzZWdfc3osIAorCQkJCQkgdm9sdW1lLT5lbmRfc2VnID09IHBvcy0+c2VnX3Bvcyk7CisJCQlpZiAoY3NlZy5jb3VudCAhPSAwKSB7CisJCQkJbWVtY3B5KHpmdGNfYnVmLCBzcmNfYnVmICsgY3NlZy5vZmZzZXQsCisJCQkJICAgICAgIGNzZWcuY291bnQpOworCQkJCWNzZWcuY21wcl9wb3MgPSBjc2VnLmNvdW50OworCQkJCWNzZWcub2Zmc2V0ICArPSBjc2VnLmNvdW50OworCQkJCSpyZWFkX2NudCArPSBjc2VnLmNvdW50ICsgc2l6ZW9mKF9fdTE2KTsKKwkJCX0gZWxzZSB7CisJCQkJcmVtYWluaW5nID0gMDsKKwkJCX0KKwkJfQorCQlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIiAKKwkJICAgICAgS0VSTl9JTkZPICJjb21wcmVzc2VkX3N6OiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gImNvbXBvcyAgICAgICA6ICVkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiKnJlYWRfY250ICAgIDogJWQiLAorCQkgICAgICBjc2VnLmNtcHJfc3osIGNzZWcuY21wcl9wb3MsICpyZWFkX2NudCk7CisJfQorCWlmIChzZWdfc3ogLSBjc2VnLm9mZnNldCA8PSAxOCkgeworCQkqcmVhZF9jbnQgKz0gc2VnX3N6IC0gY3NlZy5vZmZzZXQ7CisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiZXhwYW5kaW5nIHJlYWQgY250IHRvOiAlZCIsICpyZWFkX2NudCk7CisJfQorCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJzZWdtZW50IHNpemUgICA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJyZWFkIGNvdW50ICAgICA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJidWZfcG9zX3JlYWQgICA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmcgICAgICA6ICVkIiwKKwkJc2VnX3N6LCAqcmVhZF9jbnQsIHBvcy0+c2VnX2J5dGVfcG9zLCAKKwkJc2VnX3N6IC0gKnJlYWRfY250IC0gcG9zLT5zZWdfYnl0ZV9wb3MpOworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAicmV0dXJuaW5nOiAlZCIsIHJlc3VsdCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9ICAgICAgICAgICAgICAgIAorCisvKiBzZWVrcyB0byB0aGUgbmV3IGRhdGEtcG9zaXRpb24uIFJlYWRzIHNvbWV0aW1lcyBhIHNlZ21lbnQuCisgKiAgCisgKiBzdGFydF9zZWcgYW5kIGVuZF9zZWcgZ2l2ZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgY3VycmVudCB2b2x1bWUKKyAqIGJsa19zeiBpcyB0aGUgYmxrX3N6IG9mIHRoZSBjdXJyZW50IHZvbHVtZSBhcyBzdG9yZWQgaW4gdGhlCisgKiB2b2x1bWUgbGFiZWwKKyAqCisgKiBXZSBkb24ndCBhbGxvdyBibG9ja3NpemVzIGxlc3MgdGhhbiAxMDI0IGJ5dGVzLCB0aGVyZWZvcmUgd2UgZG9uJ3QgbmVlZAorICogYSA2NCBiaXQgYXJndW1lbnQgZm9yIG5ld19ibG9ja19wb3MuCisgKi8KKworc3RhdGljIGludCBzZWVrX2luX3NlZ21lbnQoY29uc3QgdW5zaWduZWQgaW50IHRvX2RvLCBjbXByX2luZm8gICpjX2luZm8sCisJCQkgICBjb25zdCBjaGFyICpzcmNfYnVmLCBjb25zdCBpbnQgc2VnX3N6LCAKKwkJCSAgIGNvbnN0IGludCBzZWdfcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKTsKK3N0YXRpYyBpbnQgc2xvd19zZWVrX2ZvcndhcmRfdW50aWxfZXJyb3IoY29uc3QgdW5zaWduZWQgaW50IGRpc3RhbmNlLAorCQkJCQkgY21wcl9pbmZvICpjX2luZm8sIHpmdF9wb3NpdGlvbiAqcG9zLCAKKwkJCQkJIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsIF9fdTggKmJ1Zik7CitzdGF0aWMgaW50IHNlYXJjaF92YWxpZF9zZWdtZW50KHVuc2lnbmVkIGludCBzZWdtZW50LAorCQkJCWNvbnN0IHVuc2lnbmVkIGludCBlbmRfc2VnLAorCQkJCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfZm9mZnMsCisJCQkJemZ0X3Bvc2l0aW9uICpwb3MsIGNtcHJfaW5mbyAqY19pbmZvLAorCQkJCWNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsIF9fdTggKmJ1Zik7CitzdGF0aWMgaW50IHNsb3dfc2Vla19mb3J3YXJkKHVuc2lnbmVkIGludCBkZXN0LCBjbXByX2luZm8gKmNfaW5mbywKKwkJCSAgICAgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCisJCQkgICAgIF9fdTggKmJ1Zik7CitzdGF0aWMgaW50IGNvbXB1dGVfc2VnX3Bvcyh1bnNpZ25lZCBpbnQgZGVzdCwgemZ0X3Bvc2l0aW9uICpwb3MsCisJCQkgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKTsKKworI2RlZmluZSBaRlRfU0xPV19TRUVLX1RIUkVTSE9MRCAgMTAgLyogc2VnbWVudHMgKi8KKyNkZWZpbmUgWkZUX0ZBU1RfU0VFS19NQVhfVFJJQUxTIDEwIC8qIHRpbWVzICovCisjZGVmaW5lIFpGVF9GQVNUX1NFRUtfQkFDS1VQICAgICAxMCAvKiBzZWdtZW50cyAqLworCitzdGF0aWMgaW50IHpmdGNfc2Vlayh1bnNpZ25lZCBpbnQgbmV3X2Jsb2NrX3BvcywKKwkJICAgICB6ZnRfcG9zaXRpb24gKnBvcywgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwgX191OCAqYnVmKQoreworCXVuc2lnbmVkIGludCBkZXN0OworCWludCBsaW1pdDsKKwlpbnQgZGlzdGFuY2U7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHNlZ19kaXN0OworCWludCBuZXdfc2VnOworCWludCBvbGRfc2VnID0gMDsKKwlpbnQgZmFzdF9zZWVrX3RyaWFscyA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAobmV3X2Jsb2NrX3BvcyA9PSAwKSB7CisJCXBvcy0+c2VnX3BvcyAgICAgID0gdm9sdW1lLT5zdGFydF9zZWc7CisJCXBvcy0+c2VnX2J5dGVfcG9zID0gMDsKKwkJcG9zLT52b2x1bWVfcG9zICAgPSAwOworCQl6ZnRjX3Jlc2V0KCk7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJZGVzdCA9IG5ld19ibG9ja19wb3MgKiAodm9sdW1lLT5ibGtfc3ogPj4gMTApOworCWRpc3RhbmNlID0gZGVzdCAtIChwb3MtPnZvbHVtZV9wb3MgPj4gMTApOworCXdoaWxlIChkaXN0YW5jZSAhPSAwKSB7CisJCXNlZ19kaXN0ID0gY29tcHV0ZV9zZWdfcG9zKGRlc3QsIHBvcywgdm9sdW1lKTsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgorCQkgICAgICBLRVJOX0lORk8gInNlZ19kaXN0OiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gImRpc3RhbmNlOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gImRlc3QgICAgOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gInZwb3MgICAgOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gInNlZ19wb3MgOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gInRyaWFscyAgOiAlZCIsCisJCSAgICAgIHNlZ19kaXN0LCBkaXN0YW5jZSwgZGVzdCwKKwkJICAgICAgKHVuc2lnbmVkIGludCkocG9zLT52b2x1bWVfcG9zPj4xMCksIHBvcy0+c2VnX3BvcywKKwkJICAgICAgZmFzdF9zZWVrX3RyaWFscyk7CisJCWlmIChkaXN0YW5jZSA+IDApIHsKKwkJCWlmIChzZWdfZGlzdCA8IDApIHsKKwkJCQlUUkFDRShmdF90X2J1ZywgIkJVRzogZGlzdGFuY2UgJWQgPiAwLCAiCisJCQkJICAgICAgInNlZ21lbnQgZGlmZmVyZW5jZSAlZCA8IDAiLAorCQkJCSAgICAgIGRpc3RhbmNlLCBzZWdfZGlzdCk7CisJCQkJcmVzdWx0ID0gLUVJTzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5ld19zZWcgPSBwb3MtPnNlZ19wb3MgKyBzZWdfZGlzdDsKKwkJCWlmIChuZXdfc2VnID4gdm9sdW1lLT5lbmRfc2VnKSB7CisJCQkJbmV3X3NlZyA9IHZvbHVtZS0+ZW5kX3NlZzsKKwkJCX0KKwkJCWlmIChvbGRfc2VnID09IG5ld19zZWcgfHwgLyogbG9vcCAqLworCQkJICAgIHNlZ19kaXN0IDw9IFpGVF9TTE9XX1NFRUtfVEhSRVNIT0xEIHx8CisJCQkgICAgZmFzdF9zZWVrX3RyaWFscyA+PSBaRlRfRkFTVF9TRUVLX01BWF9UUklBTFMpIHsKKwkJCQlUUkFDRShmdF90X25vaXNlLCAic3RhcnRpbmcgc2xvdyBzZWVrOlxuIgorCQkJCSAgIEtFUk5fSU5GTyAiZmFzdCBzZWVrIGZhaWxlZCB0b28gb2Z0ZW46ICVzXG4iCisJCQkJICAgS0VSTl9JTkZPICJuZWFyIHRhcmdldCBwb3NpdGlvbiAgICAgIDogJXNcbiIKKwkJCQkgICBLRVJOX0lORk8gImxvb3BpbmcgYmV0d2VlbiB0d28gc2VncyAgOiAlcyIsCisJCQkJICAgICAgKGZhc3Rfc2Vla190cmlhbHMgPj0gCisJCQkJICAgICAgIFpGVF9GQVNUX1NFRUtfTUFYX1RSSUFMUykKKwkJCQkgICAgICA/ICJ5ZXMiIDogIm5vIiwKKwkJCQkgICAgICAoc2VnX2Rpc3QgPD0gWkZUX1NMT1dfU0VFS19USFJFU0hPTEQpIAorCQkJCSAgICAgID8gInllcyIgOiAibm8iLAorCQkJCSAgICAgIChvbGRfc2VnID09IG5ld19zZWcpCisJCQkJICAgICAgPyAieWVzIiA6ICJubyIpOworCQkJCXJlc3VsdCA9IHNsb3dfc2Vla19mb3J3YXJkKGRlc3QsICZjc2VnLCAKKwkJCQkJCQkgICBwb3MsIHZvbHVtZSwgYnVmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW9sZF9zZWcgPSBuZXdfc2VnOworCQkJbGltaXQgPSB2b2x1bWUtPmVuZF9zZWc7CisJCQlmYXN0X3NlZWtfdHJpYWxzICsrOworCQkJZm9yICg7OykgeworCQkJCXJlc3VsdCA9IHNlYXJjaF92YWxpZF9zZWdtZW50KG5ld19zZWcsIGxpbWl0LAorCQkJCQkJCSAgICAgIHZvbHVtZS0+c2l6ZSwKKwkJCQkJCQkgICAgICBwb3MsICZjc2VnLAorCQkJCQkJCSAgICAgIHZvbHVtZSwgYnVmKTsKKwkJCQlpZiAocmVzdWx0ID09IDAgfHwgcmVzdWx0ID09IC1FSU5UUikgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKG5ld19zZWcgPT0gdm9sdW1lLT5zdGFydF9zZWcpIHsKKwkJCQkJcmVzdWx0ID0gLUVJTzsgLyogc2V0IGVycnJvciAKKwkJCQkJCQkqIGNvbmRpdGlvbgorCQkJCQkJCSovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlsaW1pdCAgICA9IG5ld19zZWc7CisJCQkJbmV3X3NlZyAtPSBaRlRfRkFTVF9TRUVLX0JBQ0tVUDsKKwkJCQlpZiAobmV3X3NlZyA8IHZvbHVtZS0+c3RhcnRfc2VnKSB7CisJCQkJCW5ld19zZWcgPSB2b2x1bWUtPnN0YXJ0X3NlZzsKKwkJCQl9CisJCQl9CisJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiQ291bGRuJ3QgZmluZCBhIHJlYWRhYmxlIHNlZ21lbnQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIC8qIGlmIChkaXN0YW5jZSA8IDApICovIHsKKwkJCWlmIChzZWdfZGlzdCA+IDApIHsKKwkJCQlUUkFDRShmdF90X2J1ZywgIkJVRzogZGlzdGFuY2UgJWQgPCAwLCAiCisJCQkJICAgICAgInNlZ21lbnQgZGlmZmVyZW5jZSAlZCA+MCIsCisJCQkJICAgICAgZGlzdGFuY2UsIHNlZ19kaXN0KTsKKwkJCQlyZXN1bHQgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQorCQkJbmV3X3NlZyA9IHBvcy0+c2VnX3BvcyArIHNlZ19kaXN0OworCQkJaWYgKGZhc3Rfc2Vla190cmlhbHMgPiAwICYmIHNlZ19kaXN0ID09IDApIHsKKwkJCQkvKiB0aGlzIGF2b2lkcyBzdGlja2luZyB0byB0aGUgc2FtZQorCQkJCSAqIHNlZ21lbnQgYWxsIHRoZSB0aW1lLiBPbiB0aGUgb3RoZXIgaGFuZDoKKwkJCQkgKiBpZiB3ZSBnb3QgaGVyZSBmb3IgdGhlIGZpcnN0IHRpbWUsIGFuZCB0aGUKKwkJCQkgKiBkZWJsb2NrX2J1ZmZlciBzdGlsbCBjb250YWlucyBhIHZhbGlkCisJCQkJICogc2VnbWVudCwgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIHNraXAgdG8gCisJCQkJICogdGhlIHByZXZpb3VzIHNlZ21lbnQgaWYgdGhlIGRlc2lyZWQgcG9zaXRpb24KKwkJCQkgKiBpcyBpbnNpZGUgdGhpcyBzZWdtZW50LgorCQkJCSAqLworCQkJCW5ld19zZWcgLS07CisJCQl9CisJCQlpZiAobmV3X3NlZyA8IHZvbHVtZS0+c3RhcnRfc2VnKSB7CisJCQkJbmV3X3NlZyA9IHZvbHVtZS0+c3RhcnRfc2VnOworCQkJfQorCQkJbGltaXQgICA9IHBvcy0+c2VnX3BvczsKKwkJCWZhc3Rfc2Vla190cmlhbHMgKys7CisJCQlmb3IgKDs7KSB7CisJCQkJcmVzdWx0ID0gc2VhcmNoX3ZhbGlkX3NlZ21lbnQobmV3X3NlZywgbGltaXQsCisJCQkJCQkJICAgICAgcG9zLT52b2x1bWVfcG9zLAorCQkJCQkJCSAgICAgIHBvcywgJmNzZWcsCisJCQkJCQkJICAgICAgdm9sdW1lLCBidWYpOworCQkJCWlmIChyZXN1bHQgPT0gMCB8fCByZXN1bHQgPT0gLUVJTlRSKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAobmV3X3NlZyA9PSB2b2x1bWUtPnN0YXJ0X3NlZykgeworCQkJCQlyZXN1bHQgPSAtRUlPOyAvKiBzZXQgZXJycm9yIAorCQkJCQkJCSogY29uZGl0aW9uCisJCQkJCQkJKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWxpbWl0ICAgID0gbmV3X3NlZzsKKwkJCQluZXdfc2VnIC09IFpGVF9GQVNUX1NFRUtfQkFDS1VQOworCQkJCWlmIChuZXdfc2VnIDwgdm9sdW1lLT5zdGFydF9zZWcpIHsKKwkJCQkJbmV3X3NlZyA9IHZvbHVtZS0+c3RhcnRfc2VnOworCQkJCX0KKwkJCX0KKwkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJVFJBQ0UoZnRfdF93YXJuLAorCQkJCSAgICAgICJDb3VsZG4ndCBmaW5kIGEgcmVhZGFibGUgc2VnbWVudCIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWRpc3RhbmNlID0gZGVzdCAtIChwb3MtPnZvbHVtZV9wb3MgPj4gMTApOworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworCisvKiAgYWR2YW5jZSBpbnNpZGUgdGhlIGdpdmVuIHNlZ21lbnQgYXQgbW9zdCB0b19kbyBieXRlcy4KKyAqICBvZiBraWxvYnl0ZXMgbW92ZWQKKyAqLworCitzdGF0aWMgaW50IHNlZWtfaW5fc2VnbWVudChjb25zdCB1bnNpZ25lZCBpbnQgdG9fZG8sCisJCQkgICBjbXByX2luZm8gICpjX2luZm8sCisJCQkgICBjb25zdCBjaGFyICpzcmNfYnVmLCAKKwkJCSAgIGNvbnN0IGludCBzZWdfc3osIAorCQkJICAgY29uc3QgaW50IHNlZ19wb3MsCisJCQkgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKQoreworCWludCByZXN1bHQgPSAwOworCWludCBibGtfc3ogPSB2b2x1bWUtPmJsa19zeiA+PiAxMDsKKwlpbnQgcmVtYWluaW5nID0gdG9fZG87CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoY19pbmZvLT5vZmZzZXQgPT0gMCkgeworCQkvKiBuZXcgc2VnbWVudCBqdXN0IHJlYWQKKwkJICovCisJCVRSQUNFX0NBVENIKGdldF9jc2VnKGNfaW5mbywgc3JjX2J1Ziwgc2VnX3N6LCB2b2x1bWUpLCk7CisJCWNfaW5mby0+Y21wcl9wb3MgKz0gY19pbmZvLT5jb3VudDsKKwkJRFVNUF9DTVBSX0lORk8oZnRfdF9ub2lzZSwgIiIsIGNfaW5mbyk7CisJfQorCS8qIGxvb3AgYW5kIHVuY29tcHJlc3MgdW50aWwgdXNlciBidWZmZXIgZnVsbCBvcgorCSAqIGRlYmxvY2stYnVmZmVyIGVtcHR5IAorCSAqLworCVRSQUNFKGZ0X3Rfbm9pc2UsICJjb21wcmVzc2VkX3N6OiAlZCwgY29tcG9zIDogJWQiLAorCSAgICAgIGNfaW5mby0+Y21wcl9zeiwgY19pbmZvLT5jbXByX3Bvcyk7CisJd2hpbGUgKGNfaW5mby0+c3BhbnMgPT0gMCAmJiByZW1haW5pbmcgPiAwKSB7CisJCWlmIChjX2luZm8tPmNtcHJfcG9zICAhPSAwKSB7IC8qIGNtcHIgYnVmIGlzIG5vdCBlbXB0eSAqLworCQkJcmVzdWx0ICAgICAgICs9IGJsa19zejsKKwkJCXJlbWFpbmluZyAgICAtPSBibGtfc3o7CisJCQljX2luZm8tPmNtcHJfcG9zID0gMDsKKwkJfQorCQlpZiAocmVtYWluaW5nID4gMCkgeworCQkJZ2V0X25leHRfY2x1c3RlcihjX2luZm8sIHNyY19idWYsIHNlZ19zeiwgCisJCQkJCSB2b2x1bWUtPmVuZF9zZWcgPT0gc2VnX3Bvcyk7CisJCQlpZiAoY19pbmZvLT5jb3VudCAhPSAwKSB7CisJCQkJY19pbmZvLT5jbXByX3BvcyA9IGNfaW5mby0+Y291bnQ7CisJCQkJY19pbmZvLT5vZmZzZXQgICs9IGNfaW5mby0+Y291bnQ7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qICBBbGxvdyBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agb24gc2lnbmFsIQorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQlEVU1QX0NNUFJfSU5GTyhmdF90X25vaXNlLCAiIiwgY19pbmZvKTsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInRvX2RvOiAlZCIsIHJlbWFpbmluZyk7CisJfQorCWlmIChzZWdfc3ogLSBjX2luZm8tPm9mZnNldCA8PSAxOCkgeworCQljX2luZm8tPm9mZnNldCA9IHNlZ19zejsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgorCSAgICAgIEtFUk5fSU5GTyAic2VnbWVudCBzaXplICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAiYnVmX3Bvc19yZWFkICAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nICAgICAgOiAlZCIsCisJICAgICAgc2VnX3N6LCBjX2luZm8tPm9mZnNldCwKKwkgICAgICBzZWdfc3ogLSBjX2luZm8tPm9mZnNldCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9ICAgICAgICAgICAgICAgIAorCitzdGF0aWMgaW50IHNsb3dfc2Vla19mb3J3YXJkX3VudGlsX2Vycm9yKGNvbnN0IHVuc2lnbmVkIGludCBkaXN0YW5jZSwKKwkJCQkJIGNtcHJfaW5mbyAqY19pbmZvLAorCQkJCQkgemZ0X3Bvc2l0aW9uICpwb3MsIAorCQkJCQkgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKKwkJCQkJIF9fdTggKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgcmVtYWluaW5nID0gZGlzdGFuY2U7CisJaW50IHNlZ19zejsKKwlpbnQgc2VnX3BvczsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXNlZ19wb3MgPSBwb3MtPnNlZ19wb3M7CisJZG8geworCQlUUkFDRV9DQVRDSChzZWdfc3ogPSB6ZnRfZmV0Y2hfc2VnbWVudChzZWdfcG9zLCBidWYsIAorCQkJCQkJICAgICAgIEZUX1JEX0FIRUFEKSwpOworCQkvKiBub3cgd2UgaGF2ZSB0aGUgY29udGVudHMgb2YgdGhlIGFjdHVhbCBzZWdtZW50IGluCisJCSAqIHRoZSBkZWJsb2NrIGJ1ZmZlcgorCQkgKi8KKwkJVFJBQ0VfQ0FUQ0gocmVzdWx0ID0gc2Vla19pbl9zZWdtZW50KHJlbWFpbmluZywgY19pbmZvLCBidWYsCisJCQkJCQkgICAgIHNlZ19zeiwgc2VnX3Bvcyx2b2x1bWUpLCk7CisJCXJlbWFpbmluZyAgICAgICAgLT0gcmVzdWx0OworCQlwb3MtPnZvbHVtZV9wb3MgICs9IHJlc3VsdDw8MTA7CisJCXBvcy0+c2VnX3BvcyAgICAgID0gc2VnX3BvczsKKwkJcG9zLT5zZWdfYnl0ZV9wb3MgPSBjX2luZm8tPm9mZnNldDsKKwkJc2VnX3BvcyArKzsKKwkJaWYgKHNlZ19wb3MgPD0gdm9sdW1lLT5lbmRfc2VnICYmIGNfaW5mby0+b2Zmc2V0ID09IHNlZ19zeikgeworCQkJcG9zLT5zZWdfcG9zICsrOworCQkJcG9zLT5zZWdfYnl0ZV9wb3MgPSAwOworCQkJY19pbmZvLT5vZmZzZXQgPSAwOworCQl9CisJCS8qICBBbGxvdyBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agb24gc2lnbmFsIQorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQlUUkFDRShmdF90X25vaXNlLCAiXG4iCisJCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nOiAgJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJzZWdfcG9zOiAgICAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gImVuZF9zZWc6ICAgICVkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAicmVzdWx0OiAgICAgJWQiLAorCQkgICAgICByZW1haW5pbmcsIHNlZ19wb3MsIHZvbHVtZS0+ZW5kX3NlZywgcmVzdWx0KTsgIAorCX0gd2hpbGUgKHJlbWFpbmluZyA+IDAgJiYgc2VnX3BvcyA8PSB2b2x1bWUtPmVuZF9zZWcpOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogcmV0dXJuIHNlZ21lbnQgaWQgb2YgbmV4dCBzZWdtZW50IGNvbnRhaW5pbmcgdmFsaWQgZGF0YSwgLUVJTyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBzZWFyY2hfdmFsaWRfc2VnbWVudCh1bnNpZ25lZCBpbnQgc2VnbWVudCwKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgZW5kX3NlZywKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X2ZvZmZzLAorCQkJCXpmdF9wb3NpdGlvbiAqcG9zLAorCQkJCWNtcHJfaW5mbyAqY19pbmZvLAorCQkJCWNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCisJCQkJX191OCAqYnVmKQoreworCWNtcHJfaW5mbyB0bXBfaW5mbzsKKwlpbnQgc2VnX3N6OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCW1lbXNldCgmdG1wX2luZm8sIDAsIHNpemVvZihjbXByX2luZm8pKTsKKwl3aGlsZSAoc2VnbWVudCA8PSBlbmRfc2VnKSB7CisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgIlNlYXJjaGluZyByZWFkYWJsZSBzZWdtZW50IGJldHdlZW4gJWQgYW5kICVkIiwKKwkJICAgICAgc2VnbWVudCwgZW5kX3NlZyk7CisJCXNlZ19zeiA9IHpmdF9mZXRjaF9zZWdtZW50KHNlZ21lbnQsIGJ1ZiwgRlRfUkRfQUhFQUQpOworCQlpZiAoKHNlZ19zeiA+IDApICYmCisJCSAgICAoZ2V0X2NzZWcgKCZ0bXBfaW5mbywgYnVmLCBzZWdfc3osIHZvbHVtZSkgPj0gMCkgJiYKKwkJICAgICh0bXBfaW5mby5mb2ZmcyAhPSAwIHx8IHNlZ21lbnQgPT0gdm9sdW1lLT5zdGFydF9zZWcpKSB7CisJCQlpZiAoKHRtcF9pbmZvLmZvZmZzPj4xMCkgPiBtYXhfZm9mZnMpIHsKKwkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X25vaXNlLCAiXG4iCisJCQkJCSAgICBLRVJOX0lORk8gImNzZWcuZm9mZjogJWRcbiIKKwkJCQkJICAgIEtFUk5fSU5GTyAiZGVzdCAgICAgOiAlZCIsCisJCQkJCSAgICAoaW50KSh0bXBfaW5mby5mb2ZmcyA+PiAxMCksCisJCQkJCSAgICBtYXhfZm9mZnMpOworCQkJfQorCQkJRFVNUF9DTVBSX0lORk8oZnRfdF9ub2lzZSwgIiIsICZ0bXBfaW5mbyk7CisJCQkqY19pbmZvICAgICAgICAgICA9IHRtcF9pbmZvOworCQkJcG9zLT5zZWdfcG9zICAgICAgPSBzZWdtZW50OworCQkJcG9zLT52b2x1bWVfcG9zICAgPSBjX2luZm8tPmZvZmZzOworCQkJcG9zLT5zZWdfYnl0ZV9wb3MgPSBjX2luZm8tPm9mZnNldDsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmb3VuZCBzZWdtZW50IGF0ICVkIiwgc2VnbWVudCk7CisJCQlUUkFDRV9FWElUIDA7CisJCX0KKwkJc2VnbWVudCsrOworCX0KKwlUUkFDRV9FWElUIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgc2xvd19zZWVrX2ZvcndhcmQodW5zaWduZWQgaW50IGRlc3QsCisJCQkgICAgIGNtcHJfaW5mbyAqY19pbmZvLAorCQkJICAgICB6ZnRfcG9zaXRpb24gKnBvcywKKwkJCSAgICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSwKKwkJCSAgICAgX191OCAqYnVmKQoreworCXVuc2lnbmVkIGludCBkaXN0YW5jZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkJCisJZGlzdGFuY2UgPSBkZXN0IC0gKHBvcy0+dm9sdW1lX3BvcyA+PiAxMCk7CisJd2hpbGUgKChkaXN0YW5jZSA+IDApICYmCisJICAgICAgIChyZXN1bHQgPSBzbG93X3NlZWtfZm9yd2FyZF91bnRpbF9lcnJvcihkaXN0YW5jZSwKKwkJCQkJCSAgICAgICBjX2luZm8sCisJCQkJCQkgICAgICAgcG9zLAorCQkJCQkJICAgICAgIHZvbHVtZSwKKwkJCQkJCSAgICAgICBidWYpKSA8IDApIHsKKwkJaWYgKHJlc3VsdCA9PSAtRUlOVFIpIHsKKwkJCWJyZWFrOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzZWdfcG9zOiAlZCIsIHBvcy0+c2VnX3Bvcyk7CisJCS8qIHRoZSBmYWlsaW5nIHNlZ21lbnQgaXMgZWl0aGVyIHBvcy0+c2VnX3BvcyBvcgorCQkgKiBwb3MtPnNlZ19wb3MgKyAxLiBUaGVyZSBpcyBubyBuZWVkIHRvIGZ1cnRoZXIgdHJ5CisJCSAqIHRoYXQgc2VnbWVudCwgYmVjYXVzZSBmdGFwZV9yZWFkX3NlZ21lbnQoKSBhbHJlYWR5CisJCSAqIGhhcyB0cmllZCB2ZXJ5IG11Y2ggdG8gcmVhZCBpdC4gU28gd2Ugc3RhcnQgd2l0aAorCQkgKiBmb2xsb3dpbmcgc2VnbWVudCwgd2hpY2ggaXMgcG9zLT5zZWdfcG9zICsgMQorCQkgKi8KKwkJaWYoc2VhcmNoX3ZhbGlkX3NlZ21lbnQocG9zLT5zZWdfcG9zKzEsIHZvbHVtZS0+ZW5kX3NlZywgZGVzdCwKKwkJCQkJcG9zLCBjX2luZm8sCisJCQkJCXZvbHVtZSwgYnVmKSA8IDApIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzZWFyY2hfdmFsaWRfc2VnbWVudCgpIGZhaWxlZCIpOworCQkJcmVzdWx0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWRpc3RhbmNlID0gZGVzdCAtIChwb3MtPnZvbHVtZV9wb3MgPj4gMTApOworCQlyZXN1bHQgPSAwOworCQlUUkFDRShmdF90X25vaXNlLCAic2VnbWVudDogJWQiLCBwb3MtPnNlZ19wb3MpOworCQkvKiBmb3VuZCB2YWxpZCBzZWdtZW50LCByZXRyeSB0aGUgc2VlayAqLworCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBjb21wdXRlX3NlZ19wb3MoY29uc3QgdW5zaWduZWQgaW50IGRlc3QsCisJCQkgICB6ZnRfcG9zaXRpb24gKnBvcywKKwkJCSAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7CisJaW50IHNlZ21lbnQ7CisJaW50IGRpc3RhbmNlID0gZGVzdCAtIChwb3MtPnZvbHVtZV9wb3MgPj4gMTApOworCXVuc2lnbmVkIGludCByYXdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgdmlydF9zaXplOworCXVuc2lnbmVkIGludCBmYWN0b3I7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZGlzdGFuY2UgPj0gMCkgeworCQlyYXdfc2l6ZSAgPSB2b2x1bWUtPmVuZF9zZWcgLSBwb3MtPnNlZ19wb3MgKyAxOworCQl2aXJ0X3NpemUgPSAoKHVuc2lnbmVkIGludCkodm9sdW1lLT5zaXplPj4xMCkgCisJCQkgICAgIC0gKHVuc2lnbmVkIGludCkocG9zLT52b2x1bWVfcG9zPj4xMCkKKwkJCSAgICAgKyBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gRlRfRUNDX1NFQ1RPUlMgLSAxKTsKKwkJdmlydF9zaXplIC89IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSBGVF9FQ0NfU0VDVE9SUzsKKwkJaWYgKHZpcnRfc2l6ZSA9PSAwIHx8IHJhd19zaXplID09IDApIHsKKwkJCVRSQUNFX0VYSVQgMDsKKwkJfQorCQlpZiAocmF3X3NpemUgPj0gKDE8PDI1KSkgeworCQkJZmFjdG9yID0gcmF3X3NpemUvKHZpcnRfc2l6ZT4+Nyk7CisJCX0gZWxzZSB7CisJCQlmYWN0b3IgPSAocmF3X3NpemU8PDcpL3ZpcnRfc2l6ZTsKKwkJfQorCQlzZWdtZW50ID0gZGlzdGFuY2UvKEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQtRlRfRUNDX1NFQ1RPUlMpOworCQlzZWdtZW50ID0gKHNlZ21lbnQgKiBmYWN0b3IpPj43OworCX0gZWxzZSB7CisJCXJhd19zaXplICA9IHBvcy0+c2VnX3BvcyAtIHZvbHVtZS0+c3RhcnRfc2VnICsgMTsKKwkJdmlydF9zaXplID0gKCh1bnNpZ25lZCBpbnQpKHBvcy0+dm9sdW1lX3Bvcz4+MTApCisJCQkgICAgICsgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIEZUX0VDQ19TRUNUT1JTIC0gMSk7CisJCXZpcnRfc2l6ZSAvPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gRlRfRUNDX1NFQ1RPUlM7CisJCWlmICh2aXJ0X3NpemUgPT0gMCB8fCByYXdfc2l6ZSA9PSAwKSB7CisJCQlUUkFDRV9FWElUIDA7CisJCX0KKwkJaWYgKHJhd19zaXplID49ICgxPDwyNSkpIHsKKwkJCWZhY3RvciA9IHJhd19zaXplLyh2aXJ0X3NpemU+PjcpOworCQl9IGVsc2UgeworCQkJZmFjdG9yID0gKHJhd19zaXplPDw3KS92aXJ0X3NpemU7CisJCX0KKwkJc2VnbWVudCA9IGRpc3RhbmNlLyhGVF9TRUNUT1JTX1BFUl9TRUdNRU5ULUZUX0VDQ19TRUNUT1JTKTsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgImZhY3RvcjogJWQvJWQiLCBmYWN0b3IsIDE8PDcpOworCVRSQUNFX0VYSVQgc2VnbWVudDsKK30KKworc3RhdGljIHN0cnVjdCB6ZnRfY21wcl9vcHMgY21wcl9vcHMgPSB7CisJemZ0Y193cml0ZSwKKwl6ZnRjX3JlYWQsCisJemZ0Y19zZWVrLAorCXpmdGNfbG9jaywKKwl6ZnRjX3Jlc2V0LAorCXpmdGNfY2xlYW51cAorfTsKKworaW50IHpmdF9jb21wcmVzc29yX2luaXQodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsoS0VSTl9JTkZPICJ6ZnRhcGUgY29tcHJlc3NvciB2MS4wMGEgOTcwNTE0IGZvciAiIEZUQVBFX1ZFUlNJT04gIlxuIik7CisgICAgICAgIGlmIChUUkFDRV9MRVZFTCA+PSBmdF90X2luZm8pIHsKKwkJcHJpbnRrKAorS0VSTl9JTkZPICIoYykgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSlcbiIKK0tFUk5fSU5GTyAiQ29tcHJlc3NvciBmb3IgemZ0YXBlIChsenJ3MyBhbGdvcml0aG0pXG4iKTsKKyAgICAgICAgfQorI2Vsc2UgLyogIU1PRFVMRSAqLworCS8qIHByaW50IGEgc2hvcnQgbm8tbm9uc2Vuc2UgYm9vdCBtZXNzYWdlICovCisJcHJpbnRrKCJ6ZnRhcGUgY29tcHJlc3NvciB2MS4wMGEgOTcwNTE0XG4iKTsKKwlwcmludGsoIkZvciB1c2Ugd2l0aCAiIEZUQVBFX1ZFUlNJT04gIlxuIik7CisjZW5kaWYgLyogTU9EVUxFICovCisJVFJBQ0UoZnRfdF9pbmZvLCAiemZ0X2NvbXByZXNzb3JfaW5pdCBAIDB4JXAiLCB6ZnRfY29tcHJlc3Nvcl9pbml0KTsKKwlUUkFDRShmdF90X2luZm8sICJpbnN0YWxsaW5nIGNvbXByZXNzb3IgZm9yIHpmdGFwZSAuLi4iKTsKKwlUUkFDRV9DQVRDSCh6ZnRfY21wcl9yZWdpc3RlcigmY21wcl9vcHMpLCk7CisJVFJBQ0VfRVhJVCAwOworfQorCisjaWZkZWYgTU9EVUxFCisKK01PRFVMRV9BVVRIT1IoCisJIihjKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZSAoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oCisiQ29tcHJlc3Npb24gcm91dGluZXMgZm9yIHpmdGFwZS4gVXNlcyB0aGUgbHpydzMgYWxnb3JpdGhtIGJ5IFJvc3MgV2lsbGlhbXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogQ2FsbGVkIGJ5IG1vZHVsZXMgcGFja2FnZSB3aGVuIGluc3RhbGxpbmcgdGhlIGRyaXZlcgorICovCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gemZ0X2NvbXByZXNzb3JfaW5pdCgpOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci96ZnRhcGUtY29tcHJlc3MuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDA3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvY29tcHJlc3Nvci96ZnRhcGUtY29tcHJlc3MuaApAQCAtMCwwICsxLDgzIEBACisjaWZuZGVmIF9aRlRBUEVfQ09NUFJFU1NfSAorI2RlZmluZSBfWkZUQVBFX0NPTVBSRVNTX0gKKy8qCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5NC0xOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvY29tcHJlc3Nvci96ZnRhcGUtY29tcHJlc3MuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4xICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjEyOjMyICQKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWFjcm9zIGFuZCBkZWZpbml0aW9ucyBmb3IgemZ0YXBlJ3MKKyAqIGJ1aWx0aW4gY29tcHJlc3Npb24gY29kZS4KKyAqCisgKi8KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorI2luY2x1ZGUgIi4uL2NvbXByZXNzb3IvbHpydzMuaCIKKworLyogQ01QUl9XUktfTUVNX1NJWkUgZ2l2ZXMgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIHdya19tZW0gKi8KKy8qIEkgZ290IHRoZXNlIG91dCBvZiBsenJ3My5jICovCisjZGVmaW5lIFUoWCkgICAgICAgICAgICAoKF9fdTMyKSBYKQorI2RlZmluZSBTSVpFX1BfQllURSAgICAgKFUoc2l6ZW9mKF9fdTggKikpKQorI2RlZmluZSBBTElHTk1FTlRfRlVER0UgKFUoMTYpKQorCisjZGVmaW5lIENNUFJfV1JLX01FTV9TSVpFIChVKDQwOTYpKihTSVpFX1BfQllURSkgKyBBTElHTk1FTlRfRlVER0UpCisKKy8qIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGUgc2l6ZSBvZiB0aGUgImNvbXByZXNzZWQiIGRhdGEgY2FuCisgKiBleGNlZWQgdGhlIHVuY29tcHJlc3NlZCBkYXRhLiBBcyBpdCBpcyBxdWl0ZSB1c2VsZXNzIHRvIGNvbXByZXNzCisgKiBkYXRhIHR3aWNlIGl0IGlzIHNvbWV0aW1lcyB0aGUgY2FzZSB0aGF0IGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvCisgKiBjb3B5IGEgYmxvY2sgb2YgZGF0YSBidXQgdG8gZmVlZCBpdCB0byB0aGUgImNvbXByZXNzaW9uIgorICogYWxnb3JpdGhtLiBJbiB0aGlzIGNhc2UgdGhlcmUgYXJlIHNvbWUgZmxhZyBieXRlcyBvciB0aGUgbGlrZQorICogcHJvY2VkaW5nIHRoZSAiY29tcHJlc3NlZCIgZGF0YS4gIFRIQVQgTVVTVCBOT1QgQkUgVEhFIENBU0UgZm9yIHRoZQorICogYWxnb3JpdGhtIHdlIHVzZSBmb3IgdGhpcyBkcml2ZXIuIEluc3RlYWQsIHRoZSBoaWdoIGJpdCAxNSBvZgorICogY29tcHJlc3NlZF9zaXplOgorICoKKyAqIGNvbXByZXNzZWRfc2l6ZSA9IGZ0YXBlX2NvbXByZXNzKCkKKyAqCisgKiBtdXN0IGJlIHNldCBpbiBzdWNoIGEgY2FzZS4KKyAqCisgKiBOZXZlcnRoZWxlc3MsIGl0IG1pZ2h0IGFsc28gYmUgYXMgZm9yIGx6cnczIHRoYXQgdGhlcmUgaXMgYW4KKyAqICJpbnRlcm1lZGlhdGUiIG92ZXJydW4gdGhhdCBleGNlZWRzIHRoZSBhbW91bnQgb2YgdGhlIGNvbXByZXNzZWQKKyAqIGRhdGEgdGhhdCBpcyBhY3R1YWxseSBwcm9kdWNlZC4gRHVyaW5nIHRoZSBhbGdvcml0aG0gd2UgbmVlZCBpbiB0aGUKKyAqIHdvcnN0IGNhc2UgTUFYX0NNUF9HUk9VUCBieXRlcyBtb3JlIHRoYW4gdGhlIGlucHV0LXNpemUuCisgKi8KKyNkZWZpbmUgTUFYX0NNUF9HUk9VUCAoMisxNioyKSAvKiBmcm9tIGx6cnczLmMgKi8KKworI2RlZmluZSBDTVBSX09WRVJSVU4gICAgICBNQVhfQ01QX0dST1VQIC8qIGR1cmluZyBjb21wcmVzc2lvbiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgICAgQ01QUl9CVUZGRVJfU0laRSAoTUFYX0JMT0NLX1NJWkUgKyBDTVBSX09WRVJSVU4pCisKKy8qIHRoZSBjb21wcmVzc2lvbiBtYXAgc3RvcmVzIHRoZSBieXRlIG9mZnNldCBjb21wcmVzc2VkIGJsb2NrcyB3aXRoaW4KKyAqIHRoZSBjdXJyZW50IHZvbHVtZSBmb3IgY2F0cmlkZ2VzIHdpdGggZm9ybWF0IGNvZGUgMiwzIGFuZCA1CisgKiAoYW5kIG9sZCB2ZXJzaW9ucyBvZiB6ZnRhcGUpIGFuZCB0aGUgb2Zmc2V0IG1lYXN1cmVkIGluIGtpbG9ieXRlcyBmb3IKKyAqIGZvcm1hdCBjb2RlIDQgYW5kIDYuIFRoaXMgZ2l2ZXMgdXMgYSBwb3NzaWJsZSBtYXguIHNpemUgb2YgYSAKKyAqIGNvbXByZXNzZWQgdm9sdW1lIG9mIDEwMjQqNEdJRyB3aGljaCBzaG91bGQgYmUgZW5vdWdoLgorICovCit0eXBlZGVmIF9fdTMyIENtcHJNYXA7CisKKy8qIGdsb2JhbHMgCisgKi8KKworLyogZXhwb3J0ZWQgZnVuY3Rpb25zCisgKi8KKworI2VuZGlmIC8qIF9aRlRBUEVfQ09NUFJFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYmFiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvTWFrZWZpbGUKQEAgLTAsMCArMSw0MyBAQAorIworIyAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdS1KdXN0dXMgSGVpbmUuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyMKKyMgJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL01ha2VmaWxlLHYgJAorIyAkUmV2aXNpb246IDEuNCAkCisjICREYXRlOiAxOTk3LzEwLzA3IDA5OjI2OjAyICQKKyMKKyMgICAgICBNYWtlZmlsZSBmb3IgdGhlIGxvd2xldmVsIHBhcnQgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZQorIyAgICAgIGRyaXZlciBmb3IgTGludXguCisjCisKK29iai0kKENPTkZJR19GVEFQRSkgKz0gZnRhcGUubworCitmdGFwZS1vYmpzIDo9IGZ0YXBlLWluaXQubyBmZGMtaW8ubyBmZGMtaXNyLm8gXAorCSAgICAgIGZ0YXBlLWJzbS5vIGZ0YXBlLWN0bC5vIGZ0YXBlLXJlYWQubyBmdGFwZS1ydy5vIFwKKwkgICAgICBmdGFwZS13cml0ZS5vIGZ0YXBlLWlvLm8gZnRhcGUtY2FsaWJyLm8gZnRhcGUtZWNjLm8gZmMtMTAubyBcCisJICAgICAgZnRhcGUtYnVmZmVyLm8gZnRhcGUtZm9ybWF0Lm8gZnRhcGVfc3ltcy5vCisKK2lmZXEgKCQoQ09ORklHX0ZUQVBFKSx5KQorZnRhcGUtb2JqcyArPSBmdGFwZS1zZXR1cC5vCitlbmRpZgorCitpZm5kZWYgQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTAorZnRhcGUtb2JqcyArPSBmdGFwZS10cmFjaW5nLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0ZUX1BST0NfRlMpLHkpCitmdGFwZS1vYmpzICs9IGZ0YXBlLXByb2MubworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mYy0xMC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZjLTEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjMWNkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mYy0xMC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICoKKworICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTQgSm9uIFRvbWJzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBUaGUgZW50aXJlIGd1dHMgb2YgdGhpcyBwcm9ncmFtIHdhcyB3cml0dGVuIGJ5IGRvc2VtdSwgbW9kaWZpZWQgdG8KKyAgIHJlY29yZCByZWFkcyBhbmQgd3JpdGVzIHRvIHRoZSBwb3J0cyBpbiB0aGUgMHgxODAtMHgxODggYWRkcmVzcyBzcGFjZSwKKyAgIHdoaWxlIHJ1bm5pbmcgdGhlIENNUyBwcm9ncmFtIFRBUEUuRVhFIFYyLjAuNSBzdXBwbGllZCB3aXRoIHRoZSBkcml2ZS4KKworICAgTW9kaWZpZWQgdG8gdXNlIGFuIGFycmF5IG9mIGFkZHJlc3NlcyBhbmQgZ2VuZXJhbGx5IGNsZWFuZWQgdXAgKG1hZGUKKyAgIG11Y2ggc2hvcnRlcikgNCBKdW5lIDk0LCBkb3NlbXUgaXNuJ3QgdGhhdCBnb29kIGF0IHdyaXRpbmcgc2hvcnQgY29kZSBpdAorICAgd291bGQgc2VlbSA6LSkuIE1hZGUgaW5kZXBlbmRlbnQgb2YgMHgxODAsIGJ1dCBJIGRvdWJ0IGl0IHdpbGwgd29yaworICAgYXQgYW55IG90aGVyIGFkZHJlc3MuCisKKyAgIE1vZGlmaWVkIGZvciBkaXN0cmlidXRpb24gd2l0aCBmdGFwZSBzb3VyY2UuIDIxIEp1bmUgOTQsIFNKTC4KKworICAgTW9kaWZpY2F0aW9ucyBvbiAyMCBPY3RvYmVyIDk1LCBieSBEYW5pZWwgQ29oZW4gKGNhdG1hbkB3cGkuZWR1KToKKyAgIE1vZGlmaWVkIHRvIHN1cHBvcnQgZGlmZmVyZW50IERNQSwgSVJRLCBhbmQgSU8gUG9ydHMuICBCb3JsYW5kJ3MKKyAgIFR1cmJvIERlYnVnZ2VyIGluIHZpcnR1YWwgODA4NiBtb2RlIChURDM4Ni5FWEUgd2l0aCBoYXJkd2FyZSBicmVha3BvaW50cworICAgcHJvdmlkZWQgYnkgdGhlIFRESDM4Ni5TWVMgRGV2aWNlIERyaXZlcikgd2FzIHVzZWQgb24gdGhlIENNUyBwcm9ncmFtCisgICBUQVBFIFY0LjAuNS4gIEkgc2V0IGJyZWFrcG9pbnRzIG9uIEkvTyB0byBwb3J0cyAweDE4MC0weDE4Ny4gIE5vdGUgdGhhdAorICAgQ01TJ3MgcHJvZ3JhbSB3aWxsIG5vdCBzdWNjZXNzZnVsbHkgY29uZmlndXJlIHRoZSB0YXBlIGRyaXZlIGlmIHlvdSBzZXQKKyAgIGJyZWFrcG9pbnRzIG9uIElPIFJlYWRzLCBidXQgeW91IGNhbiBzZXQgdGhlbSBvbiBJTyBXcml0ZXMgd2l0aG91dCBwcm9ibGVtcy4KKyAgIEtub3duIHByb2JsZW1zOgorICAgLSBZb3UgY2FuIG5vdCB1c2UgRE1BIENoYW5uZWxzIDUgb3IgNy4KKworICAgTW9kaWZpY2F0aW9uIG9uIDI5IEphbnVhcnkgOTYsIGJ5IERhbmllbCBDb2hlbiAoY2F0bWFuQHdwaS5lZHUpOgorICAgTW9kaWZpZWQgdG8gb25seSBhY2NlcHQgSVJRcyAzIC0gNywgb3IgOS4gIFNpbmNlIHdlIGNhbiBvbmx5IHNlbmQgYSAzIGJpdAorICAgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgSVJRIHRvIHRoZSBjYXJkLCBzcGVjaWFsIGhhbmRsaW5nIGlzIHJlcXVpcmVkIHdoZW4KKyAgIElSUSA5IGlzIHNlbGVjdGVkLiAgSVJRIDIgYW5kIDkgYXJlIHRoZSBzYW1lLCBhbmQgd2Ugc2hvdWxkIHJlcXVlc3QgSVJRIDkKKyAgIGZyb20gdGhlIGtlcm5lbCB3aGlsZSB0ZWxsaW5nIHRoZSBjYXJkIHRvIHVzZSBJUlEgMi4gIFRoYW5rcyB0byBHcmVnCisgICBDcmlkZXIgKGdjcmlkZXJAaWNsbmV0Lm9yZykgZm9yIGZpbmRpbmcgYW5kIGxvY2F0aW5nIHRoaXMgYnVnLCBhcyB3ZWxsIGFzCisgICB0ZXN0aW5nIHRoZSBwYXRjaC4KKworICAgTW9kaWZpY2F0aW9uIG9uIDExIERlY2VtYmVyIDk2LCBieSBDbGF1cyBIZWluZSAoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlKToKKyAgIE1vZGlmaWVkIGEgbGl0dGxlIHRvIHVzZSB2YXJpYWhsZSBmdF9mZGNfYmFzZSwgZnRfZmRjX2lycSwgZnRfZmRjX2RtYSAKKyAgIGluc3RlYWQgb2YgcHJlcHJvY2Vzc29yIHN5bWJvbHMuIFRodXMgd2UgY2FuIGNvbXBpbGUgdGhpcyBpbnRvIHRoZSBtb2R1bGUKKyAgIG9yIGtlcm5lbCBhbmQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIG9wdGlvbnMgYXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mYy0xMC5jLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDQgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIHRoZSBDTVMgRkMtMTAvRkMtMjAgY2FyZC4KKyAqLworCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmMtMTAuaCIKKworc3RhdGljIF9fdTE2IGluYnNfbWFnaWNbXSA9IHsKKwkweDMsIDB4MywgMHgwLCAweDQsIDB4NywgMHgyLCAweDUsIDB4MywgMHgxLCAweDQsCisJMHgzLCAweDUsIDB4MiwgMHgwLCAweDMsIDB4NywgMHg0LCAweDIsCisJMHgwLCAweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2LCAweDcKK307CisKK3N0YXRpYyBfX3UxNiBmYzEwX3BvcnRzW10gPSB7CisJMHgxODAsIDB4MjEwLCAweDJBMCwgMHgzMDAsIDB4MzMwLCAweDM0MCwgMHgzNzAKK307CisKK2ludCBmYzEwX2VuYWJsZSh2b2lkKQoreworCWludCBpOworCV9fdTggY2FyZENvbmZpZyA9IDB4MDA7CisJX191OCB4OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisvKiAgVGhpcyBjb2RlIHdpbGwgb25seSB3b3JrIGlmIHRoZSBGQy0xMCAob3IgRkMtMjApIGlzIHNldCB0bworICogIHVzZSBETUEgY2hhbm5lbHMgMSwgMiwgb3IgMy4gIERNQSBjaGFubmVscyA1IGFuZCA3IHNlZW0gdG8gYmUgCisgKiAgaW5pdGlhbGl6ZWQgYnkgdGhlIHNhbWUgY29tbWFuZCBhcyBjaGFubmVscyAxIGFuZCAzLCByZXNwZWN0aXZlbHkuCisgKi8KKwlpZiAoZnRfZmRjX2RtYSA+IDMpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9lcnIsCisiRXJyb3I6IFRoZSBGQy0xMC8yMCBtdXN0IGJlIHNldCB0byB1c2UgRE1BIGNoYW5uZWxzIDEsIDIsIG9yIDMhIik7CisJfQorLyogIE9ubHkgYWxsb3cgdGhlIEZDLTEwLzIwIHRvIHVzZSBJUlEgMy03LCBvciA5LiAgTm90ZSB0aGF0IENNUydzIHByb2dyYW0KKyAqICBvbmx5IGFjY2VwdHMgSVJRJ3MgMi03LCBidXQgaW4gbGludXgsIElSUSAyIGlzIHRoZSBzYW1lIGFzIElSUSA5LgorICovCisJaWYgKGZ0X2ZkY19pcnEgPCAzIHx8IGZ0X2ZkY19pcnEgPT0gOCB8fCBmdF9mZGNfaXJxID4gOSkgeworCQlUUkFDRV9BQk9SVCgwLCBmdF90X2VyciwgCisiRXJyb3I6IFRoZSBGQy0xMC8yMCBtdXN0IGJlIHNldCB0byB1c2UgSVJRIGxldmVscyAzIC0gNywgb3IgOSFcbiIKK0tFUk5fSU5GTyAiTm90ZTogSVJRIDkgaXMgdGhlIHNhbWUgYXMgSVJRIDIiKTsKKwl9CisJLyogIENsZWFyIHN0YXRlIG1hY2hpbmUgPz8/CisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX0lURU1TKGluYnNfbWFnaWMpOyBpKyspIHsKKwkJaW5iKGZ0X2ZkY19iYXNlICsgaW5ic19tYWdpY1tpXSk7CisJfQorCW91dGIoMHgwLCBmdF9mZGNfYmFzZSk7CisKKwl4ID0gaW5iKGZ0X2ZkY19iYXNlKTsKKwlpZiAoeCA9PSAweDEzIHx8IHggPT0gMHg5MykgeworCQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoaW5iKGZ0X2ZkY19iYXNlICsgaSkgIT0geCkgeworCQkJCVRSQUNFX0VYSVQgMDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisKKwlvdXRiKDB4OCwgZnRfZmRjX2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoaW5iKGZ0X2ZkY19iYXNlICsgaSkgIT0gMHgwKSB7CisJCQlUUkFDRV9FWElUIDA7CisJCX0KKwl9CisJb3V0YigweDEwLCBmdF9mZGNfYmFzZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChpbmIoZnRfZmRjX2Jhc2UgKyBpKSAhPSAweGZmKSB7CisJCQlUUkFDRV9FWElUIDA7CisJCX0KKwl9CisKKwkvKiAgT2theSwgd2UgZm91bmQgYSBGQy0xMCBjYXJkICEgPz8/CisJICovCisJb3V0YigweDAsIGZkYy5jY3IpOworCisJLyogIENsZWFyIHN0YXRlIG1hY2hpbmUgYWdhaW4gPz8/CisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX0lURU1TKGluYnNfbWFnaWMpOyBpKyspIHsKKwkJaW5iKGZ0X2ZkY19iYXNlICsgaW5ic19tYWdpY1tpXSk7CisJfQorCS8qIFNlbmQgaW8gcG9ydCAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9JVEVNUyhmYzEwX3BvcnRzKTsgaSsrKQorCQlpZiAoZnRfZmRjX2Jhc2UgPT0gZmMxMF9wb3J0c1tpXSkKKwkJCWNhcmRDb25maWcgPSBpICsgMTsKKwlpZiAoY2FyZENvbmZpZyA9PSAwKSB7CisJCVRSQUNFX0VYSVQgMDsJLyogSW52YWxpZCBJL08gUG9ydCAqLworCX0KKwkvKiBhbmQgSVJRIC0gSWYgdXNpbmcgSVJRIDksIHRlbGwgdGhlIEZDIGNhcmQgaXQgaXMgYWN0dWFsbHkgSVJRIDIgKi8KKwlpZiAoZnRfZmRjX2lycSAhPSA5KQorCQljYXJkQ29uZmlnIHw9IGZ0X2ZkY19pcnEgPDwgMzsKKwllbHNlCisJCWNhcmRDb25maWcgfD0gMiA8PCAzOworCisJLyogYW5kIGZpbmFsbHkgRE1BIENoYW5uZWwgKi8KKwljYXJkQ29uZmlnIHw9IGZ0X2ZkY19kbWEgPDwgNjsKKwlvdXRiKGNhcmRDb25maWcsIGZ0X2ZkY19iYXNlKTsJLyogRE1BIFsyIGJpdHNdL0lSUSBbMyBiaXRzXS9CQVNFIFszIGJpdHNdICovCisKKwkvKiAgRW5hYmxlIEZDLTEwID8/PworCSAqLworCW91dGIoMCwgZmRjLmNjcik7CisJb3V0YigwLCBmZGMuZG9yMik7CisJb3V0YihGRENfRE1BX01PREUgLyogOCAqLywgZmRjLmRvcik7CisJb3V0YihGRENfRE1BX01PREUgLyogOCAqLywgZmRjLmRvcik7CisJb3V0YigxLCBmZGMuZG9yMik7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCisJICogY0g6IHdoeSB0aGUgaGVsbCBzaG91bGQgdGhpcyBiZSBuZWNlc3Nhcnk/IFRoaXMgaXMgZG9uZSAKKwkgKiAgICAgYnkgZmRjX3Jlc2V0KCkhISEKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qICBJbml0aWFsaXplIGZkYywgc2VsZWN0IGRyaXZlIEI6CisJICovCisJb3V0YihGRENfRE1BX01PREUsIGZkYy5kb3IpOwkvKiBhc3NlcnQgcmVzZXQsIGRtYSAmIGlycSBlbmFibGVkICovCisJLyogICAgICAgMHgwOCAgICAqLworCW91dGIoRkRDX0RNQV9NT0RFfEZEQ19SRVNFVF9OT1QsIGZkYy5kb3IpOwkvKiByZWxlYXNlIHJlc2V0ICovCisJLyogICAgICAgMHgwOCAgICB8ICAgMHgwNCAgID0gMHgwYyAqLworCW91dGIoRkRDX0RNQV9NT0RFfEZEQ19SRVNFVF9OT1R8RkRDX01PVE9SXzF8RlRBUEVfU0VMX0IsIGZkYy5kb3IpOworCS8qICAgICAgIDB4MDggICAgfCAgIDB4MDQgICAgICB8ICAweDIwICAgICB8ICAweDAxICA9IDB4MmQgKi8gICAgCisJLyogc2VsZWN0IGRyaXZlIDEgKi8gLyogd2h5IG5vdCBkcml2ZSAwID8/Pz8gKi8KKwlUUkFDRV9FWElUICh4ID09IDB4OTMpID8gMiA6IDE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mYy0xMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhN2I4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmMtMTAuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9GQ18xMF9ICisjZGVmaW5lIF9GQ18xMF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiBCYXMgTGFhcmhvdmVuLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mYy0xMC5oLHYgJAorICogJFJldmlzaW9uOiAxLjEgJAorICogJERhdGU6IDE5OTcvMDkvMTkgMDk6MDU6MjIgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgRkMtMTAgY29kZQorICogICAgICBvZiB0aGUgUUlDLTQwLzgwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworLyoKKyAqICAgICAgZmMtMTAuYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgorICovCisKKy8qCisgKiAgICAgIGZjLTEwLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCitleHRlcm4gaW50IGZjMTBfZW5hYmxlKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA0YTJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pby5jCkBAIC0wLDAgKzEsMTM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2ZkYy1pby5jLHYgJAorICogJFJldmlzaW9uOiAxLjcuNC4yICQKKyAqICREYXRlOiAxOTk3LzExLzE2IDE0OjQ4OjE3ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbG93LWxldmVsIGZsb3BweSBkaXNrIGludGVyZmFjZSBjb2RlCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IKKyAqICAgICAgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAvKiBmb3IgQ09ORklHX0ZUXyogKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaXNyLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZjLTEwLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KK3N0YXRpYyBpbnQgZnRhcGVfbW90b3I7Cit2b2xhdGlsZSBpbnQgZnRhcGVfY3VycmVudF9jeWxpbmRlciA9IC0xOwordm9sYXRpbGUgZmRjX21vZGVfZW51bSBmZGNfbW9kZSA9IGZkY19pZGxlOworZmRjX2NvbmZpZ19pbmZvIGZkYzsKK0RFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGZ0YXBlX3dhaXRfaW50cik7CisKK3Vuc2lnbmVkIGludCBmdF9mZGNfYmFzZSAgICAgICA9IENPTkZJR19GVF9GRENfQkFTRTsKK3Vuc2lnbmVkIGludCBmdF9mZGNfaXJxICAgICAgICA9IENPTkZJR19GVF9GRENfSVJROwordW5zaWduZWQgaW50IGZ0X2ZkY19kbWEgICAgICAgID0gQ09ORklHX0ZUX0ZEQ19ETUE7Cit1bnNpZ25lZCBpbnQgZnRfZmRjX3RocmVzaG9sZCAgPSBDT05GSUdfRlRfRkRDX1RIUjsgIC8qIGJ5dGVzICovCit1bnNpZ25lZCBpbnQgZnRfZmRjX3JhdGVfbGltaXQgPSBDT05GSUdfRlRfRkRDX01BWF9SQVRFOyAvKiBiaXRzL3NlYyAqLworaW50IGZ0X3Byb2JlX2ZjMTAgICAgICAgID0gQ09ORklHX0ZUX1BST0JFX0ZDMTA7CitpbnQgZnRfbWFjaDIgICAgICAgICAgICAgPSBDT05GSUdfRlRfTUFDSDI7CisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIHNwaW5sb2NrX3QgZmRjX2lvX2xvY2s7IAorc3RhdGljIHVuc2lnbmVkIGludCBmZGNfY2FsaWJyX2NvdW50Oworc3RhdGljIHVuc2lnbmVkIGludCBmZGNfY2FsaWJyX3RpbWU7CitzdGF0aWMgaW50IGZkY19zdGF0dXM7Cit2b2xhdGlsZSBfX3U4IGZkY19oZWFkOwkJLyogRkRDIGhlYWQgZnJvbSBzZWN0b3IgaWQgKi8KK3ZvbGF0aWxlIF9fdTggZmRjX2N5bDsJCS8qIEZEQyB0cmFjayBmcm9tIHNlY3RvciBpZCAqLwordm9sYXRpbGUgX191OCBmZGNfc2VjdDsJCS8qIEZEQyBzZWN0b3IgZnJvbSBzZWN0b3IgaWQgKi8KK3N0YXRpYyBpbnQgZmRjX2RhdGFfcmF0ZSA9IDUwMDsJLyogZGF0YSByYXRlIChLYnBzKSAqLworc3RhdGljIGludCBmZGNfcmF0ZV9jb2RlOwkvKiBkYXRhIHJhdGUgY29kZSAoMCA9PSA1MDAgS2JwcykgKi8KK3N0YXRpYyBpbnQgZmRjX3NlZWtfcmF0ZSA9IDI7CS8qIHN0ZXAgcmF0ZSAobXNlYykgKi8KK3N0YXRpYyB2b2lkICgqZG9fZnRhcGUpICh2b2lkKTsKK3N0YXRpYyBpbnQgZmRjX2ZpZm9fc3RhdGU7CS8qIG9yaWdpbmFsIGZpZm8gc2V0dGluZyAtIGZpZm8gZW5hYmxlZCAqLworc3RhdGljIGludCBmZGNfZmlmb190aHI7CS8qIG9yaWdpbmFsIGZpZm8gc2V0dGluZyAtIHRocmVzaG9sZCAqLworc3RhdGljIGludCBmZGNfbG9ja19zdGF0ZTsJLyogb3JpZ2luYWwgbG9jayBzZXR0aW5nIC0gbG9ja2VkICovCitzdGF0aWMgaW50IGZkY19maWZvX2xvY2tlZDsJLyogaGFzIGZpZm8gJiYgbG9jayBzZXQgPyAqLworc3RhdGljIF9fdTggZmRjX3ByZWNvbXA7CS8qIGRlZmF1bHQgcHJlY29tcC4gdmFsdWUgKG5zZWMpICovCitzdGF0aWMgX191OCBmZGNfcHJlY19jb2RlOwkvKiBmZGMgcHJlY29tcC4gc2VsZWN0IGNvZGUgKi8KKworc3RhdGljIGNoYXIgZnRhcGVfaWRbXSA9ICJmdGFwZSI7ICAvKiB1c2VkIGJ5IHJlcXVlc3QgaXJxIGFuZCBmcmVlIGlycSAqLworCitzdGF0aWMgaW50IGZkY19zZXRfc2Vla19yYXRlKGludCBzZWVrX3JhdGUpOworCit2b2lkIGZkY19jYXRjaF9zdHJheV9pbnRlcnJ1cHRzKGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJaWYgKGNvdW50ID09IDApIHsKKwkJZnRfZXhwZWN0ZWRfc3RyYXlfaW50ZXJydXB0cyA9IDA7CisJfSBlbHNlIHsKKwkJZnRfZXhwZWN0ZWRfc3RyYXlfaW50ZXJydXB0cyArPSBjb3VudDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKK30KKworLyogIFdhaXQgZHVyaW5nIGEgdGltZW91dCBwZXJpb2QgZm9yIGEgZ2l2ZW4gRkRDIHN0YXR1cy4KKyAqICBJZiB1c2VjcyA9PSAwIHRoZW4ganVzdCB0ZXN0IHN0YXR1cywgZWxzZSB3YWl0IGF0IGxlYXN0IGZvciB1c2Vjcy4KKyAqICBSZXR1cm5zIC1FVElNRSBvbiB0aW1lb3V0LiBGdW5jdGlvbiBtdXN0IGJlIGNhbGlicmF0ZWQgZmlyc3QgIQorICovCitzdGF0aWMgaW50IGZkY193YWl0KHVuc2lnbmVkIGludCB1c2VjcywgX191OCBtYXNrLCBfX3U4IHN0YXRlKQoreworCWludCBjb3VudF8xID0gKGZkY19jYWxpYnJfY291bnQgKiB1c2VjcyArCisgICAgICAgICAgICAgICAgICAgICAgIGZkY19jYWxpYnJfY291bnQgLSAxKSAvIGZkY19jYWxpYnJfdGltZTsKKworCWRvIHsKKwkJZmRjX3N0YXR1cyA9IGluYl9wKGZkYy5tc3IpOworCQlpZiAoKGZkY19zdGF0dXMgJiBtYXNrKSA9PSBzdGF0ZSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9IHdoaWxlIChjb3VudF8xLS0gPj0gMCk7CisJcmV0dXJuIC1FVElNRTsKK30KKworaW50IGZkY19yZWFkeV93YWl0KHVuc2lnbmVkIGludCB1c2VjcykKK3sKKwlyZXR1cm4gZmRjX3dhaXQodXNlY3MsIEZEQ19EQVRBX1JFQURZIHwgRkRDX0JVU1ksIEZEQ19EQVRBX1JFQURZKTsKK30KKworLyogV2h5IGNhbid0IHdlIGp1c3QgdXNlIHVkZWxheSgpPworICovCitzdGF0aWMgdm9pZCBmZGNfdXNlY193YWl0KHVuc2lnbmVkIGludCB1c2VjcykKK3sKKwlmZGNfd2FpdCh1c2VjcywgMCwgMSk7CS8qIHdpbGwgYWx3YXlzIHRpbWVvdXQgISAqLworfQorCitzdGF0aWMgaW50IGZkY19yZWFkeV9vdXRfd2FpdCh1bnNpZ25lZCBpbnQgdXNlY3MpCit7CisJZmRjX3VzZWNfd2FpdChGVF9SUU1fREVMQVkpOwkvKiB3YWl0IGZvciB2YWxpZCBSUU0gc3RhdHVzICovCisJcmV0dXJuIGZkY193YWl0KHVzZWNzLCBGRENfREFUQV9PVVRfUkVBRFksIEZEQ19EQVRBX09VVF9SRUFEWSk7Cit9CisKK3ZvaWQgZmRjX3dhaXRfY2FsaWJyYXRlKHZvaWQpCit7CisJZnRhcGVfY2FsaWJyYXRlKCJmZGNfd2FpdCIsCisJCQlmZGNfdXNlY193YWl0LCAmZmRjX2NhbGlicl9jb3VudCwgJmZkY19jYWxpYnJfdGltZSk7IAorfQorCisvKiAgV2FpdCBmb3IgYSAoc2hvcnQpIHdoaWxlIGZvciB0aGUgRkRDIHRvIGJlY29tZSByZWFkeQorICogIGFuZCB0cmFuc2ZlciB0aGUgbmV4dCBjb21tYW5kIGJ5dGUuCisgKiAgUmV0dXJuIC1FVElNRSBvbiB0aW1lb3V0IG9uIGdldHRpbmcgcmVhZHkgKGRlcGVuZHMgb24gaGFyZHdhcmUhKS4KKyAqLworc3RhdGljIGludCBmZGNfd3JpdGUoY29uc3QgX191OCBkYXRhKQoreworCWZkY191c2VjX3dhaXQoRlRfUlFNX0RFTEFZKTsJLyogd2FpdCBmb3IgdmFsaWQgUlFNIHN0YXR1cyAqLworCWlmIChmZGNfd2FpdCgxNTAsIEZEQ19EQVRBX1JFQURZX01BU0ssIEZEQ19EQVRBX0lOX1JFQURZKSA8IDApIHsKKwkJcmV0dXJuIC1FVElNRTsKKwl9IGVsc2UgeworCQlvdXRiKGRhdGEsIGZkYy5maWZvKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiAgV2FpdCBmb3IgYSAoc2hvcnQpIHdoaWxlIGZvciB0aGUgRkRDIHRvIGJlY29tZSByZWFkeQorICogIGFuZCB0cmFuc2ZlciB0aGUgbmV4dCByZXN1bHQgYnl0ZS4KKyAqICBSZXR1cm4gLUVUSU1FIGlmIHRpbWVvdXQgb24gZ2V0dGluZyByZWFkeSAoZGVwZW5kcyBvbiBoYXJkd2FyZSEpLgorICovCitzdGF0aWMgaW50IGZkY19yZWFkKF9fdTggKiBkYXRhKQoreworCWZkY191c2VjX3dhaXQoRlRfUlFNX0RFTEFZKTsJLyogd2FpdCBmb3IgdmFsaWQgUlFNIHN0YXR1cyAqLworCWlmIChmZGNfd2FpdCgxNTAsIEZEQ19EQVRBX1JFQURZX01BU0ssIEZEQ19EQVRBX09VVF9SRUFEWSkgPCAwKSB7CisJCXJldHVybiAtRVRJTUU7CisJfSBlbHNlIHsKKwkJKmRhdGEgPSBpbmIoZmRjLmZpZm8pOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qICBPdXRwdXQgYSBjbWRfbGVuIGxvbmcgY29tbWFuZCBzdHJpbmcgdG8gdGhlIEZEQy4KKyAqICBUaGUgRkRDIHNob3VsZCBiZSByZWFkeSB0byByZWNlaXZlIGEgbmV3IGNvbW1hbmQgb3IKKyAqICBhbiBlcnJvciAoRUJVU1kgb3IgRVRJTUUpIHdpbGwgb2NjdXIuCisgKi8KK2ludCBmZGNfY29tbWFuZChjb25zdCBfX3U4ICogY21kX2RhdGEsIGludCBjbWRfbGVuKQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50ID0gY21kX2xlbjsKKwlpbnQgcmV0cnkgPSAwOworI2lmZGVmIFRFU1RJTkcKKwlzdGF0aWMgdW5zaWduZWQgaW50IGxhc3RfdGltZTsKKwl1bnNpZ25lZCBpbnQgdGltZTsKKyNlbmRpZgorCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlmZGNfdXNlY193YWl0KEZUX1JRTV9ERUxBWSk7CS8qIHdhaXQgZm9yIHZhbGlkIFJRTSBzdGF0dXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWluX2ludGVycnVwdCgpKQorCQkvKiBZZXMsIEkga25vdywgdG9vIG11Y2ggY29tbWVudHMgaW5zaWRlIHRoaXMgZnVuY3Rpb24KKwkJICogLi4uCisJCSAqIAorCQkgKiBZZXQgYW5vdGhlciBidWcgaW4gdGhlIG9yaWdpbmFsIGRyaXZlci4gQWxsIHRoYXQKKwkJICogaGF2b2MgaXMgY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIGlzcigpIHNlbmRzCisJCSAqIGl0c2VsZiBhIGNvbW1hbmQgdG8gdGhlIGZsb3BweSB0YXBlIGRyaXZlciAocGF1c2UsCisJCSAqIG1pY3JvIHN0ZXAgcGF1c2UpLiAgTm93LCB0aGUgcHJvYmxlbSBpcyB0aGF0CisJCSAqIGNvbW1hbmRzIGFyZSB0cmFuc21pdHRlZCB2aWEgdGhlIGZkY19zZWVrCisJCSAqIGNvbW1hbmQuIEJ1dDogdGhlIGZkYyBwZXJmb3JtcyBzZWVrcyBpbiB0aGUKKwkJICogYmFja2dyb3VuZCBpLmUuIGl0IGRvZXNuJ3Qgc2lnbmFsIGJ1c3kgd2hpbGUKKwkJICogc2VuZGluZyB0aGUgc3RlcCBwdWxzZXMgdG8gdGhlIGRyaXZlLiBUaGVyZWZvcmUgdGhlCisJCSAqIG5vbi1pbnRlcnJ1cHQgbGV2ZWwgZHJpdmVyIGhhcyBubyBjaGFuY2UgdG8gdGVsbAorCQkgKiB3aGV0aGVyIHRoZSBpc3IoKSBqdXN0IGhhcyBpc3N1ZWQgYSBzZWVrLiBUaGVyZWZvcmUKKwkJICogd2UgSEFWRSBUTyBoYXZlIGEgbG9vayBhdCB0aGUgZnRfaGlkZV9pbnRlcnJ1cHQKKwkJICogZmxhZzogaXQgc2lnbmFscyB0aGUgbm9uLWludGVycnVwdCBsZXZlbCBwYXJ0IG9mCisJCSAqIHRoZSBkcml2ZXIgdGhhdCBpdCBoYXMgdG8gd2FpdCBmb3IgdGhlIGZkYyB1bnRpbCBpdAorCQkgKiBoYXMgY29tcGxldGV0IHNlZWtpbmcuCisJCSAqCisJCSAqIFRISVMgV0FTIFBSRVNVTUFCTFkgVEhFIFJFQVNPTiBGT1IgQUxMIFRIQVQKKwkJICogImZkY19yZWFkIHRpbWVvdXQiIGVycm9ycywgSSBIT1BFIDotKQorCQkgKi8KKwkJaWYgKGZ0X2hpZGVfaW50ZXJydXB0KSB7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCVRSQUNFKGZ0X3RfaW5mbywKKwkJCSAgICAgICJXYWl0aW5nIGZvciB0aGUgaXNyKCkgY29tcGxldGluZyBmZGNfc2VlaygpIik7CisJCQlpZiAoZmRjX2ludGVycnVwdF93YWl0KDIgKiBGVF9TRUNPTkQpIDwgMCkgeworCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJICAgICAgIldhcm5pbmc6IHRpbWVvdXQgd2FpdGluZyBmb3IgaXNyKCkgc2VlayB0byBjb21wbGV0ZSIpOworCQkJfQorCQkJaWYgKGZ0X2hpZGVfaW50ZXJydXB0IHx8ICFmdF9zZWVrX2NvbXBsZXRlZCkgeworCQkJCS8qIFRoZXJlIGNhbm5vdCBiZSBhbm90aGVyCisJCQkJICogaW50ZXJydXB0LiBUaGUgaXNyKCkgb25seSBzdG9wcworCQkJCSAqIHRoZSB0YXBlIGFuZCB0aGUgbmV4dCBpbnRlcnJ1cHQKKwkJCQkgKiB3b24ndCBjb21lIHVudGlsIHdlIGhhdmUgc2VuZCBvdXIKKwkJCQkgKiBjb21tYW5kIHRvIHRoZSBkcml2ZS4KKwkJCQkgKi8KKwkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywKKwkJCQkJICAgICJCVUc/IGlzcigpIGlzIHN0aWxsIHNlZWtpbmc/XG4iCisJCQkJCSAgICBLRVJOX0lORk8gImhpZGU6ICVkXG4iCisJCQkJCSAgICBLRVJOX0lORk8gInNlZWs6ICVkIiwKKwkJCQkJICAgIGZ0X2hpZGVfaW50ZXJydXB0LAorCQkJCQkgICAgZnRfc2Vla19jb21wbGV0ZWQpOworCisJCQl9CisJCQlmZGNfdXNlY193YWl0KEZUX1JRTV9ERUxBWSk7CS8qIHdhaXQgZm9yIHZhbGlkIFJRTSBzdGF0dXMgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCQl9CisJZmRjX3N0YXR1cyA9IGluYihmZGMubXNyKTsKKwlpZiAoKGZkY19zdGF0dXMgJiBGRENfREFUQV9SRUFEWV9NQVNLKSAhPSBGRENfREFUQV9JTl9SRUFEWSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCQlUUkFDRV9BQk9SVCgtRUJVU1ksIGZ0X3RfZXJyLCAiZmRjIG5vdCByZWFkeSIpOworCX0gCisJZmRjX21vZGUgPSAqY21kX2RhdGE7CS8qIHVzZWQgYnkgaXNyICovCisjaWZkZWYgVEVTVElORworCWlmIChmZGNfbW9kZSA9PSBGRENfU0VFSykgeworCQl0aW1lID0gZnRhcGVfdGltZWRpZmYobGFzdF90aW1lLCBmdGFwZV90aW1lc3RhbXAoKSk7CisJCWlmICh0aW1lIDwgNjAwMCkgeworCVRSQUNFKGZ0X3RfYnVnLCJXYXJuaW5nOiBzaG9ydCB0aW1lb3V0IGJldHdlZW4gc2VlayBjb21tYW5kczogJWQiLAorCSAgICAgIHRpbWUpOworCQl9CisJfQorI2VuZGlmCisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgeworCQkvKiBzaG91bGRuJ3QgYmUgY2xlYXJlZCBpZiBjYWxsZWQgZnJvbSBpc3IKKwkJICovCisJCWZ0X2ludGVycnVwdF9zZWVuID0gMDsKKwl9CisJd2hpbGUgKGNvdW50KSB7CisJCXJlc3VsdCA9IGZkY193cml0ZSgqY21kX2RhdGEpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJVFJBQ0UoZnRfdF9mZGNfZG1hLAorCQkJICAgICAgImZkY19tb2RlID0gJTAyeCwgc3RhdHVzID0gJTAyeCBhdCBpbmRleCAlZCIsCisJCQkgICAgICAoaW50KSBmZGNfbW9kZSwgKGludCkgZmRjX3N0YXR1cywKKwkJCSAgICAgIGNtZF9sZW4gLSBjb3VudCk7CisJCQlpZiAoKytyZXRyeSA8PSAzKSB7CisJCQkJVFJBQ0UoZnRfdF93YXJuLCAiZmRjX3dyaXRlIHRpbWVvdXQsIHJldHJ5Iik7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZmRjX3dyaXRlIHRpbWVvdXQsIGZhdGFsIik7CisJCQkJLyogcmVjb3ZlciA/Pz8gKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS0tY291bnQ7CisJCQkrK2NtZF9kYXRhOworCQl9CisgICAgICAgIH0KKyNpZmRlZiBURVNUSU5HCisJaWYgKGZkY19tb2RlID09IEZEQ19TRUVLKSB7CisJCWxhc3RfdGltZSA9IGZ0YXBlX3RpbWVzdGFtcCgpOworCX0KKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qICBJbnB1dCBhIHJlc19sZW4gbG9uZyByZXN1bHQgc3RyaW5nIGZyb20gdGhlIEZEQy4KKyAqICBUaGUgRkRDIHNob3VsZCBiZSByZWFkeSB0byBzZW5kIHRoZSByZXN1bHQgb3IgYW4gZXJyb3IKKyAqICAoRUJVU1kgb3IgRVRJTUUpIHdpbGwgb2NjdXIuCisgKi8KK2ludCBmZGNfcmVzdWx0KF9fdTggKiByZXNfZGF0YSwgaW50IHJlc19sZW4pCit7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSByZXNfbGVuOworCWludCByZXRyeSA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCWZkY19zdGF0dXMgPSBpbmIoZmRjLm1zcik7CisJaWYgKChmZGNfc3RhdHVzICYgRkRDX0RBVEFfUkVBRFlfTUFTSykgIT0gRkRDX0RBVEFfT1VUX1JFQURZKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiZmRjIG5vdCByZWFkeSIpOworCQlyZXN1bHQgPSAtRUJVU1k7CisJfSBlbHNlIHdoaWxlIChjb3VudCkgeworCQlpZiAoIShmZGNfc3RhdHVzICYgRkRDX0JVU1kpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJwcmVtYXR1cmUgZW5kIG9mIHJlc3VsdCBwaGFzZSIpOworCQl9CisJCXJlc3VsdCA9IGZkY19yZWFkKHJlc19kYXRhKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZmRjX2RtYSwKKwkJCSAgICAgICJmZGNfbW9kZSA9ICUwMngsIHN0YXR1cyA9ICUwMnggYXQgaW5kZXggJWQiLAorCQkJICAgICAgKGludCkgZmRjX21vZGUsCisJCQkgICAgICAoaW50KSBmZGNfc3RhdHVzLAorCQkJICAgICAgcmVzX2xlbiAtIGNvdW50KTsKKwkJCWlmICgrK3JldHJ5IDw9IDMpIHsKKwkJCQlUUkFDRShmdF90X3dhcm4sICJmZGNfcmVhZCB0aW1lb3V0LCByZXRyeSIpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2VyciwgImZkY19yZWFkIHRpbWVvdXQsIGZhdGFsIik7CisJCQkJLyogcmVjb3ZlciA/Pz8gKi8KKwkJCQlicmVhazsKKwkJCQkrK3JldHJ5OworCQkJfQorCQl9IGVsc2UgeworCQkJLS1jb3VudDsKKwkJCSsrcmVzX2RhdGE7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmRjX2lvX2xvY2ssIGZsYWdzKTsKKwlmZGNfdXNlY193YWl0KEZUX1JRTV9ERUxBWSk7CS8qIGFsbG93IEZEQyB0byBuZWdhdGUgQlNZICovCisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qICAgICAgSGFuZGxlIGNvbW1hbmQgYW5kIHJlc3VsdCBwaGFzZXMgZm9yCisgKiAgICAgIGNvbW1hbmRzIHdpdGhvdXQgZGF0YSBwaGFzZS4KKyAqLworc3RhdGljIGludCBmZGNfaXNzdWVfY29tbWFuZChjb25zdCBfX3U4ICogb3V0X2RhdGEsIGludCBvdXRfY291bnQsCisJCSAgICAgIF9fdTggKiBpbl9kYXRhLCBpbnQgaW5fY291bnQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChvdXRfY291bnQgPiAwKSB7CisJCVRSQUNFX0NBVENIKGZkY19jb21tYW5kKG91dF9kYXRhLCBvdXRfY291bnQpLCk7CisJfQorCS8qIHdpbGwgdGFrZSAyNCAtIDMwIHVzZWMgZm9yIGZkY19zZW5zZV9kcml2ZV9zdGF0dXMgYW5kCisJICogZmRjX3NlbnNlX2ludGVycnVwdF9zdGF0dXMgY29tbWFuZHMuCisJICogICAgMzUgZmFpbHMgc29tZXRpbWVzICg1LzkvOTMgU0pMKQorCSAqIE9uIGEgbG9hZGVkIHN5c3RlbSBpdCBpbmNpZGVudGFsbHkgdGFrZXMgbG9uZ2VyIHRoYW4KKwkgKiB0aGlzIGZvciB0aGUgZmRjIHRvIGdldCByZWFkeSAhID8/Pz8/PyBXSFkgPz8/Pz8/CisJICogU28gdW50aWwgd2Uga25vdyB3aGF0J3MgZ29pbmcgb24gdXNlIGEgdmVyeSBsb25nIHRpbWVvdXQuCisJICovCisJVFJBQ0VfQ0FUQ0goZmRjX3JlYWR5X291dF93YWl0KDUwMCAvKiB1c2VjICovKSwpOworCWlmIChpbl9jb3VudCA+IDApIHsKKwkJVFJBQ0VfQ0FUQ0goZmRjX3Jlc3VsdChpbl9kYXRhLCBpbl9jb3VudCksCisJCQkgICAgVFJBQ0UoZnRfdF9lcnIsICJyZXN1bHQgcGhhc2UgYWJvcnRlZCIpKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIFdhaXQgZm9yIEZEQyBpbnRlcnJ1cHQgd2l0aCB0aW1lb3V0IChpbiBtaWxsaXNlY29uZHMpLgorICogICAgICBTaWduYWxzIGFyZSBibG9ja2VkIHNvIHRoZSB3YWl0IHdpbGwgbm90IGJlIGFib3J0ZWQuCisgKiAgICAgIE5vdGU6IGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkICEgKDIzLzA1LzkzIFNKTCkKKyAqLworaW50IGZkY19pbnRlcnJ1cHRfd2FpdCh1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LGN1cnJlbnQpOworCXNpZ3NldF90IG9sZF9zaWdtYXNrOwkKKwlzdGF0aWMgaW50IHJlc2V0dGluZzsKKwlsb25nIHRpbWVvdXQ7CisKKwlUUkFDRV9GVU4oZnRfdF9mZGNfZG1hKTsKKworIAlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZnRhcGVfd2FpdF9pbnRyKSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgImVycm9yOiBuZXN0ZWQgY2FsbCIpOworCX0KKwkvKiB0aW1lb3V0IHRpbWUgd2lsbCBiZSB1cCB0byBVU1BUIG1pY3Jvc2Vjb25kcyB0b28gbG9uZyAhICovCisJdGltZW91dCA9ICgxMDAwICogdGltZSArIEZUX1VTUFQgLSAxKSAvIEZUX1VTUFQ7CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlvbGRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmZnRhcGVfd2FpdF9pbnRyLCAmd2FpdCk7CisJd2hpbGUgKCFmdF9pbnRlcnJ1cHRfc2VlbiAmJiB0aW1lb3V0KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworICAgICAgICB9CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NpZ21hc2s7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQorCXJlbW92ZV93YWl0X3F1ZXVlKCZmdGFwZV93YWl0X2ludHIsICZ3YWl0KTsKKwkvKiAgdGhlIGZvbGxvd2luZyBJUyBuZWNlc3NhcnkuIFRydWU6IGFzIHdlbGwKKwkgKiAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCkgYXMgdGhlIHNjaGVkdWxlKCkgc2V0IFRBU0tfUlVOTklORworCSAqICB3aGVuIHRoZXkgd2FrZXVwIGEgdGFzaywgQlVUOiBpdCBtYXkgdmVyeSB3ZWxsIGJlIHRoYXQKKwkgKiAgZnRfaW50ZXJydXB0X3NlZW4gaXMgYWxyZWFkeSBzZXQgdG8gMSB3aGVuIHdlIGVudGVyIGhlcmUKKwkgKiAgaW4gd2hpY2ggY2FzZSBzY2hlZHVsZSgpIGdldHMgbmV2ZXIgY2FsbGVkLCBhbmQKKwkgKiAgVEFTS19SVU5OSU5HIG5ldmVyIHNldC4gVGhpcyBoYXMgdGhlIGZ1bm55IGVmZmVjdCB0aGF0IHdlCisJICogIGV4ZWN1dGUgYWxsIHRoZSBjb2RlIHVudGlsIHdlIGxlYXZlIGtlcm5lbCBzcGFjZSwgYnV0IHRoZW4KKwkgKiAgdGhlIHRhc2sgaXMgc3RvcHBlZCAoYSB0YXNrIENBTk5PVCBiZSBwcmVlbXB0ZWQgd2hpbGUgaW4KKwkgKiAga2VybmVsIG1vZGUuIFNlbmRpbmcgYSBwYWlyIG9mIFNJR1NUT1AvU0lHQ09OVCB0byB0aGUKKwkgKiAgdGFza3Mgd2FrZXMgaXQgdXAgYWdhaW4uIEZ1bm55ISA6LSkKKwkgKi8KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsgCisJaWYgKGZ0X2ludGVycnVwdF9zZWVuKSB7IC8qIHdva2VuIHVwIGJ5IGludGVycnVwdCAqLworCQlmdF9pbnRlcnJ1cHRfc2VlbiA9IDA7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJLyogIE9yaWdpbmFsIGNvbW1lbnQ6CisJICogIEluIGZpcnN0IGluc3RhbmNlLCBuZXh0IHN0YXRlbWVudCBzZWVtcyB1bm5lY2Vzc2FyeSBzaW5jZQorCSAqICBpdCB3aWxsIGJlIGNsZWFyZWQgaW4gZmRjX2NvbW1hbmQuIEhvd2V2ZXIsIGEgc21hbGwgcGFydCBvZgorCSAqICB0aGUgc29mdHdhcmUgc2VlbXMgdG8gcmVseSBvbiB0aGlzIGJlaW5nIGNsZWFyZWQgaGVyZQorCSAqICAoZnRhcGVfY2xvc2UgbWlnaHQgZmFpbCkgc28gc3RpY2sgdG8gaXQgdW50aWwgdGhpbmdzIGdldCBmaXhlZCAhCisJICovCisJLyogIE15IGRlZXBseSBzb3VnaHQgb2Yga25vd2xlZGdlOgorCSAqICBCZWhvbGQgTk8hIEl0IGlzIG9idmlvdXMuIGZkY19yZXNldCgpIGRvZXNuJ3QgY2FsbCBmZGNfY29tbWFuZCgpCisJICogIGJ1dCBuZXZlcnRoZWxlc3MgdXNlcyBmZGNfaW50ZXJydXB0X3dhaXQoKS4gT0YgQ09VUlNFIHRoaXMgbmVlZHMgdG8KKwkgKiAgYmUgcmVzZXQgaGVyZS4KKwkgKi8KKwlmdF9pbnRlcnJ1cHRfc2VlbiA9IDA7CS8qIGNsZWFyIGZvciBuZXh0IGNhbGwgKi8KKwlpZiAoIXJlc2V0dGluZykgeworCQlyZXNldHRpbmcgPSAxOwkvKiBicmVhayBpbmZpbml0ZSByZWN1cnNpb24gaWYgcmVzZXQgZmFpbHMgKi8KKwkJVFJBQ0UoZnRfdF9hbnksICJjbGVhbnVwIHJlc2V0Iik7CisJCWZkY19yZXNldCgpOworCQlyZXNldHRpbmcgPSAwOworCX0KKwlUUkFDRV9FWElUIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgPyAtRUlOVFIgOiAtRVRJTUU7Cit9CisKKy8qICAgICAgU3RhcnQvc3RvcCBkcml2ZSBtb3Rvci4gRW5hYmxlIERNQSBtb2RlLgorICovCit2b2lkIGZkY19tb3RvcihpbnQgbW90b3IpCit7CisJaW50IHVuaXQgPSBmdF9kcml2ZV9zZWw7CisJaW50IGRhdGEgPSB1bml0IHwgRkRDX1JFU0VUX05PVCB8IEZEQ19ETUFfTU9ERTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJZnRhcGVfbW90b3IgPSBtb3RvcjsKKwlpZiAoZnRhcGVfbW90b3IpIHsKKwkJZGF0YSB8PSBGRENfTU9UT1JfMCA8PCB1bml0OworCQlUUkFDRShmdF90X25vaXNlLCAidHVybmluZyBtb3RvciAlZCBvbiIsIHVuaXQpOworCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0dXJuaW5nIG1vdG9yICVkIG9mZiIsIHVuaXQpOworCX0KKwlpZiAoZnRfbWFjaDIpIHsKKwkJb3V0Yl9wKGRhdGEsIGZkYy5kb3IyKTsKKwl9IGVsc2UgeworCQlvdXRiX3AoZGF0YSwgZmRjLmRvcik7CisJfQorCWZ0YXBlX3NsZWVwKDEwICogRlRfTUlMTElTRUNPTkQpOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGZkY191cGRhdGVfZHNyKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFKGZ0X3RfZmxvdywgInJhdGUgPSAlZCBLYnBzLCBwcmVjb21wID0gJWQgbnMiLAorCSAgICAgIGZkY19kYXRhX3JhdGUsIGZkY19wcmVjb21wKTsKKwlpZiAoZmRjLnR5cGUgPj0gaTgyMDc3KSB7CisJCW91dGJfcCgoZmRjX3JhdGVfY29kZSAmIDB4MDMpIHwgZmRjX3ByZWNfY29kZSwgZmRjLmRzcik7CisJfSBlbHNlIHsKKwkJb3V0Yl9wKGZkY19yYXRlX2NvZGUgJiAweDAzLCBmZGMuY2NyKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKwordm9pZCBmZGNfc2V0X3dyaXRlX3ByZWNvbXAoaW50IHByZWNvbXApCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsICJOZXcgcHJlY29tcDogJWQgbnNlYyIsIHByZWNvbXApOworCWZkY19wcmVjb21wID0gcHJlY29tcDsKKwkvKiAgd3JpdGUgcHJlY29tcGVuc2F0aW9uIGNhbiBiZSBzZXQgaW4gbXVsdGlwbGVzIG9mIDQxLjY3IG5zZWMuCisJICogIHJvdW5kIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgYW5kIGNvbnZlcnQgaXQKKwkgKiAgaW50byBhIGZkYyBzZXR0aW5nLiBOb3RlIHRoYXQgMCBtZWFucyBkZWZhdWx0IHRvIHRoZSBmZGMsCisJICogIDcgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoYXQuCisJICovCisJZmRjX3ByZWNfY29kZSA9ICgoZmRjX3ByZWNvbXAgKyAyMSkgLyA0MikgPDwgMjsKKwlpZiAoZmRjX3ByZWNfY29kZSA9PSAwIHx8IGZkY19wcmVjX2NvZGUgPiAoNiA8PCAyKSkgeworCQlmZGNfcHJlY19jb2RlID0gNyA8PCAyOworCX0KKwlmZGNfdXBkYXRlX2RzcigpOworCVRSQUNFX0VYSVQ7Cit9CisKKy8qICBSZXByb2dyYW0gdGhlIDgyMDc4IHJlZ2lzdGVycyB0byB1c2UgRGF0YSBSYXRlIFRhYmxlIDEgb24gYWxsIGRyaXZlcy4KKyAqLworc3RhdGljIHZvaWQgZmRjX3NldF9kcml2ZV9zcGVjcyh2b2lkKQoreworCV9fdTggY21kW10gPSB7IEZEQ19EUklWRV9TUEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMwfTsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRShmdF90X2Zsb3csICJTZXR0aW5nIG9mIGRyaXZlIHNwZWNzIGNhbGxlZCIpOworCWlmIChmZGMudHlwZSA+PSBpODIwNzhfMSkgeworCQljbWRbMV0gPSAoMCA8PCA1KSB8ICgyIDw8IDIpOworCQljbWRbMl0gPSAoMSA8PCA1KSB8ICgyIDw8IDIpOworCQljbWRbM10gPSAoMiA8PCA1KSB8ICgyIDw8IDIpOworCQljbWRbNF0gPSAoMyA8PCA1KSB8ICgyIDw8IDIpOworCQlyZXN1bHQgPSBmZGNfY29tbWFuZChjbWQsIE5SX0lURU1TKGNtZCkpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJVFJBQ0UoZnRfdF9lcnIsICJTZXR0aW5nIG9mIGRyaXZlIHNwZWNzIGZhaWxlZCIpOworCQl9CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qIFNlbGVjdCBjbG9jayBmb3IgZmRjLCBtdXN0IGNvcnJlc3BvbmQgd2l0aCB0YXBlIGRyaXZlIHNldHRpbmcgIQorICogVGhpcyBhbHNvIGluZmx1ZW5jZXMgdGhlIGZkYyB0aW1pbmcgc28gd2UgbXVzdCBhZGp1c3Qgc29tZSB2YWx1ZXMuCisgKi8KK2ludCBmZGNfc2V0X2RhdGFfcmF0ZShpbnQgcmF0ZSkKK3sKKwlpbnQgYmFkX3JhdGUgPSAwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiBTZWxlY3QgY2xvY2sgZm9yIGZkYywgbXVzdCBjb3JyZXNwb25kIHdpdGggdGFwZSBkcml2ZSBzZXR0aW5nICEKKwkgKiBUaGlzIGFsc28gaW5mbHVlbmNlcyB0aGUgZmRjIHRpbWluZyBzbyB3ZSBtdXN0IGFkanVzdCBzb21lIHZhbHVlcy4KKwkgKi8KKwlUUkFDRShmdF90X2ZkY19kbWEsICJuZXcgcmF0ZSA9ICVkIiwgcmF0ZSk7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAyNTA6CisJCWZkY19yYXRlX2NvZGUgPSBmZGNfZGF0YV9yYXRlXzI1MDsKKwkJYnJlYWs7CisJY2FzZSA1MDA6CisJCWZkY19yYXRlX2NvZGUgPSBmZGNfZGF0YV9yYXRlXzUwMDsKKwkJYnJlYWs7CisJY2FzZSAxMDAwOgorCQlpZiAoZmRjLnR5cGUgPCBpODIwNzcpIHsKKwkJCWJhZF9yYXRlID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJZmRjX3JhdGVfY29kZSA9IGZkY19kYXRhX3JhdGVfMTAwMDsKKwkJfQorCQlicmVhazsKKwljYXNlIDIwMDA6CisJCWlmIChmZGMudHlwZSA8IGk4MjA3OF8xKSB7CisJCQliYWRfcmF0ZSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWZkY19yYXRlX2NvZGUgPSBmZGNfZGF0YV9yYXRlXzIwMDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmFkX3JhdGUgPSAxOworICAgICAgICB9CisJaWYgKGJhZF9yYXRlKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sCisJCQkgICAgZnRfdF9mZGNfZG1hLCAiJWQgaXMgbm90IGEgdmFsaWQgZGF0YSByYXRlIiwgcmF0ZSk7CisJfQorCWZkY19kYXRhX3JhdGUgPSByYXRlOworCWZkY191cGRhdGVfZHNyKCk7CisJZmRjX3NldF9zZWVrX3JhdGUoZmRjX3NlZWtfcmF0ZSk7ICAvKiBjbG9jayBjaGFuZ2VkISAqLworCWZ0YXBlX3VkZWxheSgxMDAwKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICBrZWVwIHRoZSB1bml0IHNlbGVjdCBpZiBrZWVwX3NlbGVjdCBpcyAhPSAwLAorICovCitzdGF0aWMgdm9pZCBmZGNfZG9yX3Jlc2V0KGludCBrZWVwX3NlbGVjdCkKK3sKKwlfX3U4IGZkY19jdGwgPSBmdF9kcml2ZV9zZWw7CisKKwlpZiAoa2VlcF9zZWxlY3QgIT0gMCkgeworCQlmZGNfY3RsIHw9IEZEQ19ETUFfTU9ERTsKKwkJaWYgKGZ0YXBlX21vdG9yKSB7CisJCQlmZGNfY3RsIHw9IEZEQ19NT1RPUl8wIDw8IGZ0X2RyaXZlX3NlbDsKKwkJfQorCX0KKwlmdGFwZV91ZGVsYXkoMTApOyAvKiA/Pz8gYnV0IHNlZW1zIHRvIGJlIG5lY2Vzc2FyeSAqLworCWlmIChmdF9tYWNoMikgeworCQlvdXRiX3AoZmRjX2N0bCAmIDB4MGYsIGZkYy5kb3IpOworCQlvdXRiX3AoZmRjX2N0bCwgZmRjLmRvcjIpOworCX0gZWxzZSB7CisJCW91dGJfcChmZGNfY3RsLCBmZGMuZG9yKTsKKwl9CisJZmRjX3VzZWNfd2FpdCgxMCk7IC8qIGRlbGF5ID49IDE0IGZkYyBjbG9ja3MgKi8KKwlpZiAoa2VlcF9zZWxlY3QgPT0gMCkgeworCQlmZGNfY3RsID0gMDsKKwl9CisJZmRjX2N0bCB8PSBGRENfUkVTRVRfTk9UOworCWlmIChmdF9tYWNoMikgeworCQlvdXRiX3AoZmRjX2N0bCAmIDB4MGYsIGZkYy5kb3IpOworCQlvdXRiX3AoZmRjX2N0bCwgZmRjLmRvcjIpOworCX0gZWxzZSB7CisJCW91dGJfcChmZGNfY3RsLCBmZGMuZG9yKTsKKwl9Cit9CisKKy8qICAgICAgUmVzZXQgdGhlIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIuIExlYXZlIHRoZSBmdGFwZV91bml0IHNlbGVjdGVkLgorICovCit2b2lkIGZkY19yZXNldCh2b2lkKQoreworCWludCBzdDA7CisJaW50IGk7CisJaW50IGR1bW15OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZGNfaW9fbG9jaywgZmxhZ3MpOworCisJZmRjX2Rvcl9yZXNldCgxKTsgLyoga2VlcCB1bml0IHNlbGVjdGVkICovCisKKwlmZGNfbW9kZSA9IGZkY19pZGxlOworCisJLyogIG1heWJlIHRoZSBjbGkoKS9zdGkoKSBwYWlyIGlzIG5vdCBuZWNlc3NhcnksIEJVVDoKKwkgKiAgdGhlIGZvbGxvd2luZyBsaW5lIE1VU1QgYmUgaGVyZS4gT3RoZXJ3aXNlIGZkY19pbnRlcnJ1cHRfd2FpdCgpCisJICogIHdvbid0IHdhaXQuIE5vdGUgdGhhdCBmZGNfcmVzZXQoKSBpcyBjYWxsZWQgZnJvbSAKKwkgKiAgZnRhcGVfZHVtYl9zdG9wKCkgd2hlbiB0aGUgZmRjIGlzIGJ1c3kgdHJhbnNmZXJyaW5nIGRhdGEuIEluIHRoaXMKKwkgKiAgY2FzZSBmZGNfaXNyKCkgTU9TVCBQUk9CQUJMWSBzZXRzIGZ0X2ludGVycnVwdF9zZWVuLCBhbmQgdHJpZXMKKwkgKiAgdG8gZ2V0IHRoZSByZXN1bHQgYnl0ZXMgZnJvbSB0aGUgZmRjIGV0Yy4gQ0xBU0guCisJICovCisJZnRfaW50ZXJydXB0X3NlZW4gPSAwOworCQorCS8qICBQcm9ncmFtIGRhdGEgcmF0ZQorCSAqLworCWZkY191cGRhdGVfZHNyKCk7ICAgICAgICAgICAgICAgLyogcmVzdG9yZSBkYXRhIHJhdGUgYW5kIHByZWNvbXAgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICoJV2FpdCBmb3IgZmlyc3QgcG9sbGluZyBjeWNsZSB0byBjb21wbGV0ZQorCSAqLworCWlmIChmZGNfaW50ZXJydXB0X3dhaXQoMSAqIEZUX1NFQ09ORCkgPCAwKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAibm8gZHJpdmUgcG9sbGluZyBpbnRlcnJ1cHQhIik7CisJfSBlbHNlIHsJLyogY2xlYXIgYWxsIGRpc2stY2hhbmdlZCBzdGF0dXNlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJCQlpZihmZGNfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cygmc3QwLCAmZHVtbXkpICE9IDApIHsKKwkJCQlUUkFDRShmdF90X2VyciwgInNlbnNlIGZhaWxlZCBmb3IgJWQiLCBpKTsKKwkJCX0KKwkJCWlmIChpID09IGZ0X2RyaXZlX3NlbCkgeworCQkJCWZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPSBkdW1teTsKKwkJCX0KKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAiZHJpdmUgcG9sbGluZyBjb21wbGV0ZWQiKTsKKwl9CisJLyoKKyAgICAgICAgICoJU1BFQ0lGWSBDT01NQU5ECisJICovCisJZmRjX3NldF9zZWVrX3JhdGUoZmRjX3NlZWtfcmF0ZSk7CisJLyoKKwkgKglEUklWRSBTUEVDSUZJQ0FUSU9OIENPTU1BTkQgKGlmIGZkYyB0eXBlIGtub3duKQorCSAqLworCWlmIChmZGMudHlwZSA+PSBpODIwNzhfMSkgeworCQlmZGNfc2V0X2RyaXZlX3NwZWNzKCk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKyNpZiAhZGVmaW5lZChDTEtfNDhNSFopCisjIGRlZmluZSBDTEtfNDhNSFogMQorI2VuZGlmCisKKy8qICBXaGVuIHdlJ3JlIGRvbmUsIHB1dCB0aGUgZmRjIGludG8gcmVzZXQgbW9kZSBzbyB0aGF0IHRoZSByZWd1bGFyCisgKiAgZmxvcHB5IGRpc2sgZHJpdmVyIHdpbGwgZmlndXJlIG91dCB0aGF0IHNvbWV0aGluZyBpcyB3cm9uZyBhbmQKKyAqICBpbml0aWFsaXplIHRoZSBjb250cm9sbGVyIHRoZSB3YXkgaXQgd2FudHMuCisgKi8KK3ZvaWQgZmRjX2Rpc2FibGUodm9pZCkKK3sKKwlfX3U4IGNtZDFbXSA9IHtGRENfQ09ORklHVVJFLCAweDAwLCAweDAwLCAweDAwfTsKKwlfX3U4IGNtZDJbXSA9IHtGRENfTE9DS307CisJX191OCBjbWQzW10gPSB7RkRDX1VOTE9DS307CisJX191OCBzdGF0WzFdOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKCFmZGNfZmlmb19sb2NrZWQpIHsKKwkJZmRjX3Jlc2V0KCk7CisJCVRSQUNFX0VYSVQ7CisJfQorCWlmIChmZGNfaXNzdWVfY29tbWFuZChjbWQzLCAxLCBzdGF0LCAxKSA8IDAgfHwgc3RhdFswXSAhPSAweDAwKSB7CisJCWZkY19kb3JfcmVzZXQoMCk7CisJCVRSQUNFX0FCT1JUKC8qKi8sIGZ0X3RfYnVnLCAKKwkJImNvdWxkbid0IHVubG9jayBmaWZvLCBjb25maWd1cmF0aW9uIHJlbWFpbnMgY2hhbmdlZCIpOworCX0KKwlmZGNfZmlmb19sb2NrZWQgPSAwOworCWlmIChDTEtfNDhNSFogJiYgZmRjLnR5cGUgPj0gaTgyMDc4KSB7CisJCWNtZDFbMF0gfD0gRkRDX0NMSzQ4X0JJVDsKKwl9CisJY21kMVsyXSA9ICgoZmRjX2ZpZm9fc3RhdGUpID8gMCA6IDB4MjApICsgKGZkY19maWZvX3RociAtIDEpOworCWlmIChmZGNfY29tbWFuZChjbWQxLCBOUl9JVEVNUyhjbWQxKSkgPCAwKSB7CisJCWZkY19kb3JfcmVzZXQoMCk7CisJCVRSQUNFX0FCT1JUKC8qKi8sIGZ0X3RfYnVnLAorCQkiY291bGRuJ3QgcmVjb25maWd1cmUgZmlmbyB0byBvbGQgc3RhdGUiKTsKKwl9CisJaWYgKGZkY19sb2NrX3N0YXRlICYmCisJICAgIGZkY19pc3N1ZV9jb21tYW5kKGNtZDIsIDEsIHN0YXQsIDEpIDwgMCkgeworCQlmZGNfZG9yX3Jlc2V0KDApOworCQlUUkFDRV9BQk9SVCgvKiovLCBmdF90X2J1ZywgImNvdWxkbid0IGxvY2sgb2xkIHN0YXRlIGFnYWluIik7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJmaWZvIHJlc3RvcmVkOiAlc2FibGVkLCB0aHIuICVkLCAlc2xvY2tlZCIsCisJICAgICAgZmRjX2ZpZm9fc3RhdGUgPyAiZW4iIDogImRpcyIsCisJICAgICAgZmRjX2ZpZm9fdGhyLCAoZmRjX2xvY2tfc3RhdGUpID8gIiIgOiAibm90ICIpOworCWZkY19kb3JfcmVzZXQoMCk7CisJVFJBQ0VfRVhJVDsKK30KKworLyogICAgICBTcGVjaWZ5IEZEQyBzZWVrLXJhdGUgKG1pbGxpc2Vjb25kcykKKyAqLworc3RhdGljIGludCBmZGNfc2V0X3NlZWtfcmF0ZShpbnQgc2Vla19yYXRlKQoreworCS8qIHNldCBzdGVwIHJhdGUsIGRtYSBtb2RlLCBhbmQgbWluaW1hbCBoZWFkIGxvYWQgYW5kIHVubG9hZCB0aW1lcworCSAqLworCV9fdTggaW5bM10gPSB7IEZEQ19TUEVDSUZZLCAxLCAoMSA8PCAxKX07CisgCisJZmRjX3NlZWtfcmF0ZSA9IHNlZWtfcmF0ZTsKKwlpblsxXSB8PSAoMTYgLSAoZmRjX2RhdGFfcmF0ZSAqIGZkY19zZWVrX3JhdGUpIC8gNTAwKSA8PCA0OworCisJcmV0dXJuIGZkY19jb21tYW5kKGluLCAzKTsKK30KKworLyogICAgICBTZW5zZSBkcml2ZSBzdGF0dXM6IGdldCB1bml0J3MgZHJpdmUgc3RhdHVzIChTVDMpCisgKi8KK2ludCBmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzKGludCAqc3QzKQoreworCV9fdTggb3V0WzJdOworCV9fdTggaW5bMV07CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCW91dFswXSA9IEZEQ19TRU5TRUQ7CisJb3V0WzFdID0gZnRfZHJpdmVfc2VsOworCVRSQUNFX0NBVENIKGZkY19pc3N1ZV9jb21tYW5kKG91dCwgMiwgaW4sIDEpLCk7CisJKnN0MyA9IGluWzBdOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBTZW5zZSBJbnRlcnJ1cHQgU3RhdHVzIGNvbW1hbmQ6CisgKiAgICAgIHNob3VsZCBiZSBpc3N1ZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHNlZWsuCisgKiAgICAgIGdldCBTVDAgYW5kIGN1cnJlbnQgY3lsaW5kZXIuCisgKi8KK2ludCBmZGNfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cyhpbnQgKnN0MCwgaW50ICpjdXJyZW50X2N5bGluZGVyKQoreworCV9fdTggb3V0WzFdOworCV9fdTggaW5bMl07CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCW91dFswXSA9IEZEQ19TRU5TRUk7CisJVFJBQ0VfQ0FUQ0goZmRjX2lzc3VlX2NvbW1hbmQob3V0LCAxLCBpbiwgMiksKTsKKwkqc3QwID0gaW5bMF07CisJKmN1cnJlbnRfY3lsaW5kZXIgPSBpblsxXTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgICAgc3RlcCB0byB0cmFjaworICovCitpbnQgZmRjX3NlZWsoaW50IHRyYWNrKQoreworCV9fdTggb3V0WzNdOworCWludCBzdDAsIHBjbjsKKyNpZmRlZiBURVNUSU5HCisJdW5zaWduZWQgaW50IHRpbWU7CisjZW5kaWYKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJb3V0WzBdID0gRkRDX1NFRUs7CisJb3V0WzFdID0gZnRfZHJpdmVfc2VsOworCW91dFsyXSA9IHRyYWNrOworI2lmZGVmIFRFU1RJTkcKKwl0aW1lID0gZnRhcGVfdGltZXN0YW1wKCk7CisjZW5kaWYKKwkvKiAgV2UgcmVhbGx5IG5lZWQgdGhpcyBjb21tYW5kIHRvIHdvcmsgIQorCSAqLworCWZ0X3NlZWtfY29tcGxldGVkID0gMDsKKwlUUkFDRV9DQVRDSChmZGNfY29tbWFuZChvdXQsIDMpLAorCQkgICAgZmRjX3Jlc2V0KCk7CisJCSAgICBUUkFDRShmdF90X25vaXNlLCAiZGVzdGluYXRpb24gd2FzOiAlZCwgcmVzZXR0aW5nIEZEQy4uLiIsCisJCQkgIHRyYWNrKSk7CisJLyogICAgSGFuZGxlIGludGVycnVwdHMgdW50aWwgZnRfc2Vla19jb21wbGV0ZWQgb3IgdGltZW91dC4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCVRSQUNFX0NBVENIKGZkY19pbnRlcnJ1cHRfd2FpdCgyICogRlRfU0VDT05EKSwpOworCQlpZiAoZnRfc2Vla19jb21wbGV0ZWQpIHsKKwkJCVRSQUNFX0NBVENIKGZkY19zZW5zZV9pbnRlcnJ1cHRfc3RhdHVzKCZzdDAsICZwY24pLCk7CisJCQlpZiAoKHN0MCAmIFNUMF9TRUVLX0VORCkgPT0gMCkgeworCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJCSAgICAgICJubyBzZWVrLWVuZCBhZnRlciBzZWVrIGNvbXBsZXRpb24gIT8/Iik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKyNpZmRlZiBURVNUSU5HCisJdGltZSA9IGZ0YXBlX3RpbWVkaWZmKHRpbWUsIGZ0YXBlX3RpbWVzdGFtcCgpKSAvIGFicyh0cmFjayAtIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIpOworCWlmICgodGltZSA8IDkwMCB8fCB0aW1lID4gMzEwMCkgJiYgYWJzKHRyYWNrIC0gZnRhcGVfY3VycmVudF9jeWxpbmRlcikgPiA1KSB7CisJCVRSQUNFKGZ0X3Rfd2FybiwgIldyb25nIEZEQyBTVEVQIGludGVydmFsOiAlZCB1c2VjcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLCB0cmFjayAtIGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIpOworCX0KKyNlbmRpZgorCS8qICAgIFZlcmlmeSB3aGV0aGVyIHdlIGlzc3VlZCB0aGUgcmlnaHQgdGFwZSBjb21tYW5kLgorCSAqLworCS8qIFZlcmlmeSB0aGF0IHdlIHNlZWsgdG8gdGhlIHByb3BlciB0cmFjay4gKi8KKwlpZiAocGNuICE9IHRyYWNrKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiYmFkIHNlZWsuLiIpOworCX0KKwlmdGFwZV9jdXJyZW50X2N5bGluZGVyID0gdHJhY2s7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IHBlcnBlbmRfbW9kZTsgLyogc2V0IGlmIGZkYyBpcyBpbiBwZXJwZW5kaWN1bGFyIG1vZGUgKi8KKworc3RhdGljIGludCBwZXJwZW5kX29mZih2b2lkKQoreworIAlfX3U4IHBlcnBlbmRbXSA9IHtGRENfUEVSUEVORCwgMHgwMH07CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkKKwlpZiAocGVycGVuZF9tb2RlKSB7CisJCS8qIFR1cm4gb2ZmIHBlcnBlbmRpY3VsYXIgbW9kZSAqLworCQlwZXJwZW5kWzFdID0gMHg4MDsKKwkJVFJBQ0VfQ0FUQ0goZmRjX2NvbW1hbmQocGVycGVuZCwgMiksCisJCQkgICAgVFJBQ0UoZnRfdF9lcnIsIlBlcnBlbmRpY3VsYXIgbW9kZSBleGl0IGZhaWxlZCEiKSk7CisJCXBlcnBlbmRfbW9kZSA9IDA7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfcGVycGVuZChpbnQgc2VnbWVudF9pZCkKK3sKKyAJX191OCBwZXJwZW5kW10gPSB7RkRDX1BFUlBFTkQsIDB4MDB9OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiBXaGVuIHdyaXRpbmcgUUlDLTMwMjAgdGFwZXMsIHR1cm4gb24gcGVycGVuZGljdWxhciBtb2RlCisJICogaWYgdGFwZSBpcyBtb3ZpbmcgaW4gZm9yd2FyZCBkaXJlY3Rpb24gKGV2ZW4gdHJhY2tzKS4KKwkgKi8KKwlpZiAoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUMzMDIwICYmCisJICAgICgoc2VnbWVudF9pZCAvIGZ0X3NlZ21lbnRzX3Blcl90cmFjaykgJiAxKSA9PSAwKSB7CisvKiAgRklYTUU6IHNvbWUgaTgyMDc3IHNlZW0gdG8gc3VwcG9ydCBwZXJwZW5kaWN1bGFyIG1vZGUgYXMKKyAqICB3ZWxsLiAKKyAqLworI2lmIDAKKwkJaWYgKGZkYy50eXBlIDwgaTgyMDc3QUEpIHt9CisjZWxzZQorCQlpZiAoZmRjLnR5cGUgPCBpODIwNzcgJiYgZnRfZGF0YV9yYXRlIDwgMTAwMCkgeworI2VuZGlmCisJCQkvKiAgZmRjIGRvZXMgbm90IHN1cHBvcnQgcGVycGVuZGljdWxhciBtb2RlOiBjb21wbGFpbiAKKwkJCSAqLworCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJICAgICJZb3VyIEZEQyBkb2VzIG5vdCBzdXBwb3J0IFFJQy0zMDIwLiIpOworCQl9CisJCXBlcnBlbmRbMV0gPSAweDAzIC8qIDB4ODMgKyAoMHg0IDw8IGZ0X2RyaXZlX3NlbCkgKi8gOworCQlUUkFDRV9DQVRDSChmZGNfY29tbWFuZChwZXJwZW5kLCAyKSwKKwkJCSAgIFRSQUNFKGZ0X3RfZXJyLCJQZXJwZW5kaWN1bGFyIG1vZGUgZW50cnkgZmFpbGVkISIpKTsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiUGVycGVuZGljdWxhciBtb2RlIHNldCIpOworCQlwZXJwZW5kX21vZGUgPSAxOworCQlUUkFDRV9FWElUIDA7CisJfQorCVRSQUNFX0VYSVQgcGVycGVuZF9vZmYoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZkY19zZXR1cF9kbWEoY2hhciBtb2RlLAorCQkJCSB2b2xhdGlsZSB2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJLyogUHJvZ3JhbSB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICovCisJZGlzYWJsZV9kbWEoZmRjLmRtYSk7CisJY2xlYXJfZG1hX2ZmKGZkYy5kbWEpOworCXNldF9kbWFfbW9kZShmZGMuZG1hLCBtb2RlKTsKKwlzZXRfZG1hX2FkZHIoZmRjLmRtYSwgdmlydF90b19idXMoKHZvaWQqKWFkZHIpKTsKKwlzZXRfZG1hX2NvdW50KGZkYy5kbWEsIGNvdW50KTsKKwllbmFibGVfZG1hKGZkYy5kbWEpOworfQorCisvKiAgU2V0dXAgZmRjIGFuZCBkbWEgZm9yIGZvcm1hdHRpbmcgdGhlIG5leHQgc2VnbWVudAorICovCitpbnQgZmRjX3NldHVwX2Zvcm1hdHRpbmcoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX3U4IG91dFs2XSA9IHsKKwkJRkRDX0ZPUk1BVCwgMHgwMCwgMywgNCAqIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQsIDB4MDAsIDB4NmIKKwl9OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJVFJBQ0VfQ0FUQ0goaGFuZGxlX3BlcnBlbmQoYnVmZi0+c2VnbWVudF9pZCksKTsKKwkvKiBQcm9ncmFtIHRoZSBETUEgY29udHJvbGxlci4KKwkgKi8KKyAgICAgICAgVFJBQ0UoZnRfdF9mZGNfZG1hLAorCSAgICAgICJwaHlzLiBhZGRyLiA9ICVseCIsIHZpcnRfdG9fYnVzKCh2b2lkKikgYnVmZi0+cHRyKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJZmRjX3NldHVwX2RtYShETUFfTU9ERV9XUklURSwgYnVmZi0+cHRyLCBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICogNCk7CisJLyogSXNzdWUgRkRDIGNvbW1hbmQgdG8gc3RhcnQgcmVhZGluZy93cml0aW5nLgorCSAqLworCW91dFsxXSA9IGZ0X2RyaXZlX3NlbDsKKwlvdXRbNF0gPSBidWZmLT5nYXAzOworCVRSQUNFX0NBVENIKGZkY19zZXR1cF9lcnJvciA9IGZkY19jb21tYW5kKG91dCwgc2l6ZW9mKG91dCkpLAorCQkgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7IGZkY19tb2RlID0gZmRjX2lkbGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJVFJBQ0VfRVhJVCAwOworfQorCisKKy8qICAgICAgU2V0dXAgRmxvcHB5IERpc2sgQ29udHJvbGxlciBhbmQgRE1BIHRvIHJlYWQgb3Igd3JpdGUgdGhlIG5leHQgY2x1c3RlcgorICogICAgICBvZiBnb29kIHNlY3RvcnMgZnJvbSBvciB0byB0aGUgY3VycmVudCBzZWdtZW50LgorICovCitpbnQgZmRjX3NldHVwX3JlYWRfd3JpdGUoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYsIF9fdTggb3BlcmF0aW9uKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX191OCBvdXRbOV07CisJaW50IGRtYV9tb2RlOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlzd2l0Y2gob3BlcmF0aW9uKSB7CisJY2FzZSBGRENfVkVSSUZZOgorCQlpZiAoZmRjLnR5cGUgPCBpODIwNzcpIHsKKwkJCW9wZXJhdGlvbiA9IEZEQ19SRUFEOworCQl9CisJY2FzZSBGRENfUkVBRDoKKwljYXNlIEZEQ19SRUFEX0RFTEVURUQ6CisJCWRtYV9tb2RlID0gRE1BX01PREVfUkVBRDsKKwkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAieGZlciAlZCBzZWN0b3JzIHRvIDB4JXAiLAorCQkgICAgICBidWZmLT5zZWN0b3JfY291bnQsIGJ1ZmYtPnB0cik7CisJCVRSQUNFX0NBVENIKHBlcnBlbmRfb2ZmKCksKTsKKwkJYnJlYWs7CisJY2FzZSBGRENfV1JJVEVfREVMRVRFRDoKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImRlbGV0aW5nIHNlZ21lbnQgJWQiLCBidWZmLT5zZWdtZW50X2lkKTsKKwljYXNlIEZEQ19XUklURToKKwkJZG1hX21vZGUgPSBETUFfTU9ERV9XUklURTsKKwkJLyogV2hlbiB3cml0aW5nIFFJQy0zMDIwIHRhcGVzLCB0dXJuIG9uIHBlcnBlbmRpY3VsYXIgbW9kZQorCQkgKiBpZiB0YXBlIGlzIG1vdmluZyBpbiBmb3J3YXJkIGRpcmVjdGlvbiAoZXZlbiB0cmFja3MpLgorCQkgKi8KKwkJVFJBQ0VfQ0FUQ0goaGFuZGxlX3BlcnBlbmQoYnVmZi0+c2VnbWVudF9pZCksKTsKKwkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAieGZlciAlZCBzZWN0b3JzIGZyb20gMHglcCIsCisJCSAgICAgIGJ1ZmYtPnNlY3Rvcl9jb3VudCwgYnVmZi0+cHRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVFJBQ0VfQUJPUlQoLUVJTywKKwkJCSAgICBmdF90X2J1ZywgImJ1ZzogaW52YWxpZCBvcGVyYXRpb24gcGFyYW1ldGVyIik7CisJfQorCVRSQUNFKGZ0X3RfZmRjX2RtYSwgInBoeXMuIGFkZHIuID0gJWx4Iix2aXJ0X3RvX2J1cygodm9pZCopYnVmZi0+cHRyKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJaWYgKG9wZXJhdGlvbiAhPSBGRENfVkVSSUZZKSB7CisJCWZkY19zZXR1cF9kbWEoZG1hX21vZGUsIGJ1ZmYtPnB0ciwKKwkJCSAgICAgIEZUX1NFQ1RPUl9TSVpFICogYnVmZi0+c2VjdG9yX2NvdW50KTsKKwl9CisJLyogSXNzdWUgRkRDIGNvbW1hbmQgdG8gc3RhcnQgcmVhZGluZy93cml0aW5nLgorCSAqLworCW91dFswXSA9IG9wZXJhdGlvbjsKKwlvdXRbMV0gPSBmdF9kcml2ZV9zZWw7CisJb3V0WzJdID0gYnVmZi0+Y3lsOworCW91dFszXSA9IGJ1ZmYtPmhlYWQ7CisJb3V0WzRdID0gYnVmZi0+c2VjdCArIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJb3V0WzVdID0gMzsJCS8qIFNlY3RvciBzaXplIG9mIDFLLiAqLworCW91dFs2XSA9IG91dFs0XSArIGJ1ZmYtPnNlY3Rvcl9jb3VudCAtIDE7CS8qIGxhc3Qgc2VjdG9yICovCisJb3V0WzddID0gMTA5OwkJLyogR2FwIGxlbmd0aC4gKi8KKwlvdXRbOF0gPSAweGZmOwkJLyogTm8gbGltaXQgdG8gdHJhbnNmZXIgc2l6ZS4gKi8KKwlUUkFDRShmdF90X2ZkY19kbWEsICJDOiAweCUwMngsIEg6IDB4JTAyeCwgUjogMHglMDJ4LCBjbnQ6IDB4JTAyeCIsCisJCW91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs2XSAtIG91dFs0XSArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZkY19pb19sb2NrLCBmbGFncyk7CisJVFJBQ0VfQ0FUQ0goZmRjX3NldHVwX2Vycm9yID0gZmRjX2NvbW1hbmQob3V0LCA5KSxmZGNfbW9kZSA9IGZkY19pZGxlKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmZGNfZmlmb190aHJlc2hvbGQoX191OCB0aHJlc2hvbGQsCisJCSAgICAgICBpbnQgKmZpZm9fc3RhdGUsIGludCAqbG9ja19zdGF0ZSwgaW50ICpmaWZvX3RocikKK3sKKwljb25zdCBfX3U4IGNtZDBbXSA9IHtGRENfRFVNUFJFR1N9OworCV9fdTggY21kMVtdID0ge0ZEQ19DT05GSUdVUkUsIDAsICgweDBmICYgKHRocmVzaG9sZCAtIDEpKSwgMH07CisJY29uc3QgX191OCBjbWQyW10gPSB7RkRDX0xPQ0t9OworCWNvbnN0IF9fdTggY21kM1tdID0ge0ZEQ19VTkxPQ0t9OworCV9fdTggcmVnWzEwXTsKKwlfX3U4IHN0YXQ7CisJaW50IGk7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKENMS180OE1IWiAmJiBmZGMudHlwZSA+PSBpODIwNzgpIHsKKwkJY21kMVswXSB8PSBGRENfQ0xLNDhfQklUOworCX0KKwkvKiAgRHVtcCBmZGMgaW50ZXJuYWwgcmVnaXN0ZXJzIGZvciBleGFtaW5hdGlvbgorCSAqLworCVRSQUNFX0NBVENIKGZkY19jb21tYW5kKGNtZDAsIE5SX0lURU1TKGNtZDApKSwKKwkJICAgIFRSQUNFKGZ0X3Rfd2FybiwgImR1bXByZWcgY21kIGZhaWxlZCwgZmlmbyB1bmNoYW5nZWQiKSk7CisJLyogIE5vdyByZWFkIGZkYyBpbnRlcm5hbCByZWdpc3RlcnMgZnJvbSBmaWZvCisJICovCisJZm9yIChpID0gMDsgaSA8IChpbnQpTlJfSVRFTVMocmVnKTsgKytpKSB7CisJCWZkY19yZWFkKCZyZWdbaV0pOworCQlUUkFDRShmdF90X2ZkY19kbWEsICJSZWdpc3RlciAlZCA9IDB4JTAyeCIsIGksIHJlZ1tpXSk7CisJfQorCWlmIChmaWZvX3N0YXRlICYmIGxvY2tfc3RhdGUgJiYgZmlmb190aHIpIHsKKwkJKmZpZm9fc3RhdGUgPSAocmVnWzhdICYgMHgyMCkgPT0gMDsKKwkJKmxvY2tfc3RhdGUgPSByZWdbN10gJiAweDgwOworCQkqZmlmb190aHIgPSAxICsgKHJlZ1s4XSAmIDB4MGYpOworCX0KKwlUUkFDRShmdF90X25vaXNlLAorCSAgICAgICJvcmlnaW5hbCBmaWZvIHN0YXRlOiAlc2FibGVkLCB0aHJlc2hvbGQgJWQsICVzbG9ja2VkIiwKKwkgICAgICAoKHJlZ1s4XSAmIDB4MjApID09IDApID8gImVuIiA6ICJkaXMiLAorCSAgICAgIDEgKyAocmVnWzhdICYgMHgwZiksIChyZWdbN10gJiAweDgwKSA/ICIiIDogIm5vdCAiKTsKKwkvKiAgSWYgZmRjIGlzIGFscmVhZHkgbG9ja2VkLCB1bmxvY2sgaXQgZmlyc3QgISAqLworCWlmIChyZWdbN10gJiAweDgwKSB7CisJCWZkY19yZWFkeV93YWl0KDEwMCk7CisJCVRSQUNFX0NBVENIKGZkY19pc3N1ZV9jb21tYW5kKGNtZDMsIE5SX0lURU1TKGNtZDMpLCAmc3RhdCwgMSksCisJCQkgICAgVFJBQ0UoZnRfdF9idWcsICJGREMgdW5sb2NrIGNvbW1hbmQgZmFpbGVkLCAiCisJCQkJICAiY29uZmlndXJhdGlvbiB1bmNoYW5nZWQiKSk7CisJfQorCWZkY19maWZvX2xvY2tlZCA9IDA7CisJLyogIEVuYWJsZSBmaWZvIGFuZCBzZXQgdGhyZXNob2xkIGF0IHh4IGJ5dGVzIHRvIGFsbG93IGEKKwkgKiAgcmVhc29uYWJseSBsYXJnZSBsYXRlbmN5IGFuZCByZWR1Y2UgbnVtYmVyIG9mIGRtYSBidXJzdHMuCisJICovCisJZmRjX3JlYWR5X3dhaXQoMTAwKTsKKwlpZiAoKHJlc3VsdCA9IGZkY19jb21tYW5kKGNtZDEsIE5SX0lURU1TKGNtZDEpKSkgPCAwKSB7CisJCVRSQUNFKGZ0X3RfYnVnLCAiY29uZmlndXJlIGNtZCBmYWlsZWQsIGZpZm8gdW5jaGFuZ2VkIik7CisJfQorCS8qICBOb3cgbG9jayBjb25maWd1cmF0aW9uIHNvIHJlc2V0IHdpbGwgbm90IGNoYW5nZSBpdAorCSAqLworICAgICAgICBpZihmZGNfaXNzdWVfY29tbWFuZChjbWQyLCBOUl9JVEVNUyhjbWQyKSwgJnN0YXQsIDEpIDwgMCB8fAorCSAgIHN0YXQgIT0gMHgxMCkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywKKwkJCSAgICAiRkRDIGxvY2sgY29tbWFuZCBmYWlsZWQsIHN0YXQgPSAweCUwMngiLCBzdGF0KTsKKwl9CisJZmRjX2ZpZm9fbG9ja2VkID0gMTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBmZGNfZmlmb19lbmFibGUodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZkY19maWZvX2xvY2tlZCkgeworCQlUUkFDRV9BQk9SVCgwLCBmdF90X3dhcm4sICJGaWZvIG5vdCBlbmFibGVkIGJlY2F1c2UgbG9ja2VkIik7CisJfQorCVRSQUNFX0NBVENIKGZkY19maWZvX3RocmVzaG9sZChmdF9mZGNfdGhyZXNob2xkIC8qIGJ5dGVzICovLAorCQkJCSAgICAgICAmZmRjX2ZpZm9fc3RhdGUsCisJCQkJICAgICAgICZmZGNfbG9ja19zdGF0ZSwKKwkJCQkgICAgICAgJmZkY19maWZvX3RociksKTsKKwlUUkFDRV9DQVRDSChmZGNfZmlmb190aHJlc2hvbGQoZnRfZmRjX3RocmVzaG9sZCAvKiBieXRlcyAqLywKKwkJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCksKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgRGV0ZXJtaW5lIGZkIGNvbnRyb2xsZXIgdHlwZSAKKyAqLworc3RhdGljIF9fdTggZmRjX3NhdmVfc3RhdGVbMl07CisKK3N0YXRpYyBpbnQgZmRjX3Byb2JlKHZvaWQpCit7CisJX191OCBjbWRbMV07CisJX191OCBzdGF0WzE2XTsgLyogbXVzdCBiZSBhYmxlIHRvIGhvbGQgZHVtcHJlZ3MgJiBzYXZlIHJlc3VsdHMgKi8KKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFRyeSB0byBmaW5kIG91dCB3aGF0IGtpbmQgb2YgZmQgY29udHJvbGxlciB3ZSBoYXZlIHRvIGRlYWwgd2l0aAorCSAqICBTY2hlbWUgYm9ycm93ZWQgZnJvbSBmbG9wcHkgZHJpdmVyOgorCSAqICBmaXJzdCB0cnkgaWYgRkRDX0RVTVBSRUdTIGNvbW1hbmQgd29ya3MKKwkgKiAgKHRoaXMgaW5kaWNhdGVzIHRoYXQgd2UgaGF2ZSBhIDgyMDcyIG9yIGJldHRlcikKKwkgKiAgdGhlbiB0cnkgdGhlIEZEQ19WRVJTSU9OIGNvbW1hbmQgKDgyMDcyIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzKQorCSAqICB0aGVuIHRyeSB0aGUgRkRDX1VOTE9DSyBjb21tYW5kIChzb21lIG9sZGVyIDgyMDc3J3MgZG9uJ3Qgc3VwcG9ydCB0aGlzKQorCSAqICB0aGVuIHRyeSB0aGUgRkRDX1BBUlRJRCBjb21tYW5kICg4MjA3OCdzIHN1cHBvcnQgdGhpcykKKwkgKi8KKwljbWRbMF0gPSBGRENfRFVNUFJFR1M7CisJaWYgKGZkY19pc3N1ZV9jb21tYW5kKGNtZCwgMSwgc3RhdCwgMSkgIT0gMCkgeworCQlUUkFDRV9BQk9SVChub19mZGMsIGZ0X3RfYnVnLCAiTm8gRkRDIGZvdW5kIik7CisJfQorCWlmIChzdGF0WzBdID09IDB4ODApIHsKKwkJLyogaW52YWxpZCBjb21tYW5kOiBtdXN0IGJlIHByZSA4MjA3MiAqLworCQlUUkFDRV9BQk9SVChpODI3MiwKKwkJCSAgICBmdF90X3dhcm4sICJUeXBlIDgyNzJBLzc2NUEgY29tcGF0aWJsZSBGREMgZm91bmQiKTsKKwl9CisJZmRjX3Jlc3VsdCgmc3RhdFsxXSwgOSk7CisJZmRjX3NhdmVfc3RhdGVbMF0gPSBzdGF0WzddOworCWZkY19zYXZlX3N0YXRlWzFdID0gc3RhdFs4XTsKKwljbWRbMF0gPSBGRENfVkVSU0lPTjsKKwlpZiAoZmRjX2lzc3VlX2NvbW1hbmQoY21kLCAxLCBzdGF0LCAxKSA8IDAgfHwgc3RhdFswXSA9PSAweDgwKSB7CisJCVRSQUNFX0FCT1JUKGk4MjcyLCBmdF90X3dhcm4sICJUeXBlIDgyMDcyIEZEQyBmb3VuZCIpOworCX0KKwlpZiAoKnN0YXQgIT0gMHg5MCkgeworCQlUUkFDRV9BQk9SVChpODI3MiwgZnRfdF93YXJuLCAiVW5rbm93biBGREMgZm91bmQiKTsKKwl9CisJY21kWzBdID0gRkRDX1VOTE9DSzsKKwlpZihmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDEpIDwgMCB8fCBzdGF0WzBdICE9IDB4MDApIHsKKwkJVFJBQ0VfQUJPUlQoaTgyNzIsIGZ0X3Rfd2FybiwKKwkJCSAgICAiVHlwZSBwcmUtMTk5MSA4MjA3NyBGREMgZm91bmQsICIKKwkJCSAgICAidHJlYXRpbmcgaXQgbGlrZSBhIDgyMDcyIik7CisJfQorCWlmIChmZGNfc2F2ZV9zdGF0ZVswXSAmIDB4ODApIHsgLyogd2FzIGxvY2tlZCAqLworCQljbWRbMF0gPSBGRENfTE9DSzsgLyogcmVzdG9yZSBsb2NrICovCisJCSh2b2lkKWZkY19pc3N1ZV9jb21tYW5kKGNtZCwgMSwgc3RhdCwgMSk7CisJCVRSQUNFKGZ0X3Rfd2FybiwgIkZEQyBpcyBhbHJlYWR5IGxvY2tlZCIpOworCX0KKwkvKiBUZXN0IGZvciBhIGk4MjA3OCBGREMgKi8KKwljbWRbMF0gPSBGRENfUEFSVElEOworCWlmIChmZGNfaXNzdWVfY29tbWFuZChjbWQsIDEsIHN0YXQsIDEpIDwgMCB8fCBzdGF0WzBdID09IDB4ODApIHsKKwkJLyogaW52YWxpZCBjb21tYW5kOiBub3QgYSBpODIwNzh4eCB0eXBlIEZEQyAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJCQlvdXRiX3AoaSwgZmRjLnRkcik7CisJCQlpZiAoKGluYl9wKGZkYy50ZHIpICYgMHgwMykgIT0gaSkgeworCQkJCVRSQUNFX0FCT1JUKGk4MjA3NywKKwkJCQkJICAgIGZ0X3Rfd2FybiwgIlR5cGUgODIwNzcgRkRDIGZvdW5kIik7CisJCQl9CisJCX0KKwkJVFJBQ0VfQUJPUlQoaTgyMDc3QUEsIGZ0X3Rfd2FybiwgIlR5cGUgODIwNzdBQSBGREMgZm91bmQiKTsKKwl9CisJLyogRkRDX1BBUlRJRCBjbWQgc3VjY2VlZGVkICovCisJc3dpdGNoIChzdGF0WzBdID4+IDUpIHsKKwljYXNlIDB4MDoKKwkJLyogaTgyMDc4U0wgb3IgaTgyMDc4LTEuICBUaGUgU0wgcGFydCBjYW5ub3QgcnVuIGF0CisJCSAqIDJNYnBzICh0aGUgU0wgYW5kIC0xIGRpZXMgYXJlIGlkZW50aWNhbDsgdGhleSBhcmUKKwkJICogc3BlZWQgZ3JhZGVkIGFmdGVyIHByb2R1Y3Rpb24sIGFjY29yZGluZyB0byBJbnRlbCkuCisJCSAqIFNvbWUgU0wncyBjYW4gYmUgZGV0ZWN0ZWQgYnkgZG9pbmcgYSBTQVZFIGNtZCBhbmQKKwkJICogbG9vayBhdCBiaXQgNyBvZiB0aGUgZmlyc3QgYnl0ZSAodGhlIFNFTDNWIyBiaXQpLgorCQkgKiBJZiBpdCBpcyAwLCB0aGUgcGFydCBydW5zIG9mZiAzVm9sdHMsIGFuZCBoZW5jZSBpdAorCQkgKiBpcyBhIFNMLgorCQkgKi8KKwkJY21kWzBdID0gRkRDX1NBVkU7CisJCWlmKGZkY19pc3N1ZV9jb21tYW5kKGNtZCwgMSwgc3RhdCwgMTYpIDwgMCkgeworCQkJVFJBQ0UoZnRfdF9lcnIsICJGRENfU0FWRSBmYWlsZWQuIER1bm5vIHdoeSIpOworCQkJLyogZ3Vlc3Mgd2UgYmV0dGVyIGNsYWltIHRoZSBmZGMgdG8gYmUgYSBpODIwNzggKi8KKwkJCVRSQUNFX0FCT1JUKGk4MjA3OCwKKwkJCQkgICAgZnRfdF93YXJuLAorCQkJCSAgICAiVHlwZSBpODIwNzggRkRDIChpIHN1cHBvc2UpIGZvdW5kIik7CisJCX0KKwkJaWYgKChzdGF0WzBdICYgRkRDX1NFTDNWX0JJVCkpIHsKKwkJCS8qIGZkYyBydW5uaW5nIG9mZiA1Vm9sdHM7IFByYXkgdGhhdCBpdCdzIGEgaTgyMDc4LTEKKwkJCSAqLworCQkJVFJBQ0VfQUJPUlQoaTgyMDc4XzEsIGZ0X3Rfd2FybiwKKwkJCQkgICJUeXBlIGk4MjA3OC0xIG9yIDVWb2x0IGk4MjA3OFNMIEZEQyBmb3VuZCIpOworCQl9CisJCVRSQUNFX0FCT1JUKGk4MjA3OCwgZnRfdF93YXJuLAorCQkJICAgICJUeXBlIDNWb2x0IGk4MjA3OFNMIEZEQyAoMU1icHMpIGZvdW5kIik7CisJY2FzZSAweDE6CisJY2FzZSAweDI6IC8qIFM4MjA3OEIgICovCisJCS8qIFRoZSAnNzhCICBpc24ndCAnNzggY29tcGF0aWJsZS4gIERldGVjdCBpdCBhcyBhICc3N0FBICovCisJCVRSQUNFX0FCT1JUKGk4MjA3N0FBLCBmdF90X3dhcm4sICJUeXBlIGk4MjA3N0FBIEZEQyBmb3VuZCIpOworCWNhc2UgMHgzOiAvKiBOU0MgUEM4NzQ0IGNvcmU7IHVzZWQgaW4gc2V2ZXJhbCBzdXBlci1JTyBjaGlwcyAqLworCQlUUkFDRV9BQk9SVChpODIwNzdBQSwKKwkJCSAgICBmdF90X3dhcm4sICJUeXBlIDgyMDc3QUEgY29tcGF0aWJsZSBGREMgZm91bmQiKTsKKwlkZWZhdWx0OgorCQlUUkFDRShmdF90X3dhcm4sICJBIHByZXZpb3VzbHkgdW5kZXRlY3RlZCBGREMgZm91bmQiKTsKKwkJVFJBQ0VfQUJPUlQoaTgyMDc3QUEsIGZ0X3Rfd2FybiwKKwkJCSAgIlRyZWF0aW5nIGl0IGFzIGEgODIwNzdBQS4gUGxlYXNlIHJlcG9ydCBwYXJ0aWQ9ICVkIiwKKwkJCSAgICBzdGF0WzBdKTsKKwl9IC8qIHN3aXRjaChzdGF0WyAwXSA+PiA1KSAqLworCVRSQUNFX0VYSVQgbm9fZmRjOworfQorCitzdGF0aWMgaW50IGZkY19yZXF1ZXN0X3JlZ2lvbnModm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChmdF9tYWNoMiB8fCBmdF9wcm9iZV9mYzEwKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oZmRjLnNyYSwgOCwgImZkYyAoZnQpIikpIHsKKyNpZm5kZWYgQlJPS0VOX0ZMT1BQWV9EUklWRVIKKwkJCVRSQUNFX0VYSVQgLUVCVVNZOworI2Vsc2UKKwkJCVRSQUNFKGZ0X3Rfd2FybiwKKyJhZGRyZXNzIDB4JTAzeCBvY2N1cGllZCAoYnkgZmxvcHB5IGRyaXZlcj8pLCB1c2luZyBpdCBhbnl3YXkiLCBmZGMuc3JhKTsKKyNlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihmZGMuc3JhLCA2LCAiZmRjIChmdCkiKSkgeworI2lmbmRlZiBCUk9LRU5fRkxPUFBZX0RSSVZFUgorCQkJVFJBQ0VfRVhJVCAtRUJVU1k7CisjZWxzZQorCQkJVFJBQ0UoZnRfdF93YXJuLAorImFkZHJlc3MgMHglMDN4IG9jY3VwaWVkIChieSBmbG9wcHkgZHJpdmVyPyksIHVzaW5nIGl0IGFueXdheSIsIGZkYy5zcmEpOworI2VuZGlmCisJCX0KKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihmZGMuc3JhICsgNywgMSwgImZkYyAoZnQpIikpIHsKKyNpZm5kZWYgQlJPS0VOX0ZMT1BQWV9EUklWRVIKKwkJCXJlbGVhc2VfcmVnaW9uKGZkYy5zcmEsIDYpOworCQkJVFJBQ0VfRVhJVCAtRUJVU1k7CisjZWxzZQorCQkJVFJBQ0UoZnRfdF93YXJuLAorImFkZHJlc3MgMHglMDN4IG9jY3VwaWVkIChieSBmbG9wcHkgZHJpdmVyPyksIHVzaW5nIGl0IGFueXdheSIsIGZkYy5zcmEgKyA3KTsKKyNlbmRpZgorCQl9CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKwordm9pZCBmZGNfcmVsZWFzZV9yZWdpb25zKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZmRjLnNyYSAhPSAwKSB7CisJCWlmIChmZGMuZG9yMiAhPSAwKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihmZGMuc3JhLCA4KTsKKwkJfSBlbHNlIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGZkYy5zcmEsIDYpOworCQkJcmVsZWFzZV9yZWdpb24oZmRjLmRpciwgMSk7CisJCX0KKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIGludCBmZGNfY29uZmlnX3JlZ3ModW5zaWduZWQgaW50IGZkY19iYXNlLCAKKwkJCSAgIHVuc2lnbmVkIGludCBmZGNfaXJxLCAKKwkJCSAgIHVuc2lnbmVkIGludCBmZGNfZG1hKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZmRjLmlycSA9IGZkY19pcnE7CisJZmRjLmRtYSA9IGZkY19kbWE7CisJZmRjLnNyYSA9IGZkY19iYXNlOworCWZkYy5zcmIgPSBmZGNfYmFzZSArIDE7CisJZmRjLmRvciA9IGZkY19iYXNlICsgMjsKKwlmZGMudGRyID0gZmRjX2Jhc2UgKyAzOworCWZkYy5tc3IgPSBmZGMuZHNyID0gZmRjX2Jhc2UgKyA0OworCWZkYy5maWZvID0gZmRjX2Jhc2UgKyA1OworCWZkYy5kaXIgPSBmZGMuY2NyID0gZmRjX2Jhc2UgKyA3OworCWZkYy5kb3IyID0gKGZ0X21hY2gyIHx8IGZ0X3Byb2JlX2ZjMTApID8gZmRjX2Jhc2UgKyA2IDogMDsKKwlUUkFDRV9DQVRDSChmZGNfcmVxdWVzdF9yZWdpb25zKCksIGZkYy5zcmEgPSAwKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgZmRjX2NvbmZpZyh2b2lkKQoreworCXN0YXRpYyBpbnQgYWxyZWFkeV9kb25lOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoYWxyZWFkeV9kb25lKSB7CisJCVRSQUNFX0NBVENIKGZkY19yZXF1ZXN0X3JlZ2lvbnMoKSwpOworCQkqKGZkYy5ob29rKSA9IGZkY19pc3I7CS8qIGhvb2sgb3VyIGhhbmRsZXIgaW4gKi8KKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlpZiAoZnRfcHJvYmVfZmMxMCkgeworCQlpbnQgZmNfdHlwZTsKKwkJCisJCVRSQUNFX0NBVENIKGZkY19jb25maWdfcmVncyhmdF9mZGNfYmFzZSwKKwkJCQkJICAgIGZ0X2ZkY19pcnEsIGZ0X2ZkY19kbWEpLCk7CisJCWZjX3R5cGUgPSBmYzEwX2VuYWJsZSgpOworCQlpZiAoZmNfdHlwZSAhPSAwKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJGQy0lYzAgY29udHJvbGxlciBmb3VuZCIsICcwJyArIGZjX3R5cGUpOworCQkJZmRjLnR5cGUgPSBmYzEwOworCQkJZmRjLmhvb2sgPSAmZG9fZnRhcGU7CisJCQkqKGZkYy5ob29rKSA9IGZkY19pc3I7CS8qIGhvb2sgb3VyIGhhbmRsZXIgaW4gKi8KKwkJCWFscmVhZHlfZG9uZSA9IDE7CisJCQlUUkFDRV9FWElUIDA7CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJGQy0xMC8yMCBjb250cm9sbGVyIG5vdCBmb3VuZCIpOworCQkJZmRjX3JlbGVhc2VfcmVnaW9ucygpOworCQkJZmRjLnR5cGUgPSBub19mZGM7CisJCQlmdF9wcm9iZV9mYzEwID0gMDsKKwkJCWZ0X2ZkY19iYXNlICAgPSAweDNmMDsKKwkJCWZ0X2ZkY19pcnEgICAgPSA2OworCQkJZnRfZmRjX2RtYSAgICA9IDI7CisJCX0KKwl9CisJVFJBQ0UoZnRfdF93YXJuLCAiZmRjIGJhc2U6IDB4JXgsIGlycTogJWQsIGRtYTogJWQiLCAKKwkgICAgICBmdF9mZGNfYmFzZSwgZnRfZmRjX2lycSwgZnRfZmRjX2RtYSk7CisJVFJBQ0VfQ0FUQ0goZmRjX2NvbmZpZ19yZWdzKGZ0X2ZkY19iYXNlLCBmdF9mZGNfaXJxLCBmdF9mZGNfZG1hKSwpOworCWZkYy5ob29rID0gJmRvX2Z0YXBlOworCSooZmRjLmhvb2spID0gZmRjX2lzcjsJLyogaG9vayBvdXIgaGFuZGxlciBpbiAqLworCWFscmVhZHlfZG9uZSA9IDE7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnRhcGVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdm9pZCAoKmhhbmRsZXIpICh2b2lkKSA9ICpmZGMuaG9vazsKKwlpbnQgaGFuZGxlZCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCSpmZGMuaG9vayA9IE5VTEw7CisJaWYgKGhhbmRsZXIpIHsKKwkJaGFuZGxlZCA9IDE7CisJCWhhbmRsZXIoKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2J1ZywgIlVuZXhwZWN0ZWQgZnRhcGUgaW50ZXJydXB0Iik7CisJfQorCVRSQUNFX0VYSVQgSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludCBmZGNfZ3JhYl9pcnFfYW5kX2RtYSh2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoZmRjLmhvb2sgPT0gJmRvX2Z0YXBlKSB7CisJCS8qICBHZXQgZmFzdCBpbnRlcnJ1cHQgaGFuZGxlci4KKwkJICovCisJCWlmIChyZXF1ZXN0X2lycShmZGMuaXJxLCBmdGFwZV9pbnRlcnJ1cHQsCisJCQkJU0FfSU5URVJSVVBULCAiZnQiLCBmdGFwZV9pZCkpIHsKKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfYnVnLAorCQkJCSAgICAiVW5hYmxlIHRvIGdyYWIgSVJRJWQgZm9yIGZ0YXBlIGRyaXZlciIsCisJCQkJICAgIGZkYy5pcnEpOworCQl9CisJCWlmIChyZXF1ZXN0X2RtYShmZGMuZG1hLCBmdGFwZV9pZCkpIHsKKwkJCWZyZWVfaXJxKGZkYy5pcnEsIGZ0YXBlX2lkKTsKKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfYnVnLAorCQkJICAgICAgIlVuYWJsZSB0byBncmFiIERNQSVkIGZvciBmdGFwZSBkcml2ZXIiLAorCQkJICAgICAgZmRjLmRtYSk7CisJCX0KKwl9CisJaWYgKGZ0X2ZkY19iYXNlICE9IDB4M2YwICYmIChmdF9mZGNfZG1hID09IDIgfHwgZnRfZmRjX2lycSA9PSA2KSkgeworCQkvKiBVc2luZyBzYW1lIGRtYSBjaGFubmVsIG9yIGlycSBhcyBzdGFuZGFyZCBmZGMsIG5lZWQKKwkJICogdG8gZGlzYWJsZSB0aGUgZG1hLWdhdGUgb24gdGhlIHN0ZCBmZGMuIFRoaXMKKwkJICogY291bGRuJ3QgYmUgZG9uZSBpbiB0aGUgZmxvcHB5IGRyaXZlciBhcyBzb21lCisJCSAqIGxhcHRvcHMgYXJlIHVzaW5nIHRoZSBkbWEtZ2F0ZSB0byBlbnRlciBhIGxvdyBwb3dlcgorCQkgKiBvciBldmVuIHN1c3BlbmRlZCBzdGF0ZSA6LSgKKwkJICovCisJCW91dGJfcChGRENfUkVTRVRfTk9ULCAweDNmMik7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJETUEtZ2F0ZSBvbiBzdGFuZGFyZCBmZGMgZGlzYWJsZWQiKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZmRjX3JlbGVhc2VfaXJxX2FuZF9kbWEodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZkYy5ob29rID09ICZkb19mdGFwZSkgeworCQlkaXNhYmxlX2RtYShmZGMuZG1hKTsJLyoganVzdCBpbiBjYXNlLi4uICovCisJCWZyZWVfZG1hKGZkYy5kbWEpOworCQlmcmVlX2lycShmZGMuaXJxLCBmdGFwZV9pZCk7CisJfQorCWlmIChmdF9mZGNfYmFzZSAhPSAweDNmMCAmJiAoZnRfZmRjX2RtYSA9PSAyIHx8IGZ0X2ZkY19pcnEgPT0gNikpIHsKKwkJLyogVXNpbmcgc2FtZSBkbWEgY2hhbm5lbCBhcyBzdGFuZGFyZCBmZGMsIG5lZWQgdG8KKwkJICogZGlzYWJsZSB0aGUgZG1hLWdhdGUgb24gdGhlIHN0ZCBmZGMuIFRoaXMgY291bGRuJ3QKKwkJICogYmUgZG9uZSBpbiB0aGUgZmxvcHB5IGRyaXZlciBhcyBzb21lIGxhcHRvcHMgYXJlCisJCSAqIHVzaW5nIHRoZSBkbWEtZ2F0ZSB0byBlbnRlciBhIGxvdyBwb3dlciBvciBldmVuCisJCSAqIHN1c3BlbmRlZCBzdGF0ZSA6LSgKKwkJICovCisJCW91dGJfcChGRENfUkVTRVRfTk9UIHwgRkRDX0RNQV9NT0RFLCAweDNmMik7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJETUEtZ2F0ZSBvbiBzdGFuZGFyZCBmZGMgZW5hYmxlZCBhZ2FpbiIpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmZGNfaW5pdCh2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiBmaW5kIGEgRkRDIHRvIHVzZSAqLworCVRSQUNFX0NBVENIKGZkY19jb25maWcoKSwpOworCVRSQUNFX0NBVENIKGZkY19ncmFiX2lycV9hbmRfZG1hKCksIGZkY19yZWxlYXNlX3JlZ2lvbnMoKSk7CisJZnRhcGVfbW90b3IgPSAwOworCWZkY19jYXRjaF9zdHJheV9pbnRlcnJ1cHRzKDApOwkvKiBjbGVhciBudW1iZXIgb2YgYXdhaW50ZWQKKwkJCQkJICogc3RyYXkgaW50ZXJydXB0ZSAKKwkJCQkJICovCisJZmRjX2NhdGNoX3N0cmF5X2ludGVycnVwdHMoMSk7CS8qIG9uZSBhbHdheXMgY29tZXMgKD8pICovCisJVFJBQ0UoZnRfdF9mbG93LCAicmVzZXR0aW5nIGZkYyIpOworCWZkY19zZXRfc2Vla19yYXRlKDIpOwkJLyogdXNlIG5vbWluYWwgUUlDIHN0ZXAgcmF0ZSAqLworCWZkY19yZXNldCgpOwkJCS8qIGluaXQgZmRjICYgY2xlYXIgdHJhY2sgY291bnRlcnMgKi8KKwlpZiAoZmRjLnR5cGUgPT0gbm9fZmRjKSB7CS8qIG5vIEZDLTEwIG9yIEZDLTIwIGZvdW5kICovCisJCWZkYy50eXBlID0gZmRjX3Byb2JlKCk7CisJCWZkY19yZXNldCgpOwkJLyogdXBkYXRlIHdpdGggbmV3IGtub3dsZWRnZSAqLworCX0KKwlpZiAoZmRjLnR5cGUgPT0gbm9fZmRjKSB7CisJCWZkY19yZWxlYXNlX2lycV9hbmRfZG1hKCk7CisJCWZkY19yZWxlYXNlX3JlZ2lvbnMoKTsKKwkJVFJBQ0VfRVhJVCAtRU5YSU87CisJfQorCWlmIChmZGMudHlwZSA+PSBpODIwNzcpIHsKKwkJaWYgKGZkY19maWZvX2VuYWJsZSgpIDwgMCkgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAiY291bGRuJ3QgZW5hYmxlIGZkYyBmaWZvICEiKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgImZkYyBmaWZvIGVuYWJsZWQgYW5kIGxvY2tlZCIpOworCQl9CisJfQorCVRSQUNFX0VYSVQgMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWMzYzcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pby5oCkBAIC0wLDAgKzEsMjUyIEBACisjaWZuZGVmIF9GRENfSU9fSAorI2RlZmluZSBfRkRDX0lPX0gKKworLyoKKyAqICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2ZkYy1pby5oLHYgJAorICogJFJldmlzaW9uOiAxLjMgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDYgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBsb3cgbGV2ZWwKKyAqICAgICAgZnVuY3Rpb25zIHRoYXQgY29tbXVuaWNhdGUgd2l0aCB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlciwKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvcgorICogICAgICBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZmRyZWcuaD4KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorCisjZGVmaW5lIEZEQ19TS19CSVQgICAgICAoMHgyMCkKKyNkZWZpbmUgRkRDX01UX0JJVCAgICAgICgweDgwKQorCisjZGVmaW5lIEZEQ19SRUFEICAgICAgICAoRkRfUkVBRCAmIH4oRkRDX1NLX0JJVCB8IEZEQ19NVF9CSVQpKQorI2RlZmluZSBGRENfV1JJVEUgICAgICAgKEZEX1dSSVRFICYgfkZEQ19NVF9CSVQpCisjZGVmaW5lIEZEQ19SRUFEX0RFTEVURUQgICgweDRjKQorI2RlZmluZSBGRENfV1JJVEVfREVMRVRFRCAoMHg0OSkKKyNkZWZpbmUgRkRDX1ZFUklGWSAgICAgICAgKDB4NTYpCisjZGVmaW5lIEZEQ19SRUFESUQgICAgICAoMHg0YSkKKyNkZWZpbmUgRkRDX1NFTlNFRCAgICAgICgweDA0KQorI2RlZmluZSBGRENfU0VOU0VJICAgICAgKEZEX1NFTlNFSSkKKyNkZWZpbmUgRkRDX0ZPUk1BVCAgICAgIChGRF9GT1JNQVQpCisjZGVmaW5lIEZEQ19SRUNBTCAgICAgICAoRkRfUkVDQUxJQlJBVEUpCisjZGVmaW5lIEZEQ19TRUVLICAgICAgICAoRkRfU0VFSykKKyNkZWZpbmUgRkRDX1NQRUNJRlkgICAgIChGRF9TUEVDSUZZKQorI2RlZmluZSBGRENfUkVDQUxJQlIgICAgKEZEX1JFQ0FMSUJSQVRFKQorI2RlZmluZSBGRENfVkVSU0lPTiAgICAgKEZEX1ZFUlNJT04pCisjZGVmaW5lIEZEQ19QRVJQRU5EICAgICAoRkRfUEVSUEVORElDVUxBUikKKyNkZWZpbmUgRkRDX0RVTVBSRUdTICAgIChGRF9EVU1QUkVHUykKKyNkZWZpbmUgRkRDX0xPQ0sgICAgICAgIChGRF9MT0NLKQorI2RlZmluZSBGRENfVU5MT0NLICAgICAgKEZEX1VOTE9DSykKKyNkZWZpbmUgRkRDX0NPTkZJR1VSRSAgIChGRF9DT05GSUdVUkUpCisjZGVmaW5lIEZEQ19EUklWRV9TUEVDICAoMHg4ZSkJLyogaTgyMDc4IGhhcyB0aGlzIChhbnkgb3RoZXJzPykgKi8KKyNkZWZpbmUgRkRDX1BBUlRJRCAgICAgICgweDE4KQkvKiBpODIwNzggaGFzIHRoaXMgKi8KKyNkZWZpbmUgRkRDX1NBVkUgICAgICAgICgweDJlKQkvKiBpODIwNzggaGFzIHRoaXMgKGFueSBvdGhlcnM/KSAqLworI2RlZmluZSBGRENfUkVTVE9SRSAgICAgKDB4NGUpCS8qIGk4MjA3OCBoYXMgdGhpcyAoYW55IG90aGVycz8pICovCisKKyNkZWZpbmUgRkRDX1NUQVRVU19NQVNLIChTVEFUVVNfQlVTWSB8IFNUQVRVU19ETUEgfCBTVEFUVVNfRElSIHwgU1RBVFVTX1JFQURZKQorI2RlZmluZSBGRENfREFUQV9SRUFEWSAgKFNUQVRVU19SRUFEWSkKKyNkZWZpbmUgRkRDX0RBVEFfT1VUUFVUIChTVEFUVVNfRElSKQorI2RlZmluZSBGRENfREFUQV9SRUFEWV9NQVNLIChTVEFUVVNfUkVBRFkgfCBTVEFUVVNfRElSKQorI2RlZmluZSBGRENfREFUQV9PVVRfUkVBRFkgIChTVEFUVVNfUkVBRFkgfCBTVEFUVVNfRElSKQorI2RlZmluZSBGRENfREFUQV9JTl9SRUFEWSAgIChTVEFUVVNfUkVBRFkpCisjZGVmaW5lIEZEQ19CVVNZICAgICAgICAoU1RBVFVTX0JVU1kpCisjZGVmaW5lIEZEQ19DTEs0OF9CSVQgICAoMHg4MCkKKyNkZWZpbmUgRkRDX1NFTDNWX0JJVCAgICgweDQwKQorCisjZGVmaW5lIFNUMF9JTlRfTUFTSyAgICAoU1QwX0lOVFIpCisjZGVmaW5lIEZEQ19JTlRfTk9STUFMICAoU1QwX0lOVFIgJiAweDAwKQorI2RlZmluZSBGRENfSU5UX0FCTk9STUFMIChTVDBfSU5UUiAmIDB4NDApCisjZGVmaW5lIEZEQ19JTlRfSU5WQUxJRCAoU1QwX0lOVFIgJiAweDgwKQorI2RlZmluZSBGRENfSU5UX1JFQURZQ0ggKFNUMF9JTlRSICYgMHhDMCkKKyNkZWZpbmUgU1QwX1NFRUtfRU5EICAgIChTVDBfU0UpCisjZGVmaW5lIFNUM19UUkFDS18wICAgICAoU1QzX1RaKQorCisjZGVmaW5lIEZEQ19SRVNFVF9OT1QgICAoMHgwNCkKKyNkZWZpbmUgRkRDX0RNQV9NT0RFICAgICgweDA4KQorI2RlZmluZSBGRENfTU9UT1JfMCAgICAgKDB4MTApCisjZGVmaW5lIEZEQ19NT1RPUl8xICAgICAoMHgyMCkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKCoqaG9vaykgKHZvaWQpOwkvKiBvdXIgd2VkZ2UgaW50byB0aGUgaXNyICovCisJZW51bSB7CisJCW5vX2ZkYywgaTgyNzIsIGk4MjA3NywgaTgyMDc3QUEsIGZjMTAsCisJCWk4MjA3OCwgaTgyMDc4XzEKKwl9IHR5cGU7CQkJLyogRkRDIHR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOyAvKiBGREMgaXJxIG5yICovCisJdW5zaWduZWQgaW50IGRtYTsgLyogRkRDIGRtYSBjaGFubmVsIG5yICovCisJX191MTYgc3JhOwkgIC8qIFN0YXR1cyByZWdpc3RlciBBIChQUy8yIG9ubHkpICovCisJX191MTYgc3JiOwkgIC8qIFN0YXR1cyByZWdpc3RlciBCIChQUy8yIG9ubHkpICovCisJX191MTYgZG9yOwkgIC8qIERpZ2l0YWwgb3V0cHV0IHJlZ2lzdGVyICovCisJX191MTYgdGRyOwkgIC8qIFRhcGUgRHJpdmUgUmVnaXN0ZXIgKDgyMDc3U0wtMSAmCisJCQkgICAgIDgyMDc4IG9ubHkpICovCisJX191MTYgbXNyOwkgIC8qIE1haW4gU3RhdHVzIFJlZ2lzdGVyICovCisJX191MTYgZHNyOwkgIC8qIERhdGFyYXRlIFNlbGVjdCBSZWdpc3RlciAoODIwN3ggb25seSkgKi8KKwlfX3UxNiBmaWZvOwkgIC8qIERhdGEgcmVnaXN0ZXIgLyBGaWZvIG9uIDgyMDd4ICovCisJX191MTYgZGlyOwkgIC8qIERpZ2l0YWwgSW5wdXQgUmVnaXN0ZXIgKi8KKwlfX3UxNiBjY3I7CSAgLyogQ29uZmlndXJhdGlvbiBDb250cm9sIFJlZ2lzdGVyICovCisJX191MTYgZG9yMjsJICAvKiBBbHRlcm5hdGUgZG9yIG9uIE1BQ0gtMiBjb250cm9sbGVyLAorCQkJICAgICBhbHNvIHVzZWQgd2l0aCBGQy0xMCwgbWVhbmluZyB1bmtub3duICovCit9IGZkY19jb25maWdfaW5mbzsKKwordHlwZWRlZiBlbnVtIHsKKwlmZGNfZGF0YV9yYXRlXzI1MCAgPSAyLAorCWZkY19kYXRhX3JhdGVfMzAwICA9IDEsCS8qIGFueSBmZGMgaW4gZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisJZmRjX2RhdGFfcmF0ZV81MDAgID0gMCwKKwlmZGNfZGF0YV9yYXRlXzEwMDAgPSAzLAorCWZkY19kYXRhX3JhdGVfMjAwMCA9IDEsCS8qIGk4MjA3OC0xOiB3aGVuIHVzaW5nIERhdGEgUmF0ZSBUYWJsZSAjMiAqLworfSBmZGNfZGF0YV9yYXRlX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJZmRjX2lkbGUgICAgICAgICAgPSAwLAorCWZkY19yZWFkaW5nX2RhdGEgID0gRkRDX1JFQUQsCisJZmRjX3NlZWtpbmcgICAgICAgPSBGRENfU0VFSywKKwlmZGNfd3JpdGluZ19kYXRhICA9IEZEQ19XUklURSwKKwlmZGNfZGVsZXRpbmcgICAgICA9IEZEQ19XUklURV9ERUxFVEVELAorCWZkY19yZWFkaW5nX2lkICAgID0gRkRDX1JFQURJRCwKKwlmZGNfcmVjYWxpYnJhdGluZyA9IEZEQ19SRUNBTCwKKwlmZGNfZm9ybWF0dGluZyAgICA9IEZEQ19GT1JNQVQsCisJZmRjX3ZlcmlmeWluZyAgICAgPSBGRENfVkVSSUZZCit9IGZkY19tb2RlX2VudW07CisKK3R5cGVkZWYgZW51bSB7CisJd2FpdGluZyA9IDAsCisJcmVhZGluZywKKwl3cml0aW5nLAorCWZvcm1hdHRpbmcsCisJdmVyaWZ5aW5nLAorCWRlbGV0aW5nLAorCWRvbmUsCisJZXJyb3IsCisJbW1hcHBlZCwKK30gYnVmZmVyX3N0YXRlX2VudW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3U4ICphZGRyZXNzOworCXZvbGF0aWxlIGJ1ZmZlcl9zdGF0ZV9lbnVtIHN0YXR1czsKKwl2b2xhdGlsZSBfX3U4ICpwdHI7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGJ5dGVzOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzZWdtZW50X2lkOworCisJLyogYml0bWFwIGZvciByZW1haW5kZXIgb2Ygc2VnbWVudCBub3QgeWV0IGhhbmRsZWQuCisJICogb25lIGJpdCBzZXQgZm9yIGVhY2ggYmFkIHNlY3RvciB0aGF0IG11c3QgYmUgc2tpcHBlZC4KKwkgKi8KKwl2b2xhdGlsZSBTZWN0b3JNYXAgYmFkX3NlY3Rvcl9tYXA7CisKKwkvKiBiaXRtYXAgd2l0aCBiYWQgZGF0YSBibG9ja3MgaW4gZGF0YSBidWZmZXIuCisJICogdGhlIGVycm9ycyBpbiB0aGlzIG1hcCBtYXkgYmUgcmV0cmllZC4KKwkgKi8KKwl2b2xhdGlsZSBTZWN0b3JNYXAgc29mdF9lcnJvcl9tYXA7CisKKwkvKiBiaXRtYXAgd2l0aCBiYWQgZGF0YSBibG9ja3MgaW4gZGF0YSBidWZmZXIKKwkgKiB0aGUgZXJyb3JzIGluIHRoaXMgbWFwIG1heSBub3QgYmUgcmV0cmllZC4KKwkgKi8KKwl2b2xhdGlsZSBTZWN0b3JNYXAgaGFyZF9lcnJvcl9tYXA7CisKKwkvKiByZXRyeSBjb3VudGVyIGZvciBzb2Z0IGVycm9ycy4KKwkgKi8KKwl2b2xhdGlsZSBpbnQgcmV0cnk7CisKKwkvKiBzZWN0b3JzIHRvIHNraXAgb24gcmV0cnkgPz8/CisJICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNraXA7CisKKwkvKiBuciBvZiBkYXRhIGJsb2NrcyBpbiBkYXRhIGJ1ZmZlcgorCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBkYXRhX29mZnNldDsKKworCS8qIG9mZnNldCBpbiBzZWdtZW50IGZvciBmaXJzdCBzZWN0b3IgdG8gYmUgaGFuZGxlZC4KKwkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2VjdG9yX29mZnNldDsKKworCS8qIHNpemUgb2YgY2x1c3RlciBvZiBnb29kIHNlY3RvcnMgdG8gYmUgaGFuZGxlZC4KKwkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2VjdG9yX2NvdW50OworCisJLyogc2l6ZSBvZiByZW1haW5pbmcgcGFydCBvZiBzZWdtZW50IHRvIGJlIGhhbmRsZWQuCisJICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHJlbWFpbmluZzsKKworCS8qIHBvaW50cyB0byBuZXh0IHNlZ21lbnQgKGNvbnRpZ3VvdXMpIHRvIGJlIGhhbmRsZWQsCisJICogb3IgaXMgemVybyBpZiBubyByZWFkLWFoZWFkIGlzIGFsbG93ZWQuCisJICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IG5leHRfc2VnbWVudDsKKworCS8qIGZsYWcgYmVpbmcgc2V0IGlmIGRlbGV0ZWQgZGF0YSB3YXMgcmVhZC4KKwkgKi8KKwl2b2xhdGlsZSBpbnQgZGVsZXRlZDsKKworCS8qIGZsb3BweSBjb29yZGluYXRlcyBvZiBmaXJzdCBzZWN0b3IgaW4gc2VnbWVudCAqLworCXZvbGF0aWxlIF9fdTggaGVhZDsKKwl2b2xhdGlsZSBfX3U4IGN5bDsKKwl2b2xhdGlsZSBfX3U4IHNlY3Q7CisKKwkvKiBnYXAgdG8gdXNlIHdoZW4gZm9ybWF0dGluZyAqLworCV9fdTggZ2FwMzsKKwkvKiBmbGFnIHNldCB3aGVuIGJ1ZmZlciBpcyBtbWFwZWQgKi8KKwlpbnQgbW1hcHBlZDsKK30gYnVmZmVyX3N0cnVjdDsKKworLyoKKyAqICAgICAgZmRjLWlvLmMgZGVmaW5lZCBwdWJsaWMgdmFyaWFibGVzCisgKi8KK2V4dGVybiB2b2xhdGlsZSBmZGNfbW9kZV9lbnVtIGZkY19tb2RlOworZXh0ZXJuIGludCBmZGNfc2V0dXBfZXJyb3I7CS8qIG91dGRhdGVkID8/PyAqLworZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IGZ0YXBlX3dhaXRfaW50cjsKK2V4dGVybiB2b2xhdGlsZSBpbnQgZnRhcGVfY3VycmVudF9jeWxpbmRlcjsgLyogdHJhY2sgbnIgRkRDIHRoaW5rcyB3ZSdyZSBvbiAqLworZXh0ZXJuIHZvbGF0aWxlIF9fdTggZmRjX2hlYWQ7CS8qIEZEQyBoZWFkICovCitleHRlcm4gdm9sYXRpbGUgX191OCBmZGNfY3lsOwkvKiBGREMgdHJhY2sgKi8KK2V4dGVybiB2b2xhdGlsZSBfX3U4IGZkY19zZWN0OwkvKiBGREMgc2VjdG9yICovCitleHRlcm4gZmRjX2NvbmZpZ19pbmZvIGZkYzsJLyogRkRDIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8KKworZXh0ZXJuIHVuc2lnbmVkIGludCBmdF9mZGNfYmFzZTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZnRfZmRjX2lycTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZnRfZmRjX2RtYTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZnRfZmRjX3RocmVzaG9sZDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZnRfZmRjX3JhdGVfbGltaXQ7CitleHRlcm4gaW50IGZ0X3Byb2JlX2ZjMTA7CitleHRlcm4gaW50IGZ0X21hY2gyOworLyoKKyAqICAgICAgZmRjLWlvLmMgZGVmaW5lZCBwdWJsaWMgZnVuY3Rpb25zCisgKi8KK2V4dGVybiB2b2lkIGZkY19jYXRjaF9zdHJheV9pbnRlcnJ1cHRzKGludCBjb3VudCk7CitleHRlcm4gaW50IGZkY19yZWFkeV93YWl0KHVuc2lnbmVkIGludCB0aW1lb3V0KTsKK2V4dGVybiBpbnQgZmRjX2NvbW1hbmQoY29uc3QgX191OCAqIGNtZF9kYXRhLCBpbnQgY21kX2xlbik7CitleHRlcm4gaW50IGZkY19yZXN1bHQoX191OCAqIHJlc19kYXRhLCBpbnQgcmVzX2xlbik7CitleHRlcm4gaW50IGZkY19pbnRlcnJ1cHRfd2FpdCh1bnNpZ25lZCBpbnQgdGltZSk7CitleHRlcm4gaW50IGZkY19zZWVrKGludCB0cmFjayk7CitleHRlcm4gaW50IGZkY19zZW5zZV9kcml2ZV9zdGF0dXMoaW50ICpzdDMpOworZXh0ZXJuIHZvaWQgZmRjX21vdG9yKGludCBtb3Rvcik7CitleHRlcm4gdm9pZCBmZGNfcmVzZXQodm9pZCk7CitleHRlcm4gdm9pZCBmZGNfZGlzYWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgZmRjX2ZpZm9fdGhyZXNob2xkKF9fdTggdGhyZXNob2xkLAorCQkJICAgICAgaW50ICpmaWZvX3N0YXRlLCBpbnQgKmxvY2tfc3RhdGUsIGludCAqZmlmb190aHIpOworZXh0ZXJuIHZvaWQgZmRjX3dhaXRfY2FsaWJyYXRlKHZvaWQpOworZXh0ZXJuIGludCBmZGNfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cyhpbnQgKnN0MCwgaW50ICpjdXJyZW50X2N5bGluZGVyKTsKK2V4dGVybiB2b2lkIGZkY19zYXZlX2RyaXZlX3NwZWNzKHZvaWQpOworZXh0ZXJuIHZvaWQgZmRjX3Jlc3RvcmVfZHJpdmVfc3BlY3Modm9pZCk7CitleHRlcm4gaW50IGZkY19zZXRfZGF0YV9yYXRlKGludCByYXRlKTsKK2V4dGVybiB2b2lkIGZkY19zZXRfd3JpdGVfcHJlY29tcChpbnQgcHJlY29tcCk7CitleHRlcm4gaW50IGZkY19yZWxlYXNlX2lycV9hbmRfZG1hKHZvaWQpOworZXh0ZXJuIHZvaWQgZmRjX3JlbGVhc2VfcmVnaW9ucyh2b2lkKTsKK2V4dGVybiBpbnQgZmRjX2luaXQodm9pZCk7CitleHRlcm4gaW50IGZkY19zZXR1cF9yZWFkX3dyaXRlKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmLCBfX3U4IG9wZXJhdGlvbik7CitleHRlcm4gaW50IGZkY19zZXR1cF9mb3JtYXR0aW5nKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pc3IuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyYmM3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmMKQEAgLTAsMCArMSwxMTcwIEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2ZkYy1pc3IuYyx2ICQKKyAqICRSZXZpc2lvbjogMS45ICQKKyAqICREYXRlOiAxOTk3LzEwLzE3IDIzOjAxOjUzICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBhbmQKKyAqICAgICAgYXNzb2NpYXRlZCBjb2RlIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIKKyAqICAgICAgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2RlZmluZSB2b2xhdGlsZQkJLyogKi8KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pc3IuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KK3ZvbGF0aWxlIGludCBmdF9leHBlY3RlZF9zdHJheV9pbnRlcnJ1cHRzOwordm9sYXRpbGUgaW50IGZ0X2ludGVycnVwdF9zZWVuOwordm9sYXRpbGUgaW50IGZ0X3NlZWtfY29tcGxldGVkOwordm9sYXRpbGUgaW50IGZ0X2hpZGVfaW50ZXJydXB0OworLyogICAgICBMb2NhbCB2YXJzLgorICovCit0eXBlZGVmIGVudW0geworCW5vX2Vycm9yID0gMCwgaWRfYW1fZXJyb3IgPSAweDAxLCBpZF9jcmNfZXJyb3IgPSAweDAyLAorCWRhdGFfYW1fZXJyb3IgPSAweDA0LCBkYXRhX2NyY19lcnJvciA9IDB4MDgsCisJbm9fZGF0YV9lcnJvciA9IDB4MTAsIG92ZXJydW5fZXJyb3IgPSAweDIwLAorfSBlcnJvcl9jYXVzZTsKK3N0YXRpYyBpbnQgc3RvcF9yZWFkX2FoZWFkOworCisKK3N0YXRpYyB2b2lkIHByaW50X2Vycm9yX2NhdXNlKGludCBjYXVzZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJc3dpdGNoIChjYXVzZSkgeworCWNhc2Ugbm9fZGF0YV9lcnJvcjoKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIm5vIGRhdGEgZXJyb3IiKTsKKwkJYnJlYWs7CisJY2FzZSBpZF9hbV9lcnJvcjoKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImlkIGFtIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgaWRfY3JjX2Vycm9yOgorCQlUUkFDRShmdF90X25vaXNlLCAiaWQgY3JjIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgZGF0YV9hbV9lcnJvcjoKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImRhdGEgYW0gZXJyb3IiKTsKKwkJYnJlYWs7CisJY2FzZSBkYXRhX2NyY19lcnJvcjoKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImRhdGEgY3JjIGVycm9yIik7CisJCWJyZWFrOworCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIm92ZXJydW4gZXJyb3IiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDo7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyBjaGFyICpmZGNfbW9kZV90eHQoZmRjX21vZGVfZW51bSBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgZmRjX2lkbGU6CisJCXJldHVybiAiZmRjX2lkbGUiOworCWNhc2UgZmRjX3JlYWRpbmdfZGF0YToKKwkJcmV0dXJuICJmZGNfcmVhZGluZ19kYXRhIjsKKwljYXNlIGZkY19zZWVraW5nOgorCQlyZXR1cm4gImZkY19zZWVraW5nIjsKKwljYXNlIGZkY193cml0aW5nX2RhdGE6CisJCXJldHVybiAiZmRjX3dyaXRpbmdfZGF0YSI7CisJY2FzZSBmZGNfcmVhZGluZ19pZDoKKwkJcmV0dXJuICJmZGNfcmVhZGluZ19pZCI7CisJY2FzZSBmZGNfcmVjYWxpYnJhdGluZzoKKwkJcmV0dXJuICJmZGNfcmVjYWxpYnJhdGluZyI7CisJY2FzZSBmZGNfZm9ybWF0dGluZzoKKwkJcmV0dXJuICJmZGNfZm9ybWF0dGluZyI7CisJY2FzZSBmZGNfdmVyaWZ5aW5nOgorCQlyZXR1cm4gImZkY192ZXJpZnlpbmciOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGVycm9yX2NhdXNlIGRlY29kZV9pcnFfY2F1c2UoZmRjX21vZGVfZW51bSBtb2RlLCBfX3U4IHN0W10pCit7CisJZXJyb3JfY2F1c2UgY2F1c2UgPSBub19lcnJvcjsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFZhbGlkIHN0W10sIGRlY29kZSBjYXVzZSBvZiBpbnRlcnJ1cHQuCisJICovCisJc3dpdGNoIChzdFswXSAmIFNUMF9JTlRfTUFTSykgeworCWNhc2UgRkRDX0lOVF9OT1JNQUw6CisJCVRSQUNFKGZ0X3RfZmRjX2RtYSwibm9ybWFsIGNvbXBsZXRpb246ICVzIixmZGNfbW9kZV90eHQobW9kZSkpOworCQlicmVhazsKKwljYXNlIEZEQ19JTlRfQUJOT1JNQUw6CisJCVRSQUNFKGZ0X3RfZmxvdywgImFibm9ybWFsIGNvbXBsZXRpb24gJXMiLCBmZGNfbW9kZV90eHQobW9kZSkpOworCQlUUkFDRShmdF90X2ZkY19kbWEsICJTVDA6IDB4JTAyeCwgU1QxOiAweCUwMngsIFNUMjogMHglMDJ4IiwKKwkJICAgICAgc3RbMF0sIHN0WzFdLCBzdFsyXSk7CisJCVRSQUNFKGZ0X3RfZmRjX2RtYSwKKwkJICAgICAgIkM6IDB4JTAyeCwgSDogMHglMDJ4LCBSOiAweCUwMngsIE46IDB4JTAyeCIsCisJCSAgICAgIHN0WzNdLCBzdFs0XSwgc3RbNV0sIHN0WzZdKTsKKwkJaWYgKHN0WzFdICYgMHgwMSkgeworCQkJaWYgKHN0WzJdICYgMHgwMSkgeworCQkJCWNhdXNlID0gZGF0YV9hbV9lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJY2F1c2UgPSBpZF9hbV9lcnJvcjsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdFsxXSAmIDB4MjApIHsKKwkJCWlmIChzdFsyXSAmIDB4MjApIHsKKwkJCQljYXVzZSA9IGRhdGFfY3JjX2Vycm9yOworCQkJfSBlbHNlIHsKKwkJCQljYXVzZSA9IGlkX2NyY19lcnJvcjsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdFsxXSAmIDB4MDQpIHsKKwkJCWNhdXNlID0gbm9fZGF0YV9lcnJvcjsKKwkJfSBlbHNlIGlmIChzdFsxXSAmIDB4MTApIHsKKwkJCWNhdXNlID0gb3ZlcnJ1bl9lcnJvcjsKKwkJfQorCQlwcmludF9lcnJvcl9jYXVzZShjYXVzZSk7CisJCWJyZWFrOworCWNhc2UgRkRDX0lOVF9JTlZBTElEOgorCQlUUkFDRShmdF90X2Zsb3csICJpbnZhbGlkIGNvbXBsZXRpb24gJXMiLCBmZGNfbW9kZV90eHQobW9kZSkpOworCQlicmVhazsKKwljYXNlIEZEQ19JTlRfUkVBRFlDSDoKKwkJaWYgKHN0WzBdICYgU1QwX1NFRUtfRU5EKSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJkcml2ZSBwb2xsIGNvbXBsZXRlZCIpOworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAicmVhZHkgY2hhbmdlICVzIixmZGNfbW9kZV90eHQobW9kZSkpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlUUkFDRV9FWElUIGNhdXNlOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfaGlzdG9yeShlcnJvcl9jYXVzZSBjYXVzZSkKK3sKKwlzd2l0Y2ggKGNhdXNlKSB7CisJY2FzZSBpZF9hbV9lcnJvcjoKKwkJZnRfaGlzdG9yeS5pZF9hbV9lcnJvcnMrKzsKKwkJYnJlYWs7CisJY2FzZSBpZF9jcmNfZXJyb3I6CisJCWZ0X2hpc3RvcnkuaWRfY3JjX2Vycm9ycysrOworCQlicmVhazsKKwljYXNlIGRhdGFfYW1fZXJyb3I6CisJCWZ0X2hpc3RvcnkuZGF0YV9hbV9lcnJvcnMrKzsKKwkJYnJlYWs7CisJY2FzZSBkYXRhX2NyY19lcnJvcjoKKwkJZnRfaGlzdG9yeS5kYXRhX2NyY19lcnJvcnMrKzsKKwkJYnJlYWs7CisJY2FzZSBvdmVycnVuX2Vycm9yOgorCQlmdF9oaXN0b3J5Lm92ZXJydW5fZXJyb3JzKys7CisJCWJyZWFrOworCWNhc2Ugbm9fZGF0YV9lcnJvcjoKKwkJZnRfaGlzdG9yeS5ub19kYXRhX2Vycm9ycysrOworCQlicmVhazsKKwlkZWZhdWx0OjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNraXBfYmFkX3NlY3RvcihidWZmZXJfc3RydWN0ICogYnVmZikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIE1hcmsgc2VjdG9yIGFzIHNvZnQgZXJyb3IgYW5kIHNraXAgaXQKKwkgKi8KKwlpZiAoYnVmZi0+cmVtYWluaW5nID4gMCkgeworCQkrK2J1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJCSsrYnVmZi0+ZGF0YV9vZmZzZXQ7CisJCS0tYnVmZi0+cmVtYWluaW5nOworCQlidWZmLT5wdHIgKz0gRlRfU0VDVE9SX1NJWkU7CisJCWJ1ZmYtPmJhZF9zZWN0b3JfbWFwID4+PSAxOworCX0gZWxzZSB7CisJCS8qICBIZXksIHdoYXQgaXMgdGhpcz8/Pz8/Pz8/Pz8/Pz8gQyBjb2RlOiBpZiB3ZSBzaGlmdCAKKwkJICogIG1vcmUgdGhhbiAzMSBiaXRzLCB3ZSBnZXQgbm8gc2hpZnQuIFRoYXQncyBiYWQhISEhISEKKwkJICovCisJCSsrYnVmZi0+c2VjdG9yX29mZnNldDsJLyogaGFjayBmb3IgZXJyb3IgbWFwcyAqLworCQlUUkFDRShmdF90X3dhcm4sICJza2lwcGluZyBsYXN0IHNlY3RvciBpbiBzZWdtZW50Iik7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9lcnJvcl9tYXBzKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmLCB1bnNpZ25lZCBpbnQgZXJyb3Jfb2Zmc2V0KQoreworCWludCBoYXJkID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGJ1ZmYtPnJldHJ5IDwgRlRfU09GVF9SRVRSSUVTKSB7CisJCWJ1ZmYtPnNvZnRfZXJyb3JfbWFwIHw9ICgxIDw8IGVycm9yX29mZnNldCk7CisJfSBlbHNlIHsKKwkJYnVmZi0+aGFyZF9lcnJvcl9tYXAgfD0gKDEgPDwgZXJyb3Jfb2Zmc2V0KTsKKwkJYnVmZi0+c29mdF9lcnJvcl9tYXAgJj0gfmJ1ZmYtPmhhcmRfZXJyb3JfbWFwOworCQlidWZmLT5yZXRyeSA9IC0xOyAgLyogd2lsbCBiZSBzZXQgdG8gMCBpbiBzZXR1cF9zZWdtZW50ICovCisJCWhhcmQgPSAxOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAic2VjdG9yICVkIDogJXMgZXJyb3JcbiIKKwkgICAgICBLRVJOX0lORk8gImhhcmQgbWFwOiAweCUwOGx4XG4iCisJICAgICAgS0VSTl9JTkZPICJzb2Z0IG1hcDogMHglMDhseCIsCisJICAgICAgRlRfU0VDVE9SKGVycm9yX29mZnNldCksIGhhcmQgPyAiaGFyZCIgOiAic29mdCIsCisJICAgICAgKGxvbmcpIGJ1ZmYtPmhhcmRfZXJyb3JfbWFwLCAobG9uZykgYnVmZi0+c29mdF9lcnJvcl9tYXApOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3Byb2dyZXNzKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsIGVycm9yX2NhdXNlIGNhdXNlKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlzd2l0Y2ggKGNhdXNlKSB7CisJY2FzZSBub19lcnJvcjogCisJCVRSQUNFKGZ0X3RfZmxvdywiJWQgU2VjdG9yKHMpIHRyYW5zZmVycmVkIiwgYnVmZi0+c2VjdG9yX2NvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBub19kYXRhX2Vycm9yOgorCQlUUkFDRShmdF90X2Zsb3csICJTZWN0b3IgJWQgbm90IGZvdW5kIiwKKwkJICAgICAgRlRfU0VDVE9SKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpKTsKKwkJYnJlYWs7CisJY2FzZSBvdmVycnVuX2Vycm9yOgorCQkvKiAgZ290IGFuIG92ZXJydW4gZXJyb3Igb24gdGhlIGZpcnN0IGJ5dGUsIG11c3QgYmUgYQorCQkgKiAgaGFyZHdhcmUgcHJvYmxlbQorCQkgKi8KKwkJVFJBQ0UoZnRfdF9idWcsCisJCSAgICAgICJVbmV4cGVjdGVkIGVycm9yOiBmYWlsaW5nIERNQSBvciBGREMgY29udHJvbGxlciA/Iik7CisJCWJyZWFrOworCWNhc2UgZGF0YV9jcmNfZXJyb3I6CisJCVRSQUNFKGZ0X3RfZmxvdywgIkVycm9yIGluIHNlY3RvciAlZCIsCisJCSAgICAgIEZUX1NFQ1RPUihidWZmLT5zZWN0b3Jfb2Zmc2V0IC0gMSkpOworCQlicmVhazsKKwljYXNlIGlkX2NyY19lcnJvcjoKKwljYXNlIGlkX2FtX2Vycm9yOgorCWNhc2UgZGF0YV9hbV9lcnJvcjoKKwkJVFJBQ0UoZnRfdF9mbG93LCAiRXJyb3IgaW4gc2VjdG9yICVkIiwKKwkJICAgICAgRlRfU0VDVE9SKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVFJBQ0UoZnRfdF9mbG93LCAiVW5leHBlY3RlZCBlcnJvciBhdCBzZWN0b3IgJWQiLAorCQkgICAgICBGVF9TRUNUT1IoYnVmZi0+c2VjdG9yX29mZnNldCkpOworCQlicmVhazsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworLyoKKyAqICBFcnJvciBjYXVzZTogICBBbW91bnQgeGZlcnJlZDogIEFjdGlvbjoKKyAqCisgKiAgaWRfYW1fZXJyb3IgICAgICAgICAwICAgICAgICAgICBtYXJrIGJhZCBhbmQgc2tpcAorICogIGlkX2NyY19lcnJvciAgICAgICAgMCAgICAgICAgICAgbWFyayBiYWQgYW5kIHNraXAKKyAqICBkYXRhX2FtX2Vycm9yICAgICAgIDAgICAgICAgICAgIG1hcmsgYmFkIGFuZCBza2lwCisgKiAgZGF0YV9jcmNfZXJyb3IgICAgJSAxMDI0ICAgICAgICBtYXJrIGJhZCBhbmQgc2tpcAorICogIG5vX2RhdGFfZXJyb3IgICAgICAgMCAgICAgICAgICAgcmV0cnkgb24gd3JpdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmsgYmFkIGFuZCBza2lwIG9uIHJlYWQKKyAqICBvdmVycnVuX2Vycm9yICBbIDAuLmFsbC0xIF0gICAgIG1hcmsgYmFkIGFuZCBza2lwCisgKiAgbm9fZXJyb3IgICAgICAgICAgIGFsbCAgICAgICAgICBjb250aW51ZQorICovCisKKy8qICB0aGUgYXJnIGBzZWN0b3InIGlzIHJldHVybmVkIGJ5IHRoZSBmZGMgYW5kIHRlbGxzIHVzIGF0IHdoaWNoIHNlY3RvciB3ZQorICogIGFyZSBwb3NpdGlvbmVkIGF0IChyZWxhdGl2ZSB0byBzdGFydGluZyBzZWN0b3Igb2Ygc2VnbWVudCkKKyAqLworc3RhdGljIHZvaWQgZGV0ZXJtaW5lX3ZlcmlmeV9wcm9ncmVzcyhidWZmZXJfc3RydWN0ICpidWZmLAorCQkJCSAgICAgIGVycm9yX2NhdXNlIGNhdXNlLAorCQkJCSAgICAgIF9fdTggc2VjdG9yKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoY2F1c2UgPT0gbm9fZXJyb3IgJiYgc2VjdG9yID09IDEpIHsKKwkJYnVmZi0+c2VjdG9yX29mZnNldCA9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7CisJCWJ1ZmYtPnJlbWFpbmluZyAgICAgPSAwOworCQlpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9mbG93KSB7CisJCQlwcmludF9wcm9ncmVzcyhidWZmLCBjYXVzZSk7CisJCX0KKwl9IGVsc2UgeworCQlidWZmLT5zZWN0b3Jfb2Zmc2V0ID0gc2VjdG9yIC0gYnVmZi0+c2VjdDsKKwkJYnVmZi0+cmVtYWluaW5nID0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIlc3NlY3RvciBvZmZzZXQ6IDB4JTA0eCIsIAorCQkgICAgICAoY2F1c2UgPT0gbm9fZXJyb3IpID8gInVuZXhwZWN0ZWQgIiA6ICIiLAorCQkgICAgICBidWZmLT5zZWN0b3Jfb2Zmc2V0KTsKKwkJc3dpdGNoIChjYXVzZSkgeworCQljYXNlIG92ZXJydW5fZXJyb3I6CisJCQlicmVhazsKKyNpZiAwCisJCWNhc2Ugbm9fZGF0YV9lcnJvcjoKKwkJCWJ1ZmYtPnJldHJ5ID0gRlRfU09GVF9SRVRSSUVTOworCQkJaWYgKGJ1ZmYtPmhhcmRfZXJyb3JfbWFwICAgICYmCisJCQkgICAgYnVmZi0+c2VjdG9yX29mZnNldCA+IDEgJiYKKwkJCSAgICAoYnVmZi0+aGFyZF9lcnJvcl9tYXAgJiAKKwkJCSAgICAgKDEgPDwgKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQtMikpKSkgeworCQkJCWJ1ZmYtPnJldHJ5IC0tOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCWJ1ZmYtPnJldHJ5ID0gRlRfU09GVF9SRVRSSUVTOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfZmxvdykgeworCQkJcHJpbnRfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UpOworCQl9CisJCS8qICBTZWN0b3Jfb2Zmc2V0IHBvaW50cyB0byB0aGUgcHJvYmxlbSBhcmVhIE5vdyBhZGp1c3QKKwkJICogIHNlY3Rvcl9vZmZzZXQgc28gaXQgYWx3YXlzIHBvaW50cyBvbmUgcGFzdCBoZSBmYWlsaW5nCisJCSAqICBzZWN0b3IuIEkuZS4gc2tpcCB0aGUgYmFkIHNlY3Rvci4KKwkJICovCisJCSsrYnVmZi0+c2VjdG9yX29mZnNldDsKKwkJLS1idWZmLT5yZW1haW5pbmc7CisJCXVwZGF0ZV9lcnJvcl9tYXBzKGJ1ZmYsIGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgLSAxKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIHZvaWQgZGV0ZXJtaW5lX3Byb2dyZXNzKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsCisJCQkgICAgICAgZXJyb3JfY2F1c2UgY2F1c2UsCisJCQkgICAgICAgX191OCBzZWN0b3IpCit7CisJdW5zaWduZWQgaW50IGRtYV9yZXNpZHVlOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiAgVXNpbmcgbGVzcyBwcmVmZXJyZWQgb3JkZXIgb2YgZGlzYWJsZV9kbWEgYW5kCisJICogIGdldF9kbWFfcmVzaWR1ZSBiZWNhdXNlIHRoaXMgc2VlbXMgdG8gZmFpbCBvbiBhdCBsZWFzdCBvbmUKKwkgKiAgc3lzdGVtIGlmIHJldmVyc2VkIQorCSAqLworCWRtYV9yZXNpZHVlID0gZ2V0X2RtYV9yZXNpZHVlKGZkYy5kbWEpOworCWRpc2FibGVfZG1hKGZkYy5kbWEpOworCWlmIChjYXVzZSAhPSBub19lcnJvciB8fCBkbWFfcmVzaWR1ZSAhPSAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIlc0RNQSByZXNpZHVlOiAweCUwNHgiLCAKKwkJICAgICAgKGNhdXNlID09IG5vX2Vycm9yKSA/ICJ1bmV4cGVjdGVkICIgOiAiIiwKKwkJICAgICAgZG1hX3Jlc2lkdWUpOworCQkvKiBhZGp1c3QgdG8gYWN0dWFsIHZhbHVlOiAqLworCQlpZiAoZG1hX3Jlc2lkdWUgPT0gMCkgeworCQkJLyogdGhpcyBoYXBwZW5zIHNvbWV0aW1lcyB3aXRoIG92ZXJydW4gZXJyb3JzLgorCQkJICogSSBkb24ndCBrbm93IHdoZXRoZXIgd2UgY291bGQgaWdub3JlIHRoZQorCQkJICogb3ZlcnJ1biBlcnJvci4gUGxheSBzYXZlLgorCQkJICovCisJCQlidWZmLT5zZWN0b3JfY291bnQgLS07CisJCX0gZWxzZSB7CisJCQlidWZmLT5zZWN0b3JfY291bnQgLT0gKChkbWFfcmVzaWR1ZSArIAorCQkJCQkJKEZUX1NFQ1RPUl9TSVpFIC0gMSkpIC8KKwkJCQkJICAgICAgIEZUX1NFQ1RPUl9TSVpFKTsKKwkJfQorCX0KKwkvKiAgVXBkYXRlIHZhcidzIGluZmx1ZW5jZWQgYnkgdGhlIERNQSBvcGVyYXRpb24uCisJICovCisJaWYgKGJ1ZmYtPnNlY3Rvcl9jb3VudCA+IDApIHsKKwkJYnVmZi0+c2VjdG9yX29mZnNldCAgICs9IGJ1ZmYtPnNlY3Rvcl9jb3VudDsKKwkJYnVmZi0+ZGF0YV9vZmZzZXQgICAgICs9IGJ1ZmYtPnNlY3Rvcl9jb3VudDsKKwkJYnVmZi0+cHRyICAgICAgICAgICAgICs9IChidWZmLT5zZWN0b3JfY291bnQgKgorCQkJCQkgIEZUX1NFQ1RPUl9TSVpFKTsKKwkJYnVmZi0+cmVtYWluaW5nICAgICAgIC09IGJ1ZmYtPnNlY3Rvcl9jb3VudDsKKwkJYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPj49IGJ1ZmYtPnNlY3Rvcl9jb3VudDsKKwl9CisJaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfZmxvdykgeworCQlwcmludF9wcm9ncmVzcyhidWZmLCBjYXVzZSk7CisJfQorCWlmIChjYXVzZSAhPSBub19lcnJvcikgeworCQlpZiAoYnVmZi0+cmVtYWluaW5nID09IDApIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgImZvbz9cbiIKKwkJCSAgICAgIEtFUk5fSU5GTyAiY291bnQgOiAlZFxuIgorCQkJICAgICAgS0VSTl9JTkZPICJvZmZzZXQ6ICVkXG4iCisJCQkgICAgICBLRVJOX0lORk8gInNvZnQgIDogJTA4eFxuIgorCQkJICAgICAgS0VSTl9JTkZPICJoYXJkICA6ICUwOHgiLAorCQkJICAgICAgYnVmZi0+c2VjdG9yX2NvdW50LAorCQkJICAgICAgYnVmZi0+c2VjdG9yX29mZnNldCwKKwkJCSAgICAgIGJ1ZmYtPnNvZnRfZXJyb3JfbWFwLAorCQkJICAgICAgYnVmZi0+aGFyZF9lcnJvcl9tYXApOworCQl9CisJCS8qICBTZWN0b3Jfb2Zmc2V0IHBvaW50cyB0byB0aGUgcHJvYmxlbSBhcmVhLCBleGNlcHQgaWYgd2UgZ290CisJCSAqICBhIGRhdGFfY3JjX2Vycm9yLiBJbiB0aGF0IGNhc2UgaXQgcG9pbnRzIG9uZSBwYXN0IHRoZQorCQkgKiAgZmFpbGluZyBzZWN0b3IuCisJCSAqCisJCSAqICBOb3cgYWRqdXN0IHNlY3Rvcl9vZmZzZXQgc28gaXQgYWx3YXlzIHBvaW50cyBvbmUgcGFzdCBoZQorCQkgKiAgZmFpbGluZyBzZWN0b3IuIEkuZS4gc2tpcCB0aGUgYmFkIHNlY3Rvci4gIAorCQkgKi8KKwkJaWYgKGNhdXNlICE9IGRhdGFfY3JjX2Vycm9yKSB7CisJCQlza2lwX2JhZF9zZWN0b3IoYnVmZik7CisJCX0KKwkJdXBkYXRlX2Vycm9yX21hcHMoYnVmZiwgYnVmZi0+c2VjdG9yX29mZnNldCAtIDEpOworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgaW50IGNhbGNfc3RlcHMoaW50IGNtZCkKK3sKKwlpZiAoZnRhcGVfY3VycmVudF9jeWxpbmRlciA+IGNtZCkgeworCQlyZXR1cm4gZnRhcGVfY3VycmVudF9jeWxpbmRlciAtIGNtZDsKKwl9IGVsc2UgeworCQlyZXR1cm4gZnRhcGVfY3VycmVudF9jeWxpbmRlciArIGNtZDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhdXNlX3RhcGUoaW50IHJldHJ5LCBpbnQgbW9kZSkKK3sKKwlpbnQgcmVzdWx0OworCV9fdTggb3V0WzNdID0ge0ZEQ19TRUVLLCBmdF9kcml2ZV9zZWwsIDB9OworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiAgV2UnbGwgdXNlIGEgcmF3IHNlZWsgY29tbWFuZCB0byBnZXQgdGhlIHRhcGUgdG8gcmV3aW5kIGFuZAorCSAqICBzdG9wIGZvciBhIHJldHJ5LgorCSAqLworCSsrZnRfaGlzdG9yeS5yZXdpbmRzOworCWlmIChxaWMxMTdfY21kc1tmdGFwZV9jdXJyZW50X2NvbW1hbmRdLm5vbl9pbnRyKSB7CisJCVRSQUNFKGZ0X3Rfd2FybiwgIm1vdGlvbiBjb21tYW5kIG1heSBiZSBpc3N1ZWQgdG9vIHNvb24iKTsKKwl9CisJaWYgKHJldHJ5ICYmIChtb2RlID09IGZkY19yZWFkaW5nX2RhdGEgfHwKKwkJICAgICAgbW9kZSA9PSBmZGNfcmVhZGluZ19pZCAgIHx8CisJCSAgICAgIG1vZGUgPT0gZmRjX3ZlcmlmeWluZykpIHsKKwkJZnRhcGVfY3VycmVudF9jb21tYW5kID0gUUlDX01JQ1JPX1NURVBfUEFVU0U7CisJCWZ0YXBlX21pZ2h0X2JlX29mZl90cmFjayA9IDE7CisJfSBlbHNlIHsKKwkJZnRhcGVfY3VycmVudF9jb21tYW5kID0gUUlDX1BBVVNFOworCX0KKwlvdXRbMl0gPSBjYWxjX3N0ZXBzKGZ0YXBlX2N1cnJlbnRfY29tbWFuZCk7CisJcmVzdWx0ID0gZmRjX2NvbW1hbmQob3V0LCAzKTsgLyogaXNzdWUgUUlDXzExNyBjb21tYW5kICovCisJZnRhcGVfY3VycmVudF9jeWxpbmRlciA9IG91dFsgMl07CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInFpYy1wYXVzZSBmYWlsZWQsIHN0YXR1cyA9ICVkIiwgcmVzdWx0KTsKKwl9IGVsc2UgeworCQlmdF9sb2NhdGlvbi5rbm93biAgPSAwOworCQlmdF9ydW5uZXJfc3RhdHVzICAgPSBpZGxlOworCQlmdF9oaWRlX2ludGVycnVwdCAgICAgPSAxOworCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCBjb250aW51ZV94ZmVyKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsCisJCQkgIGZkY19tb2RlX2VudW0gbW9kZSwgCisJCQkgIHVuc2lnbmVkIGludCBza2lwKQoreworCWludCB3cml0ZSA9IDA7CisgCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAobW9kZSA9PSBmZGNfd3JpdGluZ19kYXRhIHx8IG1vZGUgPT0gZmRjX2RlbGV0aW5nKSB7CisJCXdyaXRlID0gMTsKKwl9CisJLyogIFRoaXMgcGFydCBjYW4gYmUgcmVtb3ZlZCBpZiBpdCBuZXZlciBoYXBwZW5zCisJICovCisJaWYgKHNraXAgPiAwICYmCisJICAgIChmdF9ydW5uZXJfc3RhdHVzICE9IHJ1bm5pbmcgfHwKKwkgICAgICh3cml0ZSAmJiAoYnVmZi0+c3RhdHVzICE9IHdyaXRpbmcpKSB8fAorCSAgICAgKCF3cml0ZSAmJiAoYnVmZi0+c3RhdHVzICE9IHJlYWRpbmcgJiYgCisJCQkgYnVmZi0+c3RhdHVzICE9IHZlcmlmeWluZykpKSkgeworCQlUUkFDRShmdF90X2VyciwgInVuZXhwZWN0ZWQgcnVubmVyL2J1ZmZlciBzdGF0ZSAlZC8lZCIsCisJCSAgICAgIGZ0X3J1bm5lcl9zdGF0dXMsIGJ1ZmYtPnN0YXR1cyk7CisJCWJ1ZmYtPnN0YXR1cyA9IGVycm9yOworCQkvKiBmaW5pc2ggdGhpcyBidWZmZXI6ICovCisJCSh2b2lkKWZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQlmdF9ydW5uZXJfc3RhdHVzID0gYWJvcnRpbmc7CisJCWZkY19tb2RlICAgICAgICAgPSBmZGNfaWRsZTsKKwl9IGVsc2UgaWYgKGJ1ZmYtPnJlbWFpbmluZyA+IDAgJiYgZnRhcGVfY2FsY19uZXh0X2NsdXN0ZXIoYnVmZikgPiAwKSB7CisJCS8qICBzdGlsbCBzZWN0b3JzIGxlZnQgaW4gY3VycmVudCBzZWdtZW50LCBjb250aW51ZQorCQkgKiAgd2l0aCB0aGlzIHNlZ21lbnQKKwkJICovCisJCWlmIChmZGNfc2V0dXBfcmVhZF93cml0ZShidWZmLCBtb2RlKSA8IDApIHsKKwkJCS8qIGZhaWxlZCwgYWJvcnQgb3BlcmF0aW9uCisJCQkgKi8KKwkJCWJ1ZmYtPmJ5dGVzID0gYnVmZi0+cHRyIC0gYnVmZi0+YWRkcmVzczsKKwkJCWJ1ZmYtPnN0YXR1cyA9IGVycm9yOworCQkJLyogZmluaXNoIHRoaXMgYnVmZmVyOiAqLworCQkJKHZvaWQpZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfaGVhZCk7CisJCQlmdF9ydW5uZXJfc3RhdHVzID0gYWJvcnRpbmc7CisJCQlmZGNfbW9kZSAgICAgICAgID0gZmRjX2lkbGU7CisJCX0KKwl9IGVsc2UgeworCQkvKiBjdXJyZW50IHNlZ21lbnQgY29tcGxldGVkCisJCSAqLworCQl1bnNpZ25lZCBpbnQgbGFzdF9zZWdtZW50ID0gYnVmZi0+c2VnbWVudF9pZDsKKwkJaW50IGVvdCA9ICgobGFzdF9zZWdtZW50ICsgMSkgJSBmdF9zZWdtZW50c19wZXJfdHJhY2spID09IDA7CisJCXVuc2lnbmVkIGludCBuZXh0ID0gYnVmZi0+bmV4dF9zZWdtZW50OwkvKiAwIG1lYW5zIHN0b3AgISAqLworCisJCWJ1ZmYtPmJ5dGVzID0gYnVmZi0+cHRyIC0gYnVmZi0+YWRkcmVzczsKKwkJYnVmZi0+c3RhdHVzID0gZG9uZTsKKwkJYnVmZiA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCQlpZiAoZW90KSB7CisJCQkvKiAgZmluaXNoZWQgbGFzdCBzZWdtZW50IG9uIGN1cnJlbnQgdHJhY2ssCisJCQkgKiAgY2FuJ3QgY29udGludWUKKwkJCSAqLworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGxvZ2ljYWxfZW90OworCQkJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCQkJVFJBQ0VfRVhJVDsKKwkJfQorCQlpZiAobmV4dCA8PSAwKSB7CisJCQkvKiAgZG9uJ3QgY29udGludWUgd2l0aCBuZXh0IHNlZ21lbnQKKwkJCSAqLworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIm5vICVzIGFsbG93ZWQsIHN0b3BwaW5nIHRhcGUiLAorCQkJICAgICAgKHdyaXRlKSA/ICJ3cml0ZSBuZXh0IiA6ICJyZWFkIGFoZWFkIik7CisJCQlwYXVzZV90YXBlKDAsIG1vZGUpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGlkbGU7ICAvKiAgbm90IHF1aXRlIHRydWUgdW50aWwKKwkJCQkJCSAgICogIG5leHQgaXJxIAorCQkJCQkJICAgKi8KKwkJCVRSQUNFX0VYSVQ7CisJCX0KKwkJLyogIGNvbnRpbnVlIHdpdGggbmV4dCBzZWdtZW50CisJCSAqLworCQlpZiAoYnVmZi0+c3RhdHVzICE9IHdhaXRpbmcpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJhbGwgaW5wdXQgYnVmZmVycyAlcywgcGF1c2luZyB0YXBlIiwKKwkJCSAgICAgICh3cml0ZSkgPyAiZW1wdHkiIDogImZ1bGwiKTsKKwkJCXBhdXNlX3RhcGUoMCwgbW9kZSk7CisJCQlmdF9ydW5uZXJfc3RhdHVzID0gaWRsZTsgIC8qICBub3QgcXVpdGUgdHJ1ZSB1bnRpbAorCQkJCQkJICAgKiAgbmV4dCBpcnEgCisJCQkJCQkgICAqLworCQkJVFJBQ0VfRVhJVDsKKwkJfQorCQlpZiAod3JpdGUgJiYgbmV4dCAhPSBidWZmLT5zZWdtZW50X2lkKSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAKKwkJCSAgICAgICJzZWdtZW50cyBvdXQgb2Ygb3JkZXIsIGFib3J0aW5nIHdyaXRlIik7CisJCQlmdF9ydW5uZXJfc3RhdHVzID0gZG9fYWJvcnQ7CisJCQlmZGNfbW9kZSAgICAgICAgID0gZmRjX2lkbGU7CisJCQlUUkFDRV9FWElUOworCQl9CisJCWZ0YXBlX3NldHVwX25ld19zZWdtZW50KGJ1ZmYsIG5leHQsIDApOworCQlpZiAoc3RvcF9yZWFkX2FoZWFkKSB7CisJCQlidWZmLT5uZXh0X3NlZ21lbnQgPSAwOworCQkJc3RvcF9yZWFkX2FoZWFkID0gMDsKKwkJfQorCQlpZiAoZnRhcGVfY2FsY19uZXh0X2NsdXN0ZXIoYnVmZikgPT0gMCB8fAorCQkgICAgZmRjX3NldHVwX3JlYWRfd3JpdGUoYnVmZiwgbW9kZSkgIT0gMCkgeworCQkJVFJBQ0UoZnRfdF9lcnIsICJjb3VsZG4ndCBzdGFydCAlcy1haGVhZCIsCisJCQkgICAgICB3cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGRvX2Fib3J0OworCQkJZmRjX21vZGUgICAgICAgICA9IGZkY19pZGxlOworCQl9IGVsc2UgeworCQkJLyoga2VlcCBvbiBnb2luZyAqLworCQkJc3dpdGNoIChmdF9kcml2ZXJfc3RhdGUpIHsKKwkJCWNhc2UgICByZWFkaW5nOiBidWZmLT5zdGF0dXMgPSByZWFkaW5nOyAgIGJyZWFrOworCQkJY2FzZSB2ZXJpZnlpbmc6IGJ1ZmYtPnN0YXR1cyA9IHZlcmlmeWluZzsgYnJlYWs7CisJCQljYXNlICAgd3JpdGluZzogYnVmZi0+c3RhdHVzID0gd3JpdGluZzsgICBicmVhazsKKwkJCWNhc2UgIGRlbGV0aW5nOiBidWZmLT5zdGF0dXMgPSBkZWxldGluZzsgIGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlUUkFDRShmdF90X2VyciwgCisJCSAgICAgICJCVUc6IGZ0X2RyaXZlcl9zdGF0ZSAlZCBzaG91bGQgYmUgb25lIG91dCBvZiAiCisJCSAgICAgICJ7cmVhZGluZywgd3JpdGluZywgdmVyaWZ5aW5nLCBkZWxldGluZ30iLAorCQkJCSAgICAgIGZ0X2RyaXZlcl9zdGF0ZSk7CisJCQkJYnVmZi0+c3RhdHVzID0gd3JpdGUgPyB3cml0aW5nIDogcmVhZGluZzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCByZXRyeV9zZWN0b3IoYnVmZmVyX3N0cnVjdCAqYnVmZiwgCisJCQkgaW50IG1vZGUsCisJCQkgdW5zaWduZWQgaW50IHNraXApCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsICIlcyBlcnJvciwgd2lsbCByZXRyeSIsCisJICAgICAgKG1vZGUgPT0gZmRjX3dyaXRpbmdfZGF0YSB8fCBtb2RlID09IGZkY19kZWxldGluZykgPyAid3JpdGUiIDogInJlYWQiKTsKKwlwYXVzZV90YXBlKDEsIG1vZGUpOworCWZ0X3J1bm5lcl9zdGF0dXMgPSBhYm9ydGluZzsKKwlidWZmLT5zdGF0dXMgICAgID0gZXJyb3I7CisJYnVmZi0+c2tpcCAgICAgICA9IHNraXA7CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX3Jlc3VtZV9wb2ludChidWZmZXJfc3RydWN0ICpidWZmKQoreworCWludCBpID0gMDsKKwlTZWN0b3JNYXAgbWFzazsKKwlTZWN0b3JNYXAgbWFwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiAgVGhpcyBmdW5jdGlvbiBpcyB0byBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHZhcmlhYmxlcyBoYXZlIGJlZW4KKwkgKiAgdXBkYXRlZCB0byBwb2ludCBwYXN0IHRoZSBmYWlsaW5nIHNlY3Rvci4KKwkgKiAgSWYgdGhlcmUgYXJlIGFueSBzb2Z0IGVycm9ycyBiZWZvcmUgdGhlIGZhaWxpbmcgc2VjdG9yLAorCSAqICBmaW5kIHRoZSBmaXJzdCBzb2Z0IGVycm9yIGFuZCByZXR1cm4gdGhlIHNlY3RvciBvZmZzZXQuCisJICogIE90aGVyd2lzZSBmaW5kIHRoZSBsYXN0IGhhcmQgZXJyb3IuCisJICogIE5vdGU6IHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3Qgb25lIGhhcmQgb3Igc29mdCBlcnJvciAhCisJICovCisJaWYgKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPCAxIHx8IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPiAzMikgeworCQlUUkFDRShmdF90X2J1ZywgIkJVRzogc2VjdG9yX29mZnNldCA9ICVkIiwKKwkJICAgICAgYnVmZi0+c2VjdG9yX29mZnNldCk7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPj0gMzIpIHsgLyogQy1saW1pdGF0aW9uIG9uIHNoaWZ0ICEgKi8KKwkJbWFzayA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkJbWFzayA9ICgxIDw8IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpIC0gMTsKKwl9CisJbWFwID0gYnVmZi0+c29mdF9lcnJvcl9tYXAgJiBtYXNrOworCWlmIChtYXApIHsKKwkJd2hpbGUgKChtYXAgJiAoMSA8PCBpKSkgPT0gMCkgeworCQkJKytpOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJhdCBzZWN0b3IgJWQiLCBGVF9TRUNUT1IoaSkpOworCX0gZWxzZSB7CisJCW1hcCA9IGJ1ZmYtPmhhcmRfZXJyb3JfbWFwICYgbWFzazsKKwkJaSA9IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgLSAxOworCQlpZiAobWFwKSB7CisJCQl3aGlsZSAoKG1hcCAmICgxIDw8IGkpKSA9PSAwKSB7CisJCQkJLS1pOworCQkJfQorCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImFmdGVyIHNlY3RvciAlZCIsIEZUX1NFQ1RPUihpKSk7CisJCQkrK2k7IC8qIGZpcnN0IHNlY3RvciBhZnRlciBsYXN0IGhhcmQgZXJyb3IgKi8KKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfYnVnLCAiQlVHOiBubyBzb2Z0IG9yIGhhcmQgZXJyb3JzIik7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCBpOworfQorCisvKiAgY2hlY2sgcG9zc2libGUgZG1hIHJlc2lkdWUgd2hlbiBmb3JtYXR0aW5nLCB1cGRhdGUgcG9zaXRpb24gcmVjb3JkIGluCisgKiAgYnVmZmVyIHN0cnVjdC4gVGhpcyBpcywgb2YgY291cnNlLCBtb2RlbGxlZCBhZnRlciBkZXRlcm1pbmVfcHJvZ3Jlc3MoKSwgYnV0CisgKiAgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdXAgZm9yIHJldHJpZXMgYmVjYXVzZSB0aGUgZm9ybWF0IHByb2Nlc3MgY2Fubm90IGJlCisgKiAgaW50ZXJydXB0ZWQgKGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSB0YXBlIHRyYWNrKS4KKyAqLworc3RhdGljIGludCBkZXRlcm1pbmVfZm10X3Byb2dyZXNzKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsIGVycm9yX2NhdXNlIGNhdXNlKQoreworCXVuc2lnbmVkIGludCBkbWFfcmVzaWR1ZTsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIFVzaW5nIGxlc3MgcHJlZmVycmVkIG9yZGVyIG9mIGRpc2FibGVfZG1hIGFuZAorCSAqICBnZXRfZG1hX3Jlc2lkdWUgYmVjYXVzZSB0aGlzIHNlZW1zIHRvIGZhaWwgb24gYXQgbGVhc3Qgb25lCisJICogIHN5c3RlbSBpZiByZXZlcnNlZCEKKwkgKi8KKwlkbWFfcmVzaWR1ZSA9IGdldF9kbWFfcmVzaWR1ZShmZGMuZG1hKTsKKwlkaXNhYmxlX2RtYShmZGMuZG1hKTsKKwlpZiAoY2F1c2UgIT0gbm9fZXJyb3IgfHwgZG1hX3Jlc2lkdWUgIT0gMCkgeworCQlUUkFDRShmdF90X2luZm8sICJETUEgcmVzaWR1ZSA9IDB4JTA0eCIsIGRtYV9yZXNpZHVlKTsKKwkJZmRjX21vZGUgPSBmZGNfaWRsZTsKKwkJc3dpdGNoKGNhdXNlKSB7CisJCWNhc2Ugbm9fZXJyb3I6CisJCQlmdF9ydW5uZXJfc3RhdHVzID0gYWJvcnRpbmc7CisJCQlidWZmLT5zdGF0dXMgPSBpZGxlOworCQkJYnJlYWs7CisJCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJCS8qICBnb3QgYW4gb3ZlcnJ1biBlcnJvciBvbiB0aGUgZmlyc3QgYnl0ZSwgbXVzdCBiZSBhCisJCQkgKiAgaGFyZHdhcmUgcHJvYmxlbSAKKwkJCSAqLworCQkJVFJBQ0UoZnRfdF9idWcsIAorCQkJICAgICAgIlVuZXhwZWN0ZWQgZXJyb3I6IGZhaWxpbmcgRE1BIGNvbnRyb2xsZXIgPyIpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGRvX2Fib3J0OworCQkJYnVmZi0+c3RhdHVzID0gZXJyb3I7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJVbmV4cGVjdGVkIGVycm9yIGF0IHNlZ21lbnQgJWQiLAorCQkJICAgICAgYnVmZi0+c2VnbWVudF9pZCk7CisJCQlmdF9ydW5uZXJfc3RhdHVzID0gZG9fYWJvcnQ7CisJCQlidWZmLT5zdGF0dXMgPSBlcnJvcjsKKwkJCWJyZWFrOworCQl9CisJCVRSQUNFX0VYSVQgLUVJTzsgLyogY2FuIG9ubHkgcmV0cnkgZW50aXJlIHRyYWNrIGluIGZvcm1hdCBtb2RlCisJCQkJICAqLworCX0KKwkvKiAgVXBkYXRlIHZhcidzIGluZmx1ZW5jZWQgYnkgdGhlIERNQSBvcGVyYXRpb24uCisJICovCisJYnVmZi0+cHRyICAgICAgICAgICAgICs9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgKiA0OworCWJ1ZmYtPmJ5dGVzICAgICAgICAgICAtPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICogNDsKKwlidWZmLT5yZW1haW5pbmcgICAgICAgLT0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVDsKKwlidWZmLT5zZWdtZW50X2lkICsrOyAvKiBkb25lIHdpdGggc2VnbWVudCAqLworCVRSQUNFX0VYSVQgMDsKK30KKworLyoKKyAqICBDb250aW51ZSBmb3JtYXR0aW5nLCBzd2l0Y2ggYnVmZmVycyBpZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQgaW4KKyAqICBjdXJyZW50IGJ1ZmZlci4gVGhpcyBpcywgb2YgY291cnNlLCBtb2RlbGxlZCBhZnRlcgorICogIGNvbnRpbnVlX3hmZXIoKSwgYnV0IHdlIGRvbid0IG5lZWQgdG8gc2V0IHVwIGZvciByZXRyaWVzIGJlY2F1c2UKKyAqICB0aGUgZm9ybWF0IHByb2Nlc3MgY2Fubm90IGJlIGludGVycnVwdGVkIChleGNlcHQgYXQgdGhlIGVuZCBvZiB0aGUKKyAqICB0YXBlIHRyYWNrKS4KKyAqLworc3RhdGljIHZvaWQgY29udGludWVfZm9ybWF0dGluZyhidWZmZXJfc3RydWN0ICpidWZmKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoYnVmZi0+cmVtYWluaW5nIDw9IDApIHsgLyogIG5vIHNwYWNlIGxlZnQgaW4gZG1hIGJ1ZmZlciAqLworCQl1bnNpZ25lZCBpbnQgbmV4dCA9IGJ1ZmYtPm5leHRfc2VnbWVudDsgCisKKwkJaWYgKG5leHQgPT0gMCkgeyAvKiBlbmQgb2YgdGFwZSB0cmFjayAqLworCQkJYnVmZi0+c3RhdHVzICAgICA9IGRvbmU7CisJCQlmdF9ydW5uZXJfc3RhdHVzID0gbG9naWNhbF9lb3Q7CisJCQlmZGNfbW9kZSAgICAgICAgID0gZmRjX2lkbGU7CisJCQlUUkFDRShmdF90X25vaXNlLCAiRG9uZSBmb3JtYXR0aW5nIHRyYWNrICVkIiwKKwkJCSAgICAgIGZ0X2xvY2F0aW9uLnRyYWNrKTsKKwkJCVRSQUNFX0VYSVQ7CisJCX0KKwkJLyoKKwkJICogIHN3aXRjaCB0byBuZXh0IGJ1ZmZlciEKKwkJICovCisJCWJ1ZmYtPnN0YXR1cyAgID0gZG9uZTsKKwkJYnVmZiA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCisJCWlmIChidWZmLT5zdGF0dXMgIT0gd2FpdGluZyAgfHwgbmV4dCAhPSBidWZmLT5zZWdtZW50X2lkKSB7CisJCQlnb3RvIGZvcm1hdF9zZXR1cF9lcnJvcjsKKwkJfQorCX0KKwlpZiAoZmRjX3NldHVwX2Zvcm1hdHRpbmcoYnVmZikgPCAwKSB7CisJCWdvdG8gZm9ybWF0X3NldHVwX2Vycm9yOworCX0KKwlidWZmLT5zdGF0dXMgPSBmb3JtYXR0aW5nOworCVRSQUNFKGZ0X3RfZmRjX2RtYSwgIkZvcm1hdHRpbmcgc2VnbWVudCAlZCBvbiB0cmFjayAlZCIsCisJICAgICAgYnVmZi0+c2VnbWVudF9pZCwgZnRfbG9jYXRpb24udHJhY2spOworCVRSQUNFX0VYSVQ7CisgZm9ybWF0X3NldHVwX2Vycm9yOgorCWZ0X3J1bm5lcl9zdGF0dXMgPSBkb19hYm9ydDsKKwlmZGNfbW9kZSAgICAgICAgID0gZmRjX2lkbGU7CisJYnVmZi0+c3RhdHVzICAgICA9IGVycm9yOworCVRSQUNFKGZ0X3RfZXJyLCAiRXJyb3Igc2V0dGluZyB1cCBmb3Igc2VnbWVudCAlZCBvbiB0cmFjayAlZCIsCisJICAgICAgYnVmZi0+c2VnbWVudF9pZCwgZnRfbG9jYXRpb24udHJhY2spOworCVRSQUNFX0VYSVQ7CisKK30KKworLyogIHRoaXMgaGFuZGxlcyB3cml0aW5nLCByZWFkIGlkLCByZWFkaW5nIGFuZCBmb3JtYXR0aW5nCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9mZGNfYnVzeShidWZmZXJfc3RydWN0ICpidWZmKQoreworCXN0YXRpYyBpbnQgbm9fZGF0YV9lcnJvcl9jb3VudDsKKwlpbnQgcmV0cnkgPSAwOworCWVycm9yX2NhdXNlIGNhdXNlOworCV9fdTggaW5bN107CisJaW50IHNraXA7CisJZmRjX21vZGVfZW51bSBmbW9kZSA9IGZkY19tb2RlOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoZmRjX3Jlc3VsdChpbiwgNykgPCAwKSB7IC8qIGJldHRlciBnZXQgaXQgZmFzdCAhICovCisJCVRSQUNFKGZ0X3RfZXJyLCAKKwkJICAgICAgIlByb2JhYmx5IGZhdGFsIGVycm9yIGR1cmluZyBGREMgUmVzdWx0IFBoYXNlXG4iCisJCSAgICAgIEtFUk5fSU5GTworCQkgICAgICAiZHJpdmUgbWF5IGhhbmcgdW50aWwgKHBvd2VyIG9uKSByZXNldCA6LSgiKTsKKwkJLyogIHdoYXQgdG8gZG8gbmV4dCA/Pz8/CisJCSAqLworCQlUUkFDRV9FWElUOworCX0KKwljYXVzZSA9IGRlY29kZV9pcnFfY2F1c2UoZmRjX21vZGUsIGluKTsKKyNpZmRlZiBURVNUSU5HCisJeyBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgKGludClmdF9ucl9idWZmZXJzOyArK2kpCisJCVRSQUNFKGZ0X3RfYW55LCAiYnVmZmVyWyVkXSBzdGF0dXM6ICVkLCBzZWdtZW50X2lkOiAlZCIsCisJCSAgICAgIGksIGZ0X2J1ZmZlcltpXS0+c3RhdHVzLCBmdF9idWZmZXJbaV0tPnNlZ21lbnRfaWQpOworCX0KKyNlbmRpZgorCWlmIChmbW9kZSA9PSBmZGNfcmVhZGluZ19kYXRhICYmIGZ0X2RyaXZlcl9zdGF0ZSA9PSB2ZXJpZnlpbmcpIHsKKwkJZm1vZGUgPSBmZGNfdmVyaWZ5aW5nOworCX0KKwlzd2l0Y2ggKGZtb2RlKSB7CisJY2FzZSBmZGNfdmVyaWZ5aW5nOgorCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZyB8fAorCQkgICAgZnRfcnVubmVyX3N0YXR1cyA9PSBkb19hYm9ydCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwiYWJvcnRpbmcgJXMiLGZkY19tb2RlX3R4dChmZGNfbW9kZSkpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGJ1ZmYtPnJldHJ5ID4gMCkgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAidGhpcyBpcyByZXRyeSBuciAlZCIsIGJ1ZmYtPnJldHJ5KTsKKwkJfQorCQlzd2l0Y2ggKGNhdXNlKSB7CisJCWNhc2Ugbm9fZXJyb3I6CisJCQlub19kYXRhX2Vycm9yX2NvdW50ID0gMDsKKwkJCWRldGVybWluZV92ZXJpZnlfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsKKwkJCWlmIChpblsyXSAmIDB4NDApIHsKKwkJCQkvKiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiB3aGVuIHZlcmlmeWluZworCQkJCSAqLworCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiZGVsZXRlZCBkYXRhIGluIHNlZ21lbnQgJWQvJWQiLAorCQkJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQsCisJCQkJICAgICAgRlRfU0VDVE9SKGJ1ZmYtPnNlY3Rvcl9vZmZzZXQgLSAxKSk7CisJCQkJYnVmZi0+cmVtYWluaW5nID0gMDsgLyogYWJvcnQgdHJhbnNmZXIgKi8KKwkJCQlidWZmLT5oYXJkX2Vycm9yX21hcCA9IEVNUFRZX1NFR01FTlQ7CisJCQkJc2tpcCA9IDE7CisJCQl9IGVsc2UgeworCQkJCXNraXAgPSAwOworCQkJfQorCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7CisJCQlicmVhazsKKwkJY2FzZSBub19kYXRhX2Vycm9yOgorCQkJbm9fZGF0YV9lcnJvcl9jb3VudCArKzsKKwkJY2FzZSBvdmVycnVuX2Vycm9yOgorCQkJcmV0cnkgKys7CisJCWNhc2UgaWRfYW1fZXJyb3I6CisJCWNhc2UgaWRfY3JjX2Vycm9yOgorCQljYXNlIGRhdGFfYW1fZXJyb3I6CisJCWNhc2UgZGF0YV9jcmNfZXJyb3I6CisJCQlkZXRlcm1pbmVfdmVyaWZ5X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7IAorCQkJaWYgKGNhdXNlID09IG5vX2RhdGFfZXJyb3IpIHsKKwkJCQlpZiAobm9fZGF0YV9lcnJvcl9jb3VudCA+PSAyKSB7CisJCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkJICAgICAgInJldHJ5aW5nIGJlY2F1c2Ugb2Ygc3VjY2Vzc2l2ZSAiCisJCQkJCSAgICAgICJubyBkYXRhIGVycm9ycyIpOworCQkJCQlub19kYXRhX2Vycm9yX2NvdW50ID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXRyeSAtLTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5vX2RhdGFfZXJyb3JfY291bnQgPSAwOworCQkJfQorCQkJaWYgKHJldHJ5KSB7CisJCQkJc2tpcCA9IGZpbmRfcmVzdW1lX3BvaW50KGJ1ZmYpOworCQkJfSBlbHNlIHsKKwkJCQlza2lwID0gYnVmZi0+c2VjdG9yX29mZnNldDsKKwkJCX0KKwkJCWlmIChyZXRyeSAmJiBza2lwIDwgMzIpIHsKKwkJCQlyZXRyeV9zZWN0b3IoYnVmZiwgZmRjX21vZGUsIHNraXApOworCQkJfSBlbHNlIHsKKwkJCQljb250aW51ZV94ZmVyKGJ1ZmYsIGZkY19tb2RlLCBza2lwKTsKKwkJCX0KKwkJCXVwZGF0ZV9oaXN0b3J5KGNhdXNlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogIERvbid0IGtub3cgd2h5IHRoaXMgY291bGQgaGFwcGVuIAorCQkJICogIGJ1dCBmaW5kIG91dC4KKwkJCSAqLworCQkJZGV0ZXJtaW5lX3ZlcmlmeV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOworCQkJcmV0cnlfc2VjdG9yKGJ1ZmYsIGZkY19tb2RlLCAwKTsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiRXJyb3I6IHVuZXhwZWN0ZWQgZXJyb3IiKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgZmRjX3JlYWRpbmdfZGF0YToKKyNpZmRlZiBURVNUSU5HCisJCS8qIEknbSBzb3JyeSwgYnV0OiBOT0JPRFkgZXZlciB1c2VkIHRoaXMgdHJhY2UKKwkJICogbWVzc2FnZXMgZm9yIGFnZXMuIEkgZ3Vlc3MgdGhhdCBCYXMgd2FzIHRoZSBsYXN0IHBlcnNvbgorCQkgKiB0aGF0IGV2ZXIgcmVhbGx5IHVzZWQgdGhpcyAodGhhbmsgeW91LCBiZXR3ZWVuIHRoZSBsaW5lcykKKwkJICovCisJCWlmIChjYXVzZSA9PSBub19lcnJvcikgeworCQkJVFJBQ0UoZnRfdF9mbG93LCJyZWFkaW5nIHNlZ21lbnQgJWQiLGJ1ZmYtPnNlZ21lbnRfaWQpOworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVycm9yIHJlYWRpbmcgc2VnbWVudCAlZCIsCisJCQkgICAgICBidWZmLT5zZWdtZW50X2lkKTsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKKwkJCSAgICAgIEtFUk5fSU5GTworCQkJICAgICAiSVJROkM6IDB4JTAyeCwgSDogMHglMDJ4LCBSOiAweCUwMngsIE46IDB4JTAyeFxuIgorCQkJICAgICAgS0VSTl9JTkZPCisJCQkgICAgICAiQlVGOkM6IDB4JTAyeCwgSDogMHglMDJ4LCBSOiAweCUwMngiLAorCQkJICAgICAgaW5bM10sIGluWzRdLCBpbls1XSwgaW5bNl0sCisJCQkgICAgICBidWZmLT5jeWwsIGJ1ZmYtPmhlYWQsIGJ1ZmYtPnNlY3QpOworCQl9CisjZW5kaWYKKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcgfHwKKwkJICAgIGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsImFib3J0aW5nICVzIixmZGNfbW9kZV90eHQoZmRjX21vZGUpKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChidWZmLT5iYWRfc2VjdG9yX21hcCA9PSBGQUtFX1NFR01FTlQpIHsKKwkJCS8qIFRoaXMgY29uZGl0aW9uIG9jY3VycyB3aGVuIHJlYWRpbmcgYSBgZmFrZScKKwkJCSAqIHNlY3RvciB0aGF0J3Mgbm90IGFjY2Vzc2libGUuIERvZXNuJ3QKKwkJCSAqIHJlYWxseSBtYXR0ZXIgYXMgd2Ugd291bGQgaGF2ZSBpZ25vcmVkIGl0CisJCQkgKiBhbnl3YXkgIQorCQkJICoKKwkJCSAqIENoYW5jZSBpcyB0aGF0IHdlJ3JlIHBhc3QgdGhlIG5leHQgc2VnbWVudAorCQkJICogbm93LCBzbyB0aGUgbmV4dCBvcGVyYXRpb24gbWF5IGZhaWwgYW5kCisJCQkgKiByZXN1bHQgaW4gYSByZXRyeS4gIAorCQkJICovCisJCQlidWZmLT5yZW1haW5pbmcgPSAwOwkvKiBza2lwIGZhaWxpbmcgc2VjdG9yICovCisJCQkvKiBidWZmLT5wdHIgICAgICAgPSBidWZmLT5hZGRyZXNzOyAqLworCQkJLyogZmFrZSBzdWNjZXNzOiAqLworCQkJY29udGludWVfeGZlcihidWZmLCBmZGNfbW9kZSwgMSk7CisJCQkvKiAgdHJhY2UgY2FsbHMgYXJlIGV4cGVuc2l2ZTogcGxhY2UgdGhlbSBBRlRFUgorCQkJICogIHRoZSByZWFsIHN0dWZmIGhhcyBiZWVuIGRvbmUuCisJCQkgKiAgCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJza2lwcGluZyBlbXB0eSBzZWdtZW50ICVkIChyZWFkKSwgc2l6ZT8gJWQiLAorCQkJICAgICAgYnVmZi0+c2VnbWVudF9pZCwgYnVmZi0+cHRyIC0gYnVmZi0+YWRkcmVzcyk7CisJCQlUUkFDRV9FWElUOworCQl9CisJCWlmIChidWZmLT5yZXRyeSA+IDApIHsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInRoaXMgaXMgcmV0cnkgbnIgJWQiLCBidWZmLT5yZXRyeSk7CisJCX0KKwkJc3dpdGNoIChjYXVzZSkgeworCQljYXNlIG5vX2Vycm9yOgorCQkJZGV0ZXJtaW5lX3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7CisJCQlpZiAoaW5bMl0gJiAweDQwKSB7CisJCQkJLyogIEhhbmRsZSBkZWxldGVkIGRhdGEgaW4gaGVhZGVyIHNlZ21lbnRzLgorCQkJCSAqICBTa2lwIHNlZ21lbnQgYW5kIGZvcmNlIHJlYWQtYWhlYWQuCisJCQkJICovCisJCQkJVFJBQ0UoZnRfdF93YXJuLAorCQkJCSAgICAgICJkZWxldGVkIGRhdGEgaW4gc2VnbWVudCAlZC8lZCIsCisJCQkJICAgICAgYnVmZi0+c2VnbWVudF9pZCwKKwkJCQkgICAgICBGVF9TRUNUT1IoYnVmZi0+c2VjdG9yX29mZnNldCAtIDEpKTsKKwkJCQlidWZmLT5kZWxldGVkID0gMTsKKwkJCQlidWZmLT5yZW1haW5pbmcgPSAwOy8qYWJvcnQgdHJhbnNmZXIgKi8KKwkJCQlidWZmLT5zb2Z0X2Vycm9yX21hcCB8PQorCQkJCQkJKC0xTCA8PCBidWZmLT5zZWN0b3Jfb2Zmc2V0KTsKKwkJCQlpZiAoYnVmZi0+c2VnbWVudF9pZCA9PSAwKSB7CisJCQkJCS8qIHN0b3Agb24gbmV4dCBzZWdtZW50ICovCisJCQkJCXN0b3BfcmVhZF9haGVhZCA9IDE7CisJCQkJfQorCQkJCS8qIGZvcmNlIHJlYWQtYWhlYWQ6ICovCisJCQkJYnVmZi0+bmV4dF9zZWdtZW50ID0gCisJCQkJCWJ1ZmYtPnNlZ21lbnRfaWQgKyAxOworCQkJCXNraXAgPSAoRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIAorCQkJCQlidWZmLT5zZWN0b3Jfb2Zmc2V0KTsKKwkJCX0gZWxzZSB7CisJCQkJc2tpcCA9IDA7CisJCQl9CisJCQljb250aW51ZV94ZmVyKGJ1ZmYsIGZkY19tb2RlLCBza2lwKTsKKwkJCWJyZWFrOworCQljYXNlIG5vX2RhdGFfZXJyb3I6CisJCQkvKiBUYXBlIHN0YXJ0ZWQgdG9vIGZhciBhaGVhZCBvZiBvciBiZWhpbmQgdGhlCisJCQkgKiByaWdodCBzZWN0b3IuICBUaGlzIG1heSBhbHNvIGhhcHBlbiBpbiB0aGUKKwkJCSAqIG1pZGRsZSBvZiBhIHNlZ21lbnQgIQorCQkJICoKKwkJCSAqIEhhbmRsZSBuby1kYXRhIGFzIHNvZnQgZXJyb3IuIElmIG5leHQKKwkJCSAqIHNlY3RvciBmYWlscyB0b28sIGEgcmV0cnkgKHdpdGggbmVlZGVkCisJCQkgKiByZXBvc2l0aW9uKSB3aWxsIGZvbGxvdy4KKwkJCSAqLworCQkJcmV0cnkgKys7CisJCWNhc2UgaWRfYW1fZXJyb3I6CisJCWNhc2UgaWRfY3JjX2Vycm9yOgorCQljYXNlIGRhdGFfYW1fZXJyb3I6CisJCWNhc2UgZGF0YV9jcmNfZXJyb3I6CisJCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJCXJldHJ5ICs9IChidWZmLT5zb2Z0X2Vycm9yX21hcCAhPSAwIHx8CisJCQkJICBidWZmLT5oYXJkX2Vycm9yX21hcCAhPSAwKTsKKwkJCWRldGVybWluZV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOyAKKyNpZiAxIHx8IGRlZmluZWQoVEVTVElORykKKwkJCWlmIChjYXVzZSA9PSBvdmVycnVuX2Vycm9yKSByZXRyeSArKzsKKyNlbmRpZgorCQkJaWYgKHJldHJ5KSB7CisJCQkJc2tpcCA9IGZpbmRfcmVzdW1lX3BvaW50KGJ1ZmYpOworCQkJfSBlbHNlIHsKKwkJCQlza2lwID0gYnVmZi0+c2VjdG9yX29mZnNldDsKKwkJCX0KKwkJCS8qICBUcnkgdG8gcmVzdW1lIHdpdGggbmV4dCBzZWN0b3Igb24gc2luZ2xlCisJCQkgKiAgZXJyb3JzIChsZXQgZWNjIGNvcnJlY3QgaXQpLCBidXQgcmV0cnkgb24KKwkJCSAqICBub19kYXRhICh3ZSdsbCBiZSBwYXN0IHRoZSB0YXJnZXQgd2hlbiB3ZQorCQkJICogIGdldCBoZXJlIHNvIHdlIGNhbm5vdCByZXRyeSkgb3Igb24KKwkJCSAqICBtdWx0aXBsZSBlcnJvcnMgKHJlZHVjZSBjaGFuY2Ugb24gZWNjCisJCQkgKiAgZmFpbHVyZSkuCisJCQkgKi8KKwkJCS8qICBjSDogMjMvMDIvOTc6IGlmIHRoZSBsYXN0IHNlY3RvciBpbiB0aGUgCisJCQkgKiAgc2VnbWVudCB3YXMgYSBoYXJkIGVycm9yLCB0aGVuIHRoZXJlIGlzIAorCQkJICogIG5vIHNlbnNlIGluIGEgcmV0cnkuIFRoaXMgb2NjYXNpb24gc2VsZG9tCisJCQkgKiAgb2NjdXJzIGJ1dCAuLi4gQDqzsrhgQCUmpyQKKwkJCSAqLworCQkJaWYgKHJldHJ5ICYmIHNraXAgPCAzMikgeworCQkJCXJldHJ5X3NlY3RvcihidWZmLCBmZGNfbW9kZSwgc2tpcCk7CisJCQl9IGVsc2UgeworCQkJCWNvbnRpbnVlX3hmZXIoYnVmZiwgZmRjX21vZGUsIHNraXApOworCQkJfQorCQkJdXBkYXRlX2hpc3RvcnkoY2F1c2UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiAgRG9uJ3Qga25vdyB3aHkgdGhpcyBjb3VsZCBoYXBwZW4gCisJCQkgKiAgYnV0IGZpbmQgb3V0LgorCQkJICovCisJCQlkZXRlcm1pbmVfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UsIGluWzVdKTsKKwkJCXJldHJ5X3NlY3RvcihidWZmLCBmZGNfbW9kZSwgMCk7CisJCQlUUkFDRShmdF90X2VyciwgIkVycm9yOiB1bmV4cGVjdGVkIGVycm9yIik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIGZkY19yZWFkaW5nX2lkOgorCQlpZiAoY2F1c2UgPT0gbm9fZXJyb3IpIHsKKwkJCWZkY19jeWwgPSBpblszXTsKKwkJCWZkY19oZWFkID0gaW5bNF07CisJCQlmZGNfc2VjdCA9IGluWzVdOworCQkJVFJBQ0UoZnRfdF9mZGNfZG1hLAorCQkJICAgICAgImlkIHJlYWQ6IEM6IDB4JTAyeCwgSDogMHglMDJ4LCBSOiAweCUwMngiLAorCQkJICAgICAgZmRjX2N5bCwgZmRjX2hlYWQsIGZkY19zZWN0KTsKKwkJfSBlbHNlIHsJLyogbm8gdmFsaWQgaW5mb3JtYXRpb24sIHVzZSBpbnZhbGlkIHNlY3RvciAqLworCQkJZmRjX2N5bCA9IGZkY19oZWFkID0gZmRjX3NlY3QgPSAwOworCQkJVFJBQ0UoZnRfdF9mbG93LCAiRGlkbid0IGZpbmQgdmFsaWQgc2VjdG9yIElkIik7CisJCX0KKwkJZmRjX21vZGUgPSBmZGNfaWRsZTsKKwkJYnJlYWs7CisJY2FzZSBmZGNfZGVsZXRpbmc6CisJY2FzZSBmZGNfd3JpdGluZ19kYXRhOgorI2lmZGVmIFRFU1RJTkcKKwkJaWYgKGNhdXNlID09IG5vX2Vycm9yKSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJ3cml0aW5nIHNlZ21lbnQgJWQiLCBidWZmLT5zZWdtZW50X2lkKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlcnJvciB3cml0aW5nIHNlZ21lbnQgJWQiLAorCQkJICAgICAgYnVmZi0+c2VnbWVudF9pZCk7CisJCX0KKyNlbmRpZgorCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZyB8fAorCQkgICAgZnRfcnVubmVyX3N0YXR1cyA9PSBkb19hYm9ydCkgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAiYWJvcnRpbmcgJXMiLGZkY19tb2RlX3R4dChmZGNfbW9kZSkpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGJ1ZmYtPnJldHJ5ID4gMCkgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAidGhpcyBpcyByZXRyeSBuciAlZCIsIGJ1ZmYtPnJldHJ5KTsKKwkJfQorCQlpZiAoYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPT0gRkFLRV9TRUdNRU5UKSB7CisJCQkvKiBUaGlzIGNvbmRpdGlvbiBvY2N1cnMgd2hlbiB0cnlpbmcgdG8gd3JpdGUgdG8gYQorCQkJICogYGZha2UnIHNlY3RvciB0aGF0J3Mgbm90IGFjY2Vzc2libGUuIERvZXNuJ3QgcmVhbGx5CisJCQkgKiBtYXR0ZXIgYXMgaXQgaXNuJ3QgdXNlZCBhbnl3YXkgISBNaWdodCBiZSBsb2NhdGVkCisJCQkgKiBhdCB3cm9uZyBzZWdtZW50LCB0aGVuIHdlJ2xsIGZhaWwgb24gdGhlIG5leHQKKwkJCSAqIHNlZ21lbnQuCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJza2lwcGluZyBlbXB0eSBzZWdtZW50ICh3cml0ZSkiKTsKKwkJCWJ1ZmYtPnJlbWFpbmluZyA9IDA7CS8qIHNraXAgZmFpbGluZyBzZWN0b3IgKi8KKwkJCS8qIGZha2Ugc3VjY2VzczogKi8KKwkJCWNvbnRpbnVlX3hmZXIoYnVmZiwgZmRjX21vZGUsIDEpOworCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChjYXVzZSkgeworCQljYXNlIG5vX2Vycm9yOgorCQkJZGV0ZXJtaW5lX3Byb2dyZXNzKGJ1ZmYsIGNhdXNlLCBpbls1XSk7CisJCQljb250aW51ZV94ZmVyKGJ1ZmYsIGZkY19tb2RlLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIG5vX2RhdGFfZXJyb3I6CisJCWNhc2UgaWRfYW1fZXJyb3I6CisJCWNhc2UgaWRfY3JjX2Vycm9yOgorCQljYXNlIGRhdGFfYW1fZXJyb3I6CisJCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJCXVwZGF0ZV9oaXN0b3J5KGNhdXNlKTsKKwkJCWRldGVybWluZV9wcm9ncmVzcyhidWZmLCBjYXVzZSwgaW5bNV0pOworCQkJc2tpcCA9IGZpbmRfcmVzdW1lX3BvaW50KGJ1ZmYpOworCQkJcmV0cnlfc2VjdG9yKGJ1ZmYsIGZkY19tb2RlLCBza2lwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGluWzFdICYgMHgwMikgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAibWVkaWEgbm90IHdyaXRhYmxlIik7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfYnVnLCAidW5mb3Jlc2VlbiB3cml0ZSBlcnJvciIpOworCQkJfQorCQkJZmRjX21vZGUgPSBmZGNfaWRsZTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOyAvKiBmZGNfZGVsZXRpbmcgfHwgZmRjX3dyaXRpbmdfZGF0YSAqLworCWNhc2UgZmRjX2Zvcm1hdHRpbmc6CisJCS8qICBUaGUgaW50ZXJydXB0IGNvbWVzIGFmdGVyIGZvcm1hdHRpbmcgYSBzZWdtZW50LiBXZSB0aGVuCisJCSAqICBoYXZlIHRvIHNldCB1cCBRVUlDS0xZIGZvciB0aGUgbmV4dCBzZWdtZW50LiBCdXQKKwkJICogIGFmdGVyd2FyZHMsIHRoZXJlIGlzIHBsZW50eSBvZiB0aW1lLgorCQkgKi8KKwkJc3dpdGNoIChjYXVzZSkgeworCQljYXNlIG5vX2Vycm9yOgorCQkJLyogIHdvdWxkIGxpa2UgdG8ga2VlcCBtb3N0IG9mIHRoZSBmb3JtYXR0aW5nIHN0dWZmCisJCQkgKiAgb3V0c2lkZSB0aGUgaXNyIGNvZGUsIGJ1dCB0aW1pbmcgaXMgdG9vIGNyaXRpY2FsCisJCQkgKi8KKwkJCWlmIChkZXRlcm1pbmVfZm10X3Byb2dyZXNzKGJ1ZmYsIGNhdXNlKSA+PSAwKSB7CisJCQkJY29udGludWVfZm9ybWF0dGluZyhidWZmKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIG5vX2RhdGFfZXJyb3I6CisJCWNhc2UgaWRfYW1fZXJyb3I6CisJCWNhc2UgaWRfY3JjX2Vycm9yOgorCQljYXNlIGRhdGFfYW1fZXJyb3I6CisJCWNhc2Ugb3ZlcnJ1bl9lcnJvcjoKKwkJZGVmYXVsdDoKKwkJCWRldGVybWluZV9mbXRfcHJvZ3Jlc3MoYnVmZiwgY2F1c2UpOworCQkJdXBkYXRlX2hpc3RvcnkoY2F1c2UpOworCQkJaWYgKGluWzFdICYgMHgwMikgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAibWVkaWEgbm90IHdyaXRhYmxlIik7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfYnVnLCAidW5mb3Jlc2VlbiB3cml0ZSBlcnJvciIpOworCQkJfQorCQkJYnJlYWs7CisJCX0gLyogY2F1c2UgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVFJBQ0UoZnRfdF93YXJuLCAiV2FybmluZzogdW5leHBlY3RlZCBpcnEgZHVyaW5nOiAlcyIsCisJCSAgICAgIGZkY19tb2RlX3R4dChmZGNfbW9kZSkpOworCQlmZGNfbW9kZSA9IGZkY19pZGxlOworCQlicmVhazsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworLyogICAgICBGREMgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKyAqLwordm9pZCBmZGNfaXNyKHZvaWQpCit7CisJc3RhdGljIGludCBpc3JfYWN0aXZlOworI2lmZGVmIFRFU1RJTkcKKwl1bnNpZ25lZCBpbnQgdDAgPSBmdGFwZV90aW1lc3RhbXAoKTsKKyNlbmRpZgorCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKyAJaWYgKGlzcl9hY3RpdmUrKykgeworCQktLWlzcl9hY3RpdmU7CisJCVRSQUNFKGZ0X3RfYnVnLCAiQlVHOiBuZXN0ZWQgaW50ZXJydXB0LCBub3QgZ29vZCAhIik7CisJCSpmZGMuaG9vayA9IGZkY19pc3I7IC8qICBob29rIG91ciBoYW5kbGVyIGludG8gdGhlIGZkYworCQkJCSAgICAgICogIGNvZGUgYWdhaW4gCisJCQkJICAgICAgKi8KKwkJVFJBQ0VfRVhJVDsKKwl9CisJc3RpKCk7CisJaWYgKGluYl9wKGZkYy5tc3IpICYgRkRDX0JVU1kpIHsJLyogIEVudGVyaW5nIFJlc3VsdCBQaGFzZSAqLworCQlmdF9oaWRlX2ludGVycnVwdCA9IDA7CisJCWhhbmRsZV9mZGNfYnVzeShmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpKTsKKwkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKKwkJCS8qICAgICAgY2Vhc2Ugb3BlcmF0aW9uLCByZW1lbWJlciB0YXBlIHBvc2l0aW9uCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3RfZmxvdywgInJ1bm5lciBhYm9ydGluZyIpOworCQkJZnRfcnVubmVyX3N0YXR1cyA9IGFib3J0aW5nOworCQkJKytmdF9leHBlY3RlZF9zdHJheV9pbnRlcnJ1cHRzOworCQl9CisJfSBlbHNlIHsgLyogIUZEQ19CVVNZICovCisJCS8qICBjbGVhciBpbnRlcnJ1cHQsIGNhdXNlIHNob3VsZCBiZSBnb3R0ZW4gYnkgaXNzdWluZworCQkgKiAgYSBTZW5zZSBJbnRlcnJ1cHQgU3RhdHVzIGNvbW1hbmQuCisJCSAqLworCQlpZiAoZmRjX21vZGUgPT0gZmRjX3JlY2FsaWJyYXRpbmcgfHwgZmRjX21vZGUgPT0gZmRjX3NlZWtpbmcpIHsKKwkJCWlmIChmdF9oaWRlX2ludGVycnVwdCkgeworCQkJCWludCBzdDA7CisJCQkJaW50IHBjbjsKKworCQkJCWlmIChmZGNfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cygmc3QwLCAmcGNuKSA8IDApCisJCQkJCVRSQUNFKGZ0X3RfZXJyLAorCQkJCQkgICAgICAic2Vuc2UgaW50ZXJydXB0IHN0YXR1cyBmYWlsZWQiKTsKKwkJCQlmdGFwZV9jdXJyZW50X2N5bGluZGVyID0gcGNuOworCQkJCVRSQUNFKGZ0X3RfZmxvdywgImhhbmRsZWQgaGlkZGVuIGludGVycnVwdCIpOworCQkJfQorCQkJZnRfc2Vla19jb21wbGV0ZWQgPSAxOworCQkJZmRjX21vZGUgPSBmZGNfaWRsZTsKKwkJfSBlbHNlIGlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmZnRhcGVfd2FpdF9pbnRyKSkgeworCQkJaWYgKGZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHMgPT0gMCkgeworCQkJCVRSQUNFKGZ0X3Rfd2FybiwgInVuZXhwZWN0ZWQgc3RyYXkgaW50ZXJydXB0Iik7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfZmxvdywgImV4cGVjdGVkIHN0cmF5IGludGVycnVwdCIpOworCQkJCS0tZnRfZXhwZWN0ZWRfc3RyYXlfaW50ZXJydXB0czsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChmZGNfbW9kZSA9PSBmZGNfcmVhZGluZ19kYXRhIHx8CisJCQkgICAgZmRjX21vZGUgPT0gZmRjX3ZlcmlmeWluZyAgICB8fAorCQkJICAgIGZkY19tb2RlID09IGZkY193cml0aW5nX2RhdGEgfHwKKwkJCSAgICBmZGNfbW9kZSA9PSBmZGNfZGVsZXRpbmcgICAgIHx8CisJCQkgICAgZmRjX21vZGUgPT0gZmRjX2Zvcm1hdHRpbmcgICB8fAorCQkJICAgIGZkY19tb2RlID09IGZkY19yZWFkaW5nX2lkKSB7CisJCQkJaWYgKGluYl9wKGZkYy5tc3IpICYgRkRDX0JVU1kpIHsKKwkJCQkJVFJBQ0UoZnRfdF9idWcsCisJCQkJCSIqKioqKiBGREMgZmFpbHVyZSwgYnVzeSB0b28gbGF0ZSIpOworCQkJCX0gZWxzZSB7CisJCQkJCVRSQUNFKGZ0X3RfYnVnLAorCQkJCQkgICAgICAiKioqKiogRkRDIGZhaWx1cmUsIG5vIGJ1c3kiKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfZmRjX2RtYSwgImF3YWl0ZWQgc3RyYXkgaW50ZXJydXB0Iik7CisJCQl9CisJCX0KKwkJZnRfaGlkZV9pbnRlcnJ1cHQgPSAwOworCX0KKwkvKiAgICBIYW5kbGUgc2xlZXAgY29kZS4KKwkgKi8KKwlpZiAoIWZ0X2hpZGVfaW50ZXJydXB0KSB7CisJCWZ0X2ludGVycnVwdF9zZWVuICsrOworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZnRhcGVfd2FpdF9pbnRyKSkgeworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZmdGFwZV93YWl0X2ludHIpOworCQl9CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiaGlkaW5nIGludGVycnVwdCB3aGlsZSAlcyIsIAorCQkgICAgICB3YWl0cXVldWVfYWN0aXZlKCZmdGFwZV93YWl0X2ludHIpID8gIndhaXRpbmciOiJhY3RpdmUiKTsKKwl9CisjaWZkZWYgVEVTVElORworCXQwID0gZnRhcGVfdGltZWRpZmYodDAsIGZ0YXBlX3RpbWVzdGFtcCgpKTsKKwlpZiAodDAgPj0gMTAwMCkgeworCQkvKiBvbmx5IHRlbGwgdXMgYWJvdXQgbG9uZyBjYWxscyAqLworCQlUUkFDRShmdF90X25vaXNlLCAiaXNyKCkgZHVyYXRpb246ICU1ZCB1c2VjIiwgdDApOworCX0KKyNlbmRpZgorCSpmZGMuaG9vayA9IGZkY19pc3I7CS8qIGhvb2sgb3VyIGhhbmRsZXIgaW50byB0aGUgZmRjIGNvZGUgYWdhaW4gKi8KKwktLWlzcl9hY3RpdmU7CisJVFJBQ0VfRVhJVDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWFhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlzci5oCkBAIC0wLDAgKzEsNTUgQEAKKyNpZm5kZWYgX0ZEQ19JU1JfSAorI2RlZmluZSBfRkRDX0lTUl9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mZGMtaXNyLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODowNyAkCisgKgorICogICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdsb2JhbCB2YXJpYWJsZXMgbmVjZXNzYXJ5IHRvCisgKiAgICAgIHN5bmNocm9uaXplIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIChpc3IpIHdpdGggdGhlCisgKiAgICAgIHJlbWFpbmRlciBvZiB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIKKyAqICAgICAgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworLyoKKyAqICAgICAgZmRjLWlzci5jIGRlZmluZWQgcHVibGljIHZhcmlhYmxlcworICovCitleHRlcm4gdm9sYXRpbGUgaW50IGZ0X2V4cGVjdGVkX3N0cmF5X2ludGVycnVwdHM7IC8qIG1hc2tzIHN0cmF5IGludGVycnVwdHMgKi8KK2V4dGVybiB2b2xhdGlsZSBpbnQgZnRfc2Vla19jb21wbGV0ZWQ7CSAgICAgICAgICAvKiBmbGFnIHNldCBieSBpc3IgKi8KK2V4dGVybiB2b2xhdGlsZSBpbnQgZnRfaW50ZXJydXB0X3NlZW47CSAgICAgICAgICAvKiBmbGFnIHNldCBieSBpc3IgKi8KK2V4dGVybiB2b2xhdGlsZSBpbnQgZnRfaGlkZV9pbnRlcnJ1cHQ7ICAgICAgICAgICAgLyogZmxhZyBzZXQgYnkgaXNyICovCisKKy8qCisgKiAgICAgIGZkYy1pby5jIGRlZmluZWQgcHVibGljIGZ1bmN0aW9ucworICovCitleHRlcm4gdm9pZCBmZGNfaXNyKHZvaWQpOworCisvKgorICogICAgICBBIGtlcm5lbCBob29rIHRoYXQgc3RlYWxzIG9uZSBpbnRlcnJ1cHQgZnJvbSB0aGUgZmxvcHB5CisgKiAgICAgIGRyaXZlciAoU2hvdWxkIGJlIGZpeGVkIHdoZW4gdGhlIG5ldyBmZGMgZHJpdmVyIGdldHMgcmVhZHkpCisgKiAgICAgIFNlZSB0aGUgbGludXgga2VybmVsIHNvdXJjZSBmaWxlczoKKyAqICAgICAgICAgIGRyaXZlcnMvYmxvY2svZmxvcHB5LmMgJiBkcml2ZXJzL2Jsb2NrL2Jsay5oCisgKiAgICAgIGZvciB0aGUgZGV0YWlscy4KKyAqLworZXh0ZXJuIHZvaWQgKCpkb19mbG9wcHkpICh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhMzAxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ic20uYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5jLHYgJAorICogJFJldmlzaW9uOiAxLjMgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTU6MTUgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBiYWQtc2VjdG9yIG1hcCBoYW5kbGluZyBjb2RlIGZvcgorICogICAgICB0aGUgUUlDLTExNyBmbG9wcHkgdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICogICAgICBRSUMtNDAsIFFJQy04MCwgUUlDLTMwMTAgYW5kIFFJQy0zMDIwIG1hcHMgYXJlIGltcGxlbWVudGVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KKworLyogICAgICBMb2NhbCB2YXJzLgorICovCitzdGF0aWMgX191OCAqYmFkX3NlY3Rvcl9tYXA7CitzdGF0aWMgU2VjdG9yQ291bnQgKmJzbV9oYXNoX3B0cjsgCisKK3R5cGVkZWYgZW51bSB7CisJZm9yd2FyZCwgYmFja3dhcmQKK30gbW9kZV90eXBlOworCisjaWYgMAorc3RhdGljIHZvaWQgZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoaW50IHNlZ21lbnRfaWQsIFNlY3Rvck1hcCBuZXdfbWFwKTsKKyNlbmRpZgorCisjaWYgMAorLyogIGZpeF90YXBlIGNvbnZlcnRzIGEgbm9ybWFsIFFJQy04MCB0YXBlIGludG8gYSAnd2lkZScgdGFwZS4KKyAqICBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5ICEKKyAqLwordm9pZCBmaXhfdGFwZShfX3U4ICogYnVmZmVyLCBmdF9mb3JtYXRfdHlwZSBuZXdfY29kZSkKK3sKKwlzdGF0aWMgX191OCBsaXN0W0JBRF9TRUNUT1JfTUFQX1NJWkVdOworCVNlY3Rvck1hcCAqc3JjX3B0ciA9IChTZWN0b3JNYXAgKikgbGlzdDsKKwlfX3U4ICpkc3RfcHRyID0gYmFkX3NlY3Rvcl9tYXA7CisJU2VjdG9yTWFwIG1hcDsKKwl1bnNpZ25lZCBpbnQgc2VjdG9yID0gMTsKKwlpbnQgaTsKKworCWlmIChmb3JtYXRfY29kZSAhPSBmbXRfdmFyICYmIGZvcm1hdF9jb2RlICE9IGZtdF9iaWcpIHsKKwkJbWVtY3B5KGxpc3QsIGJhZF9zZWN0b3JfbWFwLCBzaXplb2YobGlzdCkpOworCQltZW1zZXQoYmFkX3NlY3Rvcl9tYXAsIDAsIHNpemVvZihiYWRfc2VjdG9yX21hcCkpOworCQl3aGlsZSAoKF9fdTggKikgc3JjX3B0ciAtIGxpc3QgPCBzaXplb2YobGlzdCkpIHsKKwkJCW1hcCA9ICpzcmNfcHRyKys7CisJCQlpZiAobWFwID09IEVNUFRZX1NFR01FTlQpIHsKKwkJCQkqKFNlY3Rvck1hcCAqKSBkc3RfcHRyID0gMHg4MDAwMDAgKyBzZWN0b3I7CisJCQkJZHN0X3B0ciArPSAzOworCQkJCXNlY3RvciArPSBTRUNUT1JTX1BFUl9TRUdNRU5UOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgU0VDVE9SU19QRVJfU0VHTUVOVDsgKytpKSB7CisJCQkJCWlmIChtYXAgJiAxKSB7CisJCQkJCQkqKFNld2N0b3JNYXAgKikgZHN0X3B0ciA9IHNlY3RvcjsKKwkJCQkJCWRzdF9wdHIgKz0gMzsKKwkJCQkJfQorCQkJCQltYXAgPj49IDE7CisJCQkJCSsrc2VjdG9yOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwliYWRfc2VjdG9yX21hcF9jaGFuZ2VkID0gMTsKKwkqKGJ1ZmZlciArIDQpID0gbmV3X2NvZGU7CS8qIHB1dCBuZXcgZm9ybWF0IGNvZGUgKi8KKwlpZiAoZm9ybWF0X2NvZGUgIT0gZm10X3ZhciAmJiBuZXdfY29kZSA9PSBmbXRfYmlnKSB7CisJCVBVVDQoYnVmZmVyLCBGVF82X0hTRUdfMSwgICAoX191MzIpR0VUMihidWZmZXIsIDYpKTsKKwkJUFVUNChidWZmZXIsIEZUXzZfSFNFR18yLCAgIChfX3UzMilHRVQyKGJ1ZmZlciwgOCkpOworCQlQVVQ0KGJ1ZmZlciwgRlRfNl9GUlNUX1NFRywgKF9fdTMyKUdFVDIoYnVmZmVyLCAxMCkpOworCQlQVVQ0KGJ1ZmZlciwgRlRfNl9MQVNUX1NFRywgKF9fdTMyKUdFVDIoYnVmZmVyLCAxMikpOworCQltZW1zZXQoYnVmZmVyKzYsICdcMCcsIDgpOworCX0KKwlmb3JtYXRfY29kZSA9IG5ld19jb2RlOworfQorCisjZW5kaWYKKworLyogICBnaXZlbiBidWZmZXIgdGhhdCBjb250YWlucyBhIGhlYWRlciBzZWdtZW50LCBmaW5kIHRoZSBlbmQgb2YKKyAqICAgb2YgdGhlIGJzbSBsaXN0CisgKi8KK19fdTggKiBmdGFwZV9maW5kX2VuZF9vZl9ic21fbGlzdChfX3U4ICogYWRkcmVzcykKK3sKKwlfX3U4ICpwdHIgICA9IGFkZHJlc3MgKyBGVF9IRUFERVJfRU5EOyAvKiBzdGFydCBvZiBic20gbGlzdCAqLworCV9fdTggKmxpbWl0ID0gYWRkcmVzcyArIEZUX1NFR01FTlRfU0laRTsKKwl3aGlsZSAocHRyICsgMiA8IGxpbWl0KSB7CisJCWlmIChwdHJbMF0gfHwgcHRyWzFdIHx8IHB0clsyXSkgeworCQkJcHRyICs9IDM7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcHRyOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3NlY3RvcihTZWN0b3JDb3VudCAqcHRyLCB1bnNpZ25lZCBpbnQgc2VjdG9yKQoreworCXB0ci0+Ynl0ZXNbMF0gPSBzZWN0b3IgJiAweGZmOworCXNlY3RvciA+Pj0gODsKKwlwdHItPmJ5dGVzWzFdID0gc2VjdG9yICYgMHhmZjsKKwlzZWN0b3IgPj49IDg7CisJcHRyLT5ieXRlc1syXSA9IHNlY3RvciAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9zZWN0b3IoU2VjdG9yQ291bnQgKnB0cikKK3sKKyNpZiAxCisJdW5zaWduZWQgaW50IHNlY3RvcjsKKworCXNlY3RvciAgPSBwdHItPmJ5dGVzWzBdOworCXNlY3RvciArPSBwdHItPmJ5dGVzWzFdIDw8ICA4OworCXNlY3RvciArPSBwdHItPmJ5dGVzWzJdIDw8IDE2OworCisJcmV0dXJuIHNlY3RvcjsKKyNlbHNlCisJLyogIEdFVDQgZ2V0cyB0aGUgbmV4dCBmb3VyIGJ5dGVzIGluIEludGVsIGxpdHRsZSBlbmRpYW4gb3JkZXIKKwkgKiAgYW5kIGNvbnZlcnRzIHRoZW0gdG8gaG9zdCBieXRlIG9yZGVyIGFuZCBoYW5kbGVzIHVuYWxpZ25lZAorCSAqICBhY2Nlc3MuCisJICovCisJcmV0dXJuIChHRVQ0KHB0ciwgMCkgJiAweDAwZmZmZmZmKTsgLyogYmFjayB0byBob3N0IGJ5dGUgb3JkZXIgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBic21fZGVidWdfZmFrZSh2b2lkKQoreworCS8qIGZvciB0ZXN0aW5nIG9mIGJhZCBzZWN0b3IgaGFuZGxpbmcgYXQgZW5kIG9mIHRhcGUKKwkgKi8KKyNpZiAwCisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudHNfcGVyX3RyYWNrICogdHJhY2tzX3Blcl90YXBlIC0gMywKKwkJCQkgICAweDAwMDAwM2UwOworCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KHNlZ21lbnRzX3Blcl90cmFjayAqIHRyYWNrc19wZXJfdGFwZSAtIDIsCisJCQkJICAgMHhmZjNmZmZmZjsKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeShzZWdtZW50c19wZXJfdHJhY2sgKiB0cmFja3NfcGVyX3RhcGUgLSAxLAorCQkJCSAgIDB4ZmZmZmUwMDA7CisjZW5kaWYKKwkvKiAgRW5hYmxlIHRvIHRlc3QgYmFkIHNlY3RvciBoYW5kbGluZworCSAqLworI2lmIDAKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSgzMCwgMHhmZmZmZmZmZSkKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSgzMiwgMHg3ZmZmZmZmZik7CisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoMzQsIDB4ZmZmZWZmZmYpOworCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDM2LCAweDU1NTU1NTU1KTsKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSgzOCwgMHhmZmZmZmZmZik7CisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoNTAsIDB4ZmZmZjAwMDApOworCWZ0YXBlX3B1dF9iYWRfc2VjdG9yX2VudHJ5KDUxLCAweGZmZmZmZmZmKTsKKwlmdGFwZV9wdXRfYmFkX3NlY3Rvcl9lbnRyeSg1MiwgMHhmZmZmZmZmZik7CisJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoNTMsIDB4MDAwMGZmZmYpOworI2VuZGlmCisJLyogIEVuYWJsZSB3aGVuIHRlc3RpbmcgbXVsdGlwbGUgdm9sdW1lIHRhciBkdW1wcy4KKwkgKi8KKyNpZiAwCisJeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7CisJCSAgICAgaSA8PSBmdF9sYXN0X2RhdGFfc2VnbWVudCAtIDc7ICsraSkgeworCQkJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoaSwgRU1QVFlfU0VHTUVOVCk7CisJCX0KKwl9CisjZW5kaWYKKwkvKiAgRW5hYmxlIHdoZW4gdGVzdGluZyBiaXQgcG9zaXRpb25zIGluICpfZXJyb3JfbWFwCisJICovCisjaWYgMAorCXsKKwkJaW50IGk7CisJCQorCQlmb3IgKGkgPSBmaXJzdF9kYXRhX3NlZ21lbnQ7IGkgPD0gbGFzdF9kYXRhX3NlZ21lbnQ7ICsraSkgeworCQkJZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoaSwKKwkJCQkJICAgZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoaSkgCisJCQkJCSAgIHwgMHgwMGZmMDBmZik7CisJCX0KKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcHJpbnRfYmFkX3NlY3Rvcl9tYXAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgZ29vZF9zZWN0b3JzOworCXVuc2lnbmVkIGludCB0b3RhbF9iYWQgPSAwOworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcgfHwgCisJICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgCisJICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF8xMTAwZnQpIHsKKwkJU2VjdG9yQ291bnQgKnB0ciA9IChTZWN0b3JDb3VudCAqKWJhZF9zZWN0b3JfbWFwOworCQl1bnNpZ25lZCBpbnQgc2VjdG9yOworCQlfX3UxNiAqcHRyMTY7CisKKwkJd2hpbGUoKHNlY3RvciA9IGdldF9zZWN0b3IocHRyKyspKSAhPSAwKSB7CisJCQlpZiAoKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcgfHwgCisJCQkgICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIpICYmCisJCQkgICAgc2VjdG9yICYgMHg4MDAwMDApIHsKKwkJCQl0b3RhbF9iYWQgKz0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIDM7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImJhZCBzZWdtZW50IGF0IHNlY3RvcjogJTZkIiwKKwkJCQkgICAgICBzZWN0b3IgJiAweDdmZmZmZik7CisJCQl9IGVsc2UgeworCQkJCSsrdG90YWxfYmFkOworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJiYWQgc2VjdG9yOiAlNmQiLCBzZWN0b3IpOworCQkJfQorCQl9CisJCS8qICBEaXNwbGF5IG9sZCBmdGFwZSdzIGVuZC1vZi1maWxlIG1hcmtzCisJCSAqLworCQlwdHIxNiA9IChfX3UxNiopcHRyOworCQl3aGlsZSAoKHNlY3RvciA9IGdldF91bmFsaWduZWQocHRyMTYrKykpICE9IDApIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJPbGQgZnRhcGUgZW9mIG1hcms6ICU0ZC8lMmQiLAorCQkJICAgICAgc2VjdG9yLCBnZXRfdW5hbGlnbmVkKHB0cjE2KyspKTsKKwkJfQorCX0gZWxzZSB7IC8qIGZpeGVkIHNpemUgZm9ybWF0ICovCisJCWZvciAoaSA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKKwkJICAgICBpIDwgKGludCkoZnRfc2VnbWVudHNfcGVyX3RyYWNrICogZnRfdHJhY2tzX3Blcl90YXBlKTsgKytpKSB7CisJCQlTZWN0b3JNYXAgbWFwID0gKChTZWN0b3JNYXAgKikgYmFkX3NlY3Rvcl9tYXApW2ldOworCisJCQlpZiAobWFwKSB7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkgICAgICAiYnNtIGZvciBzZWdtZW50ICU0ZDogMHglMDh4IiwgaSwgKHVuc2lnbmVkIGludCltYXApOworCQkJCXRvdGFsX2JhZCArPSAoKG1hcCA9PSBFTVBUWV9TRUdNRU5UKQorCQkJCQkgICAgICAgPyBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UIC0gMworCQkJCQkgICAgICAgOiBjb3VudF9vbmVzKG1hcCkpOworCQkJfQorCQl9CisJfQorCWdvb2Rfc2VjdG9ycyA9CisJCSgoZnRfc2VnbWVudHNfcGVyX3RyYWNrICogZnRfdHJhY2tzX3Blcl90YXBlIC0gZnRfZmlyc3RfZGF0YV9zZWdtZW50KQorCQkgKiAoRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIDMpKSAtIHRvdGFsX2JhZDsKKwlUUkFDRShmdF90X2luZm8sICIlZCBLYiB1c2FibGUgb24gdGhpcyB0YXBlIiwgZ29vZF9zZWN0b3JzKTsKKwlpZiAodG90YWxfYmFkID09IDApIHsKKwkJVFJBQ0UoZnRfdF9pbmZvLAorCQkgICAgICAiV0FSTklORzogdGhpcyB0YXBlIGhhcyBubyBiYWQgYmxvY2tzIHJlZ2lzdGVyZWQgISIpOworCX0gZWxzZSB7CisJCVRSQUNFKGZ0X3RfaW5mbywgIiVkIGJhZCBzZWN0b3JzIiwgdG90YWxfYmFkKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworCit2b2lkIGZ0YXBlX2V4dHJhY3RfYmFkX3NlY3Rvcl9tYXAoX191OCAqIGJ1ZmZlcikKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogIEZpbGwgdGhlIGJhZCBzZWN0b3IgbWFwIHdpdGggdGhlIGNvbnRlbnRzIG9mIGJ1ZmZlci4KKwkgKi8KKwlpZiAoZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciB8fCBmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSB7CisJCS8qIFFJQy0zMDEwLzMwMjAgYW5kIHdpZGUgUUlDLTgwIHRhcGVzIG5vIGxvbmdlciBoYXZlIGEgZmFpbGVkCisJCSAqIHNlY3RvciBsb2cgYnV0IHVzZSB0aGlzIGFyZWEgdG8gZXh0ZW5kIHRoZSBiYWQgc2VjdG9yIG1hcC4KKwkJICovCisJCWJhZF9zZWN0b3JfbWFwID0gJmJ1ZmZlcltGVF9IRUFERVJfRU5EXTsKKwl9IGVsc2UgeworCQkvKiBub24td2lkZSBRSUMtODAgdGFwZXMgaGF2ZSBhIGZhaWxlZCBzZWN0b3IgbG9nIGFyZWEgdGhhdAorCQkgKiBtdXN0bid0IGJlIGluY2x1ZGVkIGluIHRoZSBiYWQgc2VjdG9yIG1hcC4KKwkJICovCisJCWJhZF9zZWN0b3JfbWFwID0gJmJ1ZmZlcltGVF9GU0wgKyBGVF9GU0xfU0laRV07CisJfQorCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfMTEwMGZ0IHx8IAorCSAgICBmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyICAgIHx8CisJICAgIGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKKwkJYnNtX2hhc2hfcHRyID0gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXA7CisJfSBlbHNlIHsKKwkJYnNtX2hhc2hfcHRyID0gTlVMTDsKKwl9CisJYnNtX2RlYnVnX2Zha2UoKTsKKwlpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9pbmZvKSB7CisJCXByaW50X2JhZF9zZWN0b3JfbWFwKCk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgU2VjdG9yTWFwIGN2dDJtYXAodW5zaWduZWQgaW50IHNlY3RvcikKK3sKKwlyZXR1cm4gMSA8PCAoKChzZWN0b3IgJiAweDdmZmZmZikgLSAxKSAlIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjdnQyc2VnbWVudCh1bnNpZ25lZCBpbnQgc2VjdG9yKQoreworCXJldHVybiAoKHNlY3RvciAmIDB4N2ZmZmZmKSAtIDEpIC8gRlRfU0VDVE9SU19QRVJfU0VHTUVOVDsKK30KKworc3RhdGljIGludCBmb3J3YXJkX3NlZWtfZW50cnkoaW50IHNlZ21lbnRfaWQsIAorCQkJICAgICAgU2VjdG9yQ291bnQgKipwdHIsIAorCQkJICAgICAgU2VjdG9yTWFwICptYXApCit7CisJdW5zaWduZWQgaW50IHNlY3RvcjsKKwlpbnQgc2VnbWVudDsKKworCWRvIHsKKwkJc2VjdG9yID0gZ2V0X3NlY3RvcigoKnB0cikrKyk7CisJCXNlZ21lbnQgPSBjdnQyc2VnbWVudChzZWN0b3IpOworCX0gd2hpbGUgKHNlY3RvciAhPSAwICYmIHNlZ21lbnQgPCBzZWdtZW50X2lkKTsKKwkoKnB0cikgLS07IC8qIHBvaW50IHRvIGZpcnN0IHNlY3RvciA+PSBzZWdtZW50X2lkICovCisJLyogIEdldCBhbGwgc2VjdG9ycyBpbiBzZWdtZW50X2lkCisJICovCisJaWYgKHNlY3RvciA9PSAwIHx8IHNlZ21lbnQgIT0gc2VnbWVudF9pZCkgeworCQkqbWFwID0gMDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICgoc2VjdG9yICYgMHg4MDAwMDApICYmCisJCSAgIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpKSB7CisJCSptYXAgPSBFTVBUWV9TRUdNRU5UOworCQlyZXR1cm4gRlRfU0VDVE9SU19QRVJfU0VHTUVOVDsKKwl9IGVsc2UgeworCQlpbnQgY291bnQgPSAxOworCQlTZWN0b3JDb3VudCAqdG1wX3B0ciA9ICgqcHRyKSArIDE7CisJCQorCQkqbWFwID0gY3Z0Mm1hcChzZWN0b3IpOworCQl3aGlsZSAoKHNlY3RvciA9IGdldF9zZWN0b3IodG1wX3B0cisrKSkgIT0gMCAmJgorCQkgICAgICAgKHNlZ21lbnQgPSBjdnQyc2VnbWVudChzZWN0b3IpKSA9PSBzZWdtZW50X2lkKSB7CisJCQkqbWFwIHw9IGN2dDJtYXAoc2VjdG9yKTsKKwkJCSsrY291bnQ7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0KK30KKworc3RhdGljIGludCBiYWNrd2FyZHNfc2Vla19lbnRyeShpbnQgc2VnbWVudF9pZCwKKwkJCQlTZWN0b3JDb3VudCAqKnB0ciwKKwkJCQlTZWN0b3JNYXAgKm1hcCkKK3sKKwl1bnNpZ25lZCBpbnQgc2VjdG9yOworCWludCBzZWdtZW50OyAvKiBtYXggdW5zaWduZWQgaW50ICovCisKKwlpZiAoKnB0ciA8PSAoU2VjdG9yQ291bnQgKiliYWRfc2VjdG9yX21hcCkgeworCQkqbWFwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWRvIHsKKwkJc2VjdG9yICA9IGdldF9zZWN0b3IoLS0oKnB0cikpOworCQlzZWdtZW50ID0gY3Z0MnNlZ21lbnQoc2VjdG9yKTsKKwl9IHdoaWxlICgqcHRyID4gKFNlY3RvckNvdW50ICopYmFkX3NlY3Rvcl9tYXAgJiYgc2VnbWVudCA+IHNlZ21lbnRfaWQpOworCWlmIChzZWdtZW50ID4gc2VnbWVudF9pZCkgeyAvKiAgYXQgc3RhcnQgb2YgbGlzdCwgbm8gZW50cnkgZm91bmQgKi8KKwkJKm1hcCA9IDA7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoc2VnbWVudCA8IHNlZ21lbnRfaWQpIHsKKwkJLyogIGJlZm9yZSBzbWFsbGVyIGVudHJ5LCBhZGp1c3QgZm9yIG92ZXJzaG9vdCAqLworCQkoKnB0cikgKys7CisJCSptYXAgPSAwOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKChzZWN0b3IgJiAweDgwMDAwMCkgJiYKKwkJICAgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhcikpIHsKKwkJKm1hcCA9IEVNUFRZX1NFR01FTlQ7CisJCXJldHVybiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UOworCX0gZWxzZSB7IC8qICBnZXQgYWxsIHNlY3RvcnMgaW4gc2VnbWVudF9pZCAqLworCQlpbnQgY291bnQgPSAxOworCisJCSptYXAgPSBjdnQybWFwKHNlY3Rvcik7CisJCXdoaWxlKCpwdHIgPiAoU2VjdG9yQ291bnQgKiliYWRfc2VjdG9yX21hcCkgeworCQkJc2VjdG9yID0gZ2V0X3NlY3RvcigtLSgqcHRyKSk7CisJCQlzZWdtZW50ID0gY3Z0MnNlZ21lbnQoc2VjdG9yKTsKKwkJCWlmIChzZWdtZW50ICE9IHNlZ21lbnRfaWQpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCSptYXAgfD0gY3Z0Mm1hcChzZWN0b3IpOworCQkJKytjb3VudDsKKwkJfQorCQlpZiAoc2VnbWVudCA8IHNlZ21lbnRfaWQpIHsKKwkJCSgqcHRyKSArKzsKKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQorfQorCisjaWYgMAorc3RhdGljIHZvaWQgZnRhcGVfcHV0X2JhZF9zZWN0b3JfZW50cnkoaW50IHNlZ21lbnRfaWQsIFNlY3Rvck1hcCBuZXdfbWFwKQoreworCVNlY3RvckNvdW50ICpwdHIgPSAoU2VjdG9yQ291bnQgKiliYWRfc2VjdG9yX21hcDsKKwlpbnQgY291bnQ7CisJaW50IG5ld19jb3VudDsKKwlTZWN0b3JNYXAgbWFwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoZnRfZm9ybWF0X2NvZGUgPT0gZm10XzExMDBmdCB8fCAKKwkgICAgZnRfZm9ybWF0X2NvZGUgPT0gZm10X3ZhciB8fCAKKwkgICAgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgeworCQljb3VudCA9IGZvcndhcmRfc2Vla19lbnRyeShzZWdtZW50X2lkLCAmcHRyLCAmbWFwKTsKKwkJbmV3X2NvdW50ID0gY291bnRfb25lcyhuZXdfbWFwKTsKKwkJLyogSWYgZm9ybWF0IGNvZGUgPT0gNCBwdXQgZW1wdHkgc2VnbWVudCBpbnN0ZWFkIG9mIDMyCisJCSAqIGJhZCBzZWN0b3JzLgorCQkgKi8KKwkJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgeworCQkJaWYgKG5ld19jb3VudCA9PSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSB7CisJCQkJbmV3X2NvdW50ID0gMTsKKwkJCX0KKwkJCWlmIChjb3VudCA9PSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSB7CisJCQkJY291bnQgPSAxOworCQkJfQorCQl9CisJCWlmIChjb3VudCAhPSBuZXdfY291bnQpIHsKKwkJCS8qIGluc2VydCAob3IgZGVsZXRlIGlmIDwgMCkgbmV3X2NvdW50IC0gY291bnQKKwkJCSAqIGVudHJpZXMuICBNb3ZlIHRyYWlsaW5nIHBhcnQgb2YgbGlzdAorCQkJICogaW5jbHVkaW5nIHRlcm1pbmF0aW5nIDAuCisJCQkgKi8KKwkJCVNlY3RvckNvdW50ICpoaV9wdHIgPSBwdHI7CisKKwkJCWRvIHsKKwkJCX0gd2hpbGUgKGdldF9zZWN0b3IoaGlfcHRyKyspICE9IDApOworCQkJLyogIE5vdGU6IHB0ciBpcyBvZiB0eXBlIGJ5dGUgKiwgYW5kIGVhY2ggYmFkIHNlY3RvcgorCQkJICogIGNvbnN1bWVzIDMgYnl0ZXMuCisJCQkgKi8KKwkJCW1lbW1vdmUocHRyICsgbmV3X2NvdW50LCBwdHIgKyBjb3VudCwKKwkJCQkoc2l6ZV90KShoaV9wdHIgLSAocHRyICsgY291bnQpKSpzaXplb2YoU2VjdG9yQ291bnQpKTsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAicHV0dGluZyBtYXAgMHglMDh4IGF0ICVwLCBzZWdtZW50ICVkIiwKKwkJICAgICAgKHVuc2lnbmVkIGludCluZXdfbWFwLCBwdHIsIHNlZ21lbnRfaWQpOworCQlpZiAobmV3X2NvdW50ID09IDEgJiYgbmV3X21hcCA9PSBFTVBUWV9TRUdNRU5UKSB7CisJCQlwdXRfc2VjdG9yKHB0cisrLCAoMHg4MDAwMDEgKyAKKwkJCQkJICBzZWdtZW50X2lkICogCisJCQkJCSAgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkpOworCQl9IGVsc2UgeworCQkJaW50IGkgPSAwOworCisJCQl3aGlsZSAobmV3X21hcCkgeworCQkJCWlmIChuZXdfbWFwICYgMSkgeworCQkJCQlwdXRfc2VjdG9yKHB0cisrLCAKKwkJCQkJCSAgIDEgKyBzZWdtZW50X2lkICogCisJCQkJCQkgICBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICsgaSk7CisJCQkJfQorCQkJCSsraTsKKwkJCQluZXdfbWFwID4+PSAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJKChTZWN0b3JNYXAgKikgYmFkX3NlY3Rvcl9tYXApW3NlZ21lbnRfaWRdID0gbmV3X21hcDsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKyNlbmRpZiAgLyogIDAgICovCisKK1NlY3Rvck1hcCBmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeShpbnQgc2VnbWVudF9pZCkKK3sKKwlpZiAoZnRfdXNlZF9oZWFkZXJfc2VnbWVudCA9PSAtMSkgeworCQkvKiAgV2hlbiByZWFkaW5nIGhlYWRlciBzZWdtZW50IHdlJ2xsIG5lZWQgYSBibGFuayBtYXAuCisJCSAqLworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGJzbV9oYXNoX3B0ciAhPSBOVUxMKSB7CisJCS8qICBJbnZhcmlhbnRzOgorCQkgKiAgICBtYXAgLSBtYXNrIHZhbHVlIHJldHVybmVkIG9uIGxhc3QgY2FsbC4KKwkJICogICAgYnNtX2hhc2hfcHRyIC0gcG9pbnRzIHRvIGZpcnN0IHNlY3RvciBncmVhdGVyIG9yIGVxdWFsIHRvCisJCSAqICAgICAgICAgIGZpcnN0IHNlY3RvciBpbiBsYXN0X3JlZmVyZW5jZWQgc2VnbWVudC4KKwkJICogICAgbGFzdF9yZWZlcmVuY2VkIC0gc2VnbWVudCBpZCB1c2VkIGluIHRoZSBsYXN0IGNhbGwsCisJCSAqICAgICAgICAgICAgICAgICAgICAgIHNlY3RvciBhbmQgbWFwIGJlbG9uZyB0byB0aGlzIGlkLgorCQkgKiAgVGhpcyBjb2RlIGlzIGRlc2lnbmVkIGZvciBzZXF1ZW50aWFsIGFjY2VzcyBhbmQgcmV0cmllcy4KKwkJICogIEZvciB0cnVlIHJhbmRvbSBhY2Nlc3MgaXQgbWF5IGhhdmUgdG8gYmUgcmVkZXNpZ25lZC4KKwkJICovCisJCXN0YXRpYyBpbnQgbGFzdF9yZWZlcmVuY2UgPSAtMTsKKwkJc3RhdGljIFNlY3Rvck1hcCBtYXA7CisKKwkJaWYgKHNlZ21lbnRfaWQgPiBsYXN0X3JlZmVyZW5jZSkgeworCQkJLyogIFNraXAgYWxsIHNlY3RvcnMgYmVmb3JlIHNlZ21lbnRfaWQKKwkJCSAqLworCQkJZm9yd2FyZF9zZWVrX2VudHJ5KHNlZ21lbnRfaWQsICZic21faGFzaF9wdHIsICZtYXApOworCQl9IGVsc2UgaWYgKHNlZ21lbnRfaWQgPCBsYXN0X3JlZmVyZW5jZSkgeworCQkJLyogU2tpcCBiYWNrd2FyZHMgdW50aWwgYmVnaW4gb2YgYnVmZmVyIG9yCisJCQkgKiBmaXJzdCBzZWN0b3IgaW4gc2VnbWVudF9pZCAKKwkJCSAqLworCQkJYmFja3dhcmRzX3NlZWtfZW50cnkoc2VnbWVudF9pZCwgJmJzbV9oYXNoX3B0ciwgJm1hcCk7CisJCX0JCS8qIHNlZ21lbnRfaWQgPT0gbGFzdF9yZWZlcmVuY2UgOiBrZWVwIG1hcCAqLworCQlsYXN0X3JlZmVyZW5jZSA9IHNlZ21lbnRfaWQ7CisJCXJldHVybiBtYXA7CisJfSBlbHNlIHsKKwkJcmV0dXJuICgoU2VjdG9yTWFwICopIGJhZF9zZWN0b3JfbWFwKVtzZWdtZW50X2lkXTsKKwl9Cit9CisKKy8qICBUaGlzIGlzIHNpbXBseSBoZXJlIHRvIHByZXZlbnQgdXMgZnJvbSBvdmVyd3JpdGluZyBvdGhlciBrZXJuZWwKKyAqICBkYXRhLiBXcml0ZXMgd2lsbCByZXN1bHQgaW4gTlVMTCBQb2ludGVyIGRlcmVmZXJlbmNlLgorICovCit2b2lkIGZ0YXBlX2luaXRfYnNtKHZvaWQpCit7CisJYmFkX3NlY3Rvcl9tYXAgPSBOVUxMOworCWJzbV9oYXNoX3B0ciAgID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ic20uaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1ic20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDQ1NDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJzbS5oCkBAIC0wLDAgKzEsNjYgQEAKKyNpZm5kZWYgX0ZUQVBFX0JTTV9ICisjZGVmaW5lIF9GVEFQRV9CU01fSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnNtLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODowNyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBiYWQgc2VjdG9yIG1hcCBoYW5kbGluZworICogICAgICByb3V0aW5lcyBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mdGFwZS1oZWFkZXItc2VnbWVudC5oPgorCisjZGVmaW5lIEVNUFRZX1NFR01FTlQgICAgICAgICAgICgweGZmZmZmZmZmKQorI2RlZmluZSBGQUtFX1NFR01FTlQgICAgICAgICAgICAoMHhmZmZmZmZmZSkKKworLyogIG1heGltdW0gKGZvcm1hdCBjb2RlIDQpIGJhZCBzZWN0b3IgbWFwIHNpemUgKGJ5dGVzKS4KKyAqLworI2RlZmluZSBCQURfU0VDVE9SX01BUF9TSVpFICAgICAoMjkgKiBTRUNUT1JfU0laRSAtIDI1NikKKworLyogIGZvcm1hdCBjb2RlIDQgYmFkIHNlY3RvciBlbnRyeSwgZnRhcGUgdXNlcyB0aGlzCisgKiAgaW50ZXJuYWxseSBmb3IgYWxsIGZvcm1hdCBjb2RlcworICovCit0eXBlZGVmIF9fdTMyIFNlY3Rvck1hcDsKKy8qICB2YXJpYWJsZSBhbmQgMTEwMCBmdCBiYWQgc2VjdG9yIG1hcCBlbnRyeS4gVGhlc2UgdGhyZWUgYnl0ZXMgcmVwcmVzZW50CisgKiAgYSBzaW5nbGUgc2VjdG9yIGFkZHJlc3MgbWVhc3VyZWQgZnJvbSBCT1QuIAorICovCit0eXBlZGVmIHN0cnVjdCBOZXdTZWN0b3JNYXAgeyAgICAgICAgICAKKwlfX3U4IGJ5dGVzWzNdOworfSBTZWN0b3JDb3VudDsKKworCisvKgorICogICAgICBmdGFwZS1ic20uYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgorICovCisKKy8qCisgKiAgICAgIGZ0YXBlLWJzbS5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIHZvaWQgdXBkYXRlX2JhZF9zZWN0b3JfbWFwKF9fdTggKiBidWZmZXIpOworZXh0ZXJuIHZvaWQgZnRhcGVfZXh0cmFjdF9iYWRfc2VjdG9yX21hcChfX3U4ICogYnVmZmVyKTsKK2V4dGVybiBTZWN0b3JNYXAgZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoaW50IHNlZ21lbnRfaWQpOworZXh0ZXJuIF9fdTggKmZ0YXBlX2ZpbmRfZW5kX29mX2JzbV9saXN0KF9fdTggKiBhZGRyZXNzKTsKK2V4dGVybiB2b2lkIGZ0YXBlX2luaXRfYnNtKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1idWZmZXIuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFmMjBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5jLHYgJAorICogJFJldmlzaW9uOiAxLjMgJAorICogJERhdGU6IDE5OTcvMTAvMTYgMjM6MzM6MTEgJAorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFsbG9jYXRvci9kZWFsbG9jdG9yIGZvciBmdGFwZSdzIGR5bmFtaWMgZG1hCisgKiAgYnVmZmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisKKy8qICBETUEnYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHVmZi4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgKmRtYWFsbG9jKHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCWlmIChzaXplID09IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWFkZHIgPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKHNpemUpKTsKKwlpZiAoYWRkcikgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7IHBhZ2UgPCB2aXJ0X3RvX3BhZ2UoYWRkcitzaXplKTsgcGFnZSsrKQorCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCX0KKwlyZXR1cm4gKHZvaWQgKilhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hZnJlZSh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA+IDApIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHIpOworCQkgICAgIHBhZ2UgPCB2aXJ0X3RvX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRkcitzaXplKTsgcGFnZSsrKQorCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGFkZHIsIGdldF9vcmRlcihzaXplKSk7CisJfQorfQorCitzdGF0aWMgaW50IGFkZF9vbmVfYnVmZmVyKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKGZ0X25yX2J1ZmZlcnMgPj0gRlRfTUFYX05SX0JVRkZFUlMpIHsKKwkJVFJBQ0VfRVhJVCAtRU5PTUVNOworCX0KKwlmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10gPSBrbWFsbG9jKHNpemVvZihidWZmZXJfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXSA9PSBOVUxMKSB7CisJCVRSQUNFX0VYSVQgLUVOT01FTTsKKwl9CisJbWVtc2V0KGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXSwgMCwgc2l6ZW9mKGJ1ZmZlcl9zdHJ1Y3QpKTsKKwlmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10tPmFkZHJlc3MgPSBkbWFhbGxvYyhGVF9CVUZGX1NJWkUpOworCWlmIChmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10tPmFkZHJlc3MgPT0gTlVMTCkgeworCQlrZnJlZShmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10pOworCQlmdF9idWZmZXJbZnRfbnJfYnVmZmVyc10gPSBOVUxMOworCQlUUkFDRV9FWElUIC1FTk9NRU07CisJfQorCWZ0X25yX2J1ZmZlcnMgKys7CisJVFJBQ0UoZnRfdF9pbmZvLCAiYnVmZmVyIG5yICMlZCBAICVwLCBkbWEgYXJlYSBAICVwIiwKKwkgICAgICBmdF9ucl9idWZmZXJzLAorCSAgICAgIGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzLTFdLAorCSAgICAgIGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzLTFdLT5hZGRyZXNzKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbF9vbmVfYnVmZmVyKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJaWYgKGZ0X25yX2J1ZmZlcnMgPiAwKSB7CisJCVRSQUNFKGZ0X3RfaW5mbywgInJlbGVhc2luZyBidWZmZXIgbnIgIyVkIEAgJXAsIGRtYSBhcmVhIEAgJXAiLAorCQkgICAgICBmdF9ucl9idWZmZXJzLAorCQkgICAgICBmdF9idWZmZXJbZnRfbnJfYnVmZmVycy0xXSwKKwkJICAgICAgZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnMtMV0tPmFkZHJlc3MpOworCQlmdF9ucl9idWZmZXJzIC0tOworCQlkbWFmcmVlKGZ0X2J1ZmZlcltmdF9ucl9idWZmZXJzXS0+YWRkcmVzcywgRlRfQlVGRl9TSVpFKTsKKwkJa2ZyZWUoZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdKTsKKwkJZnRfYnVmZmVyW2Z0X25yX2J1ZmZlcnNdID0gTlVMTDsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworaW50IGZ0YXBlX3NldF9ucl9idWZmZXJzKGludCBjbnQpCit7CisJaW50IGRlbHRhID0gY250IC0gZnRfbnJfYnVmZmVyczsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChkZWx0YSA+IDApIHsKKwkJd2hpbGUgKGRlbHRhLS0pIHsKKwkJCWlmIChhZGRfb25lX2J1ZmZlcigpIDwgMCkgeworCQkJCVRSQUNFX0VYSVQgLUVOT01FTTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZGVsdGEgPCAwKSB7CisJCXdoaWxlIChkZWx0YSsrKSB7CisJCQlkZWxfb25lX2J1ZmZlcigpOworCQl9CisJfQorCWZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMoKTsKKwlUUkFDRV9FWElUIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjOTljZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1idWZmZXIuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9GVEFQRV9CVUZGRVJfSAorI2RlZmluZSBfRlRBUEVfQlVGRkVSX0gKKworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODowOCAkCisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYWxsb2NhdG9yL2RlYWxsb2N0b3IgZm9yIGZ0YXBlJ3MgZHluYW1pYyBkbWEKKyAqICBidWZmZXIuCisgKi8KKworZXh0ZXJuIGludCAgZnRhcGVfc2V0X25yX2J1ZmZlcnMoaW50IGNudCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWNhbGlici5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWNhbGlici5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmIyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4uCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWNhbGlici5jLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MDggJAorICoKKyAqICAgICAgR1AgY2FsaWJyYXRpb24gcm91dGluZSBmb3IgcHJvY2Vzc29yIHNwZWVkIGRlcGVuZGVudAorICogICAgICBmdW5jdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKyMgaW5jbHVkZSA8YXNtL2h3cnBiLmg+CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisjIGluY2x1ZGUgPGFzbS9tc3IuaD4KKyMgaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorIyBpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisKKyN1bmRlZiBERUJVRworCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKKyMgZXJyb3IgRnRhcGUgaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIGFyY2hpdGVjdHVyZSEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBzX3Blcl9jeWNsZSA9IDA7CisjZW5kaWYKKworc3RhdGljIHNwaW5sb2NrX3QgY2FsaWJyX2xvY2s7CisKKy8qCisgKiBOb3RlOiBPbiBJbnRlbCBQQ3MsIHRoZSBjbG9jayB0aWNrcyBhdCAxMDAgSHogKEhaPT0xMDApIHdoaWNoIGlzCisgKiB0b28gc2xvdyBmb3IgY2VydGFpbiB0aW1lb3V0cyAoYW5kIHRoYXQgY2xvY2sgZG9lc24ndCBldmVuIHRpY2sKKyAqIHdoZW4gaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQpLiAgRm9yIHRoYXQgcmVhc29uLCB0aGUgODI1NCB0aW1lciBpcworICogdXNlZCBkaXJlY3RseSB0byBpbXBsZW1lbnQgZmluZS1ncmFpbmVkIHRpbWVvdXRzLiAgSG93ZXZlciwgb24KKyAqIEFscGhhIFBDcywgdGhlIDgyNTQgaXMgKm5vdCogdXNlZCB0byBpbXBsZW1lbnQgdGhlIGNsb2NrIHRpY2sKKyAqICh3aGljaCBpcyAxMDI0IEh6LCBub3JtYWxseSkgYW5kIHRoZSA4MjU0IHRpbWVyIHJ1bnMgYXQgc29tZQorICogInJhbmRvbSIgZnJlcXVlbmN5IChpdCBzZWVtcyB0byBydW4gYXQgMThIeiwgYnV0IGl0J3Mgbm90IHNhZmUgdG8KKyAqIHJlbHkgb24gdGhpcyB2YWx1ZSkuICBJbnN0ZWFkLCB3ZSB1c2UgdGhlIEFscGhhJ3MgInJwY2MiCisgKiBpbnN0cnVjdGlvbiB0byByZWFkIGN5Y2xlIGNvdW50cy4gIEFzIHRoaXMgaXMgYSAzMiBiaXQgY291bnRlciwKKyAqIGl0IHdpbGwgb3ZlcmZsb3cgb25seSBvbmNlIHBlciAzMCBzZWNvbmRzIChvbiBhIDIwME1IeiBtYWNoaW5lKSwKKyAqIHdoaWNoIGlzIHBsZW50eS4KKyAqLworCit1bnNpZ25lZCBpbnQgZnRhcGVfdGltZXN0YW1wKHZvaWQpCit7CisjaWYgZGVmaW5lZChfX2FscGhhX18pCisJdW5zaWduZWQgbG9uZyByOworCisJYXNtIHZvbGF0aWxlICgicnBjYyAlMCIgOiAiPXIiIChyKSk7CisJcmV0dXJuIHI7CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisJdW5zaWduZWQgbG9uZyByOworCXJkdHNjbChyKTsKKwlyZXR1cm4gcjsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisKKy8qCisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgc29tZSB0aW1lIGJldHdlZW4gY291bnRlciB1bmRlcmZsb3dpbmcgYW5kIGppZmZpZXMKKyAqIGluY3JlYXNpbmcsIHNvIHRoZSBjb2RlIGJlbG93IHdvbid0IGFsd2F5cyBnaXZlIGNvcnJlY3Qgb3V0cHV0LgorICogLVZvanRlY2gKKyAqLworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX3UxNiBsbzsKKwlfX3UxNiBoaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCW91dGJfcCgweDAwLCAweDQzKTsJLyogbGF0Y2ggdGhlIGNvdW50IEFTQVAgKi8KKwlsbyA9IGluYl9wKDB4NDApOwkvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisJbG8gfD0gaW5iKDB4NDApIDw8IDg7CisJaGkgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbGlicl9sb2NrLCBmbGFncyk7CisJcmV0dXJuICgoaGkgKyAxKSAqICh1bnNpZ25lZCBpbnQpIExBVENIKSAtIGxvOyAgLyogZG93bmNvdW50ZXIgISAqLworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2hvcnRfZnRhcGVfdGltZXN0YW1wKHZvaWQpCit7CisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKwlyZXR1cm4gZnRhcGVfdGltZXN0YW1wKCk7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCXVuc2lnbmVkIGludCBjb3VudDsKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FsaWJyX2xvY2ssIGZsYWdzKTsKKyAJb3V0Yl9wKDB4MDAsIDB4NDMpOwkvKiBsYXRjaCB0aGUgY291bnQgQVNBUCAqLworCWNvdW50ID0gaW5iX3AoMHg0MCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KKwljb3VudCB8PSBpbmIoMHg0MCkgPDwgODsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCXJldHVybiAoTEFUQ0ggLSBjb3VudCk7CS8qIG5vcm1hbDogZG93bmNvdW50ZXIgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRpZmYodW5zaWduZWQgaW50IHQwLCB1bnNpZ25lZCBpbnQgdDEpCit7CisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKwlyZXR1cm4gKHQxIC0gdDApOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKwkvKgorCSAqIFRoaXMgaXMgdHJpY2t5OiB0byB3b3JrIGZvciBib3RoIHNob3J0IGFuZCBmdWxsIGZ0YXBlX3RpbWVzdGFtcHMKKwkgKiB3ZSdsbCBoYXZlIHRvIGRpc2NyaW1pbmF0ZSBiZXR3ZWVuIHRoZXNlLgorCSAqIElmIGl0IF9sb29rc18gbGlrZSBzaG9ydCBzdGFtcHMgd2l0aCB3cmFwcGluZyBhcm91bmQgd2UnbGwKKwkgKiBhc3VtZSBpdCBhcmUuIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIHNtYWxsIGVycm9yIGlmIGl0IHJlYWxseQorCSAqIHdhcyBhICh2ZXJ5IGxhcmdlKSBkZWx0YSBmcm9tIGZ1bGwgZnRhcGVfdGltZXN0YW1wcy4KKwkgKi8KKwlyZXR1cm4gKHQxIDw9IHQwICYmIHQwIDw9IExBVENIKSA/IHQxICsgTEFUQ0ggLSB0MCA6IHQxIC0gdDA7CisjZW5kaWYKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB1c2Vjcyh1bnNpZ25lZCBpbnQgY291bnQpCit7CisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKwlyZXR1cm4gKHBzX3Blcl9jeWNsZSAqIGNvdW50KSAvIDEwMDAwMDBVTDsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisJcmV0dXJuICgxMDAwMCAqIGNvdW50KSAvICgoQ0xPQ0tfVElDS19SQVRFICsgNTApIC8gMTAwKTsKKyNlbmRpZgorfQorCit1bnNpZ25lZCBpbnQgZnRhcGVfdGltZWRpZmYodW5zaWduZWQgaW50IHQwLCB1bnNpZ25lZCBpbnQgdDEpCit7CisJLyoKKwkgKiAgQ2FsY3VsYXRlIGRpZmZlcmVuY2UgaW4gdXNlYyBmb3IgZnRhcGVfdGltZXN0YW1wIHJlc3VsdHMgdDAgJiB0MS4KKwkgKiAgTm90ZSB0aGF0IG9uIHRoZSBpMzg2IHBsYXRmb3JtIHdpdGggc2hvcnQgdGltZS1zdGFtcHMsIHRoZQorCSAqICBtYXhpbXVtIGFsbG93ZWQgdGltZXNwYW4gaXMgMS9IWiBvciB3ZSdsbCBsb3NlIHRpY2tzIQorCSAqLworCXJldHVybiB1c2VjcyhkaWZmKHQwLCB0MSkpOworfQorCisvKiAgICAgIFRvIGdldCBhbiBpbmRpY2F0aW9uIG9mIHRoZSBJL08gcGVyZm9ybWFuY2UsCisgKiAgICAgIG1lYXN1cmUgdGhlIGR1cmF0aW9uIG9mIHRoZSBpbmIoKSBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgdGltZV9pbmIodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgdDAsIHQxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1czsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbGlicl9sb2NrLCBmbGFncyk7CisJdDAgPSBzaG9ydF9mdGFwZV90aW1lc3RhbXAoKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisJCXN0YXR1cyA9IGluYihmZGMubXNyKTsKKwl9CisJdDEgPSBzaG9ydF9mdGFwZV90aW1lc3RhbXAoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYWxpYnJfbG9jaywgZmxhZ3MpOworCVRSQUNFKGZ0X3RfaW5mbywgImluYigpIGR1cmF0aW9uOiAlZCBuc2VjIiwgZnRhcGVfdGltZWRpZmYodDAsIHQxKSk7CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9jbG9jayh2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisJcHNfcGVyX2N5Y2xlID0gMTAwMDAwMDAwMFVMIC8gY3B1X2toejsKKyNlbGlmIGRlZmluZWQoX19hbHBoYV9fKQorCWV4dGVybiBzdHJ1Y3QgaHdycGJfc3RydWN0ICpod3JwYjsKKwlwc19wZXJfY3ljbGUgPSAoMTAwMCoxMDAwKjEwMDAqMTAwMFVMKSAvIGh3cnBiLT5jeWNsZV9mcmVxOworI2VuZGlmCisJVFJBQ0VfRVhJVDsKK30KKworLyoKKyAqICAgICAgSW5wdXQ6ICBmdW5jdGlvbiB0YWtpbmcgaW50IGNvdW50IGFzIHBhcmFtZXRlci4KKyAqICAgICAgICAgICAgICBwb2ludGVycyB0byBjYWxjdWxhdGVkIGNhbGlicmF0aW9uIHZhcmlhYmxlcy4KKyAqLwordm9pZCBmdGFwZV9jYWxpYnJhdGUoY2hhciAqbmFtZSwKKwkJICAgIHZvaWQgKCpmdW4pICh1bnNpZ25lZCBpbnQpLCAKKwkJICAgIHVuc2lnbmVkIGludCAqY2FsaWJyX2NvdW50LCAKKwkJICAgIHVuc2lnbmVkIGludCAqY2FsaWJyX3RpbWUpCit7CisJc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgdGMgPSAwOworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgdGltZTsKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorCXVuc2lnbmVkIGludCBvbGRfdGMgPSAwOworCXVuc2lnbmVkIGludCBvbGRfY291bnQgPSAxOworCXVuc2lnbmVkIGludCBvbGRfdGltZSA9IDE7CisjZW5kaWYKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChmaXJzdF90aW1lKSB7ICAgICAgICAgICAgIC8qIGdldCBpZGVhIG9mIEkvTyBwZXJmb3JtYW5jZSAqLworCQlpbml0X2Nsb2NrKCk7CisJCXRpbWVfaW5iKCk7CisJCWZpcnN0X3RpbWUgPSAwOworCX0KKwkvKiAgICB2YWx1ZSBvZiB0aW1lb3V0IG11c3QgYmUgc2V0IHNvIHRoYXQgb24gdmVyeSBzbG93IHN5c3RlbXMKKwkgKiAgICBpdCB3aWxsIGdpdmUgYSB0aW1lIGxlc3MgdGhhbiBvbmUgamlmZnksIGFuZCBvbgorCSAqICAgIHZlcnkgZmFzdCBzeXN0ZW1zIGl0J2xsIGdpdmUgcmVhc29uYWJsZSBwcmVjaXNpb24uCisJICovCisKKwljb3VudCA9IDQwOworCWZvciAoaSA9IDA7IGkgPCAxNTsgKytpKSB7CisJCXVuc2lnbmVkIGludCB0MDsKKwkJdW5zaWduZWQgaW50IHQxOworCQl1bnNpZ25lZCBpbnQgb25jZTsKKwkJdW5zaWduZWQgaW50IG11bHRpcGxlOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCSpjYWxpYnJfY291bnQgPQorCQkqY2FsaWJyX3RpbWUgPSBjb3VudDsJLyogc2V0IFRDIHRvIDEgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbGlicl9sb2NrLCBmbGFncyk7CisJCWZ1bigwKTsJCS8qIGR1bW15LCBnZXQgY29kZSBpbnRvIGNhY2hlICovCisJCXQwID0gc2hvcnRfZnRhcGVfdGltZXN0YW1wKCk7CisJCWZ1bigwKTsJCS8qIG92ZXJoZWFkICsgb25lIHRlc3QgKi8KKwkJdDEgPSBzaG9ydF9mdGFwZV90aW1lc3RhbXAoKTsKKwkJb25jZSA9IGRpZmYodDAsIHQxKTsKKwkJdDAgPSBzaG9ydF9mdGFwZV90aW1lc3RhbXAoKTsKKwkJZnVuKGNvdW50KTsJCS8qIG92ZXJoZWFkICsgY291bnQgdGVzdHMgKi8KKwkJdDEgPSBzaG9ydF9mdGFwZV90aW1lc3RhbXAoKTsKKwkJbXVsdGlwbGUgPSBkaWZmKHQwLCB0MSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbGlicl9sb2NrLCBmbGFncyk7CisJCXRpbWUgPSBmdGFwZV90aW1lZGlmZigwLCBtdWx0aXBsZSAtIG9uY2UpOworCQl0YyA9ICgxMDAwICogdGltZSkgLyAoY291bnQgLSAxKTsKKwkJVFJBQ0UoZnRfdF9hbnksICJvbmNlOiUzZCB1cywlNmQgdGltZXM6JTZkIHVzLCBUQzolNWQgbnMiLAorCQkJdXNlY3Mob25jZSksIGNvdW50IC0gMSwgdXNlY3MobXVsdGlwbGUpLCB0Yyk7CisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKwkJLyoKKwkJICogSW5jcmVhc2UgdGhlIGNhbGlicmF0aW9uIGNvdW50IGV4cG9uZW50aWFsbHkgdW50aWwgdGhlCisJCSAqIGNhbGlicmF0aW9uIHRpbWUgZXhjZWVkcyAxMDAgbXMuCisJCSAqLworCQlpZiAodGltZSA+PSAxMDAqMTAwMCkgeworCQkJYnJlYWs7CisJCX0KKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisJCS8qCisJCSAqIGluY3JlYXNlIHRoZSBjb3VudCB1bnRpbCB0aGUgcmVzdWx0aW5nIHRpbWUgbmVhcnMgMi9IWiwKKwkJICogdGhlbiB0aGUgdGMgd2lsbCBkcm9wIHNoYXJwbHkgYmVjYXVzZSB3ZSBsb3NlIExBVENIIGNvdW50cy4KKwkJICovCisJCWlmICh0YyA8PSBvbGRfdGMgLyAyKSB7CisJCQl0aW1lID0gb2xkX3RpbWU7CisJCQljb3VudCA9IG9sZF9jb3VudDsKKwkJCWJyZWFrOworCQl9CisJCW9sZF90YyA9IHRjOworCQlvbGRfY291bnQgPSBjb3VudDsKKwkJb2xkX3RpbWUgPSB0aW1lOworI2VuZGlmCisJCWNvdW50ICo9IDI7CisJfQorCSpjYWxpYnJfY291bnQgPSBjb3VudCAtIDE7CisJKmNhbGlicl90aW1lICA9IHRpbWU7CisJVFJBQ0UoZnRfdF9pbmZvLCAiVEMgZm9yIGAlcygpJyA9ICVkIG5zZWMgKGF0ICVkIGNvdW50cykiLAorCSAgICAgbmFtZSwgKDEwMDAgKiAqY2FsaWJyX3RpbWUpIC8gKmNhbGlicl9jb3VudCwgKmNhbGlicl9jb3VudCk7CisJVFJBQ0VfRVhJVDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzdlNzUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWNhbGlici5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX0ZUQVBFX0NBTElCUl9ICisjZGVmaW5lIF9GVEFQRV9DQUxJQlJfSAorCisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jYWxpYnIuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4xICQKKyAqICREYXRlOiAxOTk3LzA5LzE5IDA5OjA1OjI2ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBhIGdwIGNhbGlicmF0aW9uIHJvdXRpbmUgZm9yCisgKiAgICAgIGhhcmR3YXJlIGRlcGVuZGVudCB0aW1lb3V0IGZ1bmN0aW9ucy4KKyAqLworCitleHRlcm4gdm9pZCBmdGFwZV9jYWxpYnJhdGUoY2hhciAqbmFtZSwKKwkJCSAgICB2b2lkICgqZnVuKSAodW5zaWduZWQgaW50KSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmNhbGlicl9jb3VudCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmNhbGlicl90aW1lKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZnRhcGVfdGltZXN0YW1wKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBmdGFwZV90aW1lZGlmZih1bnNpZ25lZCBpbnQgdDAsIHVuc2lnbmVkIGludCB0MSk7CisKKyNlbmRpZiAvKiBfRlRBUEVfQ0FMSUJSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmUwNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWN0bC5jCkBAIC0wLDAgKzEsODk3IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgICAgICAgIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWN0bC5jLHYgJAorICogJFJldmlzaW9uOiAxLjQgJAorICogJERhdGU6IDE5OTcvMTEvMTEgMTQ6Mzc6NDQgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBub24tcmVhZC93cml0ZSBmdGFwZSBmdW5jdGlvbnMgZm9yIHRoZQorICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogZWFzZSBwb3J0aW5nIGJldHdlZW4gcHJlLTIuNC54IGFuZCBsYXRlciBrZXJuZWxzICovCisjZGVmaW5lIHZtYV9nZXRfcGdvZmYodikgICAgICAoKHYpLT52bV9wZ29mZikKKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KK2Z0YXBlX2luZm8gZnRhcGVfc3RhdHVzID0geworLyogIHZlbmRvciBpbmZvcm1hdGlvbiAqLworCXsgMCwgfSwgICAgIC8qIGRyaXZlIHR5cGUgKi8KKy8qICBkYXRhIHJhdGVzICovCisJNTAwLCAgICAgICAgLyogdXNlZCBkYXRhIHJhdGUgKi8KKwk1MDAsICAgICAgICAvKiBkcml2ZSBtYXggcmF0ZSAqLworCTUwMCwgICAgICAgIC8qIGZkYyBtYXggcmF0ZSAgICovCisvKiAgZHJpdmUgc2VsZWN0aW9uLCBlaXRoZXIgRlRBUEVfU0VMX0EvQi9DL0QgKi8KKwktMSwgICAgIC8qIGRyaXZlIHNlbGVjdGlvbiAqLworLyogIGZsYWdzIHNldCBhZnRlciBkZWNvZGUgdGhlIGRyaXZlIGFuZCB0YXBlIHN0YXR1cyAgICovCisJMCwgICAgICAgICAgLyogZm9ybWF0dGVkICovCisJMSwgICAgICAgICAgLyogbm8gdGFwZSAqLworCTEsICAgICAgICAgIC8qIHdyaXRlIHByb3RlY3RlZCAqLworCTEsICAgICAgICAgIC8qIG5ldyB0YXBlICovCisvKiAgdmFsdWVzIG9mIGxhc3QgcXVlcmllZCBkcml2ZS90YXBlIHN0YXR1cyBhbmQgZXJyb3IgKi8KKwl7ezAsfX0sICAgICAvKiBsYXN0IGVycm9yIGNvZGUgKi8KKwl7ezAsfX0sICAgICAvKiBkcml2ZSBzdGF0dXMsIGNvbmZpZ3VyYXRpb24sIHRhcGUgc3RhdHVzICovCisvKiAgY2FydHJpZGdlIGdlb21ldHJ5ICovCisgICAgICAgIDIwLCAgICAgICAgIC8qIHRyYWNrc19wZXJfdGFwZSAqLworICAgICAgICAxMDIsICAgICAgICAvKiBzZWdtZW50c19wZXJfdHJhY2sgKi8KKy8qICBsb2NhdGlvbiBvZiBoZWFkZXIgc2VnbWVudHMsIGV0Yy4gKi8KKwktMSwgICAgIC8qIHVzZWRfaGVhZGVyX3NlZ21lbnQgKi8KKwktMSwgICAgIC8qIGhlYWRlcl9zZWdtZW50XzEgKi8KKwktMSwgICAgIC8qIGhlYWRlcl9zZWdtZW50XzIgKi8KKwktMSwgICAgIC8qIGZpcnN0X2RhdGFfc2VnbWVudCAqLworICAgICAgICAtMSwgICAgIC8qIGxhc3RfZGF0YV9zZWdtZW50ICovCisvKiAgdGhlIGZvcm1hdCBjb2RlIGFzIHN0b3JlZCBpbiB0aGUgaGVhZGVyIHNlZ21lbnQgICovCisJZm10X25vcm1hbCwgLyogZm9ybWF0IGNvZGUgKi8KKy8qICB0aGUgZGVmYXVsdCBmb3IgdGhlIHFpYyBzdGQ6IHVua25vd24gKi8KKwktMSwKKy8qICBpcyB0YXBlIHJ1bm5pbmc/ICovCisJaWRsZSwgICAgICAgLyogcnVubmVyX3N0YXRlICovCisvKiAgaXMgdGFwZSByZWFkaW5nL3dyaXRpbmcvdmVyaWZ5aW5nL2Zvcm1hdHRpbmcvZGVsZXRpbmcgKi8KKwlpZGxlLCAgICAgICAvKiBkcml2ZXIgc3RhdGUgKi8KKy8qICBmbGFncyBmYXRhbCBoYXJkd2FyZSBlcnJvciAqLworCTEsICAgICAgICAgIC8qIGZhaWx1cmUgKi8KKy8qICBoaXN0b3J5IHJlY29yZCAqLworCXsgMCwgfSAgICAgIC8qIGhpc3RvcnkgcmVjb3JkICovCit9OworCQoraW50IGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkICAgICA9IDEwMjA7CitpbnQgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyID0gNDsKK2ludCBmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDE7IC8qIG5lZWQgdG8gYmUgZ2xvYmFsIGZvciBmdGFwZV9yZXNldF9kcml2ZSgpCisJCQkJICAqIGluIGZ0YXBlLWlvLmMKKwkJCQkgICovCisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIGNvbnN0IHZlbmRvcl9zdHJ1Y3QgdmVuZG9yc1tdID0gUUlDMTE3X1ZFTkRPUlM7CitzdGF0aWMgY29uc3Qgd2FrZXVwX21ldGhvZCBtZXRob2RzW10gPSBXQUtFVVBfTUVUSE9EUzsKKworY29uc3QgZnRhcGVfaW5mbyAqZnRhcGVfZ2V0X3N0YXR1cyh2b2lkKQoreworI2lmIGRlZmluZWQoU1RBVFVTX1BBUkFOT1lBKQorCXN0YXRpYyBmdGFwZV9pbmZvIGdldF9zdGF0dXM7CisKKwlnZXRfc3RhdHVzID0gZnRhcGVfc3RhdHVzOworCXJldHVybiAmZ2V0X3N0YXR1czsKKyNlbHNlCisJcmV0dXJuICZmdGFwZV9zdGF0dXM7IC8qICBtYXliZSByZXR1cm4gb25seSBhIGNvcHkgb2YgaXQgdG8gYXNzdXJlIAorCQkJICAgICAgICogIHJlYWQgb25seSBhY2Nlc3MKKwkJCSAgICAgICAqLworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZnRhcGVfbm90X29wZXJhdGlvbmFsKGludCBzdGF0dXMpCit7CisJLyogcmV0dXJuIHRydWUgaWYgc3RhdHVzIGluZGljYXRlcyB0YXBlIGNhbiBub3QgYmUgdXNlZC4KKwkgKi8KKwlyZXR1cm4gKChzdGF0dXMgXiBRSUNfU1RBVFVTX0NBUlRSSURHRV9QUkVTRU5UKSAmCisJCShRSUNfU1RBVFVTX0VSUk9SIHwKKwkJIFFJQ19TVEFUVVNfQ0FSVFJJREdFX1BSRVNFTlQgfAorCQkgUUlDX1NUQVRVU19ORVdfQ0FSVFJJREdFKSk7Cit9CisKK2ludCBmdGFwZV9zZWVrX3RvX2VvdCh2b2lkKQoreworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5wYXVzZSwgJnN0YXR1cyksKTsKKwl3aGlsZSAoKHN0YXR1cyAmIFFJQ19TVEFUVVNfQVRfRU9UKSA9PSAwKSB7CisJCWlmIChmdGFwZV9ub3Rfb3BlcmF0aW9uYWwoc3RhdHVzKSkgeworCQkJVFJBQ0VfRVhJVCAtRUlPOworCQl9CisJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmRfd2FpdChRSUNfUEhZU0lDQUxfRk9SV0FSRCwKKwkJCQkJICAgICAgIGZ0YXBlX3RpbWVvdXQucmV3aW5kLCZzdGF0dXMpLCk7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworaW50IGZ0YXBlX3NlZWtfdG9fYm90KHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnBhdXNlLCAmc3RhdHVzKSwpOworCXdoaWxlICgoc3RhdHVzICYgUUlDX1NUQVRVU19BVF9CT1QpID09IDApIHsKKwkJaWYgKGZ0YXBlX25vdF9vcGVyYXRpb25hbChzdGF0dXMpKSB7CisJCQlUUkFDRV9FWElUIC1FSU87CisJCX0KKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZF93YWl0KFFJQ19QSFlTSUNBTF9SRVZFUlNFLAorCQkJCQkgICAgICAgZnRhcGVfdGltZW91dC5yZXdpbmQsJnN0YXR1cyksKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IGZ0YXBlX25ld19jYXJ0cmlkZ2Uodm9pZCkKK3sKKwlmdF9sb2NhdGlvbi50cmFjayA9IC0xOyAvKiBmb3JjZSBzZWVrIG9uIGZpcnN0IGFjY2VzcyAqLworCWZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMoKTsKKwlmdGFwZV96YXBfd3JpdGVfYnVmZmVycygpOworCXJldHVybiAwOworfQorCitpbnQgZnRhcGVfYWJvcnRfb3BlcmF0aW9uKHZvaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHN0YXR1czsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IHJ1bm5pbmcpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImFib3J0aW5nIHJ1bm5lciwgd2FpdGluZyIpOworCQkKKwkJZnRfcnVubmVyX3N0YXR1cyA9IGRvX2Fib3J0OworCQkvKiBzZXQgdGltZW91dCBzbyB0aGF0IHRoZSB0YXBlIHdpbGwgcnVuIHRvIGxvZ2ljYWwgRU9UCisJCSAqIGlmIHdlIG1pc3NlZCB0aGUgbGFzdCBzZWN0b3IgYW5kIHRoZXJlIGFyZSBubyBxdWV1ZSBwdWxzZXMuCisJCSAqLworCQlyZXN1bHQgPSBmdGFwZV9kdW1iX3N0b3AoKTsKKwl9CisJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgIT0gaWRsZSkgeworCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBkb19hYm9ydCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImZvcmNpbmcgcnVubmVyIGFib3J0Iik7CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInN0b3BwaW5nIHRhcGUiKTsKKwkJcmVzdWx0ID0gZnRhcGVfc3RvcF90YXBlKCZzdGF0dXMpOworCQlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisJCWZ0X3J1bm5lcl9zdGF0dXMgID0gaWRsZTsKKwl9CisJZnRhcGVfcmVzZXRfYnVmZmVyKCk7CisJZnRhcGVfemFwX3JlYWRfYnVmZmVycygpOworCWZ0YXBlX3NldF9zdGF0ZShpZGxlKTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCBsb29rdXBfdmVuZG9yX2lkKHVuc2lnbmVkIGludCB2ZW5kb3JfaWQpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKHZlbmRvcnNbaV0udmVuZG9yX2lkICE9IHZlbmRvcl9pZCkgeworCQlpZiAoKytpID49IE5SX0lURU1TKHZlbmRvcnMpKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0YXBlX2RldGFjaF9kcml2ZSh2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRShmdF90X2Zsb3csICJkaXNhYmxpbmcgdGFwZSBkcml2ZSBhbmQgZmRjIik7CisJZnRhcGVfcHV0X2RyaXZlX3RvX3NsZWVwKGZ0X2RyaXZlX3R5cGUud2FrZV91cCk7CisJZmRjX2NhdGNoX3N0cmF5X2ludGVycnVwdHMoMSk7CS8qIG9uZSBhbHdheXMgY29tZXMgKi8KKwlmZGNfZGlzYWJsZSgpOworCWZkY19yZWxlYXNlX2lycV9hbmRfZG1hKCk7CisJZmRjX3JlbGVhc2VfcmVnaW9ucygpOworCVRSQUNFX0VYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2hpc3Rvcnkodm9pZCkKK3sKKwlmdF9oaXN0b3J5LnVzZWQgPSAwOworCWZ0X2hpc3RvcnkuaWRfYW1fZXJyb3JzID0KKwkJZnRfaGlzdG9yeS5pZF9jcmNfZXJyb3JzID0KKwkJZnRfaGlzdG9yeS5kYXRhX2FtX2Vycm9ycyA9CisJCWZ0X2hpc3RvcnkuZGF0YV9jcmNfZXJyb3JzID0KKwkJZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycyA9CisJCWZ0X2hpc3Rvcnkubm9fZGF0YV9lcnJvcnMgPQorCQlmdF9oaXN0b3J5LnJldHJpZXMgPQorCQlmdF9oaXN0b3J5LmNyY19lcnJvcnMgPQorCQlmdF9oaXN0b3J5LmNyY19mYWlsdXJlcyA9CisJCWZ0X2hpc3RvcnkuZWNjX2ZhaWx1cmVzID0KKwkJZnRfaGlzdG9yeS5jb3JyZWN0ZWQgPQorCQlmdF9oaXN0b3J5LmRlZmVjdHMgPQorCQlmdF9oaXN0b3J5LnJld2luZHMgPSAwOworfQorCitzdGF0aWMgaW50IGZ0YXBlX2FjdGl2YXRlX2RyaXZlKHZlbmRvcl9zdHJ1Y3QgKiBkcml2ZV90eXBlKQoreworCWludCByZXN1bHQgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJLyogSWYgd2UgYWxyZWFkeSBrbm93IHRoZSBkcml2ZSB0eXBlLCB3YWtlIGl0IHVwLgorCSAqIEVsc2UgdHJ5IHRvIGZpbmQgb3V0IHdoYXQga2luZCBvZiBkcml2ZSBpcyBhdHRhY2hlZC4KKwkgKi8KKwlpZiAoZHJpdmVfdHlwZS0+d2FrZV91cCAhPSB1bmtub3duX3dha2VfdXApIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiZW5hYmxpbmcgdGFwZSBkcml2ZSBhbmQgZmRjIik7CisJCXJlc3VsdCA9IGZ0YXBlX3dha2V1cF9kcml2ZShkcml2ZV90eXBlLT53YWtlX3VwKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAia25vd24gd2FrZXVwIG1ldGhvZCBmYWlsZWQiKTsKKwkJfQorCX0gZWxzZSB7CisJCXdha2VfdXBfdHlwZXMgbWV0aG9kOworCQljb25zdCBmdF90cmFjZV90IG9sZF90cmFjaW5nID0gVFJBQ0VfTEVWRUw7CisJCWlmIChUUkFDRV9MRVZFTCA8IGZ0X3RfZmxvdykgeworCQkJU0VUX1RSQUNFX0xFVkVMKGZ0X3RfYnVnKTsKKwkJfQorCisJCS8qICBUcnkgdG8gYXdha2VuIHRoZSBkcml2ZSB1c2luZyBhbGwga25vd24gbWV0aG9kcy4KKwkJICogIExvd2VyIHRyYWNpbmcgZm9yIGEgd2hpbGUuCisJCSAqLworCQlmb3IgKG1ldGhvZD1ub193YWtlX3VwOyBtZXRob2QgPCBOUl9JVEVNUyhtZXRob2RzKTsgKyttZXRob2QpIHsKKwkJCWRyaXZlX3R5cGUtPndha2VfdXAgPSBtZXRob2Q7CisjaWZkZWYgQ09ORklHX0ZUX1RXT19EUklWRVMKKwkJCS8qICBUZXN0IHNldHVwIGZvciBkdWFsIGRyaXZlIGNvbmZpZ3VyYXRpb24uCisJCQkgKiAgL2Rldi9yZnQyIHVzZXMgbW91bnRhaW4gd2FrZXVwCisJCQkgKiAgL2Rldi9yZnQzIHVzZXMgY29sb3JhZG8gd2FrZXVwCisJCQkgKiAgT3RoZXIgc3lzdGVtcyB3aWxsIHVzZSB0aGUgbm9ybWFsIHNjaGVtZS4KKwkJCSAqLworCQkJaWYgKChmdF9kcml2ZV9zZWwgPCAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorCQkJICAgIChmdF9kcml2ZV9zZWwgPT0gMiAmJiBtZXRob2QgPT0gRlRfV0FLRV9VUF8xKSB8fAorCQkJICAgIChmdF9kcml2ZV9zZWwgPT0gMyAmJiBtZXRob2QgPT0gRlRfV0FLRV9VUF8yKSkgeworCQkJCXJlc3VsdD1mdGFwZV93YWtldXBfZHJpdmUoZHJpdmVfdHlwZS0+d2FrZV91cCk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IC1FSU87CisJCQl9CisjZWxzZQorCQkJcmVzdWx0ID0gZnRhcGVfd2FrZXVwX2RyaXZlKGRyaXZlX3R5cGUtPndha2VfdXApOworI2VuZGlmCisJCQlpZiAocmVzdWx0ID49IDApIHsKKwkJCQlUUkFDRShmdF90X3dhcm4sICJkcml2ZSB3YWtldXAgbWV0aG9kOiAlcyIsCisJCQkJICAgICAgbWV0aG9kc1tkcml2ZV90eXBlLT53YWtlX3VwXS5uYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlTRVRfVFJBQ0VfTEVWRUwob2xkX3RyYWNpbmcpOworCisJCWlmIChtZXRob2QgPj0gTlJfSVRFTVMobWV0aG9kcykpIHsKKwkJCS8qIG5vIHJlc3BvbnNlIGF0IGFsbCwgY2Fubm90IG9wZW4gdGhpcyBkcml2ZSAqLworCQkJZHJpdmVfdHlwZS0+d2FrZV91cCA9IHVua25vd25fd2FrZV91cDsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAibm8gdGFwZSBkcml2ZSBmb3VuZCAhIik7CisJCQlyZXN1bHQgPSAtRU5PREVWOworCQl9CisJfQorCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCitzdGF0aWMgaW50IGZ0YXBlX2dldF9kcml2ZV9zdGF0dXModm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlmdF9ub190YXBlID0gZnRfd3JpdGVfcHJvdGVjdGVkID0gMDsKKwkvKiAgICBUYXBlIGRyaXZlIGlzIGFjdGl2YXRlZCBub3cuCisJICogICAgRmlyc3QgY2xlYXIgZXJyb3Igc3RhdHVzIGlmIHByZXNlbnQuCisJICovCisJZG8geworCQlyZXN1bHQgPSBmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucmVzZXQsICZzdGF0dXMpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJaWYgKHJlc3VsdCA9PSAtRVRJTUUpIHsKKwkJCQlUUkFDRShmdF90X2VyciwgImZ0YXBlX3JlYWR5X3dhaXQgdGltZW91dCIpOworCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gLUVJTlRSKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJmdGFwZV9yZWFkeV93YWl0IGFib3J0ZWQiKTsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJmdGFwZV9yZWFkeV93YWl0IGZhaWxlZCIpOworCQkJfQorCQkJVFJBQ0VfRVhJVCAtRUlPOworCQl9CisJCS8qICBDbGVhciBlcnJvciBjb25kaXRpb24gKGRyaXZlIGlzIHJlYWR5ICEpCisJCSAqLworCQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikgeworCQkJdW5zaWduZWQgaW50IGVycm9yOworCQkJcWljMTE3X2NtZF90IGNvbW1hbmQ7CisKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiZXJyb3Igc3RhdHVzIHNldCIpOworCQkJcmVzdWx0ID0gZnRhcGVfcmVwb3J0X2Vycm9yKCZlcnJvciwgJmNvbW1hbmQsIDEpOworCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQlUUkFDRShmdF90X2VyciwKKwkJCQkgICAgICAicmVwb3J0X2Vycm9yX2NvZGUgZmFpbGVkOiAlZCIsIHJlc3VsdCk7CisJCQkJLyogaG9wZSBpdCdzIHdvcmtpbmcgbmV4dCB0aW1lICovCisJCQkJZnRhcGVfcmVzZXRfZHJpdmUoKTsKKwkJCQlUUkFDRV9FWElUIC1FSU87CisJCQl9IGVsc2UgaWYgKGVycm9yICE9IDApIHsKKwkJCQlUUkFDRShmdF90X25vaXNlLCAiZXJyb3IgY29kZSAgIDogJWQiLCBlcnJvcik7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVycm9yIGNvbW1hbmQ6ICVkIiwgY29tbWFuZCk7CisJCQl9CisJCX0KKwkJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfTkVXX0NBUlRSSURHRSkgeworCQkJdW5zaWduZWQgaW50IGVycm9yOworCQkJcWljMTE3X2NtZF90IGNvbW1hbmQ7CisJCQljb25zdCBmdF90cmFjZV90IG9sZF90cmFjaW5nID0gVFJBQ0VfTEVWRUw7CisJCQlTRVRfVFJBQ0VfTEVWRUwoZnRfdF9idWcpOworCisJCQkvKiAgVW5kb2N1bWVudGVkIGZlYXR1cmU6IE11c3QgY2xlYXIgKG5vdCBwcmVzZW50ISkKKwkJCSAqICBlcnJvciBoZXJlIG9yIHdlJ2xsIGZhaWwgbGF0ZXIuCisJCQkgKi8KKwkJCWZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAxKTsKKworCQkJU0VUX1RSQUNFX0xFVkVMKG9sZF90cmFjaW5nKTsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgInN0YXR1czogbmV3IGNhcnRyaWRnZSIpOworCQkJZnRfbmV3X3RhcGUgPSAxOworCQl9IGVsc2UgeworCQkJZnRfbmV3X3RhcGUgPSAwOworCQl9CisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwl9IHdoaWxlIChzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKTsKKwkKKwlmdF9ub190YXBlID0gIShzdGF0dXMgJiBRSUNfU1RBVFVTX0NBUlRSSURHRV9QUkVTRU5UKTsKKwlmdF93cml0ZV9wcm90ZWN0ZWQgPSAoc3RhdHVzICYgUUlDX1NUQVRVU19XUklURV9QUk9URUNUKSAhPSAwOworCWlmIChmdF9ub190YXBlKSB7CisJCVRSQUNFKGZ0X3Rfd2FybiwgIm5vIGNhcnRyaWRnZSBwcmVzZW50Iik7CisJfSBlbHNlIHsKKwkJaWYgKGZ0X3dyaXRlX3Byb3RlY3RlZCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIldyaXRlIHByb3RlY3RlZCBjYXJ0cmlkZ2UiKTsKKwkJfQorCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZ0YXBlX2xvZ192ZW5kb3JfaWQodm9pZCkKK3sKKwlpbnQgdmVuZG9yX2luZGV4OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZnRhcGVfcmVwb3J0X3ZlbmRvcl9pZCgmZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQpOworCXZlbmRvcl9pbmRleCA9IGxvb2t1cF92ZW5kb3JfaWQoZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQpOworCWlmIChmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCA9PSBVTktOT1dOX1ZFTkRPUiAmJgorCSAgICBmdF9kcml2ZV90eXBlLndha2VfdXAgPT0gd2FrZV91cF9jb2xvcmFkbykgeworCQl2ZW5kb3JfaW5kZXggPSAwOworCQkvKiBoYWNrIHRvIGdldCByaWQgb2YgYWxsIHRoaXMgbWFpbCAqLworCQlmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCA9IDA7CisJfQorCWlmICh2ZW5kb3JfaW5kZXggPCAwKSB7CisJCS8qIFVua25vd24gdmVuZG9yIGlkLCBmaXJzdCB0aW1lIG9wZW5pbmcgZGV2aWNlLiAgVGhlCisJCSAqIGRyaXZlX3R5cGUgcmVtYWlucyBzZXQgdG8gdHlwZSBmb3VuZCBhdCB3YWtldXAKKwkJICogdGltZSwgdGhpcyB3aWxsIHByb2JhYmx5IGtlZXAgdGhlIGRyaXZlciBvcGVyYXRpbmcKKwkJICogZm9yIHRoaXMgbmV3IHZlbmRvci4gIAorCQkgKi8KKwkJVFJBQ0UoZnRfdF93YXJuLCAiXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiPT09PT09PT09PT09IHVua25vd24gdmVuZG9yIGlkID09PT09PT09PT09XG4iCisJCSAgICAgIEtFUk5fSU5GTyAiQSBuZXcsIHlldCB1bnN1cHBvcnRlZCB0YXBlIGRyaXZlIGlzIGZvdW5kXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiUGxlYXNlIHJlcG9ydCB0aGUgZm9sbG93aW5nIHZhbHVlczpcbiIKKwkJICAgICAgS0VSTl9JTkZPICIgICBWZW5kb3IgaWQgICAgIDogMHglMDR4XG4iCisJCSAgICAgIEtFUk5fSU5GTyAiICAgV2FrZXVwIG1ldGhvZCA6ICVzXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiQW5kIGEgZGVzY3JpcHRpb24gb2YgeW91ciB0YXBlIGRyaXZlXG4iCisJCSAgICAgIEtFUk5fSU5GTyAidG8gIlRIRV9GVEFQRV9NQUlOVEFJTkVSIlxuIgorCQkgICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIsCisJCSAgICAgIGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkLAorCQkgICAgICBtZXRob2RzW2Z0X2RyaXZlX3R5cGUud2FrZV91cF0ubmFtZSk7CisJCWZ0X2RyaXZlX3R5cGUuc3BlZWQgPSAwOwkJLyogdW5rbm93biAqLworCX0gZWxzZSB7CisJCWZ0X2RyaXZlX3R5cGUubmFtZSAgPSB2ZW5kb3JzW3ZlbmRvcl9pbmRleF0ubmFtZTsKKwkJZnRfZHJpdmVfdHlwZS5zcGVlZCA9IHZlbmRvcnNbdmVuZG9yX2luZGV4XS5zcGVlZDsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAidGFwZSBkcml2ZSB0eXBlOiAlcyIsIGZ0X2RyaXZlX3R5cGUubmFtZSk7CisJCS8qIHNjYW4gYWxsIG1ldGhvZHMgZm9yIHRoaXMgdmVuZG9yX2lkIGluIHRhYmxlICovCisJCXdoaWxlKGZ0X2RyaXZlX3R5cGUud2FrZV91cCAhPSB2ZW5kb3JzW3ZlbmRvcl9pbmRleF0ud2FrZV91cCkgeworCQkJaWYgKHZlbmRvcl9pbmRleCA8IE5SX0lURU1TKHZlbmRvcnMpIC0gMSAmJgorCQkJICAgIHZlbmRvcnNbdmVuZG9yX2luZGV4ICsgMV0udmVuZG9yX2lkIAorCQkJICAgID09IAorCQkJICAgIGZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkKSB7CisJCQkJKyt2ZW5kb3JfaW5kZXg7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmdF9kcml2ZV90eXBlLndha2VfdXAgIT0gdmVuZG9yc1t2ZW5kb3JfaW5kZXhdLndha2VfdXApIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgIlxuIgorCQkgICAgIEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCisJCSAgICAgS0VSTl9JTkZPICJ3YWtldXAgdHlwZSBtaXNtYXRjaDpcbiIKKwkJICAgICBLRVJOX0lORk8gImZvdW5kOiAlcywgZXhwZWN0ZWQ6ICVzXG4iCisJCSAgICAgS0VSTl9JTkZPICJwbGVhc2UgcmVwb3J0IHRoaXMgdG8gIlRIRV9GVEFQRV9NQUlOVEFJTkVSIlxuIgorCQkgICAgIEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiwKKwkJCSAgICAgIG1ldGhvZHNbZnRfZHJpdmVfdHlwZS53YWtlX3VwXS5uYW1lLAorCQkJICAgICAgbWV0aG9kc1t2ZW5kb3JzW3ZlbmRvcl9pbmRleF0ud2FrZV91cF0ubmFtZSk7CisJCX0KKwl9CisJVFJBQ0VfRVhJVDsKK30KKwordm9pZCBmdGFwZV9jYWxjX3RpbWVvdXRzKHVuc2lnbmVkIGludCBxaWNfc3RkLAorCQkJIHVuc2lnbmVkIGludCBkYXRhX3JhdGUsCisJCQkgdW5zaWduZWQgaW50IHRhcGVfbGVuKQoreworCWludCBzcGVlZDsJCS8qIGRlY2ktaXBzICEgKi8KKwlpbnQgZmZfc3BlZWQ7CisJaW50IGxlbmd0aDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXBlIHRyYW5zcG9ydCBzcGVlZAorCSAqICBkYXRhIHJhdGU6ICAgICAgICBRSUMtNDAgICBRSUMtODAgICBRSUMtMzAxMCBRSUMtMzAyMAorCSAqCisJICogICAgMjUwIEticHMgICAgICAgIDI1IGlwcyAgICAgbi9hICAgICAgbi9hICAgICAgbi9hCisJICogICAgNTAwIEticHMgICAgICAgIDUwIGlwcyAgIDM0IGlwcyAgIDIyLjYgaXBzICAgbi9hCisJICogICAgICAxIE1icHMgICAgICAgICAgbi9hICAgIDY4IGlwcyAgIDQ1LjIgaXBzIDIyLjYgaXBzCisJICogICAgICAyIE1icHMgICAgICAgICAgbi9hICAgICAgbi9hICAgICAgbi9hICAgIDQ1LjIgaXBzCisJICoKKwkgKiAgZmFzdCB0YXBlIHRyYW5zcG9ydCBzcGVlZCBpcyBhdCBsZWFzdCA2OCBpcHMuCisJICovCisJc3dpdGNoIChxaWNfc3RkKSB7CisJY2FzZSBRSUNfVEFQRV9RSUM0MDoKKwkJc3BlZWQgPSAoZGF0YV9yYXRlID09IDI1MCkgPyAyNTAgOiA1MDA7CisJCWJyZWFrOworCWNhc2UgUUlDX1RBUEVfUUlDODA6CisJCXNwZWVkID0gKGRhdGFfcmF0ZSA9PSA1MDApID8gMzQwIDogNjgwOworCQlicmVhazsKKwljYXNlIFFJQ19UQVBFX1FJQzMwMTA6CisJCXNwZWVkID0gKGRhdGFfcmF0ZSA9PSA1MDApID8gMjI2IDogNDUyOworCQlicmVhazsKKwljYXNlIFFJQ19UQVBFX1FJQzMwMjA6CisJCXNwZWVkID0gKGRhdGFfcmF0ZSA9PSAxMDAwKSA/IDIyNiA6IDQ1MjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVFJBQ0UoZnRfdF9idWcsICJVbmtub3duIHFpY19zdGQgKGJ1ZykgPyIpOworCQlzcGVlZCA9IDUwMDsKKwkJYnJlYWs7CisJfQorCWlmIChmdF9kcml2ZV90eXBlLnNwZWVkID09IDApIHsKKwkJdW5zaWduZWQgbG9uZyB0MDsKKwkJc3RhdGljIGludCBkdCA9IDA7ICAgICAvKiBrZWVwIGdjYyBmcm9tIGNvbXBsYWluaW5nICovCisJCXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7CisKKwkJLyogIE1lYXN1cmUgdGhlIHRpbWUgaXQgdGFrZXMgdG8gd2luZCB0byBFT1QgYW5kIGJhY2sgdG8gQk9ULgorCQkgKiAgSWYgdGhlIHRhcGUgbGVuZ3RoIGlzIGtub3duLCBjYWxjdWxhdGUgdGhlIHJld2luZCBzcGVlZC4KKwkJICogIEVsc2Uga2VlcCB0aGUgdGltZSB2YWx1ZSBmb3IgY2FsY3VsYXRpb24gb2YgdGhlIHJld2luZAorCQkgKiAgc3BlZWQgbGF0ZXIgb24sIHdoZW4gdGhlIGxlbmd0aCBfaXNfIGtub3duLgorCQkgKiAgQXNrIGZvciBhIHJlcG9ydCBvbmx5IHdoZW4gbGVuZ3RoIGFuZCBzcGVlZCBhcmUgYm90aCBrbm93bi4KKwkJICovCisJCWlmIChmaXJzdF90aW1lKSB7CisJCQlmdGFwZV9zZWVrX3RvX2JvdCgpOworCQkJdDAgPSBqaWZmaWVzOworCQkJZnRhcGVfc2Vla190b19lb3QoKTsKKwkJCWZ0YXBlX3NlZWtfdG9fYm90KCk7CisJCQlkdCA9IChpbnQpICgoKGppZmZpZXMgLSB0MCkgKiBGVF9VU1BUKSAvIDEwMDApOworCQkJaWYgKGR0IDwgMSkgeworCQkJCWR0ID0gMTsJLyogcHJldmVudCBkaXYgYnkgemVybyBvbiBmYWlsdXJlcyAqLworCQkJfQorCQkJZmlyc3RfdGltZSA9IDA7CisJCQlUUkFDRShmdF90X2luZm8sCisJCQkgICAgICAidHJ5aW5nIHRvIGRldGVybWluZSBzZWVrIHRpbWVvdXQsIGdvdCAlZCBtc2VjIiwKKwkJCSAgICAgIGR0KTsKKwkJfQorCQlpZiAodGFwZV9sZW4gIT0gMCkgeworCQkJZnRfZHJpdmVfdHlwZS5zcGVlZCA9IAorCQkJCSgyICogMTIgKiB0YXBlX2xlbiAqIDEwMDApIC8gZHQ7CisJCQlUUkFDRShmdF90X3dhcm4sICJcbiIKKwkJICAgICBLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorCQkgICAgIEtFUk5fSU5GTyAiZHJpdmUgdHlwZTogJXNcbiIKKwkJICAgICBLRVJOX0lORk8gImRlbHRhIHRpbWUgPSAlZCBtcywgbGVuZ3RoID0gJWQgZnRcbiIKKwkJICAgICBLRVJOX0lORk8gImhhcyBhIG1heGltdW0gdGFwZSBzcGVlZCBvZiAlZCBpcHNcbiIKKwkJICAgICBLRVJOX0lORk8gInBsZWFzZSByZXBvcnQgdGhpcyB0byAiVEhFX0ZUQVBFX01BSU5UQUlORVIiXG4iCisJCSAgICAgS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iLAorCQkJICAgICAgZnRfZHJpdmVfdHlwZS5uYW1lLCBkdCwgdGFwZV9sZW4sIAorCQkJICAgICAgZnRfZHJpdmVfdHlwZS5zcGVlZCk7CisJCX0KKwl9CisJLyogIEhhbmRsZSB1bmtub3duIGxlbmd0aCB0YXBlcyBhcyB2ZXJ5IGxvbmcgb25lcy4gV2UnbGwKKwkgKiAgZGV0ZXJtaW5lIHRoZSBhY3R1YWwgbGVuZ3RoIGZyb20gYSBoZWFkZXIgc2VnbWVudCBsYXRlci4KKwkgKiAgVGhpcyBpcyBub3JtYWwgZm9yIGFsbCBtb2Rlcm4gKFdpZGUsVFIxLzIvMykgZm9ybWF0cy4KKwkgKi8KKwlpZiAodGFwZV9sZW4gPD0gMCkgeworCQlUUkFDRShmdF90X25vaXNlLAorCQkgICAgICAiVW5rbm93biB0YXBlIGxlbmd0aCwgdXNpbmcgbWF4aW1hbCB0aW1lb3V0cyIpOworCQlsZW5ndGggPSBRSUNfVE9QX1RBUEVfTEVOOwkvKiB1c2Ugd29yc3QgY2FzZSB2YWx1ZXMgKi8KKwl9IGVsc2UgeworCQlsZW5ndGggPSB0YXBlX2xlbjsJCS8qIHVzZSBhY3R1YWwgdmFsdWVzICovCisJfQorCWlmIChmdF9kcml2ZV90eXBlLnNwZWVkID09IDApIHsKKwkJZmZfc3BlZWQgPSBzcGVlZDsgCisJfSBlbHNlIHsKKwkJZmZfc3BlZWQgPSBmdF9kcml2ZV90eXBlLnNwZWVkOworCX0KKwkvKiAgdGltZSB0byBnbyBmcm9tIGJvdCB0byBlb3QgYXQgbm9ybWFsIHNwZWVkIChkYXRhIHJhdGUpOgorCSAqICB0aW1lID0gKDErZGVsdGEpICogbGVuZ3RoIChmdCkgKiAxMiAoaW5jaC9mdCkgLyBzcGVlZCAoaXBzKQorCSAqICBkZWx0YSA9IDEwICUgZm9yIHNlZWsgc3BlZWQsIDIwICUgZm9yIHJld2luZCBzcGVlZC4KKwkgKi8KKwlmdGFwZV90aW1lb3V0LnNlZWsgPSAobGVuZ3RoICogMTMyICogRlRfU0VDT05EKSAvIHNwZWVkOworCWZ0YXBlX3RpbWVvdXQucmV3aW5kID0gKGxlbmd0aCAqIDE0NCAqIEZUX1NFQ09ORCkgLyAoMTAgKiBmZl9zcGVlZCk7CisJZnRhcGVfdGltZW91dC5yZXNldCA9IDIwICogRlRfU0VDT05EICsgZnRhcGVfdGltZW91dC5yZXdpbmQ7CisJVFJBQ0UoZnRfdF9ub2lzZSwgInRpbWVvdXRzIGZvciBzcGVlZCA9ICVkLCBsZW5ndGggPSAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAic2VlayB0aW1lb3V0ICA6ICVkIHNlY1xuIgorCSAgICAgIEtFUk5fSU5GTyAicmV3aW5kIHRpbWVvdXQ6ICVkIHNlY1xuIgorCSAgICAgIEtFUk5fSU5GTyAicmVzZXQgdGltZW91dCA6ICVkIHNlYyIsCisJICAgICAgc3BlZWQsIGxlbmd0aCwKKwkgICAgICAoZnRhcGVfdGltZW91dC5zZWVrICsgNTAwKSAvIDEwMDAsCisJICAgICAgKGZ0YXBlX3RpbWVvdXQucmV3aW5kICsgNTAwKSAvIDEwMDAsCisJICAgICAgKGZ0YXBlX3RpbWVvdXQucmVzZXQgKyA1MDApIC8gMTAwMCk7CisJVFJBQ0VfRVhJVDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjYWxpYnJhdGVzIHRoZSBkYXRhcmF0ZSAoaS5lLiBkZXRlcm1pbmVzIHRoZSBtYXhpbWFsCisgKiB1c2FibGUgZGF0YSByYXRlKSBhbmQgc2V0cyB0aGUgZ2xvYmFsIHZhcmlhYmxlIGZ0X3FpY19zdGQgdG8gcWljX3N0ZAorICoKKyAqLworaW50IGZ0YXBlX2NhbGlicmF0ZV9kYXRhX3JhdGUodW5zaWduZWQgaW50IHFpY19zdGQpCit7CisJaW50IHJhdGUgPSBmdF9mZGNfcmF0ZV9saW1pdDsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJZnRfcWljX3N0ZCA9IHFpY19zdGQ7CisKKwlpZiAoZnRfcWljX3N0ZCA9PSAtMSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJIlVuYWJsZSB0byBkZXRlcm1pbmUgZGF0YSByYXRlIGlmIFFJQyBzdGFuZGFyZCBpcyB1bmtub3duIik7CisJfQorCisJLyogIFNlbGVjdCBoaWdoZXN0IHJhdGUgc3VwcG9ydGVkIGJ5IGJvdGggZmRjIGFuZCBkcml2ZS4KKwkgKiAgU3RhcnQgd2l0aCBoaWdoZXN0IHJhdGUgc3VwcG9ydGVkIGJ5IHRoZSBmZGMuCisJICovCisJd2hpbGUgKGZkY19zZXRfZGF0YV9yYXRlKHJhdGUpIDwgMCAmJiByYXRlID4gMjUwKSB7CisJCXJhdGUgLz0gMjsKKwl9CisJVFJBQ0UoZnRfdF9pbmZvLAorCSAgICAgICJIaWdoZXN0IEZEQyBzdXBwb3J0ZWQgZGF0YSByYXRlOiAlZCBLYnBzIiwgcmF0ZSk7CisJZnRfZmRjX21heF9yYXRlID0gcmF0ZTsKKwlkbyB7CisJCXJlc3VsdCA9IGZ0YXBlX3NldF9kYXRhX3JhdGUocmF0ZSwgZnRfcWljX3N0ZCk7CisJfSB3aGlsZSAocmVzdWx0ID09IC1FSU5WQUwgJiYgKHJhdGUgLz0gMikgPiAyNTApOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAic2V0IGRhdGFyYXRlIGZhaWxlZCIpOworCX0KKwlmdF9kYXRhX3JhdGUgPSByYXRlOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBmdGFwZV9pbml0X2RyaXZlKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlxaWNfbW9kZWwgbW9kZWw7CisJdW5zaWduZWQgaW50IHFpY19zdGQ7CisJdW5zaWduZWQgaW50IGRhdGFfcmF0ZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0YXBlX2luaXRfZHJpdmVfbmVlZGVkID0gMDsgLyogZG9uJ3QgcmV0cnkgaWYgdGhpcyBmYWlscyA/ICovCisJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoJnN0YXR1cyksKTsKKwlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19DQVJUUklER0VfUFJFU0VOVCkgeworCQlpZiAoIShzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0JPVCkpIHsKKwkJCS8qICBBbnRpcXVlIGRyaXZlcyB3aWxsIGdldCBoZXJlIGFmdGVyIGEgc29mdCByZXNldCwKKwkJCSAqICBtb2Rlcm4gb25lcyBvbmx5IGlmIHRoZSBkcml2ZXIgaXMgbG9hZGVkIHdoZW4gdGhlCisJCQkgKiAgdGFwZSB3YXNuJ3QgcmV3b3VuZCBwcm9wZXJseS4KKwkJCSAqLworCQkJLyogVGFwZSBzaG91bGQgYmUgYXQgYm90IGlmIG5ldyBjYXJ0cmlkZ2UgISAqLworCQkJZnRhcGVfc2Vla190b19ib3QoKTsKKwkJfQorCQlpZiAoIShzdGF0dXMgJiBRSUNfU1RBVFVTX1JFRkVSRU5DRUQpKSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJzdGFydGluZyBzZWVrX2xvYWRfcG9pbnQiKTsKKwkJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmRfd2FpdChRSUNfU0VFS19MT0FEX1BPSU5ULAorCQkJCQkJICAgICAgIGZ0YXBlX3RpbWVvdXQucmVzZXQsCisJCQkJCQkgICAgICAgJnN0YXR1cyksKTsKKwkJfQorCX0KKwlmdF9mb3JtYXR0ZWQgPSAoc3RhdHVzICYgUUlDX1NUQVRVU19SRUZFUkVOQ0VEKSAhPSAwOworCWlmICghZnRfZm9ybWF0dGVkKSB7CisJCVRSQUNFKGZ0X3Rfd2FybiwgIldhcm5pbmc6IHRhcGUgaXMgbm90IGZvcm1hdHRlZCAhIik7CisJfQorCisJLyogIHJlcG9ydCBjb25maWd1cmF0aW9uIGFib3J0cyB3aGVuIGZ0YXBlX3RhcGVfbGVuID09IC0xCisJICogIHVua25vd24gcWljX3N0ZCBpcyBva2F5IGlmIG5vdCBmb3JtYXR0ZWQuCisJICovCisJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X2NvbmZpZ3VyYXRpb24oJm1vZGVsLAorCQkJCQkgICAgICAgJmRhdGFfcmF0ZSwKKwkJCQkJICAgICAgICZxaWNfc3RkLAorCQkJCQkgICAgICAgJmZ0YXBlX3RhcGVfbGVuKSwpOworCisJLyogIE1heWJlIGFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSAvcHJvYyBlbnRyeQorCSAqLworCVRSQUNFKGZ0X3RfaW5mbywgIiVzIGRyaXZlIEAgJWQgS2JwcyIsCisJICAgICAgKG1vZGVsID09IHByZWhpc3RvcmljKSA/ICJwcmVoaXN0b3JpYyIgOgorCSAgICAgICgobW9kZWwgPT0gcHJlX3FpYzExN2MpID8gInByZSBRSUMtMTE3QyIgOgorCSAgICAgICAoKG1vZGVsID09IHBvc3RfcWljMTE3YikgPyAicG9zdCBRSUMtMTE3QiIgOgorCQkicG9zdCBRSUMtMTE3RCIpKSwgZGF0YV9yYXRlKTsKKworCWlmIChmdF9mb3JtYXR0ZWQpIHsKKwkJLyogIGluaXRpYWxpemUgZnRfdXNlZF9kYXRhX3JhdGUgdG8gbWF4aW11bSB2YWx1ZSAKKwkJICogIGFuZCBzZXQgZnRfcWljX3N0ZAorCQkgKi8KKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfY2FsaWJyYXRlX2RhdGFfcmF0ZShxaWNfc3RkKSwpOworCQlpZiAoZnRhcGVfdGFwZV9sZW4gPT0gMCkgeworCQkJVFJBQ0UoZnRfdF9pbmZvLCAidW5rbm93biBsZW5ndGggUUlDLSVzIHRhcGUiLAorCQkJICAgICAgKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDNDApID8gIjQwIiA6CisJCQkgICAgICAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDODApID8gIjgwIiA6CisJCQkgICAgICAgKChmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzMwMTApIAorCQkJCT8gIjMwMTAiIDogIjMwMjAiKSkpOworCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9pbmZvLCAiJWQgZnQuIFFJQy0lcyB0YXBlIiwgZnRhcGVfdGFwZV9sZW4sCisJCQkgICAgICAoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM0MCkgPyAiNDAiIDoKKwkJCSAgICAgICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM4MCkgPyAiODAiIDoKKwkJCSAgICAgICAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDMzAxMCkKKwkJCQk/ICIzMDEwIiA6ICIzMDIwIikpKTsKKwkJfQorCQlmdGFwZV9jYWxjX3RpbWVvdXRzKGZ0X3FpY19zdGQsIGZ0X2RhdGFfcmF0ZSwgZnRhcGVfdGFwZV9sZW4pOworCQkvKiBzb2Z0IHdyaXRlLXByb3RlY3QgUUlDLTQwL1FJQy04MCBjYXJ0cmlkZ2VzIHVzZWQgd2l0aCBhCisJCSAqIENvbG9yYWRvIFQzMDAwIGRyaXZlLiBCdWdneSBoYXJkd2FyZSEKKwkJICovCisJCWlmICgoZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgPT0gMHgwMTFjNikgJiYKKwkJICAgICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM0MCB8fAorCQkgICAgICBmdF9xaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwKSAmJgorCQkgICAgICFmdF93cml0ZV9wcm90ZWN0ZWQpKSB7CisJCQlUUkFDRShmdF90X3dhcm4sICJcbiIKKwlLRVJOX0lORk8gIlRoZSBmYW1vdXMgQ29sb3JhZG8gVDMwMDAgYnVnOlxuIgorCUtFUk5fSU5GTyAiJXMgZHJpdmVzIGNhbid0IHdyaXRlIFFJQzQwIGFuZCBRSUM4MFxuIgorCUtFUk5fSU5GTyAiY2FydHJpZGdlcyBidXQgZG9uJ3Qgc2V0IHRoZSB3cml0ZS1wcm90ZWN0IGZsYWchIiwKKwkJCSAgICAgIGZ0X2RyaXZlX3R5cGUubmFtZSk7CisJCQlmdF93cml0ZV9wcm90ZWN0ZWQgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJLyogIERvZXNuJ3QgbWFrZSB0b28gbXVjaCBzZW5zZSB0byBzZXQgdGhlIGRhdGEgcmF0ZQorCQkgKiAgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgdG8gdXNlIGZvciB0aGUgd3JpdGUKKwkJICogIHByZWNvbXBlbnNhdGlvbi4KKwkJICogIE5lZWQgdG8gZG8gdGhpcyBhZ2FpbiB3aGVuIGZvcm1hdHRpbmcgdGhlIGNhcnRyaWRnZS4KKwkJICovCisJCWZ0X2RhdGFfcmF0ZSA9IGRhdGFfcmF0ZTsKKwkJZnRhcGVfY2FsY190aW1lb3V0cyhRSUNfVEFQRV9RSUM0MCwKKwkJCQkgICAgZGF0YV9yYXRlLAorCQkJCSAgICBmdGFwZV90YXBlX2xlbik7CisJfQorCWZ0YXBlX25ld19jYXJ0cmlkZ2UoKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZ0YXBlX211bm1hcCh2b2lkKQoreworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWZvciAoaSA9IDA7IGkgPCBmdF9ucl9idWZmZXJzOyBpKyspIHsKKwkJZnRfYnVmZmVyW2ldLT5tbWFwcGVkID0gMDsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKworLyogICBNYXAgdGhlIGRtYSBidWZmZXJzIGludG8gdGhlIHZpcnR1YWwgYWRkcmVzcyByYW5nZSBnaXZlbiBieSB2bWEuCisgKiAgIFdlIG9ubHkgY2hlY2sgdGhlIGNhbGxlciBkb2Vzbid0IG1hcCBub24tZXhpc3RlbnQgYnVmZmVycy4gV2UKKyAqICAgZG9uJ3QgY2hlY2sgZm9yIG11bHRpcGxlIG1hcHBpbmdzLgorICovCitpbnQgZnRhcGVfbW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgbnVtX2J1ZmZlcnM7CisJaW50IGk7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKGZ0X2ZhaWx1cmUpIHsKKwkJVFJBQ0VfRVhJVCAtRU5PREVWOworCX0KKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUR8Vk1fV1JJVEUpKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2VyciwgIlVuZGVmaW5lZCBtbWFwKCkgYWNjZXNzIik7CisJfQorCWlmICh2bWFfZ2V0X3Bnb2ZmKHZtYSkgIT0gMCkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2VyciwgInBhZ2Ugb2Zmc2V0IG11c3QgYmUgMCIpOworCX0KKwlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgJSBGVF9CVUZGX1NJWkUgIT0gMCkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2VyciwKKwkJCSAgICAic2l6ZSA9ICVsZCwgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgJWQiLAorCQkJICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCSAgICBGVF9CVUZGX1NJWkUpOworCX0KKwludW1fYnVmZmVycyA9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gRlRfQlVGRl9TSVpFOworCWlmIChudW1fYnVmZmVycyA+IGZ0X25yX2J1ZmZlcnMpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKKwkJCSAgICBmdF90X2VyciwgInNpemUgPSAlbGQsIHNob3VsZCBiZSBsZXNzIHRoYW4gJWQiLAorCQkJICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCSAgICBmdF9ucl9idWZmZXJzICogRlRfQlVGRl9TSVpFKTsKKwl9CisJaWYgKGZ0X2RyaXZlcl9zdGF0ZSAhPSBpZGxlKSB7CisJCS8qIHRoaXMgYWxzbyBjbGVhcnMgdGhlIGJ1ZmZlciBzdGF0ZXMgCisJCSAqLworCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwl9IGVsc2UgeworCQlmdGFwZV9yZXNldF9idWZmZXIoKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBwZm47CisKKwkJcGZuID0gdmlydF90b19waHlzKGZ0X2J1ZmZlcltpXS0+YWRkcmVzcykgPj4gUEFHRV9TSElGVDsKKwkJVFJBQ0VfQ0FUQ0gocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCArCisJCQkJCSAgICAgaSAqIEZUX0JVRkZfU0laRSwKKwkJCQkJICAgICBwZm4sCisJCQkJCSAgICAgRlRfQlVGRl9TSVpFLAorCQkJCQkgICAgIHZtYS0+dm1fcGFnZV9wcm90KSwKKwkJCSAgICBfcmVzID0gLUVBR0FJTik7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZW1hcHBlZCBkbWEgYnVmZmVyIEAgJXAgdG8gbG9jYXRpb24gQCAlcCIsCisJCSAgICAgIGZ0X2J1ZmZlcltpXS0+YWRkcmVzcywKKwkJICAgICAgKHZvaWQgKikodm1hLT52bV9zdGFydCArIGkgKiBGVF9CVUZGX1NJWkUpKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyBpKyspIHsKKwkJbWVtc2V0KGZ0X2J1ZmZlcltpXS0+YWRkcmVzcywgMHhBQSwgRlRfQlVGRl9TSVpFKTsKKwkJZnRfYnVmZmVyW2ldLT5tbWFwcGVkKys7CisJfQkKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZ0YXBlX2luaXRfZHJpdmVyKHZvaWQpOyAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCisKKy8qICAgICAgT1BFTiByb3V0aW5lIGNhbGxlZCBieSBrZXJuZWwtaW50ZXJmYWNlIGNvZGUKKyAqLworaW50IGZ0YXBlX2VuYWJsZShpbnQgZHJpdmVfc2VsZWN0aW9uKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoZnRfZHJpdmVfc2VsID09IC0xIHx8IGZ0X2RyaXZlX3NlbCAhPSBkcml2ZV9zZWxlY3Rpb24pIHsKKwkJLyogT3RoZXIgc2VsZWN0aW9uIHRoYW4gbGFzdCB0aW1lCisJCSAqLworCQlmdGFwZV9pbml0X2RyaXZlcigpOworCX0KKwlmdF9kcml2ZV9zZWwgPSBGVEFQRV9TRUwoZHJpdmVfc2VsZWN0aW9uKTsKKwlmdF9mYWlsdXJlID0gMDsKKwlUUkFDRV9DQVRDSChmZGNfaW5pdCgpLCk7IC8qIGluaXQgJiBkZXRlY3QgZmRjICovCisJVFJBQ0VfQ0FUQ0goZnRhcGVfYWN0aXZhdGVfZHJpdmUoJmZ0X2RyaXZlX3R5cGUpLAorCQkgICAgZmRjX2Rpc2FibGUoKTsKKwkJICAgIGZkY19yZWxlYXNlX2lycV9hbmRfZG1hKCk7CisJCSAgICBmZGNfcmVsZWFzZV9yZWdpb25zKCkpOworCVRSQUNFX0NBVENIKGZ0YXBlX2dldF9kcml2ZV9zdGF0dXMoKSwgZnRhcGVfZGV0YWNoX2RyaXZlKCkpOworCWlmIChmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCA9PSBVTktOT1dOX1ZFTkRPUikgeworCQlmdGFwZV9sb2dfdmVuZG9yX2lkKCk7CisJfQorCWlmIChmdF9uZXdfdGFwZSkgeworCQlmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDE7CisJfQorCWlmICghZnRfbm9fdGFwZSAmJiBmdGFwZV9pbml0X2RyaXZlX25lZWRlZCkgeworCQlUUkFDRV9DQVRDSChmdGFwZV9pbml0X2RyaXZlKCksIGZ0YXBlX2RldGFjaF9kcml2ZSgpKTsKKwl9CisJZnRhcGVfbXVubWFwKCk7IC8qIGNsZWFyIHRoZSBtbWFwIGZsYWcgKi8KKwljbGVhcl9oaXN0b3J5KCk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgIHJlbGVhc2Ugcm91dGluZSBjYWxsZWQgYnkgdGhlIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlIG1vZHVsZXMKKyAqICAgemZ0YXBlIG9yIHNmdGFwZS4KKyAqLwordm9pZCBmdGFwZV9kaXNhYmxlKHZvaWQpCit7CisJaW50IGk7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWZvciAoaSA9IDA7IGkgPCBmdF9ucl9idWZmZXJzOyBpKyspIHsKKwkJaWYgKGZ0X2J1ZmZlcltpXS0+bW1hcHBlZCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImZpcnN0IGJ5dGUgb2YgYnVmZmVyICVkOiAweCUwMngiLAorCQkJICAgICAgaSwgKmZ0X2J1ZmZlcltpXS0+YWRkcmVzcyk7CisJCX0KKwl9CisJaWYgKHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX0RPTlRfQkxPQ0spICYmIAorCSAgICAhKHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX05FVkVSX0JMT0NLKSkgJiYKKwkgICAgZnRhcGVfdGFwZV9ydW5uaW5nKSB7CisJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJICAgICAgIkludGVycnVwdGVkIGJ5IGZhdGFsIHNpZ25hbCBhbmQgdGFwZSBzdGlsbCBydW5uaW5nIik7CisJCWZ0YXBlX2R1bWJfc3RvcCgpOworCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsgLyogaXQncyBhbm5veWluZyAqLworCX0gZWxzZSB7CisJCWZ0YXBlX3NldF9zdGF0ZShpZGxlKTsKKwl9CisJZnRhcGVfZGV0YWNoX2RyaXZlKCk7CisJaWYgKGZ0X2hpc3RvcnkudXNlZCkgeworCQlUUkFDRShmdF90X2luZm8sICI9PSBOb24tZmF0YWwgZXJyb3JzIHRoaXMgcnVuOiA9PSIpOworCQlUUkFDRShmdF90X2luZm8sICJmZGMgaXNyIHN0YXRpc3RpY3M6XG4iCisJCSAgICAgIEtFUk5fSU5GTyAiIGlkX2FtX2Vycm9ycyAgICAgOiAlM2RcbiIKKwkJICAgICAgS0VSTl9JTkZPICIgaWRfY3JjX2Vycm9ycyAgICA6ICUzZFxuIgorCQkgICAgICBLRVJOX0lORk8gIiBkYXRhX2FtX2Vycm9ycyAgIDogJTNkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiIGRhdGFfY3JjX2Vycm9ycyAgOiAlM2RcbiIKKwkJICAgICAgS0VSTl9JTkZPICIgb3ZlcnJ1bl9lcnJvcnMgICA6ICUzZFxuIgorCQkgICAgICBLRVJOX0lORk8gIiBub19kYXRhX2Vycm9ycyAgIDogJTNkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiIHJldHJpZXMgICAgICAgICAgOiAlM2QiLAorCQkgICAgICBmdF9oaXN0b3J5LmlkX2FtX2Vycm9ycywgICBmdF9oaXN0b3J5LmlkX2NyY19lcnJvcnMsCisJCSAgICAgIGZ0X2hpc3RvcnkuZGF0YV9hbV9lcnJvcnMsIGZ0X2hpc3RvcnkuZGF0YV9jcmNfZXJyb3JzLAorCQkgICAgICBmdF9oaXN0b3J5Lm92ZXJydW5fZXJyb3JzLCBmdF9oaXN0b3J5Lm5vX2RhdGFfZXJyb3JzLAorCQkgICAgICBmdF9oaXN0b3J5LnJldHJpZXMpOworCQlpZiAoZnRfaGlzdG9yeS51c2VkICYgMSkgeworCQkJVFJBQ0UoZnRfdF9pbmZvLCAiZWNjIHN0YXRpc3RpY3M6XG4iCisJCQkgICAgICBLRVJOX0lORk8gIiBjcmNfZXJyb3JzICAgICAgIDogJTNkXG4iCisJCQkgICAgICBLRVJOX0lORk8gIiBjcmNfZmFpbHVyZXMgICAgIDogJTNkXG4iCisJCQkgICAgICBLRVJOX0lORk8gIiBlY2NfZmFpbHVyZXMgICAgIDogJTNkXG4iCisJCQkgICAgICBLRVJOX0lORk8gIiBzZWN0b3JzIGNvcnJlY3RlZDogJTNkIiwKKwkJCSAgICAgIGZ0X2hpc3RvcnkuY3JjX2Vycm9ycywgICBmdF9oaXN0b3J5LmNyY19mYWlsdXJlcywKKwkJCSAgICAgIGZ0X2hpc3RvcnkuZWNjX2ZhaWx1cmVzLCBmdF9oaXN0b3J5LmNvcnJlY3RlZCk7CisJCX0KKwkJaWYgKGZ0X2hpc3RvcnkuZGVmZWN0cyA+IDApIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgIldhcm5pbmc6ICVkIG1lZGlhIGRlZmVjdHMhIiwKKwkJCSAgICAgIGZ0X2hpc3RvcnkuZGVmZWN0cyk7CisJCX0KKwkJaWYgKGZ0X2hpc3RvcnkucmV3aW5kcyA+IDApIHsKKwkJCVRSQUNFKGZ0X3RfaW5mbywgInRhcGUgbW90aW9uIHN0YXRpc3RpY3M6XG4iCisJCQkgICAgICBLRVJOX0lORk8gInJlcG9zaXRpb25zICAgICAgIDogJTNkIiwKKwkJCSAgICAgIGZ0X2hpc3RvcnkucmV3aW5kcyk7CisJCX0KKwl9CisJZnRfZmFpbHVyZSA9IDE7CisJVFJBQ0VfRVhJVDsKK30KKworc3RhdGljIHZvaWQgZnRhcGVfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0X2RyaXZlX3R5cGUudmVuZG9yX2lkID0gVU5LTk9XTl9WRU5ET1I7CisJZnRfZHJpdmVfdHlwZS5zcGVlZCAgICAgPSAwOworCWZ0X2RyaXZlX3R5cGUud2FrZV91cCAgID0gdW5rbm93bl93YWtlX3VwOworCWZ0X2RyaXZlX3R5cGUubmFtZSAgICAgID0gIlVua25vd24iOworCisJZnRhcGVfdGltZW91dC5zZWVrICAgICAgPSA2NTAgKiBGVF9TRUNPTkQ7CisJZnRhcGVfdGltZW91dC5yZXNldCAgICAgPSA2NzAgKiBGVF9TRUNPTkQ7CisJZnRhcGVfdGltZW91dC5yZXdpbmQgICAgPSA2NTAgKiBGVF9TRUNPTkQ7CisJZnRhcGVfdGltZW91dC5oZWFkX3NlZWsgPSAgMTUgKiBGVF9TRUNPTkQ7CisJZnRhcGVfdGltZW91dC5zdG9wICAgICAgPSAgIDUgKiBGVF9TRUNPTkQ7CisJZnRhcGVfdGltZW91dC5wYXVzZSAgICAgPSAgMTYgKiBGVF9TRUNPTkQ7CisKKwlmdF9xaWNfc3RkICAgICAgICAgICAgID0gLTE7CisJZnRhcGVfdGFwZV9sZW4gICAgICAgICA9IDA7ICAvKiB1bmtub3duICovCisJZnRhcGVfY3VycmVudF9jb21tYW5kICA9IDA7CisJZnRhcGVfY3VycmVudF9jeWxpbmRlciA9IC0xOworCisJZnRfc2VnbWVudHNfcGVyX3RyYWNrICAgICAgID0gMTAyOworCWZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkICAgICA9IDEwMjA7CisJZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyID0gNDsKKwlmdF90cmFja3NfcGVyX3RhcGUgICAgICAgICAgPSAyMDsKKworCWZ0X2ZhaWx1cmUgPSAxOworCisJZnRfZm9ybWF0dGVkICAgICAgID0gMDsKKwlmdF9ub190YXBlICAgICAgICAgPSAxOworCWZ0X3dyaXRlX3Byb3RlY3RlZCA9IDE7CisJZnRfbmV3X3RhcGUgICAgICAgID0gMTsKKworCWZ0X2RyaXZlcl9zdGF0ZSA9IGlkbGU7CisKKwlmdF9kYXRhX3JhdGUgPSAKKwkJZnRfZmRjX21heF9yYXRlICAgPSA1MDA7CisJZnRfZHJpdmVfbWF4X3JhdGUgPSAwOyAvKiB0cmlnZ2VycyBzZXRfcmF0ZV90ZXN0KCkgKi8KKworCWZ0YXBlX2luaXRfZHJpdmVfbmVlZGVkID0gMTsKKworCWZ0X2hlYWRlcl9zZWdtZW50XzEgICAgPSAtMTsKKwlmdF9oZWFkZXJfc2VnbWVudF8yICAgID0gLTE7CisJZnRfdXNlZF9oZWFkZXJfc2VnbWVudCA9IC0xOworCWZ0X2ZpcnN0X2RhdGFfc2VnbWVudCAgPSAtMTsKKwlmdF9sYXN0X2RhdGFfc2VnbWVudCAgID0gLTE7CisKKwlmdF9sb2NhdGlvbi50cmFjayA9IC0xOworCWZ0X2xvY2F0aW9uLmtub3duID0gMDsKKworCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CisJZnRhcGVfbWlnaHRfYmVfb2ZmX3RyYWNrID0gMTsKKworCWZ0YXBlX25ld19jYXJ0cmlkZ2UoKTsJLyogaW5pdCBzb21lIHRhcGUgcmVsYXRlZCB2YXJpYWJsZXMgKi8KKwlmdGFwZV9pbml0X2JzbSgpOworCVRSQUNFX0VYSVQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1ZTMwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuaApAQCAtMCwwICsxLDE2MiBAQAorI2lmbmRlZiBfRlRBUEVfQ1RMX0gKKyNkZWZpbmUgX0ZUQVBFX0NUTF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1jdGwuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjA5ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm9uLXN0YW5kYXJkIElPQ1RMIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvcgorICogICAgICBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGlvLmg+CisjaW5jbHVkZSA8bGludXgvZnRhcGUtdmVuZG9ycy5oPgorCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS1oZWFkZXItc2VnbWVudC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHVzZWQ7CQkvKiBhbnkgcmVhZGluZyBvciB3cml0aW5nIGRvbmUgKi8KKwkvKiBpc3Igc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGludCBpZF9hbV9lcnJvcnM7CS8qIGlkIGFkZHJlc3MgbWFyayBub3QgZm91bmQgKi8KKwl1bnNpZ25lZCBpbnQgaWRfY3JjX2Vycm9yczsJLyogY3JjIGVycm9yIGluIGlkIGFkZHJlc3MgbWFyayAqLworCXVuc2lnbmVkIGludCBkYXRhX2FtX2Vycm9yczsJLyogZGF0YSBhZGRyZXNzIG1hcmsgbm90IGZvdW5kICovCisJdW5zaWduZWQgaW50IGRhdGFfY3JjX2Vycm9yczsJLyogY3JjIGVycm9yIGluIGRhdGEgZmllbGQgKi8KKwl1bnNpZ25lZCBpbnQgb3ZlcnJ1bl9lcnJvcnM7CS8qIGZkYyBhY2Nlc3MgdGltaW5nIHByb2JsZW0gKi8KKwl1bnNpZ25lZCBpbnQgbm9fZGF0YV9lcnJvcnM7CS8qIHNlY3RvciBub3QgZm91bmQgKi8KKwl1bnNpZ25lZCBpbnQgcmV0cmllczsJLyogbnVtYmVyIG9mIHRhcGUgcmV0cmllcyAqLworCS8qIGVjYyBzdGF0aXN0aWNzICovCisJdW5zaWduZWQgaW50IGNyY19lcnJvcnM7CS8qIGNyYyBlcnJvciBpbiBkYXRhICovCisJdW5zaWduZWQgaW50IGNyY19mYWlsdXJlczsJLyogYmFkIGRhdGEgd2l0aG91dCBjcmMgZXJyb3IgKi8KKwl1bnNpZ25lZCBpbnQgZWNjX2ZhaWx1cmVzOwkvKiBmYWlsZWQgdG8gY29ycmVjdCAqLworCXVuc2lnbmVkIGludCBjb3JyZWN0ZWQ7CS8qIHRvdGFsIHNlY3RvcnMgY29ycmVjdGVkICovCisJLyogZ2VuZXJhbCBzdGF0aXN0aWNzICovCisJdW5zaWduZWQgaW50IHJld2luZHM7CS8qIG51bWJlciBvZiB0YXBlIHJld2luZHMgKi8KKwl1bnNpZ25lZCBpbnQgZGVmZWN0czsJLyogYmFkIHNlY3RvcnMgZHVlIHRvIG1lZGlhIGRlZmVjdHMgKi8KK30gaGlzdG9yeV9yZWNvcmQ7CisKKy8qIHRoaXMgc3RydWN0dXJlIGNvbnRhaW5zICogQUxMICogaW5mb3JtYXRpb24gdGhhdCB3ZSB3YW50CisgKiBvdXIgY2hpbGQgbW9kdWxlcyB0byBrbm93IGFib3V0LCBidXQgZG9uJ3Qgd2FudCB0aGVtIHRvCisgKiBtb2RpZnkuIAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyogIHZlbmRvciBpbmZvcm1hdGlvbiAqLworCXZlbmRvcl9zdHJ1Y3QgZnRpX2RyaXZlX3R5cGU7CisJLyogIGRhdGEgcmF0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgZnRpX3VzZWRfZGF0YV9yYXRlOworCXVuc2lnbmVkIGludCBmdGlfZHJpdmVfbWF4X3JhdGU7CisJdW5zaWduZWQgaW50IGZ0aV9mZGNfbWF4X3JhdGU7CisJLyogIGRyaXZlIHNlbGVjdGlvbiwgZWl0aGVyIEZUQVBFX1NFTF9BL0IvQy9EICovCisJaW50IGZ0aV9kcml2ZV9zZWw7ICAgICAgCisJLyogIGZsYWdzIHNldCBhZnRlciBkZWNvZGUgdGhlIGRyaXZlIGFuZCB0YXBlIHN0YXR1cyAgICovCisJdW5zaWduZWQgaW50IGZ0aV9mb3JtYXR0ZWQgICAgICA6MTsKKwl1bnNpZ25lZCBpbnQgZnRpX25vX3RhcGUgICAgICAgIDoxOworCXVuc2lnbmVkIGludCBmdGlfd3JpdGVfcHJvdGVjdGVkOjE7CisJdW5zaWduZWQgaW50IGZ0aV9uZXdfdGFwZSAgICAgICA6MTsKKwkvKiAgdmFsdWVzIG9mIGxhc3QgcXVlcmllZCBkcml2ZS90YXBlIHN0YXR1cyBhbmQgZXJyb3IgKi8KKwlmdF9kcml2ZV9lcnJvciAgZnRpX2xhc3RfZXJyb3I7CisJZnRfZHJpdmVfc3RhdHVzIGZ0aV9sYXN0X3N0YXR1czsKKwkvKiAgY2FydHJpZGdlIGdlb21ldHJ5ICovCisJdW5zaWduZWQgaW50IGZ0aV90cmFja3NfcGVyX3RhcGU7CisJdW5zaWduZWQgaW50IGZ0aV9zZWdtZW50c19wZXJfdHJhY2s7CisJLyogIGxvY2F0aW9uIG9mIGhlYWRlciBzZWdtZW50cywgZXRjLiAqLworCWludCBmdGlfdXNlZF9oZWFkZXJfc2VnbWVudDsKKwlpbnQgZnRpX2hlYWRlcl9zZWdtZW50XzE7CisJaW50IGZ0aV9oZWFkZXJfc2VnbWVudF8yOworCWludCBmdGlfZmlyc3RfZGF0YV9zZWdtZW50OworCWludCBmdGlfbGFzdF9kYXRhX3NlZ21lbnQ7CisJLyogIHRoZSBmb3JtYXQgY29kZSBhcyBzdG9yZWQgaW4gdGhlIGhlYWRlciBzZWdtZW50ICAqLworCWZ0X2Zvcm1hdF90eXBlICBmdGlfZm9ybWF0X2NvZGU7CisJLyogIHRoZSBmb2xsb3dpbmcgaXMgdGhlIHNvbGUgcmVhc29uIGZvciB0aGUgZnRhcGVfc2V0X3N0YXR1cygpIGNhbGwgKi8KKwl1bnNpZ25lZCBpbnQgZnRpX3FpY19zdGQ7CisJLyogIGlzIHRhcGUgcnVubmluZz8gKi8KKwl2b2xhdGlsZSBlbnVtIHJ1bm5lcl9zdGF0dXNfZW51bSBmdGlfcnVubmVyX3N0YXR1czsKKwkvKiAgaXMgdGFwZSByZWFkaW5nL3dyaXRpbmcvdmVyaWZ5aW5nL2Zvcm1hdHRpbmcvZGVsZXRpbmcgKi8KKwlidWZmZXJfc3RhdGVfZW51bSBmdGlfc3RhdGU7CisJLyogIGZsYWdzIGZhdGFsIGhhcmR3YXJlIGVycm9yICovCisJdW5zaWduZWQgaW50IGZ0aV9mYWlsdXJlOjE7CisJLyogIGhpc3RvcnkgcmVjb3JkICovCisJaGlzdG9yeV9yZWNvcmQgZnRpX2hpc3Rvcnk7Cit9IGZ0YXBlX2luZm87CisKKy8qIHZlbmRvciBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBmdF9kcml2ZV90eXBlICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZHJpdmVfdHlwZQorLyogIGRhdGEgcmF0ZXMgKi8KKyNkZWZpbmUgZnRfZGF0YV9yYXRlICAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX3VzZWRfZGF0YV9yYXRlCisjZGVmaW5lIGZ0X2RyaXZlX21heF9yYXRlICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9kcml2ZV9tYXhfcmF0ZQorI2RlZmluZSBmdF9mZGNfbWF4X3JhdGUgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfZmRjX21heF9yYXRlCisvKiAgZHJpdmUgc2VsZWN0aW9uLCBlaXRoZXIgRlRBUEVfU0VMX0EvQi9DL0QgKi8KKyNkZWZpbmUgZnRfZHJpdmVfc2VsICAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2RyaXZlX3NlbAorLyogIGZsYWdzIHNldCBhZnRlciBkZWNvZGUgdGhlIGRyaXZlIGFuZCB0YXBlIHN0YXR1cyAgICovCisjZGVmaW5lIGZ0X2Zvcm1hdHRlZCAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9mb3JtYXR0ZWQKKyNkZWZpbmUgZnRfbm9fdGFwZSAgICAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX25vX3RhcGUKKyNkZWZpbmUgZnRfd3JpdGVfcHJvdGVjdGVkICAgICBmdGFwZV9zdGF0dXMuZnRpX3dyaXRlX3Byb3RlY3RlZAorI2RlZmluZSBmdF9uZXdfdGFwZSAgICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfbmV3X3RhcGUKKy8qICB2YWx1ZXMgb2YgbGFzdCBxdWVyaWVkIGRyaXZlL3RhcGUgc3RhdHVzIGFuZCBlcnJvciAqLworI2RlZmluZSBmdF9sYXN0X2Vycm9yICAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfbGFzdF9lcnJvcgorI2RlZmluZSBmdF9sYXN0X3N0YXR1cyAgICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfbGFzdF9zdGF0dXMKKy8qICBjYXJ0cmlkZ2UgZ2VvbWV0cnkgKi8KKyNkZWZpbmUgZnRfdHJhY2tzX3Blcl90YXBlICAgICBmdGFwZV9zdGF0dXMuZnRpX3RyYWNrc19wZXJfdGFwZQorI2RlZmluZSBmdF9zZWdtZW50c19wZXJfdHJhY2sgIGZ0YXBlX3N0YXR1cy5mdGlfc2VnbWVudHNfcGVyX3RyYWNrCisvKiAgdGhlIGZvcm1hdCBjb2RlIGFzIHN0b3JlZCBpbiB0aGUgaGVhZGVyIHNlZ21lbnQgICovCisjZGVmaW5lIGZ0X2Zvcm1hdF9jb2RlICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9mb3JtYXRfY29kZQorLyogIHRoZSBxaWMgc3RhdHVzIGFzIHJldHVybmVkIGJ5IHJlcG9ydCBkcml2ZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIGZ0X3FpY19zdGQgICAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9xaWNfc3RkCisjZGVmaW5lIGZ0X3VzZWRfaGVhZGVyX3NlZ21lbnQgZnRhcGVfc3RhdHVzLmZ0aV91c2VkX2hlYWRlcl9zZWdtZW50CisjZGVmaW5lIGZ0X2hlYWRlcl9zZWdtZW50XzEgICAgZnRhcGVfc3RhdHVzLmZ0aV9oZWFkZXJfc2VnbWVudF8xCisjZGVmaW5lIGZ0X2hlYWRlcl9zZWdtZW50XzIgICAgZnRhcGVfc3RhdHVzLmZ0aV9oZWFkZXJfc2VnbWVudF8yCisjZGVmaW5lIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCAgZnRhcGVfc3RhdHVzLmZ0aV9maXJzdF9kYXRhX3NlZ21lbnQKKyNkZWZpbmUgZnRfbGFzdF9kYXRhX3NlZ21lbnQgICBmdGFwZV9zdGF0dXMuZnRpX2xhc3RfZGF0YV9zZWdtZW50CisvKiAgaXMgdGFwZSBydW5uaW5nPyAqLworI2RlZmluZSBmdF9ydW5uZXJfc3RhdHVzICAgICAgIGZ0YXBlX3N0YXR1cy5mdGlfcnVubmVyX3N0YXR1cworLyogIGlzIHRhcGUgcmVhZGluZy93cml0aW5nL3ZlcmlmeWluZy9mb3JtYXR0aW5nL2RlbGV0aW5nICovCisjZGVmaW5lIGZ0X2RyaXZlcl9zdGF0ZSAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9zdGF0ZQorLyogIGZsYWdzIGZhdGFsIGhhcmR3YXJlIGVycm9yICovCisjZGVmaW5lIGZ0X2ZhaWx1cmUgICAgICAgICAgICAgZnRhcGVfc3RhdHVzLmZ0aV9mYWlsdXJlCisvKiAgaGlzdG9yeSByZWNvcmQgKi8KKyNkZWZpbmUgZnRfaGlzdG9yeSAgICAgICAgICAgICBmdGFwZV9zdGF0dXMuZnRpX2hpc3RvcnkKKworLyoKKyAqICAgICAgZnRhcGUtY3RsLmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworZXh0ZXJuIGZ0YXBlX2luZm8gZnRhcGVfc3RhdHVzOworZXh0ZXJuIGludCBmdGFwZV9zZWdtZW50c19wZXJfaGVhZDsKK2V4dGVybiBpbnQgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyOworZXh0ZXJuIGludCBmdGFwZV9pbml0X2RyaXZlX25lZWRlZDsKKworLyoKKyAqICAgICAgZnRhcGUtY3RsLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCitleHRlcm4gaW50ICBmdGFwZV9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK2V4dGVybiBpbnQgIGZ0YXBlX2VuYWJsZShpbnQgZHJpdmVfc2VsZWN0aW9uKTsKK2V4dGVybiB2b2lkIGZ0YXBlX2Rpc2FibGUodm9pZCk7CitleHRlcm4gaW50ICBmdGFwZV9zZWVrX3RvX2JvdCh2b2lkKTsKK2V4dGVybiBpbnQgIGZ0YXBlX3NlZWtfdG9fZW90KHZvaWQpOworZXh0ZXJuIGludCAgZnRhcGVfYWJvcnRfb3BlcmF0aW9uKHZvaWQpOworZXh0ZXJuIHZvaWQgZnRhcGVfY2FsY190aW1lb3V0cyh1bnNpZ25lZCBpbnQgcWljX3N0ZCwKKwkJCQkgdW5zaWduZWQgaW50IGRhdGFfcmF0ZSwKKwkJCQkgdW5zaWduZWQgaW50IHRhcGVfbGVuKTsKK2V4dGVybiBpbnQgIGZ0YXBlX2NhbGlicmF0ZV9kYXRhX3JhdGUodW5zaWduZWQgaW50IHFpY19zdGQpOworZXh0ZXJuIGNvbnN0IGZ0YXBlX2luZm8gKmZ0YXBlX2dldF9zdGF0dXModm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTYzMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWVjYy5jCkBAIC0wLDAgKzEsODUzIEBACisvKgorICoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAxOTkzIE5pbmcgYW5kIERhdmlkIE1vc2Jlcmdlci4KKyAKKyBUaGlzIGlzIGJhc2VkIG9uIGNvZGUgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEJhcyBMYWFyaG92ZW4gKGJhc0B2aW1lYy5ubCkKKyBhbmQgRGF2aWQgTC4gQnJvd24sIEpyLiwgYW5kIGluY29ycG9yYXRlcyBpbXByb3ZlbWVudHMgc3VnZ2VzdGVkIGJ5CisgS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4uCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjEwICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgUmVlZC1Tb2xvbW9uIGVycm9yIGNvcnJlY3Rpb24gY29kZSAKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1lY2MuaCIKKworLyogTWFjaGluZXMgdGhhdCBhcmUgYmlnLWVuZGlhbiBzaG91bGQgZGVmaW5lIG1hY3JvIEJJR19FTkRJQU4uCisgKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHN0YW5kYXJkIGluY2x1ZGUgZmlsZQorICogdGhhdCB3b3JrcyBmb3IgYWxsIE9Tcy4KKyAqLworCisjaWYgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19ocHBhKQorI2RlZmluZSBCSUdfRU5ESUFOCisjZW5kaWYJCQkJLyogX19zcGFyY19fIHx8IF9faHBwYSAqLworCisjaWYgZGVmaW5lZChfX21pcHNfXykKKyNlcnJvciBGaW5kIGEgc21hcnQgd2F5IHRvIGRldGVybWluZSB0aGUgRW5kaWFubmVzcyBvZiB0aGUgTUlQUyBDUFUKKyNlbmRpZgorCisvKiBOb3RpY2U6IHRvIG1pbmltaXplIHRoZSBwb3RlbnRpYWwgZm9yIGNvbmZ1c2lvbiwgd2UgdXNlIHIgdG8KKyAqICAgICAgICAgZGVub3RlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSBvZiB0aGUgcG9seW5vbWlhbHMgaW4gdGhlCisgKiAgICAgICAgIEdhbG9pcyBGaWVsZCBHRigyXjgpLiAgV2UgcmVzZXJ2ZSB4IGZvciBwb2x5bm9taWFscyB0aGF0CisgKiAgICAgICAgIHRoYXQgaGF2ZSBjb2VmZmljaWVudHMgaW4gR0YoMl44KS4KKyAqICAgICAgICAgCisgKiBUaGUgR2Fsb2lzIEZpZWxkIGluIHdoaWNoIGNvZWZmaWNpZW50IGFyaXRobWV0aWMgaXMgcGVyZm9ybWVkIGFyZQorICogdGhlIHBvbHlub21pYWxzIG92ZXIgWl8yIChpLmUuLCAwIGFuZCAxKSBtb2R1bG8gdGhlIGlycmVkdWNpYmxlCisgKiBwb2x5bm9taWFsIGYociksIHdoZXJlIGYocik9cl44ICsgcl43ICsgcl4yICsgciArIDEuICBBIHBvbHlub21pYWwKKyAqIGlzIHJlcHJlc2VudGVkIGFzIGEgYnl0ZSB3aXRoIHRoZSBNU0IgYXMgdGhlIGNvZWZmaWNpZW50IG9mIHJeNyBhbmQKKyAqIHRoZSBMU0IgYXMgdGhlIGNvZWZmaWNpZW50IG9mIHJeMC4gIEZvciBleGFtcGxlLCB0aGUgYmluYXJ5CisgKiByZXByZXNlbnRhdGlvbiBvZiBmKHgpIGlzIDB4MTg3IChvZiBjb3Vyc2UsIHRoaXMgZG9lc24ndCBmaXQgaW50byA4CisgKiBiaXRzKS4gIEluIHRoaXMgZmllbGQsIHRoZSBwb2x5bm9taWFsIHIgaXMgYSBwcmltaXRpdmUgZWxlbWVudC4KKyAqIFRoYXQgaXMsIHJeaSB3aXRoIGkgaW4gMCwuLi4sMjU1IGVudW1lcmF0ZXMgYWxsIGVsZW1lbnRzIGluIHRoZQorICogZmllbGQuCisgKgorICogVGhlIGdlbmVyYXRvciBwb2x5bm9taWFsIGZvciB0aGUgUUlDLTgwIEVDQyBpcworICoKKyAqICAgICAgZyh4KSA9IHheMyArIHJeMTA1KnheMiArIHJeMTA1KnggKyAxCisgKgorICogd2hpY2ggY2FuIGJlIGZhY3RvcmVkIGludG86CisgKgorICogICAgICBnKHgpID0gKHgtcl4tMSkoeC1yXjApKHgtcl4xKQorICoKKyAqIHRoZSBieXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMgYXJlOgorICoKKyAqICAgICAgcl4xMDUgPSAweGMwCisgKiAgICAgIHJeLTEgID0gMHhjMworICogICAgICByXjAgICA9IDB4MDEKKyAqICAgICAgcl4xICAgPSAweDAyCisgKgorICogTm90aWNlIHRoYXQgcl4tMSA9IHJeMjU0IGFzIGV4cG9uZW50IGFyaXRobWV0aWMgaXMgcGVyZm9ybWVkCisgKiBtb2R1bG8gMl44LTEgPSAyNTUuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gR2Fsb2lzIEZpZWxkcyBhbmQgUmVlZC1Tb2xvbW9uIGNvZGVzLCByZWZlcgorICogdG8gYW55IGdvb2QgYm9vay4gIEkgZm91bmQgX0FuIEludHJvZHVjdGlvbiB0byBFcnJvciBDb3JyZWN0aW5nCisgKiBDb2RlcyB3aXRoIEFwcGxpY2F0aW9uc18gYnkgUy4gQS4gVmFuc3RvbmUgYW5kIFAuIEMuIHZhbiBPb3JzY2hvdAorICogdG8gYmUgYSBnb29kIGludHJvZHVjdGlvbiBpbnRvIHRoZSBmb3JtZXIuICBfQ09ESU5HIFRIRU9SWTogVGhlCisgKiBFc3NlbnRpYWxzXyBJIGZvdW5kIHZlcnkgdXNlZnVsIGZvciBpdHMgY29uY2lzZSBkZXNjcmlwdGlvbiBvZgorICogUmVlZC1Tb2xvbW9uIGVuY29kaW5nL2RlY29kaW5nLgorICoKKyAqLworCit0eXBlZGVmIF9fdTggTWF0cml4WzNdWzNdOworCisvKgorICogZ2Zwb3dbXSBpcyBkZWZpbmVkIHN1Y2ggdGhhdCBnZnBvd1tpXSByZXR1cm5zIHJeaSBpZgorICogaSBpcyBpbiB0aGUgcmFuZ2UgWzAuLjI1NV0uCisgKi8KK3N0YXRpYyBjb25zdCBfX3U4IGdmcG93W10gPQoreworCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCisJMHg4NywgMHg4OSwgMHg5NSwgMHhhZCwgMHhkZCwgMHgzZCwgMHg3YSwgMHhmNCwKKwkweDZmLCAweGRlLCAweDNiLCAweDc2LCAweGVjLCAweDVmLCAweGJlLCAweGZiLAorCTB4NzEsIDB4ZTIsIDB4NDMsIDB4ODYsIDB4OGIsIDB4OTEsIDB4YTUsIDB4Y2QsCisJMHgxZCwgMHgzYSwgMHg3NCwgMHhlOCwgMHg1NywgMHhhZSwgMHhkYiwgMHgzMSwKKwkweDYyLCAweGM0LCAweDBmLCAweDFlLCAweDNjLCAweDc4LCAweGYwLCAweDY3LAorCTB4Y2UsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4MzcsIDB4NmUsIDB4ZGMsCisJMHgzZiwgMHg3ZSwgMHhmYywgMHg3ZiwgMHhmZSwgMHg3YiwgMHhmNiwgMHg2YiwKKwkweGQ2LCAweDJiLCAweDU2LCAweGFjLCAweGRmLCAweDM5LCAweDcyLCAweGU0LAorCTB4NGYsIDB4OWUsIDB4YmIsIDB4ZjEsIDB4NjUsIDB4Y2EsIDB4MTMsIDB4MjYsCisJMHg0YywgMHg5OCwgMHhiNywgMHhlOSwgMHg1NSwgMHhhYSwgMHhkMywgMHgyMSwKKwkweDQyLCAweDg0LCAweDhmLCAweDk5LCAweGI1LCAweGVkLCAweDVkLCAweGJhLAorCTB4ZjMsIDB4NjEsIDB4YzIsIDB4MDMsIDB4MDYsIDB4MGMsIDB4MTgsIDB4MzAsCisJMHg2MCwgMHhjMCwgMHgwNywgMHgwZSwgMHgxYywgMHgzOCwgMHg3MCwgMHhlMCwKKwkweDQ3LCAweDhlLCAweDliLCAweGIxLCAweGU1LCAweDRkLCAweDlhLCAweGIzLAorCTB4ZTEsIDB4NDUsIDB4OGEsIDB4OTMsIDB4YTEsIDB4YzUsIDB4MGQsIDB4MWEsCisJMHgzNCwgMHg2OCwgMHhkMCwgMHgyNywgMHg0ZSwgMHg5YywgMHhiZiwgMHhmOSwKKwkweDc1LCAweGVhLCAweDUzLCAweGE2LCAweGNiLCAweDExLCAweDIyLCAweDQ0LAorCTB4ODgsIDB4OTcsIDB4YTksIDB4ZDUsIDB4MmQsIDB4NWEsIDB4YjQsIDB4ZWYsCisJMHg1OSwgMHhiMiwgMHhlMywgMHg0MSwgMHg4MiwgMHg4MywgMHg4MSwgMHg4NSwKKwkweDhkLCAweDlkLCAweGJkLCAweGZkLCAweDdkLCAweGZhLCAweDczLCAweGU2LAorCTB4NGIsIDB4OTYsIDB4YWIsIDB4ZDEsIDB4MjUsIDB4NGEsIDB4OTQsIDB4YWYsCisJMHhkOSwgMHgzNSwgMHg2YSwgMHhkNCwgMHgyZiwgMHg1ZSwgMHhiYywgMHhmZiwKKwkweDc5LCAweGYyLCAweDYzLCAweGM2LCAweDBiLCAweDE2LCAweDJjLCAweDU4LAorCTB4YjAsIDB4ZTcsIDB4NDksIDB4OTIsIDB4YTMsIDB4YzEsIDB4MDUsIDB4MGEsCisJMHgxNCwgMHgyOCwgMHg1MCwgMHhhMCwgMHhjNywgMHgwOSwgMHgxMiwgMHgyNCwKKwkweDQ4LCAweDkwLCAweGE3LCAweGM5LCAweDE1LCAweDJhLCAweDU0LCAweGE4LAorCTB4ZDcsIDB4MjksIDB4NTIsIDB4YTQsIDB4Y2YsIDB4MTksIDB4MzIsIDB4NjQsCisJMHhjOCwgMHgxNywgMHgyZSwgMHg1YywgMHhiOCwgMHhmNywgMHg2OSwgMHhkMiwKKwkweDIzLCAweDQ2LCAweDhjLCAweDlmLCAweGI5LCAweGY1LCAweDZkLCAweGRhLAorCTB4MzMsIDB4NjYsIDB4Y2MsIDB4MWYsIDB4M2UsIDB4N2MsIDB4ZjgsIDB4NzcsCisJMHhlZSwgMHg1YiwgMHhiNiwgMHhlYiwgMHg1MSwgMHhhMiwgMHhjMywgMHgwMQorfTsKKworLyoKKyAqIFRoaXMgaXMgYSBsb2cgdGFibGUuICBUaGF0IGlzLCBnZmxvZ1tyXmldIHJldHVybnMgaSAobW9kdWxvIGYocikpLgorICogZ2Zsb2dbMF0gaXMgdW5kZWZpbmVkIGFuZCB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGVyZWZvcmUgbm90IHZhbGlkLgorICovCitzdGF0aWMgY29uc3QgX191OCBnZmxvZ1syNTZdID0KK3sKKwkweGZmLCAweDAwLCAweDAxLCAweDYzLCAweDAyLCAweGM2LCAweDY0LCAweDZhLAorCTB4MDMsIDB4Y2QsIDB4YzcsIDB4YmMsIDB4NjUsIDB4N2UsIDB4NmIsIDB4MmEsCisJMHgwNCwgMHg4ZCwgMHhjZSwgMHg0ZSwgMHhjOCwgMHhkNCwgMHhiZCwgMHhlMSwKKwkweDY2LCAweGRkLCAweDdmLCAweDMxLCAweDZjLCAweDIwLCAweDJiLCAweGYzLAorCTB4MDUsIDB4NTcsIDB4OGUsIDB4ZTgsIDB4Y2YsIDB4YWMsIDB4NGYsIDB4ODMsCisJMHhjOSwgMHhkOSwgMHhkNSwgMHg0MSwgMHhiZSwgMHg5NCwgMHhlMiwgMHhiNCwKKwkweDY3LCAweDI3LCAweGRlLCAweGYwLCAweDgwLCAweGIxLCAweDMyLCAweDM1LAorCTB4NmQsIDB4NDUsIDB4MjEsIDB4MTIsIDB4MmMsIDB4MGQsIDB4ZjQsIDB4MzgsCisJMHgwNiwgMHg5YiwgMHg1OCwgMHgxYSwgMHg4ZiwgMHg3OSwgMHhlOSwgMHg3MCwKKwkweGQwLCAweGMyLCAweGFkLCAweGE4LCAweDUwLCAweDc1LCAweDg0LCAweDQ4LAorCTB4Y2EsIDB4ZmMsIDB4ZGEsIDB4OGEsIDB4ZDYsIDB4NTQsIDB4NDIsIDB4MjQsCisJMHhiZiwgMHg5OCwgMHg5NSwgMHhmOSwgMHhlMywgMHg1ZSwgMHhiNSwgMHgxNSwKKwkweDY4LCAweDYxLCAweDI4LCAweGJhLCAweGRmLCAweDRjLCAweGYxLCAweDJmLAorCTB4ODEsIDB4ZTYsIDB4YjIsIDB4M2YsIDB4MzMsIDB4ZWUsIDB4MzYsIDB4MTAsCisJMHg2ZSwgMHgxOCwgMHg0NiwgMHhhNiwgMHgyMiwgMHg4OCwgMHgxMywgMHhmNywKKwkweDJkLCAweGI4LCAweDBlLCAweDNkLCAweGY1LCAweGE0LCAweDM5LCAweDNiLAorCTB4MDcsIDB4OWUsIDB4OWMsIDB4OWQsIDB4NTksIDB4OWYsIDB4MWIsIDB4MDgsCisJMHg5MCwgMHgwOSwgMHg3YSwgMHgxYywgMHhlYSwgMHhhMCwgMHg3MSwgMHg1YSwKKwkweGQxLCAweDFkLCAweGMzLCAweDdiLCAweGFlLCAweDBhLCAweGE5LCAweDkxLAorCTB4NTEsIDB4NWIsIDB4NzYsIDB4NzIsIDB4ODUsIDB4YTEsIDB4NDksIDB4ZWIsCisJMHhjYiwgMHg3YywgMHhmZCwgMHhjNCwgMHhkYiwgMHgxZSwgMHg4YiwgMHhkMiwKKwkweGQ3LCAweDkyLCAweDU1LCAweGFhLCAweDQzLCAweDBiLCAweDI1LCAweGFmLAorCTB4YzAsIDB4NzMsIDB4OTksIDB4NzcsIDB4OTYsIDB4NWMsIDB4ZmEsIDB4NTIsCisJMHhlNCwgMHhlYywgMHg1ZiwgMHg0YSwgMHhiNiwgMHhhMiwgMHgxNiwgMHg4NiwKKwkweDY5LCAweGM1LCAweDYyLCAweGZlLCAweDI5LCAweDdkLCAweGJiLCAweGNjLAorCTB4ZTAsIDB4ZDMsIDB4NGQsIDB4OGMsIDB4ZjIsIDB4MWYsIDB4MzAsIDB4ZGMsCisJMHg4MiwgMHhhYiwgMHhlNywgMHg1NiwgMHhiMywgMHg5MywgMHg0MCwgMHhkOCwKKwkweDM0LCAweGIwLCAweGVmLCAweDI2LCAweDM3LCAweDBjLCAweDExLCAweDQ0LAorCTB4NmYsIDB4NzgsIDB4MTksIDB4OWEsIDB4NDcsIDB4NzQsIDB4YTcsIDB4YzEsCisJMHgyMywgMHg1MywgMHg4OSwgMHhmYiwgMHgxNCwgMHg1ZCwgMHhmOCwgMHg5NywKKwkweDJlLCAweDRiLCAweGI5LCAweDYwLCAweDBmLCAweGVkLCAweDNlLCAweGU1LAorCTB4ZjYsIDB4ODcsIDB4YTUsIDB4MTcsIDB4M2EsIDB4YTMsIDB4M2MsIDB4YjcKK307CisKKy8qIFRoaXMgaXMgYSBtdWx0aXBsaWNhdGlvbiB0YWJsZSBmb3IgdGhlIGZhY3RvciAweGMwIChpLmUuLCByXjEwNSAobW9kIGYocikpLgorICogZ2ZtdWxfYzBbZl0gcmV0dXJucyByXjEwNSAqIGYocikgKG1vZHVsbyBmKHIpKS4KKyAqLworc3RhdGljIGNvbnN0IF9fdTggZ2ZtdWxfYzBbMjU2XSA9Cit7CisJMHgwMCwgMHhjMCwgMHgwNywgMHhjNywgMHgwZSwgMHhjZSwgMHgwOSwgMHhjOSwKKwkweDFjLCAweGRjLCAweDFiLCAweGRiLCAweDEyLCAweGQyLCAweDE1LCAweGQ1LAorCTB4MzgsIDB4ZjgsIDB4M2YsIDB4ZmYsIDB4MzYsIDB4ZjYsIDB4MzEsIDB4ZjEsCisJMHgyNCwgMHhlNCwgMHgyMywgMHhlMywgMHgyYSwgMHhlYSwgMHgyZCwgMHhlZCwKKwkweDcwLCAweGIwLCAweDc3LCAweGI3LCAweDdlLCAweGJlLCAweDc5LCAweGI5LAorCTB4NmMsIDB4YWMsIDB4NmIsIDB4YWIsIDB4NjIsIDB4YTIsIDB4NjUsIDB4YTUsCisJMHg0OCwgMHg4OCwgMHg0ZiwgMHg4ZiwgMHg0NiwgMHg4NiwgMHg0MSwgMHg4MSwKKwkweDU0LCAweDk0LCAweDUzLCAweDkzLCAweDVhLCAweDlhLCAweDVkLCAweDlkLAorCTB4ZTAsIDB4MjAsIDB4ZTcsIDB4MjcsIDB4ZWUsIDB4MmUsIDB4ZTksIDB4MjksCisJMHhmYywgMHgzYywgMHhmYiwgMHgzYiwgMHhmMiwgMHgzMiwgMHhmNSwgMHgzNSwKKwkweGQ4LCAweDE4LCAweGRmLCAweDFmLCAweGQ2LCAweDE2LCAweGQxLCAweDExLAorCTB4YzQsIDB4MDQsIDB4YzMsIDB4MDMsIDB4Y2EsIDB4MGEsIDB4Y2QsIDB4MGQsCisJMHg5MCwgMHg1MCwgMHg5NywgMHg1NywgMHg5ZSwgMHg1ZSwgMHg5OSwgMHg1OSwKKwkweDhjLCAweDRjLCAweDhiLCAweDRiLCAweDgyLCAweDQyLCAweDg1LCAweDQ1LAorCTB4YTgsIDB4NjgsIDB4YWYsIDB4NmYsIDB4YTYsIDB4NjYsIDB4YTEsIDB4NjEsCisJMHhiNCwgMHg3NCwgMHhiMywgMHg3MywgMHhiYSwgMHg3YSwgMHhiZCwgMHg3ZCwKKwkweDQ3LCAweDg3LCAweDQwLCAweDgwLCAweDQ5LCAweDg5LCAweDRlLCAweDhlLAorCTB4NWIsIDB4OWIsIDB4NWMsIDB4OWMsIDB4NTUsIDB4OTUsIDB4NTIsIDB4OTIsCisJMHg3ZiwgMHhiZiwgMHg3OCwgMHhiOCwgMHg3MSwgMHhiMSwgMHg3NiwgMHhiNiwKKwkweDYzLCAweGEzLCAweDY0LCAweGE0LCAweDZkLCAweGFkLCAweDZhLCAweGFhLAorCTB4MzcsIDB4ZjcsIDB4MzAsIDB4ZjAsIDB4MzksIDB4ZjksIDB4M2UsIDB4ZmUsCisJMHgyYiwgMHhlYiwgMHgyYywgMHhlYywgMHgyNSwgMHhlNSwgMHgyMiwgMHhlMiwKKwkweDBmLCAweGNmLCAweDA4LCAweGM4LCAweDAxLCAweGMxLCAweDA2LCAweGM2LAorCTB4MTMsIDB4ZDMsIDB4MTQsIDB4ZDQsIDB4MWQsIDB4ZGQsIDB4MWEsIDB4ZGEsCisJMHhhNywgMHg2NywgMHhhMCwgMHg2MCwgMHhhOSwgMHg2OSwgMHhhZSwgMHg2ZSwKKwkweGJiLCAweDdiLCAweGJjLCAweDdjLCAweGI1LCAweDc1LCAweGIyLCAweDcyLAorCTB4OWYsIDB4NWYsIDB4OTgsIDB4NTgsIDB4OTEsIDB4NTEsIDB4OTYsIDB4NTYsCisJMHg4MywgMHg0MywgMHg4NCwgMHg0NCwgMHg4ZCwgMHg0ZCwgMHg4YSwgMHg0YSwKKwkweGQ3LCAweDE3LCAweGQwLCAweDEwLCAweGQ5LCAweDE5LCAweGRlLCAweDFlLAorCTB4Y2IsIDB4MGIsIDB4Y2MsIDB4MGMsIDB4YzUsIDB4MDUsIDB4YzIsIDB4MDIsCisJMHhlZiwgMHgyZiwgMHhlOCwgMHgyOCwgMHhlMSwgMHgyMSwgMHhlNiwgMHgyNiwKKwkweGYzLCAweDMzLCAweGY0LCAweDM0LCAweGZkLCAweDNkLCAweGZhLCAweDNhCit9OworCisKKy8qIFJldHVybnMgViBtb2R1bG8gMjU1IHByb3ZpZGVkIFYgaXMgaW4gdGhlIHJhbmdlIC0yNTUsLTI1NCwuLi4sNTA5LgorICovCitzdGF0aWMgaW5saW5lIF9fdTggbW9kMjU1KGludCB2KQoreworCWlmICh2ID4gMCkgeworCQlpZiAodiA8IDI1NSkgeworCQkJcmV0dXJuIHY7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdiAtIDI1NTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiB2ICsgMjU1OworCX0KK30KKworCisvKiBBZGQgdHdvIG51bWJlcnMgaW4gdGhlIGZpZWxkLiAgQWRkaXRpb24gaW4gdGhpcyBmaWVsZCBpcyBlcXVpdmFsZW50CisgKiB0byBhIGJpdC13aXNlIGV4Y2x1c2l2ZSBPUiBvcGVyYXRpb24tLS1zdWJ0cmFjdGlvbiBpcyB0aGVyZWZvcmUKKyAqIGlkZW50aWNhbCB0byBhZGRpdGlvbi4KKyAqLworc3RhdGljIGlubGluZSBfX3U4IGdmYWRkKF9fdTggYSwgX191OCBiKQoreworCXJldHVybiBhIF4gYjsKK30KKworCisvKiBBZGQgdHdvIHZlY3RvcnMgb2YgbnVtYmVycyBpbiB0aGUgZmllbGQuICBFYWNoIGJ5dGUgaW4gQSBhbmQgQiBnZXRzCisgKiBhZGRlZCBpbmRpdmlkdWFsbHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZmFkZF9sb25nKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKQoreworCXJldHVybiBhIF4gYjsKK30KKworCisvKiBNdWx0aXBseSB0d28gbnVtYmVycyBpbiB0aGUgZmllbGQ6CisgKi8KK3N0YXRpYyBpbmxpbmUgX191OCBnZm11bChfX3U4IGEsIF9fdTggYikKK3sKKwlpZiAoYSAmJiBiKSB7CisJCXJldHVybiBnZnBvd1ttb2QyNTUoZ2Zsb2dbYV0gKyBnZmxvZ1tiXSldOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworCisvKiBKdXN0IGxpa2UgZ2ZtdWwsIGV4Y2VwdCB3ZSBoYXZlIGFscmVhZHkgbG9va2VkIHVwIHRoZSBsb2cgb2YgdGhlCisgKiBzZWNvbmQgbnVtYmVyLgorICovCitzdGF0aWMgaW5saW5lIF9fdTggZ2ZtdWxfZXhwKF9fdTggYSwgaW50IGIpCit7CisJaWYgKGEpIHsKKwkJcmV0dXJuIGdmcG93W21vZDI1NShnZmxvZ1thXSArIGIpXTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKKworLyogSnVzdCBsaWtlIGdmbXVsX2V4cCwgZXhjZXB0IHRoYXQgQSBpcyBhIHZlY3RvciBvZiBudW1iZXJzLiAgVGhhdAorICogaXMsIGVhY2ggYnl0ZSBpbiBBIGdldHMgbXVsdGlwbGllZCBieSBnZnBvd1ttb2QyNTUoQildLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2ZtdWxfZXhwX2xvbmcodW5zaWduZWQgbG9uZyBhLCBpbnQgYikKK3sKKwlfX3U4IHQ7CisKKwlpZiAoc2l6ZW9mKGxvbmcpID09IDQpIHsKKwkJcmV0dXJuICgKKwkJKCh0ID0gKF9fdTMyKWEgPj4gMjQgJiAweGZmKSA/CisJCSAoKChfX3UzMikgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAyNCkgOiAwKSB8CisJCSgodCA9IChfX3UzMilhID4+IDE2ICYgMHhmZikgPworCQkgKCgoX191MzIpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMTYpIDogMCkgfAorCQkoKHQgPSAoX191MzIpYSA+PiA4ICYgMHhmZikgPworCQkgKCgoX191MzIpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgOCkgOiAwKSB8CisJCSgodCA9IChfX3UzMilhID4+IDAgJiAweGZmKSA/CisJCSAoKChfX3UzMikgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAwKSA6IDApKTsKKwl9IGVsc2UgaWYgKHNpemVvZihsb25nKSA9PSA4KSB7CisJCXJldHVybiAoCisJCSgodCA9IChfX3U2NClhID4+IDU2ICYgMHhmZikgPworCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgNTYpIDogMCkgfAorCQkoKHQgPSAoX191NjQpYSA+PiA0OCAmIDB4ZmYpID8KKwkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDQ4KSA6IDApIHwKKwkJKCh0ID0gKF9fdTY0KWEgPj4gNDAgJiAweGZmKSA/CisJCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCA0MCkgOiAwKSB8CisJCSgodCA9IChfX3U2NClhID4+IDMyICYgMHhmZikgPworCQkgKCgoX191NjQpIGdmcG93W21vZDI1NShnZmxvZ1t0XSArIGIpXSkgPDwgMzIpIDogMCkgfAorCQkoKHQgPSAoX191NjQpYSA+PiAyNCAmIDB4ZmYpID8KKwkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDI0KSA6IDApIHwKKwkJKCh0ID0gKF9fdTY0KWEgPj4gMTYgJiAweGZmKSA/CisJCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCAxNikgOiAwKSB8CisJCSgodCA9IChfX3U2NClhID4+IDggJiAweGZmKSA/CisJCSAoKChfX3U2NCkgZ2Zwb3dbbW9kMjU1KGdmbG9nW3RdICsgYildKSA8PCA4KSA6IDApIHwKKwkJKCh0ID0gKF9fdTY0KWEgPj4gMCAmIDB4ZmYpID8KKwkJICgoKF9fdTY0KSBnZnBvd1ttb2QyNTUoZ2Zsb2dbdF0gKyBiKV0pIDw8IDApIDogMCkpOworCX0gZWxzZSB7CisJCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwgIkVycm9yOiBzaXplIG9mIGxvbmcgaXMgJWQgYnl0ZXMiLAorCQkJICAgIChpbnQpc2l6ZW9mKGxvbmcpKTsKKwl9Cit9CisKKworLyogRGl2aWRlIHR3byBudW1iZXJzIGluIHRoZSBmaWVsZC4gIFJldHVybnMgYS9iIChtb2R1bG8gZih4KSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgX191OCBnZmRpdihfX3U4IGEsIF9fdTggYikKK3sKKwlpZiAoIWIpIHsKKwkJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkJVFJBQ0VfQUJPUlQoMHhmZiwgZnRfdF9idWcsICJFcnJvcjogZGl2aXNpb24gYnkgemVybyIpOworCX0gZWxzZSBpZiAoYSA9PSAwKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiBnZnBvd1ttb2QyNTUoZ2Zsb2dbYV0gLSBnZmxvZ1tiXSldOworCX0KK30KKworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGludmVyc2Ugb2YgdGhlIG1hdHJpeCBvZiB0aGUKKyAqIGxpbmVhciBzeXN0ZW0gdGhhdCBuZWVkcyB0byBiZSBzb2x2ZWQgdG8gZGV0ZXJtaW5lIHRoZSBlcnJvcgorICogbWFnbml0dWRlcy4gIFRoZSBmaXJzdCBkZWFscyB3aXRoIG1hdHJpY2VzIG9mIHJhbmsgMywgd2hpbGUgdGhlCisgKiBzZWNvbmQgZGVhbHMgd2l0aCBtYXRyaWNlcyBvZiByYW5rIDIuICBUaGUgZXJyb3IgaW5kaWNlcyBhcmUgcGFzc2VkCisgKiBpbiBhcmd1bWVudHMgTDAsLi4sTDIgKDA9Zmlyc3Qgc2VjdG9yLCAzMT1sYXN0IHNlY3RvcikuICBUaGUgZXJyb3IKKyAqIGluZGljZXMgbXVzdCBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLCBpLmUuLCBMMDxMMTxMMi4KKyAqCisgKiBUaGUgbGluZWFyIHN5c3RlbSB0aGF0IG5lZWRzIHRvIGJlIHNvbHZlZCBmb3IgdGhlIGVycm9yIG1hZ25pdHVkZXMKKyAqIGlzIEEgKiBiID0gcywgd2hlcmUgcyBpcyB0aGUga25vd24gdmVjdG9yIG9mIHN5bmRyb21lcywgYiBpcyB0aGUKKyAqIHZlY3RvciBvZiBlcnJvciBtYWduaXR1ZGVzIGFuZCBBIGluIHRoZSBPUkRFUj0zIGNhc2U6CisgKgorICogICAgQV8zID0ge3sxL3JeTFswXSwgMS9yXkxbMV0sIDEvcl5MWzJdfSwKKyAqICAgICAgICAgIHsgICAgICAgIDEsICAgICAgICAxLCAgICAgICAgMX0sCisgKiAgICAgICAgICB7IHJeTFswXSwgcl5MWzFdLCByXkxbMl19fSAKKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2ZpbnYzKF9fdTggbDAsCisJCQkgX191OCBsMSwgCisJCQkgX191OCBsMiwgCisJCQkgTWF0cml4IEFpbnYpCit7CisJX191OCBkZXQ7CisJX191OCB0MjAsIHQxMCwgdDIxLCB0MTIsIHQwMSwgdDAyOworCWludCBsb2dfZGV0OworCisJLyogY29tcHV0ZSBzb21lIGludGVybWVkaWF0ZSByZXN1bHRzOiAqLworCXQyMCA9IGdmcG93W2wyIC0gbDBdOwkgICAgICAgIC8qIHQyMCA9IHJebDIvcl5sMCAqLworCXQxMCA9IGdmcG93W2wxIC0gbDBdOwkgICAgICAgIC8qIHQxMCA9IHJebDEvcl5sMCAqLworCXQyMSA9IGdmcG93W2wyIC0gbDFdOwkgICAgICAgIC8qIHQyMSA9IHJebDIvcl5sMSAqLworCXQxMiA9IGdmcG93W2wxIC0gbDIgKyAyNTVdOwkvKiB0MTIgPSByXmwxL3JebDIgKi8KKwl0MDEgPSBnZnBvd1tsMCAtIGwxICsgMjU1XTsJLyogdDAxID0gcl5sMC9yXmwxICovCisJdDAyID0gZ2Zwb3dbbDAgLSBsMiArIDI1NV07CS8qIHQwMiA9IHJebDAvcl5sMiAqLworCS8qIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnQgb2YgbWF0cml4IEFfM14tMSAoc29tZXRpbWVzCisJICogY2FsbGVkIHRoZSBWYW5kZXJtb25kZSBkZXRlcm1pbmFudCk6CisJICovCisJZGV0ID0gZ2ZhZGQodDIwLCBnZmFkZCh0MTAsIGdmYWRkKHQyMSwgZ2ZhZGQodDEyLCBnZmFkZCh0MDEsIHQwMikpKSkpOworCWlmICghZGV0KSB7CisJCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3RfZXJyLAorCQkJICAgIkludmVyc2lvbiBmYWlsZWQgKDMgQ1JDIGVycm9ycywgPjAgQ1JDIGZhaWx1cmVzKSIpOworCX0KKwlsb2dfZGV0ID0gMjU1IC0gZ2Zsb2dbZGV0XTsKKworCS8qIE5vdywgY2FsY3VsYXRlIGFsbCBvZiB0aGUgY29lZmZpY2llbnRzOgorCSAqLworCUFpbnZbMF1bMF09IGdmbXVsX2V4cChnZmFkZChnZnBvd1tsMV0sIGdmcG93W2wyXSksIGxvZ19kZXQpOworCUFpbnZbMF1bMV09IGdmbXVsX2V4cChnZmFkZCh0MjEsIHQxMiksIGxvZ19kZXQpOworCUFpbnZbMF1bMl09IGdmbXVsX2V4cChnZmFkZChnZnBvd1syNTUgLSBsMV0sIGdmcG93WzI1NSAtIGwyXSksbG9nX2RldCk7CisKKwlBaW52WzFdWzBdPSBnZm11bF9leHAoZ2ZhZGQoZ2Zwb3dbbDBdLCBnZnBvd1tsMl0pLCBsb2dfZGV0KTsKKwlBaW52WzFdWzFdPSBnZm11bF9leHAoZ2ZhZGQodDIwLCB0MDIpLCBsb2dfZGV0KTsKKwlBaW52WzFdWzJdPSBnZm11bF9leHAoZ2ZhZGQoZ2Zwb3dbMjU1IC0gbDBdLCBnZnBvd1syNTUgLSBsMl0pLGxvZ19kZXQpOworCisJQWludlsyXVswXT0gZ2ZtdWxfZXhwKGdmYWRkKGdmcG93W2wwXSwgZ2Zwb3dbbDFdKSwgbG9nX2RldCk7CisJQWludlsyXVsxXT0gZ2ZtdWxfZXhwKGdmYWRkKHQxMCwgdDAxKSwgbG9nX2RldCk7CisJQWludlsyXVsyXT0gZ2ZtdWxfZXhwKGdmYWRkKGdmcG93WzI1NSAtIGwwXSwgZ2Zwb3dbMjU1IC0gbDFdKSxsb2dfZGV0KTsKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IGdmaW52MihfX3U4IGwwLCBfX3U4IGwxLCBNYXRyaXggQWludikKK3sKKwlfX3U4IGRldDsKKwlfX3U4IHQxLCB0MjsKKwlpbnQgbG9nX2RldDsKKworCXQxID0gZ2Zwb3dbMjU1IC0gbDBdOworCXQyID0gZ2Zwb3dbMjU1IC0gbDFdOworCWRldCA9IGdmYWRkKHQxLCB0Mik7CisJaWYgKCFkZXQpIHsKKwkJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9lcnIsCisJCQkgICAiSW52ZXJzaW9uIGZhaWxlZCAoMiBDUkMgZXJyb3JzLCA+MCBDUkMgZmFpbHVyZXMpIik7CisJfQorCWxvZ19kZXQgPSAyNTUgLSBnZmxvZ1tkZXRdOworCisJLyogTm93LCBjYWxjdWxhdGUgYWxsIG9mIHRoZSBjb2VmZmljaWVudHM6CisJICovCisJQWludlswXVswXSA9IEFpbnZbMV1bMF0gPSBnZnBvd1tsb2dfZGV0XTsKKworCUFpbnZbMF1bMV0gPSBnZm11bF9leHAodDIsIGxvZ19kZXQpOworCUFpbnZbMV1bMV0gPSBnZm11bF9leHAodDEsIGxvZ19kZXQpOworCisJcmV0dXJuIDE7Cit9CisKKworLyogTXVsdGlwbHkgbWF0cml4IEEgYnkgdmVjdG9yIFMgYW5kIHJldHVybiByZXN1bHQgaW4gdmVjdG9yIEIuICBNIGlzCisgKiBhc3N1bWVkIHRvIGJlIG9mIG9yZGVyIE54TiwgUyBhbmQgQiBvZiBvcmRlciBOeDEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZm1hdF9tdWwoaW50IG4sIE1hdHJpeCBBLCAKKwkJCSAgICAgX191OCAqcywgX191OCAqYikKK3sKKwlpbnQgaSwgajsKKwlfX3U4IGRvdF9wcm9kOworCisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQlkb3RfcHJvZCA9IDA7CisJCWZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKKwkJCWRvdF9wcm9kID0gZ2ZhZGQoZG90X3Byb2QsIGdmbXVsKEFbaV1bal0sIHNbal0pKTsKKwkJfQorCQliW2ldID0gZG90X3Byb2Q7CisJfQorfQorDAorCisKKy8qIFRoZSBSZWVkIFNvbG9tb24gRUNDIGNvZGVzIGFyZSBjb21wdXRlZCBvdmVyIHRoZSBOLXRoIGJ5dGUgb2YgZWFjaAorICogYmxvY2ssIHdoZXJlIE49U0VDVE9SX1NJWkUuICBUaGVyZSBhcmUgdXAgdG8gMjkgYmxvY2tzIG9mIGRhdGEsIGFuZAorICogMyBibG9ja3Mgb2YgRUNDLiAgVGhlIGJsb2NrcyBhcmUgc3RvcmVkIGNvbnRpZ3VvdXNseSBpbiBtZW1vcnkuICBBCisgKiBzZWdtZW50LCBjb25zZXF1ZW50bHksIGlzIGFzc3VtZWQgdG8gaGF2ZSBhdCBsZWFzdCA0IGJsb2Nrczogb25lIG9yCisgKiBtb3JlIGRhdGEgYmxvY2tzIHBsdXMgdGhyZWUgRUNDIGJsb2Nrcy4KKyAqCisgKiBOb3RpY2U6IEluIFFJQy04MCBzcGVhaywgYSBDUkMgZXJyb3IgaXMgYSBzZWN0b3Igd2l0aCBhbiBpbmNvcnJlY3QKKyAqICAgICAgICAgQ1JDLiAgQSBDUkMgZmFpbHVyZSBpcyBhIHNlY3RvciB3aXRoIGluY29ycmVjdCBkYXRhLCBidXQKKyAqICAgICAgICAgYSB2YWxpZCBDUkMuICBJbiB0aGUgZXJyb3IgY29udHJvbCBsaXRlcmF0dXJlLCB0aGUgZm9ybWVyCisgKiAgICAgICAgIGlzIHVzdWFsbHkgY2FsbGVkICJlcmFzdXJlIiwgdGhlIGxhdHRlciAiZXJyb3IuIgorICovCisvKiBDb21wdXRlIHRoZSBwYXJpdHkgYnl0ZXMgZm9yIEMgY29sdW1ucyBvZiBkYXRhLCB3aGVyZSBDIGlzIHRoZQorICogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgZml0IGludG8gYSBsb25nIGludGVnZXIuICBXZSB1c2UgYSBsaW5lYXIKKyAqIGZlZWQtYmFjayByZWdpc3RlciB0byBkbyB0aGlzLiAgVGhlIHBhcml0eSBieXRlcyBQWzBdLCBQW1NUUklERV0sCisgKiBQWzIqU1RSSURFXSBhcmUgY29tcHV0ZWQgc3VjaCB0aGF0OgorICoKKyAqICAgICAgICAgICAgICB4XmsgKiBwKHgpICsgbSh4KSA9IDAgKG1vZHVsbyBnKHgpKQorICoKKyAqIHdoZXJlIGsgPSBOQkxPQ0tTLAorICogICAgICAgcCh4KSA9IFBbMF0gKyBQW1NUUklERV0qeCArIFBbMipTVFJJREVdKnheMiwgYW5kCisgKiAgICAgICBtKHgpID0gc3VtX3tpPTB9XmsgbV9pKnheaS4KKyAqICAgICAgIG1faSA9IERBVEFbaSpTRUNUT1JfU0laRV0KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9wYXJpdHkodW5zaWduZWQgbG9uZyAqZGF0YSwKKwkJCSAgICAgIGludCBuYmxvY2tzLCAKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnAsIAorCQkJICAgICAgaW50IHN0cmlkZSkKK3sKKwl1bnNpZ25lZCBsb25nIHAwLCBwMSwgcDIsIHQxLCB0MiwgKmVuZDsKKworCWVuZCA9IGRhdGEgKyBuYmxvY2tzICogKEZUX1NFQ1RPUl9TSVpFIC8gc2l6ZW9mKGxvbmcpKTsKKwlwMCA9IHAxID0gcDIgPSAwOworCXdoaWxlIChkYXRhIDwgZW5kKSB7CisJCS8qIFRoZSBuZXcgcGFyaXR5IGJ5dGVzIHAwX2ksIHAxX2ksIHAyX2kgYXJlIGNvbXB1dGVkCisJCSAqIGZyb20gdGhlIG9sZCB2YWx1ZXMgcDBfe2ktMX0sIHAxX3tpLTF9LCBwMl97aS0xfQorCQkgKiByZWN1cnNpdmVseSBhczoKKwkJICoKKwkJICogICAgICAgIHAwX2kgPSBwMV97aS0xfSArIHJeMTA1ICogKG1fe2ktMX0gLSBwMF97aS0xfSkKKwkJICogICAgICAgIHAxX2kgPSBwMl97aS0xfSArIHJeMTA1ICogKG1fe2ktMX0gLSBwMF97aS0xfSkKKwkJICogICAgICAgIHAyX2kgPSAgICAgICAgICAgICAgICAgICAgKG1fe2ktMX0gLSBwMF97aS0xfSkKKwkJICoKKwkJICogV2l0aCB0aGUgaW5pdGlhbCBjb25kaXRpb246IHAwXzAgPSBwMV8wID0gcDJfMCA9IDAuCisJCSAqLworCQl0MSA9IGdmYWRkX2xvbmcoKmRhdGEsIHAwKTsKKwkJLyoKKwkJICogTXVsdGlwbHkgZWFjaCBieXRlIGluIHQxIGJ5IDB4YzA6CisJCSAqLworCQlpZiAoc2l6ZW9mKGxvbmcpID09IDQpIHsKKwkJCXQyPSAoKChfX3UzMikgZ2ZtdWxfYzBbKF9fdTMyKXQxID4+IDI0ICYgMHhmZl0pIDw8IDI0IHwKKwkJCSAgICAgKChfX3UzMikgZ2ZtdWxfYzBbKF9fdTMyKXQxID4+IDE2ICYgMHhmZl0pIDw8IDE2IHwKKwkJCSAgICAgKChfX3UzMikgZ2ZtdWxfYzBbKF9fdTMyKXQxID4+ICA4ICYgMHhmZl0pIDw8ICA4IHwKKwkJCSAgICAgKChfX3UzMikgZ2ZtdWxfYzBbKF9fdTMyKXQxID4+ICAwICYgMHhmZl0pIDw8ICAwKTsKKwkJfSBlbHNlIGlmIChzaXplb2YobG9uZykgPT0gOCkgeworCQkJdDI9ICgoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gNTYgJiAweGZmXSkgPDwgNTYgfAorCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gNDggJiAweGZmXSkgPDwgNDggfAorCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gNDAgJiAweGZmXSkgPDwgNDAgfAorCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gMzIgJiAweGZmXSkgPDwgMzIgfAorCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gMjQgJiAweGZmXSkgPDwgMjQgfAorCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gMTYgJiAweGZmXSkgPDwgMTYgfAorCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gIDggJiAweGZmXSkgPDwgIDggfAorCQkJICAgICAoKF9fdTY0KSBnZm11bF9jMFsoX191NjQpdDEgPj4gIDAgJiAweGZmXSkgPDwgIDApOworCQl9IGVsc2UgeworCQkJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiRXJyb3I6IGxvbmcgaXMgb2Ygc2l6ZSAlZCIsCisJCQkgICAgICAoaW50KSBzaXplb2YobG9uZykpOworCQkJVFJBQ0VfRVhJVDsKKwkJfQorCQlwMCA9IGdmYWRkX2xvbmcodDIsIHAxKTsKKwkJcDEgPSBnZmFkZF9sb25nKHQyLCBwMik7CisJCXAyID0gdDE7CisJCWRhdGEgKz0gRlRfU0VDVE9SX1NJWkUgLyBzaXplb2YobG9uZyk7CisJfQorCSpwID0gcDA7CisJcCArPSBzdHJpZGU7CisJKnAgPSBwMTsKKwlwICs9IHN0cmlkZTsKKwkqcCA9IHAyOworCXJldHVybjsKK30KKworCisvKiBDb21wdXRlIHRoZSAzIHN5bmRyb21lIHZhbHVlcy4gIERBVEEgc2hvdWxkIHBvaW50IHRvIHRoZSBmaXJzdCBieXRlCisgKiBvZiB0aGUgY29sdW1uIGZvciB3aGljaCB0aGUgc3luZHJvbWVzIGFyZSBkZXNpcmVkLiAgVGhlIHN5bmRyb21lcworICogYXJlIGNvbXB1dGVkIG92ZXIgdGhlIGZpcnN0IE5CTE9DS1Mgb2Ygcm93cy4gIFRoZSB0aHJlZSBieXRlcyB3aWxsCisgKiBiZSBwbGFjZWQgaW4gU1swXSwgU1sxXSwgYW5kIFNbMl0uCisgKgorICogU1tpXSBpcyB0aGUgdmFsdWUgb2YgdGhlICJtZXNzYWdlIiBwb2x5bm9taWFsIG0oeCkgZXZhbHVhdGVkIGF0IHRoZQorICogaS10aCByb290IG9mIHRoZSBnZW5lcmF0b3IgcG9seW5vbWlhbCBnKHgpLgorICoKKyAqIEFzIGcoeCk9KHgtcl4tMSkoeC0xKSh4LXJeMSkgd2UgZXZhbHVhdGUgdGhlIG1lc3NhZ2UgcG9seW5vbWlhbCBhdAorICogeD1yXi0xIHRvIGdldCBTWzBdLCBhdCB4PXJeMD0xIHRvIGdldCBTWzFdLCBhbmQgYXQgeD1yIHRvIGdldCBTWzJdLgorICogVGhpcyBjb3VsZCBiZSBkb25lIGRpcmVjdGx5IGFuZCBlZmZpY2llbnRseSB2aWEgdGhlIEhvcm5lciBzY2hlbWUuCisgKiBIb3dldmVyLCBpdCB3b3VsZCByZXF1aXJlIG11bHRpcGxpY2F0aW9uIHRhYmxlcyBmb3IgdGhlIGZhY3RvcnMKKyAqIHJeLTEgKDB4YzMpIGFuZCByICgweDAyKS4gIFRoZSBmb2xsb3dpbmcgc2NoZW1lIGRvZXMgbm90IHJlcXVpcmUKKyAqIGFueSBtdWx0aXBsaWNhdGlvbiB0YWJsZXMgYmV5b25kIHdoYXQncyBuZWVkZWQgZm9yIHNldF9wYXJpdHkoKQorICogYW55d2F5IGFuZCBpcyBzbGlnaHRseSBmYXN0ZXIgaWYgdGhlcmUgYXJlIG5vIGVycm9ycyBhbmQgc2xpZ2h0bHkKKyAqIHNsb3dlciBpZiB0aGVyZSBhcmUgZXJyb3JzLiAgVGhlIGxhdHRlciBpcyBob3BlZnVsbHkgdGhlIGluZnJlcXVlbnQKKyAqIGNhc2UuCisgKgorICogVG8gdW5kZXJzdGFuZCB0aGUgYWx0ZXJuYXRpdmUgYWxnb3JpdGhtLCBub3RpY2UgdGhhdCBzZXRfcGFyaXR5KG0sCisgKiBrLCBwKSBjb21wdXRlcyBwYXJpdHkgYnl0ZXMgc3VjaCB0aGF0OgorICoKKyAqICAgICAgeF5rICogcCh4KSA9IG0oeCkgKG1vZHVsbyBnKHgpKS4KKyAqCisgKiBUaGF0IGlzLCB0byBldmFsdWF0ZSBtKHJebSksIHdoZXJlIHJebSBpcyBhIHJvb3Qgb2YgZyh4KSwgd2UgY2FuCisgKiBzaW1wbHkgZXZhbHVhdGUgKHJebSleaypwKHJebSkuICBBbHNvLCBub3RpY2UgdGhhdCBwIGlzIDAgaWYgYW5kCisgKiBvbmx5IGlmIHMgaXMgemVyby4gIFRoYXQgaXMsIGlmIGFsbCBwYXJpdHkgYnl0ZXMgYXJlIDAsIHdlIGtub3cKKyAqIHRoZXJlIGlzIG5vIGVycm9yIGluIHRoZSBkYXRhIGFuZCBjb25zZXF1ZW50bHkgdGhlcmUgaXMgbm8gbmVlZCB0bworICogY29tcHV0ZSBzKHgpIGF0IGFsbCEgIEluIGFsbCBvdGhlciBjYXNlcywgd2UgY29tcHV0ZSBzKHgpIGZyb20gcCh4KQorICogYnkgZXZhbHVhdGluZyAocl5tKV5rKnAocl5tKSBmb3IgbT0tMSwgbT0wLCBhbmQgbT0xLiAgVGhlIHAoeCkKKyAqIHBvbHlub21pYWwgaXMgZXZhbHVhdGVkIHZpYSB0aGUgSG9ybmVyIHNjaGVtZS4KKyAqLworc3RhdGljIGludCBjb21wdXRlX3N5bmRyb21lcyh1bnNpZ25lZCBsb25nICpkYXRhLCBpbnQgbmJsb2NrcywgdW5zaWduZWQgbG9uZyAqcykKK3sKKwl1bnNpZ25lZCBsb25nIHBbM107CisKKwlzZXRfcGFyaXR5KGRhdGEsIG5ibG9ja3MsIHAsIDEpOworCWlmIChwWzBdIHwgcFsxXSB8IHBbMl0pIHsKKwkJLyogU29tZSBvZiB0aGUgY2hlY2tlZCBjb2x1bW5zIGRvIG5vdCBoYXZlIGEgemVybworCQkgKiBzeW5kcm9tZS4gIEZvciBzaW1wbGljaXR5LCB3ZSBjb21wdXRlIHRoZSBzeW5kcm9tZXMKKwkJICogZm9yIGFsbCBjb2x1bW5zIHRoYXQgd2UgaGF2ZSBjb21wdXRlZCB0aGUKKwkJICogcmVtYWluZGVycyBmb3IuCisJCSAqLworCQlzWzBdID0gZ2ZtdWxfZXhwX2xvbmcoCisJCQlnZmFkZF9sb25nKHBbMF0sIAorCQkJCSAgIGdmbXVsX2V4cF9sb25nKAorCQkJCQkgICBnZmFkZF9sb25nKHBbMV0sIAorCQkJCQkJICAgICAgZ2ZtdWxfZXhwX2xvbmcocFsyXSwgLTEpKSwKKwkJCQkJICAgLTEpKSwgCisJCQktbmJsb2Nrcyk7CisJCXNbMV0gPSBnZmFkZF9sb25nKGdmYWRkX2xvbmcocFsyXSwgcFsxXSksIHBbMF0pOworCQlzWzJdID0gZ2ZtdWxfZXhwX2xvbmcoCisJCQlnZmFkZF9sb25nKHBbMF0sIAorCQkJCSAgIGdmbXVsX2V4cF9sb25nKAorCQkJCQkgICBnZmFkZF9sb25nKHBbMV0sCisJCQkJCQkgICAgICBnZm11bF9leHBfbG9uZyhwWzJdLCAxKSksCisJCQkJCSAgIDEpKSwKKwkJCW5ibG9ja3MpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gMTsKKwl9Cit9CisKKworLyogQ29ycmVjdCB0aGUgYmxvY2sgaW4gdGhlIGNvbHVtbiBwb2ludGVkIHRvIGJ5IERBVEEuICBUaGVyZSBhcmUgTkJBRAorICogQ1JDIGVycm9ycyBhbmQgdGhlaXIgaW5kaWNlcyBhcmUgaW4gQkFEX0xPQ1swXSwgdXAgdG8KKyAqIEJBRF9MT0NbTkJBRC0xXS4gIElmIE5CQUQ+MSwgQWludiBob2xkcyB0aGUgaW52ZXJzZSBvZiB0aGUgbWF0cml4CisgKiBvZiB0aGUgbGluZWFyIHN5c3RlbSB0aGF0IG5lZWRzIHRvIGJlIHNvbHZlZCB0byBkZXRlcm1pbmUgdGhlIGVycm9yCisgKiBtYWduaXR1ZGVzLiAgU1swXSwgU1sxXSwgYW5kIFNbMl0gYXJlIHRoZSBzeW5kcm9tZSB2YWx1ZXMuICBJZiByb3cKKyAqIGogZ2V0cyBjb3JyZWN0ZWQsIHRoZW4gYml0IGogd2lsbCBiZSBzZXQgaW4gQ09SUkVDVElPTl9NQVAuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvcnJlY3RfYmxvY2soX191OCAqZGF0YSwgaW50IG5ibG9ja3MsCisJCQkJaW50IG5iYWQsIGludCAqYmFkX2xvYywgTWF0cml4IEFpbnYsCisJCQkJX191OCAqcywKKwkJCQlTZWN0b3JNYXAgKiBjb3JyZWN0aW9uX21hcCkKK3sKKwlpbnQgbmNvcnJlY3RlZCA9IDA7CisJaW50IGk7CisJX191OCB0MSwgdDI7CisJX191OCBjMCwgYzEsIGMyOwkvKiBjaGVjayBieXRlcyAqLworCV9fdTggZXJyb3JfbWFnWzNdLCBsb2dfZXJyb3JfbWFnOworCV9fdTggKmRwLCBsLCBlOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlzd2l0Y2ggKG5iYWQpIHsKKwljYXNlIDA6CisJCS8qIG1pZ2h0IGhhdmUgYSBDUkMgZmFpbHVyZTogKi8KKwkJaWYgKHNbMF0gPT0gMCkgeworCQkJLyogbW9yZSB0aGFuIG9uZSBlcnJvciAqLworCQkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAorCQkJCSAiRUNDIGZhaWxlZCAoMCBDUkMgZXJyb3JzLCA+MSBDUkMgZmFpbHVyZXMpIik7CisJCX0KKwkJdDEgPSBnZmRpdihzWzFdLCBzWzBdKTsKKwkJaWYgKChiYWRfbG9jW25iYWQrK10gPSBnZmxvZ1t0MV0pID49IG5ibG9ja3MpIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLAorCQkJICAgICAgIkVDQyBmYWlsZWQgKDAgQ1JDIGVycm9ycywgPjEgQ1JDIGZhaWx1cmVzKSIpOworCQkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAorCQkJCSAgImF0dGVtcHQgdG8gY29ycmVjdCBkYXRhIGF0ICVkIiwgYmFkX2xvY1swXSk7CisJCX0KKwkJZXJyb3JfbWFnWzBdID0gc1sxXTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0MSA9IGdmYWRkKGdmbXVsX2V4cChzWzFdLCBiYWRfbG9jWzBdKSwgc1syXSk7CisJCXQyID0gZ2ZhZGQoZ2ZtdWxfZXhwKHNbMF0sIGJhZF9sb2NbMF0pLCBzWzFdKTsKKwkJaWYgKHQxID09IDAgJiYgdDIgPT0gMCkgeworCQkJLyogb25lIGVyYXN1cmUsIG5vIGVycm9yOiAqLworCQkJQWludlswXVswXSA9IGdmcG93W2JhZF9sb2NbMF1dOworCQl9IGVsc2UgaWYgKHQxID09IDAgfHwgdDIgPT0gMCkgeworCQkJLyogb25lIGVyYXN1cmUgYW5kIG1vcmUgdGhhbiBvbmUgZXJyb3I6ICovCisJCQlUUkFDRV9BQk9SVCgtMSwgZnRfdF9lcnIsCisJCQkJICAgICJFQ0MgZmFpbGVkICgxIGVyYXN1cmUsID4xIGVycm9yKSIpOworCQl9IGVsc2UgeworCQkJLyogb25lIGVyYXN1cmUsIG9uZSBlcnJvcjogKi8KKwkJCWlmICgoYmFkX2xvY1tuYmFkKytdID0gZ2Zsb2dbZ2ZkaXYodDEsIHQyKV0pIAorCQkJICAgID49IG5ibG9ja3MpIHsKKwkJCQlUUkFDRShmdF90X2VyciwgIkVDQyBmYWlsZWQgIgorCQkJCSAgICAgICIoMSBDUkMgZXJyb3JzLCA+MSBDUkMgZmFpbHVyZXMpIik7CisJCQkJVFJBQ0VfQUJPUlQoLTEsIGZ0X3RfZXJyLAorCQkJCQkgICAgImF0dGVtcHQgdG8gY29ycmVjdCBkYXRhIGF0ICVkIiwKKwkJCQkJICAgIGJhZF9sb2NbMV0pOworCQkJfQorCQkJaWYgKCFnZmludjIoYmFkX2xvY1swXSwgYmFkX2xvY1sxXSwgQWludikpIHsKKwkJCQkvKiBpbnZlcnNpb24gZmFpbGVkLS0tbXVzdCBoYXZlIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHRoYW4gb25lIGVycm9yIAorCQkJCSAqLworCQkJCVRSQUNFX0VYSVQgLTE7CisJCQl9CisJCX0KKwkJLyogRkFMTCBUSFJPVUdIIFRPIEVSUk9SIE1BR05JVFVERSBDT01QVVRBVElPTjoKKwkJICovCisJY2FzZSAyOgorCWNhc2UgMzoKKwkJLyogY29tcHV0ZSBlcnJvciBtYWduaXR1ZGVzOiAqLworCQlnZm1hdF9tdWwobmJhZCwgQWludiwgcywgZXJyb3JfbWFnKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlUUkFDRV9BQk9SVCgtMSwgZnRfdF9lcnIsCisJCQkgICAgIkludGVybmFsIEVycm9yOiBudW1iZXIgb2YgQ1JDIGVycm9ycyA+IDMiKTsKKwl9CisKKwkvKiBQZXJmb3JtIGNvcnJlY3Rpb24gYnkgYWRkaW5nIEVSUk9SX01BR1tpXSB0byB0aGUgYnl0ZSBhdAorCSAqIG9mZnNldCBCQURfTE9DW2ldLiAgQWxzbyBhZGQgdGhlIHZhbHVlIG9mIHRoZSBjb21wdXRlZAorCSAqIGVycm9yIHBvbHlub21pYWwgdG8gdGhlIHN5bmRyb21lIHZhbHVlcy4gIElmIHRoZSBjb3JyZWN0aW9uCisJICogd2FzIHN1Y2Nlc3NmdWwsIHRoZSByZXN1bHRpbmcgY2hlY2sgYnl0ZXMgc2hvdWxkIGJlIHplcm8KKwkgKiAoaS5lLiwgdGhlIGNvcnJlY3RlZCBkYXRhIGlzIGEgdmFsaWQgY29kZSB3b3JkKS4KKwkgKi8KKwljMCA9IHNbMF07CisJYzEgPSBzWzFdOworCWMyID0gc1syXTsKKwlmb3IgKGkgPSAwOyBpIDwgbmJhZDsgKytpKSB7CisJCWUgPSBlcnJvcl9tYWdbaV07CisJCWlmIChlKSB7CisJCQkvKiBjb3JyZWN0IHRoZSBieXRlIGF0IG9mZnNldCBMIGJ5IG1hZ25pdHVkZSBFOiAqLworCQkJbCA9IGJhZF9sb2NbaV07CisJCQlkcCA9ICZkYXRhW2wgKiBGVF9TRUNUT1JfU0laRV07CisJCQkqZHAgPSBnZmFkZCgqZHAsIGUpOworCQkJKmNvcnJlY3Rpb25fbWFwIHw9IDEgPDwgbDsKKwkJCSsrbmNvcnJlY3RlZDsKKworCQkJbG9nX2Vycm9yX21hZyA9IGdmbG9nW2VdOworCQkJYzAgPSBnZmFkZChjMCwgZ2Zwb3dbbW9kMjU1KGxvZ19lcnJvcl9tYWcgLSBsKV0pOworCQkJYzEgPSBnZmFkZChjMSwgZSk7CisJCQljMiA9IGdmYWRkKGMyLCBnZnBvd1ttb2QyNTUobG9nX2Vycm9yX21hZyArIGwpXSk7CisJCX0KKwl9CisJaWYgKGMwIHx8IGMxIHx8IGMyKSB7CisJCVRSQUNFX0FCT1JUKC0xLCBmdF90X2VyciwKKwkJCSAgICAiRUNDIHNlbGYtY2hlY2sgZmFpbGVkLCB0b28gbWFueSBlcnJvcnMiKTsKKwl9CisJVFJBQ0VfRVhJVCBuY29ycmVjdGVkOworfQorCisKKyNpZiBkZWZpbmVkKEVDQ19TQU5JVFlfQ0hFQ0spIHx8IGRlZmluZWQoRUNDX1BBUkFOT0lEKQorCisvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSBjb21wdXRlZCBwYXJpdHkgYnl0ZXM6CisgKi8KK3N0YXRpYyBpbnQgc2FuaXR5X2NoZWNrKHVuc2lnbmVkIGxvbmcgKmRhdGEsIGludCBuYmxvY2tzKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJdW5zaWduZWQgbG9uZyBzWzNdOworCisJaWYgKCFjb21wdXRlX3N5bmRyb21lcyhkYXRhLCBuYmxvY2tzLCBzKSkgeworCQlUUkFDRV9BQk9SVCgwLCBmdF9idWcsCisJCQkgICAgIkludGVybmFsIEVycm9yOiBzeW5kcm9tZSBzZWxmLWNoZWNrIGZhaWxlZCIpOworCX0KKwlUUkFDRV9FWElUIDE7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKEVDQ19TQU5JVFlfQ0hFQ0spIHx8IGRlZmluZWQoRUNDX1BBUkFOT0lEKSAqLworCisvKiBDb21wdXRlIHRoZSBwYXJpdHkgZm9yIGFuIGVudGlyZSBzZWdtZW50IG9mIGRhdGEuCisgKi8KK2ludCBmdGFwZV9lY2Nfc2V0X3NlZ21lbnRfcGFyaXR5KHN0cnVjdCBtZW1vcnlfc2VnbWVudCAqbXNlZykKK3sKKwlpbnQgaTsKKwlfX3U4ICpwYXJpdHlfYnl0ZXM7CisKKwlwYXJpdHlfYnl0ZXMgPSAmbXNlZy0+ZGF0YVsobXNlZy0+YmxvY2tzIC0gMykgKiBGVF9TRUNUT1JfU0laRV07CisJZm9yIChpID0gMDsgaSA8IEZUX1NFQ1RPUl9TSVpFOyBpICs9IHNpemVvZihsb25nKSkgeworCQlzZXRfcGFyaXR5KCh1bnNpZ25lZCBsb25nICopICZtc2VnLT5kYXRhW2ldLCBtc2VnLT5ibG9ja3MgLSAzLAorCQkJICAgKHVuc2lnbmVkIGxvbmcgKikgJnBhcml0eV9ieXRlc1tpXSwKKwkJCSAgIEZUX1NFQ1RPUl9TSVpFIC8gc2l6ZW9mKGxvbmcpKTsKKyNpZmRlZiBFQ0NfUEFSQU5PSUQKKwkJaWYgKCFzYW5pdHlfY2hlY2soKHVuc2lnbmVkIGxvbmcgKikgJm1zZWctPmRhdGFbaV0sCisJCQkJICAgbXNlZy0+YmxvY2tzKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisjZW5kaWYJCQkJLyogRUNDX1BBUkFOT0lEICovCisJfQorCXJldHVybiAwOworfQorCisKKy8qIENoZWNrcyBhbmQgY29ycmVjdHMgKGlmIHBvc3NpYmxlKSB0aGUgc2VnbWVudCBNU0VHLiAgUmV0dXJucyBvbmUgb2YKKyAqIEVDQ19PSywgRUNDX0NPUlJFQ1RFRCwgYW5kIEVDQ19GQUlMRUQuCisgKi8KK2ludCBmdGFwZV9lY2NfY29ycmVjdF9kYXRhKHN0cnVjdCBtZW1vcnlfc2VnbWVudCAqbXNlZykKK3sKKwlpbnQgY29sLCBpLCByZXN1bHQ7CisJaW50IG5jb3JyZWN0ZWQgPSAwOworCWludCBuZXJhc3VyZXMgPSAwOwkvKiAjIG9mIGVyYXN1cmVzIChDUkMgZXJyb3JzKSAqLworCWludCBlcmFzdXJlX2xvY1szXTsJLyogZXJhc3VyZSBsb2NhdGlvbnMgKi8KKwl1bnNpZ25lZCBsb25nIHNzWzNdOworCV9fdTggc1szXTsKKwlNYXRyaXggQWludjsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCW1zZWctPmNvcnJlY3RlZCA9IDA7CisKKwkvKiBmaW5kIGZpcnN0IGNvbHVtbiB0aGF0IGhhcyBub24temVybyBzeW5kcm9tZXM6ICovCisJZm9yIChjb2wgPSAwOyBjb2wgPCBGVF9TRUNUT1JfU0laRTsgY29sICs9IHNpemVvZihsb25nKSkgeworCQlpZiAoIWNvbXB1dGVfc3luZHJvbWVzKCh1bnNpZ25lZCBsb25nICopICZtc2VnLT5kYXRhW2NvbF0sCisJCQkJICAgICAgIG1zZWctPmJsb2Nrcywgc3MpKSB7CisJCQkvKiBzb21ldGhpbmcgaXMgd3JvbmctLS1oYXZlIHRvIGZpeCB0aGluZ3MgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChjb2wgPj0gRlRfU0VDVE9SX1NJWkUpIHsKKwkJLyogYWxsIHN5bmRyb21lcyBhcmUgb2ssIHRoZXJlZm9yZSBub3RoaW5nIHRvIGNvcnJlY3QgKi8KKwkJVFJBQ0VfRVhJVCBFQ0NfT0s7CisJfQorCS8qIGNvdW50IHRoZSBudW1iZXIgb2YgQ1JDIGVycm9ycyBpZiB0aGVyZSB3ZXJlIGFueTogKi8KKwlpZiAobXNlZy0+cmVhZF9iYWQpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1zZWctPmJsb2NrczsgaSsrKSB7CisJCQlpZiAoQkFEX0NIRUNLKG1zZWctPnJlYWRfYmFkLCBpKSkgeworCQkJCWlmIChuZXJhc3VyZXMgPj0gMykgeworCQkJCQkvKiB0aGlzIGlzIHRvbyBtdWNoIGZvciBFQ0MgKi8KKwkJCQkJVFJBQ0VfQUJPUlQoRUNDX0ZBSUxFRCwgZnRfdF9lcnIsCisJCQkJCQkiRUNDIGZhaWxlZCAoPjMgQ1JDIGVycm9ycykiKTsKKwkJCQl9CS8qIGlmICovCisJCQkJZXJhc3VyZV9sb2NbbmVyYXN1cmVzKytdID0gaTsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIElmIHRoZXJlIGFyZSBhdCBsZWFzdCAyIENSQyBlcnJvcnMsIGRldGVybWluZSBpbnZlcnNlIG9mIG1hdHJpeAorCSAqIG9mIGxpbmVhciBzeXN0ZW0gdG8gYmUgc29sdmVkOgorCSAqLworCXN3aXRjaCAobmVyYXN1cmVzKSB7CisJY2FzZSAyOgorCQlpZiAoIWdmaW52MihlcmFzdXJlX2xvY1swXSwgZXJhc3VyZV9sb2NbMV0sIEFpbnYpKSB7CisJCQlUUkFDRV9FWElUIEVDQ19GQUlMRUQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpZiAoIWdmaW52MyhlcmFzdXJlX2xvY1swXSwgZXJhc3VyZV9sb2NbMV0sCisJCQkgICAgZXJhc3VyZV9sb2NbMl0sIEFpbnYpKSB7CisJCQlUUkFDRV9FWElUIEVDQ19GQUlMRUQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogdGhpcyBpcyBub3QgYW4gZXJyb3IgY29uZGl0aW9uLi4uICovCisJCWJyZWFrOworCX0KKworCWRvIHsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihsb25nKTsgKytpKSB7CisJCQlzWzBdID0gc3NbMF07CisJCQlzWzFdID0gc3NbMV07CisJCQlzWzJdID0gc3NbMl07CisJCQlpZiAoc1swXSB8IHNbMV0gfCBzWzJdKSB7CisjaWZkZWYgQklHX0VORElBTgorCQkJCXJlc3VsdCA9IGNvcnJlY3RfYmxvY2soCisJCQkJCSZtc2VnLT5kYXRhW2NvbCArIHNpemVvZihsb25nKSAtIDEgLSBpXSwKKwkJCQkJbXNlZy0+YmxvY2tzLAorCQkJCQluZXJhc3VyZXMsCisJCQkJCWVyYXN1cmVfbG9jLAorCQkJCQlBaW52LAorCQkJCQlzLAorCQkJCQkmbXNlZy0+Y29ycmVjdGVkKTsKKyNlbHNlCisJCQkJcmVzdWx0ID0gY29ycmVjdF9ibG9jaygmbXNlZy0+ZGF0YVtjb2wgKyBpXSwKKwkJCQkJCSAgICAgICBtc2VnLT5ibG9ja3MsCisJCQkJCQkgICAgICAgbmVyYXN1cmVzLAorCQkJCQkJICAgICAgIGVyYXN1cmVfbG9jLAorCQkJCQkJICAgICAgIEFpbnYsCisJCQkJCQkgICAgICAgcywKKwkJCQkJCSAgICAgICAmbXNlZy0+Y29ycmVjdGVkKTsKKyNlbmRpZgorCQkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJCVRSQUNFX0VYSVQgRUNDX0ZBSUxFRDsKKwkJCQl9CisJCQkJbmNvcnJlY3RlZCArPSByZXN1bHQ7CisJCQl9CisJCQlzc1swXSA+Pj0gODsKKwkJCXNzWzFdID4+PSA4OworCQkJc3NbMl0gPj49IDg7CisJCX0KKworI2lmZGVmIEVDQ19TQU5JVFlfQ0hFQ0sKKwkJaWYgKCFzYW5pdHlfY2hlY2soKHVuc2lnbmVkIGxvbmcgKikgJm1zZWctPmRhdGFbY29sXSwKKwkJCQkgIG1zZWctPmJsb2NrcykpIHsKKwkJCVRSQUNFX0VYSVQgRUNDX0ZBSUxFRDsKKwkJfQorI2VuZGlmCQkJCS8qIEVDQ19TQU5JVFlfQ0hFQ0sgKi8KKworCQkvKiBmaW5kIG5leHQgY29sdW1uIHdpdGggbm9uLXplcm8gc3luZHJvbWVzOiAqLworCQl3aGlsZSAoKGNvbCArPSBzaXplb2YobG9uZykpIDwgRlRfU0VDVE9SX1NJWkUpIHsKKwkJCWlmICghY29tcHV0ZV9zeW5kcm9tZXMoKHVuc2lnbmVkIGxvbmcgKikKKwkJCQkgICAgJm1zZWctPmRhdGFbY29sXSwgbXNlZy0+YmxvY2tzLCBzcykpIHsKKwkJCQkvKiBzb21ldGhpbmcgaXMgd3JvbmctLS1oYXZlIHRvIGZpeCB0aGluZ3MgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKGNvbCA8IEZUX1NFQ1RPUl9TSVpFKTsKKwlpZiAobmNvcnJlY3RlZCAmJiBuZXJhc3VyZXMgPT0gMCkgeworCQlUUkFDRShmdF90X3dhcm4sICJibG9jayBjb250YWluZWQgZXJyb3Igbm90IGNhdWdodCBieSBDUkMiKTsKKwl9CisJVFJBQ0UoKG5jb3JyZWN0ZWQgPiAwKSA/IGZ0X3Rfbm9pc2UgOiBmdF90X2FueSwgIm51bWJlciBvZiBjb3JyZWN0aW9uczogJWQiLCBuY29ycmVjdGVkKTsKKwlUUkFDRV9FWElUIG5jb3JyZWN0ZWQgPyBFQ0NfQ09SUkVDVEVEIDogRUNDX09LOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWVjYy5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWVjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjkxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZWNjLmgKQEAgLTAsMCArMSw4NCBAQAorI2lmbmRlZiBfRlRBUEVfRUNDX0hfCisjZGVmaW5lIF9GVEFQRV9FQ0NfSF8KKworLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzIE5pbmcgYW5kIERhdmlkIE1vc2Jlcmdlci4KKyAqICAgICAgT3JpZ2luYWw6CisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5MyBCYXMgTGFhcmhvdmVuLgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTIgRGF2aWQgTC4gQnJvd24sIEpyLgorIAorIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgVVNBLgorIAorICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1lY2MuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjExICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZQorICogICAgICBSZWVkLVNvbG9tb24gZXJyb3IgY29ycmVjdGlvbiBjb2RlIAorICogICAgICBmb3IgdGhlIFFJQy00MC84MCB0YXBlIHN0cmVhbWVyIGRldmljZSBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorCisjZGVmaW5lIEJBRF9DTEVBUihlbnRyeSkgKChlbnRyeSk9MCkKKyNkZWZpbmUgQkFEX1NFVChlbnRyeSxzZWN0b3IpICgoZW50cnkpfD0oMTw8KHNlY3RvcikpKQorI2RlZmluZSBCQURfQ0hFQ0soZW50cnksc2VjdG9yKSAoKGVudHJ5KSYoMTw8KHNlY3RvcikpKQorCisvKgorICogUmV0dXJuIHZhbHVlcyBmb3IgZWNjX2NvcnJlY3RfZGF0YToKKyAqLworZW51bSB7CisJRUNDX09LLAkJCS8qIERhdGEgd2FzIGNvcnJlY3QuICovCisJRUNDX0NPUlJFQ1RFRCwJCS8qIENvcnJlY3RhYmxlIGVycm9yIGluIGRhdGEuICovCisJRUNDX0ZBSUxFRCwJCS8qIENvdWxkIG5vdCBjb3JyZWN0IGRhdGEuICovCit9OworCisvKgorICogUmVwcmVzZW50YXRpb24gb2YgYW4gaW4gbWVtb3J5IHNlZ21lbnQuICBNQVJLRURfQkFEIGxpc3RzIHRoZQorICogc2VjdG9ycyB0aGF0IHdlcmUgbWFya2VkIGJhZCBkdXJpbmcgZm9ybWF0dGluZy4gIElmIHRoZSBOLXRoIHNlY3RvcgorICogaW4gYSBzZWdtZW50IGlzIG1hcmtlZCBiYWQsIGJpdCAxPDxOIHdpbGwgYmUgc2V0IGluIE1BUktFRF9CQUQuCisgKiBUaGUgc2VjdG9ycyBzaG91bGQgYmUgcmVhZCBpbiBmcm9tIHRoZSBkaXNrIGFuZCBwYWNrZWQsIGFzIGlmIHRoZQorICogYmFkIHNlY3RvcnMgd2VyZSBub3QgdGhlcmUsIGFuZCB0aGUgc2VnbWVudCBqdXN0IGNvbnRhaW5lZCBmZXdlcgorICogc2VjdG9ycy4gIFJFQURfU0VDVE9SUyBpcyBhIGJpdG1hcCBvZiBlcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUKKyAqIHJlYWRpbmcgdGhlIGRhdGEuICBUaGVzZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgcGFja2VkIGRhdGEuCisgKiBCTE9DS1MgaXMgYSBjb3VudCBvZiB0aGUgc2VjdG9ycyBub3QgbWFya2VkIGJhZC4gIFRoaXMgaXMganVzdCB0bworICogcHJldmVudCBoYXZpbmcgdG8gY291bnQgdGhlIHplcm8gYml0cyBpbiBNQVJLRURfQkFEIGVhY2ggdGltZSB0aGlzCisgKiBpcyBuZWVkZWQuICBEQVRBIGlzIHRoZSBhY3R1YWwgc2VjdG9yIHBhY2tlZCBkYXRhIGZyb20gKG9yIHRvKSB0aGUKKyAqIHRhcGUuCisgKi8KKyBzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgeworCVNlY3Rvck1hcCBtYXJrZWRfYmFkOworCVNlY3Rvck1hcCByZWFkX2JhZDsKKyAJaW50IGJsb2NrczsKKyAJX191OCAqZGF0YTsKKwlTZWN0b3JNYXAgY29ycmVjdGVkOworIH07CisKKy8qCisgKiBlY2MuYyBkZWZpbmVkIGdsb2JhbCB2YXJpYWJsZXM6CisgKi8KKyNpZmRlZiBURVNUCitleHRlcm4gaW50IGZ0YXBlX2VjY190cmFjaW5nOworI2VuZGlmCisKKy8qCisgKiBlY2MuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnM6CisgKi8KK2V4dGVybiBpbnQgZnRhcGVfZWNjX2NvcnJlY3RfZGF0YShzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKmRhdGEpOworZXh0ZXJuIGludCBmdGFwZV9lY2Nfc2V0X3NlZ21lbnRfcGFyaXR5KHN0cnVjdCBtZW1vcnlfc2VnbWVudCAqZGF0YSk7CisKKyNlbmRpZgkvKiBfRlRBUEVfRUNDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkNGM1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuYwpAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5jLHYgJAorICogJFJldmlzaW9uOiAxLjIuNC4xICQKKyAqICREYXRlOiAxOTk3LzExLzE0IDE2OjA1OjM5ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBzdXBwb3J0IGZvcm1hdHRpbmcgb2YgZmxvcHB5CisgKiAgICAgIHRhcGUgY2FydHJpZGdlcyB3aXRoIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlCisgKiAgICAgIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKyAqLworIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FpYzExNy5oPgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZWNjLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmgiCisKKyNpZiBkZWZpbmVkKFRFU1RJTkcpCisjZGVmaW5lIEZUX0ZNVF9TRUdTX1BFUl9CVUYgNTAKKyNlbHNlCisjZGVmaW5lIEZUX0ZNVF9TRUdTX1BFUl9CVUYgKEZUX0JVRkZfU0laRS8oNCpGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSkKKyNlbmRpZgorCitzdGF0aWMgc3BpbmxvY2tfdCBmdGFwZV9mb3JtYXRfbG9jazsKKworLyoKKyAqICBmaXJzdCBzZWdtZW50IG9mIHRoZSBuZXcgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgc3dpdGNoX3NlZ21lbnQ7CisKKy8qCisgKiAgYXQgbW9zdCAyNTYgc2VnbWVudHMgZml0IGludG8gb25lIDMyIGtiIGJ1ZmZlci4gIEV2ZW4gVFItMSBjYXJ0cmlkZ2VzIGhhdmUKKyAqICBtb3JlIHRoYW4gdGhpcyBtYW55IHNlZ21lbnRzIHBlciB0cmFjaywgc28gYmV0dGVyIGJlIGNhcmVmdWwuCisgKgorICogIGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmY6IGJ1ZmZlciB0byBzdG9yZSB0aGUgZm9ybWF0dGluZyBjb29yZGluYXRlcyBpbgorICogIGludCAgc3RhcnQ6IHN0YXJ0aW5nIHNlZ21lbnQgZm9yIHRoaXMgYnVmZmVyLgorICogIGludCAgICBzcHQ6IHNlZ21lbnRzIHBlciB0cmFjaworICoKKyAqICBOb3RlOiBzZWdtZW50IGlkcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0cmFjayBoZXJlLgorICovCitzdGF0aWMgdm9pZCBzZXR1cF9mb3JtYXRfYnVmZmVyKGJ1ZmZlcl9zdHJ1Y3QgKmJ1ZmYsIGludCBzdGFydCwgaW50IHNwdCwKKwkJCQlfX3U4IGdhcDMpCit7CisJaW50IHRvX2RvID0gc3B0IC0gc3RhcnQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAodG9fZG8gPiBGVF9GTVRfU0VHU19QRVJfQlVGKSB7CisJCXRvX2RvID0gRlRfRk1UX1NFR1NfUEVSX0JVRjsKKwl9CisJYnVmZi0+cHRyICAgICAgICAgID0gYnVmZi0+YWRkcmVzczsKKwlidWZmLT5yZW1haW5pbmcgICAgPSB0b19kbyAqIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQ7IC8qICMgc2VjdG9ycyAqLworCWJ1ZmYtPmJ5dGVzICAgICAgICA9IGJ1ZmYtPnJlbWFpbmluZyAqIDQ7IC8qIG5lZWQgNCBieXRlcyBwZXIgc2VjdG9yICovCisJYnVmZi0+Z2FwMyAgICAgICAgID0gZ2FwMzsKKwlidWZmLT5zZWdtZW50X2lkICAgPSBzdGFydDsKKwlidWZmLT5uZXh0X3NlZ21lbnQgPSBzdGFydCArIHRvX2RvOworCWlmIChidWZmLT5uZXh0X3NlZ21lbnQgPj0gc3B0KSB7CisJCWJ1ZmYtPm5leHRfc2VnbWVudCA9IDA7IC8qIDAgbWVhbnM6IHN0b3AgcnVubmVyICovCisJfQorCWJ1ZmYtPnN0YXR1cyAgICAgICA9IHdhaXRpbmc7IC8qIHRlbGxzIHRoZSBpc3IgdGhhdCBpdCBjYW4gdXNlCisJCQkJICAgICAgICogdGhpcyBidWZmZXIKKwkJCQkgICAgICAgKi8KKwlUUkFDRV9FWElUOworfQorCisKKy8qCisgKiAgc3RhcnQgZm9ybWF0dGluZyBhIG5ldyB0cmFjay4KKyAqLworaW50IGZ0YXBlX2Zvcm1hdF90cmFjayhjb25zdCB1bnNpZ25lZCBpbnQgdHJhY2ssIGNvbnN0IF9fdTggZ2FwMykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJ1ZmZlcl9zdHJ1Y3QgKnRhaWwsICpoZWFkOworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRV9DQVRDSChmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucGF1c2UsICZzdGF0dXMpLCk7CisJaWYgKHRyYWNrICYgMSkgeworCQlpZiAoIShzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0VPVCkpIHsKKwkJCVRSQUNFX0NBVENIKGZ0YXBlX3NlZWtfdG9fZW90KCksKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghKHN0YXR1cyAmIFFJQ19TVEFUVVNfQVRfQk9UKSkgeworCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfc2Vla190b19ib3QoKSwpOworCQl9CisJfQorCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOyAvKiB0aGlzIHNldHMgZnRfaGVhZCA9IGZ0X3RhaWwgPSAwICovCisJZnRhcGVfc2V0X3N0YXRlKGZvcm1hdHRpbmcpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwKKwkgICAgICAiRm9ybWF0dGluZyB0cmFjayAlZCwgbG9naWNhbDogZnJvbSBzZWdtZW50ICVkIHRvICVkIiwKKwkgICAgICB0cmFjaywgdHJhY2sgKiBmdF9zZWdtZW50c19wZXJfdHJhY2ssIAorCSAgICAgICh0cmFjayArIDEpICogZnRfc2VnbWVudHNfcGVyX3RyYWNrIC0gMSk7CisJCisJLyoKKwkgKiAgaW5pdGlhbGl6ZSB0aGUgYnVmZmVyIHN3aXRjaGluZyBwcm90b2NvbCBmb3IgdGhpcyB0cmFjaworCSAqLworCWhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOyAvKiB0YXBlIGlzbid0IHJ1bm5pbmcgeWV0ICovCisJdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7IC8qIHRhcGUgaXNuJ3QgcnVubmluZyB5ZXQgKi8KKwlzd2l0Y2hfc2VnbWVudCA9IDA7CisJZG8geworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCXNldHVwX2Zvcm1hdF9idWZmZXIodGFpbCwgc3dpdGNoX3NlZ21lbnQsCisJCQkJICAgIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywgZ2FwMyk7CisJCXN3aXRjaF9zZWdtZW50ID0gdGFpbC0+bmV4dF9zZWdtZW50OworCX0gd2hpbGUgKChzd2l0Y2hfc2VnbWVudCAhPSAwKSAmJgorCQkgKCh0YWlsID0gZnRhcGVfbmV4dF9idWZmZXIoZnRfcXVldWVfdGFpbCkpICE9IGhlYWQpKTsKKwkvKiBnbyAqLworCWhlYWQtPnN0YXR1cyA9IGZvcm1hdHRpbmc7CisJVFJBQ0VfQ0FUQ0goZnRhcGVfc2Vla19oZWFkX3RvX3RyYWNrKHRyYWNrKSwpOworCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoUUlDX0xPR0lDQUxfRk9SV0FSRCksKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnRhcGVfZm9ybWF0X2xvY2ssIGZsYWdzKTsKKwlUUkFDRV9DQVRDSChmZGNfc2V0dXBfZm9ybWF0dGluZyhoZWFkKSwgcmVzdG9yZV9mbGFncyhmbGFncykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZ0YXBlX2Zvcm1hdF9sb2NrLCBmbGFncyk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgIHJldHVybiBzZWdtZW50IGlkIG9mIHNlZ21lbnQgY3VycmVudGx5IGJlaW5nIGZvcm1hdHRlZCBhbmQgZG8gdGhlCisgKiAgIGJ1ZmZlciBzd2l0Y2hpbmcgc3R1ZmYuCisgKi8KK2ludCBmdGFwZV9mb3JtYXRfc3RhdHVzKHVuc2lnbmVkIGludCAqc2VnbWVudF9pZCkKK3sKKwlidWZmZXJfc3RydWN0ICp0YWlsID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJd2hpbGUgKHN3aXRjaF9zZWdtZW50ICE9IDAgJiYKKwkgICAgICAgZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKSAhPSB0YWlsKSB7CisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJLyogIG5lZWQgbW9yZSBidWZmZXJzLCBmaXJzdCB3YWl0IGZvciBlbXB0eSBidWZmZXIKKwkJICovCisJCVRSQUNFX0NBVENIKGZ0YXBlX3dhaXRfc2VnbWVudChmb3JtYXR0aW5nKSwpOworCQkvKiAgZG9uJ3Qgd29ycnkgZm9yIGdhcDMuIElmIHdlIGV2ZXIgaGl0IHRoaXMgcGllY2Ugb2YgY29kZSwKKwkJICogIHRoZW4gYWxsIGJ1ZmZlciBhbHJlYWR5IGhhdmUgdGhlIGNvcnJlY3QgZ2FwMyBzZXQhCisJCSAqLworCQlzZXR1cF9mb3JtYXRfYnVmZmVyKHRhaWwsIHN3aXRjaF9zZWdtZW50LAorCQkJCSAgICBmdF9zZWdtZW50c19wZXJfdHJhY2ssIHRhaWwtPmdhcDMpOworCQlzd2l0Y2hfc2VnbWVudCA9IHRhaWwtPm5leHRfc2VnbWVudDsKKwkJaWYgKHN3aXRjaF9zZWdtZW50ICE9IDApIHsKKwkJCXRhaWwgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKKwkJfQorCX0KKwkvKiAgICBzaG91bGQgcnVubmVyIHN0b3AgPworCSAqLworCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nIHx8IGZ0X3J1bm5lcl9zdGF0dXMgPT0gZG9fYWJvcnQpIHsKKwkJYnVmZmVyX3N0cnVjdCAqaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7CisJCVRSQUNFKGZ0X3Rfd2FybiwgIkVycm9yIGZvcm1hdHRpbmcgc2VnbWVudCAlZCIsCisJCSAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCktPnNlZ21lbnRfaWQpOworCQkodm9pZClmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwkJVFJBQ0VfRVhJVCAoaGVhZC0+c3RhdHVzICE9IGVycm9yKSA/IC1FQUdBSU4gOiAtRUlPOworCX0KKwkvKgorCSAqICBkb24ndCBjYXJlIGlmIHRoZSB0aW1lciBleHBpcmVzLCB0aGlzIGlzIGp1c3Qga2luZCBvZiBhCisJICogICJzZWxlY3QiIG9wZXJhdGlvbiB0aGF0IGxldHMgdGhlIGNhbGxpbmcgcHJvY2VzcyBzbGVlcAorCSAqICB1bnRpbCBzb21ldGhpbmcgaGFzIGhhcHBlbmVkCisJICovCisJaWYgKGZkY19pbnRlcnJ1cHRfd2FpdCg1ICogRlRfU0VDT05EKSA8IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIkVuZCBvZiB0cmFjayAlZCBhdCBzZWdtZW50ICVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24udHJhY2ssCisJCSAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCktPnNlZ21lbnRfaWQpOworCQlyZXN1bHQgPSAxOyAgLyogZW5kIG9mIHRyYWNrLCB1bmxvY2sgbW9kdWxlICovCisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gMDsKKwl9CisJLyoKKwkgKiAgdGhlIGNhbGxpbmcgcHJvY2VzcyBzaG91bGQgdXNlIHRoZSBzZWcgaWQgdG8gZGV0ZXJtaW5lCisJICogIHdoaWNoIHBhcnRzIG9mIHRoZSBkbWEgYnVmZmVycyBjYW4gYmUgc2FmZWx5IG92ZXJ3cml0dGVuCisJICogIHdpdGggbmV3IGRhdGEuCisJICovCisJKnNlZ21lbnRfaWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpLT5zZWdtZW50X2lkOworCS8qCisJICogIEludGVybmFsbHkgd2Ugc3RhcnQgY291bnRpbmcgc2VnbWVudCBpZHMgZnJvbSB0aGUgc3RhcnQgb2YKKwkgKiAgZWFjaCB0cmFjayB3aGVuIGZvcm1hdHRpbmcsIGJ1dCBleHRlcm5hbGx5IHdlIGtlZXAgdGhlbQorCSAqICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHRhcGU6CisJICovCisJKnNlZ21lbnRfaWQgKz0gZnRfbG9jYXRpb24udHJhY2sgKiBmdF9zZWdtZW50c19wZXJfdHJhY2s7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qCisgKiAgVGhlIHNlZ21lbnQgaWQgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0YXBlCisgKi8KK2ludCBmdGFwZV92ZXJpZnlfc2VnbWVudChjb25zdCB1bnNpZ25lZCBpbnQgc2VnbWVudF9pZCwgU2VjdG9yTWFwICpic20pCit7CisJaW50IHJlc3VsdDsKKwlpbnQgdmVyaWZ5X2RvbmUgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgIlZlcmlmeWluZyBzZWdtZW50ICVkIiwgc2VnbWVudF9pZCk7CisKKwlpZiAoZnRfZHJpdmVyX3N0YXRlICE9IHZlcmlmeWluZykgeworCQlUUkFDRShmdF90X25vaXNlLCAiY2FsbGluZyBmdGFwZV9hYm9ydF9vcGVyYXRpb24iKTsKKwkJaWYgKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpIDwgMCkgeworCQkJVFJBQ0UoZnRfdF9lcnIsICJmdGFwZV9hYm9ydF9vcGVyYXRpb24gZmFpbGVkIik7CisJCQlUUkFDRV9FWElUIC1FSU87CisJCX0KKwl9CisJKmJzbSA9IDB4MDAwMDAwMDA7CisJZnRhcGVfc2V0X3N0YXRlKHZlcmlmeWluZyk7CisJZm9yICg7OykgeworCQlidWZmZXJfc3RydWN0ICp0YWlsOworCQkvKgorCQkgKiAgQWxsb3cgZXNjYXBlIGZyb20gdGhpcyBsb29wIG9uIHNpZ25hbAorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQkvKgorCQkgKiAgU2VhcmNoIGFsbCBmdWxsIGJ1ZmZlcnMgZm9yIHRoZSBmaXJzdCBtYXRjaGluZyB0aGUKKwkJICogIHdhbnRlZCBzZWdtZW50LiAgQ2xlYXIgb3RoZXIgYnVmZmVycyBvbiB0aGUgZmx5LgorCQkgKi8KKwkJdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJCXdoaWxlICghdmVyaWZ5X2RvbmUgJiYgdGFpbC0+c3RhdHVzID09IGRvbmUpIHsKKwkJCS8qCisJCQkgKiAgQWxsb3cgZXNjYXBlIGZyb20gdGhpcyBsb29wIG9uIHNpZ25hbCAhCisJCQkgKi8KKwkJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJCWlmICh0YWlsLT5zZWdtZW50X2lkID09IHNlZ21lbnRfaWQpIHsKKwkJCQkvKiAgSWYgb3V0IGJ1ZmZlciBpcyBhbHJlYWR5IGZ1bGwsCisJCQkJICogIHJldHVybiBpdHMgY29udGVudHMuICAKKwkJCQkgKi8KKwkJCQlUUkFDRShmdF90X2Zsb3csICJmb3VuZCBzZWdtZW50IGluIGNhY2hlOiAlZCIsCisJCQkJICAgICAgc2VnbWVudF9pZCk7CisJCQkJaWYgKCh0YWlsLT5zb2Z0X2Vycm9yX21hcCB8CisJCQkJICAgICB0YWlsLT5oYXJkX2Vycm9yX21hcCkgIT0gMCkgeworCQkJCQlUUkFDRShmdF90X2luZm8sImJzbVslZF0gPSAweCUwOGx4IiwKKwkJCQkJICAgICAgc2VnbWVudF9pZCwKKwkJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpCisJCQkJCSAgICAgICh0YWlsLT5zb2Z0X2Vycm9yX21hcCB8CisJCQkJCSAgICAgIHRhaWwtPmhhcmRfZXJyb3JfbWFwKSk7CisJCQkJCSpic20gPSAodGFpbC0+c29mdF9lcnJvcl9tYXAgfAorCQkJCQkJdGFpbC0+aGFyZF9lcnJvcl9tYXApOworCQkJCX0KKwkJCQl2ZXJpZnlfZG9uZSA9IDE7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfZmxvdywiemFwcGluZyBzZWdtZW50IGluIGNhY2hlOiAlZCIsCisJCQkJICAgICAgdGFpbC0+c2VnbWVudF9pZCk7CisJCQl9CisJCQl0YWlsLT5zdGF0dXMgPSB3YWl0aW5nOworCQkJdGFpbCA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQl9CisJCWlmICghdmVyaWZ5X2RvbmUgJiYgdGFpbC0+c3RhdHVzID09IHZlcmlmeWluZykgeworCQkJaWYgKHRhaWwtPnNlZ21lbnRfaWQgPT0gc2VnbWVudF9pZCkgeworCQkJCXN3aXRjaChmdGFwZV93YWl0X3NlZ21lbnQodmVyaWZ5aW5nKSkgeworCQkJCWNhc2UgMDoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAtRUlOVFI6CisJCQkJCVRSQUNFX0FCT1JUKC1FSU5UUiwgZnRfdF93YXJuLAorCQkJCQkJICAgICJpbnRlcnJ1cHRlZCBieSAiCisJCQkJCQkgICAgIm5vbi1ibG9ja2FibGUgc2lnbmFsIik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCQkJCQlmdGFwZV9zZXRfc3RhdGUodmVyaWZ5aW5nKTsKKwkJCQkJLyogYmUgcGlja3kgKi8KKwkJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF93YXJuLAorCQkJCQkJICAgICJ3YWl0X3NlZ21lbnQgZmFpbGVkIik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiAgV2UncmUgcmVhZGluZyB0aGUgd3Jvbmcgc2VnbWVudCwKKwkJCQkgKiAgc3RvcCBydW5uZXIuCisJCQkJICovCisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInZlcmlmeWluZyB3cm9uZyBzZWdtZW50Iik7CisJCQkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7CisJCQkJZnRhcGVfc2V0X3N0YXRlKHZlcmlmeWluZyk7CisJCQl9CisJCX0KKwkJLyogICAgc2hvdWxkIHJ1bm5lciBzdG9wID8KKwkJICovCisJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nKSB7CisJCQlidWZmZXJfc3RydWN0ICpoZWFkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKwkJCWlmIChoZWFkLT5zdGF0dXMgPT0gZXJyb3IgfHwKKwkJCSAgICBoZWFkLT5zdGF0dXMgPT0gdmVyaWZ5aW5nKSB7CisJCQkJLyogbm8gZGF0YSBvciBvdmVycnVuIGVycm9yICovCisJCQkJaGVhZC0+c3RhdHVzID0gd2FpdGluZzsKKwkJCX0KKwkJCVRSQUNFX0NBVENIKGZ0YXBlX2R1bWJfc3RvcCgpLCk7CisJCX0gZWxzZSB7CisJCQkvKiAgSWYganVzdCBwYXNzZWQgbGFzdCBzZWdtZW50IG9uIHRhcGU6IHdhaXQKKwkJCSAqICBmb3IgQk9UIG9yIEVPVCBtYXJrLiBTZXRzIGZ0X3J1bm5lcl9zdGF0dXMgdG8KKwkJCSAqICBpZGxlIGlmIGF0IGxFT1QgYW5kIHN1Y2Nlc3NmdWwgCisJCQkgKi8KKwkJCVRSQUNFX0NBVENIKGZ0YXBlX2hhbmRsZV9sb2dpY2FsX2VvdCgpLCk7CisJCX0KKwkJaWYgKHZlcmlmeV9kb25lKSB7CisJCQlUUkFDRV9FWElUIDA7CisJCX0KKwkJLyogICAgTm93IGF0IGxlYXN0IG9uZSBidWZmZXIgaXMgaWRsZSEKKwkJICogICAgUmVzdGFydCBydW5uZXIgJiB0YXBlIGlmIG5lZWRlZC4KKwkJICovCisJCS8qICBXZSBjb3VsZCBvcHRpbWl6ZSB0aGUgZm9sbG93aW5nIGEgbGl0dGxlIGJpdC4gV2Uga25vdyB0aGF0IAorCQkgKiAgdGhlIGJhZCBzZWN0b3IgbWFwIGlzIGVtcHR5LgorCQkgKi8KKwkJdGFpbCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfdGFpbCk7CisJCWlmICh0YWlsLT5zdGF0dXMgPT0gd2FpdGluZykgeworCQkJYnVmZmVyX3N0cnVjdCAqaGVhZCA9IGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCk7CisKKwkJCWZ0YXBlX3NldHVwX25ld19zZWdtZW50KGhlYWQsIHNlZ21lbnRfaWQsIC0xKTsKKwkJCWZ0YXBlX2NhbGNfbmV4dF9jbHVzdGVyKGhlYWQpOworCQkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gaWRsZSkgeworCQkJCXJlc3VsdCA9IGZ0YXBlX3N0YXJ0X3RhcGUoc2VnbWVudF9pZCwKKwkJCQkJCQkgIGhlYWQtPnNlY3Rvcl9vZmZzZXQpOworCQkJCXN3aXRjaChyZXN1bHQpIHsKKwkJCQljYXNlIDA6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgLUVUSU1FOgorCQkJCWNhc2UgLUVJTlRSOgorCQkJCQlUUkFDRV9BQk9SVChyZXN1bHQsIGZ0X3RfZXJyLCAiRXJyb3I6ICIKKwkJCQkJCSAgICAic2VnbWVudCAlZCB1bnJlYWNoYWJsZSIsCisJCQkJCQkgICAgc2VnbWVudF9pZCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCSpic20gPSBFTVBUWV9TRUdNRU5UOworCQkJCQlUUkFDRV9FWElUIDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWhlYWQtPnN0YXR1cyA9IHZlcmlmeWluZzsKKwkJCWZkY19zZXR1cF9yZWFkX3dyaXRlKGhlYWQsIEZEQ19WRVJJRlkpOworCQl9CisJfQorCS8qIG5vdCByZWFjaGVkICovCisJVFJBQ0VfRVhJVCAtRUlPOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTE2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBfRlRBUEVfRk9STUFUX0gKKyNkZWZpbmUgX0ZUQVBFX0ZPUk1BVF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MTMgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsb3cgbGV2ZWwgZGVmaW5pdGlvbnMgZm9yIHRoZQorICogICAgICBmb3JtYXR0aW5nIHN1cHBvcnQgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlCisgKiAgICAgIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKyAqLworCisjaWZkZWYgX19LRVJORUxfXworZXh0ZXJuIGludCBmdGFwZV9mb3JtYXRfdHJhY2soY29uc3QgdW5zaWduZWQgaW50IHRyYWNrLCBjb25zdCBfX3U4IGdhcDMpOworZXh0ZXJuIGludCBmdGFwZV9mb3JtYXRfc3RhdHVzKHVuc2lnbmVkIGludCAqc2VnbWVudF9pZCk7CitleHRlcm4gaW50IGZ0YXBlX3ZlcmlmeV9zZWdtZW50KGNvbnN0IHVuc2lnbmVkIGludCBzZWdtZW50X2lkLCBTZWN0b3JNYXAgKmJzbSk7CisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pbml0LmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDI2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpbnRlcmZhY2VzIHRoZSBrZXJuZWwKKyAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+CisjaWZkZWYgQ09ORklHX1pGVEFQRQorI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW8uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXByb2MuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisKKworI2lmIGRlZmluZWQoTU9EVUxFKSAmJiAhZGVmaW5lZChDT05GSUdfRlRfTk9fVFJBQ0VfQVRfQUxMKQorc3RhdGljIGludCBmdF90cmFjaW5nID0gLTE7CisjZW5kaWYKKworCisvKiAgQ2FsbGVkIGJ5IG1vZHVsZXMgcGFja2FnZSB3aGVuIGluc3RhbGxpbmcgdGhlIGRyaXZlcgorICogIG9yIGJ5IGtlcm5lbCBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIHBoYXNlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGZ0YXBlX2luaXQodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworI2lmZGVmIE1PRFVMRQorI2lmbmRlZiBDT05GSUdfRlRfTk9fVFJBQ0VfQVRfQUxMCisJaWYgKGZ0X3RyYWNpbmcgIT0gLTEpIHsKKwkJZnRhcGVfdHJhY2luZyA9IGZ0X3RyYWNpbmc7CisJfQorI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyBGVEFQRV9WRVJTSU9OICJcbiIpOworICAgICAgICBpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9pbmZvKSB7CisJCXByaW50aygKK0tFUk5fSU5GTyAiKGMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuIChiYXNAdmltZWMubmwpXG4iCitLRVJOX0lORk8gIihjKSAxOTk1LTE5OTYgS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4gKGtocEBkb2xwaGluaWNzLm5vKVxuIgorS0VSTl9JTkZPICIoYykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZSAoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlKVxuIgorS0VSTl9JTkZPICJRSUMtMTE3IGRyaXZlciBmb3IgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHkgdGFwZSBkcml2ZXNcbiIpOworICAgICAgICB9CisjZWxzZSAvKiAhTU9EVUxFICovCisJLyogcHJpbnQgYSBzaG9ydCBuby1ub25zZW5zZSBib290IG1lc3NhZ2UgKi8KKwlwcmludGsoS0VSTl9JTkZPIEZUQVBFX1ZFUlNJT04gIlxuIik7CisjZW5kaWYgLyogTU9EVUxFICovCisJVFJBQ0UoZnRfdF9pbmZvLCAiaW5zdGFsbGluZyBRSUMtMTE3IGZsb3BweSB0YXBlIGhhcmR3YXJlIGRyaXZlIC4uLiAiKTsKKwlUUkFDRShmdF90X2luZm8sICJmdGFwZV9pbml0IEAgMHglcCIsIGZ0YXBlX2luaXQpOworCS8qICBBbGxvY2F0ZSB0aGUgRE1BIGJ1ZmZlcnMuIFRoZXkgYXJlIGRlYWxsb2NhdGVkIGF0IGNsZWFudXAoKSB0aW1lLgorCSAqLworI2lmZGVmIFRFU1RJTkcKKyNpZmRlZiBNT0RVTEUKKwl3aGlsZSAoZnRhcGVfc2V0X25yX2J1ZmZlcnMoQ09ORklHX0ZUX05SX0JVRkZFUlMpIDwgMCkgeworCQlmdGFwZV9zbGVlcChGVF9TRUNPTkQvMjApOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCSh2b2lkKWZ0YXBlX3NldF9ucl9idWZmZXJzKDApOworCQkJVFJBQ0UoZnRfdF9idWcsCisJCQkgICAgICAiS2lsbGVkIGJ5IHNpZ25hbCB3aGlsZSBhbGxvY2F0aW5nIGJ1ZmZlcnMuIik7CisJCQlUUkFDRV9BQk9SVCgtRUlOVFIsIAorCQkJCSAgICBmdF90X2J1ZywgIkZyZWUgdXAgbWVtb3J5IGFuZCByZXRyeSIpOworCQl9CisJfQorI2Vsc2UKKwlUUkFDRV9DQVRDSChmdGFwZV9zZXRfbnJfYnVmZmVycyhDT05GSUdfRlRfTlJfQlVGRkVSUyksCisJCSAgICAodm9pZClmdGFwZV9zZXRfbnJfYnVmZmVycygwKSk7CisjZW5kaWYKKyNlbHNlCisJVFJBQ0VfQ0FUQ0goZnRhcGVfc2V0X25yX2J1ZmZlcnMoQ09ORklHX0ZUX05SX0JVRkZFUlMpLAorCQkgICAgKHZvaWQpZnRhcGVfc2V0X25yX2J1ZmZlcnMoMCkpOworI2VuZGlmCisJZnRfZHJpdmVfc2VsID0gLTE7CisJZnRfZmFpbHVyZSAgID0gMTsgICAgICAgICAvKiBpbmhpYml0IGFueSBvcGVyYXRpb24gYnV0IG9wZW4gKi8KKwlmdGFwZV91ZGVsYXlfY2FsaWJyYXRlKCk7IC8qIG11c3QgYmUgYmVmb3JlIGZkY193YWl0X2NhbGlicmF0ZSAhICovCisJZmRjX3dhaXRfY2FsaWJyYXRlKCk7CisjaWYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykgJiYgZGVmaW5lZChDT05GSUdfRlRfUFJPQ19GUykKKwkodm9pZClmdGFwZV9wcm9jX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19aRlRBUEUKKwkodm9pZCl6ZnRfaW5pdCgpOworI2VuZGlmCisJVFJBQ0VfRVhJVCAwOworfQorCittb2R1bGVfcGFyYW0oZnRfZmRjX2Jhc2UsICAgICAgIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmdF9mZGNfYmFzZSwgICJCYXNlIGFkZHJlc3Mgb2YgRkRDIGNvbnRyb2xsZXIuIik7Cittb2R1bGVfcGFyYW0oZnRfZmRjX2lycSwgICAgICAgIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmdF9mZGNfaXJxLCAgICJJUlEgKGludGVycnVwdCBjaGFubmVsKSB0byB1c2UuIik7Cittb2R1bGVfcGFyYW0oZnRfZmRjX2RtYSwgICAgICAgIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmdF9mZGNfZG1hLCAgICJETUEgY2hhbm5lbCB0byB1c2UuIik7Cittb2R1bGVfcGFyYW0oZnRfZmRjX3RocmVzaG9sZCwgIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmdF9mZGNfdGhyZXNob2xkLCAgIlRocmVzaG9sZCBvZiB0aGUgRkRDIEZpZm8uIik7Cittb2R1bGVfcGFyYW0oZnRfZmRjX3JhdGVfbGltaXQsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmdF9mZGNfcmF0ZV9saW1pdCwgIk1heGltYWwgZGF0YSByYXRlIGZvciBGREMuIik7Cittb2R1bGVfcGFyYW0oZnRfcHJvYmVfZmMxMCwgICAgIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhmdF9wcm9iZV9mYzEwLAorCSAgICAiSWYgbm9uLXplcm8sIHByb2JlIGZvciBhIENvbG9yYWRvIEZDLTEwL0ZDLTIwIGNvbnRyb2xsZXIuIik7Cittb2R1bGVfcGFyYW0oZnRfbWFjaDIsICAgICAgICAgIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhmdF9tYWNoMiwKKwkgICAgIklmIG5vbi16ZXJvLCBwcm9iZSBmb3IgYSBNb3VudGFpbiBNQUNILTIgY29udHJvbGxlci4iKTsKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgIWRlZmluZWQoQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTCkKK21vZHVsZV9wYXJhbShmdF90cmFjaW5nLCAgICAgICAgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZnRfdHJhY2luZywKKwkgICAgIkFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0LCAwIDw9IHRyYWNpbmcgPD0gOCwgZGVmYXVsdCAzLiIpOworI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoCisJIihjKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiAoYmFzQHZpbWVjLm5sKSwgIgorCSIoYykgMTk5NS0xOTk2IEthaSBIYXJyZWtpbGRlLVBldGVyc2VuIChraHBAZG9scGhpbmljcy5ubyksICIKKwkiKGMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lIChjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGUpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oCisJIlFJQy0xMTcgZHJpdmVyIGZvciBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweSB0YXBlIGRyaXZlcy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHZvaWQgX19leGl0IGZ0YXBlX2V4aXQodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX0ZUX1BST0NfRlMpCisJZnRhcGVfcHJvY19kZXN0cm95KCk7CisjZW5kaWYKKwkodm9pZClmdGFwZV9zZXRfbnJfYnVmZmVycygwKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiZnRhcGU6IHVubG9hZGVkLlxuIik7CisJVFJBQ0VfRVhJVDsKK30KKworbW9kdWxlX2luaXQoZnRhcGVfaW5pdCk7Cittb2R1bGVfZXhpdChmdGFwZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pbml0LmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTdiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW5pdC5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgX0ZUQVBFX0lOSVRfSAorI2RlZmluZSBfRlRBUEVfSU5JVF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pbml0LmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoxNiAkCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIGludGVyZmFjZSB0byAKKyAqIHRoZSBMaW51eCBrZXJuZWwgZm9yIGZsb3BweSB0YXBlIGRyaXZlciBmdGFwZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKworI2RlZmluZSBfTkVWRVJfQkxPQ0sgICAgKHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKQorI2RlZmluZSBfRE9OVF9CTE9DSyAgICAgKF9ORVZFUl9CTE9DSyB8IHNpZ21hc2soU0lHSU5UKSkKKyNkZWZpbmUgX0RPX0JMT0NLICAgICAgIChzaWdtYXNrKFNJR1BJUEUpKQorCisjaWZuZGVmIFFJQzExN19UQVBFX01BSk9SCisjZGVmaW5lIFFJQzExN19UQVBFX01BSk9SIDI3CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTAxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uYwpAQCAtMCwwICsxLDk5MiBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAgICAgIChDKSAxOTk2ICAgICAgS2FpIEhhcnJla2lsZGUtUGV0ZXJzZW4sCisgKiAgICAgICAgICAgICAgICAoQykgMTk5NyAgICAgIENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uYyx2ICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqICREYXRlOiAxOTk3LzExLzExIDE0OjAyOjM2ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZ2VuZXJhbCBjb250cm9sIGZ1bmN0aW9ucyBmb3IgdGhlCisgKiAgICAgIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyICJmdGFwZSIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY2FsaWJyLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KKy8qIE5PVEU6IHNlY3RvcnMgc3RhcnQgbnVtYmVyaW5nIGF0IDEsIGFsbCBvdGhlcnMgYXQgMCAhICovCitmdF90aW1lb3V0X3RhYmxlIGZ0YXBlX3RpbWVvdXQ7Cit1bnNpZ25lZCBpbnQgZnRhcGVfdGFwZV9sZW47Cit2b2xhdGlsZSBxaWMxMTdfY21kX3QgZnRhcGVfY3VycmVudF9jb21tYW5kOworY29uc3Qgc3RydWN0IHFpYzExN19jb21tYW5kX3RhYmxlIHFpYzExN19jbWRzW10gPSBRSUMxMTdfQ09NTUFORFM7CitpbnQgZnRhcGVfbWlnaHRfYmVfb2ZmX3RyYWNrOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBpbnQgZGlhZ25vc3RpY19tb2RlOworc3RhdGljIHVuc2lnbmVkIGludCBmdGFwZV91ZGVsYXlfY291bnQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGZ0YXBlX3VkZWxheV90aW1lOworCit2b2lkIGZ0YXBlX3VkZWxheSh1bnNpZ25lZCBpbnQgdXNlY3MpCit7CisJdm9sYXRpbGUgaW50IGNvdW50ID0gKGZ0YXBlX3VkZWxheV9jb3VudCAqIHVzZWNzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0YXBlX3VkZWxheV9jb3VudCAtIDEpIC8gZnRhcGVfdWRlbGF5X3RpbWU7CisJdm9sYXRpbGUgaW50IGk7CisKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IDIwOyArK2kpOworCX0KK30KKwordm9pZCBmdGFwZV91ZGVsYXlfY2FsaWJyYXRlKHZvaWQpCit7CisJZnRhcGVfY2FsaWJyYXRlKCJmdGFwZV91ZGVsYXkiLAorCQkJZnRhcGVfdWRlbGF5LCAmZnRhcGVfdWRlbGF5X2NvdW50LCAmZnRhcGVfdWRlbGF5X3RpbWUpOworfQorCisvKiAgICAgIERlbGF5IChtc2VjKSByb3V0aW5lLgorICovCit2b2lkIGZ0YXBlX3NsZWVwKHVuc2lnbmVkIGludCB0aW1lKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwl0aW1lICo9IDEwMDA7ICAgLyogbXNlY3MgLT4gdXNlY3MgKi8KKwlpZiAodGltZSA8IEZUX1VTUFQpIHsKKwkJLyogIFRpbWUgdG9vIHNtYWxsIGZvciBzY2hlZHVsZXIsIGRvIGEgYnVzeSB3YWl0ICEgKi8KKwkJZnRhcGVfdWRlbGF5KHRpbWUpOworCX0gZWxzZSB7CisJCWxvbmcgdGltZW91dDsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdW5zaWduZWQgaW50IHRpY2tzID0gKHRpbWUgKyBGVF9VU1BUIC0gMSkgLyBGVF9VU1BUOworCisJCVRSQUNFKGZ0X3RfYW55LCAiJWQgbXNlYywgJWQgdGlja3MiLCB0aW1lLzEwMDAsIHRpY2tzKTsKKwkJdGltZW91dCA9IHRpY2tzOworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJc3RpKCk7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3ModGltZW91dCkpOworCQkvKiAgTW1tLiBJc24ndCBjdXJyZW50LT5ibG9ja2VkID09IDB4ZmZmZmZmZmYgPworCQkgKi8KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlUUkFDRShmdF90X2VyciwgImF3b2tlbiBieSBub24tYmxvY2tlZCBzaWduYWwgOi0oIik7CisJCX0KKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qICBzZW5kIGEgY29tbWFuZCBvciBwYXJhbWV0ZXIgdG8gdGhlIGRyaXZlCisgKiAgR2VuZXJhdGVzICMgb2Ygc3RlcCBwdWxzZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZ0X3NlbmRfdG9fZHJpdmUoaW50IGFyZykKK3sKKwkvKiAgQWx3YXlzIHdhaXQgZm9yIGEgY29tbWFuZF90aW1lb3V0IHBlcmlvZCB0byBzZXBhcmF0ZQorCSAqICBpbmRpdmlkdWFscyBjb21tYW5kcyBhbmQvb3IgcGFyYW1ldGVycy4KKwkgKi8KKwlmdGFwZV9zbGVlcCgzICogRlRfTUlMTElTRUNPTkQpOworCS8qICBLZWVwIGN5bGluZGVyIG5yIHdpdGhpbiByYW5nZSwgc3RlcCB0b3dhcmRzIGhvbWUgaWYgcG9zc2libGUuCisJICovCisJaWYgKGZ0YXBlX2N1cnJlbnRfY3lsaW5kZXIgPj0gYXJnKSB7CisJCXJldHVybiBmZGNfc2VlayhmdGFwZV9jdXJyZW50X2N5bGluZGVyIC0gYXJnKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZmRjX3NlZWsoZnRhcGVfY3VycmVudF9jeWxpbmRlciArIGFyZyk7CisJfQorfQorCisvKiBmb3J3YXJkICovIGludCBmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cyhpbnQgKnN0YXR1cyk7CisKK3N0YXRpYyBpbnQgZnRfY2hlY2tfY21kX3Jlc3RyaWN0aW9ucyhxaWMxMTdfY21kX3QgY29tbWFuZCkKK3sKKwlpbnQgc3RhdHVzID0gLTE7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkKKwlUUkFDRShmdF90X2Zsb3csICIlcyIsIHFpYzExN19jbWRzW2NvbW1hbmRdLm5hbWUpOworCS8qIEEgbmV3IG1vdGlvbiBjb21tYW5kIGR1cmluZyBhbiB1bmludGVycnVwdGlibGUgKG1vdGlvbikKKwkgKiAgY29tbWFuZCByZXF1aXJlcyBhIHJlYWR5IHN0YXR1cyBiZWZvcmUgdGhlIG5ldyBjb21tYW5kIGNhbgorCSAqICBiZSBpc3N1ZWQuIE90aGVyd2lzZSBhIG5ldyBtb3Rpb24gY29tbWFuZCBuZWVkcyB0byBiZQorCSAqICBjaGVja2VkIGFnYWluc3QgcmVxdWlyZWQgc3RhdHVzLgorCSAqLworCWlmIChxaWMxMTdfY21kc1tjb21tYW5kXS5jbWRfdHlwZSA9PSBtb3Rpb24gJiYKKwkgICAgcWljMTE3X2NtZHNbZnRhcGVfY3VycmVudF9jb21tYW5kXS5ub25faW50cikgeworCQlmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cygmc3RhdHVzKTsKKwkJaWYgKChzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSA9PSAwKSB7CisJCQlUUkFDRShmdF90X25vaXNlLAorCQkJICAgICAgIm1vdGlvbiBjbWQgKCVkKSBkdXJpbmcgbm9uLWludHIgY21kICglZCkiLAorCQkJICAgICAgY29tbWFuZCwgZnRhcGVfY3VycmVudF9jb21tYW5kKTsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ3YWl0aW5nIHVudGlsIGRyaXZlIGdldHMgcmVhZHkiKTsKKwkJCWZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5zZWVrLAorCQkJCQkgJnN0YXR1cyk7CisJCX0KKwl9CisJaWYgKHFpYzExN19jbWRzW2NvbW1hbmRdLm1hc2sgIT0gMCkgeworCQlfX3U4IGRpZmZlcmVuY2U7CisJCS8qICBTb21lIGNvbW1hbmRzIGRvIHJlcXVpcmUgYSBjZXJ0YWluIHN0YXR1czoKKwkJICovCisJCWlmIChzdGF0dXMgPT0gLTEpIHsJLyogbm90IHlldCBzZXQgKi8KKwkJCWZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKCZzdGF0dXMpOworCQl9CisJCWRpZmZlcmVuY2UgPSAoKHN0YXR1cyBeIHFpYzExN19jbWRzW2NvbW1hbmRdLnN0YXRlKSAmCisJCQkgICAgICBxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrKTsKKwkJLyogIFdhaXQgdW50aWwgdGhlIGRyaXZlIGdldHMKKwkJICogIHJlYWR5LiBUaGlzIG1heSBsYXN0IGZvcmV2ZXIgaWYKKwkJICogIHRoZSBkcml2ZSBuZXZlciBnZXRzIHJlYWR5Li4uIAorCQkgKi8KKwkJd2hpbGUgKChkaWZmZXJlbmNlICYgUUlDX1NUQVRVU19SRUFEWSkgIT0gMCkgeworCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImNvbW1hbmQgJWQgaXNzdWVkIHdoaWxlIG5vdCByZWFkeSIsCisJCQkgICAgICBjb21tYW5kKTsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ3YWl0aW5nIHVudGlsIGRyaXZlIGdldHMgcmVhZHkiKTsKKwkJCWlmIChmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQuc2VlaywKKwkJCQkJICAgICAmc3RhdHVzKSA9PSAtRUlOVFIpIHsKKwkJCQkvKiAgQmFpbCBvdXQgb24gc2lnbmFsICEKKwkJCQkgKi8KKwkJCQlUUkFDRV9BQk9SVCgtRUlOVFIsIGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiaW50ZXJydXB0ZWQgYnkgbm9uLWJsb2NrYWJsZSBzaWduYWwiKTsKKwkJCX0KKwkJCWRpZmZlcmVuY2UgPSAoKHN0YXR1cyBeIHFpYzExN19jbWRzW2NvbW1hbmRdLnN0YXRlKSAmCisJCQkJICAgICAgcWljMTE3X2NtZHNbY29tbWFuZF0ubWFzayk7CisJCX0KKwkJd2hpbGUgKChkaWZmZXJlbmNlICYgUUlDX1NUQVRVU19FUlJPUikgIT0gMCkgeworCQkJaW50IGVycjsKKwkJCXFpYzExN19jbWRfdCBjbWQ7CisKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkgICAgICAiY29tbWFuZCAlZCBpc3N1ZWQgd2hpbGUgZXJyb3IgcGVuZGluZyIsCisJCQkgICAgICBjb21tYW5kKTsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjbGVhcmluZyBlcnJvciBzdGF0dXMiKTsKKwkJCWZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyLCAmY21kLCAxKTsKKwkJCWZ0YXBlX3JlcG9ydF9yYXdfZHJpdmVfc3RhdHVzKCZzdGF0dXMpOworCQkJZGlmZmVyZW5jZSA9ICgoc3RhdHVzIF4gcWljMTE3X2NtZHNbY29tbWFuZF0uc3RhdGUpICYKKwkJCQkgICAgICBxaWMxMTdfY21kc1tjb21tYW5kXS5tYXNrKTsKKwkJCWlmICgoZGlmZmVyZW5jZSAmIFFJQ19TVEFUVVNfRVJST1IpICE9IDApIHsKKwkJCQkvKiAgQmFpbCBvdXQgb24gZmF0YWwgc2lnbmFsICEKKwkJCQkgKi8KKwkJCQlGVF9TSUdOQUxfRVhJVChfTkVWRVJfQkxPQ0spOworCQkJfQorCQl9CisJCWlmIChkaWZmZXJlbmNlKSB7CisJCQkvKiAgQW55IHJlbWFpbmluZyBkaWZmZXJlbmNlIGNhbid0IGJlIHNvbHZlZAorCQkJICogIGhlcmUuICAKKwkJCSAqLworCQkJaWYgKGRpZmZlcmVuY2UgJiAoUUlDX1NUQVRVU19DQVJUUklER0VfUFJFU0VOVCB8CisJCQkJCSAgUUlDX1NUQVRVU19ORVdfQ0FSVFJJREdFIHwKKwkJCQkJICBRSUNfU1RBVFVTX1JFRkVSRU5DRUQpKSB7CisJCQkJVFJBQ0UoZnRfdF93YXJuLAorCQkJCSAgICAgICJGYXRhbDogdGFwZSByZW1vdmVkIG9yIHJlaW5zZXJ0ZWQgISIpOworCQkJCWZ0X2ZhaWx1cmUgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2VyciwgIndyb25nIHN0YXRlOiAweCUwMnggc2hvdWxkIGJlOiAweCUwMngiLAorCQkJCSAgICAgIHN0YXR1cyAmIHFpYzExN19jbWRzW2NvbW1hbmRdLm1hc2ssCisJCQkJICAgICAgcWljMTE3X2NtZHNbY29tbWFuZF0uc3RhdGUpOworCQkJfQorCQkJVFJBQ0VfRVhJVCAtRUlPOworCQl9CisJCWlmICh+c3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSAmIHFpYzExN19jbWRzW2NvbW1hbmRdLm1hc2spIHsKKwkJCVRSQUNFX0FCT1JUKC1FQlVTWSwgZnRfdF9lcnIsICJCYWQ6IHN0aWxsIGJ1c3khIik7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIElzc3VlIGEgdGFwZSBjb21tYW5kOgorICovCitpbnQgZnRhcGVfY29tbWFuZChxaWMxMTdfY21kX3QgY29tbWFuZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdGF0aWMgaW50IGxldmVsOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoKHVuc2lnbmVkIGludCljb21tYW5kID4gTlJfSVRFTVMocWljMTE3X2NtZHMpKSB7CisJCS8qICBUaGlzIGlzIGEgYnVnIHdlJ2xsIHdhbnQgdG8ga25vdyBhYm91dCB0b28uCisJCSAqLworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywgImJ1ZyAtIGJhZCBjb21tYW5kOiAlZCIsIGNvbW1hbmQpOworCX0KKwlpZiAoKytsZXZlbCA+IDUpIHsgLyogIFRoaXMgaXMgYSBidWcgd2UnbGwgd2FudCB0byBrbm93IGFib3V0LiAqLworCQktLWxldmVsOworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywgImJ1ZyAtIHJlY3Vyc2lvbiBmb3IgY29tbWFuZDogJWQiLAorCQkJICAgIGNvbW1hbmQpOworCX0KKwkvKiAgZGlzYWJsZSBsb2dnaW5nIGFuZCByZXN0cmljdGlvbiBjaGVjayBmb3Igc29tZSBjb21tYW5kcywKKwkgKiAgY2hlY2sgYWxsIG90aGVyIGNvbW1hbmRzIHRoYXQgaGF2ZSBhIHByZXNjcmliZWQgc3RhcnRpbmcKKwkgKiAgc3RhdHVzLgorCSAqLworCWlmIChkaWFnbm9zdGljX21vZGUpIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiZGlhZ25vc3RpYyBjb21tYW5kICVkIiwgY29tbWFuZCk7CisJfSBlbHNlIGlmIChjb21tYW5kID09IFFJQ19SRVBPUlRfRFJJVkVfU1RBVFVTIHx8CisJCSAgIGNvbW1hbmQgPT0gUUlDX1JFUE9SVF9ORVhUX0JJVCkgeworCQlUUkFDRShmdF90X2FueSwgIiVzIiwgcWljMTE3X2NtZHNbY29tbWFuZF0ubmFtZSk7CisJfSBlbHNlIHsKKwkJVFJBQ0VfQ0FUQ0goZnRfY2hlY2tfY21kX3Jlc3RyaWN0aW9ucyhjb21tYW5kKSwgLS1sZXZlbCk7CisJfQorCS8qICBOb3cgYWxsIGNvbmRpdGlvbnMgYXJlIG1ldCBvciByZXN1bHQgd2FzIDwgMC4KKwkgKi8KKwlyZXN1bHQgPSBmdF9zZW5kX3RvX2RyaXZlKCh1bnNpZ25lZCBpbnQpY29tbWFuZCk7CisJaWYgKHFpYzExN19jbWRzW2NvbW1hbmRdLmNtZF90eXBlID09IG1vdGlvbiAmJgorCSAgICBjb21tYW5kICE9IFFJQ19MT0dJQ0FMX0ZPUldBUkQgJiYgY29tbWFuZCAhPSBRSUNfU1RPUF9UQVBFKSB7CisJCWZ0X2xvY2F0aW9uLmtub3duID0gMDsKKwl9CisJZnRhcGVfY3VycmVudF9jb21tYW5kID0gY29tbWFuZDsKKwktLWxldmVsOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgICAgIFNlbmQgYSB0YXBlIGNvbW1hbmQgcGFyYW1ldGVyOgorICogICAgICBHZW5lcmF0ZXMgY29tbWFuZCAjIG9mIHN0ZXAgcHVsc2VzLgorICogICAgICBTa2lwcyB0YXBlLXN0YXR1cyBjYWxsICEKKyAqLworaW50IGZ0YXBlX3BhcmFtZXRlcih1bnNpZ25lZCBpbnQgcGFyYW1ldGVyKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlUUkFDRShmdF90X2Zsb3csICJjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgPSAlZCIsIHBhcmFtZXRlcik7CisJVFJBQ0VfRVhJVCBmdF9zZW5kX3RvX2RyaXZlKHBhcmFtZXRlciArIDIpOworfQorCisvKiAgICAgIFdhaXQgZm9yIHRoZSBkcml2ZSB0byBnZXQgcmVhZHkuCisgKiAgICAgIHRpbWVvdXQgdGltZSBpbiBtaWxsaS1zZWNvbmRzCisgKiAgICAgIFJldHVybmVkIHN0YXR1cyBpcyB2YWxpZCBpZiByZXN1bHQgIT0gLUVJTworICoKKyAqICAgICAgU2hvdWxkIHdlIGFsbG93IHRvIGJlIGtpbGxlZCBieSBTSUdJTlQ/ICAoXkMpCisgKiAgICAgIFdvdWxkIGJlIG5pY2UgYXQgbGVhc3QgZm9yIGxhcmdlIHRpbWVvdXRzLgorICovCitpbnQgZnRhcGVfcmVhZHlfd2FpdCh1bnNpZ25lZCBpbnQgdGltZW91dCwgaW50ICpzdGF0dXMpCit7CisJdW5zaWduZWQgbG9uZyB0MDsKKwl1bnNpZ25lZCBpbnQgcG9sbF9kZWxheTsKKwlpbnQgc2lnbmFsX3JldHJpZXM7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qICB0aGUgZm9sbG93aW5nICoqIFJFQUxMWSAqKiByZWR1Y2VzIHRoZSBzeXN0ZW0gbG9hZCB3aGVuCisJICogIGUuZy4gb25lIHNpbXBseSByZXdpbmRzIG9yIHJldGVuc2lvbnMuIFRoZSB0YXBlIGlzIHNsb3cgCisJICogIGFueXdheS4gSXQgaXMgcmVhbGx5IG5vdCBuZWNlc3NhcnkgdG8gZGV0ZWN0IGVycm9yIAorCSAqICBjb25kaXRpb25zIHdpdGggMS8xMCBzZWNvbmRzIGdyYW51bGFyaXR5CisJICoKKwkgKiAgT24gbXkgQU1EIDEzM01IWiA0ODY6IDEwMCBtczogMjMlIHN5c3RlbSBsb2FkCisJICogICAgICAgICAgICAgICAgICAgICAgICAxICBzZWM6ICA1JQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgNSAgc2VjOiAgMC42JSwgeWVhaAorCSAqLworCWlmICh0aW1lb3V0IDw9IEZUX1NFQ09ORCkgeworCQlwb2xsX2RlbGF5ID0gMTAwICogRlRfTUlMTElTRUNPTkQ7CisJCXNpZ25hbF9yZXRyaWVzID0gMjA7IC8qIHR3byBzZWNvbmRzICovCisJfSBlbHNlIGlmICh0aW1lb3V0IDwgMjAgKiBGVF9TRUNPTkQpIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAic2V0dGluZyBwb2xsIGRlbGF5IHRvIDEgc2Vjb25kIik7CisJCXBvbGxfZGVsYXkgPSBGVF9TRUNPTkQ7CisJCXNpZ25hbF9yZXRyaWVzID0gMjsgLyogdHdvIHNlY29uZHMgKi8KKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2Zsb3csICJzZXR0aW5nIHBvbGwgZGVsYXkgdG8gNSBzZWNvbmRzIik7CisJCXBvbGxfZGVsYXkgPSA1ICogRlRfU0VDT05EOworCQlzaWduYWxfcmV0cmllcyA9IDE7IC8qIGZpdmUgc2Vjb25kcyAqLworCX0KKwlmb3IgKDs7KSB7CisJCXQwID0gamlmZmllczsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoc3RhdHVzKSwpOworCQlpZiAoKnN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpIHsKKwkJCVRSQUNFX0VYSVQgMDsKKwkJfQorCQlpZiAoIXNpZ25hbF9yZXRyaWVzLS0pIHsKKwkJCUZUX1NJR05BTF9FWElUKF9ORVZFUl9CTE9DSyk7CisJCX0KKwkJaWYgKChpbnQpdGltZW91dCA+PSAwKSB7CisJCQkvKiB0aGlzIHdpbGwgZmFpbCB3aGVuIGppZmZpZXMgd3JhcHMgYXJvdW5kIGFib3V0CisJCQkgKiBvbmNlIGV2ZXJ5IHllYXIgOi0pCisJCQkgKi8KKwkJCXRpbWVvdXQgLT0gKChqaWZmaWVzIC0gdDApICogRlRfU0VDT05EKSAvIEhaOworCQkJaWYgKHRpbWVvdXQgPD0gMCkgeworCQkJCVRSQUNFX0FCT1JUKC1FVElNRSwgZnRfdF9lcnIsICJ0aW1lb3V0Iik7CisJCQl9CisJCQlmdGFwZV9zbGVlcChwb2xsX2RlbGF5KTsKKwkJCXRpbWVvdXQgLT0gcG9sbF9kZWxheTsKKwkJfSBlbHNlIHsKKwkJCWZ0YXBlX3NsZWVwKHBvbGxfZGVsYXkpOworCQl9CisJfQorCVRSQUNFX0VYSVQgLUVUSU1FOworfQorCisvKiAgICAgIElzc3VlIGNvbW1hbmQgYW5kIHdhaXQgdXAgdG8gdGltZW91dCBtaWxsaSBzZWNvbmRzIGZvciBkcml2ZSByZWFkeQorICovCitpbnQgZnRhcGVfY29tbWFuZF93YWl0KHFpYzExN19jbWRfdCBjb21tYW5kLCB1bnNpZ25lZCBpbnQgdGltZW91dCwgaW50ICpzdGF0dXMpCit7CisJaW50IHJlc3VsdDsKKworCS8qIERyaXZlIHNob3VsZCBiZSByZWFkeSwgaXNzdWUgY29tbWFuZAorCSAqLworCXJlc3VsdCA9IGZ0YXBlX2NvbW1hbmQoY29tbWFuZCk7CisJaWYgKHJlc3VsdCA+PSAwKSB7CisJCXJlc3VsdCA9IGZ0YXBlX3JlYWR5X3dhaXQodGltZW91dCwgc3RhdHVzKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBmdGFwZV9wYXJhbWV0ZXJfd2FpdCh1bnNpZ25lZCBpbnQgcGFybSwgdW5zaWduZWQgaW50IHRpbWVvdXQsIGludCAqc3RhdHVzKQoreworCWludCByZXN1bHQ7CisKKwkvKiBEcml2ZSBzaG91bGQgYmUgcmVhZHksIGlzc3VlIGNvbW1hbmQKKwkgKi8KKwlyZXN1bHQgPSBmdGFwZV9wYXJhbWV0ZXIocGFybSk7CisJaWYgKHJlc3VsdCA+PSAwKSB7CisJCXJlc3VsdCA9IGZ0YXBlX3JlYWR5X3dhaXQodGltZW91dCwgc3RhdHVzKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICBSZXBvcnQgb3BlcmF0aW9ucworICovCisKKy8qIFF1ZXJ5IHRoZSBkcml2ZSBhYm91dCBpdHMgc3RhdHVzLiAgVGhlIGNvbW1hbmQgaXMgc2VudCBhbmQKKyAgIHJlc3VsdF9sZW5ndGggYml0cyBvZiBzdGF0dXMgYXJlIHJldHVybmVkICgyIGV4dHJhIGJpdHMgYXJlIHJlYWQKKyAgIGZvciBzdGFydCBhbmQgc3RvcCkuICovCisKK2ludCBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKGludCAqc3RhdHVzLAorCQkJICAgcWljMTE3X2NtZF90IGNvbW1hbmQsCisJCQkgICBpbnQgcmVzdWx0X2xlbmd0aCkKK3sKKwlpbnQgaSwgc3QzOworCXVuc2lnbmVkIGludCB0MDsKKwl1bnNpZ25lZCBpbnQgZHQ7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoY29tbWFuZCksKTsKKwl0MCA9IGZ0YXBlX3RpbWVzdGFtcCgpOworCWkgPSAwOworCWRvIHsKKwkJKytpOworCQlmdGFwZV9zbGVlcCgzICogRlRfTUlMTElTRUNPTkQpOwkvKiBzZWUgcmVtYXJrIGJlbG93ICovCisJCVRSQUNFX0NBVENIKGZkY19zZW5zZV9kcml2ZV9zdGF0dXMoJnN0MyksKTsKKwkJZHQgPSBmdGFwZV90aW1lZGlmZih0MCwgZnRhcGVfdGltZXN0YW1wKCkpOworCQkvKiAgQWNrIHNob3VsZCBiZSBhc3NlcnRlZCB3aXRoaW4gVHRpbW91dCArIFRhY2sgPSA2IG1zZWMuCisJCSAqICBMb29rcyBsaWtlIHNvbWUgZHJpdmVzIGZhaWwgdG8gZG8gdGhpcyBzbyBleHRlbmQgdGhpcworCQkgKiAgcGVyaW9kIHRvIDMwMCBtc2VjLgorCQkgKi8KKwl9IHdoaWxlICghKHN0MyAmIFNUM19UUkFDS18wKSAmJiBkdCA8IDMwMDAwMCk7CisJaWYgKCEoc3QzICYgU1QzX1RSQUNLXzApKSB7CisJCVRSQUNFKGZ0X3RfZXJyLAorCQkgICAgICAiTm8gYWNrbm93bGVkZ2UgYWZ0ZXIgJXUgbXNlYy4gKCVpIGl0ZXIpIiwgZHQgLyAxMDAwLCBpKTsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJ0aW1lb3V0IG9uIEFja25vd2xlZGdlIik7CisJfQorCS8qICBkdCBtYXkgYmUgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQgYmVjYXVzZSBvZiBvdGhlciB0YXNrcworCSAqICBzY2hlZHVsZWQgd2hpbGUgd2Ugd2VyZSBzbGVlcGluZy4KKwkgKi8KKwlpZiAoaSA+IDEgJiYgZHQgPiA2MDAwKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiQWNrbm93bGVkZ2UgYWZ0ZXIgJXUgbXNlYy4gKCVpIGl0ZXIpIiwKKwkJICAgICAgZHQgLyAxMDAwLCBpKTsKKwl9CisJKnN0YXR1cyA9IDA7CisJZm9yIChpID0gMDsgaSA8IHJlc3VsdF9sZW5ndGggKyAxOyBpKyspIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChRSUNfUkVQT1JUX05FWFRfQklUKSwpOworCQlUUkFDRV9DQVRDSChmZGNfc2Vuc2VfZHJpdmVfc3RhdHVzKCZzdDMpLCk7CisJCWlmIChpIDwgcmVzdWx0X2xlbmd0aCkgeworCQkJKnN0YXR1cyB8PSAoKHN0MyAmIFNUM19UUkFDS18wKSA/IDEgOiAwKSA8PCBpOworCQl9IGVsc2UgaWYgKChzdDMgJiBTVDNfVFJBQ0tfMCkgPT0gMCkgeworCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJtaXNzaW5nIHN0YXR1cyBzdG9wIGJpdCIpOworCQl9CisJfQorCS8qIHRoaXMgY29tbWFuZCB3aWxsIHB1dCB0cmFjayB6ZXJvIGFuZCBpbmRleCBiYWNrIGludG8gbm9ybWFsIHN0YXRlICovCisJKHZvaWQpZnRhcGVfY29tbWFuZChRSUNfUkVQT1JUX05FWFRfQklUKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIFJlcG9ydCB0aGUgY3VycmVudCBkcml2ZSBzdGF0dXMuICovCisKK2ludCBmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cyhpbnQgKnN0YXR1cykKK3sKKwlpbnQgcmVzdWx0OworCWludCBjb3VudCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWRvIHsKKwkJcmVzdWx0ID0gZnRhcGVfcmVwb3J0X29wZXJhdGlvbihzdGF0dXMsCisJCQkJCQlRSUNfUkVQT1JUX0RSSVZFX1NUQVRVUywgOCk7CisJfSB3aGlsZSAocmVzdWx0IDwgMCAmJiArK2NvdW50IDw9IDMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJyZXBvcnRfb3BlcmF0aW9uIGZhaWxlZCBhZnRlciAlZCB0cmlhbHMiLCBjb3VudCk7CisJfQorCWlmICgoKnN0YXR1cyAmIDB4ZmYpID09IDB4ZmYpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgImltcG9zc2libGUgZHJpdmUgc3RhdHVzIDB4ZmYiKTsKKwl9CisJaWYgKCpzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSB7CisJCWZ0YXBlX2N1cnJlbnRfY29tbWFuZCA9IFFJQ19OT19DT01NQU5EOyAvKiBjb21wbGV0ZWQgKi8KKwl9CisJZnRfbGFzdF9zdGF0dXMuc3RhdHVzLmRyaXZlX3N0YXR1cyA9IChfX3U4KSgqc3RhdHVzICYgMHhmZik7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1cyhpbnQgKnN0YXR1cykKK3sKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoc3RhdHVzKSwpOworCWlmICgqc3RhdHVzICYgUUlDX1NUQVRVU19ORVdfQ0FSVFJJREdFIHx8CisJICAgICEoKnN0YXR1cyAmIFFJQ19TVEFUVVNfQ0FSVFJJREdFX1BSRVNFTlQpKSB7CisJCWZ0X2ZhaWx1cmUgPSAxOwkvKiB3aWxsIGluaGliaXQgZnVydGhlciBvcGVyYXRpb25zICovCisJCVRSQUNFX0VYSVQgLUVJTzsKKwl9CisJaWYgKCpzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZICYmICpzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKSB7CisJCS8qICBMZXQgY2FsbGVyIGhhbmRsZSBhbGwgZXJyb3JzICovCisJCVRSQUNFX0FCT1JUKDEsIGZ0X3Rfd2FybiwgIndhcm5pbmc6IGVycm9yIHN0YXR1cyBzZXQhIik7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworaW50IGZ0YXBlX3JlcG9ydF9lcnJvcih1bnNpZ25lZCBpbnQgKmVycm9yLAorCQkgICAgICAgcWljMTE3X2NtZF90ICpjb21tYW5kLCBpbnQgcmVwb3J0KQoreworCXN0YXRpYyBjb25zdCBmdGFwZV9lcnJvciBmdGFwZV9lcnJvcnNbXSA9IFFJQzExN19FUlJPUlM7CisJaW50IGNvZGU7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJmNvZGUsIFFJQ19SRVBPUlRfRVJST1JfQ09ERSwgMTYpLCk7CisJKmVycm9yICAgPSAodW5zaWduZWQgaW50KShjb2RlICYgMHhmZik7CisJKmNvbW1hbmQgPSAocWljMTE3X2NtZF90KSgoY29kZT4+OCkmMHhmZik7CisJLyogIHJlbWVtYmVyIGhhcmR3YXJlIHN0YXR1cywgbWF5YmUgdXNlZnVsIGZvciBzdGF0dXMgaW9jdGxzCisJICovCisJZnRfbGFzdF9lcnJvci5lcnJvci5jb21tYW5kID0gKF9fdTgpKmNvbW1hbmQ7CisJZnRfbGFzdF9lcnJvci5lcnJvci5lcnJvciAgID0gKF9fdTgpKmVycm9yOworCWlmICghcmVwb3J0KSB7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJaWYgKCplcnJvciA9PSAwKSB7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3RfaW5mbywgIk5vIGVycm9yIik7CisJfQorCVRSQUNFKGZ0X3RfaW5mbywgImVycm9yY29kZTogJWQiLCAqZXJyb3IpOworCWlmICgqZXJyb3IgPCBOUl9JVEVNUyhmdGFwZV9lcnJvcnMpKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIlc0ZhdGFsIEVSUk9SOiIsCisJCSAgICAgIChmdGFwZV9lcnJvcnNbKmVycm9yXS5mYXRhbCA/ICIiIDogIk5vbi0iKSk7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICIlcyAuLi4iLCBmdGFwZV9lcnJvcnNbKmVycm9yXS5tZXNzYWdlKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X25vaXNlLCAiVW5rbm93biBFUlJPUiAhIik7CisJfQorCWlmICgodW5zaWduZWQgaW50KSpjb21tYW5kIDwgTlJfSVRFTVMocWljMTE3X2NtZHMpICYmCisJICAgIHFpYzExN19jbWRzWypjb21tYW5kXS5uYW1lICE9IE5VTEwpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIi4uLiBjYXVzZWQgYnkgY29tbWFuZCBcJyVzXCciLAorCQkgICAgICBxaWMxMTdfY21kc1sqY29tbWFuZF0ubmFtZSk7CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIi4uLiBjYXVzZWQgYnkgdW5rbm93biBjb21tYW5kICVkIiwKKwkJICAgICAgKmNvbW1hbmQpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmdGFwZV9yZXBvcnRfY29uZmlndXJhdGlvbihxaWNfbW9kZWwgKm1vZGVsLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqcmF0ZSwKKwkJCSAgICAgICBpbnQgKnFpY19zdGQsCisJCQkgICAgICAgaW50ICp0YXBlX2xlbikKK3sKKwlpbnQgcmVzdWx0OworCWludCBjb25maWc7CisJaW50IHN0YXR1czsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFpY19yYXRlc1sgNF0gPSB7IDI1MCwgMjAwMCwgNTAwLCAxMDAwIH07CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJmNvbmZpZywKKwkJCQkJUUlDX1JFUE9SVF9EUklWRV9DT05GSUdVUkFUSU9OLCA4KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlmdF9sYXN0X3N0YXR1cy5zdGF0dXMuZHJpdmVfY29uZmlnID0gKF9fdTgpMHgwMDsKKwkJKm1vZGVsID0gcHJlaGlzdG9yaWM7CisJCSpyYXRlID0gNTAwOworCQkqcWljX3N0ZCA9IFFJQ19UQVBFX1FJQzQwOworCQkqdGFwZV9sZW4gPSAyMDU7CisJCVRSQUNFX0VYSVQgMDsKKwl9IGVsc2UgeworCQlmdF9sYXN0X3N0YXR1cy5zdGF0dXMuZHJpdmVfY29uZmlnID0gKF9fdTgpKGNvbmZpZyAmIDB4ZmYpOworCX0KKwkqcmF0ZSA9IHFpY19yYXRlc1soY29uZmlnICYgUUlDX0NPTkZJR19SQVRFX01BU0spID4+IFFJQ19DT05GSUdfUkFURV9TSElGVF07CisJcmVzdWx0ID0gZnRhcGVfcmVwb3J0X29wZXJhdGlvbigmc3RhdHVzLCBRSUNfUkVQT1JUX1RBUEVfU1RBVFVTLCA4KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlmdF9sYXN0X3N0YXR1cy5zdGF0dXMudGFwZV9zdGF0dXMgPSAoX191OCkweDAwOworCQkvKiBwcmUtIFFJQzExNyByZXYgQyBzcGVjLiBkcml2ZSwgUUlDX0NPTkZJR184MCBiaXQgaXMgdmFsaWQuCisJCSAqLworCQkqcWljX3N0ZCA9IChjb25maWcgJiBRSUNfQ09ORklHXzgwKSA/CisJCQlRSUNfVEFQRV9RSUM4MCA6IFFJQ19UQVBFX1FJQzQwOworCQkvKiA/PyBob3cncyBhYm91dCA0MjVmdCB0YXBlcz8gKi8KKwkJKnRhcGVfbGVuID0gKGNvbmZpZyAmIFFJQ19DT05GSUdfTE9ORykgPyAzMDcgOiAwOworCQkqbW9kZWwgPSBwcmVfcWljMTE3YzsKKwkJcmVzdWx0ID0gMDsKKwl9IGVsc2UgeworCQlmdF9sYXN0X3N0YXR1cy5zdGF0dXMudGFwZV9zdGF0dXMgPSAoX191OCkoc3RhdHVzICYgMHhmZik7CisJCSptb2RlbCA9IHBvc3RfcWljMTE3YjsKKwkJVFJBQ0UoZnRfdF9hbnksICJyZXBvcnQgdGFwZSBzdGF0dXMgcmVzdWx0ID0gJTAyeCIsIHN0YXR1cyk7CisJCS8qIHBvc3QtIFFJQzExNyByZXYgQyBzcGVjLiBkcml2ZSwgUUlDX0NPTkZJR184MCBiaXQgaXMKKwkJICogaW52YWxpZC4gCisJCSAqLworCQlzd2l0Y2ggKHN0YXR1cyAmIFFJQ19UQVBFX1NURF9NQVNLKSB7CisJCWNhc2UgUUlDX1RBUEVfUUlDNDA6CisJCWNhc2UgUUlDX1RBUEVfUUlDODA6CisJCWNhc2UgUUlDX1RBUEVfUUlDMzAyMDoKKwkJY2FzZSBRSUNfVEFQRV9RSUMzMDEwOgorCQkJKnFpY19zdGQgPSBzdGF0dXMgJiBRSUNfVEFQRV9TVERfTUFTSzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJKnFpY19zdGQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAoc3RhdHVzICYgUUlDX1RBUEVfTEVOX01BU0spIHsKKwkJY2FzZSBRSUNfVEFQRV8yMDVGVDoKKwkJCS8qIDIwNSBvciA0MjUrIGZ0IDU1MCBPZSB0YXBlICovCisJCQkqdGFwZV9sZW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgUUlDX1RBUEVfMzA3RlQ6CisJCQkvKiAzMDcuNSBmdCA1NTAgT2UgRXh0ZW5kZWQgTGVuZ3RoIChYTCkgdGFwZSAqLworCQkJKnRhcGVfbGVuID0gMzA3OworCQkJYnJlYWs7CisJCWNhc2UgUUlDX1RBUEVfVkFSSUFCTEU6CisJCQkvKiBWYXJpYWJsZSBsZW5ndGggNTUwIE9lIHRhcGUgKi8KKwkJCSp0YXBlX2xlbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBRSUNfVEFQRV8xMTAwRlQ6CisJCQkvKiAxMTAwIGZ0IDU1MCBPZSB0YXBlICovCisJCQkqdGFwZV9sZW4gPSAxMTAwOworCQkJYnJlYWs7CisJCWNhc2UgUUlDX1RBUEVfRkxFWDoKKwkJCS8qIFZhcmlhYmxlIGxlbmd0aCA5MDAgT2UgdGFwZSAqLworCQkJKnRhcGVfbGVuID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJKnRhcGVfbGVuID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKnFpY19zdGQgPT0gLTEgfHwgKnRhcGVfbGVuID09IC0xKSB7CisJCQlUUkFDRShmdF90X2FueSwKKwkJCSAgICAgICJwb3N0IHFpYy0xMTdiIHNwZWMgZHJpdmUgd2l0aCB1bmtub3duIHRhcGUiKTsKKwkJfQorCQlyZXN1bHQgPSAqdGFwZV9sZW4gPT0gLTEgPyAtRUlPIDogMDsKKwkJaWYgKHN0YXR1cyAmIFFJQ19UQVBFX1dJREUpIHsKKwkJCXN3aXRjaCAoKnFpY19zdGQpIHsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDODA6CisJCQkJVFJBQ0UoZnRfdF9pbmZvLCAiVFItMSB0YXBlIGRldGVjdGVkIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFFJQ19UQVBFX1FJQzMwMTA6CisJCQkJVFJBQ0UoZnRfdF9pbmZvLCAiVFItMiB0YXBlIGRldGVjdGVkIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFFJQ19UQVBFX1FJQzMwMjA6CisJCQkJVFJBQ0UoZnRfdF9pbmZvLCAiVFItMyB0YXBlIGRldGVjdGVkIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJCQkgICAgICAiVW5rbm93biBUcmF2YW4gdGFwZSB0eXBlIGRldGVjdGVkIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJVFJBQ0VfRVhJVCAocmVzdWx0IDwgMCkgPyAtRUlPIDogMDsKK30KKworc3RhdGljIGludCBmdGFwZV9yZXBvcnRfcm9tX3ZlcnNpb24oaW50ICp2ZXJzaW9uKQoreworCisJaWYgKGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24odmVyc2lvbiwgUUlDX1JFUE9SVF9ST01fVkVSU0lPTiwgOCkgPCAwKSB7CisJCXJldHVybiAtRUlPOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKwordm9pZCBmdGFwZV9yZXBvcnRfdmVuZG9yX2lkKHVuc2lnbmVkIGludCAqaWQpCit7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJLyogV2UnbGwgdHJ5IHRvIGdldCBhIHZlbmRvciBpZCBmcm9tIHRoZSBkcml2ZS4gIEZpcnN0CisJICogYWNjb3JkaW5nIHRvIHRoZSBRSUMtMTE3IHNwZWMsIGEgMTYtYml0IGlkIGlzIHJlcXVlc3RlZC4KKwkgKiBJZiB0aGF0IGZhaWxzIHdlJ2xsIHRyeSBhbiA4LWJpdCB2ZXJzaW9uLCBvdGhlcndpc2Ugd2UnbGwKKwkgKiB0cnkgYW4gdW5kb2N1bWVudGVkIHF1ZXJ5LgorCSAqLworCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oKGludCAqKSBpZCwgUUlDX1JFUE9SVF9WRU5ET1JfSUQsIDE2KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKChpbnQgKikgaWQsCisJCQkJCQlRSUNfUkVQT1JUX1ZFTkRPUl9JRCwgOCk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkvKiBUaGUgZm9sbG93aW5nIGlzIGFuIHVuZG9jdW1lbnRlZCBjYWxsIGZvdW5kCisJCQkgKiBpbiB0aGUgQ01TIGNvZGUuCisJCQkgKi8KKwkJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oKGludCAqKSBpZCwgMjQsIDgpOworCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQkqaWQgPSBVTktOT1dOX1ZFTkRPUjsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgImdvdCBvbGQgOCBiaXQgaWQ6ICUwNHgiLAorCQkJCSAgICAgICppZCk7CisJCQkJKmlkIHw9IDB4MjAwMDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAiZ290IDggYml0IGlkOiAlMDR4IiwgKmlkKTsKKwkJCSppZCB8PSAweDEwMDAwOworCQl9CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImdvdCAxNiBiaXQgaWQ6ICUwNHgiLCAqaWQpOworCX0KKwlpZiAoKmlkID09IDB4MDA0NykgeworCQlpbnQgdmVyc2lvbjsKKwkJaW50IHNpZ247CisKKwkJaWYgKGZ0YXBlX3JlcG9ydF9yb21fdmVyc2lvbigmdmVyc2lvbikgPCAwKSB7CisJCQlUUkFDRShmdF90X2J1ZywgInJlcG9ydCByb20gdmVyc2lvbiBmYWlsZWQiKTsKKwkJCVRSQUNFX0VYSVQ7CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIkNNUyByb20gdmVyc2lvbjogJWQiLCB2ZXJzaW9uKTsKKwkJZnRhcGVfY29tbWFuZChRSUNfRU5URVJfRElBR05PU1RJQ18xKTsKKwkJZnRhcGVfY29tbWFuZChRSUNfRU5URVJfRElBR05PU1RJQ18xKTsKKwkJZGlhZ25vc3RpY19tb2RlID0gMTsKKwkJaWYgKGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJnNpZ24sIDksIDgpIDwgMCkgeworCQkJdW5zaWduZWQgaW50IGVycm9yOworCQkJcWljMTE3X2NtZF90IGNvbW1hbmQ7CisKKwkJCWZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAxKTsKKwkJCWZ0YXBlX2NvbW1hbmQoUUlDX0VOVEVSX1BSSU1BUllfTU9ERSk7CisJCQlkaWFnbm9zdGljX21vZGUgPSAwOworCQkJVFJBQ0VfRVhJVDsJLyogZmFpbHVyZSAhICovCisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAiQ01TIHNpZ25hdHVyZTogJTAyeCIsIHNpZ24pOworCQl9CisJCWlmIChzaWduID09IDB4YTUpIHsKKwkJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJnNpZ24sIDM3LCA4KTsKKwkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJaWYgKHZlcnNpb24gPj0gNjMpIHsKKwkJCQkJKmlkID0gMHg4ODgwOworCQkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCQkgICAgICAiVGhpcyBpcyBhbiBJb21lZ2EgZHJpdmUgISIpOworCQkJCX0gZWxzZSB7CisJCQkJCSppZCA9IDB4MDA0NzsKKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkJICAgICAgIlRoaXMgaXMgYSByZWFsIENNUyBkcml2ZSAhIik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkqaWQgPSAweDAwNDc7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIkNNUyBzdGF0dXM6ICVkIiwgc2lnbik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkqaWQgPSBVTktOT1dOX1ZFTkRPUjsKKwkJfQorCQlmdGFwZV9jb21tYW5kKFFJQ19FTlRFUl9QUklNQVJZX01PREUpOworCQlkaWFnbm9zdGljX21vZGUgPSAwOworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgaW50IHFpY19yYXRlX2NvZGUodW5zaWduZWQgaW50IHJhdGUpCit7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAyNTA6CisJCXJldHVybiBRSUNfQ09ORklHX1JBVEVfMjUwOworCWNhc2UgNTAwOgorCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzUwMDsKKwljYXNlIDEwMDA6CisJCXJldHVybiBRSUNfQ09ORklHX1JBVEVfMTAwMDsKKwljYXNlIDIwMDA6CisJCXJldHVybiBRSUNfQ09ORklHX1JBVEVfMjAwMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gUUlDX0NPTkZJR19SQVRFXzUwMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZnRhcGVfc2V0X3JhdGVfdGVzdCh1bnNpZ25lZCBpbnQgKm1heF9yYXRlKQoreworCXVuc2lnbmVkIGludCBlcnJvcjsKKwlxaWMxMTdfY21kX3QgY29tbWFuZDsKKwlpbnQgc3RhdHVzOworCWludCBzdXBwb3J0ZWQgPSAwOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiAgQ2hlY2sgaWYgdGhlIGRyaXZlIGRvZXMgc3VwcG9ydCB0aGUgc2VsZWN0IHJhdGUgY29tbWFuZAorCSAqICBieSB0ZXN0aW5nIGFsbCBkaWZmZXJlbnQgc2V0dGluZ3MuIElmIGFueSBvbmUgaXMgYWNjZXB0ZWQKKwkgKiAgd2UgYXNzdW1lIHRoZSBjb21tYW5kIGlzIHN1cHBvcnRlZCwgZWxzZSBub3QuCisJICovCisJZm9yICgqbWF4X3JhdGUgPSAyMDAwOyAqbWF4X3JhdGUgPj0gMjUwOyAqbWF4X3JhdGUgLz0gMikgeworCQlpZiAoZnRhcGVfY29tbWFuZChRSUNfU0VMRUNUX1JBVEUpIDwgMCkgeworCQkJY29udGludWU7CisJCX0JCQorCQlpZiAoZnRhcGVfcGFyYW1ldGVyX3dhaXQocWljX3JhdGVfY29kZSgqbWF4X3JhdGUpLAorCQkJCQkgMSAqIEZUX1NFQ09ORCwgJnN0YXR1cykgPCAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikgeworCQkJZnRhcGVfcmVwb3J0X2Vycm9yKCZlcnJvciwgJmNvbW1hbmQsIDApOworCQkJY29udGludWU7CisJCX0KKwkJc3VwcG9ydGVkID0gMTsgLyogZGlkIGFjY2VwdCBhIHJlcXVlc3QgKi8KKwkJYnJlYWs7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJTZWxlY3QgUmF0ZSBjb21tYW5kIGlzJXMgc3VwcG9ydGVkIiwgCisJICAgICAgc3VwcG9ydGVkID8gIiIgOiAiIG5vdCIpOworCVRSQUNFX0VYSVQgc3VwcG9ydGVkOworfQorCitpbnQgZnRhcGVfc2V0X2RhdGFfcmF0ZSh1bnNpZ25lZCBpbnQgbmV3X3JhdGUgLyogS2JwcyAqLywgdW5zaWduZWQgaW50IHFpY19zdGQpCit7CisJaW50IHN0YXR1czsKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgZGF0YV9yYXRlID0gbmV3X3JhdGU7CisJc3RhdGljIGludCBzdXBwb3J0ZWQ7CisJaW50IHJhdGVfY2hhbmdlZCA9IDA7CisJcWljX21vZGVsIGR1bW15X21vZGVsOworCXVuc2lnbmVkIGludCBkdW1teV9xaWNfc3RkLCBkdW1teV90YXBlX2xlbjsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJaWYgKGZ0X2RyaXZlX21heF9yYXRlID09IDApIHsgLyogZmlyc3QgdGltZSAqLworCQlzdXBwb3J0ZWQgPSBmdGFwZV9zZXRfcmF0ZV90ZXN0KCZmdF9kcml2ZV9tYXhfcmF0ZSk7CisJfQorCWlmIChzdXBwb3J0ZWQpIHsKKwkJZnRhcGVfY29tbWFuZChRSUNfU0VMRUNUX1JBVEUpOworCQlyZXN1bHQgPSBmdGFwZV9wYXJhbWV0ZXJfd2FpdChxaWNfcmF0ZV9jb2RlKG5ld19yYXRlKSwKKwkJCQkJICAgICAgMSAqIEZUX1NFQ09ORCwgJnN0YXR1cyk7CisJCWlmIChyZXN1bHQgPj0gMCAmJiAhKHN0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpKSB7CisJCQlyYXRlX2NoYW5nZWQgPSAxOworCQl9CisJfQorCVRSQUNFX0NBVENIKHJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9jb25maWd1cmF0aW9uKCZkdW1teV9tb2RlbCwKKwkJCQkJCQkmZGF0YV9yYXRlLCAKKwkJCQkJCQkmZHVtbXlfcWljX3N0ZCwKKwkJCQkJCQkmZHVtbXlfdGFwZV9sZW4pLCk7CisJaWYgKGRhdGFfcmF0ZSAhPSBuZXdfcmF0ZSkgeworCQlpZiAoIXN1cHBvcnRlZCkgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAiUmF0ZSBjaGFuZ2Ugbm90IHN1cHBvcnRlZCEiKTsKKwkJfSBlbHNlIGlmIChyYXRlX2NoYW5nZWQpIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgIlJlcXVlc3RlZDogJWQsIGdvdCAlZCIsCisJCQkgICAgICBuZXdfcmF0ZSwgZGF0YV9yYXRlKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgIlJhdGUgY2hhbmdlIGZhaWxlZCEiKTsKKwkJfQorCQlyZXN1bHQgPSAtRUlOVkFMOworCX0KKwkvKgorCSAqICBTZXQgZGF0YSByYXRlIGFuZCB3cml0ZSBwcmVjb21wZW5zYXRpb24gYXMgc3BlY2lmaWVkOgorCSAqCisJICogICAgICAgICAgICB8ICBRSUMtNDAvODAgIHwgUUlDLTMwMTAvMzAyMAorCSAqICAgcmF0ZSAgICAgfCAgIHByZWNvbXAgICB8ICAgIHByZWNvbXAKKwkgKiAgLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tCisJICogIDI1MCBLYnBzLiB8ICAgMjUwIG5zLiAgIHwgICAgIDAgbnMuCisJICogIDUwMCBLYnBzLiB8ICAgMTI1IG5zLiAgIHwgICAgIDAgbnMuCisJICogICAgMSBNYnBzLiB8ICAgIDQyIG5zLiAgIHwgICAgIDAgbnMuCisJICogICAgMiBNYnBzICB8ICAgICAgTi9BICAgIHwgICAgIDAgbnMuCisJICovCisJaWYgKChxaWNfc3RkID09IFFJQ19UQVBFX1FJQzQwICYmIGRhdGFfcmF0ZSA+IDUwMCkgfHwgCisJICAgIChxaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwICYmIGRhdGFfcmF0ZSA+IDEwMDApKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF93YXJuLCAiRGF0YXJhdGUgdG9vIGhpZ2ggZm9yIFFJQy1tb2RlIik7CisJfQorCVRSQUNFX0NBVENIKGZkY19zZXRfZGF0YV9yYXRlKGRhdGFfcmF0ZSksX3JlcyA9IC1FSU5WQUwpOworCWZ0X2RhdGFfcmF0ZSA9IGRhdGFfcmF0ZTsKKwlpZiAocWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM0MCB8fCBxaWNfc3RkID09IFFJQ19UQVBFX1FJQzgwKSB7CisJCXN3aXRjaCAoZGF0YV9yYXRlKSB7CisJCWNhc2UgMjUwOgorCQkJZmRjX3NldF93cml0ZV9wcmVjb21wKDI1MCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSA1MDA6CisJCQlmZGNfc2V0X3dyaXRlX3ByZWNvbXAoMTI1KTsKKwkJCWJyZWFrOworCQljYXNlIDEwMDA6CisJCQlmZGNfc2V0X3dyaXRlX3ByZWNvbXAoNDIpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlmZGNfc2V0X3dyaXRlX3ByZWNvbXAoMCk7CisJfQorCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgVGhlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb3BlIHdpdGggZXhjZXNzaXZlIG92ZXJydW4gZXJyb3JzCisgKi8KK2ludCBmdGFwZV9pbmNyZWFzZV90aHJlc2hvbGQodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChmZGMudHlwZSA8IGk4MjA3NyB8fCBmdF9mZGNfdGhyZXNob2xkID49IDEyKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiY2Fubm90IGluY3JlYXNlIGZpZm8gdGhyZXNob2xkIik7CisJfQorCWlmIChmZGNfZmlmb190aHJlc2hvbGQoKytmdF9mZGNfdGhyZXNob2xkLCBOVUxMLCBOVUxMLCBOVUxMKSA8IDApIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJjYW5ub3QgaW5jcmVhc2UgZmlmbyB0aHJlc2hvbGQiKTsKKwkJZnRfZmRjX3RocmVzaG9sZCAtLTsKKwkJZmRjX3Jlc2V0KCk7CisJfQorCVRSQUNFKGZ0X3RfaW5mbywgIk5ldyBGSUZPIHRocmVzaG9sZDogJWQiLCBmdF9mZGNfdGhyZXNob2xkKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmdGFwZV9oYWxmX2RhdGFfcmF0ZSh2b2lkKQoreworCWlmIChmdF9kYXRhX3JhdGUgPCA1MDApIHsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoZnRhcGVfc2V0X2RhdGFfcmF0ZShmdF9kYXRhX3JhdGUgLyAyLCBmdF9xaWNfc3RkKSA8IDApIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCWZ0YXBlX2NhbGNfdGltZW91dHMoZnRfcWljX3N0ZCwgZnRfZGF0YV9yYXRlLCBmdGFwZV90YXBlX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qICAgICAgU2VlayB0aGUgaGVhZCB0byB0aGUgc3BlY2lmaWVkIHRyYWNrLgorICovCitpbnQgZnRhcGVfc2Vla19oZWFkX3RvX3RyYWNrKHVuc2lnbmVkIGludCB0cmFjaykKK3sKKwlpbnQgc3RhdHVzOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlmdF9sb2NhdGlvbi50cmFjayA9IC0xOyAvKiByZW1haW5zIHNldCBpbiBjYXNlIG9mIGVycm9yICovCisJaWYgKHRyYWNrID49IGZ0X3RyYWNrc19wZXJfdGFwZSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2J1ZywgInRyYWNrIG91dCBvZiBib3VuZHMiKTsKKwl9CisJVFJBQ0UoZnRfdF9mbG93LCAic2Vla2luZyB0cmFjayAlZCIsIHRyYWNrKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19TRUVLX0hFQURfVE9fVFJBQ0spLCk7CisJVFJBQ0VfQ0FUQ0goZnRhcGVfcGFyYW1ldGVyX3dhaXQodHJhY2ssIGZ0YXBlX3RpbWVvdXQuaGVhZF9zZWVrLAorCQkJCQkgJnN0YXR1cyksKTsKKwlmdF9sb2NhdGlvbi50cmFjayA9IHRyYWNrOworCWZ0YXBlX21pZ2h0X2JlX29mZl90cmFjayA9IDA7CisJVFJBQ0VfRVhJVCAwOworfQorCitpbnQgZnRhcGVfd2FrZXVwX2RyaXZlKHdha2VfdXBfdHlwZXMgbWV0aG9kKQoreworCWludCBzdGF0dXM7CisJaW50IG1vdG9yX29uID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCisJc3dpdGNoIChtZXRob2QpIHsKKwljYXNlIHdha2VfdXBfY29sb3JhZG86CisJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoUUlDX1BIQU5UT01fU0VMRUNUKSwpOworCQlUUkFDRV9DQVRDSChmdGFwZV9wYXJhbWV0ZXIoMCAvKiBmdF9kcml2ZV9zZWwgPz8gKi8pLCk7CisJCWJyZWFrOworCWNhc2Ugd2FrZV91cF9tb3VudGFpbjoKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChRSUNfU09GVF9TRUxFQ1QpLCk7CisJCWZ0YXBlX3NsZWVwKEZUX01JTExJU0VDT05EKTsJLyogTkVFREVEICovCisJCVRSQUNFX0NBVENIKGZ0YXBlX3BhcmFtZXRlcigxOCksKTsKKwkJYnJlYWs7CisJY2FzZSB3YWtlX3VwX2luc2lnaHQ6CisJCWZ0YXBlX3NsZWVwKDEwMCAqIEZUX01JTExJU0VDT05EKTsKKwkJbW90b3Jfb24gPSAxOworCQlmZGNfbW90b3IobW90b3Jfb24pOwkvKiBlbmFibGUgaXMgZG9uZSBieSBtb3Rvci1vbiAqLworCWNhc2Ugbm9fd2FrZV91cDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVFJBQ0VfRVhJVCAtRU5PREVWOwkvKiB1bmtub3duIHdha2V1cCBtZXRob2QgKi8KKwkJYnJlYWs7CisJfQorCS8qICBJZiB3YWtldXAgc3VjY2VlZGVkIHdlIHNob3VsZG4ndCBnZXQgYW4gZXJyb3IgaGVyZS4uCisJICovCisJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X3Jhd19kcml2ZV9zdGF0dXMoJnN0YXR1cyksCisJCSAgICBpZiAobW90b3Jfb24pIHsKKwkJCSAgICBmZGNfbW90b3IoMCk7CisJCSAgICB9KTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK2ludCBmdGFwZV9wdXRfZHJpdmVfdG9fc2xlZXAod2FrZV91cF90eXBlcyBtZXRob2QpCit7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCXN3aXRjaCAobWV0aG9kKSB7CisJY2FzZSB3YWtlX3VwX2NvbG9yYWRvOgorCQlUUkFDRV9DQVRDSChmdGFwZV9jb21tYW5kKFFJQ19QSEFOVE9NX0RFU0VMRUNUKSwpOworCQlicmVhazsKKwljYXNlIHdha2VfdXBfbW91bnRhaW46CisJCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoUUlDX1NPRlRfREVTRUxFQ1QpLCk7CisJCWJyZWFrOworCWNhc2Ugd2FrZV91cF9pbnNpZ2h0OgorCQlmZGNfbW90b3IoMCk7CS8qIGVuYWJsZSBpcyBkb25lIGJ5IG1vdG9yLW9uICovCisJY2FzZSBub193YWtlX3VwOgkvKiBubyB3YWtldXAgLyBubyBzbGVlcCAhICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFX0VYSVQgLUVOT0RFVjsJLyogdW5rbm93biB3YWtldXAgbWV0aG9kICovCisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworaW50IGZ0YXBlX3Jlc2V0X2RyaXZlKHZvaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgZXJyX2NvZGU7CisJcWljMTE3X2NtZF90IGVycl9jb21tYW5kOworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwkvKiAgV2Ugd2FudCB0byByZS1lc3RhYmxpc2ggY29udGFjdCB3aXRoIG91ciBkcml2ZS4gIEZpcmUgYQorCSAqICBudW1iZXIgb2YgcmVzZXQgY29tbWFuZHMgKHNpbmdsZSBzdGVwIHB1bHNlcykgYW5kIHByYXkgZm9yCisJICogIHN1Y2Nlc3MuCisJICovCisJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQlUUkFDRShmdF90X2Zsb3csICJSZXNldHRpbmcgZmRjIik7CisJCWZkY19yZXNldCgpOworCQlmdGFwZV9zbGVlcCgxMCAqIEZUX01JTExJU0VDT05EKTsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiUmVzZXQgY29tbWFuZCB0byBkcml2ZSIpOworCQlyZXN1bHQgPSBmdGFwZV9jb21tYW5kKFFJQ19SRVNFVCk7CisJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJZnRhcGVfc2xlZXAoMSAqIEZUX1NFQ09ORCk7IC8qICBkcml2ZSBub3QKKwkJCQkJCSAgICAgKiAgYWNjZXNzaWJsZQorCQkJCQkJICAgICAqICBkdXJpbmcgMSBzZWNvbmQKKwkJCQkJCSAgICAgKi8KKwkJCVRSQUNFKGZ0X3RfZmxvdywgIlJlLXNlbGVjdGluZyBkcml2ZSIpOworCisJCQkvKiBTdHJhbmdlLCB0aGUgUUlDLTExNyBzcGVjcyBkb24ndCBtZW50aW9uCisJCQkgKiB0aGlzIGJ1dCB0aGUgZHJpdmUgZ2V0cyBkZXNlbGVjdGVkIGFmdGVyIGEKKwkJCSAqIHNvZnQgcmVzZXQgISAgU28gd2UgbmVlZCB0byBlbmFibGUgaXQKKwkJCSAqIGFnYWluLgorCQkJICovCisJCQlpZiAoZnRhcGVfd2FrZXVwX2RyaXZlKGZ0X2RyaXZlX3R5cGUud2FrZV91cCkgPCAwKSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsICJXYWtldXAgZmFpbGVkICEiKTsKKwkJCX0KKwkJCVRSQUNFKGZ0X3RfZmxvdywgIldhaXRpbmcgdW50aWwgZHJpdmUgZ2V0cyByZWFkeSIpOworCQkJcmVzdWx0PSBmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucmVzZXQsICZzdGF0dXMpOworCQkJaWYgKHJlc3VsdCA9PSAwICYmIChzdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKSkgeworCQkJCXJlc3VsdCA9IGZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyX2NvZGUsCisJCQkJCQkJICAgICZlcnJfY29tbWFuZCwgMSk7CisJCQkJaWYgKHJlc3VsdCA9PSAwICYmIGVycl9jb2RlID09IDI3KSB7CisJCQkJCS8qICBPa2F5LCBkcml2ZSBzYXcgcmVzZXQKKwkJCQkJICogIGNvbW1hbmQgYW5kIHJlc3BvbmRlZCBhcyBpdAorCQkJCQkgKiAgc2hvdWxkCisJCQkJCSAqLworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXN1bHQgPSAtRUlPOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0ID0gLUVJTzsKKwkJCX0KKwkJfQorCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJfQorCWlmIChyZXN1bHQgIT0gMCkgeworCQlUUkFDRShmdF90X2VyciwgIkdlbmVyYWwgZmFpbHVyZSB0byByZXNldCB0YXBlIGRyaXZlIik7CisJfSBlbHNlIHsKKwkJLyogIFJlc3RvcmUgY29ycmVjdCBzZXR0aW5nczoga2VlcCBvcmlnaW5hbCByYXRlIAorCQkgKi8KKwkJZnRhcGVfc2V0X2RhdGFfcmF0ZShmdF9kYXRhX3JhdGUsIGZ0X3FpY19zdGQpOworCX0KKwlmdGFwZV9pbml0X2RyaXZlX25lZWRlZCA9IDE7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YTdiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtaW8uaApAQCAtMCwwICsxLDkwIEBACisjaWZuZGVmIF9GVEFQRV9JT19ICisjZGVmaW5lIF9GVEFQRV9JT19ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgIChDKSAxOTk3ICAgICAgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1pby5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MTggJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgZ2x1ZSBwYXJ0IG9mIHRoZQorICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+CisjaW5jbHVkZSA8bGludXgvZnRhcGUtdmVuZG9ycy5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHNlZWs7CisJdW5zaWduZWQgaW50IHJlc2V0OworCXVuc2lnbmVkIGludCByZXdpbmQ7CisJdW5zaWduZWQgaW50IGhlYWRfc2VlazsKKwl1bnNpZ25lZCBpbnQgc3RvcDsKKwl1bnNpZ25lZCBpbnQgcGF1c2U7Cit9IGZ0X3RpbWVvdXRfdGFibGU7CisKK3R5cGVkZWYgZW51bSB7CisJcHJlaGlzdG9yaWMsIHByZV9xaWMxMTdjLCBwb3N0X3FpYzExN2IsIHBvc3RfcWljMTE3ZCAKK30gcWljX21vZGVsOworCisvKgorICogICAgICBmdGFwZS1pby5jIGRlZmluZWQgZ2xvYmFsIHZhcnMuCisgKi8KK2V4dGVybiBmdF90aW1lb3V0X3RhYmxlIGZ0YXBlX3RpbWVvdXQ7CitleHRlcm4gdW5zaWduZWQgaW50IGZ0YXBlX3RhcGVfbGVuOworZXh0ZXJuIHZvbGF0aWxlIHFpYzExN19jbWRfdCBmdGFwZV9jdXJyZW50X2NvbW1hbmQ7CitleHRlcm4gY29uc3Qgc3RydWN0IHFpYzExN19jb21tYW5kX3RhYmxlIHFpYzExN19jbWRzW107CitleHRlcm4gaW50IGZ0YXBlX21pZ2h0X2JlX29mZl90cmFjazsKKworLyoKKyAqICAgICAgZnRhcGUtaW8uYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK2V4dGVybiB2b2lkIGZ0YXBlX3VkZWxheSh1bnNpZ25lZCBpbnQgdXNlY3MpOworZXh0ZXJuIHZvaWQgIGZ0YXBlX3VkZWxheV9jYWxpYnJhdGUodm9pZCk7CitleHRlcm4gdm9pZCBmdGFwZV9zbGVlcCh1bnNpZ25lZCBpbnQgdGltZSk7CitleHRlcm4gdm9pZCBmdGFwZV9yZXBvcnRfdmVuZG9yX2lkKHVuc2lnbmVkIGludCAqaWQpOworZXh0ZXJuIGludCAgZnRhcGVfY29tbWFuZChxaWMxMTdfY21kX3QgY29tbWFuZCk7CitleHRlcm4gaW50ICBmdGFwZV9jb21tYW5kX3dhaXQocWljMTE3X2NtZF90IGNvbW1hbmQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRpbWVvdXQsCisJCQkgICAgICAgaW50ICpzdGF0dXMpOworZXh0ZXJuIGludCAgZnRhcGVfcGFyYW1ldGVyKHVuc2lnbmVkIGludCBwYXJhbWV0ZXIpOworZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfb3BlcmF0aW9uKGludCAqc3RhdHVzLAorCQkJCSAgcWljMTE3X2NtZF90ICBjb21tYW5kLAorCQkJCSAgaW50IHJlc3VsdF9sZW5ndGgpOworZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfY29uZmlndXJhdGlvbihxaWNfbW9kZWwgKm1vZGVsLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqcmF0ZSwKKwkJCQkgICAgICBpbnQgKnFpY19zdGQsCisJCQkJICAgICAgaW50ICp0YXBlX2xlbik7CitleHRlcm4gaW50IGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMoaW50ICpzdGF0dXMpOworZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfcmF3X2RyaXZlX3N0YXR1cyhpbnQgKnN0YXR1cyk7CitleHRlcm4gaW50IGZ0YXBlX3JlcG9ydF9zdGF0dXMoaW50ICpzdGF0dXMpOworZXh0ZXJuIGludCBmdGFwZV9yZWFkeV93YWl0KHVuc2lnbmVkIGludCB0aW1lb3V0LCBpbnQgKnN0YXR1cyk7CitleHRlcm4gaW50IGZ0YXBlX3NlZWtfaGVhZF90b190cmFjayh1bnNpZ25lZCBpbnQgdHJhY2spOworZXh0ZXJuIGludCBmdGFwZV9zZXRfZGF0YV9yYXRlKHVuc2lnbmVkIGludCBuZXdfcmF0ZSwgdW5zaWduZWQgaW50IHFpY19zdGQpOworZXh0ZXJuIGludCBmdGFwZV9yZXBvcnRfZXJyb3IodW5zaWduZWQgaW50ICplcnJvciwKKwkJCSAgICAgIHFpYzExN19jbWRfdCAqY29tbWFuZCwKKwkJCSAgICAgIGludCByZXBvcnQpOworZXh0ZXJuIGludCBmdGFwZV9yZXNldF9kcml2ZSh2b2lkKTsKK2V4dGVybiBpbnQgZnRhcGVfcHV0X2RyaXZlX3RvX3NsZWVwKHdha2VfdXBfdHlwZXMgbWV0aG9kKTsKK2V4dGVybiBpbnQgZnRhcGVfd2FrZXVwX2RyaXZlKHdha2VfdXBfdHlwZXMgbWV0aG9kKTsKK2V4dGVybiBpbnQgZnRhcGVfaW5jcmVhc2VfdGhyZXNob2xkKHZvaWQpOworZXh0ZXJuIGludCBmdGFwZV9oYWxmX2RhdGFfcmF0ZSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcHJvYy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjYyNTFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXByb2MuYwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMTEgJAorICogJERhdGU6IDE5OTcvMTAvMjQgMTQ6NDc6MzcgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwcm9jZnMgaW50ZXJmYWNlIGZvciB0aGUKKyAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisKKyAqCU9sZCBjb2RlIHJlbW92ZWQsIHN3aXRjaGVkIHRvIGR5bmFtaWMgcHJvYyBlbnRyeS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19GVF9QUk9DX0ZTKQorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+CisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXByb2MuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisKK3N0YXRpYyBzaXplX3QgZ2V0X2RyaXZlcl9pbmZvKGNoYXIgKmJ1ZikKK3sKKwljb25zdCBjaGFyICpkZWJ1Z19sZXZlbFtdID0geyAiYnVncyIgICwKKwkJCQkgICAgICAiZXJyb3JzIiwKKwkJCQkgICAgICAid2FybmluZ3MiLAorCQkJCSAgICAgICJpbmZvcm1hdGlvbmFsIiwKKwkJCQkgICAgICAibm9pc3kiLAorCQkJCSAgICAgICJwcm9ncmFtIGZsb3ciLAorCQkJCSAgICAgICJmZGMgYW5kIGRtYSIsCisJCQkJICAgICAgImRhdGEgZmxvdyIsCisJCQkJICAgICAgImFueXRoaW5nIiB9OworCisJcmV0dXJuIHNwcmludGYoYnVmLAorCQkgICAgICAgInZlcnNpb24gICAgICAgOiAlc1xuIgorCQkgICAgICAgInVzZWQgZGF0YSByYXRlOiAlZCBrYml0L3NlY1xuIgorCQkgICAgICAgImRtYSBtZW1vcnkgICAgOiAlZCBrYlxuIgorCQkgICAgICAgImRlYnVnIG1lc3NhZ2VzOiAlc1xuIiwKKwkJICAgICAgIEZUQVBFX1ZFUlNJT04sCisJCSAgICAgICBmdF9kYXRhX3JhdGUsCisJCSAgICAgICBGVF9CVUZGX1NJWkUgKiBmdF9ucl9idWZmZXJzID4+IDEwLAorCQkgICAgICAgZGVidWdfbGV2ZWxbVFJBQ0VfTEVWRUxdKTsKK30KKworc3RhdGljIHNpemVfdCBnZXRfdGFwZWRyaXZlX2luZm8oY2hhciAqYnVmKQoreyAKKwlyZXR1cm4gc3ByaW50ZihidWYsCisJCSAgICAgICAidmVuZG9yIGlkIDogMHglMDR4XG4iCisJCSAgICAgICAiZHJpdmUgbmFtZTogJXNcbiIKKwkJICAgICAgICJ3aW5kIHNwZWVkOiAlZCBpcHNcbiIKKwkJICAgICAgICJ3YWtldXAgICAgOiAlc1xuIgorCQkgICAgICAgIm1heC4gcmF0ZSA6ICVkIGtiaXQvc2VjXG4iLAorCQkgICAgICAgZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQsCisJCSAgICAgICBmdF9kcml2ZV90eXBlLm5hbWUsCisJCSAgICAgICBmdF9kcml2ZV90eXBlLnNwZWVkLAorCQkgICAgICAgKChmdF9kcml2ZV90eXBlLndha2VfdXAgPT0gbm9fd2FrZV91cCkKKwkJCT8gIk5vIHdha2V1cCBuZWVkZWQiIDoKKwkJCSgoZnRfZHJpdmVfdHlwZS53YWtlX3VwID09IHdha2VfdXBfY29sb3JhZG8pCisJCQkgPyAiQ29sb3JhZG8iIDoKKwkJCSAoKGZ0X2RyaXZlX3R5cGUud2FrZV91cCA9PSB3YWtlX3VwX21vdW50YWluKQorCQkJICA/ICJNb3VudGFpbiIgOgorCQkJICAoKGZ0X2RyaXZlX3R5cGUud2FrZV91cCA9PSB3YWtlX3VwX2luc2lnaHQpCisJCQkgICA/ICJNb3RvciBvbiIgOgorCQkJICAgIlVua25vd24iKSkpKSwKKwkJICAgICAgIGZ0X2RyaXZlX21heF9yYXRlKTsKK30KKworc3RhdGljIHNpemVfdCBnZXRfY2FydHJpZGdlX2luZm8oY2hhciAqYnVmKQoreworCWlmIChmdGFwZV9pbml0X2RyaXZlX25lZWRlZCkgeworCQlyZXR1cm4gc3ByaW50ZihidWYsICJ1bmluaXRpYWxpemVkXG4iKTsKKwl9CisJaWYgKGZ0X25vX3RhcGUpIHsKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAibm8gY2FydHJpZGdlIGluc2VydGVkXG4iKTsKKwl9CisJcmV0dXJuIHNwcmludGYoYnVmLAorCQkgICAgICAgInNlZ21lbnRzICA6ICU1ZFxuIgorCQkgICAgICAgInRyYWNrcyAgICA6ICU1ZFxuIgorCQkgICAgICAgImxlbmd0aCAgICA6ICU1ZGZ0XG4iCisJCSAgICAgICAiZm9ybWF0dGVkIDogJTNzXG4iCisJCSAgICAgICAid3JpdGFibGUgIDogJTNzXG4iCisJCSAgICAgICAiUUlDIHNwZWMuIDogUUlDLSVzXG4iCisJCSAgICAgICAiZm10LWNvZGUgIDogJTFkXG4iLAorCQkgICAgICAgZnRfc2VnbWVudHNfcGVyX3RyYWNrLAorCQkgICAgICAgZnRfdHJhY2tzX3Blcl90YXBlLAorCQkgICAgICAgZnRhcGVfdGFwZV9sZW4sCisJCSAgICAgICAoZnRfZm9ybWF0dGVkID09IDEpID8gInllcyIgOiAibm8iLAorCQkgICAgICAgKGZ0X3dyaXRlX3Byb3RlY3RlZCA9PSAxKSA/ICJubyIgOiAieWVzIiwKKwkJICAgICAgICgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM0MCkgPyAiNDAiIDoKKwkJCSgoZnRfcWljX3N0ZCA9PSBRSUNfVEFQRV9RSUM4MCkgPyAiODAiIDoKKwkJCSAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDMzAxMCkgPyAiMzAxMCIgOgorCQkJICAoKGZ0X3FpY19zdGQgPT0gUUlDX1RBUEVfUUlDMzAyMCkgPyAiMzAyMCIgOgorCQkJICAgIj8/PyIpKSkpLAorCQkgICAgICAgZnRfZm9ybWF0X2NvZGUpOworfQorCitzdGF0aWMgc2l6ZV90IGdldF9jb250cm9sbGVyX2luZm8oY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgICpmZGNfbmFtZVtdID0geyAibm8gZmRjIiwKKwkJCQkgICAgImk4MjcyIiwKKwkJCQkgICAgImk4MjA3NyIsCisJCQkJICAgICJpODIwNzdBQSIsCisJCQkJICAgICJDb2xvcmFkbyBGQy0xMCBvciBGQy0yMCIsCisJCQkJICAgICJpODIwNzgiLAorCQkJCSAgICAiaTgyMDc4XzEiIH07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsCisJCSAgICAgICAiRkRDIHR5cGUgIDogJXNcbiIKKwkJICAgICAgICJGREMgYmFzZSAgOiAweCUwM3hcbiIKKwkJICAgICAgICJGREMgaXJxICAgOiAlZFxuIgorCQkgICAgICAgIkZEQyBkbWEgICA6ICVkXG4iCisJCSAgICAgICAiRkRDIHRoci4gIDogJWRcbiIKKwkJICAgICAgICJtYXguIHJhdGUgOiAlZCBrYml0L3NlY1xuIiwKKwkJICAgICAgIGZ0X21hY2gyID8gIk1vdW50YWluIE1BQ0gtMiIgOiBmZGNfbmFtZVtmZGMudHlwZV0sCisJCSAgICAgICBmZGMuc3JhLCBmZGMuaXJxLCBmZGMuZG1hLAorCQkgICAgICAgZnRfZmRjX3RocmVzaG9sZCwgZnRfZmRjX21heF9yYXRlKTsKK30KKworc3RhdGljIHNpemVfdCBnZXRfaGlzdG9yeV9pbmZvKGNoYXIgKmJ1ZikKK3sKKyAgICAgICAgc2l6ZV90IGxlbjsKKworCWxlbiAgPSBzcHJpbnRmKGJ1ZiwKKwkJICAgICAgICJcbkZEQyBpc3Igc3RhdGlzdGljc1xuIgorCQkgICAgICAgIiBpZF9hbV9lcnJvcnMgICAgIDogJTNkXG4iCisJCSAgICAgICAiIGlkX2NyY19lcnJvcnMgICAgOiAlM2RcbiIKKwkJICAgICAgICIgZGF0YV9hbV9lcnJvcnMgICA6ICUzZFxuIgorCQkgICAgICAgIiBkYXRhX2NyY19lcnJvcnMgIDogJTNkXG4iCisJCSAgICAgICAiIG92ZXJydW5fZXJyb3JzICAgOiAlM2RcbiIKKwkJICAgICAgICIgbm9fZGF0YV9lcnJvcnMgICA6ICUzZFxuIgorCQkgICAgICAgIiByZXRyaWVzICAgICAgICAgIDogJTNkXG4iLAorCQkgICAgICAgZnRfaGlzdG9yeS5pZF9hbV9lcnJvcnMsICAgZnRfaGlzdG9yeS5pZF9jcmNfZXJyb3JzLAorCQkgICAgICAgZnRfaGlzdG9yeS5kYXRhX2FtX2Vycm9ycywgZnRfaGlzdG9yeS5kYXRhX2NyY19lcnJvcnMsCisJCSAgICAgICBmdF9oaXN0b3J5Lm92ZXJydW5fZXJyb3JzLCBmdF9oaXN0b3J5Lm5vX2RhdGFfZXJyb3JzLAorCQkgICAgICAgZnRfaGlzdG9yeS5yZXRyaWVzKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sCisJCSAgICAgICAiXG5FQ0Mgc3RhdGlzdGljc1xuIgorCQkgICAgICAgIiBjcmNfZXJyb3JzICAgICAgIDogJTNkXG4iCisJCSAgICAgICAiIGNyY19mYWlsdXJlcyAgICAgOiAlM2RcbiIKKwkJICAgICAgICIgZWNjX2ZhaWx1cmVzICAgICA6ICUzZFxuIgorCQkgICAgICAgIiBzZWN0b3JzIGNvcnJlY3RlZDogJTNkXG4iLAorCQkgICAgICAgZnRfaGlzdG9yeS5jcmNfZXJyb3JzLCAgIGZ0X2hpc3RvcnkuY3JjX2ZhaWx1cmVzLAorCQkgICAgICAgZnRfaGlzdG9yeS5lY2NfZmFpbHVyZXMsIGZ0X2hpc3RvcnkuY29ycmVjdGVkKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sCisJCSAgICAgICAiXG50YXBlIHF1YWxpdHkgc3RhdGlzdGljc1xuIgorCQkgICAgICAgIiBtZWRpYSBkZWZlY3RzICAgIDogJTNkXG4iLAorCQkgICAgICAgZnRfaGlzdG9yeS5kZWZlY3RzKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sCisJCSAgICAgICAiXG50YXBlIG1vdGlvbiBzdGF0aXN0aWNzXG4iCisJCSAgICAgICAiIHJlcG9zaXRpb25zICAgICAgOiAlM2RcbiIsCisJCSAgICAgICBmdF9oaXN0b3J5LnJld2luZHMpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZnRhcGVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwdHIgPSBwYWdlOworCXNpemVfdCBsZW47CisJCisJcHRyICs9IHNwcmludGYocHRyLCAiS2VybmVsIERyaXZlclxuXG4iKTsKKwlwdHIgKz0gZ2V0X2RyaXZlcl9pbmZvKHB0cik7CisJcHRyICs9IHNwcmludGYocHRyLCAiXG5UYXBlIERyaXZlXG5cbiIpOworCXB0ciArPSBnZXRfdGFwZWRyaXZlX2luZm8ocHRyKTsKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJcbkZEQyBDb250cm9sbGVyXG5cbiIpOworCXB0ciArPSBnZXRfY29udHJvbGxlcl9pbmZvKHB0cik7CisJcHRyICs9IHNwcmludGYocHRyLCAiXG5UYXBlIENhcnRyaWRnZVxuXG4iKTsKKwlwdHIgKz0gZ2V0X2NhcnRyaWRnZV9pbmZvKHB0cik7CisJcHRyICs9IHNwcmludGYocHRyLCAiXG5IaXN0b3J5IFJlY29yZFxuXG4iKTsKKwlwdHIgKz0gZ2V0X2hpc3RvcnlfaW5mbyhwdHIpOworCisJbGVuID0gc3RybGVuKHBhZ2UpOworCSpzdGFydCA9IE5VTEw7CisJaWYgKG9mZitjb3VudCA+PSBsZW4pIHsKKwkJKmVvZiA9IDE7CisJfSBlbHNlIHsKKwkJKmVvZiA9IDA7CisJfQorCXJldHVybiBsZW47Cit9CisKK2ludCBfX2luaXQgZnRhcGVfcHJvY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImZ0YXBlIiwgMCwgJnByb2Nfcm9vdCwKKwkJZnRhcGVfcmVhZF9wcm9jLCBOVUxMKSAhPSBOVUxMOworfQorCit2b2lkIGZ0YXBlX3Byb2NfZGVzdHJveSh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCJmdGFwZSIsICZwcm9jX3Jvb3QpOworfQorCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUFJPQ19GUykgJiYgZGVmaW5lZChDT05GSUdfRlRfUFJPQ19GUykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1wcm9jLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGRmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcHJvYy5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgX0ZUQVBFX1BST0NfSAorI2RlZmluZSBfRlRBUEVfUFJPQ19ICisKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcHJvYy5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6MjAgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgcHJvY2ZzIGludGVyZmFjZSBvZiB0aGUKKyAqICAgICAgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgImZ0YXBlIiBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworZXh0ZXJuIGludCAgZnRhcGVfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZnRhcGVfcHJvY19kZXN0cm95KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjdkOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcmVhZC5jCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJlYWQuYyx2ICQKKyAqICRSZXZpc2lvbjogMS42ICQKKyAqICREYXRlOiAxOTk3LzEwLzIxIDE0OjM5OjIyICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcmVhZGluZyBjb2RlCisgKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xaWMxMTcuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWVjYy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworCit2b2lkIGZ0YXBlX3phcF9yZWFkX2J1ZmZlcnModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmdF9ucl9idWZmZXJzOyArK2kpIHsKKy8qICBjaGFuZ2VkIHRvICJmaXQiIHdpdGggZHluYW1pYyBhbGxvY2F0aW9uIG9mIHRhcGVfYnVmZmVyLiAtLWtocCAgKi8KKwkJZnRfYnVmZmVyW2ldLT5zdGF0dXMgPSB3YWl0aW5nOworCQlmdF9idWZmZXJbaV0tPmJ5dGVzID0gMDsKKwkJZnRfYnVmZmVyW2ldLT5za2lwID0gMDsKKwkJZnRfYnVmZmVyW2ldLT5yZXRyeSA9IDA7CisJfQorLyoJZnRhcGVfcmVzZXRfYnVmZmVyKCk7ICovCit9CisKK3N0YXRpYyBTZWN0b3JNYXAgY29udmVydF9zZWN0b3JfbWFwKGJ1ZmZlcl9zdHJ1Y3QgKiBidWZmKQoreworCWludCBpID0gMDsKKwlTZWN0b3JNYXAgYmFkX21hcCA9IGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KGJ1ZmYtPnNlZ21lbnRfaWQpOworCVNlY3Rvck1hcCBzcmNfbWFwID0gYnVmZi0+c29mdF9lcnJvcl9tYXAgfCBidWZmLT5oYXJkX2Vycm9yX21hcDsKKwlTZWN0b3JNYXAgZHN0X21hcCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChiYWRfbWFwIHx8IHNyY19tYXApIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiYmFkX21hcCA9IDB4JTA4bHgiLCAobG9uZykgYmFkX21hcCk7CisJCVRSQUNFKGZ0X3RfZmxvdywgInNyY19tYXAgPSAweCUwOGx4IiwgKGxvbmcpIHNyY19tYXApOworCX0KKwl3aGlsZSAoYmFkX21hcCkgeworCQl3aGlsZSAoKGJhZF9tYXAgJiAxKSA9PSAwKSB7CisJCQlpZiAoc3JjX21hcCAmIDEpIHsKKwkJCQlkc3RfbWFwIHw9ICgxIDw8IGkpOworCQkJfQorCQkJc3JjX21hcCA+Pj0gMTsKKwkJCWJhZF9tYXAgPj49IDE7CisJCQkrK2k7CisJCX0KKwkJLyogKGJhZF9tYXAgJiAxKSA9PSAxICovCisJCXNyY19tYXAgPj49IDE7CisJCWJhZF9tYXAgPj49IDE7CisJfQorCWlmIChzcmNfbWFwKSB7CisJCWRzdF9tYXAgfD0gKHNyY19tYXAgPDwgaSk7CisJfQorCWlmIChkc3RfbWFwKSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgImRzdF9tYXAgPSAweCUwOGx4IiwgKGxvbmcpIGRzdF9tYXApOworCX0KKwlUUkFDRV9FWElUIGRzdF9tYXA7Cit9CisKK3N0YXRpYyBpbnQgY29ycmVjdF9hbmRfY29weV9mcmFjdGlvbihidWZmZXJfc3RydWN0ICpidWZmLCBfX3U4ICogZGVzdGluYXRpb24sCisJCQkJICAgICBpbnQgc3RhcnQsIGludCBzaXplKQoreworCXN0cnVjdCBtZW1vcnlfc2VnbWVudCBtc2VnOworCWludCByZXN1bHQ7CisJU2VjdG9yTWFwIHJlYWRfYmFkOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwltc2VnLnJlYWRfYmFkID0gY29udmVydF9zZWN0b3JfbWFwKGJ1ZmYpOworCW1zZWcubWFya2VkX2JhZCA9IDA7CS8qIG5vdCB1c2VkLi4uICovCisJbXNlZy5ibG9ja3MgPSBidWZmLT5ieXRlcyAvIEZUX1NFQ1RPUl9TSVpFOworCW1zZWcuZGF0YSA9IGJ1ZmYtPmFkZHJlc3M7CisJLyogICAgSWYgdGhlcmUgYXJlIG5vIGRhdGEgc2VjdG9ycyB3ZSBjYW4gc2tpcCB0aGlzIHNlZ21lbnQuCisJICovCisJaWYgKG1zZWcuYmxvY2tzIDw9IDMpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwgImVtcHR5IHNlZ21lbnQiKTsKKwl9CisJcmVhZF9iYWQgPSBtc2VnLnJlYWRfYmFkOworCWZ0X2hpc3RvcnkuY3JjX2Vycm9ycyArPSBjb3VudF9vbmVzKHJlYWRfYmFkKTsKKwlyZXN1bHQgPSBmdGFwZV9lY2NfY29ycmVjdF9kYXRhKCZtc2VnKTsKKwlpZiAocmVhZF9iYWQgIT0gMCB8fCBtc2VnLmNvcnJlY3RlZCAhPSAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjcmMgZXJyb3IgbWFwOiAweCUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpcmVhZF9iYWQpOworCQlUUkFDRShmdF90X25vaXNlLCAiY29ycmVjdGVkIG1hcDogMHglMDhseCIsICh1bnNpZ25lZCBsb25nKW1zZWcuY29ycmVjdGVkKTsKKwkJZnRfaGlzdG9yeS5jb3JyZWN0ZWQgKz0gY291bnRfb25lcyhtc2VnLmNvcnJlY3RlZCk7CisJfQorCWlmIChyZXN1bHQgPT0gRUNDX0NPUlJFQ1RFRCB8fCByZXN1bHQgPT0gRUNDX09LKSB7CisJCWlmIChyZXN1bHQgPT0gRUNDX0NPUlJFQ1RFRCkgeworCQkJVFJBQ0UoZnRfdF9pbmZvLCAiZWNjIGNvcnJlY3RlZCBzZWdtZW50OiAlZCIsIGJ1ZmYtPnNlZ21lbnRfaWQpOworCQl9CisJCWlmKHN0YXJ0IDwgMCkgeworCQkJc3RhcnQ9IDA7CisJCX0KKwkJaWYoKHN0YXJ0K3NpemUpID4gKChtc2VnLmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkUpKSB7CisJCQlzaXplID0gKG1zZWcuYmxvY2tzIC0gMykgKiBGVF9TRUNUT1JfU0laRSAgLSBzdGFydDsKKwkJfSAKKwkJaWYgKHNpemUgPCAwKSB7CisJCQlzaXplPSAwOworCQl9CisJCWlmKHNpemUgPiAwKSB7CisJCQltZW1jcHkoZGVzdGluYXRpb24gKyBzdGFydCwgbXNlZy5kYXRhICsgc3RhcnQsIHNpemUpOworCQl9CisJCWlmICgocmVhZF9iYWQgXiBtc2VnLmNvcnJlY3RlZCkgJiBtc2VnLmNvcnJlY3RlZCkgeworCQkJLyogc2VjdG9ycyBjb3JyZWN0ZWQgd2l0aG91dCBjcmMgZXJyb3JzIHNldCAqLworCQkJZnRfaGlzdG9yeS5jcmNfZmFpbHVyZXMrKzsKKwkJfQorCQlUUkFDRV9FWElUIHNpemU7IC8qIChtc2VnLmJsb2NrcyAtIDMpICogRlRfU0VDVE9SX1NJWkU7ICovCisJfSBlbHNlIHsKKwkJZnRfaGlzdG9yeS5lY2NfZmFpbHVyZXMrKzsKKwkJVFJBQ0VfQUJPUlQoLUVBR0FJTiwKKwkJCSAgICBmdF90X2VyciwgImVjYyBmYWlsdXJlIG9uIHNlZ21lbnQgJWQiLAorCQkJICAgIGJ1ZmYtPnNlZ21lbnRfaWQpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgICAgUmVhZCBnaXZlbiBzZWdtZW50IGludG8gYnVmZmVyIGF0IGFkZHJlc3MuCisgKi8KK2ludCBmdGFwZV9yZWFkX3NlZ21lbnRfZnJhY3Rpb24oY29uc3QgaW50IHNlZ21lbnRfaWQsCisJCQkJdm9pZCAgKmFkZHJlc3MsIAorCQkJCWNvbnN0IGZ0X3JlYWRfbW9kZV90IHJlYWRfbW9kZSwKKwkJCQljb25zdCBpbnQgc3RhcnQsCisJCQkJY29uc3QgaW50IHNpemUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHJldHJ5ICA9IDA7CisJaW50IGJ5dGVzX3JlYWQgPSAwOworCWludCByZWFkX2RvbmUgID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0X2hpc3RvcnkudXNlZCB8PSAxOworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAic2VnbWVudF9pZCA9ICVkIiwgc2VnbWVudF9pZCk7CisJaWYgKGZ0X2RyaXZlcl9zdGF0ZSAhPSByZWFkaW5nKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjYWxsaW5nIGZ0YXBlX2Fib3J0X29wZXJhdGlvbiIpOworCQlUUkFDRV9DQVRDSChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSwpOworCQlmdGFwZV9zZXRfc3RhdGUocmVhZGluZyk7CisJfQorCWZvcig7OykgeworCQlidWZmZXJfc3RydWN0ICp0YWlsOworCQkvKiAgQWxsb3cgZXNjYXBlIGZyb20gdGhpcyBsb29wIG9uIHNpZ25hbCAhCisJCSAqLworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCS8qICBTZWFyY2ggYWxsIGZ1bGwgYnVmZmVycyBmb3IgdGhlIGZpcnN0IG1hdGNoaW5nIHRoZQorCQkgKiAgd2FudGVkIHNlZ21lbnQuICBDbGVhciBvdGhlciBidWZmZXJzIG9uIHRoZSBmbHkuCisJCSAqLworCQl0YWlsID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKKwkJd2hpbGUgKCFyZWFkX2RvbmUgJiYgdGFpbC0+c3RhdHVzID09IGRvbmUpIHsKKwkJCS8qICBBbGxvdyBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agb24gc2lnbmFsICEKKwkJCSAqLworCQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQkJaWYgKHRhaWwtPnNlZ21lbnRfaWQgPT0gc2VnbWVudF9pZCkgeworCQkJCS8qICBJZiBvdXQgYnVmZmVyIGlzIGFscmVhZHkgZnVsbCwKKwkJCQkgKiAgcmV0dXJuIGl0cyBjb250ZW50cy4gIAorCQkJCSAqLworCQkJCVRSQUNFKGZ0X3RfZmxvdywgImZvdW5kIHNlZ21lbnQgaW4gY2FjaGU6ICVkIiwKKwkJCQkgICAgICBzZWdtZW50X2lkKTsKKwkJCQlpZiAodGFpbC0+ZGVsZXRlZCkgeworCQkJCQkvKiAgUmV0dXJuIGEgdmFsdWUgdGhhdAorCQkJCQkgKiAgcmVhZF9oZWFkZXJfc2VnbWVudAorCQkJCQkgKiAgdW5kZXJzdGFuZHMuICBBcyB0aGlzCisJCQkJCSAqICBzaG91bGQgb25seSBvY2N1ciB3aGVuCisJCQkJCSAqICBzZWFyY2hpbmcgZm9yIHRoZSBoZWFkZXIKKwkJCQkJICogIHNlZ21lbnRzIGl0IHNob3VsZG4ndCBiZQorCQkJCQkgKiAgbWlzaW50ZXJwcmV0ZWQgZWxzZXdoZXJlLgorCQkJCQkgKi8KKwkJCQkJVFJBQ0VfRVhJVCAwOworCQkJCX0KKwkJCQlyZXN1bHQgPSBjb3JyZWN0X2FuZF9jb3B5X2ZyYWN0aW9uKAorCQkJCQl0YWlsLAorCQkJCQlhZGRyZXNzLAorCQkJCQlzdGFydCwKKwkJCQkJc2l6ZSk7CisJCQkJVFJBQ0UoZnRfdF9mbG93LCAic2VnbWVudCBjb250YWlucyAoYnl0ZXMpOiAlZCIsCisJCQkJICAgICAgcmVzdWx0KTsKKwkJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCQlpZiAocmVzdWx0ICE9IC1FQUdBSU4pIHsKKwkJCQkJCVRSQUNFX0VYSVQgcmVzdWx0OworCQkJCQl9CisJCQkJCS8qIGtlZXAgcmVhZF9kb25lID09IDAsIHdpbGwKKwkJCQkJICogdHJpZ2dlcgorCQkJCQkgKiBmdGFwZV9hYm9ydF9vcGVyYXRpb24KKwkJCQkJICogYmVjYXVzZSByZWFkaW5nIHdyb25nCisJCQkJCSAqIHNlZ21lbnQuCisJCQkJCSAqLworCQkJCQlUUkFDRShmdF90X2VyciwgImVjYyBmYWlsZWQsIHJldHJ5Iik7CisJCQkJCSsrcmV0cnk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVhZF9kb25lID0gMTsKKwkJCQkJYnl0ZXNfcmVhZCA9IHJlc3VsdDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVRSQUNFKGZ0X3RfZmxvdywiemFwcGluZyBzZWdtZW50IGluIGNhY2hlOiAlZCIsCisJCQkJICAgICAgdGFpbC0+c2VnbWVudF9pZCk7CisJCQl9CisJCQl0YWlsLT5zdGF0dXMgPSB3YWl0aW5nOworCQkJdGFpbCA9IGZ0YXBlX25leHRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCQl9CisJCWlmICghcmVhZF9kb25lICYmIHRhaWwtPnN0YXR1cyA9PSByZWFkaW5nKSB7CisJCQlpZiAodGFpbC0+c2VnbWVudF9pZCA9PSBzZWdtZW50X2lkKSB7CisJCQkJc3dpdGNoKGZ0YXBlX3dhaXRfc2VnbWVudChyZWFkaW5nKSkgeworCQkJCWNhc2UgMDoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAtRUlOVFI6CisJCQkJCVRSQUNFX0FCT1JUKC1FSU5UUiwgZnRfdF93YXJuLAorCQkJCQkJICAgICJpbnRlcnJ1cHRlZCBieSAiCisJCQkJCQkgICAgIm5vbi1ibG9ja2FibGUgc2lnbmFsIik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJCSAgICAgICJ3YWl0X3NlZ21lbnQgZmFpbGVkIik7CisJCQkJCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOworCQkJCQlmdGFwZV9zZXRfc3RhdGUocmVhZGluZyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogIFdlJ3JlIHJlYWRpbmcgdGhlIHdyb25nIHNlZ21lbnQsCisJCQkJICogIHN0b3AgcnVubmVyLgorCQkJCSAqLworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZWFkaW5nIHdyb25nIHNlZ21lbnQiKTsKKwkJCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwkJCQlmdGFwZV9zZXRfc3RhdGUocmVhZGluZyk7CisJCQl9CisJCX0KKwkJLyogICAgc2hvdWxkIHJ1bm5lciBzdG9wID8KKwkJICovCisJCWlmIChmdF9ydW5uZXJfc3RhdHVzID09IGFib3J0aW5nKSB7CisJCQlidWZmZXJfc3RydWN0ICpoZWFkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKwkJCXN3aXRjaChoZWFkLT5zdGF0dXMpIHsKKwkJCWNhc2UgZXJyb3I6CisJCQkJZnRfaGlzdG9yeS5kZWZlY3RzICs9IAorCQkJCQljb3VudF9vbmVzKGhlYWQtPmhhcmRfZXJyb3JfbWFwKTsKKwkJCWNhc2UgcmVhZGluZzoKKwkJCQloZWFkLT5zdGF0dXMgPSB3YWl0aW5nOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCVRSQUNFX0NBVENIKGZ0YXBlX2R1bWJfc3RvcCgpLCk7CisJCX0gZWxzZSB7CisJCQkvKiAgSWYganVzdCBwYXNzZWQgbGFzdCBzZWdtZW50IG9uIHRhcGU6IHdhaXQKKwkJCSAqICBmb3IgQk9UIG9yIEVPVCBtYXJrLiBTZXRzIGZ0X3J1bm5lcl9zdGF0dXMgdG8KKwkJCSAqICBpZGxlIGlmIGF0IGxFT1QgYW5kIHN1Y2Nlc3NmdWwgCisJCQkgKi8KKwkJCVRSQUNFX0NBVENIKGZ0YXBlX2hhbmRsZV9sb2dpY2FsX2VvdCgpLCk7CisJCX0KKwkJLyogICAgSWYgd2UgZ290IGEgc2VnbWVudDogcXVpdCwgb3IgZWxzZSByZXRyeSB1cCB0byBsaW1pdC4KKwkJICoKKwkJICogICAgSWYgc2VnbWVudCB0byByZWFkIGlzIGVtcHR5LCBkbyBub3Qgc3RhcnQgcnVubmVyIGZvciBpdCwKKwkJICogICAgYnV0IHdhaXQgZm9yIG5leHQgcmVhZCBjYWxsLgorCQkgKi8KKwkJaWYgKHJlYWRfZG9uZSB8fAorCQkgICAgZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudF9pZCkgPT0gRU1QVFlfU0VHTUVOVCApIHsKKwkJCS8qIGJ5dGVzX3JlYWQgPSAwOyAgc2hvdWxkIHN0aWxsIGJlIHplcm8gKi8KKwkJCVRSQUNFX0VYSVQgYnl0ZXNfcmVhZDsKKworCQl9CisJCWlmIChyZXRyeSA+IEZUX1JFVFJJRVNfT05fRUNDX0VSUk9SKSB7CisJCQlmdF9oaXN0b3J5LmRlZmVjdHMrKzsKKwkJCVRSQUNFX0FCT1JUKC1FTk9EQVRBLCBmdF90X2VyciwKKwkJCQkgICAgInRvbyBtYW55IHJldHJpZXMgb24gZWNjIGZhaWx1cmUiKTsKKwkJfQorCQkvKiAgICBOb3cgYXQgbGVhc3Qgb25lIGJ1ZmZlciBpcyBlbXB0eSAhCisJCSAqICAgIFJlc3RhcnQgcnVubmVyICYgdGFwZSBpZiBuZWVkZWQuCisJCSAqLworCQlUUkFDRShmdF90X2FueSwgImhlYWQ6ICVkLCB0YWlsOiAlZCwgZnRfcnVubmVyX3N0YXR1czogJWQiLAorCQkgICAgICBmdGFwZV9idWZmZXJfaWQoZnRfcXVldWVfaGVhZCksCisJCSAgICAgIGZ0YXBlX2J1ZmZlcl9pZChmdF9xdWV1ZV90YWlsKSwKKwkJICAgICAgZnRfcnVubmVyX3N0YXR1cyk7CisJCVRSQUNFKGZ0X3RfYW55LCAiYnVmZmVyW10uc3RhdHVzLCBbaGVhZF06ICVkLCBbdGFpbF06ICVkIiwKKwkJICAgICAgZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKS0+c3RhdHVzLAorCQkgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpLT5zdGF0dXMpOworCQl0YWlsID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKKwkJaWYgKHRhaWwtPnN0YXR1cyA9PSB3YWl0aW5nKSB7CisJCQlidWZmZXJfc3RydWN0ICpoZWFkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKworCQkJZnRhcGVfc2V0dXBfbmV3X3NlZ21lbnQoaGVhZCwgc2VnbWVudF9pZCwgLTEpOworCQkJaWYgKHJlYWRfbW9kZSA9PSBGVF9SRF9TSU5HTEUpIHsKKwkJCQkvKiBkaXNhYmxlIHJlYWQtYWhlYWQgKi8KKwkJCQloZWFkLT5uZXh0X3NlZ21lbnQgPSAwOworCQkJfQorCQkJZnRhcGVfY2FsY19uZXh0X2NsdXN0ZXIoaGVhZCk7CisJCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBpZGxlKSB7CisJCQkJcmVzdWx0ID0gZnRhcGVfc3RhcnRfdGFwZShzZWdtZW50X2lkLAorCQkJCQkJCSAgaGVhZC0+c2VjdG9yX29mZnNldCk7CisJCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X2VyciwgIkVycm9yOiAiCisJCQkJCQkgICAgInNlZ21lbnQgJWQgdW5yZWFjaGFibGUiLAorCQkJCQkJICAgIHNlZ21lbnRfaWQpOworCQkJCX0KKwkJCX0KKwkJCWhlYWQtPnN0YXR1cyA9IHJlYWRpbmc7CisJCQlmZGNfc2V0dXBfcmVhZF93cml0ZShoZWFkLCBGRENfUkVBRCk7CisJCX0KKwl9CisJLyogbm90IHJlYWNoZWQgKi8KKwlUUkFDRV9FWElUIC1FSU87Cit9CisKK2ludCBmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KF9fdTggKmFkZHJlc3MpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgaGVhZGVyX3NlZ21lbnQ7CisJaW50IGZpcnN0X2ZhaWxlZCA9IDA7CisJaW50IHN0YXR1czsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWZ0X3VzZWRfaGVhZGVyX3NlZ21lbnQgPSAtMTsKKwlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLCk7CisJVFJBQ0UoZnRfdF9mbG93LCAicmVhZGluZy4uLiIpOworCS8qICBXZSdyZSBsb29raW5nIGZvciB0aGUgZmlyc3QgaGVhZGVyIHNlZ21lbnQuCisJICogIEEgaGVhZGVyIHNlZ21lbnQgY2Fubm90IGNvbnRhaW4gYmFkIHNlY3RvcnMsIHRoZXJlZm9yIGF0IHRoZQorCSAqICB0YXBlIHN0YXJ0LCBzZWdtZW50cyB3aXRoIGJhZCBzZWN0b3JzIGFyZSAoYWNjb3JkaW5nIHRvIFFJQy00MC84MCkKKwkgKiAgd3JpdHRlbiB3aXRoIGRlbGV0ZWQgZGF0YSBtYXJrcyBhbmQgbXVzdCBiZSBza2lwcGVkLgorCSAqLworCW1lbXNldChhZGRyZXNzLCAnXDAnLCAoRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIDMpICogRlRfU0VDVE9SX1NJWkUpOyAKKwlyZXN1bHQgPSAwOworI2RlZmluZSBIRUFERVJfU0VHTUVOVF9CT1VOREFSWSA2OCAgLyogd2h5IG5vdCA0Mj8gKi8KKwlmb3IgKGhlYWRlcl9zZWdtZW50ID0gMDsKKwkgICAgIGhlYWRlcl9zZWdtZW50IDwgSEVBREVSX1NFR01FTlRfQk9VTkRBUlkgJiYgcmVzdWx0ID09IDA7CisJICAgICArK2hlYWRlcl9zZWdtZW50KSB7CisJCS8qICBTZXQgbm8gcmVhZC1haGVhZCwgdGhlIGlzciB3aWxsIGZvcmNlIHJlYWQtYWhlYWQgd2hlbmV2ZXIKKwkJICogIGl0IGVuY291bnRlcnMgZGVsZXRlZCBkYXRhICEKKwkJICovCisJCXJlc3VsdCA9IGZ0YXBlX3JlYWRfc2VnbWVudChoZWFkZXJfc2VnbWVudCwKKwkJCQkJICAgIGFkZHJlc3MsCisJCQkJCSAgICBGVF9SRF9TSU5HTEUpOworCQlpZiAocmVzdWx0IDwgMCAmJiAhZmlyc3RfZmFpbGVkKSB7CisJCQlUUkFDRShmdF90X2VyciwgImhlYWRlciBzZWdtZW50IGRhbWFnZWQsIHRyeWluZyBiYWNrdXAiKTsKKwkJCWZpcnN0X2ZhaWxlZCA9IDE7CisJCQlyZXN1bHQgPSAwOwkvKiBmb3JjZSByZWFkIG9mIG5leHQgKGJhY2t1cCkgc2VnbWVudCAqLworCQl9CisJfQorCWlmIChyZXN1bHQgPCAwIHx8IGhlYWRlcl9zZWdtZW50ID49IEhFQURFUl9TRUdNRU5UX0JPVU5EQVJZKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJubyByZWFkYWJsZSBoZWFkZXIgc2VnbWVudCBmb3VuZCIpOworCX0KKwlUUkFDRV9DQVRDSChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSwpOworCWZ0X3VzZWRfaGVhZGVyX3NlZ21lbnQgPSBoZWFkZXJfc2VnbWVudDsKKwlyZXN1bHQgPSBmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoYWRkcmVzcyk7CisgCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCitpbnQgZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KF9fdTggKmFkZHJlc3MpCit7CisJdW5zaWduZWQgaW50IG1heF9mbG9wcHlfc2lkZTsKKwl1bnNpZ25lZCBpbnQgbWF4X2Zsb3BweV90cmFjazsKKwl1bnNpZ25lZCBpbnQgbWF4X2Zsb3BweV9zZWN0b3I7CisJdW5zaWduZWQgaW50IG5ld190YXBlX2xlbjsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChHRVQ0KGFkZHJlc3MsIEZUX1NJR05BVFVSRSkgPT0gRlRfRDJHX01BR0lDKSB7CisJCS8qIERpdHRvIDJHQiBoZWFkZXIgc2VnbWVudC4gVGhleSBlbmNyeXB0IHRoZSBiYWQgc2VjdG9yIG1hcC4KKwkJICogV2UgZGVjcnlwdCBpdCBhbmQgc3RvcmUgdGhlbSBpbiBub3JtYWwgZm9ybWF0LgorCQkgKiBJIGhvcGUgdGhpcyBpcyBjb3JyZWN0LgorCQkgKi8KKwkJaW50IGk7CisJCVRSQUNFKGZ0X3Rfd2FybiwKKwkJICAgICAgIkZvdW5kIERpdHRvIDJHQiB0YXBlLCAiCisJCSAgICAgICJ0cnlpbmcgdG8gZGVjcnlwdCBiYWQgc2VjdG9yIG1hcCIpOworCQlmb3IgKGk9MjU2OyBpIDwgMjkgKiBGVF9TRUNUT1JfU0laRTsgaSsrKSB7CisJCQlhZGRyZXNzW2ldID0gfihhZGRyZXNzW2ldIC0gKGkmMHhmZikpOworCQl9CisJCVBVVDQoYWRkcmVzcywgMCxGVF9IU0VHX01BR0lDKTsKKwl9IGVsc2UgaWYgKEdFVDQoYWRkcmVzcywgRlRfU0lHTkFUVVJFKSAhPSBGVF9IU0VHX01BR0lDKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJ3cm9uZyBzaWduYXR1cmUgaW4gaGVhZGVyIHNlZ21lbnQiKTsKKwl9CisJZnRfZm9ybWF0X2NvZGUgPSAoZnRfZm9ybWF0X3R5cGUpIGFkZHJlc3NbRlRfRk1UX0NPREVdOworCWlmIChmdF9mb3JtYXRfY29kZSAhPSBmbXRfYmlnKSB7CisJCWZ0X2hlYWRlcl9zZWdtZW50XzEgICA9IEdFVDIoYWRkcmVzcywgRlRfSFNFR18xKTsKKwkJZnRfaGVhZGVyX3NlZ21lbnRfMiAgID0gR0VUMihhZGRyZXNzLCBGVF9IU0VHXzIpOworCQlmdF9maXJzdF9kYXRhX3NlZ21lbnQgPSBHRVQyKGFkZHJlc3MsIEZUX0ZSU1RfU0VHKTsKKwkJZnRfbGFzdF9kYXRhX3NlZ21lbnQgID0gR0VUMihhZGRyZXNzLCBGVF9MQVNUX1NFRyk7CisJfSBlbHNlIHsKKwkJZnRfaGVhZGVyX3NlZ21lbnRfMSAgID0gR0VUNChhZGRyZXNzLCBGVF82X0hTRUdfMSk7CisJCWZ0X2hlYWRlcl9zZWdtZW50XzIgICA9IEdFVDQoYWRkcmVzcywgRlRfNl9IU0VHXzIpOworCQlmdF9maXJzdF9kYXRhX3NlZ21lbnQgPSBHRVQ0KGFkZHJlc3MsIEZUXzZfRlJTVF9TRUcpOworCQlmdF9sYXN0X2RhdGFfc2VnbWVudCAgPSBHRVQ0KGFkZHJlc3MsIEZUXzZfTEFTVF9TRUcpOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiZmlyc3QgZGF0YSBzZWdtZW50OiAlZCIsIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCk7CisJVFJBQ0UoZnRfdF9ub2lzZSwgImxhc3QgIGRhdGEgc2VnbWVudDogJWQiLCBmdF9sYXN0X2RhdGFfc2VnbWVudCk7CisJVFJBQ0UoZnRfdF9ub2lzZSwgImhlYWRlciBzZWdtZW50cyBhcmUgJWQgYW5kICVkIiwKKwkgICAgICBmdF9oZWFkZXJfc2VnbWVudF8xLCBmdF9oZWFkZXJfc2VnbWVudF8yKTsKKworCS8qICAgIFZlcmlmeSB0YXBlIHBhcmFtZXRlcnMuLi4KKwkgKiAgICBRSUMtNDAvODAgc3BlYzogICAgICAgICAgICAgICAgIHRhcGVfcGFyYW1ldGVyczoKKwkgKgorCSAqICAgIHNlZ21lbnRzLXBlci10cmFjayAgICAgICAgICAgICAgc2VnbWVudHNfcGVyX3RyYWNrCisJICogICAgdHJhY2tzLXBlci1jYXJ0cmlkZ2UgICAgICAgICAgICB0cmFja3NfcGVyX3RhcGUKKwkgKiAgICBtYXgtZmxvcHB5LXNpZGUgICAgICAgICAgICAgICAgIChzZWdtZW50c19wZXJfdHJhY2sgKgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tzX3Blcl90YXBlIC0gMSkgLworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQKKwkgKiAgICBtYXgtZmxvcHB5LXRyYWNrICAgICAgICAgICAgICAgIGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkIC8KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciAtIDEKKwkgKiAgICBtYXgtZmxvcHB5LXNlY3RvciAgICAgICAgICAgICAgIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciAqCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UCisJICovCisJZnRfc2VnbWVudHNfcGVyX3RyYWNrID0gR0VUMihhZGRyZXNzLCBGVF9TUFQpOworCWZ0X3RyYWNrc19wZXJfdGFwZSAgICA9IGFkZHJlc3NbRlRfVFBDXTsKKwltYXhfZmxvcHB5X3NpZGUgICAgICAgPSBhZGRyZXNzW0ZUX0ZITV07CisJbWF4X2Zsb3BweV90cmFjayAgICAgID0gYWRkcmVzc1tGVF9GVE1dOworCW1heF9mbG9wcHlfc2VjdG9yICAgICA9IGFkZHJlc3NbRlRfRlNNXTsKKwlUUkFDRShmdF90X25vaXNlLCAiKGZtdC9zcHQvdHBjL2ZobS9mdG0vZnNtKSA9ICVkLyVkLyVkLyVkLyVkLyVkIiwKKwkgICAgICBmdF9mb3JtYXRfY29kZSwgZnRfc2VnbWVudHNfcGVyX3RyYWNrLCBmdF90cmFja3NfcGVyX3RhcGUsCisJICAgICAgbWF4X2Zsb3BweV9zaWRlLCBtYXhfZmxvcHB5X3RyYWNrLCBtYXhfZmxvcHB5X3NlY3Rvcik7CisJbmV3X3RhcGVfbGVuID0gZnRhcGVfdGFwZV9sZW47CisJc3dpdGNoIChmdF9mb3JtYXRfY29kZSkgeworCWNhc2UgZm10XzQyNWZ0OgorCQluZXdfdGFwZV9sZW4gPSA0MjU7CisJCWJyZWFrOworCWNhc2UgZm10X25vcm1hbDoKKwkJaWYgKGZ0YXBlX3RhcGVfbGVuID09IDApIHsJLyogb3RoZXJ3aXNlIDMwNyBmdCAqLworCQkJbmV3X3RhcGVfbGVuID0gMjA1OworCQl9CisJCWJyZWFrOworCWNhc2UgZm10XzExMDBmdDoKKwkJbmV3X3RhcGVfbGVuID0gMTEwMDsKKwkJYnJlYWs7CisJY2FzZSBmbXRfdmFyOnsKKwkJCWludCBzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gMTsJCS8qIG5vbi16ZXJvIGRlZmF1bHQgZm9yIHN3aXRjaCAqLworCQkJc3dpdGNoIChmdF9xaWNfc3RkKSB7CisJCQljYXNlIFFJQ19UQVBFX1FJQzQwOgorCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSAzMzI7CisJCQkJYnJlYWs7CisJCQljYXNlIFFJQ19UQVBFX1FJQzgwOgorCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSA0ODg7CisJCQkJYnJlYWs7CisJCQljYXNlIFFJQ19UQVBFX1FJQzMwMTA6CisJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDczMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDMzAyMDoKKwkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gMTQzMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5ld190YXBlX2xlbiA9ICgxMDAwICogZnRfc2VnbWVudHNfcGVyX3RyYWNrICsKKwkJCQkJKHNlZ21lbnRzX3Blcl8xMDAwX2luY2ggLSAxKSkgLyBzZWdtZW50c19wZXJfMTAwMF9pbmNoOworCQkJYnJlYWs7CisJCX0KKwljYXNlIGZtdF9iaWc6eworCQkJaW50IHNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSAxOwkJLyogbm9uLXplcm8gZGVmYXVsdCBmb3Igc3dpdGNoICovCisJCQlzd2l0Y2ggKGZ0X3FpY19zdGQpIHsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDNDA6CisJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDMzMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDODA6CisJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCA9IDQ4ODsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUlDX1RBUEVfUUlDMzAxMDoKKwkJCQlzZWdtZW50c19wZXJfMTAwMF9pbmNoID0gNzMwOworCQkJCWJyZWFrOworCQkJY2FzZSBRSUNfVEFQRV9RSUMzMDIwOgorCQkJCXNlZ21lbnRzX3Blcl8xMDAwX2luY2ggPSAxNDMwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywKKwkJCSIleCBRSUMtc3RhbmRhcmQgd2l0aCBmbXQtY29kZSAlZCwgcGxlYXNlIHJlcG9ydCIsCisJCQkJCSAgICBmdF9xaWNfc3RkLCBmdF9mb3JtYXRfY29kZSk7CisJCQl9CisJCQluZXdfdGFwZV9sZW4gPSAoKDEwMDAgKiBmdF9zZWdtZW50c19wZXJfdHJhY2sgKworCQkJCQkgKHNlZ21lbnRzX3Blcl8xMDAwX2luY2ggLSAxKSkgLyAKKwkJCQkJc2VnbWVudHNfcGVyXzEwMDBfaW5jaCk7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJ1bmtub3duIHRhcGUgZm9ybWF0LCBwbGVhc2UgcmVwb3J0ICEiKTsKKwl9CisJaWYgKG5ld190YXBlX2xlbiAhPSBmdGFwZV90YXBlX2xlbikgeworCQlmdGFwZV90YXBlX2xlbiA9IG5ld190YXBlX2xlbjsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAiY2FsY3VsYXRlZCB0YXBlIGxlbmd0aCBpcyAlZCBmdCIsCisJCSAgICAgIGZ0YXBlX3RhcGVfbGVuKTsKKwkJZnRhcGVfY2FsY190aW1lb3V0cyhmdF9xaWNfc3RkLCBmdF9kYXRhX3JhdGUsIGZ0YXBlX3RhcGVfbGVuKTsKKwl9CisJaWYgKGZ0X3NlZ21lbnRzX3Blcl90cmFjayA9PSAwICYmIGZ0X3RyYWNrc19wZXJfdGFwZSA9PSAwICYmCisJICAgIG1heF9mbG9wcHlfc2lkZSA9PSAwICYmIG1heF9mbG9wcHlfdHJhY2sgPT0gMCAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAwKSB7CisJCS8qICBRSUMtNDAgUmV2IEUgYW5kIGVhcmxpZXIgaGFzIG5vIHZhbHVlcyBpbiB0aGUgaGVhZGVyLgorCQkgKi8KKwkJZnRfc2VnbWVudHNfcGVyX3RyYWNrID0gNjg7CisJCWZ0X3RyYWNrc19wZXJfdGFwZSA9IDIwOworCQltYXhfZmxvcHB5X3NpZGUgPSAxOworCQltYXhfZmxvcHB5X3RyYWNrID0gMTY5OworCQltYXhfZmxvcHB5X3NlY3RvciA9IDEyODsKKwl9CisJLyogIFRoaXMgdGVzdCB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSB3cm9uZyBwYXJhbWV0ZXIgb24gdGFwZXMKKwkgKiAgZm9ybWF0dGVkIGJ5IENvbm5lciBzb2Z0d2FyZS4KKwkgKi8KKwlpZiAoZnRfc2VnbWVudHNfcGVyX3RyYWNrID09IDE1MCAmJgorCSAgICBmdF90cmFja3NfcGVyX3RhcGUgPT0gMjggJiYKKwkgICAgbWF4X2Zsb3BweV9zaWRlID09IDcgJiYKKwkgICAgbWF4X2Zsb3BweV90cmFjayA9PSAxNDkgJiYKKwkgICAgbWF4X2Zsb3BweV9zZWN0b3IgPT0gMTI4KSB7CitUUkFDRShmdF90X2luZm8sICJ0aGUgZmFtb3VzIENPTk5FUiBidWc6IG1heF9mbG9wcHlfc2lkZSBvZmYgYnkgb25lICEiKTsKKwkJbWF4X2Zsb3BweV9zaWRlID0gNjsKKwl9CisJLyogIFRoZXNlIHRlc3RzIHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhlIHdyb25nIHBhcmFtZXRlciBvbiB0YXBlcworCSAqICBmb3JtYXR0ZWQgYnkgQ29tQnl0ZSBXaW5kb3dzIHNvZnR3YXJlLgorCSAqCisJICogIEZpcnN0LCBmb3IgMjA1IGZvb3QgdGFwZXMKKwkgKi8KKwlpZiAoZnRfc2VnbWVudHNfcGVyX3RyYWNrID09IDEwMCAmJgorCSAgICBmdF90cmFja3NfcGVyX3RhcGUgPT0gMjggJiYKKwkgICAgbWF4X2Zsb3BweV9zaWRlID09IDkgJiYKKwkgICAgbWF4X2Zsb3BweV90cmFjayA9PSAxNDkgJiYKKwkgICAgbWF4X2Zsb3BweV9zZWN0b3IgPT0gMTI4KSB7CitUUkFDRShmdF90X2luZm8sICJ0aGUgQ29tQnl0ZSBidWc6IG1heF9mbG9wcHlfc2lkZSBpbmNvcnJlY3QhIik7CisJCW1heF9mbG9wcHlfc2lkZSA9IDQ7CisJfQorCS8qIE5leHQsIGZvciAzMDcgZm9vdCB0YXBlcy4gKi8KKwlpZiAoZnRfc2VnbWVudHNfcGVyX3RyYWNrID09IDE1MCAmJgorCSAgICBmdF90cmFja3NfcGVyX3RhcGUgPT0gMjggJiYKKwkgICAgbWF4X2Zsb3BweV9zaWRlID09IDkgJiYKKwkgICAgbWF4X2Zsb3BweV90cmFjayA9PSAxNDkgJiYKKwkgICAgbWF4X2Zsb3BweV9zZWN0b3IgPT0gMTI4KSB7CitUUkFDRShmdF90X2luZm8sICJ0aGUgQ29tQnl0ZSBidWc6IG1heF9mbG9wcHlfc2lkZSBpbmNvcnJlY3QhIik7CisJCW1heF9mbG9wcHlfc2lkZSA9IDY7CisJfQorCS8qICBUaGlzIHRlc3Qgd2lsbCBjb21wZW5zYXRlIGZvciB0aGUgd3JvbmcgcGFyYW1ldGVyIG9uIHRhcGVzCisJICogIGZvcm1hdHRlZCBieSBDb2xvcmFkbyBXaW5kb3dzIHNvZnR3YXJlLgorCSAqLworCWlmIChmdF9zZWdtZW50c19wZXJfdHJhY2sgPT0gMTUwICYmCisJICAgIGZ0X3RyYWNrc19wZXJfdGFwZSA9PSAyOCAmJgorCSAgICBtYXhfZmxvcHB5X3NpZGUgPT0gNiAmJgorCSAgICBtYXhfZmxvcHB5X3RyYWNrID09IDE1MCAmJgorCSAgICBtYXhfZmxvcHB5X3NlY3RvciA9PSAxMjgpIHsKK1RSQUNFKGZ0X3RfaW5mbywgInRoZSBmYW1vdXMgQ29sb3JhZG8gYnVnOiBtYXhfZmxvcHB5X3RyYWNrIG9mZiBieSBvbmUgISIpOworCQltYXhfZmxvcHB5X3RyYWNrID0gMTQ5OworCX0KKwlmdGFwZV9zZWdtZW50c19wZXJfaGVhZCA9ICgobWF4X2Zsb3BweV9zZWN0b3IvRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgKgorCQkJCSAgIChtYXhfZmxvcHB5X3RyYWNrICsgMSkpOworCS8qICBUaGlzIHRlc3Qgd2lsbCBjb21wZW5zYXRlIGZvciBzb21lIGJ1ZyByZXBvcnRlZCBieSBEaW1hCisJICogIEJyb2Rza3kuICBTZWVtcyB0byBiZSBhIENvbG9yYWRvIGJ1ZywgZWl0aGVyLiAoZnJlZWJlZQorCSAqICBJbWF0aW9uIHRhcGUgc2hpcHBlZCB0b2dldGhlciB3aXRoIENvbG9yYWRvIFQzMDAwCisJICovCisJaWYgKChmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpICYmCisJICAgIGZ0X3RyYWNrc19wZXJfdGFwZSA9PSA1MCAmJgorCSAgICBtYXhfZmxvcHB5X3NpZGUgPT0gNTQgJiYKKwkgICAgbWF4X2Zsb3BweV90cmFjayA9PSAyNTUgJiYKKwkgICAgbWF4X2Zsb3BweV9zZWN0b3IgPT0gMTI4KSB7CitUUkFDRShmdF90X2luZm8sICJ0aGUgZmFtb3VzID8/PyBidWc6IG1heF9mbG9wcHlfdHJhY2sgb2ZmIGJ5IG9uZSAhIik7CisJCW1heF9mbG9wcHlfdHJhY2sgPSAyNTQ7CisJfQorCS8qCisJICogICAgVmVyaWZ5IGRyaXZlX2NvbmZpZ3VyYXRpb24gd2l0aCB0YXBlIHBhcmFtZXRlcnMKKwkgKi8KKwlpZiAoZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgPT0gMCB8fCBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgPT0gMCB8fAorCSAgKChmdF9zZWdtZW50c19wZXJfdHJhY2sgKiBmdF90cmFja3NfcGVyX3RhcGUgLSAxKSAvIGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkCisJICAgIT0gbWF4X2Zsb3BweV9zaWRlKSB8fAorCSAgICAoZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQgLyBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgLSAxICE9IG1heF9mbG9wcHlfdHJhY2spIHx8CisJKGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciAqIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgIT0gbWF4X2Zsb3BweV9zZWN0b3IpCisjaWZkZWYgVEVTVElORworCSAgICB8fCAoKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF92YXIgfHwgZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgJiYgCisJCShtYXhfZmxvcHB5X3RyYWNrICE9IDI1NCB8fCBtYXhfZmxvcHB5X3NlY3RvciAhPSAxMjgpKQorI2VuZGlmCisJICAgKSB7CisJCWNoYXIgc2VncGVyaGVhZHogPSBmdGFwZV9zZWdtZW50c19wZXJfaGVhZCA/ICcgJyA6ICc/JzsKKwkJY2hhciBzZWdwZXJjeWx6ICA9IGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA/ICcgJyA6ICc/JzsKKwkJVFJBQ0UoZnRfdF9lcnIsIlRhcGUgcGFyYW1ldGVycyBpbmNvbnNpc3RlbmN5LCBwbGVhc2UgcmVwb3J0Iik7CisJCVRSQUNFKGZ0X3RfZXJyLCAicmVwb3J0ZWQgPSAlZC8lZC8lZC8lZC8lZC8lZCIsCisJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlLAorCQkgICAgICBmdF9zZWdtZW50c19wZXJfdHJhY2ssCisJCSAgICAgIGZ0X3RyYWNrc19wZXJfdGFwZSwKKwkJICAgICAgbWF4X2Zsb3BweV9zaWRlLAorCQkgICAgICBtYXhfZmxvcHB5X3RyYWNrLAorCQkgICAgICBtYXhfZmxvcHB5X3NlY3Rvcik7CisJCVRSQUNFKGZ0X3RfZXJyLCAicmVxdWlyZWQgPSAlZC8lZC8lZC8lZCVjLyVkJWMvJWQiLAorCQkgICAgICBmdF9mb3JtYXRfY29kZSwKKwkJICAgICAgZnRfc2VnbWVudHNfcGVyX3RyYWNrLAorCQkgICAgICBmdF90cmFja3NfcGVyX3RhcGUsCisJCSAgICAgIGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkID8KKwkJICAgICAgKChmdF9zZWdtZW50c19wZXJfdHJhY2sgKiBmdF90cmFja3NfcGVyX3RhcGUgLTEpIC8gCisJCSAgICAgICBmdGFwZV9zZWdtZW50c19wZXJfaGVhZCApIDoKKwkJCShmdF9zZWdtZW50c19wZXJfdHJhY2sgKiBmdF90cmFja3NfcGVyX3RhcGUgLTEpLAorCQkJc2VncGVyaGVhZHosCisJCSAgICAgIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlciA/CisJCSAgICAgIChmdGFwZV9zZWdtZW50c19wZXJfaGVhZCAvIAorCQkgICAgICAgZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyIC0gMSApIDoKKwkJCWZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkIC0gMSwKKwkJCXNlZ3BlcmN5bHosCisJCSAgICAgIChmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIgKiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKSk7CisJCVRSQUNFX0VYSVQgLUVJTzsKKwl9CisJZnRhcGVfZXh0cmFjdF9iYWRfc2VjdG9yX21hcChhZGRyZXNzKTsKKyAJVFJBQ0VfRVhJVCAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5Zjk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1yZWFkLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBfRlRBUEVfUkVBRF9ICisjZGVmaW5lIF9GVEFQRV9SRUFEX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjIyICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWFkIGZ1bmN0aW9ucworICogICAgICBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKi8KKworLyogICAgICBmdGFwZS1yZWFkLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCit0eXBlZGVmIGVudW0geworCUZUX1JEX1NJTkdMRSA9IDAsCisJRlRfUkRfQUhFQUQgID0gMSwKK30gZnRfcmVhZF9tb2RlX3Q7CisKK2V4dGVybiBpbnQgZnRhcGVfcmVhZF9oZWFkZXJfc2VnbWVudChfX3U4ICphZGRyZXNzKTsKK2V4dGVybiBpbnQgZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KF9fdTggKmFkZHJlc3MpOworZXh0ZXJuIGludCBmdGFwZV9yZWFkX3NlZ21lbnRfZnJhY3Rpb24oY29uc3QgaW50IHNlZ21lbnQsCisJCQkJICAgICAgIHZvaWQgICphZGRyZXNzLCAKKwkJCQkgICAgICAgY29uc3QgZnRfcmVhZF9tb2RlX3QgcmVhZF9tb2RlLAorCQkJCSAgICAgICBjb25zdCBpbnQgc3RhcnQsCisJCQkJICAgICAgIGNvbnN0IGludCBzaXplKTsKKyNkZWZpbmUgZnRhcGVfcmVhZF9zZWdtZW50KHNlZ21lbnQsIGFkZHJlc3MsIHJlYWRfbW9kZSkJCQlcCisJZnRhcGVfcmVhZF9zZWdtZW50X2ZyYWN0aW9uKHNlZ21lbnQsIGFkZHJlc3MsIHJlYWRfbW9kZSwJXAorCQkJCSAgICAwLCBGVF9TRUdNRU5UX1NJWkUpCitleHRlcm4gdm9pZCBmdGFwZV96YXBfcmVhZF9idWZmZXJzKHZvaWQpOworCisjZW5kaWYJCQkJLyogX0ZUQVBFX1JFQURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJ3LmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ2ZGMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJ3LmMKQEAgLTAsMCArMSwxMDkyIEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJ3LmMsdiAkCisgKiAkUmV2aXNpb246IDEuNyAkCisgKiAkRGF0ZTogMTk5Ny8xMC8yOCAxNDoyNjo0OSAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBjb21tb24gY29kZSBmb3IgdGhlIHNlZ21lbnQgcmVhZCBhbmQKKyAqICAgICAgc2VnbWVudCB3cml0ZSByb3V0aW5lcyBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvcgorICogICAgICBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWVjYy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCitpbnQgZnRfbnJfYnVmZmVyczsKK2J1ZmZlcl9zdHJ1Y3QgKmZ0X2J1ZmZlcltGVF9NQVhfTlJfQlVGRkVSU107CitzdGF0aWMgdm9sYXRpbGUgaW50IGZ0X2hlYWQ7CitzdGF0aWMgdm9sYXRpbGUgaW50IGZ0X3RhaWw7CS8qIG5vdCB2b2xhdGlsZSBidXQgbmVlZCBzYW1lIHR5cGUgYXMgaGVhZCAqLworaW50IGZkY19zZXR1cF9lcnJvcjsKK2xvY2F0aW9uX3JlY29yZCBmdF9sb2NhdGlvbiA9IHstMSwgMH07Cit2b2xhdGlsZSBpbnQgZnRhcGVfdGFwZV9ydW5uaW5nOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBpbnQgb3ZlcnJ1bl9jb3VudF9vZmZzZXQ7CitzdGF0aWMgaW50IGluaGliaXRfY29ycmVjdGlvbjsKKworLyogIG1heG1pbWFsIGFsbG93ZWQgb3ZlcnNob290IHdoZW4gZmFzdCBzZWVraW5nCisgKi8KKyNkZWZpbmUgT1ZFUlNIT09UX0xJTUlUIDEwCisKKy8qICAgICAgSW5jcmVtZW50IGN5Y2xpYyBidWZmZXIgbnIuCisgKi8KK2J1ZmZlcl9zdHJ1Y3QgKmZ0YXBlX25leHRfYnVmZmVyKGZ0X2J1ZmZlcl9xdWV1ZV90IHBvcykKK3sKKwlzd2l0Y2ggKHBvcykgeworCWNhc2UgZnRfcXVldWVfaGVhZDoKKwkJaWYgKCsrZnRfaGVhZCA+PSBmdF9ucl9idWZmZXJzKSB7CisJCQlmdF9oZWFkID0gMDsKKwkJfQorCQlyZXR1cm4gZnRfYnVmZmVyW2Z0X2hlYWRdOworCWNhc2UgZnRfcXVldWVfdGFpbDoKKwkJaWYgKCsrZnRfdGFpbCA+PSBmdF9ucl9idWZmZXJzKSB7CisJCQlmdF90YWlsID0gMDsKKwkJfQorCQlyZXR1cm4gZnRfYnVmZmVyW2Z0X3RhaWxdOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KK2ludCBmdGFwZV9idWZmZXJfaWQoZnRfYnVmZmVyX3F1ZXVlX3QgcG9zKQoreworCXN3aXRjaChwb3MpIHsKKwljYXNlIGZ0X3F1ZXVlX2hlYWQ6IHJldHVybiBmdF9oZWFkOworCWNhc2UgZnRfcXVldWVfdGFpbDogcmV0dXJuIGZ0X3RhaWw7CisJZGVmYXVsdDogcmV0dXJuIC0xOworCX0KK30KK2J1ZmZlcl9zdHJ1Y3QgKmZ0YXBlX2dldF9idWZmZXIoZnRfYnVmZmVyX3F1ZXVlX3QgcG9zKQoreworCXN3aXRjaChwb3MpIHsKKwljYXNlIGZ0X3F1ZXVlX2hlYWQ6IHJldHVybiBmdF9idWZmZXJbZnRfaGVhZF07CisJY2FzZSBmdF9xdWV1ZV90YWlsOiByZXR1cm4gZnRfYnVmZmVyW2Z0X3RhaWxdOworCWRlZmF1bHQ6IHJldHVybiBOVUxMOworCX0KK30KK3ZvaWQgZnRhcGVfcmVzZXRfYnVmZmVyKHZvaWQpCit7CisJZnRfaGVhZCA9IGZ0X3RhaWwgPSAwOworfQorCitidWZmZXJfc3RhdGVfZW51bSBmdGFwZV9zZXRfc3RhdGUoYnVmZmVyX3N0YXRlX2VudW0gbmV3X3N0YXRlKQoreworCWJ1ZmZlcl9zdGF0ZV9lbnVtIG9sZF9zdGF0ZSA9IGZ0X2RyaXZlcl9zdGF0ZTsKKworCWZ0X2RyaXZlcl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwlyZXR1cm4gb2xkX3N0YXRlOworfQorLyogICAgICBDYWxjdWxhdGUgRmxvcHB5IERpc2sgQ29udHJvbGxlciBhbmQgRE1BIHBhcmFtZXRlcnMgZm9yIGEgc2VnbWVudC4KKyAqICAgICAgaGVhZDogICBzZWxlY3RzIGJ1ZmZlciBzdHJ1Y3QgaW4gYXJyYXkuCisgKiAgICAgIG9mZnNldDogbnVtYmVyIG9mIHBoeXNpY2FsIHNlY3RvcnMgdG8gc2tpcCAoaW5jbHVkaW5nIGJhZCBvbmVzKS4KKyAqICAgICAgY291bnQ6ICBudW1iZXIgb2YgcGh5c2ljYWwgc2VjdG9ycyB0byBoYW5kbGUgKGluY2x1ZGluZyBiYWQgb25lcykuCisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfc2VnbWVudChidWZmZXJfc3RydWN0ICogYnVmZiwgCisJCQkgaW50IHNlZ21lbnRfaWQsCisJCQkgdW5zaWduZWQgaW50IHNlY3Rvcl9vZmZzZXQsIAorCQkJIHVuc2lnbmVkIGludCBzZWN0b3JfY291bnQsIAorCQkJIGludCByZXRyeSkKK3sKKwlTZWN0b3JNYXAgb2Zmc2V0X21hc2s7CisJU2VjdG9yTWFwIG1hc2s7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWJ1ZmYtPnNlZ21lbnRfaWQgPSBzZWdtZW50X2lkOworCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQgPSBzZWN0b3Jfb2Zmc2V0OworCWJ1ZmYtPnJlbWFpbmluZyA9IHNlY3Rvcl9jb3VudDsKKwlidWZmLT5oZWFkID0gc2VnbWVudF9pZCAvIGZ0YXBlX3NlZ21lbnRzX3Blcl9oZWFkOworCWJ1ZmYtPmN5bCA9IChzZWdtZW50X2lkICUgZnRhcGVfc2VnbWVudHNfcGVyX2hlYWQpIC8gZnRhcGVfc2VnbWVudHNfcGVyX2N5bGluZGVyOworCWJ1ZmYtPnNlY3QgPSAoc2VnbWVudF9pZCAlIGZ0YXBlX3NlZ21lbnRzX3Blcl9jeWxpbmRlcikgKiBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UICsgMTsKKwlidWZmLT5kZWxldGVkID0gMDsKKwlvZmZzZXRfbWFzayA9ICgxIDw8IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQpIC0gMTsKKwltYXNrID0gZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudF9pZCkgJiBvZmZzZXRfbWFzazsKKwl3aGlsZSAobWFzaykgeworCQlpZiAobWFzayAmIDEpIHsKKwkJCW9mZnNldF9tYXNrID4+PSAxOwkvKiBkb24ndCBjb3VudCBiYWQgc2VjdG9yICovCisJCX0KKwkJbWFzayA+Pj0gMTsKKwl9CisJYnVmZi0+ZGF0YV9vZmZzZXQgPSBjb3VudF9vbmVzKG9mZnNldF9tYXNrKTsJLyogZ29vZCBzZWN0b3JzIHRvIHNraXAgKi8KKwlidWZmLT5wdHIgPSBidWZmLT5hZGRyZXNzICsgYnVmZi0+ZGF0YV9vZmZzZXQgKiBGVF9TRUNUT1JfU0laRTsKKwlUUkFDRShmdF90X2Zsb3csICJkYXRhIG9mZnNldCA9ICVkIHNlY3RvcnMiLCBidWZmLT5kYXRhX29mZnNldCk7CisJaWYgKHJldHJ5KSB7CisJCWJ1ZmYtPnNvZnRfZXJyb3JfbWFwICY9IG9mZnNldF9tYXNrOwkvKiBrZWVwIHNraXBwZWQgcGFydCAqLworCX0gZWxzZSB7CisJCWJ1ZmYtPmhhcmRfZXJyb3JfbWFwID0gYnVmZi0+c29mdF9lcnJvcl9tYXAgPSAwOworCX0KKwlidWZmLT5iYWRfc2VjdG9yX21hcCA9IGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KGJ1ZmYtPnNlZ21lbnRfaWQpOworCWlmIChidWZmLT5iYWRfc2VjdG9yX21hcCAhPSAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJzZWdtZW50OiAlZCwgYmFkIHNlY3RvciBtYXA6ICUwOGx4IiwKKwkJCWJ1ZmYtPnNlZ21lbnRfaWQsIChsb25nKWJ1ZmYtPmJhZF9zZWN0b3JfbWFwKTsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X2Zsb3csICJzZWdtZW50OiAlZCIsIGJ1ZmYtPnNlZ21lbnRfaWQpOworCX0KKwlpZiAoYnVmZi0+c2VjdG9yX29mZnNldCA+IDApIHsKKwkJYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPj49IGJ1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJfQorCWlmIChidWZmLT5zZWN0b3Jfb2Zmc2V0ICE9IDAgfHwgYnVmZi0+cmVtYWluaW5nICE9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAic2VjdG9yIG9mZnNldCA9ICVkLCBjb3VudCA9ICVkIiwKKwkJCWJ1ZmYtPnNlY3Rvcl9vZmZzZXQsIGJ1ZmYtPnJlbWFpbmluZyk7CisJfQorCS8qICAgIFNlZ21lbnRzIHdpdGggMyBvciBsZXNzIHNlY3RvcnMgYXJlIG5vdCB3cml0dGVuIHdpdGggdmFsaWQKKwkgKiAgICBkYXRhIGJlY2F1c2UgdGhlcmUgaXMgbm8gc3BhY2UgbGVmdCBmb3IgdGhlIGVjYy4gIFRoZQorCSAqICAgIGRhdGEgd3JpdHRlbiBpcyB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIGluIHRoZSBidWZmZXIuCisJICogICAgUmVhZGluZyBzdWNoIGEgc2VnbWVudCB3aWxsIHJldHVybiBhIHplcm8gYnl0ZS1jb3VudC4KKwkgKiAgICBUbyBhbGxvdyB1cyB0byByZWFkL3dyaXRlIHNlZ21lbnRzIHdpdGggYWxsIGJhZCBzZWN0b3JzCisJICogICAgd2UgZmFrZSBvbmUgcmVhZGFibGUgc2VjdG9yIGluIHRoZSBzZWdtZW50LiBUaGlzCisJICogICAgcHJldmVudHMgaGF2aW5nIHRvIGhhbmRsZSB0aGVzZSBzZWdtZW50cyBpbiBhIHZlcnkKKwkgKiAgICBzcGVjaWFsIHdheS4gIEl0IGlzIG5vdCBpbXBvcnRhbnQgaWYgdGhlIHJlYWRpbmcgb2YgdGhpcworCSAqICAgIGJhZCBzZWN0b3IgZmFpbHMgb3Igbm90ICh0aGUgZGF0YSBpcyBpZ25vcmVkKS4gSXQgaXMKKwkgKiAgICBvbmx5IHJlYWQgdG8ga2VlcCB0aGUgZHJpdmVyIHJ1bm5pbmcuCisJICoKKwkgKiAgICBUaGUgUUlDLTQwLzgwIHNwZWMuIGhhcyBubyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaGFuZGxlCisJICogICAgdGhpcyBjYXNlLCBzbyB0aGlzIGlzIG15IGludGVycHJldGF0aW9uLiAgCisJICovCisJaWYgKGJ1ZmYtPmJhZF9zZWN0b3JfbWFwID09IEVNUFRZX1NFR01FTlQpIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAiZW1wdHkgc2VnbWVudCAlZCwgZmFrZSBmaXJzdCBzZWN0b3IgZ29vZCIsCisJCSAgICAgIGJ1ZmYtPnNlZ21lbnRfaWQpOworCQlpZiAoYnVmZi0+cHRyICE9IGJ1ZmYtPmFkZHJlc3MpIHsKKwkJCVRSQUNFKGZ0X3RfYnVnLCAiVGhpcyBpcyBhIGJ1ZzogJXAvJXAiLAorCQkJICAgICAgYnVmZi0+cHRyLCBidWZmLT5hZGRyZXNzKTsKKwkJfQorCQlidWZmLT5iYWRfc2VjdG9yX21hcCA9IEZBS0VfU0VHTUVOVDsKKwl9CisJZmRjX3NldHVwX2Vycm9yID0gMDsKKwlidWZmLT5uZXh0X3NlZ21lbnQgPSBzZWdtZW50X2lkICsgMTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICAgICAgQ2FsY3VsYXRlIEZsb3BweSBEaXNrIENvbnRyb2xsZXIgYW5kIERNQSBwYXJhbWV0ZXJzIGZvciBhIG5ldyBzZWdtZW50LgorICovCitpbnQgZnRhcGVfc2V0dXBfbmV3X3NlZ21lbnQoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYsIGludCBzZWdtZW50X2lkLCBpbnQgc2tpcCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdGF0aWMgaW50IG9sZF9zZWdtZW50X2lkID0gLTE7CisJc3RhdGljIGJ1ZmZlcl9zdGF0ZV9lbnVtIG9sZF9mdF9kcml2ZXJfc3RhdGUgPSBpZGxlOworCWludCByZXRyeSA9IDA7CisJdW5zaWduZWQgb2Zmc2V0ID0gMDsKKwlpbnQgY291bnQgPSBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9mbG93LCAiJXMgc2VnbWVudCAlZCAob2xkID0gJWQpIiwKKwkgICAgICAoZnRfZHJpdmVyX3N0YXRlID09IHJlYWRpbmcgfHwgZnRfZHJpdmVyX3N0YXRlID09IHZlcmlmeWluZykgCisJICAgICAgPyAicmVhZGluZyIgOiAid3JpdGluZyIsCisJICAgICAgc2VnbWVudF9pZCwgb2xkX3NlZ21lbnRfaWQpOworCWlmIChmdF9kcml2ZXJfc3RhdGUgIT0gb2xkX2Z0X2RyaXZlcl9zdGF0ZSkgewkvKiB3aGVuIHZlcmlmeWluZyAqLworCQlvbGRfc2VnbWVudF9pZCA9IC0xOworCQlvbGRfZnRfZHJpdmVyX3N0YXRlID0gZnRfZHJpdmVyX3N0YXRlOworCX0KKwlpZiAoc2VnbWVudF9pZCA9PSBvbGRfc2VnbWVudF9pZCkgeworCQkrK2J1ZmYtPnJldHJ5OworCQkrK2Z0X2hpc3RvcnkucmV0cmllczsKKwkJVFJBQ0UoZnRfdF9mbG93LCAic2V0dGluZyB1cCBmb3IgcmV0cnkgbnIgJWQiLCBidWZmLT5yZXRyeSk7CisJCXJldHJ5ID0gMTsKKwkJaWYgKHNraXAgJiYgYnVmZi0+c2tpcCA+IDApIHsJLyogYWxsb3cgc2tpcCBvbiByZXRyeSAqLworCQkJb2Zmc2V0ID0gYnVmZi0+c2tpcDsKKwkJCWNvdW50IC09IG9mZnNldDsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInNraXBwaW5nICVkIHNlY3RvcnMiLCBvZmZzZXQpOworCQl9CisJfSBlbHNlIHsKKwkJYnVmZi0+cmV0cnkgPSAwOworCQlidWZmLT5za2lwID0gMDsKKwkJb2xkX3NlZ21lbnRfaWQgPSBzZWdtZW50X2lkOworCX0KKwlyZXN1bHQgPSBzZXR1cF9zZWdtZW50KGJ1ZmYsIHNlZ21lbnRfaWQsIG9mZnNldCwgY291bnQsIHJldHJ5KTsKKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICBEZXRlcm1pbmUgc2l6ZSBvZiBuZXh0IGNsdXN0ZXIgb2YgZ29vZCBzZWN0b3JzLgorICovCitpbnQgZnRhcGVfY2FsY19uZXh0X2NsdXN0ZXIoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYpCit7CisJLyogU2tpcCBiYWQgc2VjdG9ycy4KKwkgKi8KKwl3aGlsZSAoYnVmZi0+cmVtYWluaW5nID4gMCAmJiAoYnVmZi0+YmFkX3NlY3Rvcl9tYXAgJiAxKSAhPSAwKSB7CisJCWJ1ZmYtPmJhZF9zZWN0b3JfbWFwID4+PSAxOworCQkrK2J1ZmYtPnNlY3Rvcl9vZmZzZXQ7CisJCS0tYnVmZi0+cmVtYWluaW5nOworCX0KKwkvKiBGaW5kIG5leHQgY2x1c3RlciBvZiBnb29kIHNlY3RvcnMKKwkgKi8KKwlpZiAoYnVmZi0+YmFkX3NlY3Rvcl9tYXAgPT0gMCkgewkvKiBzcGVlZCB1cCAqLworCQlidWZmLT5zZWN0b3JfY291bnQgPSBidWZmLT5yZW1haW5pbmc7CisJfSBlbHNlIHsKKwkJU2VjdG9yTWFwIG1hcCA9IGJ1ZmYtPmJhZF9zZWN0b3JfbWFwOworCisJCWJ1ZmYtPnNlY3Rvcl9jb3VudCA9IDA7CisJCXdoaWxlIChidWZmLT5zZWN0b3JfY291bnQgPCBidWZmLT5yZW1haW5pbmcgJiYgKG1hcCAmIDEpID09IDApIHsKKwkJCSsrYnVmZi0+c2VjdG9yX2NvdW50OworCQkJbWFwID4+PSAxOworCQl9CisJfQorCXJldHVybiBidWZmLT5zZWN0b3JfY291bnQ7Cit9CisKKy8qICBpZiBqdXN0IHBhc3NlZCB0aGUgbGFzdCBzZWdtZW50IG9uIGEgdHJhY2ssIHdhaXQgZm9yIEJPVAorICogIG9yIEVPVCBtYXJrLgorICovCitpbnQgZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBsb2dpY2FsX2VvdCkgeworCQlpbnQgc3RhdHVzOworCisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlIGF0IGxvZ2ljYWwgRU9UIik7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5zZWVrLCAmc3RhdHVzKSwpOworCQlpZiAoKHN0YXR1cyAmIChRSUNfU1RBVFVTX0FUX0JPVCB8IFFJQ19TVEFUVVNfQVRfRU9UKSkgPT0gMCkgeworCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsICJlb3QvYm90IG5vdCByZWFjaGVkIik7CisJCX0KKwkJZnRfcnVubmVyX3N0YXR1cyA9IGVuZF9vZl90YXBlOworCX0KKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBlbmRfb2ZfdGFwZSkgeworCQlUUkFDRShmdF90X25vaXNlLCAicnVubmVyIHN0b3BwZWQgYmVjYXVzZSBvZiBsb2dpY2FsIEVPVCIpOworCQlmdF9ydW5uZXJfc3RhdHVzID0gaWRsZTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2JvdF9lb3QoaW50IHN0YXR1cykKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChzdGF0dXMgJiAoUUlDX1NUQVRVU19BVF9CT1QgfCBRSUNfU1RBVFVTX0FUX0VPVCkpIHsKKwkJZnRfbG9jYXRpb24uYm90ID0gKChmdF9sb2NhdGlvbi50cmFjayAmIDEpID09IDAgPworCQkJCShzdGF0dXMgJiBRSUNfU1RBVFVTX0FUX0JPVCkgIT0gMDoKKwkJCQkoc3RhdHVzICYgUUlDX1NUQVRVU19BVF9FT1QpICE9IDApOworCQlmdF9sb2NhdGlvbi5lb3QgPSAhZnRfbG9jYXRpb24uYm90OworCQlmdF9sb2NhdGlvbi5zZWdtZW50ID0gKGZ0X2xvY2F0aW9uLnRyYWNrICsKKwkJCShmdF9sb2NhdGlvbi5ib3QgPyAwIDogMSkpICogZnRfc2VnbWVudHNfcGVyX3RyYWNrIC0gMTsKKwkJZnRfbG9jYXRpb24uc2VjdG9yID0gLTE7CisJCWZ0X2xvY2F0aW9uLmtub3duICA9IDE7CisJCVRSQUNFKGZ0X3RfZmxvdywgInRhcGUgYXQgbG9naWNhbCAlcyIsCisJCSAgICAgIGZ0X2xvY2F0aW9uLmJvdCA/ICJib3QiIDogImVvdCIpOworCQlUUkFDRShmdF90X2Zsb3csICJzZWdtZW50ID0gJWQiLCBmdF9sb2NhdGlvbi5zZWdtZW50KTsKKwl9IGVsc2UgeworCQlmdF9sb2NhdGlvbi5rbm93biA9IDA7CisJfQorCVRSQUNFX0VYSVQgZnRfbG9jYXRpb24ua25vd247Cit9CisKKy8qICAgICAgUmVhZCBJZCBvZiBmaXJzdCBzZWN0b3IgcGFzc2luZyB0YXBlIGhlYWQuCisgKi8KK3N0YXRpYyBpbnQgZnRhcGVfcmVhZF9pZCh2b2lkKQoreworCWludCBzdGF0dXM7CisJX191OCBvdXRbMl07CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCS8qIEFzc3VtZSB0YXBlIGlzIHJ1bm5pbmcgb24gZW50cnksIGJlIGFibGUgdG8gaGFuZGxlCisJICogc2l0dWF0aW9uIHdoZXJlIGl0IHN0b3BwZWQgb3IgaXMgc3RvcHBpbmcuCisJICovCisJZnRfbG9jYXRpb24ua25vd24gPSAwOwkvKiBkZWZhdWx0IGlzIGxvY2F0aW9uIG5vdCBrbm93biAqLworCW91dFswXSA9IEZEQ19SRUFESUQ7CisJb3V0WzFdID0gZnRfZHJpdmVfc2VsOworCVRSQUNFX0NBVENIKGZkY19jb21tYW5kKG91dCwgMiksKTsKKwlzd2l0Y2ggKGZkY19pbnRlcnJ1cHRfd2FpdCgyMCAqIEZUX1NFQ09ORCkpIHsKKwljYXNlIDA6CisJCWlmIChmZGNfc2VjdCA9PSAwKSB7CisJCQlpZiAoZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1cygmc3RhdHVzKSA+PSAwICYmCisJCQkgICAgKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpKSB7CisJCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKKwkJCQlUUkFDRShmdF90X2Zsb3csICJ0YXBlIGhhcyBzdG9wcGVkIik7CisJCQkJY2hlY2tfYm90X2VvdChzdGF0dXMpOworCQkJfQorCQl9IGVsc2UgeworCQkJZnRfbG9jYXRpb24ua25vd24gPSAxOworCQkJZnRfbG9jYXRpb24uc2VnbWVudCA9IChmdGFwZV9zZWdtZW50c19wZXJfaGVhZAorCQkJCQkgICAgICAgKiBmZGNfaGVhZAorCQkJCQkgICAgICAgKyBmdGFwZV9zZWdtZW50c19wZXJfY3lsaW5kZXIKKwkJCQkJICAgICAgICogZmRjX2N5bAorCQkJCQkgICAgICAgKyAoZmRjX3NlY3QgLSAxKQorCQkJCQkgICAgICAgLyBGVF9TRUNUT1JTX1BFUl9TRUdNRU5UKTsKKwkJCWZ0X2xvY2F0aW9uLnNlY3RvciA9ICgoZmRjX3NlY3QgLSAxKQorCQkJCQkgICAgICAlIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQpOworCQkJZnRfbG9jYXRpb24uZW90ID0gZnRfbG9jYXRpb24uYm90ID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIC1FVElNRToKKwkJLyogIERpZG4ndCBmaW5kIGlkIG9uIHRhcGUsIG11c3QgYmUgbmVhciBlbmQ6IFdhaXQKKwkJICogIHVudGlsIHN0b3BwZWQuCisJCSAqLworCQlpZiAoZnRhcGVfcmVhZHlfd2FpdChGVF9GT1JFVkVSLCAmc3RhdHVzKSA+PSAwKSB7CisJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQkJVFJBQ0UoZnRfdF9mbG93LCAidGFwZSBoYXMgc3RvcHBlZCIpOworCQkJY2hlY2tfYm90X2VvdChzdGF0dXMpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qICBJbnRlcnJ1cHRlZCBvciBvdGhlcndpc2UgZmFpbGluZworCQkgKiAgZmRjX2ludGVycnVwdF93YWl0KCkgCisJCSAqLworCQlUUkFDRShmdF90X2VyciwgImZkY19pbnRlcnJ1cHRfd2FpdCBmYWlsZWQiKTsKKwkJYnJlYWs7CisJfQorCWlmICghZnRfbG9jYXRpb24ua25vd24pIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9mbG93LCAibm8gaWQgZm91bmQiKTsKKwl9CisJaWYgKGZ0X2xvY2F0aW9uLnNlY3RvciA9PSAwKSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgInBhc3Npbmcgc2VnbWVudCAlZC8lZCIsCisJCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3Rvcik7CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9mZGNfZG1hLCAicGFzc2luZyBzZWdtZW50ICVkLyVkIiwKKwkJICAgICAgZnRfbG9jYXRpb24uc2VnbWVudCwgZnRfbG9jYXRpb24uc2VjdG9yKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IGxvZ2ljYWxfZm9yd2FyZCh2b2lkKQoreworCWZ0YXBlX3RhcGVfcnVubmluZyA9IDE7CisJcmV0dXJuIGZ0YXBlX2NvbW1hbmQoUUlDX0xPR0lDQUxfRk9SV0FSRCk7Cit9CisKK2ludCBmdGFwZV9zdG9wX3RhcGUoaW50ICpwc3RhdHVzKQoreworCWludCByZXRyeSA9IDA7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWRvIHsKKwkJcmVzdWx0ID0gZnRhcGVfY29tbWFuZF93YWl0KFFJQ19TVE9QX1RBUEUsCisJCQkJCSAgICBmdGFwZV90aW1lb3V0LnN0b3AsIHBzdGF0dXMpOworCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCWlmICgoKnBzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSA9PSAwKSB7CisJCQkJcmVzdWx0ID0gLUVJTzsKKwkJCX0gZWxzZSB7CisJCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKHJlc3VsdCA8IDAgJiYgKytyZXRyeSA8PSAzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlUUkFDRShmdF90X2VyciwgImZhaWxlZCAhIChmYXRhbCkiKTsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK2ludCBmdGFwZV9kdW1iX3N0b3Aodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCWludCBzdGF0dXM7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwkvKiAgQWJvcnQgY3VycmVudCBmZGMgb3BlcmF0aW9uIGlmIGl0J3MgYnVzeSAocHJvYmFibHkgcmVhZAorCSAqICBvciB3cml0ZSBvcGVyYXRpb24gcGVuZGluZykgd2l0aCBhIHJlc2V0LgorCSAqLworCWlmIChmZGNfcmVhZHlfd2FpdCgxMDAgLyogdXNlYyAqLykgPCAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJhYm9ydGluZyBmZGMgb3BlcmF0aW9uIik7CisJCWZkY19yZXNldCgpOworCX0KKwkvKiAgUmVhZGluZyBpZCdzIGFmdGVyIHRoZSBsYXN0IHNlZ21lbnQgb24gYSB0cmFjayBtYXkgZmFpbAorCSAqICBidXQgZXZlbnR1YWxseSB0aGUgZHJpdmUgd2lsbCBiZWNvbWUgcmVhZHkgKGxvZ2ljYWwgZW90KS4KKwkgKi8KKwlyZXN1bHQgPSBmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpOworCWZ0X2xvY2F0aW9uLmtub3duID0gMDsKKwlkbyB7CisJCWlmIChyZXN1bHQgPT0gMCAmJiBzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSB7CisJCQkvKiBUYXBlIGlzIG5vdCBydW5uaW5nIGFueSBtb3JlLgorCQkJICovCisJCQlUUkFDRShmdF90X25vaXNlLCAidGFwZSBhbHJlYWR5IGhhbHRlZCIpOworCQkJY2hlY2tfYm90X2VvdChzdGF0dXMpOworCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKKwkJfSBlbHNlIGlmIChmdGFwZV90YXBlX3J1bm5pbmcpIHsKKwkJCS8qICBUYXBlIGlzICh3YXMpIHN0aWxsIG1vdmluZy4KKwkJCSAqLworI2lmZGVmIFRFU1RJTkcKKwkJCWZ0YXBlX3JlYWRfaWQoKTsKKyNlbmRpZgorCQkJcmVzdWx0ID0gZnRhcGVfc3RvcF90YXBlKCZzdGF0dXMpOworCQl9IGVsc2UgeworCQkJLyogIFRhcGUgbm90IHlldCByZWFkeSBidXQgc3RvcHBlZC4KKwkJCSAqLworCQkJcmVzdWx0ID0gZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnBhdXNlLCZzdGF0dXMpOworCQl9CisJfSB3aGlsZSAoZnRhcGVfdGFwZV9ydW5uaW5nCisJCSAmJiAhKHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX05FVkVSX0JMT0NLKSkpOworI2lmbmRlZiBURVNUSU5HCisJZnRfbG9jYXRpb24ua25vd24gPSAwOworI2VuZGlmCisJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgPT0gYWJvcnRpbmcgfHwgZnRfcnVubmVyX3N0YXR1cyA9PSBkb19hYm9ydCkgeworCQlmdF9ydW5uZXJfc3RhdHVzID0gaWRsZTsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qICAgICAgV2FpdCB1bnRpbCBydW5uZXIgaGFzIGZpbmlzaGVkIHRhaWwgYnVmZmVyLgorICoKKyAqLworaW50IGZ0YXBlX3dhaXRfc2VnbWVudChidWZmZXJfc3RhdGVfZW51bSBzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzOworCWludCByZXN1bHQgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJd2hpbGUgKGZ0X2J1ZmZlcltmdF90YWlsXS0+c3RhdHVzID09IHN0YXRlKSB7CisJCVRSQUNFKGZ0X3RfZmxvdywgInN0YXRlOiAlZCIsIGZ0X2J1ZmZlcltmdF90YWlsXS0+c3RhdHVzKTsKKwkJLyogIEZpcnN0IGJ1ZmZlciBzdGlsbCBiZWluZyB3b3JrZWQgb24sIHdhaXQgdXAgdG8gdGltZW91dC4KKwkJICoKKwkJICogIE5vdGU6IHdlIGNoZWNrIHR3byB0aW1lcyBmb3IgYmVpbmcga2lsbGVkLiA1MAorCQkgKiAgc2Vjb25kcyBhcmUgcXVpdGUgbG9uZy4gTm90ZSB0aGF0CisJCSAqICBmZGNfaW50ZXJydXB0X3dhaXQoKSBpcyBub3Qga2lsbGFibGUgYnkgYW55CisJCSAqICBtZWFucy4gZnRhcGVfcmVhZF9zZWdtZW50KCkgd2FudHMgdXMgdG8gcmV0dXJuCisJCSAqICAtRUlOVFIgaW4gY2FzZSBvZiBhIHNpZ25hbC4gIAorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQlyZXN1bHQgPSBmZGNfaW50ZXJydXB0X3dhaXQoNTAgKiBGVF9TRUNPTkQpOworCQlGVF9TSUdOQUxfRVhJVChfRE9OVF9CTE9DSyk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlUUkFDRV9BQk9SVChyZXN1bHQsCisJCQkJICAgIGZ0X3RfZXJyLCAiZmRjX2ludGVycnVwdF93YWl0IGZhaWxlZCIpOworCQl9CisJCWlmIChmZGNfc2V0dXBfZXJyb3IpIHsKKwkJCS8qIHJlY292ZXIuLi4gRklYTUUgKi8KKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAic2V0dXAgZXJyb3IiKTsKKwkJfQorCX0KKwlpZiAoZnRfYnVmZmVyW2Z0X3RhaWxdLT5zdGF0dXMgIT0gZXJyb3IpIHsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLCk7CisJVFJBQ0UoZnRfdF9ub2lzZSwgImZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXM6IDB4JTAyeCIsIHN0YXR1cyk7CisJaWYgKChzdGF0dXMgJiBRSUNfU1RBVFVTX1JFQURZKSAmJiAKKwkgICAgKHN0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpKSB7CisJCXVuc2lnbmVkIGludCBlcnJvcjsKKwkJcWljMTE3X2NtZF90IGNvbW1hbmQ7CisJCQorCQkvKiAgUmVwb3J0IGFuZCBjbGVhciBlcnJvciBzdGF0ZS4KKwkJICogIEluIGNhc2UgdGhlIGRyaXZlIGNhbid0IG9wZXJhdGUgYXQgdGhlIHNlbGVjdGVkCisJCSAqICByYXRlLCBzZWxlY3QgdGhlIG5leHQgbG93ZXIgZGF0YSByYXRlLgorCQkgKi8KKwkJZnRhcGVfcmVwb3J0X2Vycm9yKCZlcnJvciwgJmNvbW1hbmQsIDEpOworCQlpZiAoZXJyb3IgPT0gMzEgJiYgY29tbWFuZCA9PSBRSUNfTE9HSUNBTF9GT1JXQVJEKSB7CisJCQkvKiBkcml2ZSBkb2VzIG5vdCBhY2NlcHQgdGhpcyBkYXRhIHJhdGUgKi8KKwkJCWlmIChmdF9kYXRhX3JhdGUgPiAyNTApIHsKKwkJCQlUUkFDRShmdF90X2luZm8sCisJCQkJICAgICAgIlByb2JhYmxlIGRhdGEgcmF0ZSBjb25mbGljdCIpOworCQkJCVRSQUNFKGZ0X3RfaW5mbywKKwkJCQkgICAgICAiTG93ZXJpbmcgZGF0YSByYXRlIHRvICVkIEticHMiLAorCQkJCSAgICAgIGZ0X2RhdGFfcmF0ZSAvIDIpOworCQkJCWZ0YXBlX2hhbGZfZGF0YV9yYXRlKCk7CisJCQkJaWYgKGZ0X2J1ZmZlcltmdF90YWlsXS0+cmV0cnkgPiAwKSB7CisJCQkJCS8qIGdpdmUgaXQgYSBjaGFuY2UgKi8KKwkJCQkJLS1mdF9idWZmZXJbZnRfdGFpbF0tPnJldHJ5OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogbm8gcmF0ZSBpcyBhY2NlcHRlZC4uLiAqLworCQkJCVRSQUNFKGZ0X3RfZXJyLCAiV2UncmUgZGVhZCA6KCIpOworCQkJfQorCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF9lcnIsICJVbmtub3duIGVycm9yIik7CisJCX0KKwkJVFJBQ0VfRVhJVCAtRUlPOyAgIC8qIGcucC4gZXJyb3IgKi8KKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiBmb3J3YXJkICovIHN0YXRpYyBpbnQgc2Vla19mb3J3YXJkKGludCBzZWdtZW50X2lkLCBpbnQgZmFzdCk7CisKK3N0YXRpYyBpbnQgZmFzdF9zZWVrKGludCBjb3VudCwgaW50IHJldmVyc2UpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHN0YXR1czsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChjb3VudCA+IDApIHsKKwkJLyogIElmIHBvc2l0aW9uZWQgYXQgYmVnaW4gb3IgZW5kIG9mIHRhcGUsIGZhc3Qgc2Vla2luZyBuZWVkcworCQkgKiAgc3BlY2lhbCB0cmVhdG1lbnQuCisJCSAqICBTdGFydGluZyBmcm9tIGxvZ2ljYWwgYm90IG5lZWRzIGEgKHNsb3cpIHNlZWsgdG8gdGhlIGZpcnN0CisJCSAqICBzZWdtZW50IGJlZm9yZSB0aGUgaGlnaCBzcGVlZCBzZWVrLiBNb3N0IGRyaXZlcyBkbyB0aGlzCisJCSAqICBhdXRvbWF0aWNhbGx5IGJ1dCBzb21lIG9sZGVyIGRvbid0LCBzbyB3ZSB0cmVhdCB0aGVtCisJCSAqICBhbGwgdGhlIHNhbWUuCisJCSAqICBTdGFydGluZyBmcm9tIGxvZ2ljYWwgZW90IGlzIGV2ZW4gbW9yZSBkaWZmaWN1bHQgYmVjYXVzZQorCQkgKiAgd2UgY2Fubm90IChzbG93KSByZXZlcnNlIHNlZWsgdG8gdGhlIGxhc3Qgc2VnbWVudC4KKwkJICogIFRPIEJFIElNUExFTUVOVEVELgorCQkgKi8KKwkJaW5oaWJpdF9jb3JyZWN0aW9uID0gMDsKKwkJaWYgKGZ0X2xvY2F0aW9uLmtub3duICYmCisJCSAgICAoKGZ0X2xvY2F0aW9uLmJvdCAmJiAhcmV2ZXJzZSkgfHwKKwkJICAgICAoZnRfbG9jYXRpb24uZW90ICYmIHJldmVyc2UpKSkgeworCQkJaWYgKCFyZXZlcnNlKSB7CisJCQkJLyogIChzbG93KSBza2lwIHRvIGZpcnN0IHNlZ21lbnQgb24gYSB0cmFjaworCQkJCSAqLworCQkJCXNlZWtfZm9yd2FyZChmdF9sb2NhdGlvbi50cmFjayAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjaywgMCk7CisJCQkJLS1jb3VudDsKKwkJCX0gZWxzZSB7CisJCQkJLyogIFdoZW4gc2Vla2luZyBiYWNrd2FyZHMgZnJvbQorCQkJCSAqICBlbmQtb2YtdGFwZSB0aGUgbnVtYmVyIG9mIGVyYXNlZAorCQkJCSAqICBnYXBzIGZvdW5kIHNlZW1zIHRvIGJlIGhpZ2hlciB0aGFuCisJCQkJICogIGV4cGVjdGVkLiAgVGhlcmVmb3IgdGhlIGRyaXZlIG11c3QKKwkJCQkgKiAgc2tpcCBzb21lIG1vcmUgc2VnbWVudHMgdGhhbgorCQkJCSAqICBjYWxjdWxhdGVkLCBidXQgd2UgZG9uJ3Qga25vdyBob3cKKwkJCQkgKiAgbWFueS4gIFRodXMgd2Ugd2lsbCBwcmV2ZW50IHRoZQorCQkJCSAqICByZS1jYWxjdWxhdGlvbiBvZiBvZmZzZXQgYW5kCisJCQkJICogIG92ZXJzaG9vdCB3aGVuIHNlZWtpbmcgYmFja3dhcmRzLgorCQkJCSAqLworCQkJCWluaGliaXRfY29ycmVjdGlvbiA9IDE7CisJCQkJY291bnQgKz0gMzsJLyogYmVzdCBndWVzcyAqLworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9mbG93LCAid2FybmluZzogemVybyBvciBuZWdhdGl2ZSBjb3VudDogJWQiLCBjb3VudCk7CisJfQorCWlmIChjb3VudCA+IDApIHsKKwkJaW50IGk7CisJCWludCBuaWJibGVzID0gY291bnQgPiAyNTUgPyAzIDogMjsKKworCQlpZiAoY291bnQgPiA0MDk1KSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAic2tpcHBpbmcgY2xpcHBlZCBhdCA0MDk1IHNlZ21lbnQiKTsKKwkJCWNvdW50ID0gNDA5NTsKKwkJfQorCQkvKiBJc3N1ZSB0aGlzIHRhcGUgY29tbWFuZCBmaXJzdC4gKi8KKwkJaWYgKCFyZXZlcnNlKSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAic2tpcHBpbmcgJWQgc2VnbWVudChzKSIsIGNvdW50KTsKKwkJCXJlc3VsdCA9IGZ0YXBlX2NvbW1hbmQobmliYmxlcyA9PSAzID8KKwkJCSAgIFFJQ19TS0lQX0VYVEVOREVEX0ZPUldBUkQgOiBRSUNfU0tJUF9GT1JXQVJEKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJiYWNraW5nIHVwICVkIHNlZ21lbnQocykiLCBjb3VudCk7CisJCQlyZXN1bHQgPSBmdGFwZV9jb21tYW5kKG5pYmJsZXMgPT0gMyA/CisJCQkgICBRSUNfU0tJUF9FWFRFTkRFRF9SRVZFUlNFIDogUUlDX1NLSVBfUkVWRVJTRSk7CisJCX0KKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJTa2lwIGNvbW1hbmQgZmFpbGVkIik7CisJCX0gZWxzZSB7CisJCQktLWNvdW50OwkvKiAwIG1lYW5zIG9uZSBnYXAgZXRjLiAqLworCQkJZm9yIChpID0gMDsgaSA8IG5pYmJsZXM7ICsraSkgeworCQkJCWlmIChyZXN1bHQgPj0gMCkgeworCQkJCQlyZXN1bHQgPSBmdGFwZV9wYXJhbWV0ZXIoY291bnQgJiAxNSk7CisJCQkJCWNvdW50IC89IDE2OworCQkJCX0KKwkJCX0KKwkJCXJlc3VsdCA9IGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5yZXdpbmQsICZzdGF0dXMpOworCQkJaWYgKHJlc3VsdCA+PSAwKSB7CisJCQkJZnRhcGVfdGFwZV9ydW5uaW5nID0gMDsKKwkJCX0KKwkJfQorCX0KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZShpbnQgaWQpCit7CisJLyogQ2hlY2sgdG8gc2VlIGlmIHBvc2l0aW9uIGZvdW5kIGlzIG9mZi10cmFjayBhcyByZXBvcnRlZAorCSAqICBvbmNlLiAgQmVjYXVzZSBhbGwgdHJhY2tzIGluIG9uZSBkaXJlY3Rpb24gbGllIG5leHQgdG8KKwkgKiAgZWFjaCBvdGhlciwgaWYgb2ZmLXRyYWNrIHRoZSBlcnJvciB3aWxsIGJlIGFwcHJveGltYXRlbHkKKwkgKiAgMiAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjay4KKwkgKi8KKwlpZiAoZnRfbG9jYXRpb24udHJhY2sgPT0gLTEpIHsKKwkJcmV0dXJuIDE7IC8qIHVuZm9yc2VlbiBzaXR1YXRpb24sIGRvbid0IGdlbmVyYXRlIGVycm9yICovCisJfSBlbHNlIHsKKwkJLyogVXNlIG1hcmdpbiBvZiBmdF9zZWdtZW50c19wZXJfdHJhY2sgb24gYm90aCBzaWRlcworCQkgKiBiZWNhdXNlIGZ0YXBlIG5lZWRzIHNvbWUgbWFyZ2luIGFuZCB0aGUgZXJyb3Igd2UncmUKKwkJICogbG9va2luZyBmb3IgaXMgbXVjaCBsYXJnZXIgIQorCQkgKi8KKwkJaW50IGxvID0gKGZ0X2xvY2F0aW9uLnRyYWNrIC0gMSkgKiBmdF9zZWdtZW50c19wZXJfdHJhY2s7CisJCWludCBoaSA9IChmdF9sb2NhdGlvbi50cmFjayArIDIpICogZnRfc2VnbWVudHNfcGVyX3RyYWNrOworCisJCXJldHVybiAoaWQgPj0gbG8gJiYgaWQgPCBoaSk7CisJfQorfQorCitzdGF0aWMgaW50IHNlZWtfZm9yd2FyZChpbnQgc2VnbWVudF9pZCwgaW50IGZhc3QpCit7CisJaW50IGZhaWx1cmVzID0gMDsKKwlpbnQgY291bnQ7CisJc3RhdGljIGludCBtYXJnaW4gPSAxOwkvKiBmaXhlZDogc3RvcCB0aGlzIGJlZm9yZSB0YXJnZXQgKi8KKwlzdGF0aWMgaW50IG92ZXJzaG9vdCA9IDE7CisJc3RhdGljIGludCBtaW5fY291bnQgPSA4OworCWludCBleHBlY3RlZCA9IC0xOworCWludCB0YXJnZXQgPSBzZWdtZW50X2lkIC0gbWFyZ2luOworCWludCBmYXN0X3NlZWtpbmc7CisJaW50IHByZXZfc2VnbWVudCA9IGZ0X2xvY2F0aW9uLnNlZ21lbnQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoIWZ0X2xvY2F0aW9uLmtub3duKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJmYXRhbDogY2Fubm90IHNlZWsgZnJvbSB1bmtub3duIGxvY2F0aW9uIik7CisJfQorCWlmICghdmFsaWRhdGUoc2VnbWVudF9pZCkpIHsKKwkJZnRhcGVfc2xlZXAoMSAqIEZUX1NFQ09ORCk7CisJCWZ0X2ZhaWx1cmUgPSAxOworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCSAgICAiZmF0YWw6IGhlYWQgb2ZmIHRyYWNrIChiYWQgaGFyZHdhcmU/KSIpOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiZnJvbSAlZC8lZCB0byAlZC8wIC0gJWQiLAorCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3RvcixzZWdtZW50X2lkLG1hcmdpbik7CisJY291bnQgPSB0YXJnZXQgLSBmdF9sb2NhdGlvbi5zZWdtZW50IC0gb3ZlcnNob290OworCWZhc3Rfc2Vla2luZyA9IChmYXN0ICYmCisJCQljb3VudCA+IChtaW5fY291bnQgKyAoZnRfbG9jYXRpb24uYm90ID8gMSA6IDApKSk7CisJaWYgKGZhc3Rfc2Vla2luZykgeworCQlUUkFDRShmdF90X25vaXNlLCAiZmFzdCBza2lwcGluZyAlZCBzZWdtZW50cyIsIGNvdW50KTsKKwkJZXhwZWN0ZWQgPSBzZWdtZW50X2lkIC0gbWFyZ2luOworCQlmYXN0X3NlZWsoY291bnQsIDApOworCX0KKwlpZiAoIWZ0YXBlX3RhcGVfcnVubmluZykgeworCQlsb2dpY2FsX2ZvcndhcmQoKTsKKwl9CisJd2hpbGUgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPCBzZWdtZW50X2lkKSB7CisJCS8qICBUaGlzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBzZWN0b3IgaW4gYSAoYmFkKSBzZWdtZW50IHRvCisJCSAqICBoYXZlIGEgdmFsaWQgYW5kIHJlYWRhYmxlIHNlY3RvciBpZCAhCisJCSAqICBJdCBsb29rcyBsaWtlIHRoaXMgaXMgbm90IGd1YXJhbnRlZWQsIHNvIHdlIG11c3QgdHJ5CisJCSAqICB0byBmaW5kIGEgd2F5IHRvIHNraXAgYW4gRU1QVFlfU0VHTUVOVC4gISEhIEZJWE1FICEhIQorCQkgKi8KKwkJaWYgKGZ0YXBlX3JlYWRfaWQoKSA8IDAgfHwgIWZ0X2xvY2F0aW9uLmtub3duIHx8CisJCSAgICBzaWd0ZXN0c2V0bWFzaygmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIF9ET05UX0JMT0NLKSkgeworCQkJZnRfbG9jYXRpb24ua25vd24gPSAwOworCQkJaWYgKCFmdGFwZV90YXBlX3J1bm5pbmcgfHwKKwkJCSAgICArK2ZhaWx1cmVzID4gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgeworCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJCQkgICAgInJlYWRfaWQgZmFpbGVkIGNvbXBsZXRlbHkiKTsKKwkJCX0KKwkJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJCVRSQUNFKGZ0X3RfZmxvdywgInJlYWRfaWQgZmFpbGVkLCByZXRyeSAoJWQpIiwKKwkJCSAgICAgIGZhaWx1cmVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmYXN0X3NlZWtpbmcpIHsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlbmRlZCBhdCAlZC8lZCAoJWQsJWQpIiwKKwkJCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3RvciwKKwkJCSAgICAgIG92ZXJzaG9vdCwgaW5oaWJpdF9jb3JyZWN0aW9uKTsKKwkJCWlmICghaW5oaWJpdF9jb3JyZWN0aW9uICYmCisJCQkgICAgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPCBleHBlY3RlZCB8fAorCQkJICAgICBmdF9sb2NhdGlvbi5zZWdtZW50ID4gZXhwZWN0ZWQgKyBtYXJnaW4pKSB7CisJCQkJaW50IGVycm9yID0gZnRfbG9jYXRpb24uc2VnbWVudCAtIGV4cGVjdGVkOworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJICAgICAgImFkanVzdGluZyBvdmVyc2hvb3QgZnJvbSAlZCB0byAlZCIsCisJCQkJICAgICAgb3ZlcnNob290LCBvdmVyc2hvb3QgKyBlcnJvcik7CisJCQkJb3ZlcnNob290ICs9IGVycm9yOworCQkJCS8qICBBbGwgb3ZlcnNob290cyBoYXZlIHRoZSBzYW1lCisJCQkJICogIGRpcmVjdGlvbiwgc28gaXQgc2hvdWxkIG5ldmVyCisJCQkJICogIGJlY29tZSBuZWdhdGl2ZSwgYnV0IHdobyBrbm93cy4KKwkJCQkgKi8KKwkJCQlpZiAob3ZlcnNob290IDwgLTUgfHwKKwkJCQkgICAgb3ZlcnNob290ID4gT1ZFUlNIT09UX0xJTUlUKSB7CisJCQkJCWlmIChvdmVyc2hvb3QgPCAwKSB7CisJCQkJCQkvKiBrZWVwIHNhbmUgdmFsdWUgKi8KKwkJCQkJCW92ZXJzaG9vdCA9IC01OworCQkJCQl9IGVsc2UgeworCQkJCQkJLyoga2VlcCBzYW5lIHZhbHVlICovCisJCQkJCQlvdmVyc2hvb3QgPSBPVkVSU0hPT1RfTElNSVQ7CisJCQkJCX0KKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkJICAgICAgImNsaXBwZWQgb3ZlcnNob290IHRvICVkIiwKKwkJCQkJICAgICAgb3ZlcnNob290KTsKKwkJCQl9CisJCQl9CisJCQlmYXN0X3NlZWtpbmcgPSAwOworCQl9CisJCWlmIChmdF9sb2NhdGlvbi5rbm93bikgeworCQkJaWYgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPiBwcmV2X3NlZ21lbnQgKyAxKSB7CisJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkgICAgICAibWlzc2VkIHNlZ21lbnQgJWQgd2hpbGUgc2tpcHBpbmciLAorCQkJCSAgICAgIHByZXZfc2VnbWVudCArIDEpOworCQkJfQorCQkJcHJldl9zZWdtZW50ID0gZnRfbG9jYXRpb24uc2VnbWVudDsKKwkJfQorCX0KKwlpZiAoZnRfbG9jYXRpb24uc2VnbWVudCA+IHNlZ21lbnRfaWQpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywKKwkJCSAgICBmdF90X25vaXNlLCAiZmFpbGVkOiBza2lwIGVuZGVkIGF0IHNlZ21lbnQgJWQvJWQiLAorCQkJICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3Rvcik7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBza2lwX3JldmVyc2UoaW50IHNlZ21lbnRfaWQsIGludCAqcHN0YXR1cykKK3sKKwlpbnQgZmFpbHVyZXMgPSAwOworCXN0YXRpYyBpbnQgb3ZlcnNob290ID0gMTsKKwlzdGF0aWMgaW50IG1pbl9yZXdpbmQgPSAyOwkvKiAxICsgb3ZlcnNob290ICovCisJc3RhdGljIGNvbnN0IGludCBtYXJnaW4gPSAxOwkvKiBzdG9wIHRoaXMgYmVmb3JlIHRhcmdldCAqLworCWludCBleHBlY3RlZCA9IDA7CisJaW50IGNvdW50ID0gMTsKKwlpbnQgc2hvcnRfc2VlazsKKwlpbnQgdGFyZ2V0ID0gc2VnbWVudF9pZCAtIG1hcmdpbjsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmIChmdF9sb2NhdGlvbi5rbm93biAmJiAhdmFsaWRhdGUoc2VnbWVudF9pZCkpIHsKKwkJZnRhcGVfc2xlZXAoMSAqIEZUX1NFQ09ORCk7CisJCWZ0X2ZhaWx1cmUgPSAxOworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCSAgICAiZmF0YWw6IGhlYWQgb2ZmIHRyYWNrIChiYWQgaGFyZHdhcmU/KSIpOworCX0KKwlkbyB7CisJCWlmICghZnRfbG9jYXRpb24ua25vd24pIHsKKwkJCVRSQUNFKGZ0X3Rfd2FybiwgIndhcm5pbmc6IGxvY2F0aW9uIG5vdCBrbm93biIpOworCQl9CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmcm9tICVkLyVkIHRvICVkLzAgLSAlZCIsCisJCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3RvciwKKwkJICAgICAgc2VnbWVudF9pZCwgbWFyZ2luKTsKKwkJLyogIG1pbl9yZXdpbmQgPT0gMSArIG92ZXJzaG9vdF93aGVuX2RvaW5nX21pbmltdW1fcmV3aW5kCisJCSAqICBvdmVyc2hvb3QgID09IG92ZXJzaG9vdF93aGVuX2RvaW5nX2xhcmdlcl9yZXdpbmQKKwkJICogIEluaXRpYWxseSBtaW5fcmV3aW5kID09IDEgKyBvdmVyc2hvb3QsIG9wdGltaXphdGlvbgorCQkgKiAgb2YgYm90aCB2YWx1ZXMgd2lsbCBiZSBkb25lIHNlcGFyYXRlbHkuCisJCSAqICBvdmVyc2hvb3QgYW5kIG1pbl9yZXdpbmQgY2FuIGJlIG5lZ2F0aXZlIGFzIGJvdGggYXJlCisJCSAqICBzdW1zIG9mIHRocmVlIGNvbXBvbmVudHM6CisJCSAqICBhbnlfb3ZlcnNob290ID09IHJld2luZF9vdmVyc2hvb3QgLSAKKwkJICogICAgICAgICAgICAgICAgICAgc3RvcF9vdmVyc2hvb3QgICAtCisJCSAqICAgICAgICAgICAgICAgICAgIHN0YXJ0X292ZXJzaG9vdAorCQkgKi8KKwkJaWYgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgLSB0YXJnZXQgLSAobWluX3Jld2luZCAtIDEpIDwgMSkgeworCQkJc2hvcnRfc2VlayA9IDE7CisJCX0gZWxzZSB7CisJCQljb3VudCA9IGZ0X2xvY2F0aW9uLnNlZ21lbnQgLSB0YXJnZXQgLSBvdmVyc2hvb3Q7CisJCQlzaG9ydF9zZWVrID0gKGNvdW50IDwgMSk7CisJCX0KKwkJaWYgKHNob3J0X3NlZWspIHsKKwkJCWNvdW50ID0gMTsJLyogZG8gc2hvcnRlc3QgcmV3aW5kICovCisJCQlleHBlY3RlZCA9IGZ0X2xvY2F0aW9uLnNlZ21lbnQgLSBtaW5fcmV3aW5kOworCQkJaWYgKGV4cGVjdGVkL2Z0X3NlZ21lbnRzX3Blcl90cmFjayAhPSBmdF9sb2NhdGlvbi50cmFjaykgeworCQkJCWV4cGVjdGVkID0gKGZ0X2xvY2F0aW9uLnRyYWNrICogCisJCQkJCSAgICBmdF9zZWdtZW50c19wZXJfdHJhY2spOworCQkJfQorCQl9IGVsc2UgeworCQkJZXhwZWN0ZWQgPSB0YXJnZXQ7CisJCX0KKwkJZmFzdF9zZWVrKGNvdW50LCAxKTsKKwkJbG9naWNhbF9mb3J3YXJkKCk7CisJCWlmIChmdGFwZV9yZWFkX2lkKCkgPCAwIHx8ICFmdF9sb2NhdGlvbi5rbm93biB8fAorCQkgICAgKHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX0RPTlRfQkxPQ0spKSkgeworCQkJaWYgKCghZnRhcGVfdGFwZV9ydW5uaW5nICYmICFmdF9sb2NhdGlvbi5rbm93bikgfHwKKwkJCSAgICArK2ZhaWx1cmVzID4gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgeworCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJCQkgICAgInJlYWRfaWQgZmFpbGVkIGNvbXBsZXRlbHkiKTsKKwkJCX0KKwkJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9kcml2ZV9zdGF0dXMocHN0YXR1cyksKTsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJmdGFwZV9yZWFkX2lkIGZhaWxlZCwgcmV0cnkgKCVkKSIsCisJCQkgICAgICBmYWlsdXJlcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAiZW5kZWQgYXQgJWQvJWQgKCVkLCVkLCVkKSIsIAorCQkgICAgICBmdF9sb2NhdGlvbi5zZWdtZW50LCBmdF9sb2NhdGlvbi5zZWN0b3IsCisJCSAgICAgIG1pbl9yZXdpbmQsIG92ZXJzaG9vdCwgaW5oaWJpdF9jb3JyZWN0aW9uKTsKKwkJaWYgKCFpbmhpYml0X2NvcnJlY3Rpb24gJiYKKwkJICAgIChmdF9sb2NhdGlvbi5zZWdtZW50IDwgZXhwZWN0ZWQgfHwKKwkJICAgICBmdF9sb2NhdGlvbi5zZWdtZW50ID4gZXhwZWN0ZWQgKyBtYXJnaW4pKSB7CisJCQlpbnQgZXJyb3IgPSBleHBlY3RlZCAtIGZ0X2xvY2F0aW9uLnNlZ21lbnQ7CisJCQlpZiAoc2hvcnRfc2VlaykgeworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJICAgICAgImFkanVzdGluZyBtaW5fcmV3aW5kIGZyb20gJWQgdG8gJWQiLAorCQkJCSAgICAgIG1pbl9yZXdpbmQsIG1pbl9yZXdpbmQgKyBlcnJvcik7CisJCQkJbWluX3Jld2luZCArPSBlcnJvcjsKKwkJCQlpZiAobWluX3Jld2luZCA8IC01KSB7CisJCQkJCS8qIGlzIHRoaXMgcmlnaHQgPyBGSVhNRSAhICovCisJCQkJCS8qIGtlZXAgc2FuZSB2YWx1ZSAqLworCQkJCQltaW5fcmV3aW5kID0gLTU7CisJCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsIAorCQkJCQkgICAgICAiY2xpcHBlZCBtaW5fcmV3aW5kIHRvICVkIiwKKwkJCQkJICAgICAgbWluX3Jld2luZCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X25vaXNlLAorCQkJCSAgICAgICJhZGp1c3Rpbmcgb3ZlcnNob290IGZyb20gJWQgdG8gJWQiLAorCQkJCSAgICAgIG92ZXJzaG9vdCwgb3ZlcnNob290ICsgZXJyb3IpOworCQkJCW92ZXJzaG9vdCArPSBlcnJvcjsKKwkJCQlpZiAob3ZlcnNob290IDwgLTUgfHwKKwkJCQkgICAgb3ZlcnNob290ID4gT1ZFUlNIT09UX0xJTUlUKSB7CisJCQkJCWlmIChvdmVyc2hvb3QgPCAwKSB7CisJCQkJCQkvKiBrZWVwIHNhbmUgdmFsdWUgKi8KKwkJCQkJCW92ZXJzaG9vdCA9IC01OworCQkJCQl9IGVsc2UgeworCQkJCQkJLyoga2VlcCBzYW5lIHZhbHVlICovCisJCQkJCQlvdmVyc2hvb3QgPSBPVkVSU0hPT1RfTElNSVQ7CisJCQkJCX0KKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkJICAgICAgImNsaXBwZWQgb3ZlcnNob290IHRvICVkIiwKKwkJCQkJICAgICAgb3ZlcnNob290KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlIChmdF9sb2NhdGlvbi5zZWdtZW50ID4gc2VnbWVudF9pZCk7CisJaWYgKGZ0X2xvY2F0aW9uLmtub3duKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJjdXJyZW50IGxvY2F0aW9uOiAlZC8lZCIsCisJCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3Rvcik7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBkZXRlcm1pbmVfcG9zaXRpb24odm9pZCkKK3sKKwlpbnQgcmV0cnkgPSAwOworCWludCBzdGF0dXM7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICghZnRhcGVfdGFwZV9ydW5uaW5nKSB7CisJCS8qICBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0YXBlIGlzIHN0b3BwZWQgYnkgaXNyLgorCQkgKi8KKwkJVFJBQ0UoZnRfdF9mbG93LCAid2FpdGluZyBmb3IgdGFwZSBzdG9wIik7CisJCWlmIChmdGFwZV9yZWFkeV93YWl0KGZ0YXBlX3RpbWVvdXQucGF1c2UsICZzdGF0dXMpIDwgMCkgeworCQkJVFJBQ0UoZnRfdF9mbG93LCAiZHJpdmUgc3RpbGwgcnVubmluZyAoZmF0YWwpIik7CisJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAxOwkvKiA/ICovCisJCX0KKwl9IGVsc2UgeworCQlmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpOworCX0KKwlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgeworCQkvKiAgRHJpdmUgbXVzdCBiZSByZWFkeSB0byBjaGVjayBlcnJvciBzdGF0ZSAhCisJCSAqLworCQlUUkFDRShmdF90X2Zsb3csICJkcml2ZSBpcyByZWFkeSIpOworCQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikgeworCQkJdW5zaWduZWQgaW50IGVycm9yOworCQkJcWljMTE3X2NtZF90IGNvbW1hbmQ7CisKKwkJCS8qICBSZXBvcnQgYW5kIGNsZWFyIGVycm9yIHN0YXRlLCB0cnkgdG8gY29udGludWUuCisJCQkgKi8KKwkJCVRSQUNFKGZ0X3RfZmxvdywgImVycm9yIHN0YXR1cyBzZXQiKTsKKwkJCWZ0YXBlX3JlcG9ydF9lcnJvcigmZXJyb3IsICZjb21tYW5kLCAxKTsKKwkJCWZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5yZXNldCwgJnN0YXR1cyk7CisJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOwkvKiA/ICovCisJCX0KKwkJaWYgKGNoZWNrX2JvdF9lb3Qoc3RhdHVzKSkgeworCQkJaWYgKGZ0X2xvY2F0aW9uLmJvdCkgeworCQkJCWlmICgoc3RhdHVzICYgUUlDX1NUQVRVU19SRUFEWSkgPT0gMCkgeworCQkJCQkvKiB0YXBlIG1vdmluZyBhd2F5IGZyb20KKwkJCQkJICogYm90L2VvdCwgbGV0J3Mgc2VlIGlmIHdlCisJCQkJCSAqIGNhbiBjYXRjaCB1cCB3aXRoIHRoZSBmaXJzdAorCQkJCQkgKiBzZWdtZW50IG9uIHRoaXMgdHJhY2suCisJCQkJCSAqLworCQkJCX0gZWxzZSB7CisJCQkJCVRSQUNFKGZ0X3RfZmxvdywKKwkJCQkJICAgICAgInN0YXJ0IHRhcGUgZnJvbSBsb2dpY2FsIGJvdCIpOworCQkJCQlsb2dpY2FsX2ZvcndhcmQoKTsJLyogc3RhcnQgbW92aW5nICovCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpID09IDApIHsKKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwgIndhaXRpbmcgZm9yIGxvZ2ljYWwgZW5kIG9mIHRyYWNrIik7CisJCQkJCXJlc3VsdCA9IGZ0YXBlX3JlYWR5X3dhaXQoZnRhcGVfdGltZW91dC5yZXNldCwgJnN0YXR1cyk7CisJCQkJCS8qIGVycm9yIGhhbmRsaW5nIG5lZWRlZCA/ICovCisJCQkJfSBlbHNlIHsKKwkJCQkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJCQkJICAgICAgInRhcGUgYXQgbG9naWNhbCBlbmQgb2YgdHJhY2siKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlUUkFDRShmdF90X2Zsb3csICJzdGFydCB0YXBlIik7CisJCQlsb2dpY2FsX2ZvcndhcmQoKTsJLyogc3RhcnQgbW92aW5nICovCisJCQlmdF9sb2NhdGlvbi5rbm93biA9IDA7CS8qIG5vdCBjbGVhcmVkIGJ5IGxvZ2ljYWwgZm9yd2FyZCAhICovCisJCX0KKwl9CisJLyogdGFwZSBzaG91bGQgYmUgbW92aW5nIG5vdywgc3RhcnQgcmVhZGluZyBpZCdzCisJICovCisJd2hpbGUgKCFmdF9sb2NhdGlvbi5rbm93biAmJgorCSAgICAgICByZXRyeSsrIDwgRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAmJgorCSAgICAgICAocmVzdWx0ID0gZnRhcGVfcmVhZF9pZCgpKSA8IDApIHsKKworCQlUUkFDRShmdF90X2Zsb3csICJsb2NhdGlvbiB1bmtub3duIik7CisKKwkJLyogZXhpdCBvbiBzaWduYWwKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKworCQkvKiAgcmVhZC1pZCBzb21laG93IGZhaWxlZCwgdGFwZSBtYXkKKwkJICogIGhhdmUgcmVhY2hlZCBlbmQgb3Igc29tZSBvdGhlcgorCQkgKiAgZXJyb3IgaGFwcGVuZWQuCisJCSAqLworCQlUUkFDRShmdF90X2Zsb3csICJyZWFkLWlkIGZhaWxlZCIpOworCQlUUkFDRV9DQVRDSChmdGFwZV9yZXBvcnRfZHJpdmVfc3RhdHVzKCZzdGF0dXMpLCk7CisJCVRSQUNFKGZ0X3RfZXJyLCAiZnRhcGVfcmVwb3J0X2RyaXZlX3N0YXR1czogMHglMDJ4Iiwgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFFJQ19TVEFUVVNfUkVBRFkpIHsKKwkJCWZ0YXBlX3RhcGVfcnVubmluZyA9IDA7CisJCQlUUkFDRShmdF90X25vaXNlLCAidGFwZSBzdG9wcGVkIGZvciB1bmtub3duIHJlYXNvbiEgIgorCQkJICAgICAgInN0YXR1cyA9IDB4JTAyeCIsIHN0YXR1cyk7CisJCQlpZiAoc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUiB8fAorCQkJICAgICFjaGVja19ib3RfZW90KHN0YXR1cykpIHsKKwkJCQkvKiBvb3BzLCB0YXBlIHN0b3BwZWQgYnV0IG5vdCBhdCBlbmQhCisJCQkJICovCisJCQkJVFJBQ0VfRVhJVCAtRUlPOworCQkJfQorCQl9CisJfQorCVRSQUNFKGZ0X3RfZmxvdywKKwkgICAgICAidGFwZSBpcyBwb3NpdGlvbmVkIGF0IHNlZ21lbnQgJWQiLCBmdF9sb2NhdGlvbi5zZWdtZW50KTsKKwlUUkFDRV9FWElUIGZ0X2xvY2F0aW9uLmtub3duID8gMCA6IC1FSU87Cit9CisKKy8qICAgICAgR2V0IHRoZSB0YXBlIHJ1bm5pbmcgYW5kIHBvc2l0aW9uIGl0IGp1c3QgYmVmb3JlIHRoZQorICogICAgICByZXF1ZXN0ZWQgc2VnbWVudC4KKyAqICAgICAgU2VlayB0YXBlLXRyYWNrIGFuZCByZXBvc2l0aW9uIGFzIG5lZWRlZC4KKyAqLworaW50IGZ0YXBlX3N0YXJ0X3RhcGUoaW50IHNlZ21lbnRfaWQsIGludCBzZWN0b3Jfb2Zmc2V0KQoreworCWludCB0cmFjayA9IHNlZ21lbnRfaWQgLyBmdF9zZWdtZW50c19wZXJfdHJhY2s7CisJaW50IHJlc3VsdCA9IC1FSU87CisJaW50IHN0YXR1czsKKwlzdGF0aWMgaW50IGxhc3Rfc2VnbWVudCA9IC0xOworCXN0YXRpYyBpbnQgYmFkX2J1c190aW1pbmcgPSAwOworCS8qIG51bWJlciBvZiBzZWdtZW50cyBwYXNzaW5nIHRoZSBoZWFkIGJldHdlZW4gc3RhcnRpbmcgdGhlIHRhcGUKKwkgKiBhbmQgYmVpbmcgYWJsZSB0byBhY2Nlc3MgdGhlIGZpcnN0IHNlY3Rvci4KKwkgKi8KKwlzdGF0aWMgaW50IHN0YXJ0X29mZnNldCA9IDE7CisJaW50IHJldHJ5OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJLyogSWYgc2VjdG9yX29mZnNldCA+IDAsIHNlZWsgaW50byB3YW50ZWQgc2VnbWVudCBpbnN0ZWFkIG9mCisJICogaW50byBwcmV2aW91cy4KKwkgKiBUaGlzIGFsbG93cyBlcnJvciByZWNvdmVyeSBpZiBhIHBhcnQgb2YgdGhlIHNlZ21lbnQgaXMgYmFkCisJICogKGVyYXNlZCkgY2F1c2luZyB0aGUgdGFwZSBkcml2ZSB0byBnZW5lcmF0ZSBhbiBpbmRleCBwdWxzZQorCSAqIHRodXMgY2F1c2luZyBhIG5vLWRhdGEgZXJyb3IgYmVmb3JlIHRoZSByZXF1ZXN0ZWQgc2VjdG9yCisJICogaXMgcmVhY2hlZC4KKwkgKi8KKwlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXJnZXQgc2VnbWVudDogJWQvJWQlcyIsIHNlZ21lbnRfaWQsIHNlY3Rvcl9vZmZzZXQsCisJCWZ0X2J1ZmZlcltmdF9oZWFkXS0+cmV0cnkgPiAwID8gIiByZXRyeSIgOiAiIik7CisJaWYgKGZ0X2J1ZmZlcltmdF9oZWFkXS0+cmV0cnkgPiAwKSB7CS8qIHRoaXMgaXMgYSByZXRyeSAqLworCQlpbnQgZGlzdCA9IHNlZ21lbnRfaWQgLSBsYXN0X3NlZ21lbnQ7CisKKwkJaWYgKChpbnQpZnRfaGlzdG9yeS5vdmVycnVuX2Vycm9ycyA8IG92ZXJydW5fY291bnRfb2Zmc2V0KSB7CisJCQlvdmVycnVuX2NvdW50X29mZnNldCA9IGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7CisJCX0gZWxzZSBpZiAoZGlzdCA8IDAgfHwgZGlzdCA+IDUwKSB7CisJCQlvdmVycnVuX2NvdW50X29mZnNldCA9IGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7CisJCX0gZWxzZSBpZiAoKGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnMgLQorCQkJICAgIG92ZXJydW5fY291bnRfb2Zmc2V0KSA+PSA4KSB7CisJCQlpZiAoZnRhcGVfaW5jcmVhc2VfdGhyZXNob2xkKCkgPj0gMCkgeworCQkJCS0tZnRfYnVmZmVyW2Z0X2hlYWRdLT5yZXRyeTsKKwkJCQlvdmVycnVuX2NvdW50X29mZnNldCA9CisJCQkJCWZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7CisJCQkJVFJBQ0UoZnRfdF93YXJuLCAiaW5jcmVhc2VkIHRocmVzaG9sZCBiZWNhdXNlICIKKwkJCQkgICAgICAib2YgZXhjZXNzaXZlIG92ZXJydW4gZXJyb3JzIik7CisJCQl9IGVsc2UgaWYgKCFiYWRfYnVzX3RpbWluZyAmJiBmdF9kYXRhX3JhdGUgPj0gMTAwMCkgeworCQkJCWZ0YXBlX2hhbGZfZGF0YV9yYXRlKCk7CisJCQkJLS1mdF9idWZmZXJbZnRfaGVhZF0tPnJldHJ5OworCQkJCWJhZF9idXNfdGltaW5nID0gMTsKKwkJCQlvdmVycnVuX2NvdW50X29mZnNldCA9CisJCQkJCWZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7CisJCQkJVFJBQ0UoZnRfdF93YXJuLCAicmVkdWNlZCBkYXRhcmF0ZSBiZWNhdXNlICIKKwkJCQkgICAgICAib2YgZXhjZXNzaXZlIG92ZXJydW4gZXJyb3JzIik7CisJCQl9CisJCX0KKwl9CisJbGFzdF9zZWdtZW50ID0gc2VnbWVudF9pZDsKKwlpZiAoZnRfbG9jYXRpb24udHJhY2sgIT0gdHJhY2sgfHwKKwkgICAgKGZ0YXBlX21pZ2h0X2JlX29mZl90cmFjayAmJiBmdF9idWZmZXJbZnRfaGVhZF0tPnJldHJ5PT0gMCkpIHsKKwkJLyogY3VycmVudCB0cmFjayB1bmtub3duIG9yIG5vdCBlcXVhbCB0byBkZXN0aW5hdGlvbgorCQkgKi8KKwkJZnRhcGVfcmVhZHlfd2FpdChmdGFwZV90aW1lb3V0LnNlZWssICZzdGF0dXMpOworCQlmdGFwZV9zZWVrX2hlYWRfdG9fdHJhY2sodHJhY2spOworCQkvKiBvdmVycnVuX2NvdW50X29mZnNldCA9IGZ0X2hpc3Rvcnkub3ZlcnJ1bl9lcnJvcnM7ICovCisJfQorCXJlc3VsdCA9IC1FSU87CisJcmV0cnkgPSAwOworCXdoaWxlIChyZXN1bHQgPCAwICAgICAmJgorCSAgICAgICByZXRyeSsrIDw9IDUgICAmJgorCSAgICAgICAhZnRfZmFpbHVyZSAmJgorCSAgICAgICAhKHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgX0RPTlRfQkxPQ0spKSkgeworCQkKKwkJaWYgKHJldHJ5ICYmIHN0YXJ0X29mZnNldCA8IDUpIHsKKwkJCXN0YXJ0X29mZnNldCArKzsKKwkJfQorCQkvKiAgQ2hlY2sgaWYgd2UgYXJlIGFibGUgdG8gY2F0Y2ggdGhlIHJlcXVlc3RlZAorCQkgKiAgc2VnbWVudCBpbiB0aW1lLgorCQkgKi8KKwkJaWYgKChmdF9sb2NhdGlvbi5rbm93biB8fCAoZGV0ZXJtaW5lX3Bvc2l0aW9uKCkgPT0gMCkpICYmCisJCSAgICBmdF9sb2NhdGlvbi5zZWdtZW50ID49CisJCSAgICAoc2VnbWVudF9pZCAtCisJCSAgICAgKChmdGFwZV90YXBlX3J1bm5pbmcgfHwgZnRfbG9jYXRpb24uYm90KQorCQkgICAgICA/IDAgOiBzdGFydF9vZmZzZXQpKSkgeworCQkJLyogIFRvbyBmYXIgYWhlYWQgKGluIG9yIHBhc3QgdGFyZ2V0IHNlZ21lbnQpLgorCQkJICovCisJCQlpZiAoZnRhcGVfdGFwZV9ydW5uaW5nKSB7CisJCQkJaWYgKChyZXN1bHQgPSBmdGFwZV9zdG9wX3RhcGUoJnN0YXR1cykpIDwgMCkgeworCQkJCQlUUkFDRShmdF90X2VyciwKKwkJCQkJICAgICAgInN0b3AgdGFwZSBmYWlsZWQgd2l0aCBjb2RlICVkIiwKKwkJCQkJICAgICAgcmVzdWx0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlIHN0b3BwZWQiKTsKKwkJCQlmdGFwZV90YXBlX3J1bm5pbmcgPSAwOworCQkJfQorCQkJVFJBQ0UoZnRfdF9ub2lzZSwgInJlcG9zaXRpb25pbmciKTsKKwkJCSsrZnRfaGlzdG9yeS5yZXdpbmRzOworCQkJaWYgKHNlZ21lbnRfaWQgJSBmdF9zZWdtZW50c19wZXJfdHJhY2sgPCBzdGFydF9vZmZzZXQpeworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJlbmQgb2YgdHJhY2sgY29uZGl0aW9uXG4iCisJCQkJICAgICAgS0VSTl9JTkZPICJzZWdtZW50X2lkICAgICAgICA6ICVkXG4iCisJCQkJICAgICAgS0VSTl9JTkZPICJmdF9zZWdtZW50c19wZXJfdHJhY2s6ICVkXG4iCisJCQkJICAgICAgS0VSTl9JTkZPICJzdGFydF9vZmZzZXQgICAgICA6ICVkIiwKKwkJCQkgICAgICBzZWdtZW50X2lkLCBmdF9zZWdtZW50c19wZXJfdHJhY2ssIAorCQkJCSAgICAgIHN0YXJ0X29mZnNldCk7CisJCQkJICAgICAgCisJCQkJLyogIElmIHNlZWtpbmcgdG8gZmlyc3Qgc2VnbWVudHMgb24KKwkJCQkgKiAgdHJhY2sgYmV0dGVyIGRvIGEgY29tcGxldGUgcmV3aW5kCisJCQkJICogIHRvIGxvZ2ljYWwgYmVnaW4gb2YgdHJhY2sgdG8gZ2V0IGEKKwkJCQkgKiAgbW9yZSBzdGVhZHkgdGFwZSBtb3Rpb24uICAKKwkJCQkgKi8KKwkJCQlyZXN1bHQgPSBmdGFwZV9jb21tYW5kX3dhaXQoCisJCQkJCShmdF9sb2NhdGlvbi50cmFjayAmIDEpCisJCQkJCT8gUUlDX1BIWVNJQ0FMX0ZPUldBUkQKKwkJCQkJOiBRSUNfUEhZU0lDQUxfUkVWRVJTRSwKKwkJCQkJZnRhcGVfdGltZW91dC5yZXdpbmQsICZzdGF0dXMpOworCQkJCWNoZWNrX2JvdF9lb3Qoc3RhdHVzKTsJLyogdXBkYXRlIGxvY2F0aW9uICovCisJCQl9IGVsc2UgeworCQkJCXJlc3VsdD0gc2tpcF9yZXZlcnNlKHNlZ21lbnRfaWQgLSBzdGFydF9vZmZzZXQsCisJCQkJCQkgICAgICZzdGF0dXMpOworCQkJfQorCQl9CisJCWlmICghZnRfbG9jYXRpb24ua25vd24pIHsKKwkJCVRSQUNFKGZ0X3RfYnVnLCAicGFuaWM6IGxvY2F0aW9uIG5vdCBrbm93biIpOworCQkJcmVzdWx0ID0gLUVJTzsKKwkJCWNvbnRpbnVlOyAvKiB3aGlsZSgpIHdpbGwgY2hlY2sgZm9yIGZhaWx1cmUgKi8KKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAiY3VycmVudCBzZWdtZW50OiAlZC8lZCIsCisJCSAgICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQsIGZ0X2xvY2F0aW9uLnNlY3Rvcik7CisJCS8qICBXZSdyZSBvbiB0aGUgcmlnaHQgdHJhY2sgc29tZXdoZXJlIGJlZm9yZSB0aGUKKwkJICogIHdhbnRlZCBzZWdtZW50LiAgU3RhcnQgdGFwZSBtb3ZlbWVudCBpZiBuZWVkZWQgYW5kCisJCSAqICBza2lwIHRvIGp1c3QgYmVmb3JlIG9yIGluc2lkZSB0aGUgcmVxdWVzdGVkCisJCSAqICBzZWdtZW50LiBLZWVwIHRhcGUgcnVubmluZy4gIAorCQkgKi8KKwkJcmVzdWx0ID0gMDsKKwkJaWYgKGZ0X2xvY2F0aW9uLnNlZ21lbnQgPCAKKwkJICAgIChzZWdtZW50X2lkIC0gKChmdGFwZV90YXBlX3J1bm5pbmcgfHwgZnRfbG9jYXRpb24uYm90KQorCQkJCSAgID8gMCA6IHN0YXJ0X29mZnNldCkpKSB7CisJCQlpZiAoc2VjdG9yX29mZnNldCA+IDApIHsKKwkJCQlyZXN1bHQgPSBzZWVrX2ZvcndhcmQoc2VnbWVudF9pZCwKKwkJCQkJCSAgICAgIHJldHJ5IDw9IDMpOworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQgPSBzZWVrX2ZvcndhcmQoc2VnbWVudF9pZCAtIDEsCisJCQkJCQkgICAgICByZXRyeSA8PSAzKTsKKwkJCX0KKwkJfQorCQlpZiAocmVzdWx0ID09IDAgJiYKKwkJICAgIGZ0X2xvY2F0aW9uLnNlZ21lbnQgIT0KKwkJICAgIChzZWdtZW50X2lkIC0gKHNlY3Rvcl9vZmZzZXQgPiAwID8gMCA6IDEpKSkgeworCQkJcmVzdWx0ID0gLUVJTzsKKwkJfQorCX0KKwlpZiAocmVzdWx0IDwgMCkgeworCQlUUkFDRShmdF90X2VyciwgImZhaWxlZCB0byByZXBvc2l0aW9uIik7CisJfSBlbHNlIHsKKwkJZnRfcnVubmVyX3N0YXR1cyA9IHJ1bm5pbmc7CisJfQorCVRSQUNFX0VYSVQgcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJ3LmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtcncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmY0ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJ3LmgKQEAgLTAsMCArMSwxMTEgQEAKKyNpZm5kZWYgX0ZUQVBFX1JXX0gKKyNkZWZpbmUgX0ZUQVBFX1JXX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5My0xOTk2IEJhcyBMYWFyaG92ZW4sCisgKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXJ3LmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoyNSAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgcmVhZCBhbmQgd3JpdGUKKyAqICAgICAgZnVuY3Rpb25zIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENsYXVzLUp1c3R1cyBIZWluZSAoMTk5Ni8wOS8yMCk6IEFkZCBkZWZpbml0aW9uIG9mIGZvcm1hdCBjb2RlIDYKKyAqIENsYXVzLUp1c3R1cyBIZWluZSAoMTk5Ni8xMC8wNCk6IENoYW5nZWQgR0VUL1BVVCBtYWNyb3MgdG8gY2FzdCB0byAoX191OCAqKQorICoKKyAqLworCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgorCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjZGVmaW5lIEdFVDIoYWRkcmVzcywgb2Zmc2V0KSBnZXRfdW5hbGlnbmVkKChfX3UxNiopKChfX3U4ICopYWRkcmVzcyArIG9mZnNldCkpCisjZGVmaW5lIEdFVDQoYWRkcmVzcywgb2Zmc2V0KSBnZXRfdW5hbGlnbmVkKChfX3UzMiopKChfX3U4ICopYWRkcmVzcyArIG9mZnNldCkpCisjZGVmaW5lIEdFVDgoYWRkcmVzcywgb2Zmc2V0KSBnZXRfdW5hbGlnbmVkKChfX3U2NCopKChfX3U4ICopYWRkcmVzcyArIG9mZnNldCkpCisjZGVmaW5lIFBVVDIoYWRkcmVzcywgb2Zmc2V0ICwgdmFsdWUpIHB1dF91bmFsaWduZWQoKHZhbHVlKSwgKF9fdTE2KikoKF9fdTggKilhZGRyZXNzICsgb2Zmc2V0KSkKKyNkZWZpbmUgUFVUNChhZGRyZXNzLCBvZmZzZXQgLCB2YWx1ZSkgcHV0X3VuYWxpZ25lZCgodmFsdWUpLCAoX191MzIqKSgoX191OCAqKWFkZHJlc3MgKyBvZmZzZXQpKQorI2RlZmluZSBQVVQ4KGFkZHJlc3MsIG9mZnNldCAsIHZhbHVlKSBwdXRfdW5hbGlnbmVkKCh2YWx1ZSksIChfX3U2NCopKChfX3U4ICopYWRkcmVzcyArIG9mZnNldCkpCisKK2VudW0gcnVubmVyX3N0YXR1c19lbnVtIHsKKwlpZGxlID0gMCwKKwlydW5uaW5nLAorCWRvX2Fib3J0LAorCWFib3J0aW5nLAorCWxvZ2ljYWxfZW90LAorCWVuZF9vZl90YXBlLAorfTsKKwordHlwZWRlZiBlbnVtIGZ0X2J1ZmZlcl9xdWV1ZSB7CisJZnRfcXVldWVfaGVhZCA9IDAsCisJZnRfcXVldWVfdGFpbCA9IDEKK30gZnRfYnVmZmVyX3F1ZXVlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0cmFjazsJCS8qIHRhcGUgaGVhZCBwb3NpdGlvbiAqLworCXZvbGF0aWxlIGludCBzZWdtZW50OwkvKiBjdXJyZW50IHNlZ21lbnQgKi8KKwl2b2xhdGlsZSBpbnQgc2VjdG9yOwkvKiBzZWN0b3Igb2Zmc2V0IHdpdGhpbiBjdXJyZW50IHNlZ21lbnQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgYm90OwkvKiBsb2dpY2FsIGJlZ2luIG9mIHRyYWNrICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGVvdDsJLyogbG9naWNhbCBlbmQgb2YgdHJhY2sgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQga25vd247CS8qIHZhbGlkYXRlcyBib3QsIHNlZ21lbnQsIHNlY3RvciAqLworfSBsb2NhdGlvbl9yZWNvcmQ7CisKKy8qICAgICAgQ291bnQgbnIgb2YgMSdzIGluIHBhdHRlcm4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvdW50X29uZXModW5zaWduZWQgbG9uZyBtYXNrKQoreworCWludCBiaXRzOworCisJZm9yIChiaXRzID0gMDsgbWFzayAhPSAwOyBtYXNrID4+PSAxKSB7CisJCWlmIChtYXNrICYgMSkgeworCQkJKytiaXRzOworCQl9CisJfQorCXJldHVybiBiaXRzOworfQorCisjZGVmaW5lIEZUX01BWF9OUl9CVUZGRVJTIDE2IC8qIGFyYml0cmFyeSB2YWx1ZSAqLworLyogICAgICBmdGFwZS1ydy5jIGRlZmluZWQgZ2xvYmFsIHZhcnMuCisgKi8KK2V4dGVybiBidWZmZXJfc3RydWN0ICpmdF9idWZmZXJbRlRfTUFYX05SX0JVRkZFUlNdOworZXh0ZXJuIGludCBmdF9ucl9idWZmZXJzOworZXh0ZXJuIGxvY2F0aW9uX3JlY29yZCBmdF9sb2NhdGlvbjsKK2V4dGVybiB2b2xhdGlsZSBpbnQgZnRhcGVfdGFwZV9ydW5uaW5nOworCisvKiAgICAgIGZ0YXBlLXJ3LmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCitleHRlcm4gaW50ICBmdGFwZV9zZXR1cF9uZXdfc2VnbWVudChidWZmZXJfc3RydWN0ICogYnVmZiwKKwkJCQkgICAgaW50IHNlZ21lbnRfaWQsCisJCQkJICAgIGludCBvZmZzZXQpOworZXh0ZXJuIGludCAgZnRhcGVfY2FsY19uZXh0X2NsdXN0ZXIoYnVmZmVyX3N0cnVjdCAqIGJ1ZmYpOworZXh0ZXJuIGJ1ZmZlcl9zdHJ1Y3QgKmZ0YXBlX25leHRfYnVmZmVyIChmdF9idWZmZXJfcXVldWVfdCBwb3MpOworZXh0ZXJuIGJ1ZmZlcl9zdHJ1Y3QgKmZ0YXBlX2dldF9idWZmZXIgIChmdF9idWZmZXJfcXVldWVfdCBwb3MpOworZXh0ZXJuIGludCAgICAgICAgICAgIGZ0YXBlX2J1ZmZlcl9pZCAgIChmdF9idWZmZXJfcXVldWVfdCBwb3MpOworZXh0ZXJuIHZvaWQgICAgICAgICAgIGZ0YXBlX3Jlc2V0X2J1ZmZlcih2b2lkKTsKK2V4dGVybiB2b2lkIGZ0YXBlX3RhcGVfcGFyYW1ldGVycyhfX3U4IGRyaXZlX2NvbmZpZ3VyYXRpb24pOworZXh0ZXJuIGludCAgZnRhcGVfd2FpdF9zZWdtZW50KGJ1ZmZlcl9zdGF0ZV9lbnVtIHN0YXRlKTsKK2V4dGVybiBpbnQgIGZ0YXBlX2R1bWJfc3RvcCh2b2lkKTsKK2V4dGVybiBpbnQgIGZ0YXBlX3N0YXJ0X3RhcGUoaW50IHNlZ21lbnRfaWQsIGludCBvZmZzZXQpOworZXh0ZXJuIGludCAgZnRhcGVfc3RvcF90YXBlKGludCAqcHN0YXR1cyk7CitleHRlcm4gaW50ICBmdGFwZV9oYW5kbGVfbG9naWNhbF9lb3Qodm9pZCk7CitleHRlcm4gYnVmZmVyX3N0YXRlX2VudW0gZnRhcGVfc2V0X3N0YXRlKGJ1ZmZlcl9zdGF0ZV9lbnVtIG5ld19zdGF0ZSk7CisjZW5kaWYJCQkJLyogX0ZUQVBFX1JXX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1zZXR1cC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXNldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwYTFhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS1zZXR1cC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXNldHVwLmMsdiAkCisgKiAkUmV2aXNpb246IDEuNyAkCisgKiAkRGF0ZTogMTk5Ny8xMC8xMCAwOTo1NzowNiAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgZm9yIHByb2Nlc3NpbmcgdGhlIGtlcm5lbCBjb21tYW5kCisgKiAgICAgIGxpbmUgb3B0aW9ucyBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyCisgKiAgICAgICJmdGFwZSIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mdGFwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZmRjLWlvLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcGFyYW1fdGFibGUgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICp2YXI7CisJaW50IGRlZl9wYXJhbTsKKwlpbnQgbWluOworCWludCBtYXg7Cit9IGNvbmZpZ19wYXJhbXNbXSBfX2luaXRkYXRhID0geworI2lmbmRlZiBDT05GSUdfRlRfTk9fVFJBQ0VfQVRfQUxMCisJeyAidHJhY2luZyIsICAgJmZ0YXBlX3RyYWNpbmcsICAgICAzLCAgICAgICAgICAgICAgZnRfdF9idWcsIGZ0X3RfYW55fSwKKyNlbmRpZgorCXsgImlvcG9ydCIsICAgICZmdF9mZGNfYmFzZSwgICAgICAgQ09ORklHX0ZUX0ZEQ19CQVNFLCAgICAgMHgwLCAweGZmZn0sCisJeyAiaXJxIiwgICAgICAgJmZ0X2ZkY19pcnEsICAgICAgICBDT05GSUdfRlRfRkRDX0lSUSwgICAgICAgIDIsICAgIDE1fSwKKwl7ICJkbWEiLCAgICAgICAmZnRfZmRjX2RtYSwgICAgICAgIENPTkZJR19GVF9GRENfRE1BLCAgICAgICAgMCwgICAgIDN9LAorCXsgInRocmVzaG9sZCIsICZmdF9mZGNfdGhyZXNob2xkLCAgQ09ORklHX0ZUX0ZEQ19USFIsICAgICAgICAgMSwgICAgMTZ9LAorCXsgImRhdGFyYXRlIiwgICZmdF9mZGNfcmF0ZV9saW1pdCwgQ09ORklHX0ZUX0ZEQ19NQVhfUkFURSwgNTAwLCAgMjAwMH0sCisJeyAiZmMxMCIsICAgICAgJmZ0X3Byb2JlX2ZjMTAsICAgICBDT05GSUdfRlRfUFJPQkVfRkMxMCwgICAgIDAsICAgICAxfSwKKwl7ICJtYWNoMiIsICAgICAmZnRfbWFjaDIsICAgICAgICAgIENPTkZJR19GVF9NQUNIMiwgICAgICAgICAgMCwgICAgIDF9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBmdGFwZV9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGk7CisJaW50IHBhcmFtOworCWludCBpbnRzWzJdOworCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCWlmIChzdHIpIHsKKwkJZm9yIChpPTA7IGkgPCBOUl9JVEVNUyhjb25maWdfcGFyYW1zKTsgaSsrKSB7CisJCQlpZiAoc3RyY21wKHN0cixjb25maWdfcGFyYW1zW2ldLm5hbWUpID09IDApeworCQkJCWlmIChpbnRzWzBdKSB7CisJCQkJCXBhcmFtID0gaW50c1sxXTsKKwkJCQl9IGVsc2UgeworCQkJCQlwYXJhbSA9IGNvbmZpZ19wYXJhbXNbaV0uZGVmX3BhcmFtOworCQkJCX0KKwkJCQlpZiAocGFyYW0gPCBjb25maWdfcGFyYW1zW2ldLm1pbiB8fAorCQkJCSAgICBwYXJhbSA+IGNvbmZpZ19wYXJhbXNbaV0ubWF4KSB7CisJCQkJCVRSQUNFKGZ0X3RfZXJyLAorCQkJCQkicGFyYW1ldGVyICVzIG91dCBvZiByYW5nZSAlZCAuLi4gJWQiLAorCQkJCQkgICAgICBjb25maWdfcGFyYW1zW2ldLm5hbWUsCisJCQkJCSAgICAgIGNvbmZpZ19wYXJhbXNbaV0ubWluLAorCQkJCQkgICAgICBjb25maWdfcGFyYW1zW2ldLm1heCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZihjb25maWdfcGFyYW1zW2ldLnZhcikgeworCQkJCQlUUkFDRShmdF90X2luZm8sICIlcz0lZCIsIHN0ciwgcGFyYW0pOworCQkJCQkqY29uZmlnX3BhcmFtc1tpXS52YXIgPSBwYXJhbTsKKwkJCQl9CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisJaWYgKHN0cikgeworCQlUUkFDRShmdF90X2VyciwgInVua25vd24gZnRhcGUgb3B0aW9uIFslc10iLCBzdHIpOworCQkKKwkJVFJBQ0UoZnRfdF9lcnIsICJhbGxvd2VkIG9wdGlvbnMgYXJlOiIpOworCQlmb3IgKGk9MDsgaSA8IE5SX0lURU1TKGNvbmZpZ19wYXJhbXMpOyBpKyspIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAiICVzIixjb25maWdfcGFyYW1zW2ldLm5hbWUpOworCQl9CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9lcnIsICJib3RjaGVkIGZ0YXBlIG9wdGlvbiIpOworCX0KKyBvdXQ6CisJVFJBQ0VfRVhJVCAxOworfQorCitfX3NldHVwKCJmdGFwZT0iLCBmdGFwZV9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmRjNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKKyAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoyNyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHJlYWRpbmcgY29kZQorICogICAgICBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KKy8qICAgICAgdHJhY2luZworICogICAgICBzZXQgaXQgdG86ICAgICB0byBsb2cgOgorICogICAgICAgMCAgICAgICAgICAgICAgYnVncworICogICAgICAgMSAgICAgICAgICAgICAgKyBlcnJvcnMKKyAqICAgICAgIDIgICAgICAgICAgICAgICsgd2FybmluZ3MKKyAqICAgICAgIDMgICAgICAgICAgICAgICsgaW5mb3JtYXRpb24KKyAqICAgICAgIDQgICAgICAgICAgICAgICsgbW9yZSBpbmZvcm1hdGlvbgorICogICAgICAgNSAgICAgICAgICAgICAgKyBwcm9ncmFtIGZsb3cKKyAqICAgICAgIDYgICAgICAgICAgICAgICsgZmRjL2RtYSBpbmZvCisgKiAgICAgICA3ICAgICAgICAgICAgICArIGRhdGEgZmxvdworICogICAgICAgOCAgICAgICAgICAgICAgKyBldmVyeXRoaW5nIGVsc2UKKyAqLworZnRfdHJhY2VfdCBmdGFwZV90cmFjaW5nID0gZnRfdF9pbmZvOyAvKiBEZWZhdWx0IGxldmVsOiBpbmZvcm1hdGlvbiBhbmQgdXAgKi8KK2ludCAgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbDsKKworLyogICAgICBMb2NhbCB2YXJzLgorICovCitzdGF0aWMgX191OCB0cmFjZV9pZDsKK3N0YXRpYyBjaGFyIHNwYWNpbmdbXSA9ICIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKwordm9pZCBmdGFwZV90cmFjZV9jYWxsKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqaW5kZW50OworCisJLyogICAgU2luY2UgcHJpbnRrIHNlZW1zIG5vdCB0byB3b3JrIHdpdGggIiUqcyIgZm9ybWF0CisJICogICAgd2UnbGwgdXNlIHRoaXMgd29yay1hcm91bmQuCisJICovCisJaWYgKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZ1bmN0aW9uIG5lc3QgbGV2ZWwgKCVkKSA8IDBcbiIsCisJCSAgICAgICBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKKwkJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCA9IDA7CisJfQorCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgc2l6ZW9mKHNwYWNpbmcpKSB7CisJCWluZGVudCA9IChzcGFjaW5nICsKKwkJCSAgc2l6ZW9mKHNwYWNpbmcpIC0gMSAtCisJCQkgIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOworCX0gZWxzZSB7CisJCWluZGVudCA9IHNwYWNpbmc7CisJfQorCXByaW50ayhLRVJOX0lORk8gIlslMDNkXSVzKyVzICglcylcbiIsCisJICAgICAgIChpbnQpIHRyYWNlX2lkKyssIGluZGVudCwgZmlsZSwgbmFtZSk7Cit9CisKK3ZvaWQgZnRhcGVfdHJhY2VfZXhpdChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmluZGVudDsKKworCS8qICAgIFNpbmNlIHByaW50ayBzZWVtcyBub3QgdG8gd29yayB3aXRoICIlKnMiIGZvcm1hdAorCSAqICAgIHdlJ2xsIHVzZSB0aGlzIHdvcmstYXJvdW5kLgorCSAqLworCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJmdW5jdGlvbiBuZXN0IGxldmVsICglZCkgPCAwXG4iLCBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKKwkJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCA9IDA7CisJfQorCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgc2l6ZW9mKHNwYWNpbmcpKSB7CisJCWluZGVudCA9IChzcGFjaW5nICsKKwkJCSAgc2l6ZW9mKHNwYWNpbmcpIC0gMSAtCisJCQkgIGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOworCX0gZWxzZSB7CisJCWluZGVudCA9IHNwYWNpbmc7CisJfQorCXByaW50ayhLRVJOX0lORk8gIlslMDNkXSVzLSVzICglcylcbiIsCisJICAgICAgIChpbnQpIHRyYWNlX2lkKyssIGluZGVudCwgZmlsZSwgbmFtZSk7Cit9CisKK3ZvaWQgZnRhcGVfdHJhY2VfbG9nKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uKQoreworCWNoYXIgKmluZGVudDsKKworCS8qICAgIFNpbmNlIHByaW50ayBzZWVtcyBub3QgdG8gd29yayB3aXRoICIlKnMiIGZvcm1hdAorCSAqICAgIHdlJ2xsIHVzZSB0aGlzIHdvcmstYXJvdW5kLgorCSAqLworCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJmdW5jdGlvbiBuZXN0IGxldmVsICglZCkgPCAwXG4iLCBmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsKTsKKwkJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCA9IDA7CisJfQorCWlmIChmdGFwZV9mdW5jdGlvbl9uZXN0X2xldmVsIDwgc2l6ZW9mKHNwYWNpbmcpKSB7CisJCWluZGVudCA9IChzcGFjaW5nICsgCisJCQkgIHNpemVvZihzcGFjaW5nKSAtIDEgLSAKKwkJCSAgZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCk7CisJfSBlbHNlIHsKKwkJaW5kZW50ID0gc3BhY2luZzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiWyUwM2RdJXMlcyAoJXMpIC0gIiwgCisJICAgICAgIChpbnQpIHRyYWNlX2lkKyssIGluZGVudCwgZmlsZSwgZnVuY3Rpb24pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3Y2QyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgKQEAgLTAsMCArMSwxODAgQEAKKyNpZm5kZWYgX0ZUQVBFX1RSQUNJTkdfSAorI2RlZmluZSBfRlRBUEVfVFJBQ0lOR19ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODoyOCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgdGhhdCBlYXNlcyB0aGUgZGVidWdnaW5nIG9mIHRoZQorICogICAgICBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciAiZnRhcGUiIGZvciBMaW51eC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKy8qCisgKiAgQmUgdmVyeSBjYXJlZnVsIHdpdGggVFJBQ0VfRVhJVCBhbmQgVFJBQ0VfQUJPUlQuCisgKgorICogIGlmIChzb21ldGhpbmcpIFRSQUNFX0VYSVQgZXJyb3I7CisgKgorICogIHdpbGwgTk9UIHdvcmsuIFVzZQorICoKKyAqICBpZiAoc29tZXRoaW5nKSB7CisgKiAgICBUUkFDRV9FWElUIGVycm9yOworICogIH0KKyAqCisgKiAgaW5zdGVhZC4gTWF5YmUgYSBiaXQgZGFuZ2Vyb3VzLCBidXQgc2F2ZSBsb3RzIG9mIGxpbmVzIG9mIGNvZGUuCisgKi8KKworI2RlZmluZSBMTF9YICIlZC8lZCBLQiIKKyNkZWZpbmUgTEwoeCkgKHVuc2lnbmVkIGludCkoKF9fdTY0KSh4KT4+MTApLCAodW5zaWduZWQgaW50KSgoeCkmMTAyMykKKwordHlwZWRlZiBlbnVtIHsKKwlmdF90X25pbCA9IC0xLAorCWZ0X3RfYnVnLAorCWZ0X3RfZXJyLAorCWZ0X3Rfd2FybiwKKwlmdF90X2luZm8sCisJZnRfdF9ub2lzZSwKKwlmdF90X2Zsb3csCisJZnRfdF9mZGNfZG1hLAorCWZ0X3RfZGF0YV9mbG93LAorCWZ0X3RfYW55Cit9IGZ0X3RyYWNlX3Q7CisKKyNpZmRlZiAgQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTAorLyogIHRoZSBjb21waWxlciB3aWxsIG9wdGltaXplIGF3YXkgbW9zdCBUUkFDRSgpIG1hY3JvcworICovCisjZGVmaW5lIEZUX1RSQUNFX1RPUF9MRVZFTAlmdF90X2J1ZworI2RlZmluZSBUUkFDRV9GVU4obGV2ZWwpCWRvIHt9IHdoaWxlKDApCisjZGVmaW5lIFRSQUNFX0VYSVQJCXJldHVybgorI2RlZmluZSBUUkFDRShsLCBtLCBpLi4uKQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJaWYgKChmdF90cmFjZV90KShsKSA9PSBGVF9UUkFDRV9UT1BfTEVWRUwpIHsJCQlcCisJCXByaW50ayhLRVJOX0lORk8iZnRhcGUlcyglcyk6XG4iCSAgICAgICAgICAgICAgICBcCisJCSAgICAgICBLRVJOX0lORk8gbSIuXG4iICxfX0ZJTEVfXywgX19GVU5DVElPTl9fICwgIyNpKTsJXAorCX0JCQkJCQkJCVwKK30KKyNkZWZpbmUgU0VUX1RSQUNFX0xFVkVMKGwpICAgICAgaWYgKChsKSA9PSAobCkpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIFRSQUNFX0xFVkVMCQlGVF9UUkFDRV9UT1BfTEVWRUwKKworI2Vsc2UKKworI2lmZGVmIENPTkZJR19GVF9OT19UUkFDRQorLyogIHRoZSBjb21waWxlciB3aWxsIG9wdGltaXplIGF3YXkgbWFueSBUUkFDRSgpIG1hY3JvcworICogIHRoZSBmdGFwZV9zaW1wbGVfdHJhY2VfY2FsbCgpIGZ1bmN0aW9uIHNpbXBseSBpbmNyZW1lbnRzIAorICogIHRoZSBmdW5jdGlvbiBuZXN0IGxldmVsLgorICovIAorI2RlZmluZSBGVF9UUkFDRV9UT1BfTEVWRUwJZnRfdF93YXJuCisjZGVmaW5lIFRSQUNFX0ZVTihsZXZlbCkJZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCsrCisjZGVmaW5lIFRSQUNFX0VYSVQJCWZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwtLTsgcmV0dXJuCisKKyNlbHNlCisjaWZkZWYgQ09ORklHX0ZUX0ZVTExfREVCVUcKKyNkZWZpbmUgRlRfVFJBQ0VfVE9QX0xFVkVMIGZ0X3RfYW55CisjZWxzZQorI2RlZmluZSBGVF9UUkFDRV9UT1BfTEVWRUwgZnRfdF9mbG93CisjZW5kaWYKKyNkZWZpbmUgVFJBQ0VfRlVOKGxldmVsKQkJCQkJXAorCWNvbnN0IGZ0X3RyYWNlX3QgX3RyYWNpbmcgPSBsZXZlbDsJCQlcCisJaWYgKGZ0YXBlX3RyYWNpbmcgPj0gKGZ0X3RyYWNlX3QpKGxldmVsKSAmJgkJXAorCSAgICAoZnRfdHJhY2VfdCkobGV2ZWwpIDw9IEZUX1RSQUNFX1RPUF9MRVZFTCkJCVwKKwkJZnRhcGVfdHJhY2VfY2FsbChfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsJXAorCWZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwgKys7CisKKyNkZWZpbmUgVFJBQ0VfRVhJVAkJCQkJCVwKKwktLWZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWw7CQkJCVwKKwlpZiAoZnRhcGVfdHJhY2luZyA+PSAoZnRfdHJhY2VfdCkoX3RyYWNpbmcpICYmCQlcCisJICAgIChmdF90cmFjZV90KShfdHJhY2luZykgPD0gRlRfVFJBQ0VfVE9QX0xFVkVMKQlcCisJCWZ0YXBlX3RyYWNlX2V4aXQoX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7CVwKKwlyZXR1cm4KKworI2VuZGlmCisKKyNkZWZpbmUgVFJBQ0UobCwgbSwgaS4uLikJCQkJCVwKK3sJCQkJCQkJCVwKKwlpZiAoZnRhcGVfdHJhY2luZyA+PSAoZnRfdHJhY2VfdCkobCkgJiYJCQlcCisJICAgIChmdF90cmFjZV90KShsKSA8PSBGVF9UUkFDRV9UT1BfTEVWRUwpIHsJCVwKKwkJZnRhcGVfdHJhY2VfbG9nKF9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOwlcCisJCXByaW50ayhtIi5cbiIgLCMjaSk7CQkJCVwKKwl9CQkJCQkJCVwKK30KKworI2RlZmluZSBTRVRfVFJBQ0VfTEVWRUwobCkgCQkJCVwKK3sJCQkJCQkJXAorCWlmICgoZnRfdHJhY2VfdCkobCkgPD0gRlRfVFJBQ0VfVE9QX0xFVkVMKSB7CVwKKwkJZnRhcGVfdHJhY2luZyA9IChmdF90cmFjZV90KShsKTsJXAorCX0gZWxzZSB7CQkJCQlcCisJCWZ0YXBlX3RyYWNpbmcgPSBGVF9UUkFDRV9UT1BfTEVWRUw7CVwKKwl9CQkJCQkJXAorfQorI2RlZmluZSBUUkFDRV9MRVZFTCAgICAJCQkJCQkJICAgICBcCisoKGZ0YXBlX3RyYWNpbmcgPD0gRlRfVFJBQ0VfVE9QX0xFVkVMKSA/IGZ0YXBlX3RyYWNpbmcgOiBGVF9UUkFDRV9UT1BfTEVWRUwpCisKKworLyogICAgICBHbG9iYWwgdmFyaWFibGVzIGRlY2xhcmVkIGluIHRyYWNpbmcuYworICovCitleHRlcm4gZnRfdHJhY2VfdCBmdGFwZV90cmFjaW5nOyAgLyogc2V0cyBkZWZhdWx0IGxldmVsICovCitleHRlcm4gaW50IGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWw7CisKKy8qICAgICAgR2xvYmFsIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiB0cmFjaW5nLmMKKyAqLworZXh0ZXJuIHZvaWQgZnRhcGVfdHJhY2VfY2FsbChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIGZ0YXBlX3RyYWNlX2V4aXQoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBmdGFwZV90cmFjZV9sb2cgKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUpOworCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTCkgKi8KKworLyoKKyAqICAgQWJvcnQgd2l0aCBhIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgVFJBQ0VfQUJPUlQocmVzLCBpLi4uKQkJCVwKK3sJCQkJCQlcCisgCVRSQUNFKGkpOwkJCQlcCisJVFJBQ0VfRVhJVCByZXM7CQkJCVwKK30KKworLyogICBUaGUgZm9sbG93aW5nIHRyYW5zZm9ybXMgdGhlIGNvbW1vbiAiaWYocmVzdWx0IDwgMCkgLi4uICIgaW50byBhCisgKiAgIG9uZS1saW5lci4KKyAqLworI2RlZmluZSBfVFJBQ0VfQ0FUQ0gobGV2ZWwsIGZ1biwgYWN0aW9uKQkJCQlcCit7CQkJCQkJCQkJXAorCWludCBfcmVzID0gKGZ1bik7CQkJCQkJXAorCWlmIChfcmVzIDwgMCkgewkJCQkJCQlcCisJCWRvIHsgYWN0aW9uIC8qICovIDsgfSB3aGlsZSgwKTsJCQkJXAorCQlUUkFDRV9BQk9SVChfcmVzLCBsZXZlbCwgIiVzIGZhaWxlZDogJWQiLCAjZnVuLAlfcmVzKTsJXAorCX0JCQkJCQkJCVwKK30KKworI2RlZmluZSBUUkFDRV9DQVRDSChmdW4sIGZhaWwpIF9UUkFDRV9DQVRDSChmdF90X2VyciwgZnVuLCBmYWlsKQorCisvKiAgQWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gd2hlbiBzaWduYWxsZWQuIFRoaXMgZG9lc24ndCBiZWxvbmcgaGVyZSwKKyAqICBidXQgcmF0aGVyIGludG8gZnRhcGUtcncuaCAobWF5YmUpCisgKi8KKyNkZWZpbmUgRlRfU0lHTkFMX0VYSVQoc2lnX21hc2spCQkJCQlcCisJaWYgKHNpZ3Rlc3RzZXRtYXNrKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgc2lnX21hc2spKSB7CVwKKwkJVFJBQ0VfQUJPUlQoLUVJTlRSLAkJCQkJXAorCQkJICAgIGZ0X3Rfd2FybiwJCQkJCVwKKwkJCSAgICAiaW50ZXJydXB0ZWQgYnkgbm9uLWJsb2NrYWJsZSBzaWduYWwiKTsJXAorCX0KKworI2VuZGlmIC8qIF9GVEFQRV9UUkFDSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2MDFlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5jCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NSBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMy40LjEgJAorICogJERhdGU6IDE5OTcvMTEvMTQgMTg6MDc6MDQgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSB3cml0aW5nIGNvZGUKKyAqICAgICAgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvcWljMTE3Lmg+CisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1lY2MuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaXNyLmgiCisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KKworLyogICAgICBMb2NhbCB2YXJzLgorICovCitzdGF0aWMgaW50IGxhc3Rfd3JpdGVfZmFpbGVkOworCit2b2lkIGZ0YXBlX3phcF93cml0ZV9idWZmZXJzKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnRfbnJfYnVmZmVyczsgKytpKSB7CisJCWZ0X2J1ZmZlcltpXS0+c3RhdHVzID0gZG9uZTsKKwl9CisJZnRhcGVfcmVzZXRfYnVmZmVyKCk7Cit9CisKK3N0YXRpYyBpbnQgY29weV9hbmRfZ2VuX2VjYyh2b2lkICpkZXN0aW5hdGlvbiwgCisJCQkgICAgY29uc3Qgdm9pZCAqc291cmNlLAorCQkJICAgIGNvbnN0IFNlY3Rvck1hcCBiYWRfc2VjdG9yX21hcCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBtZW1vcnlfc2VnbWVudCBtc2VnOworCWludCBiYWRzID0gY291bnRfb25lcyhiYWRfc2VjdG9yX21hcCk7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKworCWlmIChiYWRzID4gMCkgeworCQlUUkFDRShmdF90X25vaXNlLCAiYmFkIHNlY3RvcnMgaW4gbWFwOiAlZCIsIGJhZHMpOworCX0KKwlpZiAoYmFkcyArIDMgPj0gRlRfU0VDVE9SU19QRVJfU0VHTUVOVCkgeworCQlUUkFDRShmdF90X25vaXNlLCAiZW1wdHkgc2VnbWVudCIpOworCQltc2VnLmJsb2NrcyA9IDA7IC8qIHNraXAgZW50aXJlIHNlZ21lbnQgKi8KKwkJcmVzdWx0ID0gMDsgICAgICAvKiBub3RoaW5nIHdyaXR0ZW4gKi8KKwl9IGVsc2UgeworCQltc2VnLmJsb2NrcyA9IEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgLSBiYWRzOworCQltc2VnLmRhdGEgPSBkZXN0aW5hdGlvbjsKKwkJbWVtY3B5KG1zZWcuZGF0YSwgc291cmNlLCAobXNlZy5ibG9ja3MgLSAzKSAqIEZUX1NFQ1RPUl9TSVpFKTsKKwkJcmVzdWx0ID0gZnRhcGVfZWNjX3NldF9zZWdtZW50X3Bhcml0eSgmbXNlZyk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlUUkFDRShmdF90X2VyciwgImVjY19zZXRfc2VnbWVudF9wYXJpdHkgZmFpbGVkIik7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSAobXNlZy5ibG9ja3MgLSAzKSAqIEZUX1NFQ1RPUl9TSVpFOworCQl9CisJfQorCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisKK2ludCBmdGFwZV9zdGFydF93cml0aW5nKGNvbnN0IGZ0X3dyaXRlX21vZGVfdCBtb2RlKQoreworCWJ1ZmZlcl9zdHJ1Y3QgKmhlYWQgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpOworCWludCBzZWdtZW50X2lkID0gaGVhZC0+c2VnbWVudF9pZDsKKwlpbnQgcmVzdWx0OworCWJ1ZmZlcl9zdGF0ZV9lbnVtIHdhbnRlZF9zdGF0ZSA9IChtb2RlID09IEZUX1dSX0RFTEVURQorCQkJCQkgID8gZGVsZXRpbmcKKwkJCQkJICA6IHdyaXRpbmcpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKChmdF9kcml2ZXJfc3RhdGUgIT0gd2FudGVkX3N0YXRlKSB8fCBoZWFkLT5zdGF0dXMgIT0gd2FpdGluZykgeworCQlUUkFDRV9FWElUIDA7CisJfQorCWZ0YXBlX3NldHVwX25ld19zZWdtZW50KGhlYWQsIHNlZ21lbnRfaWQsIDEpOworCWlmIChtb2RlID09IEZUX1dSX1NJTkdMRSkgeworCQkvKiBzdG9wIHRhcGUgaW5zdGVhZCBvZiBwYXVzZSAqLworCQloZWFkLT5uZXh0X3NlZ21lbnQgPSAwOworCX0KKwlmdGFwZV9jYWxjX25leHRfY2x1c3RlcihoZWFkKTsgLyogcHJlcGFyZSAqLworCWhlYWQtPnN0YXR1cyA9IGZ0X2RyaXZlcl9zdGF0ZTsgLyogZWl0aGVyIHdyaXRpbmcgb3IgZGVsZXRpbmcgKi8KKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBpZGxlKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCSAgICAgICJzdGFydGluZyBydW5uZXIgZm9yIHNlZ21lbnQgJWQiLCBzZWdtZW50X2lkKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfc3RhcnRfdGFwZShzZWdtZW50X2lkLGhlYWQtPnNlY3Rvcl9vZmZzZXQpLCk7CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInJ1bm5lciBub3QgaWRsZSwgbm90IHN0YXJ0aW5nIHRhcGUiKTsKKwl9CisJLyogZ28gKi8KKwlyZXN1bHQgPSBmZGNfc2V0dXBfcmVhZF93cml0ZShoZWFkLCAobW9kZSA9PSBGVF9XUl9ERUxFVEUKKwkJCQkJICAgICA/IEZEQ19XUklURV9ERUxFVEVEIDogRkRDX1dSSVRFKSk7CisJZnRhcGVfc2V0X3N0YXRlKHdhbnRlZF9zdGF0ZSk7IC8qIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5ICovCisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qICBXYWl0IHVudGlsIGFsbCBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGFwZS4KKyAqICAKKyAqICBUaGVyZSBpcyBhIHByb2JsZW06IHdoZW4gdGhlIHRhcGUgcnVucyBpbnRvIGxvZ2ljYWwgRU9ULCB0aGVuIHRoaXMKKyAqICBmYWlsZXMuIFdlIG5lZWQgdG8gcmVzdGFydCB0aGUgcnVubmVyIGluIHRoaXMgY2FzZS4KKyAqLworaW50IGZ0YXBlX2xvb3BfdW50aWxfd3JpdGVzX2RvbmUodm9pZCkKK3sKKwlidWZmZXJfc3RydWN0ICpoZWFkOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJd2hpbGUgKChmdF9kcml2ZXJfc3RhdGUgPT0gd3JpdGluZyB8fCBmdF9kcml2ZXJfc3RhdGUgPT0gZGVsZXRpbmcpICYmIAorCSAgICAgICBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX2hlYWQpLT5zdGF0dXMgIT0gZG9uZSkgeworCQkvKiBzZXQgdGhlIHJ1bm5lciBzdGF0dXMgdG8gaWRsZSBpZiBhdCBsRU9UICovCisJCVRSQUNFX0NBVENIKGZ0YXBlX2hhbmRsZV9sb2dpY2FsX2VvdCgpLAlsYXN0X3dyaXRlX2ZhaWxlZCA9IDEpOworCQkvKiByZXN0YXJ0IHRoZSB0YXBlIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBpZGxlKSB7CisJCQlUUkFDRShmdF90X25vaXNlLCAicnVubmVyIGlzIGlkbGUsIHJlc3RhcnRpbmciKTsKKwkJCWlmIChmdF9kcml2ZXJfc3RhdGUgPT0gZGVsZXRpbmcpIHsKKwkJCQlUUkFDRV9DQVRDSChmdGFwZV9zdGFydF93cml0aW5nKEZUX1dSX0RFTEVURSksCisJCQkJCSAgICBsYXN0X3dyaXRlX2ZhaWxlZCA9IDEpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRV9DQVRDSChmdGFwZV9zdGFydF93cml0aW5nKEZUX1dSX01VTFRJKSwKKwkJCQkJICAgIGxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7CisJCQl9CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgInRhaWw6ICVkLCBoZWFkOiAlZCIsIAorCQkgICAgICBmdGFwZV9idWZmZXJfaWQoZnRfcXVldWVfdGFpbCksCisJCSAgICAgIGZ0YXBlX2J1ZmZlcl9pZChmdF9xdWV1ZV9oZWFkKSk7CisJCVRSQUNFX0NBVENIKGZkY19pbnRlcnJ1cHRfd2FpdCg1ICogRlRfU0VDT05EKSwKKwkJCSAgICBsYXN0X3dyaXRlX2ZhaWxlZCA9IDEpOworCQloZWFkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKwkJaWYgKGhlYWQtPnN0YXR1cyA9PSBlcnJvcikgeworCQkJLyogQWxsb3cgZXNjYXBlIGZyb20gbG9vcCB3aGVuIHNpZ25hbGVkICEKKwkJCSAqLworCQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQkJaWYgKGhlYWQtPmhhcmRfZXJyb3JfbWFwICE9IDApIHsKKwkJCQkvKiAgSW1wbGVtZW50IGhhcmQgd3JpdGUgZXJyb3IgcmVjb3ZlcnkgaGVyZQorCQkJCSAqLworCQkJfQorCQkJLyogcmV0cnkgdGhpcyBvbmUgKi8KKwkJCWhlYWQtPnN0YXR1cyA9IHdhaXRpbmc7CisJCQlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZykgeworCQkJCWZ0YXBlX2R1bWJfc3RvcCgpOworCQkJfQorCQkJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgIT0gaWRsZSkgeworCQkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJCQkgICAgInVuZXhwZWN0ZWQgc3RhdGU6ICIKKwkJCQkJICAgICJmdF9ydW5uZXJfc3RhdHVzICE9IGlkbGUiKTsKKwkJCX0KKwkJCWZ0YXBlX3N0YXJ0X3dyaXRpbmcoZnRfZHJpdmVyX3N0YXRlID09IGRlbGV0aW5nCisJCQkJCSAgICA/IEZUX1dSX01VTFRJIDogRlRfV1JfREVMRVRFKTsKKwkJfQorCQlUUkFDRShmdF90X25vaXNlLCAibG9vcGluZyB1bnRpbCB3cml0ZXMgZG9uZSIpOworCX0KKwlmdGFwZV9zZXRfc3RhdGUoaWRsZSk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIFdyaXRlIGdpdmVuIHNlZ21lbnQgZnJvbSBidWZmZXIgYXQgYWRkcmVzcyB0byB0YXBlLgorICovCitzdGF0aWMgaW50IHdyaXRlX3NlZ21lbnQoY29uc3QgaW50IHNlZ21lbnRfaWQsCisJCQkgY29uc3Qgdm9pZCAqYWRkcmVzcywgCisJCQkgY29uc3QgZnRfd3JpdGVfbW9kZV90IHdyaXRlX21vZGUpCit7CisJaW50IGJ5dGVzX3dyaXR0ZW4gPSAwOworCWJ1ZmZlcl9zdHJ1Y3QgKnRhaWw7CisJYnVmZmVyX3N0YXRlX2VudW0gd2FudGVkX3N0YXRlID0gKHdyaXRlX21vZGUgPT0gRlRfV1JfREVMRVRFCisJCQkJCSAgPyBkZWxldGluZyA6IHdyaXRpbmcpOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgInNlZ21lbnRfaWQgPSAlZCIsIHNlZ21lbnRfaWQpOworCWlmIChmdF9kcml2ZXJfc3RhdGUgIT0gd2FudGVkX3N0YXRlKSB7CisJCWlmIChmdF9kcml2ZXJfc3RhdGUgPT0gZGVsZXRpbmcgfHwKKwkJICAgIHdhbnRlZF9zdGF0ZSA9PSBkZWxldGluZykgeworCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpLCk7CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImNhbGxpbmcgZnRhcGVfYWJvcnRfb3BlcmF0aW9uIik7CisJCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7CisJCWZ0YXBlX3phcF93cml0ZV9idWZmZXJzKCk7CisJCWZ0YXBlX3NldF9zdGF0ZSh3YW50ZWRfc3RhdGUpOworCX0KKwkvKiAgICBpZiBhbGwgYnVmZmVycyBmdWxsIHdlJ2xsIGhhdmUgdG8gd2FpdC4uLgorCSAqLworCWZ0YXBlX3dhaXRfc2VnbWVudCh3YW50ZWRfc3RhdGUpOworCXRhaWwgPSBmdGFwZV9nZXRfYnVmZmVyKGZ0X3F1ZXVlX3RhaWwpOworCXN3aXRjaCh0YWlsLT5zdGF0dXMpIHsKKwljYXNlIGRvbmU6CisJCWZ0X2hpc3RvcnkuZGVmZWN0cyArPSBjb3VudF9vbmVzKHRhaWwtPmhhcmRfZXJyb3JfbWFwKTsKKwkJYnJlYWs7CisJY2FzZSB3YWl0aW5nOgorCQkvKiB0aGlzIGNvdWxkIGhhcHBlbiB3aXRoIG11bHRpcGxlIEVNUFRZX1NFR01FTlRzLCBidXQKKwkJICogc2hvdWxkbid0IGhhcHBlbiBhbnkgbW9yZSBhcyB3ZSByZS1zdGFydCB0aGUgcnVubmVyIGV2ZW4KKwkJICogd2l0aCBhbiBlbXB0eSBzZWdtZW50LgorCQkgKi8KKwkJYnl0ZXNfd3JpdHRlbiA9IC1FQUdBSU47CisJCWJyZWFrOworCWNhc2UgZXJyb3I6CisJCS8qICBzZXR1cCBmb3IgYSByZXRyeQorCQkgKi8KKwkJdGFpbC0+c3RhdHVzID0gd2FpdGluZzsKKwkJYnl0ZXNfd3JpdHRlbiA9IC1FQUdBSU47IC8qIGZvcmNlIHJldHJ5ICovCisJCWlmICh0YWlsLT5oYXJkX2Vycm9yX21hcCAhPSAwKSB7CisJCQlUUkFDRShmdF90X3dhcm4sIAorCQkJICAgICAgIndhcm5pbmc6ICVkIGhhcmQgZXJyb3IocykgaW4gd3JpdHRlbiBzZWdtZW50IiwKKwkJCSAgICAgIGNvdW50X29uZXModGFpbC0+aGFyZF9lcnJvcl9tYXApKTsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJoYXJkX2Vycm9yX21hcCA9IDB4JTA4bHgiLCAKKwkJCSAgICAgIChsb25nKXRhaWwtPmhhcmRfZXJyb3JfbWFwKTsKKwkJCS8qICBJbXBsZW1lbnQgaGFyZCB3cml0ZSBlcnJvciByZWNvdmVyeSBoZXJlCisJCQkgKi8KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCSAgICAid2FpdCBmb3IgZW1wdHkgc2VnbWVudCBmYWlsZWQsIHRhaWwgc3RhdHVzOiAlZCIsCisJCQkgICAgdGFpbC0+c3RhdHVzKTsKKwl9CisJLyogICAgc2hvdWxkIHJ1bm5lciBzdG9wID8KKwkgKi8KKwlpZiAoZnRfcnVubmVyX3N0YXR1cyA9PSBhYm9ydGluZykgeworCQlidWZmZXJfc3RydWN0ICpoZWFkID0gZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV9oZWFkKTsKKwkJaWYgKGhlYWQtPnN0YXR1cyA9PSB3YW50ZWRfc3RhdGUpIHsKKwkJCWhlYWQtPnN0YXR1cyA9IGRvbmU7IC8qID8/Pz8gKi8KKwkJfQorCQkvKiAgZG9uJ3QgY2FsbCBhYm9ydF9vcGVyYXRpb24oKSwgd2UgZG9uJ3Qgd2FudCB0byB6YXAKKwkJICogIHRoZSBkbWEgYnVmZmVycworCQkgKi8KKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfZHVtYl9zdG9wKCksKTsKKwl9IGVsc2UgeworCQkvKiAgSWYganVzdCBwYXNzZWQgbGFzdCBzZWdtZW50IG9uIHRhcGU6IHdhaXQgZm9yIEJPVAorCQkgKiAgb3IgRU9UIG1hcmsuIFNldHMgZnRfcnVubmVyX3N0YXR1cyB0byBpZGxlIGlmIGF0IGxFT1QKKwkJICogIGFuZCBzdWNjZXNzZnVsIAorCQkgKi8KKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfaGFuZGxlX2xvZ2ljYWxfZW90KCksKTsKKwl9CisJaWYgKHRhaWwtPnN0YXR1cyA9PSBkb25lKSB7CisJCS8qIG5vdyBhdCBsZWFzdCBvbmUgYnVmZmVyIGlzIGVtcHR5LCBmaWxsIGl0IHdpdGggb3VyCisJCSAqIGRhdGEuICBza2lwIGJhZCBzZWN0b3JzIGFuZCBnZW5lcmF0ZSBlY2MuCisJCSAqIGNvcHlfYW5kX2dlbl9lY2MgcmV0dXJuIG5yIG9mIGJ5dGVzIHdyaXR0ZW4sIHJhbmdlCisJCSAqIDAuLjI5IEtiIGluY2x1c2l2ZSEgIAorCQkgKgorCQkgKiBFbXB0eSBzZWdtZW50cyBhcmUgaGFuZGxlZCBpbnNpZGUgY295cF9hbmRfZ2VuX2VjYygpCisJCSAqLworCQlpZiAod3JpdGVfbW9kZSAhPSBGVF9XUl9ERUxFVEUpIHsKKwkJCVRSQUNFX0NBVENIKGJ5dGVzX3dyaXR0ZW4gPSBjb3B5X2FuZF9nZW5fZWNjKAorCQkJCXRhaWwtPmFkZHJlc3MsIGFkZHJlc3MsCisJCQkJZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudF9pZCkpLCk7CisJCX0KKwkJdGFpbC0+c2VnbWVudF9pZCA9IHNlZ21lbnRfaWQ7CisJCXRhaWwtPnN0YXR1cyA9IHdhaXRpbmc7CisJCXRhaWwgPSBmdGFwZV9uZXh0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKTsKKwl9CisJLyogIFN0YXJ0IHRhcGUgb25seSBpZiBhbGwgYnVmZmVycyBmdWxsIG9yIGZsdXNoIG1vZGUuCisJICogIFRoaXMgd2lsbCBnaXZlIGhpZ2hlciBwcm9iYWJpbGl0eSBvZiBzdHJlYW1pbmcuCisJICovCisJaWYgKGZ0X3J1bm5lcl9zdGF0dXMgIT0gcnVubmluZyAmJiAKKwkgICAgKCh0YWlsLT5zdGF0dXMgPT0gd2FpdGluZyAmJgorCSAgICAgIGZ0YXBlX2dldF9idWZmZXIoZnRfcXVldWVfaGVhZCkgPT0gdGFpbCkgfHwKKwkgICAgIHdyaXRlX21vZGUgIT0gRlRfV1JfQVNZTkMpKSB7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3N0YXJ0X3dyaXRpbmcod3JpdGVfbW9kZSksKTsKKwl9CisJVFJBQ0VfRVhJVCBieXRlc193cml0dGVuOworfQorCisvKiAgV3JpdGUgYXMgbXVjaCBhcyBmaXRzIGZyb20gYnVmZmVyIHRvIHRoZSBnaXZlbiBzZWdtZW50IG9uIHRhcGUKKyAqICBhbmQgaGFuZGxlIHJldHJpZXMuCisgKiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAoPj0gMCksIG9yOgorICogICAgICAtRUlPICAgICAgICAgIHdyaXRlIGZhaWxlZAorICogICAgICAtRUlOVFIgICAgICAgIGludGVycnVwdGVkIGJ5IHNpZ25hbAorICogICAgICAtRU5PU1BDICAgICAgIGRldmljZSBmdWxsCisgKi8KK2ludCBmdGFwZV93cml0ZV9zZWdtZW50KGNvbnN0IGludCBzZWdtZW50X2lkLAorCQkJY29uc3Qgdm9pZCAqYnVmZmVyLCAKKwkJCWNvbnN0IGZ0X3dyaXRlX21vZGVfdCBmbHVzaCkKK3sKKwlpbnQgcmV0cnkgPSAwOworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlmdF9oaXN0b3J5LnVzZWQgfD0gMjsKKwlpZiAoc2VnbWVudF9pZCA+PSBmdF90cmFja3NfcGVyX3RhcGUqZnRfc2VnbWVudHNfcGVyX3RyYWNrKSB7CisJCS8qIHRhcGUgZnVsbCAqLworCQlUUkFDRV9BQk9SVCgtRU5PU1BDLCBmdF90X2VyciwKKwkJCSAgICAiaW52YWxpZCBzZWdtZW50IGlkOiAlZCAobWF4ICVkKSIsIAorCQkJICAgIHNlZ21lbnRfaWQsIAorCQkJICAgIGZ0X3RyYWNrc19wZXJfdGFwZSAqIGZ0X3NlZ21lbnRzX3Blcl90cmFjayAtMSk7CisJfQorCWZvciAoOzspIHsKKwkJaWYgKChyZXN1bHQgPSB3cml0ZV9zZWdtZW50KHNlZ21lbnRfaWQsIGJ1ZmZlciwgZmx1c2gpKSA+PSAwKSB7CisJCQlpZiAocmVzdWx0ID09IDApIHsgLyogZW1wdHkgc2VnbWVudCAqLworCQkJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCQkJICAgICAgImVtcHR5IHNlZ21lbnQsIG5vdGhpbmcgd3JpdHRlbiIpOworCQkJfQorCQkJVFJBQ0VfRVhJVCByZXN1bHQ7CisJCX0KKwkJaWYgKHJlc3VsdCA9PSAtRUFHQUlOKSB7CisJCQlpZiAoKytyZXRyeSA+IDEwMCkgeyAvKiBnaXZlIHVwICovCisJCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkJICAgICAgIndyaXRlIGZhaWxlZCwgPjEwMCByZXRyaWVzIGluIHNlZ21lbnQiKTsKKwkJCX0KKwkJCVRSQUNFKGZ0X3Rfd2FybiwgIndyaXRlIGVycm9yLCByZXRyeSAlZCAoJWQpIiwKKwkJCSAgICAgIHJldHJ5LAorCQkJICAgICAgZnRhcGVfZ2V0X2J1ZmZlcihmdF9xdWV1ZV90YWlsKS0+c2VnbWVudF9pZCk7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9BQk9SVChyZXN1bHQsIGZ0X3RfZXJyLAorCQkJCSAgICAid3JpdGVfc2VnbWVudCBmYWlsZWQsIGVycm9yOiAlZCIsIHJlc3VsdCk7CisJCX0KKwkJLyogQWxsb3cgZXNjYXBlIGZyb20gbG9vcCB3aGVuIHNpZ25hbGVkICEKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZS13cml0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlN2Y4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9GVEFQRV9XUklURV9ICisjZGVmaW5lIF9GVEFQRV9XUklURV9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSBCYXMgTGFhcmhvdmVuLAorICogICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCx2ICQKKyAkQXV0aG9yOiBjbGF1cyAkCisgKgorICRSZXZpc2lvbjogMS4yICQKKyAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODozMCAkCisgJFN0YXRlOiBFeHAgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHdyaXRlIGZ1bmN0aW9ucworICogICAgICBmb3IgdGhlIFFJQy0xMTcgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKi8KKworCisvKiAgICAgIGZ0YXBlLXdyaXRlLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgorICovCit0eXBlZGVmIGVudW0geworCUZUX1dSX0FTWU5DICA9IDAsIC8qIHN0YXJ0IHRhcGUgb25seSB3aGVuIGFsbCBidWZmZXJzIGFyZSBmdWxsICovCisJRlRfV1JfTVVMVEkgID0gMSwgLyogc3RhcnQgdGFwZSwgYnV0IGRvbid0IG5lY2Vzc2FyaWx5IHN0b3AgKi8KKwlGVF9XUl9TSU5HTEUgPSAyLCAvKiB3cml0ZSBhIHNpbmdsZSBzZWdtZW50IGFuZCBzdG9wIGFmdGVyd2FyZHMgKi8KKwlGVF9XUl9ERUxFVEUgPSAzICAvKiB3cml0ZSBkZWxldGVkIGRhdGEgbWFya3MgKi8KK30gZnRfd3JpdGVfbW9kZV90OworCitleHRlcm4gaW50ICBmdGFwZV9zdGFydF93cml0aW5nKGNvbnN0IGZ0X3dyaXRlX21vZGVfdCBtb2RlKTsKK2V4dGVybiBpbnQgIGZ0YXBlX3dyaXRlX3NlZ21lbnQoY29uc3QgaW50IHNlZ21lbnQsCisJCQkJY29uc3Qgdm9pZCAqYWRkcmVzcywgCisJCQkJY29uc3QgZnRfd3JpdGVfbW9kZV90IGZsdXNoaW5nKTsKK2V4dGVybiB2b2lkIGZ0YXBlX3phcF93cml0ZV9idWZmZXJzKHZvaWQpOworZXh0ZXJuIGludCAgZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSh2b2lkKTsKKworI2VuZGlmCQkJCS8qIF9GVEFQRV9XUklURV9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mdGFwZV9zeW1zLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGVfc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYzNhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZnRhcGVfc3ltcy5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS9sb3dsZXZlbC9mdGFwZV9zeW1zLmMsdiAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKiAkRGF0ZTogMTk5Ny8xMC8xNyAwMDowMzo1MSAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN5bWJvbHMgdGhhdCB0aGUgZnRhcGUgbG93IGxldmVsCisgKiAgICAgIHBhcnQgb2YgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyICJmdGFwZSIKKyAqICAgICAgZXhwb3J0cyB0byBpdHMgaGlnaCBsZXZlbCBjbGllbnRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZnRhcGUuaD4KKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2ZkYy1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1idWZmZXIuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1mb3JtYXQuaCIKKworLyogYmFkIHNlY3RvciBoYW5kbGluZyBmcm9tIGZ0YXBlLWJzbS5jICovCitFWFBPUlRfU1lNQk9MKGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfZmluZF9lbmRfb2ZfYnNtX2xpc3QpOworLyogZnJvbSBmdGFwZS1ydy5jICovCitFWFBPUlRfU1lNQk9MKGZ0YXBlX3NldF9zdGF0ZSk7CisvKiBmcm9tIGZ0YXBlLWN0bC5jICovCitFWFBPUlRfU1lNQk9MKGZ0YXBlX3NlZWtfdG9fYm90KTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfc2Vla190b19lb3QpOworRVhQT1JUX1NZTUJPTChmdGFwZV9hYm9ydF9vcGVyYXRpb24pOworRVhQT1JUX1NZTUJPTChmdGFwZV9nZXRfc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfZW5hYmxlKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfZGlzYWJsZSk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX21tYXApOworRVhQT1JUX1NZTUJPTChmdGFwZV9jYWxpYnJhdGVfZGF0YV9yYXRlKTsKKy8qIGZyb20gZnRhcGUtaW8uYyAqLworRVhQT1JUX1NZTUJPTChmdGFwZV9yZXNldF9kcml2ZSk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2NvbW1hbmQpOworRVhQT1JUX1NZTUJPTChmdGFwZV9wYXJhbWV0ZXIpOworRVhQT1JUX1NZTUJPTChmdGFwZV9yZWFkeV93YWl0KTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfcmVwb3J0X29wZXJhdGlvbik7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3JlcG9ydF9lcnJvcik7CisvKiBmcm9tIGZ0YXBlLXJlYWQuYyAqLworRVhQT1JUX1NZTUJPTChmdGFwZV9yZWFkX3NlZ21lbnRfZnJhY3Rpb24pOworRVhQT1JUX1NZTUJPTChmdGFwZV96YXBfcmVhZF9idWZmZXJzKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfcmVhZF9oZWFkZXJfc2VnbWVudCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX2RlY29kZV9oZWFkZXJfc2VnbWVudCk7CisvKiBmcm9tIGZ0YXBlLXdyaXRlLmMgKi8KK0VYUE9SVF9TWU1CT0woZnRhcGVfd3JpdGVfc2VnbWVudCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3N0YXJ0X3dyaXRpbmcpOworRVhQT1JUX1NZTUJPTChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKTsKKy8qIGZyb20gZnRhcGUtYnVmZmVyLmggKi8KK0VYUE9SVF9TWU1CT0woZnRhcGVfc2V0X25yX2J1ZmZlcnMpOworLyogZnJvbSBmdGFwZS1mb3JtYXQuaCAqLworRVhQT1JUX1NZTUJPTChmdGFwZV9mb3JtYXRfdHJhY2spOworRVhQT1JUX1NZTUJPTChmdGFwZV9mb3JtYXRfc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfdmVyaWZ5X3NlZ21lbnQpOworLyogZnJvbSB0cmFjaW5nLmMgKi8KKyNpZm5kZWYgQ09ORklHX0ZUX05PX1RSQUNFX0FUX0FMTAorRVhQT1JUX1NZTUJPTChmdGFwZV90cmFjaW5nKTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfZnVuY3Rpb25fbmVzdF9sZXZlbCk7CitFWFBPUlRfU1lNQk9MKGZ0YXBlX3RyYWNlX2NhbGwpOworRVhQT1JUX1NZTUJPTChmdGFwZV90cmFjZV9leGl0KTsKK0VYUE9SVF9TWU1CT0woZnRhcGVfdHJhY2VfbG9nKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkxYzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS9NYWtlZmlsZQpAQCAtMCwwICsxLDM2IEBACisjCisjICAgICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyMKKyMgJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS9NYWtlZmlsZSx2ICQKKyMgJFJldmlzaW9uOiAxLjQgJAorIyAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODo1OCAkCisjCisjICAgICAgTWFrZWZpbGUgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIHpmdGFwZSBpbnRlcmZhY2UgVkZTIHRvCisjICAgICAgZnRhcGUKKyMKKworCisjIFpGVF9PQlNPTEVURSAtIGVuYWJsZSB0aGUgTVRJT0NfWkZUQVBFX0dFVEJMS1NaIGlvY3RsLiBZb3Ugc2hvdWxkCisjICAgICAgICAgICAgICAgIGxlYXZlIHRoaXMgZW5hYmxlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRhcGVyLgorCitvYmotJChDT05GSUdfWkZUQVBFKSArPSB6ZnRhcGUubworCit6ZnRhcGUtb2JqcyA6PSB6ZnRhcGUtcncubyB6ZnRhcGUtY3RsLm8gemZ0YXBlLXJlYWQubyBcCisJICAgICAgIHpmdGFwZS13cml0ZS5vIHpmdGFwZS12dGJsLm8gemZ0YXBlLWVvZi5vIFwKKwkgICAgICAgemZ0YXBlLWluaXQubyB6ZnRhcGUtYnVmZmVycy5vIHpmdGFwZV9zeW1zLm8KKworRVhUUkFfQ0ZMQUdTIDo9IC1EWkZUX09CU09MRVRFCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwNmYxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjU5ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZHluYW1pYyBidWZmZXIgYWxsb2NhdGlvbiByb3V0aW5lcyAKKyAqICAgICAgb2YgemZ0YXBlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCisKKy8qICBnbG9iYWwgdmFyaWFibGVzCisgKi8KKworLyogIGxvY2FsIHZhcmliYWxlcworICovCitzdGF0aWMgdW5zaWduZWQgaW50IHVzZWRfbWVtb3J5Oworc3RhdGljIHVuc2lnbmVkIGludCBwZWFrX21lbW9yeTsKKwordm9pZCB6ZnRfbWVtb3J5X3N0YXRzKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X25vaXNlLCAiTWVtb3J5IHVzYWdlICh2bWFsbG9jIGFsbG9jYXRpb25zKTpcbiIKKwkgICAgICBLRVJOX0lORk8gInRvdGFsIGFsbG9jYXRlZDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gInBlYWsgYWxsb2NhdGlvbjogJWQiLAorCSAgICAgIHVzZWRfbWVtb3J5LCBwZWFrX21lbW9yeSk7CisJcGVha19tZW1vcnkgPSB1c2VkX21lbW9yeTsKKwlUUkFDRV9FWElUOworfQorCitpbnQgemZ0X3ZjYWxsb2Nfb25jZSh2b2lkICpuZXcsIHNpemVfdCBzaXplKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCWlmICh6ZnRfdm1hbGxvY19vbmNlKG5ldywgc2l6ZSkgPCAwKSB7CisJCVRSQUNFX0VYSVQgLUVOT01FTTsKKwl9CisJbWVtc2V0KCoodm9pZCAqKiluZXcsICdcMCcsIHNpemUpOworCVRSQUNFX0VYSVQgMDsKK30KK2ludCB6ZnRfdm1hbGxvY19vbmNlKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoKih2b2lkICoqKW5ldyAhPSBOVUxMIHx8IHNpemUgPT0gMCkgeworCQlUUkFDRV9FWElUIDA7CisJfQorCWlmICgoKih2b2lkICoqKW5ldyA9IHZtYWxsb2Moc2l6ZSkpID09IE5VTEwpIHsKKwkJVFJBQ0VfRVhJVCAtRU5PTUVNOworCX0KKwl1c2VkX21lbW9yeSArPSBzaXplOworCWlmIChwZWFrX21lbW9yeSA8IHVzZWRfbWVtb3J5KSB7CisJCXBlYWtfbWVtb3J5ID0gdXNlZF9tZW1vcnk7CisJfQorCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsCisJCSAgICAiYWxsb2NhdGVkIGJ1ZmZlciBAICVwLCAlZCBieXRlcyIsICoodm9pZCAqKiluZXcsIHNpemUpOworfQoraW50IHpmdF92bWFsbG9jX2Fsd2F5cyh2b2lkICpuZXcsIHNpemVfdCBzaXplKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJemZ0X3ZmcmVlKG5ldywgc2l6ZSk7CisJVFJBQ0VfRVhJVCB6ZnRfdm1hbGxvY19vbmNlKG5ldywgc2l6ZSk7Cit9Cit2b2lkIHpmdF92ZnJlZSh2b2lkICpvbGQsIHNpemVfdCBzaXplKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKCoodm9pZCAqKilvbGQpIHsKKwkJdmZyZWUoKih2b2lkICoqKW9sZCk7CisJCXVzZWRfbWVtb3J5IC09IHNpemU7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZWxlYXNlZCBidWZmZXIgQCAlcCwgJWQgYnl0ZXMiLAorCQkgICAgICAqKHZvaWQgKiopb2xkLCBzaXplKTsKKwkJKih2b2lkICoqKW9sZCA9IE5VTEw7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK3ZvaWQgKnpmdF9rbWFsbG9jKHNpemVfdCBzaXplKQoreworCXZvaWQgKm5ldzsKKworCXdoaWxlICgobmV3ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApOworCX0KKwltZW1zZXQobmV3LCAwLCBzaXplKTsKKwl1c2VkX21lbW9yeSArPSBzaXplOworCWlmIChwZWFrX21lbW9yeSA8IHVzZWRfbWVtb3J5KSB7CisJCXBlYWtfbWVtb3J5ID0gdXNlZF9tZW1vcnk7CisJfQorCXJldHVybiBuZXc7Cit9CisKK3ZvaWQgemZ0X2tmcmVlKHZvaWQgKm9sZCwgc2l6ZV90IHNpemUpCit7CisJa2ZyZWUob2xkKTsKKwl1c2VkX21lbW9yeSAtPSBzaXplOworfQorCisvKiB0aGVyZSBhcmUgc29tZSBtb3JlIGJ1ZmZlcnMgdGhhdCBhcmUgYWxsb2NhdGVkIG9uIGRlbWFuZC4KKyAqIGNsZWFudXBfbW9kdWxlKCkgY2FsbGVzIHRoaXMgZnVuY3Rpb24gdG8gYmUgc3VyZSB0byBoYXZlIHJlbGVhc2VkCisgKiB0aGVtIAorICovCit2b2lkIHpmdF91bmluaXRfbWVtKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwl6ZnRfdmZyZWUoJnpmdF9oc2VnX2J1ZiwgRlRfU0VHTUVOVF9TSVpFKTsKKwl6ZnRfdmZyZWUoJnpmdF9kZWJsb2NrX2J1ZiwgRlRfU0VHTUVOVF9TSVpFKTsgemZ0X2RlYmxvY2tfc2VnbWVudCA9IC0xOworCXpmdF9mcmVlX3Z0YmwoKTsKKwlpZiAoemZ0X2NtcHJfbG9jaygwIC8qIGRvbid0IGxvYWQgKi8pID09IDApIHsKKwkJKCp6ZnRfY21wcl9vcHMtPmNsZWFudXApKCk7CisJCSgqemZ0X2NtcHJfb3BzLT5yZXNldCkoKTsgLyogdW5sb2NrIGl0IGFnYWluICovCisJfQorCXpmdF9tZW1vcnlfc3RhdHMoKTsKKwlUUkFDRV9FWElUOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OGUzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgKQEAgLTAsMCArMSw1NSBAQAorI2lmbmRlZiBfRlRBUEVfRFlOTUVNX0gKKyNkZWZpbmUgX0ZUQVBFX0RZTk1FTV9ICisKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxODo1OSAkCisgKgorICogICBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KKyAqCisgKi8KKworLyogd2UgZG8gbm90IGFsbG9jYXRlIGFsbCBvZiB0aGUgcmVhbGx5IGxhcmdlIGJ1ZmZlciBtZW1vcnkgYmVmb3JlCisgKiBzb21lb25lIHRyaWVzIHRvIG9wZW4gdGhlIGRyaXZlLiBmdGFwZV9vcGVuKCkgbWF5IGZhaWwgd2l0aAorICogLUVOT01FTSwgYnV0IHRoYXQncyBiZXR0ZXIgaGF2aW5nIDIwMGsgb2Ygdm1hbGxvY2VkIG1lbW9yeSB3aGljaAorICogY2Fubm90IGJlIHN3YXBwZWQgb3V0LgorICovCisKK2V4dGVybiB2b2lkICB6ZnRfbWVtb3J5X3N0YXRzKHZvaWQpOworZXh0ZXJuIGludCAgIHpmdF92bWFsbG9jX29uY2Uodm9pZCAqbmV3LCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gaW50ICAgemZ0X3ZjYWxsb2Nfb25jZSh2b2lkICpuZXcsIHNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgICB6ZnRfdm1hbGxvY19hbHdheXModm9pZCAqbmV3LCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAgemZ0X3ZmcmVlKHZvaWQgKm9sZCwgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgKnpmdF9rbWFsbG9jKHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICB6ZnRfa2ZyZWUodm9pZCAqb2xkLCBzaXplX3Qgc2l6ZSk7CisKKy8qIGNhbGxlZCBieSBjbGVhbnVwX21vZHVsZSgpIAorICovCitleHRlcm4gdm9pZCB6ZnRfdW5pbml0X21lbSh2b2lkKTsKKworI2VuZGlmCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3ODc0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuYwpAQCAtMCwwICsxLDE0MTggQEAKKy8qIAorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMi42LjIgJAorICogJERhdGU6IDE5OTcvMTEvMTQgMTg6MDc6MzMgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBub24tcmVhZC93cml0ZSB6ZnRhcGUgZnVuY3Rpb25zCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwLzMwMTAvMzAyMCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCitpbnQgemZ0X3dyaXRlX3Byb3RlY3RlZDsgLyogdGhpcyBpcyB3aGVuIGNhcnRyaWRnZSByZG9ubHkgb3IgT19SRE9OTFkgKi8KK2ludCB6ZnRfaGVhZGVyX3JlYWQ7CitpbnQgemZ0X29mZmxpbmU7Cit1bnNpZ25lZCBpbnQgemZ0X3VuaXQ7CitpbnQgemZ0X3Jlc2lkOworaW50IHpmdF9tdF9jb21wcmVzc2lvbjsKKworLyogICAgICBMb2NhbCB2YXJzLgorICovCitzdGF0aWMgaW50IGdvaW5nX29mZmxpbmU7CisKK3R5cGVkZWYgaW50IChtdF9mdW4pKGludCAqYXJncHRyKTsKK3R5cGVkZWYgaW50ICgqbXRfZnVucCkoaW50ICphcmdwdHIpOwordHlwZWRlZiBzdHJ1Y3QKK3sKKwltdF9mdW5wIGZ1bmN0aW9uOworCXVuc2lnbmVkIG9mZmxpbmUgICAgICAgICA6IDE7IC8qIG9wIHBlcm1pdHRlZCBpZiBvZmZsaW5lIG9yIG5vX3RhcGUgKi8KKwl1bnNpZ25lZCB3cml0ZV9wcm90ZWN0ZWQgOiAxOyAvKiBvcCBwZXJtaXR0ZWQgaWYgd3JpdGUtcHJvdGVjdGVkICAgICovCisJdW5zaWduZWQgbm90X2Zvcm1hdHRlZCAgIDogMTsgLyogb3AgcGVybWl0dGVkIGlmIHRhcGUgbm90IGZvcm1hdHRlZCAqLworCXVuc2lnbmVkIHJhd19tb2RlICAgICAgICA6IDE7IC8qIG9wIHBlcm1pdHRlZCBpZiB6ZnRfbW9kZSA9PSAwICAgICovCisJdW5zaWduZWQgbmVlZF9pZGxlX3N0YXRlIDogMTsgLyogbmVlZCB0byBjYWxsIGRlZl9pZGxlX3N0YXRlICAgICAgICAqLworCWNoYXIgICAgICpuYW1lOworfSBmdW5fZW50cnk7CisKK3N0YXRpYyBtdF9mdW4gbXRfZHVtbXksIG10X3Jlc2V0LCBtdF9mc3IsIG10X2JzciwgbXRfcmV3LCBtdF9vZmZsLCBtdF9ub3AsCisJbXRfd2VvZiwgbXRfZXJhc2UsIG10X3JhczIsIG10X3NldGJsaywgbXRfc2V0ZGVuc2l0eSwKKwltdF9zZWVrLCBtdF90ZWxsLCBtdF9yZXRlbiwgbXRfZW9tLCBtdF9mc2YsIG10X2JzZiwKKwltdF9mc2ZtLCBtdF9ic2ZtLCBtdF9zZXRkcnZidWZmZXIsIG10X2NvbXByZXNzaW9uOworCitzdGF0aWMgZnVuX2VudHJ5IG10X2Z1bnNbXT0KK3sgCisJe210X3Jlc2V0ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1JFU0VUIiB9LCAvKiAgMCAqLworCXttdF9mc2YgICAgICAgICAsIDAsIDEsIDAsIDAsIDEsICJNVF9GU0YiICAgfSwKKwl7bXRfYnNmICAgICAgICAgLCAwLCAxLCAwLCAwLCAxLCAiTVRfQlNGIiAgIH0sCisJe210X2ZzciAgICAgICAgICwgMCwgMSwgMCwgMSwgMSwgIk1UX0ZTUiIgICB9LAorCXttdF9ic3IgICAgICAgICAsIDAsIDEsIDAsIDEsIDEsICJNVF9CU1IiICAgfSwKKwl7bXRfd2VvZiAgICAgICAgLCAwLCAwLCAwLCAwLCAwLCAiTVRfV0VPRiIgIH0sIC8qICA1ICovCisJe210X3JldyAgICAgICAgICwgMCwgMSwgMSwgMSwgMCwgIk1UX1JFVyIgICB9LAorCXttdF9vZmZsICAgICAgICAsIDAsIDEsIDEsIDEsIDAsICJNVF9PRkZMIiAgfSwKKwl7bXRfbm9wICAgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfTk9QIiAgIH0sCisJe210X3JldGVuICAgICAgICwgMCwgMSwgMSwgMSwgMCwgIk1UX1JFVEVOIiB9LAorCXttdF9ic2ZtICAgICAgICAsIDAsIDEsIDAsIDAsIDEsICJNVF9CU0ZNIiAgfSwgLyogMTAgKi8KKwl7bXRfZnNmbSAgICAgICAgLCAwLCAxLCAwLCAwLCAxLCAiTVRfRlNGTSIgIH0sCisJe210X2VvbSAgICAgICAgICwgMCwgMSwgMCwgMCwgMSwgIk1UX0VPTSIgICB9LAorCXttdF9lcmFzZSAgICAgICAsIDAsIDAsIDAsIDEsIDAsICJNVF9FUkFTRSIgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfUkFTMSIgIH0sCisJe210X3JhczIgICAgICAgICwgMCwgMCwgMCwgMSwgMCwgIk1UX1JBUzIiICB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9SQVMzIiAgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiVU5LTk9XTiIgIH0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIlVOS05PV04iICB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJVTktOT1dOIiAgfSwKKwl7bXRfc2V0YmxrICAgICAgLCAxLCAxLCAxLCAxLCAxLCAiTVRfU0VUQkxLIn0sIC8qIDIwICovCisJe210X3NldGRlbnNpdHkgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1NFVERFTlNJVFkifSwKKwl7bXRfc2VlayAgICAgICAgLCAwLCAxLCAwLCAxLCAxLCAiTVRfU0VFSyIgIH0sCisJe210X2R1bW15ICAgICAgICwgMCwgMSwgMCwgMSwgMSwgIk1UX1RFTEwiICB9LCAvKiB3ci1vbmx5ID8hICovCisJe210X3NldGRydmJ1ZmZlciwgMSwgMSwgMSwgMSwgMCwgIk1UX1NFVERSVkJVRkZFUiIgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfRlNTIiAgIH0sIC8qIDI1ICovCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX0JTUyIgICB9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9XU00iICAgfSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfTE9DSyIgIH0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1VOTE9DSyJ9LAorCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9MT0FEIiAgfSwgLyogMzAgKi8KKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfVU5MT0FEIn0sCisJe210X2NvbXByZXNzaW9uICwgMSwgMSwgMSwgMCwgMSwgIk1UX0NPTVBSRVNTSU9OIn0sCisJe210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1NFVFBBUlQifSwKKwl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfTUtQQVJUIn0KK307ICAKKworI2RlZmluZSBOUl9NVF9DTURTIE5SX0lURU1TKG10X2Z1bnMpCisKK3ZvaWQgemZ0X3Jlc2V0X3Bvc2l0aW9uKHpmdF9wb3NpdGlvbiAqcG9zKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJcG9zLT5zZWdfYnl0ZV9wb3MgPQorCQlwb3MtPnZvbHVtZV9wb3MgPSAwOworCWlmICh6ZnRfaGVhZGVyX3JlYWQpIHsKKwkJLyogbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSB2b2x1bWUgdGFibGUgYW5kCisJCSAqIGNvbXByZXNzaW9uIG1hcC4gV2UgdGhlcmVmb3Igc2ltcGx5CisJCSAqIHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0CisJCSAqIHZvbHVtZS4gVGhpcyBjb3ZlcnMgb2xkIGZ0YXBlIGFyY2hpdmVzIGFzCisJCSAqIHdlbGwgaGFzIHZhcmlvdXMgZmxhdm91cnMgb2YgdGhlCisJCSAqIGNvbXByZXNzaW9uIG1hcCBzZWdtZW50cy4gVGhlIHdvcnN0IGNhc2UgaXMKKwkJICogdGhhdCB0aGUgY29tcHJlc3Npb24gbWFwIHNob3dzIHVwIGFzIGEKKwkJICogYWRkaXRpb25hbCB2b2x1bWUgaW4gZnJvbnQgb2YgYWxsIG90aGVycy4KKwkJICovCisJCXBvcy0+c2VnX3BvcyAgPSB6ZnRfZmluZF92b2x1bWUoMCktPnN0YXJ0X3NlZzsKKwkJcG9zLT50YXBlX3BvcyA9IHpmdF9jYWxjX3RhcGVfcG9zKHBvcy0+c2VnX3Bvcyk7CisJfSBlbHNlIHsKKwkJcG9zLT50YXBlX3BvcyA9ICAwOworCQlwb3MtPnNlZ19wb3MgID0gLTE7CisJfQorCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAgMDsKKwl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7CisJemZ0X2lvX3N0YXRlICAgICAgICA9IHpmdF9pZGxlOworCXpmdF96YXBfcmVhZF9idWZmZXJzKCk7CisJemZ0X3ByZXZlbnRfZmx1c2goKTsKKwkvKiAgdW5sb2NrIHRoZSBjb21wcmVzaXNvbiBtb2R1bGUgaWYgaXQgaXMgbG9hZGVkLgorCSAqICBUaGUgemVybyBhcmcgbWVhbnMgbm90IHRvIHRyeSB0byBsb2FkIHRoZSBtb2R1bGUuCisJICovCisJaWYgKHpmdF9jbXByX2xvY2soMCkgPT0gMCkgeworCQkoKnpmdF9jbXByX29wcy0+cmVzZXQpKCk7IC8qIHVubG9jayAqLworCX0KKwlUUkFDRV9FWElUOworfQorCitzdGF0aWMgdm9pZCB6ZnRfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXpmdF9yZXNpZCA9CisJCXpmdF9oZWFkZXJfcmVhZCAgICAgICAgICA9CisJCXpmdF9vbGRfZnRhcGUgICAgICAgICAgICA9CisJCXpmdF9vZmZsaW5lICAgICAgICAgICAgICA9CisJCXpmdF93cml0ZV9wcm90ZWN0ZWQgICAgICA9CisJCWdvaW5nX29mZmxpbmUgICAgICAgICAgICA9CisJCXpmdF9tdF9jb21wcmVzc2lvbiAgICAgICA9CisJCXpmdF9oZWFkZXJfY2hhbmdlZCAgICAgICA9CisJCXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCA9CisJCXpmdF93cml0dGVuX3NlZ21lbnRzICAgICA9IDA7CisJemZ0X2Jsa19zeiA9IENPTkZJR19aRlRfREZMVF9CTEtfU1o7CisJemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsgLyogZG9lcyBtb3N0IG9mIHRoZSBzdHVmZiAqLworCWZ0YXBlX3phcF9yZWFkX2J1ZmZlcnMoKTsKKwlmdGFwZV9zZXRfc3RhdGUoaWRsZSk7CisJVFJBQ0VfRVhJVDsKK30KKworaW50IHpmdF9kZWZfaWRsZV9zdGF0ZSh2b2lkKQoreyAKKwlpbnQgcmVzdWx0ID0gMDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgeworCQlyZXN1bHQgPSB6ZnRfcmVhZF9oZWFkZXJfc2VnbWVudHMoKTsKKwl9IGVsc2UgaWYgKChyZXN1bHQgPSB6ZnRfZmx1c2hfYnVmZmVycygpKSA+PSAwICYmIHpmdF9xaWNfbW9kZSkgeworCQkvKiAgZG9uJ3QgbW92ZSBwYXN0IGVvZgorCQkgKi8KKwkJKHZvaWQpemZ0X2Nsb3NlX3ZvbHVtZSgmemZ0X3Bvcyk7CisJfQorCWlmIChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSA8IDApIHsKKwkJVFJBQ0UoZnRfdF93YXJuLCAiZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCkgZmFpbGVkIik7CisJCXJlc3VsdCA9IC1FSU87CisJfQorCS8qIGNsZWFyIHJlbWFpbmluZyByZWFkIGJ1ZmZlcnMgKi8KKwl6ZnRfemFwX3JlYWRfYnVmZmVycygpOworCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIGZ1bmN0aW9ucyBmb3IgdGhlIE1USU9DVE9QIGNvbW1hbmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBtdF9kdW1teShpbnQgKmR1bW15KQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCVRSQUNFX0VYSVQgLUVOT1NZUzsKK30KKworc3RhdGljIGludCBtdF9yZXNldChpbnQgKmR1bW15KQoreyAgICAgICAgCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJKHZvaWQpZnRhcGVfc2Vla190b19ib3QoKTsKKwlUUkFDRV9DQVRDSChmdGFwZV9yZXNldF9kcml2ZSgpLAorCQkgICAgemZ0X2luaXRfZHJpdmVyKCk7IHpmdF91bmluaXRfbWVtKCk7IHpmdF9vZmZsaW5lID0gMSk7CisJLyogIGZha2UgYSByZS1vcGVuIG9mIHRoZSBkZXZpY2UuIFRoaXMgd2lsbCBzZXQgYWxsIGZsYWdlIGFuZCAKKwkgKiAgYWxsb2NhdGUgYnVmZmVycyBhcyBhcHByb3ByaWF0ZS4gVGhlIG5ldyB0YXBlIGNvbmRpdGlvbiB3aWxsCisJICogIGZvcmNlIHRoZSBvcGVuIHJvdXRpbmUgdG8gZG8gYW55dGhpbmcgd2UgbmVlZC4KKwkgKi8KKwlUUkFDRV9DQVRDSChfemZ0X29wZW4oLTEgLyogZmFrZSByZW9wZW4gKi8sIDAgLyogZHVtbXkgKi8pLCk7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IG10X2ZzZihpbnQgKmFyZykKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJcmVzdWx0ID0gemZ0X3NraXBfdm9sdW1lcygqYXJnLCAmemZ0X3Bvcyk7CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfYnNmKGludCAqYXJnKQoreworCWludCByZXN1bHQgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICgqYXJnICE9IDApIHsKKwkJcmVzdWx0ID0gemZ0X3NraXBfdm9sdW1lcygtKmFyZyArIDEsICZ6ZnRfcG9zKTsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc2Vla19ibG9jayhfX3M2NCBkYXRhX29mZnNldCwKKwkJICAgICAgX19zNjQgYmxvY2tfaW5jcmVtZW50LAorCQkgICAgICB6ZnRfcG9zaXRpb24gKnBvcykKK3sgCisJaW50IHJlc3VsdCAgICAgID0gMDsKKwlfX3M2NCBuZXdfYmxvY2tfcG9zOworCV9fczY0IHZvbF9ibG9ja19jb3VudDsKKwljb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lOworCWludCBleGNlZWQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJdm9sdW1lID0gemZ0X2ZpbmRfdm9sdW1lKHBvcy0+c2VnX3Bvcyk7CisJaWYgKHZvbHVtZS0+c3RhcnRfc2VnID09IDAgfHwgdm9sdW1lLT5lbmRfc2VnID09IDApIHsKKwkJVFJBQ0VfRVhJVCAtRUlPOworCX0KKwluZXdfYmxvY2tfcG9zICAgPSAoemZ0X2Rpdl9ibGtzeihkYXRhX29mZnNldCwgdm9sdW1lLT5ibGtfc3opCisJCQkgICArIGJsb2NrX2luY3JlbWVudCk7CisJdm9sX2Jsb2NrX2NvdW50ID0gemZ0X2Rpdl9ibGtzeih2b2x1bWUtPnNpemUsIHZvbHVtZS0+YmxrX3N6KTsKKwlpZiAobmV3X2Jsb2NrX3BvcyA8IDApIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgIm5ld19ibG9ja19wb3MgIiBMTF9YICIgPCAwIiwgTEwobmV3X2Jsb2NrX3BvcykpOworCQl6ZnRfcmVzaWQgICAgID0gKGludCluZXdfYmxvY2tfcG9zOworCQluZXdfYmxvY2tfcG9zID0gMDsKKwkJZXhjZWVkID0gMTsKKwl9IGVsc2UgaWYgKG5ld19ibG9ja19wb3MgPiB2b2xfYmxvY2tfY291bnQpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgIm5ld19ibG9ja19wb3MgIiBMTF9YICIgZXhjZWVkcyBzaXplIG9mIHZvbHVtZSAiIExMX1gsCisJCSAgICAgIExMKG5ld19ibG9ja19wb3MpLCBMTCh2b2xfYmxvY2tfY291bnQpKTsKKwkJemZ0X3Jlc2lkICAgICA9IChpbnQpKHZvbF9ibG9ja19jb3VudCAtIG5ld19ibG9ja19wb3MpOworCQluZXdfYmxvY2tfcG9zID0gdm9sX2Jsb2NrX2NvdW50OworCQlleGNlZWQgPSAxOworCX0gZWxzZSB7CisJCWV4Y2VlZCA9IDA7CisJfQorCWlmICh6ZnRfdXNlX2NvbXByZXNzaW9uICYmIHZvbHVtZS0+dXNlX2NvbXByZXNzaW9uKSB7CisJCVRSQUNFX0NBVENIKHpmdF9jbXByX2xvY2soMSAvKiB0cnkgdG8gbG9hZCAqLyksKTsKKwkJcmVzdWx0ID0gKCp6ZnRfY21wcl9vcHMtPnNlZWspKG5ld19ibG9ja19wb3MsIHBvcywgdm9sdW1lLAorCQkJCQkgICAgICAgemZ0X2RlYmxvY2tfYnVmKTsKKwkJcG9zLT50YXBlX3BvcyAgPSB6ZnRfY2FsY190YXBlX3Bvcyhwb3MtPnNlZ19wb3MpOworCQlwb3MtPnRhcGVfcG9zICs9IHBvcy0+c2VnX2J5dGVfcG9zOworCX0gZWxzZSB7CisJCXBvcy0+dm9sdW1lX3BvcyA9IHpmdF9tdWxfYmxrc3oobmV3X2Jsb2NrX3Bvcywgdm9sdW1lLT5ibGtfc3opOworCQlwb3MtPnRhcGVfcG9zICAgPSB6ZnRfY2FsY190YXBlX3Bvcyh2b2x1bWUtPnN0YXJ0X3NlZyk7CisJCXBvcy0+dGFwZV9wb3MgICs9IHBvcy0+dm9sdW1lX3BvczsKKwkJcG9zLT5zZWdfcG9zICAgID0gemZ0X2NhbGNfc2VnX2J5dGVfY29vcmQoJnBvcy0+c2VnX2J5dGVfcG9zLAorCQkJCQkJCSAgcG9zLT50YXBlX3Bvcyk7CisJfQorCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSB2b2x1bWUtPnNpemUgPT0gcG9zLT52b2x1bWVfcG9zOworCWlmICh6ZnRfanVzdF9iZWZvcmVfZW9mKSB7CisJCS8qIHdoeSB0aGlzPyBiZWNhdXNlIHpmdF9maWxlX25vIGNoZWNrcyBhZ2FpbnMgc3RhcnQKKwkJICogYW5kIGVuZCBzZWdtZW50IG9mIGEgdm9sdW1lLiBXZSBkbyBub3Qgd2FudCB0bworCQkgKiBhZHZhbmNlIHRvIHRoZSBuZXh0IHZvbHVtZSB3aXRoIHRoaXMgZnVuY3Rpb24uCisJCSAqLworCQlUUkFDRShmdF90X25vaXNlLCAic2V0IHpmdF9qdXN0X2JlZm9yZV9lb2YiKTsKKwkJemZ0X3Bvc2l0aW9uX2JlZm9yZV9lb2YocG9zLCB2b2x1bWUpOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJuZXdfc2VnX3BvcyA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJuZXdfdGFwZV9wb3M6ICIgTExfWCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJ2b2xfc2l6ZSAgICA6ICIgTExfWCAiXG4iCisJICAgICAgS0VSTl9JTkZPICJzZWdfYnl0ZV9wb3M6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJibGtfc3ogIDogJWQiLCAKKwkgICAgICBwb3MtPnNlZ19wb3MsIExMKHBvcy0+dGFwZV9wb3MpLAorCSAgICAgIExMKHZvbHVtZS0+c2l6ZSksIHBvcy0+c2VnX2J5dGVfcG9zLAorCSAgICAgIHZvbHVtZS0+YmxrX3N6KTsKKwlpZiAoIWV4Y2VlZCkgeworCQl6ZnRfcmVzaWQgPSBuZXdfYmxvY2tfcG9zIC0gemZ0X2Rpdl9ibGtzeihwb3MtPnZvbHVtZV9wb3MsCisJCQkJCQkJICB2b2x1bWUtPmJsa19zeik7CisJfQorCWlmICh6ZnRfcmVzaWQgPCAwKSB7CisJCXpmdF9yZXNpZCA9IC16ZnRfcmVzaWQ7CisJfQorCVRSQUNFX0VYSVQgKChleGNlZWQgfHwgemZ0X3Jlc2lkICE9IDApICYmIHJlc3VsdCA+PSAwKSA/IC1FSU5WQUwgOiByZXN1bHQ7Cit9ICAgICAKKworc3RhdGljIGludCBtdF9mc3IoaW50ICphcmcpCit7IAorCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJcmVzdWx0ID0gc2Vla19ibG9jayh6ZnRfcG9zLnZvbHVtZV9wb3MsICAqYXJnLCAmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfYnNyKGludCAqYXJnKQoreyAgIAorCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJcmVzdWx0ID0gc2Vla19ibG9jayh6ZnRfcG9zLnZvbHVtZV9wb3MsIC0qYXJnLCAmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfd2VvZihpbnQgKmFyZykKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCVRSQUNFX0NBVENIKHpmdF9mbHVzaF9idWZmZXJzKCksKTsKKwlyZXN1bHQgPSB6ZnRfd2VvZigqYXJnLCAmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfcmV3KGludCAqZHVtbXkpCit7ICAgICAgICAgIAorCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYoemZ0X2hlYWRlcl9yZWFkKSB7CisJCSh2b2lkKXpmdF9kZWZfaWRsZV9zdGF0ZSgpOworCX0KKwlyZXN1bHQgPSBmdGFwZV9zZWVrX3RvX2JvdCgpOworCXpmdF9yZXNldF9wb3NpdGlvbigmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfb2ZmbChpbnQgKmR1bW15KQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJZ29pbmdfb2ZmbGluZT0gMTsKKwlyZXN1bHQgPSBtdF9yZXcoTlVMTCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfbm9wKGludCAqZHVtbXkpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJLyogIHNob3VsZCB3ZSBzZXQgdGFwZSBzdGF0dXM/CisJICovCisJaWYgKCF6ZnRfb2ZmbGluZSkgeyAvKiBvZmZsaW5lIGluY2x1ZGVzIG5vX3RhcGUgKi8KKwkJKHZvaWQpemZ0X2RlZl9pZGxlX3N0YXRlKCk7CisJfQorCVRSQUNFX0VYSVQgMDsgCit9CisKK3N0YXRpYyBpbnQgbXRfcmV0ZW4oaW50ICpkdW1teSkKK3sgIAorCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYoemZ0X2hlYWRlcl9yZWFkKSB7CisJCSh2b2lkKXpmdF9kZWZfaWRsZV9zdGF0ZSgpOworCX0KKwlyZXN1bHQgPSBmdGFwZV9zZWVrX3RvX2VvdCgpOworCWlmIChyZXN1bHQgPj0gMCkgeworCQlyZXN1bHQgPSBmdGFwZV9zZWVrX3RvX2JvdCgpOworCX0KKwlUUkFDRV9FWElUKHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgZnNmYnNmbShpbnQgYXJnLCB6ZnRfcG9zaXRpb24gKnBvcykKK3sgCisJY29uc3QgemZ0X3ZvbGluZm8gKnZ0Ymw7CisJX19zNjQgYmxvY2tfcG9zOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCS8qIFdoYXQgdG8gZG8/IFRoaXMgc2hvdWxkIHNlZWsgdG8gdGhlIG5leHQgZmlsZS1tYXJrIGFuZAorCSAqIHBvc2l0aW9uIEJFRk9SRS4gVGhhdCBpcywgYSBuZXh0IHdyaXRlIHdvdWxkIGp1c3QgZXh0ZW5kCisJICogdGhlIGN1cnJlbnQgZmlsZS4gIFdlbGwuIExldCdzIGp1c3Qgc2VlayB0byB0aGUgZW5kIG9mIHRoZQorCSAqIGN1cnJlbnQgZmlsZSwgaWYgY291bnQgPT0gMS4gIElmIGNvdW50ID4gMSwgdGhlbiBkbyBhCisJICogIm10X2ZzZihjb3VudCAtIDEpIiwgYW5kIHRoZW4gc2VlayB0byB0aGUgZW5kIG9mIHRoYXQgZmlsZS4KKwkgKiBJZiBjb3VudCA9PSAwLCBkbyBub3RoaW5nCisJICovCisJaWYgKGFyZyA9PSAwKSB7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDA7CisJVFJBQ0VfQ0FUQ0goemZ0X3NraXBfdm9sdW1lcyhhcmcgPCAwID8gYXJnIDogYXJnLTEsIHBvcyksCisJCSAgICBpZiAoYXJnID4gMCkgeworCQkJICAgIHpmdF9yZXNpZCArKzsgCisJCSAgICB9KTsKKwl2dGJsICAgICAgPSB6ZnRfZmluZF92b2x1bWUocG9zLT5zZWdfcG9zKTsKKwlibG9ja19wb3MgPSB6ZnRfZGl2X2Jsa3N6KHZ0YmwtPnNpemUsIHZ0YmwtPmJsa19zeik7CisJKHZvaWQpc2Vla19ibG9jaygwLCBibG9ja19wb3MsIHBvcyk7CisJaWYgKHBvcy0+dm9sdW1lX3BvcyAhPSB2dGJsLT5zaXplKSB7CisJCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAwOworCQl6ZnRfcmVzaWQgPSAxOworCQkvKiB3ZSBkaWRuJ3QgbWFuYWdlZCB0byBnbyB0aGVyZSAqLworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwgCisJCQkgICAgIndhbnRlZCBmaWxlIHBvc2l0aW9uICIgTExfWCAiLCBhcnJpdmVkIGF0ICIgTExfWCwgCisJCQkgICAgTEwodnRibC0+c2l6ZSksIExMKHBvcy0+dm9sdW1lX3BvcykpOworCX0KKwl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMTsKKwlUUkFDRV9FWElUIDA7IAorfQorCitzdGF0aWMgaW50IG10X2JzZm0oaW50ICphcmcpCit7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlyZXN1bHQgPSBmc2Zic2ZtKC0qYXJnLCAmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbXRfZnNmbShpbnQgKmFyZykKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXJlc3VsdCA9IGZzZmJzZm0oKmFyZywgJnpmdF9wb3MpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCitzdGF0aWMgaW50IG10X2VvbShpbnQgKmR1bW15KQoreyAgICAgICAgICAgICAgCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJemZ0X3NraXBfdG9fZW9tKCZ6ZnRfcG9zKTsKKwlUUkFDRV9FWElUIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRfZXJhc2UoaW50ICpkdW1teSkKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXJlc3VsdCA9IHpmdF9lcmFzZSgpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCitzdGF0aWMgaW50IG10X3JhczIoaW50ICpkdW1teSkKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXJlc3VsdCA9IC1FTk9TWVM7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9IAorCisvKiAgU2V0cyB0aGUgbmV3IGJsb2Nrc2l6ZSBpbiBCWVRFUworICoKKyAqLworc3RhdGljIGludCBtdF9zZXRibGsoaW50ICpuZXdfc2l6ZSkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZigodW5zaWduZWQgaW50KSgqbmV3X3NpemUpID4gWkZUX01BWF9CTEtfU1opIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLAorCQkJICAgICJkZXNpcmVkIGJsa19zeiAoJWQpIHNob3VsZCBiZSA8PSAlZCBieXRlcyIsCisJCQkgICAgKm5ld19zaXplLCBaRlRfTUFYX0JMS19TWik7CisJfQorCWlmICgoKm5ld19zaXplICYgKEZUX1NFQ1RPUl9TSVpFLTEpKSAhPSAwKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywKKwkJCSJkZXNpcmVkIGJsa19zeiAoJWQpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAlZCBieXRlcyIsCisJCQkgICAgKm5ld19zaXplLCBGVF9TRUNUT1JfU0laRSk7CisJfQorCWlmICgqbmV3X3NpemUgPT0gMCkgeworCQlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbikgeworCQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLAorCQkJCSAgICAiVmFyaWFibGUgYmxvY2sgc2l6ZSBub3QgeWV0ICIKKwkJCQkgICAgInN1cHBvcnRlZCB3aXRoIGNvbXByZXNzaW9uIik7CisJCX0KKwkJKm5ld19zaXplID0gMTsKKwl9CisJemZ0X2Jsa19zeiA9ICpuZXdfc2l6ZTsKKwlUUkFDRV9FWElUIDA7Cit9IAorCitzdGF0aWMgaW50IG10X3NldGRlbnNpdHkoaW50ICphcmcpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJU0VUX1RSQUNFX0xFVkVMKCphcmcpOworCVRSQUNFKFRSQUNFX0xFVkVMLCAidHJhY2luZyBzZXQgdG8gJWQiLCBUUkFDRV9MRVZFTCk7CisJaWYgKChpbnQpVFJBQ0VfTEVWRUwgIT0gKmFyZykgeworCQlUUkFDRV9FWElUIC1FSU5WQUw7CisJfQorCVRSQUNFX0VYSVQgMDsKK30gICAgICAgICAgCisKK3N0YXRpYyBpbnQgbXRfc2VlayhpbnQgKm5ld19ibG9ja19wb3MpCit7IAorCWludCByZXN1bHQ9IDA7ICAgICAgICAKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQorCXJlc3VsdCA9IHNlZWtfYmxvY2soMCwgKF9fczY0KSpuZXdfYmxvY2tfcG9zLCAmemZ0X3Bvcyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qICBPSywgdGhpcyBpcyB0b3RhbGx5IGRpZmZlcmVudCBmcm9tIFNDU0ksIGJ1dCB0aGUgd29yc3QgdGhpbmcgdGhhdCBjYW4gCisgKiAgaGFwcGVuIGlzIHRoYXQgdGhlcmUgaXMgbm90IGVub3VnaCBkZWZyYWdtZW50YXRlZCBtZW1vcnkgdGhhdCBjYW4gYmUgCisgKiAgYWxsb2NhdGVkLiBBbHNvLCB0aGVyZSBpcyBhIGhhcmR3aXJlZCBsaW1pdCBvZiAxNiBkbWEgYnVmZmVycyBpbiB0aGUgCisgKiAgc3RvY2sgZnRhcGUgbW9kdWxlLiBUaGlzIHNob3VsZG4ndCBicmluZyB0aGUgc3lzdGVtIGRvd24uCisgKgorICogTk9URTogdGhlIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgdG90YWwgbnVtYmVyIG9mIGRtYSBidWZmZXJzIHRvIHVzZS4KKyAqICAgICAgIFRoZSBkcml2ZXIgbmVlZHMgYXQgbGVhc3QgMyBidWZmZXJzIHRvIGZ1bmN0aW9uIGF0IGFsbC4KKyAqIAorICovCitzdGF0aWMgaW50IG10X3NldGRydmJ1ZmZlcihpbnQgKmNudCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICgqY250IDwgMykgeworCQlUUkFDRV9FWElUIC1FSU5WQUw7CisJfQorCVRSQUNFX0NBVENIKGZ0YXBlX3NldF9ucl9idWZmZXJzKCpjbnQpLCk7CisJVFJBQ0VfRVhJVCAwOworfQorLyogcmV0dXJuIHRoZSBibG9jayBwb3NpdGlvbiBmcm9tIHN0YXJ0IG9mIHZvbHVtZSAKKyAqLworc3RhdGljIGludCBtdF90ZWxsKGludCAqYXJnKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCSphcmcgICA9IHpmdF9kaXZfYmxrc3ooemZ0X3Bvcy52b2x1bWVfcG9zLAorCQkJICAgICAgIHpmdF9maW5kX3ZvbHVtZSh6ZnRfcG9zLnNlZ19wb3MpLT5ibGtfc3opOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBtdF9jb21wcmVzc2lvbihpbnQgKmFyZykKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwkvKiAgT2suIFdlIGNvdWxkIGFsc28gY2hlY2sgd2hldGhlciBjb21wcmVzc2lvbiBpcyBhdmFpbGFibGUgYXQKKwkgKiAgYWxsIGJ5IHRyeWluZyB0byBsb2FkIHRoZSBjb21wcmVzc2lvbiBtb2R1bGUuICBXZSBjb3VsZAorCSAqICBhbHNvIGNoZWNrIGZvciBhIGJsb2NrIHNpemUgb2YgMSBieXRlIHdoaWNoIGlzIGlsbGVnYWwKKwkgKiAgd2l0aCBjb21wcmVzc2lvbi4gIEluc3RlYWQgb2YgZG9pbmcgaXQgaGVyZSB3ZSByZWx5IG9uCisJICogIHpmdGFwZV93cml0ZSgpIHRvIGRvIHRoZSBwcm9wZXIgY2hlY2tzLgorCSAqLworCWlmICgodW5zaWduZWQgaW50KSphcmcgPiAxKSB7CisJCVRSQUNFX0VYSVQgLUVJTlZBTDsKKwl9CisJaWYgKCphcmcgIT0gMCAmJiB6ZnRfYmxrX3N6ID09IDEpIHsgLyogdmFyaWFibGUgYmxvY2sgc2l6ZSAqLworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCisJCQkgICAgIkNvbXByZXNzaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICIKKwkJCSAgICAid2l0aCB2YXJpYWJsZSBibG9jayBzaXplIik7CisJfQorCXpmdF9tdF9jb21wcmVzc2lvbiAgPSAqYXJnOworCWlmICgoemZ0X3VuaXQgJiBaRlRfWklQX01PREUpID09IDApIHsKKwkJemZ0X3VzZV9jb21wcmVzc2lvbiA9IHpmdF9tdF9jb21wcmVzc2lvbjsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgY2hlY2sgd2hldGhlciB3cml0ZSBhY2Nlc3MgaXMgYWxsb3dlZC4gV3JpdGUgYWNjZXNzIGlzIGRlbmllZCB3aGVuCisgKiAgKyB6ZnRfd3JpdGVfcHJvdGVjdGVkID09IDEgLS0gdGhpcyBhY2NvdW50cyBmb3IgZWl0aGVyIGhhcmQgd3JpdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGlvbiBvZiB0aGUgY2FydHJpZGdlIG9yIGZvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1JET05MWSBhY2Nlc3MgbW9kZSBvZiB0aGUgdGFwZSBkZXZpY2UKKyAqICArIHpmdF9vZmZsaW5lID09IDEgICAgICAgICAtLSB0aGlzIG1lYW55IHRoYXQgdGhlcmUgaXMgZWl0aGVyIG5vIHRhcGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhhdCB0aGUgTVRPRkZMSU5FIGlvY3RsIGhhcyBiZWVuIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgaXNzdWVkIChgc29mdCBlamVjdCcpCisgKiAgKyBmdF9mb3JtYXR0ZWQgPT0gMCAgICAgICAgLS0gdGhpcyBtZWFucyB0aGF0IHRoZSBjYXJ0cmlkZ2UgaXMgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkCisgKiAgVGhlbiB3ZSBkaXN0aW51Z3Vpc2ggdHdvIGNhc2VzLiBXaGVuIHpmdF9xaWNfbW9kZSBpcyBUUlVFLCB0aGVuIHdlIHRyeQorICogIHRvIGVtdWxhdGUgYSBgdHJhZGl0aW9uYWwnIChha2EgU0NTSSBsaWtlKSBVTipYIHRhcGUgZGV2aWNlLiBUaGVyZWZvcmUgd2UKKyAqICBkZW55IHdyaXRlcyB3aGVuCisgKiAgKyB6ZnRfcWljX21vZGUgPT0xICYmIAorICogICAgICAgKCF6ZnRfdGFwZV9hdF9sYm90KCkgJiYgICAtLSB0YXBlIG5vIGF0IGxvZ2ljYWwgQk9UCisgKiAgICAgICAgISh6ZnRfdGFwZV9hdF9lb20oKSB8fCAgIC0tIHRhcGUgbm90IGF0IGxvZ2ljYWwgRU9NIChvciBFT0QpCisgKiAgICAgICAgICAoemZ0X3RhcGVfYXRfZW9tKCkgJiYKKyAqICAgICAgICAgICB6ZnRfb2xkX2Z0YXBlKCkpKSkgICAgLS0gd2UgY2FuJ3QgYWRkIG5ldyB2b2x1bWUgdG8gdGFwZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gYnkgb2xkIGZ0YXBlIGJlY2F1c2UgZnRhcGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgdXNlIHRoZSB2b2x1bWUgdGFibGUKKyAqCisgKiAgd2hlbiB0aGUgZHJpdmUgaXMgaW4gdHJ1ZSByYXcgbW9kZSAoYWthIC9kZXYvcmF3ZnQwKSB0aGVuIHdlIGRvbid0IAorICogIGNhcmUgYWJvdXQgTEJPVCBhbmQgRU9NIGNvbmRpdGlvbnMuIFRoaXMgZGV2aWNlIGlzIGludGVuZGVkIGZvciBhIAorICogIHVzZXIgbGV2ZWwgcHJvZ3JhbSB0aGF0IHdhbnRzIHRvIHRydWx5IGltcGxlbWVudCB0aGUgUUlDLTgwIGNvbXBsaWFuY2UKKyAqICBhdCB0aGUgbG9naWNhbCBkYXRhIGxheW91dCBsZXZlbCBvZiB0aGUgY2FydHJpZGdlLCBpLmUuIGltcGxlbWVudCBhbGwKKyAqICB0aGF0IHZvbHVtZSB0YWJsZSBhbmQgdm9sdW1lIGRpcmVjdG9yeSBzdHVmZiBldGMuPAorICovCitpbnQgemZ0X2NoZWNrX3dyaXRlX2FjY2Vzcyh6ZnRfcG9zaXRpb24gKnBvcykKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICh6ZnRfb2ZmbGluZSkgeyAvKiBvZmZsaW5lIGluY2x1ZGVzIG5vX3RhcGUgKi8KKwkJVFJBQ0VfQUJPUlQoLUVOWElPLAorCQkJICAgIGZ0X3RfaW5mbywgInRhcGUgaXMgb2ZmbGluZSBvciBubyBjYXJ0cmlkZ2UiKTsKKwl9CisJaWYgKCFmdF9mb3JtYXR0ZWQpIHsKKwkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLCAidGFwZSBpcyBub3QgZm9ybWF0dGVkIik7CisJfSAKKwlpZiAoemZ0X3dyaXRlX3Byb3RlY3RlZCkgeworCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sICJjYXJ0cmlkZ2Ugd3JpdGUgcHJvdGVjdGVkIik7CisJfSAKKwlpZiAoemZ0X3FpY19tb2RlKSB7CisJCS8qICBjaGVjayBCT1QgY29uZGl0aW9uICovCisJCWlmICghemZ0X3RhcGVfYXRfbGJvdChwb3MpKSB7CisJCQkvKiAgcHJvdGVjdCBjYXJ0cmlkZ2VzIHdyaXR0ZW4gYnkgb2xkIGZ0YXBlIGlmCisJCQkgKiAgbm90IGF0IEJPVCBiZWNhdXNlIHRoZXkgdXNlIHRoZSB2dGJsCisJCQkgKiAgc2VnbWVudCBmb3Igc3RvcmluZyBkYXRhCisJCQkgKi8KKwkJCWlmICh6ZnRfb2xkX2Z0YXBlKSB7CisJCQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF93YXJuLCAKKyAgICAgICJDYW5ub3Qgd3JpdGUgdG8gY2FydHJpZGdlcyB3cml0dGVuIGJ5IG9sZCBmdGFwZSB3aGVuIG5vdCBhdCBCT1QiKTsKKwkJCX0KKwkJCS8qICBub3QgYXQgQk9ULCBidXQgYWxsb3cgd3JpdGVzIGF0IEVPRCwgb2YgY291cnNlCisJCQkgKi8KKwkJCWlmICghemZ0X3RhcGVfYXRfZW9kKHBvcykpIHsKKwkJCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sCisJCQkJCSAgICAidGFwZSBub3QgYXQgQk9UIGFuZCBub3QgYXQgRU9EIik7CisJCQl9CisJCX0KKwkJLyogIGZpbmUuIE5vdyB0aGUgdGFwZSBpcyBlaXRoZXIgYXQgQk9UIG9yIGF0IEVPRC4gKi8KKwl9CisJLyogb3IgaW4gcmF3IG1vZGUgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBjYXJlIGFib3V0IEJPVCBhbmQgRU9EICovCisJVFJBQ0VfRVhJVCAwOworfQorCisvKiAgICAgIE9QRU4gcm91dGluZSBjYWxsZWQgYnkga2VybmVsLWludGVyZmFjZSBjb2RlCisgKgorICogICAgICBOT1RFOiB0aGlzIGlzIGFsc28gY2FsbGVkIGJ5IG10X3Jlc2V0KCkgd2l0aCBkZXZfbWlub3IgPT0gLTEKKyAqICAgICAgICAgICAgdG8gZmFrZSBhIHJlb3BlbiBhZnRlciBhIHJlc2V0LgorICovCitpbnQgX3pmdF9vcGVuKHVuc2lnbmVkIGludCBkZXZfbWlub3IsIHVuc2lnbmVkIGludCBhY2Nlc3NfbW9kZSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IHRhcGVfdW5pdDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGZpbGVfYWNjZXNzX21vZGU7CisJaW50IHJlc3VsdDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICgoaW50KWRldl9taW5vciA9PSAtMSkgeworCQkvKiBmYWtlIHJlb3BlbiAqLworCQl6ZnRfdW5pdCAgICA9IHRhcGVfdW5pdDsKKwkJYWNjZXNzX21vZGUgPSBmaWxlX2FjY2Vzc19tb2RlOworCQl6ZnRfaW5pdF9kcml2ZXIoKTsgLyogcmVzZXQgYWxsIHN0YXRpYyBkYXRhIHRvIGRlZmF1bHRzICovCisJfSBlbHNlIHsKKwkJdGFwZV91bml0ICAgICAgICA9IGRldl9taW5vcjsKKwkJZmlsZV9hY2Nlc3NfbW9kZSA9IGFjY2Vzc19tb2RlOworCQlpZiAoKHJlc3VsdCA9IGZ0YXBlX2VuYWJsZShGVEFQRV9TRUwoZGV2X21pbm9yKSkpIDwgMCkgeworCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2VyciwKKwkJCQkgICAgImZ0YXBlX2VuYWJsZSBmYWlsZWQ6ICVkIiwgcmVzdWx0KTsKKwkJfQorCQlpZiAoZnRfbmV3X3RhcGUgfHwgZnRfbm9fdGFwZSB8fCAhZnRfZm9ybWF0dGVkIHx8CisJCSAgICAoRlRBUEVfU0VMKHpmdF91bml0KSAhPSBGVEFQRV9TRUwoZGV2X21pbm9yKSkgfHwKKwkJICAgICh6ZnRfdW5pdCAmIFpGVF9SQVdfTU9ERSkgIT0gKGRldl9taW5vciAmIFpGVF9SQVdfTU9ERSkpIHsKKwkJCS8qIHJlc2V0IGFsbCBzdGF0aWMgZGF0YSB0byBkZWZhdWx0cywKKwkJCSAqLworCQkJemZ0X2luaXRfZHJpdmVyKCk7IAorCQl9CisJCXpmdF91bml0ID0gZGV2X21pbm9yOworCX0KKwl6ZnRfc2V0X2ZsYWdzKHpmdF91bml0KTsgLyogZGVjb2RlIHRoZSBtaW5vciBiaXRzICovCisJaWYgKHpmdF9ibGtfc3ogPT0gMSAmJiB6ZnRfdXNlX2NvbXByZXNzaW9uKSB7CisJCWZ0YXBlX2Rpc2FibGUoKTsgLyogcmVzZXRzIGZ0X25vX3RhcGUgKi8KKwkJVFJBQ0VfQUJPUlQoLUVOT0RFViwgZnRfdF93YXJuLCAiVmFyaWFibGUgYmxvY2sgc2l6ZSBub3QgeWV0ICIKKwkJCSAgICAic3VwcG9ydGVkIHdpdGggY29tcHJlc3Npb24iKTsKKwl9CisJLyogIG5vIG5lZWQgZm9yIG1vc3Qgb2YgdGhlIGJ1ZmZlcnMgd2hlbiBubyB0YXBlIG9yIG5vdAorCSAqICBmb3JtYXR0ZWQuICBmb3IgdGhlIHJlYWQvd3JpdGUgb3BlcmF0aW9ucywgaXQgaXMgdGhlCisJICogIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGVyZSBpcyBubyB0YXBlLCBhIG5vdC1mb3JtYXR0ZWQgdGFwZQorCSAqICBvciB0aGUgd2hldGhlciB0aGUgZHJpdmVyIGlzIHNvZnQgb2ZmbGluZS4gIAorCSAqICBOZXZlcnRoZWxlc3Mgd2UgYWxsb3cgc29tZSBpb2N0bHMgd2l0aCBub24tZm9ybWF0dGVkIHRhcGVzLCAKKwkgKiAgbGlrZSByZXdpbmQgYW5kIHJlc2V0LgorCSAqLworCWlmIChmdF9ub190YXBlIHx8ICFmdF9mb3JtYXR0ZWQpIHsKKwkJemZ0X3VuaW5pdF9tZW0oKTsKKwl9CisJaWYgKGZ0X25vX3RhcGUpIHsKKwkJemZ0X29mZmxpbmUgPSAxOyAvKiBzbyB3ZSBuZWVkIG5vdCB0ZXN0IHR3byB2YXJpYWJsZXMgKi8KKwl9CisJaWYgKChhY2Nlc3NfbW9kZSA9PSBPX1dST05MWSB8fCBhY2Nlc3NfbW9kZSA9PSBPX1JEV1IpICYmCisJICAgIChmdF93cml0ZV9wcm90ZWN0ZWQgfHwgZnRfbm9fdGFwZSkpIHsKKwkJZnRhcGVfZGlzYWJsZSgpOyAvKiByZXNldHMgZnRfbm9fdGFwZSAqLworCQlUUkFDRV9BQk9SVChmdF9ub190YXBlID8gLUVOWElPIDogLUVST0ZTLAorCQkJICAgIGZ0X3Rfd2FybiwgIndyb25nIGFjY2VzcyBtb2RlICVzIGNhcnRyaWRnZSIsCisJCQkgICAgZnRfbm9fdGFwZSA/ICJ3aXRob3V0IGEiIDogIndpdGggd3JpdGUgcHJvdGVjdGVkIik7CisJfQorCXpmdF93cml0ZV9wcm90ZWN0ZWQgPSAoYWNjZXNzX21vZGUgPT0gT19SRE9OTFkgfHwgCisJCQkgICAgICAgZnRfd3JpdGVfcHJvdGVjdGVkICE9IDApOworCWlmICh6ZnRfd3JpdGVfcHJvdGVjdGVkKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCSAgICAgICJyZWFkIG9ubHkgYWNjZXNzIG1vZGU6ICVkLCAiCisJCSAgICAgICJkcml2ZSB3cml0ZSBwcm90ZWN0ZWQ6ICVkIiwgCisJCSAgICAgIGFjY2Vzc19tb2RlID09IE9fUkRPTkxZLAorCQkgICAgICBmdF93cml0ZV9wcm90ZWN0ZWQgIT0gMCk7CisJfQorCWlmICghemZ0X29mZmxpbmUpIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X3ZtYWxsb2Nfb25jZSgmemZ0X2RlYmxvY2tfYnVmLEZUX1NFR01FTlRfU0laRSksCisJCQkgICAgZnRhcGVfZGlzYWJsZSgpKTsKKwl9CisJLyogemZ0X3NlZ19wb3Mgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgdnRibCBzZWdwb3MgYnV0IG5vdAorCSAqIGlmIGluIGNvbXBhdGliaWxpdHkgbW9kZSBhbmQgb25seSBhZnRlciB3ZSByZWFkIGluIHRoZQorCSAqIGhlYWRlciBzZWdtZW50cworCSAqCisJICogbWlnaHQgYWxzbyBiZSBhIHByb2JsZW0gaWYgdGhlIHVzZXIgbWFrZXMgYSBiYWNrdXAgd2l0aCBhCisJICogKnFmdCogZGV2aWNlIGFuZCByZXdpbmRzIGl0IHdpdGggYSByYXcgZGV2aWNlLgorCSAqLworCWlmICh6ZnRfcWljX21vZGUgICAgICAgICAmJgorCSAgICAhemZ0X29sZF9mdGFwZSAgICAgICAmJgorCSAgICB6ZnRfcG9zLnNlZ19wb3MgPj0gMCAmJgorCSAgICB6ZnRfaGVhZGVyX3JlYWQgICAgICAmJiAKKwkgICAgemZ0X3Bvcy5zZWdfcG9zIDw9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCkgeworCQlUUkFDRShmdF90X25vaXNlLCAieW91IHByb2JhYmx5IG1peGVkIHVwIHRoZSB6ZnRhcGUgZGV2aWNlcyEiKTsKKwkJemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsgCisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBSRUxFQVNFIHJvdXRpbmUgY2FsbGVkIGJ5IGtlcm5lbC1pbnRlcmZhY2UgY29kZQorICovCitpbnQgX3pmdF9jbG9zZSh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICh6ZnRfb2ZmbGluZSkgeworCQkvKiBjYWxsIHRoZSBoYXJkd2FyZSByZWxlYXNlIHJvdXRpbmUuIFB1dHMgdGhlIGRyaXZlIG9mZmxpbmUgKi8KKwkJZnRhcGVfZGlzYWJsZSgpOworCQlUUkFDRV9FWElUIDA7CisJfQorCWlmICghKGZ0X3dyaXRlX3Byb3RlY3RlZCB8fCB6ZnRfb2xkX2Z0YXBlKSkgeworCQlyZXN1bHQgPSB6ZnRfZmx1c2hfYnVmZmVycygpOworCQlUUkFDRShmdF90X25vaXNlLCAid3JpdGluZyBmaWxlIG1hcmsgYXQgY3VycmVudCBwb3NpdGlvbiIpOworCQlpZiAoemZ0X3FpY19tb2RlICYmIHpmdF9jbG9zZV92b2x1bWUoJnpmdF9wb3MpID09IDApIHsKKwkJCXpmdF9tb3ZlX3Bhc3RfZW9mKCZ6ZnRfcG9zKTsKKwkJfQorCQlpZiAoKHpmdF90YXBlX2F0X2xib3QoJnpmdF9wb3MpIHx8CisJCSAgICAgISh6ZnRfdW5pdCAmIEZUQVBFX05PX1JFV0lORCkpKSB7CisJCQlpZiAocmVzdWx0ID49IDApIHsKKwkJCQlyZXN1bHQgPSB6ZnRfdXBkYXRlX2hlYWRlcl9zZWdtZW50cygpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRShmdF90X2VyciwKKwkJCQkiRXJyb3I6IHVuYWJsZSB0byB1cGRhdGUgaGVhZGVyIHNlZ21lbnRzIik7CisJCQl9CisJCX0KKwl9CisJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7CisJaWYgKCEoemZ0X3VuaXQgJiBGVEFQRV9OT19SRVdJTkQpKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZXdpbmRpbmcgdGFwZSIpOworCQlpZiAoZnRhcGVfc2Vla190b19ib3QoKSA8IDAgJiYgcmVzdWx0ID49IDApIHsKKwkJCXJlc3VsdCA9IC1FSU87IC8qIGtlZXAgb2xkIHZhbHVlICovCisJCX0KKwkJemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsKKwl9IAorCXpmdF96YXBfcmVhZF9idWZmZXJzKCk7CisJLyogIG5vdyBmcmVlIHVwIG1lbW9yeSBhcyBtdWNoIGFzIHBvc3NpYmxlLiBXZSBkb24ndCBkZXN0cm95CisJICogIHRoZSBkZWJsb2NrIGJ1ZmZlciBpZiBpdCBjb250YWluZXMgYSB2YWxpZCBzZWdtZW50LgorCSAqLworCWlmICh6ZnRfZGVibG9ja19zZWdtZW50ID09IC0xKSB7CisJCXpmdF92ZnJlZSgmemZ0X2RlYmxvY2tfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOyAKKwl9CisJLyogaGlnaCBsZXZlbCBkcml2ZXIgc3RhdHVzLCBmb3JjZXMgY3JlYXRpb24gb2YgYSBuZXcgdm9sdW1lCisJICogd2hlbiBjYWxsaW5nIGZ0YXBlX3dyaXRlIGFnYWluIGFuZCBub3QgemZ0X2p1c3RfYmVmb3JlX2VvZgorCSAqLworCXpmdF9pb19zdGF0ZSA9IHpmdF9pZGxlOyAgCisJaWYgKGdvaW5nX29mZmxpbmUpIHsKKwkJemZ0X2luaXRfZHJpdmVyKCk7CisJCXpmdF91bmluaXRfbWVtKCk7CisJCWdvaW5nX29mZmxpbmUgPSAwOworCQl6ZnRfb2ZmbGluZSAgID0gMTsKKwl9IGVsc2UgaWYgKHpmdF9jbXByX2xvY2soMCAvKiBkb24ndCBsb2FkICovKSA9PSAwKSB7CisJCSgqemZ0X2NtcHJfb3BzLT5yZXNldCkoKTsgLyogdW5sb2NrIGl0IGFnYWluICovCisJfQorCXpmdF9tZW1vcnlfc3RhdHMoKTsKKwkvKiBjYWxsIHRoZSBoYXJkd2FyZSByZWxlYXNlIHJvdXRpbmUuIFB1dHMgdGhlIGRyaXZlIG9mZmxpbmUgKi8KKwlmdGFwZV9kaXNhYmxlKCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qCisgKiAgdGhlIHdyYXBwZXIgZnVuY3Rpb24gYXJvdW5kIHRoZSB3cmFwcGVyIE1USU9DVE9QIGlvY3RsCisgKi8KK3N0YXRpYyBpbnQgbXRpb2N0b3Aoc3RydWN0IG10b3AgKm10b3AsIGludCBhcmdfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlmdW5fZW50cnkgKm10X2Z1bl9lbnRyeTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdG9wKSB8fCBtdG9wLT5tdF9vcCA+PSBOUl9NVF9DTURTKSB7CisJCVRSQUNFX0VYSVQgLUVJTlZBTDsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgImNhbGxpbmcgTVRJT0NUT1AgY29tbWFuZDogJXMiLAorCSAgICAgIG10X2Z1bnNbbXRvcC0+bXRfb3BdLm5hbWUpOworCW10X2Z1bl9lbnRyeT0gJm10X2Z1bnNbbXRvcC0+bXRfb3BdOworCXpmdF9yZXNpZCA9IG10b3AtPm10X2NvdW50OworCWlmICghbXRfZnVuX2VudHJ5LT5vZmZsaW5lICYmIHpmdF9vZmZsaW5lKSB7CisJCWlmIChmdF9ub190YXBlKSB7CisJCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfaW5mbywgIm5vIHRhcGUgcHJlc2VudCIpOworCQl9IGVsc2UgeworCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2luZm8sICJkcml2ZSBpcyBvZmZsaW5lIik7CisJCX0KKwl9CisJaWYgKCFtdF9mdW5fZW50cnktPm5vdF9mb3JtYXR0ZWQgJiYgIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sICJ0YXBlIGlzIG5vdCBmb3JtYXR0ZWQiKTsKKwl9CisJaWYgKCFtdF9mdW5fZW50cnktPndyaXRlX3Byb3RlY3RlZCkgeworCQlUUkFDRV9DQVRDSCh6ZnRfY2hlY2tfd3JpdGVfYWNjZXNzKCZ6ZnRfcG9zKSwpOworCX0KKwlpZiAobXRfZnVuX2VudHJ5LT5uZWVkX2lkbGVfc3RhdGUgJiYgISh6ZnRfb2ZmbGluZSB8fCAhZnRfZm9ybWF0dGVkKSkgeworCQlUUkFDRV9DQVRDSCh6ZnRfZGVmX2lkbGVfc3RhdGUoKSwpOworCX0KKwlpZiAoIXpmdF9xaWNfbW9kZSAmJiAhbXRfZnVuX2VudHJ5LT5yYXdfbW9kZSkgeworCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sIAorIkRyaXZlIG5lZWRzIHRvIGJlIGluIFFJQy04MCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIHRoaXMgY29tbWFuZCIpOworCX0KKwlyZXN1bHQgPSAobXRfZnVuX2VudHJ5LT5mdW5jdGlvbikoJm10b3AtPm10X2NvdW50KTsKKwlpZiAoemZ0X3RhcGVfYXRfbGJvdCgmemZ0X3BvcykpIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHMoKSwpOworCX0KKwlpZiAocmVzdWx0ID49IDApIHsKKwkJemZ0X3Jlc2lkID0gMDsKKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qCisgKiAgc3RhbmRhcmQgTVRJT0NHRVQgaW9jdGwKKyAqLworc3RhdGljIGludCBtdGlvY2dldChzdHJ1Y3QgbXRnZXQgKm10Z2V0LCBpbnQgYXJnX3NpemUpCit7CisJY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZTsKKwlfX3M2NCBtYXhfdGFwZV9wb3M7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRnZXQpKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsCisJCQkgICAgYXJnX3NpemUpOworCX0KKwltdGdldC0+bXRfdHlwZSAgPSBmdF9kcml2ZV90eXBlLnZlbmRvcl9pZCArIDB4ODAwMDAwOworCW10Z2V0LT5tdF9kc3JlZyA9IGZ0X2xhc3Rfc3RhdHVzLnNwYWNlOworCW10Z2V0LT5tdF9lcnJlZyA9IGZ0X2xhc3RfZXJyb3Iuc3BhY2U7IC8qIGVycm9yIHJlZ2lzdGVyICovCisJbXRnZXQtPm10X3Jlc2lkID0gemZ0X3Jlc2lkOyAvKiByZXNpZHV1bSBvZiB3cml0ZXMsIHJlYWRzIGFuZAorCQkJCSAgICAgICogTVRJT0NUT1AgY29tbWFuZHMgCisJCQkJICAgICAgKi8KKwlpZiAoIXpmdF9vZmZsaW5lKSB7IC8qIG5laXRoZXIgbm9fdGFwZSBub3Igc29mdCBvZmZsaW5lICovCisJCW10Z2V0LT5tdF9nc3RhdCA9IEdNVF9PTkxJTkUofjBVTCk7CisJCS8qIHNob3VsZCByYXRoZXIgcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIGNhcnRyaWRnZQorCQkgKiB0aGFuIHRoZSBhY2Nlc3MgbW9kZSBvZiB0aGUgZmlsZSwgdGhlcmVmb3IgdXNlCisJCSAqIGZ0X3dyaXRlX3Byb3RlY3RlZCwgbm90IHpmdF93cml0ZV9wcm90ZWN0ZWQgCisJCSAqLworCQlpZiAoZnRfd3JpdGVfcHJvdGVjdGVkKSB7CisJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX1dSX1BST1QofjBVTCk7CisJCX0KKwkJaWYoemZ0X2hlYWRlcl9yZWFkKSB7IC8qIHRoaXMgY2F0Y2hlcyBub24tZm9ybWF0dGVkICovCisJCQl2b2x1bWUgPSB6ZnRfZmluZF92b2x1bWUoemZ0X3Bvcy5zZWdfcG9zKTsKKwkJCW10Z2V0LT5tdF9maWxlbm8gPSB2b2x1bWUtPmNvdW50OworCQkJbWF4X3RhcGVfcG9zID0gemZ0X2NhcGFjaXR5IC0gemZ0X2Jsa19zejsKKwkJCWlmICh6ZnRfdXNlX2NvbXByZXNzaW9uKSB7CisJCQkJbWF4X3RhcGVfcG9zIC09IFpGVF9DTVBSX09WRVJIRUFEOworCQkJfQorCQkJaWYgKHpmdF90YXBlX2F0X2VvZCgmemZ0X3BvcykpIHsKKwkJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX0VPRCh+MFVMKTsKKwkJCX0KKwkJCWlmICh6ZnRfcG9zLnRhcGVfcG9zID4gbWF4X3RhcGVfcG9zKSB7CisJCQkJbXRnZXQtPm10X2dzdGF0IHw9IEdNVF9FT1QofjBVTCk7CisJCQl9CisJCQltdGdldC0+bXRfYmxrbm8gPSB6ZnRfZGl2X2Jsa3N6KHpmdF9wb3Mudm9sdW1lX3BvcywKKwkJCQkJCQl2b2x1bWUtPmJsa19zeik7CisJCQlpZiAoemZ0X2p1c3RfYmVmb3JlX2VvZikgeworCQkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfRU9GKH4wVUwpOworCQkJfQorCQkJaWYgKHpmdF90YXBlX2F0X2xib3QoJnpmdF9wb3MpKSB7CisJCQkJbXRnZXQtPm10X2dzdGF0IHw9IEdNVF9CT1QofjBVTCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQltdGdldC0+bXRfZmlsZW5vID0gbXRnZXQtPm10X2Jsa25vID0gLTE7CisJCQlpZiAobXRnZXQtPm10X2RzcmVnICYgUUlDX1NUQVRVU19BVF9CT1QpIHsKKwkJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX0JPVCh+MFVMKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChmdF9ub190YXBlKSB7CisJCQltdGdldC0+bXRfZ3N0YXQgPSBHTVRfRFJfT1BFTih+MFVMKTsKKwkJfSBlbHNlIHsKKwkJCW10Z2V0LT5tdF9nc3RhdCA9IDBVTDsKKwkJfQorIAkJbXRnZXQtPm10X2ZpbGVubyA9IG10Z2V0LT5tdF9ibGtubyA9IC0xOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKyNpZmRlZiBNVElPQ1JERlRTRUcKKy8qCisgKiAgUmVhZCBhIGZsb3BweSB0YXBlIHNlZ21lbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgdGhlCisgKiAgdm9sdW1lIHRhYmxlLCBhbmQgcmVhZCB0aGUgb2xkIGhlYWRlciBzZWdtZW50IGJlZm9yZSByZS1mb3JtYXR0aW5nCisgKiAgdGhlIGNhcnRyaWRnZS4KKyAqLworc3RhdGljIGludCBtdGlvY3JkZnRzZWcoc3RydWN0IG10ZnRzZWcgKiBtdGZ0c2VnLCBpbnQgYXJnX3NpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DUkRGVFNFRyIpOworCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLAorCQkJICAgICJkcml2ZXIgbmVlZHMgdG8gYmUgaW4gcmF3IG1vZGUgZm9yIHRoaXMgaW9jdGwiKTsKKwl9IAorCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10ZnRzZWcpKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsCisJCQkgICAgYXJnX3NpemUpOworCX0KKwlpZiAoemZ0X29mZmxpbmUpIHsKKwkJVFJBQ0VfRVhJVCAtRU5YSU87CisJfQorCWlmIChtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1JEX1NJTkdMRSAmJgorCSAgICBtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1JEX0FIRUFEKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgImludmFsaWQgcmVhZCBtb2RlIik7CisJfQorCWlmICghZnRfZm9ybWF0dGVkKSB7CisJCVRSQUNFX0VYSVQgLUVBQ0NFUzsgLyogLUVOWElPID8gKi8KKworCX0KKwlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgeworCQlUUkFDRV9DQVRDSCh6ZnRfZGVmX2lkbGVfc3RhdGUoKSwpOworCX0KKwlpZiAobXRmdHNlZy0+bXRfc2Vnbm8gPiBmdF9sYXN0X2RhdGFfc2VnbWVudCkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sICJzZWdtZW50IG51bWJlciBpcyB0b28gbGFyZ2UiKTsKKwl9CisJbXRmdHNlZy0+bXRfcmVzdWx0ID0gZnRhcGVfcmVhZF9zZWdtZW50KG10ZnRzZWctPm10X3NlZ25vLAorCQkJCQkJemZ0X2RlYmxvY2tfYnVmLAorCQkJCQkJbXRmdHNlZy0+bXRfbW9kZSk7CisJaWYgKG10ZnRzZWctPm10X3Jlc3VsdCA8IDApIHsKKwkJLyogIGEgbmVnYXRpdiByZXN1bHQgaXMgbm90IGFuIGlvY3RsIGVycm9yLiBpZgorCQkgKiAgdGhlIHVzZXIgd2FudHMgdG8gcmVhZCBkYW1hZ2VkIHRhcGVzLAorCQkgKiAgaXQncyB1cCB0byBoZXIvaGltCisJCSAqLworCQlUUkFDRV9FWElUIDA7CisJfQorCWlmIChjb3B5X3RvX3VzZXIobXRmdHNlZy0+bXRfZGF0YSwKKwkJCSB6ZnRfZGVibG9ja19idWYsCisJCQkgbXRmdHNlZy0+bXRfcmVzdWx0KSAhPSAwKSB7CisJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorI2VuZGlmCisKKyNpZmRlZiBNVElPQ1dSRlRTRUcKKy8qCisgKiAgd3JpdGUgYSBmbG9wcHkgdGFwZSBzZWdtZW50LiBUaGlzIHZlcnNpb24gZmVhdHVyZXMgd3JpdGluZyBvZgorICogIGRlbGV0ZWQgYWRkcmVzcyBtYXJrcywgYW5kIGdyYWNlZnVsbHkgaWdub3JlcyB0aGUgKHNvZnR3YXJlKQorICogIGZ0X2Zvcm1hdHRlZCBmbGFnIHRvIHN1cHBvcnQgd3JpdGluZyBvZiBoZWFkZXIgc2VnbWVudHMgYWZ0ZXIKKyAqICBmb3JtYXR0aW5nLgorICovCitzdGF0aWMgaW50IG10aW9jd3JmdHNlZyhzdHJ1Y3QgbXRmdHNlZyAqIG10ZnRzZWcsIGludCBhcmdfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ1dSRlRTRUciKTsKKwlpZiAoemZ0X3dyaXRlX3Byb3RlY3RlZCB8fCB6ZnRfcWljX21vZGUpIHsKKwkJVFJBQ0VfRVhJVCAtRUFDQ0VTOworCX0gCisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRmdHNlZykpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwKKwkJCSAgICBhcmdfc2l6ZSk7CisJfQorCWlmICh6ZnRfb2ZmbGluZSkgeworCQlUUkFDRV9FWElUIC1FTlhJTzsKKwl9CisJaWYgKG10ZnRzZWctPm10X21vZGUgIT0gRlRfV1JfQVNZTkMgICAmJiAKKwkgICAgbXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9XUl9NVUxUSSAgICYmCisJICAgIG10ZnRzZWctPm10X21vZGUgIT0gRlRfV1JfU0lOR0xFICAmJgorCSAgICBtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1dSX0RFTEVURSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sICJpbnZhbGlkIHdyaXRlIG1vZGUiKTsKKwl9CisJLyoKKwkgKiAgV2UgZG9uJ3QgY2hlY2sgZm9yIGZ0X2Zvcm1hdHRlZCwgYmVjYXVzZSB0aGlzIGdpdmVzCisJICogIG9ubHkgdGhlIHNvZnR3YXJlIHN0YXR1cyBvZiB0aGUgZHJpdmVyLgorCSAqCisJICogIFdlIGFzc3VtZSB0aGF0IHRoZSB1c2VyIGtub3dzIHdoYXQgaXQgaXMKKwkgKiAgZG9pbmcuIEFuZCByZWx5IG9uIHRoZSBsb3cgbGV2ZWwgc3R1ZmYgdG8gZmFpbAorCSAqICB3aGVuIHRoZSB0YXBlIGlzbid0IGZvcm1hdHRlZC4gV2Ugb25seSBtYWtlIHN1cmUKKwkgKiAgdGhhdCBUaGUgaGVhZGVyIHNlZ21lbnQgYnVmZmVyIGlzIGFsbG9jYXRlZCwKKwkgKiAgYmVjYXVzZSBpdCBob2xkcyB0aGUgYmFkIHNlY3RvciBtYXAuCisJICovCisJaWYgKHpmdF9oc2VnX2J1ZiA9PSBOVUxMKSB7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAobXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9XUl9ERUxFVEUpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHpmdF9kZWJsb2NrX2J1ZiwgCisJCQkJICAgbXRmdHNlZy0+bXRfZGF0YSwKKwkJCQkgICBGVF9TRUdNRU5UX1NJWkUpICE9IDApIHsKKwkJCVRSQUNFX0VYSVQgLUVGQVVMVDsKKwkJfQorCX0KKwltdGZ0c2VnLT5tdF9yZXN1bHQgPSBmdGFwZV93cml0ZV9zZWdtZW50KG10ZnRzZWctPm10X3NlZ25vLCAKKwkJCQkJCSB6ZnRfZGVibG9ja19idWYsCisJCQkJCQkgbXRmdHNlZy0+bXRfbW9kZSk7CisJaWYgKG10ZnRzZWctPm10X3Jlc3VsdCA+PSAwICYmIG10ZnRzZWctPm10X21vZGUgPT0gRlRfV1JfU0lOR0xFKSB7CisJCS8qICAKKwkJICogIGEgbmVnYXRpdiByZXN1bHQgaXMgbm90IGFuIGlvY3RsIGVycm9yLiBpZgorCQkgKiAgdGhlIHVzZXIgd2FudHMgdG8gd3JpdGUgZGFtYWdlZCB0YXBlcywKKwkJICogIGl0J3MgdXAgdG8gaGVyL2hpbQorCQkgKi8KKwkJaWYgKChyZXN1bHQgPSBmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCkpIDwgMCkgeworCQkJbXRmdHNlZy0+bXRfcmVzdWx0ID0gcmVzdWx0OworCQl9CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKyNlbmRpZgorICAKKyNpZmRlZiBNVElPQ1ZPTElORk8KKy8qCisgKiAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHZvbHVtZSBwb3NpdGlvbmVkIGF0LgorICovCitzdGF0aWMgaW50IG10aW9jdm9saW5mbyhzdHJ1Y3QgbXR2b2xpbmZvICp2b2xpbmZvLCBpbnQgYXJnX3NpemUpCit7CisJY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NWT0xJTkZPIik7CisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXR2b2xpbmZvKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAorCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKKwl9CisJaWYgKHpmdF9vZmZsaW5lKSB7CisJCVRSQUNFX0VYSVQgLUVOWElPOworCX0KKwlpZiAoIWZ0X2Zvcm1hdHRlZCkgeworCQlUUkFDRV9FWElUIC1FQUNDRVM7CisJfQorCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJdm9sdW1lID0gemZ0X2ZpbmRfdm9sdW1lKHpmdF9wb3Muc2VnX3Bvcyk7CisJdm9saW5mby0+bXRfdm9sbm8gICA9IHZvbHVtZS0+Y291bnQ7CisJdm9saW5mby0+bXRfYmxrc3ogICA9IHZvbHVtZS0+YmxrX3N6ID09IDEgPyAwIDogdm9sdW1lLT5ibGtfc3o7CisJdm9saW5mby0+bXRfc2l6ZSAgICA9IHZvbHVtZS0+c2l6ZSA+PiAxMDsKKwl2b2xpbmZvLT5tdF9yYXdzaXplID0gKCh6ZnRfY2FsY190YXBlX3Bvcyh2b2x1bWUtPmVuZF9zZWcgKyAxKSA+PiAxMCkgLQorCQkJICAgICAgICh6ZnRfY2FsY190YXBlX3Bvcyh2b2x1bWUtPnN0YXJ0X3NlZykgPj4gMTApKTsKKwl2b2xpbmZvLT5tdF9jbXByICAgID0gdm9sdW1lLT51c2VfY29tcHJlc3Npb247CisJVFJBQ0VfRVhJVCAwOworfQorI2VuZGlmCisKKyNpZmRlZiBaRlRfT0JTT0xFVEUgIAorc3RhdGljIGludCBtdGlvY196ZnRhcGVfZ2V0Ymxrc3ooc3RydWN0IG10Ymxrc3ogKmJsa3N6LCBpbnQgYXJnX3NpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgorCSAgICAgIEtFUk5fSU5GTyAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NfWlRBUEVfR0VUQkxLU1pcbiIKKwkgICAgICBLRVJOX0lORk8gIlRoaXMgaW9jdGwgaXMgaGVyZSBtZXJlbHkgZm9yIGNvbXBhdGliaWxpdHkuXG4iCisJICAgICAgS0VSTl9JTkZPICJQbGVhc2UgdXNlIE1USU9DVk9MSU5GTyBpbnN0ZWFkIik7CisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRibGtzeikpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKKwkJCSAgICBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLCBhcmdfc2l6ZSk7CisJfQorCWlmICh6ZnRfb2ZmbGluZSkgeworCQlUUkFDRV9FWElUIC1FTlhJTzsKKwl9CisJaWYgKCFmdF9mb3JtYXR0ZWQpIHsKKwkJVFJBQ0VfRVhJVCAtRUFDQ0VTOworCX0KKwlUUkFDRV9DQVRDSCh6ZnRfZGVmX2lkbGVfc3RhdGUoKSwpOworCWJsa3N6LT5tdF9ibGtzeiA9IHpmdF9maW5kX3ZvbHVtZSh6ZnRfcG9zLnNlZ19wb3MpLT5ibGtfc3o7CisJVFJBQ0VfRVhJVCAwOworfQorI2VuZGlmCisKKyNpZmRlZiBNVElPQ0dFVFNJWkUKKy8qCisgKiAgZ2V0IHRoZSBjYXBhY2l0eSBvZiB0aGUgdGFwZSBjYXJ0cmlkZ2UuCisgKi8KK3N0YXRpYyBpbnQgbXRpb2NnZXRzaXplKHN0cnVjdCBtdHRhcGVzaXplICpzaXplLCBpbnQgYXJnX3NpemUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DX1pGVEFQRV9HRVRTSVpFIik7CisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXR0YXBlc2l6ZSkpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKKwkJCSAgICBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLCBhcmdfc2l6ZSk7CisJfQorCWlmICh6ZnRfb2ZmbGluZSkgeworCQlUUkFDRV9FWElUIC1FTlhJTzsKKwl9CisJaWYgKCFmdF9mb3JtYXR0ZWQpIHsKKwkJVFJBQ0VfRVhJVCAtRUFDQ0VTOworCX0KKwlUUkFDRV9DQVRDSCh6ZnRfZGVmX2lkbGVfc3RhdGUoKSwpOworCXNpemUtPm10X2NhcGFjaXR5ID0gKHVuc2lnbmVkIGludCkoemZ0X2NhcGFjaXR5Pj4xMCk7CisJc2l6ZS0+bXRfdXNlZCAgICAgPSAodW5zaWduZWQgaW50KSh6ZnRfZ2V0X2VvbV9wb3MoKT4+MTApOworCVRSQUNFX0VYSVQgMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG10aW9jcG9zKHN0cnVjdCBtdHBvcyAqbXRwb3MsIGludCBhcmdfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ1BPUyIpOworCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10cG9zKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAorCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKKwl9CisJcmVzdWx0ID0gbXRfdGVsbCgoaW50ICopJm10cG9zLT5tdF9ibGtubyk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKyNpZmRlZiBNVElPQ0ZURk9STUFUCisvKgorICogZm9ybWF0dGluZyBvZiBmbG9wcHkgdGFwZSBjYXJ0cmlkZ2VzLiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQKKyAqIHRvZ2V0aGVyIHdpdGggdGhlIE1USU9DRlRDTUQgaW9jdGwgYW5kIHRoZSBuZXcgbW1hcCBmZWF0dXJlIAorICovCisKKy8qIAorICogIFRoaXMgZnVuY3Rpb24gdXNlcyBmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoKSB0byBpbmZvcm0gdGhlIGxvdworICogIGxldmVsIGZ0YXBlIG1vZHVsZSBhYm91dCB0aGUgbmV3IHBhcmFtZXRlcnMuCisgKgorICogIEl0IGVyYXNlcyB0aGUgaHNlZ19idWYuIFRoZSBjYWxsaW5nIHByb2Nlc3MgbXVzdCBzcGVjaWZ5IGFsbAorICogIHBhcmFtZXRlcnMgdG8gYXNzdXJlIHByb3BlciBvcGVyYXRpb24uCisgKgorICogIHJldHVybiB2YWx1ZXM6IC1FSU5WQUwgLSB3cm9uZyBhcmd1bWVudCBzaXplCisgKiAgICAgICAgICAgICAgICAgLUVJTlZBTCAtIGlmIGZ0YXBlX2RlY29kZV9oZWFkZXJfc2VnbWVudCgpIGZhaWxlZC4KKyAqLworc3RhdGljIGludCBzZXRfZm9ybWF0X3Bhcm1zKHN0cnVjdCBmdGZtdHBhcm1zICpwLCBfX3U4ICpoc2VnX2J1ZikKK3sKKwlmdF90cmFjZV90IG9sZF9sZXZlbCA9IFRSQUNFX0xFVkVMOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1USU9DRlRGT1JNQVQgb3BlcmF0aW9uIEZURk1UX1NFVFBBUk1TIik7CisJbWVtc2V0KGhzZWdfYnVmLCAwLCBGVF9TRUdNRU5UX1NJWkUpOworCVBVVDQoaHNlZ19idWYsIEZUX1NJR05BVFVSRSwgRlRfSFNFR19NQUdJQyk7CisKKwkvKiAgZmlsbCBpbiB1c2VyIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisJICovCisJaHNlZ19idWZbRlRfRk1UX0NPREVdID0gKF9fdTgpcC0+ZnRfZm10Y29kZTsKKwlQVVQyKGhzZWdfYnVmLCBGVF9TUFQsIHAtPmZ0X3NwdCk7CisJaHNlZ19idWZbRlRfVFBDXSAgICAgID0gKF9fdTgpcC0+ZnRfdHBjOworCWhzZWdfYnVmW0ZUX0ZITV0gICAgICA9IChfX3U4KXAtPmZ0X2ZobTsKKwloc2VnX2J1ZltGVF9GVE1dICAgICAgPSAoX191OClwLT5mdF9mdG07CisKKwkvKiAgZmlsbCBpbiBzYW5lIGRlZmF1bHRzIHRvIG1ha2UgZnRhcGUgaGFwcHkuCisJICovIAorCWhzZWdfYnVmW0ZUX0ZTTV0gPSAoX191OCkxMjg7IC8qIDEyOCBpcyBoYXJkIHdpcmVkIGFsbCBvdmVyIGZ0YXBlICovCisJaWYgKHAtPmZ0X2ZtdGNvZGUgPT0gZm10X2JpZykgeworCQlQVVQ0KGhzZWdfYnVmLCBGVF82X0hTRUdfMSwgICAwKTsKKwkJUFVUNChoc2VnX2J1ZiwgRlRfNl9IU0VHXzIsICAgMSk7CisJCVBVVDQoaHNlZ19idWYsIEZUXzZfRlJTVF9TRUcsIDIpOworCQlQVVQ0KGhzZWdfYnVmLCBGVF82X0xBU1RfU0VHLCBwLT5mdF9zcHQgKiBwLT5mdF90cGMgLSAxKTsKKwl9IGVsc2UgeworCQlQVVQyKGhzZWdfYnVmLCBGVF9IU0VHXzEsICAgIDApOworCQlQVVQyKGhzZWdfYnVmLCBGVF9IU0VHXzIsICAgIDEpOworCQlQVVQyKGhzZWdfYnVmLCBGVF9GUlNUX1NFRywgIDIpOworCQlQVVQyKGhzZWdfYnVmLCBGVF9MQVNUX1NFRywgcC0+ZnRfc3B0ICogcC0+ZnRfdHBjIC0gMSk7CisJfQorCisJLyogIFN5bmNocm9uaXplIHdpdGggdGhlIGxvdyBsZXZlbCBtb2R1bGUuIFRoaXMgaXMgcGFydGljdWxhcmx5CisJICogIG5lZWRlZCBmb3IgdW5mb3JtYXR0ZWQgY2FydHJpZGdlcyBhcyB0aGUgUUlDIHN0ZCB3YXMgcHJldmlvdXNseSAKKwkgKiAgdW5rbm93biBCVVQgaXMgbmVlZGVkIHRvIHNldCBkYXRhIHJhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aW1lb3V0cy4KKwkgKi8KKwlUUkFDRV9DQVRDSChmdGFwZV9jYWxpYnJhdGVfZGF0YV9yYXRlKHAtPmZ0X3FpY3N0ZCZRSUNfVEFQRV9TVERfTUFTSyksCisJCSAgICBfcmVzID0gLUVJTlZBTCk7CisKKwkvKiAgVGhlIGZvbGxvd2luZyB3aWxsIGFsc28gcmVjYWxjdWFsdGUgdGhlIHRpbWVvdXRzIGZvciB0aGUgdGFwZQorCSAqICBsZW5ndGggYW5kIFFJQyBzdGQgd2Ugd2FudCB0byBmb3JtYXQgdG8uCisJICogIGFib3J0IHdpdGggLUVJTlZBTCByYXRoZXIgdGhhbiAtRUlPCisJICovCisJU0VUX1RSQUNFX0xFVkVMKGZ0X3Rfd2Fybik7CisJVFJBQ0VfQ0FUQ0goZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KGhzZWdfYnVmKSwKKwkJICAgIFNFVF9UUkFDRV9MRVZFTChvbGRfbGV2ZWwpOyBfcmVzID0gLUVJTlZBTCk7CisJU0VUX1RSQUNFX0xFVkVMKG9sZF9sZXZlbCk7CisJVFJBQ0VfRVhJVCAwOworfQorCisvKgorICogIFJldHVybiB0aGUgaW50ZXJuYWwgU09GVFdBUkUgc3RhdHVzIG9mIHRoZSBrZXJuZWwgZHJpdmVyLiBUaGlzIGRvZXMKKyAqICBOT1QgcXVlcnkgdGhlIHRhcGUgZHJpdmUgYWJvdXQgaXRzIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBnZXRfZm9ybWF0X3Bhcm1zKHN0cnVjdCBmdGZtdHBhcm1zICpwLCBfX3U4ICpoc2VnX2J1ZmZlcikKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsICJNVElPQ0ZURk9STUFUIG9wZXJhdGlvbiBGVEZNVF9HRVRQQVJNUyIpOworCXAtPmZ0X3FpY3N0ZCAgPSBmdF9xaWNfc3RkOworCXAtPmZ0X2ZtdGNvZGUgPSBmdF9mb3JtYXRfY29kZTsKKwlwLT5mdF9maG0gICAgID0gaHNlZ19idWZmZXJbRlRfRkhNXTsKKwlwLT5mdF9mdG0gICAgID0gaHNlZ19idWZmZXJbRlRfRlRNXTsKKwlwLT5mdF9zcHQgICAgID0gZnRfc2VnbWVudHNfcGVyX3RyYWNrOworCXAtPmZ0X3RwYyAgICAgPSBmdF90cmFja3NfcGVyX3RhcGU7CisJVFJBQ0VfRVhJVCAwOworfQorCitzdGF0aWMgaW50IG10aW9jZnRmb3JtYXQoc3RydWN0IG10ZnRmb3JtYXQgKm10ZnRmb3JtYXQsIGludCBhcmdfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXVuaW9uIGZtdF9hcmcgKmFyZyA9ICZtdGZ0Zm9ybWF0LT5mbXRfYXJnOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DRlRGT1JNQVQiKTsKKwlpZiAoemZ0X29mZmxpbmUpIHsKKwkJaWYgKGZ0X25vX3RhcGUpIHsKKwkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9pbmZvLCAibm8gdGFwZSBwcmVzZW50Iik7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfaW5mbywgImRyaXZlIGlzIG9mZmxpbmUiKTsKKwkJfQorCX0KKwlpZiAoemZ0X3FpY19tb2RlKSB7CisJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywKKwkJCSAgICAiZHJpdmVyIG5lZWRzIHRvIGJlIGluIHJhdyBtb2RlIGZvciB0aGlzIGlvY3RsIik7CisJfSAKKwlpZiAoemZ0X2hzZWdfYnVmID09IE5VTEwpIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X3ZjYWxsb2Nfb25jZSgmemZ0X2hzZWdfYnVmLCBGVF9TRUdNRU5UX1NJWkUpLCk7CisJfQorCXpmdF9oZWFkZXJfcmVhZCA9IDA7CisJc3dpdGNoKG10ZnRmb3JtYXQtPmZtdF9vcCkgeworCWNhc2UgRlRGTVRfU0VUX1BBUk1TOgorCQlUUkFDRV9DQVRDSChzZXRfZm9ybWF0X3Bhcm1zKCZhcmctPmZtdF9wYXJtcywgemZ0X2hzZWdfYnVmKSwpOworCQlUUkFDRV9FWElUIDA7CisJY2FzZSBGVEZNVF9HRVRfUEFSTVM6CisJCVRSQUNFX0NBVENIKGdldF9mb3JtYXRfcGFybXMoJmFyZy0+Zm10X3Bhcm1zLCB6ZnRfaHNlZ19idWYpLCk7CisJCVRSQUNFX0VYSVQgMDsKKwljYXNlIEZURk1UX0ZPUk1BVF9UUkFDSzoKKwkJaWYgKChmdF9mb3JtYXR0ZWQgJiYgemZ0X2NoZWNrX3dyaXRlX2FjY2VzcygmemZ0X3BvcykgPCAwKSB8fAorCQkgICAgKCFmdF9mb3JtYXR0ZWQgJiYgemZ0X3dyaXRlX3Byb3RlY3RlZCkpIHsKKwkJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywgIldyaXRlIGFjY2VzcyBkZW5pZWQiKTsKKwkJfQorCQlUUkFDRV9DQVRDSChmdGFwZV9mb3JtYXRfdHJhY2soYXJnLT5mbXRfdHJhY2suZnRfdHJhY2ssCisJCQkJCSAgICAgICBhcmctPmZtdF90cmFjay5mdF9nYXAzKSwpOworCQlUUkFDRV9FWElUIDA7CisJY2FzZSBGVEZNVF9TVEFUVVM6CisJCVRSQUNFX0NBVENIKGZ0YXBlX2Zvcm1hdF9zdGF0dXMoJmFyZy0+Zm10X3N0YXR1cy5mdF9zZWdtZW50KSwpOworCQlUUkFDRV9FWElUIDA7CisJY2FzZSBGVEZNVF9WRVJJRlk6CisJCVRSQUNFX0NBVENIKGZ0YXBlX3ZlcmlmeV9zZWdtZW50KGFyZy0+Zm10X3ZlcmlmeS5mdF9zZWdtZW50LAorCQkJCShTZWN0b3JNYXAgKikmYXJnLT5mbXRfdmVyaWZ5LmZ0X2JzbSksKTsKKwkJVFJBQ0VfRVhJVCAwOworCWRlZmF1bHQ6CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfZXJyLCAiSW52YWxpZCBmb3JtYXQgb3BlcmF0aW9uIik7CisJfQorCVRSQUNFX0VYSVQgcmVzdWx0OworfQorI2VuZGlmCisKKyNpZmRlZiBNVElPQ0ZUQ01ECisvKgorICogIHNlbmQgYSBRSUMtMTE3IGNvbW1hbmQgdG8gdGhlIGRyaXZlLCB3aXRoIG9wdGlvbmFsIHRpbWVvdXRzLAorICogIHBhcmFtZXRlciBhbmQgcmVzdWx0IGJpdHMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0b2dldGhlcgorICogIHdpdGggdGhlIGZvcm1hdHRpbmcgaW9jdGwuCisgKi8KK3N0YXRpYyBpbnQgbXRpb2NmdGNtZChzdHJ1Y3QgbXRmdGNtZCAqZnRjbWQsIGludCBhcmdfc2l6ZSkKK3sKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ0ZUQ01EIik7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCVRSQUNFX0FCT1JUKC1FUEVSTSwgZnRfdF9pbmZvLAorCQkJICAgICJuZWVkIENBUF9TWVNfQURNSU4gY2FwYWJpbGl0eSB0byBzZW5kIHJhdyBxaWMtMTE3IGNvbW1hbmRzIik7CisJfQorCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLAorCQkJICAgICJkcml2ZXIgbmVlZHMgdG8gYmUgaW4gcmF3IG1vZGUgZm9yIHRoaXMgaW9jdGwiKTsKKwl9IAorCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10ZnRjbWQpKSB7CisJCVRSQUNFX0FCT1JUKC1FSU5WQUwsCisJCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOworCX0KKwlpZiAoZnRjbWQtPmZ0X3dhaXRfYmVmb3JlKSB7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3JlYWR5X3dhaXQoZnRjbWQtPmZ0X3dhaXRfYmVmb3JlLAorCQkJCQkgICAgICZmdGNtZC0+ZnRfc3RhdHVzKSwpOworCX0KKwlpZiAoZnRjbWQtPmZ0X3N0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpCisJCWdvdG8gZnRtdGNtZF9lcnJvcjsKKwlpZiAoZnRjbWQtPmZ0X3Jlc3VsdF9iaXRzICE9IDApIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X29wZXJhdGlvbigmZnRjbWQtPmZ0X3Jlc3VsdCwKKwkJCQkJCSAgIGZ0Y21kLT5mdF9jbWQsCisJCQkJCQkgICBmdGNtZC0+ZnRfcmVzdWx0X2JpdHMpLCk7CisJfSBlbHNlIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfY29tbWFuZChmdGNtZC0+ZnRfY21kKSwpOworCQlpZiAoZnRjbWQtPmZ0X3N0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpCisJCQlnb3RvIGZ0bXRjbWRfZXJyb3I7CisJCWZvciAoaSA9IDA7IGkgPCBmdGNtZC0+ZnRfcGFybV9jbnQ7IGkrKykgeworCQkJVFJBQ0VfQ0FUQ0goZnRhcGVfcGFyYW1ldGVyKGZ0Y21kLT5mdF9wYXJtc1tpXSYweDBmKSwpOworCQkJaWYgKGZ0Y21kLT5mdF9zdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKQorCQkJCWdvdG8gZnRtdGNtZF9lcnJvcjsKKwkJfQorCX0KKwlpZiAoZnRjbWQtPmZ0X3dhaXRfYWZ0ZXIgIT0gMCkgeworCQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkeV93YWl0KGZ0Y21kLT5mdF93YWl0X2FmdGVyLAorCQkJCQkgICAgICZmdGNtZC0+ZnRfc3RhdHVzKSwpOworCX0KK2Z0bXRjbWRfZXJyb3I6CSAgICAgICAKKwlpZiAoZnRjbWQtPmZ0X3N0YXR1cyAmIFFJQ19TVEFUVVNfRVJST1IpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImVycm9yIHN0YXR1cyBzZXQiKTsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVwb3J0X2Vycm9yKCZmdGNtZC0+ZnRfZXJyb3IsCisJCQkJCSAgICAgICAmZnRjbWQtPmZ0X2NtZCwgMSksKTsKKwl9CisJVFJBQ0VfRVhJVCAwOyAvKiB0aGlzIGlzIG5vdCBhbiBpL28gZXJyb3IgKi8KK30KKyNlbmRpZgorCisvKiAgSU9DVEwgcm91dGluZSBjYWxsZWQgYnkga2VybmVsLWludGVyZmFjZSBjb2RlCisgKi8KK2ludCBfemZ0X2lvY3RsKHVuc2lnbmVkIGludCBjb21tYW5kLCB2b2lkIF9fdXNlciAqIGFyZykKK3sKKwlpbnQgcmVzdWx0OworCXVuaW9uIHsgc3RydWN0IG10b3AgICAgICAgbXRvcDsKKwkJc3RydWN0IG10Z2V0ICAgICAgbXRnZXQ7CisJCXN0cnVjdCBtdHBvcyAgICAgIG10cG9zOworI2lmZGVmIE1USU9DUkRGVFNFRworCQlzdHJ1Y3QgbXRmdHNlZyAgICBtdGZ0c2VnOworI2VuZGlmCisjaWZkZWYgTVRJT0NWT0xJTkZPCisJCXN0cnVjdCBtdHZvbGluZm8gIG10dm9saW5mbzsKKyNlbmRpZgorI2lmZGVmIE1USU9DR0VUU0laRQorCQlzdHJ1Y3QgbXR0YXBlc2l6ZSBtdHRhcGVzaXplOworI2VuZGlmCisjaWZkZWYgTVRJT0NGVEZPUk1BVAorCQlzdHJ1Y3QgbXRmdGZvcm1hdCBtdGZ0Zm9ybWF0OworI2VuZGlmCisjaWZkZWYgWkZUX09CU09MRVRFCisJCXN0cnVjdCBtdGJsa3N6IG10Ymxrc3o7CisjZW5kaWYKKyNpZmRlZiBNVElPQ0ZUQ01ECisJCXN0cnVjdCBtdGZ0Y21kIG10ZnRjbWQ7CisjZW5kaWYKKwl9IGtybmxfYXJnOworCWludCBhcmdfc2l6ZSA9IF9JT0NfU0laRShjb21tYW5kKTsKKwlpbnQgZGlyID0gX0lPQ19ESVIoY29tbWFuZCk7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwkvKiBUaGlzIGNoZWNrIHdpbGwgb25seSBjYXRjaCBhcmd1bWVudHMgdGhhdCBhcmUgdG9vIGxhcmdlICEKKwkgKi8KKwlpZiAoZGlyICYgKF9JT0NfUkVBRCB8IF9JT0NfV1JJVEUpICYmIGFyZ19zaXplID4gc2l6ZW9mKGtybmxfYXJnKSkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAorCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKKwl9CisJaWYgKGRpciAmIF9JT0NfV1JJVEUpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrcm5sX2FyZywgYXJnLCBhcmdfc2l6ZSkgIT0gMCkgeworCQkJVFJBQ0VfRVhJVCAtRUZBVUxUOworCQl9CisJfQorCVRSQUNFKGZ0X3RfZmxvdywgImNhbGxlZCB3aXRoIGlvY3RsIGNvbW1hbmQ6IDB4JTA4eCIsIGNvbW1hbmQpOworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgTVRJT0NUT1A6CisJCXJlc3VsdCA9IG10aW9jdG9wKCZrcm5sX2FyZy5tdG9wLCBhcmdfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgTVRJT0NHRVQ6CisJCXJlc3VsdCA9IG10aW9jZ2V0KCZrcm5sX2FyZy5tdGdldCwgYXJnX3NpemUpOworCQlicmVhazsKKwljYXNlIE1USU9DUE9TOgorCQlyZXN1bHQgPSBtdGlvY3Bvcygma3JubF9hcmcubXRwb3MsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjaWZkZWYgTVRJT0NWT0xJTkZPCisJY2FzZSBNVElPQ1ZPTElORk86CisJCXJlc3VsdCA9IG10aW9jdm9saW5mbygma3JubF9hcmcubXR2b2xpbmZvLCBhcmdfc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWkZUX09CU09MRVRFCisJY2FzZSBNVElPQ19aRlRBUEVfR0VUQkxLU1o6CisJCXJlc3VsdCA9IG10aW9jX3pmdGFwZV9nZXRibGtzeigma3JubF9hcmcubXRibGtzeiwgYXJnX3NpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIE1USU9DUkRGVFNFRworCWNhc2UgTVRJT0NSREZUU0VHOiAvKiByZWFkIGEgc2VnbWVudCB2aWEgaW9jdGwgKi8KKwkJcmVzdWx0ID0gbXRpb2NyZGZ0c2VnKCZrcm5sX2FyZy5tdGZ0c2VnLCBhcmdfc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgTVRJT0NXUkZUU0VHCisJY2FzZSBNVElPQ1dSRlRTRUc6IC8qIHdyaXRlIGEgc2VnbWVudCB2aWEgaW9jdGwgKi8KKwkJcmVzdWx0ID0gbXRpb2N3cmZ0c2VnKCZrcm5sX2FyZy5tdGZ0c2VnLCBhcmdfc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgTVRJT0NHRVRTSVpFCisJY2FzZSBNVElPQ0dFVFNJWkU6CisJCXJlc3VsdCA9IG10aW9jZ2V0c2l6ZSgma3JubF9hcmcubXR0YXBlc2l6ZSwgYXJnX3NpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIE1USU9DRlRGT1JNQVQKKwljYXNlIE1USU9DRlRGT1JNQVQ6CisJCXJlc3VsdCA9IG10aW9jZnRmb3JtYXQoJmtybmxfYXJnLm10ZnRmb3JtYXQsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBNVElPQ0ZUQ01ECisJY2FzZSBNVElPQ0ZUQ01EOgorCQlyZXN1bHQgPSBtdGlvY2Z0Y21kKCZrcm5sX2FyZy5tdGZ0Y21kLCBhcmdfc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWlmICgocmVzdWx0ID49IDApICYmIChkaXIgJiBfSU9DX1JFQUQpKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAma3JubF9hcmcsIGFyZ19zaXplKSAhPSAwKSB7CisJCQlUUkFDRV9FWElUIC1FRkFVTFQ7CisJCX0KKwl9CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDE1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuaApAQCAtMCwwICsxLDU5IEBACisjaWZuZGVmIF9aRlRBUEVfQ1RMX0gKKyNkZWZpbmUgX1pGVEFQRV9DVExfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uIAorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOTowMiAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5vbi1zdGFuZGFyZCBJT0NUTCByZWxhdGVkIGRlZmluaXRpb25zCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbXRpby5oPgorCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorCisjaWZkZWYgQ09ORklHX1pGVEFQRV9NT0RVTEUKKyNkZWZpbmUgZnRhcGVfc3RhdHVzICgqemZ0X3N0YXR1cykKKyNlbmRpZgorCitleHRlcm4gaW50IHpmdF9vZmZsaW5lOworZXh0ZXJuIGludCB6ZnRfbXRfY29tcHJlc3Npb247CitleHRlcm4gaW50IHpmdF93cml0ZV9wcm90ZWN0ZWQ7CitleHRlcm4gaW50IHpmdF9oZWFkZXJfcmVhZDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgemZ0X3VuaXQ7CitleHRlcm4gaW50IHpmdF9yZXNpZDsKKworZXh0ZXJuIHZvaWQgemZ0X3Jlc2V0X3Bvc2l0aW9uKHpmdF9wb3NpdGlvbiAqcG9zKTsKK2V4dGVybiBpbnQgIHpmdF9jaGVja193cml0ZV9hY2Nlc3MoemZ0X3Bvc2l0aW9uICpwb3MpOworZXh0ZXJuIGludCAgemZ0X2RlZl9pZGxlX3N0YXRlKHZvaWQpOworCisvKiAgaG9va3MgZm9yIHRoZSBWRlMgaW50ZXJmYWNlIAorICovCitleHRlcm4gaW50ICBfemZ0X29wZW4odW5zaWduZWQgaW50IGRldl9taW5vciwgdW5zaWduZWQgaW50IGFjY2Vzc19tb2RlKTsKK2V4dGVybiBpbnQgIF96ZnRfY2xvc2Uodm9pZCk7CitleHRlcm4gaW50ICBfemZ0X2lvY3RsKHVuc2lnbmVkIGludCBjb21tYW5kLCB2b2lkIF9fdXNlciAqYXJnKTsKKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtZW9mLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2FkY2FlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtZW9mLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiAgIEkgdXNlIHRoZXNlIHJvdXRpbmVzIGp1c3QgdG8gZGVjaWRlIHdoZW4gSSBoYXZlIHRvIGZha2UgYSAKKyAqICAgdm9sdW1lLXRhYmxlIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgdG8gb3JpZ2luYWwgZnRhcGUuCisgKi8KKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1IEJhcyBMYWFyaG92ZW4uCisgKiAgICAgIAorICogICAgICBNb2RpZmllZCBmb3IgemZ0YXBlIDE5OTYsIDE5OTcgQ2xhdXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjAyICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZW9mIG1hcmsgaGFuZGxpbmcgY29kZQorICogICAgICBmb3IgdGhlIFFJQy00MC84MCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKKworLyogICAgICBHbG9iYWwgdmFycy4KKyAqLworCisvKiBhIGNvcHkgb2YgdGhlIGZhaWxlZCBzZWN0b3IgbG9nIGZyb20gdGhlIGhlYWRlciBzZWdtZW50LgorICovCitlb2ZfbWFya191bmlvbiAqemZ0X2VvZl9tYXA7CisKKy8qIG51bWJlciBvZiBlb2YgbWFya3MgKGVudHJpZXMgaW4gYmFkIHNlY3RvciBsb2cpIG9uIHRhcGUuCisgKi8KK2ludCB6ZnRfbnJfZW9mX21hcmtzID0gLTE7CisKKworLyogICAgICBMb2NhbCB2YXJzLgorICovCisKK3N0YXRpYyBjaGFyIGxpbnV4X3RhcGVfbGFiZWxbXSA9ICJMaW51eCByYXcgZm9ybWF0IFYiOworZW51bSB7IAorCW1pbl9mbXRfdmVyc2lvbiA9IDEsIG1heF9mbXRfdmVyc2lvbiA9IDIgCit9Oworc3RhdGljIHVuc2lnbmVkIGZ0YXBlX2ZtdF92ZXJzaW9uID0gMDsKKworCisvKiBGdGFwZSAobWlzKXVzZXMgdGhlIGJhZCBzZWN0b3IgbG9nIHRvIHJlY29yZCBlbmQtb2YtZmlsZSBtYXJrcy4KKyAqIEluaXRpYWxseSAod2hlbiB0aGUgdGFwZSBpcyBlcmFzZWQpIGFsbCBlbnRyaWVzIGluIHRoZSBiYWQgc2VjdG9yCisgKiBsb2cgYXJlIGFkZGVkIHRvIHRoZSB0YXBlJ3MgYmFkIHNlY3RvciBtYXAuIFRoZSBiYWQgc2VjdG9yIGxvZyB0aGVuCisgKiBpcyBjbGVhcmVkLgorICoKKyAqIFRoZSBiYWQgc2VjdG9yIGxvZyBub3JtYWxseSBjb250YWlucyBlbnRyaWVzIG9mIHRoZSBmb3JtOiAKKyAqIGV2ZW4gMTYtYml0IHdvcmQ6IHNlZ21lbnQgbnVtYmVyIG9mIGJhZCBzZWN0b3IgCisgKiBvZGQgMTYtYml0IHdvcmQ6IGVuY29kZWQgZGF0ZQorICogVGhlcmUgY2FuIGJlIGEgdG90YWwgb2YgNDQ4IGVudHJpZXMgKDE3OTIgYnl0ZXMpLgorICoKKyAqIE15IGd1ZXNzIGlzIHRoYXQgbm8gcHJvZ3JhbSBpcyB1c2luZyB0aGlzIGJhZCBzZWN0b3IgbG9nICh0aGUgKgorICogZm9ybWF0IHNlZW1zIHVzZWxlc3MgYXMgdGhlcmUgaXMgbm8gaW5kaWNhdGlvbiBvZiB0aGUgYmFkIHNlY3RvcgorICogaXRzZWxmLCBvbmx5IHRoZSBzZWdtZW50KSBIb3dldmVyLCBpZiBhbnkgcHJvZ3JhbSBkb2VzIHVzZSB0aGUgYmFkCisgKiBzZWN0b3IgbG9nLCB0aGUgZm9ybWF0IHVzZWQgYnkgZnRhcGUgd2lsbCBsZXQgdGhlIHByb2dyYW0gdGhpbmsKKyAqIHRoZXJlIGFyZSBzb21lIGJhZCBzZWN0b3JzIGFuZCBubyBoYXJtIGlzIGRvbmUuCisgKiAgCisgKiBUaGUgZW9mIG1hcmsgZW50cmllcyB0aGF0IGZ0YXBlIHN0b3JlcyBpbiB0aGUgYmFkIHNlY3RvciBsb2c6IGV2ZW4KKyAqIDE2LWJpdCB3b3JkOiBzZWdtZW50IG51bWJlciBvZiBlb2YgbWFyayBvZGQgMTYtYml0IHdvcmQ6IHNlY3RvcgorICogbnVtYmVyIG9mIGVvZiBtYXJrIFsxLi4zMl0KKyAqICAKKyAqIFRoZSB6ZnRfZW9mX21hcCBhcyBtYWludGFpbmVkIGlzIGEgc29ydGVkIGxpc3Qgb2YgZW9mIG1hcmsgZW50cmllcy4KKyAqCisgKgorICogVGhlIHRhcGUgbmFtZSBmaWVsZCBpbiB0aGUgaGVhZGVyIHNlZ21lbnRzIGlzIHVzZWQgdG8gc3RvcmUgYSBsaW51eAorICogdGFwZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgYW5kIGEgdmVyc2lvbiBudW1iZXIuICBUaGlzIHdheSB0aGUgdGFwZQorICogY2FuIGJlIHJlY29nbml6ZWQgYXMgYSBMaW51eCByYXcgZm9ybWF0IHRhcGUgd2hlbiB1c2luZyB0b29scyB1bmRlcgorICogb3RoZXIgT1Mncy4KKyAqCisgKiAnV2lkZScgUUlDIHRhcGVzIChmb3JtYXQgY29kZSA0KSBkb24ndCBoYXZlIGEgZmFpbGVkIHNlY3RvciBsaXN0CisgKiBhbnltb3JlLiBUaGF0IHNwYWNlIGlzIHVzZWQgZm9yIHRoZSAobG9uZ2VyKSBiYWQgc2VjdG9yIG1hcCB0aGF0CisgKiBub3cgaXMgYSB2YXJpYWJsZSBsZW5ndGggbGlzdCB0b28uICBXZSBub3cgc3RvcmUgb3VyIGVuZC1vZi1maWxlCisgKiBtYXJrZXIgbGlzdCBhZnRlciB0aGUgYmFkLXNlY3Rvci1tYXAgb24gdGFwZS4gVGhlIGxpc3QgaXMgZGVsaW1pdGVkCisgKiBieSBhIChfX3UzMikgMCBlbnRyeS4KKyAqLworCitpbnQgemZ0X2Z0YXBlX3ZhbGlkYXRlX2xhYmVsKGNoYXIgKmxhYmVsKQoreworCXN0YXRpYyBjaGFyIHRtcF9sYWJlbFs0NV07CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfYW55KTsKKwkKKwltZW1jcHkodG1wX2xhYmVsLCBsYWJlbCwgRlRfTEFCRUxfU1opOworCXRtcF9sYWJlbFtGVF9MQUJFTF9TWl0gPSAnXDAnOworCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlICBsYWJlbCA9IGAlcyciLCB0bXBfbGFiZWwpOworCWZ0YXBlX2ZtdF92ZXJzaW9uID0gMDsKKwlpZiAobWVtY21wKGxhYmVsLCBsaW51eF90YXBlX2xhYmVsLCBzdHJsZW4obGludXhfdGFwZV9sYWJlbCkpID09IDApIHsKKwkJaW50IHBvcyA9IHN0cmxlbihsaW51eF90YXBlX2xhYmVsKTsKKwkJd2hpbGUgKGxhYmVsW3Bvc10gPj0gJzAnICYmIGxhYmVsW3Bvc10gPD0gJzknKSB7CisJCQlmdGFwZV9mbXRfdmVyc2lvbiAqPSAxMDsKKwkJCWZ0YXBlX2ZtdF92ZXJzaW9uID0gbGFiZWxbIHBvcysrXSAtICcwJzsKKwkJfQorCQlyZXN1bHQgPSAoZnRhcGVfZm10X3ZlcnNpb24gPj0gbWluX2ZtdF92ZXJzaW9uICYmCisJCQkgIGZ0YXBlX2ZtdF92ZXJzaW9uIDw9IG1heF9mbXRfdmVyc2lvbik7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJmb3JtYXQgdmVyc2lvbiA9ICVkIiwgZnRhcGVfZm10X3ZlcnNpb24pOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCitzdGF0aWMgX191OCAqIGZpbmRfZW5kX29mX2VvZl9saXN0KF9fdTggKiBwdHIsIF9fdTggKiBsaW1pdCkKK3sKKwl3aGlsZSAocHRyICsgMyA8IGxpbWl0KSB7CisKKwkJaWYgKGdldF91bmFsaWduZWQoKF9fdTMyKilwdHIpKSB7CisJCQlwdHIgKz0gc2l6ZW9mKF9fdTMyKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBwdHI7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgemZ0X2Z0YXBlX2V4dHJhY3RfZmlsZV9tYXJrcyhfX3U4KiBhZGRyZXNzKQoreworCWludCBpOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJemZ0X2VvZl9tYXAgPSBOVUxMOworCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKKwkJX191OCogZW5kOworCQlfX3U4KiBzdGFydCA9IGZ0YXBlX2ZpbmRfZW5kX29mX2JzbV9saXN0KGFkZHJlc3MpOworCisJCXpmdF9ucl9lb2ZfbWFya3MgPSAwOworCQlpZiAoc3RhcnQpIHsKKwkJCXN0YXJ0ICs9IDM7IC8qIHNraXAgZW5kIG9mIGxpc3QgbWFyayAqLworCQkJZW5kID0gZmluZF9lbmRfb2ZfZW9mX2xpc3Qoc3RhcnQsIAorCQkJCQkJICAgYWRkcmVzcyArIEZUX1NFR01FTlRfU0laRSk7CisJCQlpZiAoZW5kICYmIGVuZCAtIHN0YXJ0IDw9IEZUX0ZTTF9TSVpFKSB7CisJCQkJemZ0X25yX2VvZl9tYXJrcyA9ICgoZW5kIC0gc3RhcnQpIC8gCisJCQkJCQkgICAgc2l6ZW9mKGVvZl9tYXJrX3VuaW9uKSk7CisJCQkJemZ0X2VvZl9tYXAgPSAoZW9mX21hcmtfdW5pb24gKilzdGFydDsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UoZnRfdF9lcnIsCisJCQkJICAgICAgIkVPRiBNYXJrIExpc3QgaXMgdG9vIGxvbmcgb3IgZGFtYWdlZCEiKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVRSQUNFKGZ0X3RfZXJyLCAKKwkJCSAgICAgICJCYWQgU2VjdG9yIExpc3QgaXMgdG9vIGxvbmcgb3IgZGFtYWdlZCAhIik7CisJCX0KKwl9IGVsc2UgeworCQl6ZnRfZW9mX21hcCA9IChlb2ZfbWFya191bmlvbiAqKSZhZGRyZXNzW0ZUX0ZTTF07CisJCXpmdF9ucl9lb2ZfbWFya3MgPSBHRVQyKGFkZHJlc3MsIEZUX0ZTTF9DTlQpOworCX0KKwlUUkFDRShmdF90X25vaXNlLCAibnVtYmVyIG9mIGZpbGUgbWFya3M6ICVkIiwgemZ0X25yX2VvZl9tYXJrcyk7CisJaWYgKGZ0YXBlX2ZtdF92ZXJzaW9uID09IDEpIHsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAic3dhcHBpbmcgdmVyc2lvbiAxIGZpZWxkcyIpOworCQkvKiB2ZXJzaW9uIDEgZm9ybWF0IHVzZXMgc3dhcHBlZCBzZWN0b3IgYW5kIHNlZ21lbnQKKwkJICogZmllbGRzLCBjb3JyZWN0IHRoYXQgISAgCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgemZ0X25yX2VvZl9tYXJrczsgKytpKSB7CisJCQlfX3UxNiB0bXAgPSBHRVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLnNlZ21lbnQsMCk7CisJCQlQVVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLnNlZ21lbnQsIDAsIAorCQkJICAgICBHRVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLmRhdGUsMCkpOworCQkJUFVUMigmemZ0X2VvZl9tYXBbaV0ubWFyay5kYXRlLCAwLCB0bXApOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCB6ZnRfbnJfZW9mX21hcmtzOyArK2kpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgImVvZiBtYXJrOiAlNWQvJTJkIiwKKwkJCUdFVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuc2VnbWVudCwgMCksIAorCQkJR0VUMigmemZ0X2VvZl9tYXBbaV0ubWFyay5kYXRlLDApKTsKKwl9CisJVFJBQ0VfRVhJVDsKK30KKwordm9pZCB6ZnRfY2xlYXJfZnRhcGVfZmlsZV9tYXJrcyh2b2lkKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCS8qICBDbGVhciBmYWlsZWQgc2VjdG9yIGxvZzogcmVtb3ZlIGFsbCB0YXBlIG1hcmtzLiBXZQorCSAqICBkb24ndCB1c2Ugb2xkIGZ0YXBlLXN0eWxlIEVPRi1tYXJrcy4KKwkgKi8KKwlUUkFDRShmdF90X2luZm8sICJDbGVhcmluZyBvbGQgZnRhcGUncyBlb2YgbWFwIik7CisJbWVtc2V0KHpmdF9lb2ZfbWFwLCAwLCB6ZnRfbnJfZW9mX21hcmtzICogc2l6ZW9mKF9fdTMyKSk7CisJemZ0X25yX2VvZl9tYXJrcyA9IDA7CisJUFVUMih6ZnRfaHNlZ19idWYsIEZUX0ZTTF9DTlQsIDApOyAvKiBuciBvZiBlb2YtbWFya3MgKi8KKwl6ZnRfaGVhZGVyX2NoYW5nZWQgPSAxOworCXpmdF91cGRhdGVfbGFiZWwoemZ0X2hzZWdfYnVmKTsKKwlUUkFDRV9FWElUOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtZW9mLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU2OGMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtZW9mLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfWkZUQVBFX0VPRl9ICisjZGVmaW5lIF9aRlRBUEVfRU9GX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk1IEJhcyBMYWFyaG92ZW4uCisgKiBhZGFwdGFlZCBmb3IgemZ0YXBlIDE5OTYsIDE5OTcgYnkgQ2xhdXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjAzICQKKyAqCisgKiAgICAgIERlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBlbmQgb2YgZmlsZSBtYXJrZXJzCisgKiAgICAgIGZvciB0aGUgUUlDLTQwLzgwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLWhlYWRlci1zZWdtZW50Lmg+CisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgiCisvKiAgZmFpbGVkIHNlY3RvciBsb2cgc2l6ZSAob25seSB1c2VkIGlmIGZvcm1hdCBjb2RlICE9IDQpLgorICovCisKK3R5cGVkZWYgdW5pb24geworCWZ0X2ZzbF9lbnRyeSBtYXJrOworCV9fdTMyIGVudHJ5OworfSBlb2ZfbWFya191bmlvbjsKKyAKKy8qICAgICAgZnRhcGUtZW9mLmMgZGVmaW5lZCBnbG9iYWwgdmFycy4KKyAqLworZXh0ZXJuIGludCB6ZnRfbnJfZW9mX21hcmtzOworZXh0ZXJuIGVvZl9tYXJrX3VuaW9uICp6ZnRfZW9mX21hcDsKKworLyogICAgICBmdGFwZS1lb2YuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCisgKi8KK2V4dGVybiB2b2lkIHpmdF9mdGFwZV9leHRyYWN0X2ZpbGVfbWFya3MoX191OCogYWRkcmVzcyk7CitleHRlcm4gaW50ICB6ZnRfZnRhcGVfdmFsaWRhdGVfbGFiZWwoY2hhciogbGFiZWwpOworZXh0ZXJuIHZvaWQgemZ0X2NsZWFyX2Z0YXBlX2ZpbGVfbWFya3Modm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYWM3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdGhhdCByZWdpc3RlcnMgdGhlIHpmdGFwZSBmcm9udGVuZCAKKyAqICAgICAgdG8gdGhlIGZ0YXBlIGZsb3BweSB0YXBlIGRyaXZlciBmb3IgTGludXgKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2lmZGVmIENPTkZJR19LTU9ECisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1idWZmZXJzLmgiCisKK01PRFVMRV9BVVRIT1IoIihjKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZSAiCisJICAgICAgIihjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGUpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oWkZUQVBFX1ZFUlNJT04gIiAtICIKKwkJICAgIlZGUyBpbnRlcmZhY2UgZm9yIHRoZSBMaW51eCBmbG9wcHkgdGFwZSBkcml2ZXIuICIKKwkJICAgIlN1cHBvcnQgZm9yIFFJQy0xMTMgY29tcGF0aWJsZSB2b2x1bWUgdGFibGUgIgorCQkgICAiYW5kIGJ1aWx0aW4gY29tcHJlc3Npb24gKGx6cnczIGFsZ29yaXRobSkiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJjaGFyLW1ham9yLTI3Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qICAgICAgR2xvYmFsIHZhcnMuCisgKi8KK3N0cnVjdCB6ZnRfY21wcl9vcHMgKnpmdF9jbXByX29wcyA9IE5VTEw7Citjb25zdCBmdGFwZV9pbmZvICp6ZnRfc3RhdHVzOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1c3lfZmxhZzsKKworc3RhdGljIHNpZ3NldF90IG9yaWdfc2lnbWFzazsKKworLyogIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGtlcm5lbCB2ZnMgbGF5ZXIKKyAqLworCisvKiBOb3RlIGFib3V0IGxsc2VlaygpOgorICoKKyAqIHN0LmMgYW5kIHRwcWljLmMgdXBkYXRlIGZwLT5mX3BvcyBidXQgZG9uJ3QgaW1wbG1lbnQgbGxzZWVrKCkgYW5kCisgKiBpbml0aWFsaXplIHRoZSBsbHNlZWsgY29tcG9uZW50IG9mIHRoZSBmaWxlX29wcyBzdHJ1Y3Qgd2l0aCBOVUxMLgorICogVGhpcyBtZWFucyB0aGF0IHRoZSB1c2VyIHdpbGwgZ2V0IHRoZSBkZWZhdWx0IHNlZWssIGJ1dCB0aGUgdGFwZQorICogZGV2aWNlIHdpbGwgbm90IHJlc3BlY3QgdGhlIG5ldyBwb3NpdGlvbiwgYnV0IGhhcHBpbHkgcmVhZCBmcm9tIHRoZQorICogb2xkIHBvc2l0aW9uLiBUaGluayBhIHpmdGFwZSBzcGVjaWZpYyBsbHNlZWsoKSBmdW5jdGlvbiB3b3VsZCBiZQorICogYmV0dGVyLCByZXR1cm5pbmcgLUVTUElQRS4gVE9ETy4KKyAqLworCitzdGF0aWMgaW50ICB6ZnRfb3BlbiAoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlcCk7CitzdGF0aWMgaW50IHpmdF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKTsKK3N0YXRpYyBpbnQgIHpmdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCAgemZ0X21tYXAoc3RydWN0IGZpbGUgKmZpbGVwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitzdGF0aWMgc3NpemVfdCB6ZnRfcmVhZCAoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmZiwKKwkJCSBzaXplX3QgcmVxX2xlbiwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IHpmdF93cml0ZShzdHJ1Y3QgZmlsZSAqZnAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmLAorCQkJIHNpemVfdCByZXFfbGVuLCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6ZnRfY2RldiA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IHpmdF9yZWFkLAorCS53cml0ZQkJPSB6ZnRfd3JpdGUsCisJLmlvY3RsCQk9IHpmdF9pb2N0bCwKKwkubW1hcAkJPSB6ZnRfbW1hcCwKKwkub3BlbgkJPSB6ZnRfb3BlbiwKKwkucmVsZWFzZQk9IHpmdF9jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICp6ZnRfY2xhc3M7CisKKy8qICAgICAgT3BlbiBmbG9wcHkgdGFwZSBkZXZpY2UKKyAqLworc3RhdGljIGludCB6ZnRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlub25zZWVrYWJsZV9vcGVuKGlubywgZmlsZXApOworCVRSQUNFKGZ0X3RfZmxvdywgImNhbGxlZCBmb3IgbWlub3IgJWQiLCBpbWlub3IoaW5vKSk7CisJaWYgKCB0ZXN0X2FuZF9zZXRfYml0KDAsJmJ1c3lfZmxhZykgKSB7CisJCVRSQUNFX0FCT1JUKC1FQlVTWSwgZnRfdF93YXJuLCAiZmFpbGVkOiBhbHJlYWR5IGJ1c3kiKTsKKwl9CisJaWYgKChpbWlub3IoaW5vKSAmIH4oWkZUX01JTk9SX09QX01BU0sgfCBGVEFQRV9OT19SRVdJTkQpKQorCSAgICAgPiAKKwkgICAgRlRBUEVfU0VMX0QpIHsKKwkJY2xlYXJfYml0KDAsJmJ1c3lfZmxhZyk7CisJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9lcnIsICJmYWlsZWQ6IGludmFsaWQgdW5pdCBuciIpOworCX0KKwlvcmlnX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCXJlc3VsdCA9IF96ZnRfb3BlbihpbWlub3IoaW5vKSwgZmlsZXAtPmZfZmxhZ3MgJiBPX0FDQ01PREUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWN1cnJlbnQtPmJsb2NrZWQgPSBvcmlnX3NpZ21hc2s7IC8qIHJlc3RvcmUgbWFzayAqLworCQljbGVhcl9iaXQoMCwmYnVzeV9mbGFnKTsKKwkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X2VyciwgIl9mdGFwZV9vcGVuIGZhaWxlZCIpOworCX0gZWxzZSB7CisJCS8qIE1hc2sgc2lnbmFscyB0aGF0IHdpbGwgZGlzdHVyYiBwcm9wZXIgb3BlcmF0aW9uIG9mIHRoZQorCQkgKiBwcm9ncmFtIHRoYXQgaXMgY2FsbGluZy4KKwkJICovCisJCWN1cnJlbnQtPmJsb2NrZWQgPSBvcmlnX3NpZ21hc2s7CisJCXNpZ2FkZHNldG1hc2sgKCZjdXJyZW50LT5ibG9ja2VkLCBfRE9fQkxPQ0spOworCQlUUkFDRV9FWElUIDA7CisJfQorfQorCisvKiAgICAgIENsb3NlIGZsb3BweSB0YXBlIGRldmljZQorICovCitzdGF0aWMgaW50IHpmdF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCWludCByZXN1bHQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoICF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpIHx8IGltaW5vcihpbm8pICE9IHpmdF91bml0KSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiZmFpbGVkOiBub3QgYnVzeSBvciB3cm9uZyB1bml0Iik7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVzdWx0ID0gX3pmdF9jbG9zZSgpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVRSQUNFKGZ0X3RfZXJyLCAiX3pmdF9jbG9zZSBmYWlsZWQiKTsKKwl9CisJY3VycmVudC0+YmxvY2tlZCA9IG9yaWdfc2lnbWFzazsgLyogcmVzdG9yZSBiZWZvcmUgb3BlbiBzdGF0ZSAqLworCWNsZWFyX2JpdCgwLCZidXN5X2ZsYWcpOworCVRSQUNFX0VYSVQgMDsKK30KKworLyogICAgICBJb2N0bCBmb3IgZmxvcHB5IHRhcGUgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgemZ0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCSAgICAgdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXN1bHQgPSAtRUlPOworCXNpZ3NldF90IG9sZF9zaWdtYXNrOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKCAhdGVzdF9iaXQoMCwmYnVzeV9mbGFnKSB8fCBpbWlub3IoaW5vKSAhPSB6ZnRfdW5pdCB8fCBmdF9mYWlsdXJlKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJmYWlsZWQ6IG5vdCBidXN5LCBmYWlsdXJlIG9yIHdyb25nIHVuaXQiKTsKKwl9CisJb2xkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOyAvKiBzYXZlIG1hc2sgKi8KKwlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKKwkvKiBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIHNpemVvZih2b2lkICopID09IHNpemVvZihsb25nKSAqLworCXJlc3VsdCA9IF96ZnRfaW9jdGwoY29tbWFuZCwgKHZvaWQgX191c2VyICopIGFyZyk7CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOyAvKiByZXN0b3JlIG1hc2sgKi8KKwlUUkFDRV9FWElUIHJlc3VsdDsKK30KKworLyogICAgICBJb2N0bCBmb3IgZmxvcHB5IHRhcGUgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgIHpmdF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IHJlc3VsdCA9IC1FSU87CisJc2lnc2V0X3Qgb2xkX3NpZ21hc2s7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoICF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpIHx8IAorCSAgICBpbWlub3IoZmlsZXAtPmZfZGVudHJ5LT5kX2lub2RlKSAhPSB6ZnRfdW5pdCB8fCAKKwkgICAgZnRfZmFpbHVyZSkKKwl7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJmYWlsZWQ6IG5vdCBidXN5LCBmYWlsdXJlIG9yIHdyb25nIHVuaXQiKTsKKwl9CisJb2xkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOyAvKiBzYXZlIG1hc2sgKi8KKwlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKKwlpZiAoKHJlc3VsdCA9IGZ0YXBlX21tYXAodm1hKSkgPj0gMCkgeworI2lmbmRlZiBNU1lOQ19CVUdfV0FTX0ZJWEVECisJCXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZHVtbXkgPSB7IE5VTEwsIH07CisJCXZtYS0+dm1fb3BzID0gJmR1bW15OworI2VuZGlmCisJfQorCWN1cnJlbnQtPmJsb2NrZWQgPSBvbGRfc2lnbWFzazsgLyogcmVzdG9yZSBtYXNrICovCisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qICAgICAgUmVhZCBmcm9tIGZsb3BweSB0YXBlIGRldmljZQorICovCitzdGF0aWMgc3NpemVfdCB6ZnRfcmVhZChzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICpidWZmLAorCQkJc2l6ZV90IHJlcV9sZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKwlzaWdzZXRfdCBvbGRfc2lnbWFzazsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiY2FsbGVkIHdpdGggY291bnQ6ICVsZCIsICh1bnNpZ25lZCBsb25nKXJlcV9sZW4pOworCWlmICghdGVzdF9iaXQoMCwmYnVzeV9mbGFnKSAgfHwgaW1pbm9yKGlubykgIT0gemZ0X3VuaXQgfHwgZnRfZmFpbHVyZSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKKwkJCSAgICAiZmFpbGVkOiBub3QgYnVzeSwgZmFpbHVyZSBvciB3cm9uZyB1bml0Iik7CisJfQorCW9sZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsgLyogc2F2ZSBtYXNrICovCisJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVzdWx0ID0gX3pmdF9yZWFkKGJ1ZmYsIHJlcV9sZW4pOworCWN1cnJlbnQtPmJsb2NrZWQgPSBvbGRfc2lnbWFzazsgLyogcmVzdG9yZSBtYXNrICovCisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJyZXR1cm4gd2l0aCBjb3VudDogJWQiLCByZXN1bHQpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiAgICAgIFdyaXRlIHRvIHRhcGUgZGV2aWNlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHpmdF93cml0ZShzdHJ1Y3QgZmlsZSAqZnAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmLAorCQkJIHNpemVfdCByZXFfbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJlc3VsdCA9IC1FSU87CisJc2lnc2V0X3Qgb2xkX3NpZ21hc2s7CisJc3RydWN0IGlub2RlICppbm8gPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X2Zsb3csICJjYWxsZWQgd2l0aCBjb3VudDogJWxkIiwgKHVuc2lnbmVkIGxvbmcpcmVxX2xlbik7CisJaWYgKCF0ZXN0X2JpdCgwLCZidXN5X2ZsYWcpIHx8IGltaW5vcihpbm8pICE9IHpmdF91bml0IHx8IGZ0X2ZhaWx1cmUpIHsKKwkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCisJCQkgICAgImZhaWxlZDogbm90IGJ1c3ksIGZhaWx1cmUgb3Igd3JvbmcgdW5pdCIpOworCX0KKwlvbGRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7IC8qIHNhdmUgbWFzayAqLworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCXJlc3VsdCA9IF96ZnRfd3JpdGUoYnVmZiwgcmVxX2xlbik7CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZF9zaWdtYXNrOyAvKiByZXN0b3JlIG1hc2sgKi8KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInJldHVybiB3aXRoIGNvdW50OiAlZCIsIHJlc3VsdCk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKy8qICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVkZTIElOVEVSRkFDRSAKKyAqICAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgZHJpdmVyL21vZHVsZSBpbml0aWFsaXphdGlvbgorICovCisKKy8qICB0aGUgY29tcHJlc3Npb24gbW9kdWxlIGhhcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gaG9vayBpbnRvIHRoZSB6ZnRhcGUgCisgKiAgY29kZQorICovCitpbnQgemZ0X2NtcHJfcmVnaXN0ZXIoc3RydWN0IHpmdF9jbXByX29wcyAqbmV3X29wcykKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoemZ0X2NtcHJfb3BzICE9IE5VTEwpIHsKKwkJVFJBQ0VfRVhJVCAtRUJVU1k7CisJfSBlbHNlIHsKKwkJemZ0X2NtcHJfb3BzID0gbmV3X29wczsKKwkJVFJBQ0VfRVhJVCAwOworCX0KK30KKworLyogIGxvY2sgdGhlIHpmdC1jb21wcmVzc29yKCkgbW9kdWxlLgorICovCitpbnQgemZ0X2NtcHJfbG9jayhpbnQgdHJ5X3RvX2xvYWQpCit7CisJaWYgKHpmdF9jbXByX29wcyA9PSBOVUxMKSB7CisjaWZkZWYgQ09ORklHX0tNT0QKKwkJaWYgKHRyeV90b19sb2FkKSB7CisJCQlyZXF1ZXN0X21vZHVsZSgiemZ0LWNvbXByZXNzb3IiKTsKKwkJCWlmICh6ZnRfY21wcl9vcHMgPT0gTlVMTCkgeworCQkJCXJldHVybiAtRU5PU1lTOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FTk9TWVM7CisJCX0KKyNlbHNlCisJCXJldHVybiAtRU5PU1lTOworI2VuZGlmCisJfQorCSgqemZ0X2NtcHJfb3BzLT5sb2NrKSgpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1pGVF9DT01QUkVTU09SCitleHRlcm4gaW50IHpmdF9jb21wcmVzc29yX2luaXQodm9pZCk7CisjZW5kaWYKKworLyogIENhbGxlZCBieSBtb2R1bGVzIHBhY2thZ2Ugd2hlbiBpbnN0YWxsaW5nIHRoZSBkcml2ZXIgb3IgYnkga2VybmVsCisgKiAgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZQorICovCitpbnQgX19pbml0IHpmdF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsoS0VSTl9JTkZPIFpGVEFQRV9WRVJTSU9OICJcbiIpOworICAgICAgICBpZiAoVFJBQ0VfTEVWRUwgPj0gZnRfdF9pbmZvKSB7CisJCXByaW50aygKK0tFUk5fSU5GTworIihjKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZSAoY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlKVxuIgorS0VSTl9JTkZPCisidmZzIGludGVyZmFjZSBmb3IgZnRhcGUgZmxvcHB5IHRhcGUgZHJpdmVyLlxuIgorS0VSTl9JTkZPCisiU3VwcG9ydCBmb3IgUUlDLTExMyBjb21wYXRpYmxlIHZvbHVtZSB0YWJsZSwgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvblxuIgorS0VSTl9JTkZPCisiYW5kIGJ1aWx0aW4gY29tcHJlc3Npb24gKGx6cnczIGFsZ29yaXRobSkuXG4iKTsKKyAgICAgICAgfQorI2Vsc2UgLyogIU1PRFVMRSAqLworCS8qIHByaW50IGEgc2hvcnQgbm8tbm9uc2Vuc2UgYm9vdCBtZXNzYWdlICovCisJcHJpbnRrKEtFUk5fSU5GTyBaRlRBUEVfVkVSU0lPTiAiXG4iKTsKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwlUUkFDRShmdF90X2luZm8sICJ6ZnRfaW5pdCBAIDB4JXAiLCB6ZnRfaW5pdCk7CisJVFJBQ0UoZnRfdF9pbmZvLAorCSAgICAgICJpbnN0YWxsaW5nIHpmdGFwZSBWRlMgaW50ZXJmYWNlIGZvciBmdGFwZSBkcml2ZXIgLi4uIik7CisJVFJBQ0VfQ0FUQ0gocmVnaXN0ZXJfY2hyZGV2KFFJQzExN19UQVBFX01BSk9SLCAiemZ0IiwgJnpmdF9jZGV2KSwpOworCisJemZ0X2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInpmdCIpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSksIE5VTEwsICJxZnQlaSIsIGkpOworCQlkZXZmc19ta19jZGV2KE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpKSwKKwkJCQlTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkJInFmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHpmdF9jbGFzcywgTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyA0KSwgTlVMTCwgIm5xZnQlaSIsIGkpOworCQlkZXZmc19ta19jZGV2KE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgNCksCisJCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCSJucWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDE2KSwgTlVMTCwgInpxZnQlaSIsIGkpOworCQlkZXZmc19ta19jZGV2KE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMTYpLAorCQkJCVNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkienFmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHpmdF9jbGFzcywgTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAyMCksIE5VTEwsICJuenFmdCVpIiwgaSk7CisJCWRldmZzX21rX2NkZXYoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAyMCksCisJCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCSJuenFmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHpmdF9jbGFzcywgTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAzMiksIE5VTEwsICJyYXdxZnQlaSIsIGkpOworCQlkZXZmc19ta19jZGV2KE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMzIpLAorCQkJCVNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkicmF3cWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDM2KSwgTlVMTCwgIm5yYXdyYXdxZnQlaSIsIGkpOworCQlkZXZmc19ta19jZGV2KE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMzYpLAorCQkJCVNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkibnJhd3FmdCVpIiwgaSk7CisJfQorCisjaWZkZWYgQ09ORklHX1pGVF9DT01QUkVTU09SCisJKHZvaWQpemZ0X2NvbXByZXNzb3JfaW5pdCgpOworI2VuZGlmCisJemZ0X3N0YXR1cyA9IGZ0YXBlX2dldF9zdGF0dXMoKTsgLyogIGZldGNoIGdsb2JhbCBkYXRhIG9mIGZ0YXBlIAorCQkJCQkgICogIGhhcmR3YXJlIGRyaXZlciAKKwkJCQkJICAqLworCVRSQUNFX0VYSVQgMDsKK30KKworCisvKiBDYWxsZWQgYnkgbW9kdWxlcyBwYWNrYWdlIHdoZW4gcmVtb3ZpbmcgdGhlIGRyaXZlciAKKyAqLworc3RhdGljIHZvaWQgemZ0X2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICh1bnJlZ2lzdGVyX2NocmRldihRSUMxMTdfVEFQRV9NQUpPUiwgInpmdCIpICE9IDApIHsKKwkJVFJBQ0UoZnRfdF93YXJuLCAiZmFpbGVkIik7CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAic3VjY2Vzc2Z1bCIpOworCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlkZXZmc19yZW1vdmUoInFmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpKSk7CisJCWRldmZzX3JlbW92ZSgibnFmdCVpIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgNCkpOworCQlkZXZmc19yZW1vdmUoInpxZnQlaSIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDE2KSk7CisJCWRldmZzX3JlbW92ZSgibnpxZnQlaSIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDIwKSk7CisJCWRldmZzX3JlbW92ZSgicmF3cWZ0JWkiLCBpKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAzMikpOworCQlkZXZmc19yZW1vdmUoIm5yYXdxZnQlaSIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDM2KSk7CisJfQorCWNsYXNzX3NpbXBsZV9kZXN0cm95KHpmdF9jbGFzcyk7CisJemZ0X3VuaW5pdF9tZW0oKTsgLyogcmVsZWFzZSByZW1haW5pbmcgbWVtb3J5LCBpZiBhbnkgKi8KKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiemZ0YXBlIHN1Y2Nlc3NmdWxseSB1bmxvYWRlZC5cbiIpOworCVRSQUNFX0VYSVQ7Cit9CisKK21vZHVsZV9pbml0KHpmdF9pbml0KTsKK21vZHVsZV9leGl0KHpmdF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzdlNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5oCkBAIC0wLDAgKzEsNzcgQEAKKyNpZm5kZWYgX1pGVEFQRV9JTklUX0gKKyNkZWZpbmUgX1pGVEFQRV9JTklUX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cyBIZWluZS4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOTowNSAkCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGFuZCBtYWNybyBmb3IgdGhlIHZmcyAKKyAqIGludGVyZmFjZSBkZWZpbmVkIGJ5IHpmdGFwZQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaD4KKworI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1ic20uaCIKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJ1ZmZlci5oIgorI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWZvcm1hdC5oIgorCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIGZ0YXBlX3N0YXR1cyAoKnpmdF9zdGF0dXMpCisjZW5kaWYKKworZXh0ZXJuIGNvbnN0ICBmdGFwZV9pbmZvICp6ZnRfc3RhdHVzOyAvKiBuZWVkZWQgZm9yIHpmdGFwZS12dGJsLmggKi8KKworI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorCitzdHJ1Y3QgemZ0X2NtcHJfb3BzIHsKKwlpbnQgKCp3cml0ZSkoaW50ICp3cml0ZV9jbnQsCisJCSAgICAgX191OCAqZHN0X2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKKwkJICAgICBjb25zdCBfX3U4IF9fdXNlciAqc3JjX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sIAorCQkgICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKTsKKwlpbnQgKCpyZWFkKShpbnQgKnJlYWRfY250LAorCQkgICAgX191OCBfX3VzZXIgKmRzdF9idWYsIGNvbnN0IGludCByZXFfbGVuLAorCQkgICAgY29uc3QgX191OCAqc3JjX2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKKwkJICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKTsKKwlpbnQgKCpzZWVrKSh1bnNpZ25lZCBpbnQgbmV3X2Jsb2NrX3BvcywKKwkJICAgIHpmdF9wb3NpdGlvbiAqcG9zLCBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lLAorCQkgICAgX191OCAqYnVmZmVyKTsKKwl2b2lkICgqbG9jaykgICAodm9pZCk7CisJdm9pZCAoKnJlc2V0KSAgKHZvaWQpOworCXZvaWQgKCpjbGVhbnVwKSh2b2lkKTsKK307CisKK2V4dGVybiBzdHJ1Y3QgemZ0X2NtcHJfb3BzICp6ZnRfY21wcl9vcHM7CisvKiB6ZnRhcGUtaW5pdC5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgIHpmdF9jbXByX3JlZ2lzdGVyKHN0cnVjdCB6ZnRfY21wcl9vcHMgKm5ld19vcHMpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgIHpmdF9jbXByX2xvY2soaW50IHRyeV90b19sb2FkKTsKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcmVhZC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNGJmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOTowNiAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGhpZ2ggbGV2ZWwgcmVhZGluZyBjb2RlCisgKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKKworLyogICAgICBHbG9iYWwgdmFycy4KKyAqLworaW50IHpmdF9qdXN0X2JlZm9yZV9lb2Y7CisKKy8qICAgICAgTG9jYWwgdmFycy4KKyAqLworc3RhdGljIGludCBidWZfbGVuX3JkOworCit2b2lkIHpmdF96YXBfcmVhZF9idWZmZXJzKHZvaWQpCit7CisJYnVmX2xlbl9yZCA9IDA7Cit9CisKK2ludCB6ZnRfcmVhZF9oZWFkZXJfc2VnbWVudHModm9pZCkgICAgICAKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXpmdF9oZWFkZXJfcmVhZCA9IDA7CisJVFJBQ0VfQ0FUQ0goemZ0X3ZtYWxsb2Nfb25jZSgmemZ0X2hzZWdfYnVmLCBGVF9TRUdNRU5UX1NJWkUpLCk7CisJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZF9oZWFkZXJfc2VnbWVudCh6ZnRfaHNlZ19idWYpLCk7CisJVFJBQ0UoZnRfdF9pbmZvLCAiU2VnbWVudHMgd3JpdHRlbiBzaW5jZSBmaXJzdCBmb3JtYXQ6ICVkIiwKKwkgICAgICAoaW50KUdFVDQoemZ0X2hzZWdfYnVmLCBGVF9TRUdfQ05UKSk7CisJemZ0X3FpYzExMyA9IChmdF9mb3JtYXRfY29kZSAhPSBmbXRfbm9ybWFsICYmCisJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF8xMTAwZnQgJiYKKwkJICAgICAgZnRfZm9ybWF0X2NvZGUgIT0gZm10XzQyNWZ0KTsKKwlUUkFDRShmdF90X2luZm8sICJmdF9maXJzdF9kYXRhX3NlZ21lbnQ6ICVkLCBmdF9sYXN0X2RhdGFfc2VnbWVudDogJWQiLCAKKwkgICAgICBmdF9maXJzdF9kYXRhX3NlZ21lbnQsIGZ0X2xhc3RfZGF0YV9zZWdtZW50KTsKKwl6ZnRfY2FwYWNpdHkgPSB6ZnRfZ2V0X2NhcGFjaXR5KCk7CisJemZ0X29sZF9mdGFwZSA9IHpmdF9mdGFwZV92YWxpZGF0ZV9sYWJlbCgmemZ0X2hzZWdfYnVmW0ZUX0xBQkVMXSk7CisJaWYgKHpmdF9vbGRfZnRhcGUpIHsKKwkJVFJBQ0UoZnRfdF9pbmZvLCAKKyJGb3VuZCBvbGQgZnRhcGVkIHRhcGUsIGVtdWxhdGluZyBlb2YgbWFya3MsIGVudGVyaW5nIHJlYWQtb25seSBtb2RlIik7CisJCXpmdF9mdGFwZV9leHRyYWN0X2ZpbGVfbWFya3MoemZ0X2hzZWdfYnVmKTsKKwkJVFJBQ0VfQ0FUQ0goemZ0X2Zha2Vfdm9sdW1lX2hlYWRlcnMoemZ0X2VvZl9tYXAsIAorCQkJCQkJICAgIHpmdF9ucl9lb2ZfbWFya3MpLCk7CisJfSBlbHNlIHsKKwkJLyogdGhlIHNwZWNzIHNheSB0aGF0IHRoZSB2b2x1bWUgdGFibGUgbXVzdCBiZQorCQkgKiBpbml0aWFsaXplZCB3aXRoIHplcm9lcyBkdXJpbmcgZm9ybWF0dGluZywgc28gaXQKKwkJICogTVVTVCBiZSByZWFkYWJsZSwgaS5lLiBjb250YWluIHZhaWQgRUNDCisJCSAqIGluZm9ybWF0aW9uLiAgCisJCSAqLworCQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkX3NlZ21lbnQoZnRfZmlyc3RfZGF0YV9zZWdtZW50LCAKKwkJCQkJICAgICAgIHpmdF9kZWJsb2NrX2J1ZiwgCisJCQkJCSAgICAgICBGVF9SRF9TSU5HTEUpLCk7CisJCVRSQUNFX0NBVENIKHpmdF9leHRyYWN0X3ZvbHVtZV9oZWFkZXJzKHpmdF9kZWJsb2NrX2J1ZiksKTsKKwl9CisJemZ0X2hlYWRlcl9yZWFkID0gMTsKKwl6ZnRfc2V0X2ZsYWdzKHpmdF91bml0KTsKKwl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOworCVRSQUNFX0VYSVQgMDsKK30KKworaW50IHpmdF9mZXRjaF9zZWdtZW50X2ZyYWN0aW9uKGNvbnN0IHVuc2lnbmVkIGludCBzZWdtZW50LCB2b2lkICpidWZmZXIsCisJCQkgICAgICAgY29uc3QgZnRfcmVhZF9tb2RlX3QgcmVhZF9tb2RlLAorCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzdGFydCwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpbnQgc2VnX3N6OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHNlZ21lbnQgPT0gemZ0X2RlYmxvY2tfc2VnbWVudCkgeworCQlUUkFDRShmdF90X2RhdGFfZmxvdywKKwkJICAgICAgInJlLXVzaW5nIHNlZ21lbnQgJWQgYWxyZWFkeSBpbiBkZWJsb2NrIGJ1ZmZlciIsCisJCSAgICAgIHNlZ21lbnQpOworCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeihzZWdtZW50KTsKKwkJaWYgKHN0YXJ0ID4gc2VnX3N6KSB7CisJCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2J1ZywKKwkJCQkgICAgInRyeWluZyB0byByZWFkIGJleW9uZCBlbmQgb2Ygc2VnbWVudDpcbiIKKwkJCQkgICAgS0VSTl9JTkZPICJzZWdfc3ogOiAlZFxuIgorCQkJCSAgICBLRVJOX0lORk8gInN0YXJ0ICA6ICVkXG4iCisJCQkJICAgIEtFUk5fSU5GTyAic2VnbWVudDogJWQiLAorCQkJCSAgICBzZWdfc3osIHN0YXJ0LCBzZWdtZW50KTsKKwkJfQorCQlpZiAoKHN0YXJ0ICsgc2l6ZSkgPiBzZWdfc3opIHsKKwkJCVRSQUNFX0VYSVQgc2VnX3N6IC0gc3RhcnQ7CisJCX0KKwkJVFJBQ0VfRVhJVCBzaXplOworCX0KKwlzZWdfc3ogPSBmdGFwZV9yZWFkX3NlZ21lbnRfZnJhY3Rpb24oc2VnbWVudCwgYnVmZmVyLCByZWFkX21vZGUsCisJCQkJCSAgICAgc3RhcnQsIHNpemUpOworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAic2VnbWVudCAlZCwgcmVzdWx0ICVkIiwgc2VnbWVudCwgc2VnX3N6KTsKKwlpZiAoKGludClzZWdfc3ogPj0gMCAmJiBzdGFydCA9PSAwICYmIHNpemUgPT0gRlRfU0VHTUVOVF9TSVpFKSB7CisJCS8qICB0aGlzIGltcGxpY2l0bHkgYXNzdW1lcyB0aGF0IHdlIGFyZSBhbHdheXMgY2FsbGVkIHdpdGgKKwkJICogIGJ1ZmZlciA9PSB6ZnRfZGVibG9ja19idWYgCisJCSAqLworCQl6ZnRfZGVibG9ja19zZWdtZW50ID0gc2VnbWVudDsKKwl9IGVsc2UgeworCQl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7CisJfQorCVRSQUNFX0VYSVQgc2VnX3N6OworfQorCisvKgorICogb3V0OgorICoKKyAqIGludCAqcmVhZF9jbnQ6IHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgcmVtb3ZlZCBmcm9tIHRoZQorICogICAgICAgICAgICAgICAgemZ0X2RlYmxvY2tfYnVmIChyZXN1bHQpCisgKgorICogaW50ICp0b19kbyAgIDogdGhlIHJlbWFpbmluZyBzaXplIG9mIHRoZSByZWFkLXJlcXVlc3QuIElzIGNoYW5nZWQuCisgKgorICogaW46CisgKgorICogY2hhciAqYnVmZiAgICAgIDogYnVmZiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgdXNlcgorICogICAgICAgICAgICAgICAgICAgYnVmZmVyLCB0aGF0IGhhc24ndCBiZWVuIGZpbGxlZCB3aXRoIGRhdGEgeWV0LgorICogaW50IGJ1Zl9wb3NfcmVhZDogY29weSBvZiBidWZfcG9zX3JkCisgKiBpbnQgYnVmX2xlbl9yZWFkOiBjb3B5IG9mIGJ1Zl9sZW5fcmQKKyAqIGNoYXIgKnpmdF9kZWJsb2NrX2J1ZjogZnRhcGVfemZ0X2RlYmxvY2tfYnVmCisgKgorICogcmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgY29waWVkIHRvIHRoZSB1c2VyLWJ1ZmZlcgorICoKKyAqIHRvX2RvIE1VU1QgTk9UIFNIUklOSyBleGNlcHQgdG8gaW5kaWNhdGUgYW4gRU9ULiBJbiB0aGlzIGNhc2UgdG9fZG8KKyAqIGhhcyB0byBiZSBzZXQgdG8gMC4gV2UgY2Fubm90IHJldHVybiAtRU5PU1BDLCBiZWNhdXNlIHdlIHJldHVybiB0aGUKKyAqIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5ICogY29waWVkIHRvIHRoZSB1c2VyLWJ1ZmZlcgorICovCitzdGF0aWMgaW50IHpmdF9zaW1wbGVfcmVhZCAoaW50ICpyZWFkX2NudCwgCisJCQkgICAgX191OCAgX191c2VyICpkc3RfYnVmLCAKKwkJCSAgICBjb25zdCBpbnQgdG9fZG8sIAorCQkJICAgIGNvbnN0IF9fdTggKnNyY19idWYsIAorCQkJICAgIGNvbnN0IGludCBzZWdfc3osIAorCQkJICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLAorCQkJICAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoc2VnX3N6IC0gcG9zLT5zZWdfYnl0ZV9wb3MgPCB0b19kbykgeworCQkqcmVhZF9jbnQgPSBzZWdfc3ogLSBwb3MtPnNlZ19ieXRlX3BvczsKKwl9IGVsc2UgeworCQkqcmVhZF9jbnQgPSB0b19kbzsKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihkc3RfYnVmLCAKKwkJCSBzcmNfYnVmICsgcG9zLT5zZWdfYnl0ZV9wb3MsICpyZWFkX2NudCkgIT0gMCkgeworCQlUUkFDRV9FWElUIC1FRkFVTFQ7CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsICJuciBieXRlcyBqdXN0IHJlYWQ6ICVkIiwgKnJlYWRfY250KTsKKwlUUkFDRV9FWElUICpyZWFkX2NudDsKK30KKworLyogcmVxX2xlbjogZ2V0cyBjbGlwcGVkIGR1ZSB0byBFT1Qgb2YgRU9GLgorICogcmVxX2NsaXBwZWQ6IGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgcmVxX2xlbiB3YXMgY2xpcHBlZCBvciBub3QKKyAqIHZvbHVtZTogY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3VycmVudCB2b2x1bWUgKGJsa19zeiBldGMuKQorICovCitzdGF0aWMgaW50IGNoZWNrX3JlYWRfYWNjZXNzKGludCAqcmVxX2xlbiwgCisJCQkgICAgIGNvbnN0IHpmdF92b2xpbmZvICoqdm9sdW1lLAorCQkJICAgICBpbnQgKnJlcV9jbGlwcGVkLCAKKwkJCSAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpCit7CisJc3RhdGljIF9fczY0IHJlbWFpbmluZzsKKwlzdGF0aWMgaW50IGVvZDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoemZ0X2lvX3N0YXRlICE9IHpmdF9yZWFkaW5nKSB7CisJCWlmICh6ZnRfb2ZmbGluZSkgeyAvKiBvZmZsaW5lIGluY2x1ZGVzIG5vX3RhcGUgKi8KKwkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF93YXJuLAorCQkJCSAgICAidGFwZSBpcyBvZmZsaW5lIG9yIG5vIGNhcnRyaWRnZSIpOworCQl9CisJCWlmICghZnRfZm9ybWF0dGVkKSB7CisJCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLAorCQkJCSAgICBmdF90X3dhcm4sICJ0YXBlIGlzIG5vdCBmb3JtYXR0ZWQiKTsKKwkJfQorCQkvKiAgbm93IGVudGVyIGRlZmluZWQgc3RhdGUsIHJlYWQgaGVhZGVyIHNlZ21lbnQgaWYgbm90CisJCSAqICBhbHJlYWR5IGRvbmUgYW5kIGZsdXNoIHdyaXRlIGJ1ZmZlcnMKKwkJICovCisJCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7CisJCXpmdF9pb19zdGF0ZSA9IHpmdF9yZWFkaW5nOworCQlpZiAoemZ0X3RhcGVfYXRfZW9kKHBvcykpIHsKKwkJCWVvZCA9IDE7CisJCQlUUkFDRV9FWElUIDE7CisJCX0KKwkJZW9kID0gMDsKKwkJKnZvbHVtZSA9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOworCQkvKiBnZXQgdGhlIHNwYWNlIGxlZnQgdW50aWwgRU9GICovCisJCXJlbWFpbmluZyA9IHpmdF9jaGVja19mb3JfZW9mKCp2b2x1bWUsIHBvcyk7CisJCWJ1Zl9sZW5fcmQgPSAwOworCQlUUkFDRShmdF90X25vaXNlLCAicmVtYWluaW5nOiAiIExMX1ggIiwgdm9sX25vOiAlZCIsCisJCSAgICAgIExMKHJlbWFpbmluZyksICgqdm9sdW1lKS0+Y291bnQpOworCX0gZWxzZSBpZiAoemZ0X3RhcGVfYXRfZW9kKHBvcykpIHsKKwkJaWYgKCsrZW9kID4gMikgeworCQkJVFJBQ0VfRVhJVCAtRUlPOyAvKiBzdC5jIGFsc28gcmV0dXJucyAtRUlPICovCisJCX0gZWxzZSB7CisJCQlUUkFDRV9FWElUIDE7CisJCX0KKwl9CisJaWYgKCgqcmVxX2xlbiAlICgqdm9sdW1lKS0+YmxrX3N6KSAhPSAwKSB7CisJCS8qICB0aGlzIG1lc3NhZ2UgaXMgaW5mb3JtYXRpb25hbCBvbmx5LiBUaGUgdXNlciBnZXRzIHRoZQorCQkgKiAgcHJvcGVyIHJldHVybiB2YWx1ZQorCQkgKi8KKwkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLAorCQkJICAgICJyZXFfbGVuICVkIG5vdCBhIG11bHRpcGxlIG9mIGJsb2NrIHNpemUgJWQiLAorCQkJICAgICpyZXFfbGVuLCAoKnZvbHVtZSktPmJsa19zeik7CisJfQorCS8qIEFzIEdOVSB0YXIgZG9lc24ndCBhY2NlcHQgcGFydGlhbCByZWFkIGNvdW50cyB3aGVuIHRoZQorCSAqIG11bHRpcGxlIHZvbHVtZSBmbGFnIGlzIHNldCwgd2UgbWFrZSBzdXJlIHRvIHJldHVybiB0aGUKKwkgKiByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEuIEV4Y2VwdCwgb2YgY291cnNlLCBhdCB0aGUgZW5kIG9mCisJICogdGhlIHRhcGUgb3IgZmlsZSBtYXJrLiAgCisJICovCisJcmVtYWluaW5nIC09ICpyZXFfbGVuOworCWlmIChyZW1haW5pbmcgPD0gMCkgeworCQlUUkFDRShmdF90X25vaXNlLCAKKwkJICAgICAgImNsaXBwZWQgcmVxdWVzdCBmcm9tICVkIHRvICVkLiIsIAorCQkgICAgICAqcmVxX2xlbiwgKGludCkoKnJlcV9sZW4gKyByZW1haW5pbmcpKTsKKwkJKnJlcV9sZW4gKz0gcmVtYWluaW5nOworCQkqcmVxX2NsaXBwZWQgPSAxOworCX0gZWxzZSB7CisJCSpyZXFfY2xpcHBlZCA9IDA7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworLyogdGhpc19zZWdzX3NpemU6IHRoZSBjdXJyZW50IHNlZ21lbnQncyBzaXplLgorICogYnVmZjogdGhlIFVTRVItU1BBQ0UgYnVmZmVyIHByb3ZpZGVkIGJ5IHRoZSBjYWxsaW5nIGZ1bmN0aW9uLgorICogcmVxX2xlbjogaG93IG11Y2ggZGF0YSBzaG91bGQgYmUgcmVhZCBhdCBtb3N0LgorICogdm9sdW1lOiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjdXJyZW50IHZvbHVtZSAoYmxrX3N6IGV0Yy4pCisgKi8gIAorc3RhdGljIGludCBlbXB0eV9kZWJsb2NrX2J1ZihfX3U4IF9fdXNlciAqdXNyX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sCisJCQkgICAgIGNvbnN0IF9fdTggKnNyY19idWYsIGNvbnN0IGludCBzZWdfc3osCisJCQkgICAgIHpmdF9wb3NpdGlvbiAqcG9zLAorCQkJICAgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKQoreworCWludCBjbnQ7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlUUkFDRShmdF90X2RhdGFfZmxvdywgInRoaXNfc2Vnc19zaXplOiAlZCIsIHNlZ19zeik7CisJaWYgKHpmdF91c2VfY29tcHJlc3Npb24gJiYgdm9sdW1lLT51c2VfY29tcHJlc3Npb24pIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X2NtcHJfbG9jaygxIC8qIHRyeSB0byBsb2FkICovKSwpOworCQlUUkFDRV9DQVRDSChyZXN1bHQ9ICgqemZ0X2NtcHJfb3BzLT5yZWFkKSgmY250LAorCQkJCQkJCSAgdXNyX2J1ZiwgcmVxX2xlbiwKKwkJCQkJCQkgIHNyY19idWYsIHNlZ19zeiwKKwkJCQkJCQkgIHBvcywgdm9sdW1lKSwpOworCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlUUkFDRV9DQVRDSChyZXN1bHQ9IHpmdF9zaW1wbGVfcmVhZCAoJmNudCwKKwkJCQkJCSAgICAgdXNyX2J1ZiwgcmVxX2xlbiwKKwkJCQkJCSAgICAgc3JjX2J1Ziwgc2VnX3N6LAorCQkJCQkJICAgICBwb3MsIHZvbHVtZSksKTsKKwl9CisJcG9zLT52b2x1bWVfcG9zICAgKz0gcmVzdWx0OworICAgICAgICBwb3MtPnRhcGVfcG9zICAgICArPSBjbnQ7CisJcG9zLT5zZWdfYnl0ZV9wb3MgKz0gY250OworCWJ1Zl9sZW5fcmQgICAgICAgIC09IGNudDsgLyogcmVtYWluaW5nIGJ5dGVzIGluIGJ1ZmZlciAqLworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiYnVmX2xlbl9yZDogJWQsIGNudDogJWQiLCBidWZfbGVuX3JkLCBjbnQpOworCWlmKHBvcy0+c2VnX2J5dGVfcG9zID49IHNlZ19zeikgeworCQlwb3MtPnNlZ19wb3MrKzsKKwkJcG9zLT5zZWdfYnl0ZV9wb3MgPSAwOworCX0KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgImJ5dGVzIG1vdmVkIG91dCBvZiBkZWJsb2NrLWJ1ZmZlcjogJWQiLCBjbnQpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisKKy8qIG5vdGU6IHdlIHN0b3JlIHRoZSBzZWdtZW50IGlkIG9mIHRoZSBzZWdtZW50IHRoYXQgaXMgaW5zaWRlIHRoZQorICogZGVibG9jayBidWZmZXIuIFRoaXMgc3BhcmVzIGEgbG90IG9mIGZ0YXBlX3JlYWRfc2VnbWVudCgpcyB3aGVuIHdlCisgKiB1c2Ugc21hbGwgYmxvY2stc2l6ZXMuIFRoZSBibG9jay1zaXplIG1heSBiZSAxa2IgKFNFQ1RPUl9TSVpFKS4gSW4KKyAqIHRoaXMgY2FzZSBhIE1URlNSIDI4IG1heWJlIHN0aWxsIGluc2lkZSB0aGUgc2FtZSBzZWdtZW50LgorICovCitpbnQgX3pmdF9yZWFkKGNoYXIgX191c2VyICpidWZmLCBpbnQgcmVxX2xlbikKK3sKKwlpbnQgcmVxX2NsaXBwZWQ7CisJaW50IHJlc3VsdCAgICAgPSAwOworCWludCBieXRlc19yZWFkID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IHNlZ19zeiA9IDA7CisJc3RhdGljIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUgPSBOVUxMOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXpmdF9yZXNpZCA9IHJlcV9sZW47CisJcmVzdWx0ID0gY2hlY2tfcmVhZF9hY2Nlc3MoJnJlcV9sZW4sICZ2b2x1bWUsCisJCQkJICAgJnJlcV9jbGlwcGVkLCAmemZ0X3Bvcyk7CisJc3dpdGNoKHJlc3VsdCkgeworCWNhc2UgMDogCisJCWJyZWFrOyAvKiBub3RoaW5nIHNwZWNpYWwgKi8KKwljYXNlIDE6IAorCQlUUkFDRShmdF90X25vaXNlLCAiRU9EIHJlYWNoZWQiKTsKKwkJVFJBQ0VfRVhJVCAwOyAgIC8qIEVPRCAqLworCWRlZmF1bHQ6CisJCVRSQUNFX0FCT1JUKHJlc3VsdCwgZnRfdF9ub2lzZSwKKwkJCSAgICAiY2hlY2tfcmVhZF9hY2Nlc3MoKSBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAorCQkJICAgIHJlc3VsdCk7CisJCVRSQUNFX0VYSVQgcmVzdWx0OworCX0KKwl3aGlsZSAocmVxX2xlbiA+IDApIHsgCisJCS8qICBBbGxvdyBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agb24gc2lnbmFsICEKKwkJICovCisJCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKKwkJLyogYnVmX2xlbl9yZCA9PSAwIG1lYW5zIHRoYXQgd2UgbmVlZCB0byByZWFkIGEgbmV3CisJCSAqIHNlZ21lbnQuCisJCSAqLworCQlpZiAoYnVmX2xlbl9yZCA9PSAwKSB7CisJCQl3aGlsZSgocmVzdWx0ID0gemZ0X2ZldGNoX3NlZ21lbnQoemZ0X3Bvcy5zZWdfcG9zLAorCQkJCQkJCSAgemZ0X2RlYmxvY2tfYnVmLAorCQkJCQkJCSAgRlRfUkRfQUhFQUQpKSA9PSAwKSB7CisJCQkJemZ0X3Bvcy5zZWdfcG9zICsrOworCQkJCXpmdF9wb3Muc2VnX2J5dGVfcG9zID0gMDsKKwkJCX0KKwkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJemZ0X3Jlc2lkIC09IGJ5dGVzX3JlYWQ7CisJCQkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X25vaXNlLAorCQkJCQkgICAgInpmdF9mZXRjaF9zZWdtZW50KCk6ICVkIiwKKwkJCQkJICAgIHJlc3VsdCk7CisJCQl9CisJCQlzZWdfc3ogPSByZXN1bHQ7CisJCQlidWZfbGVuX3JkID0gc2VnX3N6IC0gemZ0X3Bvcy5zZWdfYnl0ZV9wb3M7CisJCX0KKwkJVFJBQ0VfQ0FUQ0gocmVzdWx0ID0gZW1wdHlfZGVibG9ja19idWYoYnVmZiwgCisJCQkJCQkgICAgICAgcmVxX2xlbiwKKwkJCQkJCSAgICAgICB6ZnRfZGVibG9ja19idWYsIAorCQkJCQkJICAgICAgIHNlZ19zeiwgCisJCQkJCQkgICAgICAgJnpmdF9wb3MsCisJCQkJCQkgICAgICAgdm9sdW1lKSwKKwkJCSAgICB6ZnRfcmVzaWQgLT0gYnl0ZXNfcmVhZCk7CisJCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiYnl0ZXMganVzdCByZWFkOiAlZCIsIHJlc3VsdCk7CisJCWJ5dGVzX3JlYWQgKz0gcmVzdWx0OyAvKiB3aGF0IHdlIGdvdCBzbyBmYXIgICAgICAgKi8KKwkJYnVmZiAgICAgICArPSByZXN1bHQ7IC8qIGluZGV4IGluIHVzZXItYnVmZmVyICAgICAqLworCQlyZXFfbGVuICAgIC09IHJlc3VsdDsgLyogd2hhdCdzIGxlZnQgZnJvbSByZXFfbGVuICovCisJfSAvKiB3aGlsZSAocmVxX2xlbiAgPiAwKSAqLworCWlmIChyZXFfY2xpcHBlZCkgeworCQlUUkFDRShmdF90X2RhdGFfZmxvdywKKwkJICAgICAgIm1heWJlIHBhcnRpYWwgY291bnQgYmVjYXVzZSBvZiBlb2YgbWFyayIpOworCQlpZiAoemZ0X2p1c3RfYmVmb3JlX2VvZiAmJiBieXRlc19yZWFkID09IDApIHsKKwkJCS8qIHJlcV9sZW4gd2FzID4gMCwgYnV0IHVzZXIgZGlkbid0IGdldAorCQkJICogYW55dGhpbmcgdGhlIHVzZXIgaGFzIHJlYWQgaW4gdGhlIGVvZi1tYXJrIAorCQkJICovCisJCQl6ZnRfbW92ZV9wYXN0X2VvZigmemZ0X3Bvcyk7CisJCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGRvbid0IHNraXAgdG8gdGhlIG5leHQgZmlsZSBiZWZvcmUgdGhlIHVzZXIKKwkJCSAqIHRyaWVkIHRvIHJlYWQgYSBzZWNvbmQgdGltZSBwYXN0IEVPRiBKdXN0CisJCQkgKiBtYXJrIHRoYXQgd2UgYXJlIGF0IEVPRiBhbmQgbWF5YmUgZGVjcmVtZW50CisJCQkgKiB6ZnRfc2VnX3BvcyB0byBzdGF5IGluIHRoZSBzYW1lIHZvbHVtZTsKKwkJCSAqLworCQkJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDE7CisJCQl6ZnRfcG9zaXRpb25fYmVmb3JlX2VvZigmemZ0X3Bvcywgdm9sdW1lKTsKKwkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJqdXN0IGJlZm9yZSBlb2YiKTsKKwkJfQorCX0KKwl6ZnRfcmVzaWQgLT0gcmVzdWx0OyAvKiBmb3IgTVRTVEFUVVMgICAgICAgKi8KKwlUUkFDRV9FWElUIGJ5dGVzX3JlYWQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5NDFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9aRlRBUEVfUkVBRF9ICisjZGVmaW5lIF9aRlRBUEVfUkVBRF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcmVhZC5oLHYgJAorICogJFJldmlzaW9uOiAxLjIgJAorICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MDcgJAorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlYWQgZnVuY3Rpb25zCisgKiAgICAgIGZvciB0aGUgemZ0YXBlIGRyaXZlciBmb3IgTGludXguCisgKgorICovCisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCisKKy8qICAgICAgZnRhcGUtcmVhZC5jIGRlZmluZWQgZ2xvYmFsIHZhcnMuCisgKi8KK2V4dGVybiBpbnQgemZ0X2p1c3RfYmVmb3JlX2VvZjsKKwkKKy8qICAgICAgZnRhcGUtcmVhZC5jIGRlZmluZWQgZ2xvYmFsIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIHZvaWQgemZ0X3phcF9yZWFkX2J1ZmZlcnModm9pZCk7CitleHRlcm4gaW50ICB6ZnRfcmVhZF9oZWFkZXJfc2VnbWVudHModm9pZCk7CitleHRlcm4gaW50ICB6ZnRfZmV0Y2hfc2VnbWVudF9mcmFjdGlvbihjb25zdCB1bnNpZ25lZCBpbnQgc2VnbWVudCwKKwkJCQkgICAgICAgdm9pZCAqYnVmZmVyLAorCQkJCSAgICAgICBjb25zdCBmdF9yZWFkX21vZGVfdCByZWFkX21vZGUsCisJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzdGFydCwKKwkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHNpemUpOworI2RlZmluZSB6ZnRfZmV0Y2hfc2VnbWVudChzZWdtZW50LCBhZGRyZXNzLCByZWFkX21vZGUpCQlcCisJemZ0X2ZldGNoX3NlZ21lbnRfZnJhY3Rpb24oc2VnbWVudCwgYWRkcmVzcywgcmVhZF9tb2RlLAlcCisJCQkJICAgMCwgRlRfU0VHTUVOVF9TSVpFKQorLyogICBob29rIGZvciB0aGUgVkZTIGludGVyZmFjZQorICovCitleHRlcm4gaW50ICBfemZ0X3JlYWQoY2hhciBfX3VzZXIgKmJ1ZmYsIGludCByZXFfbGVuKTsKKworI2VuZGlmIC8qIF9aRlRBUEVfUkVBRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjFlZjUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuYwpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmMsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOTowOCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBjb21tb24gY29kZSBmb3IgdGhlIHIvdyBjb2RlIGZvcgorICogICAgICB6ZnRhcGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAvKiBmb3IgQ09ORklHX1pGVF9ERkxUX0JMS19TWiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorCisvKiAgICAgIEdsb2JhbCB2YXJzLgorICovCisKK19fdTggKnpmdF9kZWJsb2NrX2J1ZjsKK19fdTggKnpmdF9oc2VnX2J1ZjsKK2ludCB6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7Cit6ZnRfc3RhdHVzX2VudW0gemZ0X2lvX3N0YXRlID0gemZ0X2lkbGU7CitpbnQgemZ0X2hlYWRlcl9jaGFuZ2VkOworaW50IHpmdF9xaWMxMTM7IC8qIGNvbmZvcm0gdG8gb2xkIHNwZWNzLiBhbmQgb2xkIHpmdGFwZSAqLworaW50IHpmdF91c2VfY29tcHJlc3Npb247Cit6ZnRfcG9zaXRpb24gemZ0X3BvcyA9IHsKKwktMSwgLyogc2VnX3BvcyAqLworCTAsICAvKiBzZWdfYnl0ZV9wb3MgKi8KKwkwLCAgLyogdGFwZV9wb3MgKi8KKwkwICAgLyogdm9sdW1lX3BvcyAqLworfTsKK3Vuc2lnbmVkIGludCB6ZnRfYmxrX3N6ID0gQ09ORklHX1pGVF9ERkxUX0JMS19TWjsKK19fczY0IHpmdF9jYXBhY2l0eTsKKwordW5zaWduZWQgaW50IHpmdF93cml0dGVuX3NlZ21lbnRzOworaW50IHpmdF9sYWJlbF9jaGFuZ2VkOworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KKwordW5zaWduZWQgaW50IHpmdF9nZXRfc2VnX3N6KHVuc2lnbmVkIGludCBzZWdtZW50KQoreworCWludCBzaXplOworCVRSQUNFX0ZVTihmdF90X2FueSk7CisJCisJc2l6ZSA9IEZUX1NFR01FTlRfU0laRSAtIAorCQljb3VudF9vbmVzKGZ0YXBlX2dldF9iYWRfc2VjdG9yX2VudHJ5KHNlZ21lbnQpKSpGVF9TRUNUT1JfU0laRTsKKwlpZiAoc2l6ZSA+IDApIHsKKwkJVFJBQ0VfRVhJVCAodW5zaWduZWQpc2l6ZTsgCisJfSBlbHNlIHsKKwkJVFJBQ0VfRVhJVCAwOworCX0KK30KKworLyogZnRhcGVfc2V0X2ZsYWdzKCkuIENsYXVzLUp1c3R1cyBIZWluZSwgMTk5NC8xOTk1CisgKi8KK3ZvaWQgemZ0X3NldF9mbGFncyh1bnNpZ25lZCBtaW5vcl91bml0KQoreyAgICAgCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJemZ0X3VzZV9jb21wcmVzc2lvbiA9IHpmdF9xaWNfbW9kZSA9IDA7CisJc3dpdGNoIChtaW5vcl91bml0ICYgWkZUX01JTk9SX09QX01BU0spIHsKKwljYXNlIChaRlRfUTgwX01PREUgfCBaRlRfWklQX01PREUpOgorCWNhc2UgWkZUX1pJUF9NT0RFOgorCQl6ZnRfdXNlX2NvbXByZXNzaW9uID0gMTsKKwljYXNlIDA6CisJY2FzZSBaRlRfUTgwX01PREU6CisJCXpmdF9xaWNfbW9kZSA9IDE7CisJCWlmICh6ZnRfbXRfY29tcHJlc3Npb24pIHsgLyogb3ZlcnJpZGUgdGhlIGRlZmF1bHQgKi8KKwkJCXpmdF91c2VfY29tcHJlc3Npb24gPSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgWkZUX1JBV19NT0RFOgorCQlUUkFDRShmdF90X25vaXNlLCAic3dpdGNoaW5nIHRvIHJhdyBtb2RlIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFKGZ0X3Rfd2FybiwgIldhcm5pbmc6XG4iCisJCSAgICAgIEtFUk5fSU5GTyAiV3JvbmcgY29tYmluYXRpb24gb2YgbWlub3IgZGV2aWNlIGJpdHMuXG4iCisJCSAgICAgIEtFUk5fSU5GTyAiU3dpdGNoaW5nIHRvIHJhdyByZWFkLW9ubHkgbW9kZS4iKTsKKwkJemZ0X3dyaXRlX3Byb3RlY3RlZCA9IDE7CisJCWJyZWFrOworCX0KKwlUUkFDRV9FWElUOworfQorCisvKiBjb21wdXRlcyB0aGUgc2VnbWVudCBhbmQgYnl0ZSBvZmZzZXQgaW5zaWRlIHRoZSBzZWdtZW50CisgKiBjb3JyZXNwb25kaW5nIHRvIHRhcGVfcG9zLgorICoKKyAqIHRhcGVfcG9zIGdpdmVzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogZnRfZmlyc3RfZGF0YV9zZWdtZW50ICpzZWdfYnl0ZV9wb3MgaXMgdGhlIG9mZnNldCBpbiB0aGUgY3VycmVudAorICogc2VnbWVudCBpbiBieXRlcworICoKKyAqIE9mLCBpZiB0aGlzIHJvdXRpbmUgd2FzIGNhbGxlZCBvZnRlbiBvbmUgc2hvdWxkIGNhY2hlIHRoZSBsYXN0IGRhdGEKKyAqIHBvcyBpdCB3YXMgY2FsbGVkIHdpdGgsIGJ1dCBhY3R1YWxseSB0aGlzIGlzIG9ubHkgbmVlZGVkIGluCisgKiBmdGFwZV9zZWVrX2Jsb2NrKCksIHRoYXQgaXMsIGFsbW9zdCBuZXZlci4KKyAqLworaW50IHpmdF9jYWxjX3NlZ19ieXRlX2Nvb3JkKGludCAqc2VnX2J5dGVfcG9zLCBfX3M2NCB0YXBlX3BvcykKK3sKKwlpbnQgc2VnbWVudDsKKwlpbnQgc2VnX3N6OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmICh0YXBlX3BvcyA9PSAwKSB7CisJCSpzZWdfYnl0ZV9wb3MgPSAwOworCQlzZWdtZW50ID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCX0gZWxzZSB7CisJCXNlZ19zeiA9IDA7CisJCQorCQlmb3IgKHNlZ21lbnQgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7IAorCQkgICAgICgodGFwZV9wb3MgPiAwKSAmJiAoc2VnbWVudCA8PSBmdF9sYXN0X2RhdGFfc2VnbWVudCkpOworCQkgICAgIHNlZ21lbnQrKykgeworCQkJc2VnX3N6ID0gemZ0X2dldF9zZWdfc3ooc2VnbWVudCk7IAorCQkJdGFwZV9wb3MgLT0gc2VnX3N6OworCQl9CisJCWlmKHRhcGVfcG9zID49IDApIHsKKwkJCS8qIHRoZSBjYXNlIHRhcGVfcG9zID4gIT0gMCBtZWFucyB0aGF0IHRoZQorCQkJICogYXJndW1lbnQgdGFwZV9wb3MgbGllcyBiZXlvbmQgdGhlIEVPVC4KKwkJCSAqLworCQkJKnNlZ19ieXRlX3Bvcz0gMDsKKwkJfSBlbHNlIHsgLyogdGFwZV9wb3MgPCAwICovCisJCQlzZWdtZW50LS07CisJCQkqc2VnX2J5dGVfcG9zPSB0YXBlX3BvcyArIHNlZ19zejsKKwkJfQorCX0KKwlUUkFDRV9FWElUKHNlZ21lbnQpOworfQorCisvKiBmdGFwZV9jYWxjX3RhcGVfcG9zKCkuCisgKgorICogY29tcHV0ZXMgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgKiBmdF9maXJzdF9kYXRhX3NlZ21lbnQgaW52ZXJzZSB0byBmdGFwZV9jYWxjX3NlZ19ieXRlX2Nvb3JkCisgKgorICogV2Ugc2hvdWxkIGRvIHNvbWUgY2FjaGluZy4gQnV0IGhvdzoKKyAqCisgKiBFYWNoIHRpbWUgdGhlIGhlYWRlciBzZWdtZW50cyBhcmUgcmVhZCBpbiwgdGhpcyByb3V0aW5lIGlzIGNhbGxlZAorICogd2l0aCBmdF90cmFja3NfcGVyX3RhcGUqc2VnbWVudHNfcGVyX3RyYWNrIGFyZ3VtbmV0LiBTbyB0aGlzIHNob3VsZCBiZQorICogdGhlIHRpbWUgdG8gcmVzZXQgdGhlIGNhY2hlLgorICoKKyAqIEFsc28sIGl0IG1pZ2h0IGJlIGluIHRoZSBmdXR1cmUgdGhhdCB0aGUgYmFkIHNlY3RvciBtYXAgZ2V0cworICogY2hhbmdlZC4gIC0+IHJlc2V0IHRoZSBjYWNoZQorICovCitzdGF0aWMgaW50IHNlZ19wb3M7CitzdGF0aWMgX19zNjQgdGFwZV9wb3M7CisKK19fczY0IHpmdF9nZXRfY2FwYWNpdHkodm9pZCkKK3sKKwlzZWdfcG9zICA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKKwl0YXBlX3BvcyA9IDA7CisKKwl3aGlsZSAoc2VnX3BvcyA8PSBmdF9sYXN0X2RhdGFfc2VnbWVudCkgeworCQl0YXBlX3BvcyArPSB6ZnRfZ2V0X3NlZ19zeihzZWdfcG9zICsrKTsKKwl9CisJcmV0dXJuIHRhcGVfcG9zOworfQorCitfX3M2NCB6ZnRfY2FsY190YXBlX3BvcyhpbnQgc2VnbWVudCkKK3sKKwlpbnQgZDEsIGQyLCBkMzsKKwlUUkFDRV9GVU4oZnRfdF9hbnkpOworCQorCWlmIChzZWdtZW50ID4gZnRfbGFzdF9kYXRhX3NlZ21lbnQpIHsKKwkgICAgICAgIFRSQUNFX0VYSVQgemZ0X2NhcGFjaXR5OworCX0KKwlpZiAoc2VnbWVudCA8IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCkgeworCQlUUkFDRV9FWElUIDA7CisJfQorCWQyID0gc2VnbWVudCAtIHNlZ19wb3M7CisJaWYgKC1kMiA+IDEwKSB7CisJCWQxID0gc2VnbWVudCAtIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKKwkJaWYgKC1kMiA+IGQxKSB7CisJCQl0YXBlX3BvcyA9IDA7CisJCQlzZWdfcG9zID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OworCQkJZDIgPSBkMTsKKwkJfQorCX0KKwlpZiAoZDIgPiAxMCkgeworCQlkMyA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50IC0gc2VnbWVudDsKKwkJaWYgKGQyID4gZDMpIHsKKwkJCXRhcGVfcG9zID0gemZ0X2NhcGFjaXR5OworCQkJc2VnX3BvcyAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCArIDE7CisJCQlkMiA9IC1kMzsKKwkJfQorCX0JCQorCWlmIChkMiA+IDApIHsKKwkJd2hpbGUgKHNlZ19wb3MgPCBzZWdtZW50KSB7CisJCQl0YXBlX3BvcyArPSAgemZ0X2dldF9zZWdfc3ooc2VnX3BvcysrKTsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlIChzZWdfcG9zID4gc2VnbWVudCkgeworCQkJdGFwZV9wb3MgLT0gIHpmdF9nZXRfc2VnX3N6KC0tc2VnX3Bvcyk7CisJCX0KKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgIm5ldyBjYWNoZWQgcG9zOiAlZCIsIHNlZ19wb3MpOworCisJVFJBQ0VfRVhJVCB0YXBlX3BvczsKK30KKworLyogY29weSBaLWxhYmVsIHN0cmluZyB0byBidWZmZXIsIGtlZXBzIHRyYWNrIG9mIHRoZSBjb3JyZWN0IG9mZnNldCBpbgorICogYGJ1ZmZlcicgCisgKi8KK3ZvaWQgemZ0X3VwZGF0ZV9sYWJlbChfX3U4ICpidWZmZXIpCit7IAorCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmIChzdHJuY21wKCZidWZmZXJbRlRfTEFCRUxdLCBaRlRBUEVfTEFCRUwsIAorCQkgICAgc2l6ZW9mKFpGVEFQRV9MQUJFTCktMSkgIT0gMCkgeworCQlUUkFDRShmdF90X2luZm8sICJ1cGRhdGluZyBsYWJlbCBmcm9tIFwiJXNcIiB0byBcIiVzXCIiLAorCQkgICAgICAmYnVmZmVyW0ZUX0xBQkVMXSwgWkZUQVBFX0xBQkVMKTsKKwkJc3RyY3B5KCZidWZmZXJbRlRfTEFCRUxdLCBaRlRBUEVfTEFCRUwpOworCQltZW1zZXQoJmJ1ZmZlcltGVF9MQUJFTF0gKyBzaXplb2YoWkZUQVBFX0xBQkVMKSAtIDEsICcgJywgCisJCSAgICAgICBGVF9MQUJFTF9TWiAtIHNpemVvZihaRlRBUEVfTEFCRUwgKyAxKSk7CisJCVBVVDQoYnVmZmVyLCBGVF9MQUJFTF9EQVRFLCAwKTsKKwkJemZ0X2xhYmVsX2NoYW5nZWQgPSB6ZnRfaGVhZGVyX2NoYW5nZWQgPSAxOyAvKiBjaGFuZ2VkICovCisJfQorCVRSQUNFX0VYSVQ7Cit9CisKK2ludCB6ZnRfdmVyaWZ5X3dyaXRlX3NlZ21lbnRzKHVuc2lnbmVkIGludCBzZWdtZW50LCAKKwkJCSAgICAgIF9fdTggKmRhdGEsIHNpemVfdCBzaXplLAorCQkJICAgICAgX191OCAqYnVmZmVyKQoreworCWludCByZXN1bHQ7CisJX191OCAqd3JpdGVfYnVmOworCV9fdTggKnNyY19idWY7CisJaW50IHNpbmdsZTsKKwlpbnQgc2VnX3BvczsKKwlpbnQgc2VnX3N6OworCWludCByZW1haW5pbmc7CisJZnRfd3JpdGVfbW9kZV90IHdyaXRlX21vZGU7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlzZWdfcG9zICAgPSBzZWdtZW50OworCXNlZ19zeiAgICA9IHpmdF9nZXRfc2VnX3N6KHNlZ19wb3MpOworCXNyY19idWYgICA9IGRhdGE7CisJc2luZ2xlICAgID0gc2l6ZSA8PSBzZWdfc3o7CisJcmVtYWluaW5nID0gc2l6ZTsKKwlkbyB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKKwkJICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmc6ICVkXG4iCisJCSAgICAgIEtFUk5fSU5GTyAic2VnX3N6ICAgOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gInNlZ21lbnQgIDogJWQiLAorCQkgICAgICByZW1haW5pbmcsIHNlZ19zeiwgc2VnX3Bvcyk7CisJCWlmIChyZW1haW5pbmcgPT0gc2VnX3N6KSB7CisJCQl3cml0ZV9idWYgPSBzcmNfYnVmOworCQkJd3JpdGVfbW9kZSA9IHNpbmdsZSA/IEZUX1dSX1NJTkdMRSA6IEZUX1dSX01VTFRJOworCQkJcmVtYWluaW5nID0gMDsKKwkJfSBlbHNlIGlmIChyZW1haW5pbmcgPiBzZWdfc3opIHsKKwkJCXdyaXRlX2J1ZiA9IHNyY19idWY7CisJCQl3cml0ZV9tb2RlID0gRlRfV1JfQVNZTkM7IC8qIGRvbid0IHN0YXJ0IHRhcGUgKi8KKwkJCXJlbWFpbmluZyAtPSBzZWdfc3o7CisJCX0gZWxzZSB7IC8qIHJlbWFpbmluZyA8IHNlZ19zeiAqLworCQkJd3JpdGVfYnVmID0gYnVmZmVyOworCQkJbWVtY3B5KHdyaXRlX2J1Ziwgc3JjX2J1ZiwgcmVtYWluaW5nKTsKKwkJCW1lbXNldCgmd3JpdGVfYnVmW3JlbWFpbmluZ10sJ1wwJyxzZWdfc3otcmVtYWluaW5nKTsKKwkJCXdyaXRlX21vZGUgPSBzaW5nbGUgPyBGVF9XUl9TSU5HTEUgOiBGVF9XUl9NVUxUSTsKKwkJCXJlbWFpbmluZyA9IDA7CisJCX0KKwkJaWYgKChyZXN1bHQgPSBmdGFwZV93cml0ZV9zZWdtZW50KHNlZ19wb3MsIAorCQkJCQkJICB3cml0ZV9idWYsIAorCQkJCQkJICB3cml0ZV9tb2RlKSkgIT0gc2VnX3N6KSB7CisJCQlUUkFDRShmdF90X2VyciwgIkVycm9yOiAiCisJCQkgICAgICAiQ291bGRuJ3Qgd3JpdGUgc2VnbWVudCAlZCIsIHNlZ19wb3MpOworCQkJVFJBQ0VfRVhJVCByZXN1bHQgPCAwID8gcmVzdWx0IDogLUVJTzsgLyogYmFpbCBvdXQgKi8KKwkJfQorCQl6ZnRfd3JpdHRlbl9zZWdtZW50cyArKzsKKwkJc2VnX3N6ID0gemZ0X2dldF9zZWdfc3ooKytzZWdfcG9zKTsKKwkJc3JjX2J1ZiArPSByZXN1bHQ7CisJfSB3aGlsZSAocmVtYWluaW5nID4gMCk7CisJaWYgKGZ0YXBlX2dldF9zdGF0dXMoKS0+ZnRpX3N0YXRlID09IHdyaXRpbmcpIHsKKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpLCk7CisJCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7CisJCXpmdF9wcmV2ZW50X2ZsdXNoKCk7CisJfQorCXNlZ19wb3MgPSBzZWdtZW50OworCXNyY19idWYgPSBkYXRhOworCXJlbWFpbmluZyA9IHNpemU7CisJZG8geworCQlUUkFDRV9DQVRDSChyZXN1bHQgPSBmdGFwZV9yZWFkX3NlZ21lbnQoc2VnX3BvcywgYnVmZmVyLCAKKwkJCQkJCQlzaW5nbGUgPyBGVF9SRF9TSU5HTEUKKwkJCQkJCQk6IEZUX1JEX0FIRUFEKSwpOworCQlpZiAobWVtY21wKHNyY19idWYsIGJ1ZmZlciwgCisJCQkgICByZW1haW5pbmcgPiByZXN1bHQgPyByZXN1bHQgOiByZW1haW5pbmcpICE9IDApIHsKKwkJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJCSAgICAiRmFpbGVkIHRvIHZlcmlmeSB3cml0dGVuIHNlZ21lbnQgJWQiLAorCQkJCSAgICBzZWdfcG9zKTsKKwkJfQorCQlyZW1haW5pbmcgLT0gcmVzdWx0OworCQlUUkFDRShmdF90X25vaXNlLCAidmVyaWZ5IHN1Y2Nlc3NmdWw6XG4iCisJCSAgICAgIEtFUk5fSU5GTyAic2VnbWVudCAgOiAlZFxuIgorCQkgICAgICBLRVJOX0lORk8gInNlZ3NpemUgIDogJWRcbiIKKwkJICAgICAgS0VSTl9JTkZPICJyZW1haW5pbmc6ICVkIiwKKwkJICAgICAgc2VnX3BvcywgcmVzdWx0LCByZW1haW5pbmcpOworCQlzcmNfYnVmICAgKz0gc2VnX3N6OworCQlzZWdfcG9zKys7CisJfSB3aGlsZSAocmVtYWluaW5nID4gMCk7CisJVFJBQ0VfRVhJVCBzaXplOworfQorCisKKy8qIHpmdF9lcmFzZSgpLiAgaW1wbGVtZW50ZWQgY29tcHJlc3Npb24taGFuZGxpbmcKKyAqCisgKiBjYWxjdWxhdGUgdGhlIGZpcnN0IGRhdGEtc2VnbWVudCB3aGVuIHVzaW5nL25vdCB1c2luZyBjb21wcmVzc2lvbi4KKyAqCisgKiB1cGRhdGUgaGVhZGVyLXNlZ21lbnQgYW5kIGNvbXByZXNzaW9uLW1hcC1zZWdtZW50LgorICovCitpbnQgemZ0X2VyYXNlKHZvaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKCF6ZnRfaGVhZGVyX3JlYWQpIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X3ZtYWxsb2Nfb25jZSgodm9pZCAqKikmemZ0X2hzZWdfYnVmLAorCQkJCQkgICAgIEZUX1NFR01FTlRfU0laRSksKTsKKwkJLyogbm8gbmVlZCB0byByZWFkIHRoZSB2dGJsIGFuZCBjb21wcmVzc2lvbiBtYXAgKi8KKwkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZF9oZWFkZXJfc2VnbWVudCh6ZnRfaHNlZ19idWYpLCk7CisJCWlmICgoemZ0X29sZF9mdGFwZSA9IAorCQkgICAgIHpmdF9mdGFwZV92YWxpZGF0ZV9sYWJlbCgmemZ0X2hzZWdfYnVmW0ZUX0xBQkVMXSkpKSB7CisJCQl6ZnRfZnRhcGVfZXh0cmFjdF9maWxlX21hcmtzKHpmdF9oc2VnX2J1Zik7CisJCX0KKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgImZ0X2ZpcnN0X2RhdGFfc2VnbWVudDogJWQsIGZ0X2xhc3RfZGF0YV9zZWdtZW50OiAlZCIsIAorCQkgICAgICBmdF9maXJzdF9kYXRhX3NlZ21lbnQsIGZ0X2xhc3RfZGF0YV9zZWdtZW50KTsKKwkJemZ0X3FpYzExMyA9IChmdF9mb3JtYXRfY29kZSAhPSBmbXRfbm9ybWFsICYmCisJCQkgICAgICBmdF9mb3JtYXRfY29kZSAhPSBmbXRfMTEwMGZ0ICYmCisJCQkgICAgICBmdF9mb3JtYXRfY29kZSAhPSBmbXRfNDI1ZnQpOworCX0KKwlpZiAoemZ0X29sZF9mdGFwZSkgeworCQl6ZnRfY2xlYXJfZnRhcGVfZmlsZV9tYXJrcygpOworCQl6ZnRfb2xkX2Z0YXBlID0gMDsgLyogbm8gbG9uZ2VyIG9sZCBmdGFwZSAqLworCX0KKwlQVVQyKHpmdF9oc2VnX2J1ZiwgRlRfQ01BUF9TVEFSVCwgMCk7CisJemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkID0gMTsKKwl6ZnRfY2FwYWNpdHkgPSB6ZnRfZ2V0X2NhcGFjaXR5KCk7CisJemZ0X2luaXRfdnRibCgpOworCS8qIHRoZSByZXN0IG11c3QgYmUgZG9uZSBpbiBmdGFwZV91cGRhdGVfaGVhZGVyX3NlZ21lbnRzIAorCSAqLworCXpmdF9oZWFkZXJfcmVhZCA9IDE7CisJemZ0X2hlYWRlcl9jaGFuZ2VkID0gMTsgLyogZm9yY2UgdXBkYXRlIG9mIHRpbWVzdGFtcCAqLworCXJlc3VsdCA9IHpmdF91cGRhdGVfaGVhZGVyX3NlZ21lbnRzKCk7CisKKwlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKKworCXpmdF9yZXNldF9wb3NpdGlvbigmemZ0X3Bvcyk7CisJemZ0X3NldF9mbGFncyAoemZ0X3VuaXQpOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCit1bnNpZ25lZCBpbnQgemZ0X2dldF90aW1lKHZvaWQpIAoreworCXVuc2lnbmVkIGludCBkYXRlID0gRlRfVElNRV9TVEFNUCgyMDk3LCAxMSwgMzAsIDIzLCA1OSwgNTkpOyAvKiBmdW4gKi8KKwlyZXR1cm4gZGF0ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YzA3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1ydy5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIF9aRlRBUEVfUldfSAorI2RlZmluZSBfWkZUQVBFX1JXX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuaCx2ICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA5ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWFkIGFuZCB3cml0ZQorICogICAgICBmdW5jdGlvbnMgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gLyogZm9yIENPTkZJR19aRlRfREZMVF9CTEtfU1ogKi8KKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKKworI2RlZmluZSBTRUdNRU5UU19QRVJfVEFQRSAgKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSkKKworLyogIFFJQy0xMTMgUmV2LiBHIHNheXMgdGhhdCBgYSBtYXhpbXVtIG9mIDYzNDg4IHJhdyBieXRlcyBtYXkgYmUKKyAqICBjb21wcmVzc2VkIGludG8gYSBzaW5nbGUgZnJhbWUnLgorICogIE1heWJlIHdlIHNob3VsZCBzdGljayB0byAzMmtiIHRvIG1ha2UgaXQgbW9yZSBgYmVhdXRpZnVsJworICovCisjZGVmaW5lIFpGVF9NQVhfQkxLX1NaICAgICAgICAgICAoNjIqMTAyNCkgLyogYnl0ZXMgKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfWkZUX0RGTFRfQkxLX1NaKQorIyBkZWZpbmUgQ09ORklHX1pGVF9ERkxUX0JMS19TWiAgICgxMCoxMDI0KSAvKiBieXRlcywgZGVmYXVsdCBvZiBnbnUgdGFyICovCisjZWxpZiBDT05GSUdfWkZUX0RGTFRfQkxLX1NaID09IDAKKyMgdW5kZWYgIENPTkZJR19aRlRfREZMVF9CTEtfU1oKKyMgZGVmaW5lIENPTkZJR19aRlRfREZMVF9CTEtfU1ogMQorI2VsaWYgKENPTkZJR19aRlRfREZMVF9CTEtfU1ogJSAxMDI0KSAhPSAwCisjIGVycm9yIENPTkZJR19aRlRfREZMVF9CTEtfU1ogbXVzdCBiZSAxIG9yIGEgbXVsdGlwbGUgb2YgMTAyNAorI2VuZGlmCisvKiBUaGUgKm9wdGlvbmFsKiBjb21wcmVzc2lvbiByb3V0aW5lcyBuZWVkIHNvbWUgb3ZlcmhlYWQgcGVyIHRhcGUKKyAqICBibG9jayBmb3IgdGhlaXIgcHVycG9zZXMuIEluc3RlYWQgb2YgYXNraW5nIHRoZSBhY3R1YWwgY29tcHJlc3Npb24KKyAqICBpbXBsZW1lbnRhdGlvbiBob3cgbXVjaCBpdCBuZWVkcywgd2UgcmVzdHJpY3QgdGhpcyBvdmVyaGVhZCB0byBiZQorICogIG1heGltYWwgb2YgWkZUX0NNUFRfT1ZFUkhFQUQgc2l6ZS4gV2UgbmVlZCB0aGlzIGZvciBFT1QKKyAqICBjb25kaXRpb25zLiBUaGUgdGFwZSBpcyBhc3N1bWVkIHRvIGJlIGxvZ2ljYWwgYXQgRU9UIHdoZW4gdGhlCisgKiAgZGlzdGFuY2UgZnJvbSB0aGUgcGh5c2ljYWwgRU9UIGlzIGxlc3MgdGhhbiAKKyAqICBvbmUgdGFwZSBibG9jayArIFpGVF9DTVBSX09WRVJIRUFEIAorICovCisjZGVmaW5lIFpGVF9DTVBSX09WRVJIRUFEIDE2ICAgICAgICAvKiBieXRlcyAqLworCit0eXBlZGVmIGVudW0KK3sgCisJemZ0X2lkbGUgPSAwLAorCXpmdF9yZWFkaW5nLAorCXpmdF93cml0aW5nLAorfSB6ZnRfc3RhdHVzX2VudW07CisKK3R5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAgLyogIGFsbCB2YWx1ZXMgbWVhc3VyZWQgaW4gYnl0ZXMgKi8KK3sKKwlpbnQgICBzZWdfcG9zOyAgICAgICAvKiAgc2VnbWVudCBjdXJyZW50bHkgcG9zaXRpb25lZCBhdCAqLworCWludCAgIHNlZ19ieXRlX3BvczsgIC8qICBvZmZzZXQgaW4gY3VycmVudCBzZWdtZW50ICovIAorCV9fczY0IHRhcGVfcG9zOyAgICAgIC8qICByZWFsIG9mZnNldCBmcm9tIEJPVCAqLworCV9fczY0IHZvbHVtZV9wb3M7ICAgIC8qICBwb3MuIGluIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbSBpbgorCQkJICAgICAgKiAgY3VycmVudCB2b2x1bWUgCisJCQkgICAgICAqLworfSB6ZnRfcG9zaXRpb247IAorCitleHRlcm4gemZ0X3Bvc2l0aW9uIHpmdF9wb3M7CitleHRlcm4gX191OCAqemZ0X2RlYmxvY2tfYnVmOworZXh0ZXJuIF9fdTggKnpmdF9oc2VnX2J1ZjsKK2V4dGVybiBpbnQgemZ0X2RlYmxvY2tfc2VnbWVudDsKK2V4dGVybiB6ZnRfc3RhdHVzX2VudW0gemZ0X2lvX3N0YXRlOworZXh0ZXJuIGludCB6ZnRfaGVhZGVyX2NoYW5nZWQ7CitleHRlcm4gaW50IHpmdF9xaWMxMTM7IC8qIGNvbmZvcm0gdG8gb2xkIHNwZWNzLiBhbmQgb2xkIHpmdGFwZSAqLworZXh0ZXJuIGludCB6ZnRfdXNlX2NvbXByZXNzaW9uOworZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfYmxrX3N6OworZXh0ZXJuIF9fczY0IHpmdF9jYXBhY2l0eTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgemZ0X3dyaXR0ZW5fc2VnbWVudHM7CitleHRlcm4gaW50IHpmdF9sYWJlbF9jaGFuZ2VkOworCisvKiAgemZ0YXBlLXJ3LmMgZXhwb3J0ZWQgZnVuY3Rpb25zCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgemZ0X2dldF9zZWdfc3oodW5zaWduZWQgaW50IHNlZ21lbnQpOworZXh0ZXJuIHZvaWQgIHpmdF9zZXRfZmxhZ3ModW5zaWduZWQgaW50IG1pbm9yX3VuaXQpOworZXh0ZXJuIGludCAgIHpmdF9jYWxjX3NlZ19ieXRlX2Nvb3JkKGludCAqc2VnX2J5dGVfcG9zLCBfX3M2NCB0YXBlX3Bvcyk7CitleHRlcm4gX19zNjQgemZ0X2NhbGNfdGFwZV9wb3MoaW50IHNlZ21lbnQpOworZXh0ZXJuIF9fczY0IHpmdF9nZXRfY2FwYWNpdHkodm9pZCk7CitleHRlcm4gdm9pZCAgemZ0X3VwZGF0ZV9sYWJlbChfX3U4ICpidWZmZXIpOworZXh0ZXJuIGludCAgIHpmdF9lcmFzZSh2b2lkKTsKK2V4dGVybiBpbnQgICB6ZnRfdmVyaWZ5X3dyaXRlX3NlZ21lbnRzKHVuc2lnbmVkIGludCBzZWdtZW50LCAKKwkJCQkgICAgICAgX191OCAqZGF0YSwgc2l6ZV90IHNpemUsIF9fdTggKmJ1ZmZlcik7CitleHRlcm4gdW5zaWduZWQgaW50IHpmdF9nZXRfdGltZSh2b2lkKTsKKyNlbmRpZiAvKiBfWkZUQVBFX1JXX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkN2Y4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmMKQEAgLTAsMCArMSw3NTcgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IENsYXVzLUp1c3R1cyBIZWluZSAKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5jLHYgJAorICogJFJldmlzaW9uOiAxLjcuNi4xICQKKyAqICREYXRlOiAxOTk3LzExLzI0IDEzOjQ4OjMxICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGEgdm9sdW1lIHRhYmxlIGFzIGRlZmluZWQgaW4gdmFyaW91cyBRSUMKKyAqICAgICAgc3RhbmRhcmRzLgorICogCisgKiAgICAgIFRoaXMgaXMgYSBtaW5pbWFsIGltcGxlbWVudGF0aW9uLCBqdXN0IGFsbG93aW5nIG9yZGluYXJ5IERPUworICogICAgICA6KCBwcmdyYW1zIHRvIGlkZW50aWZ5IHRoZSBjYXJ0cmlkZ2UgYXMgdXNlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1yZWFkLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtdnRibC5oIgorCisjZGVmaW5lIFpGVF9DTUFQX0hBQ0sgLyogbGVhdmUgdGhpcyBkZWZpbmVkIHRvIGhpZGUgdGhlIGNvbXByZXNzaW9uIG1hcCAqLworCisvKgorICogIGdsb2JhbCB2YXJpYWJsZXMgCisgKi8KK2ludCB6ZnRfcWljX21vZGUgICA9IDE7IC8qIHVzZSB0aGUgdnRibCAqLworaW50IHpmdF9vbGRfZnRhcGU7IC8qIHByZXZlbnRzIG9sZCBmdGFwZWQgdGFwZXMgdG8gYmUgb3ZlcndyaXR0ZW4gKi8KK2ludCB6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQ7IC8qIGZvciB3cml0ZV9oZWFkZXJfc2VnbWVudHMoKSAqLworCisvKgorICogIHByaXZhdGUgdmFyaWFibGVzIChvbmx5IGV4cG9ydGVkIGZvciBpbmxpbmUgZnVuY3Rpb25zKQorICovCitMSVNUX0hFQUQoemZ0X3Z0YmwpOworCisvKiAgV2UgY291bGQgYWxzbyBhbGxvY2F0ZSB0aGVzZSBkeW5hbWljYWxseSB3aGVuIGV4dHJhY3RpbmcgdGhlIHZvbHVtZSB0YWJsZQorICogIHNpemVvZih6ZnRfdm9saW5mbykgaXMgYWJvdXQgMzIgb3Igc29tZXRoaW5nIGNsb3NlIHRvIHRoYXQKKyAqLworc3RhdGljIHpmdF92b2xpbmZvICB0YXBlX3Z0Ymw7CitzdGF0aWMgemZ0X3ZvbGluZm8gIGVvdF92dGJsOworc3RhdGljIHpmdF92b2xpbmZvICpjdXJfdnRibDsKKworc3RhdGljIGlubGluZSB2b2lkIHpmdF9uZXdfdnRibF9lbnRyeSh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9ICZ6ZnRfbGFzdF92dGJsLT5ub2RlOworCXpmdF92b2xpbmZvICpuZXcgPSB6ZnRfa21hbGxvYyhzaXplb2YoemZ0X3ZvbGluZm8pKTsKKworCWxpc3RfYWRkKCZuZXctPm5vZGUsIHRtcCk7CisJbmV3LT5jb3VudCA9IHpmdF9lb21fdnRibC0+Y291bnQgKys7Cit9CisKK3ZvaWQgemZ0X2ZyZWVfdnRibCh2b2lkKQoreworCWZvciAoOzspIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gemZ0X3Z0YmwucHJldjsKKwkJemZ0X3ZvbGluZm8gKnZ0Ymw7CisKKwkJaWYgKHRtcCA9PSAmemZ0X3Z0YmwpCisJCQlicmVhazsKKwkJbGlzdF9kZWwodG1wKTsKKwkJdnRibCA9IGxpc3RfZW50cnkodG1wLCB6ZnRfdm9saW5mbywgbm9kZSk7CisJCXpmdF9rZnJlZSh2dGJsLCBzaXplb2YoemZ0X3ZvbGluZm8pKTsKKwl9CisJSU5JVF9MSVNUX0hFQUQoJnpmdF92dGJsKTsKKwljdXJfdnRibCA9IE5VTEw7Cit9CisKKy8qICBpbml0aWFsaXplIHZ0YmwsIGNhbGxlZCBieSBmdGFwZV9uZXdfY2FydHJpZGdlKCkKKyAqLwordm9pZCB6ZnRfaW5pdF92dGJsKHZvaWQpCit7IAorCXpmdF92b2xpbmZvICpuZXc7CisKKwl6ZnRfZnJlZV92dGJsKCk7CisJCisJLyogIENyZWF0ZSB0aGUgdHdvIGR1bW15IHZ0YmwgZW50cmllcworCSAqLworCW5ldyA9IHpmdF9rbWFsbG9jKHNpemVvZih6ZnRfdm9saW5mbykpOworCWxpc3RfYWRkKCZuZXctPm5vZGUsICZ6ZnRfdnRibCk7CisJbmV3ID0gemZ0X2ttYWxsb2Moc2l6ZW9mKHpmdF92b2xpbmZvKSk7CisJbGlzdF9hZGQoJm5ldy0+bm9kZSwgJnpmdF92dGJsKTsKKwl6ZnRfaGVhZF92dGJsLT5lbmRfc2VnICAgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7CisJemZ0X2hlYWRfdnRibC0+YmxrX3N6ICAgID0gemZ0X2Jsa19zejsKKwl6ZnRfaGVhZF92dGJsLT5jb3VudCAgICAgPSAtMTsKKwl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQgKyAxOworCXpmdF9lb21fdnRibC0+ZW5kX3NlZyAgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKKwl6ZnRfZW9tX3Z0YmwtPmJsa19zeiAgICAgPSB6ZnRfYmxrX3N6OworCXpmdF9lb21fdnRibC0+Y291bnQgICAgICA9IDA7CisKKwkvKiAgUmVzZXQgdGhlIHBvaW50ZXIgZm9yIHpmdF9maW5kX3ZvbHVtZSgpCisJICovCisJY3VyX3Z0YmwgPSB6ZnRfZW9tX3Z0Ymw7CisKKwkvKiBpbml0aWFsaXplIHRoZSBkdW1teSB2dGJsIGVudHJpZXMgZm9yIHpmdF9xaWNfbW9kZSA9PSAwCisJICovCisJZW90X3Z0Ymwuc3RhcnRfc2VnICAgICAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOworCWVvdF92dGJsLmVuZF9zZWcgICAgICAgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKKwllb3RfdnRibC5ibGtfc3ogICAgICAgICAgPSB6ZnRfYmxrX3N6OworCWVvdF92dGJsLmNvdW50ICAgICAgICAgICA9IC0xOworCXRhcGVfdnRibC5zdGFydF9zZWcgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7CisJdGFwZV92dGJsLmVuZF9zZWcgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50OworCXRhcGVfdnRibC5ibGtfc3ogICAgPSB6ZnRfYmxrX3N6OworCXRhcGVfdnRibC5zaXplICAgICAgPSB6ZnRfY2FwYWNpdHk7CisJdGFwZV92dGJsLmNvdW50ICAgICA9IDA7Cit9CisKKy8qIGNoZWNrIGZvciBhIHZhbGlkIFZUQkwgc2lnbmF0dXJlLiAKKyAqLworc3RhdGljIGludCB2dGJsX3NpZ25hdHVyZV92YWxpZChfX3U4IHNpZ25hdHVyZVs0XSkKK3sKKwljb25zdCBjaGFyICp2dGJsX2lkc1tdID0gVlRCTF9JRFM7IC8qIHZhbGlkIHNpZ25hdHVyZXMgKi8KKwlpbnQgajsKKwkKKwlmb3IgKGogPSAwOyAKKwkgICAgIChqIDwgTlJfSVRFTVModnRibF9pZHMpKSAmJiAobWVtY21wKHNpZ25hdHVyZSwgdnRibF9pZHNbal0sIDQpICE9IDApOworCSAgICAgaisrKTsKKwlyZXR1cm4gaiA8IE5SX0lURU1TKHZ0YmxfaWRzKTsKK30KKworLyogV2UgdXNlZCB0byBzdG9yZSB0aGUgYmxvY2stc2l6ZSBvZiB0aGUgdm9sdW1lIGluIHRoZSB2b2x1bWUtbGFiZWwsCisgKiB1c2luZyB0aGUga2V5d29yZCAiYmxvY2tzaXplIi4gVGhlIGJsb2Nrc2l6ZSB3cml0dGVuIHRvIHRoZQorICogdm9sdW1lLWxhYmVsIGlzIGluIGJ5dGVzLgorICoKKyAqIFdlIHVzZSB0aGlzIG5vdyBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHpmdGFwZSB2ZXJzaW9uLiBXZQorICogc3RvcmUgdGhlIGJsb2Nrc2l6ZSBkaXJlY3RseSBhcyBiaW5hcnkgbnVtYmVyIGluIHRoZSB2ZW5kb3IKKyAqIGV4dGVuc2lvbiBwYXJ0IG9mIHRoZSB2b2x1bWUgZW50cnkuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfdm9sdW1lX2xhYmVsKGNvbnN0IGNoYXIgKmxhYmVsLCBpbnQgKmJsa19zeikKK3sgCisJaW50IHZhbGlkX2Zvcm1hdDsKKwljaGFyICpibG9ja3NpemU7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgImNhbGxlZCB3aXRoIFwiJXNcIiAvIFwiJXNcIiIsIGxhYmVsLCBaRlRfVk9MX05BTUUpOworCWlmIChzdHJuY21wKGxhYmVsLCBaRlRfVk9MX05BTUUsIHN0cmxlbihaRlRfVk9MX05BTUUpKSAhPSAwKSB7CisJCSpibGtfc3ogPSAxOyAvKiBzbWFsbGVzdCBibG9jayBzaXplIHRoYXQgd2UgYWxsb3cgKi8KKwkJdmFsaWRfZm9ybWF0ID0gMDsKKwl9IGVsc2UgeworCQlUUkFDRShmdF90X25vaXNlLCAiZ290IG9sZCBzdHlsZSB6ZnRhcGUgdnRibCBlbnRyeSIpOworCQkvKiBnZXQgdGhlIGRlZmF1bHQgYmxvY2tzaXplICovCisJCS8qIHVzZSB0aGUga2VybmVsIHN0cnN0cigpICAgKi8KKwkJYmxvY2tzaXplPSBzdHJzdHIobGFiZWwsICIgYmxvY2tzaXplICIpOworCQlpZiAoYmxvY2tzaXplKSB7CisJCQlibG9ja3NpemUgKz0gc3RybGVuKCIgYmxvY2tzaXplICIpOworCQkJZm9yKCpibGtfc3o9IDA7IAorCQkJICAgICpibG9ja3NpemUgPj0gJzAnICYmICpibG9ja3NpemUgPD0gJzknOyAKKwkJCSAgICBibG9ja3NpemUrKykgeworCQkJCSpibGtfc3ogKj0gMTA7CisJCQkJKmJsa19zeiArPSAqYmxvY2tzaXplIC0gJzAnOworCQkJfQorCQkJaWYgKCpibGtfc3ogPiBaRlRfTUFYX0JMS19TWikgeworCQkJCSpibGtfc3o9IDE7CisJCQkJdmFsaWRfZm9ybWF0PSAwOworCQkJfSBlbHNlIHsKKwkJCQl2YWxpZF9mb3JtYXQgPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJKmJsa19zej0gMTsKKwkJCXZhbGlkX2Zvcm1hdD0gMDsKKwkJfQorCX0KKwlUUkFDRV9FWElUIHZhbGlkX2Zvcm1hdDsKK30KKworLyogICBjaGVjayBmb3IgYSB6ZnRhcGUgdm9sdW1lCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfdm9sdW1lKF9fdTggKmVudHJ5LCB6ZnRfdm9saW5mbyAqdm9sdW1lKQoreworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCWlmKHN0cm5jbXAoJmVudHJ5W1ZUQkxfRVhUK0VYVF9aRlRBUEVfU0lHXSwgWkZUQVBFX1NJRywKKwkJICAgc3RybGVuKFpGVEFQRV9TSUcpKSA9PSAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJnb3QgbmV3IHN0eWxlIHpmdGFwZSB2dGJsIGVudHJ5Iik7CisJCXZvbHVtZS0+YmxrX3N6ID0gR0VUMihlbnRyeSwgVlRCTF9FWFQrRVhUX1pGVEFQRV9CTEtTWik7CisJCXZvbHVtZS0+cWljMTEzID0gZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9RSUMxMTNdOworCQlUUkFDRV9FWElUIDE7CisJfSBlbHNlIHsKKwkJVFJBQ0VfRVhJVCBjaGVja192b2x1bWVfbGFiZWwoJmVudHJ5W1ZUQkxfREVTQ10sICZ2b2x1bWUtPmJsa19zeik7CisJfQorfQorCisKKy8qIGNyZWF0ZSB6ZnRhcGUgc3BlY2lmaWMgdnRibCBlbnRyeSwgdGhlIHZvbHVtZSBib3VuZHMgYXJlIGluc2VydGVkCisgKiBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiwgemZ0X2NyZWF0ZV92b2x1bWVfaGVhZGVycygpCisgKi8KK3N0YXRpYyB2b2lkIGNyZWF0ZV96ZnRfdm9sdW1lKF9fdTggKmVudHJ5LCB6ZnRfdm9saW5mbyAqdnRibCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCW1lbXNldChlbnRyeSwgMCwgVlRCTF9TSVpFKTsKKwltZW1jcHkoJmVudHJ5W1ZUQkxfU0lHXSwgVlRCTF9JRCwgNCk7CisJc3ByaW50ZigmZW50cnlbVlRCTF9ERVNDXSwgWkZUX1ZPTF9OQU1FIiAlMDNkIiwgdnRibC0+Y291bnQpOworCWVudHJ5W1ZUQkxfRkxBR1NdID0gKFZUQkxfRkxfTk9UX1ZFUklGSUVEIHwgVlRCTF9GTF9TRUdfU1BBTk5JTkcpOworCWVudHJ5W1ZUQkxfTV9OT10gPSAxOyAvKiBtdWx0aV9jYXJ0cmlkZ2VfY291bnQgKi8KKwlzdHJjcHkoJmVudHJ5W1ZUQkxfRVhUK0VYVF9aRlRBUEVfU0lHXSwgWkZUQVBFX1NJRyk7CisJUFVUMihlbnRyeSwgVlRCTF9FWFQrRVhUX1pGVEFQRV9CTEtTWiwgdnRibC0+YmxrX3N6KTsKKwlpZiAoemZ0X3FpYzExMykgeworCQlQVVQ4KGVudHJ5LCBWVEJMX0RBVEFfU0laRSwgdnRibC0+c2l6ZSk7CisJCWVudHJ5W1ZUQkxfQ01QUl0gPSBWVEJMX0NNUFJfVU5SRUc7IAorCQlpZiAodnRibC0+dXNlX2NvbXByZXNzaW9uKSB7IC8qIHVzZSBjb21wcmVzc2lvbjogKi8KKwkJCWVudHJ5W1ZUQkxfQ01QUl0gfD0gVlRCTF9DTVBSX1VTRUQ7CisJCX0KKwkJZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9RSUMxMTNdID0gMTsKKwl9IGVsc2UgeworCQlQVVQ0KGVudHJ5LCBWVEJMX0RBVEFfU0laRSwgdnRibC0+c2l6ZSk7CisJCWVudHJ5W1ZUQkxfS19DTVBSXSA9IFZUQkxfQ01QUl9VTlJFRzsgCisJCWlmICh2dGJsLT51c2VfY29tcHJlc3Npb24pIHsgLyogdXNlIGNvbXByZXNzaW9uOiAqLworCQkJZW50cnlbVlRCTF9LX0NNUFJdIHw9IFZUQkxfQ01QUl9VU0VEOworCQl9CisJfQorCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfYmlnKSB7CisJCS8qIFNDU0kgbGlrZSB2dGJsLCBzdG9yZSB0aGUgbnVtYmVyIG9mIHVzZWQKKwkJICogc2VnbWVudHMgYXMgNCBieXRlIHZhbHVlIAorCQkgKi8KKwkJUFVUNChlbnRyeSwgVlRCTF9TQ1NJX1NFR1MsIHZ0YmwtPmVuZF9zZWctdnRibC0+c3RhcnRfc2VnICsgMSk7CisJfSBlbHNlIHsKKwkJLyogbm9ybWFsLCBRSUMtODBNQyBsaWtlIHZ0YmwgCisJCSAqLworCQlQVVQyKGVudHJ5LCBWVEJMX1NUQVJULCB2dGJsLT5zdGFydF9zZWcpOworCQlQVVQyKGVudHJ5LCBWVEJMX0VORCwgdnRibC0+ZW5kX3NlZyk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qIHRoaXMgb25lIGNyZWF0ZXMgdGhlIHZvbHVtZSBoZWFkZXJzIGZvciBlYWNoIHZvbHVtZS4gSXQgaXMgYXNzdW1lZAorICogdGhhdCBidWZmZXIgYWxyZWFkeSBjb250YWlucyB0aGUgb2xkIHZvbHVtZS10YWJsZSwgc28gdGhhdCB2dGJsCisgKiBlbnRyaWVzIHdpdGhvdXQgdGhlIHpmdF92b2x1bWUgZmxhZyBzZXQgY2FuIHNhdmVseSBiZSBpZ25vcmVkLgorICovCitzdGF0aWMgdm9pZCB6ZnRfY3JlYXRlX3ZvbHVtZV9oZWFkZXJzKF9fdTggKmJ1ZmZlcikKK3sgICAKKwlfX3U4ICplbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJemZ0X3ZvbGluZm8gKnZ0Ymw7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisjaWZkZWYgWkZUX0NNQVBfSEFDSworCWlmKChzdHJuY21wKCZidWZmZXJbVlRCTF9FWFQrRVhUX1pGVEFQRV9TSUddLCBaRlRBUEVfU0lHLAorCQkgICAgc3RybGVuKFpGVEFQRV9TSUcpKSA9PSAwKSAmJiAKKwkgICBidWZmZXJbVlRCTF9FWFQrRVhUX1pGVEFQRV9DTUFQXSAhPSAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJkZWxldGluZyBjbWFwIHZvbHVtZSIpOworCQltZW1tb3ZlKGJ1ZmZlciwgYnVmZmVyICsgVlRCTF9TSVpFLAorCQkJRlRfU0VHTUVOVF9TSVpFIC0gVlRCTF9TSVpFKTsKKwl9CisjZW5kaWYKKwllbnRyeSA9IGJ1ZmZlcjsKKwlmb3IgKHRtcCA9IHpmdF9oZWFkX3Z0YmwtPm5vZGUubmV4dDsKKwkgICAgIHRtcCAhPSAmemZ0X2VvbV92dGJsLT5ub2RlOworCSAgICAgdG1wID0gdG1wLT5uZXh0KSB7CisJCXZ0YmwgPSBsaXN0X2VudHJ5KHRtcCwgemZ0X3ZvbGluZm8sIG5vZGUpOworCQkvKiB3ZSBub3cgZmlsbCBpbiB0aGUgdmFsdWVzIG9ubHkgZm9yIG5ld2x5IGNyZWF0ZWQgdm9sdW1lcy4KKwkJICovCisJCWlmICh2dGJsLT5uZXdfdm9sdW1lKSB7CisJCQljcmVhdGVfemZ0X3ZvbHVtZShlbnRyeSwgdnRibCk7CisJCQl2dGJsLT5uZXdfdm9sdW1lID0gMDsgLyogY2xlYXIgdGhlIGZsYWcgKi8KKwkJfQorCQkKKwkJRFVNUF9WT0xJTkZPKGZ0X3Rfbm9pc2UsICZlbnRyeVtWVEJMX0RFU0NdLCB2dGJsKTsKKwkJZW50cnkgKz0gVlRCTF9TSVpFOworCX0KKwltZW1zZXQoZW50cnksIDAsIEZUX1NFR01FTlRfU0laRSAtIHpmdF9lb21fdnRibC0+Y291bnQgKiBWVEJMX1NJWkUpOworCVRSQUNFX0VYSVQ7Cit9CisKKy8qICB3cml0ZSB2b2x1bWUgdGFibGUgdG8gdGFwZS4gQ2FsbHMgemZ0X2NyZWF0ZV92b2x1bWVfaGVhZGVycygpCisgKi8KK2ludCB6ZnRfdXBkYXRlX3ZvbHVtZV90YWJsZSh1bnNpZ25lZCBpbnQgc2VnbWVudCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlfX3U4ICp2ZXJpZnlfYnVmID0gTlVMTDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFX0NBVENIKHJlc3VsdCA9IGZ0YXBlX3JlYWRfc2VnbWVudChmdF9maXJzdF9kYXRhX3NlZ21lbnQsIAorCQkJCQkJemZ0X2RlYmxvY2tfYnVmLAorCQkJCQkJRlRfUkRfU0lOR0xFKSwpOworCXpmdF9jcmVhdGVfdm9sdW1lX2hlYWRlcnMoemZ0X2RlYmxvY2tfYnVmKTsKKwlUUkFDRShmdF90X25vaXNlLCAid3JpdGluZyB2b2x1bWUgdGFibGUgc2VnbWVudCAlZCIsIHNlZ21lbnQpOworCWlmICh6ZnRfdm1hbGxvY19vbmNlKCZ2ZXJpZnlfYnVmLCBGVF9TRUdNRU5UX1NJWkUpID09IDApIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X3ZlcmlmeV93cml0ZV9zZWdtZW50cyhzZWdtZW50LCAKKwkJCQkJCSAgICAgIHpmdF9kZWJsb2NrX2J1ZiwgcmVzdWx0LAorCQkJCQkJICAgICAgdmVyaWZ5X2J1ZiksCisJCQkgICAgemZ0X3ZmcmVlKCZ2ZXJpZnlfYnVmLCBGVF9TRUdNRU5UX1NJWkUpKTsKKwkJemZ0X3ZmcmVlKCZ2ZXJpZnlfYnVmLCBGVF9TRUdNRU5UX1NJWkUpOworCX0gZWxzZSB7CisJCVRSQUNFX0NBVENIKGZ0YXBlX3dyaXRlX3NlZ21lbnQoc2VnbWVudCwgemZ0X2RlYmxvY2tfYnVmLCAKKwkJCQkJCUZUX1dSX1NJTkdMRSksKTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiBub24gemZ0YXBlIHZvbHVtZXMgYXJlIGhhbmRsZWQgaW4gcmF3IG1vZGUuIFRodXMgd2UgbmVlZCB0bworICogY2FsY3VsYXRlIHRoZSByYXcgYW1vdW50IG9mIGRhdGEgY29udGFpbmVkIGluIHRob3NlIHNlZ21lbnRzLiAgCisgKi8KK3N0YXRpYyB2b2lkIGV4dHJhY3RfYWxpZW5fdm9sdW1lKF9fdTggKmVudHJ5LCB6ZnRfdm9saW5mbyAqdnRibCkKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCXZ0YmwtPnNpemUgID0gKHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcrMSkgLQorCQkgICAgICAgemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKSk7CisJdnRibC0+dXNlX2NvbXByZXNzaW9uID0gMDsKKwl2dGJsLT5xaWMxMTMgPSB6ZnRfcWljMTEzOworCWlmICh2dGJsLT5xaWMxMTMpIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgCisJCSAgICAgICJGYWtlIGFsaWVuIHZvbHVtZSdzIHNpemUgZnJvbSAiIExMX1ggIiB0byAiIExMX1gsIAorCQkgICAgICBMTChHRVQ4KGVudHJ5LCBWVEJMX0RBVEFfU0laRSkpLCBMTCh2dGJsLT5zaXplKSk7CisJfSBlbHNlIHsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwKKwkJICAgICAgIkZha2UgYWxpZW4gdm9sdW1lJ3Mgc2l6ZSBmcm9tICVkIHRvICIgTExfWCwgCisJCSAgICAgIChpbnQpR0VUNChlbnRyeSwgVlRCTF9EQVRBX1NJWkUpLCBMTCh2dGJsLT5zaXplKSk7CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKworLyogZXh0cmFjdCBhbiB6ZnRhcGUgc3BlY2lmaWMgdm9sdW1lCisgKi8KK3N0YXRpYyB2b2lkIGV4dHJhY3RfemZ0X3ZvbHVtZShfX3U4ICplbnRyeSwgemZ0X3ZvbGluZm8gKnZ0YmwpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAodnRibC0+cWljMTEzKSB7CisJCXZ0YmwtPnNpemUgPSBHRVQ4KGVudHJ5LCBWVEJMX0RBVEFfU0laRSk7CisJCXZ0YmwtPnVzZV9jb21wcmVzc2lvbiA9IAorCQkJKGVudHJ5W1ZUQkxfQ01QUl0gJiBWVEJMX0NNUFJfVVNFRCkgIT0gMDsgCisJfSBlbHNlIHsKKwkJdnRibC0+c2l6ZSA9IEdFVDQoZW50cnksIFZUQkxfREFUQV9TSVpFKTsKKwkJaWYgKGVudHJ5W1ZUQkxfS19DTVBSXSAmIFZUQkxfQ01QUl9VTlJFRykgeworCQkJdnRibC0+dXNlX2NvbXByZXNzaW9uID0gCisJCQkJKGVudHJ5W1ZUQkxfS19DTVBSXSAmIFZUQkxfQ01QUl9VU0VEKSAhPSAwOworCQl9IGVsc2UgaWYgKGVudHJ5W1ZUQkxfQ01QUl0gJiBWVEJMX0NNUFJfVU5SRUcpIHsKKwkJCXZ0YmwtPnVzZV9jb21wcmVzc2lvbiA9IAorCQkJCShlbnRyeVtWVEJMX0NNUFJdICYgVlRCTF9DTVBSX1VTRUQpICE9IDA7IAorCQl9IGVsc2UgeworCQkJVFJBQ0UoZnRfdF93YXJuLCAiR2VlaCEgVGhlcmUgaXMgc29tZXRoaW5nIHdyb25nOlxuIgorCQkJICAgICAgS0VSTl9JTkZPICJRSUMgY29tcHJlc3Npb24gKFJldiA9IEspOiAleFxuIgorCQkJICAgICAgS0VSTl9JTkZPICJRSUMgY29tcHJlc3Npb24gKFJldiA+IEspOiAleCIsCisJCQkgICAgICBlbnRyeVtWVEJMX0tfQ01QUl0sIGVudHJ5W1ZUQkxfQ01QUl0pOworCQl9CisJfQorCVRSQUNFX0VYSVQ7Cit9CisKKy8qIGV4dHJhY3QgdGhlIHZvbHVtZSB0YWJsZSBmcm9tIGJ1ZmZlci4gImJ1ZmZlciIgbXVzdCBhbHJlYWR5IGNvbnRhaW4KKyAqIHRoZSB2dGJsLXNlZ21lbnQgCisgKi8KK2ludCB6ZnRfZXh0cmFjdF92b2x1bWVfaGVhZGVycyhfX3U4ICpidWZmZXIpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBfX3U4ICplbnRyeTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwl6ZnRfaW5pdF92dGJsKCk7CisJZW50cnkgPSBidWZmZXI7CisjaWZkZWYgWkZUX0NNQVBfSEFDSworCWlmICgoc3RybmNtcCgmZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9TSUddLCBaRlRBUEVfU0lHLAorCQkgICAgIHN0cmxlbihaRlRBUEVfU0lHKSkgPT0gMCkgJiYKKwkgICAgZW50cnlbVlRCTF9FWFQrRVhUX1pGVEFQRV9DTUFQXSAhPSAwKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJpZ25vcmluZyBjbWFwIHZvbHVtZSIpOworCQllbnRyeSArPSBWVEJMX1NJWkU7CisJfSAKKyNlbmRpZgorCS8qIHRoZSBlbmQgb2YgdGhlIHZ0YmwgaXMgaW5kaWNhdGVkIGJ5IGFuIGludmFsaWQgc2lnbmF0dXJlIAorCSAqLworCXdoaWxlICh2dGJsX3NpZ25hdHVyZV92YWxpZCgmZW50cnlbVlRCTF9TSUddKSAmJgorCSAgICAgICAoZW50cnkgLSBidWZmZXIpIDwgRlRfU0VHTUVOVF9TSVpFKSB7CisJCXpmdF9uZXdfdnRibF9lbnRyeSgpOworCQlpZiAoZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgeworCQkJLyogU0NTSSBsaWtlIHZ0YmwsIHN0b3JlcyBvbmx5IHRoZSBudW1iZXIgb2YKKwkJCSAqIHNlZ21lbnRzIHVzZWQgCisJCQkgKi8KKwkJCXVuc2lnbmVkIGludCBudW1fc2VnbWVudHM9IEdFVDQoZW50cnksIFZUQkxfU0NTSV9TRUdTKTsKKwkJCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyA9IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnOworCQkJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyA9IAorCQkJCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyArIG51bV9zZWdtZW50cyAtIDE7CisJCX0gZWxzZSB7CisJCQkvKiBgbm9ybWFsJywgUUlDLTgwIGxpa2UgdnRibCAKKwkJCSAqLworCQkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnID0gR0VUMihlbnRyeSwgVlRCTF9TVEFSVCk7CisJCQl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgPSBHRVQyKGVudHJ5LCBWVEJMX0VORCk7CisJCX0KKwkJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgID0gemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyArIDE7CisJCS8qIGNoZWNrIGlmIHdlIGNyZWF0ZWQgdGhpcyB2b2x1bWUgYW5kIGdldCB0aGUKKwkJICogYmxrX3N6IAorCQkgKi8KKwkJemZ0X2xhc3RfdnRibC0+emZ0X3ZvbHVtZSA9IGNoZWNrX3ZvbHVtZShlbnRyeSwgemZ0X2xhc3RfdnRibCk7CisJCWlmICh6ZnRfbGFzdF92dGJsLT56ZnRfdm9sdW1lID09IDApIHsKKwkJCWV4dHJhY3RfYWxpZW5fdm9sdW1lKGVudHJ5LCB6ZnRfbGFzdF92dGJsKTsKKwkJfSBlbHNlIHsKKwkJCWV4dHJhY3RfemZ0X3ZvbHVtZShlbnRyeSwgemZ0X2xhc3RfdnRibCk7CisJCX0KKwkJRFVNUF9WT0xJTkZPKGZ0X3Rfbm9pc2UsICZlbnRyeVtWVEJMX0RFU0NdLCB6ZnRfbGFzdF92dGJsKTsKKwkJZW50cnkgKz1WVEJMX1NJWkU7CisJfQorI2lmIDAKKy8qCisgKiAgdW5kZWZpbmUgdG8gdGVzdCBlbmQgb2YgdGFwZSBoYW5kbGluZworICovCisJemZ0X25ld192dGJsX2VudHJ5KCk7CisJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnID0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWc7CisJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgLSAxMDsKKwl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgICAgICAgPSB6ZnRfYmxrX3N6OworCXpmdF9sYXN0X3Z0YmwtPnpmdF92b2x1bWUgICAgICA9IDE7CisJemZ0X2xhc3RfdnRibC0+cWljMTEzICAgICAgICAgID0gemZ0X3FpYzExMzsKKwl6ZnRfbGFzdF92dGJsLT5zaXplID0gKHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcrMSkKKwkJCSAgICAgICAtIHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZykpOworI2VuZGlmCisJVFJBQ0VfRVhJVCAwOworfQorCisvKiB0aGlzIGZ1bmN0aW9ucyB0cmFuc2xhdGVzIHRoZSBmYWlsZWRfc2VjdG9yX2xvZywgbWlzdXNlZCBhcworICogRU9GLW1hcmtlciBsaXN0LCBpbnRvIGEgdmlydHVhbCB2b2x1bWUgdGFibGUuIFRoZSB0YWJsZSBtdXN0bid0IGJlCisgKiB3cml0dGVuIHRvIHRhcGUsIGJlY2F1c2UgdGhpcyB3b3VsZCBvY2N1cHkgdGhlIGZpcnN0IGRhdGEgc2VnbWVudCwKKyAqIHdoaWNoIHNob3VsZCBiZSB0aGUgdm9sdW1lIHRhYmxlLCBidXQgaXMgYWN0dWFsbHkgdGhlIGZpcnN0IHNlZ21lbnQKKyAqIHRoYXQgaXMgZmlsbGVkIHdpdGggZGF0YSAod2hlbiB1c2luZyBzdGFuZGFyZCBmdGFwZSkuICBXZSBhc3N1bWUsCisgKiB0aGF0IHdlIGdldCBhIG5vbi1lbXB0eSBmYWlsZWRfc2VjdG9yX2xvZy4KKyAqLworaW50IHpmdF9mYWtlX3ZvbHVtZV9oZWFkZXJzIChlb2ZfbWFya191bmlvbiAqZW9mX21hcCwgaW50IG51bV9mYWlsZWRfc2VjdG9ycykKK3sKKwl1bnNpZ25lZCBpbnQgc2VnbWVudCwgc2VjdG9yOworCWludCBoYXZlX2VvbSA9IDA7CisJaW50IHZvbF9ubzsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCWlmICgobnVtX2ZhaWxlZF9zZWN0b3JzID49IDIpICYmCisJICAgIChHRVQyKCZlb2ZfbWFwW251bV9mYWlsZWRfc2VjdG9ycyAtIDFdLm1hcmsuc2VnbWVudCwgMCkgCisJICAgICA9PSAKKwkgICAgIEdFVDIoJmVvZl9tYXBbbnVtX2ZhaWxlZF9zZWN0b3JzIC0gMl0ubWFyay5zZWdtZW50LCAwKSArIDEpICYmCisJICAgIChHRVQyKCZlb2ZfbWFwW251bV9mYWlsZWRfc2VjdG9ycyAtIDFdLm1hcmsuZGF0ZSwgMCkgPT0gMSkpIHsKKwkJLyogdGhpcyBzaG91bGQgYmUgZW9tLiBXZSBrZWVwIHRoZSByZW1haW5kZXIgb2YgdGhlCisJCSAqIHRhcGUgYXMgYW5vdGhlciB2b2x1bWUuCisJCSAqLworCQloYXZlX2VvbSA9IDE7CisJfQorCXpmdF9pbml0X3Z0YmwoKTsKKwl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsKKwlmb3Iodm9sX25vID0gMDsgdm9sX25vIDwgbnVtX2ZhaWxlZF9zZWN0b3JzIC0gaGF2ZV9lb207IHZvbF9ubyArKykgeworCQl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKKworCQlzZWdtZW50ID0gR0VUMigmZW9mX21hcFt2b2xfbm9dLm1hcmsuc2VnbWVudCwgMCk7CisJCXNlY3RvciAgPSBHRVQyKCZlb2ZfbWFwW3ZvbF9ub10ubWFyay5kYXRlLCAwKTsKKworCQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgID0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWc7CisJCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICAgPSBzZWdtZW50OworCQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSBzZWdtZW50ICsgMTsKKwkJemZ0X2xhc3RfdnRibC0+YmxrX3N6ICAgICA9IDE7CisJCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICAgPSAKKwkJCSh6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5lbmRfc2VnKQorCQkJIC0gemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKQorCQkJICsgKHNlY3Rvci0xKSAqIEZUX1NFQ1RPUl9TSVpFKTsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgCisJCSAgICAgICJmYWlsZWQgc2VjdG9yIGxvZzogc2VnbWVudDogJWQsIHNlY3RvcjogJWQiLCAKKwkJICAgICAgc2VnbWVudCwgc2VjdG9yKTsKKwkJRFVNUF9WT0xJTkZPKGZ0X3Rfbm9pc2UsICJGYWtlZCB2b2x1bWUiLCB6ZnRfbGFzdF92dGJsKTsKKwl9CisJaWYgKCFoYXZlX2VvbSkgeworCQl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKKwkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnID0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWc7CisJCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50OworCQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCArIDE7CisJCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICA9IHpmdF9jYXBhY2l0eTsKKwkJemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgLT0gemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKTsKKwkJemZ0X2xhc3RfdnRibC0+YmxrX3N6ICAgID0gMTsKKwkJRFVNUF9WT0xJTkZPKGZ0X3Rfbm9pc2UsICJGYWtlZCB2b2x1bWUiLHpmdF9sYXN0X3Z0YmwpOworCX0KKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qIHVwZGF0ZSB0aGUgaW50ZXJuYWwgdm9sdW1lIHRhYmxlCisgKgorICogaWYgYmVmb3JlIHN0YXJ0IG9mIGxhc3Qgdm9sdW1lOiBlcmFzZSBhbGwgZm9sbG93aW5nIHZvbHVtZXMgaWYKKyAqIGluc2lkZSBhIHZvbHVtZTogc2V0IGVuZCBvZiB2b2x1bWUgdG8gaW5maW5pdHkKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBldmVyeSB0aW1lIF9mdGFwZV93cml0ZSgpIGlzCisgKiBjYWxsZWQKKyAqCisgKiByZXR1cm46IDAgaWYgbm8gbmV3IHZvbHVtZSB3YXMgY3JlYXRlZCwgMSBpZiBhIG5ldyB2b2x1bWUgd2FzCisgKiBjcmVhdGVkCisgKgorICogTk9URTogd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgemZ0X21vZGUgYXMgZnRhcGVfd3JpdGUoKSBkb2VzCisgKiB0aGF0IGFscmVhZHkuIFRoaXMgZnVuY3Rpb24gZ2V0cyBuZXZlciBjYWxsZWQgd2l0aG91dCBhY2Nlc3NpbmcKKyAqIHpmdGFwZSB2aWEgdGhlICpxZnQqIGRldmljZXMgCisgKi8KKworaW50IHpmdF9vcGVuX3ZvbHVtZSh6ZnRfcG9zaXRpb24gKnBvcywgaW50IGJsa19zeiwgaW50IHVzZV9jb21wcmVzc2lvbikKK3sgCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJaWYgKCF6ZnRfcWljX21vZGUpIHsKKwkJVFJBQ0VfRVhJVCAwOworCX0KKwlpZiAoemZ0X3RhcGVfYXRfbGJvdChwb3MpKSB7CisJCXpmdF9pbml0X3Z0YmwoKTsKKwkJaWYoemZ0X29sZF9mdGFwZSkgeworCQkJLyogY2xlYXIgb2xkIGZ0YXBlJ3MgZW9mIG1hcmtzICovCisJCQl6ZnRfY2xlYXJfZnRhcGVfZmlsZV9tYXJrcygpOworCQkJemZ0X29sZF9mdGFwZSA9IDA7IC8qIG5vIGxvbmdlciBvbGQgZnRhcGUgKi8KKwkJfQorCQl6ZnRfcmVzZXRfcG9zaXRpb24ocG9zKTsKKwl9CisJaWYgKHBvcy0+c2VnX3BvcyAhPSB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICsgMSkgeworCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2J1ZywgCisJCSAgICAgICJCVUc6IHNlZ19wb3M6ICVkLCB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnOiAlZCIsIAorCQkgICAgICBwb3MtPnNlZ19wb3MsIHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcpOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJVFJBQ0UoZnRfdF9ub2lzZSwgImNyZWF0ZSBuZXcgdm9sdW1lIik7CisJaWYgKHpmdF9lb21fdnRibC0+Y291bnQgPj0gWkZUX01BWF9WT0xVTUVTKSB7CisJCVRSQUNFX0FCT1JUKC1FTk9TUEMsIGZ0X3RfZXJyLAorCQkJICAgICJFcnJvcjogbWF4bWltYWwgbnVtYmVyIG9mIHZvbHVtZXMgZXhoYXVzdGVkICIKKwkJCSAgICAiKG1heG1pbXVtIGlzICVkKSIsIFpGVF9NQVhfVk9MVU1FUyk7CisJfQorCXpmdF9uZXdfdnRibF9lbnRyeSgpOworCXBvcy0+dm9sdW1lX3BvcyA9IHBvcy0+c2VnX2J5dGVfcG9zID0gMDsKKwl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgICAgICAgPSBwb3MtPnNlZ19wb3M7CisJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgICAgICAgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQ7IC8qIGluZmluaXR5ICovCisJemZ0X2xhc3RfdnRibC0+YmxrX3N6ICAgICAgICAgID0gYmxrX3N6OworCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgICAgICAgICA9IHpmdF9jYXBhY2l0eTsKKwl6ZnRfbGFzdF92dGJsLT56ZnRfdm9sdW1lICAgICAgPSAxOworCXpmdF9sYXN0X3Z0YmwtPnVzZV9jb21wcmVzc2lvbiA9IHVzZV9jb21wcmVzc2lvbjsKKwl6ZnRfbGFzdF92dGJsLT5xaWMxMTMgICAgICAgICAgPSB6ZnRfcWljMTEzOworCXpmdF9sYXN0X3Z0YmwtPm5ld192b2x1bWUgICAgICA9IDE7CisJemZ0X2xhc3RfdnRibC0+b3BlbiAgICAgICAgICAgID0gMTsKKwl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAxOworCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKKwlUUkFDRV9FWElUIDA7Cit9CisKKy8qICBwZXJmb3JtIG10ZnNmLCBtdGJzZiwgbm90IGFsbG93ZWQgd2l0aG91dCB6ZnRfcWljX21vZGUKKyAqLworaW50IHpmdF9za2lwX3ZvbHVtZXMoaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcykKK3sgCisJY29uc3QgemZ0X3ZvbGluZm8gKnZ0Ymw7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgImNvdW50OiAlZCIsIGNvdW50KTsKKwkKKwl2dGJsPSB6ZnRfZmluZF92b2x1bWUocG9zLT5zZWdfcG9zKTsKKwl3aGlsZSAoY291bnQgPiAwICYmIHZ0YmwgIT0gemZ0X2VvbV92dGJsKSB7CisJCXZ0YmwgPSBsaXN0X2VudHJ5KHZ0YmwtPm5vZGUubmV4dCwgemZ0X3ZvbGluZm8sIG5vZGUpOworCQljb3VudCAtLTsKKwl9CisJd2hpbGUgKGNvdW50IDwgMCAmJiB2dGJsICE9IHpmdF9maXJzdF92dGJsKSB7CisJCXZ0YmwgPSBsaXN0X2VudHJ5KHZ0YmwtPm5vZGUucHJldiwgemZ0X3ZvbGluZm8sIG5vZGUpOworCQljb3VudCArKzsKKwl9CisJcG9zLT5zZWdfcG9zICAgICAgICA9IHZ0YmwtPnN0YXJ0X3NlZzsKKwlwb3MtPnNlZ19ieXRlX3BvcyAgID0gMDsKKwlwb3MtPnZvbHVtZV9wb3MgICAgID0gMDsKKwlwb3MtPnRhcGVfcG9zICAgICAgID0gemZ0X2NhbGNfdGFwZV9wb3MocG9zLT5zZWdfcG9zKTsKKwl6ZnRfanVzdF9iZWZvcmVfZW9mID0gdnRibC0+c2l6ZSA9PSAwOworCWlmICh6ZnRfY21wcl9vcHMpIHsKKwkJKCp6ZnRfY21wcl9vcHMtPnJlc2V0KSgpOworCX0KKwl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7IC8qIG5vIG5lZWQgdG8ga2VlcCBjYWNoZSAqLworCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZXBvc2l0aW9uaW5nIHRvOlxuIgorCSAgICAgIEtFUk5fSU5GTyAiemZ0X3NlZ19wb3MgICAgICAgIDogJWRcbiIKKwkgICAgICBLRVJOX0lORk8gInpmdF9zZWdfYnl0ZV9wb3MgICA6ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICJ6ZnRfdGFwZV9wb3MgICAgICAgOiAiIExMX1ggIlxuIgorCSAgICAgIEtFUk5fSU5GTyAiemZ0X3ZvbHVtZV9wb3MgICAgIDogIiBMTF9YICJcbiIKKwkgICAgICBLRVJOX0lORk8gImZpbGUgbnVtYmVyICAgICAgICA6ICVkIiwKKwkgICAgICBwb3MtPnNlZ19wb3MsIHBvcy0+c2VnX2J5dGVfcG9zLCAKKwkgICAgICBMTChwb3MtPnRhcGVfcG9zKSwgTEwocG9zLT52b2x1bWVfcG9zKSwgdnRibC0+Y291bnQpOworCXpmdF9yZXNpZCA9IGNvdW50IDwgMCA/IC1jb3VudCA6IGNvdW50OworCVRSQUNFX0VYSVQgemZ0X3Jlc2lkID8gLUVJTlZBTCA6IDA7Cit9CisKKy8qIHRoZSBmb2xsb3dpbmcgc2ltcGx5IHJldHVybnMgdGhlIHJhdyBkYXRhIHBvc2l0aW9uIG9mIHRoZSBFT00KKyAqIG1hcmtlciwgTVRJT0NTSVpFIGlvY3RsIAorICovCitfX3M2NCB6ZnRfZ2V0X2VvbV9wb3Modm9pZCkKK3sKKwlpZiAoemZ0X3FpY19tb2RlKSB7CisJCXJldHVybiB6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyk7CisJfSBlbHNlIHsKKwkJLyogdGhlcmUgaXMgb25seSBvbmUgdm9sdW1lIGluIHJhdyBtb2RlICovCisJCXJldHVybiB6ZnRfY2FwYWNpdHk7CisJfQorfQorCisvKiBza2lwIHRvIGVvbSwgdXNlZCBmb3IgTVRFT00KKyAqLwordm9pZCB6ZnRfc2tpcF90b19lb20oemZ0X3Bvc2l0aW9uICpwb3MpCit7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisJcG9zLT5zZWdfcG9zICAgICAgPSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZzsKKwlwb3MtPnNlZ19ieXRlX3BvcyA9IAorCQlwb3MtPnZvbHVtZV9wb3MgICAgID0gCisJCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAwOworCXBvcy0+dGFwZV9wb3MgPSB6ZnRfY2FsY190YXBlX3Bvcyhwb3MtPnNlZ19wb3MpOworCVRSQUNFKGZ0X3Rfbm9pc2UsICJmdGFwZSBwb3NpdGlvbmVkIHRvIHNlZ21lbnQgJWQsIGRhdGEgcG9zICIgTExfWCwgCisJICAgICAgcG9zLT5zZWdfcG9zLCBMTChwb3MtPnRhcGVfcG9zKSk7CisJVFJBQ0VfRVhJVDsKK30KKworLyogIHdyaXRlIGFuIEVPRi1tYXJrZXIgYnkgc2V0dGluZyB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnIHRvIHNlZ19wb3MuCisgKiAgTk9URTogdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgemZ0X2xhc3RfdnRibCBwb2ludHMgdG8gYSB2YWxpZAorICogIHZ0YmwgZW50cnkKKyAqCisgKiAgTk9URTogdGhpcyByb3V0aW5lIGFsd2F5cyBwb3NpdGlvbnMgYmVmb3JlIHRoZSBFT0YgbWFya2VyCisgKi8KK2ludCB6ZnRfY2xvc2Vfdm9sdW1lKHpmdF9wb3NpdGlvbiAqcG9zKQoreworCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoemZ0X3Z0YmxfZW1wdHkgfHwgIXpmdF9sYXN0X3Z0YmwtPm9wZW4pIHsgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIlRoZXJlIGFyZSBubyB2b2x1bWVzIHRvIGZpbmlzaCIpOworCQlUUkFDRV9FWElUIC1FSU87CisJfQorCWlmIChwb3MtPnNlZ19ieXRlX3BvcyA9PSAwICYmIAorCSAgICBwb3MtPnNlZ19wb3MgIT0gemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnKSB7CisJCXBvcy0+c2VnX3BvcyAtLTsKKwkJcG9zLT5zZWdfYnl0ZV9wb3MgICAgICA9IHpmdF9nZXRfc2VnX3N6KHBvcy0+c2VnX3Bvcyk7CisJfQorCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICA9IHBvcy0+c2VnX3BvczsKKwl6ZnRfbGFzdF92dGJsLT5zaXplICAgICAgPSBwb3MtPnZvbHVtZV9wb3M7CisJemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkID0gMTsKKwl6ZnRfanVzdF9iZWZvcmVfZW9mICAgICAgPSAxOworCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgKyAxOworCXpmdF9sYXN0X3Z0YmwtPm9wZW4gICAgICA9IDA7IC8qIGNsb3NlZCAqLworCVRSQUNFX0VYSVQgMDsKK30KKworLyogd3JpdGUgY291bnQgZmlsZS1tYXJrcyBhdCBjdXJyZW50IHBvc2l0aW9uLiAKKyAqCisgKiAgVGhlIHRhcGUgaXMgcG9zaXRpb25lZCBhZnRlciB0aGUgZW9mLW1hcmtlciwgdGhhdCBpcyBhdCBieXRlIDAgb2YKKyAqICB0aGUgc2VnbWVudCBmb2xsb3dpbmcgdGhlIGVvZi1tYXJrZXIKKyAqCisgKiAgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGFsbG93ZWQgaW4gemZ0X3FpY19tb2RlCisgKgorICogIE9ubHkgYWxsb3dlZCB3aGVuIHRhcGUgaXMgYXQgQk9UIG9yIEVPRC4KKyAqLworaW50IHpmdF93ZW9mKHVuc2lnbmVkIGludCBjb3VudCwgemZ0X3Bvc2l0aW9uICpwb3MpCit7CisJCisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwlpZiAoIWNvdW50KSB7IC8qIHdyaXRlIHplcm8gRU9GIG1hcmtzIHNob3VsZCBiZSBhIHJlYWwgbm8tb3AgKi8KKwkJVFJBQ0VfRVhJVCAwOworCX0KKwl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAxOworCWlmICh6ZnRfdGFwZV9hdF9sYm90KHBvcykpIHsKKwkJemZ0X2luaXRfdnRibCgpOworCQlpZih6ZnRfb2xkX2Z0YXBlKSB7CisJCQkvKiBjbGVhciBvbGQgZnRhcGUncyBlb2YgbWFya3MgKi8KKwkJCXpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKCk7CisJCQl6ZnRfb2xkX2Z0YXBlID0gMDsgICAgLyogbm8gbG9uZ2VyIG9sZCBmdGFwZSAqLworCQl9CisJfQorCWlmICh6ZnRfbGFzdF92dGJsLT5vcGVuKSB7CisJCXpmdF9jbG9zZV92b2x1bWUocG9zKTsKKwkJemZ0X21vdmVfcGFzdF9lb2YocG9zKTsKKwkJY291bnQgLS07CisJfQorCS8qIG5vdyBpdCdzIGVhc3ksIGp1c3QgYXBwZW5kIGVvZi1tYXJrcywgdGhhdCBpcyBlbXB0eQorCSAqIHZvbHVtZXMsIHRvIHRoZSBlbmQgb2YgdGhlIGFscmVhZHkgcmVjb3JkZWQgbWVkaWEuCisJICovCisJd2hpbGUgKGNvdW50ID4gMCAmJiAKKwkgICAgICAgcG9zLT5zZWdfcG9zIDw9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICYmIAorCSAgICAgICB6ZnRfZW9tX3Z0YmwtPmNvdW50IDwgWkZUX01BWF9WT0xVTUVTKSB7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsCisJCSAgICAgICJXcml0aW5nIHplcm8gc2l6ZWQgZmlsZSBhdCBzZWdtZW50ICVkIiwgcG9zLT5zZWdfcG9zKTsKKwkJemZ0X25ld192dGJsX2VudHJ5KCk7CisJCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyAgICAgICA9IHBvcy0+c2VnX3BvczsKKwkJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgICAgICAgID0gcG9zLT5zZWdfcG9zOworCQl6ZnRfbGFzdF92dGJsLT5zaXplICAgICAgICAgICAgPSAwOworCQl6ZnRfbGFzdF92dGJsLT5ibGtfc3ogICAgICAgICAgPSB6ZnRfYmxrX3N6OworCQl6ZnRfbGFzdF92dGJsLT56ZnRfdm9sdW1lICAgICAgPSAxOworCQl6ZnRfbGFzdF92dGJsLT51c2VfY29tcHJlc3Npb24gPSAwOworCQlwb3MtPnRhcGVfcG9zICs9IHpmdF9nZXRfc2VnX3N6KHBvcy0+c2VnX3Bvcyk7CisJCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnID0gKysgcG9zLT5zZWdfcG9zOworCQljb3VudCAtLTsKKwl9IAorCWlmIChjb3VudCA+IDApIHsKKwkJLyogIHRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllczogZW5kIG9mIHRhcGUsIG9yIHRoZQorCQkgKiAgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgaXMgZXhoYXVzdGVkLgorCQkgKi8KKwkJemZ0X3Jlc2lkID0gY291bnQ7CisJCVRSQUNFKGZ0X3Rfbm9pc2UsIk51bWJlciBvZiBtYXJrcyBOT1Qgd3JpdHRlbjogJWQiLCB6ZnRfcmVzaWQpOworCQlpZiAoemZ0X2VvbV92dGJsLT5jb3VudCA9PSBaRlRfTUFYX1ZPTFVNRVMpIHsKKwkJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3Rfd2FybiwKKwkJCQkgICAgIm1heGltdW0gYWxsb3dlZCBudW1iZXIgb2YgZmlsZXMgIgorCQkJCSAgICAiZXhoYXVzdGVkOiAlZCIsIFpGVF9NQVhfVk9MVU1FUyk7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9BQk9SVCgtRU5PU1BDLAorCQkJCSAgICBmdF90X25vaXNlLCAicmVhY2hlZCBlbmQgb2YgdGFwZSIpOworCQl9CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworY29uc3QgemZ0X3ZvbGluZm8gKnpmdF9maW5kX3ZvbHVtZSh1bnNpZ25lZCBpbnQgc2VnX3BvcykKK3sKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlUUkFDRShmdF90X2FueSwgImNhbGxlZCB3aXRoIHNlZ19wb3MgJWQiLHNlZ19wb3MpOworCWlmICghemZ0X3FpY19tb2RlKSB7CisJCWlmIChzZWdfcG9zID4gZnRfbGFzdF9kYXRhX3NlZ21lbnQpIHsKKwkJCVRSQUNFX0VYSVQgJmVvdF92dGJsOworCQl9CisJCXRhcGVfdnRibC5ibGtfc3ogPSAgemZ0X2Jsa19zejsKKwkJVFJBQ0VfRVhJVCAmdGFwZV92dGJsOworCX0KKwlpZiAoc2VnX3BvcyA8IHpmdF9maXJzdF92dGJsLT5zdGFydF9zZWcpIHsKKwkJVFJBQ0VfRVhJVCAoY3VyX3Z0YmwgPSB6ZnRfZmlyc3RfdnRibCk7CisJfQorCXdoaWxlIChzZWdfcG9zID4gY3VyX3Z0YmwtPmVuZF9zZWcpIHsKKwkJY3VyX3Z0YmwgPSBsaXN0X2VudHJ5KGN1cl92dGJsLT5ub2RlLm5leHQsIHpmdF92b2xpbmZvLCBub2RlKTsKKwkJVFJBQ0UoZnRfdF9ub2lzZSwgIiVkIC0gJWQiLCBjdXJfdnRibC0+c3RhcnRfc2VnLCBjdXJfdnRibC0+ZW5kX3NlZyk7CisJfQorCXdoaWxlIChzZWdfcG9zIDwgY3VyX3Z0YmwtPnN0YXJ0X3NlZykgeworCQljdXJfdnRibCA9IGxpc3RfZW50cnkoY3VyX3Z0YmwtPm5vZGUucHJldiwgemZ0X3ZvbGluZm8sIG5vZGUpOworCQlUUkFDRShmdF90X25vaXNlLCAiJWQgLSAlZCIsIGN1cl92dGJsLT5zdGFydF9zZWcsIGN1cl92dGJsLT5lbmRfc2VnKTsKKwl9CisJaWYgKHNlZ19wb3MgPiBjdXJfdnRibC0+ZW5kX3NlZyB8fCBzZWdfcG9zIDwgY3VyX3Z0YmwtPnN0YXJ0X3NlZykgeworCQlUUkFDRShmdF90X2J1ZywgIlRoaXMgY2Fubm90IGhhcHBlbiIpOworCX0KKwlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgIiIsIGN1cl92dGJsKTsKKwlUUkFDRV9FWElUIGN1cl92dGJsOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIHJlYWxseSBhc3N1bWVzIHRoYXQgd2UgYXJlIGp1c3QgYmVmb3JlIGVvZgorICovCit2b2lkIHpmdF9tb3ZlX3Bhc3RfZW9mKHpmdF9wb3NpdGlvbiAqcG9zKQoreyAKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3Rfbm9pc2UsICJvbGQgc2VnLiBwb3M6ICVkIiwgcG9zLT5zZWdfcG9zKTsKKwlwb3MtPnRhcGVfcG9zICs9IHpmdF9nZXRfc2VnX3N6KHBvcy0+c2VnX3BvcysrKSAtIHBvcy0+c2VnX2J5dGVfcG9zOworCXBvcy0+c2VnX2J5dGVfcG9zID0gMDsKKwlwb3MtPnZvbHVtZV9wb3MgICA9IDA7CisJaWYgKHpmdF9jbXByX29wcykgeworCQkoKnpmdF9jbXByX29wcy0+cmVzZXQpKCk7CisJfQorCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAgMDsKKwl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7IC8qIG5vIG5lZWQgdG8gY2FjaGUgaXQgYW55bW9yZSAqLworCVRSQUNFKGZ0X3Rfbm9pc2UsICJuZXcgc2VnLiBwb3M6ICVkIiwgcG9zLT5zZWdfcG9zKTsKKwlUUkFDRV9FWElUOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMWQxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmgKQEAgLTAsMCArMSwyMjcgQEAKKyNpZm5kZWYgX1pGVEFQRV9WVEJMX0gKKyNkZWZpbmUgX1pGVEFQRV9WVEJMX0gKKworLyoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcgIENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMyAkCisgKiAkRGF0ZTogMTk5Ny8xMC8yOCAxNDozMDowOSAkCisgKgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhIHZvbHVtZSB0YWJsZSBhcyBkZWZpbmVkIGluIHRoZSBRSUMtODAKKyAqICAgICAgZGV2ZWxvcG1lbnQgc3RhbmRhcmRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS10cmFjaW5nLmgiCisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1ydy5oIgorCisjZGVmaW5lIFZUQkxfU0laRSAxMjggLyogYnl0ZXMgKi8KKworLyogVGhlIGZvbGxvd2luZyBhcmUgb2Zmc2V0cyBpbiB0aGUgdnRibC4gICovCisjZGVmaW5lIFZUQkxfU0lHICAgMAorI2RlZmluZSBWVEJMX1NUQVJUIDQKKyNkZWZpbmUgVlRCTF9FTkQgICA2CisjZGVmaW5lIFZUQkxfREVTQyAgOAorI2RlZmluZSBWVEJMX0RBVEUgIDUyCisjZGVmaW5lIFZUQkxfRkxBR1MgNTYKKyNkZWZpbmUgVlRCTF9GTF9WRU5ET1JfU1BFQ0lGSUMgKDE8PDApCisjZGVmaW5lIFZUQkxfRkxfTVVUTElfQ0FSVFJJREdFICgxPDwxKQorI2RlZmluZSBWVEJMX0ZMX05PVF9WRVJJRklFRCAgICAoMTw8MikKKyNkZWZpbmUgVlRCTF9GTF9SRURJUl9JTkhJQklUICAgKDE8PDMpCisjZGVmaW5lIFZUQkxfRkxfU0VHX1NQQU5OSU5HICAgICgxPDw0KQorI2RlZmluZSBWVEJMX0ZMX0RJUkVDVE9SWV9MQVNUICAoMTw8NSkKKyNkZWZpbmUgVlRCTF9GTF9SRVNFUlZFRF82ICAgICAgKDE8PDYpCisjZGVmaW5lIFZUQkxfRkxfUkVTRVJWRURfNyAgICAgICgxPDw3KQorI2RlZmluZSBWVEJMX01fTk8gIDU3CisjZGVmaW5lIFZUQkxfRVhUICAgNTgKKyNkZWZpbmUgRVhUX1pGVEFQRV9TSUcgICAgIDAKKyNkZWZpbmUgRVhUX1pGVEFQRV9CTEtTWiAgMTAKKyNkZWZpbmUgRVhUX1pGVEFQRV9DTUFQICAgMTIKKyNkZWZpbmUgRVhUX1pGVEFQRV9RSUMxMTMgMTMKKyNkZWZpbmUgVlRCTF9QV0QgICA4NAorI2RlZmluZSBWVEJMX0RJUl9TSVpFIDkyCisjZGVmaW5lIFZUQkxfREFUQV9TSVpFIDk2CisjZGVmaW5lIFZUQkxfT1NfVkVSU0lPTiAxMDQKKyNkZWZpbmUgVlRCTF9TUkNfRFJJVkUgIDEwNgorI2RlZmluZSBWVEJMX0RFViAgICAgICAgMTIyCisjZGVmaW5lIFZUQkxfUkVTRVJWRURfMSAxMjMKKyNkZWZpbmUgVlRCTF9DTVBSICAgICAgIDEyNAorI2RlZmluZSBWVEJMX0NNUFJfVU5SRUcgMHgzZgorI2RlZmluZSBWVEJMX0NNUFJfVVNFRCAgMHg4MAorI2RlZmluZSBWVEJMX0ZNVCAgICAgICAgMTI1CisjZGVmaW5lIFZUQkxfUkVTRVJWRURfMiAxMjYKKyNkZWZpbmUgVlRCTF9SRVNFUlZFRF8zIDEyNworLyogY29tcGF0aWJpbGl0eSB3aXRoIHByZSByZXZpc2lvbiBLICovCisjZGVmaW5lIFZUQkxfS19DTVBSICAgICAxMjAgCisKKy8qICB0aGUgbmV4dCBpcyB1c2VkIGJ5IFFJQy0zMDIwIHRhcGVzIHdpdGggZm9ybWF0IGNvZGUgNiAoPjJeMTYKKyAqICBzZWdtZW50cykgSXQgaXMgc3BlY2lmaWVkIGluIFFJQy0xMTMsIFJldi4gRywgU2VjdGlvbiA1IChTQ1NJCisgKiAgdm9sdW1lIHRhYmxlKS4gVGhlIGRpZmZlcmVuY2UgaXMgc2ltcGx5LCB0aGF0IHdlIG9ubHkgc3RvcmUgdGhlCisgKiAgbnVtYmVyIG9mIHNlZ21lbnRzIHVzZWQsIG5vdCB0aGUgc3RhcnRpbmcgc2VnbWVudC4KKyAqLworI2RlZmluZSBWVEJMX1NDU0lfU0VHUyAgNCAvKiBpcyBhIDQgYnl0ZSB2YWx1ZSAqLworCisvKiAgb25lIHZ0YmwgaXMgMTI4IGJ5dGVzLCB0aGF0IHJlc3VsdHMgaW4gYSBtYXhpbXVtIG51bWJlciBvZgorICogIDI5KjEwMjQvMTI4ID0gMjMyIHZvbHVtZXMuCisgKi8KKyNkZWZpbmUgWkZUX01BWF9WT0xVTUVTIChGVF9TRUdNRU5UX1NJWkUvVlRCTF9TSVpFKQorI2RlZmluZSBWVEJMX0lEICAiVlRCTCIKKyNkZWZpbmUgVlRCTF9JRFMgeyBWVEJMX0lELCAiWFRCTCIsICJVVElEIiwgIkVYVlQiIH0gLyogb3RoZXIgdmFsaWQgaWRzICovCisjZGVmaW5lIFpGVF9WT0xfTkFNRSAiemZ0YXBlIHZvbHVtZSIgLyogdm9sdW1lIGxhYmVsIHVzZWQgYnkgbWUgKi8KKyNkZWZpbmUgWkZUQVBFX1NJRyAiTElOVVggWkZUIgorCisvKiAgZ2xvYmFsIHZhcmlhYmxlcworICovCit0eXBlZGVmIHN0cnVjdCB6ZnRfaW50ZXJuYWxfdnRibAoreworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlpbnQgICAgICAgICAgY291bnQ7CisJdW5zaWduZWQgaW50IHN0YXJ0X3NlZzsgICAgICAgICAvKiAzMiBiaXRzIGFyZSBlbm91Z2ggZm9yIG5vdyAqLworCXVuc2lnbmVkIGludCBlbmRfc2VnOyAgICAgICAgICAgLyogMzIgYml0cyBhcmUgZW5vdWdoIGZvciBub3cgKi8KKwlfX3M2NCAgICAgICAgc2l6ZTsgICAgICAgICAgICAgIC8qIHVuY29tcHJlc3NlZCBzaXplICovCisgICAgICAgIHVuc2lnbmVkIGludCBibGtfc3o7ICAgICAgICAgICAgLyogYmxvY2sgc2l6ZSBmb3IgdGhpcyB2b2x1bWUgKi8KKwl1bnNpZ25lZCBpbnQgemZ0X3ZvbHVtZSAgICAgOjE7IC8qIHpmdGFwZSBjcmVhdGVkIHRoaXMgdm9sdW1lICovCisJdW5zaWduZWQgaW50IHVzZV9jb21wcmVzc2lvbjoxOyAvKiBjb21wcmVzc2VkIHZvbHVtZSAgKi8KKwl1bnNpZ25lZCBpbnQgcWljMTEzICAgICAgICAgOjE7IC8qIGxheW91dCBvZiBjb21wcmVzc2VkIGJsb2NrCisJCQkJCSAqIGluZm8gYW5kIHZ0YmwgY29uZm9ybXMgdG8KKwkJCQkJICogUUlDLTExMywgUmV2LiBHIAorCQkJCQkgKi8KKwl1bnNpZ25lZCBpbnQgbmV3X3ZvbHVtZSAgICAgOjE7IC8qIGl0IHdhcyBjcmVhdGVkIGJ5IHVzLCB0aGlzCisJCQkJCSAqIHJ1bi4gIHRoaXMgYWxsb3dzIHRoZQorCQkJCQkgKiBmaWVsZHMgdGhhdCBhcmVuJ3QgcmVhbGx5CisJCQkJCSAqIHVzZWQgYnkgemZ0YXBlIHRvIGJlIGZpbGxlZAorCQkJCQkgKiBpbiBieSBzb21lIHVzZXIgbGV2ZWwKKwkJCQkJICogcHJvZ3JhbS4KKwkJCQkJICovCisJdW5zaWduZWQgaW50IG9wZW4gICAgICAgICAgIDoxOyAvKiBqdXN0IGluIHByb2dyZXNzIG9mIGJlaW5nIAorCQkJCQkgKiB3cml0dGVuCisJCQkJCSAqLworfSB6ZnRfdm9saW5mbzsKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgemZ0X3Z0Ymw7CisjZGVmaW5lIHpmdF9oZWFkX3Z0YmwgIGxpc3RfZW50cnkoemZ0X3Z0YmwubmV4dCwgemZ0X3ZvbGluZm8sIG5vZGUpCisjZGVmaW5lIHpmdF9lb21fdnRibCAgIGxpc3RfZW50cnkoemZ0X3Z0YmwucHJldiwgemZ0X3ZvbGluZm8sIG5vZGUpCisjZGVmaW5lIHpmdF9sYXN0X3Z0YmwgIGxpc3RfZW50cnkoemZ0X2VvbV92dGJsLT5ub2RlLnByZXYsIHpmdF92b2xpbmZvLCBub2RlKQorI2RlZmluZSB6ZnRfZmlyc3RfdnRibCBsaXN0X2VudHJ5KHpmdF9oZWFkX3Z0YmwtPm5vZGUubmV4dCwgemZ0X3ZvbGluZm8sIG5vZGUpCisjZGVmaW5lIHpmdF92dGJsX2VtcHR5ICh6ZnRfZW9tX3Z0YmwtPm5vZGUucHJldiA9PSAmemZ0X2hlYWRfdnRibC0+bm9kZSkKKworI2RlZmluZSBEVU1QX1ZPTElORk8obGV2ZWwsIGRlc2MsIGluZm8pCQkJCQlcCit7CQkJCQkJCQkJXAorCWNoYXIgdG1wWzIxXTsJCQkJCQkJXAorCXN0cmxjcHkodG1wLCBkZXNjLCBzaXplb2YodG1wKSk7CQkJCVwKKwlUUkFDRShsZXZlbCwgIlZvbHVtZSAlZDpcbiIJCQkJCVwKKwkgICAgICBLRVJOX0lORk8gImRlc2NyaXB0aW9uICA6ICVzXG4iCQkJCVwKKwkgICAgICBLRVJOX0lORk8gImZpcnN0IHNlZ21lbnQ6ICVkXG4iCQkJCVwKKwkgICAgICBLRVJOX0lORk8gImxhc3QgIHNlZ21lbnQ6ICVkXG4iCQkJCVwKKwkgICAgICBLRVJOX0lORk8gInNpemUgICAgICAgICA6ICIgTExfWCAiXG4iCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiYmxvY2sgc2l6ZSAgIDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiY29tcHJlc3Npb24gIDogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiemZ0YXBlIHZvbHVtZTogJWRcbiIJCQkJXAorCSAgICAgIEtFUk5fSU5GTyAiUUlDLTExMyBjb25mLjogJWQiLAkJCQlcCisJICAgICAgKGluZm8pLT5jb3VudCwgdG1wLCAoaW5mbyktPnN0YXJ0X3NlZywgKGluZm8pLT5lbmRfc2VnLAlcCisJICAgICAgTEwoKGluZm8pLT5zaXplKSwgKGluZm8pLT5ibGtfc3osCQkJCVwKKwkgICAgICAoaW5mbyktPnVzZV9jb21wcmVzc2lvbiAhPSAwLCAoaW5mbyktPnpmdF92b2x1bWUgIT0gMCwJXAorCSAgICAgIChpbmZvKS0+cWljMTEzICE9IDApOwkJCQkJXAorfQorCitleHRlcm4gaW50IHpmdF9xaWNfbW9kZTsKK2V4dGVybiBpbnQgemZ0X29sZF9mdGFwZTsKK2V4dGVybiBpbnQgemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkOworCisvKiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkICB6ZnRfaW5pdF92dGJsICAgICAgICAgICAgICh2b2lkKTsKK2V4dGVybiB2b2lkICB6ZnRfZnJlZV92dGJsICAgICAgICAgICAgICh2b2lkKTsKK2V4dGVybiBpbnQgICB6ZnRfZXh0cmFjdF92b2x1bWVfaGVhZGVycyhfX3U4ICpidWZmZXIpOworZXh0ZXJuIGludCAgIHpmdF91cGRhdGVfdm9sdW1lX3RhYmxlICAgKHVuc2lnbmVkIGludCBzZWdtZW50KTsKK2V4dGVybiBpbnQgICB6ZnRfb3Blbl92b2x1bWUgICAgICAgICAgICh6ZnRfcG9zaXRpb24gKnBvcywKKwkJCQkJaW50IGJsa19zeiwgaW50IHVzZV9jb21wcmVzc2lvbik7CitleHRlcm4gaW50ICAgemZ0X2Nsb3NlX3ZvbHVtZSAgICAgICAgICAoemZ0X3Bvc2l0aW9uICpwb3MpOworZXh0ZXJuIGNvbnN0IHpmdF92b2xpbmZvICp6ZnRfZmluZF92b2x1bWUodW5zaWduZWQgaW50IHNlZ19wb3MpOworZXh0ZXJuIGludCAgIHpmdF9za2lwX3ZvbHVtZXMgICAgICAgICAgKGludCBjb3VudCwgemZ0X3Bvc2l0aW9uICpwb3MpOworZXh0ZXJuIF9fczY0IHpmdF9nZXRfZW9tX3BvcyAgICAgICAgICAgKHZvaWQpOworZXh0ZXJuIHZvaWQgIHpmdF9za2lwX3RvX2VvbSAgICAgICAgICAgKHpmdF9wb3NpdGlvbiAqcG9zKTsKK2V4dGVybiBpbnQgICB6ZnRfZmFrZV92b2x1bWVfaGVhZGVycyAgIChlb2ZfbWFya191bmlvbiAqZW9mX21hcCwgCisJCQkJCWludCBudW1fZmFpbGVkX3NlY3RvcnMpOworZXh0ZXJuIGludCAgIHpmdF93ZW9mICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCBjb3VudCwgemZ0X3Bvc2l0aW9uICpwb3MpOworZXh0ZXJuIHZvaWQgIHpmdF9tb3ZlX3Bhc3RfZW9mICAgICAgICAgKHpmdF9wb3NpdGlvbiAqcG9zKTsKKworc3RhdGljIGlubGluZSBpbnQgICB6ZnRfdGFwZV9hdF9lb2QgICAgICAgICAoY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpOworc3RhdGljIGlubGluZSBpbnQgICB6ZnRfdGFwZV9hdF9sYm90ICAgICAgICAoY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpOworc3RhdGljIGlubGluZSB2b2lkICB6ZnRfcG9zaXRpb25fYmVmb3JlX2VvZiAoemZ0X3Bvc2l0aW9uICpwb3MsIAorCQkJCQkgICAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOworc3RhdGljIGlubGluZSBfX3M2NCB6ZnRfY2hlY2tfZm9yX2VvZihjb25zdCB6ZnRfdm9saW5mbyAqdnRibCwKKwkJCQkgICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcyk7CisKKy8qIHRoaXMgZnVuY3Rpb24gZGVjcmVtZW50cyB0aGUgemZ0X3NlZ19wb3MgY291bnRlciBpZiB3ZSBhcmUgcmlnaHQKKyAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzZWdtZW50LiBUaGlzIGlzIHRvIGhhbmRsZSBmc2ZtL2JzZm0gLS0gd2UKKyAqIG5lZWQgdG8gcG9zaXRpb24gYmVmb3JlIHRoZSBlb2YgbWFyay4gIE5PVEU6IHpmdF90YXBlX3BvcyBpcyBub3QKKyAqIGNoYW5nZWQgCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB6ZnRfcG9zaXRpb25fYmVmb3JlX2VvZih6ZnRfcG9zaXRpb24gKnBvcywgCisJCQkJCSAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7IAorCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHBvcy0+c2VnX3BvcyA9PSB2b2x1bWUtPmVuZF9zZWcgKyAxICYmICBwb3MtPnNlZ19ieXRlX3BvcyA9PSAwKSB7CisJCXBvcy0+c2VnX3BvcyAtLTsKKwkJcG9zLT5zZWdfYnl0ZV9wb3MgPSB6ZnRfZ2V0X3NlZ19zeihwb3MtPnNlZ19wb3MpOworCX0KKwlUUkFDRV9FWElUOworfQorCisvKiAgTW1taC4gSXMgdGhlIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3Qgdm9sdW1lLCB0aGF0IGlzIHJpZ2h0CisgKiAgYmVmb3JlIHRoZSBsYXN0IEVPRiBtYXJrIGFsc28gbG9naWNhbCBhbiBFT0QgY29uZGl0aW9uPworICovCitzdGF0aWMgaW5saW5lIGludCB6ZnRfdGFwZV9hdF9lb2QoY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpCit7IAorCVRSQUNFX0ZVTihmdF90X2FueSk7CisKKwlpZiAoemZ0X3FpY19tb2RlKSB7CisJCVRSQUNFX0VYSVQgKHBvcy0+c2VnX3BvcyA+PSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyB8fAorCQkJICAgIHpmdF9sYXN0X3Z0YmwtPm9wZW4pOworCX0gZWxzZSB7CisJCVRSQUNFX0VYSVQgcG9zLT5zZWdfcG9zID4gZnRfbGFzdF9kYXRhX3NlZ21lbnQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCB6ZnRfdGFwZV9hdF9sYm90KGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zKQoreworCWlmICh6ZnRfcWljX21vZGUpIHsKKwkJcmV0dXJuIChwb3MtPnNlZ19wb3MgPD0gemZ0X2ZpcnN0X3Z0YmwtPnN0YXJ0X3NlZyAmJgorCQkJcG9zLT52b2x1bWVfcG9zID09IDApOworCX0gZWxzZSB7CisJCXJldHVybiAocG9zLT5zZWdfcG9zIDw9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCAmJiAKKwkJCXBvcy0+dm9sdW1lX3BvcyA9PSAwKTsKKwl9Cit9CisKKy8qIFRoaXMgb25lIGNoZWNrcyBmb3IgRU9GLiAgcmV0dXJuIHJlbWFpbmcgc3BhY2UgKG1heSBiZSBuZWdhdGl2ZSkgCisgKi8KK3N0YXRpYyBpbmxpbmUgX19zNjQgemZ0X2NoZWNrX2Zvcl9lb2YoY29uc3QgemZ0X3ZvbGluZm8gKnZ0YmwsCisJCQkJICAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpCit7ICAgICAKKwlyZXR1cm4gKF9fczY0KSh2dGJsLT5zaXplIC0gcG9zLT52b2x1bWVfcG9zKTsKK30KKworI2VuZGlmIC8qIF9aRlRBUEVfVlRCTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDMyN2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuYwpAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzIEhlaW5lCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgKgorICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuYyx2ICQKKyAqICRSZXZpc2lvbjogMS4zICQKKyAqICREYXRlOiAxOTk3LzExLzA2IDAwOjUwOjI5ICQKKyAqCisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgd3JpdGluZyBjb2RlCisgKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCisjaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgorI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKKworLyogICAgICBHbG9iYWwgdmFycy4KKyAqLworCisvKiAgICAgIExvY2FsIHZhcnMuCisgKi8KK3N0YXRpYyBpbnQgbGFzdF93cml0ZV9mYWlsZWQ7CitzdGF0aWMgaW50IG5lZWRfZmx1c2g7CisKK3ZvaWQgemZ0X3ByZXZlbnRfZmx1c2godm9pZCkKK3sKKwluZWVkX2ZsdXNoID0gMDsKK30KKworc3RhdGljIGludCB6ZnRfd3JpdGVfaGVhZGVyX3NlZ21lbnRzKF9fdTgqIGJ1ZmZlcikKK3sKKwlpbnQgaGVhZGVyXzFfb2sgPSAwOworCWludCBoZWFkZXJfMl9vayA9IDA7CisJdW5zaWduZWQgaW50IHRpbWVfc3RhbXA7CisJVFJBQ0VfRlVOKGZ0X3Rfbm9pc2UpOworCQorCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7CisJZnRhcGVfc2Vla190b19ib3QoKTsgICAgLyogcHJldmVudHMgZXh0cmEgcmV3aW5kICovCisJaWYgKEdFVDQoYnVmZmVyLCAwKSAhPSBGVF9IU0VHX01BR0lDKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAorCQkJICAgICJ3cm9uZyBoZWFkZXIgc2lnbmF0dXJlIGZvdW5kLCBhYm9ydGluZyIpOworCX0gCisJLyogICBCZSBvcHRpbWlzdGljOiAqLworCVBVVDQoYnVmZmVyLCBGVF9TRUdfQ05ULAorCSAgICAgemZ0X3dyaXR0ZW5fc2VnbWVudHMgKyBHRVQ0KGJ1ZmZlciwgRlRfU0VHX0NOVCkgKyAyKTsKKwlpZiAoKHRpbWVfc3RhbXAgPSB6ZnRfZ2V0X3RpbWUoKSkgIT0gMCkgeworCQlQVVQ0KGJ1ZmZlciwgRlRfV1JfREFURSwgdGltZV9zdGFtcCk7CisJCWlmICh6ZnRfbGFiZWxfY2hhbmdlZCkgeworCQkJUFVUNChidWZmZXIsIEZUX0xBQkVMX0RBVEUsIHRpbWVfc3RhbXApOworCQl9CisJfQorCVRSQUNFKGZ0X3Rfbm9pc2UsCisJICAgICAgIndyaXRpbmcgZmlyc3QgaGVhZGVyIHNlZ21lbnQgJWQiLCBmdF9oZWFkZXJfc2VnbWVudF8xKTsKKwloZWFkZXJfMV9vayA9IHpmdF92ZXJpZnlfd3JpdGVfc2VnbWVudHMoZnRfaGVhZGVyX3NlZ21lbnRfMSwgCisJCQkJCQlidWZmZXIsIEZUX1NFR01FTlRfU0laRSwKKwkJCQkJCXpmdF9kZWJsb2NrX2J1ZikgPj0gMDsKKwlUUkFDRShmdF90X25vaXNlLAorCSAgICAgICJ3cml0aW5nIHNlY29uZCBoZWFkZXIgc2VnbWVudCAlZCIsIGZ0X2hlYWRlcl9zZWdtZW50XzIpOworCWhlYWRlcl8yX29rID0gemZ0X3ZlcmlmeV93cml0ZV9zZWdtZW50cyhmdF9oZWFkZXJfc2VnbWVudF8yLCAKKwkJCQkJCWJ1ZmZlciwgRlRfU0VHTUVOVF9TSVpFLAorCQkJCQkJemZ0X2RlYmxvY2tfYnVmKSA+PSAwOworCWlmICghaGVhZGVyXzFfb2spIHsKKwkJVFJBQ0UoZnRfdF93YXJuLCAiV2FybmluZzogIgorCQkgICAgICAidXBkYXRlIG9mIGZpcnN0IGhlYWRlciBzZWdtZW50IGZhaWxlZCIpOworCX0KKwlpZiAoIWhlYWRlcl8yX29rKSB7CisJCVRSQUNFKGZ0X3Rfd2FybiwgIldhcm5pbmc6ICIKKwkJICAgICAgInVwZGF0ZSBvZiBzZWNvbmQgaGVhZGVyIHNlZ21lbnQgZmFpbGVkIik7CisJfQorCWlmICghaGVhZGVyXzFfb2sgJiYgIWhlYWRlcl8yX29rKSB7CisJCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiRXJyb3I6ICIKKwkJICAgICAgInVwZGF0ZSBvZiBib3RoIGhlYWRlciBzZWdtZW50cyBmYWlsZWQuIik7CisJfQorCVRSQUNFX0VYSVQgMDsKK30KKworaW50IHpmdF91cGRhdGVfaGVhZGVyX3NlZ21lbnRzKHZvaWQpCit7CisJVFJBQ0VfRlVOKGZ0X3Rfbm9pc2UpOworCQorCS8qICBtdXN0IE5PVCB1c2UgemZ0X3dyaXRlX3Byb3RlY3RlZCwgYXMgaXQgYWxzbyBpbmNsdWRlcyB0aGUKKwkgKiAgZmlsZSBhY2Nlc3MgbW9kZS4gQnV0IHdlIGFsc28gd2FudCB0byB1cGRhdGUgd2hlbiBzb2Z0CisJICogIHdyaXRlIHByb3RlY3Rpb24gaXMgZW5hYmxlZCAoT19SRE9OTFkpCisJICovCisJaWYgKGZ0X3dyaXRlX3Byb3RlY3RlZCB8fCB6ZnRfb2xkX2Z0YXBlKSB7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsICJUYXBlIHNldCByZWFkLW9ubHk6IG5vIHVwZGF0ZSIpOworCX0gCisJaWYgKCF6ZnRfaGVhZGVyX3JlYWQpIHsKKwkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwgIk5vdGhpbmcgdG8gdXBkYXRlIik7CisJfQorCWlmICghemZ0X2hlYWRlcl9jaGFuZ2VkKSB7CisJCXpmdF9oZWFkZXJfY2hhbmdlZCA9IHpmdF93cml0dGVuX3NlZ21lbnRzID4gMDsKKwl9CisJaWYgKCF6ZnRfaGVhZGVyX2NoYW5nZWQgJiYgIXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCkgeworCQlUUkFDRV9BQk9SVCgwLCBmdF90X25vaXNlLCAiTm90aGluZyB0byB1cGRhdGUiKTsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgIlVwZGF0aW5nIGhlYWRlciBzZWdtZW50cyIpOworCWlmIChmdGFwZV9nZXRfc3RhdHVzKCktPmZ0aV9zdGF0ZSA9PSB3cml0aW5nKSB7CisJCVRSQUNFX0NBVENIKGZ0YXBlX2xvb3BfdW50aWxfd3JpdGVzX2RvbmUoKSwpOworCX0KKwlUUkFDRV9DQVRDSChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSwpOworCQorCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsgLyogaW52YWxpZGF0ZSB0aGUgY2FjaGUgKi8KKwlpZiAoemZ0X2hlYWRlcl9jaGFuZ2VkKSB7CisJCVRSQUNFX0NBVENIKHpmdF93cml0ZV9oZWFkZXJfc2VnbWVudHMoemZ0X2hzZWdfYnVmKSwpOworCX0KKwlpZiAoemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkKSB7CisJCVRSQUNFX0NBVENIKHpmdF91cGRhdGVfdm9sdW1lX3RhYmxlKGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCksKTsKKwl9CisJemZ0X2hlYWRlcl9jaGFuZ2VkID0KKwkJemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkID0gCisJCXpmdF9sYWJlbF9jaGFuZ2VkICAgICAgICA9CisJCXpmdF93cml0dGVuX3NlZ21lbnRzICAgICA9IDA7CisJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKKwlmdGFwZV9zZWVrX3RvX2JvdCgpOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCByZWFkX21lcmdlX2J1ZmZlcihpbnQgc2VnX3BvcywgX191OCAqYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgc2VnX3N6KQoreworCWludCByZXN1bHQgPSAwOworCWNvbnN0IGZ0X3RyYWNlX3Qgb2xkX3RyYWNpbmcgPSBUUkFDRV9MRVZFTDsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKwkKKwlpZiAoemZ0X3FpY19tb2RlKSB7CisJCS8qICB3cml0aW5nIGluIHRoZSBtaWRkbGUgb2YgYSB2b2x1bWUgaXMgTk9UIGFsbG93ZWQKKwkJICoKKwkJICovCisJCVRSQUNFKGZ0X3Rfbm9pc2UsICJObyBuZWVkIHRvIHJlYWQgYSBzZWdtZW50Iik7CisJCW1lbXNldChidWZmZXIgKyBvZmZzZXQsIDAsIHNlZ19zeiAtIG9mZnNldCk7CisJCVRSQUNFX0VYSVQgMDsKKwl9CisJVFJBQ0UoZnRfdF9hbnksICJ3YWl0aW5nIik7CisJZnRhcGVfc3RhcnRfd3JpdGluZyhGVF9XUl9NVUxUSSk7CisJVFJBQ0VfQ0FUQ0goZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpLCk7CisJCisJVFJBQ0UoZnRfdF9ub2lzZSwgInRyeWluZyB0byByZWFkIHNlZ21lbnQgJWQgZnJvbSBvZmZzZXQgJWQiLAorCSAgICAgIHNlZ19wb3MsIG9mZnNldCk7CisJU0VUX1RSQUNFX0xFVkVMKGZ0X3RfYnVnKTsKKwlyZXN1bHQgPSB6ZnRfZmV0Y2hfc2VnbWVudF9mcmFjdGlvbihzZWdfcG9zLCBidWZmZXIsIAorCQkJCQkgICAgRlRfUkRfU0lOR0xFLAorCQkJCQkgICAgb2Zmc2V0LCBzZWdfc3ogLSBvZmZzZXQpOworCVNFVF9UUkFDRV9MRVZFTChvbGRfdHJhY2luZyk7CisJaWYgKHJlc3VsdCAhPSAoc2VnX3N6IC0gb2Zmc2V0KSkgeworCQlUUkFDRShmdF90X25vaXNlLCAiSWdub3JlIGVycm9yOiByZWFkX3NlZ21lbnQoKSByZXN1bHQ6ICVkIiwKKwkJICAgICAgcmVzdWx0KTsKKwkJbWVtc2V0KGJ1ZmZlciArIG9mZnNldCwgMCwgc2VnX3N6IC0gb2Zmc2V0KTsKKwl9CisJVFJBQ0VfRVhJVCAwOworfQorCisvKiBmbHVzaCB0aGUgd3JpdGUgYnVmZmVyIHRvIHRhcGUgYW5kIHdyaXRlIGFuIGVvZi1tYXJrZXIgYXQgdGhlCisgKiBjdXJyZW50IHBvc2l0aW9uIGlmIG5vdCBpbiByYXcgbW9kZS4gIFRoaXMgZnVuY3Rpb24gYWx3YXlzCisgKiBwb3NpdGlvbnMgdGhlIHRhcGUgYmVmb3JlIHRoZSBlb2YtbWFya2VyLiAgX2Z0YXBlX2Nsb3NlKCkgc2hvdWxkCisgKiB0aGVuIGFkdmFuY2UgdG8gdGhlIG5leHQgc2VnbWVudC4KKyAqCisgKiB0aGUgcGFyYW1ldGVyICJmaW5pc2hfdm9sdW1lIiBkZXNjcmliZXMgd2hldGhlciB0byBwb3NpdGlvbiBiZWZvcmUKKyAqIG9yIGFmdGVyIHRoZSBwb3NzaWJseSBjcmVhdGVkIGZpbGUtbWFyay4gV2UgYWx3YXlzIHBvc2l0aW9uIGFmdGVyCisgKiB0aGUgZmlsZS1tYXJrIHdoZW4gY2FsbGVkIGZyb20gZnRhcGVfY2xvc2UoKSBhbmQgYSBmbHVzaCB3YXMgbmVlZGVkCisgKiAodGhhdCBpcyBmdGFwZV93cml0ZSgpIHdhcyB0aGUgbGFzdCB0YXBlIG9wZXJhdGlvbiBiZWZvcmUgY2FsbGluZworICogZnRhcGVfZmx1c2gpIEJ1dCB3ZSBhbHdheXMgcG9zaXRpb24gYmVmb3JlIHRoZSBmaWxlLW1hcmsgd2hlbiB0aGlzCisgKiBmdW5jdGlvbiBnZXQncyBjYWxsZWQgZnJvbSBvdXRzaWRlIGZ0YXBlX2Nsb3NlKCkgCisgKi8KK2ludCB6ZnRfZmx1c2hfYnVmZmVycyh2b2lkKQoreworCWludCByZXN1bHQ7CisJaW50IGRhdGFfcmVtYWluaW5nOworCWludCB0aGlzX3NlZ3Nfc2l6ZTsKKwlUUkFDRV9GVU4oZnRfdF9mbG93KTsKKworCVRSQUNFKGZ0X3RfZGF0YV9mbG93LAorCSAgICAgICJlbnRlcmVkLCBmdGFwZV9zdGF0ZSA9ICVkIiwgZnRhcGVfZ2V0X3N0YXR1cygpLT5mdGlfc3RhdGUpOworCWlmIChmdGFwZV9nZXRfc3RhdHVzKCktPmZ0aV9zdGF0ZSAhPSB3cml0aW5nICYmICFuZWVkX2ZsdXNoKSB7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsICJubyBuZWVkIGZvciBmbHVzaCIpOworCX0KKwl6ZnRfaW9fc3RhdGUgPSB6ZnRfaWRsZTsgLyogIHRyaWdnZXJzIHNvbWUgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUKKwkJCQkgICogIHJlYWQgYW5kIHdyaXRlIHJvdXRpbmVzIAorCQkJCSAgKi8KKwlpZiAobGFzdF93cml0ZV9mYWlsZWQpIHsKKwkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7CisJCVRSQUNFX0VYSVQgLUVJTzsKKwl9CisJVFJBQ0UoZnRfdF9ub2lzZSwgImZsdXNoaW5nIHdyaXRlIGJ1ZmZlcnMiKTsKKwl0aGlzX3NlZ3Nfc2l6ZSA9IHpmdF9nZXRfc2VnX3N6KHpmdF9wb3Muc2VnX3Bvcyk7CisJaWYgKHRoaXNfc2Vnc19zaXplID09IHpmdF9wb3Muc2VnX2J5dGVfcG9zKSB7CisJCXpmdF9wb3Muc2VnX3BvcyArKzsKKwkJZGF0YV9yZW1haW5pbmcgPSB6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9IDA7CisJfSBlbHNlIHsKKwkJZGF0YV9yZW1haW5pbmcgPSB6ZnRfcG9zLnNlZ19ieXRlX3BvczsKKwl9CisJLyogSWYgdGhlcmUgaXMgYW55IGRhdGEgbm90IHdyaXR0ZW4gdG8gdGFwZSB5ZXQsIGFwcGVuZCB6ZXJvJ3MKKwkgKiB1cCB0byB0aGUgZW5kIG9mIHRoZSBzZWN0b3IgKGlmIHVzaW5nIGNvbXByZXNzaW9uKSBvciBtZXJnZQorCSAqIGl0IHdpdGggdGhlIGRhdGEgZXhpc3Rpbmcgb24gdGhlIHRhcGUgVGhlbiB3cml0ZSB0aGUKKwkgKiBzZWdtZW50KHMpIHRvIHRhcGUuCisJICovCisJVFJBQ0UoZnRfdF9ub2lzZSwgIlBvc2l0aW9uOlxuIgorCSAgICAgIEtFUk5fSU5GTyAic2VnX3BvcyAgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAiYnl0ZSBwb3MgOiAlZFxuIgorCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nOiAlZCIsCisJICAgICAgemZ0X3Bvcy5zZWdfcG9zLCB6ZnRfcG9zLnNlZ19ieXRlX3BvcywgZGF0YV9yZW1haW5pbmcpOworCWlmIChkYXRhX3JlbWFpbmluZyA+IDApIHsKKwkJZG8geworCQkJdGhpc19zZWdzX3NpemUgPSB6ZnRfZ2V0X3NlZ19zeih6ZnRfcG9zLnNlZ19wb3MpOworCQkJaWYgKHRoaXNfc2Vnc19zaXplID4gZGF0YV9yZW1haW5pbmcpIHsKKwkJCQlUUkFDRV9DQVRDSChyZWFkX21lcmdlX2J1ZmZlcih6ZnRfcG9zLnNlZ19wb3MsCisJCQkJCQkJICAgICAgemZ0X2RlYmxvY2tfYnVmLAorCQkJCQkJCSAgICAgIGRhdGFfcmVtYWluaW5nLAorCQkJCQkJCSAgICAgIHRoaXNfc2Vnc19zaXplKSwKKwkJCQkJICAgIGxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7CisJCQl9CisJCQlyZXN1bHQgPSBmdGFwZV93cml0ZV9zZWdtZW50KHpmdF9wb3Muc2VnX3BvcywgCisJCQkJCQkgICAgIHpmdF9kZWJsb2NrX2J1ZiwKKwkJCQkJCSAgICAgRlRfV1JfTVVMVEkpOworCQkJaWYgKHJlc3VsdCAhPSB0aGlzX3NlZ3Nfc2l6ZSkgeworCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZmx1c2ggYnVmZmVycyBmYWlsZWQiKTsKKwkJCQl6ZnRfcG9zLnRhcGVfcG9zICAgIC09IHpmdF9wb3Muc2VnX2J5dGVfcG9zOworCQkJCXpmdF9wb3Muc2VnX2J5dGVfcG9zID0gMDsKKworCQkJCWxhc3Rfd3JpdGVfZmFpbGVkID0gMTsKKwkJCQlUUkFDRV9FWElUIHJlc3VsdDsKKwkJCX0KKwkJCXpmdF93cml0dGVuX3NlZ21lbnRzICsrOworCQkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csCisJCQkgICAgICAiZmx1c2gsIG1vdmVkIG91dCBidWZmZXI6ICVkIiwgcmVzdWx0KTsKKwkJCS8qIG5lZWQgbmV4dCBzZWdtZW50IGZvciBtb3JlIGRhdGEgKGVtcHR5IHNlZ21lbnRzPykKKwkJCSAqLworCQkJaWYgKHJlc3VsdCA8IGRhdGFfcmVtYWluaW5nKSB7IAorCQkJCWlmIChyZXN1bHQgPiAwKSB7ICAgICAgIAorCQkJCQkvKiBtb3ZlIHJlbWFpbmRlciB0byBidWZmZXIgYmVnaW5uaW5nIAorCQkJCQkgKi8KKwkJCQkJbWVtbW92ZSh6ZnRfZGVibG9ja19idWYsIAorCQkJCQkJemZ0X2RlYmxvY2tfYnVmICsgcmVzdWx0LAorCQkJCQkJRlRfU0VHTUVOVF9TSVpFIC0gcmVzdWx0KTsKKwkJCQl9CisJCQl9IAorCQkJZGF0YV9yZW1haW5pbmcgLT0gcmVzdWx0OworCQkJemZ0X3Bvcy5zZWdfcG9zICsrOworCQl9IHdoaWxlIChkYXRhX3JlbWFpbmluZyA+IDApOworCQlUUkFDRShmdF90X2FueSwgInJlc3VsdDogJWQiLCByZXN1bHQpOworCQl6ZnRfZGVibG9ja19zZWdtZW50ID0gLS16ZnRfcG9zLnNlZ19wb3M7CisJCWlmIChkYXRhX3JlbWFpbmluZyA9PSAwKSB7ICAvKiBmaXJzdCBieXRlIG5leHQgc2VnbWVudCAqLworCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSB0aGlzX3NlZ3Nfc2l6ZTsKKwkJfSBlbHNlIHsgLyogYWZ0ZXIgZGF0YSBwcmV2aW91cyBzZWdtZW50LCBkYXRhX3JlbWFpbmluZyA8IDAgKi8KKwkJCXpmdF9wb3Muc2VnX2J5dGVfcG9zID0gZGF0YV9yZW1haW5pbmcgKyByZXN1bHQ7CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRShmdF90X25vaXNlLCAiemZ0X2RlYmxvY2tfYnVmIGVtcHR5Iik7CisJCXpmdF9wb3Muc2VnX3BvcyAtLTsKKwkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSB6ZnRfZ2V0X3NlZ19zeiAoemZ0X3Bvcy5zZWdfcG9zKTsKKwkJZnRhcGVfc3RhcnRfd3JpdGluZyhGVF9XUl9NVUxUSSk7CisJfQorCVRSQUNFKGZ0X3RfYW55LCAid2FpdGluZyIpOworCWlmICgocmVzdWx0ID0gZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpKSA8IDApIHsKKwkJLyogdGhhdCdzIHJlYWxseSBiYWQuIFdoYXQgdG8gdG8gd2l0aCB6ZnRfdGFwZV9wb3M/IAorCQkgKi8KKwkJVFJBQ0UoZnRfdF9lcnIsICJmbHVzaCBidWZmZXJzIGZhaWxlZCIpOworCX0KKwlUUkFDRShmdF90X2FueSwgInpmdF9zZWdfcG9zOiAlZCwgemZ0X3NlZ19ieXRlX3BvczogJWQiLAorCSAgICAgIHpmdF9wb3Muc2VnX3BvcywgemZ0X3Bvcy5zZWdfYnl0ZV9wb3MpOworCWxhc3Rfd3JpdGVfZmFpbGVkICA9CisJCW5lZWRfZmx1c2ggPSAwOworCVRSQUNFX0VYSVQgcmVzdWx0OworfQorCisvKiByZXR1cm4tdmFsdWU6IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtb3ZlZCBmcm9tIHRoZSB1c2VyLWJ1ZmZlcgorICoKKyAqIG91dDogCisgKiAgICAgIGludCAqd3JpdGVfY250OiBob3cgbXVjaCBhY3R1YWxseSBoYXMgYmVlbiBtb3ZlZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIHpmdF9kZWJsb2NrX2J1ZgorICogICAgICBpbnQgcmVxX2xlbiAgOiBNVVNUIE5PVCBCRSBDSEFOR0VELCBleGNlcHQgYXQgRU9ULCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGNhc2UgaXQgbWF5IGJlIGFkanVzdGVkCisgKiBpbiA6IAorICogICAgICBjaGFyICpidWZmICAgICAgICA6IHRoZSB1c2VyIGJ1ZmZlcgorICogICAgICBpbnQgYnVmX3Bvc193cml0ZSA6IGNvcHkgb2YgYnVmX2xlbl93ciBpbnQKKyAqICAgICAgdGhpc19zZWdzX3NpemUgICAgOiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYWN0dWFsIHNlZ21lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyCisgKiAgICAgICp6ZnRfZGVibG9ja19idWYgICA6IHpmdF9kZWJsb2NrX2J1ZgorICovCitzdGF0aWMgaW50IHpmdF9zaW1wbGVfd3JpdGUoaW50ICpjbnQsCisJCQkgICAgX191OCAqZHN0X2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKKwkJCSAgICBjb25zdCBfX3U4IF9fdXNlciAqc3JjX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sIAorCQkJICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCit7CisJaW50IHNwYWNlX2xlZnQ7CisJVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7CisKKwkvKiB2b2x1bWUtPnNpemUgaG9sZHMgdGhlIHRhcGUgY2FwYWNpdHkgd2hpbGUgdm9sdW1lIGlzIG9wZW4gKi8KKwlpZiAocG9zLT50YXBlX3BvcyArIHZvbHVtZS0+YmxrX3N6ID4gdm9sdW1lLT5zaXplKSB7CisJCVRSQUNFX0VYSVQgLUVOT1NQQzsKKwl9CisJLyogIHJlbWFpbmluZyBzcGFjZSBpbiB0aGlzIHNlZ21lbnQsIE5PVCB6ZnRfZGVibG9ja19idWYKKwkgKi8KKwlzcGFjZV9sZWZ0ID0gc2VnX3N6IC0gcG9zLT5zZWdfYnl0ZV9wb3M7CisJKmNudCA9IHJlcV9sZW4gPCBzcGFjZV9sZWZ0ID8gcmVxX2xlbiA6IHNwYWNlX2xlZnQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKGRzdF9idWYgKyBwb3MtPnNlZ19ieXRlX3Bvcywgc3JjX2J1ZiwgKmNudCkgIT0gMCkgeworCQlUUkFDRV9FWElUIC1FRkFVTFQ7CisJfQorCVRSQUNFX0VYSVQgKmNudDsKK30KKworc3RhdGljIGludCBjaGVja193cml0ZV9hY2Nlc3MoaW50IHJlcV9sZW4sCisJCQkgICAgICBjb25zdCB6ZnRfdm9saW5mbyAqKnZvbHVtZSwKKwkJCSAgICAgIHpmdF9wb3NpdGlvbiAqcG9zLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgaW50IGJsa19zeikKK3sKKwlpbnQgcmVzdWx0OworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKChyZXFfbGVuICUgemZ0X2Jsa19zeikgIT0gMCkgeworCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCisJCQkgICAgIndyaXRlLWNvdW50ICVkIG11c3QgYmUgbXVsdGlwbGUgb2YgYmxvY2stc2l6ZSAlZCIsCisJCQkgICAgcmVxX2xlbiwgYmxrX3N6KTsKKwl9CisJaWYgKHpmdF9pb19zdGF0ZSA9PSB6ZnRfd3JpdGluZykgeworCQkvKiAgYWxsIG90aGVyIGVycm9yIGNvbmRpdGlvbnMgaGF2ZSBiZWVuIGNoZWNrZWQgZWFybGllcgorCQkgKi8KKwkJVFJBQ0VfRVhJVCAwOworCX0KKwl6ZnRfaW9fc3RhdGUgPSB6ZnRfaWRsZTsKKwlUUkFDRV9DQVRDSCh6ZnRfY2hlY2tfd3JpdGVfYWNjZXNzKHBvcyksKTsKKwkvKiAgSWYgd2UgaGF2ZW4ndCByZWFkIHRoZSBoZWFkZXIgc2VnbWVudCB5ZXQsIGRvIGl0IG5vdy4KKwkgKiAgVGhpcyB3aWxsIHZlcmlmeSB0aGUgY29uZmlndXJhdGlvbiwgZ2V0IHRoZSBiYWQgc2VjdG9yCisJICogIHRhYmxlIGFuZCByZWFkIHRoZSB2b2x1bWUgdGFibGUgc2VnbWVudCAKKwkgKi8KKwlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgeworCQlUUkFDRV9DQVRDSCh6ZnRfcmVhZF9oZWFkZXJfc2VnbWVudHMoKSwpOworCX0KKwkvKiAgZmluZS4gTm93IHRoZSB0YXBlIGlzIGVpdGhlciBhdCBCT1Qgb3IgYXQgRU9ELAorCSAqICBXcml0ZSBzdGFydCBvZiB2b2x1bWUgbm93CisJICovCisJVFJBQ0VfQ0FUQ0goemZ0X29wZW5fdm9sdW1lKHBvcywgYmxrX3N6LCB6ZnRfdXNlX2NvbXByZXNzaW9uKSwpOworCSp2b2x1bWUgPSB6ZnRfZmluZF92b2x1bWUocG9zLT5zZWdfcG9zKTsKKwlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgIiIsICp2b2x1bWUpOworCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAwOworCS8qIG5vdyBtZXJnZSB3aXRoIG9sZCBkYXRhIGlmIG5lY2Vzc2FyeSAqLworCWlmICghemZ0X3FpY19tb2RlICYmIHBvcy0+c2VnX2J5dGVfcG9zICE9IDApeworCQlyZXN1bHQgPSB6ZnRfZmV0Y2hfc2VnbWVudChwb3MtPnNlZ19wb3MsCisJCQkJCSAgIHpmdF9kZWJsb2NrX2J1ZiwKKwkJCQkJICAgRlRfUkRfU0lOR0xFKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWlmIChyZXN1bHQgPT0gLUVJTlRSIHx8IHJlc3VsdCA9PSAtRU5PU1BDKSB7CisJCQkJVFJBQ0VfRVhJVCByZXN1bHQ7CisJCQl9CisJCQlUUkFDRShmdF90X25vaXNlLCAKKwkJCSAgICAgICJmdGFwZV9yZWFkX3NlZ21lbnQoKSByZXN1bHQ6ICVkLiAiCisJCQkgICAgICAiVGhpcyBtaWdodCBiZSBub3JtYWwgd2hlbiB1c2luZyAiCisJCQkgICAgICAiYSBuZXdseVxuZm9ybWF0dGVkIHRhcGUiLCByZXN1bHQpOworCQkJbWVtc2V0KHpmdF9kZWJsb2NrX2J1ZiwgJ1wwJywgcG9zLT5zZWdfYnl0ZV9wb3MpOworCQl9CisJfQorCXpmdF9pb19zdGF0ZSA9IHpmdF93cml0aW5nOworCVRSQUNFX0VYSVQgMDsKK30KKworc3RhdGljIGludCBmaWxsX2RlYmxvY2tfYnVmKF9fdTggKmRzdF9idWYsIGNvbnN0IGludCBzZWdfc3osCisJCQkgICAgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCisJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzcl9idWYsIGNvbnN0IGludCByZXFfbGVuKQoreworCWludCBjbnQgPSAwOworCWludCByZXN1bHQgPSAwOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCisJaWYgKHNlZ19zeiA9PSAwKSB7CisJCVRSQUNFX0FCT1JUKDAsIGZ0X3RfZGF0YV9mbG93LCAiZW1wdHkgc2VnbWVudCIpOworCX0KKwlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIgorCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nIHJlcV9sZW46ICVkXG4iCisJICAgICAgS0VSTl9JTkZPICIgICAgICAgICAgYnVmX3BvczogJWQiLCAKKwkgICAgICByZXFfbGVuLCBwb3MtPnNlZ19ieXRlX3Bvcyk7CisJLyogemZ0X2RlYmxvY2tfYnVmIHdpbGwgbm90IGNvbnRhaW4gYSB2YWxpZCBzZWdtZW50IGFueSBsb25nZXIgKi8KKwl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7CisJaWYgKHpmdF91c2VfY29tcHJlc3Npb24pIHsKKwkJVFJBQ0VfQ0FUQ0goemZ0X2NtcHJfbG9jaygxIC8qIHRyeSB0byBsb2FkICovKSwpOworCQlUUkFDRV9DQVRDSChyZXN1bHQ9ICgqemZ0X2NtcHJfb3BzLT53cml0ZSkoJmNudCwKKwkJCQkJCQkgICBkc3RfYnVmLCBzZWdfc3osCisJCQkJCQkJICAgdXNyX2J1ZiwgcmVxX2xlbiwKKwkJCQkJCQkgICBwb3MsIHZvbHVtZSksKTsKKwl9IGVsc2UgeworCQlUUkFDRV9DQVRDSChyZXN1bHQ9IHpmdF9zaW1wbGVfd3JpdGUoJmNudCwKKwkJCQkJCSAgICAgZHN0X2J1Ziwgc2VnX3N6LAorCQkJCQkJICAgICB1c3JfYnVmLCByZXFfbGVuLAorCQkJCQkJICAgICBwb3MsIHZvbHVtZSksKTsKKwl9CisJcG9zLT52b2x1bWVfcG9zICAgKz0gcmVzdWx0OworCXBvcy0+c2VnX2J5dGVfcG9zICs9IGNudDsKKwlwb3MtPnRhcGVfcG9zICAgICArPSBjbnQ7CisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJcbiIKKwkgICAgICBLRVJOX0lORk8gInJlbW92ZWQgZnJvbSB1c2VyLWJ1ZmZlciA6ICVkIGJ5dGVzLlxuIgorCSAgICAgIEtFUk5fSU5GTyAiY29waWVkIHRvIHpmdF9kZWJsb2NrX2J1ZjogJWQgYnl0ZXMuXG4iCisJICAgICAgS0VSTl9JTkZPICJ6ZnRfdGFwZV9wb3MgICAgICAgICAgICAgOiAiIExMX1ggIiBieXRlcy4iLAorCSAgICAgIHJlc3VsdCwgY250LCBMTChwb3MtPnRhcGVfcG9zKSk7CisJVFJBQ0VfRVhJVCByZXN1bHQ7Cit9CisKKworLyogIGNhbGxlZCBieSB0aGUga2VybmVsLWludGVyZmFjZSByb3V0aW5lICJ6ZnRfd3JpdGUoKSIKKyAqLworaW50IF96ZnRfd3JpdGUoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsIGludCByZXFfbGVuKQoreworCWludCByZXN1bHQgPSAwOworCWludCB3cml0dGVuID0gMDsKKwlpbnQgd3JpdGVfY250OworCWludCBzZWdfc3o7CisJc3RhdGljIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUgPSBOVUxMOworCVRSQUNFX0ZVTihmdF90X2Zsb3cpOworCQorCXpmdF9yZXNpZCAgICAgICAgID0gcmVxX2xlbjsJCisJbGFzdF93cml0ZV9mYWlsZWQgPSAxOyAvKiByZXNldCB0byAwIHdoZW4gc3VjY2Vzc2Z1bCAqLworCS8qIGNoZWNrIGlmIHdyaXRlIGlzIGFsbG93ZWQgCisJICovCisJVFJBQ0VfQ0FUQ0goY2hlY2tfd3JpdGVfYWNjZXNzKHJlcV9sZW4sICZ2b2x1bWUsJnpmdF9wb3MsemZ0X2Jsa19zeiksKTsKKwl3aGlsZSAocmVxX2xlbiA+IDApIHsKKwkJLyogQWxsb3cgdXMgdG8gZXNjYXBlIGZyb20gdGhpcyBsb29wIHdpdGggYSBzaWduYWwgIQorCQkgKi8KKwkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOworCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeih6ZnRfcG9zLnNlZ19wb3MpOworCQlpZiAoKHdyaXRlX2NudCA9IGZpbGxfZGVibG9ja19idWYoemZ0X2RlYmxvY2tfYnVmLAorCQkJCQkJICBzZWdfc3osCisJCQkJCQkgICZ6ZnRfcG9zLAorCQkJCQkJICB2b2x1bWUsCisJCQkJCQkgIGJ1ZmYsCisJCQkJCQkgIHJlcV9sZW4pKSA8IDApIHsKKwkJCXpmdF9yZXNpZCAtPSB3cml0dGVuOworCQkJaWYgKHdyaXRlX2NudCA9PSAtRU5PU1BDKSB7CisJCQkJLyogbGVhdmUgdGhlIHJlbWFpbmRlciB0byBmbHVzaF9idWZmZXJzKCkKKwkJCQkgKi8KKwkJCQlUUkFDRShmdF90X2luZm8sICJObyBzcGFjZSBsZWZ0IG9uIGRldmljZSIpOworCQkJCWxhc3Rfd3JpdGVfZmFpbGVkID0gMDsKKwkJCQlpZiAoIW5lZWRfZmx1c2gpIHsKKwkJCQkJbmVlZF9mbHVzaCA9IHdyaXR0ZW4gPiAwOworCQkJCX0KKwkJCQlUUkFDRV9FWElUIHdyaXR0ZW4gPiAwID8gd3JpdHRlbiA6IC1FTk9TUEM7CisJCQl9IGVsc2UgeworCQkJCVRSQUNFX0VYSVQgcmVzdWx0OworCQkJfQorCQl9CisJCWlmICh6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9PSBzZWdfc3opIHsKKwkJCVRSQUNFX0NBVENIKGZ0YXBlX3dyaXRlX3NlZ21lbnQoemZ0X3Bvcy5zZWdfcG9zLCAKKwkJCQkJCQl6ZnRfZGVibG9ja19idWYsCisJCQkJCQkJRlRfV1JfQVNZTkMpLAorCQkJCSAgICB6ZnRfcmVzaWQgLT0gd3JpdHRlbik7CisJCQl6ZnRfd3JpdHRlbl9zZWdtZW50cyArKzsKKwkJCXpmdF9wb3Muc2VnX2J5dGVfcG9zID0gIDA7CisJCQl6ZnRfZGVibG9ja19zZWdtZW50ICA9IHpmdF9wb3Muc2VnX3BvczsKKwkJCSsremZ0X3Bvcy5zZWdfcG9zOworCQl9CisJCXdyaXR0ZW4gKz0gd3JpdGVfY250OworCQlidWZmICAgICs9IHdyaXRlX2NudDsKKwkJcmVxX2xlbiAtPSB3cml0ZV9jbnQ7CisJfSAvKiB3aGlsZSAocmVxX2xlbiA+IDApICovCisJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJyZW1haW5pbmcgaW4gYmxvY2tpbmcgYnVmZmVyOiAlZCIsCisJICAgICAgIHpmdF9wb3Muc2VnX2J5dGVfcG9zKTsKKwlUUkFDRShmdF90X2RhdGFfZmxvdywgImp1c3Qgd3JpdHRlbiBieXRlczogJWQiLCB3cml0dGVuKTsKKwlsYXN0X3dyaXRlX2ZhaWxlZCA9IDA7CisJemZ0X3Jlc2lkIC09IHdyaXR0ZW47CisJbmVlZF9mbHVzaCA9IG5lZWRfZmx1c2ggfHwgd3JpdHRlbiA+IDA7CisJVFJBQ0VfRVhJVCB3cml0dGVuOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHdyaXR0ZW4gKi8KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhODg3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX1pGVEFQRV9XUklURV9ICisjZGVmaW5lIF9aRlRBUEVfV1JJVEVfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQorCisgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoKKyAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmgsdiAkCisgKiAkUmV2aXNpb246IDEuMiAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOToxMyAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgd3JpdGUgZnVuY3Rpb25zCisgKiAgICAgIGZvciB0aGUgemZ0YXBlIGRyaXZlciBmb3IgTGludXguCisgKgorICovCisKK2V4dGVybiBpbnQgIHpmdF9mbHVzaF9idWZmZXJzKHZvaWQpOworZXh0ZXJuIGludCAgemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHModm9pZCk7CitleHRlcm4gdm9pZCB6ZnRfcHJldmVudF9mbHVzaCh2b2lkKTsKKworLyogIGhvb2sgZm9yIHRoZSBWRlMgaW50ZXJmYWNlIAorICovCitleHRlcm4gaW50IF96ZnRfd3JpdGUoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsIGludCByZXFfbGVuKTsKKyNlbmRpZiAvKiBfWkZUQVBFX1dSSVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlX3N5bXMuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlX3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGIxNDAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGVfc3ltcy5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqCisgKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZV9zeW1zLmMsdiAkCisgKiAkUmV2aXNpb246IDEuMyAkCisgKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOToxNCAkCisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN5bWJvbHMgdGhhdCB0aGUgemZ0YXBlIGZyb250ZW5kIHRvIAorICogICAgICB0aGUgZnRhcGUgZmxvcHB5IHRhcGUgZHJpdmVyIGV4cG9ydHMgCisgKi8JCSAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+CisKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKKyNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgorCisvKiB6ZnRhcGUtaW5pdC5jICovCitFWFBPUlRfU1lNQk9MKHpmdF9jbXByX3JlZ2lzdGVyKTsKKy8qIHpmdGFwZS1yZWFkLmMgKi8KK0VYUE9SVF9TWU1CT0woemZ0X2ZldGNoX3NlZ21lbnRfZnJhY3Rpb24pOworLyogemZ0YXBlLWJ1ZmZlcnMuYyAqLworRVhQT1JUX1NZTUJPTCh6ZnRfdm1hbGxvY19vbmNlKTsKK0VYUE9SVF9TWU1CT0woemZ0X3ZtYWxsb2NfYWx3YXlzKTsKK0VYUE9SVF9TWU1CT0woemZ0X3ZmcmVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9nZW5lcmljX252cmFtLmMgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19udnJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNWUwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19udnJhbS5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogR2VuZXJpYyAvZGV2L252cmFtIGRyaXZlciBmb3IgYXJjaGl0ZWN0dXJlcyBwcm92aWRpbmcgc29tZQorICogImdlbmVyaWMiIGhvb2tzLCB0aGF0IGlzIDoKKyAqCisgKiBudnJhbV9yZWFkX2J5dGUsIG52cmFtX3dyaXRlX2J5dGUsIG52cmFtX3N5bmMKKyAqCisgKiBOb3RlIHRoYXQgYW4gYWRkaXRpb25hbCBob29rIGlzIHN1cHBvcnRlZCBmb3IgUG93ZXJNYWMgb25seQorICogZm9yIGdldHRpbmcgdGhlIG52cmFtICJwYXJ0aXRpb24iIGluZm9ybWF0aW9ucworICoKKyAqLworCisjZGVmaW5lIE5WUkFNX1ZFUlNJT04gIjEuMSIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vbnZyYW0uaD4KKworI2RlZmluZSBOVlJBTV9TSVpFCTgxOTIKKworc3RhdGljIGxvZmZfdCBudnJhbV9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJbG9ja19rZXJuZWwoKTsKKwlzd2l0Y2ggKG9yaWdpbikgeworCWNhc2UgMToKKwkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDI6CisJCW9mZnNldCArPSBOVlJBTV9TSVpFOworCQlicmVhazsKKwl9CisJaWYgKG9mZnNldCA8IDApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBmaWxlLT5mX3BvczsKK30KKworc3RhdGljIHNzaXplX3QgcmVhZF9udnJhbShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciBfX3VzZXIgKnAgPSBidWY7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKnBwb3MgPj0gTlZSQU1fU0laRSkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gKnBwb3M7IGNvdW50ID4gMCAmJiBpIDwgTlZSQU1fU0laRTsgKytpLCArK3AsIC0tY291bnQpCisJCWlmIChfX3B1dF91c2VyKG52cmFtX3JlYWRfYnl0ZShpKSwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkqcHBvcyA9IGk7CisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX252cmFtKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciBfX3VzZXIgKnAgPSBidWY7CisJY2hhciBjOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKnBwb3MgPj0gTlZSQU1fU0laRSkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gKnBwb3M7IGNvdW50ID4gMCAmJiBpIDwgTlZSQU1fU0laRTsgKytpLCArK3AsIC0tY291bnQpIHsKKwkJaWYgKF9fZ2V0X3VzZXIoYywgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbnZyYW1fd3JpdGVfYnl0ZShjLCBpKTsKKwl9CisJKnBwb3MgPSBpOworCXJldHVybiBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IG52cmFtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaChjbWQpIHsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwljYXNlIE9CU09MRVRFX1BNQUNfTlZSQU1fR0VUX09GRlNFVDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZyYW06IFVzaW5nIG9ic29sZXRlIFBNQUNfTlZSQU1fR0VUX09GRlNFVCBpb2N0bFxuIik7CisJY2FzZSBJT0NfTlZSQU1fR0VUX09GRlNFVDogeworCQlpbnQgcGFydCwgb2Zmc2V0OworCisJCWlmIChfbWFjaGluZSAhPSBfTUFDSF9QbWFjKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcGFydCwgKHZvaWQgX191c2VyKilhcmcsIHNpemVvZihwYXJ0KSkgIT0gMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocGFydCA8IHBtYWNfbnZyYW1fT0YgfHwgcGFydCA+IHBtYWNfbnZyYW1fTlIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJb2Zmc2V0ID0gcG1hY19nZXRfcGFydGl0aW9uKHBhcnQpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciopYXJnLCAmb2Zmc2V0LCBzaXplb2Yob2Zmc2V0KSkgIT0gMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCisJY2FzZSBJT0NfTlZSQU1fU1lOQzoKKwkJbnZyYW1fc3luYygpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBudnJhbV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG52cmFtX2xsc2VlaywKKwkucmVhZAkJPSByZWFkX252cmFtLAorCS53cml0ZQkJPSB3cml0ZV9udnJhbSwKKwkuaW9jdGwJCT0gbnZyYW1faW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbnZyYW1fZGV2ID0geworCU5WUkFNX01JTk9SLAorCSJudnJhbSIsCisJJm52cmFtX2ZvcHMKK307CisKK2ludCBfX2luaXQgbnZyYW1faW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIk1hY2ludG9zaCBub24tdm9sYXRpbGUgbWVtb3J5IGRyaXZlciB2JXNcbiIsCisJCU5WUkFNX1ZFUlNJT04pOworCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZudnJhbV9kZXYpOworfQorCit2b2lkIF9fZXhpdCBudnJhbV9jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIG1pc2NfZGVyZWdpc3RlciggJm52cmFtX2RldiApOworfQorCittb2R1bGVfaW5pdChudnJhbV9pbml0KTsKK21vZHVsZV9leGl0KG52cmFtX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRhNzMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKQEAgLTAsMCArMSwxMDAxIEBACisvKgorICogIGdlbmVyaWNfc2VyaWFsLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LzE5OTkgUi5FLldvbGZmQEJpdFdpemFyZC5ubAorICoKKyAqICB3cml0dGVuIGZvciB0aGUgU1ggc2VyaWFsIGRyaXZlci4KKyAqICAgICBDb250YWlucyB0aGUgY29kZSB0aGF0IHNob3VsZCBiZSBzaGFyZWQgb3ZlciBhbGwgdGhlIHNlcmlhbCBkcml2ZXJzLgorICoKKyAqICBDcmVkaXQgZm9yIHRoZSBpZGVhIHRvIGRvIGl0IHRoaXMgd2F5IG1pZ2h0IGdvIHRvIEFsYW4gQ294LiAKKyAqCisgKgorICogIFZlcnNpb24gMC4xIC0tIERlY2VtYmVyLCAxOTk4LiBJbml0aWFsIHZlcnNpb24uCisgKiAgVmVyc2lvbiAwLjIgLS0gTWFyY2gsIDE5OTkuICAgIFNvbWUgbW9yZSByb3V0aW5lcy4gQnVnZml4ZXMuIEV0Yy4KKyAqICBWZXJzaW9uIDAuNSAtLSBBdWd1c3QsIDE5OTkuICAgU29tZSBtb3JlIGZpeGVzLiBSZWZvcm1hdCBmb3IgTGludXMuCisgKgorICogIEJpdFdpemFyZCBpcyBhY3RpdmVseSBtYWludGFpbmluZyB0aGlzIGZpbGUuIFdlIHNvbWV0aW1lcyBmaW5kCisgKiAgdGhhdCBzb21lb25lIHN1Ym1pdHRlZCBjaGFuZ2VzIHRvIHRoaXMgZmlsZS4gV2UgcmVhbGx5IGFwcHJlY2lhdGUKKyAqICB5b3VyIGhlbHAsIGJ1dCBwbGVhc2Ugc3VibWl0IGNoYW5nZXMgdGhyb3VnaCB1cy4gV2UncmUgZG9pbmcgb3VyCisgKiAgYmVzdCB0byBiZSByZXNwb25zaXZlLiAgLS0gUkVXCisgKiAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBERUJVRyAKKworc3RhdGljIGNoYXIgKiAgICAgICAgICAgICAgICAgIHRtcF9idWY7IAorc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOworCitzdGF0aWMgaW50IGdzX2RlYnVnOworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZ3NfZHByaW50ayhmLCBzdHIuLi4pIGlmIChnc19kZWJ1ZyAmIGYpIHByaW50ayAoc3RyKQorI2Vsc2UKKyNkZWZpbmUgZ3NfZHByaW50ayhmLCBzdHIuLi4pIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjZGVmaW5lIGZ1bmNfZW50ZXIoKSBnc19kcHJpbnRrIChHU19ERUJVR19GTE9XLCAiZ3M6IGVudGVyICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIGZ1bmNfZXhpdCgpICBnc19kcHJpbnRrIChHU19ERUJVR19GTE9XLCAiZ3M6IGV4aXQgICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIE5FV19XUklURV9MT0NLSU5HIDEKKyNpZiBORVdfV1JJVEVfTE9DS0lORworI2RlZmluZSBERUNMICAgICAgLyogTm90aGluZyAqLworI2RlZmluZSBMT0NLSVQgICAgZG93biAoJiBwb3J0LT5wb3J0X3dyaXRlX3NlbSk7CisjZGVmaW5lIFJFTEVBU0VJVCB1cCAoJnBvcnQtPnBvcnRfd3JpdGVfc2VtKTsKKyNlbHNlCisjZGVmaW5lIERFQ0wgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworI2RlZmluZSBMT0NLSVQgICAgc2F2ZV9mbGFncyAoZmxhZ3MpO2NsaSAoKQorI2RlZmluZSBSRUxFQVNFSVQgcmVzdG9yZV9mbGFncyAoZmxhZ3MpCisjZW5kaWYKKworI2RlZmluZSBSU19FVkVOVF9XUklURV9XQUtFVVAJMQorCittb2R1bGVfcGFyYW0oZ3NfZGVidWcsIGludCwgMDY0NCk7CisKKwordm9pZCBnc19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKwlERUNMCisKKwlmdW5jX2VudGVyICgpOyAKKworCWlmICghdHR5KSByZXR1cm47CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcG9ydCkgcmV0dXJuOworCisJaWYgKCEgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSByZXR1cm47CisKKwkvKiBUYWtlIGEgbG9jayBvbiB0aGUgc2VyaWFsIHRyYW5taXQgYnVmZmVyISAqLworCUxPQ0tJVDsKKworCWlmIChwb3J0LT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkgeworCQkvKiBTb3JyeSwgYnVmZmVyIGlzIGZ1bGwsIGRyb3AgY2hhcmFjdGVyLiBVcGRhdGUgc3RhdGlzdGljcz8/Pz8gLS0gUkVXICovCisJCVJFTEVBU0VJVDsKKwkJcmV0dXJuOworCX0KKworCXBvcnQtPnhtaXRfYnVmW3BvcnQtPnhtaXRfaGVhZCsrXSA9IGNoOworCXBvcnQtPnhtaXRfaGVhZCAmPSBTRVJJQUxfWE1JVF9TSVpFIC0gMTsKKwlwb3J0LT54bWl0X2NudCsrOyAgLyogQ2hhcmFjdGVycyBpbiBidWZmZXIgKi8KKworCVJFTEVBU0VJVDsKKwlmdW5jX2V4aXQgKCk7Cit9CisKKworI2lmZGVmIE5FV19XUklURV9MT0NLSU5HCisKKy8qCis+IFByb2JsZW1zIHRvIHRha2UgaW50byBhY2NvdW50IGFyZToKKz4gICAgICAgLTEtIEludGVycnVwdHMgdGhhdCBlbXB0eSBwYXJ0IG9mIHRoZSBidWZmZXIuCis+ICAgICAgIC0yLSBwYWdlIGZhdWx0cyBvbiB0aGUgYWNjZXNzIHRvIHVzZXJzcGFjZS4gCis+ICAgICAgIC0zLSBPdGhlciBwcm9jZXNzZXMgdGhhdCBhcmUgYWxzbyB0cnlpbmcgdG8gZG8gYSAid3JpdGUiLiAKKyovCisKK2ludCBnc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCWludCBjLCB0b3RhbCA9IDA7CisJaW50IHQ7CisKKwlmdW5jX2VudGVyICgpOworCisJaWYgKCF0dHkpIHJldHVybiAwOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQpIHJldHVybiAwOworCisJaWYgKCEgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlyZXR1cm4gMDsKKworCS8qIGdldCBleGNsdXNpdmUgIndyaXRlIiBhY2Nlc3MgdG8gdGhpcyBwb3J0IChwcm9ibGVtIDMpICovCisJLyogVGhpcyBpcyBub3QgYSBzcGlubG9jayBiZWNhdXNlIHdlIGNhbiBoYXZlIGEgZGlzayBhY2Nlc3MgKHBhZ2UgCisJCSBmYXVsdCkgaW4gY29weV9mcm9tX3VzZXIgKi8KKwlkb3duICgmIHBvcnQtPnBvcnRfd3JpdGVfc2VtKTsKKworCXdoaWxlICgxKSB7CisKKwkJYyA9IGNvdW50OworIAorCQkvKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB3ZSAiT1dOIiB0aGUgImhlYWQiLiBOb29uZSBlbHNlIGNhbiAKKwkJICAgY2hhbmdlIHRoZSAiaGVhZCI6IHdlIG93biB0aGUgcG9ydF93cml0ZV9zZW0uICovCisJCS8qIERvbid0IG92ZXJydW4gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJCXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9oZWFkOworCQlpZiAodCA8IGMpIGMgPSB0OworIAorCQkvKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB0aGUgeG1pdF9jbnQgY2FuIG9ubHkgZGVjcmVhc2UuIFRoaXMgCisJCSAgIHdvdWxkIGluY3JlYXNlICJ0Iiwgc28gd2UgbWlnaHQgY29weSB0b28gbGl0dGxlIGNoYXJzLiAqLworCQkvKiBEb24ndCBjb3B5IHBhc3QgdGhlICJoZWFkIiBvZiB0aGUgYnVmZmVyICovCisJCXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gMSAtIHBvcnQtPnhtaXRfY250OworCQlpZiAodCA8IGMpIGMgPSB0OworIAorCQkvKiBDYW4ndCBjb3B5IG1vcmU/IGJyZWFrIG91dCEgKi8KKwkJaWYgKGMgPD0gMCkgYnJlYWs7CisKKwkJbWVtY3B5IChwb3J0LT54bWl0X2J1ZiArIHBvcnQtPnhtaXRfaGVhZCwgYnVmLCBjKTsKKworCQlwb3J0IC0+IHhtaXRfY250ICs9IGM7CisJCXBvcnQgLT4geG1pdF9oZWFkID0gKHBvcnQtPnhtaXRfaGVhZCArIGMpICYgKFNFUklBTF9YTUlUX1NJWkUgLTEpOworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJdG90YWwgKz0gYzsKKwl9CisJdXAgKCYgcG9ydC0+cG9ydF93cml0ZV9zZW0pOworCisJZ3NfZHByaW50ayAoR1NfREVCVUdfV1JJVEUsICJ3cml0ZTogaW50ZXJydXB0cyBhcmUgJXNcbiIsIAorCSAgICAgICAgICAgIChwb3J0LT5mbGFncyAmIEdTX1RYX0lOVEVOKT8iZW5hYmxlZCI6ICJkaXNhYmxlZCIpOyAKKworCWlmIChwb3J0LT54bWl0X2NudCAmJiAKKwkgICAgIXR0eS0+c3RvcHBlZCAmJiAKKwkgICAgIXR0eS0+aHdfc3RvcHBlZCAmJgorCSAgICAhKHBvcnQtPmZsYWdzICYgR1NfVFhfSU5URU4pKSB7CisJCXBvcnQtPmZsYWdzIHw9IEdTX1RYX0lOVEVOOworCQlwb3J0LT5yZC0+ZW5hYmxlX3R4X2ludGVycnVwdHMgKHBvcnQpOworCX0KKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIHRvdGFsOworfQorI2Vsc2UKKy8qCis+IFByb2JsZW1zIHRvIHRha2UgaW50byBhY2NvdW50IGFyZToKKz4gICAgICAgLTEtIEludGVycnVwdHMgdGhhdCBlbXB0eSBwYXJ0IG9mIHRoZSBidWZmZXIuCis+ICAgICAgIC0yLSBwYWdlIGZhdWx0cyBvbiB0aGUgYWNjZXNzIHRvIHVzZXJzcGFjZS4gCis+ICAgICAgIC0zLSBPdGhlciBwcm9jZXNzZXMgdGhhdCBhcmUgYWxzbyB0cnlpbmcgdG8gZG8gYSAid3JpdGUiLiAKKyovCisKK2ludCBnc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CisJaW50IGMsIHRvdGFsID0gMDsKKwlpbnQgdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnVuY19lbnRlciAoKTsKKworCS8qIFRoZSBzdGFuZGFyZCBzZXJpYWwgZHJpdmVyIHJldHVybnMgMCBpbiB0aGlzIGNhc2UuIAorCSAgIFRoYXQgc291bmRzIHRvIG1lIGFzICJObyBlcnJvciwgSSBqdXN0IGRpZG4ndCBnZXQgdG8gd3JpdGluZyBhbnkKKwkgICBieXRlcy4gRmVlbCBmcmVlIHRvIHRyeSBhZ2Fpbi4iIAorCSAgIFRoZSAib2ZmaWNpYWwiIHdheSB0byB3cml0ZSBuIGJ5dGVzIGZyb20gYnVmIGlzOgorCisJCSBmb3IgKG53cml0dGVuID0gMDtud3JpdHRlbiA8IG47bndyaXR0ZW4gKz0gcnYpIHsKKwkJCSBydiA9IHdyaXRlIChmZCwgYnVmK253cml0dGVuLCBuLW53cml0dGVuKTsKKwkJCSBpZiAocnYgPCAwKSBicmVhazsgLy8gRXJyb3I6IGJhaWwgb3V0LiAvLworCQkgfSAKKworCSAgIHdoaWNoIHdpbGwgbG9vcCBlbmRsZXNzbHkgaW4gdGhpcyBjYXNlLiBUaGUgbWFudWFsIHBhZ2UgZm9yIHdyaXRlCisJICAgYWdyZWVzIHdpdGggbWUuIEluIHByYWN0aXNlIGFsbW9zdCBldmVyeWJvZHkgd3JpdGVzIAorCSAgICJ3cml0ZSAoZmQsIGJ1ZixuKTsiIGJ1dCBzb21lIHBlb3BsZSBtaWdodCBoYXZlIGhhZCB0byBkZWFsIHdpdGggCisJICAgaW5jb21wbGV0ZSB3cml0ZXMgaW4gdGhlIHBhc3QgYW5kIGNvcnJlY3RseSBpbXBsZW1lbnRlZCBpdCBieSBub3cuLi4gCisJICovCisKKwlpZiAoIXR0eSkgcmV0dXJuIC1FSU87CisKKwlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXBvcnQgfHwgIXBvcnQtPnhtaXRfYnVmIHx8ICF0bXBfYnVmKQorCQlyZXR1cm4gLUVJTzsKKworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCXdoaWxlICgxKSB7CisJCWNsaSgpOworCQljID0gY291bnQ7CisKKwkJLyogVGhpcyBpcyBzYWZlIGJlY2F1c2Ugd2UgIk9XTiIgdGhlICJoZWFkIi4gTm9vbmUgZWxzZSBjYW4gCisJCSAgIGNoYW5nZSB0aGUgImhlYWQiOiB3ZSBvd24gdGhlIHBvcnRfd3JpdGVfc2VtLiAqLworCQkvKiBEb24ndCBvdmVycnVuIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworCQl0ID0gU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfaGVhZDsKKwkJaWYgKHQgPCBjKSBjID0gdDsKKworCQkvKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB0aGUgeG1pdF9jbnQgY2FuIG9ubHkgZGVjcmVhc2UuIFRoaXMgCisJCSAgIHdvdWxkIGluY3JlYXNlICJ0Iiwgc28gd2UgbWlnaHQgY29weSB0b28gbGl0dGxlIGNoYXJzLiAqLworCQkvKiBEb24ndCBjb3B5IHBhc3QgdGhlICJoZWFkIiBvZiB0aGUgYnVmZmVyICovCisJCXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gMSAtIHBvcnQtPnhtaXRfY250OworCQlpZiAodCA8IGMpIGMgPSB0OworCisJCS8qIENhbid0IGNvcHkgbW9yZT8gYnJlYWsgb3V0ISAqLworCQlpZiAoYyA8PSAwKSB7CisJCQlsb2NhbF9yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCW1lbWNweShwb3J0LT54bWl0X2J1ZiArIHBvcnQtPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwkJcG9ydC0+eG1pdF9oZWFkID0gKChwb3J0LT54bWl0X2hlYWQgKyBjKSAmCisJCSAgICAgICAgICAgICAgICAgICAoU0VSSUFMX1hNSVRfU0laRS0xKSk7CisJCXBvcnQtPnhtaXRfY250ICs9IGM7CisJCWxvY2FsX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJdG90YWwgKz0gYzsKKwl9CisKKwlpZiAocG9ydC0+eG1pdF9jbnQgJiYgCisJICAgICF0dHktPnN0b3BwZWQgJiYgCisJICAgICF0dHktPmh3X3N0b3BwZWQgJiYKKwkgICAgIShwb3J0LT5mbGFncyAmIEdTX1RYX0lOVEVOKSkgeworCQlwb3J0LT5mbGFncyB8PSBHU19UWF9JTlRFTjsKKwkJcG9ydC0+cmQtPmVuYWJsZV90eF9pbnRlcnJ1cHRzIChwb3J0KTsKKwl9CisJZnVuY19leGl0ICgpOworCXJldHVybiB0b3RhbDsKK30KKworI2VuZGlmCisKKworCitpbnQgZ3Nfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHJldDsKKworCWZ1bmNfZW50ZXIgKCk7CisJcmV0ID0gU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfY250IC0gMTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIHJldDsKK30KKworCitpbnQgZ3NfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdzX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCWZ1bmNfZW50ZXIgKCk7CisKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIHBvcnQtPnhtaXRfY250OworfQorCisKK3N0YXRpYyBpbnQgZ3NfcmVhbF9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKwlmdW5jX2VudGVyICgpOworCisJaWYgKCF0dHkpIHJldHVybiAwOworCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFwb3J0LT5yZCkgcmV0dXJuIDA7CisJaWYgKCFwb3J0LT5yZC0+Y2hhcnNfaW5fYnVmZmVyKSByZXR1cm4gMDsKKworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gcG9ydC0+eG1pdF9jbnQgKyBwb3J0LT5yZC0+Y2hhcnNfaW5fYnVmZmVyIChwb3J0KTsKK30KKworCitzdGF0aWMgaW50IGdzX3dhaXRfdHhfZmx1c2hlZCAodm9pZCAqIHB0ciwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KSAKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCA9IHB0cjsKKwl1bnNpZ25lZCBsb25nIGVuZF9qaWZmaWVzOworCWludCBqaWZmaWVzX3RvX3RyYW5zbWl0LCBjaGFyc2xlZnQgPSAwLCBydiA9IDA7CisJaW50IHJjaWI7CisKKwlmdW5jX2VudGVyKCk7CisKKwlnc19kcHJpbnRrIChHU19ERUJVR19GTFVTSCwgInBvcnQ9JXAuXG4iLCBwb3J0KTsKKwlpZiAocG9ydCkgeworCQlnc19kcHJpbnRrIChHU19ERUJVR19GTFVTSCwgInhtaXRfY250PSV4LCB4bWl0X2J1Zj0lcCwgdHR5PSVwLlxuIiwgCisJCXBvcnQtPnhtaXRfY250LCBwb3J0LT54bWl0X2J1ZiwgcG9ydC0+dHR5KTsKKwl9CisKKwlpZiAoIXBvcnQgfHwgcG9ydC0+eG1pdF9jbnQgPCAwIHx8ICFwb3J0LT54bWl0X2J1ZikgeworCQlnc19kcHJpbnRrIChHU19ERUJVR19GTFVTSCwgIkVSUk9SOiAhcG9ydCwgIXBvcnQtPnhtaXRfYnVmIG9yIHByb3QtPnhtaXRfY250IDwgMC5cbiIpOworCQlmdW5jX2V4aXQoKTsKKwkJcmV0dXJuIC1FSU5WQUw7ICAvKiBUaGlzIGlzIGFuIGVycm9yIHdoaWNoIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZS4gKi8KKwl9CisKKwlyY2liID0gZ3NfcmVhbF9jaGFyc19pbl9idWZmZXIocG9ydC0+dHR5KTsKKworCWlmKHJjaWIgPD0gMCkgeworCQlnc19kcHJpbnRrIChHU19ERUJVR19GTFVTSCwgIm5vdGhpbmcgdG8gd2FpdCBmb3IuXG4iKTsKKwkJZnVuY19leGl0KCk7CisJCXJldHVybiBydjsKKwl9CisJLyogc3RvcCB0cnlpbmc6IG5vdyArIHR3aWNlIHRoZSB0aW1lIGl0IHdvdWxkIG5vcm1hbGx5IHRha2UgKyAgc2Vjb25kcyAqLworCWlmICh0aW1lb3V0ID09IDApIHRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwllbmRfamlmZmllcyAgPSBqaWZmaWVzOyAKKwlpZiAodGltZW91dCAhPSAgTUFYX1NDSEVEVUxFX1RJTUVPVVQpCisJCWVuZF9qaWZmaWVzICs9IHBvcnQtPmJhdWQ/KDIgKiByY2liICogMTAgKiBIWiAvIHBvcnQtPmJhdWQpOjA7CisJZW5kX2ppZmZpZXMgKz0gdGltZW91dDsKKworCWdzX2RwcmludGsgKEdTX0RFQlVHX0ZMVVNILCAibm93PSVseCwgZW5kPSVseCAoJWxkKS5cbiIsIAorCQkgICAgamlmZmllcywgZW5kX2ppZmZpZXMsIGVuZF9qaWZmaWVzLWppZmZpZXMpOyAKKworCS8qIHRoZSBleHByZXNzaW9uIGlzIGFjdHVhbGx5IGppZmZpZXMgPCBlbmRfamlmZmllcywgYnV0IHRoYXQgd29uJ3QKKwkgICB3b3JrIGFyb3VuZCB0aGUgd3JhcGFyb3VuZC4gVHJpY2t5IGVoPyAqLworCXdoaWxlICgoY2hhcnNsZWZ0ID0gZ3NfcmVhbF9jaGFyc19pbl9idWZmZXIgKHBvcnQtPnR0eSkpICYmCisJICAgICAgICB0aW1lX2FmdGVyIChlbmRfamlmZmllcywgamlmZmllcykpIHsKKwkJLyogVW5pdHMgY2hlY2s6IAorCQkgICBjaGFycyAqIChiaXRzL2NoYXIpICogKGppZmZpZXMgL3NlYykgLyAoYml0cy9zZWMpID0gamlmZmllcyEKKwkJICAgY2hlY2shICovCisKKwkJY2hhcnNsZWZ0ICs9IDE2OyAvKiBBbGxvdyAxNiBjaGFycyBtb3JlIHRvIGJlIHRyYW5zbWl0dGVkIC4uLiAqLworCQlqaWZmaWVzX3RvX3RyYW5zbWl0ID0gcG9ydC0+YmF1ZD8oMSArIGNoYXJzbGVmdCAqIDEwICogSFogLyBwb3J0LT5iYXVkKTowOworCQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eIFJvdW5kIHVwLi4uLiAqLworCQlpZiAoamlmZmllc190b190cmFuc21pdCA8PSAwKSBqaWZmaWVzX3RvX3RyYW5zbWl0ID0gMTsKKworCQlnc19kcHJpbnRrIChHU19ERUJVR19GTFVTSCwgIkV4cGVjdCB0byBmaW5pc2ggaW4gJWQgamlmZmllcyAiCisJCQkgICAgIiglZCBjaGFycykuXG4iLCBqaWZmaWVzX3RvX3RyYW5zbWl0LCBjaGFyc2xlZnQpOyAKKworCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGppZmZpZXNfdG9fdHJhbnNtaXQpKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJZ3NfZHByaW50ayAoR1NfREVCVUdfRkxVU0gsICJTaWduYWwgcGVuZGluZy4gQm9tYmluZyBvdXQ6ICIpOyAKKwkJCXJ2ID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlnc19kcHJpbnRrIChHU19ERUJVR19GTFVTSCwgImNoYXJzbGVmdCA9ICVkLlxuIiwgY2hhcnNsZWZ0KTsgCisJc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfUlVOTklORyk7CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gcnY7Cit9CisKKworCit2b2lkIGdzX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICpwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyICgpOworCisJaWYgKCF0dHkpIHJldHVybjsKKworCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFwb3J0KSByZXR1cm47CisKKwkvKiBYWFggV291bGQgdGhlIHdyaXRlIHNlbWFwaG9yZSBkbz8gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJcG9ydC0+eG1pdF9jbnQgPSBwb3J0LT54bWl0X2hlYWQgPSBwb3J0LT54bWl0X3RhaWwgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKKwlmdW5jX2V4aXQgKCk7Cit9CisKKwordm9pZCBnc19mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQpIHJldHVybjsKKworCWlmIChwb3J0LT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwKKwkgICAgIXBvcnQtPnhtaXRfYnVmKSB7CisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEJlYXRzIG1lIC0tIFJFVyAqLworCXBvcnQtPmZsYWdzIHw9IEdTX1RYX0lOVEVOOworCXBvcnQtPnJkLT5lbmFibGVfdHhfaW50ZXJydXB0cyAocG9ydCk7CisJZnVuY19leGl0ICgpOworfQorCisKK3ZvaWQgZ3Nfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlpZiAoIXR0eSkgcmV0dXJuOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQpIHJldHVybjsKKworCWlmIChwb3J0LT54bWl0X2NudCAmJiAKKwkgICAgcG9ydC0+eG1pdF9idWYgJiYgCisJICAgIChwb3J0LT5mbGFncyAmIEdTX1RYX0lOVEVOKSApIHsKKwkJcG9ydC0+ZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOworCQlwb3J0LT5yZC0+ZGlzYWJsZV90eF9pbnRlcnJ1cHRzIChwb3J0KTsKKwl9CisJZnVuY19leGl0ICgpOworfQorCisKK3ZvaWQgZ3Nfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CisKKwlpZiAoIXR0eSkgcmV0dXJuOworCisJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQpIHJldHVybjsKKworCWlmIChwb3J0LT54bWl0X2NudCAmJiAKKwkgICAgcG9ydC0+eG1pdF9idWYgJiYgCisJICAgICEocG9ydC0+ZmxhZ3MgJiBHU19UWF9JTlRFTikgKSB7CisJCXBvcnQtPmZsYWdzIHw9IEdTX1RYX0lOVEVOOworCQlwb3J0LT5yZC0+ZW5hYmxlX3R4X2ludGVycnVwdHMgKHBvcnQpOworCX0KKwlmdW5jX2V4aXQgKCk7Cit9CisKKworc3RhdGljIHZvaWQgZ3Nfc2h1dGRvd25fcG9ydCAoc3RydWN0IGdzX3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIoKTsKKwkKKwlpZiAoIXBvcnQpIHJldHVybjsKKwkKKwlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAocG9ydC0+eG1pdF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwb3J0LT54bWl0X2J1Zik7CisJCXBvcnQtPnhtaXRfYnVmID0gTlVMTDsKKwl9CisKKwlpZiAocG9ydC0+dHR5KQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnBvcnQtPnR0eS0+ZmxhZ3MpOworCisJcG9ydC0+cmQtPnNodXRkb3duX3BvcnQgKHBvcnQpOworCisJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlmdW5jX2V4aXQoKTsKK30KKworCit2b2lkIGdzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBnc19wb3J0ICAgKnBvcnQ7CisKKwlmdW5jX2VudGVyICgpOworCisJaWYgKCF0dHkpIHJldHVybjsKKworCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXR0eSA9IHBvcnQtPnR0eTsKKwlpZiAoIXR0eSkgCisJCXJldHVybjsKKworCWdzX3NodXRkb3duX3BvcnQgKHBvcnQpOworCXBvcnQtPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxHU19BQ1RJVkUpOworCXBvcnQtPnR0eSA9IE5VTEw7CisJcG9ydC0+Y291bnQgPSAwOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCWZ1bmNfZXhpdCAoKTsKK30KKworCitpbnQgZ3NfYmxvY2tfdGlsX3JlYWR5KHZvaWQgKnBvcnRfLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGdzX3BvcnQgKnBvcnQgPSBwb3J0XzsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgICAgcmV0dmFsOworCWludCAgICBkb19jbG9jYWwgPSAwOworCWludCAgICBDRDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyICgpOworCisJaWYgKCFwb3J0KSByZXR1cm4gMDsKKworCXR0eSA9IHBvcnQtPnR0eTsKKworCWlmICghdHR5KSByZXR1cm4gMDsKKworCWdzX2RwcmludGsgKEdTX0RFQlVHX0JUUiwgIkVudGVyaW5nIGdzX2Jsb2NrX3RpbGxfcmVhZHkuXG4iKTsgCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgcG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnBvcnQtPmNsb3NlX3dhaXQpOworCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWVsc2UKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAiYWZ0ZXIgaHVuZyB1cFxuIik7IAorCisJLyoKKwkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAorCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KKwkgKi8KKwlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCSAgICAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7CisJCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAwOworCX0KKworCWdzX2RwcmludGsgKEdTX0RFQlVHX0JUUiwgImFmdGVyIG5vbmJsb2NrXG4iKTsgCisgCisJaWYgKENfQ0xPQ0FMKHR0eSkpCisJCWRvX2Nsb2NhbCA9IDE7CisKKwkvKgorCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisJICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIHBvcnQtPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisJICogcnNfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCisJICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KKwkgKi8KKwlyZXR2YWwgPSAwOworCisJYWRkX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCisJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAiYWZ0ZXIgYWRkIHdhaXRxLlxuIik7IAorCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlwb3J0LT5jb3VudC0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCXBvcnQtPmJsb2NrZWRfb3BlbisrOworCXdoaWxlICgxKSB7CisJCUNEID0gcG9ydC0+cmQtPmdldF9DRCAocG9ydCk7CisJCWdzX2RwcmludGsgKEdTX0RFQlVHX0JUUiwgIkNEIGlzIG5vdyAlZC5cbiIsIENEKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCSAgICAhKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJgorCQkgICAgKGRvX2Nsb2NhbCB8fCBDRCkpCisJCQlicmVhazsKKwkJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAic2lnbmFsX3BlbmRpbmcgaXMgbm93OiAlZCAoJWx4KVxuIiwgCisJCShpbnQpc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpLCAqKGxvbmcqKSgmY3VycmVudC0+YmxvY2tlZCkpOyAKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwlnc19kcHJpbnRrIChHU19ERUJVR19CVFIsICJHb3Qgb3V0IG9mIHRoZSBsb29wLiAoJWQpXG4iLAorCQkgICAgcG9ydC0+YmxvY2tlZF9vcGVuKTsKKwlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCXBvcnQtPmNvdW50Kys7CisJfQorCXBvcnQtPmJsb2NrZWRfb3Blbi0tOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCWZ1bmNfZXhpdCAoKTsKKwlyZXR1cm4gMDsKK30JCQkgCisKKwordm9pZCBnc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CisJCisJZnVuY19lbnRlciAoKTsKKworCWlmICghdHR5KSByZXR1cm47CisKKwlwb3J0ID0gKHN0cnVjdCBnc19wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXBvcnQpIHJldHVybjsKKworCWlmICghcG9ydC0+dHR5KSB7CisJCS8qIFRoaXMgc2VlbXMgdG8gaGFwcGVuIHdoZW4gdGhpcyBpcyBjYWxsZWQgZnJvbSB2aGFuZ3VwLiAqLworCQlnc19kcHJpbnRrIChHU19ERUJVR19DTE9TRSwgImdzOiBPZGQ6IHBvcnQtPnR0eSBpcyBOVUxMXG4iKTsKKwkJcG9ydC0+dHR5ID0gdHR5OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHBvcnQtPnJkLT5odW5ndXApCisJCQlwb3J0LT5yZC0+aHVuZ3VwIChwb3J0KTsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm47CisJfQorCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChwb3J0LT5jb3VudCAhPSAxKSkgeworCQlwcmludGsoS0VSTl9FUlIgImdzOiBnc19jbG9zZSBwb3J0ICVwOiBiYWQgcG9ydCBjb3VudDsiCisJCSAgICAgICAiIHR0eS0+Y291bnQgaXMgMSwgcG9ydCBjb3VudCBpcyAlZFxuIiwgcG9ydCwgcG9ydC0+Y291bnQpOworCQlwb3J0LT5jb3VudCA9IDE7CisJfQorCWlmICgtLXBvcnQtPmNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImdzOiBnc19jbG9zZSBwb3J0ICVwOiBiYWQgcG9ydCBjb3VudDogJWRcbiIsIHBvcnQsIHBvcnQtPmNvdW50KTsKKwkJcG9ydC0+Y291bnQgPSAwOworCX0KKworCWlmIChwb3J0LT5jb3VudCkgeworCQlnc19kcHJpbnRrKEdTX0RFQlVHX0NMT1NFLCAiZ3NfY2xvc2UgcG9ydCAlcDogY291bnQ6ICVkXG4iLCBwb3J0LCBwb3J0LT5jb3VudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuOworCX0KKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCisJLyoKKwkgKiBOb3cgd2Ugd2FpdCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlciB0byBjbGVhcjsgYW5kIHdlIG5vdGlmeSAKKwkgKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJLyogaWYgKHBvcnQtPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkgICB0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydC0+Y2xvc2luZ193YWl0KTsgKi8KKworCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBzdG9wIGFjY2VwdGluZyBpbnB1dC4gIFRvIGRvIHRoaXMsIHdlCisJICogZGlzYWJsZSB0aGUgcmVjZWl2ZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzLCBhbmQgdGVsbCB0aGUKKwkgKiBpbnRlcnJ1cHQgZHJpdmVyIHRvIHN0b3AgY2hlY2tpbmcgdGhlIGRhdGEgcmVhZHkgYml0IGluIHRoZQorCSAqIGxpbmUgc3RhdHVzIHJlZ2lzdGVyLgorCSAqLworCisJcG9ydC0+cmQtPmRpc2FibGVfcnhfaW50ZXJydXB0cyAocG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCS8qIGNsb3NlIGhhcyBubyB3YXkgb2YgcmV0dXJuaW5nICJFSU5UUiIsIHNvIGRpc2NhcmQgcmV0dXJuIHZhbHVlICovCisJaWYgKHBvcnQtPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkJZ3Nfd2FpdF90eF9mbHVzaGVkIChwb3J0LCBwb3J0LT5jbG9zaW5nX3dhaXQpOworCisJcG9ydC0+ZmxhZ3MgJj0gfkdTX0FDVElWRTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwl0dHktPmNsb3NpbmcgPSAwOworCisJcG9ydC0+ZXZlbnQgPSAwOworCXBvcnQtPnJkLT5jbG9zZSAocG9ydCk7CisJcG9ydC0+cmQtPnNodXRkb3duX3BvcnQgKHBvcnQpOworCXBvcnQtPnR0eSA9IE5VTEw7CisKKwlpZiAocG9ydC0+YmxvY2tlZF9vcGVuKSB7CisJCWlmIChwb3J0LT5jbG9zZV9kZWxheSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydC0+Y2xvc2VfZGVsYXkpKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKKwl9CisJcG9ydC0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcgfCBBU1lOQ19JTklUSUFMSVpFRCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5jbG9zZV93YWl0KTsKKworCWZ1bmNfZXhpdCAoKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50ICAgICBnc19iYXVkcmF0ZXNbXSA9IHsKKyAgMCwgNTAsIDc1LCAxMTAsIDEzNCwgMTUwLCAyMDAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAyNDAwLCA0ODAwLAorICA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAsIDIzMDQwMCwgNDYwODAwLCA5MjE2MDAKK307CisKKwordm9pZCBnc19zZXRfdGVybWlvcyAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRlcm1pb3MgKiBvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgZ3NfcG9ydCAqcG9ydDsKKwlpbnQgYmF1ZHJhdGUsIHRtcCwgcnY7CisJc3RydWN0IHRlcm1pb3MgKnRpb3NwOworCisJZnVuY19lbnRlcigpOworCisJaWYgKCF0dHkpIHJldHVybjsKKworCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFwb3J0KSByZXR1cm47CisJaWYgKCFwb3J0LT50dHkpIHsKKwkJLyogVGhpcyBzZWVtcyB0byBoYXBwZW4gd2hlbiB0aGlzIGlzIGNhbGxlZCBhZnRlciBnc19jbG9zZS4gKi8KKwkJZ3NfZHByaW50ayAoR1NfREVCVUdfVEVSTUlPUywgImdzOiBPZGQ6IHBvcnQtPnR0eSBpcyBOVUxMXG4iKTsKKwkJcG9ydC0+dHR5ID0gdHR5OworCX0KKworCisJdGlvc3AgPSB0dHktPnRlcm1pb3M7CisKKwlpZiAoZ3NfZGVidWcgJiBHU19ERUJVR19URVJNSU9TKSB7CisJCWdzX2RwcmludGsgKEdTX0RFQlVHX1RFUk1JT1MsICJ0ZXJtaW9zIHN0cnVjdHVyZSAoJXApOlxuIiwgdGlvc3ApOworCX0KKworI2lmIDAKKwkvKiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiB0aGF0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHVtYiBjYXJkcyAqLworCS8qIFNtYXJ0IGNhcmRzIHJlcXVpcmUga25vd2xlZGdlIG9mIGlmbGFncyBhbmQgb2ZsYWdzIHRvbzogdGhhdCAKKwkgICBtaWdodCBjaGFuZ2UgaGFyZHdhcmUgY29va2luZyBtb2RlLi4uLiAqLworI2VuZGlmCisJaWYgKG9sZF90ZXJtaW9zKSB7CisJCWlmKCAgICh0aW9zcC0+Y19pZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19pZmxhZykKKwkJICAgJiYgKHRpb3NwLT5jX29mbGFnID09IG9sZF90ZXJtaW9zLT5jX29mbGFnKQorCQkgICAmJiAodGlvc3AtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCisJCSAgICYmICh0aW9zcC0+Y19sZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19sZmxhZykKKwkJICAgJiYgKHRpb3NwLT5jX2xpbmUgID09IG9sZF90ZXJtaW9zLT5jX2xpbmUpCisJCSAgICYmIChtZW1jbXAodGlvc3AtPmNfY2MsIG9sZF90ZXJtaW9zLT5jX2NjLCBOQ0MpID09IDApKSB7CisJCQlnc19kcHJpbnRrKEdTX0RFQlVHX1RFUk1JT1MsICJnc19zZXRfdGVybWlvczogb3B0aW1pemVkIGF3YXlcbiIpOworCQkJcmV0dXJuIC8qIDAgKi87CisJCX0KKwl9IGVsc2UgCisJCWdzX2RwcmludGsoR1NfREVCVUdfVEVSTUlPUywgImdzX3NldF90ZXJtaW9zOiBubyBvbGRfdGVybWlvczogIgorCQkgICAgICAgICAgICJubyBvcHRpbWl6YXRpb25cbiIpOworCisJaWYob2xkX3Rlcm1pb3MgJiYgKGdzX2RlYnVnICYgR1NfREVCVUdfVEVSTUlPUykpIHsKKwkJaWYodGlvc3AtPmNfaWZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfaWZsYWcpICBwcmludGsoImNfaWZsYWcgY2hhbmdlZFxuIik7CisJCWlmKHRpb3NwLT5jX29mbGFnICE9IG9sZF90ZXJtaW9zLT5jX29mbGFnKSAgcHJpbnRrKCJjX29mbGFnIGNoYW5nZWRcbiIpOworCQlpZih0aW9zcC0+Y19jZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19jZmxhZykgIHByaW50aygiY19jZmxhZyBjaGFuZ2VkXG4iKTsKKwkJaWYodGlvc3AtPmNfbGZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfbGZsYWcpICBwcmludGsoImNfbGZsYWcgY2hhbmdlZFxuIik7CisJCWlmKHRpb3NwLT5jX2xpbmUgICE9IG9sZF90ZXJtaW9zLT5jX2xpbmUpICAgcHJpbnRrKCJjX2xpbmUgY2hhbmdlZFxuIik7CisJCWlmKCFtZW1jbXAodGlvc3AtPmNfY2MsIG9sZF90ZXJtaW9zLT5jX2NjLCBOQ0MpKSBwcmludGsoImNfY2MgY2hhbmdlZFxuIik7CisJfQorCisJYmF1ZHJhdGUgPSB0aW9zcC0+Y19jZmxhZyAmIENCQVVEOworCWlmIChiYXVkcmF0ZSAmIENCQVVERVgpIHsKKwkJYmF1ZHJhdGUgJj0gfkNCQVVERVg7CisJCWlmICgoYmF1ZHJhdGUgPCAxKSB8fCAoYmF1ZHJhdGUgPiA0KSkKKwkJCXRpb3NwLT5jX2NmbGFnICY9IH5DQkFVREVYOworCQllbHNlCisJCQliYXVkcmF0ZSArPSAxNTsKKwl9CisKKwliYXVkcmF0ZSA9IGdzX2JhdWRyYXRlc1tiYXVkcmF0ZV07CisJaWYgKCh0aW9zcC0+Y19jZmxhZyAmIENCQVVEKSA9PSBCMzg0MDApIHsKKwkJaWYgKCAgICAgKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCWJhdWRyYXRlID0gNTc2MDA7CisJCWVsc2UgaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJYmF1ZHJhdGUgPSAxMTUyMDA7CisJCWVsc2UgaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfU0hJKQorCQkJYmF1ZHJhdGUgPSAyMzA0MDA7CisJCWVsc2UgaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKKwkJCWJhdWRyYXRlID0gNDYwODAwOworCQllbHNlIGlmICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpCisJCQliYXVkcmF0ZSA9IChwb3J0LT5iYXVkX2Jhc2UgLyBwb3J0LT5jdXN0b21fZGl2aXNvcik7CisJfQorCisJLyogSSByZWNvbW1lbmQgdXNpbmcgVEhJUyBpbnN0ZWFkIG9mIHRoZSBtZXNzIGluIHRlcm1pb3MgKGFuZAorCSAgIGR1cGxpY2F0aW5nIHRoZSBhYm92ZSBjb2RlKS4gTmV4dCB3ZSBzaG91bGQgY3JlYXRlIGEgY2xlYW4KKwkgICBpbnRlcmZhY2UgdG93YXJkcyB0aGlzIHZhcmlhYmxlLiBJZiB5b3VyIGNhcmQgc3VwcG9ydHMgYXJiaXRyYXJ5CisJICAgYmF1ZCByYXRlcywgKGUuZy4gQ0QxNDAwIG9yIDE2NTUwIGJhc2VkIGNhcmRzKSB0aGVuIGV2ZXJ5dGhpbmcKKwkgICB3aWxsIGJlIHZlcnkgZWFzeS4uLi4uICovCisJcG9ydC0+YmF1ZCA9IGJhdWRyYXRlOworCisJLyogVHdvIHRpbWVyIHRpY2tzIHNlZW1zIGVub3VnaCB0byB3YWtldXAgc29tZXRoaW5nIGxpa2UgU0xJUCBkcml2ZXIgKi8KKwkvKiBCYXVkcmF0ZS8xMCBpcyBjcHMuIERpdmlkZSBieSBIWiB0byBnZXQgY2hhcnMgcGVyIHRpY2suICovCisJdG1wID0gKGJhdWRyYXRlIC8gMTAgLyBIWikgKiAyOwkJCSAKKworCWlmICh0bXAgPCAgICAgICAgICAgICAgICAgMCkgdG1wID0gMDsKKwlpZiAodG1wID49IFNFUklBTF9YTUlUX1NJWkUpIHRtcCA9IFNFUklBTF9YTUlUX1NJWkUtMTsKKworCXBvcnQtPndha2V1cF9jaGFycyA9IHRtcDsKKworCS8qIFdlIHNob3VsZCByZWFsbHkgd2FpdCBmb3IgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWxsIHNlbnQgYmVmb3JlCisJICAgY2hhbmdpbmcgdGhlIHNldHRpbmdzLiAtLSBDQUwgKi8KKwlydiA9IGdzX3dhaXRfdHhfZmx1c2hlZCAocG9ydCwgTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCWlmIChydiA8IDApIHJldHVybiAvKiBydiAqLzsKKworCXJ2ID0gcG9ydC0+cmQtPnNldF9yZWFsX3Rlcm1pb3MocG9ydCk7CisJaWYgKHJ2IDwgMCkgcmV0dXJuIC8qIHJ2ICovOworCisJaWYgKCghb2xkX3Rlcm1pb3MgfHwgCisJICAgICAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgJiYKKwkgICAgISggICAgICB0aW9zcC0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXR0eS0+c3RvcHBlZCA9IDA7CisJCWdzX3N0YXJ0KHR0eSk7CisJfQorCisjaWZkZWYgdHl0c29fcGF0Y2hfOTROb3YyNV8xNzI2CisJLyogVGhpcyAibWFrZXMgc2Vuc2UiLCBXaHkgaXMgaXQgY29tbWVudGVkIG91dD8gKi8KKworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorCSAgICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5ncy5vcGVuX3dhaXQpOworI2VuZGlmCisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gLyogMCAqLzsKK30KKworCisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBlbmFibGVkICovCitpbnQgZ3NfaW5pdF9wb3J0KHN0cnVjdCBnc19wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBwYWdlOworCisJZnVuY19lbnRlciAoKTsKKworICAgICAgICBpZiAoIXRtcF9idWYpIHsKKwkJcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUgKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOyAvKiBEb24ndCBleHBlY3QgdGhpcyB0byBtYWtlIGEgZGlmZmVyZW5jZS4gKi8KKwkJaWYgKHRtcF9idWYpCisJCQlmcmVlX3BhZ2UocGFnZSk7CisJCWVsc2UKKwkJCXRtcF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCF0bXBfYnVmKSB7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghcG9ydC0+eG1pdF9idWYpIHsKKwkJLyogV2UgbWF5IHNsZWVwIGluIGdldF96ZXJvZWRfcGFnZSgpICovCisJCXVuc2lnbmVkIGxvbmcgdG1wOworCisJCXRtcCA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUgKCZwb3J0LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAocG9ydC0+eG1pdF9idWYpIAorCQkJZnJlZV9wYWdlICh0bXApOworCQllbHNlCisJCQlwb3J0LT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHRtcDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCFwb3J0LT54bWl0X2J1ZikgeworCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJaWYgKHBvcnQtPnR0eSkgCisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZwb3J0LT50dHktPmZsYWdzKTsKKwlpbml0X01VVEVYKCZwb3J0LT5wb3J0X3dyaXRlX3NlbSk7CisJcG9ydC0+eG1pdF9jbnQgPSBwb3J0LT54bWl0X2hlYWQgPSBwb3J0LT54bWl0X3RhaWwgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJZ3Nfc2V0X3Rlcm1pb3MocG9ydC0+dHR5LCBOVUxMKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnBvcnQtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJcG9ydC0+ZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIDA7Cit9CisKKworaW50IGdzX3NldHNlcmlhbChzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzaW87CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNpbywgc3AsIHNpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkpKQorCQlyZXR1cm4oLUVGQVVMVCk7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChzaW8uYmF1ZF9iYXNlICE9IHBvcnQtPmJhdWRfYmFzZSkgfHwKKwkJICAgIChzaW8uY2xvc2VfZGVsYXkgIT0gcG9ydC0+Y2xvc2VfZGVsYXkpIHx8CisJCSAgICAoKHNpby5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAocG9ydC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJCXJldHVybigtRVBFUk0pOworCX0gCisKKwlwb3J0LT5mbGFncyA9IChwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkoc2lvLmZsYWdzICYgQVNZTkNfVVNSX01BU0spOworICAKKwlwb3J0LT5iYXVkX2Jhc2UgPSBzaW8uYmF1ZF9iYXNlOworCXBvcnQtPmNsb3NlX2RlbGF5ID0gc2lvLmNsb3NlX2RlbGF5OworCXBvcnQtPmNsb3Npbmdfd2FpdCA9IHNpby5jbG9zaW5nX3dhaXQ7CisJcG9ydC0+Y3VzdG9tX2Rpdmlzb3IgPSBzaW8uY3VzdG9tX2Rpdmlzb3I7CisKKwlnc19zZXRfdGVybWlvcyAocG9ydC0+dHR5LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICAgICAgR2VuZXJhdGUgdGhlIHNlcmlhbCBzdHJ1Y3QgaW5mby4KKyAqLworCitpbnQgZ3NfZ2V0c2VyaWFsKHN0cnVjdCBnc19wb3J0ICpwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0ICAgIHNpbzsKKworCW1lbXNldCgmc2lvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKTsKKwlzaW8uZmxhZ3MgPSBwb3J0LT5mbGFnczsKKwlzaW8uYmF1ZF9iYXNlID0gcG9ydC0+YmF1ZF9iYXNlOworCXNpby5jbG9zZV9kZWxheSA9IHBvcnQtPmNsb3NlX2RlbGF5OworCXNpby5jbG9zaW5nX3dhaXQgPSBwb3J0LT5jbG9zaW5nX3dhaXQ7CisJc2lvLmN1c3RvbV9kaXZpc29yID0gcG9ydC0+Y3VzdG9tX2Rpdmlzb3I7CisJc2lvLmh1YjYgPSAwOworCisJLyogSWYgeW91IHdhbnQgeW91IGNhbiBvdmVycmlkZSB0aGVzZS4gKi8KKwlzaW8udHlwZSA9IFBPUlRfVU5LTk9XTjsKKwlzaW8ueG1pdF9maWZvX3NpemUgPSAtMTsKKwlzaW8ubGluZSA9IC0xOworCXNpby5wb3J0ID0gLTE7CisJc2lvLmlycSA9IC0xOworCisJaWYgKHBvcnQtPnJkLT5nZXRzZXJpYWwpCisJCXBvcnQtPnJkLT5nZXRzZXJpYWwgKHBvcnQsICZzaW8pOworCisJaWYgKGNvcHlfdG9fdXNlcihzcCwgJnNpbywgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworCit9CisKKwordm9pZCBnc19nb3RfYnJlYWsoc3RydWN0IGdzX3BvcnQgKnBvcnQpCit7CisJZnVuY19lbnRlciAoKTsKKworCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHBvcnQtPnR0eSwgMCwgVFRZX0JSRUFLKTsKKwl0dHlfc2NoZWR1bGVfZmxpcChwb3J0LT50dHkpOworCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX1NBSykgeworCQlkb19TQUsgKHBvcnQtPnR0eSk7CisJfQorCisJZnVuY19leGl0ICgpOworfQorCisKK0VYUE9SVF9TWU1CT0woZ3NfcHV0X2NoYXIpOworRVhQT1JUX1NZTUJPTChnc193cml0ZSk7CitFWFBPUlRfU1lNQk9MKGdzX3dyaXRlX3Jvb20pOworRVhQT1JUX1NZTUJPTChnc19jaGFyc19pbl9idWZmZXIpOworRVhQT1JUX1NZTUJPTChnc19mbHVzaF9idWZmZXIpOworRVhQT1JUX1NZTUJPTChnc19mbHVzaF9jaGFycyk7CitFWFBPUlRfU1lNQk9MKGdzX3N0b3ApOworRVhQT1JUX1NZTUJPTChnc19zdGFydCk7CitFWFBPUlRfU1lNQk9MKGdzX2hhbmd1cCk7CitFWFBPUlRfU1lNQk9MKGdzX2Jsb2NrX3RpbF9yZWFkeSk7CitFWFBPUlRfU1lNQk9MKGdzX2Nsb3NlKTsKK0VYUE9SVF9TWU1CT0woZ3Nfc2V0X3Rlcm1pb3MpOworRVhQT1JUX1NZTUJPTChnc19pbml0X3BvcnQpOworRVhQT1JUX1NZTUJPTChnc19zZXRzZXJpYWwpOworRVhQT1JUX1NZTUJPTChnc19nZXRzZXJpYWwpOworRVhQT1JUX1NZTUJPTChnc19nb3RfYnJlYWspOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZ2VucnRjLmMgYi9kcml2ZXJzL2NoYXIvZ2VucnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhMmJjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9nZW5ydGMuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAqCVJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UgZm9yCisgKgkJLSBxNDAgYW5kIG90aGVyIG02OGsgbWFjaGluZXMsCisgKgkJLSBIUCBQQVJJU0MgbWFjaGluZXMKKyAqCQktIFBvd2VyUEMgbWFjaGluZXMKKyAqICAgICAgZW11bGF0ZSBzb21lIFJUQyBpcnEgY2FwYWJpbGl0aWVzIGluIHNvZnR3YXJlCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgUmljaGFyZCBaaWRsaWNreQorICoKKyAqCWJhc2VkIG9uIFBhdWwgR29ydG1ha2VyJ3MgcnRjLmMgZGV2aWNlIGFuZAorICogICAgICAgICAgIFNhbSBDcmVhc2V5IEdlbmVyaWMgcnRjIGRyaXZlcgorICoKKyAqCVRoaXMgZHJpdmVyIGFsbG93cyB1c2Ugb2YgdGhlIHJlYWwgdGltZSBjbG9jayAoYnVpbHQgaW50bworICoJbmVhcmx5IGFsbCBjb21wdXRlcnMpIGZyb20gdXNlciBzcGFjZS4gSXQgZXhwb3J0cyB0aGUgL2Rldi9ydGMKKyAqCWludGVyZmFjZSBzdXBwb3J0aW5nIHZhcmlvdXMgaW9jdGwoKSBhbmQgYWxzbyB0aGUgL3Byb2MvZGV2L3J0YworICoJcHNldWRvLWZpbGUgZm9yIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGUgaW9jdGxzIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW50ZXJydXB0IGJlaGF2aW91ciB3aGVyZQorICoJc3VwcG9ydGVkLgorICoKKyAqCVRoZSAvZGV2L3J0YyBpbnRlcmZhY2Ugd2lsbCBibG9jayBvbiByZWFkcyB1bnRpbCBhbiBpbnRlcnJ1cHQKKyAqCWhhcyBiZWVuIHJlY2VpdmVkLiBJZiBhIFJUQyBpbnRlcnJ1cHQgaGFzIGFscmVhZHkgaGFwcGVuZWQsCisgKglpdCB3aWxsIG91dHB1dCBhbiB1bnNpZ25lZCBsb25nIGFuZCB0aGVuIGJsb2NrLiBUaGUgb3V0cHV0IHZhbHVlCisgKgljb250YWlucyB0aGUgaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgbG93IGJ5dGUgYW5kIHRoZSBudW1iZXIgb2YKKyAqCWludGVycnVwdHMgc2luY2UgdGhlIGxhc3QgcmVhZCBpbiB0aGUgcmVtYWluaW5nIGhpZ2ggYnl0ZXMuIFRoZQorICoJL2Rldi9ydGMgaW50ZXJmYWNlIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgc2VsZWN0KDIpIGNhbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisKKyAqICAgICAgMS4wMSBmaXggZm9yIDIuMy5YICAgICAgICAgICAgICAgICAgICByekBsaW51eC1tNjhrLm9yZworICogICAgICAxLjAyIG1lcmdlZCB3aXRoIGNvZGUgZnJvbSBnZW5ydGMuYyAgIHJ6QGxpbnV4LW02OGsub3JnCisgKiAgICAgIDEuMDMgbWFrZSBpdCBtb3JlIHBvcnRhYmxlICAgICAgICAgICAgemlwcGVsQGxpbnV4LW02OGsub3JnCisgKiAgICAgIDEuMDQgcmVtb3ZlZCB1c2VsZXNzIHRpbWVyIGNvZGUgICAgICAgcnpAbGludXgtbTY4ay5vcmcKKyAqICAgICAgMS4wNSBwb3J0YWJsZSBSVENfVUlFIGVtdWxhdGlvbiAgICAgICByekBsaW51eC1tNjhrLm9yZworICogICAgICAxLjA2IHNldF9ydGNfdGltZSBjYW4gcmV0dXJuIGFuIGVycm9yIHRyaW5pQGtlcm5lbC5jcmFzaGluZy5vcmcKKyAqICAgICAgMS4wNyBwb3J0ZWQgdG8gSFAgUEFSSVNDIChocHBhKQkgICAgICBIZWxnZSBEZWxsZXIgPGRlbGxlckBnbXguZGU+CisgKi8KKworI2RlZmluZSBSVENfVkVSU0lPTgkiMS4wNyIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KKworLyoKKyAqCVdlIHNwb25nZSBhIG1pbm9yIG9mZiBvZiB0aGUgbWlzYyBtYWpvci4gTm8gbmVlZCBzbHVycGluZworICoJdXAgYW5vdGhlciB2YWx1YWJsZSBtYWpvciBkZXYgbnVtYmVyIGZvciB0aGlzLiBJZiB5b3UgYWRkCisgKglhbiBpb2N0bCwgbWFrZSBzdXJlIHlvdSBkb24ndCBjb25mbGljdCB3aXRoIFNQQVJDJ3MgUlRDCisgKglpb2N0bHMuCisgKi8KKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGdlbl9ydGNfd2FpdCk7CisKKy8qCisgKglCaXRzIGluIGdlbl9ydGNfc3RhdHVzLgorICovCisKKyNkZWZpbmUgUlRDX0lTX09QRU4JCTB4MDEJLyogbWVhbnMgL2Rldi9ydGMgaXMgaW4gdXNlCSovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdlbl9ydGNfc3RhdHVzOwkvKiBiaXRtYXBwZWQgc3RhdHVzIGJ5dGUuCSovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZW5fcnRjX2lycV9kYXRhOwkvKiBvdXIgb3V0cHV0IHRvIHRoZSB3b3JsZAkqLworCisvKiBtb250aHMgc3RhcnQgYXQgMCBub3cgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRheXNfaW5fbW9bXSA9Cit7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07CisKK3N0YXRpYyBpbnQgaXJxX2FjdGl2ZTsKKworI2lmZGVmIENPTkZJR19HRU5fUlRDX1gKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgZ2VucnRjX3Rhc2s7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXJfdGFzazsKKworc3RhdGljIHVuc2lnbmVkIGludCBvbGRzZWNzOworc3RhdGljIGludCBsb3N0aW50Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHRfZXhwOworCitzdGF0aWMgdm9pZCBnZW5fcnRjX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgc3Rhc2tfYWN0aXZlOyAgICAgICAgICAgICAgLyogc2NoZWR1bGVfd29yayAqLworc3RhdGljIHZvbGF0aWxlIGludCB0dGFza19hY3RpdmU7ICAgICAgICAgICAgICAvKiB0aW1lcl90YXNrICovCitzdGF0aWMgaW50IHN0b3BfcnRjX3RpbWVyczsgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IHJlcXVldWUgdGFza3MgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2VuX3J0Y19sb2NrKTsKKworc3RhdGljIHZvaWQgZ2VuX3J0Y19pbnRlcnJ1cHQodW5zaWduZWQgbG9uZyBhcmcpOworCisvKgorICogUm91dGluZSB0byBwb2xsIFJUQyBzZWNvbmRzIGZpZWxkIGZvciBjaGFuZ2UgYXMgb2Z0ZW4gYXMgcG9zc2libGUsCisgKiBhZnRlciBmaXJzdCBSVENfVUlFIHVzZSB0aW1lciB0byByZWR1Y2UgcG9sbGluZworICovCitzdGF0aWMgdm9pZCBnZW5ydGNfdHJvdXRpbmUodm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wID0gZ2V0X3J0Y19zcygpOworCQorCWlmIChzdG9wX3J0Y190aW1lcnMpIHsKKwkJc3Rhc2tfYWN0aXZlID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmIChvbGRzZWNzICE9IHRtcCl7CisJCW9sZHNlY3MgPSB0bXA7CisKKwkJdGltZXJfdGFzay5mdW5jdGlvbiA9IGdlbl9ydGNfdGltZXI7CisJCXRpbWVyX3Rhc2suZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAtIChIWi8xMCk7CisJCXR0X2V4cD10aW1lcl90YXNrLmV4cGlyZXM7CisJCXR0YXNrX2FjdGl2ZT0xOworCQlzdGFza19hY3RpdmU9MDsKKwkJYWRkX3RpbWVyKCZ0aW1lcl90YXNrKTsKKworCQlnZW5fcnRjX2ludGVycnVwdCgwKTsKKwl9IGVsc2UgaWYgKHNjaGVkdWxlX3dvcmsoJmdlbnJ0Y190YXNrKSA9PSAwKQorCQlzdGFza19hY3RpdmUgPSAwOworfQorCitzdGF0aWMgdm9pZCBnZW5fcnRjX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlsb3N0aW50ID0gZ2V0X3J0Y19zcygpIC0gb2xkc2VjcyA7CisJaWYgKGxvc3RpbnQ8MCkgCisJCWxvc3RpbnQgPSA2MCAtIGxvc3RpbnQ7CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdHRfZXhwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZ2VucnRjOiB0aW1lciB0YXNrIGRlbGF5ZWQgYnkgJWxkIGppZmZpZXNcbiIsCisJCSAgICAgICBqaWZmaWVzLXR0X2V4cCk7CisJdHRhc2tfYWN0aXZlPTA7CisJc3Rhc2tfYWN0aXZlPTE7CisJaWYgKChzY2hlZHVsZV93b3JrKCZnZW5ydGNfdGFzaykgPT0gMCkpCisJCXN0YXNrX2FjdGl2ZSA9IDA7Cit9CisKKy8qIAorICogY2FsbCBnZW5fcnRjX2ludGVycnVwdCBmdW5jdGlvbiB0byBzaWduYWwgYW4gUlRDX1VJRSwKKyAqIGFyZyBpcyB1bnVzZWQuCisgKiBDb3VsZCBiZSBpbnZva2VkIGVpdGhlciBmcm9tIGEgcmVhbCBpbnRlcnJ1cHQgaGFuZGxlciBvcgorICogZnJvbSBzb21lIHJvdXRpbmUgdGhhdCBwZXJpb2RpY2FsbHkgKGVnIDEwMEhaKSBtb25pdG9ycworICogd2hldGhlciBSVENfU0VDUyBjaGFuZ2VkCisgKi8KK3N0YXRpYyB2b2lkIGdlbl9ydGNfaW50ZXJydXB0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCS8qICBXZSBzdG9yZSB0aGUgc3RhdHVzIGluIHRoZSBsb3cgYnl0ZSBhbmQgdGhlIG51bWJlciBvZgorCSAqCWludGVycnVwdHMgcmVjZWl2ZWQgc2luY2UgdGhlIGxhc3QgcmVhZCBpbiB0aGUgcmVtYWluZGVyCisJICoJb2YgcnRjX2lycV9kYXRhLiAgKi8KKworCWdlbl9ydGNfaXJxX2RhdGEgKz0gMHgxMDA7CisJZ2VuX3J0Y19pcnFfZGF0YSAmPSB+MHhmZjsKKwlnZW5fcnRjX2lycV9kYXRhIHw9IFJUQ19VSUU7CisKKwlpZiAobG9zdGludCl7CisJCXByaW50aygiZ2VucnRjOiBzeXN0ZW0gZGVsYXlpbmcgY2xvY2sgdGlja3M/XG4iKTsKKwkJLyogaW5jcmVtZW50IGNvdW50IHNvIHRoYXQgdXNlcnNwYWNlIGtub3dzIHNvbWV0aGluZyBpcyB3cm9uZyAqLworCQlnZW5fcnRjX2lycV9kYXRhICs9ICgobG9zdGludC0xKTw8OCk7CisJCWxvc3RpbnQgPSAwOworCX0KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ2VuX3J0Y193YWl0KTsKK30KKworLyoKKyAqCU5vdyBhbGwgdGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHRoYXQgd2UgZXhwb3J0LgorICovCitzdGF0aWMgc3NpemVfdCBnZW5fcnRjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJc3NpemVfdCByZXR2YWw7CisKKwlpZiAoY291bnQgIT0gc2l6ZW9mICh1bnNpZ25lZCBpbnQpICYmIGNvdW50ICE9IHNpemVvZiAodW5zaWduZWQgbG9uZykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLICYmICFnZW5fcnRjX2lycV9kYXRhKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWFkZF93YWl0X3F1ZXVlKCZnZW5fcnRjX3dhaXQsICZ3YWl0KTsKKwlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisKKwl3aGlsZSAoMSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlkYXRhID0geGNoZygmZ2VuX3J0Y19pcnFfZGF0YSwgMCk7CisJCWlmIChkYXRhKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWdvdG8gb3V0OworCQlzY2hlZHVsZSgpOworCX0KKworCS8qIGZpcnN0IHRlc3QgYWxsb3dzIG9wdGltaXplciB0byBudWtlIHRoaXMgY2FzZSBmb3IgMzItYml0IG1hY2hpbmVzICovCisJaWYgKHNpemVvZiAoaW50KSAhPSBzaXplb2YgKGxvbmcpICYmIGNvdW50ID09IHNpemVvZiAodW5zaWduZWQgaW50KSkgeworCQl1bnNpZ25lZCBpbnQgdWlkYXRhID0gZGF0YTsKKwkJcmV0dmFsID0gcHV0X3VzZXIodWlkYXRhLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilidWYpOworCX0KKwllbHNlIHsKKwkJcmV0dmFsID0gcHV0X3VzZXIoZGF0YSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYnVmKTsKKwl9CisJaWYgKCFyZXR2YWwpCisJCXJldHZhbCA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyBvdXQ6CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmdlbl9ydGNfd2FpdCwgJndhaXQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBnZW5fcnRjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlwb2xsX3dhaXQoZmlsZSwgJmdlbl9ydGNfd2FpdCwgd2FpdCk7CisJaWYgKGdlbl9ydGNfaXJxX2RhdGEgIT0gMCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisvKgorICogVXNlZCB0byBkaXNhYmxlL2VuYWJsZSBpbnRlcnJ1cHRzLCBvbmx5IFJUQ19VSUUgc3VwcG9ydGVkCisgKiBXZSBhbHNvIGNsZWFyIG91dCBhbnkgb2xkIGlycSBkYXRhIGFmdGVyIGFuIGlvY3RsKCkgdGhhdAorICogbWVkZGxlcyB3aXRoIHRoZSBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUgYml0cy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2NsZWFyX3J0Y19pcnFfYml0KHVuc2lnbmVkIGNoYXIgYml0KQoreworI2lmZGVmIENPTkZJR19HRU5fUlRDX1gKKwlzdG9wX3J0Y190aW1lcnMgPSAxOworCWlmICh0dGFza19hY3RpdmUpeworCQlkZWxfdGltZXJfc3luYygmdGltZXJfdGFzayk7CisJCXR0YXNrX2FjdGl2ZSA9IDA7CisJfQorCXdoaWxlIChzdGFza19hY3RpdmUpCisJCXNjaGVkdWxlKCk7CisKKwlzcGluX2xvY2soJmdlbl9ydGNfbG9jayk7CisJaXJxX2FjdGl2ZSA9IDA7CisJc3Bpbl91bmxvY2soJmdlbl9ydGNfbG9jayk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2VuX3NldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCkKK3sKKyNpZmRlZiBDT05GSUdfR0VOX1JUQ19YCisJc3Bpbl9sb2NrKCZnZW5fcnRjX2xvY2spOworCWlmICggIWlycV9hY3RpdmUgKSB7CisJCWlycV9hY3RpdmUgPSAxOworCQlzdG9wX3J0Y190aW1lcnMgPSAwOworCQlsb3N0aW50ID0gMDsKKwkJSU5JVF9XT1JLKCZnZW5ydGNfdGFzaywgZ2VucnRjX3Ryb3V0aW5lLCBOVUxMKTsKKwkJb2xkc2VjcyA9IGdldF9ydGNfc3MoKTsKKwkJaW5pdF90aW1lcigmdGltZXJfdGFzayk7CisKKwkJc3Rhc2tfYWN0aXZlID0gMTsKKwkJaWYgKHNjaGVkdWxlX3dvcmsoJmdlbnJ0Y190YXNrKSA9PSAwKXsKKwkJCXN0YXNrX2FjdGl2ZSA9IDA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmdlbl9ydGNfbG9jayk7CisJZ2VuX3J0Y19pcnFfZGF0YSA9IDA7CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiAtRUlOVkFMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZ2VuX3J0Y19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7CisJc3RydWN0IHJ0Y19wbGxfaW5mbyBwbGw7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBSVENfUExMX0dFVDoKKwkgICAgaWYgKGdldF9ydGNfcGxsKCZwbGwpKQorCSAJICAgIHJldHVybiAtRUlOVkFMOworCSAgICBlbHNlCisJCSAgICByZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZwbGwsIHNpemVvZiBwbGwpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFJUQ19QTExfU0VUOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnBsbCwgYXJncCwgc2l6ZW9mKHBsbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJICAgIHJldHVybiBzZXRfcnRjX3BsbCgmcGxsKTsKKworCWNhc2UgUlRDX1VJRV9PRkY6CS8qIGRpc2FibGUgaW50cyBmcm9tIFJUQyB1cGRhdGVzLgkqLworCQlnZW5fY2xlYXJfcnRjX2lycV9iaXQoUlRDX1VJRSk7CisJCXJldHVybiAwOworCisJY2FzZSBSVENfVUlFX09OOgkvKiBlbmFibGUgaW50cyBmb3IgUlRDIHVwZGF0ZXMuCSovCisJICAgICAgICByZXR1cm4gZ2VuX3NldF9ydGNfaXJxX2JpdChSVENfVUlFKTsKKworCWNhc2UgUlRDX1JEX1RJTUU6CS8qIFJlYWQgdGhlIHRpbWUvZGF0ZSBmcm9tIFJUQwkqLworCQkvKiB0aGlzIGRvZXNuJ3QgZ2V0IHdlZWstZGF5LCB3aG8gY2FyZXMgKi8KKwkJbWVtc2V0KCZ3dGltZSwgMCwgc2l6ZW9mKHd0aW1lKSk7CisJCWdldF9ydGNfdGltZSgmd3RpbWUpOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJnd0aW1lLCBzaXplb2Yod3RpbWUpKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBSVENfU0VUX1RJTUU6CS8qIFNldCB0aGUgUlRDICovCisJICAgIHsKKwkJaW50IHllYXI7CisJCXVuc2lnbmVkIGNoYXIgbGVhcF95cjsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmd3RpbWUsIGFyZ3AsIHNpemVvZih3dGltZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJeWVhciA9IHd0aW1lLnRtX3llYXIgKyAxOTAwOworCQlsZWFwX3lyID0gKCghKHllYXIgJSA0KSAmJiAoeWVhciAlIDEwMCkpIHx8CisJCQkgICAhKHllYXIgJSA0MDApKTsKKworCQlpZiAoKHd0aW1lLnRtX21vbiA8IDAgfHwgd3RpbWUudG1fbW9uID4gMTEpIHx8ICh3dGltZS50bV9tZGF5IDwgMSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAod3RpbWUudG1fbWRheSA8IDAgfHwgd3RpbWUudG1fbWRheSA+CisJCSAgICAoZGF5c19pbl9tb1t3dGltZS50bV9tb25dICsgKCh3dGltZS50bV9tb24gPT0gMSkgJiYgbGVhcF95cikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHd0aW1lLnRtX2hvdXIgPCAwIHx8IHd0aW1lLnRtX2hvdXIgPj0gMjQgfHwKKwkJICAgIHd0aW1lLnRtX21pbiA8IDAgfHwgd3RpbWUudG1fbWluID49IDYwIHx8CisJCSAgICB3dGltZS50bV9zZWMgPCAwIHx8IHd0aW1lLnRtX3NlYyA+PSA2MCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiBzZXRfcnRjX3RpbWUoJnd0aW1lKTsKKwkgICAgfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICoJV2UgZW5mb3JjZSBvbmx5IG9uZSB1c2VyIGF0IGEgdGltZSBoZXJlIHdpdGggdGhlIG9wZW4vY2xvc2UuCisgKglBbHNvIGNsZWFyIHRoZSBwcmV2aW91cyBpbnRlcnJ1cHQgZGF0YSBvbiBhbiBvcGVuLCBhbmQgY2xlYW4KKyAqCXVwIHRoaW5ncyBvbiBhIGNsb3NlLgorICovCisKK3N0YXRpYyBpbnQgZ2VuX3J0Y19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChnZW5fcnRjX3N0YXR1cyAmIFJUQ19JU19PUEVOKQorCQlyZXR1cm4gLUVCVVNZOworCisJZ2VuX3J0Y19zdGF0dXMgfD0gUlRDX0lTX09QRU47CisJZ2VuX3J0Y19pcnFfZGF0YSA9IDA7CisJaXJxX2FjdGl2ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW5fcnRjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKiBUdXJuIG9mZiBhbGwgaW50ZXJydXB0cyBvbmNlIHRoZSBkZXZpY2UgaXMgbm8gbG9uZ2VyCisJICogaW4gdXNlIGFuZCBjbGVhciB0aGUgZGF0YS4KKwkgKi8KKworCWdlbl9jbGVhcl9ydGNfaXJxX2JpdChSVENfUElFfFJUQ19BSUV8UlRDX1VJRSk7CisKKwlnZW5fcnRjX3N0YXR1cyAmPSB+UlRDX0lTX09QRU47CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKKy8qCisgKglJbmZvIGV4cG9ydGVkIHZpYSAiL3Byb2MvcnRjIi4KKyAqLworCitzdGF0aWMgaW50IGdlbl9ydGNfcHJvY19vdXRwdXQoY2hhciAqYnVmKQoreworCWNoYXIgKnA7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXVuc2lnbmVkIGludCBmbGFnczsKKwlzdHJ1Y3QgcnRjX3BsbF9pbmZvIHBsbDsKKworCXAgPSBidWY7CisKKwlmbGFncyA9IGdldF9ydGNfdGltZSgmdG0pOworCisJcCArPSBzcHJpbnRmKHAsCisJCSAgICAgInJ0Y190aW1lXHQ6ICUwMmQ6JTAyZDolMDJkXG4iCisJCSAgICAgInJ0Y19kYXRlXHQ6ICUwNGQtJTAyZC0lMDJkXG4iCisJCSAgICAgInJ0Y19lcG9jaFx0OiAlMDR1XG4iLAorCQkgICAgIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjLAorCQkgICAgIHRtLnRtX3llYXIgKyAxOTAwLCB0bS50bV9tb24gKyAxLCB0bS50bV9tZGF5LCAxOTAwKTsKKworCXRtLnRtX2hvdXIgPSB0bS50bV9taW4gPSB0bS50bV9zZWMgPSAwOworCisJcCArPSBzcHJpbnRmKHAsICJhbGFybVx0XHQ6ICIpOworCWlmICh0bS50bV9ob3VyIDw9IDI0KQorCQlwICs9IHNwcmludGYocCwgIiUwMmQ6IiwgdG0udG1faG91cik7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgIioqOiIpOworCisJaWYgKHRtLnRtX21pbiA8PSA1OSkKKwkJcCArPSBzcHJpbnRmKHAsICIlMDJkOiIsIHRtLnRtX21pbik7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgIioqOiIpOworCisJaWYgKHRtLnRtX3NlYyA8PSA1OSkKKwkJcCArPSBzcHJpbnRmKHAsICIlMDJkXG4iLCB0bS50bV9zZWMpOworCWVsc2UKKwkJcCArPSBzcHJpbnRmKHAsICIqKlxuIik7CisKKwlwICs9IHNwcmludGYocCwKKwkJICAgICAiRFNUX2VuYWJsZVx0OiAlc1xuIgorCQkgICAgICJCQ0RcdFx0OiAlc1xuIgorCQkgICAgICIyNGhyXHRcdDogJXNcbiIKKwkJICAgICAic3F1YXJlX3dhdmVcdDogJXNcbiIKKwkJICAgICAiYWxhcm1fSVJRXHQ6ICVzXG4iCisJCSAgICAgInVwZGF0ZV9JUlFcdDogJXNcbiIKKwkJICAgICAicGVyaW9kaWNfSVJRXHQ6ICVzXG4iCisJCSAgICAgInBlcmlvZGljX2ZyZXFcdDogJWxkXG4iCisJCSAgICAgImJhdHRfc3RhdHVzXHQ6ICVzXG4iLAorCQkgICAgIChmbGFncyAmIFJUQ19EU1RfRU4pID8gInllcyIgOiAibm8iLAorCQkgICAgIChmbGFncyAmIFJUQ19ETV9CSU5BUlkpID8gIm5vIiA6ICJ5ZXMiLAorCQkgICAgIChmbGFncyAmIFJUQ18yNEgpID8gInllcyIgOiAibm8iLAorCQkgICAgIChmbGFncyAmIFJUQ19TUVdFKSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgICAoZmxhZ3MgJiBSVENfQUlFKSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgICBpcnFfYWN0aXZlID8gInllcyIgOiAibm8iLAorCQkgICAgIChmbGFncyAmIFJUQ19QSUUpID8gInllcyIgOiAibm8iLAorCQkgICAgIDBMIC8qIGZyZXEgKi8sCisJCSAgICAgKGZsYWdzICYgUlRDX0JBVFRfQkFEKSA/ICJiYWQiIDogIm9rYXkiKTsKKwlpZiAoIWdldF9ydGNfcGxsKCZwbGwpKQorCSAgICBwICs9IHNwcmludGYocCwKKwkJCSAiUExMIGFkanVzdG1lbnRcdDogJWRcbiIKKwkJCSAiUExMIG1heCArdmUgYWRqdXN0bWVudFx0OiAlZFxuIgorCQkJICJQTEwgbWF4IC12ZSBhZGp1c3RtZW50XHQ6ICVkXG4iCisJCQkgIlBMTCArdmUgYWRqdXN0bWVudCBmYWN0b3JcdDogJWRcbiIKKwkJCSAiUExMIC12ZSBhZGp1c3RtZW50IGZhY3Rvclx0OiAlZFxuIgorCQkJICJQTEwgZnJlcXVlbmN5XHQ6ICVsZFxuIiwKKwkJCSBwbGwucGxsX3ZhbHVlLAorCQkJIHBsbC5wbGxfbWF4LAorCQkJIHBsbC5wbGxfbWluLAorCQkJIHBsbC5wbGxfcG9zbXVsdCwKKwkJCSBwbGwucGxsX25lZ211bHQsCisJCQkgcGxsLnBsbF9jbG9jayk7CisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgZ2VuX3J0Y19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IGdlbl9ydGNfcHJvY19vdXRwdXQgKHBhZ2UpOworICAgICAgICBpZiAobGVuIDw9IG9mZitjb3VudCkgKmVvZiA9IDE7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKwlsZW4gLT0gb2ZmOworICAgICAgICBpZiAobGVuPmNvdW50KSBsZW4gPSBjb3VudDsKKyAgICAgICAgaWYgKGxlbjwwKSBsZW4gPSAwOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGdlbl9ydGNfcHJvY19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyOworCisJciA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlci9ydGMiLCAwLCBOVUxMLCBnZW5fcnRjX3JlYWRfcHJvYywgTlVMTCk7CisJaWYgKCFyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBnZW5fcnRjX3Byb2NfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworCisvKgorICoJVGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHdlIHN1cHBvcnQuCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2VuX3J0Y19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfR0VOX1JUQ19YCisJLnJlYWQJCT0gZ2VuX3J0Y19yZWFkLAorCS5wb2xsCQk9IGdlbl9ydGNfcG9sbCwKKyNlbmRpZgorCS5pb2N0bAkJPSBnZW5fcnRjX2lvY3RsLAorCS5vcGVuCQk9IGdlbl9ydGNfb3BlbiwKKwkucmVsZWFzZQk9IGdlbl9ydGNfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBydGNfZ2VuX2RldiA9Cit7CisJLm1pbm9yCQk9IFJUQ19NSU5PUiwKKwkubmFtZQkJPSAicnRjIiwKKwkuZm9wcwkJPSAmZ2VuX3J0Y19mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcnRjX2dlbmVyaWNfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlwcmludGsoS0VSTl9JTkZPICJHZW5lcmljIFJUQyBEcml2ZXIgdiVzXG4iLCBSVENfVkVSU0lPTik7CisKKwlyZXR2YWwgPSBtaXNjX3JlZ2lzdGVyKCZydGNfZ2VuX2Rldik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBnZW5fcnRjX3Byb2NfaW5pdCgpOworCWlmIChyZXR2YWwpIHsKKwkJbWlzY19kZXJlZ2lzdGVyKCZydGNfZ2VuX2Rldik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBydGNfZ2VuZXJpY19leGl0KHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkgKCJkcml2ZXIvcnRjIiwgTlVMTCk7CisJbWlzY19kZXJlZ2lzdGVyKCZydGNfZ2VuX2Rldik7Cit9CisKKworbW9kdWxlX2luaXQocnRjX2dlbmVyaWNfaW5pdCk7Cittb2R1bGVfZXhpdChydGNfZ2VuZXJpY19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmljaGFyZCBaaWRsaWNreSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoUlRDX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYyBiL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2Q2YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogaGFuZ2NoZWNrLXRpbWVyLmMKKyAqCisgKiBEcml2ZXIgZm9yIGEgbGl0dGxlIGlvIGZlbmNpbmcgdGltZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIE9yYWNsZSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQXV0aG9yOiBKb2VsIEJlY2tlciA8am9lbC5iZWNrZXJAb3JhY2xlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisvKgorICogVGhlIGhhbmdjaGVjay10aW1lciBkcml2ZXIgdXNlcyB0aGUgVFNDIHRvIGNhdGNoIGRlbGF5cyB0aGF0CisgKiBqaWZmaWVzIGRvZXMgbm90IG5vdGljZS4gIEEgdGltZXIgaXMgc2V0LiAgV2hlbiB0aGUgdGltZXIgZmlyZXMsIGl0CisgKiBjaGVja3Mgd2hldGhlciBpdCB3YXMgZGVsYXllZCBhbmQgaWYgdGhhdCBkZWxheSBleGNlZWRzIGEgZ2l2ZW4KKyAqIG1hcmdpbiBvZiBlcnJvci4gIFRoZSBoYW5nY2hlY2tfdGljayBtb2R1bGUgcGFyYW10ZXIgdGFrZXMgdGhlIHRpbWVyCisgKiBkdXJhdGlvbiBpbiBzZWNvbmRzLiAgVGhlIGhhbmdjaGVja19tYXJnaW4gcGFyYW1ldGVyIGRlZmluZXMgdGhlCisgKiBtYXJnaW4gb2YgZXJyb3IsIGluIHNlY29uZHMuICBUaGUgZGVmYXVsdHMgYXJlIDYwIHNlY29uZHMgZm9yIHRoZQorICogdGltZXIgYW5kIDE4MCBzZWNvbmRzIGZvciB0aGUgbWFyZ2luIG9mIGVycm9yLiAgSU9XLCBhIHRpbWVyIGlzIHNldAorICogZm9yIDYwIHNlY29uZHMuICBXaGVuIHRoZSB0aW1lciBmaXJlcywgdGhlIGNhbGxiYWNrIGNoZWNrcyB0aGUKKyAqIGFjdHVhbCBkdXJhdGlvbiB0aGF0IHRoZSB0aW1lciB3YWl0ZWQuICBJZiB0aGUgZHVyYXRpb24gZXhjZWVkcyB0aGUKKyAqIGFsbG90ZWQgdGltZSBhbmQgbWFyZ2luIChoZXJlIDYwICsgMTgwLCBvciAyNDAgc2Vjb25kcyksIHRoZSBtYWNoaW5lCisgKiBpcyByZXN0YXJ0ZWQuICBBIGhlYWx0aHkgbWFjaGluZSB3aWxsIGhhdmUgdGhlIGR1cmF0aW9uIG1hdGNoIHRoZQorICogZXhwZWN0ZWQgdGltZW91dCB2ZXJ5IGNsb3NlbHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworI2RlZmluZSBWRVJTSU9OX1NUUiAiMC41LjAiCisKKyNkZWZpbmUgREVGQVVMVF9JT0ZFTkNFX01BUkdJTiA2MAkvKiBEZWZhdWx0IGZ1ZGdlIGZhY3RvciwgaW4gc2Vjb25kcyAqLworI2RlZmluZSBERUZBVUxUX0lPRkVOQ0VfVElDSyAxODAJLyogRGVmYXVsdCB0aW1lciB0aW1lb3V0LCBpbiBzZWNvbmRzICovCisKK3N0YXRpYyBpbnQgaGFuZ2NoZWNrX3RpY2sgPSBERUZBVUxUX0lPRkVOQ0VfVElDSzsKK3N0YXRpYyBpbnQgaGFuZ2NoZWNrX21hcmdpbiA9IERFRkFVTFRfSU9GRU5DRV9NQVJHSU47CitzdGF0aWMgaW50IGhhbmdjaGVja19yZWJvb3Q7ICAvKiBEZWZhdWx0cyB0byBub3QgcmVib290ICovCisKKy8qIERyaXZlciBvcHRpb25zICovCittb2R1bGVfcGFyYW0oaGFuZ2NoZWNrX3RpY2ssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhhbmdjaGVja190aWNrLCAiVGltZXIgZGVsYXkuIik7Cittb2R1bGVfcGFyYW0oaGFuZ2NoZWNrX21hcmdpbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGFuZ2NoZWNrX21hcmdpbiwgIklmIHRoZSBoYW5nY2hlY2sgdGltZXIgaGFzIGJlZW4gZGVsYXllZCBtb3JlIHRoYW4gaGFuZ2NoZWNrX21hcmdpbiBzZWNvbmRzLCB0aGUgZHJpdmVyIHdpbGwgZmlyZS4iKTsKK21vZHVsZV9wYXJhbShoYW5nY2hlY2tfcmVib290LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoYW5nY2hlY2tfcmVib290LCAiSWYgbm9uemVybywgdGhlIG1hY2hpbmUgd2lsbCByZWJvb3Qgd2hlbiB0aGUgdGltZXIgbWFyZ2luIGlzIGV4Y2VlZGVkLiIpOworCitNT0RVTEVfQVVUSE9SKCJKb2VsIEJlY2tlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIYW5nY2hlY2stdGltZXIgZGV0ZWN0cyB3aGVuIHRoZSBzeXN0ZW0gaGFzIGdvbmUgb3V0IHRvIGx1bmNoIHBhc3QgYSBjZXJ0YWluIG1hcmdpbi4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKiBMYXN0IHRpbWUgc2NoZWR1bGVkICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGhhbmdjaGVja190c2MsIGhhbmdjaGVja190c2NfbWFyZ2luOworCitzdGF0aWMgdm9pZCBoYW5nY2hlY2tfZmlyZSh1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGhhbmdjaGVja190aWNrdG9jayA9CisJCVRJTUVSX0lOSVRJQUxJWkVSKGhhbmdjaGVja19maXJlLCAwLCAwKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2sodm9pZCk7CisKK3N0YXRpYyB2b2lkIGhhbmdjaGVja19maXJlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgY3VyX3RzYywgdHNjX2RpZmY7CisKKwljdXJfdHNjID0gbW9ub3RvbmljX2Nsb2NrKCk7CisKKwlpZiAoY3VyX3RzYyA+IGhhbmdjaGVja190c2MpCisJCXRzY19kaWZmID0gY3VyX3RzYyAtIGhhbmdjaGVja190c2M7CisJZWxzZQorCQl0c2NfZGlmZiA9IChjdXJfdHNjICsgKH4wVUxMIC0gaGFuZ2NoZWNrX3RzYykpOyAvKiBvciBzb21ldGhpbmcgKi8KKworCWlmICh0c2NfZGlmZiA+IGhhbmdjaGVja190c2NfbWFyZ2luKSB7CisJCWlmIChoYW5nY2hlY2tfcmVib290KSB7CisJCQlwcmludGsoS0VSTl9DUklUICJIYW5nY2hlY2s6IGhhbmdjaGVjayBpcyByZXN0YXJ0aW5nIHRoZSBtYWNoaW5lLlxuIik7CisJCQltYWNoaW5lX3Jlc3RhcnQoTlVMTCk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9DUklUICJIYW5nY2hlY2s6IGhhbmdjaGVjayB2YWx1ZSBwYXN0IG1hcmdpbiFcbiIpOworCQl9CisJfQorCW1vZF90aW1lcigmaGFuZ2NoZWNrX3RpY2t0b2NrLCBqaWZmaWVzICsgKGhhbmdjaGVja190aWNrKkhaKSk7CisJaGFuZ2NoZWNrX3RzYyA9IG1vbm90b25pY19jbG9jaygpOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGhhbmdjaGVja19pbml0KHZvaWQpCit7CisJcHJpbnRrKCJIYW5nY2hlY2s6IHN0YXJ0aW5nIGhhbmdjaGVjayB0aW1lciAlcyAodGljayBpcyAlZCBzZWNvbmRzLCBtYXJnaW4gaXMgJWQgc2Vjb25kcykuXG4iLAorCSAgICAgICBWRVJTSU9OX1NUUiwgaGFuZ2NoZWNrX3RpY2ssIGhhbmdjaGVja19tYXJnaW4pOworCisJaGFuZ2NoZWNrX3RzY19tYXJnaW4gPSBoYW5nY2hlY2tfbWFyZ2luICsgaGFuZ2NoZWNrX3RpY2s7CisJaGFuZ2NoZWNrX3RzY19tYXJnaW4gKj0gMTAwMDAwMDAwMDsKKworCisJaGFuZ2NoZWNrX3RzYyA9IG1vbm90b25pY19jbG9jaygpOworCW1vZF90aW1lcigmaGFuZ2NoZWNrX3RpY2t0b2NrLCBqaWZmaWVzICsgKGhhbmdjaGVja190aWNrKkhaKSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaGFuZ2NoZWNrX2V4aXQodm9pZCkKK3sKKwlkZWxfdGltZXJfc3luYygmaGFuZ2NoZWNrX3RpY2t0b2NrKTsKK30KKworbW9kdWxlX2luaXQoaGFuZ2NoZWNrX2luaXQpOworbW9kdWxlX2V4aXQoaGFuZ2NoZWNrX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hwZXQuYyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjNzMyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKQEAgLTAsMCArMSw5OTQgQEAKKy8qCisgKiBJbnRlbCAmIE1TIEhpZ2ggUHJlY2lzaW9uIEV2ZW50IFRpbWVyIEltcGxlbWVudGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoJVmVua2kgUGFsbGlwYWRpCisgKiAoYykgQ29weXJpZ2h0IDIwMDQgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKyAqCUJvYiBQaWNjbyA8cm9iZXJ0LnBpY2NvQGhwLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ocGV0Lmg+CisKKy8qCisgKiBUaGUgSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgZHJpdmVyLgorICogVGhpcyBkcml2ZXIgaXMgY2xvc2VseSBtb2RlbGxlZCBhZnRlciB0aGUgcnRjLmMgZHJpdmVyLgorICogaHR0cDovL3d3dy5pbnRlbC5jb20vbGFicy9wbGF0Y29tcC9ocGV0L2hwZXRzcGVjLmh0bQorICovCisjZGVmaW5lCUhQRVRfVVNFUl9GUkVRCSg2NCkKKyNkZWZpbmUJSFBFVF9EUklGVAkoNTAwKQorCitzdGF0aWMgdTMyIGhwZXRfbnRpbWVyLCBocGV0X25ocGV0LCBocGV0X21heF9mcmVxID0gSFBFVF9VU0VSX0ZSRVE7CisKKy8qIEEgbG9jayBmb3IgY29uY3VycmVudCBhY2Nlc3MgYnkgYXBwIGFuZCBpc3IgaHBldCBhY3Rpdml0eS4gKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHBldF9sb2NrKTsKKy8qIEEgbG9jayBmb3IgY29uY3VycmVudCBpbnRlcm1vZHVsZSBhY2Nlc3MgdG8gaHBldCBhbmQgaXNyIGhwZXQgYWN0aXZpdHkuICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGhwZXRfdGFza19sb2NrKTsKKworI2RlZmluZQlIUEVUX0RFVl9OQU1FCSg3KQorCitzdHJ1Y3QgaHBldF9kZXYgeworCXN0cnVjdCBocGV0cyAqaGRfaHBldHM7CisJc3RydWN0IGhwZXQgX19pb21lbSAqaGRfaHBldDsKKwlzdHJ1Y3QgaHBldF90aW1lciBfX2lvbWVtICpoZF90aW1lcjsKKwl1bnNpZ25lZCBsb25nIGhkX2lyZXFmcmVxOworCXVuc2lnbmVkIGxvbmcgaGRfaXJxZGF0YTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBoZF93YWl0cXVldWU7CisJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmhkX2FzeW5jX3F1ZXVlOworCXN0cnVjdCBocGV0X3Rhc2sgKmhkX3Rhc2s7CisJdW5zaWduZWQgaW50IGhkX2ZsYWdzOworCXVuc2lnbmVkIGludCBoZF9pcnE7CisJdW5zaWduZWQgaW50IGhkX2hkd2lycTsKKwljaGFyIGhkX25hbWVbSFBFVF9ERVZfTkFNRV07Cit9OworCitzdHJ1Y3QgaHBldHMgeworCXN0cnVjdCBocGV0cyAqaHBfbmV4dDsKKwlzdHJ1Y3QgaHBldCBfX2lvbWVtICpocF9ocGV0OworCXVuc2lnbmVkIGxvbmcgaHBfaHBldF9waHlzOworCXN0cnVjdCB0aW1lX2ludGVycG9sYXRvciAqaHBfaW50ZXJwb2xhdG9yOworCXVuc2lnbmVkIGxvbmcgaHBfcGVyaW9kOworCXVuc2lnbmVkIGxvbmcgaHBfZGVsdGE7CisJdW5zaWduZWQgaW50IGhwX250aW1lcjsKKwl1bnNpZ25lZCBpbnQgaHBfd2hpY2g7CisJc3RydWN0IGhwZXRfZGV2IGhwX2RldlsxXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaHBldHMgKmhwZXRzOworCisjZGVmaW5lCUhQRVRfT1BFTgkJMHgwMDAxCisjZGVmaW5lCUhQRVRfSUUJCQkweDAwMDIJLyogaW50ZXJydXB0IGVuYWJsZWQgKi8KKyNkZWZpbmUJSFBFVF9QRVJJT0RJQwkJMHgwMDA0CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisjZGVmaW5lCXdyaXRlX2NvdW50ZXIoViwgTUMpCXdyaXRlcShWLCBNQykKKyNkZWZpbmUJcmVhZF9jb3VudGVyKE1DKQlyZWFkcShNQykKKyNlbHNlCisjZGVmaW5lCXdyaXRlX2NvdW50ZXIoViwgTUMpIAl3cml0ZWwoViwgTUMpCisjZGVmaW5lCXJlYWRfY291bnRlcihNQykJcmVhZGwoTUMpCisjZW5kaWYKKworI2lmbmRlZiByZWFkcQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2lubGluZSByZWFkcSh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIHJlYWRsKGFkZHIpIHwgKCgodW5zaWduZWQgbG9uZyBsb25nKXJlYWRsKGFkZHIgKyA0KSkgPDwgMzJMTCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiB3cml0ZXEKK3N0YXRpYyB2b2lkIF9faW5saW5lIHdyaXRlcSh1bnNpZ25lZCBsb25nIGxvbmcgdiwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXdyaXRlbCh2ICYgMHhmZmZmZmZmZiwgYWRkcik7CisJd3JpdGVsKHYgPj4gMzIsIGFkZHIgKyA0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaXJxcmV0dXJuX3QgaHBldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCXVuc2lnbmVkIGxvbmcgaXNyOworCisJZGV2cCA9IGRhdGE7CisKKwlzcGluX2xvY2soJmhwZXRfbG9jayk7CisJZGV2cC0+aGRfaXJxZGF0YSsrOworCisJLyoKKwkgKiBGb3Igbm9uLXBlcmlvZGljIHRpbWVycywgaW5jcmVtZW50IHRoZSBhY2N1bXVsYXRvci4KKwkgKiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHRyZWF0aW5nIG5vbi1wZXJpb2RpYyBsaWtlIHBlcmlvZGljLgorCSAqLworCWlmICgoZGV2cC0+aGRfZmxhZ3MgJiAoSFBFVF9JRSB8IEhQRVRfUEVSSU9ESUMpKSA9PSBIUEVUX0lFKSB7CisJCXVuc2lnbmVkIGxvbmcgbSwgdDsKKworCQl0ID0gZGV2cC0+aGRfaXJlcWZyZXE7CisJCW0gPSByZWFkX2NvdW50ZXIoJmRldnAtPmhkX2hwZXQtPmhwZXRfbWMpOworCQl3cml0ZV9jb3VudGVyKHQgKyBtICsgZGV2cC0+aGRfaHBldHMtPmhwX2RlbHRhLAorCQkJICAgICAgJmRldnAtPmhkX3RpbWVyLT5ocGV0X2NvbXBhcmUpOworCX0KKworCWlzciA9ICgxIDw8IChkZXZwIC0gZGV2cC0+aGRfaHBldHMtPmhwX2RldikpOworCXdyaXRlcShpc3IsICZkZXZwLT5oZF9ocGV0LT5ocGV0X2lzcik7CisJc3Bpbl91bmxvY2soJmhwZXRfbG9jayk7CisKKwlzcGluX2xvY2soJmhwZXRfdGFza19sb2NrKTsKKwlpZiAoZGV2cC0+aGRfdGFzaykKKwkJZGV2cC0+aGRfdGFzay0+aHRfZnVuYyhkZXZwLT5oZF90YXNrLT5odF9kYXRhKTsKKwlzcGluX3VubG9jaygmaHBldF90YXNrX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXZwLT5oZF93YWl0cXVldWUpOworCisJa2lsbF9mYXN5bmMoJmRldnAtPmhkX2FzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgaHBldF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKwlzdHJ1Y3QgaHBldHMgKmhwZXRwOworCWludCBpOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJmhwZXRfbG9jayk7CisKKwlmb3IgKGRldnAgPSBOVUxMLCBocGV0cCA9IGhwZXRzOyBocGV0cCAmJiAhZGV2cDsgaHBldHAgPSBocGV0cC0+aHBfbmV4dCkKKwkJZm9yIChpID0gMDsgaSA8IGhwZXRwLT5ocF9udGltZXI7IGkrKykKKwkJCWlmIChocGV0cC0+aHBfZGV2W2ldLmhkX2ZsYWdzICYgSFBFVF9PUEVOCisJCQkgICAgfHwgaHBldHAtPmhwX2RldltpXS5oZF90YXNrKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZSB7CisJCQkJZGV2cCA9ICZocGV0cC0+aHBfZGV2W2ldOworCQkJCWJyZWFrOworCQkJfQorCisJaWYgKCFkZXZwKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXZwOworCWRldnAtPmhkX2lycWRhdGEgPSAwOworCWRldnAtPmhkX2ZsYWdzIHw9IEhQRVRfT1BFTjsKKwlzcGluX3VubG9ja19pcnEoJmhwZXRfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK2hwZXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlzc2l6ZV90IHJldHZhbDsKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisKKwlkZXZwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICghZGV2cC0+aGRfaXJlcWZyZXEpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNvdW50IDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZF93YWl0X3F1ZXVlKCZkZXZwLT5oZF93YWl0cXVldWUsICZ3YWl0KTsKKworCWZvciAoIDsgOyApIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlzcGluX2xvY2tfaXJxKCZocGV0X2xvY2spOworCQlkYXRhID0gZGV2cC0+aGRfaXJxZGF0YTsKKwkJZGV2cC0+aGRfaXJxZGF0YSA9IDA7CisJCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCQlpZiAoZGF0YSkKKwkJCWJyZWFrOworCQllbHNlIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKworCXJldHZhbCA9IHB1dF91c2VyKGRhdGEsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWJ1Zik7CisJaWYgKCFyZXR2YWwpCisJCXJldHZhbCA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKK291dDoKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmRldnAtPmhkX3dhaXRxdWV1ZSwgJndhaXQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBocGV0X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXVuc2lnbmVkIGxvbmcgdjsKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisKKwlkZXZwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFkZXZwLT5oZF9pcmVxZnJlcSkKKwkJcmV0dXJuIDA7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmRldnAtPmhkX3dhaXRxdWV1ZSwgd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxKCZocGV0X2xvY2spOworCXYgPSBkZXZwLT5oZF9pcnFkYXRhOworCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCWlmICh2ICE9IDApCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHBldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKyNpZmRlZglDT05GSUdfSFBFVF9NTUFQCisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCWlmICgoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgIT0gUEFHRV9TSVpFKSB8fCB2bWEtPnZtX3Bnb2ZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJYWRkciA9IGRldnAtPmhkX2hwZXRzLT5ocF9ocGV0X3BoeXM7CisKKwlpZiAoYWRkciAmIChQQUdFX1NJWkUgLSAxKSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJYWRkciA9IF9fcGEoYWRkcik7CisKKwlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgYWRkciA+PiBQQUdFX1NISUZULAorCQkJCQlQQUdFX1NJWkUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlwcmludGsoS0VSTl9FUlIgInJlbWFwX3Bmbl9yYW5nZSBmYWlsZWQgaW4gaHBldC5jXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiAtRU5PU1lTOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgaHBldF9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQoreworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKworCWRldnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZkZXZwLT5oZF9hc3luY19xdWV1ZSkgPj0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBocGV0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCWludCBpcnEgPSAwOworCisJZGV2cCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl0aW1lciA9IGRldnAtPmhkX3RpbWVyOworCisJc3Bpbl9sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCXdyaXRlcSgocmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZykgJiB+VG5fSU5UX0VOQl9DTkZfTUFTSyksCisJICAgICAgICZ0aW1lci0+aHBldF9jb25maWcpOworCisJaXJxID0gZGV2cC0+aGRfaXJxOworCWRldnAtPmhkX2lycSA9IDA7CisKKwlkZXZwLT5oZF9pcmVxZnJlcSA9IDA7CisKKwlpZiAoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX1BFUklPRElDCisJICAgICYmIHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpICYgVG5fVFlQRV9DTkZfTUFTSykgeworCQl1bnNpZ25lZCBsb25nIHY7CisKKwkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCQl2IF49IFRuX1RZUEVfQ05GX01BU0s7CisJCXdyaXRlcSh2LCAmdGltZXItPmhwZXRfY29uZmlnKTsKKwl9CisKKwlkZXZwLT5oZF9mbGFncyAmPSB+KEhQRVRfT1BFTiB8IEhQRVRfSUUgfCBIUEVUX1BFUklPRElDKTsKKwlzcGluX3VubG9ja19pcnEoJmhwZXRfbG9jayk7CisKKwlpZiAoaXJxKQorCQlmcmVlX2lycShpcnEsIGRldnApOworCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGQVNZTkMpCisJCWhwZXRfZmFzeW5jKC0xLCBmaWxlLCAwKTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHBldF9pb2N0bF9jb21tb24oc3RydWN0IGhwZXRfZGV2ICosIGludCwgdW5zaWduZWQgbG9uZywgaW50KTsKKworc3RhdGljIGludAoraHBldF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisKKwlkZXZwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBocGV0X2lvY3RsX2NvbW1vbihkZXZwLCBjbWQsIGFyZywgMCk7Cit9CisKK3N0YXRpYyBpbnQgaHBldF9pb2N0bF9pZW9uKHN0cnVjdCBocGV0X2RldiAqZGV2cCkKK3sKKwlzdHJ1Y3QgaHBldF90aW1lciBfX2lvbWVtICp0aW1lcjsKKwlzdHJ1Y3QgaHBldCBfX2lvbWVtICpocGV0OworCXN0cnVjdCBocGV0cyAqaHBldHA7CisJaW50IGlycTsKKwl1bnNpZ25lZCBsb25nIGcsIHYsIHQsIG07CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXNyOworCisJdGltZXIgPSBkZXZwLT5oZF90aW1lcjsKKwlocGV0ID0gZGV2cC0+aGRfaHBldDsKKwlocGV0cCA9IGRldnAtPmhkX2hwZXRzOworCisJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCXNwaW5fbG9ja19pcnEoJmhwZXRfbG9jayk7CisKKwlpZiAoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX0lFKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkZXZwLT5oZF9mbGFncyB8PSBIUEVUX0lFOworCXNwaW5fdW5sb2NrX2lycSgmaHBldF9sb2NrKTsKKworCXQgPSByZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKTsKKwlpcnEgPSBkZXZwLT5oZF9oZHdpcnE7CisKKwlpZiAoaXJxKSB7CisJCXNwcmludGYoZGV2cC0+aGRfbmFtZSwgImhwZXQlZCIsIChpbnQpKGRldnAgLSBocGV0cC0+aHBfZGV2KSk7CisKKwkJaWYgKHJlcXVlc3RfaXJxCisJCSAgICAoaXJxLCBocGV0X2ludGVycnVwdCwgU0FfSU5URVJSVVBULCBkZXZwLT5oZF9uYW1lLCAodm9pZCAqKWRldnApKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImhwZXQ6IElSUSAlZCBpcyBub3QgZnJlZVxuIiwgaXJxKTsKKwkJCWlycSA9IDA7CisJCX0KKwl9CisKKwlpZiAoaXJxID09IDApIHsKKwkJc3Bpbl9sb2NrX2lycSgmaHBldF9sb2NrKTsKKwkJZGV2cC0+aGRfZmxhZ3MgXj0gSFBFVF9JRTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkZXZwLT5oZF9pcnEgPSBpcnE7CisJdCA9IGRldnAtPmhkX2lyZXFmcmVxOworCXYgPSByZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKTsKKwlnID0gdiB8IFRuX0lOVF9FTkJfQ05GX01BU0s7CisKKwlpZiAoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX1BFUklPRElDKSB7CisJCXdyaXRlX2NvdW50ZXIodCwgJnRpbWVyLT5ocGV0X2NvbXBhcmUpOworCQlnIHw9IFRuX1RZUEVfQ05GX01BU0s7CisJCXYgfD0gVG5fVFlQRV9DTkZfTUFTSzsKKwkJd3JpdGVxKHYsICZ0aW1lci0+aHBldF9jb25maWcpOworCQl2IHw9IFRuX1ZBTF9TRVRfQ05GX01BU0s7CisJCXdyaXRlcSh2LCAmdGltZXItPmhwZXRfY29uZmlnKTsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQltID0gcmVhZF9jb3VudGVyKCZocGV0LT5ocGV0X21jKTsKKwkJd3JpdGVfY291bnRlcih0ICsgbSArIGhwZXRwLT5ocF9kZWx0YSwgJnRpbWVyLT5ocGV0X2NvbXBhcmUpOworCX0gZWxzZSB7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJbSA9IHJlYWRfY291bnRlcigmaHBldC0+aHBldF9tYyk7CisJCXdyaXRlX2NvdW50ZXIodCArIG0gKyBocGV0cC0+aHBfZGVsdGEsICZ0aW1lci0+aHBldF9jb21wYXJlKTsKKwl9CisKKwlpc3IgPSAoMSA8PCAoZGV2cCAtIGhwZXRzLT5ocF9kZXYpKTsKKwl3cml0ZXEoaXNyLCAmaHBldC0+aHBldF9pc3IpOworCXdyaXRlcShnLCAmdGltZXItPmhwZXRfY29uZmlnKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhwZXRfdGltZV9kaXYodW5zaWduZWQgbG9uZyBkaXMpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG0gPSAxMDAwMDAwMDAwMDAwMDAwVUxMOworCisJZG9fZGl2KG0sIGRpcyk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpbTsKK30KKworc3RhdGljIGludAoraHBldF9pb2N0bF9jb21tb24oc3RydWN0IGhwZXRfZGV2ICpkZXZwLCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IGtlcm5lbCkKK3sKKwlzdHJ1Y3QgaHBldF90aW1lciBfX2lvbWVtICp0aW1lcjsKKwlzdHJ1Y3QgaHBldCBfX2lvbWVtICpocGV0OworCXN0cnVjdCBocGV0cyAqaHBldHA7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIHY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSFBFVF9JRV9PRkY6CisJY2FzZSBIUEVUX0lORk86CisJY2FzZSBIUEVUX0VQSToKKwljYXNlIEhQRVRfRFBJOgorCWNhc2UgSFBFVF9JUlFGUkVROgorCQl0aW1lciA9IGRldnAtPmhkX3RpbWVyOworCQlocGV0ID0gZGV2cC0+aGRfaHBldDsKKwkJaHBldHAgPSBkZXZwLT5oZF9ocGV0czsKKwkJYnJlYWs7CisJY2FzZSBIUEVUX0lFX09OOgorCQlyZXR1cm4gaHBldF9pb2N0bF9pZW9uKGRldnApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVyciA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSFBFVF9JRV9PRkY6CisJCWlmICgoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX0lFKSA9PSAwKQorCQkJYnJlYWs7CisJCXYgPSByZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKTsKKwkJdiAmPSB+VG5fSU5UX0VOQl9DTkZfTUFTSzsKKwkJd3JpdGVxKHYsICZ0aW1lci0+aHBldF9jb25maWcpOworCQlpZiAoZGV2cC0+aGRfaXJxKSB7CisJCQlmcmVlX2lycShkZXZwLT5oZF9pcnEsIGRldnApOworCQkJZGV2cC0+aGRfaXJxID0gMDsKKwkJfQorCQlkZXZwLT5oZF9mbGFncyBePSBIUEVUX0lFOworCQlicmVhazsKKwljYXNlIEhQRVRfSU5GTzoKKwkJeworCQkJc3RydWN0IGhwZXRfaW5mbyBpbmZvOworCisJCQlpbmZvLmhpX2lyZXFmcmVxID0gaHBldF90aW1lX2RpdihocGV0cC0+aHBfcGVyaW9kICoKKwkJCQkJCQkgZGV2cC0+aGRfaXJlcWZyZXEpOworCQkJaW5mby5oaV9mbGFncyA9CisJCQkgICAgcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZykgJiBUbl9QRVJfSU5UX0NBUF9NQVNLOworCQkJaW5mby5oaV9ocGV0ID0gZGV2cC0+aGRfaHBldHMtPmhwX3doaWNoOworCQkJaW5mby5oaV90aW1lciA9IGRldnAgLSBkZXZwLT5oZF9ocGV0cy0+aHBfZGV2OworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCWNhc2UgSFBFVF9FUEk6CisJCXYgPSByZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKTsKKwkJaWYgKCh2ICYgVG5fUEVSX0lOVF9DQVBfTUFTSykgPT0gMCkgeworCQkJZXJyID0gLUVOWElPOworCQkJYnJlYWs7CisJCX0KKwkJZGV2cC0+aGRfZmxhZ3MgfD0gSFBFVF9QRVJJT0RJQzsKKwkJYnJlYWs7CisJY2FzZSBIUEVUX0RQSToKKwkJdiA9IHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpOworCQlpZiAoKHYgJiBUbl9QRVJfSU5UX0NBUF9NQVNLKSA9PSAwKSB7CisJCQllcnIgPSAtRU5YSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX1BFUklPRElDICYmCisJCSAgICByZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKSAmIFRuX1RZUEVfQ05GX01BU0spIHsKKwkJCXYgPSByZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKTsKKwkJCXYgXj0gVG5fVFlQRV9DTkZfTUFTSzsKKwkJCXdyaXRlcSh2LCAmdGltZXItPmhwZXRfY29uZmlnKTsKKwkJfQorCQlkZXZwLT5oZF9mbGFncyAmPSB+SFBFVF9QRVJJT0RJQzsKKwkJYnJlYWs7CisJY2FzZSBIUEVUX0lSUUZSRVE6CisJCWlmICgha2VybmVsICYmIChhcmcgPiBocGV0X21heF9mcmVxKSAmJgorCQkgICAgIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpIHsKKwkJCWVyciA9IC1FQUNDRVM7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChhcmcgJiAoYXJnIC0gMSkpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWRldnAtPmhkX2lyZXFmcmVxID0gaHBldF90aW1lX2RpdihocGV0cC0+aHBfcGVyaW9kICogYXJnKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBocGV0X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKKwkucmVhZCA9IGhwZXRfcmVhZCwKKwkucG9sbCA9IGhwZXRfcG9sbCwKKwkuaW9jdGwgPSBocGV0X2lvY3RsLAorCS5vcGVuID0gaHBldF9vcGVuLAorCS5yZWxlYXNlID0gaHBldF9yZWxlYXNlLAorCS5mYXN5bmMgPSBocGV0X2Zhc3luYywKKwkubW1hcCA9IGhwZXRfbW1hcCwKK307CisKK0VYUE9SVF9TWU1CT0woaHBldF9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKGhwZXRfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChocGV0X3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChocGV0X2NvbnRyb2wpOworCitpbnQgaHBldF9yZWdpc3RlcihzdHJ1Y3QgaHBldF90YXNrICp0cCwgaW50IHBlcmlvZGljKQoreworCXVuc2lnbmVkIGludCBpOworCXU2NCBtYXNrOworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKwlzdHJ1Y3QgaHBldHMgKmhwZXRwOworCisJc3dpdGNoIChwZXJpb2RpYykgeworCWNhc2UgMToKKwkJbWFzayA9IFRuX1BFUl9JTlRfQ0FQX01BU0s7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJbWFzayA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnEoJmhwZXRfdGFza19sb2NrKTsKKwlzcGluX2xvY2soJmhwZXRfbG9jayk7CisKKwlmb3IgKGRldnAgPSBOVUxMLCBocGV0cCA9IGhwZXRzOyBocGV0cCAmJiAhZGV2cDsgaHBldHAgPSBocGV0cC0+aHBfbmV4dCkKKwkJZm9yICh0aW1lciA9IGhwZXRwLT5ocF9ocGV0LT5ocGV0X3RpbWVycywgaSA9IDA7CisJCSAgICAgaSA8IGhwZXRwLT5ocF9udGltZXI7IGkrKywgdGltZXIrKykgeworCQkJaWYgKChyZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKSAmIFRuX1BFUl9JTlRfQ0FQX01BU0spCisJCQkgICAgIT0gbWFzaykKKwkJCQljb250aW51ZTsKKworCQkJZGV2cCA9ICZocGV0cC0+aHBfZGV2W2ldOworCisJCQlpZiAoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX09QRU4gfHwgZGV2cC0+aGRfdGFzaykgeworCQkJCWRldnAgPSBOVUxMOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQl0cC0+aHRfb3BhcXVlID0gZGV2cDsKKwkJCWRldnAtPmhkX3Rhc2sgPSB0cDsKKwkJCWJyZWFrOworCQl9CisKKwlzcGluX3VubG9jaygmaHBldF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmhwZXRfdGFza19sb2NrKTsKKworCWlmICh0cC0+aHRfb3BhcXVlKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhwZXRfdHBjaGVjayhzdHJ1Y3QgaHBldF90YXNrICp0cCkKK3sKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJc3RydWN0IGhwZXRzICpocGV0cDsKKworCWRldnAgPSB0cC0+aHRfb3BhcXVlOworCisJaWYgKCFkZXZwKQorCQlyZXR1cm4gLUVOWElPOworCisJZm9yIChocGV0cCA9IGhwZXRzOyBocGV0cDsgaHBldHAgPSBocGV0cC0+aHBfbmV4dCkKKwkJaWYgKGRldnAgPj0gaHBldHAtPmhwX2RldgorCQkgICAgJiYgZGV2cCA8IChocGV0cC0+aHBfZGV2ICsgaHBldHAtPmhwX250aW1lcikKKwkJICAgICYmIGRldnAtPmhkX2hwZXQgPT0gaHBldHAtPmhwX2hwZXQpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAtRU5YSU87Cit9CisKK2ludCBocGV0X3VucmVnaXN0ZXIoc3RydWN0IGhwZXRfdGFzayAqdHApCit7CisJc3RydWN0IGhwZXRfZGV2ICpkZXZwOworCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGhwZXRfdHBjaGVjayh0cCkpKQorCQlyZXR1cm4gZXJyOworCisJc3Bpbl9sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOworCXNwaW5fbG9jaygmaHBldF9sb2NrKTsKKworCWRldnAgPSB0cC0+aHRfb3BhcXVlOworCWlmIChkZXZwLT5oZF90YXNrICE9IHRwKSB7CisJCXNwaW5fdW5sb2NrKCZocGV0X2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmhwZXRfdGFza19sb2NrKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwl0aW1lciA9IGRldnAtPmhkX3RpbWVyOworCXdyaXRlcSgocmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZykgJiB+VG5fSU5UX0VOQl9DTkZfTUFTSyksCisJICAgICAgICZ0aW1lci0+aHBldF9jb25maWcpOworCWRldnAtPmhkX2ZsYWdzICY9IH4oSFBFVF9JRSB8IEhQRVRfUEVSSU9ESUMpOworCWRldnAtPmhkX3Rhc2sgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZocGV0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBocGV0X2NvbnRyb2woc3RydWN0IGhwZXRfdGFzayAqdHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBocGV0X3RwY2hlY2sodHApKSkKKwkJcmV0dXJuIGVycjsKKworCXNwaW5fbG9ja19pcnEoJmhwZXRfbG9jayk7CisJZGV2cCA9IHRwLT5odF9vcGFxdWU7CisJaWYgKGRldnAtPmhkX3Rhc2sgIT0gdHApIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlzcGluX3VubG9ja19pcnEoJmhwZXRfbG9jayk7CisJcmV0dXJuIGhwZXRfaW9jdGxfY29tbW9uKGRldnAsIGNtZCwgYXJnLCAxKTsKK30KKworc3RhdGljIGN0bF90YWJsZSBocGV0X3RhYmxlW10gPSB7CisJeworCSAuY3RsX25hbWUgPSAxLAorCSAucHJvY25hbWUgPSAibWF4LXVzZXItZnJlcSIsCisJIC5kYXRhID0gJmhwZXRfbWF4X2ZyZXEsCisJIC5tYXhsZW4gPSBzaXplb2YoaW50KSwKKwkgLm1vZGUgPSAwNjQ0LAorCSAucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWMsCisJIH0sCisJey5jdGxfbmFtZSA9IDB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGhwZXRfcm9vdFtdID0geworCXsKKwkgLmN0bF9uYW1lID0gMSwKKwkgLnByb2NuYW1lID0gImhwZXQiLAorCSAubWF4bGVuID0gMCwKKwkgLm1vZGUgPSAwNTU1LAorCSAuY2hpbGQgPSBocGV0X3RhYmxlLAorCSB9LAorCXsuY3RsX25hbWUgPSAwfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBkZXZfcm9vdFtdID0geworCXsKKwkgLmN0bF9uYW1lID0gQ1RMX0RFViwKKwkgLnByb2NuYW1lID0gImRldiIsCisJIC5tYXhsZW4gPSAwLAorCSAubW9kZSA9IDA1NTUsCisJIC5jaGlsZCA9IGhwZXRfcm9vdCwKKwkgfSwKKwl7LmN0bF9uYW1lID0gMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc3lzY3RsX2hlYWRlcjsKKworc3RhdGljIHZvaWQgaHBldF9yZWdpc3Rlcl9pbnRlcnBvbGF0b3Ioc3RydWN0IGhwZXRzICpocGV0cCkKK3sKKyNpZmRlZglDT05GSUdfVElNRV9JTlRFUlBPTEFUSU9OCisJc3RydWN0IHRpbWVfaW50ZXJwb2xhdG9yICp0aTsKKworCXRpID0ga21hbGxvYyhzaXplb2YoKnRpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0aSkKKwkJcmV0dXJuOworCisJbWVtc2V0KHRpLCAwLCBzaXplb2YoKnRpKSk7CisJdGktPnNvdXJjZSA9IFRJTUVfU09VUkNFX01NSU82NDsKKwl0aS0+c2hpZnQgPSAxMDsKKwl0aS0+YWRkciA9ICZocGV0cC0+aHBfaHBldC0+aHBldF9tYzsKKwl0aS0+ZnJlcXVlbmN5ID0gaHBldF90aW1lX2RpdihocGV0cy0+aHBfcGVyaW9kKTsKKwl0aS0+ZHJpZnQgPSB0aS0+ZnJlcXVlbmN5ICogSFBFVF9EUklGVCAvIDEwMDAwMDA7CisJdGktPm1hc2sgPSAtMTsKKworCWhwZXRwLT5ocF9pbnRlcnBvbGF0b3IgPSB0aTsKKwlyZWdpc3Rlcl90aW1lX2ludGVycG9sYXRvcih0aSk7CisjZW5kaWYKK30KKworLyoKKyAqIEFkanVzdG1lbnQgZm9yIHdoZW4gYXJtaW5nIHRoZSB0aW1lciB3aXRoCisgKiBpbml0aWFsIGNvbmRpdGlvbnMuICBUaGF0IGlzLCBtYWluIGNvdW50ZXIKKyAqIHRpY2tzIGV4cGlyZWQgYmVmb3JlIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisgKi8KKyNkZWZpbmUJVElDS19DQUxJQlJBVEUJKDEwMDBVTCkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9jYWxpYnJhdGUoc3RydWN0IGhwZXRzICpocGV0cCkKK3sKKwlzdHJ1Y3QgaHBldF90aW1lciBfX2lvbWVtICp0aW1lciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyB0LCBtLCBjb3VudCwgaSwgZmxhZ3MsIHN0YXJ0OworCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKKwlpbnQgajsKKwlzdHJ1Y3QgaHBldCBfX2lvbWVtICpocGV0OworCisJZm9yIChqID0gMCwgZGV2cCA9IGhwZXRwLT5ocF9kZXY7IGogPCBocGV0cC0+aHBfbnRpbWVyOyBqKyssIGRldnArKykKKwkJaWYgKChkZXZwLT5oZF9mbGFncyAmIEhQRVRfT1BFTikgPT0gMCkgeworCQkJdGltZXIgPSBkZXZwLT5oZF90aW1lcjsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoIXRpbWVyKQorCQlyZXR1cm4gMDsKKworCWhwZXQgPSBocGV0cy0+aHBfaHBldDsKKwl0ID0gcmVhZF9jb3VudGVyKCZ0aW1lci0+aHBldF9jb21wYXJlKTsKKworCWkgPSAwOworCWNvdW50ID0gaHBldF90aW1lX2RpdihocGV0cC0+aHBfcGVyaW9kICogVElDS19DQUxJQlJBVEUpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3RhcnQgPSByZWFkX2NvdW50ZXIoJmhwZXQtPmhwZXRfbWMpOworCisJZG8geworCQltID0gcmVhZF9jb3VudGVyKCZocGV0LT5ocGV0X21jKTsKKwkJd3JpdGVfY291bnRlcih0ICsgbSArIGhwZXRwLT5ocF9kZWx0YSwgJnRpbWVyLT5ocGV0X2NvbXBhcmUpOworCX0gd2hpbGUgKGkrKywgKG0gLSBzdGFydCkgPCBjb3VudCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gKG0gLSBzdGFydCkgLyBpOworfQorCitpbnQgaHBldF9hbGxvYyhzdHJ1Y3QgaHBldF9kYXRhICpoZHApCit7CisJdTY0IGNhcCwgbWNmZzsKKwlzdHJ1Y3QgaHBldF9kZXYgKmRldnA7CisJdTMyIGksIG50aW1lcjsKKwlzdHJ1Y3QgaHBldHMgKmhwZXRwOworCXNpemVfdCBzaXo7CisJc3RydWN0IGhwZXQgX19pb21lbSAqaHBldDsKKwlzdGF0aWMgc3RydWN0IGhwZXRzICpsYXN0ID0gKHN0cnVjdCBocGV0cyAqKTA7CisJdW5zaWduZWQgbG9uZyBuczsKKworCS8qCisJICogaHBldF9hbGxvYyBjYW4gYmUgY2FsbGVkIGJ5IHBsYXRmb3JtIGRlcGVuZGVudCBjb2RlLgorCSAqIGlmIHBsYXRmb3JtIGRlcGVuZGVudCBjb2RlIGhhcyBhbGxvY2F0ZWQgdGhlIGhwZXQKKwkgKiBBQ1BJIGFsc28gcmVwb3J0cyBocGV0LCB0aGVuIHdlIGNhdGNoIGl0IGhlcmUuCisJICovCisJZm9yIChocGV0cCA9IGhwZXRzOyBocGV0cDsgaHBldHAgPSBocGV0cC0+aHBfbmV4dCkKKwkJaWYgKGhwZXRwLT5ocF9ocGV0ID09IGhkcC0+aGRfYWRkcmVzcykKKwkJCXJldHVybiAwOworCisJc2l6ID0gc2l6ZW9mKHN0cnVjdCBocGV0cykgKyAoKGhkcC0+aGRfbmlycXMgLSAxKSAqCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBocGV0X2RldikpOworCisJaHBldHAgPSBrbWFsbG9jKHNpeiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWhwZXRwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChocGV0cCwgMCwgc2l6KTsKKworCWhwZXRwLT5ocF93aGljaCA9IGhwZXRfbmhwZXQrKzsKKwlocGV0cC0+aHBfaHBldCA9IGhkcC0+aGRfYWRkcmVzczsKKwlocGV0cC0+aHBfaHBldF9waHlzID0gaGRwLT5oZF9waHlzX2FkZHJlc3M7CisKKwlocGV0cC0+aHBfbnRpbWVyID0gaGRwLT5oZF9uaXJxczsKKworCWZvciAoaSA9IDA7IGkgPCBoZHAtPmhkX25pcnFzOyBpKyspCisJCWhwZXRwLT5ocF9kZXZbaV0uaGRfaGR3aXJxID0gaGRwLT5oZF9pcnFbaV07CisKKwlocGV0ID0gaHBldHAtPmhwX2hwZXQ7CisKKwljYXAgPSByZWFkcSgmaHBldC0+aHBldF9jYXApOworCisJbnRpbWVyID0gKChjYXAgJiBIUEVUX05VTV9USU1fQ0FQX01BU0spID4+IEhQRVRfTlVNX1RJTV9DQVBfU0hJRlQpICsgMTsKKworCWlmIChocGV0cC0+aHBfbnRpbWVyICE9IG50aW1lcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJocGV0OiBudW1iZXIgaXJxcyBkb2Vzbid0IGFncmVlIgorCQkgICAgICAgIiB3aXRoIG51bWJlciBvZiB0aW1lcnNcbiIpOworCQlrZnJlZShocGV0cCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChsYXN0KQorCQlsYXN0LT5ocF9uZXh0ID0gaHBldHA7CisJZWxzZQorCQlocGV0cyA9IGhwZXRwOworCisJbGFzdCA9IGhwZXRwOworCisJaHBldHAtPmhwX3BlcmlvZCA9IChjYXAgJiBIUEVUX0NPVU5URVJfQ0xLX1BFUklPRF9NQVNLKSA+PgorCSAgICBIUEVUX0NPVU5URVJfQ0xLX1BFUklPRF9TSElGVDsKKworCXByaW50ayhLRVJOX0lORk8gImhwZXQlZDogYXQgTU1JTyAweCVseCwgSVJRJXMiLAorCQlocGV0cC0+aHBfd2hpY2gsIGhkcC0+aGRfcGh5c19hZGRyZXNzLAorCQlocGV0cC0+aHBfbnRpbWVyID4gMSA/ICJzIiA6ICIiKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHBldHAtPmhwX250aW1lcjsgaSsrKQorCQlwcmludGsoIiVzICVkIiwgaSA+IDAgPyAiLCIgOiAiIiwgaGRwLT5oZF9pcnFbaV0pOworCXByaW50aygiXG4iKTsKKworCW5zID0gaHBldHAtPmhwX3BlcmlvZDsJLyogZmVtcHRvc2Vjb25kcywgMTBeLTE1ICovCisJZG9fZGl2KG5zLCAxMDAwMDAwKTsJLyogY29udmVydCB0byBuYW5vc2Vjb25kcywgMTBeLTkgKi8KKwlwcmludGsoS0VSTl9JTkZPICJocGV0JWQ6ICVsZG5zIHRpY2ssICVkICVkLWJpdCB0aW1lcnNcbiIsCisJCWhwZXRwLT5ocF93aGljaCwgbnMsIGhwZXRwLT5ocF9udGltZXIsCisJCWNhcCAmIEhQRVRfQ09VTlRFUl9TSVpFX01BU0sgPyA2NCA6IDMyKTsKKworCW1jZmcgPSByZWFkcSgmaHBldC0+aHBldF9jb25maWcpOworCWlmICgobWNmZyAmIEhQRVRfRU5BQkxFX0NORl9NQVNLKSA9PSAwKSB7CisJCXdyaXRlX2NvdW50ZXIoMEwsICZocGV0LT5ocGV0X21jKTsKKwkJbWNmZyB8PSBIUEVUX0VOQUJMRV9DTkZfTUFTSzsKKwkJd3JpdGVxKG1jZmcsICZocGV0LT5ocGV0X2NvbmZpZyk7CisJfQorCisJZm9yIChpID0gMCwgZGV2cCA9IGhwZXRwLT5ocF9kZXY7IGkgPCBocGV0cC0+aHBfbnRpbWVyOworCSAgICAgaSsrLCBocGV0X250aW1lcisrLCBkZXZwKyspIHsKKwkJdW5zaWduZWQgbG9uZyB2OworCQlzdHJ1Y3QgaHBldF90aW1lciBfX2lvbWVtICp0aW1lcjsKKworCQl0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1tkZXZwIC0gaHBldHAtPmhwX2Rldl07CisJCXYgPSByZWFkcSgmdGltZXItPmhwZXRfY29uZmlnKTsKKworCQlkZXZwLT5oZF9ocGV0cyA9IGhwZXRwOworCQlkZXZwLT5oZF9ocGV0ID0gaHBldDsKKwkJZGV2cC0+aGRfdGltZXIgPSB0aW1lcjsKKworCQkvKgorCQkgKiBJZiB0aGUgdGltZXIgd2FzIHJlc2VydmVkIGJ5IHBsYXRmb3JtIGNvZGUsCisJCSAqIHRoZW4gbWFrZSB0aW1lciB1bmF2YWlsYWJsZSBmb3Igb3BlbnMuCisJCSAqLworCQlpZiAoaGRwLT5oZF9zdGF0ZSAmICgxIDw8IGkpKSB7CisJCQlkZXZwLT5oZF9mbGFncyA9IEhQRVRfT1BFTjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2cC0+aGRfd2FpdHF1ZXVlKTsKKwl9CisKKwlocGV0cC0+aHBfZGVsdGEgPSBocGV0X2NhbGlicmF0ZShocGV0cCk7CisJaHBldF9yZWdpc3Rlcl9pbnRlcnBvbGF0b3IoaHBldHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBocGV0X3Jlc291cmNlcyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBocGV0X2RhdGEgKmhkcDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0IGFkZHI7CisJc3RydWN0IGhwZXRzICpocGV0cDsKKworCWhkcCA9IGRhdGE7CisKKwlzdGF0dXMgPSBhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NChyZXMsICZhZGRyKTsKKworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkJc2l6ZSA9IGFkZHIubWF4X2FkZHJlc3NfcmFuZ2UgLSBhZGRyLm1pbl9hZGRyZXNzX3JhbmdlICsgMTsKKwkJaGRwLT5oZF9waHlzX2FkZHJlc3MgPSBhZGRyLm1pbl9hZGRyZXNzX3JhbmdlOworCQloZHAtPmhkX2FkZHJlc3MgPSBpb3JlbWFwKGFkZHIubWluX2FkZHJlc3NfcmFuZ2UsIHNpemUpOworCisJCWZvciAoaHBldHAgPSBocGV0czsgaHBldHA7IGhwZXRwID0gaHBldHAtPmhwX25leHQpCisJCQlpZiAoaHBldHAtPmhwX2hwZXQgPT0gaGRwLT5oZF9hZGRyZXNzKQorCQkJCXJldHVybiAtRUJVU1k7CisJfSBlbHNlIGlmIChyZXMtPmlkID09IEFDUElfUlNUWVBFX0VYVF9JUlEpIHsKKwkJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSAqaXJxcDsKKwkJaW50IGk7CisKKwkJaXJxcCA9ICZyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxOworCisJCWlmIChpcnFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApIHsKKwkJCWhkcC0+aGRfbmlycXMgPSBpcnFwLT5udW1iZXJfb2ZfaW50ZXJydXB0czsKKworCQkJZm9yIChpID0gMDsgaSA8IGhkcC0+aGRfbmlycXM7IGkrKykKKwkJCQloZHAtPmhkX2lycVtpXSA9CisJCQkJICAgIGFjcGlfcmVnaXN0ZXJfZ3NpKGlycXAtPmludGVycnVwdHNbaV0sCisJCQkJCQkgICAgICBpcnFwLT5lZGdlX2xldmVsLAorCQkJCQkJICAgICAgaXJxcC0+YWN0aXZlX2hpZ2hfbG93KTsKKwkJfQorCX0KKworCXJldHVybiBBRV9PSzsKK30KKworc3RhdGljIGludCBocGV0X2FjcGlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWFjcGlfc3RhdHVzIHJlc3VsdDsKKwlzdHJ1Y3QgaHBldF9kYXRhIGRhdGE7CisKKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisKKwlyZXN1bHQgPQorCSAgICBhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAorCQkJCWhwZXRfcmVzb3VyY2VzLCAmZGF0YSk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHJlc3VsdCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFkYXRhLmhkX2FkZHJlc3MgfHwgIWRhdGEuaGRfbmlycXMpIHsKKwkJcHJpbnRrKCIlczogbm8gYWRkcmVzcyBvciBpcnFzIGluIF9DUlNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiBocGV0X2FsbG9jKCZkYXRhKTsKK30KKworc3RhdGljIGludCBocGV0X2FjcGlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3sKKwkvKiBYWFggbmVlZCB0byB1bnJlZ2lzdGVyIGludGVycG9sYXRvciwgZGVhbGxvYyBtZW0sIGV0YyAqLworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGhwZXRfYWNwaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiaHBldCIsCisJLmlkcyA9ICJQTlAwMTAzIiwKKwkub3BzID0geworCQkuYWRkID0gaHBldF9hY3BpX2FkZCwKKwkJLnJlbW92ZSA9IGhwZXRfYWNwaV9yZW1vdmUsCisJCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgaHBldF9taXNjID0geyBIUEVUX01JTk9SLCAiaHBldCIsICZocGV0X2ZvcHMgfTsKKworc3RhdGljIGludCBfX2luaXQgaHBldF9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IG1pc2NfcmVnaXN0ZXIoJmhwZXRfbWlzYyk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShkZXZfcm9vdCwgMCk7CisKKwlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmhwZXRfYWNwaV9kcml2ZXIpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWlmIChzeXNjdGxfaGVhZGVyKQorCQkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3RsX2hlYWRlcik7CisJCW1pc2NfZGVyZWdpc3RlcigmaHBldF9taXNjKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhwZXRfZXhpdCh2b2lkKQoreworCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZocGV0X2FjcGlfZHJpdmVyKTsKKworCWlmIChzeXNjdGxfaGVhZGVyKQorCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfaGVhZGVyKTsKKwltaXNjX2RlcmVnaXN0ZXIoJmhwZXRfbWlzYyk7CisKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KGhwZXRfaW5pdCk7Cittb2R1bGVfZXhpdChocGV0X2V4aXQpOworTU9EVUxFX0FVVEhPUigiQm9iIFBpY2NvIDxSb2JlcnQuUGljY29AaHAuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGNkODU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKQEAgLTAsMCArMSw4MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPiwgSUJNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BhdS5pYm0uY29tPiwgSUJNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiwgSUJNIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSUJNIENvcnBvcmF0aW9uCisgKgorICogQWRkaXRpb25hbCBBdXRob3Iocyk6CisgKiAgUnlhbiBTLiBBcm5vbGQgPHJzYUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaHZjb25zb2xlLmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorCisjZGVmaW5lIEhWQ19NQUpPUgkyMjkKKyNkZWZpbmUgSFZDX01JTk9SCTAKKworI2RlZmluZSBUSU1FT1VUCQkoMTApCisKKy8qCisgKiBXYWl0IHRoaXMgbG9uZyBwZXIgaXRlcmF0aW9uIHdoaWxlIHRyeWluZyB0byBwdXNoIGJ1ZmZlcmVkIGRhdGEgdG8gdGhlCisgKiBoeXBlcnZpc29yIGJlZm9yZSBhbGxvd2luZyB0aGUgdHR5IHRvIGNvbXBsZXRlIGEgY2xvc2Ugb3BlcmF0aW9uLgorICovCisjZGVmaW5lIEhWQ19DTE9TRV9XQUlUIChIWi8xMDApIC8qIDEvMTAgb2YgYSBzZWNvbmQgKi8KKworLyoKKyAqIFRoZSBMaW51eCBUVFkgY29kZSBkb2VzIG5vdCBzdXBwb3J0IGR5bmFtaWMgYWRkaXRpb24gb2YgdHR5IGRlcml2ZWQgZGV2aWNlcworICogc28gd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IHR0eSBkZXZpY2VzIHdlIG1pZ2h0IG5lZWQgd2hlbiBzcGFjZSBpcyBhbGxvY2F0ZWQKKyAqIGZvciB0aGUgdHR5IGRldmljZS4gIFNpbmNlIHRoaXMgZHJpdmVyIHN1cHBvcnRzIGhvdHBsdWcgb2YgdnR5IGFkYXB0ZXJzIHdlCisgKiBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBhbGxvY2F0ZWQuCisgKi8KKyNkZWZpbmUgSFZDX0FMTE9DX1RUWV9BREFQVEVSUwk4CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaHZjX2RyaXZlcjsKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKK3N0YXRpYyBpbnQgc3lzcnFfcHJlc3NlZDsKKyNlbmRpZgorCisjZGVmaW5lIE5fT1VUQlVGCTE2CisjZGVmaW5lIE5fSU5CVUYJCTE2CisKKyNkZWZpbmUgX19BTElHTkVEX18JX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oOCkpKQorCitzdHJ1Y3QgaHZjX3N0cnVjdCB7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCBpbmRleDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGludCBjb3VudDsKKwlpbnQgZG9fd2FrZXVwOworCWNoYXIgb3V0YnVmW05fT1VUQlVGXSBfX0FMSUdORURfXzsKKwlpbnQgbl9vdXRidWY7CisJdWludDMyX3QgdnRlcm1ubzsKKwlpbnQgaXJxX3JlcXVlc3RlZDsKKwlpbnQgaXJxOworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOyAvKiByZWYgY291bnQgJiBodmNfc3RydWN0IGxpZmV0aW1lICovCisJc3RydWN0IHZpb19kZXYgKnZkZXY7Cit9OworCisvKiBkeW5hbWljIGxpc3Qgb2YgaHZjX3N0cnVjdCBpbnN0YW5jZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGh2Y19zdHJ1Y3RzID0gTElTVF9IRUFEX0lOSVQoaHZjX3N0cnVjdHMpOworCisvKgorICogUHJvdGVjdCB0aGUgbGlzdCBvZiBodmNfc3RydWN0IGluc3RhbmNlcyBmcm9tIGluc2VydHMgYW5kIHJlbW92YWxzIGR1cmluZworICogbGlzdCB0cmF2ZXJzYWwuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHZjX3N0cnVjdHNfbG9jayk7CisKKy8qCisgKiBJbml0aWFsIGNvbnNvbGUgdnRlcm1ub3MgZm9yIGNvbnNvbGUgQVBJIHVzYWdlIHByaW9yIHRvIGZ1bGwgY29uc29sZQorICogaW5pdGlhbGl6YXRpb24uICBBbnkgdnR5IGFkYXB0ZXIgb3V0c2lkZSB0aGlzIHJhbmdlIHdpbGwgbm90IGhhdmUgdXNhYmxlCisgKiBjb25zb2xlIGludGVyZmFjZXMgYnV0IGNhbiBzdGlsbCBiZSB1c2VkIGFzIGEgdHR5IGRldmljZS4gIFRoaXMgaGFzIHRvIGJlCisgKiBzdGF0aWMgYmVjYXVzZSBrbWFsbG9jIHdpbGwgbm90IHdvcmsgZHVyaW5nIGVhcmx5IGNvbnNvbGUgaW5pdC4KKyAqLworc3RhdGljIHVpbnQzMl90IHZ0ZXJtbm9zW01BWF9OUl9IVkNfQ09OU09MRVNdOworCisvKiBVc2VkIGZvciBhY2NvdW50aW5nIHB1cnBvc2VzICovCitzdGF0aWMgaW50IG51bV92dGVybXMgPSAwOworCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpodmNfdGFzazsKKworLyoKKyAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSB0dHktPmluZGV4IHZhbHVlIHRvIGEgaHZjX3N0cnVjdCBiYXNlZAorICogdXBvbiBvcmRlciBvZiBleHBvc3VyZSB2aWEgaHZjX3Byb2JlKCkuCisgKi8KK3N0YXRpYyBpbnQgaHZjX2NvdW50ID0gLTE7CisKKy8qIFBpY2tzIHVwIGxhdGUga2lja3MgYWZ0ZXIgbGlzdCB3YWxrIGJ1dCBiZWZvcmUgc2NoZWR1bGUoKSAqLworc3RhdGljIGludCBodmNfa2lja2VkOworCisvKiBXYWtlIHRoZSBzbGVlcGluZyBraHZjZCAqLworc3RhdGljIHZvaWQgaHZjX2tpY2sodm9pZCkKK3sKKwlodmNfa2lja2VkID0gMTsKKwl3YWtlX3VwX3Byb2Nlc3MoaHZjX3Rhc2spOworfQorCisvKgorICogTk9URTogVGhpcyBBUEkgaXNuJ3QgdXNlZCBpZiB0aGUgY29uc29sZSBhZGFwdGVyIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlcnJ1cHRzLgorICogSW4gdGhpcyBjYXNlIHRoZSBjb25zb2xlIGlzIHBvbGwgZHJpdmVuLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaHZjX2hhbmRsZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlodmNfa2ljaygpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgaHZjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlodmNfa2ljaygpOworfQorCisvKgorICogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGVpdGhlciB0aGUgaHZjX3N0cnVjc3RfbG9jayBvciB0aGUgaHZjX3N0cnVjdAorICogbG9jayBoZWxkLiAgSWYgc3VjY2Vzc2Z1bCwgdGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBrb2JqZWN0IHJlZmVyZW5jZQorICogY291bnQgYWdhaW5zdCB0aGUgdGFyZ2V0IGh2Y19zdHJ1Y3Qgc28gaXQgc2hvdWxkIGJlIHJlbGVhc2VkIHdoZW4gZmluaXNoZWQuCisgKi8KK3N0cnVjdCBodmNfc3RydWN0ICpodmNfZ2V0X2J5X2luZGV4KGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhwLCAmaHZjX3N0cnVjdHMsIG5leHQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJCWlmIChocC0+aW5kZXggPT0gaW5kZXgpIHsKKwkJCWtvYmplY3RfZ2V0KCZocC0+a29iaik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCQkJc3Bpbl91bmxvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOworCQkJcmV0dXJuIGhwOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisJfQorCWhwID0gTlVMTDsKKworCXNwaW5fdW5sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKKwlyZXR1cm4gaHA7Cit9CisKKy8qCisgKiBUaGUgVFRZIGludGVyZmFjZSB3b24ndCBiZSB1c2VkIHVudGlsIGFmdGVyIHRoZSB2aW8gbGF5ZXIgaGFzIGV4cG9zZWQgdGhlIHZ0eQorICogYWRhcHRlciB0byB0aGUga2VybmVsLgorICovCitzdGF0aWMgaW50IGh2Y19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaXJxID0gTk9fSVJROworCWludCByYyA9IDA7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCisJLyogQXV0byBpbmNyZW1lbnRzIGtvYmplY3QgcmVmZXJlbmNlIGlmIGZvdW5kLiAqLworCWlmICghKGhwID0gaHZjX2dldF9ieV9pbmRleCh0dHktPmluZGV4KSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHZjX2NvbnNvbGU6IHR0eSBvcGVuIGZhaWxlZCwgbm8gdnR5IGFzc29jaWF0ZWQgd2l0aCB0dHkuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJLyogQ2hlY2sgYW5kIHRoZW4gaW5jcmVtZW50IGZvciBmYXN0IHBhdGggb3Blbi4gKi8KKwlpZiAoaHAtPmNvdW50KysgPiAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisJCWh2Y19raWNrKCk7CisJCXJldHVybiAwOworCX0gLyogZWxzZSBjb3VudCA9PSAwICovCisKKwl0dHktPmRyaXZlcl9kYXRhID0gaHA7CisJaHAtPnR0eSA9IHR0eTsKKwkvKiBTYXZlIGZvciByZXF1ZXN0X2lycSBvdXRzaWRlIG9mIHNwaW5fbG9jay4gKi8KKwlpcnEgPSBocC0+aXJxOworCWlmIChpcnEgIT0gTk9fSVJRKQorCQlocC0+aXJxX3JlcXVlc3RlZCA9IDE7CisKKwlrb2JqcCA9ICZocC0+a29iajsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisJLyogY2hlY2sgZXJyb3IsIGZhbGxiYWNrIHRvIG5vbi1pcnEgKi8KKwlpZiAoaXJxICE9IE5PX0lSUSkKKwkJcmMgPSByZXF1ZXN0X2lycShpcnEsIGh2Y19oYW5kbGVfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJodmNfY29uc29sZSIsIGhwKTsKKworCS8qCisJICogSWYgdGhlIHJlcXVlc3RfaXJxKCkgZmFpbHMgYW5kIHdlIHJldHVybiBhbiBlcnJvci4gIFRoZSB0dHkgbGF5ZXIKKwkgKiB3aWxsIGNhbGwgaHZjX2Nsb3NlKCkgYWZ0ZXIgYSBmYWlsZWQgb3BlbiBidXQgd2UgZG9uJ3Qgd2FudCB0byBjbGVhbgorCSAqIHVwIHRoZXJlIHNvIHdlJ2xsIGNsZWFuIHVwIGhlcmUgYW5kIGNsZWFyIG91dCB0aGUgcHJldmlvdXNseSBzZXQKKwkgKiB0dHkgZmllbGRzIGFuZCByZXR1cm4gdGhlIGtvYmplY3QgcmVmZXJlbmNlLgorCSAqLworCWlmIChyYykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJaHAtPnR0eSA9IE5VTEw7CisJCWhwLT5pcnFfcmVxdWVzdGVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCWtvYmplY3RfcHV0KGtvYmpwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJodmNfb3BlbjogcmVxdWVzdF9pcnEgZmFpbGVkIHdpdGggcmMgJWQuXG4iLCByYyk7CisJfQorCS8qIEZvcmNlIHdha2V1cCBvZiB0aGUgcG9sbGluZyB0aHJlYWQgKi8KKwlodmNfa2ljaygpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBodmNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocDsKKwlzdHJ1Y3Qga29iamVjdCAqa29ianA7CisJaW50IGlycSA9IE5PX0lSUTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCisJCXJldHVybjsKKworCS8qCisJICogTm8gZHJpdmVyX2RhdGEgbWVhbnMgdGhhdCB0aGlzIGNsb3NlIHdhcyBpc3N1ZWQgYWZ0ZXIgYSBmYWlsZWQKKwkgKiBodmNfb3BlbiBieSB0aGUgdHR5IGxheWVyJ3MgcmVsZWFzZV9kZXYoKSBmdW5jdGlvbiBhbmQgd2UgY2FuIGp1c3QKKwkgKiBleGl0IGNsZWFubHkgYmVjYXVzZSB0aGUga29iamVjdCByZWZlcmVuY2Ugd2Fzbid0IG1hZGUuCisJICovCisJaWYgKCF0dHktPmRyaXZlcl9kYXRhKQorCQlyZXR1cm47CisKKwlocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlrb2JqcCA9ICZocC0+a29iajsKKwlpZiAoLS1ocC0+Y291bnQgPT0gMCkgeworCQlpZiAoaHAtPmlycV9yZXF1ZXN0ZWQpCisJCQlpcnEgPSBocC0+aXJxOworCQlocC0+aXJxX3JlcXVlc3RlZCA9IDA7CisKKwkJLyogV2UgYXJlIGRvbmUgd2l0aCB0aGUgdHR5IHBvaW50ZXIgbm93LiAqLworCQlocC0+dHR5ID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBDaGFpbiBjYWxscyBjaGFyc19pbl9idWZmZXIoKSBhbmQgcmV0dXJucyBpbW1lZGlhdGVseSBpZgorCQkgKiB0aGVyZSBpcyBubyBidWZmZXJlZCBkYXRhIG90aGVyd2lzZSBzbGVlcHMgb24gYSB3YWl0IHF1ZXVlCisJCSAqIHdha2luZyBwZXJpb2RpY2FsbHkgdG8gY2hlY2sgY2hhcnNfaW5fYnVmZmVyKCkuCisJCSAqLworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgSFZDX0NMT1NFX1dBSVQpOworCisJCWlmIChpcnEgIT0gTk9fSVJRKQorCQkJZnJlZV9pcnEoaXJxLCBocCk7CisKKwl9IGVsc2UgeworCQlpZiAoaHAtPmNvdW50IDwgMCkKKwkJCXByaW50ayhLRVJOX0VSUiAiaHZjX2Nsb3NlICVYOiBvb3BzLCBjb3VudCBpcyAlZFxuIiwKKwkJCQlocC0+dnRlcm1ubywgaHAtPmNvdW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlrb2JqZWN0X3B1dChrb2JqcCk7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlycSA9IE5PX0lSUTsKKwlpbnQgdGVtcF9vcGVuX2NvdW50OworCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKKworCWlmICghaHApCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBUaGUgTl9UVFkgbGluZSBkaXNjaXBsaW5lIGhhcyBwcm9ibGVtcyBzdWNoIHRoYXQgaW4gYSBjbG9zZSB2cworCSAqIG9wZW4tPmhhbmd1cCBjYXNlIHRoaXMgY2FuIGJlIGNhbGxlZCBhZnRlciB0aGUgZmluYWwgY2xvc2Ugc28gcHJldmVudAorCSAqIHRoYXQgZnJvbSBoYXBwZW5pbmcgZm9yIG5vdy4KKwkgKi8KKwlpZiAoaHAtPmNvdW50IDw9IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWtvYmpwID0gJmhwLT5rb2JqOworCXRlbXBfb3Blbl9jb3VudCA9IGhwLT5jb3VudDsKKwlocC0+Y291bnQgPSAwOworCWhwLT5uX291dGJ1ZiA9IDA7CisJaHAtPnR0eSA9IE5VTEw7CisJaWYgKGhwLT5pcnFfcmVxdWVzdGVkKQorCQkvKiBTYXZlZCBmb3IgdXNlIG91dHNpZGUgb2Ygc3Bpbl9sb2NrLiAqLworCQlpcnEgPSBocC0+aXJxOworCWhwLT5pcnFfcmVxdWVzdGVkID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCWlmIChpcnEgIT0gTk9fSVJRKQorCQlmcmVlX2lycShpcnEsIGhwKTsKKwl3aGlsZSh0ZW1wX29wZW5fY291bnQpIHsKKwkJLS10ZW1wX29wZW5fY291bnQ7CisJCWtvYmplY3RfcHV0KGtvYmpwKTsKKwl9Cit9CisKKy8qCisgKiBQdXNoIGJ1ZmZlcmVkIGNoYXJhY3RlcnMgd2hldGhlciB0aGV5IHdlcmUganVzdCByZWNlbnRseSBidWZmZXJlZCBvciB3YWl0aW5nCisgKiBvbiBhIGJsb2NrZWQgaHlwZXJ2aXNvci4gIENhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGhwLT5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGh2Y19wdXNoKHN0cnVjdCBodmNfc3RydWN0ICpocCkKK3sKKwlpbnQgbjsKKworCW4gPSBodmNfcHV0X2NoYXJzKGhwLT52dGVybW5vLCBocC0+b3V0YnVmLCBocC0+bl9vdXRidWYpOworCWlmIChuIDw9IDApIHsKKwkJaWYgKG4gPT0gMCkKKwkJCXJldHVybjsKKwkJLyogdGhyb3cgYXdheSBvdXRwdXQgb24gZXJyb3I7IHRoaXMgaGFwcGVucyB3aGVuCisJCSAgIHRoZXJlIGlzIG5vIHNlc3Npb24gY29ubmVjdGVkIHRvIHRoZSB2dGVybS4gKi8KKwkJaHAtPm5fb3V0YnVmID0gMDsKKwl9IGVsc2UKKwkJaHAtPm5fb3V0YnVmIC09IG47CisJaWYgKGhwLT5uX291dGJ1ZiA+IDApCisJCW1lbW1vdmUoaHAtPm91dGJ1ZiwgaHAtPm91dGJ1ZiArIG4sIGhwLT5uX291dGJ1Zik7CisJZWxzZQorCQlocC0+ZG9fd2FrZXVwID0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19odmNfd3JpdGVfa2VybmVsKHN0cnVjdCBodmNfc3RydWN0ICpocCwKKwkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByc2l6ZSwgd3JpdHRlbiA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFB1c2ggcGVuZGluZyB3cml0ZXMgKi8KKwlpZiAoaHAtPm5fb3V0YnVmID4gMCkKKwkJaHZjX3B1c2goaHApOworCisJd2hpbGUgKGNvdW50ID4gMCAmJiAocnNpemUgPSBOX09VVEJVRiAtIGhwLT5uX291dGJ1ZikgPiAwKSB7CisJCWlmIChyc2l6ZSA+IGNvdW50KQorCQkJcnNpemUgPSBjb3VudDsKKwkJbWVtY3B5KGhwLT5vdXRidWYgKyBocC0+bl9vdXRidWYsIGJ1ZiwgcnNpemUpOworCQljb3VudCAtPSByc2l6ZTsKKwkJYnVmICs9IHJzaXplOworCQlocC0+bl9vdXRidWYgKz0gcnNpemU7CisJCXdyaXR0ZW4gKz0gcnNpemU7CisJCWh2Y19wdXNoKGhwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB3cml0dGVuOworfQorc3RhdGljIGludCBodmNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgd3JpdHRlbjsKKworCS8qIFRoaXMgd3JpdGUgd2FzIHByb2JhYmx5IGV4ZWN1dGVkIGR1cmluZyBhIHR0eSBjbG9zZS4gKi8KKwlpZiAoIWhwKQorCQlyZXR1cm4gLUVQSVBFOworCisJaWYgKGhwLT5jb3VudCA8PSAwKQorCQlyZXR1cm4gLUVJTzsKKworCXdyaXR0ZW4gPSBfX2h2Y193cml0ZV9rZXJuZWwoaHAsIGJ1ZiwgY291bnQpOworCisJLyoKKwkgKiBSYWN5LCBidXQgaGFybWxlc3MsIGtpY2sgdGhyZWFkIGlmIHRoZXJlIGlzIHN0aWxsIHBlbmRpbmcgZGF0YS4KKwkgKiBUaGVyZSByZWFsbHkgaXMgbm90aGluZyB3cm9uZyB3aXRoIGtpY2tpbmcgdGhlIHRocmVhZCwgZXZlbiBpZiB0aGVyZQorCSAqIGlzIG5vIGJ1ZmZlcmVkIGRhdGEuCisJICovCisJaWYgKGhwLT5uX291dGJ1ZikKKwkJaHZjX2tpY2soKTsKKworCXJldHVybiB3cml0dGVuOworfQorCisvKgorICogVGhpcyBpcyBhY3R1YWxseSBhIGNvbnRyYWN0IGJldHdlZW4gdGhlIGRyaXZlciBhbmQgdGhlIHR0eSBsYXllciBvdXRsaW5pbmcKKyAqIGhvdyBtdWNoIHdyaXRlIHJvb20gdGhlIGRyaXZlciBjYW4gZ3VhcmVudGVlIHdpbGwgYmUgc2VudCBPUiBCVUZGRVJFRC4gIFRoaXMKKyAqIGRyaXZlciBNVVNUIGhvbm9yIHRoZSByZXR1cm4gdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgaHZjX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFocCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIE5fT1VUQlVGIC0gaHAtPm5fb3V0YnVmOworfQorCitzdGF0aWMgaW50IGh2Y19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFocCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBocC0+bl9vdXRidWY7Cit9CisKKyNkZWZpbmUgSFZDX1BPTExfUkVBRAkweDAwMDAwMDAxCisjZGVmaW5lIEhWQ19QT0xMX1dSSVRFCTB4MDAwMDAwMDIKKyNkZWZpbmUgSFZDX1BPTExfUVVJQ0sJMHgwMDAwMDAwNAorCitzdGF0aWMgaW50IGh2Y19wb2xsKHN0cnVjdCBodmNfc3RydWN0ICpocCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBpLCBuLCBwb2xsX21hc2sgPSAwOworCWNoYXIgYnVmW05fSU5CVUZdIF9fQUxJR05FRF9fOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlYWRfdG90YWwgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBQdXNoIHBlbmRpbmcgd3JpdGVzICovCisJaWYgKGhwLT5uX291dGJ1ZiA+IDApCisJCWh2Y19wdXNoKGhwKTsKKwkvKiBSZXNjaGVkdWxlIHVzIGlmIHN0aWxsIHNvbWUgd3JpdGUgcGVuZGluZyAqLworCWlmIChocC0+bl9vdXRidWYgPiAwKQorCQlwb2xsX21hc2sgfD0gSFZDX1BPTExfV1JJVEU7CisKKwkvKiBObyB0dHkgYXR0YWNoZWQsIGp1c3Qgc2tpcCAqLworCXR0eSA9IGhwLT50dHk7CisJaWYgKHR0eSA9PSBOVUxMKQorCQlnb3RvIGJhaWw7CisKKwkvKiBOb3cgY2hlY2sgaWYgd2UgY2FuIGdldCBkYXRhIChhcmUgd2UgdGhyb3R0bGVkID8pICovCisJaWYgKHRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkKKwkJZ290byB0aHJvdHRsZWQ7CisKKwkvKiBJZiB3ZSBhcmVuJ3QgaW50ZXJydXB0IGRyaXZlbiBhbmQgYXJlbid0IHRocm90dGxlZCwgd2UgYWx3YXlzCisJICogcmVxdWVzdCBhIHJlc2NoZWR1bGUKKwkgKi8KKwlpZiAoaHAtPmlycSA9PSBOT19JUlEpCisJCXBvbGxfbWFzayB8PSBIVkNfUE9MTF9SRUFEOworCisJLyogUmVhZCBkYXRhIGlmIGFueSAqLworCWZvciAoOzspIHsKKwkJaW50IGNvdW50ID0gTl9JTkJVRjsKKwkJaWYgKGNvdW50ID4gKFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQpKQorCQkJY291bnQgPSBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50OworCisJCS8qIElmIGZsaXAgaXMgZnVsbCwganVzdCByZXNjaGVkdWxlIGEgbGF0ZXIgcmVhZCAqLworCQlpZiAoY291bnQgPT0gMCkgeworCQkJcG9sbF9tYXNrIHw9IEhWQ19QT0xMX1JFQUQ7CisJCQlicmVhazsKKwkJfQorCisJCW4gPSBodmNfZ2V0X2NoYXJzKGhwLT52dGVybW5vLCBidWYsIGNvdW50KTsKKwkJaWYgKG4gPD0gMCkgeworCQkJLyogSGFuZ3VwIHRoZSB0dHkgd2hlbiBkaXNjb25uZWN0ZWQgZnJvbSBob3N0ICovCisJCQlpZiAobiA9PSAtRVBJUEUpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCQkJCXR0eV9oYW5ndXAodHR5KTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKKwkJCS8qIEhhbmRsZSB0aGUgU3lzUnEgSGFjayAqLworCQkJaWYgKGJ1ZltpXSA9PSAnXHgwZicpIHsJLyogXk8gLS0gc2hvdWxkIHN1cHBvcnQgYSBzZXF1ZW5jZSAqLworCQkJCXN5c3JxX3ByZXNzZWQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChzeXNycV9wcmVzc2VkKSB7CisJCQkJaGFuZGxlX3N5c3JxKGJ1ZltpXSwgTlVMTCwgdHR5KTsKKwkJCQlzeXNycV9wcmVzc2VkID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYnVmW2ldLCAwKTsKKwkJfQorCisJCWlmICh0dHktPmZsaXAuY291bnQpCisJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworCisJCS8qCisJCSAqIEFjY291bnQgZm9yIHRoZSB0b3RhbCBhbW91bnQgcmVhZCBpbiBvbmUgbG9vcCwgYW5kIGlmIGFib3ZlCisJCSAqIDY0IGJ5dGVzLCB3ZSBkbyBhIHF1aWNrIHNjaGVkdWxlIGxvb3AgdG8gbGV0IHRoZSB0dHkgZ3JvayB0aGUKKwkJICogZGF0YSBhbmQgZXZlbnR1YWxseSB0aHJvdHRsZSB1cy4KKwkJICovCisJCXJlYWRfdG90YWwgKz0gbjsKKwkJaWYgKHJlYWRfdG90YWwgPj0gNjQpIHsKKwkJCXBvbGxfbWFzayB8PSBIVkNfUE9MTF9RVUlDSzsKKwkJCWJyZWFrOworCQl9CisJfQorIHRocm90dGxlZDoKKwkvKiBXYWtldXAgd3JpdGUgcXVldWUgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGhwLT5kb193YWtldXApIHsKKwkJaHAtPmRvX3dha2V1cCA9IDA7CisJCXR0eV93YWtldXAodHR5KTsKKwl9CisgYmFpbDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHBvbGxfbWFzazsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1hNT04pICYmIGRlZmluZWQoQ09ORklHX1NNUCkKK2V4dGVybiBjcHVtYXNrX3QgY3B1c19pbl94bW9uOworI2Vsc2UKK3N0YXRpYyBjb25zdCBjcHVtYXNrX3QgY3B1c19pbl94bW9uID0gQ1BVX01BU0tfTk9ORTsKKyNlbmRpZgorCisvKgorICogVGhpcyBrdGhyZWFkIGlzIGVpdGhlciBwb2xsaW5nIG9yIGludGVycnVwdCBkcml2ZW4uICBUaGlzIGlzIGRldGVybWluZWQgYnkKKyAqIGNhbGxpbmcgaHZjX3BvbGwoKSB3aG8gZGV0ZXJtaW5lcyB3aGV0aGVyIGEgY29uc29sZSBhZGFwdGVyIHN1cHBvcnQKKyAqIGludGVycnVwdHMuCisgKi8KK2ludCBraHZjZCh2b2lkICp1bnVzZWQpCit7CisJaW50IHBvbGxfbWFzazsKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7CisKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJZG8geworCQlwb2xsX21hc2sgPSAwOworCQlodmNfa2lja2VkID0gMDsKKwkJd21iKCk7CisJCWlmIChjcHVzX2VtcHR5KGNwdXNfaW5feG1vbikpIHsKKwkJCXNwaW5fbG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhwLCAmaHZjX3N0cnVjdHMsIG5leHQpIHsKKwkJCQkvKmhwID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgaHZjX3N0cnVjdCwgKiBuZXh0KTsgKi8KKwkJCQlwb2xsX21hc2sgfD0gaHZjX3BvbGwoaHApOworCQkJfQorCQkJc3Bpbl91bmxvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOworCQl9IGVsc2UKKwkJCXBvbGxfbWFzayB8PSBIVkNfUE9MTF9SRUFEOworCQlpZiAoaHZjX2tpY2tlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAocG9sbF9tYXNrICYgSFZDX1BPTExfUVVJQ0spIHsKKwkJCXlpZWxkKCk7CisJCQljb250aW51ZTsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAoIWh2Y19raWNrZWQpIHsKKwkJCWlmIChwb2xsX21hc2sgPT0gMCkKKwkJCQlzY2hlZHVsZSgpOworCQkJZWxzZQorCQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKFRJTUVPVVQpOworCQl9CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGh2Y19vcHMgPSB7CisJLm9wZW4gPSBodmNfb3BlbiwKKwkuY2xvc2UgPSBodmNfY2xvc2UsCisJLndyaXRlID0gaHZjX3dyaXRlLAorCS5oYW5ndXAgPSBodmNfaGFuZ3VwLAorCS51bnRocm90dGxlID0gaHZjX3VudGhyb3R0bGUsCisJLndyaXRlX3Jvb20gPSBodmNfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gaHZjX2NoYXJzX2luX2J1ZmZlciwKK307CisKK2NoYXIgaHZjX2RyaXZlcl9uYW1lW10gPSAiaHZjX2NvbnNvbGUiOworCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgaHZjX2RyaXZlcl90YWJsZVtdIF9fZGV2aW5pdGRhdGE9IHsKKwl7InNlcmlhbCIsICJodnRlcm0xIn0sCisJeyBOVUxMLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIGh2Y19kcml2ZXJfdGFibGUpOworCisvKiBjYWxsYmFjayB3aGVuIHRoZSBrYm9qZWN0IHJlZiBjb3VudCByZWFjaGVzIHplcm8uICovCitzdGF0aWMgdm9pZCBkZXN0cm95X2h2Y19zdHJ1Y3Qoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBodmNfc3RydWN0LCBrb2JqKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCYoaHAtPm5leHQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJc3Bpbl91bmxvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOworCisJa2ZyZWUoaHApOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBodmNfa29ial90eXBlID0geworCS5yZWxlYXNlID0gZGVzdHJveV9odmNfc3RydWN0LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaHZjX3Byb2JlKAorCQlzdHJ1Y3QgdmlvX2RldiAqZGV2LAorCQljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwOworCisJLyogcHJvYmVkIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzLiAqLworCWlmICghZGV2IHx8ICFpZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWhwID0ga21hbGxvYyhzaXplb2YoKmhwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFocCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoaHAsIDB4MDAsIHNpemVvZigqaHApKTsKKwlocC0+dnRlcm1ubyA9IGRldi0+dW5pdF9hZGRyZXNzOworCWhwLT52ZGV2ID0gZGV2OworCWhwLT52ZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBocDsKKwlocC0+aXJxID0gZGV2LT5pcnE7CisKKwlrb2JqZWN0X2luaXQoJmhwLT5rb2JqKTsKKwlocC0+a29iai5rdHlwZSA9ICZodmNfa29ial90eXBlOworCisJc3Bpbl9sb2NrX2luaXQoJmhwLT5sb2NrKTsKKwlzcGluX2xvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOworCWhwLT5pbmRleCA9ICsraHZjX2NvdW50OworCWxpc3RfYWRkX3RhaWwoJihocC0+bmV4dCksICZodmNfc3RydWN0cyk7CisJc3Bpbl91bmxvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGh2Y19yZW1vdmUoc3RydWN0IHZpb19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAgPSBkZXYtPmRldi5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJdHR5ID0gaHAtPnR0eTsKKwlrb2JqcCA9ICZocC0+a29iajsKKworCWlmIChocC0+aW5kZXggPCBNQVhfTlJfSFZDX0NPTlNPTEVTKQorCQl2dGVybW5vc1tocC0+aW5kZXhdID0gLTE7CisKKwkvKiBEb24ndCB3aGFjayBocC0+aXJxIGJlY2F1c2UgdHR5X2hhbmd1cCgpIHdpbGwgbmVlZCB0byBmcmVlIHRoZSBpcnEuICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBXZSAncHV0JyB0aGUgaW5zdGFuY2UgdGhhdCB3YXMgZ3JhYmJlZCB3aGVuIHRoZSBrb2JqZWN0IGluc3RhbmNlCisJICogd2FzIGludGlhbGl6ZWQgdXNpbmcga29iamVjdF9pbml0KCkuICBMZXQgdGhlIGxhc3QgaG9sZGVyIG9mIHRoaXMKKwkgKiBrb2JqZWN0IGNhdXNlIGl0IHRvIGJlIHJlbW92ZWQsIHdoaWNoIHdpbGwgcHJvYmFibHkgYmUgdGhlIHR0eV9oYW5ndXAKKwkgKiBiZWxvdy4KKwkgKi8KKwlrb2JqZWN0X3B1dChrb2JqcCk7CisKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gY2FsbCB3aWxsIGF1dG8gY2hhaW4gY2FsbCBodmNfaGFuZ3VwLiAgVGhlIHR0eSBzaG91bGQKKwkgKiBhbHdheXMgYmUgdmFsaWQgYXQgdGhpcyB0aW1lIHVubGVzcyBhIHNpbXVsdGFuZW91cyB0dHkgY2xvc2UgYWxyZWFkeQorCSAqIGNsZWFuZWQgdXAgdGhlIGh2Y19zdHJ1Y3QuCisJICovCisJaWYgKHR0eSkKKwkJdHR5X2hhbmd1cCh0dHkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgaHZjX3Zpb19kcml2ZXIgPSB7CisJLm5hbWUJCT0gaHZjX2RyaXZlcl9uYW1lLAorCS5pZF90YWJsZQk9IGh2Y19kcml2ZXJfdGFibGUsCisJLnByb2JlCQk9IGh2Y19wcm9iZSwKKwkucmVtb3ZlCQk9IGh2Y19yZW1vdmUsCit9OworCisvKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24uICBGb2xsb3cgY29uc29sZSBpbml0aWFsaXphdGlvbi4gIFRoaXMgaXMgd2hlcmUgdGhlIFRUWQorICogaW50ZXJmYWNlcyBzdGFydCB0byBiZWNvbWUgYXZhaWxhYmxlLiAqLworaW50IF9faW5pdCBodmNfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCS8qIFdlIG5lZWQgbW9yZSB0aGFuIG51bV92dGVybXMgYWRhcHRlcnMgZHVlIHRvIGhvdHBsdWcgYWRkaXRpb25zLiAqLworCWh2Y19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKEhWQ19BTExPQ19UVFlfQURBUFRFUlMpOworCS8qIGh2Y19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKG51bV92dGVybXMpOyAqLworCWlmICghaHZjX2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlodmNfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCWh2Y19kcml2ZXItPmRldmZzX25hbWUgPSAiaHZjLyI7CisJaHZjX2RyaXZlci0+ZHJpdmVyX25hbWUgPSAiaHZjIjsKKwlodmNfZHJpdmVyLT5uYW1lID0gImh2YyI7CisJaHZjX2RyaXZlci0+bWFqb3IgPSBIVkNfTUFKT1I7CisJaHZjX2RyaXZlci0+bWlub3Jfc3RhcnQgPSBIVkNfTUlOT1I7CisJaHZjX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TWVNURU07CisJaHZjX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCWh2Y19kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoaHZjX2RyaXZlciwgJmh2Y19vcHMpOworCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoaHZjX2RyaXZlcikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBodmMgY29uc29sZSBkcml2ZXJcbiIpOworCisJLyogQWx3YXlzIHN0YXJ0IHRoZSBrdGhyZWFkIGJlY2F1c2UgdGhlcmUgY2FuIGJlIGhvdHBsdWcgdnR5IGFkYXB0ZXJzCisJICogYWRkZWQgbGF0ZXIuICovCisJaHZjX3Rhc2sgPSBrdGhyZWFkX3J1bihraHZjZCwgTlVMTCwgImtodmNkIik7CisJaWYgKElTX0VSUihodmNfdGFzaykpIHsKKwkJcGFuaWMoIkNvdWxkbid0IGNyZWF0ZSBrdGhyZWFkIGZvciBjb25zb2xlLlxuIik7CisJCXB1dF90dHlfZHJpdmVyKGh2Y19kcml2ZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBSZWdpc3RlciBhcyBhIHZpbyBkZXZpY2UgdG8gcmVjZWl2ZSBjYWxsYmFja3MgKi8KKwlyYyA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJmh2Y192aW9fZHJpdmVyKTsKKworCXJldHVybiByYzsKK30KKworLyogVGhpcyBpc24ndCBwYXJ0aWN1bGFyaWx5IG5lY2Vzc2FyeSBkdWUgdG8gdGhpcyBiZWluZyBhIGNvbnNvbGUgZHJpdmVyIGJ1dCBpdAorICogaXMgbmljZSB0byBiZSB0aG9yb3VnaCAqLworc3RhdGljIHZvaWQgX19leGl0IGh2Y19leGl0KHZvaWQpCit7CisJa3RocmVhZF9zdG9wKGh2Y190YXNrKTsKKworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmaHZjX3Zpb19kcml2ZXIpOworCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNfZHJpdmVyKTsKKwkvKiByZXR1cm4gdHR5X3N0cnVjdCBpbnN0YW5jZXMgYWxsb2NhdGVkIGluIGh2Y19pbml0KCkuICovCisJcHV0X3R0eV9kcml2ZXIoaHZjX2RyaXZlcik7Cit9CisKKy8qCisgKiBDb25zb2xlIEFQSXMsIE5PVCBUVFkuICBUaGVzZSBBUElzIGFyZSBhdmFpbGFibGUgaW1tZWRpYXRlbHkgd2hlbgorICogaHZjX2NvbnNvbGVfc2V0dXAoKSBmaW5kcyBhZGFwdGVycy4KKyAqLworCisvKgorICogaHZjX2luc3RhbnRpYXRlKCkgaXMgYW4gZWFybHkgY29uc29sZSBkaXNjb3ZlcnkgbWV0aG9kIHdoaWNoIGxvY2F0ZXMgY29uc29sZXMKKyAqIHByaW9yIHRvIHRoZSB2aW8gc3Vic3lzdGVtIGRpc2NvdmVyaW5nIHRoZW0uICBIb3RwbHVnZ2VkIHZ0eSBhZGFwdGVycyBkbyBOT1QKKyAqIGdldCBhbiBodmNfaW5zdGFudGlhdGUoKSBjYWxsYmFjayBzaW5jZSB0aGUgYXBwZWFyIGFmdGVyIGVhcmx5IGNvbnNvbGUgaW5pdC4KKyAqLworaW50IGh2Y19pbnN0YW50aWF0ZSh1aW50MzJfdCB2dGVybW5vLCBpbnQgaW5kZXgpCit7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodnRlcm1ub3NbaW5kZXhdICE9IC0xKQorCQlyZXR1cm4gLTE7CisKKwl2dGVybW5vc1tpbmRleF0gPSB2dGVybW5vOworCXJldHVybiAwOworfQorCit2b2lkIGh2Y19jb25zb2xlX3ByaW50KHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqYiwgdW5zaWduZWQgY291bnQpCit7CisJY2hhciBjWzE2XSBfX0FMSUdORURfXzsKKwl1bnNpZ25lZCBpID0gMCwgbiA9IDA7CisJaW50IHIsIGRvbmVjciA9IDA7CisKKwkvKiBDb25zb2xlIGFjY2VzcyBhdHRlbXB0IG91dHNpZGUgb2YgYWNjZXB0YWJsZSBjb25zb2xlIHJhbmdlLiAqLworCWlmIChjby0+aW5kZXggPj0gTUFYX05SX0hWQ19DT05TT0xFUykKKwkJcmV0dXJuOworCisJLyogVGhpcyBjb25zb2xlIGFkYXB0ZXIgd2FzIHJlbW92ZWQgc28gaXQgaXMgbm90IHVzZWFibGUuICovCisJaWYgKHZ0ZXJtbm9zW2NvLT5pbmRleF0gPCAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoY291bnQgPiAwIHx8IGkgPiAwKSB7CisJCWlmIChjb3VudCA+IDAgJiYgaSA8IHNpemVvZihjKSkgeworCQkJaWYgKGJbbl0gPT0gJ1xuJyAmJiAhZG9uZWNyKSB7CisJCQkJY1tpKytdID0gJ1xyJzsKKwkJCQlkb25lY3IgPSAxOworCQkJfSBlbHNlIHsKKwkJCQljW2krK10gPSBiW24rK107CisJCQkJZG9uZWNyID0gMDsKKwkJCQktLWNvdW50OworCQkJfQorCQl9IGVsc2UgeworCQkJciA9IGh2Y19wdXRfY2hhcnModnRlcm1ub3NbY28tPmluZGV4XSwgYywgaSk7CisJCQlpZiAociA8IDApIHsKKwkJCQkvKiB0aHJvdyBhd2F5IGNoYXJzIG9uIGVycm9yICovCisJCQkJaSA9IDA7CisJCQl9IGVsc2UgaWYgKHIgPiAwKSB7CisJCQkJaSAtPSByOworCQkJCWlmIChpID4gMCkKKwkJCQkJbWVtbW92ZShjLCBjK3IsIGkpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2Y19jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYywgaW50ICppbmRleCkKK3sKKwkqaW5kZXggPSBjLT5pbmRleDsKKwlyZXR1cm4gaHZjX2RyaXZlcjsKK30KKworc3RhdGljIGludCBfX2luaXQgaHZjX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgY29uc29sZSBodmNfY29uX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaHZjIiwKKwkud3JpdGUJCT0gaHZjX2NvbnNvbGVfcHJpbnQsCisJLmRldmljZQkJPSBodmNfY29uc29sZV9kZXZpY2UsCisJLnNldHVwCQk9IGh2Y19jb25zb2xlX3NldHVwLAorCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4CQk9IC0xLAorfTsKKworLyogRWFybHkgY29uc29sZSBpbml0aWFsaXphdGlvbi4gIFByZWNlZWRzIGRyaXZlciBpbml0aWFsaXphdGlvbi4gKi8KK3N0YXRpYyBpbnQgX19pbml0IGh2Y19jb25zb2xlX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPE1BWF9OUl9IVkNfQ09OU09MRVM7IGkrKykKKwkJdnRlcm1ub3NbaV0gPSAtMTsKKwludW1fdnRlcm1zID0gaHZjX2ZpbmRfdnR5cygpOworCXJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25fZHJpdmVyKTsKKwlyZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwoaHZjX2NvbnNvbGVfaW5pdCk7CisKK21vZHVsZV9pbml0KGh2Y19pbml0KTsKK21vZHVsZV9leGl0KGh2Y19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNzLmMgYi9kcml2ZXJzL2NoYXIvaHZjcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmJkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaHZjcy5jCkBAIC0wLDAgKzEsMTY0OSBAQAorLyoKKyAqIElCTSBlU2VydmVyIEh5cGVydmlzb3IgVmlydHVhbCBDb25zb2xlIFNlcnZlciBEZXZpY2UgRHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgSUJNIENvcnAuCisgKiAgUnlhbiBTLiBBcm5vbGQgKHJzYUB1cy5pYm0uY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICogQXV0aG9yKHMpIDogIFJ5YW4gUy4gQXJub2xkIDxyc2FAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIGlzIHRoZSBkZXZpY2UgZHJpdmVyIGZvciB0aGUgSUJNIEh5cGVydmlzb3IgVmlydHVhbCBDb25zb2xlIFNlcnZlciwKKyAqICJodmNzIi4gIFRoZSBJQk0gaHZjcyBwcm92aWRlcyBhIHR0eSBkcml2ZXIgaW50ZXJmYWNlIHRvIGFsbG93IExpbnV4CisgKiB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyBhY2Nlc3MgdG8gdGhlIHN5c3RlbSBjb25zb2xlcyBvZiBsb2dpY2FsbHkKKyAqIHBhcnRpdGlvbmVkIG9wZXJhdGluZyBzeXN0ZW1zLCBlLmcuIExpbnV4LCBydW5uaW5nIG9uIHRoZSBzYW1lIHBhcnRpdGlvbmVkCisgKiBQb3dlcjUgcHBjNjQgc3lzdGVtLiAgUGh5c2ljYWwgaGFyZHdhcmUgY29uc29sZXMgcGVyIHBhcnRpdGlvbiBhcmUgbm90CisgKiBwcmFjdGljYWwgb24gdGhpcyBoYXJkd2FyZSBzbyBzeXN0ZW0gY29uc29sZXMgYXJlIGFjY2Vzc2VkIGJ5IHRoaXMgZHJpdmVyCisgKiB1c2luZyBpbnRlci1wYXJ0aXRpb24gZmlybXdhcmUgaW50ZXJmYWNlcyB0byB2aXJ0dWFsIHRlcm1pbmFsIGRldmljZXMuCisgKgorICogQSB2dHkgaXMga25vd24gdG8gdGhlIEhNQyBhcyBhICJ2aXJ0dWFsIHNlcmlhbCBzZXJ2ZXIgYWRhcHRlciIuICBJdCBpcyBhCisgKiB2aXJ0dWFsIHRlcm1pbmFsIGRldmljZSB0aGF0IGlzIGNyZWF0ZWQgYnkgZmlybXdhcmUgdXBvbiBwYXJ0aXRpb24gY3JlYXRpb24KKyAqIHRvIGFjdCBhcyBhIHBhcnRpdGlvbmVkIE9TJ3MgY29uc29sZSBkZXZpY2UuCisgKgorICogRmlybXdhcmUgZHluYW1pY2FsbHkgKHZpYSBob3RwbHVnKSBleHBvc2VzIHZ0eS1zZXJ2ZXJzIHRvIGEgcnVubmluZyBwcGM2NAorICogTGludXggc3lzdGVtIHVwb24gdGhlaXIgY3JlYXRpb24gYnkgdGhlIEhNQyBvciB0aGVpciBleHBvc3VyZSBkdXJpbmcgYm9vdC4KKyAqIFRoZSBub24tdXNlciBpbnRlcmFjdGl2ZSBiYWNrZW5kIG9mIHRoaXMgZHJpdmVyIGlzIGltcGxlbWVudGVkIGFzIGEgdmlvCisgKiBkZXZpY2UgZHJpdmVyIHNvIHRoYXQgaXQgY2FuIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHZ0eS1zZXJ2ZXIgbGlmZXRpbWVzCisgKiBhZnRlciBpdCByZWdpc3RlcnMgd2l0aCB0aGUgdmlvIGJ1cyB0byBoYW5kbGUgdnR5LXNlcnZlciBwcm9iZSBhbmQgcmVtb3ZlCisgKiBjYWxsYmFja3MuCisgKgorICogTWFueSB2dHktc2VydmVycyBjYW4gYmUgY29uZmlndXJlZCB0byBjb25uZWN0IHRvIG9uZSB2dHksIGJ1dCBhIHZ0eSBjYW4KKyAqIG9ubHkgYmUgYWN0aXZlbHkgY29ubmVjdGVkIHRvIGJ5IGEgc2luZ2xlIHZ0eS1zZXJ2ZXIsIGluIGFueSBtYW5uZXIsIGF0IG9uZQorICogdGltZS4gIElmIHRoZSBITUMgaXMgY3VycmVudGx5IGhvc3RpbmcgdGhlIGNvbnNvbGUgZm9yIGEgdGFyZ2V0IExpbnV4CisgKiBwYXJ0aXRpb247IGF0dGVtcHRzIHRvIG9wZW4gdGhlIHR0eSBkZXZpY2UgdG8gdGhlIHBhcnRpdGlvbidzIGNvbnNvbGUgdXNpbmcKKyAqIHRoZSBodmNzIG9uIGFueSBwYXJ0aXRpb24gd2lsbCByZXR1cm4gLUVCVVNZIHdpdGggZXZlcnkgb3BlbiBhdHRlbXB0IHVudGlsCisgKiB0aGUgSE1DIGZyZWVzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gaXRzIHZ0eS1zZXJ2ZXIgYW5kIHRoZSBkZXNpcmVkCisgKiBwYXJ0aXRpb24ncyB2dHkgZGV2aWNlLiAgQ29udmVyc2VseSwgYSB2dHktc2VydmVyIG1heSBvbmx5IGJlIGNvbm5lY3RlZCB0bworICogYSBzaW5nbGUgdnR5IGF0IG9uZSB0aW1lIGV2ZW4gdGhvdWdoIGl0IG1heSBoYXZlIHNldmVyYWwgY29uZmlndXJlZCB2dHkKKyAqIHBhcnRuZXIgcG9zc2liaWxpdGllcy4KKyAqCisgKiBGaXJtd2FyZSBkb2VzIG5vdCBwcm92aWRlIG5vdGlmaWNhdGlvbiBvZiB2dHkgcGFydG5lciBjaGFuZ2VzIHRvIHRoaXMKKyAqIGRyaXZlci4gIFRoaXMgbWVhbnMgdGhhdCBhbiBITUMgU3VwZXIgQWRtaW4gbWF5IGFkZCBvciByZW1vdmUgcGFydG5lciB2dHlzCisgKiBmcm9tIGEgdnR5LXNlcnZlcidzIHBhcnRuZXIgbGlzdCBidXQgdGhlIGNoYW5nZXMgd2lsbCBub3QgYmUgc2lnbmFsZWQgdG8KKyAqIHRoZSB2dHktc2VydmVyLiAgRmlybXdhcmUgb25seSBub3RpZmllcyB0aGUgZHJpdmVyIHdoZW4gYSB2dHktc2VydmVyIGlzCisgKiBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4gIFRvIGNvbXBlbnNhdGUgZm9yIHRoaXMgZGVmaWNpZW5jeSwgdGhpcworICogZHJpdmVyIGltcGxlbWVudHMgYSBzeXNmcyB1cGRhdGUgYXR0cmlidXRlIHdoaWNoIHByb3ZpZGVzIGEgbWV0aG9kIGZvcgorICogcmVzY2FubmluZyBwYXJ0bmVyIGluZm9ybWF0aW9uIHVwb24gYSB1c2VyJ3MgcmVxdWVzdC4KKyAqCisgKiBFYWNoIHZ0eS1zZXJ2ZXIsIHByaW9yIHRvIGJlaW5nIGV4cG9zZWQgdG8gdGhpcyBkcml2ZXIgaXMgcmVmZXJlbmNlIGNvdW50ZWQKKyAqIHVzaW5nIHRoZSAyLjYgTGludXgga2VybmVsIGtvYmplY3QgY29uc3RydWN0LiAgVGhpcyBrb2JqZWN0IGlzIGFsc28gdXNlZCBieQorICogdGhlIHZpbyBidXMgdG8gcHJvdmlkZSBhIHZpbyBkZXZpY2Ugc3lzZnMgZW50cnkgdGhhdCB0aGlzIGRyaXZlciBhdHRhY2hlcworICogZGV2aWNlIHNwZWNpZmljIGF0dHJpYnV0ZXMgdG8sIGluY2x1ZGluZyBwYXJ0bmVyIGluZm9ybWF0aW9uLiAgVGhlIHZpbyBidXMKKyAqIGZyYW1ld29yayBhbHNvIHByb3ZpZGVzIGEgc3lzZnMgZW50cnkgZm9yIGVhY2ggdmlvIGRyaXZlci4gIFRoZSBodmNzIGRyaXZlcgorICogcHJvdmlkZXMgZHJpdmVyIGF0dHJpYnV0ZXMgaW4gdGhpcyBlbnRyeS4KKyAqCisgKiBGb3IgZGlyZWN0aW9uIG9uIGluc3RhbGxhdGlvbiBhbmQgdXNhZ2Ugb2YgdGhpcyBkcml2ZXIgcGxlYXNlIHJlZmVyZW5jZQorICogRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2h2Y3MudHh0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxhc20vaHZjb25zb2xlLmg+CisjaW5jbHVkZSA8YXNtL2h2Y3NlcnZlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorCisvKgorICogMS4zLjAgLT4gMS4zLjEgSW4gaHZjc19vcGVuIG1lbXNldCguLiwweDAwLC4uKSBpbnN0ZWFkIG9mIG1lbXNldCguLiwweDNGLDAwKS4KKyAqIFJlbW92ZWQgYnJhY2VzIGFyb3VuZCBzaW5nbGUgc3RhdGVtZW50cyBmb2xsb3dpbmcgY29uZGl0aW9uYWxzLiAgUmVtb3ZlZCAnPQorICogMCcgYWZ0ZXIgc3RhdGljIGludCBkZWNsYXJhdGlvbnMgc2luY2UgdGhlc2UgZGVmYXVsdCB0byB6ZXJvLiAgUmVtb3ZlZAorICogbGlzdF9mb3JfZWFjaF9zYWZlKCkgYW5kIHJlcGxhY2VkIHdpdGggbGlzdF9mb3JfZWFjaF9lbnRyeSgpIGluCisgKiBodmNzX2dldF9ieV9pbmRleCgpLiAgVGhlICdzYWZlJyB2ZXJzaW9uIGlzIHVuLW5lZWRlZCBub3cgdGhhdCB0aGUgZHJpdmVyIGlzCisgKiB1c2luZyBzcGlubG9ja3MuICBDaGFuZ2VkIHNwaW5fbG9ja19pcnFzYXZlKCkgdG8gc3Bpbl9sb2NrKCkgd2hlbiBsb2NraW5nCisgKiBodmNzX3N0cnVjdHNfbG9jayBhbmQgaHZjc19waV9sb2NrIHNpbmNlIHRoZXNlIGFyZSBub3QgdG91Y2hlZCBpbiBhbiBpbnQKKyAqIGhhbmRsZXIuICBJbml0aWFsaXplZCBodmNzX3N0cnVjdHNfbG9jayBhbmQgaHZjc19waV9sb2NrIHRvCisgKiBTUElOX0xPQ0tfVU5MT0NLRUQgYXQgZGVjbGFyYXRpb24gdGltZSByYXRoZXIgdGhhbiBpbiBodmNzX21vZHVsZV9pbml0KCkuCisgKiBBZGRlZCBzcGluX2xvY2sgYXJvdW5kIGxpc3RfZGVsKCkgaW4gZGVzdHJveV9odmNzX3N0cnVjdCgpIHRvIHByb3RlY3QgdGhlCisgKiBsaXN0IHRyYXZlcnNhbHMgZnJvbSBhIGRlbGV0aW9uLiAgUmVtb3ZlZCAnPSBOVUxMJyBmcm9tIHBvaW50ZXIgZGVjbGFyYXRpb24KKyAqIHN0YXRlbWVudHMgc2luY2UgdGhleSBhcmUgaW5pdGlhbGl6ZWQgTlVMTCBieSBkZWZhdWx0LiAgUmVtb3ZlZCB3bWIoKQorICogaW5zdGFuY2VzIGZyb20gaHZjc190cnlfd3JpdGUoKS4gIFRoZXkgcHJvYmFibHkgYXJlbid0IG5lZWRlZCB3aXRoIGxvY2tpbmcgaW4KKyAqIHBsYWNlLiAgQWRkZWQgY2hlY2sgYW5kIGNsZWFudXAgZm9yIGh2Y3NfcGlfYnVmZiA9IGttYWxsb2MoKSBpbgorICogaHZjc19tb2R1bGVfaW5pdCgpLiAgRXhwb3NlZCBodmNzX3N0cnVjdC5pbmRleCB2aWEgYSBzeXNmcyBhdHRyaWJ1dGUgc28gdGhhdAorICogdGhlIGNvdXBsaW5nIGJldHdlZW4gL2Rldi9odmNzKiBhbmQgYSB2dHktc2VydmVyIGNhbiBiZSBhdXRvbWF0aWNhbGx5CisgKiBkZXRlcm1pbmVkLiAgTW92ZWQga29iamVjdF9wdXQoKSBpbiBodmNzX29wZW4gb3V0c2lkZSBvZiB0aGUKKyAqIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKS4KKyAqCisgKiAxLjMuMSAtPiAxLjMuMiBDaGFuZ2VkIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgaHZjc19zdHJ1Y3QtPmluZGV4IGFuZCBoYWQgaXQKKyAqIGFsaWduIHdpdGggaG93IHRoZSB0dHkgbGF5ZXIgYWx3YXlzIGFzc2lnbnMgdGhlIGxvd2VzdCBpbmRleCBhdmFpbGFibGUuICBUaGlzCisgKiBjaGFuZ2UgcmVzdWx0ZWQgaW4gYSBsaXN0IG9mIGludHMgdGhhdCBkZW5vdGVzIHdoaWNoIGluZGV4ZXMgYXJlIGF2YWlsYWJsZS4KKyAqIERldmljZSBhZGRpdGlvbnMgYW5kIHJlbW92YWxzIHVzZSB0aGUgbmV3IGh2Y3NfZ2V0X2luZGV4KCkgYW5kCisgKiBodmNzX3JldHVybl9pbmRleCgpIGhlbHBlciBmdW5jdGlvbnMuICBUaGUgbGlzdCBpcyBjcmVhdGVkIHdpdGgKKyAqIGh2c2NfYWxsb2NfaW5kZXhfbGlzdCgpIGFuZCBpdCBpcyBkZXN0cm95ZWQgd2l0aCBodmNzX2ZyZWVfaW5kZXhfbGlzdCgpLgorICogV2l0aG91dCB0aGVzZSBmaXhlcyBob3RwbHVnIHZ0eS1zZXJ2ZXIgYWRhcHRlciBzdXBwb3J0IGdvZXMgY3Jhenkgd2l0aCB0aGlzCisgKiBkcml2ZXIgaWYgdGhlIHVzZXIgcmVtb3ZlcyBhIHZ0eS1zZXJ2ZXIgYWRhcHRlci4gIE1vdmVkIGZyZWVfaXJxKCkgb3V0c2lkZSBvZgorICogdGhlIGh2Y3NfZmluYWxfY2xvc2UoKSBmdW5jdGlvbiBpbiBvcmRlciB0byBnZXQgaXQgb3V0IG9mIHRoZSBzcGlubG9jay4KKyAqIFJlYXJyYW5nZWQgaHZjc19jbG9zZSgpLiAgQ2xlYW5lZCB1cCBzb21lIHByaW50a3MgYW5kIGRpZCBzb21lIGhvdXNla2VlcGluZworICogb24gdGhlIGNoYW5nZWxvZy4gIFJlbW92ZWQgbG9jYWwgQ0xDX0xFTkdUSCBhbmQgdXNlZCBIVkNTX0NMQ19MRU5HVEggZnJvbQorICogYXJjaC9wcGM2NC9odmNzZXJ2ZXIuaC4KKyAqCisgKiAxLjMuMiAtPiAxLjMuMyBSZXBsYWNlZCB5aWVsZCgpIGluIGh2Y3NfY2xvc2UoKSB3aXRoIHR0eV93YWl0X3VudGlsX3NlbnQoKSB0bworICogcHJldmVudCBwb3NzaWJsZSBsb2NrdXAgd2l0aCByZWFsdGltZSBzY2hlZHVsaW5nIGFzIHNpbWlsYXJpbHkgcG9pbnRlZCBvdXQgYnkKKyAqIGFrcG0gaW4gaHZjX2NvbnNvbGUuICBDaGFuZ2VkIHJlc3VsdGVkIGluIHRoZSByZW1vdmFsIG9mIGh2Y3NfZmluYWxfY2xvc2UoKQorICogdG8gcmVvcmRlciBjbGVhbnVwIG9wZXJhdGlvbnMgYW5kIHByZXZlbnQgZGlzY2FyZGluZyBvZiBwZW5kaW5nIGRhdGEgZHVyaW5nCisgKiBhbiBodmNzX2Nsb3NlKCkuICBSZW1vdmVkIHNwaW5sb2NrIHByb3RlY3Rpb24gb2YgaHZjc19zdHJ1Y3QgZGF0YSBtZW1iZXJzIGluCisgKiBodmNzX3dyaXRlX3Jvb20oKSBhbmQgaHZjc19jaGFyc19pbl9idWZmZXIoKSBiZWNhdXNlIHRoZXkgYXJlbid0IG5lZWRlZC4KKyAqLworCisjZGVmaW5lIEhWQ1NfRFJJVkVSX1ZFUlNJT04gIjEuMy4zIgorCitNT0RVTEVfQVVUSE9SKCJSeWFuIFMuIEFybm9sZCA8cnNhQHVzLmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBodmNzIChIeXBlcnZpc29yIFZpcnR1YWwgQ29uc29sZSBTZXJ2ZXIpIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oSFZDU19EUklWRVJfVkVSU0lPTik7CisKKy8qCisgKiBXYWl0IHRoaXMgbG9uZyBwZXIgaXRlcmF0aW9uIHdoaWxlIHRyeWluZyB0byBwdXNoIGJ1ZmZlcmVkIGRhdGEgdG8gdGhlCisgKiBoeXBlcnZpc29yIGJlZm9yZSBhbGxvd2luZyB0aGUgdHR5IHRvIGNvbXBsZXRlIGEgY2xvc2Ugb3BlcmF0aW9uLgorICovCisjZGVmaW5lIEhWQ1NfQ0xPU0VfV0FJVCAoSFovMTAwKSAvKiAxLzEwIG9mIGEgc2Vjb25kICovCisKKy8qCisgKiBTaW5jZSB0aGUgTGludXggVFRZIGNvZGUgZG9lcyBub3QgY3VycmVudGx5ICgyLTA0LTIwMDQpIHN1cHBvcnQgZHluYW1pYworICogYWRkaXRpb24gb2YgdHR5IGRlcml2ZWQgZGV2aWNlcyBhbmQgd2Ugc2hvdWxkbid0IGFsbG9jYXRlIHRob3VzYW5kcyBvZgorICogdHR5X2RldmljZSBwb2ludGVycyB3aGVuIHRoZSBudW1iZXIgb2YgdnR5LXNlcnZlciAmIHZ0eSBwYXJ0bmVyIGNvbm5lY3Rpb25zCisgKiB3aWxsIG1vc3Qgb2Z0ZW4gYmUgbXVjaCBsb3dlciB0aGFuIHRoaXMsIHdlJ2xsIGFyYml0cmFyaWx5IGFsbG9jYXRlCisgKiBIVkNTX0RFRkFVTFRfU0VSVkVSX0FEQVBURVJTIHR0eV9zdHJ1Y3RzIGFuZCBjZGV2J3MgYnkgZGVmYXVsdCB3aGVuIHdlCisgKiByZWdpc3RlciB0aGUgdHR5X2RyaXZlci4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyBhbiBpbnNtb2QgcGFyYW1ldGVyLgorICovCisjZGVmaW5lIEhWQ1NfREVGQVVMVF9TRVJWRVJfQURBUFRFUlMJNjQKKworLyoKKyAqIFRoZSB1c2VyIGNhbid0IGluc21vZCB3aXRoIG1vcmUgdGhhbiBIVkNTX01BWF9TRVJWRVJfQURBUFRFUlMgaHZjcyBkZXZpY2UKKyAqIG5vZGVzIGFzIGEgc2FuaXR5IGNoZWNrLiAgVGhlb3JldGljYWxseSB0aGVyZSBjYW4gYmUgb3ZlciAxIEJpbGxpb24KKyAqIHZ0eS1zZXJ2ZXIgJiB2dHkgcGFydG5lciBjb25uZWN0aW9ucy4KKyAqLworI2RlZmluZSBIVkNTX01BWF9TRVJWRVJfQURBUFRFUlMJMTAyNAorCisvKgorICogV2UgbGV0IExpbnV4IGFzc2lnbiB1cyBhIG1ham9yIG51bWJlciBhbmQgd2Ugc3RhcnQgdGhlIG1pbm9ycyBhdCB6ZXJvLiAgVGhlcmUKKyAqIGlzIG5vIGludHVpdGl2ZSBtYXBwaW5nIGJldHdlZW4gbWlub3IgbnVtYmVyIGFuZCB0aGUgdGFyZ2V0IHZ0eS1zZXJ2ZXIKKyAqIGFkYXB0ZXIgZXhjZXB0IHRoYXQgZWFjaCBuZXcgdnR5LXNlcnZlciBhZGFwdGVyIGlzIGFsd2F5cyBhc3NpZ25lZCB0byB0aGUKKyAqIHNtYWxsZXN0IG1pbm9yIG51bWJlciBhdmFpbGFibGUuCisgKi8KKyNkZWZpbmUgSFZDU19NSU5PUl9TVEFSVAkwCisKKy8qCisgKiBUaGUgaGNhbGwgaW50ZXJmYWNlIGludm9sdmVzIHB1dHRpbmcgOCBjaGFycyBpbnRvIGVhY2ggb2YgdHdvIHJlZ2lzdGVycy4KKyAqIFdlIGxvYWQgdXAgdGhvc2UgMiByZWdpc3RlcnMgKGluIGFyY2gvcHBjNjQvaHZjb25zb2xlLmMpIGJ5IGNhc3RpbmcgY2hhclsxNl0KKyAqIHRvIGxvbmdbMl0uICBJdCB3b3VsZCB3b3JrIHdpdGhvdXQgX19BTElHTkVEX18sIGJ1dCBhIGxpdHRsZSAodGlueSkgYml0CisgKiBzbG93ZXIgYmVjYXVzZSBhbiB1bmFsaWduZWQgbG9hZCBpcyBzbG93ZXIgdGhhbiBhbGlnbmVkIGxvYWQuCisgKi8KKyNkZWZpbmUgX19BTElHTkVEX18JX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oOCkpKQorCisvKgorICogSG93IG11Y2ggZGF0YSBjYW4gZmlybXdhcmUgc2VuZCB3aXRoIGVhY2ggaHZjX3B1dF9jaGFycygpPyAgTWF5YmUgdGhpcworICogc2hvdWxkIGJlIG1vdmVkIGludG8gYW4gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGFyZWEuCisgKi8KKyNkZWZpbmUgSFZDU19CVUZGX0xFTgkxNgorCisvKgorICogVGhpcyBpcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSB3ZSdsbCBsZXQgdGhlIHVzZXIgc2VuZCB1cyAoaHZjc193cml0ZSkgYXQKKyAqIG9uY2UgaW4gYSBjaHVuayBhcyBhIHNhbml0eSBjaGVjay4KKyAqLworI2RlZmluZSBIVkNTX01BWF9GUk9NX1VTRVIJNDA5NgorCisvKgorICogQmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBmbGFncyB0byB0aGlzIGxpbmUgZGlzY2lwbGluZS4gIERvbid0IGFkZCBhbnl0aGluZworICogdGhhdCB3aWxsIGNhdXNlIGVjaG9pbmcgb3Igd2UnbGwgZ28gaW50byByZWN1cnNpdmUgbG9vcCBlY2hvaW5nIGNoYXJzIGJhY2sKKyAqIGFuZCBmb3J0aCB3aXRoIHRoZSBjb25zb2xlIGRyaXZlcnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyBodmNzX3R0eV90ZXJtaW9zID0geworCS5jX2lmbGFnID0gSUdOQlJLIHwgSUdOUEFSLAorCS5jX29mbGFnID0gT1BPU1QsCisJLmNfY2ZsYWcgPSBCMzg0MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMLAorCS5jX2NjID0gSU5JVF9DX0NDCit9OworCisvKgorICogVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIHRha2UgdGhlIHBsYWNlIG9mIGEgY29tbWFuZCBsaW5lIHBhcmFtZXRlciB3aGVuIHRoZQorICogbW9kdWxlIGlzIGluc2VydGVkLiAgSXQgc3RhcnRzIGFzIC0xIGFuZCBzdGF5cyBhcyBzdWNoIGlmIHRoZSB1c2VyIGRvZXNuJ3QKKyAqIHNwZWNpZnkgYSBtb2R1bGUgaW5zbW9kIHBhcmFtZXRlci4gIElmIHRoZXkgRE8gc3BlY2lmeSBvbmUgdGhlbiBpdCBpcyBzZXQgdG8KKyAqIHRoZSB2YWx1ZSBvZiB0aGUgaW50ZWdlciBwYXNzZWQgaW4uCisgKi8KK3N0YXRpYyBpbnQgaHZjc19wYXJtX251bV9kZXZzID0gLTE7Cittb2R1bGVfcGFyYW0oaHZjc19wYXJtX251bV9kZXZzLCBpbnQsIDApOworCitjaGFyIGh2Y3NfZHJpdmVyX25hbWVbXSA9ICJodmNzIjsKK2NoYXIgaHZjc19kZXZpY2Vfbm9kZVtdID0gImh2Y3MiOworY2hhciBodmNzX2RyaXZlcl9zdHJpbmdbXQorCT0gIklCTSBodmNzIChIeXBlcnZpc29yIFZpcnR1YWwgQ29uc29sZSBTZXJ2ZXIpIERyaXZlciI7CisKKy8qIFN0YXR1cyBvZiBwYXJ0bmVyIGluZm8gcmVzY2FuIHRyaWdnZXJlZCB2aWEgc3lzZnMuICovCitzdGF0aWMgaW50IGh2Y3NfcmVzY2FuX3N0YXR1czsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpodmNzX3R0eV9kcml2ZXI7CisKKy8qCisgKiBJbiBvcmRlciB0byBiZSBzb21ld2hhdCBzYW5lIHRoaXMgZHJpdmVyIGFsd2F5cyBhc3NvY2lhdGVzIHRoZSBodmNzX3N0cnVjdAorICogaW5kZXggZWxlbWVudCB3aXRoIHRoZSBudW1lcmljYWxseSBlcXVhbCB0dHktPmluZGV4LiAgVGhpcyBtZWFucyB0aGF0IGEKKyAqIGhvdHBsdWdnZWQgdnR5LXNlcnZlciBhZGFwdGVyIHdpbGwgYWx3YXlzIG1hcCB0byB0aGUgbG93ZXN0IGluZGV4IHZhbHVlZAorICogZGV2aWNlIG5vZGUuICBJZiB2dHktc2VydmVycyB3ZXJlIGhvdHBsdWcgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0gYW5kIHRoZW4KKyAqIG5ldyBvbmVzIGFkZGVkIHRoZSBuZXcgdnR5LXNlcnZlciBtYXkgaGF2ZSB0aGUgbGFyZ2VzdCBzbG90IG51bWJlciBvZiBhbGwKKyAqIHRoZSB2dHktc2VydmVyIGFkYXB0ZXJzIGluIHRoZSBwYXJ0aXRpb24gYnV0IGl0IG1heSBoYXZlIHRoZSBsb3dlc3QgZGV2IG5vZGUKKyAqIGluZGV4IG9mIGFsbCB0aGUgYWRhcHRlcnMgZHVlIHRvIHRoZSBob2xlIGxlZnQgYnkgdGhlIGhvdHBsdWcgcmVtb3ZlZAorICogYWRhcHRlci4gIFRoZXJlIGFyZSBhIHNldCBvZiBmdW5jdGlvbnMgcHJvdmlkZWQgdG8gZ2V0IHRoZSBsb3dlc3QgaW5kZXggZm9yCisgKiBhIG5ldyBkZXZpY2UgYXMgd2VsbCBhcyByZXR1cm4gdGhlIGluZGV4IHRvIHRoZSBsaXN0LiAgVGhpcyBsaXN0IGlzIGFsbG9jYXRlZAorICogd2l0aCBhIG51bWJlciBvZiBlbGVtZW50cyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGRldmljZSBub2RlcyByZXF1ZXN0ZWQgd2hlbgorICogdGhlIG1vZHVsZSB3YXMgaW5zZXJ0ZWQuCisgKi8KK3N0YXRpYyBpbnQgKmh2Y3NfaW5kZXhfbGlzdDsKKworLyoKKyAqIEhvdyBsYXJnZSBpcyB0aGUgbGlzdD8gIFRoaXMgaXMga2VwdCBmb3IgdHJhdmVyc2FsIHNpbmNlIHRoZSBsaXN0IGlzCisgKiBkeW5hbWljYWxseSBjcmVhdGVkLgorICovCitzdGF0aWMgaW50IGh2Y3NfaW5kZXhfY291bnQ7CisKKy8qCisgKiBVc2VkIGJ5IHRoZSBraHZjc2QgdG8gcGljayB1cCBJL08gb3BlcmF0aW9ucyB3aGVuIHRoZSBrZXJuZWxfdGhyZWFkIGlzCisgKiBhbHJlYWR5IGF3YWtlIGJ1dCBwb3RlbnRpYWxseSBzaGlmdGVkIHRvIFRBU0tfSU5URVJSVVBUSUJMRSBzdGF0ZS4KKyAqLworc3RhdGljIGludCBodmNzX2tpY2tlZDsKKworLyoKKyAqIFVzZSBieSB0aGUga3RocmVhZCBjb25zdHJ1Y3QgZm9yIHRhc2sgb3BlcmF0aW9ucyBsaWtlIHdha2luZyB0aGUgc2xlZXBpbmcKKyAqIHRocmVhZCBhbmQgc3RvcHBpbmcgdGhlIGt0aHJlYWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmh2Y3NfdGFzazsKKworLyoKKyAqIFdlIGFsbG9jYXRlIHRoaXMgZm9yIHRoZSB1c2Ugb2YgYWxsIG9mIHRoZSBodmNzX3N0cnVjdHMgd2hlbiB0aGV5IGZldGNoCisgKiBwYXJ0bmVyIGluZm8uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nICpodmNzX3BpX2J1ZmY7CisKKy8qIE9ubHkgYWxsb3cgb25lIGh2Y3Nfc3RydWN0IHRvIHVzZSB0aGUgaHZjc19waV9idWZmIGF0IGEgdGltZS4gKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHZjc19waV9sb2NrKTsKKworLyogT25lIHZ0eS1zZXJ2ZXIgcGVyIGh2Y3Nfc3RydWN0ICovCitzdHJ1Y3QgaHZjc19zdHJ1Y3QgeworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qCisJICogVGhpcyBpbmRleCBpZGVudGlmaWVzIHRoaXMgaHZjcyBkZXZpY2UgYXMgdGhlIGNvbXBsZW1lbnQgdG8gYQorCSAqIHNwZWNpZmljIHR0eSBpbmRleC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGludCBvcGVuX2NvdW50OworCisJLyoKKwkgKiBVc2VkIHRvIHRlbGwgdGhlIGRyaXZlciBrZXJuZWxfdGhyZWFkIHdoYXQgb3BlcmF0aW9ucyBuZWVkIHRvIHRha2UKKwkgKiBwbGFjZSB1cG9uIHRoaXMgaHZjc19zdHJ1Y3QgaW5zdGFuY2UuCisJICovCisJaW50IHRvZG9fbWFzazsKKworCS8qCisJICogVGhpcyBidWZmZXIgaXMgcmVxdWlyZWQgc28gdGhhdCB3aGVuIGh2Y3Nfd3JpdGVfcm9vbSgpIHJlcG9ydHMgdGhhdAorCSAqIGl0IGNhbiBzZW5kIEhWQ1NfQlVGRl9MRU4gY2hhcmFjdGVycyB0aGF0IGl0IHdpbGwgYnVmZmVyIHRoZSBmdWxsCisJICogSFZDU19CVUZGX0xFTiBjaGFyYWN0ZXJzIGlmIG5lZWQgYmUuICBUaGlzIGlzIGVzc2VudGlhbCBmb3Igb3Bvc3QKKwkgKiB3cml0ZXMgc2luY2UgdGhleSBkbyBub3QgZG8gaGlnaCBsZXZlbCBidWZmZXJpbmcgYW5kIGV4cGVjdCB0byBiZQorCSAqIGFibGUgdG8gc2VuZCB3aGF0IHRoZSBkcml2ZXIgY29tbWl0cyB0byBzZW5kaW5nIGJ1ZmZlcmluZworCSAqIFtlLmcuIHRhYiB0byBzcGFjZSBjb252ZXJzaW9ucyBpbiBuX3R0eS5jIG9wb3N0KCldLgorCSAqLworCWNoYXIgYnVmZmVyW0hWQ1NfQlVGRl9MRU5dOworCWludCBjaGFyc19pbl9idWZmZXI7CisKKwkvKgorCSAqIEFueSB2YXJpYWJsZSBiZWxvdyB0aGUga29iamVjdCBpcyB2YWxpZCBiZWZvcmUgYSB0dHkgaXMgY29ubmVjdGVkIGFuZAorCSAqIHN0YXlzIHZhbGlkIGFmdGVyIHRoZSB0dHkgaXMgZGlzY29ubmVjdGVkLiAgVGhlc2Ugc2hvdWxkbid0IGJlCisJICogd2hhY2tlZCB1bnRpbCB0aGUga29qZWN0IHJlZmNvdW50IHJlYWNoZXMgemVybyB0aG91Z2ggc29tZSBlbnRyaWVzCisJICogbWF5IGJlIGNoYW5nZWQgdmlhIHN5c2ZzIGluaXRpYXRpdmVzLgorCSAqLworCXN0cnVjdCBrb2JqZWN0IGtvYmo7IC8qIHJlZiBjb3VudCAmIGh2Y3Nfc3RydWN0IGxpZmV0aW1lICovCisJaW50IGNvbm5lY3RlZDsgLyogaXMgdGhlIHZ0eS1zZXJ2ZXIgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIHZ0eT8gKi8KKwl1aW50MzJfdCBwX3VuaXRfYWRkcmVzczsgLyogcGFydG5lciB1bml0IGFkZHJlc3MgKi8KKwl1aW50MzJfdCBwX3BhcnRpdGlvbl9JRDsgLyogcGFydG5lciBwYXJ0aXRpb24gSUQgKi8KKwljaGFyIHBfbG9jYXRpb25fY29kZVtIVkNTX0NMQ19MRU5HVEggKyAxXTsgLyogQ0xDICsgTnVsbCBUZXJtICovCisJc3RydWN0IGxpc3RfaGVhZCBuZXh0OyAvKiBsaXN0IG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKK307CisKKy8qIFJlcXVpcmVkIHRvIGJhY2sgbWFwIGEga29iamVjdCB0byBpdHMgY29udGFpbmluZyBvYmplY3QgKi8KKyNkZWZpbmUgZnJvbV9rb2JqKGtvYmopIGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaHZjc19zdHJ1Y3QsIGtvYmopCisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGh2Y3Nfc3RydWN0cyA9IExJU1RfSEVBRF9JTklUKGh2Y3Nfc3RydWN0cyk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGh2Y3Nfc3RydWN0c19sb2NrKTsKKworc3RhdGljIHZvaWQgaHZjc191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgaHZjc190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBodmNzX2hhbmRsZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLAorCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3N0YXRpYyBpbnQgaHZjc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CitzdGF0aWMgaW50IGh2Y3Nfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQgaHZjc19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKK3N0YXRpYyBpbnQgaHZjc19oYXNfcGkoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCk7CitzdGF0aWMgdm9pZCBodmNzX3NldF9waShzdHJ1Y3QgaHZjc19wYXJ0bmVyX2luZm8gKnBpLAorCQlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKTsKK3N0YXRpYyBpbnQgaHZjc19nZXRfcGkoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCk7CitzdGF0aWMgaW50IGh2Y3NfcmVzY2FuX2RldmljZXNfbGlzdCh2b2lkKTsKKworc3RhdGljIGludCBodmNzX3BhcnRuZXJfY29ubmVjdChzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKTsKK3N0YXRpYyB2b2lkIGh2Y3NfcGFydG5lcl9mcmVlKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpOworCitzdGF0aWMgaW50IGh2Y3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkLAorCQl1aW50MzJfdCB1bml0X2FkZHJlc3MsIHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCB2aW9fZGV2ICpkZXYpOworCitzdGF0aWMgdm9pZCBkZXN0cm95X2h2Y3Nfc3RydWN0KHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKK3N0YXRpYyBpbnQgaHZjc19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIGh2Y3NfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgaHZjc19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOworCitzdGF0aWMgdm9pZCBodmNzX2NyZWF0ZV9kZXZpY2VfYXR0cnMoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCk7CitzdGF0aWMgdm9pZCBodmNzX3JlbW92ZV9kZXZpY2VfYXR0cnMoc3RydWN0IHZpb19kZXYgKnZkZXYpOworc3RhdGljIHZvaWQgaHZjc19jcmVhdGVfZHJpdmVyX2F0dHJzKHZvaWQpOworc3RhdGljIHZvaWQgaHZjc19yZW1vdmVfZHJpdmVyX2F0dHJzKHZvaWQpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBodmNzX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsCisJCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCk7CitzdGF0aWMgaW50IF9fZGV2ZXhpdCBodmNzX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgX19pbml0IGh2Y3NfbW9kdWxlX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgaHZjc19tb2R1bGVfZXhpdCh2b2lkKTsKKworI2RlZmluZSBIVkNTX1NDSEVEX1JFQUQJMHgwMDAwMDAwMQorI2RlZmluZSBIVkNTX1FVSUNLX1JFQUQJMHgwMDAwMDAwMgorI2RlZmluZSBIVkNTX1RSWV9XUklURQkweDAwMDAwMDA0CisjZGVmaW5lIEhWQ1NfUkVBRF9NQVNLCShIVkNTX1NDSEVEX1JFQUQgfCBIVkNTX1FVSUNLX1JFQUQpCisKK3N0YXRpYyB2b2lkIGh2Y3Nfa2ljayh2b2lkKQoreworCWh2Y3Nfa2lja2VkID0gMTsKKwl3bWIoKTsKKwl3YWtlX3VwX3Byb2Nlc3MoaHZjc190YXNrKTsKK30KKworc3RhdGljIHZvaWQgaHZjc191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCWh2Y3NkLT50b2RvX21hc2sgfD0gSFZDU19TQ0hFRF9SRUFEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJaHZjc19raWNrKCk7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y3NfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJdmlvX2Rpc2FibGVfaW50ZXJydXB0cyhodmNzZC0+dmRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIElmIHRoZSBkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoaXMgaW50ZXJydXB0CisgKiBoYW5kbGVyIHRha2luZyBhbnkgZnVydGhlciBpbnRlcnJ1cHRzIGJlY2F1c2UgdGhleSBhcmUgZGlzYWJsZWQgd2hpY2ggbWVhbnMKKyAqIHRoZSBodmNzX3N0cnVjdCB3aWxsIGFsd2F5cyBiZSB2YWxpZCBpbiB0aGlzIGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBodmNzX2hhbmRsZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLAorCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZGV2X2luc3RhbmNlOworCisJc3Bpbl9sb2NrKCZodmNzZC0+bG9jayk7CisJdmlvX2Rpc2FibGVfaW50ZXJydXB0cyhodmNzZC0+dmRldik7CisJaHZjc2QtPnRvZG9fbWFzayB8PSBIVkNTX1NDSEVEX1JFQUQ7CisJc3Bpbl91bmxvY2soJmh2Y3NkLT5sb2NrKTsKKwlodmNzX2tpY2soKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBodmNzZC0+bG9jayBoZWxkICovCitzdGF0aWMgdm9pZCBodmNzX3RyeV93cml0ZShzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKQoreworCXVpbnQzMl90IHVuaXRfYWRkcmVzcyA9IGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGh2Y3NkLT50dHk7CisJaW50IHNlbnQ7CisKKwlpZiAoaHZjc2QtPnRvZG9fbWFzayAmIEhWQ1NfVFJZX1dSSVRFKSB7CisJCS8qIHdvbid0IHNlbmQgcGFydGlhbCB3cml0ZXMgKi8KKwkJc2VudCA9IGh2Y19wdXRfY2hhcnModW5pdF9hZGRyZXNzLAorCQkJCSZodmNzZC0+YnVmZmVyWzBdLAorCQkJCWh2Y3NkLT5jaGFyc19pbl9idWZmZXIgKTsKKwkJaWYgKHNlbnQgPiAwKSB7CisJCQlodmNzZC0+Y2hhcnNfaW5fYnVmZmVyID0gMDsKKwkJCS8qIHdtYigpOyAqLworCQkJaHZjc2QtPnRvZG9fbWFzayAmPSB+KEhWQ1NfVFJZX1dSSVRFKTsKKwkJCS8qIHdtYigpOyAqLworCisJCQkvKgorCQkJICogV2UgYXJlIHN0aWxsIG9ibGlnYXRlZCB0byBkZWxpdmVyIHRoZSBkYXRhIHRvIHRoZQorCQkJICogaHlwZXJ2aXNvciBldmVuIGlmIHRoZSB0dHkgaGFzIGJlZW4gY2xvc2VkIGJlY2F1c2UKKwkJCSAqIHdlIGNvbW1pdGVkIHRvIGRlbGl2ZXJpbmcgaXQuICBCdXQgZG9uJ3QgdHJ5IHRvIHdha2UKKwkJCSAqIGEgbm9uLWV4aXN0ZW50IHR0eS4KKwkJCSAqLworCQkJaWYgKHR0eSkgeworCQkJCXR0eV93YWtldXAodHR5KTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBodmNzX2lvKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpCit7CisJdWludDMyX3QgdW5pdF9hZGRyZXNzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJY2hhciBidWZbSFZDU19CVUZGX0xFTl0gX19BTElHTkVEX187CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZ290ID0gMDsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJdW5pdF9hZGRyZXNzID0gaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzczsKKwl0dHkgPSBodmNzZC0+dHR5OworCisJaHZjc190cnlfd3JpdGUoaHZjc2QpOworCisJaWYgKCF0dHkgfHwgdGVzdF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpKSB7CisJCWh2Y3NkLT50b2RvX21hc2sgJj0gfihIVkNTX1JFQURfTUFTSyk7CisJCWdvdG8gYmFpbDsKKwl9IGVsc2UgaWYgKCEoaHZjc2QtPnRvZG9fbWFzayAmIChIVkNTX1JFQURfTUFTSykpKQorCQlnb3RvIGJhaWw7CisKKwkvKiByZW1vdmUgdGhlIHJlYWQgbWFza3MgKi8KKwlodmNzZC0+dG9kb19tYXNrICY9IH4oSFZDU19SRUFEX01BU0spOworCisJaWYgKCh0dHktPmZsaXAuY291bnQgKyBIVkNTX0JVRkZfTEVOKSA8IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJZ290ID0gaHZjX2dldF9jaGFycyh1bml0X2FkZHJlc3MsCisJCQkJJmJ1ZlswXSwKKwkJCQlIVkNTX0JVRkZfTEVOKTsKKwkJZm9yIChpPTA7Z290ICYmIGk8Z290O2krKykKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYnVmW2ldLCBUVFlfTk9STUFMKTsKKwl9CisKKwkvKiBHaXZlIHRoZSBUVFkgdGltZSB0byBwcm9jZXNzIHRoZSBkYXRhIHdlIGp1c3Qgc2VudC4gKi8KKwlpZiAoZ290KQorCQlodmNzZC0+dG9kb19tYXNrIHw9IEhWQ1NfUVVJQ0tfUkVBRDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJaWYgKHR0eS0+ZmxpcC5jb3VudCkgeworCQkvKiBUaGlzIGlzIHN5bmNoIGJlY2F1c2UgdHR5LT5sb3dfbGF0ZW5jeSA9PSAxICovCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJfQorCisJaWYgKCFnb3QpIHsKKwkJLyogRG8gdGhpcyBfYWZ0ZXJfIHRoZSBmbGlwX2J1ZmZlcl9wdXNoICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQl2aW9fZW5hYmxlX2ludGVycnVwdHMoaHZjc2QtPnZkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBodmNzZC0+dG9kb19tYXNrOworCisgYmFpbDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBodmNzZC0+dG9kb19tYXNrOworfQorCitzdGF0aWMgaW50IGtodmNzZCh2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZDsKKwlpbnQgaHZjc190b2RvX21hc2s7CisKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlkbyB7CisJCWh2Y3NfdG9kb19tYXNrID0gMDsKKwkJaHZjc19raWNrZWQgPSAwOworCQl3bWIoKTsKKworCQlzcGluX2xvY2soJmh2Y3Nfc3RydWN0c19sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShodmNzZCwgJmh2Y3Nfc3RydWN0cywgbmV4dCkgeworCQkJaHZjc190b2RvX21hc2sgfD0gaHZjc19pbyhodmNzZCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmh2Y3Nfc3RydWN0c19sb2NrKTsKKworCQkvKgorCQkgKiBJZiBhbnkgb2YgdGhlIGh2Y3MgYWRhcHRlcnMgd2FudCB0byB0cnkgYSB3cml0ZSBvciBxdWljayByZWFkCisJCSAqIGRvbid0IHNjaGVkdWxlKCksIHlpZWxkIGEgc21pZGdlbiB0aGVuIGV4ZWN1dGUgdGhlIGh2Y3NfaW8KKwkJICogdGhyZWFkIGFnYWluIGZvciB0aG9zZSB0aGF0IHdhbnQgdGhlIHdyaXRlLgorCQkgKi8KKwkJIGlmIChodmNzX3RvZG9fbWFzayAmIChIVkNTX1RSWV9XUklURSB8IEhWQ1NfUVVJQ0tfUkVBRCkpIHsKKwkJCXlpZWxkKCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghaHZjc19raWNrZWQpCisJCQlzY2hlZHVsZSgpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIGh2Y3NfZHJpdmVyX3RhYmxlW10gX19kZXZpbml0ZGF0YT0geworCXsic2VyaWFsLXNlcnZlciIsICJodnRlcm0yIn0sCisJeyBOVUxMLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIGh2Y3NfZHJpdmVyX3RhYmxlKTsKKworc3RhdGljIHZvaWQgaHZjc19yZXR1cm5faW5kZXgoaW50IGluZGV4KQoreworCS8qIFBhcmFub2lhIGNoZWNrICovCisJaWYgKCFodmNzX2luZGV4X2xpc3QpCisJCXJldHVybjsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGh2Y3NfaW5kZXhfY291bnQpCisJCXJldHVybjsKKwlpZiAoaHZjc19pbmRleF9saXN0W2luZGV4XSA9PSAtMSkKKwkJcmV0dXJuOworCWVsc2UKKwkJaHZjc19pbmRleF9saXN0W2luZGV4XSA9IC0xOworfQorCisvKiBjYWxsYmFjayB3aGVuIHRoZSBrYm9qZWN0IHJlZiBjb3VudCByZWFjaGVzIHplcm8gKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaHZjc19zdHJ1Y3Qoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fa29iaihrb2JqKTsKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwkvKiB0aGUgbGlzdF9kZWwgcG9pc29ucyB0aGUgcG9pbnRlcnMgKi8KKwlsaXN0X2RlbCgmKGh2Y3NkLT5uZXh0KSk7CisKKwlpZiAoaHZjc2QtPmNvbm5lY3RlZCA9PSAxKSB7CisJCWh2Y3NfcGFydG5lcl9mcmVlKGh2Y3NkKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogQ2xvc2VkIHZ0eS1zZXJ2ZXJAJVggYW5kIgorCQkJCSIgcGFydG5lciB2dHlAJVg6JWQgY29ubmVjdGlvbi5cbiIsCisJCQkJaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCQlodmNzZC0+cF91bml0X2FkZHJlc3MsCisJCQkJKHVpbnQzMl90KWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCk7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IERlc3Ryb3llZCBodmNzX3N0cnVjdCBmb3IgdnR5LXNlcnZlckAlWC5cbiIsCisJCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzKTsKKworCXZkZXYgPSBodmNzZC0+dmRldjsKKwlodmNzZC0+dmRldiA9IE5VTEw7CisKKwlodmNzZC0+cF91bml0X2FkZHJlc3MgPSAwOworCWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCA9IDA7CisJaHZjc19yZXR1cm5faW5kZXgoaHZjc2QtPmluZGV4KTsKKwltZW1zZXQoJmh2Y3NkLT5wX2xvY2F0aW9uX2NvZGVbMF0sIDB4MDAsIEhWQ1NfQ0xDX0xFTkdUSCArIDEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCisJaHZjc19yZW1vdmVfZGV2aWNlX2F0dHJzKHZkZXYpOworCisJa2ZyZWUoaHZjc2QpOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBodmNzX2tvYmpfdHlwZSA9IHsKKwkucmVsZWFzZSA9IGRlc3Ryb3lfaHZjc19zdHJ1Y3QsCit9OworCitzdGF0aWMgaW50IGh2Y3NfZ2V0X2luZGV4KHZvaWQpCit7CisJaW50IGk7CisJLyogUGFyYW5vaWEgY2hlY2sgKi8KKwlpZiAoIWh2Y3NfaW5kZXhfbGlzdCkgeworCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IGh2Y3NfaW5kZXhfbGlzdCBOT1QgdmFsaWQhLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkvKiBGaW5kIHRoZSBudW1lcmljYWxseSBsb3dlc3QgZmlyc3QgZnJlZSBpbmRleC4gKi8KKwlmb3IoaSA9IDA7IGkgPCBodmNzX2luZGV4X2NvdW50OyBpKyspIHsKKwkJaWYgKGh2Y3NfaW5kZXhfbGlzdFtpXSA9PSAtMSkgeworCQkJaHZjc19pbmRleF9saXN0W2ldID0gMDsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaHZjc19wcm9iZSgKKwlzdHJ1Y3QgdmlvX2RldiAqZGV2LAorCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkOworCWludCBpbmRleDsKKworCWlmICghZGV2IHx8ICFpZCkgeworCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IHByb2JlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVyLlxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJLyogZWFybHkgdG8gYXZvaWQgY2xlYW51cCBvbiBmYWlsdXJlICovCisJaW5kZXggPSBodmNzX2dldF9pbmRleCgpOworCWlmIChpbmRleCA8IDApIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaHZjc2QgPSBrbWFsbG9jKHNpemVvZigqaHZjc2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWh2Y3NkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGh2Y3NkLT50dHkgaXMgemVyb2VkIG91dCB3aXRoIHRoZSBtZW1zZXQgKi8KKwltZW1zZXQoaHZjc2QsIDB4MDAsIHNpemVvZigqaHZjc2QpKTsKKworCXNwaW5fbG9ja19pbml0KCZodmNzZC0+bG9jayk7CisJLyogQXV0b21hdGljYWxseSBpbmNzIHRoZSByZWZjb3VudCB0aGUgZmlyc3QgdGltZSAqLworCWtvYmplY3RfaW5pdCgmaHZjc2QtPmtvYmopOworCS8qIFNldCB1cCB0aGUgY2FsbGJhY2sgZm9yIHRlcm1pbmF0aW5nIHRoZSBodmNzX3N0cnVjdCdzIGxpZmUgKi8KKwlodmNzZC0+a29iai5rdHlwZSA9ICZodmNzX2tvYmpfdHlwZTsKKworCWh2Y3NkLT52ZGV2ID0gZGV2OworCWRldi0+ZGV2LmRyaXZlcl9kYXRhID0gaHZjc2Q7CisKKwlodmNzZC0+aW5kZXggPSBpbmRleDsKKworCS8qIGh2Y3NkLT5pbmRleCA9ICsraHZjc19zdHJ1Y3RfY291bnQ7ICovCisJaHZjc2QtPmNoYXJzX2luX2J1ZmZlciA9IDA7CisJaHZjc2QtPnRvZG9fbWFzayA9IDA7CisJaHZjc2QtPmNvbm5lY3RlZCA9IDA7CisKKwkvKgorCSAqIFRoaXMgd2lsbCBwb3B1bGF0ZSB0aGUgaHZjc19zdHJ1Y3QncyBwYXJ0bmVyIGluZm8gZmllbGRzIGZvciB0aGUKKwkgKiBmaXJzdCB0aW1lLgorCSAqLworCWlmIChodmNzX2dldF9waShodmNzZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiBGYWlsZWQgdG8gZmV0Y2ggcGFydG5lciIKKwkJCSIgaW5mbyBmb3IgdnR5LXNlcnZlckAlWCBvbiBkZXZpY2UgcHJvYmUuXG4iLAorCQkJaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzcyk7CisJfQorCisJLyoKKwkgKiBJZiBhIHVzZXIgYXBwIG9wZW5zIGEgdHR5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyB2dHktc2VydmVyIGJlZm9yZQorCSAqIHRoZSBodmNzX3N0cnVjdCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZGV2aWNlcyBsaXN0IHRoZW4gdGhlIHVzZXIgYXBwCisJICogd2lsbCBnZXQgLUVOT0RFVi4KKwkgKi8KKworCXNwaW5fbG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCisJbGlzdF9hZGRfdGFpbCgmKGh2Y3NkLT5uZXh0KSwgJmh2Y3Nfc3RydWN0cyk7CisKKwlzcGluX3VubG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCisJaHZjc19jcmVhdGVfZGV2aWNlX2F0dHJzKGh2Y3NkKTsKKworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHZ0eS1zZXJ2ZXJAJVggYWRkZWQgdG8gdGhlIHZpbyBidXMuXG4iLCBkZXYtPnVuaXRfYWRkcmVzcyk7CisKKwkvKgorCSAqIERPTidUIGVuYWJsZSBpbnRlcnJ1cHRzIGhlcmUgYmVjYXVzZSB0aGVyZSBpcyBubyB1c2VyIHRvIHJlY2VpdmUgdGhlCisJICogZGF0YS4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgaHZjc19yZW1vdmUoc3RydWN0IHZpb19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZGV2LT5kZXYuZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qga29iamVjdCAqa29ianA7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCWlmICghaHZjc2QpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQnkgdGhpcyB0aW1lIHRoZSB2dHktc2VydmVyIHdvbid0IGJlIGdldHRpbmcgYW55IG1vcmUgaW50ZXJydXBzICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCXR0eSA9IGh2Y3NkLT50dHk7CisKKwlrb2JqcCA9ICZodmNzZC0+a29iajsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIExldCB0aGUgbGFzdCBob2xkZXIgb2YgdGhpcyBvYmplY3QgY2F1c2UgaXQgdG8gYmUgcmVtb3ZlZCwgd2hpY2gKKwkgKiB3b3VsZCBwcm9iYWJseSBiZSB0dHlfaGFuZ3VwIGJlbG93LgorCSAqLworCWtvYmplY3RfcHV0IChrb2JqcCk7CisKKwkvKgorCSAqIFRoZSBoYW5ndXAgaXMgYSBzY2hlZHVsZWQgZnVuY3Rpb24gd2hpY2ggd2lsbCBhdXRvIGNoYWluIGNhbGwKKwkgKiBodmNzX2hhbmd1cC4gIFRoZSB0dHkgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZCBhdCB0aGlzIHRpbWUgdW5sZXNzIGEKKwkgKiBzaW11bHRhbmVvdXMgdHR5IGNsb3NlIGFscmVhZHkgY2xlYW5lZCB1cCB0aGUgaHZjc19zdHJ1Y3QuCisJICovCisJaWYgKHR0eSkKKwkJdHR5X2hhbmd1cCh0dHkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogdnR5LXNlcnZlckAlWCByZW1vdmVkIGZyb20gdGhlIgorCQkJIiB2aW8gYnVzLlxuIiwgZGV2LT51bml0X2FkZHJlc3MpOworCXJldHVybiAwOworfTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIGh2Y3NfdmlvX2RyaXZlciA9IHsKKwkubmFtZQkJPSBodmNzX2RyaXZlcl9uYW1lLAorCS5pZF90YWJsZQk9IGh2Y3NfZHJpdmVyX3RhYmxlLAorCS5wcm9iZQkJPSBodmNzX3Byb2JlLAorCS5yZW1vdmUJCT0gaHZjc19yZW1vdmUsCit9OworCisvKiBPbmx5IGNhbGxlZCBmcm9tIGh2Y3NfZ2V0X3BpIHBsZWFzZSAqLworc3RhdGljIHZvaWQgaHZjc19zZXRfcGkoc3RydWN0IGh2Y3NfcGFydG5lcl9pbmZvICpwaSwgc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCkKK3sKKwlpbnQgY2xjbGVuZ3RoOworCisJaHZjc2QtPnBfdW5pdF9hZGRyZXNzID0gcGktPnVuaXRfYWRkcmVzczsKKwlodmNzZC0+cF9wYXJ0aXRpb25fSUQgID0gcGktPnBhcnRpdGlvbl9JRDsKKwljbGNsZW5ndGggPSBzdHJsZW4oJnBpLT5sb2NhdGlvbl9jb2RlWzBdKTsKKwlpZiAoY2xjbGVuZ3RoID4gSFZDU19DTENfTEVOR1RIKQorCQljbGNsZW5ndGggPSBIVkNTX0NMQ19MRU5HVEg7CisKKwkvKiBjb3B5IHRoZSBudWxsLXRlcm0gY2hhciB0b28gKi8KKwlzdHJuY3B5KCZodmNzZC0+cF9sb2NhdGlvbl9jb2RlWzBdLAorCQkJJnBpLT5sb2NhdGlvbl9jb2RlWzBdLCBjbGNsZW5ndGggKyAxKTsKK30KKworLyoKKyAqIFRyYXZlcnNlIHRoZSBsaXN0IGFuZCBhZGQgdGhlIHBhcnRuZXIgaW5mbyB0aGF0IGlzIGZvdW5kIHRvIHRoZSBodmNzX3N0cnVjdAorICogc3RydWN0IGVudHJ5LiBOT1RFOiBBdCB0aGlzIHRpbWUgSSBrbm93IHRoYXQgcGFydG5lciBpbmZvIHdpbGwgcmV0dXJuIGEKKyAqIHNpbmdsZSBlbnRyeSBidXQgaW4gdGhlIGZ1dHVyZSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgcGFydG5lciBpbmZvIGVudHJpZXMgcGVyCisgKiB2dHktc2VydmVyIGFuZCB5b3UnbGwgd2FudCB0byB6ZXJvIG91dCB0aGF0IGxpc3QgYW5kIHJlc2V0IGl0LiAgSWYgZm9yIHNvbWUKKyAqIHJlYXNvbiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBvZiB0aGlzIGRyaXZlciBidXQgdGhlcmUgSVMgbW9yZSB0aGFuIG9uZQorICogcGFydG5lciBpbmZvIHRoZW4gaHZjc2QtPnBfKiB3aWxsIGhvbGQgdGhlIGxhc3QgcGFydG5lciBpbmZvIGRhdGEgZnJvbSB0aGUKKyAqIGZpcm13YXJlIHF1ZXJ5LiAgQSBnb29kIHdheSB0byB1cGRhdGUgdGhpcyBjb2RlIHdvdWxkIGJlIHRvIHJlcGxhY2UgdGhlIHRocmVlCisgKiBwYXJ0bmVyIGluZm8gZmllbGRzIGluIGh2Y3Nfc3RydWN0IHdpdGggYSBsaXN0IG9mIGh2Y3NfcGFydG5lcl9pbmZvCisgKiBpbnN0YW5jZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBodmNzZC0+bG9jayBoZWxkLgorICovCitzdGF0aWMgaW50IGh2Y3NfZ2V0X3BpKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpCit7CisJc3RydWN0IGh2Y3NfcGFydG5lcl9pbmZvICpwaTsKKwl1aW50MzJfdCB1bml0X2FkZHJlc3MgPSBodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzOworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrKCZodmNzX3BpX2xvY2spOworCWlmICghaHZjc19waV9idWZmKSB7CisJCXNwaW5fdW5sb2NrKCZodmNzX3BpX2xvY2spOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dmFsID0gaHZjc19nZXRfcGFydG5lcl9pbmZvKHVuaXRfYWRkcmVzcywgJmhlYWQsIGh2Y3NfcGlfYnVmZik7CisJc3Bpbl91bmxvY2soJmh2Y3NfcGlfbG9jayk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IEZhaWxlZCB0byBmZXRjaCBwYXJ0bmVyIgorCQkJIiBpbmZvIGZvciB2dHktc2VydmVyQCV4LlxuIiwgdW5pdF9hZGRyZXNzKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiBuaXhlcyB0aGUgdmFsdWVzIGlmIHRoZSBwYXJ0bmVyIHZ0eSB3ZW50IGF3YXkgKi8KKwlodmNzZC0+cF91bml0X2FkZHJlc3MgPSAwOworCWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBpLCAmaGVhZCwgbm9kZSkKKwkJaHZjc19zZXRfcGkocGksIGh2Y3NkKTsKKworCWh2Y3NfZnJlZV9wYXJ0bmVyX2luZm8oJmhlYWQpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSB0aGUgZHJpdmVyICJyZXNjYW4iIHN5c2ZzIGVudHJ5LiAgSXQgc2hvdWxkbid0CisgKiBiZSBleGVjdXRlZCBlbHNld2hlcmUsIGluIG9yZGVyIHRvIHByZXZlbnQgZGVhZGxvY2sgaXNzdWVzLgorICovCitzdGF0aWMgaW50IGh2Y3NfcmVzY2FuX2RldmljZXNfbGlzdCh2b2lkKQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShodmNzZCwgJmh2Y3Nfc3RydWN0cywgbmV4dCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwkJaHZjc19nZXRfcGkoaHZjc2QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCX0KKworCXNwaW5fdW5sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZhcm0gdGhpcyBvZmYgaW50byBpdHMgb3duIGZ1bmN0aW9uIGJlY2F1c2UgaXQgY291bGQgYmUgbW9yZSBjb21wbGV4IG9uY2UKKyAqIG11bHRpcGxlIHBhcnRuZXJzIHN1cHBvcnQgaXMgYWRkZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoCisgKiB0aGUgaHZjc2QtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBodmNzX2hhc19waShzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKQoreworCWlmICgoIWh2Y3NkLT5wX3VuaXRfYWRkcmVzcykgfHwgKCFodmNzZC0+cF9wYXJ0aXRpb25fSUQpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE5PVEU6IEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHN1cGVyIGFkbWluIHJlbW92ZWQgYSBwYXJ0bmVyIHZ0eSBhbmQgdGhlbgorICogYWRkZWQgYSBkaWZmZXJlbnQgdnR5IGFzIHRoZSBuZXcgcGFydG5lci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGh2Y3NkLT5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgaHZjc19wYXJ0bmVyX2Nvbm5lY3Qoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCkKK3sKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGludCB1bml0X2FkZHJlc3MgPSBodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzOworCisJLyoKKwkgKiBJZiB0aGVyZSB3YXNuJ3QgYW55IHBpIHdoZW4gdGhlIGRldmljZSB3YXMgYWRkZWQgaXQgZG9lc24ndCBtZWFudAorCSAqIHRoZXJlIGlzbid0IGFueSBub3cuICBUaGlzIGRyaXZlciBpc24ndCBub3RpZmllZCB3aGVuIGEgbmV3IHBhcnRuZXIKKwkgKiB2dHkgaXMgYWRkZWQgdG8gYSB2dHktc2VydmVyIHNvIHdlIGRpc2NvdmVyIGNoYW5nZXMgb24gb3VyIG93bi4KKwkgKiBQbGVhc2Ugc2VlIGNvbW1lbnRzIGluIGh2Y3NfcmVnaXN0ZXJfY29ubmVjdGlvbigpIGZvciBqdXN0aWZpY2F0aW9uCisJICogb2YgdGhpcyBiaXphcnJlIGNvZGUuCisJICovCisJcmV0dmFsID0gaHZjc19yZWdpc3Rlcl9jb25uZWN0aW9uKHVuaXRfYWRkcmVzcywKKwkJCWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCwKKwkJCWh2Y3NkLT5wX3VuaXRfYWRkcmVzcyk7CisJaWYgKCFyZXR2YWwpIHsKKwkJaHZjc2QtPmNvbm5lY3RlZCA9IDE7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAocmV0dmFsICE9IC1FSU5WQUwpCisJCXJldHVybiByZXR2YWw7CisKKwkvKgorCSAqIEFzIHBlciB0aGUgc3BlYyByZS1nZXQgdGhlIHBpIGFuZCB0cnkgYWdhaW4gaWYgLUVJTlZBTCBhZnRlciB0aGUKKwkgKiBmaXJzdCBjb25uZWN0aW9uIGF0dGVtcHQuCisJICovCisJaWYgKGh2Y3NfZ2V0X3BpKGh2Y3NkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWh2Y3NfaGFzX3BpKGh2Y3NkKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR2YWwgPSBodmNzX3JlZ2lzdGVyX2Nvbm5lY3Rpb24odW5pdF9hZGRyZXNzLAorCQkJaHZjc2QtPnBfcGFydGl0aW9uX0lELAorCQkJaHZjc2QtPnBfdW5pdF9hZGRyZXNzKTsKKwlpZiAocmV0dmFsICE9IC1FSU5WQUwpIHsKKwkJaHZjc2QtPmNvbm5lY3RlZCA9IDE7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyoKKwkgKiBFQlVTWSBpcyB0aGUgbW9zdCBsaWtlbHkgc2NlbmFyaW8gdGhvdWdoIHRoZSB2dHkgY291bGQgaGF2ZSBiZWVuCisJICogcmVtb3ZlZCBvciB0aGVyZSByZWFsbHkgY291bGQgYmUgYW4gaGNhbGwgZXJyb3IgZHVlIHRvIHRoZSBwYXJhbWV0ZXIKKwkgKiBkYXRhIGJ1dCB0aGFua3MgdG8gYW1iaWd1b3VzIGZpcm13YXJlIHJldHVybiBjb2RlcyB3ZSBjYW4ndCByZWFsbHkKKwkgKiB0ZWxsLgorCSAqLworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHZ0eS1zZXJ2ZXIgb3IgcGFydG5lciIKKwkJCSIgdnR5IGlzIGJ1c3kuICBUcnkgYWdhaW4gbGF0ZXIuXG4iKTsKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGh2Y3NkLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGh2Y3NfcGFydG5lcl9mcmVlKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpCit7CisJaW50IHJldHZhbDsKKwlkbyB7CisJCXJldHZhbCA9IGh2Y3NfZnJlZV9jb25uZWN0aW9uKGh2Y3NkLT52ZGV2LT51bml0X2FkZHJlc3MpOworCX0gd2hpbGUgKHJldHZhbCA9PSAtRUJVU1kpOworCWh2Y3NkLT5jb25uZWN0ZWQgPSAwOworfQorCisvKiBUaGlzIGhlbHBlciBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBXSVRIT1VUIHRoZSBodmNzZC0+bG9jayBoZWxkICovCitzdGF0aWMgaW50IGh2Y3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkLCB1aW50MzJfdCB1bml0X2FkZHJlc3MsCisJCXVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB2dHktc2VydmVyIHdhcyByZW1vdmVkIGJldHdlZW4gdGhlIHRpbWUgdGhhdAorCSAqIHRoZSBjb25uIHdhcyByZWdpc3RlcmVkIGFuZCBub3cuCisJICovCisJaWYgKCEocmMgPSByZXF1ZXN0X2lycShpcnEsICZodmNzX2hhbmRsZV9pbnRlcnJ1cHQsCisJCQkJU0FfSU5URVJSVVBULCAiaWJtaHZjcyIsIGh2Y3NkKSkpIHsKKwkJLyoKKwkJICogSXQgaXMgcG9zc2libGUgdGhlIHZ0eS1zZXJ2ZXIgd2FzIHJlbW92ZWQgYWZ0ZXIgdGhlIGlycSB3YXMKKwkJICogcmVxdWVzdGVkIGJ1dCBiZWZvcmUgd2UgaGF2ZSB0aW1lIHRvIGVuYWJsZSBpbnRlcnJ1cHRzLgorCQkgKi8KKwkJaWYgKHZpb19lbmFibGVfaW50ZXJydXB0cyh2ZGV2KSA9PSBIX1N1Y2Nlc3MpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IGludCBlbmFibGUgZmFpbGVkIGZvciIKKwkJCQkJIiB2dHktc2VydmVyQCVYLlxuIiwgdW5pdF9hZGRyZXNzKTsKKwkJCWZyZWVfaXJxKGlycSwgaHZjc2QpOworCQl9CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogaXJxIHJlcSBmYWlsZWQgZm9yIgorCQkJCSIgdnR5LXNlcnZlckAlWC5cbiIsIHVuaXRfYWRkcmVzcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlodmNzX3BhcnRuZXJfZnJlZShodmNzZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKKworfQorCisvKgorICogVGhpcyBhbHdheXMgaW5jcmVtZW50cyB0aGUga29iamVjdCByZWYgY291bnQgaWYgdGhlIGNhbGwgaXMgc3VjY2Vzc2Z1bC4KKyAqIFBsZWFzZSByZW1lbWJlciB0byBkZWMgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGUgaW5zdGFuY2UuCisgKgorICogTk9USUNFOiBEbyBOT1QgaG9sZCBlaXRoZXIgdGhlIGh2Y3Nfc3RydWN0LmxvY2sgb3IgaHZjc19zdHJ1Y3RzX2xvY2sgd2hlbgorICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG9yIHlvdSB3aWxsIGdldCBkZWFkbG9jay4KKyAqLworc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzX2dldF9ieV9pbmRleChpbnQgaW5kZXgpCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCS8qIFdlIGNhbiBpbW1lZGlhdGVseSBkaXNjYXJkIE9PQiByZXF1ZXN0cyAqLworCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgSFZDU19NQVhfU0VSVkVSX0FEQVBURVJTKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoaHZjc2QsICZodmNzX3N0cnVjdHMsIG5leHQpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGh2Y3NkLT5pbmRleCA9PSBpbmRleCkgeworCQkJCWtvYmplY3RfZ2V0KCZodmNzZC0+a29iaik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwkJCQlzcGluX3VubG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOworCQkJCXJldHVybiBodmNzZDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJaHZjc2QgPSBOVUxMOworCX0KKworCXNwaW5fdW5sb2NrKCZodmNzX3N0cnVjdHNfbG9jayk7CisJcmV0dXJuIGh2Y3NkOworfQorCisvKgorICogVGhpcyBpcyBpbnZva2VkIHZpYSB0aGUgdHR5X29wZW4gaW50ZXJmYWNlIHdoZW4gYSB1c2VyIGFwcCBjb25uZWN0cyB0byB0aGUKKyAqIC9kZXYgbm9kZS4KKyAqLworc3RhdGljIGludCBodmNzX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZDsKKwlpbnQgcmMsIHJldHZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2OworCXVuc2lnbmVkIGxvbmcgdW5pdF9hZGRyZXNzOworCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKKworCWlmICh0dHktPmRyaXZlcl9kYXRhKQorCQlnb3RvIGZhc3Rfb3BlbjsKKworCS8qCisJICogSXMgdGhlcmUgYSB2dHktc2VydmVyIHRoYXQgc2hhcmVzIHRoZSBzYW1lIGluZGV4PworCSAqIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUga29iamVjdCBpbmRleC4KKwkgKi8KKwlpZiAoIShodmNzZCA9IGh2Y3NfZ2V0X2J5X2luZGV4KHR0eS0+aW5kZXgpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJIVkNTOiBvcGVuIGZhaWxlZCwgbm8gZGV2aWNlIGFzc29jaWF0ZWQiCisJCQkJIiB3aXRoIHR0eS0+aW5kZXggJWQuXG4iLCB0dHktPmluZGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaHZjc2QtPmNvbm5lY3RlZCA9PSAwKQorCQlpZiAoKHJldHZhbCA9IGh2Y3NfcGFydG5lcl9jb25uZWN0KGh2Y3NkKSkpCisJCQlnb3RvIGVycm9yX3JlbGVhc2U7CisKKwlodmNzZC0+b3Blbl9jb3VudCA9IDE7CisJaHZjc2QtPnR0eSA9IHR0eTsKKwl0dHktPmRyaXZlcl9kYXRhID0gaHZjc2Q7CisKKwkvKgorCSAqIFNldCB0aGlzIGRyaXZlciB0byBsb3cgbGF0ZW5jeSBzbyB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSBjaGFuY2UgYXQKKwkgKiBjYXRjaGluZyBhIHRocm90dGxlZCBUVFkgYWZ0ZXIgd2UgZmxpcF9idWZmZXJfcHVzaC4gIE90aGVyd2lzZSB0aGUKKwkgKiBmbHVzaF90b19hc3luYyBtYXkgbm90IGV4ZWN1dGUgdW50aWwgYWZ0ZXIgdGhlIGtlcm5lbF90aHJlYWQgaGFzCisJICogeWllbGRlZCBhbmQgcmVzdW1lZCB0aGUgbmV4dCBmbGlwX2J1ZmZlcl9wdXNoIHJlc3VsdGluZyBpbiBkYXRhCisJICogbG9zcy4KKwkgKi8KKwl0dHktPmxvd19sYXRlbmN5ID0gMTsKKworCW1lbXNldCgmaHZjc2QtPmJ1ZmZlclswXSwgMHgwMCwgSFZDU19CVUZGX0xFTik7CisKKwkvKgorCSAqIFNhdmUgdGhlc2UgaW4gdGhlIHNwaW5sb2NrIGZvciB0aGUgZW5hYmxlIG9wZXJhdGlvbnMgdGhhdCBuZWVkIHRoZW0KKwkgKiBvdXRzaWRlIG9mIHRoZSBzcGlubG9jay4KKwkgKi8KKwlpcnEgPSBodmNzZC0+dmRldi0+aXJxOworCXZkZXYgPSBodmNzZC0+dmRldjsKKwl1bml0X2FkZHJlc3MgPSBodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzOworCisJaHZjc2QtPnRvZG9fbWFzayB8PSBIVkNTX1NDSEVEX1JFQUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogVGhpcyBtdXN0IGJlIGRvbmUgb3V0c2lkZSBvZiB0aGUgc3BpbmxvY2sgYmVjYXVzZSBpdCByZXF1ZXN0cyBpcnFzCisJICogYW5kIHdpbGwgZ3JhYiB0aGUgc3BpbmxvY2sgYW5kIGZyZWUgdGhlIGNvbm5lY3Rpb24gaWYgaXQgZmFpbHMuCisJICovCisJaWYgKCgocmMgPSBodmNzX2VuYWJsZV9kZXZpY2UoaHZjc2QsIHVuaXRfYWRkcmVzcywgaXJxLCB2ZGV2KSkpKSB7CisJCWtvYmplY3RfcHV0KCZodmNzZC0+a29iaik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhWQ1M6IGVuYWJsZSBkZXZpY2UgZmFpbGVkLlxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlnb3RvIG9wZW5fc3VjY2VzczsKKworZmFzdF9vcGVuOgorCWh2Y3NkID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCWlmICgha29iamVjdF9nZXQoJmh2Y3NkLT5rb2JqKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IEtvYmplY3Qgb2Ygb3BlbiIKKwkJCSIgaHZjcyBkb2Vzbid0IGV4aXN0LlxuIik7CisJCXJldHVybiAtRUZBVUxUOyAvKiBJcyB0aGlzIHRoZSByaWdodCByZXR1cm4gdmFsdWU/ICovCisJfQorCisJaHZjc2QtPm9wZW5fY291bnQrKzsKKworCWh2Y3NkLT50b2RvX21hc2sgfD0gSFZDU19TQ0hFRF9SRUFEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CitvcGVuX3N1Y2Nlc3M6CisJaHZjc19raWNrKCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiB2dHktc2VydmVyQCVYIGNvbm5lY3Rpb24gb3BlbmVkLlxuIiwKKwkJaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzcyApOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbGVhc2U6CisJa29ianAgPSAmaHZjc2QtPmtvYmo7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlrb2JqZWN0X3B1dCgmaHZjc2QtPmtvYmopOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiSFZDUzogcGFydG5lciBjb25uZWN0IGZhaWxlZC5cbiIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y3NfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrb2JqZWN0ICprb2JqcDsKKwlpbnQgaXJxID0gTk9fSVJROworCisJLyoKKwkgKiBJcyBzb21lb25lIHRyeWluZyB0byBjbG9zZSB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXZpY2UgYWZ0ZXIKKwkgKiB3ZSBoYXZlIGh1bmcgdXA/ICBJZiBzbyB0dHktPmRyaXZlcl9kYXRhIHdvdWxkbid0IGJlIHZhbGlkLgorCSAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE5vIGRyaXZlcl9kYXRhIG1lYW5zIHRoYXQgdGhpcyBjbG9zZSB3YXMgcHJvYmFibHkgaXNzdWVkIGFmdGVyIGEKKwkgKiBmYWlsZWQgaHZjc19vcGVuIGJ5IHRoZSB0dHkgbGF5ZXIncyByZWxlYXNlX2RldigpIGFwaSBhbmQgd2UgY2FuIGp1c3QKKwkgKiBleGl0IGNsZWFubHkuCisJICovCisJaWYgKCF0dHktPmRyaXZlcl9kYXRhKQorCQlyZXR1cm47CisKKwlodmNzZCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlrb2JqcCA9ICZodmNzZC0+a29iajsKKwlpZiAoLS1odmNzZC0+b3Blbl9jb3VudCA9PSAwKSB7CisKKwkJdmlvX2Rpc2FibGVfaW50ZXJydXB0cyhodmNzZC0+dmRldik7CisKKwkJLyoKKwkJICogTlVMTCB0aGlzIGVhcmx5IHNvIHRoYXQgdGhlIGtlcm5lbF90aHJlYWQgZG9lc24ndCB0cnkgdG8KKwkJICogZXhlY3V0ZSBhbnkgb3BlcmF0aW9ucyBvbiB0aGUgVFRZIGV2ZW4gdGhvdWdoIGl0IGlzIG9ibGlnYXRlZAorCQkgKiB0byBkZWxpdmVyIGFueSBwZW5kaW5nIEkvTyB0byB0aGUgaHlwZXJ2aXNvci4KKwkJICovCisJCWh2Y3NkLT50dHkgPSBOVUxMOworCisJCWlycSA9IGh2Y3NkLT52ZGV2LT5pcnE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIEhWQ1NfQ0xPU0VfV0FJVCk7CisKKwkJLyoKKwkJICogVGhpcyBsaW5lIGlzIGltcG9ydGFudCBiZWNhdXNlIGl0IHRlbGxzIGh2Y3Nfb3BlbiB0aGF0IHRoaXMKKwkJICogZGV2aWNlIG5lZWRzIHRvIGJlIHJlLWNvbmZpZ3VyZWQgdGhlIG5leHQgdGltZSBodmNzX29wZW4gaXMKKwkJICogY2FsbGVkLgorCQkgKi8KKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisKKwkJZnJlZV9pcnEoaXJxLCBodmNzZCk7CisJCWtvYmplY3RfcHV0KGtvYmpwKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaHZjc2QtPm9wZW5fY291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogdnR5LXNlcnZlckAlWCBvcGVuX2NvdW50OiAlZCIKKwkJCQkiIGlzIG1pc3NtYW5hZ2VkLlxuIiwKKwkJaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzcywgaHZjc2QtPm9wZW5fY291bnQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJa29iamVjdF9wdXQoa29ianApOworfQorCitzdGF0aWMgdm9pZCBodmNzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0ZW1wX29wZW5fY291bnQ7CisJc3RydWN0IGtvYmplY3QgKmtvYmpwOworCWludCBpcnEgPSBOT19JUlE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwkvKiBQcmVzZXJ2ZSB0aGlzIHNvIHRoYXQgd2Uga25vdyBob3cgbWFueSBrb2JqZWN0IHJlZnMgdG8gcHV0ICovCisJdGVtcF9vcGVuX2NvdW50ID0gaHZjc2QtPm9wZW5fY291bnQ7CisKKwkvKgorCSAqIERvbid0IGtvYmplY3QgcHV0IGluc2lkZSB0aGUgc3BpbmxvY2sgYmVjYXVzZSB0aGUgZGVzdHJ1Y3Rpb24KKwkgKiBjYWxsYmFjayBtYXkgdXNlIHRoZSBzcGlubG9jayBhbmQgaXQgbWF5IGdldCBjYWxsZWQgYmVmb3JlIHRoZQorCSAqIHNwaW5sb2NrIGhhcyBiZWVuIHJlbGVhc2VkLiAgR2V0IGEgcG9pbnRlciB0byB0aGUga29iamVjdCBhbmQKKwkgKiBrb2JqZWN0X3B1dCBvbiB0aGF0IGFmdGVyIHJlbGVhc2luZyB0aGUgc3BpbmxvY2suCisJICovCisJa29ianAgPSAmaHZjc2QtPmtvYmo7CisKKwl2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKGh2Y3NkLT52ZGV2KTsKKworCWh2Y3NkLT50b2RvX21hc2sgPSAwOworCisJLyogSSBkb24ndCB0aGluayB0aGUgdHR5IG5lZWRzIHRoZSBodmNzX3N0cnVjdCBwb2ludGVyIGFmdGVyIGEgaGFuZ3VwICovCisJaHZjc2QtPnR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCWh2Y3NkLT50dHkgPSBOVUxMOworCisJaHZjc2QtPm9wZW5fY291bnQgPSAwOworCisJLyogVGhpcyB3aWxsIGRyb3AgYW55IGJ1ZmZlcmVkIGRhdGEgb24gdGhlIGZsb29yIHdoaWNoIGlzIE9LIGluIGEgaGFuZ3VwCisJICogc2NlbmFyaW8uICovCisJbWVtc2V0KCZodmNzZC0+YnVmZmVyWzBdLCAweDAwLCBIVkNTX0JVRkZfTEVOKTsKKwlodmNzZC0+Y2hhcnNfaW5fYnVmZmVyID0gMDsKKworCWlycSA9IGh2Y3NkLT52ZGV2LT5pcnE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJZnJlZV9pcnEoaXJxLCBodmNzZCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8ga29iamVjdF9wdXQoKSBmb3IgZXZlcnkgb3Blbl9jb3VudCB3ZSBoYXZlIHNpbmNlIHRoZQorCSAqIHR0eV9oYW5ndXAoKSBmdW5jdGlvbiBkb2Vzbid0IGludm9rZSBhIGNsb3NlIHBlciBvcGVuIGNvbm5lY3Rpb24gb24gYQorCSAqIG5vbi1jb25zb2xlIGRldmljZS4KKwkgKi8KKwl3aGlsZSh0ZW1wX29wZW5fY291bnQpIHsKKwkJLS10ZW1wX29wZW5fY291bnQ7CisJCS8qCisJCSAqIFRoZSBmaW5hbCBwdXQgd2lsbCB0cmlnZ2VyIGRlc3RydWN0aW9uIG9mIHRoZSBodmNzX3N0cnVjdC4KKwkJICogTk9URTogIElmIHRoaXMgaGFuZ3VwIHdhcyBzaWduYWxlZCBmcm9tIHVzZXIgc3BhY2UgdGhlbiB0aGUKKwkJICogZmluYWwgcHV0IHdpbGwgbmV2ZXIgaGFwcGVuLgorCQkgKi8KKwkJa29iamVjdF9wdXQoa29ianApOworCX0KK30KKworLyoKKyAqIE5PVEU6IFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBmcm9tX3VzZXIgc2luY2UgdXNlciBsZXZlbCBhcHBzIGludGVyYWN0IHdpdGggdGhlCisgKiAvZGV2IG5vZGVzLiBJJ20gdHJ1c3RpbmcgdGhhdCBpZiBodmNzX3dyaXRlIGdldHMgY2FsbGVkIGFuZCBpbnRlcnJ1cHRlZCBieQorICogaHZjc19yZW1vdmUgKHdoaWNoIHJlbW92ZXMgdGhlIHRhcmdldCBkZXZpY2UgYW5kIGV4ZWN1dGVzIHR0eV9oYW5ndXAoKSkgdGhhdAorICogdHR5X2hhbmd1cCB3aWxsIGFsbG93IGh2Y3Nfd3JpdGUgdGltZSB0byBjb21wbGV0ZSBleGVjdXRpb24gYmVmb3JlIGl0CisgKiB0ZXJtaW5hdGVzIG91ciBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgaHZjc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdW5pdF9hZGRyZXNzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNoYXJidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdG90YWxfc2VudCA9IDA7CisJaW50IHRvc2VuZCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisKKwkvKgorCSAqIElmIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIHJldHVybiBjb2RlIG9mZiBvZiB0aGVpciBvcGVuIHRoZXkgbWF5CisJICogYXR0ZW1wdCB0aGlzIGV2ZW4gaWYgdGhlcmUgaXMgbm8gY29ubmVjdGVkIGRldmljZS4KKwkgKi8KKwlpZiAoIWh2Y3NkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFJlYXNvbmFibGUgc2l6ZSB0byBwcmV2ZW50IHVzZXIgbGV2ZWwgZmxvb2RpbmcgKi8KKwlpZiAoY291bnQgPiBIVkNTX01BWF9GUk9NX1VTRVIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSFZDUyB3cml0ZTogY291bnQgYmVpbmcgdHJ1bmNhdGVkIHRvIgorCQkJCSIgSFZDU19NQVhfRlJPTV9VU0VSLlxuIik7CisJCWNvdW50ID0gSFZDU19NQVhfRlJPTV9VU0VSOworCX0KKworCWNoYXJidWYgPSBidWY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogU29tZWhvdyBhbiBvcGVuIHN1Y2NlZGRlZCBidXQgdGhlIGRldmljZSB3YXMgcmVtb3ZlZCBvciB0aGUKKwkgKiBjb25uZWN0aW9uIHRlcm1pbmF0ZWQgYmV0d2VlbiB0aGUgdnR5LXNlcnZlciBhbmQgcGFydG5lciB2dHkgZHVyaW5nCisJICogdGhlIG1pZGRsZSBvZiBhIHdyaXRlIG9wZXJhdGlvbj8gIFRoaXMgaXMgYSBjcnVtbXkgcGxhY2UgdG8gZG8gdGhpcworCSAqIGJ1dCB3ZSB3YW50IHRvIGtlZXAgaXQgYWxsIGluIHRoZSBzcGlubG9jay4KKwkgKi8KKwlpZiAoaHZjc2QtPm9wZW5fY291bnQgPD0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl1bml0X2FkZHJlc3MgPSBodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQl0b3NlbmQgPSBtaW4oY291bnQsIChIVkNTX0JVRkZfTEVOIC0gaHZjc2QtPmNoYXJzX2luX2J1ZmZlcikpOworCQkvKgorCQkgKiBObyBtb3JlIHNwYWNlLCB0aGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIGxhc3QgY2FsbCB0bworCQkgKiBodmNzX3dyaXRlKCkgZGlkbid0IHN1Y2NlZWQgYW5kIHRoZSBidWZmZXIgd2FzIGZpbGxlZCB1cC4KKwkJICovCisJCWlmICghdG9zZW5kKQorCQkJYnJlYWs7CisKKwkJbWVtY3B5KCZodmNzZC0+YnVmZmVyW2h2Y3NkLT5jaGFyc19pbl9idWZmZXJdLAorCQkJCSZjaGFyYnVmW3RvdGFsX3NlbnRdLAorCQkJCXRvc2VuZCk7CisKKwkJaHZjc2QtPmNoYXJzX2luX2J1ZmZlciArPSB0b3NlbmQ7CisKKwkJcmVzdWx0ID0gMDsKKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHRydWUgdGhlbiB3ZSBkb24ndCB3YW50IHRvIHRyeSB3cml0aW5nIHRvIHRoZQorCQkgKiBoeXBlcnZpc29yIGJlY2F1c2UgdGhhdCBpcyB0aGUga2VybmVsX3RocmVhZHMgam9iIG5vdy4gIFdlJ2xsCisJCSAqIGp1c3QgYWRkIHRvIHRoZSBidWZmZXIuCisJCSAqLworCQlpZiAoIShodmNzZC0+dG9kb19tYXNrICYgSFZDU19UUllfV1JJVEUpKQorCQkJLyogd29uJ3Qgc2VuZCBwYXJ0aWFsIHdyaXRlcyAqLworCQkJcmVzdWx0ID0gaHZjX3B1dF9jaGFycyh1bml0X2FkZHJlc3MsCisJCQkJCSZodmNzZC0+YnVmZmVyWzBdLAorCQkJCQlodmNzZC0+Y2hhcnNfaW5fYnVmZmVyKTsKKworCQkvKgorCQkgKiBTaW5jZSB3ZSBrbm93IHdlIGhhdmUgZW5vdWdoIHJvb20gaW4gaHZjc2QtPmJ1ZmZlciBmb3IKKwkJICogdG9zZW5kIHdlIHJlY29yZCB0aGF0IGl0IHdhcyBzZW50IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKKwkJICogaHlwZXJ2aXNvciBhY3R1YWxseSB0b29rIGl0IGJlY2F1c2Ugd2UgaGF2ZSBpdCBidWZmZXJlZC4KKwkJICovCisJCXRvdGFsX3NlbnQrPXRvc2VuZDsKKwkJY291bnQtPXRvc2VuZDsKKwkJaWYgKHJlc3VsdCA9PSAwKSB7CisJCQlodmNzZC0+dG9kb19tYXNrIHw9IEhWQ1NfVFJZX1dSSVRFOworCQkJaHZjc19raWNrKCk7CisJCQlicmVhazsKKwkJfQorCisJCWh2Y3NkLT5jaGFyc19pbl9idWZmZXIgPSAwOworCQkvKgorCQkgKiBUZXN0IGFmdGVyIHRoZSBjaGFyc19pbl9idWZmZXIgcmVzZXQgb3RoZXJ3aXNlIHRoaXMgY291bGQKKwkJICogZGVhZGxvY2sgb3VyIHdyaXRlcyBpZiBodmNfcHV0X2NoYXJzIGZhaWxzLgorCQkgKi8KKwkJaWYgKHJlc3VsdCA8IDApCisJCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHJlc3VsdCA9PSAtMSkKKwkJcmV0dXJuIC1FSU87CisJZWxzZQorCQlyZXR1cm4gdG90YWxfc2VudDsKK30KKworLyoKKyAqIFRoaXMgaXMgcmVhbGx5IGFza2luZyBob3cgbXVjaCBjYW4gd2UgZ3VhcmVudGVlIHRoYXQgd2UgY2FuIHNlbmQgb3IgdGhhdCB3ZQorICogYWJzb2x1dGVseSBXSUxMIEJVRkZFUiBpZiB3ZSBjYW4ndCBzZW5kIGl0LiAgVGhpcyBkcml2ZXIgTVVTVCBob25vciB0aGUKKyAqIHJldHVybiB2YWx1ZSwgaGVuY2UgdGhlIHJlYXNvbiBmb3IgaHZjc19zdHJ1Y3QgYnVmZmVyaW5nLgorICovCitzdGF0aWMgaW50IGh2Y3Nfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFodmNzZCB8fCBodmNzZC0+b3Blbl9jb3VudCA8PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBIVkNTX0JVRkZfTEVOIC0gaHZjc2QtPmNoYXJzX2luX2J1ZmZlcjsKK30KKworc3RhdGljIGludCBodmNzX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSB0dHktPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIGh2Y3NkLT5jaGFyc19pbl9idWZmZXI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgaHZjc19vcHMgPSB7CisJLm9wZW4gPSBodmNzX29wZW4sCisJLmNsb3NlID0gaHZjc19jbG9zZSwKKwkuaGFuZ3VwID0gaHZjc19oYW5ndXAsCisJLndyaXRlID0gaHZjc193cml0ZSwKKwkud3JpdGVfcm9vbSA9IGh2Y3Nfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gaHZjc19jaGFyc19pbl9idWZmZXIsCisJLnVudGhyb3R0bGUgPSBodmNzX3VudGhyb3R0bGUsCisJLnRocm90dGxlID0gaHZjc190aHJvdHRsZSwKK307CisKK3N0YXRpYyBpbnQgaHZjc19hbGxvY19pbmRleF9saXN0KGludCBuKQoreworCWludCBpOworCWh2Y3NfaW5kZXhfbGlzdCA9IGttYWxsb2MobiAqIHNpemVvZihodmNzX2luZGV4X2NvdW50KSxHRlBfS0VSTkVMKTsKKwlpZiAoIWh2Y3NfaW5kZXhfbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaHZjc19pbmRleF9jb3VudCA9IG47CisJZm9yKGkgPSAwOyBpIDwgaHZjc19pbmRleF9jb3VudDsgaSsrKQorCQlodmNzX2luZGV4X2xpc3RbaV0gPSAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaHZjc19mcmVlX2luZGV4X2xpc3Qodm9pZCkKK3sKKwkvKiBQYXJhbm9pYSBjaGVjayB0byBiZSB0aG9yb3VnaC4gKi8KKwlpZiAoaHZjc19pbmRleF9saXN0KSB7CisJCWtmcmVlKGh2Y3NfaW5kZXhfbGlzdCk7CisJCWh2Y3NfaW5kZXhfbGlzdCA9IE5VTEw7CisJCWh2Y3NfaW5kZXhfY291bnQgPSAwOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgaHZjc19tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByYzsKKwlpbnQgbnVtX3R0eXNfdG9fYWxsb2M7CisKKwlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXppbmcgJXNcbiIsIGh2Y3NfZHJpdmVyX3N0cmluZyk7CisKKwkvKiBIYXMgdGhlIHVzZXIgc3BlY2lmaWVkIGFuIG92ZXJsb2FkIHdpdGggYW4gaW5zbW9kIHBhcmFtPyAqLworCWlmIChodmNzX3Bhcm1fbnVtX2RldnMgPD0gMCB8fAorCQkoaHZjc19wYXJtX251bV9kZXZzID4gSFZDU19NQVhfU0VSVkVSX0FEQVBURVJTKSkgeworCQludW1fdHR5c190b19hbGxvYyA9IEhWQ1NfREVGQVVMVF9TRVJWRVJfQURBUFRFUlM7CisJfSBlbHNlCisJCW51bV90dHlzX3RvX2FsbG9jID0gaHZjc19wYXJtX251bV9kZXZzOworCisJaHZjc190dHlfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihudW1fdHR5c190b19hbGxvYyk7CisJaWYgKCFodmNzX3R0eV9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGh2Y3NfYWxsb2NfaW5kZXhfbGlzdChudW1fdHR5c190b19hbGxvYykpCisJCXJldHVybiAtRU5PTUVNOworCisJaHZjc190dHlfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJaHZjc190dHlfZHJpdmVyLT5kcml2ZXJfbmFtZSA9IGh2Y3NfZHJpdmVyX25hbWU7CisJaHZjc190dHlfZHJpdmVyLT5uYW1lID0gaHZjc19kZXZpY2Vfbm9kZTsKKwlodmNzX3R0eV9kcml2ZXItPmRldmZzX25hbWUgPSBodmNzX2RldmljZV9ub2RlOworCisJLyoKKwkgKiBXZSdsbCBsZXQgdGhlIHN5c3RlbSBhc3NpZ24gdXMgYSBtYWpvciBudW1iZXIsIGluZGljYXRlZCBieSBsZWF2aW5nCisJICogaXQgYmxhbmsuCisJICovCisKKwlodmNzX3R0eV9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gSFZDU19NSU5PUl9TVEFSVDsKKwlodmNzX3R0eV9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU1lTVEVNOworCisJLyoKKwkgKiBXZSByb2xlIG91ciBvd24gc28gdGhhdCB3ZSBET05UIEVDSE8uICBXZSBjYW4ndCBlY2hvIGJlY2F1c2UgdGhlCisJICogZGV2aWNlIHdlIGFyZSBjb25uZWN0aW5nIHRvIGFscmVhZHkgZWNob2VzIGJ5IGRlZmF1bHQgYW5kIHRoaXMgd291bGQKKwkgKiB0aHJvdyB1cyBpbnRvIGEgaG9ycmlibGUgcmVjdXJzaXZlIGVjaG8tZWNoby1lY2hvIGxvb3AuCisJICovCisJaHZjc190dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSBodmNzX3R0eV90ZXJtaW9zOworCWh2Y3NfdHR5X2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCisJdHR5X3NldF9vcGVyYXRpb25zKGh2Y3NfdHR5X2RyaXZlciwgJmh2Y3Nfb3BzKTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBjYWxsIHdpbGwgcmVzdWx0IGluIHN5c2ZzIGVudHJpZXMgdGhhdCBkZW5vdGUgdGhlCisJICogZHluYW1pY2FsbHkgYXNzaWduZWQgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgZm9yIG91ciBkZXZpY2VzLgorCSAqLworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiByZWdpc3RyYXRpb24gIgorCQkJIiBhcyBhIHR0eSBkcml2ZXIgZmFpbGVkLlxuIik7CisJCWh2Y3NfZnJlZV9pbmRleF9saXN0KCk7CisJCXB1dF90dHlfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7CisJCXJldHVybiAtRUlPOworCX0KKworCWh2Y3NfcGlfYnVmZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWh2Y3NfcGlfYnVmZikgeworCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoaHZjc190dHlfZHJpdmVyKTsKKwkJaHZjc19mcmVlX2luZGV4X2xpc3QoKTsKKwkJcHV0X3R0eV9kcml2ZXIoaHZjc190dHlfZHJpdmVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaHZjc190YXNrID0ga3RocmVhZF9ydW4oa2h2Y3NkLCBOVUxMLCAia2h2Y3NkIik7CisJaWYgKElTX0VSUihodmNzX3Rhc2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzoga2h2Y3NkIGNyZWF0aW9uIGZhaWxlZC4gIERyaXZlciBub3QgbG9hZGVkLlxuIik7CisJCWtmcmVlKGh2Y3NfcGlfYnVmZik7CisJCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCQlodmNzX2ZyZWVfaW5kZXhfbGlzdCgpOworCQlwdXRfdHR5X2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyYyA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJmh2Y3NfdmlvX2RyaXZlcik7CisKKwkvKgorCSAqIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBBRlRFUiB0aGUgdmlvX3JlZ2lzdGVyX2RyaXZlcigpIGNhbGwgb3IgZWxzZQorCSAqIHRoZSBrb2JqZWN0cyB3b24ndCBiZSBpbml0aWFsaXplZCBwcm9wZXJseS4KKwkgKi8KKwlodmNzX2NyZWF0ZV9kcml2ZXJfYXR0cnMoKTsKKworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IGRyaXZlciBtb2R1bGUgaW5zZXJ0ZWQuXG4iKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGh2Y3NfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwkvKgorCSAqIFRoaXMgZHJpdmVyIHJlY2VpdmVzIGh2Y3NfcmVtb3ZlIGNhbGxiYWNrcyBmb3IgZWFjaCBkZXZpY2UgdXBvbgorCSAqIG1vZHVsZSByZW1vdmFsLgorCSAqLworCisJLyoKKwkgKiBUaGlzIHN5bmNocm9ub3VzIG9wZXJhdGlvbiAgd2lsbCB3YWtlIHRoZSBraHZjc2Qga3RocmVhZCBpZiBpdCBpcworCSAqIGFzbGVlcCBhbmQgd2lsbCByZXR1cm4gd2hlbiBraHZjc2QgaGFzIHRlcm1pbmF0ZWQuCisJICovCisJa3RocmVhZF9zdG9wKGh2Y3NfdGFzayk7CisKKwlzcGluX2xvY2soJmh2Y3NfcGlfbG9jayk7CisJa2ZyZWUoaHZjc19waV9idWZmKTsKKwlodmNzX3BpX2J1ZmYgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZodmNzX3BpX2xvY2spOworCisJaHZjc19yZW1vdmVfZHJpdmVyX2F0dHJzKCk7CisKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmh2Y3NfdmlvX2RyaXZlcik7CisKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoaHZjc190dHlfZHJpdmVyKTsKKworCWh2Y3NfZnJlZV9pbmRleF9saXN0KCk7CisKKwlwdXRfdHR5X2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogZHJpdmVyIG1vZHVsZSByZW1vdmVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KGh2Y3NfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoaHZjc19tb2R1bGVfZXhpdCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGh2Y3Nfc3RydWN0ICpmcm9tX3Zpb19kZXYoc3RydWN0IHZpb19kZXYgKnZpb2QpCit7CisJcmV0dXJuIHZpb2QtPmRldi5kcml2ZXJfZGF0YTsKK30KKy8qIFRoZSBzeXNmcyBpbnRlcmZhY2UgZm9yIHRoZSBkcml2ZXIgYW5kIGRldmljZXMgKi8KKworc3RhdGljIHNzaXplX3QgaHZjc19wYXJ0bmVyX3Z0eXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmlvZCA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV92aW9fZGV2KHZpb2QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJVhcbiIsIGh2Y3NkLT5wX3VuaXRfYWRkcmVzcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorc3RhdGljIERFVklDRV9BVFRSKHBhcnRuZXJfdnR5cywgU19JUlVHTywgaHZjc19wYXJ0bmVyX3Z0eXNfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfcGFydG5lcl9jbGNzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpb19kZXYgKnZpb2QgPSB0b192aW9fZGV2KGRldik7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fdmlvX2Rldih2aW9kKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR2YWwgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAmaHZjc2QtPnBfbG9jYXRpb25fY29kZVswXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorc3RhdGljIERFVklDRV9BVFRSKHBhcnRuZXJfY2xjcywgU19JUlVHTywgaHZjc19wYXJ0bmVyX2NsY3Nfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfY3VycmVudF92dHlfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICogYnVmLAorCQlzaXplX3QgY291bnQpCit7CisJLyoKKwkgKiBEb24ndCBuZWVkIHRoaXMgZmVhdHVyZSBhdCB0aGUgcHJlc2VudCB0aW1lIGJlY2F1c2UgZmlybXdhcmUgZG9lc24ndAorCSAqIHlldCBzdXBwb3J0IG11bHRpcGxlIHBhcnRuZXJzLgorCSAqLworCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IERlbmllZCBjdXJyZW50X3Z0eSBjaGFuZ2U6IC1FUEVSTS5cbiIpOworCXJldHVybiAtRVBFUk07Cit9CisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfY3VycmVudF92dHlfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmlvZCA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV92aW9fZGV2KHZpb2QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJXNcbiIsICZodmNzZC0+cF9sb2NhdGlvbl9jb2RlWzBdKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjdXJyZW50X3Z0eSwKKwlTX0lSVUdPIHwgU19JV1VTUiwgaHZjc19jdXJyZW50X3Z0eV9zaG93LCBodmNzX2N1cnJlbnRfdnR5X3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgaHZjc192dGVybV9zdGF0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHdyaXRpbmcgYSAnMCcgdG8gdGhpcyBzeXNmcyBlbnRyeSB3aWxsIHJlc3VsdCBpbiB0aGUgZGlzY29ubmVjdC4gKi8KKwlpZiAoc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDApICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaHZjc2QtPm9wZW5fY291bnQgPiAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHZ0ZXJtIHN0YXRlIHVuY2hhbmdlZC4gICIKKwkJCQkiVGhlIGh2Y3MgZGV2aWNlIG5vZGUgaXMgc3RpbGwgaW4gdXNlLlxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKGh2Y3NkLT5jb25uZWN0ZWQgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9JTkZPICJIVkNTOiB2dGVybSBzdGF0ZSB1bmNoYW5nZWQuIFRoZSIKKwkJCQkiIHZ0eS1zZXJ2ZXIgaXMgbm90IGNvbm5lY3RlZCB0byBhIHZ0eS5cbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWh2Y3NfcGFydG5lcl9mcmVlKGh2Y3NkKTsKKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiBDbG9zZWQgdnR5LXNlcnZlckAlWCBhbmQiCisJCQkiIHBhcnRuZXIgdnR5QCVYOiVkIGNvbm5lY3Rpb24uXG4iLAorCQkJaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCWh2Y3NkLT5wX3VuaXRfYWRkcmVzcywKKwkJCSh1aW50MzJfdClodmNzZC0+cF9wYXJ0aXRpb25fSUQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfdnRlcm1fc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmlvZCA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV92aW9fZGV2KHZpb2QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGh2Y3NkLT5jb25uZWN0ZWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih2dGVybV9zdGF0ZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWh2Y3NfdnRlcm1fc3RhdGVfc2hvdywgaHZjc192dGVybV9zdGF0ZV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfaW5kZXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmlvZCA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV92aW9fZGV2KHZpb2QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGh2Y3NkLT5pbmRleCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoaW5kZXgsIFNfSVJVR08sIGh2Y3NfaW5kZXhfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpodmNzX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3BhcnRuZXJfdnR5cy5hdHRyLAorCSZkZXZfYXR0cl9wYXJ0bmVyX2NsY3MuYXR0ciwKKwkmZGV2X2F0dHJfY3VycmVudF92dHkuYXR0ciwKKwkmZGV2X2F0dHJfdnRlcm1fc3RhdGUuYXR0ciwKKwkmZGV2X2F0dHJfaW5kZXguYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaHZjc19hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGh2Y3NfYXR0cnMsCit9OworCitzdGF0aWMgdm9pZCBodmNzX2NyZWF0ZV9kZXZpY2VfYXR0cnMoc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCkKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IGh2Y3NkLT52ZGV2OworCXN5c2ZzX2NyZWF0ZV9ncm91cCgmdmRldi0+ZGV2LmtvYmosICZodmNzX2F0dHJfZ3JvdXApOworfQorCitzdGF0aWMgdm9pZCBodmNzX3JlbW92ZV9kZXZpY2VfYXR0cnMoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZ2ZGV2LT5kZXYua29iaiwgJmh2Y3NfYXR0cl9ncm91cCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfcmVzY2FuX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCS8qIEEgMSBtZWFucyBpdCBpcyB1cGRhdGluZywgYSAwIG1lYW5zIGl0IGlzIGRvbmUgdXBkYXRpbmcgKi8KKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaHZjc19yZXNjYW5fc3RhdHVzKTsKK30KKworc3RhdGljIHNzaXplX3QgaHZjc19yZXNjYW5fc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY29uc3QgY2hhciAqIGJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCWlmICgoc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDApICE9IDEpCisJCSYmIChodmNzX3Jlc2Nhbl9zdGF0dXMgIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaHZjc19yZXNjYW5fc3RhdHVzID0gMTsKKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiByZXNjYW5uaW5nIHBhcnRuZXIgaW5mbyBmb3IgYWxsIgorCQkiIHZ0eS1zZXJ2ZXJzLlxuIik7CisJaHZjc19yZXNjYW5fZGV2aWNlc19saXN0KCk7CisJaHZjc19yZXNjYW5fc3RhdHVzID0gMDsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIocmVzY2FuLAorCVNfSVJVR08gfCBTX0lXVVNSLCBodmNzX3Jlc2Nhbl9zaG93LCBodmNzX3Jlc2Nhbl9zdG9yZSk7CisKK3N0YXRpYyB2b2lkIGh2Y3NfY3JlYXRlX2RyaXZlcl9hdHRycyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICYoaHZjc192aW9fZHJpdmVyLmRyaXZlcik7CisJZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcmVzY2FuKTsKK30KKworc3RhdGljIHZvaWQgaHZjc19yZW1vdmVfZHJpdmVyX2F0dHJzKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcmZzID0gJihodmNzX3Zpb19kcml2ZXIuZHJpdmVyKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9yZXNjYW4pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2c2kuYyBiL2RyaXZlcnMvY2hhci9odnNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmMTE5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9odnNpLmMKQEAgLTAsMCArMSwxMzIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEhvbGxpcyBCbGFuY2hhcmQgPGhvbGxpc2JAdXMuaWJtLmNvbT4sIElCTQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIEhvc3QgVmlydHVhbCBTZXJpYWwgSW50ZXJmYWNlIChIVlNJKSBpcyBhIHByb3RvY29sIGJldHdlZW4gdGhlIGhvc3RlZCBPUworICogYW5kIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciBvbiBJQk0gcFNlcmllcyBzZXJ2ZXJzLiBPbiB0aGVzZSBzZXJ2ZXJzLCB0aGVyZQorICogYXJlIG5vIHNlcmlhbCBwb3J0cyB1bmRlciB0aGUgT1MncyBjb250cm9sLCBhbmQgc29tZXRpbWVzIHRoZXJlIGlzIG5vIG90aGVyCisgKiBjb25zb2xlIGF2YWlsYWJsZSBlaXRoZXIuIEhvd2V2ZXIsIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciBoYXMgdHdvIHN0YW5kYXJkCisgKiBzZXJpYWwgcG9ydHMsIHNvIHRoaXMgb3Zlci1jb21wbGljYXRlZCBwcm90b2NvbCBhbGxvd3MgdGhlIE9TIHRvIGNvbnRyb2wKKyAqIHRob3NlIHBvcnRzIGJ5IHByb3h5LgorICoKKyAqIEJlc2lkZXMgZGF0YSwgdGhlIHByb2NvdG9sIHN1cHBvcnRzIHRoZSByZWFkaW5nL3dyaXRpbmcgb2YgdGhlIHNlcmlhbAorICogcG9ydCdzIERUUiBsaW5lLCBhbmQgdGhlIHJlYWRpbmcgb2YgdGhlIENEIGxpbmUuIFRoaXMgaXMgdG8gYWxsb3cgdGhlIE9TIHRvCisgKiBjb250cm9sIGEgbW9kZW0gYXR0YWNoZWQgdG8gdGhlIHNlcnZpY2UgcHJvY2Vzc29yJ3Mgc2VyaWFsIHBvcnQuIE5vdGUgdGhhdAorICogdGhlIE9TIGNhbm5vdCBjaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBwb3J0IHRocm91Z2ggdGhpcyBwcm90b2NvbC4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CisjaW5jbHVkZSA8YXNtL2h2Y29uc29sZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CisKKyNkZWZpbmUgSFZTSV9NQUpPUgkyMjkKKyNkZWZpbmUgSFZTSV9NSU5PUgkxMjgKKyNkZWZpbmUgTUFYX05SX0hWU0lfQ09OU09MRVMgNAorCisjZGVmaW5lIEhWU0lfVElNRU9VVCAoNSpIWikKKyNkZWZpbmUgSFZTSV9WRVJTSU9OIDEKKyNkZWZpbmUgSFZTSV9NQVhfUEFDS0VUIDI1NgorI2RlZmluZSBIVlNJX01BWF9SRUFEIDE2CisjZGVmaW5lIEhWU0lfTUFYX09VVEdPSU5HX0RBVEEgMTIKKyNkZWZpbmUgTl9PVVRCVUYgMTIKKworLyoKKyAqIHdlIHBhc3MgZGF0YSB2aWEgdHdvIDgtYnl0ZSByZWdpc3RlcnMsIHNvIHdlIHdvdWxkIGxpa2Ugb3VyIGNoYXIgYXJyYXlzCisgKiBwcm9wZXJseSBhbGlnbmVkIGZvciB0aG9zZSBsb2Fkcy4KKyAqLworI2RlZmluZSBfX0FMSUdORURfXwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhzaXplb2YobG9uZykpKSkKKworc3RydWN0IGh2c2lfc3RydWN0IHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3JpdGVyOworCXN0cnVjdCB3b3JrX3N0cnVjdCBoYW5kc2hha2VyOworCXdhaXRfcXVldWVfaGVhZF90IGVtcHR5cTsgLyogd29rZW4gd2hlbiBvdXRidWYgaXMgZW1wdGllZCAqLworCXdhaXRfcXVldWVfaGVhZF90IHN0YXRlcTsgLyogd29rZW4gd2hlbiBIVlNJIHN0YXRlIGNoYW5nZXMgKi8KKwlzcGlubG9ja190IGxvY2s7CisJaW50IGluZGV4OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgaW50IGNvdW50OworCXVpbnQ4X3QgdGhyb3R0bGVfYnVmWzEyOF07CisJdWludDhfdCBvdXRidWZbTl9PVVRCVUZdOyAvKiB0byBpbXBsZW1lbnQgd3JpdGVfcm9vbSBhbmQgY2hhcnNfaW5fYnVmZmVyICovCisJLyogaW5idWYgaXMgZm9yIHBhY2tldCByZWFzc2VtYmx5LiBsZWF2ZSBhIGxpdHRsZSByb29tIGZvciBsZWZ0b3ZlcnMuICovCisJdWludDhfdCBpbmJ1ZltIVlNJX01BWF9QQUNLRVQgKyBIVlNJX01BWF9SRUFEXTsKKwl1aW50OF90ICppbmJ1Zl9lbmQ7CisJaW50IG5fdGhyb3R0bGU7CisJaW50IG5fb3V0YnVmOworCXVpbnQzMl90IHZ0ZXJtbm87CisJdWludDMyX3QgdmlycTsKKwlhdG9taWNfdCBzZXFubzsgLyogSFZTSSBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDE2X3QgbWN0cmw7CisJdWludDhfdCBzdGF0ZTsgIC8qIEhWU0kgcHJvdG9jb2wgc3RhdGUgKi8KKwl1aW50OF90IGZsYWdzOworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorCXVpbnQ4X3Qgc3lzcnE7CisjZW5kaWYgLyogQ09ORklHX01BR0lDX1NZU1JRICovCit9Oworc3RhdGljIHN0cnVjdCBodnNpX3N0cnVjdCBodnNpX3BvcnRzW01BWF9OUl9IVlNJX0NPTlNPTEVTXTsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpodnNpX2RyaXZlcjsKK3N0YXRpYyBpbnQgaHZzaV9jb3VudDsKK3N0YXRpYyBpbnQgKCpodnNpX3dhaXQpKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGludCBzdGF0ZSk7CisKK2VudW0gSFZTSV9QUk9UT0NPTF9TVEFURSB7CisJSFZTSV9DTE9TRUQsCisJSFZTSV9XQUlUX0ZPUl9WRVJfUkVTUE9OU0UsCisJSFZTSV9XQUlUX0ZPUl9WRVJfUVVFUlksCisJSFZTSV9PUEVOLAorCUhWU0lfV0FJVF9GT1JfTUNUUkxfUkVTUE9OU0UsCisJSFZTSV9GU1BfRElFRCwKK307CisjZGVmaW5lIEhWU0lfQ09OU09MRSAweDEKKworI2RlZmluZSBWU19EQVRBX1BBQ0tFVF9IRUFERVIgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgVlNfQ09OVFJPTF9QQUNLRVRfSEVBREVSICAgICAgICAweGZlCisjZGVmaW5lIFZTX1FVRVJZX1BBQ0tFVF9IRUFERVIgICAgICAgICAgMHhmZAorI2RlZmluZSBWU19RVUVSWV9SRVNQT05TRV9QQUNLRVRfSEVBREVSIDB4ZmMKKworLyogY29udHJvbCB2ZXJicyAqLworI2RlZmluZSBWU1ZfU0VUX01PREVNX0NUTCAgICAxIC8qIHRvIHNlcnZpY2UgcHJvY2Vzc29yIG9ubHkgKi8KKyNkZWZpbmUgVlNWX01PREVNX0NUTF9VUERBVEUgMiAvKiBmcm9tIHNlcnZpY2UgcHJvY2Vzc29yIG9ubHkgKi8KKyNkZWZpbmUgVlNWX0NMT1NFX1BST1RPQ09MICAgMworCisvKiBxdWVyeSB2ZXJicyAqLworI2RlZmluZSBWU1ZfU0VORF9WRVJTSU9OX05VTUJFUiAxCisjZGVmaW5lIFZTVl9TRU5EX01PREVNX0NUTF9TVEFUVVMgMgorCisvKiB5ZXMsIHRoZXNlIG1hc2tzIGFyZSBub3QgY29uc2VjdXRpdmUuICovCisjZGVmaW5lIEhWU0lfVFNEVFIgMHgwMQorI2RlZmluZSBIVlNJX1RTQ0QgIDB4MjAKKworc3RydWN0IGh2c2lfaGVhZGVyIHsKKwl1aW50OF90ICB0eXBlOworCXVpbnQ4X3QgIGxlbjsKKwl1aW50MTZfdCBzZXFubzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBodnNpX2RhdGEgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgbGVuOworCXVpbnQxNl90IHNlcW5vOworCXVpbnQ4X3QgIGRhdGFbSFZTSV9NQVhfT1VUR09JTkdfREFUQV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZzaV9jb250cm9sIHsKKwl1aW50OF90ICB0eXBlOworCXVpbnQ4X3QgIGxlbjsKKwl1aW50MTZfdCBzZXFubzsKKwl1aW50MTZfdCB2ZXJiOworCS8qIG9wdGlvbmFsIGRlcGVuZGluZyBvbiB2ZXJiOiAqLworCXVpbnQzMl90IHdvcmQ7CisJdWludDMyX3QgbWFzazsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBodnNpX3F1ZXJ5IHsKKwl1aW50OF90ICB0eXBlOworCXVpbnQ4X3QgIGxlbjsKKwl1aW50MTZfdCBzZXFubzsKKwl1aW50MTZfdCB2ZXJiOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2c2lfcXVlcnlfcmVzcG9uc2UgeworCXVpbnQ4X3QgIHR5cGU7CisJdWludDhfdCAgbGVuOworCXVpbnQxNl90IHNlcW5vOworCXVpbnQxNl90IHZlcmI7CisJdWludDE2X3QgcXVlcnlfc2Vxbm87CisJdW5pb24geworCQl1aW50OF90ICB2ZXJzaW9uOworCQl1aW50MzJfdCBtY3RybF93b3JkOworCX0gdTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworCitzdGF0aWMgaW5saW5lIGludCBpc19jb25zb2xlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisJcmV0dXJuIGhwLT5mbGFncyAmIEhWU0lfQ09OU09MRTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfb3BlbihzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwKQoreworCS8qIGlmIHdlJ3JlIHdhaXRpbmcgZm9yIGFuIG1jdHJsIHRoZW4gd2UncmUgYWxyZWFkeSBvcGVuICovCisJcmV0dXJuIChocC0+c3RhdGUgPT0gSFZTSV9PUEVOKQorCQkJfHwgKGhwLT5zdGF0ZSA9PSBIVlNJX1dBSVRfRk9SX01DVFJMX1JFU1BPTlNFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByaW50X3N0YXRlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisjaWZkZWYgREVCVUcKKwlzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVfbmFtZXNbXSA9IHsKKwkJIkhWU0lfQ0xPU0VEIiwKKwkJIkhWU0lfV0FJVF9GT1JfVkVSX1JFU1BPTlNFIiwKKwkJIkhWU0lfV0FJVF9GT1JfVkVSX1FVRVJZIiwKKwkJIkhWU0lfT1BFTiIsCisJCSJIVlNJX1dBSVRfRk9SX01DVFJMX1JFU1BPTlNFIiwKKwkJIkhWU0lfRlNQX0RJRUQiLAorCX07CisJY29uc3QgY2hhciAqbmFtZSA9IHN0YXRlX25hbWVzW2hwLT5zdGF0ZV07CisKKwlpZiAoaHAtPnN0YXRlID4gKHNpemVvZihzdGF0ZV9uYW1lcykvc2l6ZW9mKGNoYXIqKSkpCisJCW5hbWUgPSAiVU5LTk9XTiI7CisKKwlwcl9kZWJ1ZygiaHZzaSVpOiBzdGF0ZSA9ICVzXG4iLCBocC0+aW5kZXgsIG5hbWUpOworI2VuZGlmIC8qIERFQlVHICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF9zdGF0ZShzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCBpbnQgc3RhdGUpCit7CisJaHAtPnN0YXRlID0gc3RhdGU7CisJcHJpbnRfc3RhdGUoaHApOworCXdha2VfdXBfYWxsKCZocC0+c3RhdGVxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9zdGF0ZShzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCV9fc2V0X3N0YXRlKGhwLCBzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGVuX3BhY2tldChjb25zdCB1aW50OF90ICpwYWNrZXQpCit7CisJcmV0dXJuIChpbnQpKChzdHJ1Y3QgaHZzaV9oZWFkZXIgKilwYWNrZXQpLT5sZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2hlYWRlcihjb25zdCB1aW50OF90ICpwYWNrZXQpCit7CisJc3RydWN0IGh2c2lfaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IGh2c2lfaGVhZGVyICopcGFja2V0OworCXJldHVybiBoZWFkZXItPnR5cGUgPj0gVlNfUVVFUllfUkVTUE9OU0VfUEFDS0VUX0hFQURFUjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ290X3BhY2tldChjb25zdCBzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCB1aW50OF90ICpwYWNrZXQpCit7CisJaWYgKGhwLT5pbmJ1Zl9lbmQgPCBwYWNrZXQgKyBzaXplb2Yoc3RydWN0IGh2c2lfaGVhZGVyKSkKKwkJcmV0dXJuIDA7IC8qIGRvbid0IGV2ZW4gaGF2ZSB0aGUgcGFja2V0IGhlYWRlciAqLworCisJaWYgKGhwLT5pbmJ1Zl9lbmQgPCAocGFja2V0ICsgbGVuX3BhY2tldChwYWNrZXQpKSkKKwkJcmV0dXJuIDA7IC8qIGRvbid0IGhhdmUgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCAqLworCisJcmV0dXJuIDE7Cit9CisKKy8qIHNoaWZ0IHJlbWFpbmluZyBieXRlcyBpbiBwYWNrZXRidWYgZG93biAqLworc3RhdGljIHZvaWQgY29tcGFjdF9pbmJ1ZihzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCB1aW50OF90ICpyZWFkX3RvKQoreworCWludCByZW1haW5pbmcgPSAoaW50KShocC0+aW5idWZfZW5kIC0gcmVhZF90byk7CisKKwlwcl9kZWJ1ZygiJXM6ICVpIGNoYXJzIHJlbWFpblxuIiwgX19GVU5DVElPTl9fLCByZW1haW5pbmcpOworCisJaWYgKHJlYWRfdG8gIT0gaHAtPmluYnVmKQorCQltZW1tb3ZlKGhwLT5pbmJ1ZiwgcmVhZF90bywgcmVtYWluaW5nKTsKKworCWhwLT5pbmJ1Zl9lbmQgPSBocC0+aW5idWYgKyByZW1haW5pbmc7Cit9CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBkYmdfZHVtcF9wYWNrZXQocGFja2V0KSBkdW1wX3BhY2tldChwYWNrZXQpCisjZGVmaW5lIGRiZ19kdW1wX2hleChkYXRhLCBsZW4pIGR1bXBfaGV4KGRhdGEsIGxlbikKKyNlbHNlCisjZGVmaW5lIGRiZ19kdW1wX3BhY2tldChwYWNrZXQpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZGJnX2R1bXBfaGV4KGRhdGEsIGxlbikgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGR1bXBfaGV4KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlwcmludGsoIiAgICAiKTsKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKQorCQlwcmludGsoIiUuMngiLCBkYXRhW2ldKTsKKworCXByaW50aygiXG4gICAgIik7CisJZm9yIChpPTA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoaXNwcmludChkYXRhW2ldKSkKKwkJCXByaW50aygiJWMiLCBkYXRhW2ldKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIuIik7CisJfQorCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9wYWNrZXQodWludDhfdCAqcGFja2V0KQoreworCXN0cnVjdCBodnNpX2hlYWRlciAqaGVhZGVyID0gKHN0cnVjdCBodnNpX2hlYWRlciAqKXBhY2tldDsKKworCXByaW50aygidHlwZSAweCV4LCBsZW4gJWksIHNlcW5vICVpOlxuIiwgaGVhZGVyLT50eXBlLCBoZWFkZXItPmxlbiwKKwkJCWhlYWRlci0+c2Vxbm8pOworCisJZHVtcF9oZXgocGFja2V0LCBoZWFkZXItPmxlbik7Cit9CisKKy8qIGNhbid0IHVzZSBodmNfZ2V0X2NoYXJzIGJlY2F1c2UgdGhhdCBzdHJpcHMgQ1JzICovCitzdGF0aWMgaW50IGh2c2lfcmVhZChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGdvdDsKKworCWlmIChwbHBhcl9oY2FsbChIX0dFVF9URVJNX0NIQVIsIGhwLT52dGVybW5vLCAwLCAwLCAwLCAmZ290LAorCQkJKHVuc2lnbmVkIGxvbmcgKilidWYsICh1bnNpZ25lZCBsb25nICopYnVmKzEpID09IEhfU3VjY2VzcykKKwkJcmV0dXJuIGdvdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaHZzaV9yZWN2X2NvbnRyb2woc3RydWN0IGh2c2lfc3RydWN0ICpocCwgdWludDhfdCAqcGFja2V0LAorCXN0cnVjdCB0dHlfc3RydWN0ICoqdG9faGFuZ3VwLCBzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKip0b19oYW5kc2hha2UpCit7CisJc3RydWN0IGh2c2lfY29udHJvbCAqaGVhZGVyID0gKHN0cnVjdCBodnNpX2NvbnRyb2wgKilwYWNrZXQ7CisKKwlzd2l0Y2ggKGhlYWRlci0+dmVyYikgeworCQljYXNlIFZTVl9NT0RFTV9DVExfVVBEQVRFOgorCQkJaWYgKChoZWFkZXItPndvcmQgJiBIVlNJX1RTQ0QpID09IDApIHsKKwkJCQkvKiBDRCB3ZW50IGF3YXk7IG5vIG1vcmUgY29ubmVjdGlvbiAqLworCQkJCXByX2RlYnVnKCJodnNpJWk6IENEIGRyb3BwZWRcbiIsIGhwLT5pbmRleCk7CisJCQkJaHAtPm1jdHJsICY9IFRJT0NNX0NEOworCQkJCWlmICghKGhwLT50dHktPmZsYWdzICYgQ0xPQ0FMKSkKKwkJCQkJKnRvX2hhbmd1cCA9IGhwLT50dHk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWU1ZfQ0xPU0VfUFJPVE9DT0w6CisJCQlwcl9kZWJ1ZygiaHZzaSVpOiBzZXJ2aWNlIHByb2Nlc3NvciBjYW1lIGJhY2tcbiIsIGhwLT5pbmRleCk7CisJCQlpZiAoaHAtPnN0YXRlICE9IEhWU0lfQ0xPU0VEKSB7CisJCQkJKnRvX2hhbmRzaGFrZSA9IGhwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJodnNpJWk6IHVua25vd24gSFZTSSBjb250cm9sIHBhY2tldDogIiwKKwkJCQlocC0+aW5kZXgpOworCQkJZHVtcF9wYWNrZXQocGFja2V0KTsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgaHZzaV9yZWN2X3Jlc3BvbnNlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgaHZzaV9xdWVyeV9yZXNwb25zZSAqcmVzcCA9IChzdHJ1Y3QgaHZzaV9xdWVyeV9yZXNwb25zZSAqKXBhY2tldDsKKworCXN3aXRjaCAoaHAtPnN0YXRlKSB7CisJCWNhc2UgSFZTSV9XQUlUX0ZPUl9WRVJfUkVTUE9OU0U6CisJCQlfX3NldF9zdGF0ZShocCwgSFZTSV9XQUlUX0ZPUl9WRVJfUVVFUlkpOworCQkJYnJlYWs7CisJCWNhc2UgSFZTSV9XQUlUX0ZPUl9NQ1RSTF9SRVNQT05TRToKKwkJCWhwLT5tY3RybCA9IDA7CisJCQlpZiAocmVzcC0+dS5tY3RybF93b3JkICYgSFZTSV9UU0RUUikKKwkJCQlocC0+bWN0cmwgfD0gVElPQ01fRFRSOworCQkJaWYgKHJlc3AtPnUubWN0cmxfd29yZCAmIEhWU0lfVFNDRCkKKwkJCQlocC0+bWN0cmwgfD0gVElPQ01fQ0Q7CisJCQlfX3NldF9zdGF0ZShocCwgSFZTSV9PUEVOKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IHVuZXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2U6ICIsIGhwLT5pbmRleCk7CisJCQlkdW1wX3BhY2tldChwYWNrZXQpOworCQkJYnJlYWs7CisJfQorfQorCisvKiByZXNwb25kIHRvIHNlcnZpY2UgcHJvY2Vzc29yJ3MgdmVyc2lvbiBxdWVyeSAqLworc3RhdGljIGludCBodnNpX3ZlcnNpb25fcmVzcG9uZChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCB1aW50MTZfdCBxdWVyeV9zZXFubykKK3sKKwlzdHJ1Y3QgaHZzaV9xdWVyeV9yZXNwb25zZSBwYWNrZXQgX19BTElHTkVEX187CisJaW50IHdyb3RlOworCisJcGFja2V0LnR5cGUgPSBWU19RVUVSWV9SRVNQT05TRV9QQUNLRVRfSEVBREVSOworCXBhY2tldC5sZW4gPSBzaXplb2Yoc3RydWN0IGh2c2lfcXVlcnlfcmVzcG9uc2UpOworCXBhY2tldC5zZXFubyA9IGF0b21pY19pbmNfcmV0dXJuKCZocC0+c2Vxbm8pOworCXBhY2tldC52ZXJiID0gVlNWX1NFTkRfVkVSU0lPTl9OVU1CRVI7CisJcGFja2V0LnUudmVyc2lvbiA9IEhWU0lfVkVSU0lPTjsKKwlwYWNrZXQucXVlcnlfc2Vxbm8gPSBxdWVyeV9zZXFubysxOworCisJcHJfZGVidWcoIiVzOiBzZW5kaW5nICVpIGJ5dGVzXG4iLCBfX0ZVTkNUSU9OX18sIHBhY2tldC5sZW4pOworCWRiZ19kdW1wX2hleCgodWludDhfdCopJnBhY2tldCwgcGFja2V0Lmxlbik7CisKKwl3cm90ZSA9IGh2Y19wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIChjaGFyICopJnBhY2tldCwgcGFja2V0Lmxlbik7CisJaWYgKHdyb3RlICE9IHBhY2tldC5sZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IGNvdWxkbid0IHNlbmQgcXVlcnkgcmVzcG9uc2UhXG4iLAorCQkJaHAtPmluZGV4KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh2c2lfcmVjdl9xdWVyeShzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCB1aW50OF90ICpwYWNrZXQpCit7CisJc3RydWN0IGh2c2lfcXVlcnkgKnF1ZXJ5ID0gKHN0cnVjdCBodnNpX3F1ZXJ5ICopcGFja2V0OworCisJc3dpdGNoIChocC0+c3RhdGUpIHsKKwkJY2FzZSBIVlNJX1dBSVRfRk9SX1ZFUl9RVUVSWToKKwkJCWh2c2lfdmVyc2lvbl9yZXNwb25kKGhwLCBxdWVyeS0+c2Vxbm8pOworCQkJX19zZXRfc3RhdGUoaHAsIEhWU0lfT1BFTik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiB1bmV4cGVjdGVkIHF1ZXJ5OiAiLCBocC0+aW5kZXgpOworCQkJZHVtcF9wYWNrZXQocGFja2V0KTsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgaHZzaV9pbnNlcnRfY2hhcnMoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpPTA7IGkgPCBsZW47IGkrKykgeworCQljaGFyIGMgPSBidWZbaV07CisjaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCisJCWlmIChjID09ICdcMCcpIHsKKwkJCWhwLT5zeXNycSA9IDE7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChocC0+c3lzcnEpIHsKKwkJCWhhbmRsZV9zeXNycShjLCBOVUxMLCBocC0+dHR5KTsKKwkJCWhwLT5zeXNycSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmIC8qIENPTkZJR19NQUdJQ19TWVNSUSAqLworCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcihocC0+dHR5LCBjLCAwKTsKKwl9Cit9CisKKy8qCisgKiBXZSBjb3VsZCBnZXQgMjUyIGJ5dGVzIG9mIGRhdGEgYXQgb25jZSBoZXJlLiBCdXQgdGhlIHR0eSBsYXllciBvbmx5CisgKiB0aHJvdHRsZXMgdXMgYXQgVFRZX1RIUkVTSE9MRF9USFJPVFRMRSAoMTI4KSBieXRlcywgc28gd2UgY291bGQgb3ZlcmZsb3cKKyAqIGl0LiBBY2NvcmRpbmdseSB3ZSB3b24ndCBzZW5kIG1vcmUgdGhhbiAxMjggYnl0ZXMgYXQgYSB0aW1lIHRvIHRoZSBmbGlwCisgKiBidWZmZXIsIHdoaWNoIHdpbGwgZ2l2ZSB0aGUgdHR5IGJ1ZmZlciBhIGNoYW5jZSB0byB0aHJvdHRsZSB1cy4gU2hvdWxkIHRoZQorICogdmFsdWUgb2YgVFRZX1RIUkVTSE9MRF9USFJPVFRMRSBjaGFuZ2UgaW4gbl90dHkuYywgdGhpcyBjb2RlIHNob3VsZCBiZQorICogcmV2aXNpdGVkLgorICovCisjZGVmaW5lIFRUWV9USFJFU0hPTERfVEhST1RUTEUgMTI4CitzdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKmh2c2lfcmVjdl9kYXRhKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsCisJCWNvbnN0IHVpbnQ4X3QgKnBhY2tldCkKK3sKKwljb25zdCBzdHJ1Y3QgaHZzaV9oZWFkZXIgKmhlYWRlciA9IChjb25zdCBzdHJ1Y3QgaHZzaV9oZWFkZXIgKilwYWNrZXQ7CisJY29uc3QgdWludDhfdCAqZGF0YSA9IHBhY2tldCArIHNpemVvZihzdHJ1Y3QgaHZzaV9oZWFkZXIpOworCWludCBkYXRhbGVuID0gaGVhZGVyLT5sZW4gLSBzaXplb2Yoc3RydWN0IGh2c2lfaGVhZGVyKTsKKwlpbnQgb3ZlcmZsb3cgPSBkYXRhbGVuIC0gVFRZX1RIUkVTSE9MRF9USFJPVFRMRTsKKworCXByX2RlYnVnKCJxdWV1ZWluZyAlaSBjaGFycyAnJS4qcydcbiIsIGRhdGFsZW4sIGRhdGFsZW4sIGRhdGEpOworCisJaWYgKGRhdGFsZW4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAob3ZlcmZsb3cgPiAwKSB7CisJCXByX2RlYnVnKCIlczogZ290ID5UVFlfVEhSRVNIT0xEX1RIUk9UVExFIGJ5dGVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkYXRhbGVuID0gVFRZX1RIUkVTSE9MRF9USFJPVFRMRTsKKwl9CisKKwlodnNpX2luc2VydF9jaGFycyhocCwgZGF0YSwgZGF0YWxlbik7CisKKwlpZiAob3ZlcmZsb3cgPiAwKSB7CisJCS8qCisJCSAqIHdlIHN0aWxsIGhhdmUgbW9yZSBkYXRhIHRvIGRlbGl2ZXIsIHNvIHdlIG5lZWQgdG8gc2F2ZSBvZmYgdGhlCisJCSAqIG92ZXJmbG93IGFuZCBzZW5kIGl0IGxhdGVyCisJCSAqLworCQlwcl9kZWJ1ZygiJXM6IGRlZmVycmluZyBvdmVyZmxvd1xuIiwgX19GVU5DVElPTl9fKTsKKwkJbWVtY3B5KGhwLT50aHJvdHRsZV9idWYsIGRhdGEgKyBUVFlfVEhSRVNIT0xEX1RIUk9UVExFLCBvdmVyZmxvdyk7CisJCWhwLT5uX3Rocm90dGxlID0gb3ZlcmZsb3c7CisJfQorCisJcmV0dXJuIGhwLT50dHk7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUvZmFsc2UgaW5kaWNhdGluZyBkYXRhIHN1Y2Nlc3NmdWxseSByZWFkIGZyb20gaHlwZXJ2aXNvci4KKyAqIFVzZWQgYm90aCB0byBnZXQgcGFja2V0cyBmb3IgdHR5IGNvbm5lY3Rpb25zIGFuZCB0byBhZHZhbmNlIHRoZSBzdGF0ZQorICogbWFjaGluZSBkdXJpbmcgY29uc29sZSBoYW5kc2hha2luZyAoaW4gd2hpY2ggY2FzZSB0dHkgPSBOVUxMIGFuZCB3ZSBpZ25vcmUKKyAqIGluY29taW5nIGRhdGEpLgorICovCitzdGF0aWMgaW50IGh2c2lfbG9hZF9jaHVuayhzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqKmZsaXAsCisJCXN0cnVjdCB0dHlfc3RydWN0ICoqaGFuZ3VwLCBzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKipoYW5kc2hha2UpCit7CisJdWludDhfdCAqcGFja2V0ID0gaHAtPmluYnVmOworCWludCBjaHVua2xlbjsKKworCSpmbGlwID0gTlVMTDsKKwkqaGFuZ3VwID0gTlVMTDsKKwkqaGFuZHNoYWtlID0gTlVMTDsKKworCWNodW5rbGVuID0gaHZzaV9yZWFkKGhwLCBocC0+aW5idWZfZW5kLCBIVlNJX01BWF9SRUFEKTsKKwlpZiAoY2h1bmtsZW4gPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IDAtbGVuZ3RoIHJlYWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAwOworCX0KKworCXByX2RlYnVnKCIlczogZ290ICVpIGJ5dGVzXG4iLCBfX0ZVTkNUSU9OX18sIGNodW5rbGVuKTsKKwlkYmdfZHVtcF9oZXgoaHAtPmluYnVmX2VuZCwgY2h1bmtsZW4pOworCisJaHAtPmluYnVmX2VuZCArPSBjaHVua2xlbjsKKworCS8qIGhhbmRsZSBhbGwgY29tcGxldGVkIHBhY2tldHMgKi8KKwl3aGlsZSAoKHBhY2tldCA8IGhwLT5pbmJ1Zl9lbmQpICYmIGdvdF9wYWNrZXQoaHAsIHBhY2tldCkpIHsKKwkJc3RydWN0IGh2c2lfaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IGh2c2lfaGVhZGVyICopcGFja2V0OworCisJCWlmICghaXNfaGVhZGVyKHBhY2tldCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBnb3QgbWFsZm9ybWVkIHBhY2tldFxuIiwgaHAtPmluZGV4KTsKKwkJCS8qIHNraXAgYnl0ZXMgdW50aWwgd2UgZmluZCBhIGhlYWRlciBvciBydW4gb3V0IG9mIGRhdGEgKi8KKwkJCXdoaWxlICgocGFja2V0IDwgaHAtPmluYnVmX2VuZCkgJiYgKCFpc19oZWFkZXIocGFja2V0KSkpCisJCQkJcGFja2V0Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByX2RlYnVnKCIlczogaGFuZGxpbmcgJWktYnl0ZSBwYWNrZXRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQlsZW5fcGFja2V0KHBhY2tldCkpOworCQlkYmdfZHVtcF9wYWNrZXQocGFja2V0KTsKKworCQlzd2l0Y2ggKGhlYWRlci0+dHlwZSkgeworCQkJY2FzZSBWU19EQVRBX1BBQ0tFVF9IRUFERVI6CisJCQkJaWYgKCFpc19vcGVuKGhwKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGhwLT50dHkgPT0gTlVMTCkKKwkJCQkJYnJlYWs7IC8qIG5vIHR0eSBidWZmZXIgdG8gcHV0IGRhdGEgaW4gKi8KKwkJCQkqZmxpcCA9IGh2c2lfcmVjdl9kYXRhKGhwLCBwYWNrZXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBWU19DT05UUk9MX1BBQ0tFVF9IRUFERVI6CisJCQkJaHZzaV9yZWN2X2NvbnRyb2woaHAsIHBhY2tldCwgaGFuZ3VwLCBoYW5kc2hha2UpOworCQkJCWJyZWFrOworCQkJY2FzZSBWU19RVUVSWV9SRVNQT05TRV9QQUNLRVRfSEVBREVSOgorCQkJCWh2c2lfcmVjdl9yZXNwb25zZShocCwgcGFja2V0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNfUVVFUllfUEFDS0VUX0hFQURFUjoKKwkJCQlodnNpX3JlY3ZfcXVlcnkoaHAsIHBhY2tldCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiB1bmtub3duIEhWU0kgcGFja2V0IHR5cGUgMHgleFxuIiwKKwkJCQkJCWhwLT5pbmRleCwgaGVhZGVyLT50eXBlKTsKKwkJCQlkdW1wX3BhY2tldChwYWNrZXQpOworCQkJCWJyZWFrOworCQl9CisKKwkJcGFja2V0ICs9IGxlbl9wYWNrZXQocGFja2V0KTsKKworCQlpZiAoKmhhbmd1cCB8fCAqaGFuZHNoYWtlKSB7CisJCQlwcl9kZWJ1ZygiJXM6IGhhbmd1cCBvciBoYW5kc2hha2VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkvKgorCQkJICogd2UgbmVlZCB0byBzZW5kIHRoZSBoYW5ndXAgbm93IGJlZm9yZSByZWNlaXZpbmcgYW55IG1vcmUgZGF0YS4KKwkJCSAqIElmIHdlIGdldCAiZGF0YSwgaGFuZ3VwLCBkYXRhIiwgd2UgY2FuJ3QgZGVsaXZlciB0aGUgc2Vjb25kCisJCQkgKiBkYXRhIGJlZm9yZSB0aGUgaGFuZ3VwLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCWNvbXBhY3RfaW5idWYoaHAsIHBhY2tldCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaHZzaV9zZW5kX292ZXJmbG93KHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisJcHJfZGVidWcoIiVzOiBkZWxpdmVyaW5nICVpIGJ5dGVzIG92ZXJmbG93XG4iLCBfX0ZVTkNUSU9OX18sCisJCQlocC0+bl90aHJvdHRsZSk7CisKKwlodnNpX2luc2VydF9jaGFycyhocCwgaHAtPnRocm90dGxlX2J1ZiwgaHAtPm5fdGhyb3R0bGUpOworCWhwLT5uX3Rocm90dGxlID0gMDsKK30KKworLyoKKyAqIG11c3QgZ2V0IGFsbCBwZW5kaW5nIGRhdGEgYmVjYXVzZSB3ZSBvbmx5IGdldCBhbiBpcnEgb24gZW1wdHktPm5vbi1lbXB0eQorICogdHJhbnNpdGlvbgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaHZzaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqYXJnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gKHN0cnVjdCBodnNpX3N0cnVjdCAqKWFyZzsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqZmxpcDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqaGFuZ3VwOworCXN0cnVjdCBodnNpX3N0cnVjdCAqaGFuZHNoYWtlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGFnYWluID0gMTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCXdoaWxlIChhZ2FpbikgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwkJYWdhaW4gPSBodnNpX2xvYWRfY2h1bmsoaHAsICZmbGlwLCAmaGFuZ3VwLCAmaGFuZHNoYWtlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiB3ZSBoYXZlIHRvIGNhbGwgdHR5X2ZsaXBfYnVmZmVyX3B1c2goKSBhbmQgdHR5X2hhbmd1cCgpIG91dHNpZGUgb3VyCisJCSAqIHNwaW5sb2NrLiBCdXQgd2UgYWxzbyBoYXZlIHRvIGtlZXAgZ29pbmcgdW50aWwgd2UndmUgcmVhZCBhbGwgdGhlCisJCSAqIGF2YWlsYWJsZSBkYXRhLgorCQkgKi8KKworCQlpZiAoZmxpcCkgeworCQkJLyogdGhlcmUgd2FzIGRhdGEgcHV0IGluIHRoZSB0dHkgZmxpcCBidWZmZXIgKi8KKwkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKGZsaXApOworCQkJZmxpcCA9IE5VTEw7CisJCX0KKworCQlpZiAoaGFuZ3VwKSB7CisJCQl0dHlfaGFuZ3VwKGhhbmd1cCk7CisJCX0KKworCQlpZiAoaGFuZHNoYWtlKSB7CisJCQlwcl9kZWJ1ZygiaHZzaSVpOiBhdHRlbXB0aW5nIHJlLWhhbmRzaGFrZVxuIiwgaGFuZHNoYWtlLT5pbmRleCk7CisJCQlzY2hlZHVsZV93b3JrKCZoYW5kc2hha2UtPmhhbmRzaGFrZXIpOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJaWYgKGhwLT50dHkgJiYgaHAtPm5fdGhyb3R0bGUKKwkJCSYmICghdGVzdF9iaXQoVFRZX1RIUk9UVExFRCwgJmhwLT50dHktPmZsYWdzKSkpIHsKKwkJLyogd2Ugd2VyZW4ndCBodW5nIHVwIGFuZCB3ZSB3ZXJlbid0IHRocm90dGxlZCwgc28gd2UgY2FuIGRlbGl2ZXIgdGhlCisJCSAqIHJlc3Qgbm93ICovCisJCWZsaXAgPSBocC0+dHR5OworCQlodnNpX3NlbmRfb3ZlcmZsb3coaHApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGZsaXApIHsKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goZmxpcCk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBmb3IgYm9vdCBjb25zb2xlLCBiZWZvcmUgdGhlIGlycSBoYW5kbGVyIGlzIHJ1bm5pbmcgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBvbGxfZm9yX3N0YXRlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGVuZF9qaWZmaWVzID0gamlmZmllcyArIEhWU0lfVElNRU9VVDsKKworCWZvciAoOzspIHsKKwkJaHZzaV9pbnRlcnJ1cHQoaHAtPnZpcnEsICh2b2lkICopaHAsIE5VTEwpOyAvKiBnZXQgcGVuZGluZyBkYXRhICovCisKKwkJaWYgKGhwLT5zdGF0ZSA9PSBzdGF0ZSkKKwkJCXJldHVybiAwOworCisJCW1kZWxheSg1KTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZW5kX2ppZmZpZXMpKQorCQkJcmV0dXJuIC1FSU87CisJfQorfQorCisvKiB3YWl0IGZvciBpcnEgaGFuZGxlciB0byBjaGFuZ2Ugb3VyIHN0YXRlICovCitzdGF0aWMgaW50IHdhaXRfZm9yX3N0YXRlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGludCBzdGF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghd2FpdF9ldmVudF90aW1lb3V0KGhwLT5zdGF0ZXEsIChocC0+c3RhdGUgPT0gc3RhdGUpLCBIVlNJX1RJTUVPVVQpKQorCQlyZXQgPSAtRUlPOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBodnNpX3F1ZXJ5KHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIHVpbnQxNl90IHZlcmIpCit7CisJc3RydWN0IGh2c2lfcXVlcnkgcGFja2V0IF9fQUxJR05FRF9fOworCWludCB3cm90ZTsKKworCXBhY2tldC50eXBlID0gVlNfUVVFUllfUEFDS0VUX0hFQURFUjsKKwlwYWNrZXQubGVuID0gc2l6ZW9mKHN0cnVjdCBodnNpX3F1ZXJ5KTsKKwlwYWNrZXQuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmaHAtPnNlcW5vKTsKKwlwYWNrZXQudmVyYiA9IHZlcmI7CisKKwlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgJWkgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXywgcGFja2V0Lmxlbik7CisJZGJnX2R1bXBfaGV4KCh1aW50OF90KikmcGFja2V0LCBwYWNrZXQubGVuKTsKKworCXdyb3RlID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKKwlpZiAod3JvdGUgIT0gcGFja2V0LmxlbikgeworCQlwcmludGsoS0VSTl9FUlIgImh2c2klaTogY291bGRuJ3Qgc2VuZCBxdWVyeSAoJWkpIVxuIiwgaHAtPmluZGV4LAorCQkJd3JvdGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBodnNpX2dldF9tY3RybChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwKQoreworCWludCByZXQ7CisKKwlzZXRfc3RhdGUoaHAsIEhWU0lfV0FJVF9GT1JfTUNUUkxfUkVTUE9OU0UpOworCWh2c2lfcXVlcnkoaHAsIFZTVl9TRU5EX01PREVNX0NUTF9TVEFUVVMpOworCisJcmV0ID0gaHZzaV93YWl0KGhwLCBIVlNJX09QRU4pOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBkaWRuJ3QgZ2V0IG1vZGVtIGZsYWdzXG4iLCBocC0+aW5kZXgpOworCQlzZXRfc3RhdGUoaHAsIEhWU0lfT1BFTik7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJfZGVidWcoIiVzOiBtY3RybCAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIGhwLT5tY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogbm90ZSB0aGF0IHdlIGNhbiBvbmx5IHNldCBEVFIgKi8KK3N0YXRpYyBpbnQgaHZzaV9zZXRfbWN0cmwoc3RydWN0IGh2c2lfc3RydWN0ICpocCwgdWludDE2X3QgbWN0cmwpCit7CisJc3RydWN0IGh2c2lfY29udHJvbCBwYWNrZXQgX19BTElHTkVEX187CisJaW50IHdyb3RlOworCisJcGFja2V0LnR5cGUgPSBWU19DT05UUk9MX1BBQ0tFVF9IRUFERVIsCisJcGFja2V0LnNlcW5vID0gYXRvbWljX2luY19yZXR1cm4oJmhwLT5zZXFubyk7CisJcGFja2V0LmxlbiA9IHNpemVvZihzdHJ1Y3QgaHZzaV9jb250cm9sKTsKKwlwYWNrZXQudmVyYiA9IFZTVl9TRVRfTU9ERU1fQ1RMOworCXBhY2tldC5tYXNrID0gSFZTSV9UU0RUUjsKKworCWlmIChtY3RybCAmIFRJT0NNX0RUUikKKwkJcGFja2V0LndvcmQgPSBIVlNJX1RTRFRSOworCisJcHJfZGVidWcoIiVzOiBzZW5kaW5nICVpIGJ5dGVzXG4iLCBfX0ZVTkNUSU9OX18sIHBhY2tldC5sZW4pOworCWRiZ19kdW1wX2hleCgodWludDhfdCopJnBhY2tldCwgcGFja2V0Lmxlbik7CisKKwl3cm90ZSA9IGh2Y19wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIChjaGFyICopJnBhY2tldCwgcGFja2V0Lmxlbik7CisJaWYgKHdyb3RlICE9IHBhY2tldC5sZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IGNvdWxkbid0IHNldCBEVFIhXG4iLCBocC0+aW5kZXgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaHZzaV9kcmFpbl9pbnB1dChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwKQoreworCXVpbnQ4X3QgYnVmW0hWU0lfTUFYX1JFQURdIF9fQUxJR05FRF9fOworCXVuc2lnbmVkIGxvbmcgZW5kX2ppZmZpZXMgPSBqaWZmaWVzICsgSFZTSV9USU1FT1VUOworCisJd2hpbGUgKHRpbWVfYmVmb3JlKGVuZF9qaWZmaWVzLCBqaWZmaWVzKSkKKwkJaWYgKDAgPT0gaHZzaV9yZWFkKGhwLCBidWYsIEhWU0lfTUFYX1JFQUQpKQorCQkJYnJlYWs7Cit9CisKK3N0YXRpYyBpbnQgaHZzaV9oYW5kc2hha2Uoc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBXZSBjb3VsZCBoYXZlIGEgQ0xPU0Ugb3Igb3RoZXIgZGF0YSB3YWl0aW5nIGZvciB1cyBiZWZvcmUgd2UgZXZlbiB0cnkKKwkgKiB0byBvcGVuOyB0cnkgdG8gdGhyb3cgaXQgYWxsIGF3YXkgc28gd2UgZG9uJ3QgZ2V0IGNvbmZ1c2VkLiAoQ0xPU0UKKwkgKiBpcyB0aGUgZmlyc3QgbWVzc2FnZSBzZW50IHVwIHRoZSBwaXBlIHdoZW4gdGhlIEZTUCBjb21lcyBvbmxpbmUuIFdlCisJICogbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuICJpdCBjYW1lIHVwIGEgd2hpbGUgYWdvIGFuZCB3ZSdyZSB0aGUgZmlyc3QKKwkgKiB1c2VyIiBhbmQgIml0IHdhcyBqdXN0IHJlc2V0IGJlZm9yZSBpdCBzYXcgb3VyIGhhbmRzaGFrZSBwYWNrZXQiLikKKwkgKi8KKwlodnNpX2RyYWluX2lucHV0KGhwKTsKKworCXNldF9zdGF0ZShocCwgSFZTSV9XQUlUX0ZPUl9WRVJfUkVTUE9OU0UpOworCXJldCA9IGh2c2lfcXVlcnkoaHAsIFZTVl9TRU5EX1ZFUlNJT05fTlVNQkVSKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImh2c2klaTogY291bGRuJ3Qgc2VuZCB2ZXJzaW9uIHF1ZXJ5XG4iLCBocC0+aW5kZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGh2c2lfd2FpdChocCwgSFZTSV9PUEVOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBodnNpX2hhbmRzaGFrZXIodm9pZCAqYXJnKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopYXJnOworCisJaWYgKGh2c2lfaGFuZHNoYWtlKGhwKSA+PSAwKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9FUlIgImh2c2klaTogcmUtaGFuZHNoYWtpbmcgZmFpbGVkXG4iLCBocC0+aW5kZXgpOworCWlmIChpc19jb25zb2xlKGhwKSkgeworCQkvKgorCQkgKiB0dHlzIHdpbGwgcmUtYXR0ZW1wdCB0aGUgaGFuZHNoYWtlIHZpYSBodnNpX29wZW4sIGJ1dAorCQkgKiB0aGUgY29uc29sZSB3aWxsIG5vdC4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBsb3N0IGNvbnNvbGUhXG4iLCBocC0+aW5kZXgpOworCX0KK30KKworc3RhdGljIGludCBodnNpX3B1dF9jaGFycyhzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwLCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZzaV9kYXRhIHBhY2tldCBfX0FMSUdORURfXzsKKwlpbnQgcmV0OworCisJQlVHX09OKGNvdW50ID4gSFZTSV9NQVhfT1VUR09JTkdfREFUQSk7CisKKwlwYWNrZXQudHlwZSA9IFZTX0RBVEFfUEFDS0VUX0hFQURFUjsKKwlwYWNrZXQuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmaHAtPnNlcW5vKTsKKwlwYWNrZXQubGVuID0gY291bnQgKyBzaXplb2Yoc3RydWN0IGh2c2lfaGVhZGVyKTsKKwltZW1jcHkoJnBhY2tldC5kYXRhLCBidWYsIGNvdW50KTsKKworCXJldCA9IGh2Y19wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIChjaGFyICopJnBhY2tldCwgcGFja2V0Lmxlbik7CisJaWYgKHJldCA9PSBwYWNrZXQubGVuKSB7CisJCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJzIHdyaXR0ZW4sIG5vdCB0aGUgcGFja2V0IGxlbmd0aCAqLworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiByZXQ7IC8qIHJldHVybiBhbnkgZXJyb3JzICovCit9CisKK3N0YXRpYyB2b2lkIGh2c2lfY2xvc2VfcHJvdG9jb2woc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKwlzdHJ1Y3QgaHZzaV9jb250cm9sIHBhY2tldCBfX0FMSUdORURfXzsKKworCXBhY2tldC50eXBlID0gVlNfQ09OVFJPTF9QQUNLRVRfSEVBREVSOworCXBhY2tldC5zZXFubyA9IGF0b21pY19pbmNfcmV0dXJuKCZocC0+c2Vxbm8pOworCXBhY2tldC5sZW4gPSA2OworCXBhY2tldC52ZXJiID0gVlNWX0NMT1NFX1BST1RPQ09MOworCisJcHJfZGVidWcoIiVzOiBzZW5kaW5nICVpIGJ5dGVzXG4iLCBfX0ZVTkNUSU9OX18sIHBhY2tldC5sZW4pOworCWRiZ19kdW1wX2hleCgodWludDhfdCopJnBhY2tldCwgcGFja2V0Lmxlbik7CisKKwlodmNfcHV0X2NoYXJzKGhwLT52dGVybW5vLCAoY2hhciAqKSZwYWNrZXQsIHBhY2tldC5sZW4pOworfQorCitzdGF0aWMgaW50IGh2c2lfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxpbmUgPSB0dHktPmluZGV4OworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAobGluZSA8IDAgfHwgbGluZSA+PSBodnNpX2NvdW50KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlocCA9ICZodnNpX3BvcnRzW2xpbmVdOworCisJdHR5LT5kcml2ZXJfZGF0YSA9IGhwOworCXR0eS0+bG93X2xhdGVuY3kgPSAxOyAvKiBhdm9pZCB0aHJvdHRsZS90dHlfZmxpcF9idWZmZXJfcHVzaCByYWNlICovCisKKwltYigpOworCWlmIChocC0+c3RhdGUgPT0gSFZTSV9GU1BfRElFRCkKKwkJcmV0dXJuIC1FSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwlocC0+dHR5ID0gdHR5OworCWhwLT5jb3VudCsrOworCWF0b21pY19zZXQoJmhwLT5zZXFubywgMCk7CisJaF92aW9fc2lnbmFsKGhwLT52dGVybW5vLCBWSU9fSVJRX0VOQUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpc19jb25zb2xlKGhwKSkKKwkJcmV0dXJuIDA7IC8qIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBoYW5kc2hha2VkIGFzIHRoZSBjb25zb2xlICovCisKKwlyZXQgPSBodnNpX2hhbmRzaGFrZShocCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSFZTSSBoYW5kc2hha2luZyBmYWlsZWRcbiIsIHR0eS0+bmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaHZzaV9nZXRfbWN0cmwoaHApOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkbid0IGdldCBpbml0aWFsIG1vZGVtIGZsYWdzXG4iLCB0dHktPm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGh2c2lfc2V0X21jdHJsKGhwLCBocC0+bWN0cmwgfCBUSU9DTV9EVFIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkbid0IHNldCBEVFJcbiIsIHR0eS0+bmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHdhaXQgZm9yIGh2c2lfd3JpdGVfd29ya2VyIHRvIGVtcHR5IGhwLT5vdXRidWYgKi8KK3N0YXRpYyB2b2lkIGh2c2lfZmx1c2hfb3V0cHV0KHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCit7CisJd2FpdF9ldmVudF90aW1lb3V0KGhwLT5lbXB0eXEsIChocC0+bl9vdXRidWYgPD0gMCksIEhWU0lfVElNRU9VVCk7CisKKwkvKiAnd3JpdGVyJyBjb3VsZCBzdGlsbCBiZSBwZW5kaW5nIGlmIGl0IGRpZG4ndCBzZWUgbl9vdXRidWYgPSAwIHlldCAqLworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhwLT53cml0ZXIpOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwkvKgorCSAqIGl0J3MgYWxzbyBwb3NzaWJsZSB0aGF0IG91ciB0aW1lb3V0IGV4cGlyZWQgYW5kIGh2c2lfd3JpdGVfd29ya2VyCisJICogZGlkbid0IG1hbmFnZSB0byBwdXNoIG91dGJ1Zi4gcG9vZi4KKwkgKi8KKwlocC0+bl9vdXRidWYgPSAwOworfQorCitzdGF0aWMgdm9pZCBodnNpX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoLS1ocC0+Y291bnQgPT0gMCkgeworCQlocC0+dHR5ID0gTlVMTDsKKwkJaHAtPmluYnVmX2VuZCA9IGhwLT5pbmJ1ZjsgLyogZGlzY2FyZCByZW1haW5pbmcgcGFydGlhbCBwYWNrZXRzICovCisKKwkJLyogb25seSBjbG9zZSBkb3duIGNvbm5lY3Rpb24gaWYgaXQgaXMgbm90IHRoZSBjb25zb2xlICovCisJCWlmICghaXNfY29uc29sZShocCkpIHsKKwkJCWhfdmlvX3NpZ25hbChocC0+dnRlcm1ubywgVklPX0lSUV9ESVNBQkxFKTsgLyogbm8gbW9yZSBpcnFzICovCisJCQlfX3NldF9zdGF0ZShocCwgSFZTSV9DTE9TRUQpOworCQkJLyoKKwkJCSAqIGFueSBkYXRhIGRlbGl2ZXJlZCB0byB0aGUgdHR5IGxheWVyIGFmdGVyIHRoaXMgd2lsbCBiZQorCQkJICogZGlzY2FyZGVkIChleGNlcHQgZm9yIFhPTi9YT0ZGKQorCQkJICovCisJCQl0dHktPmNsb3NpbmcgPSAxOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJCQkvKiBsZXQgYW55IGV4aXN0aW5nIGlycSBoYW5kbGVycyBmaW5pc2guIG5vIG1vcmUgd2lsbCBzdGFydC4gKi8KKwkJCXN5bmNocm9uaXplX2lycShocC0+dmlycSk7CisKKwkJCS8qIGh2c2lfd3JpdGVfd29ya2VyIHdpbGwgcmUtc2NoZWR1bGUgdW50aWwgb3V0YnVmIGlzIGVtcHR5LiAqLworCQkJaHZzaV9mbHVzaF9vdXRwdXQoaHApOworCisJCQkvKiB0ZWxsIEZTUCB0byBzdG9wIHNlbmRpbmcgZGF0YSAqLworCQkJaHZzaV9jbG9zZV9wcm90b2NvbChocCk7CisKKwkJCS8qCisJCQkgKiBkcmFpbiBhbnl0aGluZyBGU1AgaXMgc3RpbGwgaW4gdGhlIG1pZGRsZSBvZiBzZW5kaW5nLCBhbmQgbGV0CisJCQkgKiBodnNpX2hhbmRzaGFrZSBkcmFpbiB0aGUgcmVzdCBvbiB0aGUgbmV4dCBvcGVuLgorCQkJICovCisJCQlodnNpX2RyYWluX2lucHV0KGhwKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJCX0KKwl9IGVsc2UgaWYgKGhwLT5jb3VudCA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiaHZzaV9jbG9zZSAlbHU6IG9vcHMsIGNvdW50IGlzICVkXG4iLAorCQkgICAgICAgaHAgLSBodnNpX3BvcnRzLCBocC0+Y291bnQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgaHZzaV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlocC0+Y291bnQgPSAwOworCWhwLT5uX291dGJ1ZiA9IDA7CisJaHAtPnR0eSA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworfQorCisvKiBjYWxsZWQgd2l0aCBocC0+bG9jayBoZWxkICovCitzdGF0aWMgdm9pZCBodnNpX3B1c2goc3RydWN0IGh2c2lfc3RydWN0ICpocCkKK3sKKwlpbnQgbjsKKworCWlmIChocC0+bl9vdXRidWYgPD0gMCkKKwkJcmV0dXJuOworCisJbiA9IGh2c2lfcHV0X2NoYXJzKGhwLCBocC0+b3V0YnVmLCBocC0+bl9vdXRidWYpOworCWlmIChuID4gMCkgeworCQkvKiBzdWNjZXNzICovCisJCXByX2RlYnVnKCIlczogd3JvdGUgJWkgY2hhcnNcbiIsIF9fRlVOQ1RJT05fXywgbik7CisJCWhwLT5uX291dGJ1ZiA9IDA7CisJfSBlbHNlIGlmIChuID09IC1FSU8pIHsKKwkJX19zZXRfc3RhdGUoaHAsIEhWU0lfRlNQX0RJRUQpOworCQlwcmludGsoS0VSTl9FUlIgImh2c2klaTogc2VydmljZSBwcm9jZXNzb3IgZGllZFxuIiwgaHAtPmluZGV4KTsKKwl9Cit9CisKKy8qIGh2c2lfd3JpdGVfd29ya2VyIHdpbGwga2VlcCByZXNjaGVkdWxpbmcgaXRzZWxmIHVudGlsIG91dGJ1ZiBpcyBlbXB0eSAqLworc3RhdGljIHZvaWQgaHZzaV93cml0ZV93b3JrZXIodm9pZCAqYXJnKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopYXJnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgREVCVUcKKwlzdGF0aWMgbG9uZyBzdGFydF9qID0gMDsKKworCWlmIChzdGFydF9qID09IDApCisJCXN0YXJ0X2ogPSBqaWZmaWVzOworI2VuZGlmIC8qIERFQlVHICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCXByX2RlYnVnKCIlczogJWkgY2hhcnMgaW4gYnVmZmVyXG4iLCBfX0ZVTkNUSU9OX18sIGhwLT5uX291dGJ1Zik7CisKKwlpZiAoIWlzX29wZW4oaHApKSB7CisJCS8qCisJCSAqIFdlIGNvdWxkIGhhdmUgYSBub24tb3BlbiBjb25uZWN0aW9uIGlmIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciBkaWVkCisJCSAqIHdoaWxlIHdlIHdlcmUgYnVzaWx5IHNjaGVkdWxpbmcgb3Vyc2VsdmVzLiBJbiB0aGF0IGNhc2UsIGl0IGNvdWxkCisJCSAqIGJlIG1pbnV0ZXMgYmVmb3JlIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciBjb21lcyBiYWNrLCBzbyBvbmx5IHRyeQorCQkgKiBhZ2FpbiBvbmNlIGEgc2Vjb25kLgorCQkgKi8KKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZocC0+d3JpdGVyLCBIWik7CisJCWdvdG8gb3V0OworCX0KKworCWh2c2lfcHVzaChocCk7CisJaWYgKGhwLT5uX291dGJ1ZiA+IDApCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaHAtPndyaXRlciwgMTApOworCWVsc2UgeworI2lmZGVmIERFQlVHCisJCXByX2RlYnVnKCIlczogb3V0YnVmIGVtcHRpZWQgYWZ0ZXIgJWxpIGppZmZpZXNcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQlqaWZmaWVzIC0gc3RhcnRfaik7CisJCXN0YXJ0X2ogPSAwOworI2VuZGlmIC8qIERFQlVHICovCisJCXdha2VfdXBfYWxsKCZocC0+ZW1wdHlxKTsKKwkJaWYgKHRlc3RfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZocC0+dHR5LT5mbGFncykKKwkJCQkmJiBocC0+dHR5LT5sZGlzYy53cml0ZV93YWtldXApCisJCQlocC0+dHR5LT5sZGlzYy53cml0ZV93YWtldXAoaHAtPnR0eSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaHAtPnR0eS0+d3JpdGVfd2FpdCk7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBodnNpX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gKHN0cnVjdCBodnNpX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4gTl9PVVRCVUYgLSBocC0+bl9vdXRidWY7Cit9CisKK3N0YXRpYyBpbnQgaHZzaV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gKHN0cnVjdCBodnNpX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4gaHAtPm5fb3V0YnVmOworfQorCitzdGF0aWMgaW50IGh2c2lfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwljb25zdCBjaGFyICpzb3VyY2UgPSBidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdG90YWwgPSAwOworCWludCBvcmlnY291bnQgPSBjb3VudDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZocC0+bG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIiVzOiAlaSBjaGFycyBpbiBidWZmZXJcbiIsIF9fRlVOQ1RJT05fXywgaHAtPm5fb3V0YnVmKTsKKworCWlmICghaXNfb3BlbihocCkpIHsKKwkJLyogd2UncmUgZWl0aGVyIGNsb3Npbmcgb3Igbm90IHlldCBvcGVuOyBkb24ndCBhY2NlcHQgZGF0YSAqLworCQlwcl9kZWJ1ZygiJXM6IG5vdCBvcGVuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIHdoZW4gdGhlIGh5cGVydmlzb3IgYnVmZmVyICgxNkspIGZpbGxzLCBkYXRhIHdpbGwgc3RheSBpbiBocC0+b3V0YnVmCisJICogYW5kIGh2c2lfd3JpdGVfd29ya2VyIHdpbGwgYmUgc2NoZWR1bGVkLiBzdWJzZXF1ZW50IGh2c2lfd3JpdGUoKSBjYWxscworCSAqIHdpbGwgc2VlIHRoZXJlIGlzIG5vIHJvb20gaW4gb3V0YnVmIGFuZCByZXR1cm4uCisJICovCisJd2hpbGUgKChjb3VudCA+IDApICYmIChodnNpX3dyaXRlX3Jvb20oaHAtPnR0eSkgPiAwKSkgeworCQlpbnQgY2h1bmtzaXplID0gbWluKGNvdW50LCBodnNpX3dyaXRlX3Jvb20oaHAtPnR0eSkpOworCisJCUJVR19PTihocC0+bl9vdXRidWYgPCAwKTsKKwkJbWVtY3B5KGhwLT5vdXRidWYgKyBocC0+bl9vdXRidWYsIHNvdXJjZSwgY2h1bmtzaXplKTsKKwkJaHAtPm5fb3V0YnVmICs9IGNodW5rc2l6ZTsKKworCQl0b3RhbCArPSBjaHVua3NpemU7CisJCXNvdXJjZSArPSBjaHVua3NpemU7CisJCWNvdW50IC09IGNodW5rc2l6ZTsKKwkJaHZzaV9wdXNoKGhwKTsKKwl9CisKKwlpZiAoaHAtPm5fb3V0YnVmID4gMCkgeworCQkvKgorCQkgKiB3ZSB3ZXJlbid0IGFibGUgdG8gd3JpdGUgaXQgYWxsIHRvIHRoZSBoeXBlcnZpc29yLgorCQkgKiBzY2hlZHVsZSBhbm90aGVyIHB1c2ggYXR0ZW1wdC4KKwkJICovCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaHAtPndyaXRlciwgMTApOworCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodG90YWwgIT0gb3JpZ2NvdW50KQorCQlwcl9kZWJ1ZygiJXM6IHdhbnRlZCAlaSwgb25seSB3cm90ZSAlaVxuIiwgX19GVU5DVElPTl9fLCBvcmlnY291bnQsCisJCQl0b3RhbCk7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qCisgKiBJIGhhdmUgbmV2ZXIgc2VlbiB0aHJvdHRsZSBvciB1bnRocm90dGxlIGNhbGxlZCwgc28gdGhpcyBsaXR0bGUgdGhyb3R0bGUKKyAqIGJ1ZmZlcmluZyBzY2hlbWUgbWF5IG9yIG1heSBub3Qgd29yay4KKyAqLworc3RhdGljIHZvaWQgaHZzaV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWhfdmlvX3NpZ25hbChocC0+dnRlcm1ubywgVklPX0lSUV9ESVNBQkxFKTsKK30KKworc3RhdGljIHZvaWQgaHZzaV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHNob3VsZGZsaXAgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJaWYgKGhwLT5uX3Rocm90dGxlKSB7CisJCWh2c2lfc2VuZF9vdmVyZmxvdyhocCk7CisJCXNob3VsZGZsaXAgPSAxOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNob3VsZGZsaXApCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKGhwLT50dHkpOworCisJaF92aW9fc2lnbmFsKGhwLT52dGVybW5vLCBWSU9fSVJRX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpbnQgaHZzaV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gKHN0cnVjdCBodnNpX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKKwlodnNpX2dldF9tY3RybChocCk7CisJcmV0dXJuIGhwLT5tY3RybDsKK30KKworc3RhdGljIGludCBodnNpX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDE2X3QgbmV3X21jdHJsOworCisJLyogd2UgY2FuIG9ubHkgYWx0ZXIgRFRSICovCisJY2xlYXIgJj0gVElPQ01fRFRSOworCXNldCAmPSBUSU9DTV9EVFI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCW5ld19tY3RybCA9IChocC0+bWN0cmwgJiB+Y2xlYXIpIHwgc2V0OworCisJaWYgKGhwLT5tY3RybCAhPSBuZXdfbWN0cmwpIHsKKwkJaHZzaV9zZXRfbWN0cmwoaHAsIG5ld19tY3RybCk7CisJCWhwLT5tY3RybCA9IG5ld19tY3RybDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgaHZzaV9vcHMgPSB7CisJLm9wZW4gPSBodnNpX29wZW4sCisJLmNsb3NlID0gaHZzaV9jbG9zZSwKKwkud3JpdGUgPSBodnNpX3dyaXRlLAorCS5oYW5ndXAgPSBodnNpX2hhbmd1cCwKKwkud3JpdGVfcm9vbSA9IGh2c2lfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gaHZzaV9jaGFyc19pbl9idWZmZXIsCisJLnRocm90dGxlID0gaHZzaV90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IGh2c2lfdW50aHJvdHRsZSwKKwkudGlvY21nZXQgPSBodnNpX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IGh2c2lfdGlvY21zZXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBodnNpX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWh2c2lfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihodnNpX2NvdW50KTsKKwlpZiAoIWh2c2lfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWh2c2lfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCWh2c2lfZHJpdmVyLT5kZXZmc19uYW1lID0gImh2c2kvIjsKKwlodnNpX2RyaXZlci0+ZHJpdmVyX25hbWUgPSAiaHZzaSI7CisJaHZzaV9kcml2ZXItPm5hbWUgPSAiaHZzaSI7CisJaHZzaV9kcml2ZXItPm1ham9yID0gSFZTSV9NQUpPUjsKKwlodnNpX2RyaXZlci0+bWlub3Jfc3RhcnQgPSBIVlNJX01JTk9SOworCWh2c2lfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NZU1RFTTsKKwlodnNpX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCWh2c2lfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTDsKKwlodnNpX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhodnNpX2RyaXZlciwgJmh2c2lfb3BzKTsKKworCWZvciAoaT0wOyBpIDwgaHZzaV9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAmaHZzaV9wb3J0c1tpXTsKKwkJaW50IHJldCA9IDE7CisKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaHAtPnZpcnEsIGh2c2lfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJodnNpIiwgaHApOworCQlpZiAocmV0KQorCQkJcHJpbnRrKEtFUk5fRVJSICJIVlNJOiBjb3VsZG4ndCByZXNlcnZlIGlycSAweCV4IChlcnJvciAlaSlcbiIsCisJCQkJaHAtPnZpcnEsIHJldCk7CisJfQorCWh2c2lfd2FpdCA9IHdhaXRfZm9yX3N0YXRlOyAvKiBpcnFzIGFjdGl2ZSBub3cgKi8KKworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKGh2c2lfZHJpdmVyKSkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIGh2c2kgY29uc29sZSBkcml2ZXJcbiIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSFZTSTogcmVnaXN0ZXJlZCAlaSBkZXZpY2VzXG4iLCBodnNpX2NvdW50KTsKKworCXJldHVybiAwOworfQorZGV2aWNlX2luaXRjYWxsKGh2c2lfaW5pdCk7CisKKy8qKioqKiBjb25zb2xlIChub3QgdHR5KSBjb2RlOiAqKioqKi8KKworc3RhdGljIHZvaWQgaHZzaV9jb25zb2xlX3ByaW50KHN0cnVjdCBjb25zb2xlICpjb25zb2xlLCBjb25zdCBjaGFyICpidWYsCisJCXVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKmhwID0gJmh2c2lfcG9ydHNbY29uc29sZS0+aW5kZXhdOworCWNoYXIgY1tIVlNJX01BWF9PVVRHT0lOR19EQVRBXSBfX0FMSUdORURfXzsKKwl1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSAwOworCWludCByZXQsIGRvbmVjciA9IDA7CisKKwltYigpOworCWlmICghaXNfb3BlbihocCkpCisJCXJldHVybjsKKworCS8qCisJICogdWdoLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSBMRiAtPiBDUkxGIG91cnNlbHZlcywgaW4gcGxhY2UuCisJICogY29waWVkIGZyb20gaHZjX2NvbnNvbGUuYzoKKwkgKi8KKwl3aGlsZSAoY291bnQgPiAwIHx8IGkgPiAwKSB7CisJCWlmIChjb3VudCA+IDAgJiYgaSA8IHNpemVvZihjKSkgeworCQkJaWYgKGJ1ZltuXSA9PSAnXG4nICYmICFkb25lY3IpIHsKKwkJCQljW2krK10gPSAnXHInOworCQkJCWRvbmVjciA9IDE7CisJCQl9IGVsc2UgeworCQkJCWNbaSsrXSA9IGJ1ZltuKytdOworCQkJCWRvbmVjciA9IDA7CisJCQkJLS1jb3VudDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldCA9IGh2c2lfcHV0X2NoYXJzKGhwLCBjLCBpKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWkgPSAwOworCQkJaSAtPSByZXQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaHZzaV9jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqY29uc29sZSwKKwlpbnQgKmluZGV4KQoreworCSppbmRleCA9IGNvbnNvbGUtPmluZGV4OworCXJldHVybiBodnNpX2RyaXZlcjsKK30KKworc3RhdGljIGludCBfX2luaXQgaHZzaV9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjb25zb2xlLCBjaGFyICpvcHRpb25zKQoreworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAmaHZzaV9wb3J0c1tjb25zb2xlLT5pbmRleF07CisJaW50IHJldDsKKworCWlmIChjb25zb2xlLT5pbmRleCA8IDAgfHwgY29uc29sZS0+aW5kZXggPj0gaHZzaV9jb3VudCkKKwkJcmV0dXJuIC0xOworCisJLyogZ2l2ZSB0aGUgRlNQIGEgY2hhbmNlIHRvIGNoYW5nZSB0aGUgYmF1ZCByYXRlIHdoZW4gd2UgcmUtb3BlbiAqLworCWh2c2lfY2xvc2VfcHJvdG9jb2woaHApOworCisJcmV0ID0gaHZzaV9oYW5kc2hha2UoaHApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaHZzaV9nZXRfbWN0cmwoaHApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaHZzaV9zZXRfbWN0cmwoaHAsIGhwLT5tY3RybCB8IFRJT0NNX0RUUik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlocC0+ZmxhZ3MgfD0gSFZTSV9DT05TT0xFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBodnNpX2Nvbl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImh2c2kiLAorCS53cml0ZQkJPSBodnNpX2NvbnNvbGVfcHJpbnQsCisJLmRldmljZQkJPSBodnNpX2NvbnNvbGVfZGV2aWNlLAorCS5zZXR1cAkJPSBodnNpX2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBodnNpX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdnR5OworCisJaHZzaV93YWl0ID0gcG9sbF9mb3Jfc3RhdGU7IC8qIG5vIGlycXMgeWV0OyBtdXN0IHBvbGwgKi8KKworCS8qIHNlYXJjaCBkZXZpY2UgdHJlZSBmb3IgdnR5IG5vZGVzICovCisJZm9yICh2dHkgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAic2VyaWFsIiwgImh2dGVybS1wcm90b2NvbCIpOworCQkJdnR5ICE9IE5VTEw7CisJCQl2dHkgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZSh2dHksICJzZXJpYWwiLCAiaHZ0ZXJtLXByb3RvY29sIikpIHsKKwkJc3RydWN0IGh2c2lfc3RydWN0ICpocDsKKwkJdWludDMyX3QgKnZ0ZXJtbm87CisJCXVpbnQzMl90ICppcnE7CisKKwkJdnRlcm1ubyA9ICh1aW50MzJfdCAqKWdldF9wcm9wZXJ0eSh2dHksICJyZWciLCBOVUxMKTsKKwkJaXJxID0gKHVpbnQzMl90ICopZ2V0X3Byb3BlcnR5KHZ0eSwgImludGVycnVwdHMiLCBOVUxMKTsKKwkJaWYgKCF2dGVybW5vIHx8ICFpcnEpCisJCQljb250aW51ZTsKKworCQlpZiAoaHZzaV9jb3VudCA+PSBNQVhfTlJfSFZTSV9DT05TT0xFUykgeworCQkJb2Zfbm9kZV9wdXQodnR5KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaHAgPSAmaHZzaV9wb3J0c1todnNpX2NvdW50XTsKKwkJSU5JVF9XT1JLKCZocC0+d3JpdGVyLCBodnNpX3dyaXRlX3dvcmtlciwgaHApOworCQlJTklUX1dPUksoJmhwLT5oYW5kc2hha2VyLCBodnNpX2hhbmRzaGFrZXIsIGhwKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaHAtPmVtcHR5cSk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhwLT5zdGF0ZXEpOworCQlzcGluX2xvY2tfaW5pdCgmaHAtPmxvY2spOworCQlocC0+aW5kZXggPSBodnNpX2NvdW50OworCQlocC0+aW5idWZfZW5kID0gaHAtPmluYnVmOworCQlocC0+c3RhdGUgPSBIVlNJX0NMT1NFRDsKKwkJaHAtPnZ0ZXJtbm8gPSAqdnRlcm1ubzsKKwkJaHAtPnZpcnEgPSB2aXJ0X2lycV9jcmVhdGVfbWFwcGluZyhpcnFbMF0pOworCQlpZiAoaHAtPnZpcnEgPT0gTk9fSVJRKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBjcmVhdGUgaXJxIG1hcHBpbmcgZm9yIDB4JXhcbiIsCisJCQkJX19GVU5DVElPTl9fLCBocC0+dmlycSk7CisJCQljb250aW51ZTsKKwkJfSBlbHNlCisJCQlocC0+dmlycSA9IGlycV9vZmZzZXRfdXAoaHAtPnZpcnEpOworCisJCWh2c2lfY291bnQrKzsKKwl9CisKKwlpZiAoaHZzaV9jb3VudCkKKwkJcmVnaXN0ZXJfY29uc29sZSgmaHZzaV9jb25fZHJpdmVyKTsKKwlyZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwoaHZzaV9jb25zb2xlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNmFjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKQEAgLTAsMCArMSw2MzAgQEAKKy8qCisgCUhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIEludGVsL0FNRC9WSUEgUmFuZG9tIE51bWJlciBHZW5lcmF0b3JzIChSTkcpCisJKGMpIENvcHlyaWdodCAyMDAzIFJlZCBIYXQgSW5jIDxqZ2FyemlrQHJlZGhhdC5jb20+CisgCisgCWRlcml2ZWQgZnJvbQorIAorICAgICAgICBIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSBBTUQgNzY4IFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChSTkcpCisgICAgICAgIChjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYyA8YWxhbkByZWRoYXQuY29tPgorCisgCWRlcml2ZWQgZnJvbQorIAorCUhhcmR3YXJlIGRyaXZlciBmb3IgSW50ZWwgaTgxMCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUk5HKQorCUNvcHlyaWdodCAyMDAwLDIwMDEgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQG1hbmRyYWtlc29mdC5jb20+CisKKwlQbGVhc2UgcmVhZCBEb2N1bWVudGF0aW9uL2h3X3JhbmRvbS50eHQgZm9yIGRldGFpbHMgb24gdXNlLgorCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgICAgICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaWZkZWYgX19pMzg2X18KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCisvKgorICogY29yZSBtb2R1bGUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqLworI2RlZmluZSBSTkdfVkVSU0lPTiAiMS4wLjAiCisjZGVmaW5lIFJOR19NT0RVTEVfTkFNRSAiaHdfcmFuZG9tIgorI2RlZmluZSBSTkdfRFJJVkVSX05BTUUgICBSTkdfTU9EVUxFX05BTUUgIiBoYXJkd2FyZSBkcml2ZXIgIiBSTkdfVkVSU0lPTgorI2RlZmluZSBQRlggUk5HX01PRFVMRV9OQU1FICI6ICIKKworCisvKgorICogZGVidWdnaW5nIG1hY3JvcworICovCisKKy8qIHByX2RlYnVnKCkgY29sbGFwc2VzIHRvIGEgbm8tb3AgaWYgREVCVUcgaXMgbm90IGRlZmluZWQgKi8KKyNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKFBGWCAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorCisKKyN1bmRlZiBSTkdfTkRFQlVHICAgICAgICAvKiBkZWZpbmUgdG8gZW5hYmxlIGxpZ2h0d2VpZ2h0IHJ1bnRpbWUgY2hlY2tzICovCisjaWZkZWYgUk5HX05ERUJVRworI2RlZmluZSBhc3NlcnQoZXhwcikJCQkJCQkJXAorCQlpZighKGV4cHIpKSB7CQkJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLCIJXAorCQkibGluZT0lZFxuIiwgI2V4cHIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsJXAorCQl9CisjZWxzZQorI2RlZmluZSBhc3NlcnQoZXhwcikKKyNlbmRpZgorCisjZGVmaW5lIFJOR19NSVNDREVWX01JTk9SCQkxODMgLyogb2ZmaWNpYWwgKi8KKworc3RhdGljIGludCBybmdfZGV2X29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyBzc2l6ZV90IHJuZ19kZXZfcmVhZCAoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBzaXplLAorCQkJCWxvZmZfdCAqIG9mZnApOworCitzdGF0aWMgaW50IF9faW5pdCBpbnRlbF9pbml0IChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyB2b2lkIGludGVsX2NsZWFudXAodm9pZCk7CitzdGF0aWMgdW5zaWduZWQgaW50IGludGVsX2RhdGFfcHJlc2VudCAodm9pZCk7CitzdGF0aWMgdTMyIGludGVsX2RhdGFfcmVhZCAodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGFtZF9pbml0IChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyB2b2lkIGFtZF9jbGVhbnVwKHZvaWQpOworc3RhdGljIHVuc2lnbmVkIGludCBhbWRfZGF0YV9wcmVzZW50ICh2b2lkKTsKK3N0YXRpYyB1MzIgYW1kX2RhdGFfcmVhZCAodm9pZCk7CisKKyNpZmRlZiBfX2kzODZfXworc3RhdGljIGludCBfX2luaXQgdmlhX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldik7CitzdGF0aWMgdm9pZCB2aWFfY2xlYW51cCh2b2lkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlhX2RhdGFfcHJlc2VudCAodm9pZCk7CitzdGF0aWMgdTMyIHZpYV9kYXRhX3JlYWQgKHZvaWQpOworI2VuZGlmCisKK3N0cnVjdCBybmdfb3BlcmF0aW9ucyB7CisJaW50ICgqaW5pdCkgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCXZvaWQgKCpjbGVhbnVwKSAodm9pZCk7CisJdW5zaWduZWQgaW50ICgqZGF0YV9wcmVzZW50KSAodm9pZCk7CisJdTMyICgqZGF0YV9yZWFkKSAodm9pZCk7CisJdW5zaWduZWQgaW50IG5fYnl0ZXM7IC8qIG51bWJlciBvZiBieXRlcyBwZXIgLT5kYXRhX3JlYWQgKi8KK307CitzdGF0aWMgc3RydWN0IHJuZ19vcGVyYXRpb25zICpybmdfb3BzOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBybmdfY2hyZGV2X29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcm5nX2Rldl9vcGVuLAorCS5yZWFkCQk9IHJuZ19kZXZfcmVhZCwKK307CisKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHJuZ19taXNjZGV2ID0geworCVJOR19NSVNDREVWX01JTk9SLAorCVJOR19NT0RVTEVfTkFNRSwKKwkmcm5nX2NocmRldl9vcHMsCit9OworCitlbnVtIHsKKwlybmdfaHdfbm9uZSwKKwlybmdfaHdfaW50ZWwsCisJcm5nX2h3X2FtZCwKKwlybmdfaHdfdmlhLAorfTsKKworc3RhdGljIHN0cnVjdCBybmdfb3BlcmF0aW9ucyBybmdfdmVuZG9yX29wc1tdID0geworCS8qIHJuZ19od19ub25lICovCisJeyB9LAorCisJLyogcm5nX2h3X2ludGVsICovCisJeyBpbnRlbF9pbml0LCBpbnRlbF9jbGVhbnVwLCBpbnRlbF9kYXRhX3ByZXNlbnQsCisJICBpbnRlbF9kYXRhX3JlYWQsIDEgfSwKKworCS8qIHJuZ19od19hbWQgKi8KKwl7IGFtZF9pbml0LCBhbWRfY2xlYW51cCwgYW1kX2RhdGFfcHJlc2VudCwgYW1kX2RhdGFfcmVhZCwgNCB9LAorCisjaWZkZWYgX19pMzg2X18KKwkvKiBybmdfaHdfdmlhICovCisJeyB2aWFfaW5pdCwgdmlhX2NsZWFudXAsIHZpYV9kYXRhX3ByZXNlbnQsIHZpYV9kYXRhX3JlYWQsIDEgfSwKKyNlbmRpZgorfTsKKworLyoKKyAqIERhdGEgZm9yIFBDSSBkcml2ZXIgaW50ZXJmYWNlCisgKgorICogVGhpcyBkYXRhIG9ubHkgZXhpc3RzIGZvciBleHBvcnRpbmcgdGhlIHN1cHBvcnRlZAorICogUENJIGlkcyB2aWEgTU9EVUxFX0RFVklDRV9UQUJMRS4gIFdlIGRvIG5vdCBhY3R1YWxseQorICogcmVnaXN0ZXIgYSBwY2lfZHJpdmVyLCBiZWNhdXNlIHNvbWVvbmUgZWxzZSBtaWdodCBvbmUgZGF5CisgKiB3YW50IHRvIHJlZ2lzdGVyIGFub3RoZXIgZHJpdmVyIG9uIHRoZSBzYW1lIFBDSSBpZC4KKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJuZ19wY2lfdGJsW10gPSB7CisJeyAweDEwMjIsIDB4NzQ0MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcm5nX2h3X2FtZCB9LAorCXsgMHgxMDIyLCAweDc0NmIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19hbWQgfSwKKworCXsgMHg4MDg2LCAweDI0MTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAorCXsgMHg4MDg2LCAweDI0MjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAorCXsgMHg4MDg2LCAweDI0NDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAorCXsgMHg4MDg2LCAweDI0NGUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAorCXsgMHg4MDg2LCAweDI0NWUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHJuZ19od19pbnRlbCB9LAorCisJeyAwLCB9LAkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgcm5nX3BjaV90YmwpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEludGVsIFJORyBvcGVyYXRpb25zCisgKgorICovCisKKy8qCisgKiBSTkcgcmVnaXN0ZXJzIChvZmZzZXRzIGZyb20gcm5nX21lbSkKKyAqLworI2RlZmluZSBJTlRFTF9STkdfSFdfU1RBVFVTCQkJMAorI2RlZmluZSAgICAgICAgIElOVEVMX1JOR19QUkVTRU5UCQkweDQwCisjZGVmaW5lICAgICAgICAgSU5URUxfUk5HX0VOQUJMRUQJCTB4MDEKKyNkZWZpbmUgSU5URUxfUk5HX1NUQVRVUwkJCTEKKyNkZWZpbmUgICAgICAgICBJTlRFTF9STkdfREFUQV9QUkVTRU5UCQkweDAxCisjZGVmaW5lIElOVEVMX1JOR19EQVRBCQkJCTIKKworLyoKKyAqIE1hZ2ljIGFkZHJlc3MgYXQgd2hpY2ggSW50ZWwgUENJIGJyaWRnZXMgbG9jYXRlIHRoZSBSTkcKKyAqLworI2RlZmluZSBJTlRFTF9STkdfQUREUgkJCQkweEZGQkMwMTVGCisjZGVmaW5lIElOVEVMX1JOR19BRERSX0xFTgkJCTMKKworLyogdG9rZW4gdG8gb3VyIGlvcmVtYXAnZCBSTkcgcmVnaXN0ZXIgYXJlYSAqLworc3RhdGljIHZvaWQgX19pb21lbSAqcm5nX21lbTsKKworc3RhdGljIGlubGluZSB1OCBpbnRlbF9od3N0YXR1cyAodm9pZCkKK3sKKwlhc3NlcnQgKHJuZ19tZW0gIT0gTlVMTCk7CisJcmV0dXJuIHJlYWRiIChybmdfbWVtICsgSU5URUxfUk5HX0hXX1NUQVRVUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggaW50ZWxfaHdzdGF0dXNfc2V0ICh1OCBod19zdGF0dXMpCit7CisJYXNzZXJ0IChybmdfbWVtICE9IE5VTEwpOworCXdyaXRlYiAoaHdfc3RhdHVzLCBybmdfbWVtICsgSU5URUxfUk5HX0hXX1NUQVRVUyk7CisJcmV0dXJuIGludGVsX2h3c3RhdHVzICgpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGludGVsX2RhdGFfcHJlc2VudCh2b2lkKQoreworCWFzc2VydCAocm5nX21lbSAhPSBOVUxMKTsKKworCXJldHVybiAocmVhZGIgKHJuZ19tZW0gKyBJTlRFTF9STkdfU1RBVFVTKSAmIElOVEVMX1JOR19EQVRBX1BSRVNFTlQpID8KKwkJMSA6IDA7Cit9CisKK3N0YXRpYyB1MzIgaW50ZWxfZGF0YV9yZWFkKHZvaWQpCit7CisJYXNzZXJ0IChybmdfbWVtICE9IE5VTEwpOworCisJcmV0dXJuIHJlYWRiIChybmdfbWVtICsgSU5URUxfUk5HX0RBVEEpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbnRlbF9pbml0IChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCByYzsKKwl1OCBod19zdGF0dXM7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJcm5nX21lbSA9IGlvcmVtYXAgKElOVEVMX1JOR19BRERSLCBJTlRFTF9STkdfQUREUl9MRU4pOworCWlmIChybmdfbWVtID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCBpb3JlbWFwIFJORyBNZW1vcnlcbiIpOworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIENoZWNrIGZvciBJbnRlbCA4MjgwMiAqLworCWh3X3N0YXR1cyA9IGludGVsX2h3c3RhdHVzICgpOworCWlmICgoaHdfc3RhdHVzICYgSU5URUxfUk5HX1BSRVNFTlQpID09IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIlJORyBub3QgZGV0ZWN0ZWRcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlX21hcDsKKwl9CisKKwkvKiB0dXJuIFJORyBoL3cgb24sIGlmIGl0J3Mgb2ZmICovCisJaWYgKChod19zdGF0dXMgJiBJTlRFTF9STkdfRU5BQkxFRCkgPT0gMCkKKwkJaHdfc3RhdHVzID0gaW50ZWxfaHdzdGF0dXNfc2V0IChod19zdGF0dXMgfCBJTlRFTF9STkdfRU5BQkxFRCk7CisJaWYgKChod19zdGF0dXMgJiBJTlRFTF9STkdfRU5BQkxFRCkgPT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IGVuYWJsZSBSTkcsIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfZnJlZV9tYXA7CisJfQorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX21hcDoKKwlpb3VubWFwIChybmdfbWVtKTsKKwlybmdfbWVtID0gTlVMTDsKK2Vycl9vdXQ6CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfY2xlYW51cCh2b2lkKQoreworCXU4IGh3X3N0YXR1czsKKworCWh3X3N0YXR1cyA9IGludGVsX2h3c3RhdHVzICgpOworCWlmIChod19zdGF0dXMgJiBJTlRFTF9STkdfRU5BQkxFRCkKKwkJaW50ZWxfaHdzdGF0dXNfc2V0IChod19zdGF0dXMgJiB+SU5URUxfUk5HX0VOQUJMRUQpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInVudXN1YWw6IFJORyBhbHJlYWR5IGRpc2FibGVkXG4iKTsKKwlpb3VubWFwKHJuZ19tZW0pOworCXJuZ19tZW0gPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBTUQgUk5HIG9wZXJhdGlvbnMKKyAqCisgKi8KKworc3RhdGljIHUzMiBwbWJhc2U7CQkJLyogUE14eCBJL08gYmFzZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICphbWRfZGV2OworCitzdGF0aWMgdW5zaWduZWQgaW50IGFtZF9kYXRhX3ByZXNlbnQgKHZvaWQpCit7CisgICAgICAJcmV0dXJuIGlubChwbWJhc2UgKyAweEY0KSAmIDE7Cit9CisKKworc3RhdGljIHUzMiBhbWRfZGF0YV9yZWFkICh2b2lkKQoreworCXJldHVybiBpbmwocG1iYXNlICsgMHhGMCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFtZF9pbml0IChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCByYzsKKwl1OCBybmVuOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NTgsICZwbWJhc2UpOworCisJcG1iYXNlICY9IDB4MDAwMEZGMDA7CisKKwlpZiAocG1iYXNlID09IDApCisJeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAicG93ZXIgbWFuYWdlbWVudCBiYXNlIG5vdCBzZXRcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDAsICZybmVuKTsKKwlybmVuIHw9ICgxIDw8IDcpOwkvKiBSTkcgb24gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQwLCBybmVuKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MSwgJnJuZW4pOworCXJuZW4gfD0gKDEgPDwgNyk7CS8qIFBNSU8gZW5hYmxlICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MSwgcm5lbik7CisKKwlwcl9pbmZvKCBQRlggIkFNRDc2OCBzeXN0ZW0gbWFuYWdlbWVudCBJL08gcmVnaXN0ZXJzIGF0IDB4JVguXG4iLAorCQkJcG1iYXNlKTsKKworCWFtZF9kZXYgPSBkZXY7CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworCitlcnJfb3V0OgorCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9jbGVhbnVwKHZvaWQpCit7CisJdTggcm5lbjsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFtZF9kZXYsIDB4NDAsICZybmVuKTsKKwlybmVuICY9IH4oMSA8PCA3KTsJLyogUk5HIG9mZiAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbWRfZGV2LCAweDQwLCBybmVuKTsKKworCS8qIEZJWE1FOiB0d2lkZGxlIHBtaW8sIGFsc28/ICovCit9CisKKyNpZmRlZiBfX2kzODZfXworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVklBIFJORyBvcGVyYXRpb25zCisgKgorICovCisKK2VudW0geworCVZJQV9TVFJGSUxUX0NOVF9TSElGVAk9IDE2LAorCVZJQV9TVFJGSUxUX0ZBSUwJPSAoMSA8PCAxNSksCisJVklBX1NUUkZJTFRfRU5BQkxFCT0gKDEgPDwgMTQpLAorCVZJQV9SQVdCSVRTX0VOQUJMRQk9ICgxIDw8IDEzKSwKKwlWSUFfUk5HX0VOQUJMRQkJPSAoMSA8PCA2KSwKKwlWSUFfWFNUT1JFX0NOVF9NQVNLCT0gMHgwRiwKKworCVZJQV9STkdfQ0hVTktfOAkJPSAweDAwLAkvKiA2NCByYW5kIGJpdHMsIDY0IHN0b3JlZCBiaXRzICovCisJVklBX1JOR19DSFVOS180CQk9IDB4MDEsCS8qIDMyIHJhbmQgYml0cywgMzIgc3RvcmVkIGJpdHMgKi8KKwlWSUFfUk5HX0NIVU5LXzRfTUFTSwk9IDB4RkZGRkZGRkYsCisJVklBX1JOR19DSFVOS18yCQk9IDB4MDIsCS8qIDE2IHJhbmQgYml0cywgMzIgc3RvcmVkIGJpdHMgKi8KKwlWSUFfUk5HX0NIVU5LXzJfTUFTSwk9IDB4RkZGRiwKKwlWSUFfUk5HX0NIVU5LXzEJCT0gMHgwMywJLyogOCByYW5kIGJpdHMsIDMyIHN0b3JlZCBiaXRzICovCisJVklBX1JOR19DSFVOS18xX01BU0sJPSAweEZGLAorfTsKKworc3RhdGljIHUzMiB2aWFfcm5nX2RhdHVtOworCisvKgorICogSW52ZXN0aWdhdGUgdXNpbmcgdGhlICdyZXAnIHByZWZpeCB0byBvYnRhaW4gMzIgYml0cyBvZiByYW5kb20gZGF0YQorICogaW4gb25lIGluc24uICBUaGUgdXBzaWRlIGlzIHBvdGVudGlhbGx5IGJldHRlciBwZXJmb3JtYW5jZS4gIFRoZQorICogZG93bnNpZGUgaXMgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gYmVjb21lcyBubyBsb25nZXIgYXRvbWljLiAgRHVlIHRvCisgKiB0aGlzLCBqdXN0IGxpa2UgZmFtaWxpYXIgaXNzdWVzIHdpdGggL2Rldi9yYW5kb20gaXRzZWxmLCB0aGUgd29yc3QKKyAqIGNhc2Ugb2YgYSAncmVwIHhzdG9yZScgY291bGQgcG90ZW50aWFsbHkgcGF1c2UgYSBjcHUgZm9yIGFuCisgKiB1bnJlYXNvbmFibHkgbG9uZyB0aW1lLiAgSW4gcHJhY3RpY2UsIHRoaXMgY29uZGl0aW9uIHdvdWxkIGxpa2VseQorICogb25seSBvY2N1ciB3aGVuIHRoZSBoYXJkd2FyZSBpcyBmYWlsaW5nLiAgKG9yIHNvIHdlIGhvcGUgOikpCisgKgorICogQW5vdGhlciBwb3NzaWJsZSBwZXJmb3JtYW5jZSBib29zdCBtYXkgY29tZSBmcm9tIHNpbXBseSBidWZmZXJpbmcKKyAqIHVudGlsIHdlIGhhdmUgNCBieXRlcywgdGh1cyByZXR1cm5pbmcgYSB1MzIgYXQgYSB0aW1lLAorICogaW5zdGVhZCBvZiB0aGUgY3VycmVudCB1OC1hdC1hLXRpbWUuCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgeHN0b3JlKHUzMiAqYWRkciwgdTMyIGVkeF9pbikKK3sKKwl1MzIgZWF4X291dDsKKworCWFzbSgiLmJ5dGUgMHgwRiwweEE3LDB4QzAgLyogeHN0b3JlICUlZWRpIChhZGRyPSUwKSAqLyIKKwkJOiI9bSIoKmFkZHIpLCAiPWEiKGVheF9vdXQpCisJCToiRCIoYWRkciksICJkIihlZHhfaW4pKTsKKworCXJldHVybiBlYXhfb3V0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHZpYV9kYXRhX3ByZXNlbnQodm9pZCkKK3sKKwl1MzIgYnl0ZXNfb3V0OworCisJLyogV2UgY2hvb3NlIHRoZSByZWNvbW1lbmRlZCAxLWJ5dGUtcGVyLWluc3RydWN0aW9uIFJORyByYXRlLAorCSAqIGZvciBncmVhdGVyIHJhbmRvbW5lc3MgYXQgdGhlIGV4cGVuc2Ugb2Ygc3BlZWQuICBMYXJnZXIKKwkgKiB2YWx1ZXMgMiwgNCwgb3IgOCBieXRlcy1wZXItaW5zdHJ1Y3Rpb24geWllbGQgZ3JlYXRlcgorCSAqIHNwZWVkIGF0IGxlc3NlciByYW5kb21uZXNzLgorCSAqCisJICogSWYgeW91IGNoYW5nZSB0aGlzIHRvIGFub3RoZXIgVklBX0NIVU5LX24sIHlvdSBtdXN0IGFsc28KKwkgKiBjaGFuZ2UgdGhlIC0+bl9ieXRlcyB2YWx1ZXMgaW4gcm5nX3ZlbmRvcl9vcHNbXSB0YWJsZXMuCisJICogVklBX0NIVU5LXzggcmVxdWlyZXMgZnVydGhlciBjb2RlIGNoYW5nZXMuCisJICoKKwkgKiBBIGNvcHkgb2YgTVNSX1ZJQV9STkcgaXMgcGxhY2VkIGluIGVheF9vdXQgd2hlbiB4c3RvcmUKKwkgKiBjb21wbGV0ZXMuCisJICovCisJdmlhX3JuZ19kYXR1bSA9IDA7IC8qIHBhcmFub2lhLCBub3QgcmVhbGx5IG5lY2Vzc2FyeSAqLworCWJ5dGVzX291dCA9IHhzdG9yZSgmdmlhX3JuZ19kYXR1bSwgVklBX1JOR19DSFVOS18xKSAmIFZJQV9YU1RPUkVfQ05UX01BU0s7CisJaWYgKGJ5dGVzX291dCA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdTMyIHZpYV9kYXRhX3JlYWQodm9pZCkKK3sKKwlyZXR1cm4gdmlhX3JuZ19kYXR1bTsKK30KKworc3RhdGljIGludCBfX2luaXQgdmlhX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgbG8sIGhpLCBvbGRfbG87CisKKwkvKiBDb250cm9sIHRoZSBSTkcgdmlhIE1TUi4gIFRyZWFkIGxpZ2h0bHkgYW5kIHBheSB2ZXJ5IGNsb3NlCisJICogY2xvc2UgYXR0ZW50aW9uIHRvIHZhbHVlcyB3cml0dGVuLCBhcyB0aGUgcmVzZXJ2ZWQgZmllbGRzCisJICogYXJlIGRvY3VtZW50ZWQgdG8gYmUgInVuZGVmaW5lZCBhbmQgdW5wcmVkaWN0YWJsZSI7IGJ1dCBpdAorCSAqIGRvZXMgbm90IHNheSB0byB3cml0ZSB0aGVtIGFzIHplcm8sIHNvIEkgbWFrZSBhIGd1ZXNzIHRoYXQKKwkgKiB3ZSByZXN0b3JlIHRoZSB2YWx1ZXMgd2UgZmluZCBpbiB0aGUgcmVnaXN0ZXIuCisJICovCisJcmRtc3IoTVNSX1ZJQV9STkcsIGxvLCBoaSk7CisKKwlvbGRfbG8gPSBsbzsKKwlsbyAmPSB+KDB4N2YgPDwgVklBX1NUUkZJTFRfQ05UX1NISUZUKTsKKwlsbyAmPSB+VklBX1hTVE9SRV9DTlRfTUFTSzsKKwlsbyAmPSB+KFZJQV9TVFJGSUxUX0VOQUJMRSB8IFZJQV9TVFJGSUxUX0ZBSUwgfCBWSUFfUkFXQklUU19FTkFCTEUpOworCWxvIHw9IFZJQV9STkdfRU5BQkxFOworCisJaWYgKGxvICE9IG9sZF9sbykKKwkJd3Jtc3IoTVNSX1ZJQV9STkcsIGxvLCBoaSk7CisKKwkvKiBwZXJoYXBzLXVubmVjZXNzYXJ5IHNhbml0eSBjaGVjazsgcmVtb3ZlIGFmdGVyIHRlc3RpbmcgaWYKKwkgICB1bm5lZWRlZCAqLworCXJkbXNyKE1TUl9WSUFfUk5HLCBsbywgaGkpOworCWlmICgobG8gJiBWSUFfUk5HX0VOQUJMRSkgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgZW5hYmxlIFZJQSBDMyBSTkcsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9jbGVhbnVwKHZvaWQpCit7CisJLyogZG8gbm90aGluZyAqLworfQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogL2Rldi9od3JhbmRvbSBjaGFyYWN0ZXIgZGV2aWNlIGhhbmRsaW5nIChtYWpvciAxMCwgbWlub3IgMTgzKQorICoKKyAqLworCitzdGF0aWMgaW50IHJuZ19kZXZfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJLyogZW5mb3JjZSByZWFkLW9ubHkgYWNjZXNzIHRvIHRoaXMgY2hyZGV2ICovCisJaWYgKChmaWxwLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHNzaXplX3Qgcm5nX2Rldl9yZWFkIChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUsCisJCQkJbG9mZl90ICogb2ZmcCkKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJuZ19sb2NrKTsKKwl1bnNpZ25lZCBpbnQgaGF2ZV9kYXRhOworCXUzMiBkYXRhID0gMDsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwl3aGlsZSAoc2l6ZSkgeworCQlzcGluX2xvY2soJnJuZ19sb2NrKTsKKworCQloYXZlX2RhdGEgPSAwOworCQlpZiAocm5nX29wcy0+ZGF0YV9wcmVzZW50KCkpIHsKKwkJCWRhdGEgPSBybmdfb3BzLT5kYXRhX3JlYWQoKTsKKwkJCWhhdmVfZGF0YSA9IHJuZ19vcHMtPm5fYnl0ZXM7CisJCX0KKworCQlzcGluX3VubG9jayAoJnJuZ19sb2NrKTsKKworCQl3aGlsZSAoaGF2ZV9kYXRhICYmIHNpemUpIHsKKwkJCWlmIChwdXRfdXNlcigodTgpZGF0YSwgYnVmKyspKSB7CisJCQkJcmV0ID0gcmV0ID8gOiAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJc2l6ZS0tOworCQkJcmV0Kys7CisJCQloYXZlX2RhdGEtLTsKKwkJCWRhdGE+Pj04OworCQl9CisKKwkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIHJldCA/IDogLUVBR0FJTjsKKworCQlpZihuZWVkX3Jlc2NoZWQoKSkKKwkJeworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9CisJCWVsc2UKKwkJCXVkZWxheSgyMDApOwkvKiBGSVhNRTogV2UgY291bGQgcG9sbCBmb3IgMjUwdVMgPz8gKi8KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKQorCQkJcmV0dXJuIHJldCA/IDogLUVSRVNUQVJUU1lTOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKKworLyoKKyAqIHJuZ19pbml0X29uZSAtIGxvb2sgZm9yIGFuZCBhdHRlbXB0IHRvIGluaXQgYSBzaW5nbGUgUk5HCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJuZ19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgcmM7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0KHJuZ19vcHMgIT0gTlVMTCk7CisKKwlyYyA9IHJuZ19vcHMtPmluaXQoZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCXJjID0gbWlzY19yZWdpc3RlciAoJnJuZ19taXNjZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIm1pc2MgZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX291dF9jbGVhbnVwX2h3OworCX0KKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfY2xlYW51cF9odzoKKwlybmdfb3BzLT5jbGVhbnVwKCk7CitlcnJfb3V0OgorCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworCitNT0RVTEVfQVVUSE9SKCJUaGUgTGludXggS2VybmVsIHRlYW0iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSC9XIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChSTkcpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qCisgKiBybmdfaW5pdCAtIGluaXRpYWxpemUgUk5HIG1vZHVsZQorICovCitzdGF0aWMgaW50IF9faW5pdCBybmdfaW5pdCAodm9pZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQ7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJLyogUHJvYmUgZm9yIEludGVsLCBBTUQgUk5HcyAqLworCWZvcl9lYWNoX3BjaV9kZXYocGRldikgeworCQllbnQgPSBwY2lfbWF0Y2hfZGV2aWNlIChybmdfcGNpX3RibCwgcGRldik7CisJCWlmIChlbnQpIHsKKwkJCXJuZ19vcHMgPSAmcm5nX3ZlbmRvcl9vcHNbZW50LT5kcml2ZXJfZGF0YV07CisJCQlnb3RvIG1hdGNoOworCQl9CisJfQorCisjaWZkZWYgX19pMzg2X18KKwkvKiBQcm9iZSBmb3IgVklBIFJORyAqLworCWlmIChjcHVfaGFzX3hzdG9yZSkgeworCQlybmdfb3BzID0gJnJuZ192ZW5kb3Jfb3BzW3JuZ19od192aWFdOworCQlwZGV2ID0gTlVMTDsKKwkJZ290byBtYXRjaDsKKwl9CisjZW5kaWYKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVOT0RFVlxuIik7CisJcmV0dXJuIC1FTk9ERVY7CisKK21hdGNoOgorCXJjID0gcm5nX2luaXRfb25lIChwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXByX2luZm8oIFJOR19EUklWRVJfTkFNRSAiIGxvYWRlZFxuIik7CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBybmdfaW5pdCAtIHNodXRkb3duIFJORyBtb2R1bGUKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHJuZ19jbGVhbnVwICh2b2lkKQoreworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwltaXNjX2RlcmVnaXN0ZXIgKCZybmdfbWlzY2Rldik7CisKKwlpZiAocm5nX29wcy0+Y2xlYW51cCkKKwkJcm5nX29wcy0+Y2xlYW51cCgpOworCisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKK21vZHVsZV9pbml0IChybmdfaW5pdCk7Cittb2R1bGVfZXhpdCAocm5nX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2k4ay5jIGIvZHJpdmVycy9jaGFyL2k4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTE5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaThrLmMKQEAgLTAsMCArMSw3ODggQEAKKy8qCisgKiBpOGsuYyAtLSBMaW51eCBkcml2ZXIgZm9yIGFjY2Vzc2luZyB0aGUgU01NIEJJT1Mgb24gRGVsbCBsYXB0b3BzLgorICoJICAgIFNlZSBodHRwOi8vd3d3LmRlYmlhbi5vcmcvfmR6L2k4ay8gZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqCSAgICBhbmQgZm9yIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAgTWFzc2ltbyBEYWwgWm90dG8gPGR6QGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvaThrLmg+CisKKyNkZWZpbmUgSThLX1ZFUlNJT04JCSIxLjEzIDE0LzA1LzIwMDIiCisKKyNkZWZpbmUgSThLX1NNTV9GTl9TVEFUVVMJMHgwMDI1CisjZGVmaW5lIEk4S19TTU1fUE9XRVJfU1RBVFVTCTB4MDA2OQorI2RlZmluZSBJOEtfU01NX1NFVF9GQU4JCTB4MDFhMworI2RlZmluZSBJOEtfU01NX0dFVF9GQU4JCTB4MDBhMworI2RlZmluZSBJOEtfU01NX0dFVF9TUEVFRAkweDAyYTMKKyNkZWZpbmUgSThLX1NNTV9HRVRfVEVNUAkweDEwYTMKKyNkZWZpbmUgSThLX1NNTV9HRVRfREVMTF9TSUcJMHhmZmEzCisjZGVmaW5lIEk4S19TTU1fQklPU19WRVJTSU9OCTB4MDBhNgorCisjZGVmaW5lIEk4S19GQU5fTVVMVAkJMzAKKyNkZWZpbmUgSThLX01BWF9URU1QCQkxMjcKKworI2RlZmluZSBJOEtfRk5fTk9ORQkJMHgwMAorI2RlZmluZSBJOEtfRk5fVVAJCTB4MDEKKyNkZWZpbmUgSThLX0ZOX0RPV04JCTB4MDIKKyNkZWZpbmUgSThLX0ZOX01VVEUJCTB4MDQKKyNkZWZpbmUgSThLX0ZOX01BU0sJCTB4MDcKKyNkZWZpbmUgSThLX0ZOX1NISUZUCQk4CisKKyNkZWZpbmUgSThLX1BPV0VSX0FDCQkweDA1CisjZGVmaW5lIEk4S19QT1dFUl9CQVRURVJZCTB4MDEKKworI2RlZmluZSBJOEtfVEVNUEVSQVRVUkVfQlVHCTEKKworI2RlZmluZSBERUxMX1NJR05BVFVSRQkJIkRlbGwgQ29tcHV0ZXIiCisKK3N0YXRpYyBjaGFyICpzdXBwb3J0ZWRfbW9kZWxzW10gPSB7CisgICAgIkluc3Bpcm9uIiwKKyAgICAiTGF0aXR1ZGUiLAorICAgIE5VTEwKK307CisKK3N0YXRpYyBjaGFyIHN5c3RlbV92ZW5kb3JbNDhdID0gIj8iOworc3RhdGljIGNoYXIgcHJvZHVjdF9uYW1lIFs0OF0gPSAiPyI7CitzdGF0aWMgY2hhciBiaW9zX3ZlcnNpb24gWzRdICA9ICI/IjsKK3N0YXRpYyBjaGFyIHNlcmlhbF9udW1iZXJbMTZdID0gIj8iOworCitNT0RVTEVfQVVUSE9SKCJNYXNzaW1vIERhbCBab3R0byAoZHpAZGViaWFuLm9yZykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBhY2Nlc3NpbmcgU01NIEJJT1Mgb24gRGVsbCBsYXB0b3BzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgZm9yY2U7Cittb2R1bGVfcGFyYW0oZm9yY2UsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZSwgIkZvcmNlIGxvYWRpbmcgd2l0aG91dCBjaGVja2luZyBmb3Igc3VwcG9ydGVkIG1vZGVscyIpOworCitzdGF0aWMgaW50IHJlc3RyaWN0ZWQ7Cittb2R1bGVfcGFyYW0ocmVzdHJpY3RlZCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlc3RyaWN0ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQiKTsKKworc3RhdGljIGludCBwb3dlcl9zdGF0dXM7Cittb2R1bGVfcGFyYW0ocG93ZXJfc3RhdHVzLCBib29sLCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG93ZXJfc3RhdHVzLCAiUmVwb3J0IHBvd2VyIHN0YXR1cyBpbiAvcHJvYy9pOGsiKTsKKworc3RhdGljIHNzaXplX3QgaThrX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitzdGF0aWMgaW50IGk4a19pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAorCQkgICAgIHVuc2lnbmVkIGxvbmcpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpOGtfZm9wcyA9IHsKKyAgICAucmVhZAk9IGk4a19yZWFkLAorICAgIC5pb2N0bAk9IGk4a19pb2N0bCwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgZWF4OworICAgIHVuc2lnbmVkIGludCBlYnggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgIHVuc2lnbmVkIGludCBlY3ggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgIHVuc2lnbmVkIGludCBlZHggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgIHVuc2lnbmVkIGludCBlc2kgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgIHVuc2lnbmVkIGludCBlZGkgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBTTU1SZWdpc3RlcnM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1OAl0eXBlOworICAgIHU4CWxlbmd0aDsKKyAgICB1MTYJaGFuZGxlOworfSBETUlIZWFkZXI7CisKKy8qCisgKiBDYWxsIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlIEJJT1MuIENvZGUgcHJvdmlkZWQgYnkgSm9uYXRoYW4gQnV6emFyZC4KKyAqLworc3RhdGljIGludCBpOGtfc21tKFNNTVJlZ2lzdGVycyAqcmVncykKK3sKKyAgICBpbnQgcmM7CisgICAgaW50IGVheCA9IHJlZ3MtPmVheDsKKworICAgIGFzbSgicHVzaGwgJSVlYXhcblx0IiBcCisJIm1vdmwgMCglJWVheCksJSVlZHhcblx0IiBcCisJInB1c2ggJSVlZHhcblx0IiBcCisJIm1vdmwgNCglJWVheCksJSVlYnhcblx0IiBcCisJIm1vdmwgOCglJWVheCksJSVlY3hcblx0IiBcCisJIm1vdmwgMTIoJSVlYXgpLCUlZWR4XG5cdCIgXAorCSJtb3ZsIDE2KCUlZWF4KSwlJWVzaVxuXHQiIFwKKwkibW92bCAyMCglJWVheCksJSVlZGlcblx0IiBcCisJInBvcGwgJSVlYXhcblx0IiBcCisJIm91dCAlJWFsLCQweGIyXG5cdCIgXAorCSJvdXQgJSVhbCwkMHg4NFxuXHQiIFwKKwkieGNoZ2wgJSVlYXgsKCUlZXNwKVxuXHQiCisJIm1vdmwgJSVlYngsNCglJWVheClcblx0IiBcCisJIm1vdmwgJSVlY3gsOCglJWVheClcblx0IiBcCisJIm1vdmwgJSVlZHgsMTIoJSVlYXgpXG5cdCIgXAorCSJtb3ZsICUlZXNpLDE2KCUlZWF4KVxuXHQiIFwKKwkibW92bCAlJWVkaSwyMCglJWVheClcblx0IiBcCisJInBvcGwgJSVlZHhcblx0IiBcCisJIm1vdmwgJSVlZHgsMCglJWVheClcblx0IiBcCisJImxhaGZcblx0IiBcCisJInNocmwgJDgsJSVlYXhcblx0IiBcCisJImFuZGwgJDEsJSVlYXhcbiIgXAorCTogIj1hIiAocmMpCisJOiAiYSIgKHJlZ3MpCisJOiAiJWVieCIsICIlZWN4IiwgIiVlZHgiLCAiJWVzaSIsICIlZWRpIiwgIm1lbW9yeSIpOworCisgICAgaWYgKChyYyAhPSAwKSB8fCAoKHJlZ3MtPmVheCAmIDB4ZmZmZikgPT0gMHhmZmZmKSB8fCAocmVncy0+ZWF4ID09IGVheCkpIHsKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgdGhlIGJpb3MgdmVyc2lvbi4gUmV0dXJuIHRoZSB2ZXJzaW9uIGFzIGFuIGludGVnZXIgY29ycmVzcG9uZGluZworICogdG8gdGhlIGFzY2lpIHZhbHVlLCBmb3IgZXhhbXBsZSAiQTE3IiBpcyByZXR1cm5lZCBhcyAweDAwNDEzMTM3LgorICovCitzdGF0aWMgaW50IGk4a19nZXRfYmlvc192ZXJzaW9uKHZvaWQpCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fQklPU19WRVJTSU9OOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmVncy5lYXg7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBtYWNoaW5lIGlkLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfc2VyaWFsX251bWJlcih1bnNpZ25lZCBjaGFyICpidWZmKQoreworICAgIHN0cmxjcHkoYnVmZiwgc2VyaWFsX251bWJlciwgc2l6ZW9mKHNlcmlhbF9udW1iZXIpKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgdGhlIEZuIGtleSBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9mbl9zdGF0dXModm9pZCkKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9GTl9TVEFUVVM7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHN3aXRjaCAoKHJlZ3MuZWF4ID4+IEk4S19GTl9TSElGVCkgJiBJOEtfRk5fTUFTSykgeworICAgIGNhc2UgSThLX0ZOX1VQOgorCXJldHVybiBJOEtfVk9MX1VQOworICAgIGNhc2UgSThLX0ZOX0RPV046CisJcmV0dXJuIEk4S19WT0xfRE9XTjsKKyAgICBjYXNlIEk4S19GTl9NVVRFOgorCXJldHVybiBJOEtfVk9MX01VVEU7CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qCisgKiBSZWFkIHRoZSBwb3dlciBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9wb3dlcl9zdGF0dXModm9pZCkKK3sKKyAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIGludCByYzsKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9QT1dFUl9TVEFUVVM7CisgICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHN3aXRjaCAocmVncy5lYXggJiAweGZmKSB7CisgICAgY2FzZSBJOEtfUE9XRVJfQUM6CisJcmV0dXJuIEk4S19BQzsKKyAgICBkZWZhdWx0OgorCXJldHVybiBJOEtfQkFUVEVSWTsKKyAgICB9Cit9CisKKy8qCisgKiBSZWFkIHRoZSBmYW4gc3RhdHVzLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfZmFuX3N0YXR1cyhpbnQgZmFuKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX0dFVF9GQU47CisgICAgcmVncy5lYnggPSBmYW4gJiAweGZmOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gKHJlZ3MuZWF4ICYgMHhmZik7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBmYW4gc3BlZWQgaW4gUlBNLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfZmFuX3NwZWVkKGludCBmYW4pCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisKKyAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX1NQRUVEOworICAgIHJlZ3MuZWJ4ID0gZmFuICYgMHhmZjsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIChyZWdzLmVheCAmIDB4ZmZmZikgKiBJOEtfRkFOX01VTFQ7Cit9CisKKy8qCisgKiBTZXQgdGhlIGZhbiBzcGVlZCAob2ZmLCBsb3csIGhpZ2gpLiBSZXR1cm5zIHRoZSBuZXcgZmFuIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBpOGtfc2V0X2ZhbihpbnQgZmFuLCBpbnQgc3BlZWQpCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisKKyAgICBzcGVlZCA9IChzcGVlZCA8IDApID8gMCA6ICgoc3BlZWQgPiBJOEtfRkFOX01BWCkgPyBJOEtfRkFOX01BWCA6IHNwZWVkKTsKKworICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9TRVRfRkFOOworICAgIHJlZ3MuZWJ4ID0gKGZhbiAmIDB4ZmYpIHwgKHNwZWVkIDw8IDgpOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gKGk4a19nZXRfZmFuX3N0YXR1cyhmYW4pKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIGNwdSB0ZW1wZXJhdHVyZS4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X2NwdV90ZW1wKHZvaWQpCit7CisgICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgcmM7CisgICAgaW50IHRlbXA7CisKKyNpZmRlZiBJOEtfVEVNUEVSQVRVUkVfQlVHCisgICAgc3RhdGljIGludCBwcmV2ID0gMDsKKyNlbmRpZgorCisgICAgcmVncy5lYXggPSBJOEtfU01NX0dFVF9URU1QOworICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgeworCXJldHVybiByYzsKKyAgICB9CisgICAgdGVtcCA9IHJlZ3MuZWF4ICYgMHhmZjsKKworI2lmZGVmIEk4S19URU1QRVJBVFVSRV9CVUcKKyAgICAvKgorICAgICAqIFNvbWV0aW1lcyB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yIHJldHVybnMgMHg5OSwgd2hpY2ggaXMgb3V0IG9mIHJhbmdlLgorICAgICAqIEluIHRoaXMgY2FzZSB3ZSByZXR1cm4gKG9uY2UpIHRoZSBwcmV2aW91cyBjYWNoZWQgdmFsdWUuIEZvciBleGFtcGxlOgorICAgICAjIDEwMDM2NTUxMzcgMDAwMDAwNTggMDAwMDVhNGIKKyAgICAgIyAxMDAzNjU1MTM4IDAwMDAwMDk5IDAwMDAzYTgwIDwtLS0gMHg5OSA9IDE1MyBkZWdyZWVzCisgICAgICMgMTAwMzY1NTEzOSAwMDAwMDA1NCAwMDAwNWM1MgorICAgICAqLworICAgIGlmICh0ZW1wID4gSThLX01BWF9URU1QKSB7CisJdGVtcCA9IHByZXY7CisJcHJldiA9IEk4S19NQVhfVEVNUDsKKyAgICB9IGVsc2UgeworCXByZXYgPSB0ZW1wOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbnQgaThrX2dldF9kZWxsX3NpZ25hdHVyZSh2b2lkKQoreworICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgaW50IHJjOworCisgICAgcmVncy5lYXggPSBJOEtfU01NX0dFVF9ERUxMX1NJRzsKKyAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKKwlyZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKChyZWdzLmVheCA9PSAxMTQ1NjUxNTI3KSAmJiAocmVncy5lZHggPT0gMTE0NTM5MjIwNCkpIHsKKwlyZXR1cm4gMDsKKyAgICB9IGVsc2UgeworCXJldHVybiAtMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaThrX2lvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICBpbnQgdmFsOworICAgIGludCBzcGVlZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZbMTZdOworICAgIGludCBfX3VzZXIgKmFyZ3AgPSAoaW50IF9fdXNlciAqKWFyZzsKKworICAgIGlmICghYXJncCkKKwlyZXR1cm4gLUVJTlZBTDsKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBJOEtfQklPU19WRVJTSU9OOgorCXZhbCA9IGk4a19nZXRfYmlvc192ZXJzaW9uKCk7CisJYnJlYWs7CisKKyAgICBjYXNlIEk4S19NQUNISU5FX0lEOgorCW1lbXNldChidWZmLCAwLCAxNik7CisJdmFsID0gaThrX2dldF9zZXJpYWxfbnVtYmVyKGJ1ZmYpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfRk5fU1RBVFVTOgorCXZhbCA9IGk4a19nZXRfZm5fc3RhdHVzKCk7CisJYnJlYWs7CisKKyAgICBjYXNlIEk4S19QT1dFUl9TVEFUVVM6CisJdmFsID0gaThrX2dldF9wb3dlcl9zdGF0dXMoKTsKKwlicmVhazsKKworICAgIGNhc2UgSThLX0dFVF9URU1QOgorCXZhbCA9IGk4a19nZXRfY3B1X3RlbXAoKTsKKwlicmVhazsKKworICAgIGNhc2UgSThLX0dFVF9TUEVFRDoKKwlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwl2YWwgPSBpOGtfZ2V0X2Zhbl9zcGVlZCh2YWwpOworCWJyZWFrOworCisgICAgY2FzZSBJOEtfR0VUX0ZBTjoKKwlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKSB7CisJICAgIHJldHVybiAtRUZBVUxUOworCX0KKwl2YWwgPSBpOGtfZ2V0X2Zhbl9zdGF0dXModmFsKTsKKwlicmVhazsKKworICAgIGNhc2UgSThLX1NFVF9GQU46CisJaWYgKHJlc3RyaWN0ZWQgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkgICAgcmV0dXJuIC1FUEVSTTsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKSkgeworCSAgICByZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZzcGVlZCwgYXJncCsxLCBzaXplb2YoaW50KSkpIHsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorCXZhbCA9IGk4a19zZXRfZmFuKHZhbCwgc3BlZWQpOworCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAodmFsIDwgMCkgeworCXJldHVybiB2YWw7CisgICAgfQorCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIEk4S19CSU9TX1ZFUlNJT046CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsLCA0KSkgeworCSAgICByZXR1cm4gLUVGQVVMVDsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBJOEtfTUFDSElORV9JRDoKKwlpZiAoY29weV90b191c2VyKGFyZ3AsIGJ1ZmYsIDE2KSkgeworCSAgICByZXR1cm4gLUVGQVVMVDsKKwl9CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwsIHNpemVvZihpbnQpKSkgeworCSAgICByZXR1cm4gLUVGQVVMVDsKKwl9CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcmludCB0aGUgaW5mb3JtYXRpb24gZm9yIC9wcm9jL2k4ay4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsIGludCBsZW5ndGgpCit7CisgICAgaW50IG4sIGZuX2tleSwgY3B1X3RlbXAsIGFjX3Bvd2VyOworICAgIGludCBsZWZ0X2ZhbiwgcmlnaHRfZmFuLCBsZWZ0X3NwZWVkLCByaWdodF9zcGVlZDsKKworICAgIGNwdV90ZW1wICAgICA9IGk4a19nZXRfY3B1X3RlbXAoKTsJCQkvKiAxMTEwMCC1cyAqLworICAgIGxlZnRfZmFuICAgICA9IGk4a19nZXRfZmFuX3N0YXR1cyhJOEtfRkFOX0xFRlQpOwkvKiAgIDU4MCC1cyAqLworICAgIHJpZ2h0X2ZhbiAgICA9IGk4a19nZXRfZmFuX3N0YXR1cyhJOEtfRkFOX1JJR0hUKTsJLyogICA1ODAgtXMgKi8KKyAgICBsZWZ0X3NwZWVkICAgPSBpOGtfZ2V0X2Zhbl9zcGVlZChJOEtfRkFOX0xFRlQpOwkvKiAgIDU4MCC1cyAqLworICAgIHJpZ2h0X3NwZWVkICA9IGk4a19nZXRfZmFuX3NwZWVkKEk4S19GQU5fUklHSFQpOwkvKiAgIDU4MCC1cyAqLworICAgIGZuX2tleSAgICAgICA9IGk4a19nZXRfZm5fc3RhdHVzKCk7CQkJLyogICA3NTAgtXMgKi8KKyAgICBpZiAocG93ZXJfc3RhdHVzKSB7CisJYWNfcG93ZXIgPSBpOGtfZ2V0X3Bvd2VyX3N0YXR1cygpOwkJLyogMTQ3MDAgtXMgKi8KKyAgICB9IGVsc2UgeworCWFjX3Bvd2VyID0gLTE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbmZvOgorICAgICAqCisgICAgICogMSkgIEZvcm1hdCB2ZXJzaW9uICh0aGlzIHdpbGwgY2hhbmdlIGlmIGZvcm1hdCBjaGFuZ2VzKQorICAgICAqIDIpICBCSU9TIHZlcnNpb24KKyAgICAgKiAzKSAgQklPUyBtYWNoaW5lIElECisgICAgICogNCkgIENwdSB0ZW1wZXJhdHVyZQorICAgICAqIDUpICBMZWZ0IGZhbiBzdGF0dXMKKyAgICAgKiA2KSAgUmlnaHQgZmFuIHN0YXR1cworICAgICAqIDcpICBMZWZ0IGZhbiBzcGVlZAorICAgICAqIDgpICBSaWdodCBmYW4gc3BlZWQKKyAgICAgKiA5KSAgQUMgcG93ZXIKKyAgICAgKiAxMCkgRm4gS2V5IHN0YXR1cworICAgICAqLworICAgIG4gPSBzcHJpbnRmKGJ1ZmZlciwgIiVzICVzICVzICVkICVkICVkICVkICVkICVkICVkXG4iLAorCQlJOEtfUFJPQ19GTVQsCisJCWJpb3NfdmVyc2lvbiwKKwkJc2VyaWFsX251bWJlciwKKwkJY3B1X3RlbXAsCisJCWxlZnRfZmFuLAorCQlyaWdodF9mYW4sCisJCWxlZnRfc3BlZWQsCisJCXJpZ2h0X3NwZWVkLAorCQlhY19wb3dlciwKKwkJZm5fa2V5KTsKKworICAgIHJldHVybiBuOworfQorCitzdGF0aWMgc3NpemVfdCBpOGtfcmVhZChzdHJ1Y3QgZmlsZSAqZiwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGxlbiwgbG9mZl90ICpmcG9zKQoreworICAgIGludCBuOworICAgIGNoYXIgaW5mb1sxMjhdOworCisgICAgbiA9IGk4a19nZXRfaW5mbyhpbmZvLCBOVUxMLCAwLCAxMjgpOworICAgIGlmIChuIDw9IDApIHsKKwlyZXR1cm4gbjsKKyAgICB9CisKKyAgICBpZiAoKmZwb3MgPj0gbikgeworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICgoKmZwb3MgKyBsZW4pID49IG4pIHsKKwlsZW4gPSBuIC0gKmZwb3M7CisgICAgfQorCisgICAgaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGluZm8sIGxlbikgIT0gMCkgeworCXJldHVybiAtRUZBVUxUOworICAgIH0KKworICAgICpmcG9zICs9IGxlbjsKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgY2hhciogX19pbml0IHN0cmluZ190cmltKGNoYXIgKnMsIGludCBzaXplKQoreworICAgIGludCBsZW47CisgICAgY2hhciAqcDsKKworICAgIGlmICgobGVuID0gc3RybGVuKHMpKSA+IHNpemUpIHsKKwlsZW4gPSBzaXplOworICAgIH0KKworICAgIGZvciAocD1zK2xlbi0xOyBsZW4gJiYgKCpwPT0nICcpOyBsZW4tLSxwLS0pIHsKKwkqcCA9ICdcMCc7CisgICAgfQorCisgICAgcmV0dXJuIHM7Cit9CisKKy8qIERNSSBjb2RlLCBzdG9sZW4gZnJvbSBhcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMgKi8KKworLyoKKyAqIHw8LS0gZG1pLT5sZW5ndGggLS0+fAorICogfCAgICAgICAgICAgICAgICAgICB8CisgKiB8ZG1pIGhlYWRlciAgICBzPU4gIHwgc3RyaW5nMSxcMCwgLi4uLCBzdHJpbmdOLFwwLCAuLi4sIFwwCisgKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKi8KK3N0YXRpYyBjaGFyKiBfX2luaXQgZG1pX3N0cmluZyhETUlIZWFkZXIgKmRtaSwgdTggcykKK3sKKyAgICB1OCAqcDsKKworICAgIGlmICghcykgeworCXJldHVybiAiIjsKKyAgICB9CisgICAgcy0tOworCisgICAgcCA9ICh1OCAqKWRtaSArIGRtaS0+bGVuZ3RoOworICAgIHdoaWxlIChzID4gMCkgeworCXAgKz0gc3RybGVuKHApOworCXArKzsKKwlzLS07CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkbWlfZGVjb2RlKERNSUhlYWRlciAqZG1pKQoreworICAgIHU4ICpkYXRhID0gKHU4ICopIGRtaTsKKyAgICBjaGFyICpwOworCisjaWZkZWYgSThLX0RFQlVHCisgICAgaW50IGk7CisgICAgcHJpbnRrKCIlMDh4ICIsIChpbnQpZGF0YSk7CisgICAgZm9yIChpPTA7IGk8ZGF0YVsxXSAmJiBpPDY0OyBpKyspIHsKKwlwcmludGsoIiUwMnggIiwgZGF0YVtpXSk7CisgICAgfQorICAgIHByaW50aygiXG4iKTsKKyNlbmRpZgorCisgICAgc3dpdGNoIChkbWktPnR5cGUpIHsKKyAgICBjYXNlICAwOgkvKiBCSU9TIEluZm9ybWF0aW9uICovCisJcCA9IGRtaV9zdHJpbmcoZG1pLGRhdGFbNV0pOworCWlmICgqcCkgeworCSAgICBzdHJsY3B5KGJpb3NfdmVyc2lvbiwgcCwgc2l6ZW9mKGJpb3NfdmVyc2lvbikpOworCSAgICBzdHJpbmdfdHJpbShiaW9zX3ZlcnNpb24sIHNpemVvZihiaW9zX3ZlcnNpb24pKTsKKwl9CisJYnJlYWs7CQorICAgIGNhc2UgMToJLyogU3lzdGVtIEluZm9ybWF0aW9uICovCisJcCA9IGRtaV9zdHJpbmcoZG1pLGRhdGFbNF0pOworCWlmICgqcCkgeworCSAgICBzdHJsY3B5KHN5c3RlbV92ZW5kb3IsIHAsIHNpemVvZihzeXN0ZW1fdmVuZG9yKSk7CisJICAgIHN0cmluZ190cmltKHN5c3RlbV92ZW5kb3IsIHNpemVvZihzeXN0ZW1fdmVuZG9yKSk7CisJfQorCXAgPSBkbWlfc3RyaW5nKGRtaSxkYXRhWzVdKTsKKwlpZiAoKnApIHsKKwkgICAgc3RybGNweShwcm9kdWN0X25hbWUsIHAsIHNpemVvZihwcm9kdWN0X25hbWUpKTsKKwkgICAgc3RyaW5nX3RyaW0ocHJvZHVjdF9uYW1lLCBzaXplb2YocHJvZHVjdF9uYW1lKSk7CisJfQorCXAgPSBkbWlfc3RyaW5nKGRtaSxkYXRhWzddKTsKKwlpZiAoKnApIHsKKwkgICAgc3RybGNweShzZXJpYWxfbnVtYmVyLCBwLCBzaXplb2Yoc2VyaWFsX251bWJlcikpOworCSAgICBzdHJpbmdfdHJpbShzZXJpYWxfbnVtYmVyLCBzaXplb2Yoc2VyaWFsX251bWJlcikpOworCX0KKwlicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRtaV90YWJsZSh1MzIgYmFzZSwgaW50IGxlbiwgaW50IG51bSwgdm9pZCAoKmZuKShETUlIZWFkZXIqKSkKK3sKKyAgICB1OCAqYnVmOworICAgIHU4ICpkYXRhOworICAgIERNSUhlYWRlciAqZG1pOworICAgIGludCBpID0gMTsKKworICAgIGJ1ZiA9IGlvcmVtYXAoYmFzZSwgbGVuKTsKKyAgICBpZiAoYnVmID09IE5VTEwpIHsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGRhdGEgPSBidWY7CisKKyAgICAvKgorICAgICAqIFN0b3Agd2hlbiB3ZSBzZWUgYWwgdGhlIGl0ZW1zIHRoZSB0YWJsZSBjbGFpbWVkIHRvIGhhdmUKKyAgICAgKiBvciB3ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHRhYmxlIChhbHNvIGhhcHBlbnMpCisgICAgICovCisgICAgd2hpbGUgKChpPG51bSkgJiYgKChkYXRhLWJ1ZikgPCBsZW4pKSB7CisJZG1pID0gKERNSUhlYWRlciAqKWRhdGE7CisJLyoKKwkgKiBBdm9pZCBtaXNwYXJzaW5nIGNydWQgaWYgdGhlIGxlbmd0aCBvZiB0aGUgbGFzdAorCSAqIHJlY29yZCBpcyBjcmFwCisJICovCisJaWYgKChkYXRhLWJ1ZitkbWktPmxlbmd0aCkgPj0gbGVuKSB7CisJICAgIGJyZWFrOworCX0KKwlmbihkbWkpOworCWRhdGEgKz0gZG1pLT5sZW5ndGg7CisJLyoKKwkgKiBEb24ndCBnbyBvZmYgdGhlIGVuZCBvZiB0aGUgZGF0YSBpZiB0aGVyZSBpcworCSAqIHN0dWZmIGxvb2tpbmcgbGlrZSBzdHJpbmcgZmlsbCBwYXN0IHRoZSBlbmQKKwkgKi8KKwl3aGlsZSAoKChkYXRhLWJ1ZikgPCBsZW4pICYmICgqZGF0YSB8fCBkYXRhWzFdKSkgeworCSAgICBkYXRhKys7CisJfQorCWRhdGEgKz0gMjsKKwlpKys7CisgICAgfQorICAgIGlvdW5tYXAoYnVmKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkbWlfaXRlcmF0ZSh2b2lkICgqZGVjb2RlKShETUlIZWFkZXIgKikpCit7CisJdW5zaWduZWQgY2hhciBidWZbMjBdOworCXZvaWQgX19pb21lbSAqcCA9IGlvcmVtYXAoMHhlMDAwMCwgMHgyMDAwMCksICpxOworCisJaWYgKCFwKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKHEgPSBwOyBxIDwgcCArIDB4MjAwMDA7IHEgKz0gMTYpIHsKKwkJbWVtY3B5X2Zyb21pbyhidWYsIHEsIDIwKTsKKwkJaWYgKG1lbWNtcChidWYsICJfRE1JXyIsIDUpPT0wKSB7CisJCQl1MTYgbnVtICA9IGJ1ZlsxM108PDggIHwgYnVmWzEyXTsKKwkJCXUxNiBsZW4gID0gYnVmIFs3XTw8OCAgfCBidWYgWzZdOworCQkJdTMyIGJhc2UgPSBidWZbMTFdPDwyNCB8IGJ1ZlsxMF08PDE2IHwgYnVmWzldPDw4IHwgYnVmWzhdOworI2lmZGVmIEk4S19ERUJVRworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JICVkLiVkIHByZXNlbnQuXG4iLAorCQkJICAgYnVmWzE0XT4+NCwgYnVmWzE0XSYweDBGKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVkIHN0cnVjdHVyZXMgb2NjdXB5aW5nICVkIGJ5dGVzLlxuIiwKKwkJCSAgIGJ1ZlsxM108PDggfCBidWZbMTJdLAorCQkJICAgYnVmIFs3XTw8OCB8IGJ1Zls2XSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJETUkgdGFibGUgYXQgMHglMDhYLlxuIiwKKwkJCSAgIGJ1ZlsxMV08PDI0IHwgYnVmWzEwXTw8MTYgfCBidWZbOV08PDggfCBidWZbOF0pOworI2VuZGlmCisJCQlpZiAoZG1pX3RhYmxlKGJhc2UsIGxlbiwgbnVtLCBkZWNvZGUpPT0wKSB7CisJCQkJaW91bm1hcChwKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlpb3VubWFwKHApOworCXJldHVybiAtMTsKK30KKy8qIGVuZCBvZiBETUkgY29kZSAqLworCisvKgorICogR2V0IERNSSBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIGludCBfX2luaXQgaThrX2RtaV9wcm9iZSh2b2lkKQoreworICAgIGNoYXIgKipwOworCisgICAgaWYgKGRtaV9pdGVyYXRlKGRtaV9kZWNvZGUpICE9IDApIHsKKwlwcmludGsoS0VSTl9JTkZPICJpOGs6IHVuYWJsZSB0byBnZXQgRE1JIGluZm9ybWF0aW9uXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBpZiAoc3RybmNtcChzeXN0ZW1fdmVuZG9yLERFTExfU0lHTkFUVVJFLHN0cmxlbihERUxMX1NJR05BVFVSRSkpICE9IDApIHsKKwlwcmludGsoS0VSTl9JTkZPICJpOGs6IG5vdCBydW5uaW5nIG9uIGEgRGVsbCBzeXN0ZW1cbiIpOworCXJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIGZvciAocD1zdXBwb3J0ZWRfbW9kZWxzOyA7IHArKykgeworCWlmICghKnApIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB1bnN1cHBvcnRlZCBtb2RlbDogJXNcbiIsIHByb2R1Y3RfbmFtZSk7CisJICAgIHJldHVybiAtRU5PREVWOworCX0KKwlpZiAoc3RybmNtcChwcm9kdWN0X25hbWUsKnAsc3RybGVuKCpwKSkgPT0gMCkgeworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9iZSBmb3IgdGhlIHByZXNlbmNlIG9mIGEgc3VwcG9ydGVkIGxhcHRvcC4KKyAqLworc3RhdGljIGludCBfX2luaXQgaThrX3Byb2JlKHZvaWQpCit7CisgICAgY2hhciBidWZmWzRdOworICAgIGludCB2ZXJzaW9uOworICAgIGludCBzbW1fZm91bmQgPSAwOworCisgICAgLyoKKyAgICAgKiBHZXQgRE1JIGluZm9ybWF0aW9uCisgICAgICovCisgICAgaWYgKGk4a19kbWlfcHJvYmUoKSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB2ZW5kb3I9JXMsIG1vZGVsPSVzLCB2ZXJzaW9uPSVzXG4iLAorCSAgICAgICBzeXN0ZW1fdmVuZG9yLCBwcm9kdWN0X25hbWUsIGJpb3NfdmVyc2lvbik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXQgU01NIERlbGwgc2lnbmF0dXJlCisgICAgICovCisgICAgaWYgKGk4a19nZXRfZGVsbF9zaWduYXR1cmUoKSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB1bmFibGUgdG8gZ2V0IFNNTSBEZWxsIHNpZ25hdHVyZVxuIik7CisgICAgfSBlbHNlIHsKKwlzbW1fZm91bmQgPSAxOworICAgIH0KKworICAgIC8qCisgICAgICogR2V0IFNNTSBCSU9TIHZlcnNpb24uCisgICAgICovCisgICAgdmVyc2lvbiA9IGk4a19nZXRfYmlvc192ZXJzaW9uKCk7CisgICAgaWYgKHZlcnNpb24gPD0gMCkgeworCXByaW50ayhLRVJOX0lORk8gImk4azogdW5hYmxlIHRvIGdldCBTTU0gQklPUyB2ZXJzaW9uXG4iKTsKKyAgICB9IGVsc2UgeworCXNtbV9mb3VuZCA9IDE7CisJYnVmZlswXSA9ICh2ZXJzaW9uID4+IDE2KSAmIDB4ZmY7CisJYnVmZlsxXSA9ICh2ZXJzaW9uID4+ICA4KSAmIDB4ZmY7CisJYnVmZlsyXSA9ICh2ZXJzaW9uKSAgICAgICAmIDB4ZmY7CisJYnVmZlszXSA9ICdcMCc7CisJLyoKKwkgKiBJZiBETUkgQklPUyB2ZXJzaW9uIGlzIHVua25vd24gdXNlIFNNTSBCSU9TIHZlcnNpb24uCisJICovCisJaWYgKGJpb3NfdmVyc2lvblswXSA9PSAnPycpIHsKKwkgICAgc3RyY3B5KGJpb3NfdmVyc2lvbiwgYnVmZik7CisJfQorCS8qCisJICogQ2hlY2sgaWYgdGhlIHR3byB2ZXJzaW9ucyBtYXRjaC4KKwkgKi8KKwlpZiAoc3RybmNtcChidWZmLGJpb3NfdmVyc2lvbixzaXplb2YoYmlvc192ZXJzaW9uKSkgIT0gMCkgeworCSAgICBwcmludGsoS0VSTl9JTkZPICJpOGs6IEJJT1MgdmVyc2lvbiBtaXNtYXRjaDogJXMgIT0gJXNcbiIsCisJCSAgIGJ1ZmYsIGJpb3NfdmVyc2lvbik7CisJfQorICAgIH0KKworICAgIGlmICghc21tX2ZvdW5kICYmICFmb3JjZSkgeworCXJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMKKyNlbmRpZgoraW50IF9faW5pdCBpOGtfaW5pdCh2b2lkKQoreworICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pOGs7CisKKyAgICAvKiBBcmUgd2UgcnVubmluZyBvbiBhbiBzdXBwb3J0ZWQgbGFwdG9wPyAqLworICAgIGlmIChpOGtfcHJvYmUoKSAhPSAwKSB7CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgLyogUmVnaXN0ZXIgdGhlIHByb2MgZW50cnkgKi8KKyAgICBwcm9jX2k4ayA9IGNyZWF0ZV9wcm9jX2luZm9fZW50cnkoImk4ayIsIDAsIE5VTEwsIGk4a19nZXRfaW5mbyk7CisgICAgaWYgKCFwcm9jX2k4aykgeworCXJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBwcm9jX2k4ay0+cHJvY19mb3BzID0gJmk4a19mb3BzOworICAgIHByb2NfaThrLT5vd25lciA9IFRISVNfTU9EVUxFOworCisgICAgcHJpbnRrKEtFUk5fSU5GTworCSAgICJEZWxsIGxhcHRvcCBTTU0gZHJpdmVyIHYlcyBNYXNzaW1vIERhbCBab3R0byAoZHpAZGViaWFuLm9yZylcbiIsCisJICAgSThLX1ZFUlNJT04pOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworICAgIHJldHVybiBpOGtfaW5pdCgpOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgLyogUmVtb3ZlIHRoZSBwcm9jIGVudHJ5ICovCisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImk4ayIsIE5VTEwpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiaThrOiBtb2R1bGUgdW5sb2FkZWRcbiIpOworfQorI2VuZGlmCisKKy8qIGVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyLmMgYi9kcml2ZXJzL2NoYXIvaXAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMTJmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcDIuYwpAQCAtMCwwICsxLDExMCBAQAorLy8gaXAyLmMKKy8vIFRoaXMgaXMgYSBkdW1teSBtb2R1bGUgdG8gbWFrZSB0aGUgZmlybXdhcmUgYXZhaWxhYmxlIHdoZW4gbmVlZGVkCisvLyBhbmQgYWxsb3dzIGl0IHRvIGJlIHVubG9hZGVkIHdoZW4gbm90LiBSdW1vciBpcyB0aGUgX19pbml0ZGF0YSAKKy8vIG1hY3JvIGRvZXNuJ3QgYWx3YXlzIHdvcmtzIG9uIGFsbCBwbGF0Zm9ybXMgc28gd2UgdXNlIHRoaXMga2x1ZGdlLgorLy8gSWYgbm90IGNvbXBpbGVkIGFzIGEgbW9kdWxlIGl0IGp1c3QgbWFrZXMgZmlwX2Zpcm0gYXZhbGlhYmxlIHRoZW4KKy8vICBfX2luaXRkYXRhIHNob3VsZCB3b3JrIGFzIGFkdmVydGl6ZWQKKy8vCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2lmbmRlZiBfX2luaXQKKyNkZWZpbmUgX19pbml0CisjZW5kaWYKKyNpZm5kZWYgX19pbml0ZnVuYworI2RlZmluZSBfX2luaXRmdW5jKGEpIGEKKyNlbmRpZgorI2lmbmRlZiBfX2luaXRkYXRhCisjZGVmaW5lIF9faW5pdGRhdGEKKyNlbmRpZgorCisjaW5jbHVkZSAiLi9pcDIvaXAydHlwZXMuaCIJCQorI2luY2x1ZGUgIi4vaXAyL2ZpcF9maXJtLmgiCQkvLyB0aGUgbWVhdAorCitpbnQKK2lwMl9sb2FkbWFpbihpbnQgKiwgaW50ICAqLCB1bnNpZ25lZCBjaGFyICosIGludCApOyAvLyByZWYgaW50byBpcDJtYWluLmMKKworLyogTm90ZTogQWRkIGNvbXBpbGVkIGluIGRlZmF1bHRzIHRvIHRoZXNlIGFycmF5cywgbm90IHRvIHRoZSBzdHJ1Y3R1cmUKKwlpbiBpcDIvaXAyLmggYW55IGxvbmdlci4gIFRoYXQgc3RydWN0dXJlIFdJTEwgZ2V0IG92ZXJyaWRkZW4KKwlieSB0aGVzZSB2YWx1ZXMsIG9yIGNvbW1hbmQgbGluZSB2YWx1ZXMsIG9yIGluc21vZCB2YWx1ZXMhISEgID1taHc9CisqLworc3RhdGljIGludCBpb1tJUDJfTUFYX0JPQVJEU109IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIGludCBpcnFbSVAyX01BWF9CT0FSRFNdID0geyAtMSwgLTEsIC0xLCAtMSB9OyAKKworc3RhdGljIGludCBwb2xsX29ubHkgPSAwOworCitNT0RVTEVfQVVUSE9SKCJEb3VnIE1jTmFzaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21wdXRvbmUgSW50ZWxsaVBvcnQgUGx1cyBEcml2ZXIiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwiSW50ZXJydXB0cyBmb3IgSW50ZWxsaVBvcnQgQ2FyZHMiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sIkkvTyBwb3J0cyBmb3IgSW50ZWxsaVBvcnQgQ2FyZHMiKTsKK21vZHVsZV9wYXJhbShwb2xsX29ubHksIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhwb2xsX29ubHksIkRvIG5vdCB1c2UgY2FyZCBpbnRlcnJ1cHRzIik7CisKKworc3RhdGljIGludCBfX2luaXQgaXAyX2luaXQodm9pZCkKK3sKKwlpZiggcG9sbF9vbmx5ICkgeworCQkvKiBIYXJkIGxvY2sgdGhlIGludGVycnVwdHMgdG8gemVybyAqLworCQlpcnFbMF0gPSBpcnFbMV0gPSBpcnFbMl0gPSBpcnFbM10gPSAwOworCX0KKworCXJldHVybiBpcDJfbG9hZG1haW4oaW8saXJxLCh1bnNpZ25lZCBjaGFyICopZmlwX2Zpcm0sc2l6ZW9mKGZpcF9maXJtKSk7Cit9Cittb2R1bGVfaW5pdChpcDJfaW5pdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmbmRlZiBNT0RVTEUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWlwMl9zZXR1cDoKKyAqCQlzdHI6IGtlcm5lbCBjb21tYW5kIGxpbmUgc3RyaW5nCisgKgorICoJQ2FuJ3QgYXV0b3Byb2JlIHRoZSBib2FyZHMgc28gdXNlciBtdXN0IHNwZWNpZnkgY29uZmlndXJhdGlvbiBvbgorICoJa2VybmVsIGNvbW1hbmQgbGluZS4gIFNhbmUgcGVvcGxlIGJ1aWxkIGl0IG1vZHVsYXIgYnV0IHRoZSBvdGhlcnMKKyAqCWNvbWUgaGVyZS4KKyAqCisgKglBbHRlcm5hdGluZyBwYWlycyBvZiBpbyxpcnEgZm9yIHVwIHRvIDQgYm9hcmRzLgorICoJCWlwMj1pbzAsaXJxMCxpbzEsaXJxMSxpbzIsaXJxMixpbzMsaXJxMworICoKKyAqCQlpbz0wID0+IE5vIGJvYXJkCisgKgkJaW89MSA9PiBQQ0kKKyAqCQlpbz0yID0+IEVJU0EKKyAqCQllbHNlID0+IElTQSBJL08gYWRkcmVzcworICoKKyAqCQlpcnE9MCBvciBpbnZhbGlkIGZvciBJU0Egd2lsbCByZXZlcnQgdG8gcG9sbGluZyBtb2RlCisgKgorICoJCUFueSB2YWx1ZSA9IC0xLCBkbyBub3Qgb3ZlcndyaXRlIGNvbXBpbGVkIGluIHZhbHVlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9faW5pdCBpcDJfc2V0dXAoY2hhciAqc3RyKQoreworCWludAlpbnRzWzEwXTsJLyogNCBib2FyZHMsIDIgcGFyYW1ldGVycyArIDIgKi8KKwlpbnQJaSwgajsKKworCXN0ciA9IGdldF9vcHRpb25zIChzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJZm9yKCBpID0gMCwgaiA9IDE7IGkgPCA0OyBpKysgKSB7CisJCWlmKCBqID4gaW50c1swXSApIHsKKwkJCWJyZWFrOworCQl9CisJCWlmKCBpbnRzW2pdID49IDAgKSB7CisJCQlpb1tpXSA9IGludHNbal07CisJCX0KKwkJaisrOworCQlpZiggaiA+IGludHNbMF0gKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiggaW50c1tqXSA+PSAwICkgeworCQkJaXJxW2ldID0gaW50c1tqXTsKKwkJfQorCQlqKys7CisJfQorCXJldHVybiAxOworfQorX19zZXR1cCgiaXAyPSIsIGlwMl9zZXR1cCk7CisjZW5kaWYgLyogIU1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9maXBfZmlybS5oIGIvZHJpdmVycy9jaGFyL2lwMi9maXBfZmlybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNTI1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2ZpcF9maXJtLmgKQEAgLTAsMCArMSwyMTQ5IEBACisvKiBmaXBfZmlybS5oIC0gSW50ZWxsaXBvcnQgSUkgbG9hZHdhcmUgKi8KKy8qIC0zMTIzMiBieXRlcyByZWFkIGZyb20gZmYubG9kICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZpcF9maXJtW10gX19pbml0ZGF0YSA9IHsKKzB4M0MsMHg0MiwweDM3LDB4MTgsMHgwMiwweDAxLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDU3LDB4NjUsMHg2NCwweDIwLDB4NDQsMHg2NSwweDYzLDB4MjAsMHgzMCwweDMxLDB4MjAsMHgzMSwweDMyLDB4M0EsMHgzMiwweDM0LAorMHgzQSwweDMzLDB4MzAsMHgyMCwweDMxLDB4MzksMHgzOSwweDM5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4RTksMHg2QywweDBGLDB4NDIsMHg2NSwweDQ3LDB4NjksMHg0RSwweDZFLDB4NDksMHg2RSwweDQ3LDB4MjAsMHg2RiwweDQ2LDB4MjAsCisweDYzLDB4NEYsMHg2NCwweDQ1LDB4Q0MsMHgxMywweDVBLDB4MTUsMHhFOCwweDE2LDB4NzYsMHgxOCwweDA0LDB4MUEsMHg5MiwweDFCLAorMHgyMCwweDFELDB4QUUsMHgxRSwweDNDLDB4MjAsMHhDQSwweDIxLDB4NTgsMHgyMywweEU2LDB4MjQsMHg3NCwweDI2LDB4MDIsMHgyOCwKKzB4OTAsMHgyOSwweDFFLDB4MkIsMHhBQywweDJDLDB4M0EsMHgyRSwweEM4LDB4MkYsMHg1NiwweDMxLDB4RTQsMHgzMiwweDcyLDB4MzQsCisweDAwLDB4MzYsMHg4RSwweDM3LDB4MUMsMHgzOSwweEFBLDB4M0EsMHgzOCwweDNDLDB4QzYsMHgzRCwweDU0LDB4M0YsMHhFMiwweDQwLAorMHg3MCwweDQyLDB4RkUsMHg0MywweDhDLDB4NDUsMHgxQSwweDQ3LDB4QTgsMHg0OCwweDM2LDB4NEEsMHhDNCwweDRCLDB4NTIsMHg0RCwKKzB4RTAsMHg0RSwweDZFLDB4NTAsMHhGQywweDUxLDB4OEEsMHg1MywweDE4LDB4NTUsMHhBNiwweDU2LDB4MzQsMHg1OCwweEMyLDB4NTksCisweDUwLDB4NUIsMHhERSwweDVDLDB4NkMsMHg1RSwweEZBLDB4NUYsMHg4OCwweDYxLDB4MTYsMHg2MywweEE0LDB4NjQsMHgzMiwweDY2LAorMHhDMCwweDY3LDB4NEUsMHg2OSwweERDLDB4NkEsMHg2QSwweDZDLDB4RjgsMHg2RCwweDg2LDB4NkYsMHgxNCwweDcxLDB4QTIsMHg3MiwKKzB4MzAsMHg3NCwweEJFLDB4NzUsMHg0QywweDc3LDB4NkMsMHg3NywweDhDLDB4NzcsMHhBQywweDc3LDB4MzMsMHhEQiwweDhBLDB4REMsCisweDUzLDB4MzMsMHhEQiwweDI1LDB4MDcsMHgwMCwweDc1LDB4MEEsMHg4QSwweDFFLDB4MDgsMHgwMSwweDgzLDB4RTMsMHgwQywweEVCLAorMHgyMCwweDkwLDB4M0MsMHgwMSwweDc1LDB4MEEsMHg4QSwweDFFLDB4MDgsMHgwMSwweDgwLDB4RTMsMHhDMCwweEVCLDB4MTIsMHg5MCwKKzB4OEEsMHgxRSwweDBELDB4MDEsMHgzQywweDAyLDB4NzUsMHgwNiwweDgwLDB4RTMsMHgwQywweEVCLDB4MDQsMHg5MCwweDgwLDB4RTMsCisweEMwLDB4NTMsMHg1MCwweDhCLDB4MUUsMHhCQSwweDEzLDB4OEUsMHhEQiwweEU4LDB4NkEsMHg2NSwweDU1LDB4OEIsMHhFQywweDUzLAorMHgxRSwweDJCLDB4QzAsMHg4RSwweEQ4LDB4OEIsMHg1RSwweDA0LDB4QzEsMHhFMywweDA0LDB4MDMsMHg1RSwweDA2LDB4RDEsMHhFMywKKzB4MkUsMHg4QiwweDlGLDB4NDQsMHgwMCwweDhELDB4NDcsMHgyQSwweDFFLDB4NUEsMHgxRiwweDVCLDB4NUQsMHhDMywweDU1LDB4OEIsCisweEVDLDB4NTMsMHgxRSwweDJCLDB4QzAsMHg4RSwweEQ4LDB4OEIsMHg1RSwweDA0LDB4QzEsMHhFMywweDA0LDB4MDMsMHg1RSwweDA2LAorMHhEMSwweEUzLDB4MkUsMHg4QiwweDlGLDB4NDQsMHgwMCwweDhELDB4NDcsMHgzNCwweDFFLDB4NUEsMHgxRiwweDVCLDB4NUQsMHhDMywKKzB4RkIsMHg1NSwweDhCLDB4RUMsMHg1MywweDUxLDB4NTIsMHg1NiwweDU3LDB4MUUsMHgwNiwweDFFLDB4MDcsMHgzMywweEMwLDB4OEUsCisweEQ4LDB4OEIsMHg1RSwweDA0LDB4MjYsMHg4QSwweDQ3LDB4NTksMHgyNSwweDAzLDB4MDAsMHg4QiwweEYwLDB4RDEsMHhFNiwweDJFLAorMHg4QiwweEI0LDB4QzQsMHgwMCwweEMxLDB4RTAsMHgwNCwweDI2LDB4MDIsMHg0NywweDFBLDB4RDEsMHhFMCwweDhCLDB4RTgsMHgyRSwKKzB4OEIsMHhBRSwweDQ0LDB4MDAsMHg4OSwweDJDLDB4MjYsMHg4QSwweDQ3LDB4MUMsMHg4OCwweDQ0LDB4MEYsMHgyNiwweDhBLDB4NDcsCisweDFELDB4ODgsMHg0NCwweDEwLDB4MjYsMHg4QSwweDQ3LDB4MUUsMHg4OCwweDQ0LDB4MTEsMHgyNiwweDhBLDB4NDcsMHgxRiwweDg4LAorMHg0NCwweDEyLDB4MjYsMHg4QSwweDQ3LDB4MjAsMHg4OCwweDQ0LDB4MTMsMHgyNiwweDhBLDB4NDcsMHgyMywweDg4LDB4NDQsMHgxNCwKKzB4MjYsMHg4QSwweDQ3LDB4MjQsMHg4OCwweDQ0LDB4MTUsMHgyNiwweDhBLDB4NDcsMHg1QSwweDg4LDB4NDQsMHgwRSwweDMzLDB4QzAsCisweDg5LDB4NDQsMHgwNiwweDg5LDB4NDQsMHgwOCwweDg4LDB4NDQsMHgwQiwweDg4LDB4NDQsMHgwQSwweEIwLDB4MjEsMHhCNCwweDY0LAorMHg4OSwweDQ0LDB4MDQsMHg4OSwweDQ0LDB4MDIsMHhCMCwweDU1LDB4ODgsMHg0NCwweDBELDB4ODgsMHg0NCwweDBDLDB4RTgsMHg2QSwKKzB4MDAsMHg3MiwweDVCLDB4RTgsMHhDOSwweDAwLDB4RTgsMHhDMSwweDEwLDB4ODksMHg0NCwweDA4LDB4ODAsMHg3QywweDBGLDB4MDEsCisweDc0LDB4MjksMHhFOCwweDJCLDB4MDIsMHhFOCwweDdGLDB4MDIsMHg4MCwweDdDLDB4MEYsMHgwMywweDc0LDB4MUQsMHhFOCwweEE5LAorMHgxMCwweDhCLDB4RjgsMHgyQiwweDQ0LDB4MDgsMHgzRCwweEEwLDB4MEYsMHg3MiwweDEwLDB4ODksMHg3QywweDA4LDB4MzMsMHhDMCwKKzB4ODcsMHg0NCwweDA2LDB4ODUsMHhDMCwweDc1LDB4MDQsMHhDNiwweDQ0LDB4MEEsMHhGRiwweDhBLDB4NDQsMHgwQSwweDg0LDB4QzAsCisweDc1LDB4MEIsMHhCOCwweDA4LDB4MDAsMHhFOCwweDZBLDB4NEEsMHhFOCwweEE5LDB4MDEsMHg3MywweEJGLDB4RTgsMHg0RiwweDAxLAorMHg4MSwweDY2LDB4NDgsMHg3RiwweEZGLDB4ODMsMHg2NiwweDdBLDB4QkYsMHhCMCwweDAyLDB4RTgsMHgwNCwweDBFLDB4OEEsMHg0NCwKKzB4MEEsMHg5OCwweDA3LDB4MUYsMHg1RiwweDVFLDB4NUEsMHg1OSwweDVCLDB4NUQsMHhDMywweDgxLDB4NEUsMHg0OCwweDgwLDB4MDAsCisweEIwLDB4NDAsMHhFOCwweDNELDB4NEEsMHhFOCwweDg5LDB4NDAsMHg3MywweDJBLDB4RTgsMHg0RCwweDEwLDB4OEIsMHhEOCwweEIwLAorMHgwNSwweEU4LDB4MkUsMHg0QSwweEY2LDB4NDYsMHgyNywweDAyLDB4NzUsMHgxQSwweEU4LDB4M0QsMHgxMCwweDJCLDB4QzMsMHgzRCwKKzB4NTgsMHgxQiwweDcyLDB4RUIsMHg4MSwweDY2LDB4NDgsMHg3RiwweEZGLDB4QjAsMHgwMiwweEU4LDB4QzQsMHgwRCwweEM2LDB4NDQsCisweDBBLDB4MDEsMHhGOSwweEMzLDB4ODMsMHg0RSwweDdBLDB4NDAsMHhGOCwweEMzLDB4RkIsMHhCMCwweDAxLDB4RTgsMHgwMiwweDRBLAorMHhGQSwweEU4LDB4OTksMHgxRSwweEU0LDB4MEEsMHg4NCwweEMwLDB4NzUsMHhGMCwweEIwLDB4NEUsMHhFNiwweDBBLDB4RkIsMHhCMCwKKzB4MDEsMHhFOCwweEVFLDB4NDksMHhGQSwweEU4LDB4ODUsMHgxRSwweEU0LDB4MEEsMHg4NCwweEMwLDB4NzUsMHhGMCwweEMzLDB4RkEsCisweEU4LDB4N0EsMHgxRSwweEU0LDB4RUMsMHg4OCwweDQ0LDB4MTYsMHhFNCwweEU0LDB4ODgsMHg0NCwweDE3LDB4RTQsMHhGOCwweDg4LAorMHg0NCwweDE4LDB4RTQsMHhGMCwweDg4LDB4NDQsMHgxOSwweEU0LDB4MTAsMHg4OCwweDQ0LDB4MUEsMHhFNCwweDEyLDB4ODgsMHg0NCwKKzB4MUIsMHhFNCwweDE0LDB4ODgsMHg0NCwweDFDLDB4RTQsMHgzNCwweDg4LDB4NDQsMHgxRCwweEU0LDB4MzYsMHg4OCwweDQ0LDB4MUUsCisweEU0LDB4RDgsMHgyNCwweDAxLDB4OEEsMHhFMCwweEU0LDB4REEsMHgyNCwweDAyLDB4MEEsMHhDNCwweDg4LDB4NDQsMHgxRiwweDhBLAorMHg0NCwweDEwLDB4RTgsMHhDRCwweDFGLDB4OEEsMHg0NCwweDExLDB4RTgsMHgzNSwweDIxLDB4OEEsMHg0NCwweDEyLDB4RTgsMHg4OSwKKzB4MjEsMHg4QSwweDQ0LDB4MTMsMHhFOCwweDQzLDB4MjEsMHhDNiwweDg2LDB4QTEsMHgwMCwweDAwLDB4RTQsMHgxNCwweDI0LDB4MTAsCisweEU2LDB4MTQsMHhFNCwweDEyLDB4MjQsMHgzRCwweEU2LDB4MTIsMHg4QSwweDQ0LDB4MTUsMHgzQywweDAxLDB4NzIsMHgxRSwweDc3LAorMHgxNiwweEIwLDB4MTEsMHhFNiwweDM0LDB4QjAsMHgxMywweEU2LDB4MzYsMHhFNCwweDE0LDB4MEMsMHgxMCwweEU2LDB4MTQsMHhFNCwKKzB4MTIsMHgwQywweDQwLDB4RTYsMHgxMiwweEVCLDB4MDYsMHhFNCwweDEyLDB4MEMsMHgwMiwweEU2LDB4MTIsMHg4QSwweDQ0LDB4MEYsCisweDNDLDB4MDEsMHg3NCwweDA2LDB4M0MsMHgwMiwweDc0LDB4MEEsMHhFQiwweDBFLDB4RTQsMHgxMiwweDBDLDB4MDgsMHhFNiwweDEyLAorMHhFQiwweDA2LDB4RTQsMHgxMiwweDBDLDB4MTAsMHhFNiwweDEyLDB4RTgsMHgyRiwweEZGLDB4OEEsMHg0NCwweDE0LDB4M0MsMHgwMiwKKzB4NzUsMHgwOCwweEIwLDB4NTUsMHg4OCwweDQ0LDB4MEMsMHg4OCwweDQ0LDB4MEQsMHhCMCwweDIxLDB4QjQsMHg2NCwweDg5LDB4NDQsCisweDA0LDB4ODksMHg0NCwweDAyLDB4RTQsMHgwQywweDBDLDB4MTAsMHhFNiwweDBDLDB4RTgsMHhFRCwweDM5LDB4RkIsMHhDMywweEU4LAorMHg1RiwweDNGLDB4NzMsMHgwOCwweEZCLDB4QjAsMHgwQSwweEU4LDB4MDgsMHg0OSwweEVCLDB4RjMsMHhGQSwweEU4LDB4OUQsMHgxRCwKKzB4OEEsMHg2NCwweDE2LDB4OEEsMHg0NCwweDE3LDB4ODksMHg4NiwweDk0LDB4MDAsMHhFNiwweEU0LDB4OEEsMHhDNCwweEU2LDB4RUMsCisweDhBLDB4NjQsMHgxOCwweDhBLDB4NDQsMHgxOSwweDg5LDB4ODYsMHg5NiwweDAwLDB4RTYsMHhGMCwweDhBLDB4QzQsMHhFNiwweEY4LAorMHg4QSwweDQ0LDB4MUEsMHhFNiwweDEwLDB4OEEsMHg0NCwweDFCLDB4RTYsMHgxMiwweDhBLDB4NDQsMHgxQywweEU2LDB4MTQsMHg4QSwKKzB4NDQsMHgxRCwweEU2LDB4MzQsMHg4QSwweDQ0LDB4MUUsMHhFNiwweDM2LDB4OEEsMHg0NCwweDFGLDB4RTYsMHhEOCwweEU2LDB4REEsCisweEU5LDB4QjcsMHhGRSwweDkwLDB4RkEsMHg4QSwweDQ0LDB4MEUsMHhFNiwweEZFLDB4RTQsMHgwMiwweEE4LDB4MDEsMHg3NSwweDA1LAorMHgzMywweEMwLDB4RkIsMHhGOCwweEMzLDB4MzMsMHhDMCwweEU0LDB4MDAsMHhGQiwweEY5LDB4QzMsMHg4QSwweDY0LDB4MTQsMHg4MCwKKzB4RkMsMHgwMiwweDc0LDB4MkIsMHhGRSwweEMwLDB4RkUsMHhDNywweDgwLDB4RkYsMHg0RSwweDcyLDB4MUMsMHg3NCwweDA5LDB4ODAsCisweEZGLDB4NTAsMHg3MywweDA4LDB4QjAsMHgwQSwweEVCLDB4MTcsMHhCMCwweDBELDB4RUIsMHgxMywweDAyLDB4REMsMHgzMiwweEZGLAorMHg4MCwweEZCLDB4N0YsMHg3QywweDAyLDB4QjMsMHgyMSwweDhBLDB4QzMsMHgzQywweDdGLDB4N0MsMHgwMiwweEIwLDB4MjEsMHhDMywKKzB4RkEsMHg4MCwweDdDLDB4MEIsMHgwNCwweDc2LDB4MDIsMHhGQiwweEMzLDB4OEIsMHg0NiwweDI0LDB4M0QsMHgwOCwweDAwLDB4NzIsCisweEY2LDB4OEUsMHg0NiwweDAyLDB4OEIsMHg3RSwweDIyLDB4OEEsMHg0NCwweDBDLDB4OEIsMHg1QywweDAyLDB4QUEsMHhFOCwweEFCLAorMHhGRiwweEFBLDB4RTgsMHhBNywweEZGLDB4QUEsMHhFOCwweEEzLDB4RkYsMHhBQSwweEU4LDB4OUYsMHhGRiwweDg4LDB4NDQsMHgwQywKKzB4ODksMHg1QywweDAyLDB4ODAsMHg0NCwweDBCLDB4MDQsMHg4OSwweDdFLDB4MjIsMHg4MywweDZFLDB4MjQsMHgwNCwweDgzLDB4NDYsCisweDFBLDB4MDQsMHg4MCwweDdFLDB4MjYsMHgwMiwweDc0LDB4MDYsMHg4MCwweDY2LDB4MjYsMHhGRCwweEZCLDB4QzMsMHg2MCwweEIwLAorMHhGRCwweEU4LDB4MDIsMHgzRiwweDYxLDB4RkIsMHhDMywweEZBLDB4ODAsMHg3QywweDBGLDB4MDMsMHg3NSwweDA5LDB4QzYsMHg0NCwKKzB4MEIsMHgwMCwweEU4LDB4RTUsMHgzOCwweEZCLDB4QzMsMHhDNCwweDdFLDB4MTQsMHg4QiwweDRFLDB4M0EsMHg4NSwweEM5LDB4NzUsCisweDM1LDB4MjYsMHg4QiwweDBELDB4NDcsMHg0NywweEUzLDB4RUEsMHgzQiwweDdFLDB4MDQsMHg3NiwweDIyLDB4QjgsMHgwMiwweDAwLAorMHgzOSwweDQ2LDB4MkUsMHg3NywweDA3LDB4QzcsMHg0NiwweDJFLDB4MDAsMHgwMCwweEVCLDB4MTMsMHg4QiwweDVFLDB4MkMsMHg4OSwKKzB4NUUsMHgwNCwweDI2LDB4QzcsMHgwNywweDAwLDB4MDAsMHg0MywweDQzLDB4ODksMHg1RSwweDJDLDB4MjksMHg0NiwweDJFLDB4ODUsCisweEM5LDB4NzgsMHhDRSwweDg5LDB4NEUsMHgzQSwweDhBLDB4NDQsMHgwRCwweDhCLDB4NUMsMHgwNCwweDI2LDB4OEEsMHgyNSwweDQ3LAorMHgzQSwweEM0LDB4NzUsMHgxNiwweEZFLDB4NEMsMHgwQiwweEZGLDB4NDQsMHgwNiwweEU4LDB4MEYsMHhGRiwweEUyLDB4RUQsMHg4OCwKKzB4NDQsMHgwRCwweDg5LDB4NUMsMHgwNCwweDg5LDB4NEUsMHgzQSwweEVCLDB4QTcsMHhDNiwweDQ0LDB4MEEsMHhGRSwweEU4LDB4NzksCisweDM4LDB4RkIsMHhDMywweDkwLDB4RTgsMHhCMywweDBELDB4OEEsMHhFOCwweDhBLDB4MEUsMHhDQiwweDEzLDB4QjMsMHgwNywweDhBLAorMHhDMSwweEVFLDB4RUIsMHgwMCwweEVDLDB4M0EsMHhDMSwweDc1LDB4MDksMHgwMiwweENELDB4RkUsMHhDQiwweDc1LDB4RjAsMHhFQiwKKzB4MEMsMHg5MCwweDg4LDB4MEUsMHhDQiwweDEzLDB4OEEsMHhFOCwweEJCLDB4RkYsMHhGRiwweEY5LDB4QzMsMHg4OCwweDBFLDB4Q0IsCisweDEzLDB4RjgsMHhDMywweDkwLDB4QkIsMHgzRiwweDNGLDB4OEEsMHg4RSwweDlFLDB4MDAsMHhCQSwweEZFLDB4MDAsMHhFQywweDhBLAorMHhFOCwweDMyLDB4QzEsMHgyMiwweEMzLDB4NzUsMHgwMiwweEY4LDB4QzMsMHhGOSwweEMzLDB4OTAsMHhFOCwweEU1LDB4RkYsMHg3MywKKzB4MDEsMHhDMywweEJBLDB4RDAsMHgwMCwweEJCLDB4MDMsMHgwMywweDhBLDB4OEUsMHg5RiwweDAwLDB4RUMsMHg4QSwweEU4LDB4MzIsCisweEMxLDB4MjIsMHhDMywweDc1LDB4MDIsMHhGOCwweEMzLDB4RjksMHhDMywweDkwLDB4MzMsMHhDMCwweDhFLDB4RDgsMHg4RSwweEMwLAorMHg4MCwweDNFLDB4QzgsMHgxMywweDAwLDB4NzUsMHgwNywweEIwLDB4MEEsMHhFOCwweDI2LDB4NDcsMHhFQiwweEYyLDB4RkIsMHgzMywKKzB4REIsMHg4QSwweDFFLDB4QzksMHgxMywweDQzLDB4NDMsMHg4MywweEZCLDB4N0UsMHg3NiwweDA3LDB4MzMsMHhEQiwweEIwLDB4MDIsCisweEU4LDB4MEYsMHg0NywweDJFLDB4OEIsMHhBRiwweDQ0LDB4MDAsMHg4MywweDdFLDB4MDgsMHgwMCwweDc0LDB4RTcsMHg4OCwweDFFLAorMHhDOSwweDEzLDB4QjAsMHgwMiwweEU4LDB4RkIsMHg0NiwweEZBLDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwweDc0LDB4MTQsMHhFOCwKKzB4OTYsMHgxQiwweEU4LDB4N0YsMHhGRiwweDcyLDB4MUMsMHgzMywweEQyLDB4OEEsMHg5NiwweDlGLDB4MDAsMHg4MywweEMyLDB4MEUsCisweEVCLDB4MEMsMHg5MCwweEU4LDB4NzcsMHgxQiwweEU4LDB4ODMsMHhGRiwweDcyLDB4MDgsMHhCQSwweDQ4LDB4MDAsMHhFOCwweDMzLAorMHhGRiwweDczLDB4QUIsMHgyMywweENCLDB4ODksMHg4RSwweDlBLDB4MDAsMHg4OSwweDk2LDB4OUMsMHgwMCwweEZFLDB4ODYsMHhCNSwKKzB4MDAsMHhDNiwweDA2LDB4QzgsMHgxMywweDAwLDB4QjAsMHgwQSwweEU4LDB4NjcsMHgwQSwweEZCLDB4RUIsMHg4OSwweDEwLDB4MTgsCisweDA4LDB4MjgsMHgzMywweEMwLDB4QTAsMHgwNSwweDAxLDB4OEEsMHhDOCwweDI0LDB4NDAsMHg3NSwweDI0LDB4QzcsMHgwNiwweDdDLAorMHgxMiwweDhFLDB4NDUsMHhDNywweDA2LDB4NDIsMHgxMiwweDAxLDB4MDAsMHhDNiwweDA2LDB4NTQsMHgxMiwweDAyLDB4QjAsMHgwOCwKKzB4RjYsMHhDMSwweDAxLDB4NzQsMHgwMiwweEIwLDB4MDQsMHhBMywweDQ2LDB4MTIsMHhBMiwweDRDLDB4MTIsMHhBMiwweDk0LDB4MTIsCisweEMzLDB4QzcsMHgwNiwweDdDLDB4MTIsMHhCNiwweDQ1LDB4QTAsMHgwRiwweDAxLDB4ODQsMHhDMCwweDc1LDB4MEUsMHg2QSwweDAwLAorMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MUUsMHg5QywweDBFLDB4RTgsMHhCMSwweDBDLDB4OTAsMHhDNywweDA2LDB4NDQsMHgxMiwKKzB4MDEsMHgwMCwweEEzLDB4NDIsMHgxMiwweDhCLDB4RDgsMHhDMSwweEUzLDB4MDQsMHg4OCwweDFFLDB4OTQsMHgxMiwweEJFLDB4RTIsCisweDA1LDB4MkIsMHhGMCwweDhCLDB4QzgsMHgzMywweERCLDB4OEIsMHhGQiwweDJFLDB4QUMsMHg4OCwweDg1LDB4NDgsMHgxMiwweDhBLAorMHhEOCwweDBDLDB4MDUsMHhFNiwweEZFLDB4OEEsMHhFMCwweEVCLDB4MDAsMHhFNCwweEZFLDB4MzIsMHhDNCwweEE4LDB4M0YsMHg3NCwKKzB4MDMsMHhFOSwweDlFLDB4MDAsMHhFNCwweDAwLDB4ODgsMHg4NSwweDUwLDB4MTIsMHg4QSwweEUwLDB4MjQsMHgzMCwweEJBLDB4MTAsCisweEZGLDB4M0MsMHgzMCwweDc0LDB4MTIsMHg4MCwweEZDLDB4MDQsMHg3NCwweDBBLDB4QkEsMHgwNCwweDAzLDB4RjYsMHgwNiwweDA4LAorMHgwMSwweEZFLDB4NzQsMHgwMywweEJBLDB4MDgsMHgwRiwweDg4LDB4OTUsMHg0QywweDEyLDB4MDIsMHhGQSwweDMyLDB4QzAsMHhGNiwKKzB4QzQsMHgwOCwweDc0LDB4MDIsMHhCMCwweDAxLDB4ODgsMHg4NSwweDU4LDB4MTIsMHg4QSwweEM0LDB4M0MsMHgzNSwweDc0LDB4NUIsCisweDNDLDB4MzYsMHg3NCwweDU3LDB4M0MsMHgzNCwweDc0LDB4NTMsMHgzQywweDA0LDB4NzQsMHg0RiwweDNDLDB4MTQsMHg3NCwweDRCLAorMHgzQywweDE1LDB4NzQsMHg0NywweEE4LDB4NDAsMHg3NCwweDI1LDB4QzYsMHg4NSwweDU0LDB4MTIsMHgwNCwweEQxLDB4RTcsMHhCNCwKKzB4MDMsMHg4QSwweEMzLDB4ODksMHg4NSwweDVDLDB4MTIsMHg4QSwweEMzLDB4OEEsMHhFMywweDgwLDB4Q0MsMHgwMSwweDg5LDB4ODUsCisweDY0LDB4MTIsMHhEMSwweEVGLDB4NDcsMHhFMiwweDAzLDB4RUIsMHgxQSwweDkwLDB4RTksMHg2QywweEZGLDB4QzYsMHg4NSwweDU0LAorMHgxMiwweDAyLDB4RDEsMHhFNywweDhBLDB4RTYsMHg4QSwweEMzLDB4MEMsMHgwNCwweDg5LDB4ODUsMHg1QywweDEyLDB4RDEsMHhFRiwKKzB4NDcsMHhFMiwweEU3LDB4MzMsMHhDMCwweDhBLDB4QzcsMHhBMywweDQ2LDB4MTIsMHhDMywweEM2LDB4ODUsMHg1NCwweDEyLDB4MDYsCisweEVCLDB4QkIsMHhDNiwweDg1LDB4NTQsMHgxMiwweDAwLDB4MzMsMHhDMCwweDg4LDB4ODUsMHg1MCwweDEyLDB4ODgsMHg4NSwweDRDLAorMHgxMiwweDg4LDB4ODUsMHg1OCwweDEyLDB4RUIsMHhBNiwweEM3LDB4NDYsMHgyNiwweDAyLDB4MTIsMHg4QiwweDQ2LDB4MUUsMHg4OSwKKzB4NDYsMHgwMCwweDg5LDB4NDYsMHgyMiwweDhCLDB4NDYsMHgyMCwweDg5LDB4NDYsMHgyNCwweEM3LDB4NDYsMHgxQSwweDAwLDB4MDAsCisweEMzLDB4QzcsMHg0NiwweDNDLDB4ODAsMHgwMCwweEM3LDB4NDYsMHgzOCwweDAxLDB4MDAsMHgxRSwweDU2LDB4OEIsMHg3NiwweDMwLAorMHg4OSwweDc2LDB4MDQsMHg4OSwweDc2LDB4MTQsMHg4RSwweDVFLDB4MDYsMHgzMywweEMwLDB4ODksMHgwNCwweDQ2LDB4NDYsMHg4OSwKKzB4NzYsMHgyQywweDg5LDB4NDYsMHgzQSwweDhCLDB4NDYsMHgzMiwweDQ4LDB4NDgsMHg4OSwweDQ2LDB4MkUsMHg1RSwweDFGLDB4QzMsCisweDMzLDB4QzAsMHg4OSwweDQ2LDB4NDgsMHg4OSwweDQ2LDB4NEEsMHhDNywweDQ2LDB4NDYsMHhBRSwweDAxLDB4ODksMHg0NiwweDRFLAorMHg4QiwweDQ2LDB4NDQsMHg4OSwweDQ2LDB4NTAsMHg4QiwweDQ2LDB4NDIsMHg4OSwweDQ2LDB4NDAsMHg4OSwweDQ2LDB4MDgsMHhDMywKKzB4MzMsMHhDMCwweDg5LDB4NDYsMHg3NiwweDg5LDB4NDYsMHg3OCwweEM3LDB4NDYsMHg3QSwweDEwLDB4MDAsMHg1NiwweDFFLDB4OEIsCisweDc2LDB4NzAsMHg4OSwweDc2LDB4MTAsMHg4OSwweDc2LDB4MEMsMHg4RSwweDVFLDB4MTIsMHhDNywweDA0LDB4MDAsMHgwMCwweDhCLAorMHg0NiwweDcyLDB4ODksMHg0NiwweDc0LDB4MUYsMHg1RSwweEMzLDB4ODksMHg1NiwweDE4LDB4ODksMHg1NiwweDAyLDB4ODksMHg1NiwKKzB4MDYsMHg4OSwweDU2LDB4MEEsMHg4OSwweDU2LDB4MEUsMHg4OSwweDU2LDB4MTIsMHg4OSwweDU2LDB4MTYsMHg4QiwweEQ4LDB4NEIsCisweDRCLDB4QzEsMHhFMywweDAyLDB4QkYsMHgwMiwweDAwLDB4ODksMHg3RSwweDFFLDB4MDMsMHhGQiwweDg5LDB4N0UsMHgzMCwweDAzLAorMHhGQiwweDg5LDB4N0UsMHg0MiwweDAzLDB4RkIsMHg4OSwweDdFLDB4NzAsMHg4MywweEVCLDB4MDgsMHg4OSwweDVFLDB4MjAsMHg4OSwKKzB4NUUsMHgzMiwweDg5LDB4NUUsMHg0NCwweDg5LDB4NUUsMHg3MiwweDUwLDB4RTgsMHgyQiwweEZGLDB4RTgsMHg3MSwweEZGLDB4RTgsCisweDNGLDB4RkYsMHhFOCwweDhCLDB4RkYsMHg1OCwweEMzLDB4QjgsMHgzMCwweDc1LDB4QzEsMHhFOCwweDA0LDB4MEUsMHg1QiwweDAzLAorMHhDMywweEEzLDB4QkEsMHgxMywweDgzLDB4M0UsMHg0MiwweDEyLDB4MDAsMHg3NCwweDA3LDB4ODAsMHgzRSwweDk0LDB4MTIsMHgwMCwKKzB4NzUsMHgwRSwweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MUUsMHg5QywweDBFLDB4RTgsMHhCRCwweDBBLDB4OTAsCisweEI4LDB4MzAsMHg3QSwweEMxLDB4RTgsMHgwNCwweDQwLDB4QTMsMHhDMCwweDEzLDB4MkIsMHgwNiwweDEyLDB4MDEsMHhGNywweEQ4LAorMHgzMywweEQyLDB4OEIsMHhDQSwweDhBLDB4MEUsMHg5NCwweDEyLDB4RjcsMHhGMSwweDNELDB4ODAsMHgwMCwweDc3LDB4MEUsMHg2QSwKKzB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MjUsMHg5QywweDBFLDB4RTgsMHg5MCwweDBBLDB4OTAsMHg0OCwweDNELDB4RkYsCisweDA3LDB4NzIsMHgwMywweEI4LDB4RkYsMHgwNywweEEzLDB4QzIsMHgxMywweDMzLDB4QzksMHg4QSwweDBFLDB4OTQsMHgxMiwweDMzLAorMHhGNiwweEI4LDB4MDAsMHgwOSwweDJFLDB4OEIsMHhBQywweDQ0LDB4MDAsMHg4OSwweDQ2LDB4NEMsMHg0MCwweDQ2LDB4NDYsMHhFMiwKKzB4RjMsMHg4QSwweDBFLDB4OTQsMHgxMiwweDMzLDB4RjYsMHg4QiwweDE2LDB4QzAsMHgxMywweEExLDB4QzIsMHgxMywweDJFLDB4OEIsCisweEFDLDB4NDQsMHgwMCwweEU4LDB4MjIsMHhGRiwweDAzLDB4RDAsMHg0NiwweDQ2LDB4RTIsMHhGMiwweEMzLDB4MzMsMHhDMCwweDJFLAorMHg4QiwweEFELDB4NDQsMHgwMCwweDg5LDB4NDYsMHgwOCwweDQ3LDB4NDcsMHhFMiwweEY0LDB4QzMsMHg1MSwweDMzLDB4QzAsMHgwQSwKKzB4QzIsMHgyRSwweDhCLDB4QUQsMHg0NCwweDAwLDB4ODksMHg4NiwweDlFLDB4MDAsMHg4MSwweDRFLDB4MzgsMHgwMCwweDIwLDB4NDcsCisweDQ3LDB4RkUsMHhDNCwweDgwLDB4RkMsMHgwNCwweDcyLDB4MDQsMHgzMiwweEU0LDB4RkUsMHhDMCwweEUyLDB4RTMsMHg1OSwweDgzLAorMHhFOSwweDEwLDB4NzQsMHgwNSwweEY3LDB4RDksMHhFOCwweEM0LDB4RkYsMHhDMywweDUxLDB4MzMsMHhDMCwweDBBLDB4QzIsMHgyRSwKKzB4OEIsMHhBRCwweDQ0LDB4MDAsMHg4OSwweDg2LDB4OUUsMHgwMCwweDgzLDB4NEUsMHgzOCwweDQwLDB4NDcsMHg0NywweDgwLDB4QzQsCisweDEwLDB4NzksMHgwNCwweDMyLDB4RTQsMHhGRSwweEMwLDB4RTIsMHhFNiwweDU5LDB4ODMsMHhFOSwweDEwLDB4NzQsMHgwNSwweEY3LAorMHhEOSwweEU4LDB4OTksMHhGRiwweEMzLDB4RTgsMHhEMiwweEZGLDB4QzMsMHg4RCwweDA4LDB4OUMsMHgwOCwweENBLDB4MDgsMHhGNSwKKzB4MDgsMHg4QiwweDBFLDB4NDIsMHgxMiwweDMzLDB4RjYsMHg1MSwweDU2LDB4MzMsMHhEQiwweDhCLDB4Q0IsMHg4QSwweDk0LDB4NDgsCisweDEyLDB4OEEsMHg4QywweDRDLDB4MTIsMHg4QSwweDlDLDB4NTQsMHgxMiwweDhCLDB4RkUsMHhDMSwweEU3LDB4MDUsMHg4NSwweERCLAorMHg3NSwweDAyLDB4QjEsMHgxMCwweDJFLDB4RkYsMHg5NywweEY5LDB4MDgsMHg1RSwweDU5LDB4NDYsMHhFMiwweEQ5LDB4QzMsMHgwMSwKKzB4Q0MsMHgwMywweEQwLDB4MDAsMHhFOCwweDAyLDB4RDAsMHgwMCwweEU4LDB4MDEsMHhEMCwweDAwLDB4RTgsMHgwMCwweEQwLDB4MDAsCisweEU4LDB4MDQsMHhEMCwweEE4LDB4REEsMHgwMCwweERDLDB4MDAsMHhERSwweDAxLDB4RDgsMHgwMywweENDLDB4MDMsMHhDQywweDAzLAorMHhDQywweDA0LDB4RDAsMHhBOCwweERBLDB4MjAsMHhEQywweDAwLDB4REUsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMCwKKzB4RDgsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsCisweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywweENDLDB4MDMsMHhDQywweDAzLAorMHhDQywweDA0LDB4RDAsMHgwMCwweERBLDB4MjAsMHhEQywweDAzLDB4REUsMHgwMSwweEQ4LDB4MDMsMHhDQywweDAzLDB4Q0MsMHgwMywKKzB4Q0MsMHgwMywweENDLDB4MDAsMHhEOCwweDAwLDB4Q0MsMHgwMCwweEQwLDB4MDAsMHgwMCwweDU2LDB4NTIsMHgxRSwweDBFLDB4MUYsCisweEJFLDB4MkYsMHgwOSwweDMzLDB4RDIsMHhGQywweEFELDB4ODUsMHhDMCwweDc0LDB4MEQsMHg4QSwweEQ0LDB4RUUsMHhBRCwweDg1LAorMHhDMCwweDc0LDB4MDUsMHg4QSwweEQ0LDB4RUUsMHhFQiwweEVFLDB4MUYsMHg1QSwweDVFLDB4QzMsMHhFNCwweDgwLDB4ODQsMHhDMCwKKzB4NzQsMHgxNiwweDc4LDB4MTQsMHhCMCwweDI3LDB4RTYsMHhGQywweEIwLDB4MTEsMHhFNiwweDM0LDB4RTQsMHhGQywweDNDLDB4MjcsCisweDc1LDB4MDYsMHhFNCwweDExLDB4NzUsMHgwMiwweEY4LDB4QzMsMHhGOSwweEMzLDB4ODMsMHhDMiwweDA2LDB4QjAsMHhCRiwweEVFLAorMHg4MywweEVBLDB4MDIsMHhCMCwweDEwLDB4RUUsMHg4OCwweDg2LDB4QUYsMHgwMCwweEIwLDB4MTEsMHg4MywweEMyLDB4MDQsMHhFRSwKKzB4ODMsMHhDMiwweDAyLDB4RUUsMHhCMCwweDEzLDB4ODMsMHhDMiwweDAyLDB4RUUsMHg4MywweEMyLDB4MDIsMHhFRSwweDJFLDB4QTEsCisweDRDLDB4MkQsMHg4OSwweDg2LDB4OTQsMHgwMCwweDgzLDB4RUEsMHgwRSwweEVFLDB4ODMsMHhDMiwweDAyLDB4OEEsMHhDNCwweEVFLAorMHg4MywweEMyLDB4MDQsMHhCMCwweDAzLDB4RUUsMHg4OCwweDg2LDB4QTgsMHgwMCwweDgzLDB4RUEsMHgwNCwweDMyLDB4QzAsMHhFRSwKKzB4ODMsMHhDMiwweDAyLDB4QjAsMHg4OSwweEVFLDB4ODgsMHg4NiwweEE2LDB4MDAsMHgwQywweDA2LDB4RUUsMHhCMCwweDQwLDB4QjQsCisweDM4LDB4ODksMHg0NiwweDFDLDB4QzcsMHg0NiwweDM2LDB4MzgsMHgwMCwweDgzLDB4QzIsMHgwNCwweDMyLDB4QzAsMHhFRSwweDg4LAorMHg4NiwweEE3LDB4MDAsMHhDMywweDgzLDB4QzIsMHgwNiwweEIwLDB4QkYsMHhFRSwweDgzLDB4RUEsMHgwMiwweEVDLDB4M0EsMHg4NiwKKzB4QUYsMHgwMCwweDc1LDB4MjQsMHg4MywweEMyLDB4MDQsMHhFQywweDNDLDB4MTEsMHg3NSwweDFDLDB4ODMsMHhDMiwweDA2LDB4RUMsCisweDNDLDB4MTMsMHg3NSwweDE0LDB4ODMsMHhFQSwweDA4LDB4OEEsMHg4NiwweEE4LDB4MDAsMHhFRSwweDgzLDB4RUEsMHgwMiwweEVDLAorMHgyNCwweEMwLDB4M0MsMHhDMCwweDc1LDB4MDIsMHhGOCwweEMzLDB4RjksMHhDMywweDMzLDB4QzksMHg4QiwweEQxLDB4OEIsMHhGMSwKKzB4OEEsMHgwRSwweDk0LDB4MTIsMHhDMSwweEU5LDB4MDIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LDB4MDAsCisweDIwLDB4NzQsMHgwRSwweDhBLDB4ODYsMHg5RSwweDAwLDB4RTYsMHhGRSwweDMyLDB4QzAsMHhFNiwweDgwLDB4NDIsMHhFOCwweEZBLAorMHhGRSwweDgzLDB4QzYsMHgwOCwweEUyLDB4RTEsMHg4NSwweEQyLDB4NzQsMHgwMywweEU4LDB4MDUsMHgwOCwweEMzLDB4MzMsMHhDOSwKKzB4OEIsMHhGMSwweDhBLDB4MEUsMHg5NCwweDEyLDB4MkUsMHg4QiwweEFDLDB4NDQsMHgwMCwweEY3LDB4NDYsMHgzOCwweDQwLDB4MDAsCisweDc0LDB4MDYsMHhFOCwweDczLDB4MTYsMHhFOCwweDEyLDB4RkYsMHg0NiwweDQ2LDB4RTIsMHhFQSwweEMzLDB4MzMsMHhDOSwweDhCLAorMHhGMSwweDhBLDB4MEUsMHg5NCwweDEyLDB4QzEsMHhFOSwweDAyLDB4MkUsMHg4QiwweEFDLDB4NDQsMHgwMCwweEY3LDB4NDYsMHgzOCwKKzB4MDAsMHgyMCwweDc0LDB4MTYsMHhFOCwweDQ2LDB4MTYsMHhFOCwweEQyLDB4RkUsMHg3MywweDBFLDB4NkEsMHgwMCwweDFGLDB4QzYsCisweDA2LDB4OTMsMHgxMiwweDFDLDB4OUMsMHgwRSwweEU4LDB4RTMsMHgwNywweDkwLDB4ODMsMHhDNiwweDA4LDB4RTIsMHhEOSwweEMzLAorMHgzMywweEM5LDB4OEIsMHhGMSwweDhBLDB4MEUsMHg5NCwweDEyLDB4MkUsMHg4QiwweEFDLDB4NDQsMHgwMCwweEY3LDB4NDYsMHgzOCwKKzB4NDAsMHgwMCwweDc0LDB4MTYsMHhFOCwweDIxLDB4MTYsMHhFOCwweDJBLDB4RkYsMHg3MywweDBFLDB4NkEsMHgwMCwweDFGLDB4QzYsCisweDA2LDB4OTMsMHgxMiwweDFDLDB4OUMsMHgwRSwweEU4LDB4QjMsMHgwNywweDkwLDB4NDYsMHg0NiwweEUyLDB4REEsMHhDMywweDBDLAorMHgwMCwweDAwLDB4MTAsMHgwMCwweDEzLDB4MTIsMHgwMCwweDAwLDB4MTQsMHgwMCwweDI4LDB4M0MsMHgwMCwweDFCLDB4M0UsMHgwMCwKKzB4MDAsMHgyQSwweDAwLDB4MDAsMHgyQywweDAwLDB4MDAsMHg0MiwweDAwLDB4MTQsMHhEOCwweDAwLDB4MDAsMHhEQSwweDAwLDB4MDAsCisweDM0LDB4MDAsMHgxMSwweDM2LDB4MDAsMHgxMywweDM4LDB4MDAsMHgxMSwweDNBLDB4MDAsMHgxMywweDAwLDB4MDAsMHg1NiwweDUwLAorMHg1MiwweEJFLDB4MkYsMHgwQiwweDJFLDB4QUQsMHg4NSwweEMwLDB4NzQsMHgwNiwweDkyLDB4MkUsMHhBQywweEVFLDB4RUIsMHhGNCwKKzB4NUEsMHg1OCwweDVFLDB4QzMsMHg1MywweDJFLDB4QTEsMHg2MCwweDIyLDB4RTYsMHhFNCwweEU2LDB4RjAsMHg4QSwweEM0LDB4RTYsCisweEVDLDB4RTYsMHhGOCwweEU4LDB4RDgsMHhGRiwweEIwLDB4NEIsMHhFNiwweDEwLDB4QjAsMHg1MCwweEU2LDB4MTIsMHhCMCwweDM4LAorMHhFNiwweDE0LDB4RTgsMHhBRSwweDE1LDB4QjAsMHg0NiwweEU2LDB4MEEsMHhFOCwweEE3LDB4MTUsMHhCMCwweDFBLDB4RTYsMHgwQSwKKzB4RTgsMHhBMCwweDE1LDB4QjAsMHgyMiwweEU2LDB4MEEsMHhFOCwweDk5LDB4MTUsMHhFOCwweEZELDB4MDYsMHg4QiwweEQ4LDB4RTQsCisweDE2LDB4QTgsMHgwNCwweDc1LDB4MTgsMHhFOCwweEYyLDB4MDYsMHgyQiwweEMzLDB4M0QsMHgzMiwweDAwLDB4NzIsMHhGMCwweDZBLAorMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgyMywweDlDLDB4MEUsMHhFOCwweDEwLDB4MDcsMHg5MCwweEU4LDB4REEsMHgwNiwKKzB4MkIsMHhDMywweDNELDB4MjQsMHgwMCwweDc3LDB4MUIsMHhCMCwweDMxLDB4RTYsMHhGQywweDU2LDB4NTEsMHg1NSwweEI5LDB4MTAsCisweDAwLDB4MkUsMHg4QiwweEFDLDB4NDQsMHgwMCwweDgxLDB4NEUsMHgzOCwweDgwLDB4MDAsMHg0NiwweDQ2LDB4RTIsMHhGMiwweDVELAorMHg1OSwweDVFLDB4RTgsMHg2OSwweEZGLDB4RTgsMHg0QiwweDE1LDB4QjAsMHg0NiwweEU2LDB4MEEsMHhFOCwweDQ0LDB4MTUsMHg1QiwKKzB4QzMsMHgzMywweEY2LDB4OEIsMHgwRSwweDQyLDB4MTIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LDB4MDAsCisweDIwLDB4NzQsMHgwNiwweEU4LDB4MTcsMHgxNSwweEU4LDB4NUIsMHhGRiwweDgzLDB4QzYsMHgyMCwweEUyLDB4RTksMHhDMywweDhCLAorMHhDMiwweDA1LDB4MDQsMHgwMCwweDg5LDB4NDYsMHgyOCwweDJFLDB4QTEsMHg0QywweDJELDB4ODksMHg4NiwweDhFLDB4MDAsMHg4OSwKKzB4ODYsMHg5MCwweDAwLDB4ODksMHg4NiwweDkyLDB4MDAsMHhDNiwweDg2LDB4QTMsMHgwMCwweDBBLDB4QzYsMHg4NiwweEMzLDB4MDAsCisweDAzLDB4NTIsMHg4MywweEMyLDB4MDQsMHg4QSwweDg2LDB4QTYsMHgwMCwweDBDLDB4MDYsMHhFRSwweDVBLDB4ODMsMHhDMiwweDAyLAorMHhCMCwweDA1LDB4RUUsMHg4OCwweDg2LDB4QTUsMHgwMCwweEMzLDB4RTgsMHgwMywweEZGLDB4RTgsMHhFNSwweDE0LDB4QjAsMHg0MiwKKzB4RTYsMHgwQSwweEY3LDB4NDYsMHgzOCwweDgwLDB4MDAsMHg3NCwweDA2LDB4MkUsMHhBMSwweDlDLDB4MjIsMHhFQiwweDA0LDB4MkUsCisweEExLDB4NkMsMHgyMiwweEM3LDB4NDYsMHgxQywweDBDLDB4MDAsMHg4OSwweDg2LDB4OTQsMHgwMCwweDg5LDB4ODYsMHg5NiwweDAwLAorMHg4OSwweDg2LDB4OEUsMHgwMCwweDg5LDB4ODYsMHg5MCwweDAwLDB4ODksMHg4NiwweDkyLDB4MDAsMHhFNiwweEYwLDB4RTYsMHhFNCwKKzB4OEEsMHhDNCwweEU2LDB4RjgsMHhFNiwweEVDLDB4QzYsMHg4NiwweEMzLDB4MDAsMHgwMywweEU4LDB4QTUsMHgxNCwweEIwLDB4MUEsCisweEU2LDB4MEEsMHhCMCwweDEwLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4QzMsMHgzMywweEM5LDB4OEIsMHhGMSwweDhBLAorMHgwRSwweDk0LDB4MTIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwweDc0LDB4MDYsMHhFOCwKKzB4NzYsMHgxNCwweEU4LDB4NUEsMHhGRiwweDQ2LDB4NDYsMHhFMiwweEVBLDB4QzMsMHgzMywweEM5LDB4OEIsMHhGMSwweDhBLDB4MEUsCisweDk0LDB4MTIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4RjcsMHg0NiwweDM4LDB4MDAsMHgyMCwweDc0LDB4MDYsMHhFOCwweDRDLAorMHgxNCwweEU4LDB4NzQsMHhGRiwweDQ2LDB4NDYsMHhFMiwweEVBLDB4QzMsMHg5MCwweDgzLDB4M0UsMHg0NCwweDEyLDB4MDAsMHg3NSwKKzB4MTQsMHhCMCwweDAxLDB4QkEsMHgwNiwweDAxLDB4RUUsMHgyQSwweEMwLDB4RUUsMHhCMCwweDAyLDB4RUUsMHhCMCwweDA0LDB4RUUsCisweEI4LDB4MDAsMHgwMiwweEVCLDB4MEYsMHhCQSwweDA2LDB4MDEsMHhCMCwweDQwLDB4RUUsMHhCOCwweDAxLDB4MDAsMHg4QSwweDBFLAorMHgwRSwweDAxLDB4RDMsMHhFMCwweEEzLDB4ODgsMHgxMiwweEMzLDB4QTEsMHg4OCwweDEyLDB4QTMsMHg4NCwweDEyLDB4MkQsMHgyMCwKKzB4MDAsMHhBMywweDhBLDB4MTIsMHgyRCwweDIwLDB4MDAsMHhBMywweDgyLDB4MTIsMHhDNywweDA2LDB4ODYsMHgxMiwweDIwLDB4MDAsCisweEM3LDB4MDYsMHg4MCwweDEyLDB4MzIsMHgwMCwweEMzLDB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc0LDB4NzYsMHg4QiwweDBFLAorMHg0MiwweDEyLDB4MzMsMHhGNiwweDhBLDB4QTQsMHg1NCwweDEyLDB4ODQsMHhFNCwweDc0LDB4NUYsMHg4QSwweDg0LDB4NDgsMHgxMiwKKzB4MEMsMHgwNCwweEU2LDB4RkUsMHhGNiwweEM0LDB4MDQsMHg3NCwweDI1LDB4QjAsMHgxQiwweEJBLDB4MDAsMHgwMCwweEVFLDB4RUIsCisweDAwLDB4MkEsMHhDMCwweEJBLDB4MDIsMHgwMCwweEVFLDB4RUIsMHgwMCwweEIwLDB4MDMsMHhFRSwweEVCLDB4MDAsMHgzMiwweEMwLAorMHhCQSwweDAyLDB4MDAsMHhFRSwweEVCLDB4MDAsMHhCQSwweDAwLDB4MDAsMHhCMCwweDAwLDB4RUUsMHhFQiwweDJELDB4QjAsMHgxRiwKKzB4QkEsMHgwMCwweDAwLDB4RUUsMHhFQiwweDAwLDB4MkEsMHhDMCwweEJBLDB4MDIsMHgwMCwweEVFLDB4RUIsMHgwMCwweEIwLDB4MDMsCisweEVFLDB4RUIsMHgwMCwweEQxLDB4RTYsMHg4QSwweDg0LDB4NUQsMHgxMiwweEQxLDB4RUUsMHhGNiwweEQwLDB4QkEsMHgwMiwweDAwLAorMHhFRSwweEVCLDB4MDAsMHhCQSwweDAwLDB4MDAsMHhCMCwweDBBLDB4RUUsMHhFQiwweDAwLDB4RTQsMHgwNCwweEVCLDB4MDAsMHhFNCwKKzB4MDQsMHg0NiwweEUyLDB4OTAsMHhDMywweDkwLDB4QjgsMHgxNCwweDAwLDB4QkEsMHgzRSwweEZGLDB4RUYsMHhCOCwweDA2LDB4MDAsCisweEJBLDB4MzIsMHhGRiwweEVGLDB4QjgsMHgwRiwweDAwLDB4QkEsMHgzNCwweEZGLDB4RUYsMHhCQSwweDM2LDB4RkYsMHhFRiwweDgzLAorMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc1LDB4MTYsMHhCOCwweDExLDB4MDAsMHhCQSwweDM4LDB4RkYsMHhFRiwweEI4LDB4MTIsMHgwMCwKKzB4QkEsMHgzQSwweEZGLDB4RUYsMHhCOCwweDFCLDB4MDAsMHhCQSwweDNDLDB4RkYsMHhFRiwweEMzLDB4QjgsMHgxMSwweDAwLDB4QkEsCisweDM4LDB4RkYsMHhFRiwweEI4LDB4MTIsMHgwMCwweEJBLDB4M0EsMHhGRiwweEVGLDB4QjgsMHgxQiwweDAwLDB4QkEsMHgzQywweEZGLAorMHhFRiwweEMzLDB4QjgsMHhGQywweDAwLDB4QkEsMHgyOCwweEZGLDB4RUYsMHhGQiwweDgzLDB4M0UsMHg0NCwweDEyLDB4MDAsMHg3NCwKKzB4MDcsMHhCOCwweENDLDB4MDAsMHhCQSwweDI4LDB4RkYsMHhFRiwweEMzLDB4MDAsMHhGRiwweEZGLDB4MjAsMHgyNCwweDI4LDB4RkYsCisweDJDLDB4RkYsMHhGRiwweDMwLDB4MzQsMHgzOCwweEZGLDB4RkYsMHgzQywweDkwLDB4M0MsMHgwRiwweDc3LDB4MEUsMHhCQiwweDE5LAorMHgwRSwweDJFLDB4RDcsMHgzQywweEZGLDB4NzQsMHgwNSwweDhBLDB4RDgsMHhGOCwweEMzLDB4OTAsMHgyQSwweERCLDB4RjksMHhDMywKKzB4ODMsMHgzRSwweDQ0LDB4MTIsMHgwMCwweDc0LDB4MjcsMHhBMCwweDA2LDB4MDEsMHg4MCwweDI2LDB4MDYsMHgwMSwweDMwLDB4ODAsCisweDNFLDB4MDYsMHgwMSwweDMwLDB4NzUsMHgxOCwweEI5LDB4MDIsMHgwMCwweEJGLDB4QzQsMHgxMywweEJBLDB4MDYsMHgwMSwweEVDLAorMHhBOCwweDIwLDB4NzUsMHhGOCwweEJBLDB4MDQsMHgwMSwweEVELDB4QUIsMHhFMiwweEYxLDB4RUIsMHgxNiwweDkwLDB4QjksMHgwNCwKKzB4MDAsMHhCRiwweEM0LDB4MTMsMHhCQSwweDA2LDB4MDEsMHhFQywweEE4LDB4MjAsMHg3NSwweEY4LDB4QkEsMHgwNCwweDAxLDB4RUMsCisweEFBLDB4RTIsMHhGMSwweEZBLDB4OTAsMHhCRSwweEM0LDB4MTMsMHhBRCwweDgwLDB4RTQsMHgzRiwweDgwLDB4RkMsMHgwMiwweDc0LAorMHgwRSwweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MEEsMHg5QywweDBFLDB4RTgsMHgzRSwweDA0LDB4OTAsMHhBRCwKKzB4M0MsMHgwRiwweDc1LDB4RUQsMHg4QSwweEM0LDB4RTgsMHg4MSwweEZGLDB4NzIsMHhFNiwweDg4LDB4MUUsMHgxQSwweDAxLDB4QzYsCisweDA2LDB4OEUsMHgxMiwweDAwLDB4QjAsMHgwMCwweDBBLDB4MDYsMHgxQSwweDAxLDB4QkEsMHgwMCwweDAxLDB4RUUsMHhDNiwweDA2LAorMHg4RiwweDEyLDB4NDAsMHg4MywweDNFLDB4NDQsMHgxMiwweDAwLDB4NzUsMHgwNiwweEI4LDB4MEMsMHgwMCwweEVCLDB4MDQsMHg5MCwKKzB4QjgsMHg0QywweDAwLDB4QkEsMHgyOCwweEZGLDB4RUYsMHhDMywweDgzLDB4M0UsMHg0NCwweDEyLDB4MDAsMHg3NSwweDAxLDB4QzMsCisweEExLDB4NTAsMHgxMiwweDBCLDB4MDYsMHg1MiwweDEyLDB4MEEsMHhDNCwweEE4LDB4MDgsMHg3NCwweEYyLDB4QTAsMHgwRiwweDAxLAorMHgyQSwweEU0LDB4NTAsMHhGRiwweDM2LDB4QkEsMHgxMywweDFGLDB4RTgsMHg1MCwweDU2LDB4ODMsMHhDNCwweDAyLDB4NkEsMHgwMCwKKzB4MUYsMHgzMywweEMwLDB4QTMsMHhCQywweDEzLDB4QTAsMHgwRiwweDAxLDB4QTMsMHhCRSwweDEzLDB4OEIsMHgxRSwweEJDLDB4MTMsCisweDhBLDB4ODcsMHg1MCwweDEyLDB4RjYsMHg4NywweDUwLDB4MTIsMHgwOCwweDc0LDB4MEQsMHgyNCwweDA3LDB4OEEsMHhFMCwweEJFLAorMHhDQywweDAwLDB4QTAsMHhCQywweDEzLDB4RTgsMHg5NCwweDNELDB4RkYsMHgwNiwweEJDLDB4MTMsMHhGRiwweDBFLDB4QkUsMHgxMywKKzB4NzUsMHhEQSwweEMzLDB4OTAsMHgxRSwweDMzLDB4QzAsMHg4RSwweEQ4LDB4QjAsMHgwMSwweEU4LDB4NTQsMHgzRCwweDFGLDB4QzMsCisweDMzLDB4QzksMHg4QiwweEYxLDB4OEEsMHgwRSwweDk0LDB4MTIsMHgyRSwweDhCLDB4QUMsMHg0NCwweDAwLDB4QzcsMHg0NiwweDYyLAorMHgzOCwweDQ0LDB4QzcsMHg0NiwweDdDLDB4RkMsMHgzQiwweEM3LDB4NDYsMHg3RSwweEUyLDB4M0IsMHhDNywweDg2LDB4ODAsMHgwMCwKKzB4RUMsMHgzQywweEU4LDB4QUIsMHgxNiwweEM2LDB4ODYsMHhDMCwweDAwLDB4MTEsMHg4MywweDdFLDB4MDgsMHgwMCwweDc0LDB4MDcsCisweDUxLDB4NTYsMHhFOCwweDMzLDB4MzMsMHg1RSwweDU5LDB4NDYsMHg0NiwweEUyLDB4Q0QsMHhDMywweDMzLDB4QzksMHg4QiwweEYxLAorMHg4QiwweEY5LDB4OEEsMHgwRSwweDk0LDB4MTIsMHhDMSwweEU5LDB4MDIsMHhFMywweDEzLDB4MkUsMHg4QiwweEFDLDB4NDQsMHgwMCwKKzB4OEEsMHg4NiwweDlFLDB4MDAsMHg4OCwweDg1LDB4NkMsMHgxMiwweDgzLDB4QzYsMHgwOCwweDQ3LDB4RTIsMHhFRCwweEMzLDB4RkEsCisweEZDLDB4QjAsMHhDMCwweEJBLDB4MDAsMHgwMSwweEVFLDB4MzMsMHhDMCwweDhFLDB4RDgsMHg4RSwweEMwLDB4OEUsMHhEMCwweEJGLAorMHgxNiwweDAxLDB4QjksMHhDQywweDc3LDB4MkIsMHhDRiwweEQxLDB4RTksMHhGMywweEFCLDB4QkMsMHg0MCwweDEyLDB4RTgsMHhEOSwKKzB4MDIsMHhFOCwweDcwLDB4M0MsMHhCRSwweENDLDB4MEYsMHhFOCwweEYyLDB4M0MsMHhGNCwweDkwLDB4MzMsMHhDMCwweDhFLDB4RDgsCisweDhFLDB4QzAsMHg4RSwweEQwLDB4RjYsMHgwNiwweDBBLDB4MDEsMHg4MCwweDc0LDB4MEIsMHhCRSwweDM1LDB4NTUsMHhFOCwweERCLAorMHgzQywweEIwLDB4MDEsMHhFOCwweEFDLDB4M0MsMHhFOCwweEIzLDB4MDAsMHhFOCwweEY2LDB4RjUsMHhFOCwweDA4LDB4RjgsMHhFOCwKKzB4MEYsMHhGOSwweEU4LDB4ODUsMHhGQSwweEU4LDB4QjYsMHhGQSwweEU4LDB4RUYsMHhGQywweEU4LDB4QzIsMHgxMCwweEU4LDB4MDMsCisweDNDLDB4RTgsMHhCMiwweEZELDB4RTgsMHgzMCwweEZELDB4RTgsMHg1NCwweDAyLDB4QzYsMHgwNiwweDhGLDB4MTIsMHhDMCwweEU4LAorMHhCQiwweEZBLDB4RTgsMHhFQiwweEZBLDB4RTgsMHhFOSwweEZCLDB4RTgsMHhBRiwweEZDLDB4RTgsMHg4RCwweEZDLDB4RTgsMHgxRiwKKzB4RkYsMHhFOCwweDU4LDB4RkYsMHhFOCwweERCLDB4RkQsMHhFOCwweDE2LDB4RkUsMHgzMywweEMwLDB4QkUsMHg1QSwweDA1LDB4RTgsCisweDhBLDB4M0MsMHhFOCwweEEzLDB4RkUsMHhFOCwweEUwLDB4RkMsMHhGQiwweEJFLDB4QTQsMHg0NCwweEU4LDB4N0QsMHgzQywweEU5LAorMHhDQSwweDJELDB4NTYsMHg5OCwweDhCLDB4RjAsMHg4QiwweDQyLDB4NTIsMHg4NSwweEMwLDB4NzUsMHgyNywweEM3LDB4NDIsMHg1MiwKKzB4MDEsMHgwMCwweDUzLDB4MzYsMHg4QiwweDlDLDB4MkMsMHgwMSwweEY2LDB4QzMsMHgwMSwweDc1LDB4MEMsMHgzNiwweDg5LDB4NjgsCisweDUyLDB4MzYsMHg4OSwweEFDLDB4MkMsMHgwMSwweDVCLDB4NUUsMHhDMywweDM2LDB4ODksMHhBQywweDJDLDB4MDEsMHgzNiwweDg5LAorMHhBQywweDFDLDB4MDEsMHg1QiwweDVFLDB4QzMsMHg1NiwweDk4LDB4OEIsMHhGMCwweDMzLDB4RUQsMHgzNiwweDhCLDB4ODQsMHgxQywKKzB4MDEsMHhBOCwweDAxLDB4NzUsMHgxNSwweDhCLDB4RTgsMHgzMywweEMwLDB4ODcsMHg0MiwweDUyLDB4MzYsMHg4OSwweDg0LDB4MUMsCisweDAxLDB4QTgsMHgwMSwweDc0LDB4MDUsMHgzNiwweDg5LDB4ODQsMHgyQywweDAxLDB4NUUsMHhDMywweDU2LDB4NTEsMHgzMywweEY2LAorMHhCOCwweDAxLDB4MDAsMHhCOSwweDA4LDB4MDAsMHg4OSwweDg0LDB4MUMsMHgwMSwweDg5LDB4ODQsMHgyQywweDAxLDB4NDYsMHg0NiwKKzB4RTIsMHhGNCwweDU5LDB4NUUsMHhDMywweDkwLDB4QkIsMHgwMSwweDAwLDB4OEIsMHhFOCwweEZGLDB4NEUsMHg2RSwweDc0LDB4MEEsCisweDhCLDB4REQsMHg4QiwweDQ2LDB4NTgsMHhBOCwweDAxLDB4NzQsMHhGMCwweEMzLDB4OEIsMHg0NiwweDQ4LDB4QTksMHgwOCwweDAwLAorMHg3NCwweDQ1LDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwweDc0LDB4MjcsMHhFOCwweDVDLDB4MTAsMHg4MCwweEMyLDB4MDYsMHg4QSwKKzB4ODYsMHhBOCwweDAwLDB4MjQsMHhCRiwweDg4LDB4ODYsMHhBOCwweDAwLDB4RUUsMHg2MCwweEIwLDB4RkUsMHhFOCwweDg2LDB4MzIsCisweDYxLDB4QjAsMHgwMiwweEU4LDB4NEMsMHhGRiwweDhCLDB4NDYsMHg0OCwweDI0LDB4RjcsMHg4OSwweDQ2LDB4NDgsMHhFQiwweDE3LAorMHhFOCwweDJBLDB4MTAsMHg4MSwweDRFLDB4MjYsMHgwMCwweDQwLDB4OEEsMHg4NiwweEE1LDB4MDAsMHgwQywweDAyLDB4ODgsMHg4NiwKKzB4QTUsMHgwMCwweEU2LDB4MEMsMHg4QiwweDQ2LDB4NDgsMHhBOSwweDA0LDB4MDAsMHg3NCwweDE0LDB4QjAsMHgwMiwweEU4LDB4MjEsCisweEZGLDB4OEIsMHg0NiwweDQ4LDB4MjQsMHhGQiwweDg5LDB4NDYsMHg0OCwweDYwLDB4QjAsMHhERiwweEU4LDB4NDcsMHgzMiwweDYxLAorMHgzMywweEMwLDB4ODcsMHg0NiwweDU4LDB4RjYsMHhDMywweDAxLDB4NzUsMHgwQiwweDM2LDB4ODksMHg0NywweDU4LDB4QTgsMHgwMSwKKzB4NzUsMHgwRCwweEU5LDB4NzQsMHhGRiwweEEzLDB4MjIsMHgwMSwweEE4LDB4MDEsMHg3NSwweDAzLDB4RTksMHg2QSwweEZGLDB4ODksCisweDFFLDB4MzIsMHgwMSwweEMzLDB4QkIsMHgwMSwweDAwLDB4OEIsMHhFOCwweEY3LDB4NDYsMHgzOCwweDQwLDB4MDAsMHg3NCwweDE1LAorMHhFOCwweEQ1LDB4MEYsMHg4MCwweEMyLDB4MEEsMHhFQywweEE4LDB4NDAsMHg3NSwweDBBLDB4OEIsMHhERCwweDhCLDB4NDYsMHg1NiwKKzB4QTgsMHgwMSwweDc0LDB4RTMsMHhDMywweDhCLDB4NDYsMHgyNiwweDgwLDB4RTQsMHhGRSwweDgwLDB4Q0MsMHgwMiwweDg5LDB4NDYsCisweDI2LDB4QjAsMHgwMiwweEU4LDB4QkMsMHhGRSwweDMzLDB4QzAsMHg4NywweDQ2LDB4NTYsMHhGNiwweEMzLDB4MDEsMHg3NSwweDBBLAorMHgzNiwweDg5LDB4NDcsMHg1NiwweEE4LDB4MDEsMHg3NSwweDBCLDB4RUIsMHhCRCwweEEzLDB4MjAsMHgwMSwweEE4LDB4MDEsMHg3NSwKKzB4MDIsMHhFQiwweEI0LDB4ODksMHgxRSwweDMwLDB4MDEsMHhDMywweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTAsCisweDkwLDB4MTIsMHg4NCwweEMwLDB4NzUsMHg0OSwweEExLDB4MjIsMHgwMSwweEE4LDB4MDEsMHg3NSwweDAzLDB4RTgsMHhGNiwweEZFLAorMHhBMSwweDIwLDB4MDEsMHhBOCwweDAxLDB4NzUsMHgwMywweEU4LDB4OEEsMHhGRiwweEExLDB4QUMsMHgxMywweDQ4LDB4NzgsMHgwNSwKKzB4NzQsMHg0NSwweEEzLDB4QUMsMHgxMywweEExLDB4QUUsMHgxMywweDQ4LDB4NzgsMHgwNSwweDc0LDB4NTEsMHhBMywweEFFLDB4MTMsCisweEExLDB4QjAsMHgxMywweDQ4LDB4NzgsMHgwNSwweDc0LDB4NjMsMHhBMywweEIwLDB4MTMsMHhBMSwweDdFLDB4MTIsMHg0MCwweDc4LAorMHgwMywweEEzLDB4N0UsMHgxMiwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwweEVGLDB4MDcsMHgxRiwweDYxLDB4Q0YsMHhBMCwKKzB4OTEsMHgxMiwweDQwLDB4M0MsMHgwMiwweDcyLDB4MEIsMHgzMywweEMwLDB4QTIsMHg5MSwweDEyLDB4RkYsMHgxNiwweDdDLDB4MTIsCisweEVCLDB4QTQsMHhBMiwweDkxLDB4MTIsMHhFQiwweDlGLDB4QTAsMHg4RSwweDEyLDB4MzIsMHgwNiwweDhGLDB4MTIsMHhBMiwweDhFLAorMHgxMiwweDBBLDB4MDYsMHgxQSwweDAxLDB4QkEsMHgwMCwweDAxLDB4RUUsMHhCOCwweDJDLDB4MDEsMHhFQiwweEE0LDB4ODMsMHgzRSwKKzB4ODQsMHgxMiwweDEwLDB4NzIsMHgxMSwweEJBLDB4MjgsMHhGRiwweEVELDB4MEMsMHg4MSwweEVGLDB4RTgsMHg1MywweDM3LDB4QkEsCisweDI4LDB4RkYsMHhFRCwweDI0LDB4N0UsMHhFRiwweEI4LDB4MDQsMHgwMCwweEVCLDB4OTIsMHhDNiwweDA2LDB4OEQsMHgxMiwweDAxLAorMHhFOCwweDNGLDB4MzcsMHhDNiwweDA2LDB4OEQsMHgxMiwweDAwLDB4QTEsMHhCMiwweDEzLDB4RUIsMHg4QiwweDkwLDB4OEEsMHgxRSwKKzB4MEIsMHgwMSwweDJBLDB4RkYsMHg2QiwweEMzLDB4MTksMHhCQSwweDYyLDB4RkYsMHhFRiwweEI4LDB4MEEsMHgwMCwweEJBLDB4NjAsCisweEZGLDB4RUYsMHhCOCwweDAxLDB4RTAsMHhCQSwweDY2LDB4RkYsMHhFRiwweEI4LDB4RkYsMHhGRiwweEJBLDB4NTIsMHhGRiwweEVGLAorMHhCOCwweDA5LDB4QzAsMHhCQSwweDU2LDB4RkYsMHhFRiwweEM3LDB4MDYsMHhBQywweDEzLDB4MkMsMHgwMSwweEM3LDB4MDYsMHhBRSwKKzB4MTMsMHgwNCwweDAwLDB4QzYsMHgwNiwweDkxLDB4MTIsMHgwMCwweEMzLDB4OTAsMHg4QSwweDFFLDB4MEIsMHgwMSwweDJBLDB4RkYsCisweDZCLDB4QzMsMHgwNSwweEQxLDB4RTgsMHhBMywweDE4LDB4MDEsMHhDMywweDkwLDB4NTIsMHhCQSwweDUwLDB4RkYsMHhFRCwweDVBLAorMHhDMywweDkwLDB4NTMsMHg1MSwweDhCLDB4MUUsMHgxOCwweDAxLDB4QjksMHgzMiwweDA1LDB4OTAsMHhFMiwweEZFLDB4NEIsMHg3NSwKKzB4RjcsMHg1OSwweDVCLDB4QzMsMHhCMCwweDgwLDB4QkEsMHgwMCwweDAxLDB4MEEsMHgwNiwweDFBLDB4MDEsMHhFRSwweEMzLDB4OTAsCisweEIwLDB4NDAsMHhFQiwweEYyLDB4QjAsMHhDMCwweEVCLDB4RUUsMHhCMCwweDAwLDB4RUIsMHhFQSwweEZBLDB4NjAsMHgwNiwweDFFLAorMHgxNiwweDJCLDB4REIsMHg4RSwweERCLDB4MkUsMHhBMSwweEJBLDB4NEMsMHgyRSwweEEzLDB4OTIsMHg0QywweEEwLDB4OTMsMHgxMiwKKzB4OTgsMHg4QiwweEU4LDB4ODksMHgyNiwweDJELDB4N0EsMHg4MCwweDNFLDB4Q0EsMHgxMywweDAwLDB4NzQsMHgwMywweEU5LDB4NkIsCisweDQyLDB4RTgsMHhDMCwweEZGLDB4RTgsMHhBQiwweEZGLDB4RTgsMHhBOCwweEZGLDB4QjAsMHgyMCwweEM2LDB4MDYsMHg5MCwweDEyLAorMHgwMCwweEZGLDB4MTYsMHg3QywweDEyLDB4OEIsMHhGRCwweDgzLDB4RkYsMHgwQSwweDcyLDB4MTEsMHhFOCwweEI5LDB4RkYsMHhFOCwKKzB4OTAsMHhGRiwweEU4LDB4QUIsMHhGRiwweEU4LDB4OEEsMHhGRiwweDgzLDB4RUYsMHgwQSwweEVCLDB4RUEsMHgwQiwweEZGLDB4NzQsCisweDBGLDB4RTgsMHhBNCwweEZGLDB4RTgsMHg3QiwweEZGLDB4RTgsMHg5QSwweEZGLDB4RTgsMHg3NSwweEZGLDB4NEYsMHg3NSwweEYxLAorMHhFOCwweDk1LDB4RkYsMHhFOCwweDZDLDB4RkYsMHhFQiwweEI5LDB4OEEsMHg4NiwweEE1LDB4MDAsMHgyNCwweEZELDB4RUUsMHg4OCwKKzB4ODYsMHhBNSwweDAwLDB4QzMsMHg4QSwweDg2LDB4QTYsMHgwMCwweDBDLDB4MDIsMHhFRSwweEMzLDB4OEIsMHg3NiwweDM4LDB4RjcsCisweEM2LDB4MDEsMHgwMCwweDc0LDB4RUYsMHg4QiwweDRFLDB4MzYsMHg4QiwweDQ2LDB4MkUsMHgzQiwweEMxLDB4NzMsMHgwMiwweDhCLAorMHhDOCwweDJCLDB4QzEsMHg4OSwweDQ2LDB4MkUsMHgwMSwweDRFLDB4MzQsMHhDNCwweDdFLDB4MDQsMHgyNiwweDAxLDB4MEQsMHg4QiwKKzB4N0UsMHgyQywweDgzLDB4RUEsMHgwNCwweEYzLDB4NkMsMHg4RSwweEMxLDB4ODksMHg3RSwweDJDLDB4M0IsMHg0NiwweDNDLDB4NzIsCisweDEyLDB4RjcsMHhDNiwweDIwLDB4MDAsMHg3NSwweDBCLDB4ODMsMHhDRSwweDIwLDB4ODksMHg3NiwweDM4LDB4QjAsMHgwMCwweEU4LAorMHhBMCwweEZDLDB4QzMsMHhGNywweEM2LDB4MDQsMHgwMCwweDc0LDB4MUIsMHg4QiwweEQ4LDB4ODMsMHhDRSwweDEwLDB4ODksMHg3NiwKKzB4MzgsMHg4QSwweDg2LDB4QTcsMHgwMCwweDI0LDB4RkUsMHg4OCwweDg2LDB4QTcsMHgwMCwweDgzLDB4QzIsMHgwOCwweEVFLDB4ODMsCisweEVBLDB4MDgsMHg4QiwweEMzLDB4M0QsMHg0MCwweDAwLDB4NzIsMHgwMSwweEMzLDB4ODEsMHg0RSwweDM4LDB4MDAsMHgwNCwweDgzLAorMHhDMiwweDAyLDB4OEEsMHg4NiwweEE1LDB4MDAsMHgyNCwweEZBLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFRSwweEMzLDB4OEEsMHg4NiwKKzB4QTYsMHgwMCwweDBDLDB4MDIsMHhFRSwweEMzLDB4RjcsMHg0NiwweDM4LDB4MDEsMHgwMCwweDc0LDB4RjEsMHg4QiwweDRFLDB4MkUsCisweDMyLDB4REIsMHg4QSwweEJFLDB4QTMsMHgwMCwweDgzLDB4QzIsMHgwNiwweEM0LDB4NzYsMHgwNCwweDhCLDB4N0UsMHgyQywweDgzLAorMHhGOSwweDA4LDB4NzIsMHgyQywweEVDLDB4QTgsMHgwMSwweDc0LDB4MTYsMHg4QSwweEUwLDB4ODMsMHhFQSwweDBBLDB4RUMsMHg4MywKKzB4QzIsMHgwQSwweDg0LDB4RTcsMHg3NSwweDUxLDB4QUEsMHhGRSwweEMzLDB4NDksMHg4MywweEY5LDB4MDgsMHg3MywweEU1LDB4MzIsCisweEZGLDB4MjYsMHgwMSwweDFDLDB4MDEsMHg1RSwweDM0LDB4ODksMHg3NiwweDA0LDB4ODksMHg0RSwweDJFLDB4ODksMHg3RSwweDJDLAorMHgzQiwweDRFLDB4M0MsMHg3MiwweDExLDB4RjYsMHg0NiwweDM4LDB4MjAsMHg3NCwweDAxLDB4QzMsMHg4MywweDRFLDB4MzgsMHgyMCwKKzB4QjAsMHgwMCwweEU4LDB4RkQsMHhGQiwweEMzLDB4RjYsMHg0NiwweDM4LDB4MDQsMHg3NCwweDE1LDB4ODMsMHg0RSwweDM4LDB4MTAsCisweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsMHhGRSwweDg4LDB4ODYsMHhBNywweDAwLDB4ODMsMHhFQSwweDAyLDB4RUUsMHg4MywweEMyLAorMHgwMiwweDNELDB4NDAsMHgwMCwweDcyLDB4NUQsMHhDMywweDMyLDB4RkYsMHgyNiwweDAzLDB4MUMsMHg4NSwweERCLDB4NzQsMHgwOSwKKzB4MjYsMHg4OSwweDFDLDB4OEIsMHhGNywweDQ3LDB4NDcsMHg0OSwweDQ5LDB4ODAsMHhFNCwweDFFLDB4ODAsMHhDQywweEMwLDB4MjYsCisweDg5LDB4MDQsMHhGNiwweEM0LDB4MTAsMHg3NCwweDI3LDB4OEIsMHg3NiwweDM4LDB4RjcsMHhDNiwweDAwLDB4MTAsMHg3NCwweDBCLAorMHg1MCwweEZFLDB4ODYsMHhCMiwweDAwLDB4QjAsMHgwQSwweEU4LDB4QTgsMHhGQiwweDU4LDB4RjcsMHhDNiwweDAwLDB4MDEsMHg3NCwKKzB4MEQsMHhFOCwweDgyLDB4MjYsMHg4QiwweDc2LDB4MzgsMHg4QiwweDRFLDB4MkUsMHg4QiwweDdFLDB4MDQsMHhBQiwweDhCLDB4RjcsCisweDMzLDB4QzAsMHhBQiwweDMyLDB4REIsMHg4QSwweEJFLDB4QTMsMHgwMCwweDQ5LDB4NDksMHg4MywweEY5LDB4MDgsMHg3MiwweDE3LAorMHhFOSwweDQxLDB4RkYsMHg4MSwweDRFLDB4MzgsMHgwMCwweDA0LDB4ODMsMHhDMiwweEY4LDB4OEEsMHg4NiwweEE1LDB4MDAsMHgyNCwKKzB4RkEsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVFLDB4QzMsMHhFOSwweDQ1LDB4RkYsMHg4MywweEMyLDB4MDgsMHhFQywweDg4LDB4ODYsCisweEFBLDB4MDAsMHhDMCwweEU4LDB4MDQsMHg4QSwweEUwLDB4OEEsMHhDOCwweDg2LDB4ODYsMHhBOSwweDAwLDB4MzIsMHhFMCwweDhCLAorMHg1RSwweDNFLDB4ODQsMHhFMywweDc0LDB4NEYsMHg4QSwweEMxLDB4OEIsMHg0RSwweDI2LDB4RjYsMHhDNSwweDA0LDB4NzQsMHgwQywKKzB4QTgsMHgwOCwweDc0LDB4MDUsMHg4MCwweEUxLDB4QkYsMHhFQiwweDAzLDB4ODAsMHhDOSwweDQwLDB4RjYsMHhDNSwweDA4LDB4NzQsCisweDBDLDB4QTgsMHgwMiwweDc0LDB4MDUsMHg4MCwweEUxLDB4N0YsMHhFQiwweDAzLDB4ODAsMHhDOSwweDgwLDB4ODgsMHg0RSwweDI2LAorMHg4QiwweEYwLDB4OEEsMHg4NiwweEE1LDB4MDAsMHg4NCwweEM5LDB4NzQsMHgwOCwweEE4LDB4MDIsMHg3NCwweDE1LDB4MjQsMHhGRCwKKzB4RUIsMHgwNiwweEE4LDB4MDIsMHg3NSwweDBELDB4MEMsMHgwMiwweDg4LDB4ODYsMHhBNSwweDAwLDB4ODMsMHhFQSwweDBBLDB4RUUsCisweDgzLDB4QzIsMHgwQSwweDhCLDB4QzYsMHg4NCwweEU3LDB4NzUsMHgwMSwweEMzLDB4QzYsMHg4NiwweEJBLDB4MDAsMHgwMSwweEIwLAorMHgwRSwweEU4LDB4RUUsMHhGQSwweEY3LDB4NDYsMHgzOCwweDAwLDB4MDIsMHg3NCwweEVFLDB4ODMsMHg3RSwweDJFLDB4MDYsMHg3MiwKKzB4RTgsMHg4QSwweEE2LDB4QUEsMHgwMCwweEM0LDB4NUUsMHgwNCwweDhCLDB4N0UsMHgyQywweEIwLDB4RkYsMHhBQSwweEIwLDB4MDIsCisweEFCLDB4MjYsMHg4MywweDA3LDB4MDMsMHg4MywweDZFLDB4MkUsMHgwMywweDg5LDB4N0UsMHgyQywweEY2LDB4NDYsMHgzOCwweDIwLAorMHg3NCwweDAxLDB4QzMsMHg4MywweDRFLDB4MzgsMHgyMCwweEIwLDB4MDAsMHhFOCwweEI2LDB4RkEsMHhDMywweDkwLDB4ODMsMHhFQSwKKzB4MDgsMHhFOSwweEI0LDB4RkQsMHg4MywweEMyLDB4MDYsMHg4QiwweDVFLDB4MjYsMHhGNiwweEMzLDB4QzAsMHg3NSwweEVGLDB4OEIsCisweDRFLDB4MUMsMHhFQywweDg4LDB4ODYsMHhBNCwweDAwLDB4ODMsMHhFQSwweDBBLDB4QTgsMHgyMCwweDc1LDB4MDIsMHg4QSwweENELAorMHgzMiwweEVELDB4OEIsMHg0NiwweDFBLDB4M0IsMHhDOCwweDczLDB4MTgsMHgwMSwweDRFLDB4MkEsMHgyQiwweEMxLDB4ODksMHg0NiwKKzB4MUEsMHhDNSwweDc2LDB4MDAsMHhGMywweDZFLDB4OEUsMHhEOSwweDg5LDB4NzYsMHgwMCwweDNELDB4MjAsMHgwMCwweDcyLDB4MzAsCisweEMzLDB4ODUsMHhDMCwweDc0LDB4MzEsMHg4QiwweEM4LDB4MDEsMHg0NiwweDJBLDB4QzUsMHg3NiwweDAwLDB4RjMsMHg2RSwweDhFLAorMHhEOSwweDgwLDB4Q0IsMHgwMiwweDg5LDB4NUUsMHgyNiwweEU4LDB4MzIsMHhGMSwweEY2LDB4QzcsMHgwMSwweDc1LDB4MTYsMHg4MywKKzB4QzIsMHgwMiwweEU4LDB4NTMsMHhGRCwweEY2LDB4QzcsMHgxMCwweDc1LDB4MEIsMHhCMCwweDAyLDB4RTgsMHg0MywweEZBLDB4QzMsCisweEY2LDB4QzcsMHgwMSwweDc0LDB4RjAsMHhDMywweDgwLDB4Q0IsMHgwMiwweDg5LDB4NUUsMHgyNiwweEY2LDB4QzcsMHgwMSwweDc0LAorMHhERSwweDgzLDB4QzIsMHgwMiwweEU4LDB4MzEsMHhGRCwweEY2LDB4ODYsMHhBNCwweDAwLDB4NDAsMHg3NCwweDBCLDB4ODAsMHhFNywKKzB4RkUsMHg4MCwweENGLDB4MDIsMHg4OSwweDVFLDB4MjYsMHhFQiwweENDLDB4QjAsMHgwNCwweEU4LDB4MTQsMHhGQSwweEMzLDB4QzAsCisweEMyLDB4QzgsMHhDQSwweEM0LDB4QzYsMHhDQywweENFLDB4RDAsMHhEMiwweEQ4LDB4REEsMHhENCwweEQ2LDB4REMsMHhERSwweDkwLAorMHhFOSwweDBFLDB4MDEsMHhFNCwweEM0LDB4OEEsMHhFMCwweEU0LDB4QzQsMHg4QiwweEQwLDB4ODMsMHhGOSwweDA4LDB4NzIsMHhGMCwKKzB4MjYsMHg4MywweDNGLDB4MDAsMHg3NCwweDA0LDB4OEIsMHhERiwweDQ5LDB4NDksMHg4QiwweEZCLDB4OEEsMHhERSwweDgzLDB4RTMsCisweDBGLDB4MkUsMHg4QSwweEE3LDB4MkYsMHgxNiwweEFCLDB4RjYsMHhDNCwweDEwLDB4NzQsMHgyNCwweEY3LDB4QzYsMHgwMCwweDEwLAorMHg3NCwweDBCLDB4NTAsMHhGRSwweDg2LDB4QjIsMHgwMCwweEIwLDB4MEEsMHhFOCwweEM2LDB4RjksMHg1OCwweEY3LDB4QzYsMHgwMCwKKzB4MDEsMHg3NCwweDBELDB4RTgsMHhBMCwweDI0LDB4OEIsMHg3NiwweDM4LDB4OEIsMHg0RSwweDJFLDB4OEIsMHg3RSwweDA0LDB4QUIsCisweDg5LDB4N0UsMHgwNCwweDMzLDB4QzAsMHhBQiwweDQ5LDB4NDksMHg4OSwweDRFLDB4MkUsMHg4OSwweDdFLDB4MkMsMHg4QiwweEMxLAorMHhFQiwweDRFLDB4OTAsMHhFQiwweDlFLDB4OTAsMHhFNCwweEQ2LDB4ODQsMHhDMCwweDc5LDB4NjMsMHhFNiwweEQwLDB4OEEsMHhDOCwKKzB4MjUsMHgwMywweDAwLDB4MDMsMHhEOCwweEQxLDB4RTMsMHgyRSwweDhCLDB4QUYsMHg0NCwweDAwLDB4ODgsMHg4RSwweEFFLDB4MDAsCisweDhCLDB4NEUsMHgyRSwweEM0LDB4NUUsMHgwNCwweDhCLDB4N0UsMHgyQywweDhCLDB4NzYsMHgzOCwweEU0LDB4ODYsMHgyNCwweDA3LAorMHgzQywweDAzLDB4NzUsMHhDRiwweEU0LDB4MUMsMHg5MSwweDNCLDB4QzEsMHg3MywweDAyLDB4OEIsMHhDOCwweDJCLDB4QzEsMHg4OSwKKzB4NDYsMHgyRSwweDAxLDB4NEUsMHgzNCwweDI2LDB4MDEsMHgwRiwweEJBLDB4QzQsMHgwMCwweEYzLDB4NkMsMHg4OSwweDdFLDB4MkMsCisweDNCLDB4NDYsMHgzQywweDcyLDB4MUMsMHhGNywweEM2LDB4MjAsMHgwMCwweDc1LDB4MEIsMHg4MywweENFLDB4MjAsMHg4OSwweDc2LAorMHgzOCwweEIwLDB4MDAsMHhFOCwweDNDLDB4RjksMHg4QSwweDg2LDB4QUUsMHgwMCwweDI0LDB4M0YsMHhFNiwweEQ2LDB4QzMsMHhGOSwKKzB4QzMsMHhGNywweEM2LDB4MEEsMHgwMCwweDc0LDB4MzUsMHhGNywweEM2LDB4MTAsMHgwMCwweDc1LDB4MkYsMHg4MywweENFLDB4MTAsCisweDg5LDB4NzYsMHgzOCwweEY3LDB4QzYsMHgwMiwweDAwLDB4NzQsMHgwRSwweDUwLDB4RTQsMHhEOCwweDI0LDB4RkUsMHhFNiwweEQ4LAorMHg1OCwweEY3LDB4QzYsMHgwOCwweDAwLDB4NzQsMHgxNSwweDUwLDB4NTEsMHhCOSwweEU4LDB4MDMsMHhFNCwweDBBLDB4ODQsMHhDMCwKKzB4RTAsMHhGQSwweDg0LDB4QzAsMHg3NSwweDA0LDB4QjAsMHgyNCwweEU2LDB4MEEsMHg1OSwweDU4LDB4M0QsMHg0MCwweDAwLDB4NzMsCisweEI1LDB4OEEsMHg4NiwweEE1LDB4MDAsMHgyNCwweEVGLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4ODEsMHhDRSwweDEwLAorMHgwNCwweDg5LDB4NzYsMHgzOCwweEVCLDB4QTAsMHgwMCwweDA4LDB4MDQsMHgwQywweDAxLDB4MDksMHgwNSwweDBELDB4MDIsMHgwQSwKKzB4MDYsMHgwRSwweDAzLDB4MEIsMHgwNywweDBGLDB4MDAsMHg0MCwweDgwLDB4QzAsMHgyMCwweDYwLDB4QTAsMHhFMCwweDEwLDB4NTAsCisweDkwLDB4RDAsMHgzMCwweDcwLDB4QjAsMHhGMCwweEU0LDB4RDIsMHhFNiwweEQwLDB4OEEsMHhDOCwweDI1LDB4MDMsMHgwMCwweDAzLAorMHhEOCwweEQxLDB4RTMsMHgyRSwweDhCLDB4QUYsMHg0NCwweDAwLDB4ODgsMHg4RSwweEFFLDB4MDAsMHhFNCwweEQ4LDB4QzAsMHhFOCwKKzB4MDQsMHg4QiwweEQ4LDB4MkUsMHg4QSwweDg3LDB4NjYsMHgxNywweDhBLDB4RTAsMHg4QSwweEM4LDB4ODYsMHg4NiwweEE5LDB4MDAsCisweDMyLDB4RTAsMHhFNCwweDk4LDB4OEIsMHg1RSwweDNFLDB4ODQsMHhFMywweDc0LDB4NTQsMHg4QSwweEMxLDB4OEIsMHg0RSwweDI2LAorMHhGNiwweEM1LDB4MDQsMHg3NCwweDBDLDB4QTgsMHgwOCwweDc0LDB4MDUsMHg4MCwweEUxLDB4QkYsMHhFQiwweDAzLDB4ODAsMHhDOSwKKzB4NDAsMHhGNiwweEM1LDB4MDgsMHg3NCwweDBDLDB4QTgsMHgwMiwweDc0LDB4MDUsMHg4MCwweEUxLDB4N0YsMHhFQiwweDAzLDB4ODAsCisweEM5LDB4ODAsMHg4OCwweDRFLDB4MjYsMHg4QiwweEYwLDB4OEEsMHg4NiwweEE1LDB4MDAsMHhGNiwweEMxLDB4RkQsMHg3NCwweDA4LAorMHhBOCwweDA2LDB4NzQsMHgxOSwweDI0LDB4RjksMHhFQiwweDBGLDB4QTgsMHgwNiwweDc1LDB4MTEsMHhGNiwweEM1LDB4MDEsMHg3NSwKKzB4MDQsMHgwQywweDA0LDB4RUIsMHgwMiwweDBDLDB4MDIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg4QiwweEM2LDB4ODQsCisweEU3LDB4NzUsMHgwOSwweDhBLDB4ODYsMHhBRSwweDAwLDB4MjQsMHgzRiwweEU2LDB4RDIsMHhDMywweEM2LDB4ODYsMHhCQSwweDAwLAorMHgwMSwweEIwLDB4MEUsMHhFOCwweDFDLDB4RjgsMHhGNywweDQ2LDB4MzgsMHgwMCwweDAyLDB4NzQsMHhFNiwweDgzLDB4N0UsMHgyRSwKKzB4MDYsMHg3MiwweEUwLDB4OEEsMHg4NiwweEE5LDB4MDAsMHg4QSwweEUwLDB4ODYsMHg4NiwweEFBLDB4MDAsMHg4QSwweEM4LDB4MzIsCisweEM0LDB4ODAsMHhDOSwweDBCLDB4MjIsMHhDMSwweEMwLDB4RTQsMHgwNCwweDBBLDB4RTAsMHhDNCwweDVFLDB4MDQsMHg4QiwweDdFLAorMHgyQywweEIwLDB4RkYsMHhBQSwweEIwLDB4MDIsMHhBQiwweDI2LDB4ODMsMHgwNywweDAzLDB4ODMsMHg2RSwweDJFLDB4MDMsMHg4OSwKKzB4N0UsMHgyQywweEY2LDB4NDYsMHgzOCwweDIwLDB4NzUsMHhBQiwweDgzLDB4NEUsMHgzOCwweDIwLDB4QjAsMHgwMCwweEU4LDB4RDEsCisweEY3LDB4RUIsMHhBMCwweDkwLDB4RTQsMHgxMiwweDI0LDB4REYsMHhFNiwweDEyLDB4ODEsMHhFMywweEZFLDB4OUYsMHg4OSwweDVFLAorMHgyNiwweDgzLDB4NjYsMHg0OCwweEY3LDB4RUIsMHg3MywweDkwLDB4RjYsMHhDNywweDIwLDB4NzUsMHhFNywweEU0LDB4MTIsMHgwQywKKzB4MjAsMHhFNiwweDEyLDB4MzIsMHhDMCwweEU2LDB4QzYsMHhCMCwweDgzLDB4RTYsMHhDNiwweDgwLDB4Q0YsMHgyMCwweDg5LDB4NUUsCisweDI2LDB4OEEsMHg4NiwweEE1LDB4MDAsMHgwQywweDAyLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4RUIsMHg3NCwweDkwLAorMHhGNiwweEM3LDB4NDAsMHg3NSwweEQzLDB4RTQsMHgxMiwweDBDLDB4MjAsMHhFNiwweDEyLDB4MzIsMHhDMCwweEU2LDB4QzYsMHhCMCwKKzB4ODEsMHhFNiwweEM2LDB4ODAsMHhFNywweERGLDB4ODAsMHhDQiwweDAxLDB4ODksMHg1RSwweDI2LDB4QjAsMHgwNiwweEU4LDB4NzEsCisweEY3LDB4OTAsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RjksMHhFNiwweDBDLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFQiwweDQzLAorMHhFNCwweEQ0LDB4RTYsMHhEMCwweDhCLDB4RjgsMHgyNSwweDAzLDB4MDAsMHgwMywweEQ4LDB4RDEsMHhFMywweDJFLDB4OEIsMHhBRiwKKzB4NDQsMHgwMCwweDhCLDB4NUUsMHgyNiwweEY2LDB4QzcsMHg2MCwweDc1LDB4QjYsMHhGNiwweEMzLDB4QzAsMHg3NSwweEQzLDB4QkEsCisweEM2LDB4MDAsMHg4QiwweDRFLDB4MUMsMHg4QiwweDQ2LDB4MUEsMHgzQiwweEM4LDB4NzMsMHgxRSwweDAxLDB4NEUsMHgyQSwweDJCLAorMHhDMSwweDg5LDB4NDYsMHgxQSwweEM1LDB4NzYsMHgwMCwweEYzLDB4NkUsMHg4RSwweEQ5LDB4ODksMHg3NiwweDAwLDB4M0QsMHgyMCwKKzB4MDAsMHg3MiwweDNELDB4OEIsMHhDNywweDI0LDB4M0YsMHhFNiwweEQ0LDB4QzMsMHg4NSwweEMwLDB4NzQsMHgzOSwweDhCLDB4QzgsCisweDAxLDB4NDYsMHgyQSwweEM1LDB4NzYsMHgwMCwweEYzLDB4NkUsMHg4RSwweEQ5LDB4ODMsMHhDQiwweDAyLDB4ODksMHg1RSwweDI2LAorMHhFOCwweEQ5LDB4RUQsMHhGNiwweEM3LDB4MDEsMHg3NSwweDM5LDB4OEEsMHg4NiwweEE1LDB4MDAsMHgyNCwweEY5LDB4RTYsMHgwQywKKzB4ODgsMHg4NiwweEE1LDB4MDAsMHhGNiwweEM3LDB4MTAsMHg3NSwweENBLDB4QjAsMHgwMiwweEU4LDB4RTQsMHhGNiwweEVCLDB4QzMsCisweEY2LDB4QzcsMHgwMSwweDc0LDB4RUYsMHhFQiwweEJDLDB4RjYsMHhDNywweDAxLDB4NzQsMHhEQywweDhBLDB4ODYsMHhBNSwweDAwLAorMHhBOCwweDAyLDB4NzQsMHgxMSwweDgxLDB4RTMsMHhGRiwweEZFLDB4ODEsMHhDQiwweDAwLDB4MDIsMHg4OSwweDVFLDB4MjYsMHhFQiwKKzB4QzcsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkIsMHgwQywweDAyLDB4RTYsMHgwQywweDg4LDB4ODYsMHhBNSwweDAwLDB4RUIsCisweDkyLDB4OTAsMHhGRCwweEY3LDB4REYsMHg3RiwweEZFLDB4RkIsMHhFRiwweEJGLDB4MDAsMHgwNCwweDAwLDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDEsMHgwNCwweDAwLDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwMiwweDA0LDB4MDAsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwMSwweDA0LDB4MDAsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA3LDB4MDQsMHgwNywweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA3LDB4MDQsMHgwNywweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDcsMHgwNCwweDA3LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDcsMHgwNCwweDA3LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwMywweDA0LDB4MDAsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwMSwweDA0LDB4MDAsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDAyLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDAxLDB4MDQsMHgwMCwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNiwweDA0LDB4MDYsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDcsMHgwNCwweDA3LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDcsMHgwNCwweDA3LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwKKzB4MDUsMHgwNCwweDA2LDB4MDQsMHgwNiwweDA0LDB4MDUsMHgwNCwweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsCisweDA1LDB4MDQsMHgwNywweDA0LDB4MDcsMHgwNCwweDA1LDB4MDQsMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LAorMHgwNSwweDA0LDB4MDYsMHgwNCwweDA2LDB4MDQsMHgwNSwweDA0LDB4MDUsMHgwNCwweDMzLDB4REIsMHg4QSwweEQ4LDB4OEEsMHg4NywKKzB4NkMsMHgxMiwweEU2LDB4RkUsMHhDMSwweEUzLDB4MDIsMHhFNCwweENFLDB4QTgsMHgwNCwweDc1LDB4MDksMHhBOCwweDAyLDB4NzQsCisweDAzLDB4RTksMHgyQywweEZFLDB4RjksMHhDMywweDUwLDB4NTMsMHhFOCwweENCLDB4RkMsMHg1QiwweDU4LDB4QTgsMHgwMiwweDc0LAorMHgwMywweEU5LDB4MUMsMHhGRSwweEY4LDB4QzMsMHgzMywweERCLDB4OEEsMHhEOCwweDhBLDB4ODcsMHg2QywweDEyLDB4RTYsMHhGRSwKKzB4QzEsMHhFMywweDAyLDB4RTksMHhEMCwweEZCLDB4OUEsMHgxQSwweEM2LDB4MUEsMHgwMCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MDgsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDBBLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MEMsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwQSwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MDgsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDBFLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MEEsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwQywweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MDgsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLAorMHgwMiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgwMCwweDBBLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwKKzB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsCisweDAyLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMiwweDAwLDB4QzMsMHg5MCwweERBLDB4MTQsMHg5NCwweDE1LAorMHg1QywweDEzLDB4RTYsMHgxMywweERBLDB4MUIsMHhEQSwweDFCLDB4RTYsMHgxMywweERBLDB4MUIsMHg4QiwweDk0LDB4NjQsMHgxMiwKKzB4QzEsMHhFNiwweDA0LDB4QTgsMHgwMSwweDc0LDB4MzUsMHg1MCwweDMzLDB4QzAsMHg4QSwweEMyLDB4RTYsMHhGRSwweEU0LDB4QTAsCisweDg1LDB4QzAsMHg3NCwweDI3LDB4OEIsMHhEOCwweDJFLDB4OEEsMHg5RiwweERBLDB4MUEsMHg1MiwweDU2LDB4MkUsMHg4QiwweEE4LAorMHg0NCwweDAwLDB4OEIsMHg1NiwweDI4LDB4RUMsMHhBOCwweDAxLDB4NzUsMHgwRCwweDg4LDB4ODYsMHhBRCwweDAwLDB4MjQsMHgwRSwKKzB4OEEsMHhEOCwweDJFLDB4RkYsMHg5NywweERDLDB4MUIsMHg1RSwweDVBLDB4RUIsMHhDRCwweDU4LDB4QTgsMHgwMiwweDc0LDB4MzYsCisweDgzLDB4QzYsMHgxMCwweDMzLDB4QzAsMHg4QSwweEM2LDB4RTYsMHhGRSwweEU0LDB4QTAsMHg4NSwweEMwLDB4NzQsMHgyNywweDhCLAorMHhEOCwweDJFLDB4OEEsMHg5RiwweERBLDB4MUEsMHg1MiwweDU2LDB4MkUsMHg4QiwweEE4LDB4NDQsMHgwMCwweDhCLDB4NTYsMHgyOCwKKzB4RUMsMHhBOCwweDAxLDB4NzUsMHgwRCwweDg4LDB4ODYsMHhBRCwweDAwLDB4MjQsMHgwRSwweDhBLDB4RDgsMHgyRSwweEZGLDB4OTcsCisweERDLDB4MUIsMHg1RSwweDVBLDB4RUIsMHhDRCwweEMzLDB4OTAsMHgzMiwweEU0LDB4OEIsMHhEOCwweDhCLDB4RDAsMHgyRSwweDhBLAorMHg5RiwweDlBLDB4MTksMHgyRSwweDIyLDB4OTcsMHg5MiwweDE5LDB4NTYsMHg1MiwweDhBLDB4QzMsMHgyNCwweDAzLDB4MDMsMHhDNiwKKzB4ODAsMHhFMywweDA0LDB4RDAsMHhFQiwweDJFLDB4RkYsMHg5NywweEQ2LDB4MUEsMHg1OCwweDVFLDB4QTksMHg1NSwweDAwLDB4NzUsCisweEQ5LDB4QzMsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsMHhEOCwweEExLDB4NUMsMHgxMiwweEU2LDB4RkUsMHhFNCwweDAwLAorMHgyMiwweEM0LDB4NzQsMHgwOCwweDMzLDB4RjYsMHhFOCwweEJGLDB4RkYsMHhFQiwweEVFLDB4OTAsMHhFNCwweDA0LDB4MDcsMHhFNCwKKzB4MDQsMHgxRiwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwweEVGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsCisweEMwLDB4OEUsMHhEOCwweEExLDB4NUUsMHgxMiwweEU2LDB4RkUsMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4MDgsMHhCRSwweDA0LAorMHgwMCwweEU4LDB4OTQsMHhGRiwweEVCLDB4RUQsMHhFNCwweDA0LDB4MDcsMHhFNCwweDA0LDB4MUYsMHhCOCwweDAwLDB4ODAsMHhCQSwKKzB4MjIsMHhGRiwweEVGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwweDVDLDB4MTIsCisweEU2LDB4RkUsMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4MTgsMHgzMywweEY2LDB4RTgsMHg2QiwweEZGLDB4QTEsMHg2MCwweDEyLAorMHhFNiwweEZFLDB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NCwweEU1LDB4QkUsMHgwOCwweDAwLDB4RTgsMHg1QSwweEZGLDB4RUIsMHhERCwKKzB4QTEsMHg2MCwweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzUsMHhFRCwweEU0LDB4MDQsMHgwNywweEU0LDB4MDQsCisweEExLDB4NUMsMHgxMiwweEU2LDB4RkUsMHhFNCwweDA0LDB4MUYsMHhFNCwweDA0LDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLAorMHhFRiwweDYxLDB4Q0YsMHg5MCwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1RSwweDEyLDB4RTYsMHhGRSwKKzB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NCwweDE5LDB4QkUsMHgwNCwweDAwLDB4RTgsMHgxQywweEZGLDB4QTEsMHg2MiwweDEyLDB4RTYsCisweEZFLDB4RTQsMHgwMCwweDIyLDB4QzQsMHg3NCwweEU0LDB4QkUsMHgwQywweDAwLDB4RTgsMHgwQiwweEZGLDB4RUIsMHhEQywweEExLAorMHg2MiwweDEyLDB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzUsMHhFRCwweEU0LDB4MDQsMHgwNywweEU0LDB4MDQsMHhBMSwKKzB4NUUsMHgxMiwweEU2LDB4RkUsMHhFNCwweDA0LDB4MUYsMHhFNCwweDA0LDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsCisweDYxLDB4Q0YsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsMHhEOCwweEExLDB4NUMsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLAorMHg4NCwweEM0LDB4NzQsMHgwOCwweDMzLDB4RjYsMHhFOCwweDUzLDB4RkUsMHhFQiwweEVFLDB4OTAsMHhCOCwweDAwLDB4ODAsMHhCQSwKKzB4MjIsMHhGRiwweEVGLDB4MDcsMHgxRiwweDYxLDB4Q0YsMHg5MCwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsCisweDVFLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NCwweDA4LDB4QkUsMHgwMiwweDAwLDB4RTgsMHgyQywweEZFLAorMHhFQiwweEVELDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHgwNywweDFGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwKKzB4MDYsMHgyQiwweEMwLDB4OEUsMHhEOCwweEExLDB4NjAsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4MDgsCisweEJFLDB4MDQsMHgwMCwweEU4LDB4MDYsMHhGRSwweEVCLDB4RUQsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDA3LAorMHgxRiwweDYxLDB4Q0YsMHg5MCwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg2MiwweDEyLDB4RTYsMHhGRSwKKzB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NCwweDA4LDB4QkUsMHgwNiwweDAwLDB4RTgsMHhFMCwweEZELDB4RUIsMHhFRCwweEI4LDB4MDAsCisweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHgwNywweDFGLDB4NjEsMHhDRiwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLAorMHhEOCwweEExLDB4NUMsMHgxMiwweEU2LDB4RkUsMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4MTgsMHgzMywweEY2LDB4RTgsMHgzNywKKzB4RkUsMHhBMSwweDYwLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NCwweEU1LDB4QkUsMHgwNCwweDAwLDB4RTgsCisweEFBLDB4RkQsMHhFQiwweERELDB4QTEsMHg2MCwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzUsMHhFRCwweEExLAorMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4MDQsMHgwNywweEU0LDB4MDQsMHgxRiwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwKKzB4RUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsMHhEOCwweEExLDB4NUUsMHgxMiwweEU2LDB4RkUsCisweEU0LDB4MDAsMHgyMiwweEM0LDB4NzQsMHgxOSwweEJFLDB4MDQsMHgwMCwweEU4LDB4RUMsMHhGRCwweEExLDB4NjIsMHgxMiwweEU2LAorMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHhFNCwweEJFLDB4MDYsMHgwMCwweEU4LDB4NUYsMHhGRCwweEVCLDB4REMsMHhBMSwKKzB4NjIsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc1LDB4RUQsMHhBMSwweDVFLDB4MTIsMHhFNiwweEZFLDB4RTQsCisweDA0LDB4MDcsMHhFNCwweDA0LDB4MUYsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwweDYxLDB4Q0YsMHg2MCwweDFFLAorMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHgxOCwKKzB4MzMsMHhGNiwweEU4LDB4MjcsMHhGRCwweEExLDB4NjAsMHgxMiwweEU2LDB4RkUsMHhFNCwweDAwLDB4MjIsMHhDNCwweDc0LDB4RTUsCisweEJFLDB4MDgsMHgwMCwweEU4LDB4OTIsMHhGRCwweEVCLDB4REQsMHhBMSwweDYwLDB4MTIsMHhFNiwweEZFLDB4RTQsMHgwMCwweDIyLAorMHhDNCwweDc1LDB4RUQsMHhFNCwweDA0LDB4MDcsMHhFNCwweDA0LDB4MUYsMHhCOCwweDAwLDB4ODAsMHhCQSwweDIyLDB4RkYsMHhFRiwKKzB4NjEsMHhDRiwweDYwLDB4MUUsMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4QTEsMHg1RSwweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsCisweDg0LDB4QzQsMHg3NCwweDE5LDB4QkUsMHgwMiwweDAwLDB4RTgsMHhFMiwweEZDLDB4QTEsMHg2MiwweDEyLDB4RTYsMHhGRSwweEU0LAorMHgwMCwweDIyLDB4QzQsMHg3NCwweEU0LDB4QkUsMHgwQywweDAwLDB4RTgsMHg0RCwweEZELDB4RUIsMHhEQywweEExLDB4NjIsMHgxMiwKKzB4RTYsMHhGRSwweEU0LDB4MDAsMHgyMiwweEM0LDB4NzUsMHhFRCwweEU0LDB4MDQsMHgwNywweEU0LDB4MDQsMHgxRiwweEI4LDB4MDAsCisweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsMHhEOCwweEExLAorMHg1QywweDEyLDB4RTYsMHhGRSwweEU0LDB4ODAsMHg4NCwweEM0LDB4NzQsMHgxOCwweDMzLDB4RjYsMHhFOCwweDlELDB4RkMsMHhBMSwKKzB4NjAsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4RTUsMHhCRSwweDA0LDB4MDAsMHhFOCwweDhDLDB4RkMsCisweEVCLDB4REQsMHhBMSwweDYwLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NSwweEVELDB4MDcsMHgxRiwweEI4LAorMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHg2MSwweENGLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLDB4RDgsMHhBMSwKKzB4NUUsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4MTksMHhCRSwweDAyLDB4MDAsMHhFOCwweDVDLDB4RkMsCisweEExLDB4NjIsMHgxMiwweEU2LDB4RkUsMHhFNCwweDgwLDB4ODQsMHhDNCwweDc0LDB4RTQsMHhCRSwweDA2LDB4MDAsMHhFOCwweDRCLAorMHhGQywweEVCLDB4REMsMHhBMSwweDYyLDB4MTIsMHhFNiwweEZFLDB4RTQsMHg4MCwweDg0LDB4QzQsMHg3NSwweEVELDB4MDcsMHgxRiwKKzB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHg2MSwweENGLDB4OTAsMHg2MCwweDFFLDB4MDYsMHgyQiwweEMwLDB4OEUsCisweEQ4LDB4OTAsMHgyQSwweEMwLDB4RTYsMHhGRSwweEU0LDB4Q0UsMHhBOCwweDAxLDB4NzQsMHgxNCwweDMzLDB4REIsMHhFOCwweEQ1LAorMHhGNiwweEVCLDB4RUYsMHg5MCwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwweEVGLDB4MDcsMHgxRiwweDYxLDB4Q0YsMHg5MCwKKzB4RjYsMHgwNiwweDA1LDB4MDEsMHgwMSwweDc1LDB4RUQsMHhCMCwweDAxLDB4RTYsMHhGRSwweEU0LDB4Q0UsMHhBOCwweDAxLDB4NzQsCisweEUzLDB4QkIsMHgwNCwweDAwLDB4RTgsMHhBRiwweEY2LDB4RUIsMHhDOSwweDkwLDB4NjAsMHgxRSwweDA2LDB4MkIsMHhDMCwweDhFLAorMHhEOCwweDkwLDB4RkIsMHg5MCwweEZBLDB4MkEsMHhDMCwweEU2LDB4RkUsMHhFNCwweENFLDB4QTgsMHgwMiwweDc0LDB4MTMsMHgzMywKKzB4REIsMHhFOCwweENDLDB4RjgsMHhFQiwweEVDLDB4QjgsMHgwMCwweDgwLDB4QkEsMHgyMiwweEZGLDB4RUYsMHgwNywweDFGLDB4NjEsCisweENGLDB4OTAsMHhBOCwweDA0LDB4NzQsMHhGMCwweDMzLDB4REIsMHhFOCwweDVCLDB4RjcsMHhFQiwweEQ1LDB4OTAsMHg2MCwweDFFLAorMHgwNiwweDJCLDB4QzAsMHg4RSwweEQ4LDB4OTAsMHhGQiwweDkwLDB4RkEsMHhCMCwweDAxLDB4RTYsMHhGRSwweEU0LDB4Q0UsMHhBOCwKKzB4MDIsMHg3NCwweDE1LDB4QkIsMHgwNCwweDAwLDB4RTgsMHg5NywweEY4LDB4RUIsMHhFQiwweDkwLDB4QjgsMHgwMCwweDgwLDB4QkEsCisweDIyLDB4RkYsMHhFRiwweDA3LDB4MUYsMHg2MSwweENGLDB4OTAsMHhBOCwweDA0LDB4NzQsMHhGMCwweEJCLDB4MDQsMHgwMCwweEU4LAorMHgyNCwweEY3LDB4RUIsMHhEMiwweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MDksMHg5QywweDBFLDB4RTgsMHg2QiwKKzB4RjIsMHg5MCwweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MjksMHg5QywweDBFLDB4RTgsMHg1RCwweEYyLDB4OTAsCisweDcyLDB4MjAsMHg3MiwweDIwLDB4NzIsMHgyMCwweENFLDB4MUQsMHg5MiwweDFDLDB4RTYsMHgxQywweDFBLDB4MUUsMHg3MiwweDIwLAorMHg4MiwweDFELDB4QUUsMHgxRSwweDM4LDB4MUYsMHg3MiwweDIwLDB4ODIsMHgxRCwweDcyLDB4MjAsMHg3MiwweDIwLDB4MzgsMHgxRiwKKzB4NzIsMHgyMCwweDcyLDB4MjAsMHg3MiwweDIwLDB4RjQsMHgxRCwweEJDLDB4MUMsMHgzNCwweDFELDB4NjQsMHgxRSwweDcyLDB4MjAsCisweEE4LDB4MUQsMHhGMiwweDFFLDB4NzgsMHgxRiwweDcyLDB4MjAsMHhBOCwweDFELDB4NzIsMHgyMCwweDcyLDB4MjAsMHg3OCwweDFGLAorMHhGQywweEI5LDB4NDAsMHgwMCwweDhDLDB4Q0IsMHhCOCwweDY0LDB4MjAsMHgyQiwweEZGLDB4QUIsMHg5MywweEFCLDB4OTMsMHhFMiwKKzB4RkEsMHhDNywweDA2LDB4NEMsMHgwMCwweEE4LDB4MTEsMHg4MywweDNFLDB4NDQsMHgxMiwweDAwLDB4NzUsMHgyMCwweEM3LDB4MDYsCisweDNDLDB4MDAsMHgwOCwweDRCLDB4QzcsMHgwNiwweDMwLDB4MDAsMHhCQSwweDFGLDB4QzcsMHgwNiwweDM0LDB4MDAsMHhGQSwweDFGLAorMHhGNiwweDA2LDB4MDUsMHgwMSwweDAxLDB4NzUsMHgwNiwweEM3LDB4MDYsMHgzOCwweDAwLDB4MkUsMHgyMCwweEMzLDB4QzcsMHgwNiwKKzB4M0MsMHgwMCwweDU2LDB4NEIsMHgzMywweERCLDB4OEEsMHgxRSwweDU0LDB4MTIsMHhDMSwweEUzLDB4MDIsMHgwMiwweDFFLDB4NTYsCisweDEyLDB4MkUsMHg4QiwweDg3LDB4ODAsMHgyMCwweEEzLDB4MzAsMHgwMCwweDhBLDB4MUUsMHg1NSwweDEyLDB4QzEsMHhFMywweDAyLAorMHgwMiwweDFFLDB4NTcsMHgxMiwweDJFLDB4OEIsMHg4NywweEEwLDB4MjAsMHhBMywweDM0LDB4MDAsMHhDMywweDhCLDB4ODYsMHg5RSwKKzB4MDAsMHhFNiwweEZFLDB4ODYsMHhDNCwweEU2LDB4RDAsMHhDMywweDhCLDB4ODYsMHg5RSwweDAwLDB4RTYsMHhGRSwweDMzLDB4RDIsCisweDhBLDB4RDQsMHhDMywweDUxLDB4QjksMHgxMCwweDI3LDB4RTQsMHgwQSwweDkwLDB4OTAsMHg4NCwweEMwLDB4NzQsMHgwNSwweEUyLAorMHhGNiwweDU5LDB4RjksMHhDMywweDU5LDB4RjgsMHhDMywweDg0LDB4QzAsMHg3OCwweDFFLDB4NTEsMHg4QSwweEU4LDB4OEEsMHhDOCwKKzB4QjgsMHgwMSwweDAwLDB4RDMsMHhFMCwweDA5LDB4ODYsMHg5OCwweDAwLDB4M0EsMHhBRSwweEEwLDB4MDAsMHg1OSwweDc1LDB4MTAsCisweEU4LDB4QTksMHhFNSwweDgzLDB4NEUsMHgyNiwweDAyLDB4RjksMHhDMywweDk4LDB4ODksMHg4NiwweDk4LDB4MDAsMHhFQiwweEYwLAorMHhGOCwweEMzLDB4ODQsMHhDMCwweDc4LDB4MTIsMHg1MSwweDhBLDB4RTAsMHg4QSwweEM4LDB4QjgsMHgwMSwweDAwLDB4RDMsMHhFMCwKKzB4NTksMHhGNywweEQwLDB4MjEsMHg4NiwweDk4LDB4MDAsMHhDMywweEM3LDB4ODYsMHg5OCwweDAwLDB4MDAsMHgwMCwweEMzLDB4ODMsCisweEMyLDB4MDQsMHg4QSwweDg2LDB4QTYsMHgwMCwweDBDLDB4MDQsMHhFRSwweDgzLDB4RUEsMHgwNCwweEMzLDB4RTgsMHg5MywweEZGLAorMHg3MiwweDA0LDB4QjAsMHg4MiwweEU2LDB4MEEsMHhDMywweDhCLDB4NDYsMHgyNiwweEE4LDB4RkQsMHg3NCwweDExLDB4OEEsMHg4NiwKKzB4QTUsMHgwMCwweEE4LDB4MDYsMHg3NCwweDA4LDB4MjQsMHhGOSwweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweEMzLDB4RjYsCisweEM0LDB4MDEsMHg3NCwweDBBLDB4OEEsMHg4NiwweEE1LDB4MDAsMHgyNCwweEZCLDB4MEMsMHgwMiwweEVCLDB4MEMsMHhBOCwweDAyLAorMHg3NSwweDBGLDB4OEEsMHg4NiwweEE1LDB4MDAsMHgyNCwweEZELDB4MEMsMHgwNCwweDNBLDB4ODYsMHhBNSwweDAwLDB4NzUsMHhEOCwKKzB4QzMsMHg4QSwweDg2LDB4QTUsMHgwMCwweEVCLDB4Q0YsMHhFNCwweEQ4LDB4MzMsMHhEQiwweDhBLDB4RDgsMHhDMCwweEVCLDB4MDQsCisweDJFLDB4OEEsMHg5RiwweDY2LDB4MTcsMHg4OCwweDlFLDB4QTksMHgwMCwweDhCLDB4NUUsMHgyNiwweDgwLDB4RTMsMHgzRiwweEY2LAorMHhDNywweDA0LDB4NzQsMHgwNywweEE4LDB4MTAsMHg3NSwweDAzLDB4ODAsMHhDQiwweDQwLDB4RjYsMHhDNywweDA4LDB4NzQsMHgwNywKKzB4QTgsMHg4MCwweDc1LDB4MDMsMHg4MCwweENCLDB4NDAsMHg4OCwweDVFLDB4MjYsMHg4QSwweDg2LDB4QTUsMHgwMCwweEY2LDB4QzMsCisweEZELDB4NzQsMHgwRCwweEE4LDB4MDYsMHg3NCwweDA4LDB4MjQsMHhGOSwweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweEMzLAorMHhGNiwweEM3LDB4MDEsMHg3NCwweDA0LDB4MEMsMHgwMiwweEVCLDB4RjAsMHhGNiwweEMzLDB4MDIsMHg3NSwweEU5LDB4MEMsMHgwNCwKKzB4RUIsMHhFNywweEM0LDB4MDQsMHhDNCwweDA0LDB4ODUsMHgwNCwweDU5LDB4MDQsMHg0OCwweDA0LDB4NDEsMHgwNCwweEMzLDB4MDMsCisweDgyLDB4MDMsMHg0MSwweDAzLDB4ODIsMHgwMiwweDU3LDB4MDIsMHg0MSwweDAyLDB4ODIsMHgwMSwweDQxLDB4MDEsMHg4MiwweDAwLAorMHg0MSwweDAwLDB4NEUsMHgwMiwweEFELDB4MDEsMHg1NywweDAxLDB4MkQsMHgwMCwweDJCLDB4MDAsMHgyNywweDAwLDB4MjEsMHgwMCwKKzB4MTYsMHgwMCwweEY0LDB4MDQsMHhGNCwweDA0LDB4QTMsMHgwNCwweDZGLDB4MDQsMHg1QiwweDA0LDB4NTEsMHgwNCwweEY0LDB4MDMsCisweEEzLDB4MDMsMHg1MSwweDAzLDB4QTMsMHgwMiwweDZELDB4MDIsMHg1MSwweDAyLDB4QTMsMHgwMSwweDUxLDB4MDEsMHhBMywweDAwLAorMHg1MSwweDAwLDB4NjIsMHgwMiwweEQ5LDB4MDEsMHg2RCwweDAxLDB4MzgsMHgwMCwweDM2LDB4MDAsMHgzMSwweDAwLDB4MjksMHgwMCwKKzB4MUIsMHgwMCwweDUxLDB4NTcsMHhCRiwweDAyLDB4MDAsMHhFQiwweDBGLDB4OTAsMHg1MSwweDU2LDB4QkYsMHgwMSwweDAwLDB4RUIsCisweDA3LDB4OTAsMHg1MSwweDU2LDB4QkYsMHgwMywweDAwLDB4OTAsMHgzQywweDE5LDB4NzYsMHgwMiwweEIwLDB4MTcsMHg5OCwweDhCLAorMHhGMCwweDhBLDB4ODIsMHhDNCwweDAwLDB4MkEsMHhFNCwweDhCLDB4RjAsMHg4MywweEZFLDB4MTgsMHg3MywweDQ2LDB4RDEsMHhFNiwKKzB4MkUsMHg4QiwweDhDLDB4NTIsMHgyMiwweEY3LDB4NDYsMHgzOCwweDgwLDB4MDAsMHg3NCwweDA1LDB4MkUsMHg4QiwweDhDLDB4ODIsCisweDIyLDB4RjcsMHhDNywweDAyLDB4MDAsMHg3NCwweDEyLDB4M0IsMHg4RSwweDk0LDB4MDAsMHg3NCwweDBDLDB4ODksMHg4RSwweDk0LAorMHgwMCwweDhBLDB4QzUsMHhFNiwweEVDLDB4OEEsMHhDMSwweEU2LDB4RTQsMHhGNywweEM3LDB4MDEsMHgwMCwweDc0LDB4MTIsMHgzQiwKKzB4OEUsMHg5NiwweDAwLDB4NzQsMHgwQywweDg5LDB4OEUsMHg5NiwweDAwLDB4OEEsMHhDNSwweEU2LDB4RjgsMHg4QSwweEMxLDB4RTYsCisweEYwLDB4NUUsMHg1OSwweEMzLDB4NzcsMHgwNiwweDhCLDB4OEUsMHg4RSwweDAwLDB4RUIsMHhDNSwweDhCLDB4OEUsMHg5MCwweDAwLAorMHhFQiwweEJGLDB4RDUsMHgwMywweEY2LDB4MDAsMHgzRSwweDAwLDB4MTAsMHgwMCwweDA0LDB4MDAsMHhDQSwweDA0LDB4MzMsMHgwMSwKKzB4NEQsMHgwMCwweDE0LDB4MDAsMHgwNSwweDAwLDB4MDEsMHgwMywweDA1LDB4MDcsMHgwOSwweDAwLDB4MDEsMHgwMiwweDAzLDB4MDQsCisweDgwLDB4ODQsMHgxRSwweDAwLDB4QTAsMHgyNSwweDI2LDB4MDAsMHgwMCwweDAwLDB4NjAsMHg4QiwweEYwLDB4MzMsMHhGRiwweDJFLAorMHhBMSwweDUwLDB4MjMsMHgyRSwweDhCLDB4MTYsMHg1MiwweDIzLDB4QkIsMHgzMiwweDIzLDB4RjcsMHg0NiwweDM4LDB4ODAsMHgwMCwKKzB4NzQsMHgwQywweDJFLDB4QTEsMHg1NCwweDIzLDB4MkUsMHg4QiwweDE2LDB4NTYsMHgyMywweEJCLDB4M0MsMHgyMywweEI5LDB4MDUsCisweDAwLDB4MkUsMHgzQiwweDMxLDB4NzMsMHgwQSwweDQ3LDB4NDcsMHhFMiwweEY3LDB4QjgsMHhGRiwweEZGLDB4RUIsMHgxRCwweDkwLAorMHhEMSwweEVGLDB4MkUsMHg4QSwweDhELDB4NDYsMHgyMywweDJBLDB4RUQsMHhEMSwweEVBLDB4RDEsMHhEOCwweEUyLDB4RkEsMHhGNywKKzB4RjYsMHgwNSwweDAyLDB4MDAsMHhDMSwweEU4LDB4MDIsMHgyRSwweDhBLDB4QTUsMHg0QiwweDIzLDB4MkUsMHhBMywweDU4LDB4MjMsCisweDYxLDB4MkUsMHhBMSwweDU4LDB4MjMsMHhDMywweDA4LDB4MDAsMHgyMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDIsMHg2MCwweDA5LAorMHgwOCwweDAwLDB4MjAsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgwMCwKKzB4MDMsMHgwMCwweDA0LDB4MDAsMHg1MiwweDU2LDB4NTcsMHg4NSwweEMwLDB4NzQsMHgwNSwweDNELDB4MDEsMHgwOSwweDc2LDB4MDMsCisweEI4LDB4MDEsMHgwOSwweEJGLDB4NUIsMHgwMSwweEY3LDB4NDYsMHgzOCwweDgwLDB4MDAsMHg3NCwweDAzLDB4QkYsMHhCMiwweDAxLAorMHgzMywweEY2LDB4MkUsMHgzQiwweDg0LDB4QjYsMHgyMywweDc2LDB4MDQsMHg0NiwweDQ2LDB4RUIsMHhGNSwweEY3LDB4RTcsMHgyRSwKKzB4OEIsMHhCQywweEMwLDB4MjMsMHgwMywweEM3LDB4ODMsMHhEMiwweDAwLDB4RDEsMHhFNywweEY3LDB4RjcsMHgyRSwweDhBLDB4QTQsCisweENBLDB4MjMsMHg1RiwweDVFLDB4NUEsMHhDMywweEU0LDB4M0UsMHg4MCwweEJFLDB4QzMsMHgwMCwweDAzLDB4NzUsMHgwQywweEY3LAorMHg0NiwweDdBLDB4MjAsMHgwMCwweDc0LDB4MDUsMHgwQywweDgwLDB4RTYsMHgzRSwweEMzLDB4MjQsMHg3RiwweEU2LDB4M0UsMHhDMywKKzB4MjQsMHgwMywweDg4LDB4ODYsMHhDMywweDAwLDB4OEEsMHhFMCwweEU0LDB4MTAsMHgyNCwweEZDLDB4MEEsMHhDNCwweEU2LDB4MTAsCisweDgwLDB4OEUsMHhBMSwweDAwLDB4NDIsMHhFOCwweENFLDB4RkYsMHhDMywweDkwLDB4NTYsMHg4QiwweEYwLDB4ODMsMHhFNiwweDA3LAorMHhEMSwweEU2LDB4MkUsMHhGRiwweEE0LDB4NTgsMHgyNCwweDkwLDB4NjgsMHgyNCwweDZDLDB4MjQsMHg3MCwweDI0LDB4NzQsMHgyNCwKKzB4NzgsMHgyNCwweDg3LDB4MjQsMHg4NywweDI0LDB4ODcsMHgyNCwweEI0LDB4MDAsMHhFQiwweDBFLDB4QjQsMHhDMCwweEVCLDB4MEEsCisweEI0LDB4NDAsMHhFQiwweDA2LDB4QjQsMHgyMCwweEVCLDB4MDIsMHhCNCwweEEwLDB4RTQsMHgxMCwweDI0LDB4MUYsMHgwQSwweEM0LAorMHhFNiwweDEwLDB4ODAsMHg4RSwweEExLDB4MDAsMHg0MiwweDVFLDB4QzMsMHg5MCwweDNDLDB4MDIsMHg3NywweDEyLDB4OEEsMHhFMCwKKzB4RTQsMHgxMCwweDI0LDB4RjMsMHhDMCwweEU0LDB4MDIsMHgwQSwweEM0LDB4RTYsMHgxMCwweDgwLDB4OEUsMHhBMSwweDAwLDB4NDIsCisweEMzLDB4OTAsMHg4QiwweDVFLDB4MzgsMHg4NCwweEMwLDB4NzQsMHgxRiwweDNDLDB4MDIsMHg3NCwweDIwLDB4ODMsMHhDQiwweDA4LAorMHg4QiwweDQ2LDB4MkUsMHgzQiwweDQ2LDB4M0MsMHg3NywweDBDLDB4RTgsMHg4OCwweEZDLDB4NzIsMHgwNywweEIwLDB4MjQsMHhFNiwKKzB4MEEsMHg4MywweENCLDB4MTAsMHg4OSwweDVFLDB4MzgsMHhDMywweDgzLDB4RTMsMHhGNywweEVCLDB4RjcsMHhGNywweEMzLDB4MTAsCisweDAwLDB4NzQsMHhGNSwweEU4LDB4NkQsMHhGQywweDcyLDB4RUMsMHg4QSwweDg2LDB4QzAsMHgwMCwweEU2LDB4MzgsMHhCMCwweDIzLAorMHhFNiwweDBBLDB4RUIsMHhFMCwweDhCLDB4NUUsMHgzOCwweDhCLDB4NDYsMHgyRSwweDNCLDB4NDYsMHgzQywweEU0LDB4RDgsMHg3NywKKzB4MEIsMHgyNCwweEZFLDB4ODAsMHhDQiwweDEyLDB4RTYsMHhEOCwweDg5LDB4NUUsMHgzOCwweEMzLDB4MEMsMHgwMSwweDgwLDB4Q0IsCisweDAyLDB4RUIsMHhGMywweDUwLDB4MzMsMHhEQiwweEMxLDB4RTgsMHgwNCwweDI1LDB4MEYsMHgwRiwweDhBLDB4RDgsMHgyRSwweDhBLAorMHg4NywweDY2LDB4MTcsMHg4QSwweERDLDB4MkUsMHg4QSwweEE3LDB4NjYsMHgxNywweDA5LDB4NDYsMHgzRSwweDU4LDB4QzMsMHg1MCwKKzB4MzMsMHhEQiwweEMxLDB4RTgsMHgwNCwweDI1LDB4MEYsMHgwRiwweDhBLDB4RDgsMHgyRSwweDhBLDB4ODcsMHg2NiwweDE3LDB4OEEsCisweERDLDB4MkUsMHg4QSwweEE3LDB4NjYsMHgxNywweEY3LDB4RDAsMHgyMSwweDQ2LDB4M0UsMHg1OCwweEMzLDB4OEIsMHg0NiwweDNFLAorMHgzMywweERCLDB4OEEsMHhEOCwweDBBLDB4REMsMHgyRSwweDhBLDB4ODcsMHg3NiwweDE3LDB4RTYsMHgyQywweDhBLDB4RTAsMHhFNCwKKzB4MkEsMHgyNCwweDBGLDB4MEEsMHhDNCwweEU2LDB4MkEsMHg4QSwweDg2LDB4QTUsMHgwMCwweDg0LDB4RTQsMHg3NSwweDBELDB4QTgsCisweDgwLDB4NzQsMHgxMSwweDI0LDB4N0YsMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhDMywweEE4LDB4ODAsMHg3NSwweDA0LAorMHgwQywweDgwLDB4RUIsMHhGMSwweEMzLDB4MUUsMHg2MCwweDMzLDB4QzksMHgzMywweEQyLDB4MzMsMHhGNiwweDhFLDB4RDksMHg4RCwKKzB4QkUsMHhGRCwweDAwLDB4NTcsMHg4QiwweDA1LDB4ODQsMHhDMCwweDc0LDB4MTYsMHg4QiwweEQxLDB4NDIsMHg4QiwweEZFLDB4NEYsCisweDc4LDB4MDksMHgzOCwweEEzLDB4RTQsMHgwMCwweDc0LDB4MDgsMHg0RiwweDc5LDB4RjcsMHg4OCwweEEyLDB4RTQsMHgwMCwweDQ2LAorMHg1RiwweDgzLDB4QzcsMHgwOSwweDQxLDB4ODMsMHhGOSwweDEwLDB4NzIsMHhEOSwweDg5LDB4QjYsMHg4NiwweDAwLDB4ODksMHg5NiwKKzB4ODQsMHgwMCwweDYxLDB4MUYsMHhDMywweDUzLDB4QzcsMHg0NiwweDY2LDB4MDAsMHgwMCwweDhCLDB4NDYsMHg2NCwweEE5LDB4NDAsCisweDAwLDB4NzQsMHgwRCwweEIzLDB4MDAsMHhBOSwweDgwLDB4MDAsMHg3NCwweDAyLDB4QjMsMHg3RiwweDg4LDB4OUUsMHhDMSwweDAwLAorMHgzMiwweERCLDB4QTksMHgwMiwweDAwLDB4NzQsMHgwMywweDgwLDB4Q0IsMHg0MCwweEE5LDB4MDAsMHg0MCwweDc0LDB4MDMsMHg4MCwKKzB4Q0IsMHgwMiwweEE5LDB4MDAsMHg4MCwweDc0LDB4MDMsMHg4MCwweENCLDB4MDEsMHhBOSwweDMwLDB4MUUsMHg3NCwweDAzLDB4ODAsCisweENCLDB4QkMsMHhBOSwweDAwLDB4MjAsMHg3NCwweDAzLDB4ODAsMHhDQiwweDA4LDB4QTksMHgwNCwweDAxLDB4NzQsMHgwMywweDgwLAorMHhDQiwweDEwLDB4QTksMHgwOCwweDAwLDB4NzQsMHgwMywweDgwLDB4Q0IsMHgyMCwweDg4LDB4OUUsMHhDMiwweDAwLDB4NUIsMHhDMywKKzB4MDYsMHg1MSwweDU3LDB4NTAsMHgxNiwweDA3LDB4OEQsMHhCRSwweEM0LDB4MDAsMHhCOSwweDFGLDB4MDAsMHgzMywweEMwLDB4QUEsCisweDQwLDB4RTIsMHhGQywweDhCLDB4ODYsMHg5MiwweDAwLDB4ODksMHg4NiwweDhFLDB4MDAsMHg4OSwweDg2LDB4OTAsMHgwMCwweDU4LAorMHg1RiwweDU5LDB4MDcsMHhDMywweEU0LDB4RDgsMHhDMCwweEU4LDB4MDQsMHg1MywweDI1LDB4MEYsMHgwMCwweDhCLDB4RDgsMHgyRSwKKzB4OEEsMHg4NywweDY2LDB4MTcsMHg4OCwweDg2LDB4QTksMHgwMCwweDVBLDB4QzMsMHgwOCwweDg2LDB4QUMsMHgwMCwweEM2LDB4ODYsCisweEJBLDB4MDAsMHgwMSwweEIwLDB4MEUsMHhFOCwweEVBLDB4RTksMHhDMywweEFELDB4MzYsMHhBMywweEI0LDB4MTMsMHhBRCwweDM2LAorMHhBMywweEI2LDB4MTMsMHhBRCwweDM2LDB4QTMsMHhCOCwweDEzLDB4ODMsMHhFOSwweDA2LDB4MzYsMHhGNywweDA2LDB4QjYsMHgxMywKKzB4MEYsMHgwMCwweEMzLDB4OEEsMHg0NiwweDI2LDB4RjcsMHg0NiwweDQ4LDB4ODAsMHgwMCwweDc0LDB4MDIsMHgwQywweDEwLDB4ODgsCisweDg2LDB4QkQsMHgwMCwweDMyLDB4QzAsMHg4MywweDdFLDB4MUEsMHgwMCwweDc1LDB4MEUsMHg4QiwweDVFLDB4NDAsMHg0MywweDgwLAorMHhFMywweEZFLDB4M0IsMHg1RSwweDA4LDB4NzUsMHgwMiwweDBDLDB4MDEsMHg4MywweDdFLDB4M0EsMHgwMCwweDc1LDB4MEQsMHgxRSwKKzB4QzUsMHg1RSwweDE0LDB4OEIsMHgxRiwweDFGLDB4ODUsMHhEQiwweDc1LDB4MDIsMHgwQywweDAyLDB4RjcsMHg0NiwweDM4LDB4MTAsCisweDAwLDB4NzQsMHgwMiwweDBDLDB4MDQsMHg4QiwweDVFLDB4N0EsMHhGNywweEMzLDB4MDIsMHgwMCwweDc0LDB4MDIsMHgwQywweDA4LAorMHhGNywweEMzLDB4MDQsMHgwMCwweDc0LDB4MDIsMHgwQywweDEwLDB4RjcsMHhDMywweDA4LDB4MDAsMHg3NCwweDAyLDB4MEMsMHgyMCwKKzB4RjcsMHhDMywweDQwLDB4MDAsMHg3NCwweDAyLDB4MEMsMHg0MCwweDg4LDB4ODYsMHhCRiwweDAwLDB4QzMsMHg5MCwweDZBLDB4MDAsCisweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgwRCwweDlDLDB4MEUsMHhFOCwweEYxLDB4RUIsMHg5MCwweEIwLDB4MDIsMHhFNiwweERBLAorMHhGOCwweEMzLDB4MzMsMHhDMCwweEU2LDB4REEsMHhGOCwweEMzLDB4QjAsMHgwMSwweEU2LDB4RDgsMHhGOCwweEMzLDB4MzMsMHhDMCwKKzB4RTYsMHhEOCwweEY4LDB4QzMsMHhCMCwweEZGLDB4RTgsMHg0RSwweEZBLDB4RTgsMHhBMSwweEZBLDB4RjgsMHhDMywweEFDLDB4NDksCisweEU4LDB4QUYsMHhGQiwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHhFOCwweDE1LDB4RkQsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LAorMHhFOCwweDY3LDB4RkQsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LDB4RTgsMHgxRiwweEZELDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwKKzB4RTYsMHgzNCwweEY4LDB4QzMsMHhBQywweDQ5LDB4RTYsMHgzNiwweEY4LDB4QzMsMHhBQywweDQ5LDB4M0MsMHgwMiwweDc3LDB4MUYsCisweDg0LDB4QzAsMHg3NSwweDFELDB4RTQsMHgxNCwweDI0LDB4RUYsMHhFNiwweDE0LDB4RTQsMHgxMiwweDI0LDB4M0YsMHhFNiwweDEyLAorMHhFNCwweDE2LDB4QTgsMHgwNCwweDc0LDB4MDksMHhFOCwweEVBLDB4RjksMHg3MiwweDA0LDB4QjAsMHgxOCwweEU2LDB4MEEsMHhGOCwKKzB4QzMsMHg4QSwweEUwLDB4RTQsMHgxNCwweDBDLDB4MTAsMHhFNiwweDE0LDB4RTQsMHgxMiwweDBDLDB4QzAsMHhGNiwweEM0LDB4MDEsCisweDc0LDB4MDIsMHgyNCwweDdGLDB4RTYsMHgxMiwweEY4LDB4QzMsMHhBQywweDQ5LDB4RTgsMHgyNSwweEZELDB4RjgsMHhDMywweDkwLAorMHhCOCwweDAwLDB4NDAsMHhFOCwweDdELDB4RkQsMHhFOCwweEI0LDB4RkQsMHhFOCwweEE4LDB4RkUsMHhCMCwweDAxLDB4RTgsMHhCOSwKKzB4RkUsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4NDAsMHhFOCwweDg1LDB4RkQsMHhFOCwweEEwLDB4RkQsMHhGOCwweEMzLDB4OTAsCisweEI4LDB4MDAsMHgxMCwweEU4LDB4NUQsMHhGRCwweEU4LDB4OTQsMHhGRCwweEU4LDB4ODgsMHhGRSwweEIwLDB4MDgsMHhFOCwweDk5LAorMHhGRSwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHgxMCwweEU4LDB4NjUsMHhGRCwweEU4LDB4ODAsMHhGRCwweEY4LDB4QzMsMHg5MCwKKzB4QjgsMHgwMCwweDgwLDB4RTgsMHgzRCwweEZELDB4RTgsMHg3NCwweEZELDB4RTgsMHg2OCwweEZFLDB4QjAsMHgwMiwweEU4LDB4NzksCisweEZFLDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDgwLDB4RTgsMHg0NSwweEZELDB4RTgsMHg2MCwweEZELDB4RjgsMHhDMywweDkwLAorMHhCOCwweDAwLDB4MjAsMHhFOCwweDFELDB4RkQsMHhFOCwweDU0LDB4RkQsMHhFOCwweDQ4LDB4RkUsMHhCMCwweDA0LDB4RTgsMHg1OSwKKzB4RkUsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4MjAsMHhFOCwweDI1LDB4RkQsMHhFOCwweDQwLDB4RkQsMHhGOCwweEMzLDB4OTAsCisweEFDLDB4NDksMHhFOCwweDQ4LDB4MTQsMHhFNCwweDNDLDB4MjQsMHhFNywweDBBLDB4QzQsMHhFNiwweDNDLDB4RjgsMHhDMywweDkwLAorMHhCOCwweEZDLDB4M0IsMHg4OSwweDQ2LDB4N0MsMHhFNCwweDNDLDB4MEMsMHgxOCwweEU2LDB4M0MsMHhGOCwweEMzLDB4RTQsMHgxMiwKKzB4MEMsMHgwMiwweEU2LDB4MTIsMHhGOCwweEMzLDB4RTQsMHgxMiwweDI0LDB4RkQsMHhFQiwweEY2LDB4RTgsMHhCNSwweEZDLDB4RjgsCisweEMzLDB4OTAsMHg4MywweDY2LDB4MzgsMHhGRCwweEY4LDB4QzMsMHhBQywweDQ5LDB4QTgsMHgwMSwweDc0LDB4MDYsMHg4MywweDRFLAorMHg3QSwweDIwLDB4RUIsMHgwNCwweDgzLDB4NjYsMHg3QSwweERGLDB4RTgsMHhDQiwweEZCLDB4RjgsMHhDMywweDkwLDB4OEEsMHg4NiwKKzB4QTUsMHgwMCwweDBDLDB4MDIsMHgyNCwweEZCLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4ODEsMHg0RSwweDI2LDB4MDEsCisweDIwLDB4QUMsMHg0OSwweDMyLDB4RTQsMHg4OSwweDQ2LDB4NkUsMHg4MywweDRFLDB4NDgsMHgwOCwweDQ5LDB4NDYsMHhGOSwweEMzLAorMHg4QSwweDg2LDB4QTUsMHgwMCwweDBDLDB4MDIsMHgyNCwweEZCLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4ODEsMHg0RSwKKzB4MjYsMHgwMSwweDIwLDB4QUMsMHhCNCwweDBBLDB4RjYsMHhFNCwweEVCLDB4RDgsMHhFOCwweEZBLDB4MTMsMHhFNCwweDNDLDB4MjQsCisweEY4LDB4MEEsMHhDNCwweEU2LDB4M0MsMHhGOCwweEMzLDB4OTAsMHhBRCwweDQ5LDB4NDksMHg4OSwweDQ2LDB4NjQsMHhBOSwweDAxLAorMHgwMCwweDc0LDB4MUIsMHg4QiwweEQ4LDB4ODMsMHhFMywweEZBLDB4NzUsMHgxQSwweEE5LDB4MDQsMHgwMCwweDc0LDB4MEYsMHhFNCwKKzB4M0UsMHgwQywweDAyLDB4RTYsMHgzRSwweEI4LDB4MzgsMHg0NCwweDg5LDB4NDYsMHg2MiwweEY4LDB4QzMsMHg5MCwweEU0LDB4M0UsCisweDI0LDB4RkMsMHhFQiwweEVGLDB4RTQsMHgzRSwweDI0LDB4RkMsMHhFNiwweDNFLDB4RTgsMHhFOCwweEZDLDB4QjgsMHhBQSwweDQwLAorMHhFQiwweEU2LDB4RTgsMHg2RSwweEY4LDB4NzIsMHgwNSwweEIwLDB4MTgsMHhFNiwweDBBLDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwKKzB4RTgsMHhDRiwweEY5LDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwweEU4LDB4Q0YsMHhGOSwweEY4LDB4QzMsMHg5MCwweEU4LDB4NjgsCisweEZELDB4NzUsMHgwNiwweDMyLDB4QzAsMHhFNiwweERBLDB4RjgsMHhDMywweEIwLDB4MDIsMHhFNiwweERBLDB4MzYsMHhBMCwweEI0LAorMHgxMywweDI0LDB4MTAsMHgzNCwweDEwLDB4RTgsMHgxNiwweDAxLDB4MzYsMHhBMSwweEI0LDB4MTMsMHhBOSwweDAxLDB4MDAsMHg3NCwKKzB4MDUsMHhFOCwweEZDLDB4RkUsMHhFQiwweDBFLDB4QTksMHgwMiwweDAwLDB4NzQsMHgwNCwweDMyLDB4QzAsMHhFQiwweDAyLDB4QjAsCisweDAxLDB4RTgsMHhERSwweEZFLDB4MzYsMHhBMSwweEI0LDB4MTMsMHhFOCwweEI1LDB4MTMsMHhFNCwweDNDLDB4MjQsMHhGOCwweDBBLAorMHhDNCwweEU2LDB4M0MsMHgzNiwweEExLDB4QjQsMHgxMywweEMxLDB4RTgsMHgwNSwweDI1LDB4MDEsMHgwMCwweEU4LDB4RkEsMHhGRSwKKzB4MzYsMHhBMCwweEI1LDB4MTMsMHgyNCwweDEwLDB4RTgsMHg1OSwweEZCLDB4MzIsMHhDMCwweDM2LDB4OEEsMHgyNiwweEI1LDB4MTMsCisweEY2LDB4QzQsMHgwNCwweDc0LDB4MDksMHhGRSwweEMwLDB4RjYsMHhDNCwweDA4LDB4NzQsMHgwMiwweEZFLDB4QzAsMHhFOCwweERCLAorMHhGRCwweDM2LDB4QTEsMHhCNiwweDEzLDB4MjUsMHgwRiwweDAwLDB4RTgsMHg1NywweEY5LDB4MzYsMHhBMSwweEI2LDB4MTMsMHhDMSwKKzB4RTgsMHgwNCwweDI1LDB4MDMsMHgwMCwweEU4LDB4QjgsMHhGQSwweDM2LDB4QTEsMHhCNiwweDEzLDB4QzEsMHhFOCwweDA1LDB4MjUsCisweDAyLDB4MDAsMHhFOCwweDA1LDB4RkIsMHgzNiwweEExLDB4QjYsMHgxMywweEY2LDB4QzQsMHgwMSwweDc1LDB4MDQsMHgzMiwweEMwLAorMHhFQiwweDA5LDB4ODAsMHhFNCwweDAyLDB4RDAsMHhFQywweEIwLDB4MDIsMHgyQSwweEM0LDB4RTgsMHhBQywweEZBLDB4MzYsMHhGNiwKKzB4MDYsMHhCNywweDEzLDB4NDAsMHg3NCwweDA1LDB4RTgsMHg4MywweEZFLDB4RUIsMHgwMywweEU4LDB4ODQsMHhGRSwweDM2LDB4RjYsCisweDA2LDB4QjcsMHgxMywweDIwLDB4NzQsMHgwNSwweEU4LDB4NjUsMHhGRSwweEVCLDB4MDMsMHhFOCwweDY4LDB4RkUsMHhGOCwweEMzLAorMHhFNCwweDEyLDB4MEMsMHgwMSwweEU2LDB4MTIsMHhGOCwweEMzLDB4RTQsMHgxMiwweDI0LDB4RkUsMHhFQiwweEY2LDB4RTQsMHgxNCwKKzB4MjQsMHhGMCwweDBDLDB4MDUsMHhFNiwweDE0LDB4RTQsMHgyQSwweDI0LDB4RjAsMHgwQywweDA2LDB4RTYsMHgyQSwweEY4LDB4QzMsCisweEU0LDB4MkEsMHgyNCwweEYwLDB4RTYsMHgyQSwweEU0LDB4MTQsMHgyNCwweEYwLDB4MEMsMHgwNywweEU2LDB4MTQsMHhGOCwweEMzLAorMHhBRCwweDQ5LDB4NDksMHhFOCwweDY0LDB4RjksMHg4OSwweDg2LDB4OEUsMHgwMCwweEY4LDB4QzMsMHhBRCwweDQ5LDB4NDksMHhFOCwKKzB4NTgsMHhGOSwweDg5LDB4ODYsMHg5MCwweDAwLDB4RjgsMHhDMywweDgzLDB4NEUsMHgyNiwweDA0LDB4RTgsMHhBOCwweEY3LDB4RjgsCisweEMzLDB4OTAsMHg4MywweDY2LDB4MjYsMHhGQiwweEU4LDB4OUUsMHhGNywweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHg4NCwweEMwLAorMHg3NSwweDBELDB4RTQsMHgxMCwweDI0LDB4RUYsMHhFNiwweDEwLDB4ODAsMHg4RSwweEExLDB4MDAsMHg0MiwweEY4LDB4QzMsMHhFNCwKKzB4MTAsMHgwQywweDEwLDB4RUIsMHhGMSwweDkwLDB4QUMsMHg0OSwweDNDLDB4MDIsMHg3NiwweDAyLDB4MzIsMHhDMCwweEMwLDB4RTAsCisweDA0LDB4QTgsMHgyMCwweDc0LDB4MDIsMHgwQywweDA4LDB4MjQsMHgxOCwweDhBLDB4RTAsMHhFNCwweDEyLDB4MjQsMHhFNywweDBBLAorMHhDNCwweEU2LDB4MTIsMHg4MCwweDhFLDB4QTEsMHgwMCwweDQ0LDB4RjgsMHhDMywweEFDLDB4NDksMHg4OCwweDg2LDB4QzAsMHgwMCwKKzB4RjgsMHhDMywweEFDLDB4NDksMHhFNiwweDNBLDB4RjgsMHhDMywweEFDLDB4NDksMHg4NCwweEMwLDB4NzQsMHgwOCwweEU0LDB4MTIsCisweDBDLDB4MDQsMHhFNiwweDEyLDB4RjgsMHhDMywweEU0LDB4MTIsMHgyNCwweEZCLDB4RUIsMHhGNiwweEFDLDB4NDksMHhFOCwweEQ2LAorMHhGNiwweDczLDB4MDMsMHhFOCwweDI3LDB4RjcsMHhGOCwweEMzLDB4RTQsMHgxMiwweEE4LDB4MDIsMHg3NCwweDA0LDB4MjQsMHhGRCwKKzB4RTYsMHgxMiwweEI4LDB4RjAsMHgwMCwweEU4LDB4ODcsMHhGQSwweDgxLDB4NjYsMHgyNiwweEZGLDB4RjMsMHhFOCwweDU3LDB4RjcsCisweEU4LDB4OUEsMHhGQSwweEY4LDB4QzMsMHg5MCwweEI4LDB4ODAsMHgwMCwweEU4LDB4NTcsMHhGQSwweDgwLDB4NEUsMHgyNywweDA4LAorMHhFOCwweDQ0LDB4RjcsMHhFOCwweDg3LDB4RkEsMHhGOCwweEMzLDB4QjgsMHg4MCwweDAwLDB4RTgsMHg2MSwweEZBLDB4ODEsMHg2NiwKKzB4MjYsMHhGRiwweEY3LDB4RTgsMHgzMSwweEY3LDB4RTgsMHg3NCwweEZBLDB4RjgsMHhDMywweDkwLDB4QjgsMHgxMCwweDAwLDB4RTgsCisweDMxLDB4RkEsMHg4MCwweDRFLDB4MjcsMHgwNCwweEU4LDB4MUUsMHhGNywweEU4LDB4NjEsMHhGQSwweEY4LDB4QzMsMHhCOCwweDEwLAorMHgwMCwweEU4LDB4M0IsMHhGQSwweDgxLDB4NjYsMHgyNiwweEZGLDB4RkIsMHhFOCwweDBCLDB4RjcsMHhFOCwweDRFLDB4RkEsMHhGOCwKKzB4QzMsMHg5MCwweDMzLDB4QzAsMHhBQywweDQ5LDB4M0MsMHgwMSwweDczLDB4MDQsMHhCMCwweDAxLDB4RUIsMHgwNiwweDNDLDB4MEMsCisweDc2LDB4MDIsMHhCMCwweDBDLDB4ODksMHg0NiwweDFDLDB4RjgsMHhDMywweDkwLDB4ODEsMHg0RSwweDI2LDB4MDAsMHgyMCwweDhBLAorMHg4NiwweEE1LDB4MDAsMHgwQywweDAyLDB4MjQsMHhGQiwweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweDgzLDB4NEUsMHgyNiwKKzB4MDEsMHhGOCwweEMzLDB4OTAsMHg4MSwweDRFLDB4MjYsMHgwMCwweDQwLDB4OEEsMHg4NiwweEE1LDB4MDAsMHgwQywweDAyLDB4ODgsCisweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LDB4NTAsMHhFOCwweDA1LDB4RjYsMHg1OCwweDcyLAorMHgwOCwweEU2LDB4MzgsMHhCMCwweDIzLDB4RTYsMHgwQSwweEY4LDB4QzMsMHhGOSwweEMzLDB4OTAsMHhBQywweDUwLDB4QUQsMHhFOCwKKzB4ODIsMHhGOCwweDVBLDB4RjYsMHhDMiwweDAxLDB4NzQsMHgxMiwweDM5LDB4ODYsMHg5NiwweDAwLDB4NzQsMHgwQywweDg5LDB4ODYsCisweDk2LDB4MDAsMHhFNiwweEYwLDB4ODYsMHhFMCwweEU2LDB4RjgsMHg4NiwweEUwLDB4RjYsMHhDMiwweDAyLDB4NzQsMHgxMCwweDM5LAorMHg4NiwweDk0LDB4MDAsMHg3NCwweDBBLDB4ODksMHg4NiwweDk0LDB4MDAsMHhFNiwweEU0LDB4ODYsMHhFMCwweEU2LDB4RUMsMHg4MywKKzB4RTksMHgwMywweEMzLDB4OTAsMHhFNCwweDE2LDB4ODgsMHg4NiwweEJDLDB4MDAsMHhFOCwweEU2LDB4RkEsMHgzMywweERCLDB4RTQsCisweDBDLDB4QTgsMHgwNiwweDc0LDB4MDMsMHg4MCwweENCLDB4MDEsMHhBOCwweDEwLDB4NzQsMHgwMywweDgwLDB4Q0IsMHgwMiwweEE4LAorMHg4MCwweDc0LDB4MDMsMHg4MCwweENCLDB4MDQsMHhFNCwweDEyLDB4OEEsMHhFMCwweDI0LDB4MTgsMHgwQSwweEQ4LDB4RTQsMHhEQSwKKzB4RjYsMHhDNCwweDAyLDB4NzQsMHgwNywweEE4LDB4NDAsMHg3NSwweDAzLDB4ODAsMHhDQiwweDIwLDB4QTgsMHgwMiwweDc1LDB4MDksCisweEU0LDB4MkEsMHhBOCwweDBGLDB4NzQsMHgwMywweDgwLDB4Q0IsMHg0MCwweEY3LDB4NDYsMHgzOCwweDAyLDB4MDAsMHg3NCwweDA5LAorMHhFNCwweEQ4LDB4QTgsMHgwMSwweDc1LDB4MDMsMHg4MCwweENCLDB4ODAsMHg4OCwweDlFLDB4QkUsMHgwMCwweEZFLDB4ODYsMHhCNCwKKzB4MDAsMHhCMCwweDBBLDB4RTgsMHg1QywweEU0LDB4RjgsMHhDMywweEFDLDB4NDksMHgzQywweDAyLDB4NzQsMHg0MSwweDc3LDB4MUYsCisweDUwLDB4RTgsMHg0RiwweEY1LDB4NTgsMHg3MiwweDBDLDB4ODQsMHhDMCwweDc0LDB4MEEsMHhCMCwweDEyLDB4RTYsMHgwQSwweDgwLAorMHg0RSwweDM4LDB4MDEsMHhGOCwweEMzLDB4QjAsMHgxMSwweEU2LDB4MEEsMHg4MCwweDY2LDB4MzgsMHhGRSwweEY4LDB4QzMsMHg4QiwKKzB4NDYsMHgzOCwweDI1LDB4RkYsMHhGNywweDg5LDB4NDYsMHgzOCwweEE5LDB4MDAsMHgwNCwweDc1LDB4RTYsMHg4QSwweDg2LDB4QTUsCisweDAwLDB4QTgsMHgxMCwweDc1LDB4REUsMHgwQywweDEwLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4RjgsMHhDMywweDgxLAorMHg0RSwweDM4LDB4MDAsMHgwOCwweDhBLDB4ODYsMHhBNSwweDAwLDB4QTgsMHgxMCwweDc0LDB4QzcsMHgyNCwweEVGLDB4RUIsMHhFNywKKzB4QUQsMHg0OSwweDQ5LDB4M0MsMHgwMSwweDcyLDB4MTEsMHgzQywweDBDLDB4NzcsMHgwRCwweDUwLDB4OEEsMHhFMCwweEU0LDB4MTQsCisweDI1LDB4RjAsMHgwRiwweDBBLDB4QzQsMHhFNiwweDE0LDB4NTgsMHg4QSwweEM0LDB4ODQsMHhDMCwweDc0LDB4MDIsMHhFNiwweDQyLAorMHhGOCwweEMzLDB4RTgsMHhDRiwweEY5LDB4RkUsMHg4NiwweEI5LDB4MDAsMHhCMCwweDBFLDB4RTgsMHhENCwweEUzLDB4RjgsMHhDMywKKzB4M0EsMHg4NiwweEFGLDB4MDAsMHg3NCwweDFGLDB4ODgsMHg4NiwweEFGLDB4MDAsMHg4QSwweEUwLDB4ODAsMHhDMiwweDA2LDB4QjAsCisweEJGLDB4RUUsMHg4MCwweEVBLDB4MDIsMHg4QSwweEM0LDB4RUUsMHg4QSwweDg2LDB4QTgsMHgwMCwweDgwLDB4QzIsMHgwMiwweEVFLAorMHg4MCwweEVBLDB4MDYsMHg4QSwweEM0LDB4QzMsMHg4QiwweDQ2LDB4M0UsMHg4NSwweEMwLDB4OEEsMHg4NiwweEE1LDB4MDAsMHg3NCwKKzB4MTIsMHhBOCwweDA4LDB4NzUsMHgwRCwweDBDLDB4MDgsMHg4OCwweDg2LDB4QTUsMHgwMCwweDgwLDB4QzIsMHgwMiwweEVFLDB4ODAsCisweEVBLDB4MDIsMHhDMywweEE4LDB4MDgsMHg3NCwweEZCLDB4MjQsMHhGNywweEVCLDB4RUMsMHg4QiwweDQ2LDB4MjYsMHg4NCwweEMwLAorMHg3NCwweDE2LDB4OEEsMHg4NiwweEE1LDB4MDAsMHhBOCwweDAyLDB4NzQsMHgwRCwweDI0LDB4RkQsMHg4OCwweDg2LDB4QTUsMHgwMCwKKzB4ODMsMHhDMiwweDAyLDB4RUUsMHg4MywweEVBLDB4MDIsMHhDMywweDhBLDB4ODYsMHhBNSwweDAwLDB4QTgsMHgwMiwweDc1LDB4RjcsCisweDBDLDB4MDIsMHhFQiwweEU4LDB4NTIsMHg4MywweEMyLDB4MEMsMHhFQywweEMwLDB4RTgsMHgwNCwweDg4LDB4ODYsMHhBOSwweDAwLAorMHg4QiwweDVFLDB4MjYsMHg4MCwweEUzLDB4M0YsMHhGNiwweEM3LDB4MDQsMHg3NCwweDA3LDB4QTgsMHgwOCwweDc1LDB4MDMsMHg4MCwKKzB4Q0IsMHg0MCwweEY2LDB4QzcsMHgwOCwweDc0LDB4MDcsMHhBOCwweDAyLDB4NzUsMHgwMywweDgwLDB4Q0IsMHg4MCwweDg4LDB4NUUsCisweDI2LDB4OEEsMHg4NiwweEE1LDB4MDAsMHg4NCwweERCLDB4NzQsMHgxMCwweEE4LDB4MDIsMHg3NCwweDBBLDB4MjQsMHhGRCwweDg4LAorMHg4NiwweEE1LDB4MDAsMHg4MywweEVBLDB4MEEsMHhFRSwweDVBLDB4QzMsMHhBOCwweDAyLDB4NzUsMHhGQSwweDBDLDB4MDIsMHhFQiwKKzB4RUUsMHg5MCwweEZGLDB4RkYsMHgwMCwweDQ4LDB4MDAsMHgzMCwweEJBLDB4MjAsMHhDNCwweDFBLDB4MDAsMHgxOCwweDAwLDB4MTIsCisweDAwLDB4MEMsMHgwMCwweDA2LDB4MDAsMHgwMywweDAwLDB4MDIsMHg4MCwweDAxLDB4QzAsMHgwMCwweDYwLDB4MDAsMHgzMCwweDAwLAorMHgxOCwweDAwLDB4Q0QsMHgwMSwweDAwLDB4MDEsMHg4MCwweDAwLDB4MTAsMHgwMCwweDEwLDB4MDAsMHgwRSwweDAwLDB4MEMsMHgwMCwKKzB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgwMCwweDA0LDB4MDAsMHgwMywweDAwLDB4MDIsMHgwMCwweDAxLDB4MDAsCisweDUyLDB4NTEsMHg1NiwweDNDLDB4MUUsMHg3NywweDQ3LDB4OTgsMHg4QiwweEYwLDB4OEEsMHg4MiwweEM0LDB4MDAsMHgzMiwweEU0LAorMHg4MywweEZFLDB4MTgsMHg3NCwweDNELDB4ODMsMHhGRSwweDE5LDB4NzQsMHgzRSwweDgzLDB4RkUsMHgxRSwweDc3LDB4MkYsMHhEMSwKKzB4RTYsMHgyRSwweDhCLDB4OEMsMHgzMiwweDJELDB4M0IsMHg4RSwweDk0LDB4MDAsMHg3NCwweDIyLDB4ODksMHg4RSwweDk0LDB4MDAsCisweDgzLDB4QzIsMHgwNiwweDhBLDB4ODYsMHhBOCwweDAwLDB4OEEsMHhFMCwweDBDLDB4ODAsMHhFRSwweDgzLDB4RUEsMHgwNiwweDhBLAorMHhDMSwweEVFLDB4ODMsMHhDMiwweDAyLDB4OEEsMHhDNSwweEVFLDB4ODMsMHhDMiwweDA0LDB4OEEsMHhDNCwweEVFLDB4NUUsMHg1OSwKKzB4NUEsMHhDMywweDhCLDB4OEUsMHg4RSwweDAwLDB4RUIsMHhDRSwweDhCLDB4OEUsMHg5MCwweDAwLDB4RUIsMHhDOCwweDUyLDB4NTEsCisweDNELDB4MDUsMHgwMCwweDc3LDB4MDMsMHhCOCwweDA1LDB4MDAsMHg4QiwweEM4LDB4QkEsMHgwMiwweDAwLDB4QjgsMHgwMCwweEQwLAorMHhGNywweEYxLDB4MDUsMHgwMSwweDAwLDB4RDEsMHhFOCwweDU5LDB4NUEsMHhDMywweDhCLDB4NDYsMHg3QSwweEE4LDB4MjAsMHg3NCwKKzB4MEIsMHg4MCwweEJFLDB4QzMsMHgwMCwweDAzLDB4NzUsMHgwNCwweDBDLDB4MDEsMHhFQiwweDAyLDB4MjQsMHhGRSwweDg5LDB4NDYsCisweDdBLDB4QzMsMHgyNCwweDAzLDB4ODgsMHg4NiwweEMzLDB4MDAsMHg4QSwweEE2LDB4QTgsMHgwMCwweDhBLDB4REMsMHg4MCwweEU0LAorMHhGQywweDBBLDB4QzQsMHgzQSwweEMzLDB4NzQsMHgwQiwweDg4LDB4ODYsMHhBOCwweDAwLDB4ODMsMHhDMiwweDA2LDB4RUUsMHg4MywKKzB4RUEsMHgwNiwweEU4LDB4QzUsMHhGRiwweEMzLDB4MDAsMHgwOCwweDE4LDB4MzgsMHgyOCwweDkwLDB4M0MsMHgwNCwweDc3LDB4MjMsCisweDMyLDB4RTQsMHg4QiwweEQ4LDB4MkUsMHg4QSwweDg3LDB4MjYsMHgyRSwweDhBLDB4QTYsMHhBOCwweDAwLDB4OEEsMHhEQywweDgwLAorMHhFNCwweEM3LDB4MEEsMHhDNCwweDNBLDB4QzMsMHg3NCwweDBCLDB4ODgsMHg4NiwweEE4LDB4MDAsMHg4MywweEMyLDB4MDYsMHhFRSwKKzB4ODMsMHhFQSwweDA2LDB4QzMsMHg4NCwweEMwLDB4NzQsMHgwMiwweEIwLDB4MDQsMHg4QSwweEE2LDB4QTgsMHgwMCwweDhBLDB4REMsCisweDgwLDB4RTQsMHhGQiwweDBBLDB4QzQsMHgzQSwweEMzLDB4NzQsMHgwQiwweDg4LDB4ODYsMHhBOCwweDAwLDB4ODMsMHhDMiwweDA2LAorMHhFRSwweDgzLDB4RUEsMHgwNiwweEMzLDB4OTAsMHg4QiwweDVFLDB4MzgsMHg4NCwweEMwLDB4NzQsMHgzNCwweDNDLDB4MDIsMHg3NCwKKzB4M0IsMHg4QSwweDg2LDB4QUYsMHgwMCwweDBDLDB4MDQsMHhFOCwweEU2LDB4RkQsMHg4QiwweDQ2LDB4MkUsMHgzQiwweDQ2LDB4M0MsCisweDc3LDB4MUIsMHhGNywweEMzLDB4MDAsMHgwNCwweDc1LDB4MTUsMHg4MSwweENCLDB4MDAsMHgwNCwweDgzLDB4QzIsMHgwMiwweDhBLAorMHg4NiwweEE1LDB4MDAsMHgyNCwweEZBLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFRSwweDgzLDB4RUEsMHgwMiwweDg5LDB4NUUsMHgzOCwKKzB4QzMsMHg4QSwweDg2LDB4QUYsMHgwMCwweDI0LDB4RkIsMHhFOCwweEI2LDB4RkQsMHhFQiwweEYxLDB4RjcsMHhDMywweDEwLDB4MDAsCisweDc0LDB4RUYsMHhFQiwweEVELDB4ODMsMHhDMiwweDBDLDB4RUMsMHg4MywweEVBLDB4MEMsMHhDMCwweEU4LDB4MDQsMHg4OCwweDg2LAorMHhBOSwweDAwLDB4QzMsMHg5MCwweDhBLDB4ODYsMHhBNywweDAwLDB4MEMsMHgwMSwweDg4LDB4ODYsMHhBNywweDAwLDB4OEIsMHhEQSwKKzB4ODAsMHhDMiwweDA4LDB4RUUsMHg4QiwweEQzLDB4RjgsMHhDMywweDhBLDB4ODYsMHhBNywweDAwLDB4MjQsMHhGRSwweEVCLDB4RUEsCisweDhBLDB4ODYsMHhBNywweDAwLDB4MEMsMHgwMiwweEVCLDB4RTIsMHg4QSwweDg2LDB4QTcsMHgwMCwweDI0LDB4RkQsMHhFQiwweERBLAorMHhCMCwweEZGLDB4RTgsMHg1MiwweEYyLDB4RTgsMHg5NywweEYyLDB4RjgsMHhDMywweEFDLDB4NDksMHhFOCwweDYxLDB4RkUsMHhGOCwKKzB4QzMsMHg5MCwweEFDLDB4NDksMHhFOCwweEVCLDB4RkUsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LDB4RTgsMHgzNSwweEZGLDB4RjgsCisweEMzLDB4OTAsMHhBQywweDQ5LDB4RTgsMHgwNSwweEZGLDB4RjgsMHhDMywweDkwLDB4NTIsMHg4MywweEMyLDB4MDYsMHhCMCwweEJGLAorMHhFRSwweDUyLDB4ODMsMHhDMiwweDAyLDB4QUMsMHg0OSwweEVFLDB4NUEsMHg4QSwweDg2LDB4QTgsMHgwMCwweEVFLDB4NUEsMHhGOCwKKzB4QzMsMHg5MCwweDUyLDB4ODMsMHhDMiwweDA2LDB4QjAsMHhCRiwweEVFLDB4NTIsMHg4MywweEMyLDB4MDYsMHhFQiwweEU2LDB4OTAsCisweEFDLDB4NDksMHgzQywweDAyLDB4NzcsMHgwRCwweDg0LDB4QzAsMHg3NSwweDBCLDB4OEEsMHg4NiwweEFGLDB4MDAsMHgyNCwweEZELAorMHhFOCwweDBELDB4RkQsMHhGOCwweEMzLDB4NTAsMHg4QSwweDg2LDB4QUYsMHgwMCwweDBDLDB4MDIsMHhFOCwweDAxLDB4RkQsMHg1QiwKKzB4ODMsMHhDMiwweDA4LDB4OEEsMHg4NiwweEE3LDB4MDAsMHhGNiwweEMzLDB4MDEsMHg3NCwweDBDLDB4MjQsMHhERiwweDg4LDB4ODYsCisweEE3LDB4MDAsMHhFRSwweDgzLDB4RUEsMHgwOCwweEY4LDB4QzMsMHgwQywweDIwLDB4RUIsMHhGMiwweEFDLDB4NDksMHhFOCwweEU1LAorMHhGRSwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHg0MCwweEU4LDB4NjksMHhGNSwweEU4LDB4RjksMHhGQywweEU4LDB4MjQsMHhGRiwKKzB4QjAsMHgwMSwweEU4LDB4QTUsMHhGNiwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHg0MCwweEU4LDB4NzEsMHhGNSwweEU4LDB4RTUsCisweEZDLDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDEwLDB4RTgsMHg0OSwweEY1LDB4RTgsMHhEOSwweEZDLDB4RTgsMHgwNCwweEZGLAorMHhCMCwweDA4LDB4RTgsMHg4NSwweEY2LDB4RjgsMHhDMywweDkwLDB4QjgsMHgwMCwweDEwLDB4RTgsMHg1MSwweEY1LDB4RTgsMHhDNSwKKzB4RkMsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4ODAsMHhFOCwweDI5LDB4RjUsMHhFOCwweEI5LDB4RkMsMHhFOCwweEU0LDB4RkUsCisweEIwLDB4MDIsMHhFOCwweDY1LDB4RjYsMHhGOCwweEMzLDB4OTAsMHhCOCwweDAwLDB4ODAsMHhFOCwweDMxLDB4RjUsMHhFOCwweEE1LAorMHhGQywweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHgyMCwweEU4LDB4MDksMHhGNSwweEU4LDB4OTksMHhGQywweEU4LDB4QzQsMHhGRSwKKzB4QjAsMHgwNCwweEU4LDB4NDUsMHhGNiwweEY4LDB4QzMsMHg5MCwweEI4LDB4MDAsMHgyMCwweEU4LDB4MTEsMHhGNSwweEU4LDB4ODUsCisweEZDLDB4RjgsMHhDMywweDkwLDB4QUMsMHg0OSwweEU4LDB4MzQsMHgwQywweEY4LDB4QzMsMHg5MCwweEI4LDB4RkMsMHgzQiwweDg5LAorMHg0NiwweDdDLDB4RjgsMHhDMywweDhBLDB4ODYsMHhBRiwweDAwLDB4MEMsMHg4MCwweEU4LDB4NDMsMHhGQywweEY4LDB4QzMsMHg5MCwKKzB4OEEsMHg4NiwweEFGLDB4MDAsMHgyNCwweDdGLDB4RUIsMHhGMiwweDhBLDB4ODYsMHhBRiwweDAwLDB4MEMsMHg0MCwweEU4LDB4MkYsCisweEZDLDB4RjgsMHhDMywweDkwLDB4OEEsMHg4NiwweEFGLDB4MDAsMHgyNCwweEJGLDB4RUIsMHhGMiwweEFDLDB4NDksMHhBOCwweDAxLAorMHg3NCwweDA3LDB4ODMsMHg0RSwweDdBLDB4MjAsMHhFQiwweDA1LDB4OTAsMHg4MywweDY2LDB4N0EsMHhERiwweEU4LDB4OEEsMHhGRCwKKzB4RjgsMHhDMywweDgzLDB4QzIsMHgwNiwweDhBLDB4ODYsMHhBOCwweDAwLDB4MEMsMHg0MCwweDg4LDB4ODYsMHhBOCwweDAwLDB4RUUsCisweDgzLDB4RUEsMHgwNiwweEFDLDB4NDksMHgzMiwweEU0LDB4ODksMHg0NiwweDZFLDB4ODMsMHg0RSwweDI2LDB4MDEsMHg4MywweDRFLAorMHg0OCwweDA4LDB4QjAsMHgwNiwweEU4LDB4QkIsMHhERiwweDQ5LDB4NDYsMHhGOSwweEMzLDB4OTAsMHg4MywweEMyLDB4MDYsMHg4QSwKKzB4ODYsMHhBOCwweDAwLDB4MEMsMHg0MCwweDg4LDB4ODYsMHhBOCwweDAwLDB4RUUsMHg4MywweEVBLDB4MDYsMHhBQywweEI0LDB4MEEsCisweEY2LDB4RTQsMHhFQiwweEQwLDB4RTgsMHhFMCwweDBCLDB4RjgsMHhDMywweDkwLDB4QUQsMHg0OSwweDQ5LDB4ODksMHg0NiwweDY0LAorMHhBOSwweDAxLDB4MDAsMHg3NCwweDE5LDB4OEIsMHhEOCwweDgzLDB4RTMsMHhGQSwweDc1LDB4MEEsMHhBOSwweDA0LDB4MDAsMHg3NCwKKzB4MEQsMHhCOCwweEUyLDB4M0YsMHhFQiwweDBCLDB4RTgsMHhFQywweEY0LDB4QjgsMHhBQSwweDQwLDB4RUIsMHgwMywweEI4LDB4MzgsCisweDQ0LDB4ODksMHg0NiwweDYyLDB4RjgsMHhDMywweDhBLDB4ODYsMHhBRiwweDAwLDB4QTgsMHgwMiwweDc0LDB4MEEsMHgyNCwweEZELAorMHhFOCwweDhELDB4RkIsMHgwQywweDAyLDB4RTgsMHg4OCwweEZCLDB4RjgsMHhDMywweEFDLDB4NDksMHhFOCwweDgxLDB4RkMsMHhGOCwKKzB4QzMsMHg5MCwweEFDLDB4NDksMHhFOCwweDc5LDB4RkMsMHhGOCwweEMzLDB4OTAsMHhFOCwweDVDLDB4RjUsMHg3NSwweDA1LDB4RTgsCisweEU2LDB4RkQsMHhGOCwweEMzLDB4RTgsMHhDRCwweEZELDB4MzYsMHhBMCwweEI0LDB4MTMsMHgyNCwweDEwLDB4MzQsMHgxMCwweEU4LAorMHgyNiwweDAxLDB4MzYsMHhBMSwweEI0LDB4MTMsMHhBOSwweDAxLDB4MDAsMHg3NCwweDA1LDB4RTgsMHhGRSwweEZFLDB4RUIsMHgwRSwKKzB4QTksMHgwMiwweDAwLDB4NzQsMHgwNCwweDMyLDB4QzAsMHhFQiwweDAyLDB4QjAsMHgwMSwweEU4LDB4RTgsMHhGRSwweDM2LDB4QTEsCisweEI0LDB4MTMsMHhFOCwweEFCLDB4MEIsMHgzNiwweEExLDB4QjQsMHgxMywweEMxLDB4RTgsMHgwNSwweDI1LDB4MDEsMHgwMCwweEU4LAorMHgwQywweEZGLDB4MzYsMHhBMCwweEI1LDB4MTMsMHgyNCwweDEwLDB4RTgsMHgyQiwweEZELDB4MzIsMHhDMCwweDM2LDB4OEEsMHgyNiwKKzB4QjUsMHgxMywweEY2LDB4QzQsMHgwNCwweDc0LDB4MDksMHhGRSwweEMwLDB4RjYsMHhDNCwweDA4LDB4NzQsMHgwMiwweEZFLDB4QzAsCisweEU4LDB4RUYsMHhGRCwweDM2LDB4QTEsMHhCNiwweDEzLDB4MjUsMHgwRiwweDAwLDB4RTgsMHgwMywweEZDLDB4MzYsMHhBMSwweEI2LAorMHgxMywweEMxLDB4RTgsMHgwNCwweDI1LDB4MDMsMHgwMCwweEU4LDB4ODgsMHhGQywweDM2LDB4QTEsMHhCNiwweDEzLDB4QzEsMHhFOCwKKzB4MDUsMHgyNSwweDAyLDB4MDAsMHhFOCwweENELDB4RkMsMHgzNiwweEExLDB4QjYsMHgxMywweEY2LDB4QzQsMHgwMSwweDc1LDB4MDQsCisweDMyLDB4QzAsMHhFQiwweDA5LDB4ODAsMHhFNCwweDAyLDB4RDAsMHhFQywweEIwLDB4MDIsMHgyQSwweEM0LDB4RTgsMHg4QywweEZDLAorMHgzNiwweEY2LDB4MDYsMHhCNywweDEzLDB4NDAsMHg3NCwweDA1LDB4RTgsMHg4RCwweEZFLDB4RUIsMHgwMywweEU4LDB4OTQsMHhGRSwKKzB4MzYsMHhGNiwweDA2LDB4QjcsMHgxMywweDIwLDB4NzQsMHgwNSwweEU4LDB4NjksMHhGRSwweEVCLDB4MDMsMHhFOCwweDcwLDB4RkUsCisweEY4LDB4QzMsMHhGOCwweEMzLDB4OEIsMHg0NiwweDM4LDB4QTksMHgwNCwweDAwLDB4NzUsMHgyMywweDBELDB4MDQsMHgwMCwweDg5LAorMHg0NiwweDM4LDB4ODMsMHhDMiwweDA4LDB4OEIsMHg0NiwweDJFLDB4M0IsMHg0NiwweDNDLDB4NzMsMHgxNCwweDgzLDB4NEUsMHgzOCwKKzB4MTAsMHg4QSwweDg2LDB4QTcsMHgwMCwweDI0LDB4RkUsMHg4OCwweDg2LDB4QTcsMHgwMCwweEVFLDB4ODMsMHhFQSwweDA4LDB4RjgsCisweEMzLDB4OEEsMHg4NiwweEE3LDB4MDAsMHgwQywweDAxLDB4RUIsMHhFRSwweDkwLDB4OEIsMHg0NiwweDM4LDB4QTksMHgwNCwweDAwLAorMHg3NCwweDA2LDB4MjUsMHhGQiwweEZGLDB4ODksMHg0NiwweDM4LDB4RjgsMHhDMywweEFELDB4NDksMHg0OSwweEU4LDB4QkUsMHhGQiwKKzB4ODksMHg4NiwweDhFLDB4MDAsMHhGOCwweEMzLDB4QUQsMHg0OSwweDQ5LDB4RTgsMHhCMiwweEZCLDB4ODksMHg4NiwweDkwLDB4MDAsCisweEY4LDB4QzMsMHg4MywweDRFLDB4MjYsMHgwNCwweEU4LDB4OTIsMHhGQSwweEY4LDB4QzMsMHg5MCwweDgzLDB4NjYsMHgyNiwweEZCLAorMHhFOCwweDg4LDB4RkEsMHhGOCwweEMzLDB4OTAsMHhBQywweDQ5LDB4ODQsMHhDMCwweDc1LDB4MDcsMHg4MCwweDhFLDB4QTMsMHgwMCwKKzB4MDQsMHhGOCwweEMzLDB4ODAsMHhBNiwweEEzLDB4MDAsMHhGQiwweEY4LDB4QzMsMHhBQywweDQ5LDB4ODMsMHhDMiwweDA4LDB4M0MsCisweDAyLDB4NzYsMHgwMiwweDMyLDB4QzAsMHgzQywweDAxLDB4NzQsMHgxMiwweDc3LDB4MEIsMHg4QSwweDg2LDB4QTcsMHgwMCwweDI0LAorMHhFRiwweDg4LDB4ODYsMHhBNywweDAwLDB4RUUsMHg4MywweEVBLDB4MDgsMHhGOCwweEMzLDB4OEEsMHg4NiwweEE3LDB4MDAsMHgwQywKKzB4MTAsMHhFQiwweEVFLDB4OTAsMHg1MiwweDgzLDB4QzIsMHgwNiwweEIwLDB4QkYsMHhFRSwweDUyLDB4ODMsMHhDMiwweDA0LDB4QUMsCisweDQ5LDB4RUUsMHg1QSwweDhBLDB4ODYsMHhBOCwweDAwLDB4RUUsMHg1QSwweEY4LDB4QzMsMHg5MCwweDUyLDB4ODMsMHhDMiwweDA2LAorMHhCMCwweEJGLDB4RUUsMHg1MiwweDgzLDB4QzIsMHgwOCwweEVCLDB4RTYsMHg5MCwweEFDLDB4NDksMHhGOCwweEMzLDB4QUMsMHg0OSwKKzB4RTgsMHhCNCwweEVFLDB4NzMsMHgwMywweEU4LDB4RjcsMHhFRSwweEY4LDB4QzMsMHg4QSwweDg2LDB4QUYsMHgwMCwweDI0LDB4N0YsCisweEU4LDB4QkQsMHhGOSwweEI4LDB4RjAsMHgwMCwweEU4LDB4NjYsMHhGMiwweDgxLDB4NjYsMHgyNiwweEZGLDB4RjMsMHhFOCwweDIzLAorMHhGQSwweEU4LDB4RDIsMHhGOSwweEY4LDB4QzMsMHhCOCwweDgwLDB4MDAsMHhFOCwweDM3LDB4RjIsMHg4MCwweDRFLDB4MjcsMHgwOCwKKzB4RTgsMHgxMSwweEZBLDB4RTgsMHhDMCwweEY5LDB4RjgsMHhDMywweEI4LDB4ODAsMHgwMCwweEU4LDB4NDEsMHhGMiwweDgxLDB4NjYsCisweDI2LDB4RkYsMHhGNywweEU4LDB4RkUsMHhGOSwweEU4LDB4QUQsMHhGOSwweEY4LDB4QzMsMHg5MCwweEI4LDB4MTAsMHgwMCwweEU4LAorMHgxMSwweEYyLDB4ODAsMHg0RSwweDI3LDB4MDQsMHhFOCwweEVCLDB4RjksMHhFOCwweDlBLDB4RjksMHhGOCwweEMzLDB4QjgsMHgxMCwKKzB4MDAsMHhFOCwweEZGLDB4RjEsMHg4MSwweDY2LDB4MjYsMHhGRiwweEZCLDB4RTgsMHhEOCwweEY5LDB4RjgsMHhDMywweEFDLDB4NDksCisweEY4LDB4QzMsMHg4MywweEMyLDB4MDYsMHg4QSwweDg2LDB4QTgsMHgwMCwweDBDLDB4NDAsMHg4OCwweDg2LDB4QTgsMHgwMCwweEVFLAorMHg4MywweEVBLDB4MDYsMHhGOCwweEMzLDB4OTAsMHg4MywweEMyLDB4MDYsMHg4QSwweDg2LDB4QTgsMHgwMCwweDI0LDB4QkYsMHhFQiwKKzB4RUEsMHg5MCwweEFDLDB4NDksMHg4QSwweEUwLDB4ODAsMHhDMiwweDBBLDB4RUMsMHg4MCwweEVBLDB4MEEsMHhBOCwweDIwLDB4NzQsCisweDA1LDB4OEEsMHhDNCwweEVFLDB4RjgsMHhDMywweDA2LDB4NTEsMHg1NywweDhCLDB4NEUsMHgyNCwweEUzLDB4MzQsMHg0OSwweDg5LAorMHg0RSwweDI0LDB4RkYsMHg0NiwweDFBLDB4OEUsMHg0NiwweDAyLDB4OEIsMHg3RSwweDIyLDB4OEEsMHhDNCwweEFBLDB4ODksMHg3RSwKKzB4MjIsMHg4QiwweDQ2LDB4MjYsMHgyNCwweEZELDB4ODksMHg0NiwweDI2LDB4NzUsMHgyOSwweDhBLDB4ODYsMHhBNSwweDAwLDB4QTgsCisweDAyLDB4NzUsMHgyMSwweDgwLDB4QzIsMHgwMiwweDBDLDB4MDIsMHg4OCwweDg2LDB4QTUsMHgwMCwweEVFLDB4ODAsMHhFQSwweDAyLAorMHhFQiwweDEyLDB4QzQsMHg3RSwweDAwLDB4M0IsMHg3RSwweDFFLDB4NzYsMHgwQSwweDRGLDB4MjYsMHg4OCwweDI1LDB4ODksMHg3RSwKKzB4MDAsMHhGRiwweDQ2LDB4MUEsMHg1RiwweDU5LDB4MDcsMHhGOCwweEMzLDB4OTAsMHhBQywweEFELDB4ODMsMHhFOSwweDAzLDB4ODUsCisweEMwLDB4NzQsMHgwNSwweDNELDB4MDAsMHgyMCwweDcyLDB4MDUsMHhCOCwweEZGLDB4RkYsMHhFQiwweDAzLDB4QzEsMHhFMCwweDAzLAorMHgzQiwweDg2LDB4OTQsMHgwMCwweDc0LDB4MjYsMHg4OSwweDg2LDB4OTQsMHgwMCwweDhCLDB4RDgsMHg1MiwweDgzLDB4QzIsMHgwNiwKKzB4OEEsMHg4NiwweEE4LDB4MDAsMHg4QSwweEUwLDB4MEMsMHg4MCwweEVFLDB4ODMsMHhFQSwweDA2LDB4OEEsMHhDMywweEVFLDB4ODMsCisweEMyLDB4MDIsMHg4QSwweEM3LDB4RUUsMHg4MywweEMyLDB4MDQsMHg4QSwweEM0LDB4RUUsMHg1QSwweEY4LDB4QzMsMHhCMCwweDg4LAorMHg4OCwweDg2LDB4QkMsMHgwMCwweEU4LDB4OEMsMHhGMiwweDMzLDB4REIsMHg4QSwweDg2LDB4QTUsMHgwMCwweEE4LDB4MDIsMHg3NCwKKzB4MDMsMHg4MCwweENCLDB4MDEsMHhBOCwweDA1LDB4NzQsMHgwMywweDgwLDB4Q0IsMHgwMiwweEE4LDB4MDgsMHg3NCwweDAzLDB4ODAsCisweENCLDB4MDQsMHhGNiwweDg2LDB4QTcsMHgwMCwweDEwLDB4NzQsMHgwMywweDgwLDB4Q0IsMHgxMCwweDhBLDB4ODYsMHhBOSwweDAwLAorMHhGNiwweEMzLDB4MDQsMHg3NSwweDBBLDB4ODMsMHhDMiwweDBDLDB4RUMsMHg4MywweEVBLDB4MEMsMHhDMCwweEU4LDB4MDQsMHg4QSwKKzB4RTAsMHg4QSwweDg2LDB4QUYsMHgwMCwweEE4LDB4ODAsMHg3NCwweDA4LDB4RjYsMHhDNCwweDAxLDB4NzUsMHgwMywweDgwLDB4Q0IsCisweDIwLDB4RjYsMHg4NiwweEE3LDB4MDAsMHgwMiwweDc1LDB4MEEsMHhGNywweDQ2LDB4MzgsMHgwNCwweDAwLDB4NzQsMHgwMywweDgwLAorMHhDQiwweDQwLDB4ODgsMHg5RSwweEJFLDB4MDAsMHhGRSwweDg2LDB4QjQsMHgwMCwweEIwLDB4MEEsMHhFOCwweEYzLDB4REIsMHhGOCwKKzB4QzMsMHhGRSwweDg2LDB4QjQsMHgwMCwweEIwLDB4MEEsMHhFOCwweEU4LDB4REIsMHhGOCwweEMzLDB4QUMsMHg0OSwweDNDLDB4MDIsCisweDc0LDB4MzcsMHg3NywweDEwLDB4ODQsMHhDMCwweDc0LDB4MDYsMHg4MCwweDRFLDB4MzgsMHgwMSwweEY4LDB4QzMsMHg4MCwweDY2LAorMHgzOCwweEZFLDB4RjgsMHhDMywweDhCLDB4NDYsMHgzOCwweDI1LDB4RkYsMHhGNywweDg5LDB4NDYsMHgzOCwweEE5LDB4MDAsMHgwNCwKKzB4NzUsMHhFQSwweDhBLDB4ODYsMHhBNSwweDAwLDB4QTgsMHgwMSwweDc1LDB4RTIsMHgwQywweDA1LDB4ODMsMHhDMiwweDAyLDB4ODgsCisweDg2LDB4QTUsMHgwMCwweEVFLDB4ODMsMHhFQSwweDAyLDB4RjgsMHhDMywweDgxLDB4NEUsMHgzOCwweDAwLDB4MDgsMHg4QSwweDg2LAorMHhBNSwweDAwLDB4QTgsMHgwMSwweDc0LDB4QzYsMHgyNCwweEZBLDB4RUIsMHhFMiwweEFELDB4NDksMHg0OSwweEY4LDB4QzMsMHg5MCwKKzB4RTgsMHgxMSwweEZBLDB4RkUsMHg4NiwweEI5LDB4MDAsMHhCMCwweDBFLDB4RTgsMHg4NiwweERCLDB4RjgsMHhDMywweEIwLDB4RkYsCisweEU4LDB4QkYsMHhFQywweEY4LDB4QzMsMHg5MCwweDgzLDB4NjYsMHg3QSwweEZCLDB4QjAsMHgwMCwweEU4LDB4NzMsMHhEQiwweEY4LAorMHhDMywweDkwLDB4QUMsMHg0OSwweEU4LDB4NTMsMHhEOSwweDcyLDB4MTEsMHgzNiwweDg4LDB4MUUsMHgxQSwweDAxLDB4MzYsMHhBMCwKKzB4OEUsMHgxMiwweDBBLDB4QzMsMHg1MiwweEJBLDB4MDAsMHgwMSwweEVFLDB4NUEsMHhGOCwweEMzLDB4QUMsMHg0OSwweDMyLDB4RTQsCisweDM2LDB4QTMsMHg4NiwweDEyLDB4MDUsMHgwNiwweDAwLDB4MzYsMHg4QiwweDFFLDB4ODgsMHgxMiwweDJCLDB4RDgsMHgzNiwweDg5LAorMHgxRSwweDhBLDB4MTIsMHhGOCwweEMzLDB4OTAsMHhBRCwweDhCLDB4RDgsMHhBRCwweDgzLDB4RTksMHgwNCwweDAzLDB4QzMsMHgyQiwKKzB4NDYsMHg3NiwweDg5LDB4NDYsMHg3OCwweEY3LDB4NDYsMHg3QSwweDAyLDB4MDAsMHg3NCwweDBBLDB4ODMsMHg2NiwweDdBLDB4RkQsCisweEI4LDB4MDAsMHgwMCwweEU4LDB4MUMsMHhEQiwweEY4LDB4QzMsMHgwNiwweDE2LDB4MDcsMHhBQywweDQ5LDB4MjUsMHgwRiwweDAwLAorMHg2QiwweEMwLDB4MDksMHg4RCwweEJFLDB4RkQsMHgwMCwweDAzLDB4RjgsMHhBQywweDQ5LDB4MjUsMHgwRiwweDAwLDB4QUEsMHg4NSwKKzB4QzAsMHg3NCwweDA4LDB4MkIsMHhDOCwweDUxLDB4OEIsMHhDOCwweEYzLDB4QTQsMHg1OSwweEU4LDB4MjcsMHhGMCwweEU4LDB4NDQsCisweDAzLDB4MDcsMHhGOCwweEMzLDB4MzMsMHhDMCwweEFDLDB4NDksMHgzNiwweEEzLDB4QjIsMHgxMywweDM2LDB4QTMsMHhCMCwweDEzLAorMHhGOCwweEMzLDB4ODMsMHg2NiwweDdBLDB4RUYsMHhFOCwweDJDLDB4MDMsMHhGOCwweEMzLDB4OTAsMHg4MywweDRFLDB4N0EsMHgxMCwKKzB4RUIsMHhGNCwweEU4LDB4OUIsMHhGMCwweEY4LDB4QzMsMHg5MCwweEFELDB4M0MsMHgxOSwweDc3LDB4MEUsMHgzQywweDE5LDB4NzcsCisweDBBLDB4OEIsMHhGOCwweDgxLDB4RTcsMHhGRiwweDAwLDB4ODgsMHhBNiwweEM0LDB4MDAsMHhGOCwweEMzLDB4OTAsMHg4MywweDRFLAorMHgyNiwweDIwLDB4QUMsMHg0OSwweDMyLDB4RTQsMHhEMSwweEUwLDB4OEIsMHhEOCwweEMxLDB4RTMsMHgwMiwweDAzLDB4QzMsMHg4OSwKKzB4NDYsMHg2RSwweDgzLDB4NEUsMHg0OCwweDA0LDB4QjAsMHgwNiwweEU4LDB4OTcsMHhEQSwweDQ5LDB4NDYsMHhGOSwweEMzLDB4OTAsCisweEZFLDB4ODYsMHhCMywweDAwLDB4QjAsMHgwQSwweEU4LDB4ODksMHhEQSwweEY4LDB4QzMsMHg5MCwweDMzLDB4QzAsMHhBQywweDQ5LAorMHg2QiwweEMwLDB4MEEsMHg4OSwweDg2LDB4OEEsMHgwMCwweEY4LDB4QzMsMHg5MCwweEFDLDB4NDksMHgzMiwweEU0LDB4M0QsMHgwQSwKKzB4MDAsMHg3NywweDA1LDB4QjgsMHgwQSwweDAwLDB4RUIsMHgwOCwweDNELDB4NUEsMHgwMCwweDcyLDB4MDMsMHhCOCwweDVBLDB4MDAsCisweDUxLDB4RjcsMHhEOCwweDA1LDB4NjQsMHgwMCwweDhCLDB4QzgsMHg4QiwweDQ2LDB4NDQsMHhGNywweEUxLDB4QjksMHg2NCwweDAwLAorMHhGNywweEYxLDB4ODksMHg0NiwweDQ2LDB4NTksMHhGOCwweEMzLDB4QUMsMHg0OSwweEU4LDB4ODUsMHhFQiwweEY4LDB4QzMsMHg5MCwKKzB4QUMsMHg0OSwweDg0LDB4QzAsMHg3NSwweDA3LDB4ODEsMHg2NiwweDM4LDB4RkYsMHhGRCwweEY4LDB4QzMsMHg4MSwweDRFLDB4MzgsCisweDAwLDB4MDIsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzUsMHgwOCwweDhBLDB4ODYsMHhBOSwweDAwLDB4ODgsMHg4NiwweEFBLAorMHgwMCwweEY4LDB4QzMsMHg5MCwweDUxLDB4NTYsMHhFOCwweDdGLDB4MEMsMHg1RSwweDU5LDB4RjgsMHhDMywweDkwLDB4RkUsMHg4NiwKKzB4QjYsMHgwMCwweEIwLDB4MEEsMHhFOCwweDBCLDB4REEsMHhGOCwweEMzLDB4OTAsMHhGRSwweDg2LDB4QjcsMHgwMCwweEIwLDB4MEEsCisweEU4LDB4RkYsMHhEOSwweEY4LDB4QzMsMHg5MCwweEZFLDB4ODYsMHhCOCwweDAwLDB4QjAsMHgwQSwweEU4LDB4RjMsMHhEOSwweEY4LAorMHhDMywweDkwLDB4MDAsMHg5MCwweDUxLDB4NTUsMHhBQywweDJFLDB4QTIsMHg1MiwweDM2LDB4MzMsMHhDOSwweEFELDB4OEIsMHhGOSwKKzB4QzEsMHhFNywweDA1LDB4QTksMHgwMSwweDAwLDB4NzQsMHgyMywweDJFLDB4OEIsMHhBRCwweDQ0LDB4MDAsMHg4MywweDdFLDB4MDgsCisweDAwLDB4NzQsMHgxOCwweDJFLDB4ODAsMHgzRSwweDUyLDB4MzYsMHgwMSwweDc0LDB4MDksMHg2MCwweEIwLDB4MDQsMHhFOCwweEJCLAorMHgwQywweDYxLDB4RUIsMHgwNywweDYwLDB4QjAsMHhGQiwweEU4LDB4RUMsMHgwQywweDYxLDB4NDcsMHg0NywweEQxLDB4RTgsMHg3NSwKKzB4RDIsMHg0MSwweDgzLDB4RjksMHgwNCwweDcyLDB4QzYsMHg1RCwweDU5LDB4ODMsMHhFOSwweDA1LDB4RjcsMHg0NiwweDM4LDB4NDAsCisweDAwLDB4NzQsMHgwNSwweEU4LDB4ODcsMHhFQSwweEY4LDB4QzMsMHhFOCwweDhELDB4RUEsMHhGOCwweEMzLDB4OTAsMHgzNiwweEM2LAorMHgwNiwweEM4LDB4MTMsMHgwMSwweEY4LDB4QzMsMHgzMywweEMwLDB4QUMsMHg0OSwweDM2LDB4QTMsMHg4MCwweDEyLDB4QUMsMHg0OSwKKzB4MzYsMHgyQiwweDA2LDB4ODgsMHgxMiwweEY3LDB4RDgsMHgzNiwweEEzLDB4ODIsMHgxMiwweEY4LDB4QzMsMHg5MCwweERFLDB4MjYsCisweERFLDB4MjYsMHhFQywweDI2LDB4RjIsMHgyNiwweEY4LDB4MjYsMHhGRSwweDI2LDB4MDQsMHgyNywweDBFLDB4MjcsMHgxNiwweDI3LAorMHgxRSwweDI3LDB4MjYsMHgyNywweDJFLDB4MjcsMHgzNCwweDI3LDB4QkUsMHgzNCwweEM2LDB4MzQsMHhEMiwweDM0LDB4M0EsMHgyNywKKzB4NzgsMHgyNywweDgwLDB4MjcsMHg5NCwweDI3LDB4QTAsMHgyNywweEI0LDB4MjcsMHhDMCwweDI3LDB4RDQsMHgyNywweEUwLDB4MjcsCisweEY0LDB4MjcsMHgwMCwweDI4LDB4MTAsMHgyOCwweEVDLDB4MzQsMHhERSwweDI2LDB4MUUsMHgyOCwweDI2LDB4MjgsMHgyQywweDI4LAorMHgzMiwweDI4LDB4MzgsMHgyOCwweDRFLDB4MjgsMHg4QSwweDI4LDB4MDYsMHgzNSwweDI4LDB4MzUsMHg5OCwweDI4LDB4QkUsMHgyOCwKKzB4RDIsMHgyOCwweERFLDB4MjgsMHhFNiwweDI4LDB4NTQsMHgzNSwweDYyLDB4MzUsMHg2QywweDM1LDB4RUUsMHgyOCwweEMwLDB4MjksCisweEM4LDB4MjksMHhDRSwweDI5LDB4RTAsMHgyOSwweDcyLDB4MzUsMHg3OCwweDM1LDB4RjAsMHgyOSwweEZDLDB4MjksMHg4RSwweDM1LAorMHgwOCwweDJBLDB4MTIsMHgyQSwweDFDLDB4MkEsMHhCMCwweDM1LDB4MzYsMHgyQSwweEJDLDB4MzUsMHg1QSwweDJBLDB4NjIsMHgyQSwKKzB4NjgsMHgyQSwweENBLDB4MzUsMHg3QywweDJBLDB4RjgsMHgzNSwweDg4LDB4MkEsMHhBNiwweDJBLDB4QjgsMHgyQSwweENDLDB4MkEsCisweERFLDB4MkEsMHhGMiwweDJBLDB4MDAsMHgzNiwweDBBLDB4MkIsMHgyNCwweDJCLDB4MjQsMHgzNiwweDM4LDB4MkIsMHg0QywweDJCLAorMHg4NCwweDJCLDB4MkUsMHgzNiwweDNBLDB4MzYsMHg0NiwweDM2LDB4NTQsMHgzNiwweEU4LDB4MkIsMHhBRSwweDM2LDB4NDAsMHgyQywKKzB4NjIsMHgyQywweEI2LDB4MzYsMHg3MCwweDI4LDB4REUsMHgyNiwweERFLDB4MjYsMHhENCwweDJFLDB4RTgsMHgyRSwweEYwLDB4MkUsCisweEY4LDB4MkUsMHgwMCwweDJGLDB4MEEsMHgyRiwweDEyLDB4MkYsMHgxQSwweDJGLDB4MjIsMHgyRiwweDJBLDB4MkYsMHg0MiwweDJGLAorMHhCRSwweDM0LDB4QzYsMHgzNCwweEQyLDB4MzQsMHg1MCwweDJGLDB4OEMsMHgyRiwweDk0LDB4MkYsMHhBOCwweDJGLDB4QjQsMHgyRiwKKzB4QzgsMHgyRiwweEQ0LDB4MkYsMHhFOCwweDJGLDB4RjQsMHgyRiwweDA4LDB4MzAsMHgxNCwweDMwLDB4MUMsMHgzMCwweEVDLDB4MzQsCisweERFLDB4MjYsMHgyNCwweDMwLDB4MzAsMHgzMCwweDM4LDB4MzAsMHg0NCwweDMwLDB4NEMsMHgzMCwweDYyLDB4MzAsMHhBNCwweDMwLAorMHgwNiwweDM1LDB4MjgsMHgzNSwweEFBLDB4MzAsMHhDRSwweDMwLDB4RDYsMHgzMCwweEVBLDB4MzAsMHhGMiwweDMwLDB4NTQsMHgzNSwKKzB4NjIsMHgzNSwweDZDLDB4MzUsMHhGQSwweDMwLDB4QzIsMHgzMSwweEMyLDB4MzEsMHhDNCwweDMxLDB4RkEsMHgzMSwweDcyLDB4MzUsCisweDc4LDB4MzUsMHgwQSwweDMyLDB4MTYsMHgzMiwweDhFLDB4MzUsMHgyMiwweDMyLDB4MkMsMHgzMiwweDM2LDB4MzIsMHhCMCwweDM1LAorMHg0QSwweDMyLDB4QkMsMHgzNSwweDc0LDB4MzIsMHg4QywweDMyLDB4OUEsMHgzMiwweENBLDB4MzUsMHg5RSwweDMyLDB4RjgsMHgzNSwKKzB4QUEsMHgzMiwweEM2LDB4MzIsMHhEOCwweDMyLDB4RUMsMHgzMiwweEZFLDB4MzIsMHgwRSwweDMzLDB4MDAsMHgzNiwweDEyLDB4MzMsCisweDI2LDB4MzMsMHgyNCwweDM2LDB4MzIsMHgzMywweDlBLDB4MzMsMHhERSwweDMzLDB4MkUsMHgzNiwweDNBLDB4MzYsMHg0NiwweDM2LAorMHg1NCwweDM2LDB4NUMsMHgzNCwweEFFLDB4MzYsMHhBQSwweDM0LDB4QjAsMHgzNCwweEI2LDB4MzYsMHg4QywweDMwLDB4RTMsMHgyOCwKKzB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwweDc1LDB4MzIsMHhFOCwweEUzLDB4RTgsMHgzMywweEMwLDB4QUMsMHg0OSwweDNELDB4NUIsCisweDAwLDB4NzcsMHgxOSwweDhCLDB4RDgsMHhEMSwweEUzLDB4MkUsMHhGRiwweDk3LDB4Q0UsMHgzNiwweDcyLDB4MEIsMHg4NSwweEM5LAorMHg3NSwweEU4LDB4OEIsMHg0NiwweDQ4LDB4RTgsMHgxQSwweDBDLDB4QzMsMHg0RSwweDQxLDB4QzMsMHg2QSwweDAwLDB4MUYsMHhDNiwKKzB4MDYsMHg5MywweDEyLDB4MEMsMHg5QywweDBFLDB4RTgsMHg2MywweERBLDB4RTgsMHhCQywweEU4LDB4MzMsMHhDMCwweEFDLDB4NDksCisweDNELDB4NUIsMHgwMCwweDc3LDB4RTcsMHg4QiwweEQ4LDB4RDEsMHhFMywweDJFLDB4RkYsMHg5NywweDg2LDB4MzcsMHg3MiwweEQ5LAorMHg4NSwweEM5LDB4NzUsMHhFOCwweEMzLDB4RjcsMHg0NiwweDdBLDB4MTAsMHgwMCwweDc1LDB4MEYsMHg4MywweEJFLDB4ODQsMHgwMCwKKzB4MDAsMHg3NCwweDA4LDB4QjgsMHg0OCwweDNBLDB4ODksMHg4NiwweDgwLDB4MDAsMHhDMywweDgxLDB4QkUsMHg4MCwweDAwLDB4RUMsCisweDNDLDB4NzQsMHhGNywweDgzLDB4QkUsMHg4OCwweDAwLDB4MDAsMHg3NSwweDA1LDB4QjgsMHhFQywweDNDLDB4RUIsMHhFNywweEY3LAorMHg0NiwweDdBLDB4MDgsMHgwMCwweDc1LDB4NDAsMHgxRSwweDYwLDB4OEIsMHg4RSwweDg4LDB4MDAsMHgzQiwweDRFLDB4NzQsMHg3NywKKzB4MzMsMHgzQiwweDRFLDB4NzgsMHg3NywweDJFLDB4QzQsMHg3RSwweDEwLDB4OEIsMHhERiwweDI2LDB4MDMsMHgzRCwweDQ3LDB4NDcsCisweDMzLDB4QzAsMHg4RSwweEQ4LDB4OEQsMHhCNiwweEY0LDB4MDAsMHg4QiwweEMxLDB4RjcsMHg0NiwweDdBLDB4MDEsMHgwMCwweDc1LAorMHgxRCwweEYzLDB4QTQsMHgyNiwweDAxLDB4MDcsMHgyOSwweDQ2LDB4NzgsMHgwMSwweDQ2LDB4NzYsMHgyOSwweDQ2LDB4NzQsMHhCMCwKKzB4MEMsMHhFOCwweDNFLDB4RDcsMHg2MSwweDFGLDB4QzcsMHg4NiwweDg4LDB4MDAsMHgwMCwweDAwLDB4RUIsMHhBQywweEUzLDB4RTMsCisweDUwLDB4OTAsMHhBQywweDI0LDB4N0YsMHhBQSwweEUyLDB4RkEsMHg1OCwweEVCLDB4RDgsMHg5MCwweDhCLDB4OEUsMHg4OCwweDAwLAorMHhFMywweDQ2LDB4OEIsMHg5RSwweDhBLDB4MDAsMHg4NSwweERCLDB4NzQsMHgzRSwweEJBLDB4NTAsMHhGRiwweEVELDB4MkIsMHg4NiwKKzB4ODIsMHgwMCwweDNCLDB4QzMsMHg3MiwweDM3LDB4OEQsMHhCNiwweEY0LDB4MDAsMHhDNCwweDdFLDB4MTAsMHg4QiwweERGLDB4MjYsCisweDAzLDB4M0QsMHg0NywweDQ3LDB4OEIsMHhDMSwweDE2LDB4MUYsMHhGNywweDQ2LDB4N0EsMHgwMSwweDAwLDB4NzUsMHgyNCwweEYzLAorMHhBNCwweDI2LDB4MDEsMHgwNywweDI5LDB4NDYsMHg3OCwweDAxLDB4NDYsMHg3NiwweDI5LDB4NDYsMHg3NCwweEM3LDB4ODYsMHg4OCwKKzB4MDAsMHgwMCwweDAwLDB4QjAsMHgwQywweEU4LDB4REEsMHhENiwweDgzLDB4NjYsMHg3QSwweEY3LDB4QzMsMHhCMCwweDAwLDB4RTgsCisweEQwLDB4RDYsMHhDMywweEUzLDB4REMsMHg1MCwweEFDLDB4MjQsMHg3RiwweEFBLDB4RTIsMHhGQSwweDU4LDB4RUIsMHhEMiwweDkwLAorMHgxRSwweDYwLDB4MzMsMHhDMCwweDhFLDB4RDgsMHg4RCwweEI2LDB4RkQsMHgwMCwweDhCLDB4ODYsMHg4OCwweDAwLDB4OEIsMHg5NiwKKzB4ODQsMHgwMCwweDNBLDB4MDQsMHg3NSwweDEwLDB4OEIsMHhERSwweDQ2LDB4OEIsMHhDOCwweDhELDB4QkUsMHhGNCwweDAwLDB4RjMsCisweEE2LDB4NzQsMHg2NiwweDhCLDB4RjMsMHg5MCwweDgzLDB4QzYsMHgwOSwweDRBLDB4NzUsMHhFNiwweDhELDB4QjYsMHhGRCwweDAwLAorMHg4QiwweDk2LDB4ODQsMHgwMCwweDNBLDB4MDQsMHg3MywweDEwLDB4OEIsMHhERSwweDQ2LDB4OEIsMHhDOCwweDhELDB4QkUsMHhGNCwKKzB4MDAsMHhGMywweEE2LDB4NzQsMHg3NiwweDhCLDB4RjMsMHg5MCwweDgzLDB4QzYsMHgwOSwweDRBLDB4NzUsMHhFNiwweDhELDB4QjYsCisweEY0LDB4MDAsMHhBQywweEY3LDB4NDYsMHg3QSwweDAxLDB4MDAsMHg3NCwweDAyLDB4MjQsMHg3RiwweDFFLDB4QzUsMHg1RSwweDEwLAorMHg4QiwweDM3LDB4ODgsMHg0MCwweDAyLDB4NDYsMHg4OSwweDM3LDB4RkYsMHg0RSwweDc4LDB4RkYsMHg0NiwweDc2LDB4RkYsMHg0RSwKKzB4NzQsMHgxRiwweDhCLDB4OEUsMHg4OCwweDAwLDB4NDksMHg4OSwweDhFLDB4ODgsMHgwMCwweEUzLDB4NDMsMHg4RCwweEI2LDB4RjQsCisweDAwLDB4OEIsMHhGRSwweDQ2LDB4RjMsMHhBNCwweEU5LDB4N0QsMHhGRiwweEM1LDB4NzYsMHgxMCwweDhCLDB4MUMsMHg4NSwweERCLAorMHg3NCwweDA4LDB4MDMsMHhGMywweDgzLDB4QzYsMHgwMywweDgzLDB4RTYsMHhGRSwweDhCLDB4ODYsMHg4NCwweDAwLDB4MkIsMHhDMiwKKzB4QjQsMHg4MCwweDg5LDB4MDQsMHg0NiwweDQ2LDB4QzcsMHgwNCwweDAwLDB4MDAsMHg4OSwweDc2LDB4MTAsMHg4MywweDRFLDB4N0EsCisweDA0LDB4QzcsMHg4NiwweDg4LDB4MDAsMHgwMCwweDAwLDB4NjEsMHgxRiwweEY5LDB4QzMsMHgzMywweEMwLDB4NjEsMHgxRiwweEMzLAorMHhCMCwweDgwLDB4ODQsMHhDMCwweDYxLDB4MUYsMHhDMywweDkwLDB4OEIsMHg0RSwweDc4LDB4MkIsMHg4RSwweDg4LDB4MDAsMHg3NiwKKzB4MjcsMHg4OSwweEI2LDB4OEMsMHgwMCwweDhCLDB4NUUsMHg3NCwweDNCLDB4Q0IsMHg3MiwweDAyLDB4OEIsMHhDQiwweDNCLDB4QzgsCisweDcyLDB4MDIsMHg4QiwweEM4LDB4OEIsMHhDMSwweEUzLDB4NDQsMHgzMywweEQyLDB4OEUsMHhDMiwweDhCLDB4RDEsMHg4MywweEJFLAorMHg4OCwweDAwLDB4MDAsMHg3NCwweDA2LDB4RTksMHg4RSwweDAwLDB4MzMsMHhDMCwweEMzLDB4OEIsMHg1RSwweDEwLDB4MDMsMHgxRiwKKzB4NDMsMHg0MywweDUyLDB4RjcsMHg0NiwweDdBLDB4MDEsMHgwMCwweDc1LDB4MkEsMHhBQywweDhELDB4QkUsMHhFNCwweDAwLDB4OEIsCisweDhFLDB4ODYsMHgwMCwweEYyLDB4QUUsMHg3NCwweDM0LDB4ODgsMHgwNywweDQzLDB4NEEsMHg3NSwweEVELDB4NTgsMHg4QiwweDVFLAorMHgxMCwweDAxLDB4MDcsMHgyOSwweDQ2LDB4NzgsMHgwMSwweDQ2LDB4NzYsMHgyOSwweDQ2LDB4NzQsMHg4QiwweEM2LDB4MkIsMHg4NiwKKzB4OEMsMHgwMCwweEMzLDB4OTAsMHhBQywweDhELDB4QkUsMHhFNCwweDAwLDB4OEIsMHg4RSwweDg2LDB4MDAsMHhGMiwweEFFLDB4NzQsCisweDBBLDB4MjQsMHg3RiwweDg4LDB4MDcsMHg0MywweDRBLDB4NzUsMHhFQiwweEVCLDB4RDIsMHg4OCwweDg2LDB4RjQsMHgwMCwweEM3LAorMHg4NiwweDg4LDB4MDAsMHgwMSwweDAwLDB4NTgsMHgyQiwweEMyLDB4NzQsMHgwRSwweDhCLDB4NUUsMHgxMCwweDAxLDB4MDcsMHgyOSwKKzB4NDYsMHg3OCwweDAxLDB4NDYsMHg3NiwweDI5LDB4NDYsMHg3NCwweDQwLDB4RTgsMHg5NCwweEZFLDB4NzIsMHhCRSwweDRBLDB4NzUsCisweDE1LDB4ODMsMHhCRSwweDhBLDB4MDAsMHgwMCwweDc0LDB4QjQsMHhCQSwweDUwLDB4RkYsMHhFRCwweDg5LDB4ODYsMHg4MiwweDAwLAorMHg4MywweDRFLDB4N0EsMHgwOCwweEVCLDB4QTYsMHg4RCwweEJFLDB4RjQsMHgwMCwweDAzLDB4QkUsMHg4OCwweDAwLDB4QTQsMHhGRiwKKzB4ODYsMHg4OCwweDAwLDB4RTgsMHg2QSwweEZFLDB4NzIsMHg5NCwweDc5LDB4MDYsMHg0QSwweDc0LDB4OEYsMHhFOSwweDVCLDB4RkYsCisweDRBLDB4NzQsMHhDRSwweEVCLDB4RTEsMHg5MCwweDUwLDB4RTgsMHgxMSwweENDLDB4OEIsMHg0NiwweDc0LDB4MzksMHg0NiwweDcyLAorMHg3NCwweDI3LDB4MUUsMHg1NiwweDUxLDB4MzMsMHhDOSwweEM1LDB4NzYsMHgwQywweEFELDB4NzQsMHgxMCwweDc4LDB4MDksMHgwMywKKzB4QzgsMHgwNSwweDAxLDB4MDAsMHgyNCwweEZFLDB4MDMsMHhGMCwweDNCLDB4NzYsMHgxMCwweDc2LDB4RUQsMHgyOSwweDRFLDB4NzYsCisweDAxLDB4NEUsMHg3OCwweEU4LDB4MzcsMHhDQywweDU5LDB4NUUsMHgxRiwweDU4LDB4QzMsMHg5MCwweEM0LDB4N0UsMHgxMCwweDI2LAorMHg4QiwweDFELDB4ODMsMHhDMywweDAzLDB4MjYsMHg4OSwweDFELDB4NEIsMHgwMywweEZCLDB4QUIsMHg5MSwweEFBLDB4QjgsMHgwMywKKzB4MDAsMHgyOSwweDQ2LDB4NzgsMHgwMSwweDQ2LDB4NzYsMHgyOSwweDQ2LDB4NzQsMHhDMywweDkwLDB4QzQsMHg3RSwweDEwLDB4MjYsCisweDhCLDB4MUQsMHg0MywweDI2LDB4ODksMHgxRCwweDQzLDB4MDMsMHhGQiwweEFBLDB4RkYsMHg0RSwweDc4LDB4RkYsMHg0NiwweDc2LAorMHhGRiwweDRFLDB4NzQsMHhDMywweEU4LDB4RTUsMHhGRiwweEMzLDB4ODAsMHg4MSwweDg0LDB4ODUsMHg4MiwweDgzLDB4ODYsMHg4NywKKzB4NTAsMHg1MywweDhBLDB4REMsMHg4MywweEUzLDB4MEUsMHhEMSwweEVCLDB4MkUsMHg4QSwweDg3LDB4OTgsMHgzQiwweDA4LDB4ODYsCisweEIwLDB4MDAsMHhGRSwweDg2LDB4QjEsMHgwMCwweEIwLDB4MEEsMHhFOCwweDg3LDB4RDQsMHg1QiwweDU4LDB4QzMsMHg1MCwweDhBLAorMHhDOCwweEI4LDB4RkYsMHgwMCwweEU4LDB4OTUsMHhGRiwweDU4LDB4QzMsMHg5MCwweDhBLDB4ODYsMHhCQiwweDAwLDB4RTgsMHhBQiwKKzB4RkYsMHhDMywweEU4LDB4Q0IsMHhGRiwweEU4LDB4RjIsMHhGRiwweEMzLDB4OTAsMHhFOCwweEMzLDB4RkYsMHhFOCwweEI0LDB4RkYsCisweEMzLDB4OTAsMHgzMywweEMwLDB4RTgsMHg5NSwweEZGLDB4QzMsMHhCOCwweEZGLDB4MDAsMHgzMywweEM5LDB4RTgsMHg2QywweEZGLAorMHhDMywweDkwLDB4QjgsMHhGRiwweDAxLDB4QjEsMHgxMCwweEU4LDB4NjIsMHhGRiwweEMzLDB4OTAsMHhDMywweEZDLDB4M0IsMHhFMiwKKzB4M0IsMHhGMiwweDNCLDB4RjIsMHgzQiwweEZDLDB4M0IsMHhFMiwweDNCLDB4RTgsMHgzQiwweEU4LDB4M0IsMHhGQywweDNCLDB4RTIsCisweDNCLDB4RTgsMHgzQiwweEU4LDB4M0IsMHhGQywweDNCLDB4RTIsMHgzQiwweEUyLDB4M0IsMHhFMiwweDNCLDB4MDAsMHgxMCwweDAwLAorMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwKKzB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsCisweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4NTEsMHg1MywweDhCLAorMHg0RSwweDM4LDB4ODEsMHhFMSwweEZGLDB4RUUsMHhBOCwweDA0LDB4NzQsMHgwNCwweDgxLDB4QzksMHgwMCwweDAxLDB4OEEsMHhFMCwKKzB4ODAsMHhFNCwweDAzLDB4MjQsMHgxOCwweEQwLDB4RTQsMHgwQSwweEM0LDB4MzMsMHhEQiwweDhBLDB4RDgsMHgyRSwweDhCLDB4ODcsCisweEZELDB4M0IsMHg4OSwweDQ2LDB4N0MsMHgyRSwweDBCLDB4OEYsMHgxRCwweDNDLDB4ODksMHg0RSwweDM4LDB4RDEsMHhFQiwweDJFLAorMHg4QSwweEE3LDB4M0QsMHgzQywweDVCLDB4NTksMHhDMywweEFDLDB4NDksMHgzQywweDAxLDB4NzIsMHgxRCwweDc0LDB4MjAsMHgzQywKKzB4MDMsMHg3MiwweDIzLDB4NzQsMHgyOCwweDNDLDB4MDgsMHg3MiwweDJCLDB4NzQsMHgzMCwweDNDLDB4MjAsMHg3MiwweDM3LDB4NzQsCisweDNBLDB4QkIsMHhEQSwweDNCLDB4MzIsMHhFNCwweDg5LDB4NUUsMHg3RSwweEMzLDB4QkIsMHhBMCwweDNCLDB4RUIsMHhGNSwweEJCLAorMHg5NCwweDNCLDB4QjQsMHgwMSwweEVCLDB4RjAsMHhCQiwweEZDLDB4M0IsMHhCNCwweDAyLDB4RUIsMHhFOSwweEJCLDB4RTIsMHgzQiwKKzB4QjQsMHgwMywweEVCLDB4RTIsMHhCQiwweEJFLDB4M0IsMHhCNCwweDA0LDB4RUIsMHhEQiwweEJCLDB4Q0EsMHgzQiwweEFDLDB4NDksCisweDg4LDB4ODYsMHhCQiwweDAwLDB4RUIsMHhDRSwweEJCLDB4RDIsMHgzQiwweEVCLDB4RjMsMHhCQiwweEZDLDB4M0IsMHhFQiwweEM0LAorMHhBOSwweDA0LDB4MDAsMHg3NSwweEQxLDB4QTksMHgwOCwweDAwLDB4NzUsMHhEQSwweEVCLDB4RDEsMHg4QiwweDVFLDB4NzQsMHg4QiwKKzB4NEUsMHg3OCwweDNCLDB4Q0IsMHg3MiwweDAyLDB4OEIsMHhDQiwweDNCLDB4QzgsMHg3MiwweDAyLDB4OEIsMHhDOCwweDhCLDB4QzEsCisweEUzLDB4MkMsMHhDNCwweDdFLDB4MTAsMHg4QiwweERGLDB4MjYsMHgwMywweDNELDB4NDcsMHg0NywweEY3LDB4NDYsMHg3QSwweDAxLAorMHgwMCwweDc1LDB4MUMsMHhGNywweEM3LDB4MDEsMHgwMCwweDc0LDB4MDIsMHg0OSwweEE0LDB4RDEsMHhFOSwweEYzLDB4QTUsMHg3MywKKzB4MDEsMHhBNCwweDI2LDB4MDEsMHgwNywweDI5LDB4NDYsMHg3OCwweDAxLDB4NDYsMHg3NiwweDI5LDB4NDYsMHg3NCwweEMzLDB4NTAsCisweDUzLDB4QkIsMHg3RiwweDdGLDB4RjcsMHhDNywweDAxLDB4MDAsMHg3NCwweDA1LDB4NDksMHhBQywweDIyLDB4QzMsMHhBQSwweEQxLAorMHhFOSwweEUzLDB4MUQsMHg5QywweEFELDB4MjMsMHhDMywweEFCLDB4NDksMHg3NCwweDE0LDB4QUQsMHgyMywweEMzLDB4QUIsMHg0OSwKKzB4NzQsMHgwRCwweEFELDB4MjMsMHhDMywweEFCLDB4NDksMHg3NCwweDA2LDB4QUQsMHgyMywweEMzLDB4QUIsMHhFMiwweEU1LDB4OUQsCisweDczLDB4MDQsMHhBQywweDIyLDB4QzMsMHhBQiwweDVCLDB4NTgsMHhFQiwweEI4LDB4RTgsMHhDRSwweEM5LDB4OEIsMHg1RSwweDM4LAorMHhGNywweEMzLDB4MTAsMHgwNCwweDc1LDB4MDEsMHhDMywweEY3LDB4QzMsMHg0MCwweDAwLDB4NzQsMHgwNSwweEU4LDB4QjgsMHhFMywKKzB4RUIsMHgwMywweEU4LDB4QTgsMHhFMywweDgxLDB4NjYsMHgzOCwweEVGLDB4RkIsMHhGNiwweEMzLDB4MTAsMHg3NCwweDNDLDB4RjYsCisweEMzLDB4MDIsMHg3NCwweDA2LDB4RTQsMHhEOCwweDBDLDB4MDEsMHhFNiwweEQ4LDB4RjYsMHhDMywweDA0LDB4NzQsMHgxMSwweDgzLAorMHhDMiwweDA4LDB4OEEsMHg4NiwweEE3LDB4MDAsMHgwQywweDAxLDB4RUUsMHg4OCwweDg2LDB4QTcsMHgwMCwweDgzLDB4RUEsMHgwOCwKKzB4RjYsMHhDMywweDA4LDB4NzQsMHgwRiwweEU4LDB4OEIsMHhFMywweDcyLDB4MEEsMHg4QSwweDg2LDB4QzAsMHgwMCwweEU2LDB4MzgsCisweEIwLDB4MjMsMHhFNiwweDBBLDB4RjcsMHhDMywweDAwLDB4MDQsMHg3NSwweDAxLDB4QzMsMHhGNywweEMzLDB4MDAsMHgwOCwweDc1LAorMHhGOSwweDhBLDB4ODYsMHhBNSwweDAwLDB4RjYsMHhDMywweDQwLDB4NzUsMHgwRCwweEE4LDB4MTAsMHg3NSwweEVDLDB4MEMsMHgxMCwKKzB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4QzMsMHhBOCwweDAxLDB4NzUsMHhERiwweDgzLDB4QzIsMHgwMiwweDBDLDB4MDUsCisweEVFLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhDMywweEIwLDB4MDAsMHhFOCwweDQ3LDB4RDIsMHhFQiwweDBGLDB4QjAsMHgwMiwweEU4LAorMHg5MCwweDBFLDB4RUIsMHgwOCwweDgzLDB4NjYsMHgzOCwweERGLDB4ODMsMHg0RSwweDdBLDB4MDIsMHgzMywweEMwLDB4OEUsMHhEOCwKKzB4RkEsMHhBMCwweDkyLDB4MTIsMHg0MCwweEEyLDB4OTIsMHgxMiwweDNDLDB4MDUsMHg3MiwweDFFLDB4QzYsMHgwNiwweDkyLDB4MTIsCisweDAwLDB4RkIsMHhCMCwweDAxLDB4RTgsMHg2QiwweDBFLDB4RkEsMHhBMSwweDI2LDB4MDEsMHgyMywweDA2LDB4MkEsMHgwMSwweEE4LAorMHgwMSwweDc1LDB4MDcsMHhFOCwweEUyLDB4MDcsMHhFOCwweDYxLDB4MDksMHg5MCwweEIwLDB4MDAsMHhFOCwweDM3LDB4RDIsMHhGQiwKKzB4ODUsMHhFRCwweDc0LDB4QjksMHhGQSwweEY3LDB4NDYsMHg3QSwweDQ2LDB4MDAsMHg3NSwweEMwLDB4OEIsMHg0NiwweDc4LDB4M0QsCisweDBBLDB4MDAsMHg3MiwweEIwLDB4OEIsMHg0RSwweDc0LDB4ODMsMHhGOSwweDUwLDB4NzIsMHg5QSwweDgzLDB4NjYsMHgzOCwweERGLAorMHhDNSwweDc2LDB4MTQsMHg4QiwweDQ2LDB4M0EsMHg4NSwweEMwLDB4NzUsMHg1OCwweEFELDB4ODUsMHhDMCwweDc1LDB4MEYsMHhFOCwKKzB4RjgsMHhGRSwweEY3LDB4NDYsMHg3QSwweDA4LDB4MDAsMHg3NCwweDkzLDB4RTgsMHhBMCwweEZBLDB4RUIsMHg4RSwweDNCLDB4NzYsCisweDA0LDB4NzYsMHgyMSwweEI5LDB4MDIsMHgwMCwweDM5LDB4NEUsMHgyRSwweDc3LDB4MDUsMHhDNywweDQ2LDB4MkUsMHgwMCwweDAwLAorMHg1NiwweDhCLDB4NzYsMHgyQywweDg5LDB4NzYsMHgwNCwweEM3LDB4MDQsMHgwMCwweDAwLDB4NDYsMHg0NiwweDg5LDB4NzYsMHgyQywKKzB4MjksMHg0RSwweDJFLDB4NUUsMHg4NSwweEMwLDB4NzksMHgxNywweEY2LDB4QzQsMHgxMCwweDc0LDB4MDUsMHhGRiwweDU2LDB4N0MsCisweEVCLDB4MDMsMHhGRiwweDU2LDB4N0UsMHg4OSwweDc2LDB4MTQsMHhCMCwweDBDLDB4RTgsMHg4NSwweEQxLDB4RUIsMHg4NiwweDg5LAorMHg0NiwweDNBLDB4RkYsMHg5NiwweDgwLDB4MDAsMHgyOSwweDQ2LDB4M0EsMHg4OSwweDc2LDB4MTQsMHhCMCwweDBDLDB4RTgsMHg3MSwKKzB4RDEsMHhFOSwweDcxLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwNCwweDEwLDB4MDIsCisweDAxLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsCisweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweEMwLDB4QzAsMHhDMCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHgwMCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLAorMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwKKzB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsMHg4MCwweDgwLDB4ODAsCisweDgwLDB4ODAsMHg4MCwweDgwLDB4NEUsMHg0MSwweDc4LDB4NDEsMHhEMCwweDQxLDB4RjQsMHg0MSwweDA2LDB4NDIsMHgxOCwweDQyLAorMHhDMywweDkwLDB4OEUsMHg0NiwweDAyLDB4OEIsMHg3RSwweDIyLDB4ODksMHg3RSwweDZDLDB4ODAsMHg2NiwweDI3LDB4RkQsMHg4QiwKKzB4NTYsMHgyNCwweDgzLDB4RkEsMHgwNCwweDcyLDB4RTksMHg4MywweEVBLDB4MDIsMHg4QiwweEQ5LDB4M0IsMHhDQSwweDc2LDB4MDIsCisweDhCLDB4Q0EsMHhCMCwweDBBLDB4NTcsMHg1MSwweDhCLDB4RkUsMHhGMiwweEFFLDB4OEIsMHhDMSwweDU5LDB4NUYsMHg3NSwweDFFLAorMHg1MCwweDQwLDB4MkIsMHhDOCwweDc0LDB4MDYsMHgyQiwweEQxLDB4MkIsMHhEOSwweEYzLDB4QTQsMHg1OSwweDRCLDB4NEEsMHg0QSwKKzB4QjAsMHgwRCwweEFBLDB4QTQsMHgzQiwweENBLDB4NzYsMHgwMiwweDhCLDB4Q0EsMHhFMywweDEzLDB4RUIsMHhENCwweDJCLDB4RDksCisweEY3LDB4QzYsMHgwMSwweDAwLDB4NzQsMHgwMiwweEE0LDB4NDksMHhEMSwweEU5LDB4RjMsMHhBNSwweDczLDB4MDEsMHhBNCwweDg5LAorMHg3RSwweDIyLDB4MkIsMHg3RSwweDZDLDB4MjksMHg3RSwweDI0LDB4MDEsMHg3RSwweDFBLDB4OEIsMHhDQiwweDgwLDB4N0UsMHgyNiwKKzB4MDIsMHg3NCwweDA1LDB4ODAsMHg2NiwweDI2LDB4RkQsMHhDMywweDYwLDB4QjAsMHhGRCwweEU4LDB4MTgsMHgwMywweDYxLDB4QzMsCisweEMzLDB4OTAsMHhFOCwweDdDLDB4MDIsMHg3MiwweEY5LDB4OTAsMHg4MywweDRFLDB4MjYsMHgyMCwweDhCLDB4NDYsMHg2QSwweDg5LAorMHg0NiwweDZFLDB4OEIsMHg0NiwweDQ4LDB4MEQsMHgwNCwweDAwLDB4MjUsMHhCRiwweEZGLDB4ODksMHg0NiwweDQ4LDB4QjAsMHgwNiwKKzB4RTgsMHhCRiwweENGLDB4QzMsMHg4OSwweDdFLDB4MjIsMHgyQiwweDdFLDB4NkMsMHgwMSwweDdFLDB4MUEsMHgyOSwweDdFLDB4MjQsCisweDgwLDB4N0UsMHgyNiwweDAyLDB4NzQsMHgwNSwweDgzLDB4NjYsMHgyNiwweEZELDB4QzMsMHg2MCwweEIwLDB4RkQsMHhFOCwweEQ1LAorMHgwMiwweDYxLDB4QzMsMHg5MCwweDhBLDB4QkUsMHhDMiwweDAwLDB4RUIsMHgyNCwweEY3LDB4NDYsMHg0OCwweDQwLDB4MDAsMHg3NSwKKzB4QjEsMHg4RSwweDQ2LDB4MDIsMHg4QiwweDdFLDB4MjIsMHg4OSwweDdFLDB4NkMsMHg4QiwweDU2LDB4MjQsMHg4MywweEVBLDB4MEEsCisweDc4LDB4OUUsMHgwMywweEQ3LDB4ODAsMHg2NiwweDI3LDB4RkQsMHgzMywweEMwLDB4OEEsMHhCRSwweEMyLDB4MDAsMHhFMywweEI0LAorMHgzQiwweEZBLDB4NzcsMHhCMCwweEFDLDB4NDksMHg5MywweDJFLDB4OEEsMHg4NywweEQ0LDB4M0UsMHg5MywweDIyLDB4REYsMHg3NSwKKzB4MTcsMHhBQSwweEUzLDB4QTAsMHgzQiwweEZBLDB4NzcsMHg5QywweEFDLDB4NDksMHg5MywweDJFLDB4OEEsMHg4NywweEQ0LDB4M0UsCisweDkzLDB4MjIsMHhERiwweDc1LDB4MDMsMHhBQSwweEVCLDB4RDYsMHhGNiwweEMzLDB4N0YsMHg3NSwweDA1LDB4RkYsMHg0NiwweDY2LAorMHhFQiwweERGLDB4RjYsMHhDMywweDQwLDB4NzUsMHgwQywweDhCLDB4RDgsMHg4MywweEVCLDB4MDgsMHhEMSwweEUzLDB4MkUsMHhGRiwKKzB4QTcsMHhENCwweDNGLDB4RkYsMHg0NiwweDY2LDB4MkMsMHgyMCwweEVCLDB4QzcsMHg4NSwweEMwLDB4NzQsMHgyQywweDg5LDB4NDYsCisweDZBLDB4ODMsMHg0RSwweDQ4LDB4NDAsMHg4OSwweDdFLDB4MjIsMHgyQiwweDdFLDB4NkMsMHgwMSwweDdFLDB4MUEsMHgyOSwweDdFLAorMHgyNCwweDgwLDB4N0UsMHgyNiwweDAyLDB4NzQsMHgwOCwweDgzLDB4NjYsMHgyNiwweEZELDB4RTgsMHhBMywweDAxLDB4QzMsMHg2MCwKKzB4QjAsMHhGRCwweEU4LDB4MzEsMHgwMiwweDYxLDB4RTgsMHg5OCwweDAxLDB4QzMsMHhFOSwweDU3LDB4RkYsMHg5MCwweDhCLDB4NUUsCisweDY2LDB4NEIsMHg3OCwweDAzLDB4ODksMHg1RSwweDY2LDB4QUEsMHg4QiwweDVFLDB4NjQsMHhGNywweEMzLDB4MDAsMHgyMCwweDc1LAorMHgwMywweEU5LDB4NDAsMHhGRiwweEY3LDB4QzMsMHg0MCwweDAwLDB4NzQsMHgwOCwweDhBLDB4ODYsMHhDMSwweDAwLDB4QUEsMHhFOSwKKzB4MzIsMHhGRiwweEI4LDB4MzIsMHgwMCwweEVCLDB4QTMsMHg5MCwweDhCLDB4NUUsMHg2NiwweDg5LDB4NUUsMHg2OCwweDgzLDB4QzMsCisweDA4LDB4ODAsMHhFMywweEY4LDB4ODksMHg1RSwweDY2LDB4OEIsMHg1RSwweDY0LDB4ODEsMHhFMywweDAwLDB4MTgsMHg4MSwweEZCLAorMHgwMCwweDE4LDB4NzQsMHgyRCwweEFBLDB4ODUsMHhEQiwweDc0LDB4MjUsMHhGNywweDQ2LDB4NjQsMHg0MCwweDAwLDB4NzUsMHgxOCwKKzB4ODEsMHhGQiwweDAwLDB4MTAsMHg3NCwweDBDLDB4OEIsMHg0NiwweDY2LDB4MkIsMHg0NiwweDY4LDB4QzEsMHhFMCwweDA0LDB4RTksCisweDY4LDB4RkYsMHhCOCwweDY0LDB4MDAsMHhFOSwweDYyLDB4RkYsMHg4QSwweDg2LDB4QzEsMHgwMCwweEFBLDB4QUEsMHhFOSwweEUzLAorMHhGRSwweDUxLDB4OEIsMHg0RSwweDY2LDB4MkIsMHg0RSwweDY4LDB4QjAsMHgyMCwweEYzLDB4QUEsMHg1OSwweEU5LDB4RDQsMHhGRSwKKzB4OEIsMHg1RSwweDY2LDB4ODksMHg1RSwweDY4LDB4OEIsMHg1RSwweDY0LDB4RjcsMHhDMywweDI0LDB4MDAsMHg3NCwweDEwLDB4QzcsCisweDQ2LDB4NjYsMHgwMCwweDAwLDB4RjcsMHhDMywweDA0LDB4MDAsMHg3NCwweDA1LDB4QjAsMHgwRCwweEFBLDB4QjAsMHgwQSwweEFBLAorMHhFQiwweDQ4LDB4OTAsMHg5MCwweEFBLDB4RjcsMHg0NiwweDY0LDB4MDAsMHg0MCwweDc0LDB4MDYsMHhCOCwweEQwLDB4MDcsMHhFOSwKKzB4MTgsMHhGRiwweEU5LDB4OUYsMHhGRSwweDkwLDB4QUEsMHhGNywweDQ2LDB4NjQsMHgwMCwweDgwLDB4NzQsMHgwNiwweEI4LDB4RDAsCisweDA3LDB4RTksMHgwNiwweEZGLDB4RTksMHg4RCwweEZFLDB4OTAsMHg4QiwweDVFLDB4NjYsMHg4OSwweDVFLDB4NjgsMHg4NSwweERCLAorMHg3NSwweDBDLDB4OEIsMHg1RSwweDY0LDB4RjcsMHhDMywweDEwLDB4MDAsMHg3NCwweDA2LDB4RTksMHg3NiwweEZFLDB4OEIsMHg1RSwKKzB4NjQsMHhGNywweEMzLDB4MDgsMHgwMCwweDc0LDB4MjcsMHhCMCwweDBBLDB4QUEsMHhGNywweEMzLDB4MjAsMHgwMCwweDc1LDB4MUYsCisweEY3LDB4QzMsMHgwMCwweDAxLDB4NzUsMHgwMywweEU5LDB4NUIsMHhGRSwweEY3LDB4QzMsMHg0MCwweDAwLDB4NzUsMHgwNiwweEI4LAorMHg2NCwweDAwLDB4RTksMHhDNSwweEZFLDB4OEEsMHg4NiwweEMxLDB4MDAsMHhBQSwweEFBLDB4RTksMHg0NiwweEZFLDB4QUEsMHhDNywKKzB4NDYsMHg2NiwweDAwLDB4MDAsMHhGNywweEMzLDB4MDAsMHgwNiwweDc0LDB4RjEsMHhGNywweEMzLDB4NDAsMHgwMCwweDc0LDB4MTksCisweDhBLDB4ODYsMHhDMSwweDAwLDB4ODEsMHhFMywweDAwLDB4MDYsMHg4MSwweEZCLDB4MDAsMHgwNCwweDcyLDB4MDYsMHg3NiwweDAyLAorMHhBQSwweEFBLDB4QUEsMHhBQSwweEFBLDB4QUEsMHhFOSwweDFCLDB4RkUsMHg4MSwweEUzLDB4MDAsMHgwNiwweDgxLDB4RkIsMHgwMCwKKzB4MDQsMHg3MiwweDBFLDB4NzYsMHgwNiwweEI4LDB4OTYsMHgwMCwweEU5LDB4N0YsMHhGRSwweEI4LDB4NjQsMHgwMCwweEU5LDB4NzksCisweEZFLDB4OEIsMHg0NiwweDY4LDB4RTksMHg3MywweEZFLDB4OTAsMHgzNiwweDhCLDB4MEUsMHhEQSwweDEyLDB4ODMsMHhGOSwweDMyLAorMHg3MywweDFELDB4MUUsMHgwNiwweDMzLDB4QzAsMHg4RSwweEQ4LDB4OEUsMHhDMCwweDhELDB4NzYsMHg0QywweEJGLDB4REMsMHgxMiwKKzB4MDMsMHhGOSwweEE1LDB4QTUsMHhBNSwweDgzLDB4QzEsMHgwNiwweDg5LDB4MEUsMHhEQSwweDEyLDB4MDcsMHgxRiwweEMzLDB4QjAsCisweDA4LDB4RTgsMHg2RSwweENELDB4QzMsMHg5MCwweDgzLDB4NjYsMHg0OCwweEZFLDB4RTgsMHg5MywweEM0LDB4RTgsMHhDOCwweEZGLAorMHhDMywweEY2LDB4NDYsMHgyNywweDAyLDB4NzUsMHgwRiwweDlDLDB4RkEsMHg4MywweDdFLDB4MUEsMHgwMCwweDc0LDB4MDksMHg4MCwKKzB4NEUsMHgyNywweDAxLDB4OUQsMHhGOSwweEMzLDB4RjgsMHhDMywweDUwLDB4NTIsMHhGNywweDQ2LDB4MzgsMHg0MCwweDAwLDB4NzQsCisweDFELDB4RTgsMHgzNCwweERFLDB4ODMsMHhDMiwweDBBLDB4RUMsMHhBOCwweDQwLDB4NzUsMHgyNywweDgzLDB4RUEsMHgwOCwweDhBLAorMHg4NiwweEE1LDB4MDAsMHgwQywweDAyLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFRSwweDVBLDB4NTgsMHhFQiwweEQxLDB4RTgsMHgwQywKKzB4REUsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkIsMHgwQywweDAyLDB4ODgsMHg4NiwweEE1LDB4MDAsMHhFNiwweDBDLDB4NUEsCisweDU4LDB4RUIsMHhCQywweDgwLDB4NEUsMHgyNywweDAyLDB4NUEsMHg1OCwweDlELDB4RjgsMHhDMywweDA4LDB4NDYsMHgyNiwweDlDLAorMHhGQSwweDhBLDB4OEUsMHhBNSwweDAwLDB4RjcsMHg0NiwweDM4LDB4NDAsMHgwMCwweDc1LDB4MTQsMHhGNiwweEMxLDB4MDYsMHg3NCwKKzB4MjMsMHhFOCwweEQ5LDB4REQsMHg4QSwweEMxLDB4MjQsMHhGOSwweDg4LDB4ODYsMHhBNSwweDAwLDB4RTYsMHgwQywweDlELDB4QzMsCisweEY2LDB4QzEsMHgwMiwweDc0LDB4MEYsMHhFOCwweEQwLDB4REQsMHg4MywweEMyLDB4MDIsMHg4QSwweEMxLDB4MjQsMHhGRCwweDg4LAorMHg4NiwweEE1LDB4MDAsMHhFRSwweDlELDB4QzMsMHg4QiwweDVFLDB4MjYsMHgyMiwweEMzLDB4ODgsMHg0NiwweDI2LDB4NzQsMHgwMSwKKzB4QzMsMHg4MCwweDY2LDB4MjcsMHhGRCwweDlDLDB4RkEsMHg4QSwweDhFLDB4QTUsMHgwMCwweEY3LDB4NDYsMHgzOCwweDQwLDB4MDAsCisweDc1LDB4MTYsMHhGNiwweEMxLDB4MDQsMHg3NSwweDBGLDB4RTgsMHg5MywweERELDB4OEEsMHhDMSwweDI0LDB4RkQsMHgwQywweDA0LAorMHg4OCwweDg2LDB4QTUsMHgwMCwweEU2LDB4MEMsMHg5RCwweEMzLDB4RjYsMHhDMSwweDAyLDB4NzUsMHhGOSwweEU4LDB4ODgsMHhERCwKKzB4ODMsMHhDMiwweDBBLDB4RUMsMHhBOCwweDIwLDB4NzUsMHgwRSwweDgzLDB4RUEsMHgwOCwweDhBLDB4QzEsMHgwQywweDAyLDB4ODgsCisweDg2LDB4QTUsMHgwMCwweEVFLDB4OUQsMHhDMywweDgzLDB4RUEsMHgwQSwweDMzLDB4QzksMHg4QSwweDRFLDB4MUMsMHg4QiwweDQ2LAorMHgxQSwweDNCLDB4QzgsMHg3MywweDFCLDB4MDEsMHg0RSwweDJBLDB4MkIsMHhDMSwweDg5LDB4NDYsMHgxQSwweDFFLDB4QzUsMHg3NiwKKzB4MDAsMHhGMywweDZFLDB4MUYsMHg4OSwweDc2LDB4MDAsMHg4MywweEMyLDB4MDIsMHg4QSwweDg2LDB4QTUsMHgwMCwweEVCLDB4Q0QsCisweDg1LDB4QzAsMHg3NCwweDEyLDB4MDEsMHg0NiwweDJBLDB4OEIsMHhDOCwweDFFLDB4QzUsMHg3NiwweDAwLDB4RjMsMHg2RSwweDFGLAorMHg4OSwweDc2LDB4MDAsMHg4OSwweDRFLDB4MUEsMHhGNiwweEM3LDB4MDEsMHg3NSwweDIzLDB4ODAsMHhDQiwweDAyLDB4ODksMHg1RSwKKzB4MjYsMHhFOCwweDA4LDB4QzMsMHg4MywweEMyLDB4MDIsMHg4QSwweDg2LDB4QTUsMHgwMCwweDI0LDB4RkQsMHhFRSwweDg4LDB4ODYsCisweEE1LDB4MDAsMHhGNiwweEM3LDB4MTAsMHg3NSwweDA1LDB4QjAsMHgwMiwweEU4LDB4MTYsMHhDQywweDlELDB4QzMsMHg4MywweEMyLAorMHgwMiwweDhBLDB4ODYsMHhBNSwweDAwLDB4RUIsMHg4NiwweDkwLDB4OEIsMHhEMSwweDhCLDB4NDYsMHgyNCwweDNCLDB4QzgsMHg3NiwKKzB4MDIsMHg4QiwweEM4LDB4MkIsMHhEMSwweDJCLDB4QzEsMHg4QiwweEQ5LDB4RTMsMHgyMiwweDgwLDB4NjYsMHgyNywweEZELDB4OEUsCisweDQ2LDB4MDIsMHg4QiwweDdFLDB4MjIsMHhGNywweEM2LDB4MDEsMHgwMCwweDc0LDB4MDIsMHhBNCwweDQ5LDB4RDEsMHhFOSwweEYzLAorMHhBNSwweDczLDB4MDEsMHhBNCwweDg5LDB4N0UsMHgyMiwweDg5LDB4NDYsMHgyNCwweDAxLDB4NUUsMHgxQSwweDhCLDB4Q0EsMHg4MCwKKzB4N0UsMHgyNiwweDAyLDB4NzQsMHgwNSwweDgwLDB4NjYsMHgyNiwweEZELDB4QzMsMHg2MCwweEIwLDB4RkQsMHhFOCwweEY2LDB4RkUsCisweDYxLDB4QzMsMHg1MCwweEU0LDB4MEEsMHg4NCwweEMwLDB4NzUsMHgwQSwweDg2LDB4ODYsMHhBMSwweDAwLDB4ODQsMHhDMCwweDc0LAorMHgwQSwweEU2LDB4MEEsMHg1OCwweDBDLDB4MjAsMHg4OSwweDQ2LDB4NDgsMHhGOSwweEMzLDB4NTgsMHgyNCwweERGLDB4ODksMHg0NiwKKzB4NDgsMHhGOCwweEMzLDB4OTAsMHhGQiwweEIwLDB4MDIsMHhFOCwweEU4LDB4MDcsMHhGQSwweEU4LDB4MkUsMHgwMSwweEZCLDB4QjAsCisweDAxLDB4RTgsMHhERSwweDA3LDB4RkEsMHhCMCwweDAyLDB4RTgsMHhCQywweENCLDB4RkIsMHg4NSwweEVELDB4NzQsMHhFNSwweEZBLAorMHg4RSwweDVFLDB4MEEsMHhGQiwweDkwLDB4RkEsMHg4QiwweDQ2LDB4NDgsMHg4QiwweDc2LDB4NDAsMHhBOCwweDhDLDB4NzUsMHhERSwKKzB4QTgsMHgyMCwweDc0LDB4MUEsMHg1MCwweEU4LDB4NTUsMHhEQywweDU4LDB4RTgsMHhBNiwweEZGLDB4NzMsMHgxMCwweEIwLDB4MDIsCisweEU4LDB4NUYsMHhDQiwweEVCLDB4QzksMHg5MCwweDI1LDB4RkYsMHgwMCwweDhCLDB4QzgsMHhFQiwweDM2LDB4OTAsMHhBOCwweDAxLAorMHg3NSwweDIyLDB4NDYsMHg4MywweEU2LDB4RkUsMHgzQiwweDc2LDB4MDgsMHg3NCwweDc5LDB4QUQsMHg4QSwweEZDLDB4QjMsMHhGMCwKKzB4MjIsMHhGQiwweDNBLDB4RkIsMHg3NCwweEUwLDB4M0EsMHhCRSwweEEwLDB4MDAsMHg3NCwweDJFLDB4RTgsMHhEMiwweEZELDB4NzMsCisweDc3LDB4RUIsMHg5QiwweDkwLDB4OEEsMHhFMCwweDI0LDB4RkMsMHg4OCwweDQ2LDB4NDgsMHg4QiwweDRFLDB4NEEsMHhGNiwweEM0LAorMHgwMiwweDc0LDB4MUQsMHhFOCwweEJCLDB4RkQsMHg3MiwweDg2LDB4RTgsMHgxMywweEYzLDB4ODksMHg3NiwweDQwLDB4RTMsMHg5MywKKzB4ODMsMHg0RSwweDQ4LDB4MDMsMHg4OSwweDRFLDB4NEEsMHhFOSwweDc0LDB4RkYsMHgyNSwweEZGLDB4MEYsMHg4QiwweEM4LDB4OTAsCisweDhCLDB4ODYsMHg5OCwweDAwLDB4ODUsMHhDMCwweDc0LDB4MUEsMHg1MSwweDhBLDB4OEUsMHhBMCwweDAwLDB4QzAsMHhFOSwweDA0LAorMHhCQSwweDAxLDB4MDAsMHhEMywweEUyLDB4NTksMHgyMywweEMyLDB4NzQsMHgwOCwweDAzLDB4RjEsMHg4OSwweDc2LDB4NDAsMHhFOSwKKzB4NjEsMHhGRiwweEZGLDB4NTYsMHg2MiwweEUzLDB4RjUsMHg4MywweDRFLDB4NDgsMHgwMSwweDg5LDB4NEUsMHg0QSwweDg5LDB4NzYsCisweDQwLDB4RTksMHgzQSwweEZGLDB4ODEsMHg0RSwweDI2LDB4MDAsMHgxMCwweDhCLDB4NDYsMHg1MCwweDNCLDB4NDYsMHg0NiwweDc3LAorMHgwMywweEU4LDB4NTIsMHhGRCwweEU5LDB4MjcsMHhGRiwweDkwLDB4ODgsMHhCRSwweEEwLDB4MDAsMHhFQiwweEFDLDB4MEEsMHgwNiwKKzB4OTAsMHgxMiwweDhBLDB4RTAsMHhCQSwweDA2LDB4MDEsMHhCMCwweDA0LDB4RUUsMHhFQywweDg0LDB4QzAsMHg3NSwweDEyLDB4QjAsCisweDA0LDB4RUUsMHg4QSwweEM0LDB4RUUsMHgzMiwweEU0LDB4QTgsMHg4MCwweDc0LDB4MDYsMHhDNywweDA2LDB4ODQsMHgxMiwweDAwLAorMHgwMCwweDg4LDB4MjYsMHg5MCwweDEyLDB4QzMsMHgwQSwweDA2LDB4OTAsMHgxMiwweDhBLDB4RTAsMHhCQSwweDA2LDB4MDEsMHhFQywKKzB4QTgsMHgwMSwweDc1LDB4RUQsMHhCQSwweDA4LDB4MDEsMHg4QSwweEM0LDB4RUUsMHgzMiwweEU0LDB4QTgsMHg4MCwweDc0LDB4RTEsCisweEM3LDB4MDYsMHg4NCwweDEyLDB4MDAsMHgwMCwweDg4LDB4MjYsMHg5MCwweDEyLDB4QzMsMHg5MCwweDM2LDB4RjcsMHgwNiwweDI0LAorMHgwMSwweDAxLDB4MDAsMHg3NSwweDMwLDB4MzYsMHg4QiwweDBFLDB4REEsMHgxMiwweDgwLDB4RjksMHgzNiwweDczLDB4MjYsMHgzMywKKzB4QzAsMHg4RSwweEMwLDB4OEUsMHhEOCwweEJGLDB4REMsMHgxMiwweDAzLDB4RjksMHhCMCwweDA4LDB4RTgsMHg3NywweENBLDB4ODUsCisweEVELDB4NzQsMHgwRSwweDhELDB4NzYsMHg0QywweEE1LDB4QTUsMHhBNSwweDgwLDB4QzEsMHgwNiwweDgwLDB4RjksMHgzNiwweDcyLAorMHhFOSwweDg5LDB4MEUsMHhEQSwweDEyLDB4QzMsMHhDMywweDkwLDB4RjcsMHgwNiwweDI2LDB4MDEsMHgwMSwweDAwLDB4NzUsMHhGNiwKKzB4OEIsMHgwRSwweDIwLDB4MTMsMHg4NSwweEM5LDB4NzUsMHhFRSwweDMzLDB4QzAsMHg4RSwweEMwLDB4OEUsMHhEOCwweEJGLDB4MjQsCisweDEzLDB4QjksMHgzNiwweDAwLDB4QjAsMHgwQSwweEU4LDB4M0QsMHhDQSwweDg1LDB4RUQsMHg3NSwweDA2LDB4RTksMHgxMiwweDAxLAorMHhFOSwweDBBLDB4MDEsMHgzMywweERCLDB4OEEsMHg0NiwweDRDLDB4OEEsMHhBNiwweEIzLDB4MDAsMHhGRSwweENDLDB4NzgsMHgwRSwKKzB4ODgsMHhBNiwweEIzLDB4MDAsMHgwQSwweERDLDB4QjQsMHgwQSwweEFCLDB4ODMsMHhFOSwweDAyLDB4NzYsMHhFMiwweDhBLDB4QTYsCisweEIyLDB4MDAsMHhGRSwweENDLDB4NzgsMHgwRSwweDg4LDB4QTYsMHhCMiwweDAwLDB4MEEsMHhEQywweEI0LDB4MDgsMHhBQiwweDgzLAorMHhFOSwweDAyLDB4NzYsMHhDQywweDhBLDB4QTYsMHhCMSwweDAwLDB4RkUsMHhDQywweDc4LDB4MTgsMHg4QSwweEJFLDB4QjAsMHgwMCwKKzB4NzUsMHgwNCwweDg4LDB4QTYsMHhCMCwweDAwLDB4ODgsMHhBNiwweEIxLDB4MDAsMHgwQSwweERDLDB4OEEsMHhFNywweEFCLDB4ODMsCisweEU5LDB4MDIsMHg3NiwweEFDLDB4OEEsMHhBNiwweEI0LDB4MDAsMHhGRSwweENDLDB4NzgsMHgxRiwweDg4LDB4QTYsMHhCNCwweDAwLAorMHgwQSwweERDLDB4QjQsMHgwQiwweEFCLDB4OEEsMHg4NiwweEJDLDB4MDAsMHg4QSwweEE2LDB4QkQsMHgwMCwweEFCLDB4OEIsMHg4NiwKKzB4QkUsMHgwMCwweEFCLDB4ODMsMHhFOSwweDA2LDB4NzYsMHg4OCwweDhBLDB4NDYsMHg0QywweDhBLDB4QTYsMHhCNiwweDAwLDB4RkUsCisweENDLDB4NzgsMHgxOSwweDg4LDB4QTYsMHhCNiwweDAwLDB4MEEsMHhEQywweEI0LDB4MEMsMHhBQiwweEU4LDB4REIsMHhDQiwweEFCLAorMHg4QiwweDQ2LDB4MkEsMHhBQiwweDgzLDB4RTksMHgwNiwweDc2LDB4NzQsMHg4QSwweDQ2LDB4NEMsMHg4QSwweEE2LDB4QjcsMHgwMCwKKzB4RkUsMHhDQywweDc4LDB4MTksMHg4OCwweEE2LDB4QjcsMHgwMCwweDBBLDB4REMsMHhCNCwweDBELDB4QUIsMHhFOCwweEJBLDB4Q0IsCisweEFCLDB4OEIsMHg0NiwweDM0LDB4QUIsMHg4MywweEU5LDB4MDYsMHg3NiwweDUzLDB4OEEsMHg0NiwweDRDLDB4OEEsMHhBNiwweEI4LAorMHgwMCwweEZFLDB4Q0MsMHg3OCwweDE5LDB4ODgsMHhBNiwweEI4LDB4MDAsMHgwQSwweERDLDB4QjQsMHgwRSwweEFCLDB4QTEsMHg1MCwKKzB4MTIsMHhBQiwweEExLDB4NTIsMHgxMiwweEFCLDB4ODMsMHhFOSwweDA2LDB4NzYsMHgzMiwweDhBLDB4NDYsMHg0QywweDhBLDB4QTYsCisweEI1LDB4MDAsMHhGRSwweENDLDB4NzgsMHgxOCwweDg4LDB4QTYsMHhCNSwweDAwLDB4MEEsMHhEQywweEI0LDB4MEYsMHhBQiwweDhCLAorMHg4NiwweDlBLDB4MDAsMHhBQiwweDhCLDB4ODYsMHg5QywweDAwLDB4QUIsMHg4MywweEU5LDB4MDYsMHg3NiwweDBGLDB4ODQsMHhEQiwKKzB4NzUsMHgwMywweEU5LDB4RUYsMHhGRSwweEIwLDB4MEEsMHhFOCwweEY4LDB4QzgsMHhFOSwweEU3LDB4RkUsMHhCMCwweDBBLDB4RTgsCisweEYwLDB4QzgsMHhGNywweEQ5LDB4ODMsMHhDMSwweDM2LDB4OEIsMHhDMSwweDBELDB4ODAsMHgwMCwweDg2LDB4QzQsMHhBMywweDIyLAorMHgxMywweDQxLDB4NDEsMHg4OSwweDBFLDB4MjAsMHgxMywweEMzLDB4QTEsMHg4NCwweDEyLDB4MkIsMHhDMSwweDcyLDB4MTEsMHhBMywKKzB4ODQsMHgxMiwweEJFLDB4MjIsMHgxMywweEQxLDB4RTksMHhGMywweDZGLDB4OTAsMHg4OSwweDBFLDB4MjAsMHgxMywweEY4LDB4QzMsCisweEY5LDB4QzMsMHhDMywweDgxLDB4RUYsMHg2QSwweDEzLDB4NzQsMHhGOSwweDhCLDB4QzcsMHgwRCwweDgwLDB4MDAsMHg4NiwweEM0LAorMHhBMywweDY4LDB4MTMsMHg0NywweDQ3LDB4ODksMHgzRSwweDY2LDB4MTMsMHhDMywweEY3LDB4MDYsMHgyQSwweDAxLDB4MDEsMHgwMCwKKzB4NzUsMHhFMCwweDhCLDB4MEUsMHg2NiwweDEzLDB4RTMsMHgwNywweDgwLDB4RjksMHgyMCwweDc3LDB4RDUsMHg0OSwweDQ5LDB4MzMsCisweEMwLDB4OEUsMHhDMCwweDhFLDB4RDgsMHhCRiwweDZBLDB4MTMsMHg4QiwweEY3LDB4MDMsMHhGOSwweDgzLDB4QzYsMHgzNCwweDNCLAorMHhGRSwweDc3LDB4QzAsMHhCMCwweDBFLDB4RTgsMHhBRSwweEM4LDB4ODUsMHhFRCwweDc0LDB4QjcsMHg4QSwweDQ2LDB4NEMsMHg4QSwKKzB4QjYsMHhCOSwweDAwLDB4RkUsMHhDRSwweDc4LDB4MTUsMHg4OCwweEI2LDB4QjksMHgwMCwweDhBLDB4QTYsMHhBOSwweDAwLDB4ODAsCisweENDLDB4QzAsMHhBQiwweDg0LDB4RjYsMHg3NCwweDA1LDB4QjAsMHgwRSwweEU4LDB4NTYsMHhDOCwweDhBLDB4QjYsMHhCQSwweDAwLAorMHhGRSwweENFLDB4NzgsMHhDQiwweDhBLDB4OUUsMHhBOSwweDAwLDB4OEEsMHhCRSwweEFCLDB4MDAsMHg4QSwweDU2LDB4M0YsMHg4QSwKKzB4RjMsMHgzMiwweEY3LDB4MEEsMHhCNiwweEFDLDB4MDAsMHhDNiwweDg2LDB4QUMsMHgwMCwweDAwLDB4MjIsMHhGMiwweDc0LDB4NEIsCisweEY2LDB4QzYsMHgwOCwweDc0LDB4MEYsMHhCNCwweDAyLDB4RjYsMHhDMywweDA4LDB4NzUsMHgwMiwweEI0LDB4MDMsMHhBQiwweDgwLAorMHhFNiwweEY3LDB4NzQsMHgzNywweEY2LDB4QzYsMHgwMSwweDc0LDB4MEYsMHhCNCwweDAwLDB4RjYsMHhDMywweDAxLDB4NzUsMHgwMiwKKzB4QjQsMHgwMSwweEFCLDB4ODAsMHhFNiwweEZFLDB4NzQsMHgyMywweEY2LDB4QzYsMHgwMiwweDc0LDB4MEYsMHhCNCwweDA0LDB4RjYsCisweEMzLDB4MDIsMHg3NSwweDAyLDB4QjQsMHgwNSwweEFCLDB4ODAsMHhFNiwweEZELDB4NzQsMHgwRiwweEY2LDB4QzYsMHgwNCwweDc0LAorMHgwQSwweEI0LDB4MDYsMHhGNiwweEMzLDB4MDQsMHg3NSwweDAyLDB4QjQsMHgwNywweEFCLDB4QzYsMHg4NiwweEJBLDB4MDAsMHgwMCwKKzB4ODgsMHg5RSwweEFCLDB4MDAsMHhFOSwweDU4LDB4RkYsMHg5MCwweEExLDB4ODQsMHgxMiwweDJCLDB4QzEsMHg3MiwweDExLDB4QTMsCisweDg0LDB4MTIsMHhCRSwweDY4LDB4MTMsMHhEMSwweEU5LDB4RjMsMHg2RiwweDkwLDB4ODksMHgwRSwweDY2LDB4MTMsMHhGOCwweEMzLAorMHhGOSwweEMzLDB4QTEsMHg4NCwweDEyLDB4NDEsMHg0MSwweDJCLDB4QzEsMHg3MiwweDIzLDB4QTMsMHg4NCwweDEyLDB4OEIsMHhDMSwKKzB4NDgsMHg0OCwweDMyLDB4RTQsMHgwQywweDgwLDB4ODYsMHhDNCwweEVGLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweEJFLDB4REMsCisweDEyLDB4NDksMHg0OSwweEQxLDB4RTksMHhGMywweDZGLDB4OTAsMHg4OSwweDBFLDB4REEsMHgxMiwweEY4LDB4QzMsMHhGOSwweEMzLAorMHg4QSwweEM4LDB4OEEsMHg0NiwweDRDLDB4QjQsMHgwMSwweDgzLDB4RUIsMHgwNiwweEVGLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwKKzB4QjgsMHgwMSwweDAwLDB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OEEsMHhDMSwweEVGLDB4OTAsMHg5MCwweDkwLDB4OTAsCisweDkwLDB4RTksMHg5NywweDAwLDB4RTksMHhBQywweDAwLDB4MzMsMHhDMCwweDhFLDB4RDgsMHg4OSwweDFFLDB4ODQsMHgxMiwweEMzLAorMHgzNiwweDhCLDB4MUUsMHg4NCwweDEyLDB4RkIsMHg5MCwweEZBLDB4QjAsMHgwQywweEU4LDB4ODksMHhDNywweDg1LDB4RUQsMHg3NCwKKzB4RTYsMHhDNSwweDc2LDB4MEMsMHg4MywweEZCLDB4MTQsMHg3MiwweERCLDB4RkIsMHg5MCwweEZBLDB4QUQsMHg4NSwweEMwLDB4NzgsCisweEFGLDB4NzQsMHhFMiwweDhCLDB4RkUsMHgwMywweEY4LDB4MzYsMHg4QiwweDBFLDB4ODYsMHgxMiwweDNCLDB4QzEsMHg3NywweDAyLAorMHg4QiwweEM4LDB4ODMsMHhFQiwweDA0LDB4M0IsMHhEOSwweDc3LDB4MDIsMHg4QiwweENCLDB4MzMsMHhDMCwweDhBLDB4NDYsMHg0QywKKzB4RUYsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OEIsMHhDMSwweEVGLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDQxLDB4ODAsCisweEUxLDB4RkUsMHgyQiwweEQ5LDB4NTEsMHhEMSwweEU5LDB4RjMsMHg2RiwweDkwLDB4NTksMHg4QiwweEM3LDB4NDAsMHgyNCwweEZFLAorMHgzQiwweEM2LDB4NzQsMHgyNywweDJCLDB4RkUsMHg0RSwweDRFLDB4NTMsMHg4QiwweDVFLDB4MTAsMHgzQiwweEYzLDB4NzIsMHgxMywKKzB4MDMsMHgxRiwweDgzLDB4QzMsMHgwMywweDgwLDB4RTMsMHhGRSwweEM3LDB4MDcsMHgwMCwweDAwLDB4ODMsMHg2RSwweDc0LDB4MDIsCisweDg5LDB4NUUsMHgxMCwweDVCLDB4ODksMHgzQywweDg5LDB4NzYsMHgwQywweEVCLDB4ODksMHg4OSwweDc2LDB4MEMsMHgzOSwweDc2LAorMHgxMCwweDc3LDB4ODEsMHg3MiwweDA4LDB4ODMsMHgzQywweDAwLDB4NzQsMHgwMywweEU5LDB4NzcsMHhGRiwweEU4LDB4MEQsMHhCRSwKKzB4RTksMHg2MiwweEZGLDB4MzYsMHg4OSwweDFFLDB4ODQsMHgxMiwweEIwLDB4MEMsMHhFOCwweEI1LDB4QzYsMHgzMywweEMwLDB4OEUsCisweEQ4LDB4QzMsMHhBMSwweDg0LDB4MTIsMHgzRCwweDEwLDB4MDAsMHg3MiwweDc3LDB4QkEsMHgwNCwweDAxLDB4M0IsMHgwNiwweDg4LAorMHgxMiwweDc1LDB4MDYsMHhDNywweDA2LDB4N0UsMHgxMiwweDAwLDB4MDAsMHg4QiwweDBFLDB4REEsMHgxMiwweEUzLDB4MEIsMHhFOCwKKzB4RDAsMHhGRSwweDcyLDB4NTcsMHhDNywweDA2LDB4N0UsMHgxMiwweEZGLDB4N0YsMHg4QiwweDBFLDB4MjAsMHgxMywweEUzLDB4MEIsCisweEU4LDB4QTUsMHhGRCwweDcyLDB4NDYsMHhDNywweDA2LDB4N0UsMHgxMiwweEZGLDB4N0YsMHg4QiwweDBFLDB4NjYsMHgxMywweEUzLAorMHgwQiwweEU4LDB4OTQsMHhGRSwweDcyLDB4MzUsMHhDNywweDA2LDB4N0UsMHgxMiwweEZGLDB4N0YsMHhBMSwweDI4LDB4MDEsMHhBOSwKKzB4MDEsMHgwMCwweDc1LDB4MDMsMHhFOCwweEY5LDB4RkUsMHg4MCwweDNFLDB4OEQsMHgxMiwweDAwLDB4NzUsMHgxRCwweEExLDB4ODQsCisweDEyLDB4M0QsMHgyMCwweDAwLDB4NzYsMHgxNSwweDNCLDB4MDYsMHg4MiwweDEyLDB4NzYsMHgwOSwweEExLDB4N0UsMHgxMiwweDNCLAorMHgwNiwweDgwLDB4MTIsMHg3MiwweDBDLDB4ODAsMHgwRSwweDkwLDB4MTIsMHg4MCwweEMzLDB4QjAsMHg4MCwweEZGLDB4MTYsMHg3QywKKzB4MTIsMHhDMywweDgwLDB4MEUsMHg5MCwweDEyLDB4NDAsMHhDMywweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywweDEyLDB4MTcsCisweDlDLDB4MEUsMHhFOCwweEI3LDB4QzgsMHg2QSwweDAwLDB4MUYsMHhDNiwweDA2LDB4OTMsMHgxMiwweDIwLDB4OUMsMHgwRSwweEU4LAorMHhBQSwweEM4LDB4NkEsMHgwMCwweDFGLDB4QzYsMHgwNiwweDkzLDB4MTIsMHgxNiwweDlDLDB4MEUsMHhFOCwweDlELDB4QzgsMHg5MCwKKzB4QkEsMHgwNiwweDAxLDB4RUMsMHhBOCwweDIwLDB4NzUsMHhDQSwweEZCLDB4OTAsMHhGQSwweEJBLDB4MDQsMHgwMSwweEVELDB4OTAsCisweDkwLDB4OTAsMHg5MCwweDkwLDB4M0EsMHgwNiwweDk0LDB4MTIsMHg3NywweEJFLDB4MzMsMHhEQiwweDhBLDB4RDgsMHhEMSwweEUzLAorMHgyRSwweDhCLDB4QUYsMHg0NCwweDAwLDB4QzQsMHg3RSwweDA4LDB4ODUsMHhGRiwweDc0LDB4QjksMHhGNiwweEM0LDB4QzAsMHg3NSwKKzB4NTUsMHgzMiwweEMwLDB4QzEsMHhFMCwweDAyLDB4ODAsMHhFNCwweEYwLDB4OEIsMHhGMCwweEVELDB4OTAsMHg5MCwweDkwLDB4OTAsCisweDkwLDB4ODUsMHhDMCwweDc0LDB4QkIsMHg4QiwweEM4LDB4NDEsMHg4MCwweEUxLDB4RkUsMHgwQiwweEM2LDB4OEIsMHg1RSwweDUwLAorMHg0QiwweDRCLDB4MkIsMHhEOSwweDc4LDB4OUMsMHhBQiwweDhCLDB4QzEsMHg0MCwweDQwLDB4MDEsMHg0NiwweDRFLDB4RDEsMHhFOSwKKzB4RjMsMHg2RCwweDkwLDB4ODksMHg1RSwweDUwLDB4ODksMHg3RSwweDA4LDB4OEIsMHg0NiwweDI2LDB4ODAsMHhFNCwweEVGLDB4ODksCisweDQ2LDB4MjYsMHhGNiwweEM0LDB4MDEsMHg3NSwweDBDLDB4RjcsMHg0NiwweDQ4LDB4MEMsMHgwMCwweDc1LDB4MDUsMHhCMCwweDAyLAorMHhFOCwweDdGLDB4QzUsMHhFOSwweDdBLDB4RkYsMHg4NiwweEM0LDB4OEIsMHhDOCwweDgzLDB4RTEsMHgzRiwweDQxLDB4ODAsMHhFMSwKKzB4RkUsMHhFMywweDBBLDB4M0MsMHg4MCwweDcyLDB4MDksMHgyNCwweDNGLDB4QjQsMHhGMCwweEVCLDB4QjAsMHhFOSwweDYwLDB4RkYsCisweDI1LDB4M0YsMHgwMCwweDMzLDB4RkYsMHg4RSwweEM3LDB4QkYsMHg5NiwweDEyLDB4OEIsMHhGNywweEQxLDB4RTksMHhGMywweDZELAorMHg5MCwweDhCLDB4QzgsMHhFOCwweDQ4LDB4RUQsMHhFOSwweDQ3LDB4RkYsMHg5MCwweDZBLDB4MDAsMHgxRiwweEM2LDB4MDYsMHg5MywKKzB4MTIsMHgxQiwweDlDLDB4MEUsMHhFOCwweEQ1LDB4QzcsMHg5MCwweDYwLDB4MUUsMHgwNiwweDMzLDB4QzAsMHg4RSwweEQ4LDB4OEUsCisweEMwLDB4QkEsMHgwNiwweDAxLDB4RUMsMHhBOCwweDA0LDB4NzQsMHhFMSwweEIwLDB4MDYsMHhFRSwweEVDLDB4QTIsMHg4QywweDEyLAorMHhBOCwweDQwLDB4NzQsMHgxMSwweEExLDB4ODgsMHgxMiwweEEzLDB4ODQsMHgxMiwweEM2LDB4MDYsMHg4RCwweDEyLDB4MDAsMHhFOCwKKzB4NjAsMHhGRSwweEEwLDB4OEMsMHgxMiwweEE4LDB4ODAsMHg3NCwweDAzLDB4RTgsMHgwNCwweEZGLDB4QjgsMHgwMCwweDgwLDB4QkEsCisweDIyLDB4RkYsMHhFRiwweDA3LDB4MUYsMHg2MSwweENGLDB4OTAsMHg2QSwweDAwLDB4MUYsMHhDNiwweDA2LDB4OTMsMHgxMiwweDFCLAorMHg5QywweDBFLDB4RTgsMHg4NywweEM3LDB4OTAsMHg2MCwweDFFLDB4MDYsMHgzMywweEMwLDB4OEUsMHhEOCwweDhFLDB4QzAsMHhCQSwKKzB4MDYsMHgwMSwweEVDLDB4QTgsMHgwNCwweDc0LDB4RTEsMHhCQSwweDA4LDB4MDEsMHhFQywweEEyLDB4OEMsMHgxMiwweEE4LDB4NDAsCisweDc0LDB4MTEsMHhBMSwweDg4LDB4MTIsMHhBMywweDg0LDB4MTIsMHhDNiwweDA2LDB4OEQsMHgxMiwweDAwLDB4RTgsMHgxMiwweEZFLAorMHhBMCwweDhDLDB4MTIsMHhBOCwweDgwLDB4NzQsMHgwMywweEU4LDB4QjYsMHhGRSwweEI4LDB4MDAsMHg4MCwweEJBLDB4MjIsMHhGRiwKKzB4RUYsMHgwNywweDFGLDB4NjEsMHhDRiwweDkwLDB4RUUsMHg4NiwweEUwLDB4RUUsMHg4NiwweEUwLDB4RUMsMHg4NiwweEUwLDB4RUMsCisweDg2LDB4RTAsMHg4MCwweEUxLDB4RkUsMHhGMywweDZDLDB4OTAsMHg4MCwweEUxLDB4RkUsMHhGMywweDZFLDB4OTAsMHgwNSwweDAwLAorMHg3NSwweDQ3LDB4QTgsMHg0QiwweDA1LDB4MDAsMHg3NSwweDQ4LDB4QTgsMHg0QiwweDA1LDB4MDAsMHhBMywweDQ4LDB4QTgsMHg0QiwKKzB4MDUsMHgwMCwweDM1LDB4NDksMHhBOCwweDRCLDB4MDYsMHgwMCwweDk4LDB4NDgsMHg5NiwweDRCLDB4MDYsMHgwMCwweEJBLDB4NDgsCisweDk2LDB4NEIsMHgwNiwweDAwLDB4QzMsMHg0OCwweDk2LDB4NEIsMHgwNiwweDAwLDB4Q0IsMHg0OCwweDk2LDB4NEIsMHgwNiwweDAwLAorMHgyMCwweDQ5LDB4OTYsMHg0QiwweDA2LDB4MDAsMHgyOCwweDQ5LDB4OTYsMHg0QiwweDA2LDB4MDAsMHg0RSwweDRBLDB4OUMsMHg0QiwKKzB4MDYsMHgwMCwweDdCLDB4NEEsMHg5QywweDRCLDB4MDUsMHgwMCwweDlFLDB4NEEsMHhBMiwweDRCLDB4MDUsMHgwMCwweEVDLDB4NEEsCisweEEyLDB4NEIsMHgwMCwweDAwLDB4MUUsMHgwNiwweDgzLDB4M0UsMHg0NCwweDEyLDB4MDAsMHg3NCwweDA5LDB4QTAsMHgwNiwweDAxLAorMHgyNCwweDMwLDB4M0MsMHgzMCwweDc0LDB4MUEsMHg4QywweEM4LDB4OEUsMHhEOCwweDhFLDB4QzAsMHhCQiwweEFFLDB4NEIsMHg4QiwKKzB4MEYsMHhFMywweDBELDB4OEIsMHg3RiwweDAyLDB4OEIsMHg3NywweDA0LDB4RjMsMHhBNCwweDgzLDB4QzMsMHgwNiwweEVCLDB4RUYsCisweDA3LDB4MUYsMHhDMywweDkwLDB4MzMsMHhDMCwweEEzLDB4M0UsMHgwMSwweEI5LDB4MEMsMHgwMSwweEJFLDB4NDAsMHgwMSwweDhCLAorMHhGRSwweDgxLDB4QzYsMHhCNCwweDBGLDB4ODksMHgwNCwweDhCLDB4QzYsMHgyQiwweEYxLDB4M0IsMHhDNywweDc3LDB4RjYsMHhBMywKKzB4M0MsMHgwMSwweEMzLDB4OTAsMHgxRSwweDA2LDB4NjAsMHgzNiwweDhCLDB4MkUsMHgzRSwweDAxLDB4OEIsMHg1RSwweDAwLDB4M0IsCisweEVCLDB4NzQsMHgyQiwweDhCLDB4NzYsMHgwMiwweDg5LDB4MUMsMHg4OSwweDc3LDB4MDIsMHgzNiwweEExLDB4M0MsMHgwMSwweDg5LAorMHg0NiwweDAwLDB4MzYsMHg4OSwweDJFLDB4M0MsMHgwMSwweDhCLDB4RUIsMHhGRiwweDRFLDB4MDYsMHg3NCwweDA4LDB4OEIsMHg2RSwKKzB4MDAsMHhGRiwweDRFLDB4MDYsMHg3NSwweEY4LDB4MzYsMHg4OSwweDJFLDB4M0UsMHgwMSwweDhCLDB4NjYsMHgwNCwweDYxLDB4MDcsCisweDFGLDB4QzMsMHgxRSwweDA2LDB4NjAsMHgzNiwweDhCLDB4MkUsMHgzRSwweDAxLDB4OTgsMHg4OSwweDQ2LDB4MDYsMHg4OSwweDY2LAorMHgwNCwweDNCLDB4NkUsMHgwMCwweDc0LDB4MTAsMHg4QiwweDZFLDB4MDAsMHhGRiwweDRFLDB4MDYsMHg3NSwweEY4LDB4MzYsMHg4OSwKKzB4MkUsMHgzRSwweDAxLDB4OEIsMHg2NiwweDA0LDB4NjEsMHgwNywweDFGLDB4QzMsMHhDMywweDkwLDB4MUUsMHgwNiwweDYwLDB4OUMsCisweEZBLDB4MzMsMHhFRCwweDhFLDB4REQsMHg4QiwweDJFLDB4M0MsMHgwMSwweDg1LDB4RUQsMHg3NCwweDNELDB4OEIsMHg0RSwweDAwLAorMHg4OSwweDBFLDB4M0MsMHgwMSwweDhCLDB4Q0MsMHg4RCwweEE2LDB4MEEsMHgwMSwweDU2LDB4MUUsMHgwNiwweDYwLDB4ODksMHg2NiwKKzB4MDQsMHhDNywweDQ2LDB4MDgsMHgwRiwweDFBLDB4QzcsMHg0NiwweDA2LDB4MDEsMHgwMCwweDhCLDB4MUUsMHgzRSwweDAxLDB4ODUsCisweERCLDB4NzQsMHgxRCwweDhCLDB4QzUsMHg4NywweDA3LDB4ODksMHg0NiwweDAwLDB4ODksMHg1RSwweDAyLDB4OEIsMHhEOCwweDg5LAorMHg2RiwweDAyLDB4OEIsMHhFMSwweDlELDB4NjEsMHgwNywweDFGLDB4RjgsMHhDMywweDlELDB4NjEsMHgwNywweDFGLDB4RjksMHhDMywKKzB4ODksMHgyRSwweDNFLDB4MDEsMHg4OSwweDZFLDB4MDAsMHg4OSwweDZFLDB4MDIsMHg4NywweEUxLDB4OUQsMHg4QiwweEUxLDB4RUIsCisweEU0LDB4MDAsMHgwRCwweDBBLDB4NTQsMHg2NSwweDcyLDB4NkQsMHg2OSwweDZFLDB4NjEsMHg2QywweDczLDB4MjAsMHg3MywweDc1LAorMHg3MCwweDcwLDB4NkYsMHg3MiwweDc0LDB4NjUsMHg2NCwweDNBLDB4MEQsMHgwQSwweDMxLDB4MjksMHgyMCwweDQxLDB4NEUsMHg1MywKKzB4NDksMHgyMCwweDYzLDB4NkYsMHg2RCwweDcwLDB4NjEsMHg3NCwweDY5LDB4NjIsMHg2QywweDY1LDB4MEQsMHgwQSwweDMyLDB4MjksCisweDIwLDB4NTcsMHg3OSwweDczLDB4NjUsMHgyMCwweDMzLDB4MzAsMHgwRCwweDBBLDB4NTAsMHg2QywweDY1LDB4NjEsMHg3MywweDY1LAorMHgyMCwweDczLDB4NjUsMHg2QywweDY1LDB4NjMsMHg3NCwweDNBLDB4MjAsMHgwMCwweDBELDB4MEEsMHg2MywweDZGLDB4NjQsMHg2NSwKKzB4MjAsMHg3MywweDY1LDB4NjcsMHg2RCwweDY1LDB4NkUsMHg3NCwweDNELDB4MDAsMHgwRCwweDBBLDB4NEQsMHg2RiwweDZFLDB4NjksCisweDc0LDB4NkYsMHg3MiwweDIwLDB4NzYsMHgzMiwweDJFLDB4MzUsMHgwQSwweDBELDB4MEEsMHgzRSwweDAwLDB4MEQsMHgwQSwweDUwLAorMHg2MSwweDcyLDB4NjQsMHg2RiwweDZFLDB4M0YsMHgwMCwweDBELDB4MEEsMHg0RSwweDZGLDB4MjAsMHg2MSwweDY0LDB4NjQsMHg3MiwKKzB4NjUsMHg3MywweDczLDB4MjAsMHg3MywweDcwLDB4NjUsMHg2MywweDY5LDB4NjYsMHg2OSwweDY1LDB4NjQsMHgwMCwweDBELDB4MEEsCisweDNBLDB4MDAsMHgwRCwweDBBLDB4MDAsMHg0QywweDZGLDB4NjMsMHgzRCwweDAwLDB4MEQsMHgwQSwweDQ2LDB4NDEsMHg1NCwweDQxLAorMHg0QywweDIwLDB4NDUsMHg1MiwweDUyLDB4NEYsMHg1MiwweDNELDB4MDAsMHgwRCwweDBBLDB4NEQsMHg2RiwweDZFLDB4NjksMHg3NCwKKzB4NkYsMHg3MiwweDIwLDB4NjMsMHg2RiwweDZELDB4NkQsMHg2MSwweDZFLDB4NjQsMHg3MywweDNBLDB4MkQsMHgwRCwweDBBLDB4MjAsCisweDIwLDB4MjAsMHg0NCwweDJDLDB4NjQsMHg1QiwweDVCLDB4NzgsMHg3OCwweDc4LDB4NzgsMHgzQSwweDVELDB4NzgsMHg3OCwweDc4LAorMHg3OCwweDVELDB4MjAsMHgyRCwweDIwLDB4NjQsMHg3NSwweDZELDB4NzAsMHgyMCwweDZELDB4NjUsMHg2RCwweDZGLDB4NzIsMHg3OSwKKzB4MEQsMHgwQSwweDIwLDB4MjAsMHgyMCwweDRDLDB4MkMsMHg2QywweDVCLDB4NUIsMHg3OCwweDc4LDB4NzgsMHg3OCwweDNBLDB4NUQsCisweDc4LDB4NzgsMHg3OCwweDc4LDB4NUQsMHgyMCwweDJELDB4MjAsMHg2NCwweDc1LDB4NkQsMHg3MCwweDIwLDB4NzMsMHg2OSwweDZFLAorMHg2NywweDZDLDB4NjUsMHgyMCwweDZDLDB4NjksMHg2RSwweDY1LDB4MEQsMHgwQSwweDIwLDB4MjAsMHgyMCwweDQ1LDB4MkMsMHg2NSwKKzB4NUIsMHg1QiwweDc4LDB4NzgsMHg3OCwweDc4LDB4M0EsMHg1RCwweDc4LDB4NzgsMHg3OCwweDc4LDB4NUQsMHgyMCwweDJELDB4MjAsCisweDY1LDB4NjQsMHg2OSwweDc0LDB4MjAsMHg2RCwweDY1LDB4NkQsMHg2RiwweDcyLDB4NzksMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLAorMHg0NiwweDJDLDB4NjYsMHg1QiwweDVCLDB4NzgsMHg3OCwweDc4LDB4NzgsMHgyMCwweDVELDB4NzgsMHg3OCwweDc4LDB4NzgsMHg1RCwKKzB4MjAsMHgyRCwweDIwLDB4NjYsMHg2OSwweDZDLDB4NkMsMHgyMCwweDZELDB4NjUsMHg2RCwweDZGLDB4NzIsMHg3OSwweDIwLDB4NzAsCisweDYxLDB4NzIsMHg2MSwweDY3LDB4NzIsMHg2MSwweDcwLDB4NjgsMHg3MywweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg0OSwweDVCLAorMHg3OCwweDc4LDB4NzgsMHg3OCwweDVELDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwKKzB4MjAsMHg3NywweDZGLDB4NzIsMHg2NCwweDIwLDB4NjksMHg2RSwweDcwLDB4NzUsMHg3NCwweDIwLDB4NjYsMHg3MiwweDZGLDB4NkQsCisweDIwLDB4NzAsMHg2RiwweDcyLDB4NzQsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NjksMHg1QiwweDc4LDB4NzgsMHg3OCwweDc4LAorMHg1RCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDYyLDB4NzksMHg3NCwKKzB4NjUsMHgyMCwweDY5LDB4NkUsMHg3MCwweDc1LDB4NzQsMHgyMCwweDY2LDB4NzIsMHg2RiwweDZELDB4MjAsMHg3MCwweDZGLDB4NzIsCisweDc0LDB4MEQsMHgwQSwweDIwLDB4MjAsMHgyMCwweDRGLDB4NzgsMHg3OCwweDc4LDB4NzgsMHgyMCwweDc4LDB4NzgsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDJELDB4MjAsMHg2RiwweDc1LDB4NzQsMHg3MCwweDc1LDB4NzQsMHgyMCwKKzB4NzcsMHg2RiwweDcyLDB4NjQsMHgyMCwweDc0LDB4NkYsMHgyMCwweDcwLDB4NkYsMHg3MiwweDc0LDB4MEQsMHgwQSwweDIwLDB4MjAsCisweDIwLDB4NkYsMHg3OCwweDc4LDB4NzgsMHg3OCwweDIwLDB4NzgsMHg3OCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MkQsMHgyMCwweDZGLDB4NzUsMHg3NCwweDcwLDB4NzUsMHg3NCwweDIwLDB4NjIsMHg3OSwweDc0LDB4NjUsMHgyMCwKKzB4NzQsMHg2RiwweDIwLDB4NzAsMHg2RiwweDcyLDB4NzQsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NDcsMHg1QiwweDVCLDB4NzgsCisweDc4LDB4NzgsMHg3OCwweDNBLDB4NUQsMHg3OCwweDc4LDB4NzgsMHg3OCwweDVELDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDY3LAorMHg2RiwweDc0LDB4NkYsMHgyMCwweDYxLDB4NjQsMHg2NCwweDcyLDB4NjUsMHg3MywweDczLDB4MEQsMHgwQSwweDIwLDB4MjAsMHgyMCwKKzB4NTcsMHg1QiwweDVCLDB4NzgsMHg3OCwweDc4LDB4NzgsMHgzQSwweDVELDB4NzgsMHg3OCwweDc4LDB4NzgsMHg1RCwweDIwLDB4MjAsCisweDIwLDB4MkQsMHgyMCwweDc3LDB4NjEsMHg3NCwweDYzLDB4NjgsMHgyMCwweDYxLDB4MjAsMHg3NywweDZGLDB4NzIsMHg2NCwweDBELAorMHgwQSwweDIwLDB4MjAsMHgyMCwweDQzLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDJELDB4MjAsMHg2OSwweDZFLDB4NzQsMHg2NSwweDcyLDB4NzIsMHg3NSwweDcwLDB4NzQsCisweDczLDB4MjAsMHg2RiwweDY2LDB4NjYsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NTMsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDY5LDB4NkUsMHg3NCwKKzB4NjUsMHg3MiwweDcyLDB4NzUsMHg3MCwweDc0LDB4NzMsMHgyMCwweDZGLDB4NkUsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NzMsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyRCwweDIwLDB4NzMsMHg2OSwweDZFLDB4NjcsMHg2QywweDY1LDB4MjAsMHg3MywweDc0LDB4NjUsMHg3MCwweDBELDB4MEEsMHgyMCwKKzB4MjAsMHgyMCwweDQyLDB4NzgsMHg3OCwweDc4LDB4NzgsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDJELDB4MjAsMHg2MiwweDcyLDB4NjUsMHg2MSwweDZCLDB4NzAsMHg2RiwweDY5LDB4NkUsMHg3NCwweDIwLAorMHg3MywweDY1LDB4NzQsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NjIsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDYyLDB4NzIsMHg2NSwweDYxLDB4NkIsCisweDcwLDB4NkYsMHg2OSwweDZFLDB4NzQsMHgyMCwweDYzLDB4NkMsMHg2NSwweDYxLDB4NzIsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLAorMHg1MiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwKKzB4MjAsMHgyRCwweDIwLDB4NzIsMHg2NSwweDczLDB4NzQsMHg2MSwweDcyLDB4NzQsMHgyMCwweDYyLDB4NzIsMHg2NSwweDYxLDB4NkIsCisweDcwLDB4NkYsMHg2OSwweDZFLDB4NzQsMHgwRCwweDBBLDB4MjAsMHgyMCwweDIwLDB4NzIsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDcyLDB4NjUsMHg2NywKKzB4NjksMHg3MywweDc0LDB4NjUsMHg3MiwweDczLDB4MjAsMHg2MSwweDc0LDB4MjAsMHg2MiwweDcyLDB4NkIsMHg3MCwweDc0LDB4MEQsCisweDBBLDB4MjAsMHgyMCwweDIwLDB4NTgsMHgyQywweDc4LDB4MjAsMHg2RSwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MkQsMHgyMCwweDY1LDB4NzgsMHg2MSwweDZELDB4NjksMHg2RSwweDY1LDB4MjAsMHg2MywKKzB4NjgsMHg2MSwweDZFLDB4NkUsMHg2NSwweDZDLDB4MjAsMHg2RSwweDBELDB4MEEsMHgyMCwweDIwLDB4MjAsMHg0OCwweDJDLDB4M0YsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyRCwweDIwLAorMHg3NCwweDY4LDB4NjksMHg3MywweDIwLDB4NkQsMHg2NSwweDczLDB4NzMsMHg2MSwweDY3LDB4NjUsMHgwMCwweDFCLDB4NUIsMHgzMiwKKzB4NEEsMHgxQiwweDVCLDB4MzEsMHgzQiwweDMxLDB4NDgsMHg0MSwweDRFLDB4NTMsMHg0OSwweDIwLDB4NTQsMHg2NSwweDcyLDB4NkQsCisweDY5LDB4NkUsMHg2MSwweDZDLDB4MEQsMHgwQSwweDBBLDB4MDAsMHgxQiwweDVCLDB4NEIsMHgwMCwweDFCLDB4NUIsMHg0QSwweDAwLAorMHgxQiwweDVCLDB4MzIsMHg0QSwweDFCLDB4NUIsMHgzMSwweDNCLDB4MzEsMHg0OCwweDAwLDB4MUIsMHg1QiwweDQ0LDB4MjAsMHgxQiwKKzB4NUIsMHg0NCwweDAwLDB4MUIsMHg1QiwweDMxLDB4M0IsMHgzNywweDMyLDB4NDgsMHgwMCwweDFCLDB4NUIsMHgwMCwweDNCLDB4MDAsCisweDQ4LDB4MDAsMHgxQiwweDVCLDB4NzMsMHgwMCwweDFCLDB4NUIsMHg3NSwweDAwLDB4MUIsMHg3QSwweDJCLDB4MEIsMHg3RiwweDFCLAorMHg3QSwweDJFLDB4MEMsMHg3RiwweDFCLDB4N0EsMHgyRCwweDA4LDB4N0YsMHgxQiwweDdBLDB4MkMsMHgwQSwweDdGLDB4MUIsMHg3QSwKKzB4MjIsMHgwOCwweDdGLDB4MUEsMHg1NywweDc5LDB4NzMsMHg2NSwweDIwLDB4MzMsMHgzMCwweDIwLDB4NTQsMHg2NSwweDcyLDB4NkQsCisweDY5LDB4NkUsMHg2MSwweDZDLDB4MEQsMHgwQSwweDAwLDB4MUIsMHg1NCwweDAwLDB4MUIsMHg1OSwweDAwLDB4MUEsMHgwMCwweDFFLAorMHgwMCwweDA4LDB4MjAsMHgwOCwweDAwLDB4MDAsMHgxQiwweDNELDB4MDAsMHgwMCwweDAwLDB4MUIsMHg0NiwweDAwLDB4MEQsMHgwMCwKKzB4M0YsMHg0NCwweDY0LDB4NDUsMHg2NSwweDQ2LDB4NjYsMHg0NywweDY3LDB4NDgsMHg2OCwweDQ5LDB4NjksMHg0RiwweDZGLDB4NDMsCisweDYzLDB4NTMsMHg3MywweDQyLDB4NjIsMHg1MiwweDcyLDB4NTcsMHg3NywweDU4LDB4NzgsMHg0QywweDZDLDB4M0MsMHg2MCwweEQ0LAorMHg1NywweEQ0LDB4NTcsMHg1MCwweDU4LDB4NTAsMHg1OCwweEQ2LDB4NTksMHhENiwweDU5LDB4QjQsMHg1OSwweEI0LDB4NTksMHgzQywKKzB4NjAsMHgzQywweDYwLDB4NkMsMHg1NywweDQ4LDB4NTcsMHgyNiwweDU3LDB4MDYsMHg1NywweDkwLDB4NTcsMHg5MCwweDU3LDB4OTgsCisweDU3LDB4NDgsMHg1RiwweDBDLDB4NUYsMHg1OCwweDVGLDB4MzMsMHg1RiwweDQwLDB4NUYsMHhBMCwweDU3LDB4QTAsMHg1NywweEZFLAorMHg1OSwweEZFLDB4NTksMHhEQywweDU3LDB4REMsMHg1NywweDg4LDB4NjEsMHg5OCwweDYxLDB4QzAsMHg2MSwweENDLDB4NjEsMHhEOCwKKzB4NjEsMHhGNiwweDYxLDB4MDIsMHg2MiwweDIyLDB4NjIsMHhGOCwweDU2LDB4NEEsMHg2MiwweDU4LDB4NjIsMHg2MCwweDU5LDB4MjAsCisweDIwLDB4NjYsMHg2QywweDYxLDB4NjcsMHg3MywweDNELDB4MDAsMHgyMCwweDIwLDB4NjEsMHg3OCwweDNELDB4MDAsMHgyMCwweDIwLAorMHg2MiwweDc4LDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDc4LDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2NCwweDc4LDB4M0QsMHgwMCwKKzB4MjAsMHgyMCwweDYzLDB4NzMsMHgzRCwweDAwLDB4MjAsMHgyMCwweDY0LDB4NzMsMHgzRCwweDAwLDB4MjAsMHgyMCwweDY1LDB4NzMsCisweDNELDB4MDAsMHgyMCwweDIwLDB4NzMsMHg3MywweDNELDB4MDAsMHgyMCwweDIwLDB4NjQsMHg2OSwweDNELDB4MDAsMHgyMCwweDIwLAorMHg3MywweDY5LDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MiwweDcwLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg3MywweDcwLDB4M0QsMHgwMCwKKzB4MjAsMHgyMCwweDY5LDB4NzAsMHgzRCwweDAwLDB4MjAsMHg2MywweDY4LDB4NjEsMHg2RSwweDY1LDB4NkMsMHgzRCwweDAwLDB4MjAsCisweDIwLDB4MjAsMHgyMCwweDczLDB4NjUsMHg2NywweDNELDB4MDAsMHgyMCwweDc0LDB4NjksMHg1RiwweDczLDB4NzQsMHg3MiwweDNELAorMHgwMCwweDIwLDB4NzQsMHg2OSwweDVGLDB4NzQsMHg2RiwweDczLDB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OSwweDVGLDB4NkQsMHg2MSwKKzB4NzgsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY5LDB4NUYsMHg2MiwweDYxLDB4NzMsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY5LDB4NUYsCisweDczLDB4NjksMHg3QSwweDNELDB4MDAsMHgyMCwweDc0LDB4NjksMHg1RiwweDczLDB4NzQsMHg2NiwweDNELDB4MDAsMHgyMCwweDc0LAorMHg2OSwweDVGLDB4NzIsMHg2RiwweDZGLDB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OSwweDVGLDB4NjYsMHg2QywweDY3LDB4M0QsMHgwMCwKKzB4MjAsMHg3NCwweDY5LDB4NUYsMHg3NCwweDZGLDB4NzQsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg3MCwweDYzLDB4NkUsCisweDNELDB4MDAsMHgyMCwweDcyLDB4NjksMHg1RiwweDczLDB4NzQsMHg3MiwweDNELDB4MDAsMHgyMCwweDcyLDB4NjksMHg1RiwweDczLAorMHg3NCwweDY2LDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NzIsMHg2RiwweDZGLDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OSwKKzB4NUYsMHg2MiwweDYxLDB4NzMsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg3MywweDY5LDB4N0EsMHgzRCwweDAwLDB4MjAsCisweDcyLDB4NjksMHg1RiwweDc0LDB4NkYsMHg3NCwweDNELDB4MDAsMHgyMCwweDcyLDB4NjksMHg1RiwweDZELDB4NjksMHg2RSwweDNELAorMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NjYsMHg2QywweDY3LDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NzQsMHg2RiwKKzB4NzMsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY5LDB4NUYsMHg3NCwweDY4LDB4NzIsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY4LDB4NUYsCisweDczLDB4NzQsMHg2NiwweDNELDB4MDAsMHgyMCwweDc0LDB4NjgsMHg1RiwweDczLDB4NzQsMHg3MiwweDNELDB4MDAsMHgyMCwweDc0LAorMHg2OCwweDVGLDB4NjIsMHg2MSwweDczLDB4M0QsMHgwMCwweDIwLDB4NzQsMHg2OCwweDVGLDB4NzMsMHg2OSwweDdBLDB4M0QsMHgwMCwKKzB4MjAsMHg3NCwweDY4LDB4NUYsMHg3NCwweDcyLDB4NjcsMHgzRCwweDAwLDB4MjAsMHg3NCwweDY4LDB4NUYsMHg2NiwweDZDLDB4NjcsCisweDNELDB4MDAsMHgyMCwweDc0LDB4NjgsMHg1RiwweDYzLDB4NkUsMHg3NCwweDNELDB4MDAsMHgyMCwweDcyLDB4NjgsMHg1RiwweDczLAorMHg3NCwweDcyLDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OCwweDVGLDB4NzMsMHg3NCwweDY2LDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OCwKKzB4NUYsMHg2MiwweDYxLDB4NzMsMHgzRCwweDAwLDB4MjAsMHg3MiwweDY4LDB4NUYsMHg3MywweDY5LDB4N0EsMHgzRCwweDAwLDB4MjAsCisweDcyLDB4NjgsMHg1RiwweDczLDB4NzAsMHg2MSwweDNELDB4MDAsMHgyMCwweDcyLDB4NjgsMHg1RiwweDYxLDB4NzMsMHg2RiwweDNELAorMHgwMCwweDIwLDB4NzIsMHg2OCwweDVGLDB4NzIsMHg2RiwweDZGLDB4M0QsMHgwMCwweDIwLDB4NzIsMHg2OCwweDVGLDB4NjYsMHg2QywKKzB4NjcsMHgzRCwweDAwLDB4MjAsMHg2RCwweDVGLDB4NjMsMHg2MSwweDcyLDB4NjUsMHgzRCwweDAwLDB4MjAsMHg3MCwweDc0LDB4NUYsCisweDY2LDB4NkMsMHg2RiwweDNELDB4MDAsMHgyMCwweDYxLDB4NzMsMHg1RiwweDY2LDB4NkMsMHg2RiwweDNELDB4MDAsMHgyMCwweDcyLAorMHg2RCwweDVGLDB4NjYsMHg2QywweDZGLDB4M0QsMHgwMCwweDIwLDB4MjAsMHgyMCwweDcxLDB4NUYsMHg2OSwweDZFLDB4M0QsMHgwMCwKKzB4MjAsMHgyMCwweDcxLDB4NUYsMHg2RiwweDc1LDB4NzQsMHgzRCwweDAwLDB4MjAsMHg3MSwweDVGLDB4NjQsMHg3MiwweDYxLDB4NkUsCisweDNELDB4MDAsMHgyMCwweDIwLDB4NzEsMHg1RiwweDc0LDB4NjksMHg2RCwweDNELDB4MDAsMHgyMCwweDIwLDB4MjAsMHg3MSwweDVGLAorMHg2NiwweDYzLDB4M0QsMHgwMCwweDIwLDB4NzEsMHg1RiwweDczLDB4NzQsMHg2MSwweDc0LDB4M0QsMHgwMCwweDIwLDB4NzEsMHg1RiwKKzB4NjQsMHg2MSwweDc0LDB4NjEsMHgzRCwweDAwLDB4MjAsMHg3MSwweDVGLDB4NkQsMHg2RiwweDY0LDB4NkQsMHgzRCwweDAwLDB4MjAsCisweDY4LDB4NjEsMHg2RSwweDY0LDB4NUYsMHg2RiwweDNELDB4MDAsMHgyMCwweDY4LDB4NjEsMHg2RSwweDY0LDB4NUYsMHg2MiwweDNELAorMHgwMCwweDIwLDB4NjgsMHg2MSwweDZFLDB4NjQsMHg1RiwweDY1LDB4M0QsMHgwMCwweDIwLDB4NjgsMHg2MSwweDZFLDB4NjQsMHg1RiwKKzB4NjksMHgzRCwweDAwLDB4MjAsMHgyMCwweDZGLDB4NzAsMHg2RiwweDczLDB4NzQsMHgzRCwweDAwLDB4MjAsMHgyMCwweDc0LDB4NjksCisweDZELDB4NjUsMHg2RiwweDNELDB4MDAsMHgyMCwweDYzLDB4NzUsMHg3MywweDc0LDB4NkQsMHgzMSwweDNELDB4MDAsMHgyMCwweDYzLAorMHg3NSwweDczLDB4NzQsMHg2RCwweDMyLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg3NSwweDczLDB4NzQsMHg2RCwweDY0LDB4M0QsMHgwMCwKKzB4MjAsMHg3NCwweDc4LDB4NzIsMHg2MSwweDc0LDB4NjUsMHgzRCwweDAwLDB4MjAsMHg3MiwweDc4LDB4NzIsMHg2MSwweDc0LDB4NjUsCisweDNELDB4MDAsMHgyMCwweDIwLDB4NjMsMHg1RiwweDZELDB4NjEsMHg3MCwweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg2MSwweDY0LAorMHg2NCwweDcyLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg1RiwweDYxLDB4NjksMHg3MywweDcyLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg1RiwKKzB4NzgsMHg3NCwweDYxLDB4NjcsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLDB4NjQsMHg2NSwweDY2LDB4NzIsMHgzRCwweDAwLDB4MjAsCisweDYzLDB4NUYsMHg2NiwweDZDLDB4NzMsMHg2OCwweDNELDB4MDAsMHgyMCwweDc0LDB4NzgsMHg2RCwweDYxLDB4NzgsMHg3MywweDNELAorMHgwMCwweDIwLDB4NzIsMHg2OSwweDVGLDB4NjUsMHg2RCwweDczLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NkMsMHg3MywKKzB4NzIsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NUYsMHg2OSwweDY1LDB4NzIsMHgzRCwweDAwLDB4MjAsMHgyMCwweDYzLDB4NUYsCisweDY2LDB4NjMsMHg3MiwweDNELDB4MDAsMHgyMCwweDIwLDB4NjMsMHg1RiwweDZELDB4NjMsMHg3MiwweDNELDB4MDAsMHgyMCwweDIwLAorMHg2MywweDVGLDB4NkMsMHg2MywweDcyLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NjQsMHg3MywweDczLDB4M0QsMHgwMCwKKzB4MjAsMHg2MywweDVGLDB4NjQsMHg3MywweDczLDB4NjksMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLDB4NjQsMHg3MywweDczLDB4NzIsCisweDNELDB4MDAsMHgyMCwweDIwLDB4NjMsMHg1RiwweDY5LDB4NzMsMHg3MiwweDNELDB4MDAsMHgyMCwweDIwLDB4NjMsMHg1RiwweDYzLAorMHg2MSwweDcyLDB4M0QsMHgwMCwweDIwLDB4MjAsMHg2MywweDVGLDB4NjUsMHg2NiwweDcyLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg1RiwKKzB4NjUsMHg3MiwweDczLDB4NzQsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLDB4NjUsMHg2MywweDZFLDB4NzQsMHgzRCwweDAwLDB4MjAsCisweDYzLDB4NUYsMHg2MiwweDcyLDB4NkIsMHg2MywweDNELDB4MDAsMHgyMCwweDYzLDB4NUYsMHg2MiwweDZGLDB4NkIsMHg2MywweDNELAorMHgwMCwweDIwLDB4NjMsMHg1RiwweDcyLDB4NjUsMHg3MCwweDZDLDB4M0QsMHgwMCwweDIwLDB4NjMsMHg1RiwweDYzLDB4NjMsMHg3MywKKzB4NzIsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLDB4NzMsMHg3NCwweDc0LDB4MzEsMHgzRCwweDAwLDB4MjAsMHg2MywweDVGLDB4NzMsCisweDc0LDB4NzQsMHgzMiwweDNELDB4MDAsMHgyQiwweEMwLDB4OEUsMHhEOCwweDhFLDB4QzAsMHhFOCwweEMyLDB4MDAsMHhFOCwweEU1LAorMHgwMCwweEZBLDB4QkYsMHg4NCwweDAwLDB4QzcsMHgwNSwweERDLDB4NTYsMHg4QywweDRELDB4MDIsMHhCRiwweDBDLDB4MDAsMHhDNywKKzB4MDUsMHg2RSwweDVFLDB4OEMsMHg0RCwweDAyLDB4QkYsMHgwNCwweDAwLDB4QzcsMHgwNSwweEJBLDB4NUUsMHg4QywweDRELDB4MDIsCisweEU4LDB4RjEsMHgwMCwweDkwLDB4RTgsMHg0OSwweDAxLDB4RTgsMHgxNiwweDAwLDB4RjQsMHg5MCwweEU4LDB4RTUsMHgwMCwweEJFLAorMHhCQSwweDRELDB4RTgsMHgwOSwweDBDLDB4QTAsMHg5MywweDEyLDB4RTgsMHg1RCwweDBDLDB4RTgsMHhDMiwweDA5LDB4RUIsMHhFNCwKKzB4RTgsMHhENSwweDBDLDB4RTgsMHhDNCwweDBDLDB4MEEsMHhDMCwweDc0LDB4RjYsMHg4QiwweDFFLDB4RjgsMHg3OSwweDNDLDB4MEQsCisweDc0LDB4MkUsMHgzQywweDA4LDB4NzQsMHgxNywweDNDLDB4N0YsMHg3NCwweDEzLDB4ODMsMHhGQiwweDIwLDB4N0YsMHhFMSwweDg4LAorMHg4NywweEQ2LDB4NzksMHg0MywweDg5LDB4MUUsMHhGOCwweDc5LDB4RTgsMHg3NywweDBDLDB4RUIsMHhEMywweDBCLDB4REIsMHg3NCwKKzB4Q0YsMHg0QiwweDg5LDB4MUUsMHhGOCwweDc5LDB4OEIsMHgzNiwweDE2LDB4N0EsMHhFOCwweEMxLDB4MEIsMHhFQiwweEMxLDB4OTAsCisweEU4LDB4MDIsMHgwMCwweEVCLDB4QkIsMHhDNiwweDg3LDB4RDYsMHg3OSwweDAwLDB4MEIsMHhEQiwweDc0LDB4MUUsMHhBMCwweEQ2LAorMHg3OSwweEJGLDB4NjAsMHg1MSwweEI5LDB4MUQsMHgwMCwweDhCLDB4RDksMHgwNiwweDBFLDB4MDcsMHhGMiwweEFFLDB4MDcsMHg3NSwKKzB4MTcsMHg0MSwweDJCLDB4RDksMHhEMSwweEUzLDB4MkUsMHhGRiwweDk3LDB4N0QsMHg1MSwweDkwLDB4MzMsMHhDMCwweEEzLDB4RjgsCisweDc5LDB4QkUsMHg4OSwweDRELDB4RTgsMHg4NywweDBCLDB4QzMsMHhCRSwweDhELDB4NEQsMHhFOCwweDgwLDB4MEIsMHhFQiwweEVDLAorMHhCQSwweDAwLDB4MDIsMHhCMCwweDkzLDB4RUUsMHhCMCwweDU1LDB4RUUsMHhCQSwweDEwLDB4MDIsMHhCMCwweDkzLDB4RUUsMHhCMCwKKzB4QUEsMHhFRSwweEJBLDB4MDAsMHgwMiwweEVDLDB4M0MsMHg1NSwweDc1LDB4MDgsMHhCQSwweDEwLDB4MDIsMHhFQywweDNDLDB4QUEsCisweDc0LDB4MDMsMHhFOCwweDJGLDB4RjYsMHhDMywweEJBLDB4MDQsMHgwMiwweEIwLDB4MUEsMHhFRSwweEIwLDB4MjAsMHhFRSwweEIwLAorMHgzMCwweEVFLDB4QjAsMHg0MCwweEVFLDB4QjAsMHg4MCwweEVFLDB4QkEsMHgwMCwweDAyLDB4QjAsMHgxMywweEVFLDB4QjAsMHgwNywKKzB4RUUsMHhCQSwweDA4LDB4MDIsMHhCMCwweDgwLDB4RUUsMHhCQSwweDAyLDB4MDIsMHhCMCwweEJCLDB4RUUsMHhCQSwweDA0LDB4MDIsCisweEIwLDB4MDUsMHhFRSwweEMzLDB4QzYsMHgwNiwweENBLDB4MTMsMHgwMSwweEM3LDB4MDYsMHhGOCwweDc5LDB4MDAsMHgwMCwweEM2LAorMHgwNiwweEY2LDB4NzksMHgwMSwweEM3LDB4MDYsMHhEMCwweDc5LDB4MDAsMHgwMCwweEM3LDB4MDYsMHhEMiwweDc5LDB4MDAsMHgwMCwKKzB4QzcsMHgwNiwweEQ0LDB4NzksMHgwMCwweDAwLDB4QzcsMHgwNiwweEZBLDB4NzksMHgwMCwweDAwLDB4QzcsMHgwNiwweEZDLDB4NzksCisweDAwLDB4MDAsMHhDNywweDA2LDB4RkUsMHg3OSwweDAwLDB4MDAsMHhDNywweDA2LDB4MDAsMHg3QSwweDAwLDB4MDAsMHhDNywweDA2LAorMHgwMiwweDdBLDB4Q0UsMHg1OSwweDhDLDB4MEUsMHgwNCwweDdBLDB4QzcsMHgwNiwweDA2LDB4N0EsMHgwMCwweDAwLDB4QzcsMHgwNiwKKzB4MjcsMHg3QSwweDAwLDB4MDAsMHhDNiwweDA2LDB4MjksMHg3QSwweDAwLDB4QzYsMHgwNiwweDJBLDB4N0EsMHgwMCwweEMzLDB4OTAsCisweEJFLDB4MjIsMHg0RCwweEU4LDB4QzgsMHgwQSwweEU4LDB4M0YsMHgwMCwweDJDLDB4MzEsMHgzQywweDAxLDB4NzcsMHhGNywweEU4LAorMHg4MSwweDA5LDB4OEIsMHgzNiwweDBDLDB4N0EsMHhFOCwweEI1LDB4MEEsMHhCRSwweDZBLDB4NEQsMHhFOCwweEFGLDB4MEEsMHgwRSwKKzB4NTgsMHhFOCwweEY4LDB4MEEsMHhCRSwweDdBLDB4NEQsMHhFOCwweEE0LDB4MEEsMHhDMywweDkwLDB4NjAsMHhEMSwweEUzLDB4ODMsCisweEZCLDB4MTgsMHg3MywweDExLDB4MUUsMHhCQSwweDAwLDB4MDAsMHg4RSwweERBLDB4MkUsMHhGRiwweDk3LDB4QjcsMHg1MSwweDhCLAorMHhFQywweDg5LDB4NDYsMHgxMCwweDFGLDB4NjEsMHhDRiwweDkwLDB4RTgsMHg0RiwweDBCLDB4MEEsMHhDMCwweDc1LDB4MDUsMHhFOCwKKzB4NTYsMHgwQiwweEVCLDB4RjQsMHhDMywweDkwLDB4ODMsMHgzRSwweEY4LDB4NzksMHgwMSwweDc0LDB4MTYsMHhCRSwweEQ3LDB4NzksCisweEU4LDB4MzEsMHgwQSwweDhCLDB4RDAsMHhBQywweDNDLDB4MkMsMHg3NCwweDA0LDB4M0MsMHgyMCwweDc1LDB4MDUsMHhFOCwweDIzLAorMHgwQSwweEVFLDB4QzMsMHhFOSwweEQyLDB4RkUsMHg4MywweDNFLDB4RjgsMHg3OSwweDAxLDB4NzQsMHhGNiwweEJFLDB4RDcsMHg3OSwKKzB4RTgsMHgxMSwweDBBLDB4OEIsMHhEMCwweEFDLDB4M0MsMHgyQywweDc0LDB4MDgsMHgzQywweDIwLDB4NzQsMHgwNCwweEU5LDB4QjcsCisweEZFLDB4OTAsMHhFOCwweEZGLDB4MDksMHhFRiwweEMzLDB4OTAsMHg4QiwweDE2LDB4MDYsMHg3QSwweDgzLDB4M0UsMHhGOCwweDc5LAorMHgwMSwweDc0LDB4MEIsMHhCRSwweEQ3LDB4NzksMHhFOCwweEVCLDB4MDksMHg4QiwweEQwLDB4QTMsMHgwNiwweDdBLDB4QjAsMHgyMCwKKzB4RTgsMHg1NywweDBCLDB4OEIsMHgxNiwweDA2LDB4N0EsMHhFQywweEU4LDB4NkYsMHgwQiwweEMzLDB4OEIsMHgxNiwweDA2LDB4N0EsCisweDgzLDB4M0UsMHhGOCwweDc5LDB4MDEsMHg3NCwweDBCLDB4QkUsMHhENywweDc5LDB4RTgsMHhDNywweDA5LDB4OEIsMHhEMCwweEEzLAorMHgwNiwweDdBLDB4QjAsMHgyMCwweEU4LDB4MzMsMHgwQiwweDhCLDB4MTYsMHgwNiwweDdBLDB4RUQsMHhFOCwweDY3LDB4MEIsMHhDMywKKzB4RkEsMHhDNiwweDA2LDB4RjYsMHg3OSwweDAwLDB4QzMsMHg5MCwweEM2LDB4MDYsMHhGNiwweDc5LDB4MDEsMHhGQiwweEMzLDB4OTAsCisweDA2LDB4RTgsMHg1OCwweDA5LDB4QjAsMHgyMCwweEU4LDB4MTEsMHgwQiwweDI2LDB4OEIsMHgwNSwweEU4LDB4NDcsMHgwQiwweEIwLAorMHgwOCwweEU4LDB4MDYsMHgwQiwweEU4LDB4MDMsMHgwQiwweEU4LDB4MDAsMHgwQiwweEU4LDB4RkQsMHgwQSwweEI4LDB4MDEsMHgwMCwKKzB4RTgsMHhDRiwweEY0LDB4QkEsMHgwMiwweDAyLDB4RUMsMHgyNCwweDAxLDB4NzUsMHgwMiwweEVCLDB4REMsMHhCQSwweDA2LDB4MDIsCisweEVDLDB4MDcsMHhDMywweDkwLDB4QzcsMHgwNiwweDA4LDB4N0EsMHgxMCwweDAwLDB4RUIsMHgwNiwweEM3LDB4MDYsMHgwOCwweDdBLAorMHgwMSwweDAwLDB4MDYsMHg4RSwweDA2LDB4RkMsMHg3OSwweDhCLDB4M0UsMHhGQSwweDc5LDB4RTgsMHgwRSwweDA5LDB4RTgsMHgwQiwKKzB4MDAsMHg4OSwweDNFLDB4RkEsMHg3OSwweDhDLDB4MDYsMHhGQywweDc5LDB4MDcsMHhDMywweDkwLDB4QkUsMHhCMiwweDRELDB4RTgsCisweDdDLDB4MDksMHg4QiwweDE2LDB4MDgsMHg3QSwweDUyLDB4RTgsMHgyQSwweDA5LDB4RTgsMHgwRiwweDBBLDB4RTgsMHgwQywweDBBLAorMHgzMywweERCLDB4QjksMHgxMCwweDAwLDB4OTAsMHgyNiwweDhBLDB4MDEsMHhFOCwweEJDLDB4MDksMHhFOCwweEZELDB4MDksMHg0MywKKzB4RTIsMHhGNCwweEU4LDB4RjcsMHgwOSwweEU4LDB4RjQsMHgwOSwweDMzLDB4REIsMHhCOSwweDEwLDB4MDAsMHg5MCwweDI2LDB4OEEsCisweDAxLDB4M0MsMHgyMCwweDcyLDB4MDUsMHgzQywweDdFLDB4NzYsMHgwMywweDkwLDB4QjAsMHgyRSwweEU4LDB4RTMsMHgwOSwweDQzLAorMHhFMiwweEVDLDB4QkUsMHhCMiwweDRELDB4RTgsMHgzNiwweDA5LDB4ODMsMHhDNywweDEwLDB4NUEsMHg0QSwweDc1LDB4QjcsMHhDMywKKzB4MDYsMHg4RSwweDA2LDB4MDAsMHg3QSwweDhCLDB4M0UsMHhGRSwweDc5LDB4RTgsMHhBMCwweDA4LDB4ODksMHgzRSwweEZFLDB4NzksCisweDhDLDB4MDYsMHgwMCwweDdBLDB4NTcsMHg4QiwweDM2LDB4MEUsMHg3QSwweEU4LDB4MTIsMHgwOSwweEM3LDB4MDYsMHgwOCwweDdBLAorMHgxMCwweDAwLDB4QkEsMHgwMCwweDAyLDB4RTgsMHhFOCwweDAwLDB4RTgsMHg4MSwweEZGLDB4NUYsMHhCQSwweDAwLDB4MDAsMHhFOCwKKzB4REUsMHgwMCwweEJFLDB4QjUsMHg0RCwweEU4LDB4RjYsMHgwOCwweDhDLDB4QzAsMHhFOCwweDNGLDB4MDksMHhCMCwweDNBLDB4RTgsCisweDkwLDB4MDksMHg4QiwweEM3LDB4RTgsMHgzNSwweDA5LDB4RTgsMHg3RSwweDA4LDB4RTgsMHhDMywweDAwLDB4OTAsMHhFOCwweEI3LAorMHgwOSwweEU4LDB4QTYsMHgwOSwweDBBLDB4QzAsMHg3NCwweEY2LDB4M0MsMHgwQiwweDc1LDB4MDYsMHg4MywweEVGLDB4MTAsMHhFQiwKKzB4MTksMHg5MCwweDNDLDB4MEEsMHg3NSwweDA2LDB4ODMsMHhDNywweDEwLDB4RUIsMHgwRiwweDkwLDB4M0MsMHgwQywweDc1LDB4MDQsCisweDQ3LDB4RUIsMHgwNywweDkwLDB4M0MsMHgwOCwweDc1LDB4MjQsMHg0RiwweDkwLDB4OEIsMHgzNiwweEZFLDB4NzksMHg4QiwweEM3LAorMHgyQiwweEM2LDB4M0QsMHgwMCwweDAxLDB4NzIsMHhBNSwweDNELDB4MTAsMHgwMSwweDcyLDB4MDQsMHg4MywweEVFLDB4MjAsMHg5MCwKKzB4ODMsMHhDNiwweDEwLDB4ODksMHgzNiwweEZFLDB4NzksMHg1NywweDhCLDB4RkUsMHhFQiwweDgwLDB4M0MsMHgyRSwweDc1LDB4MDgsCisweEJBLDB4MDEsMHgxMywweEU4LDB4NkEsMHgwMCwweDA3LDB4QzMsMHhDNiwweDA2LDB4MEEsMHg3QSwweDAyLDB4MzIsMHhDOSwweDkwLAorMHgzQywweDMwLDB4NzIsMHg0QywweDNDLDB4MzksMHg3NiwweDBDLDB4MjQsMHg1RiwweDNDLDB4NDEsMHg3MiwweDQyLDB4M0MsMHg0NiwKKzB4NzcsMHgzRSwweDJDLDB4MDcsMHgyQywweDMwLDB4NTAsMHhFOCwweENDLDB4MDgsMHg1OCwweDAyLDB4QzgsMHhGRSwweDBFLDB4MEEsCisweDdBLDB4NzQsMHgwRiwweEMwLDB4RTEsMHgwNCwweEU4LDB4MkYsMHgwOSwweEU4LDB4MUUsMHgwOSwweDBBLDB4QzAsMHg3NCwweEY2LAorMHhFQiwweENFLDB4MjYsMHg4OCwweDBELDB4RTgsMHhFMCwweDA3LDB4OEEsMHhEMCwweEU4LDB4MjMsMHgwMCwweDhBLDB4QzEsMHgzQywKKzB4MjAsMHg3MiwweDA1LDB4M0MsMHg3RSwweDc2LDB4MDMsMHg5MCwweEIwLDB4MkUsMHhFOCwweEQ1LDB4MDgsMHhFOSwweDcwLDB4RkYsCisweEU4LDB4QzUsMHgwNywweEU4LDB4MEEsMHgwMCwweDI2LDB4OEEsMHgwNSwweEU4LDB4N0MsMHgwOCwweEU5LDB4MUQsMHhGRiwweDkwLAorMHhGNiwweDA2LDB4MjYsMHg3QSwweDAyLDB4NzUsMHgwMiwweDg2LDB4RjIsMHg1MiwweDhCLDB4MzYsMHgxQSwweDdBLDB4RTgsMHgwRCwKKzB4MDgsMHg1QSwweDUyLDB4OEEsMHhDNiwweDAyLDB4MDYsMHgyNCwweDdBLDB4RjYsMHgwNiwweDI2LDB4N0EsMHgwMSwweDc1LDB4MDYsCisweEU4LDB4OUYsMHgwOCwweEVCLDB4MEQsMHg5MCwweDMyLDB4RTQsMHhFOCwweDBELDB4MDgsMHg4QiwweDM2LDB4MUMsMHg3QSwweEU4LAorMHhFQywweDA3LDB4NUEsMHg4QSwweEMyLDB4MDIsMHgwNiwweDI1LDB4N0EsMHhGNiwweDA2LDB4MjYsMHg3QSwweDAxLDB4NzUsMHgwNiwKKzB4RTgsMHg3RiwweDA4LDB4RUIsMHgwNiwweDkwLDB4MzIsMHhFNCwweEU4LDB4RUQsMHgwNywweDhCLDB4MzYsMHgxRSwweDdBLDB4RTgsCisweENDLDB4MDcsMHhDMywweDkwLDB4MDYsMHg4RSwweDA2LDB4MDQsMHg3QSwweDhCLDB4M0UsMHgwMiwweDdBLDB4RTgsMHgzQywweDA3LAorMHg4OSwweDNFLDB4MDIsMHg3QSwweDhDLDB4MDYsMHgwNCwweDdBLDB4MDcsMHhGRiwweDFFLDB4MDIsMHg3QSwweEMzLDB4QkUsMHg5NywKKzB4NEQsMHhFOCwweEFBLDB4MDcsMHhDQiwweDkwLDB4MDYsMHg1NywweEJFLDB4RDcsMHg3OSwweEU4LDB4NjYsMHgwNywweDhCLDB4RDgsCisweEU4LDB4NjEsMHgwNywweDhCLDB4QzgsMHgyQiwweENCLDB4NzgsMHgxMSwweDhFLDB4QzMsMHhCRiwweDAwLDB4MDAsMHhCOCwweEZGLAorMHhGRiwweDUxLDB4QjksMHgwOCwweDAwLDB4RjMsMHhBQiwweDU5LDB4RTIsMHhGNywweDVGLDB4MDcsMHhDMywweDkwLDB4MDYsMHhCRSwKKzB4RDcsMHg3OSwweEU4LDB4M0YsMHgwNywweDhCLDB4RDgsMHhEMSwweEUzLDB4MkUsMHg4QiwweDlGLDB4NDQsMHgwMCwweEJFLDB4MjYsCisweDUyLDB4RTgsMHhGMSwweDA4LDB4OEIsMHhDMywweEU4LDB4REQsMHgwOCwweEI4LDB4MDEsMHgwMCwweEU4LDB4NzMsMHhGMiwweEU4LAorMHhFMCwweDA4LDB4QkUsMHgyRiwweDUyLDB4RTgsMHhERCwweDA4LDB4OEIsMHg0NywweDE4LDB4RTgsMHhDOCwweDA4LDB4QkUsMHg3NywKKzB4NTIsMHhFOCwweEQxLDB4MDgsMHg4QiwweDQ3LDB4MjYsMHhFOCwweEJDLDB4MDgsMHhCRSwweDUzLDB4NTIsMHhFOCwweEM1LDB4MDgsCisweDhCLDB4NDcsMHgxRSwweEU4LDB4QjAsMHgwOCwweEJFLDB4NUMsMHg1MiwweEU4LDB4QjksMHgwOCwweDhCLDB4NDcsMHgyMCwweEU4LAorMHhBNCwweDA4LDB4QkUsMHg2RSwweDUyLDB4RTgsMHhBRCwweDA4LDB4OEIsMHg0NywweDI0LDB4RTgsMHg5OCwweDA4LDB4QkUsMHg4MCwKKzB4NTIsMHhFOCwweEExLDB4MDgsMHg4QiwweDQ3LDB4MkEsMHhFOCwweDhDLDB4MDgsMHhFOCwweDk1LDB4MDgsMHhCRSwweDM4LDB4NTIsCisweEU4LDB4OTIsMHgwOCwweDhCLDB4MDcsMHhFOCwweDdFLDB4MDgsMHhCRSwweDQxLDB4NTIsMHhFOCwweDg3LDB4MDgsMHg4QiwweDQ3LAorMHgxQSwweEU4LDB4NzIsMHgwOCwweEJFLDB4NEEsMHg1MiwweEU4LDB4N0IsMHgwOCwweDhCLDB4NDcsMHgxQywweEU4LDB4NjYsMHgwOCwKKzB4QkUsMHg2NSwweDUyLDB4RTgsMHg2RiwweDA4LDB4OEIsMHg0NywweDIyLDB4RTgsMHg1QSwweDA4LDB4RTgsMHg2MywweDA4LDB4QkUsCisweEQxLDB4NTIsMHhFOCwweDYwLDB4MDgsMHg4QiwweDQ3LDB4MzgsMHhFOCwweDRCLDB4MDgsMHhCRSwweEFELDB4NTIsMHhFOCwweDU0LAorMHgwOCwweDhCLDB4NDcsMHgzMCwweEU4LDB4M0YsMHgwOCwweEJFLDB4QjYsMHg1MiwweEU4LDB4NDgsMHgwOCwweDhCLDB4NDcsMHgzMiwKKzB4RTgsMHgzMywweDA4LDB4QkUsMHhBNCwweDUyLDB4RTgsMHgzQywweDA4LDB4OEIsMHg0NywweDJFLDB4RTgsMHgyNywweDA4LDB4QkUsCisweEJGLDB4NTIsMHhFOCwweDMwLDB4MDgsMHg4QiwweDQ3LDB4MzQsMHhFOCwweDFCLDB4MDgsMHhFOCwweDI0LDB4MDgsMHhCRSwweDg5LAorMHg1MiwweEU4LDB4MjEsMHgwOCwweDhCLDB4NDcsMHgwNCwweEU4LDB4MEMsMHgwOCwweEJFLDB4OTIsMHg1MiwweEU4LDB4MTUsMHgwOCwKKzB4OEIsMHg0NywweDE0LDB4RTgsMHgwMCwweDA4LDB4QkUsMHg5QiwweDUyLDB4RTgsMHgwOSwweDA4LDB4OEIsMHg0NywweDJDLDB4RTgsCisweEY0LDB4MDcsMHhCRSwweEM4LDB4NTIsMHhFOCwweEZELDB4MDcsMHg4QiwweDQ3LDB4MzYsMHhFOCwweEU4LDB4MDcsMHhCRSwweERBLAorMHg1MiwweEU4LDB4RjEsMHgwNywweDhCLDB4NDcsMHgzQSwweEU4LDB4REMsMHgwNywweEJFLDB4RTMsMHg1MiwweEU4LDB4RTUsMHgwNywKKzB4OEIsMHg0NywweDNDLDB4RTgsMHhEMCwweDA3LDB4RTgsMHhEOSwweDA3LDB4QkUsMHgxOSwweDUzLDB4RTgsMHhENiwweDA3LDB4OEIsCisweDQ3LDB4NDgsMHhFOCwweEMxLDB4MDcsMHhCRSwweEZFLDB4NTIsMHhFOCwweENBLDB4MDcsMHg4QiwweDQ3LDB4NDIsMHhFOCwweEI1LAorMHgwNywweEJFLDB4MDcsMHg1MywweEU4LDB4QkUsMHgwNywweDhCLDB4NDcsMHg0NCwweEU4LDB4QTksMHgwNywweEJFLDB4N0MsMHg1MywKKzB4RTgsMHhCMiwweDA3LDB4OEIsMHg0NywweDRDLDB4RTgsMHg5RCwweDA3LDB4QkUsMHg4NSwweDUzLDB4RTgsMHhBNiwweDA3LDB4OEIsCisweDQ3LDB4NEUsMHhFOCwweDkxLDB4MDcsMHhCRSwweDhFLDB4NTMsMHhFOCwweDlBLDB4MDcsMHg4QiwweDQ3LDB4NTAsMHhFOCwweDg1LAorMHgwNywweEU4LDB4OEUsMHgwNywweEJFLDB4MjIsMHg1MywweEU4LDB4OEIsMHgwNywweDhCLDB4NDcsMHg0QSwweEU4LDB4NzYsMHgwNywKKzB4QkUsMHhFQywweDUyLDB4RTgsMHg3RiwweDA3LDB4OEIsMHg0NywweDA4LDB4RTgsMHg2QSwweDA3LDB4QkUsMHhGNSwweDUyLDB4RTgsCisweDczLDB4MDcsMHg4QiwweDQ3LDB4NDAsMHhFOCwweDVFLDB4MDcsMHhCRSwweDEwLDB4NTMsMHhFOCwweDY3LDB4MDcsMHg4QiwweDQ3LAorMHg0NiwweEU4LDB4NTIsMHgwNywweEU4LDB4NUIsMHgwNywweEJFLDB4NkEsMHg1MywweEU4LDB4NTgsMHgwNywweDhCLDB4NDcsMHg3QSwKKzB4RTgsMHg0MywweDA3LDB4QkUsMHgzRCwweDUzLDB4RTgsMHg0QywweDA3LDB4OEIsMHg0NywweDcwLDB4RTgsMHgzNywweDA3LDB4QkUsCisweDQ2LDB4NTMsMHhFOCwweDQwLDB4MDcsMHg4QiwweDQ3LDB4NzIsMHhFOCwweDJCLDB4MDcsMHhCRSwweDRGLDB4NTMsMHhFOCwweDM0LAorMHgwNywweDhCLDB4NDcsMHg3NCwweEU4LDB4MUYsMHgwNywweEU4LDB4MjgsMHgwNywweEJFLDB4MkIsMHg1MywweEU4LDB4MjUsMHgwNywKKzB4OEIsMHg0NywweDBDLDB4RTgsMHgxMCwweDA3LDB4QkUsMHgzNCwweDUzLDB4RTgsMHgxOSwweDA3LDB4OEIsMHg0NywweDEwLDB4RTgsCisweDA0LDB4MDcsMHhCRSwweDU4LDB4NTMsMHhFOCwweDBELDB4MDcsMHg4QiwweDQ3LDB4NzYsMHhFOCwweEY4LDB4MDYsMHhCRSwweDYxLAorMHg1MywweEU4LDB4MDEsMHgwNywweDhCLDB4NDcsMHg3OCwweEU4LDB4RUMsMHgwNiwweEJFLDB4NzMsMHg1MywweEU4LDB4RjUsMHgwNiwKKzB4OEIsMHg0NywweDNFLDB4RTgsMHhFMCwweDA2LDB4RTgsMHhFOSwweDA2LDB4QkUsMHg5NywweDUzLDB4RTgsMHhFNiwweDA2LDB4OEIsCisweDQ3LDB4NTIsMHhFOCwweEQxLDB4MDYsMHhCRSwweEEwLDB4NTMsMHhFOCwweERBLDB4MDYsMHg4QiwweDQ3LDB4NTQsMHhFOCwweEM1LAorMHgwNiwweEJFLDB4QTksMHg1MywweEU4LDB4Q0UsMHgwNiwweDhCLDB4NDcsMHg1NiwweEU4LDB4QjksMHgwNiwweEJFLDB4QjIsMHg1MywKKzB4RTgsMHhDMiwweDA2LDB4OEIsMHg0NywweDU4LDB4RTgsMHhBRCwweDA2LDB4QkUsMHhCQiwweDUzLDB4RTgsMHhCNiwweDA2LDB4OEIsCisweDQ3LDB4NUEsMHhFOCwweEExLDB4MDYsMHhCRSwweEM0LDB4NTMsMHhFOCwweEFBLDB4MDYsMHg4QiwweDQ3LDB4NUMsMHhFOCwweDk1LAorMHgwNiwweEU4LDB4OUUsMHgwNiwweEJFLDB4Q0QsMHg1MywweEU4LDB4OUIsMHgwNiwweDhCLDB4NDcsMHg1RSwweEU4LDB4ODYsMHgwNiwKKzB4QkUsMHhENiwweDUzLDB4RTgsMHg4RiwweDA2LDB4OEIsMHg0NywweDYwLDB4RTgsMHg3QSwweDA2LDB4QkUsMHhERiwweDUzLDB4RTgsCisweDgzLDB4MDYsMHg4QiwweDQ3LDB4NjIsMHhFOCwweDZFLDB4MDYsMHhCRSwweEU4LDB4NTMsMHhFOCwweDc3LDB4MDYsMHg4QiwweDQ3LAorMHg3QywweEU4LDB4NjIsMHgwNiwweEJFLDB4RjEsMHg1MywweEU4LDB4NkIsMHgwNiwweDhCLDB4NDcsMHg3RSwweEU4LDB4NTYsMHgwNiwKKzB4QkUsMHhGQSwweDUzLDB4RTgsMHg1RiwweDA2LDB4OEIsMHg4NywweDgwLDB4MDAsMHhFOCwweDQ5LDB4MDYsMHhFOCwweDUyLDB4MDYsCisweEJFLDB4NDIsMHg1NCwweEU4LDB4NEYsMHgwNiwweDhCLDB4ODcsMHg5RSwweDAwLDB4RTgsMHgzOSwweDA2LDB4QkUsMHgwMywweDU0LAorMHhFOCwweDQyLDB4MDYsMHg4QiwweDQ3LDB4NjQsMHhFOCwweDJELDB4MDYsMHhCRSwweDBDLDB4NTQsMHhFOCwweDM2LDB4MDYsMHg4QiwKKzB4NDcsMHg2RSwweEU4LDB4MjEsMHgwNiwweEJFLDB4MTUsMHg1NCwweEU4LDB4MkEsMHgwNiwweDhCLDB4ODcsMHg4RSwweDAwLDB4RTgsCisweDE0LDB4MDYsMHhCRSwweDFFLDB4NTQsMHhFOCwweDFELDB4MDYsMHg4QiwweDg3LDB4OTAsMHgwMCwweEU4LDB4MDcsMHgwNiwweEJFLAorMHgyNywweDU0LDB4RTgsMHgxMCwweDA2LDB4OEIsMHg4NywweDkyLDB4MDAsMHhFOCwweEZBLDB4MDUsMHhFOCwweDAzLDB4MDYsMHhCRSwKKzB4MzAsMHg1NCwweEU4LDB4MDAsMHgwNiwweDhCLDB4ODcsMHg5NCwweDAwLDB4RTgsMHhFQSwweDA1LDB4QkUsMHgzOSwweDU0LDB4RTgsCisweEYzLDB4MDUsMHg4QiwweDg3LDB4OTYsMHgwMCwweEU4LDB4REQsMHgwNSwweEJFLDB4NkYsMHg1NCwweEU4LDB4RTYsMHgwNSwweDhCLAorMHg4NywweDk4LDB4MDAsMHhFOCwweEQwLDB4MDUsMHhCRSwweDVELDB4NTQsMHhFOCwweEQ5LDB4MDUsMHg4QSwweDg3LDB4QTAsMHgwMCwKKzB4RTgsMHhBNywweDA1LDB4QkUsMHg1NCwweDU0LDB4RTgsMHhDQywweDA1LDB4OEEsMHg0NywweDI4LDB4RTgsMHg5QiwweDA1LDB4QkUsCisweDY2LDB4NTQsMHhFOCwweEMwLDB4MDUsMHg4QSwweDg3LDB4QTEsMHgwMCwweEU4LDB4OEUsMHgwNSwweEU4LDB4QjMsMHgwNSwweEJFLAorMHg3OCwweDU0LDB4RTgsMHhCMCwweDA1LDB4OEEsMHg4NywweEEyLDB4MDAsMHhFOCwweDdFLDB4MDUsMHhCRSwweDgxLDB4NTQsMHhFOCwKKzB4QTMsMHgwNSwweDhBLDB4ODcsMHhBMywweDAwLDB4RTgsMHg3MSwweDA1LDB4QkUsMHg4QSwweDU0LDB4RTgsMHg5NiwweDA1LDB4OEEsCisweDg3LDB4QTQsMHgwMCwweEU4LDB4NjQsMHgwNSwweEJFLDB4OTMsMHg1NCwweEU4LDB4ODksMHgwNSwweDhBLDB4ODcsMHhBNSwweDAwLAorMHhFOCwweDU3LDB4MDUsMHhCRSwweDlDLDB4NTQsMHhFOCwweDdDLDB4MDUsMHg4QSwweDg3LDB4QTYsMHgwMCwweEU4LDB4NEEsMHgwNSwKKzB4QkUsMHhBNSwweDU0LDB4RTgsMHg2RiwweDA1LDB4OEEsMHg4NywweEE3LDB4MDAsMHhFOCwweDNELDB4MDUsMHhCRSwweEFFLDB4NTQsCisweEU4LDB4NjIsMHgwNSwweDhBLDB4ODcsMHhBOCwweDAwLDB4RTgsMHgzMCwweDA1LDB4RTgsMHg1NSwweDA1LDB4QkUsMHhCNywweDU0LAorMHhFOCwweDUyLDB4MDUsMHg4QSwweDg3LDB4QTksMHgwMCwweEU4LDB4MjAsMHgwNSwweEJFLDB4QzAsMHg1NCwweEU4LDB4NDUsMHgwNSwKKzB4OEEsMHg4NywweEFBLDB4MDAsMHhFOCwweDEzLDB4MDUsMHhCRSwweEM5LDB4NTQsMHhFOCwweDM4LDB4MDUsMHg4QSwweDg3LDB4QUIsCisweDAwLDB4RTgsMHgwNiwweDA1LDB4QkUsMHhEMiwweDU0LDB4RTgsMHgyQiwweDA1LDB4OEEsMHg4NywweEFELDB4MDAsMHhFOCwweEY5LAorMHgwNCwweEJFLDB4REIsMHg1NCwweEU4LDB4MUUsMHgwNSwweDhBLDB4ODcsMHhBRSwweDAwLDB4RTgsMHhFQywweDA0LDB4QkUsMHhFNCwKKzB4NTQsMHhFOCwweDExLDB4MDUsMHg4QSwweDg3LDB4QUYsMHgwMCwweEU4LDB4REYsMHgwNCwweEJFLDB4RUQsMHg1NCwweEU4LDB4MDQsCisweDA1LDB4OEEsMHg4NywweEIwLDB4MDAsMHhFOCwweEQyLDB4MDQsMHhFOCwweEY3LDB4MDQsMHhCRSwweEY2LDB4NTQsMHhFOCwweEY0LAorMHgwNCwweDhBLDB4ODcsMHhCMSwweDAwLDB4RTgsMHhDMiwweDA0LDB4QkUsMHhGRiwweDU0LDB4RTgsMHhFNywweDA0LDB4OEEsMHg4NywKKzB4QjIsMHgwMCwweEU4LDB4QjUsMHgwNCwweEJFLDB4MDgsMHg1NSwweEU4LDB4REEsMHgwNCwweDhBLDB4ODcsMHhCMywweDAwLDB4RTgsCisweEE4LDB4MDQsMHhCRSwweDExLDB4NTUsMHhFOCwweENELDB4MDQsMHg4QSwweDg3LDB4QkIsMHgwMCwweEU4LDB4OUIsMHgwNCwweEU4LAorMHhDMCwweDA0LDB4QkUsMHgxQSwweDU1LDB4RTgsMHhCRCwweDA0LDB4OEEsMHg4NywweEJDLDB4MDAsMHhFOCwweDhCLDB4MDQsMHhCRSwKKzB4MjMsMHg1NSwweEU4LDB4QjAsMHgwNCwweDhBLDB4ODcsMHhCRSwweDAwLDB4RTgsMHg3RSwweDA0LDB4QkUsMHgyQywweDU1LDB4RTgsCisweEEzLDB4MDQsMHg4QSwweDg3LDB4QkYsMHgwMCwweEU4LDB4NzEsMHgwNCwweEU4LDB4OTYsMHgwNCwweDA3LDB4QzMsMHg2MCwweDA2LAorMHgxRSwweDE2LDB4OEIsMHhFQywweEZGLDB4NEUsMHgxNiwweEY3LDB4NDYsMHgxQSwweDAwLDB4MDIsMHg3NCwweDAxLDB4RkIsMHhCOCwKKzB4MDAsMHgwMCwweDhFLDB4RDgsMHg4RSwweEMwLDB4ODksMHgyRSwweDJELDB4N0EsMHhFOCwweENCLDB4MDAsMHg4MSwweDY2LDB4MUEsCisweEZGLDB4RkUsMHhDNiwweDA2LDB4MkEsMHg3QSwweDAwLDB4RTgsMHhEOCwweDAwLDB4QjgsMHgwMCwweDVGLDB4QTMsMHgyQiwweDdBLAorMHhFOCwweDVELDB4MDAsMHg4MCwweDNFLDB4MkEsMHg3QSwweDAwLDB4NzQsMHgwQSwweDgxLDB4NEUsMHgxQSwweDAwLDB4MDEsMHhDNiwKKzB4MDYsMHgyQSwweDdBLDB4MDAsMHgxNywweDFGLDB4MDcsMHg2MSwweENGLDB4OTAsMHg2MCwweDA2LDB4MUUsMHgxNiwweDhCLDB4RUMsCisweEY3LDB4NDYsMHgxQSwweDAwLDB4MDIsMHg3NCwweDAxLDB4RkIsMHhCOCwweDAwLDB4MDAsMHg4RSwweEQ4LDB4OEUsMHhDMCwweDg5LAorMHgyRSwweDJELDB4N0EsMHg4MSwweDY2LDB4MUEsMHhGRiwweEZFLDB4QzYsMHgwNiwweDJBLDB4N0EsMHgwMCwweEU4LDB4OTIsMHgwMCwKKzB4QjgsMHgwMCwweDVGLDB4QTMsMHgyQiwweDdBLDB4RTgsMHgxNywweDAwLDB4ODAsMHgzRSwweDJBLDB4N0EsMHgwMCwweDc0LDB4MEEsCisweDgxLDB4NEUsMHgxQSwweDAwLDB4MDEsMHhDNiwweDA2LDB4MkEsMHg3QSwweDAwLDB4MTcsMHgxRiwweDA3LDB4NjEsMHhDRiwweDkwLAorMHhCOCwweEYwLDB4MDAsMHhFOCwweDhDLDB4RUQsMHhGRiwweDI2LDB4MkIsMHg3QSwweEMzLDB4OTAsMHgwNiwweDUzLDB4NTYsMHg4MCwKKzB4M0UsMHgyOSwweDdBLDB4MDAsMHg3NCwweDAzLDB4RTgsMHgzRiwweDAwLDB4QkUsMHhENywweDc5LDB4RTgsMHgyNSwweDAyLDB4OEIsCisweEQ4LDB4QTMsMHgyNywweDdBLDB4MkUsMHg4QSwweDA3LDB4QTIsMHgyOSwweDdBLDB4QjAsMHhDQywweDJFLDB4ODgsMHgwNywweDVFLAorMHg1QiwweDA3LDB4QzMsMHhDNiwweDA2LDB4MkEsMHg3QSwweDAwLDB4QjgsMHgwQSwweDVGLDB4QTMsMHgyQiwweDdBLDB4QzMsMHg5MCwKKzB4OEIsMHgyRSwweDJELDB4N0EsMHhFOCwweDJCLDB4MDAsMHhDMywweEM2LDB4MDYsMHgyQSwweDdBLDB4MDEsMHhFOCwweDA4LDB4MDAsCisweEI4LDB4MEEsMHg1RiwweEEzLDB4MkIsMHg3QSwweEMzLDB4OTAsMHg1NywweDgwLDB4M0UsMHgyOSwweDdBLDB4MDAsMHg3NCwweDBGLAorMHg4QiwweDNFLDB4MjcsMHg3QSwweEEwLDB4MjksMHg3QSwweDJFLDB4ODgsMHgwNSwweEM2LDB4MDYsMHgyOSwweDdBLDB4MDAsMHg1RiwKKzB4QzMsMHg5MCwweEJFLDB4QjIsMHg0RCwweEU4LDB4MDYsMHgwMiwweEJFLDB4RDgsMHg1MSwweEU4LDB4MDAsMHgwMiwweEZGLDB4NzYsCisweDE0LDB4NTgsMHhFOCwweDQ3LDB4MDIsMHhCRSwweERFLDB4NTEsMHhFOCwweEYzLDB4MDEsMHhGRiwweDc2LDB4MEUsMHg1OCwweEU4LAorMHgzQSwweDAyLDB4QkUsMHhFNCwweDUxLDB4RTgsMHhFNiwweDAxLDB4RkYsMHg3NiwweDEyLDB4NTgsMHhFOCwweDJELDB4MDIsMHhCRSwKKzB4RUEsMHg1MSwweEU4LDB4RDksMHgwMSwweEZGLDB4NzYsMHgxMCwweDU4LDB4RTgsMHgyMCwweDAyLDB4QkUsMHgxNCwweDUyLDB4RTgsCisweENDLDB4MDEsMHhGRiwweDc2LDB4MEEsMHg1OCwweEU4LDB4MTMsMHgwMiwweEJFLDB4MUEsMHg1MiwweEU4LDB4QkYsMHgwMSwweEZGLAorMHg3NiwweDBDLDB4NTgsMHhFOCwweDA2LDB4MDIsMHhCRSwweENGLDB4NTEsMHhFOCwweEIyLDB4MDEsMHhGRiwweDc2LDB4MUEsMHg1OCwKKzB4RTgsMHhGOSwweDAxLDB4QkUsMHhCMiwweDRELDB4RTgsMHhBNSwweDAxLDB4QkUsMHhGMCwweDUxLDB4RTgsMHg5RiwweDAxLDB4RkYsCisweDc2LDB4MTgsMHg1OCwweEU4LDB4RTYsMHgwMSwweEJFLDB4RjYsMHg1MSwweEU4LDB4OTIsMHgwMSwweEZGLDB4NzYsMHgwMiwweDU4LAorMHhFOCwweEQ5LDB4MDEsMHhCRSwweEZDLDB4NTEsMHhFOCwweDg1LDB4MDEsMHhGRiwweDc2LDB4MDQsMHg1OCwweEU4LDB4Q0MsMHgwMSwKKzB4QkUsMHgwMiwweDUyLDB4RTgsMHg3OCwweDAxLDB4RkYsMHg3NiwweDAwLDB4NTgsMHhFOCwweEJGLDB4MDEsMHhCRSwweDA4LDB4NTIsCisweEU4LDB4NkIsMHgwMSwweEZGLDB4NzYsMHgwNiwweDU4LDB4RTgsMHhCMiwweDAxLDB4QkUsMHgwRSwweDUyLDB4RTgsMHg1RSwweDAxLAorMHhGRiwweDc2LDB4MDgsMHg1OCwweEU4LDB4QTUsMHgwMSwweEJFLDB4MjAsMHg1MiwweEU4LDB4NTEsMHgwMSwweEZGLDB4NzYsMHgxNiwKKzB4NTgsMHhFOCwweDk4LDB4MDEsMHhCRSwweDg5LDB4NEQsMHhFOCwweDQ0LDB4MDEsMHhDMywweDkwLDB4QkUsMHhDOSwweDRELDB4RTgsCisweDNDLDB4MDEsMHhDMywweDNDLDB4MDAsMHg3NCwweDA1LDB4M0MsMHgwMSwweDc0LDB4NTksMHhDMywweEM3LDB4MDYsMHgwQywweDdBLAorMHhDRCwweDUwLDB4QzcsMHgwNiwweDBFLDB4N0EsMHhGMCwweDUwLDB4QzcsMHgwNiwweDEwLDB4N0EsMHhFOCwweDUwLDB4QzcsMHgwNiwKKzB4MTIsMHg3QSwweEVDLDB4NTAsMHhDNywweDA2LDB4MTQsMHg3QSwweEY0LDB4NTAsMHhDNywweDA2LDB4MTYsMHg3QSwweEZCLDB4NTAsCisweEM3LDB4MDYsMHgxOCwweDdBLDB4MDMsMHg1MSwweEM3LDB4MDYsMHgxQSwweDdBLDB4MEIsMHg1MSwweEM3LDB4MDYsMHgxQywweDdBLAorMHgwRSwweDUxLDB4QzcsMHgwNiwweDFFLDB4N0EsMHgxMCwweDUxLDB4QzcsMHgwNiwweDIwLDB4N0EsMHgxMiwweDUxLDB4QzcsMHgwNiwKKzB4MjIsMHg3QSwweDE2LDB4NTEsMHhDNiwweDA2LDB4MjQsMHg3QSwweDAxLDB4QzYsMHgwNiwweDI1LDB4N0EsMHgwMSwweEM2LDB4MDYsCisweDI2LDB4N0EsMHgwMywweEMzLDB4QzcsMHgwNiwweDBDLDB4N0EsMHgxQSwweDUxLDB4QzcsMHgwNiwweDBFLDB4N0EsMHg0RCwweDUxLAorMHhDNywweDA2LDB4MTAsMHg3QSwweDQ3LDB4NTEsMHhDNywweDA2LDB4MTIsMHg3QSwweDRBLDB4NTEsMHhDNywweDA2LDB4MTQsMHg3QSwKKzB4NEYsMHg1MSwweEM3LDB4MDYsMHgxNiwweDdBLDB4NTEsMHg1MSwweEM3LDB4MDYsMHgxOCwweDdBLDB4NTUsMHg1MSwweEM3LDB4MDYsCisweDFBLDB4N0EsMHg1NiwweDUxLDB4QzcsMHgwNiwweDFDLDB4N0EsMHg1OSwweDUxLDB4QzcsMHgwNiwweDFFLDB4N0EsMHg1QSwweDUxLAorMHhDNywweDA2LDB4MjAsMHg3QSwweDVCLDB4NTEsMHhDNywweDA2LDB4MjIsMHg3QSwweDVFLDB4NTEsMHhDNiwweDA2LDB4MjQsMHg3QSwKKzB4MjAsMHhDNiwweDA2LDB4MjUsMHg3QSwweDIwLDB4QzYsMHgwNiwweDI2LDB4N0EsMHgwMiwweEMzLDB4QTEsMHhGOCwweDc5LDB4NDgsCisweDc0LDB4MTQsMHhCRSwweEQ3LDB4NzksMHhFOCwweDNDLDB4MDAsMHg4QiwweEY4LDB4QUMsMHgzQywweDNBLDB4NzUsMHgwNywweDhFLAorMHhDNywweEU4LDB4MzAsMHgwMCwweDhCLDB4RjgsMHhDMywweDkwLDB4OEIsMHhDNywweDJCLDB4MDYsMHhGRSwweDc5LDB4OEEsMHhGMCwKKzB4MjQsMHgwRiwweDhBLDB4RDAsMHgwMiwweEQwLDB4MDIsMHhEMCwweDgwLDB4QzIsMHgwQiwweEMwLDB4RUUsMHgwNCwweDgwLDB4QzYsCisweDAzLDB4MDQsMHgzRCwweEMzLDB4OEMsMHhDMCwweEU4LDB4OTMsMHgwMCwweEIwLDB4M0EsMHhFOCwweEU0LDB4MDAsMHg4QiwweEM3LAorMHhFOCwweDg5LDB4MDAsMHhDMywweDUxLDB4MzMsMHhDOSwweDkwLDB4QUMsMHgzQywweDIwLDB4NzQsMHhGQiwweDkwLDB4MEEsMHhDMCwKKzB4NzQsMHgyNiwweDJDLDB4MzAsMHg3MiwweDIyLDB4M0MsMHgwOSwweDc2LDB4MTQsMHgzQywweDExLDB4NzIsMHgxQSwweDJDLDB4MDcsCisweDNDLDB4MEYsMHg3NiwweDBBLDB4M0MsMHgyQSwweDcyLDB4MTAsMHgyQywweDIwLDB4M0MsMHgwRiwweDc3LDB4MEEsMHg5OCwweEMxLAorMHhFMSwweDA0LDB4MDMsMHhDOCwweEFDLDB4RUIsMHhENywweDkwLDB4NEUsMHg4QiwweEMxLDB4NTksMHhDMywweDkwLDB4MDYsMHg4QywKKzB4QzgsMHg4RSwweEMwLDB4RTgsMHgwMiwweDAwLDB4MDcsMHhDMywweDI2LDB4OEEsMHgwNCwweDQ2LDB4MEEsMHhDMCwweDc0LDB4MDYsCisweEU4LDB4OEYsMHgwMCwweEVCLDB4RjMsMHg5MCwweEMzLDB4OTAsMHgwQiwweEMwLDB4NzQsMHg3QSwweDUxLDB4MzMsMHhEMiwweEI5LAorMHhFOCwweDAzLDB4RjcsMHhGMSwweDhCLDB4Q0EsMHhFOCwweDAzLDB4MDAsMHg4QiwweEMxLDB4NTksMHhCQSwweDY0LDB4MDAsMHhGNiwKKzB4RjIsMHhFOCwweDBDLDB4MDAsMHg4QSwweEM0LDB4OTgsMHhCMiwweDBBLDB4RjYsMHhGMiwweEU4LDB4MDIsMHgwMCwweDhBLDB4QzQsCisweDUwLDB4MEEsMHhGMCwweDc0LDB4MDUsMHgwNCwweDMwLDB4RTgsMHg1OCwweDAwLDB4NTgsMHhDMywweDg2LDB4QzQsMHhFOCwweDA3LAorMHgwMCwweDg2LDB4QzQsMHhFOCwweDAyLDB4MDAsMHhDMywweDkwLDB4QzEsMHhDOCwweDA0LDB4RTgsMHgwOCwweDAwLDB4QzEsMHhDMCwKKzB4MDQsMHhFOCwweDAyLDB4MDAsMHhDMywweDkwLDB4NTMsMHg1MCwweDI0LDB4MEYsMHhCQiwweENBLDB4NjIsMHgyRSwweEQ3LDB4RTgsCisweDMwLDB4MDAsMHg1OCwweDVCLDB4QzMsMHg5MCwweDg2LDB4QzQsMHhFOCwweDA3LDB4MDAsMHg4NiwweEM0LDB4RTgsMHgwMiwweDAwLAorMHhDMywweDkwLDB4NTAsMHhCOSwweDA4LDB4MDAsMHg4QSwweEUwLDB4MzIsMHhDMCwweEQxLDB4QzAsMHgwNCwweDMwLDB4RTgsMHgxMSwKKzB4MDAsMHhFMiwweEY1LDB4NTgsMHhDMywweDkwLDB4QjAsMHgzMCwweEU4LDB4MDcsMHgwMCwweEMzLDB4QjAsMHgyMCwweEU4LDB4MDEsCisweDAwLDB4QzMsMHg1NiwweDhCLDB4MzYsMHhEMCwweDc5LDB4ODgsMHg4NCwweEQwLDB4NzcsMHg0NiwweDgxLDB4RTYsMHhGRiwweDAxLAorMHhGRiwweDA2LDB4RDQsMHg3OSwweDg5LDB4MzYsMHhEMCwweDc5LDB4ODEsMHgzRSwweEQ0LDB4NzksMHhGRSwweDAxLDB4NzUsMHgwOCwKKzB4NTYsMHhFOCwweDE0LDB4MDAsMHg1RSwweEVCLDB4RjEsMHg5MCwweDVFLDB4QzMsMHhCQSwweDAyLDB4MDIsMHhFQywweDI0LDB4MDEsCisweDc0LDB4MDQsMHhCQSwweDA2LDB4MDIsMHhFQywweEMzLDB4OTAsMHg4MCwweDNFLDB4RjYsMHg3OSwweDAwLDB4NzQsMHgwOSwweDYwLAorMHhCOCwweDAxLDB4MDAsMHhFOCwweDJDLDB4RUEsMHg2MSwweDkwLDB4QkEsMHgwMiwweDAyLDB4RUMsMHhBOCwweDA0LDB4NzQsMHgyOCwKKzB4OEIsMHgzNiwweEQyLDB4NzksMHg4MywweDNFLDB4RDQsMHg3OSwweDAwLDB4NzQsMHgxRCwweDhBLDB4ODQsMHhEMCwweDc3LDB4NDYsCisweDgxLDB4RTYsMHhGRiwweDAxLDB4ODksMHgzNiwweEQyLDB4NzksMHhGRiwweDBFLDB4RDQsMHg3OSwweEJBLDB4MDYsMHgwMiwweEVFLAorMHhCQSwweDAyLDB4MDIsMHhFQywweEE4LDB4MDQsMHg3NSwweERDLDB4QTEsMHhENCwweDc5LDB4QzMsMHg1MiwweEJBLDB4MDYsMHgwMiwKKzB4RUUsMHg1QSwweEMzLDB4OTAsMHg1MiwweDUwLDB4QkEsMHgwMiwweDAyLDB4RUMsMHhBOCwweDA0LDB4NzQsMHgwOCwweDU4LDB4NUEsCisweEU4LDB4RTksMHhGRiwweEY5LDB4QzMsMHg5MCwweDU4LDB4NUEsMHhGOCwweEMzLDB4NTIsMHg1MCwweEJBLDB4MDIsMHgwMiwweEVDLAorMHhBOCwweDA0LDB4NzQsMHhGQiwweDU4LDB4NUEsMHhFOCwweEQzLDB4RkYsMHhDMywweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKKzB4MzYsMHgzNywweDM4LDB4MzksMHg0MSwweDQyLDB4NDMsMHg0NCwweDQ1LDB4NDYsMHg1MywweDUwLDB4OEEsMHhFMCwweDgwLDB4RTQsCisweDBGLDB4QkIsMHhDQSwweDYyLDB4QzAsMHhFOCwweDA0LDB4MkUsMHhENywweEU4LDB4Q0UsMHhGRiwweDhBLDB4QzQsMHgyRSwweEQ3LAorMHhFOCwweEM3LDB4RkYsMHg1OCwweDVCLDB4QzMsMHg4NiwweEUwLDB4RTgsMHhERiwweEZGLDB4ODYsMHhFMCwweEU4LDB4REEsMHhGRiwKKzB4QzMsMHg5MCwweEJFLDB4QjIsMHg0RCwweDUwLDB4MkUsMHhBQywweDNDLDB4MDAsMHg3NCwweDA1LDB4RTgsMHhBQiwweEZGLDB4RUIsCisweEY1LDB4NTgsMHhDMywweDkwLDB4QzgsMHgwOCwweDAwLDB4MDAsMHg1NiwweDU3LDB4OEIsMHg3NiwweDA0LDB4QkYsMHgwNCwweDAwLAorMHhDNywweDQ2LDB4RkMsMHgwMCwweDAwLDB4QzcsMHg0NiwweEZBLDB4MDAsMHgwMCwweEM3LDB4NDYsMHhGOCwweDAwLDB4MDAsMHg4MywKKzB4N0UsMHgwNiwweDAwLDB4NzUsMHgwRSwweDU2LDB4RTgsMHhCNiwweDBFLDB4NTksMHgwQiwweEMwLDB4NzUsMHgwNSwweDhCLDB4QzcsCisweEU5LDB4NUIsMHgwMSwweDhCLDB4NDYsMHhGQywweDg5LDB4NDYsMHhGRSwweDBCLDB4RkYsMHg3NSwweDA1LDB4QjgsMHgwMSwweDAwLAorMHhFQiwweDAyLDB4MzMsMHhDMCwweDUwLDB4NTYsMHhFOCwweEE0LDB4MEQsMHg1OSwweDU5LDB4QjQsMHgwMCwweDg5LDB4NDYsMHhGQywKKzB4OEIsMHg1RSwweEZDLDB4ODMsMHhGQiwweDA4LDB4NzYsMHgwMywweEU5LDB4MkIsMHgwMSwweEQxLDB4RTMsMHgyRSwweEZGLDB4QTcsCisweEIyLDB4NjQsMHhCOCwweDAzLDB4MDAsMHhFOSwweDI2LDB4MDEsMHg4MywweDdFLDB4RkEsMHgwMCwweDc0LDB4MTQsMHhDNywweDQ2LAorMHhGQSwweDAwLDB4MDAsMHg4QSwweDQ0LDB4NTgsMHg5OCwweDUwLDB4OEEsMHg0NCwweDU5LDB4OTgsMHg1MCwweEU4LDB4QzIsMHgwRiwKKzB4NTksMHg1OSwweDgzLDB4N0UsMHhGOCwweDAwLDB4NzQsMHgwQSwweEM3LDB4NDYsMHhGOCwweDAwLDB4MDAsMHg1NiwweEU4LDB4OUIsCisweDA4LDB4NTksMHg4MywweDdFLDB4MDYsMHgwMCwweDc1LDB4MDUsMHg4QiwweEM3LDB4RTksMHhGMSwweDAwLDB4ODMsMHhGRiwweDA0LAorMHg3NSwweDAzLDB4RTksMHhFNiwweDAwLDB4OEIsMHhDNywweEU5LDB4RTQsMHgwMCwweDgzLDB4N0UsMHhGRSwweDAwLDB4NzUsMHgwMywKKzB4QkYsMHgwMiwweDAwLDB4RTksMHhENSwweDAwLDB4ODMsMHg3RSwweEZFLDB4MDAsMHg3NSwweDAzLDB4QkYsMHgwMSwweDAwLDB4RTksCisweEM5LDB4MDAsMHg4QiwweDVFLDB4RkUsMHg4MywweEZCLDB4MDcsMHg3NiwweDAzLDB4RTksMHg4NiwweDAwLDB4RDEsMHhFMywweDJFLAorMHhGRiwweEE3LDB4QTIsMHg2NCwweDMzLDB4RkYsMHhFOSwweDdGLDB4MDAsMHhCRiwweDA0LDB4MDAsMHg4MCwweDdDLDB4NTgsMHgwRiwKKzB4NzQsMHgyMiwweDgzLDB4N0UsMHhGOCwweDAwLDB4NzUsMHgxQywweEZFLDB4NDQsMHg1OCwweDZBLDB4MDgsMHg1NiwweEU4LDB4N0UsCisweDBDLDB4NTksMHg1OSwweDhBLDB4NDQsMHg1OCwweDA0LDB4ODAsMHg1MCwweDU2LDB4RTgsMHg3MiwweDBDLDB4NTksMHg1OSwweEM3LAorMHg0NiwweEZBLDB4MDEsMHgwMCwweDgzLDB4N0UsMHhGOCwweDAwLDB4NzQsMHgwQSwweEM3LDB4NDYsMHhGOCwweDAwLDB4MDAsMHg1NiwKKzB4RTgsMHgxOSwweDA4LDB4NTksMHhFQiwweDQyLDB4QkYsMHgwNCwweDAwLDB4ODAsMHg3QywweDU4LDB4MDAsMHg3NCwweDIyLDB4ODMsCisweDdFLDB4RjgsMHgwMCwweDc1LDB4MUMsMHhGRSwweDRDLDB4NTgsMHg2QSwweDA4LDB4NTYsMHhFOCwweDQxLDB4MEMsMHg1OSwweDU5LAorMHg4QSwweDQ0LDB4NTgsMHgwNCwweDgwLDB4NTAsMHg1NiwweEU4LDB4MzUsMHgwQywweDU5LDB4NTksMHhDNywweDQ2LDB4RkEsMHgwMSwKKzB4MDAsMHg4MywweDdFLDB4RjgsMHgwMCwweDc0LDB4MEEsMHhDNywweDQ2LDB4RjgsMHgwMCwweDAwLDB4NTYsMHhFOCwweERDLDB4MDcsCisweDU5LDB4RUIsMHgwNSwweEJGLDB4MDQsMHgwMCwweEVCLDB4MDAsMHhFQiwweDMxLDB4QkYsMHgwNCwweDAwLDB4RUIsMHgyQywweEM3LAorMHg0NiwweEY4LDB4MDEsMHgwMCwweDZBLDB4MDgsMHg1NiwweEU4LDB4MDUsMHgwQywweDU5LDB4NTksMHg4MCwweDdDLDB4NTgsMHgwOSwKKzB4N0QsMHgwNCwweEIwLDB4MEYsMHhFQiwweDAyLDB4QjAsMHgwMCwweDA0LDB4ODAsMHg1MCwweDU2LDB4RTgsMHhGMCwweDBCLDB4NTksCisweDU5LDB4QkYsMHgwNCwweDAwLDB4RUIsMHgwNSwweEJGLDB4MDQsMHgwMCwweEVCLDB4MDAsMHhFOSwweEE1LDB4RkUsMHg1RiwweDVFLAorMHhDOSwweEMzLDB4RTQsMHg2MywweDYzLDB4NjQsMHg2MywweDY0LDB4NjMsMHg2NCwweDYzLDB4NjQsMHhFOSwweDYzLDB4MjYsMHg2NCwKKzB4NTEsMHg2NCwweDc4LDB4NjMsMHhCQSwweDYzLDB4QzYsMHg2MywweDk2LDB4NjQsMHhEMiwweDYzLDB4NkEsMHg2NCwweDZBLDB4NjQsCisweDZGLDB4NjQsMHg3MiwweDYzLDB4QzgsMHgwOCwweDAwLDB4MDAsMHg1NiwweDU3LDB4OEIsMHg3NiwweDA0LDB4OEIsMHg3RSwweDA4LAorMHg2QSwweDAxLDB4NTYsMHhFOCwweEE5LDB4MEIsMHg1OSwweDU5LDB4OEEsMHg0NiwweDA2LDB4QzAsMHhFMCwweDA2LDB4MDQsMHg4MCwKKzB4NTAsMHg1NiwweEU4LDB4OUEsMHgwQiwweDU5LDB4NTksMHhDNywweDQ2LDB4RkUsMHgwMCwweDAwLDB4ODksMHg3RSwweEY4LDB4RUIsCisweDAzLDB4RkYsMHg0NiwweEZFLDB4OEIsMHg1RSwweEY4LDB4RkYsMHg0NiwweEY4LDB4ODAsMHgzRiwweDAwLDB4NzUsMHhGMiwweDgzLAorMHg3RSwweEZFLDB4MTAsMHg3RCwweDI1LDB4QjgsMHgxMCwweDAwLDB4MkIsMHg0NiwweEZFLDB4RDEsMHhGOCwweDg5LDB4NDYsMHhGQywKKzB4QzcsMHg0NiwweEZBLDB4MDAsMHgwMCwweEVCLDB4MEIsMHg2QSwweDIwLDB4NTYsMHhFOCwweDYyLDB4MEIsMHg1OSwweDU5LDB4RkYsCisweDQ2LDB4RkEsMHg4QiwweDQ2LDB4RkEsMHgzQiwweDQ2LDB4RkMsMHg3QywweEVELDB4RUIsMHgwQywweDhCLDB4REYsMHg0NywweDhBLAorMHgwNywweDUwLDB4NTYsMHhFOCwweDQ5LDB4MEIsMHg1OSwweDU5LDB4ODAsMHgzRCwweDAwLDB4NzUsMHhFRiwweDZBLDB4MDIsMHg1NiwKKzB4RTgsMHgzQywweDBCLDB4NTksMHg1OSwweEVCLDB4MDAsMHg1RiwweDVFLDB4QzksMHhDMywweEM4LDB4MDQsMHgwMCwweDAwLDB4NTYsCisweDU3LDB4OEIsMHg3RSwweDA0LDB4QzcsMHg0NiwweEZFLDB4MDAsMHgwMCwweEJFLDB4MTQsMHgwMCwweEU5LDB4MDksMHgwMSwweDhCLAorMHg1RSwweEZFLDB4ODMsMHhDMywweDA0LDB4MkIsMHhERiwweDhBLDB4ODcsMHhBQywweDBCLDB4ODgsMHg0NCwweDVBLDB4QzYsMHg0NCwKKzB4NTgsMHgwOCwweDhBLDB4NDYsMHhGRSwweDg4LDB4NDQsMHg1OSwweEM3LDB4NDQsMHgwNiwweDAwLDB4MDAsMHhDNiwweDQ0LDB4MTksCisweDAwLDB4QzYsMHg0NCwweDFBLDB4MDAsMHhDNiwweDQ0LDB4MUIsMHgwMCwweEM2LDB4NDQsMHgxRCwweDBELDB4QzYsMHg0NCwweDFFLAorMHgwMywweEM2LDB4NDQsMHgxRiwweDAwLDB4QzYsMHg0NCwweDIwLDB4MDAsMHhDNiwweDQ0LDB4MjEsMHgwMCwweEM2LDB4NDQsMHg1QiwKKzB4MDAsMHhDNiwweDQ0LDB4NUQsMHgwMCwweEM2LDB4NDQsMHg1RSwweDAwLDB4QzYsMHg0NCwweDVGLDB4MDAsMHhDNiwweDQ0LDB4NjAsCisweDAwLDB4QzcsMHg0NiwweEZDLDB4MDAsMHgwMCwweEVCLDB4MEQsMHg4QiwweDVFLDB4RkMsMHhEMSwweEUzLDB4QzcsMHg0MCwweDMwLAorMHgwMCwweDAwLDB4RkYsMHg0NiwweEZDLDB4ODMsMHg3RSwweEZDLDB4MTAsMHg3QywweEVELDB4QzcsMHg0NiwweEZDLDB4MDAsMHgwMCwKKzB4RUIsMHgwQSwweDhCLDB4NUUsMHhGQywweEM2LDB4NDAsMHg1MCwweDAwLDB4RkYsMHg0NiwweEZDLDB4ODMsMHg3RSwweEZDLDB4MDQsCisweDdDLDB4RjAsMHhDNywweDQ0LDB4NTQsMHgwMCwweDAwLDB4QzcsMHg0NCwweDU2LDB4MDAsMHgwMCwweDhBLDB4NDQsMHg1QSwweDk4LAorMHhCQSwweEY4LDB4MDAsMHgyMywweEQwLDB4QjgsMHgwNSwweDAwLDB4MEIsMHhDMiwweDg5LDB4NDYsMHhGQywweDlDLDB4RkEsMHg4QSwKKzB4NDYsMHhGQywweEJBLDB4RkUsMHgwMCwweEVFLDB4QkEsMHgwMCwweDAwLDB4RUMsMHg5RCwweDI0LDB4MDgsMHg4OCwweDQ2LDB4RkMsCisweDgzLDB4N0UsMHhGQywweDAwLDB4NzUsMHgwMiwweEVCLDB4NEEsMHhGRiwweDc2LDB4RkUsMHhFOCwweDdBLDB4MEMsMHg1OSwweDY4LAorMHgzNSwweDAyLDB4NTYsMHhFOCwweDMyLDB4MEEsMHg1OSwweDU5LDB4MEIsMHhDMCwweDc1LDB4MzQsMHg2OCwweDM4LDB4MDIsMHg1NiwKKzB4RTgsMHgyNSwweDBBLDB4NTksMHg1OSwweDBCLDB4QzAsMHg3NSwweDI3LDB4NjgsMHg0MiwweDAyLDB4NTYsMHhFOCwweDE4LDB4MEEsCisweDU5LDB4NTksMHgwQiwweEMwLDB4NzUsMHgxQSwweDY4LDB4NEMsMHgwMiwweDU2LDB4RTgsMHgwQiwweDBBLDB4NTksMHg1OSwweDBCLAorMHhDMCwweDc1LDB4MEQsMHg2OCwweDU2LDB4MDIsMHg1NiwweEU4LDB4RkUsMHgwOSwweDU5LDB4NTksMHgwQiwweEMwLDB4NzQsMHgwMiwKKzB4RUIsMHgwMCwweEZGLDB4NDYsMHhGRSwweDgzLDB4QzYsMHg2MiwweDM5LDB4N0UsMHhGRSwweDdELDB4MDMsMHhFOSwweEVGLDB4RkUsCisweEVCLDB4MDAsMHg1RiwweDVFLDB4QzksMHhDMywweEM4LDB4MDgsMHgwMCwweDAwLDB4NTYsMHg1NywweDhCLDB4NDYsMHgwNCwweEJBLAorMHg2MiwweDAwLDB4RjcsMHhFQSwweDA1LDB4MTQsMHgwMCwweDhCLDB4RjAsMHg4MywweDdFLDB4MDYsMHgwMCwweDc0LDB4MDUsMHhCOCwKKzB4MTAsMHgwMCwweEVCLDB4MDMsMHhCOCwweDA4LDB4MDAsMHg4OSwweDQ0LDB4MDQsMHg4QSwweDQ2LDB4MDgsMHg4OCwweDQ0LDB4NUMsCisweDU2LDB4RTgsMHg1OSwweDA0LDB4NTksMHg4QiwweEY4LDB4OEIsMHhDNywweDg5LDB4NDQsMHg1NiwweDg5LDB4NDQsMHg1NCwweDhBLAorMHg0NCwweDVELDB4ODgsMHg0NCwweDJGLDB4MEIsMHhGRiwweDc1LDB4MUQsMHg2OCwweEMyLDB4MEYsMHg2QSwweDAxLDB4NTYsMHhFOCwKKzB4MDIsMHhGRSwweDgzLDB4QzQsMHgwNiwweEVCLDB4MDAsMHg2QSwweDAxLDB4NTYsMHhFOCwweDQ3LDB4RkMsMHg1OSwweDU5LDB4MEIsCisweEMwLDB4NzUsMHhGNCwweEJGLDB4MDEsMHgwMCwweDg5LDB4N0UsMHhGQSwweEI5LDB4MDUsMHgwMCwweEJCLDB4RTksMHg2QSwweDJFLAorMHg4QiwweDA3LDB4M0IsMHg0NiwweEZBLDB4NzQsMHgwNywweDQzLDB4NDMsMHhFMiwweEY0LDB4RTksMHhBNCwweDAzLDB4MkUsMHhGRiwKKzB4NjcsMHgwQSwweEM3LDB4NDQsMHgwNiwweDAyLDB4MDAsMHhDNywweDQ0LDB4MDgsMHhGNCwweDA4LDB4OEIsMHg1RSwweDA0LDB4RDEsCisweEUzLDB4OEIsMHg4NywweEZDLDB4MDgsMHg4OSwweDQ0LDB4MEEsMHgzMywweEMwLDB4OEIsMHhGOCwweDg5LDB4NDQsMHg1NCwweEU5LAorMHg4MCwweDAzLDB4NTYsMHhFOCwweEJCLDB4MDUsMHg1OSwweEJGLDB4MDEsMHgwMCwweDhBLDB4NDQsMHg1RCwweDg4LDB4NDQsMHg2MCwKKzB4RTksMHg2RiwweDAzLDB4ODMsMHg3QywweDA0LDB4MDgsMHg3NSwweDMwLDB4ODAsMHg3QywweDVDLDB4MDEsMHg3NSwweDE1LDB4OEEsCisweDQ0LDB4NUQsMHhCNCwweDAwLDB4RDEsMHhFMCwweDhCLDB4RDgsMHhGRiwweEI3LDB4RTQsMHgwOCwweDU2LDB4RTgsMHhGNywweDA4LAorMHg1OSwweDU5LDB4RUIsMHgxMywweDhBLDB4NDQsMHg1RCwweEI0LDB4MDAsMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHhDNCwKKzB4MDgsMHg1NiwweEU4LDB4RTIsMHgwOCwweDU5LDB4NTksMHhFQiwweDJFLDB4ODAsMHg3QywweDVDLDB4MDEsMHg3NSwweDE1LDB4OEEsCisweDQ0LDB4NUQsMHhCNCwweDAwLDB4RDEsMHhFMCwweDhCLDB4RDgsMHhGRiwweEI3LDB4RDQsMHgwOCwweDU2LDB4RTgsMHhDNywweDA4LAorMHg1OSwweDU5LDB4RUIsMHgxMywweDhBLDB4NDQsMHg1RCwweEI0LDB4MDAsMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHhCNCwKKzB4MDgsMHg1NiwweEU4LDB4QjIsMHgwOCwweDU5LDB4NTksMHg2QSwweDAxLDB4NTYsMHhFOCwweDg3LDB4RkIsMHg1OSwweDU5LDB4OEIsCisweEQ4LDB4ODMsMHhGQiwweDAzLDB4NzcsMHgyQSwweEQxLDB4RTMsMHgyRSwweEZGLDB4QTcsMHhFMSwweDZBLDB4QkYsMHgwMSwweDAwLAorMHg4QSwweDQ0LDB4NUQsMHg4OCwweDQ0LDB4NUUsMHhFQiwweDE4LDB4OEEsMHg0NCwweDVELDB4MDQsMHhGRiwweDI0LDB4MDcsMHg4OCwKKzB4NDQsMHg1RCwweEVCLDB4MEMsMHg4QSwweDQ0LDB4NUQsMHhGRSwweEMwLDB4MjQsMHgwNywweDg4LDB4NDQsMHg1RCwweEVCLDB4MDAsCisweEU5LDB4Q0YsMHgwMiwweDhBLDB4NDQsMHg1RCwweEI0LDB4MDAsMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHhGRCwweDAyLAorMHg1NiwweEU4LDB4NjMsMHgwOCwweDU5LDB4NTksMHg2OCwweDFELDB4MDMsMHg1NiwweEU4LDB4NUEsMHgwOCwweDU5LDB4NTksMHg2QSwKKzB4MDEsMHg1NiwweEU4LDB4MkYsMHhGQiwweDU5LDB4NTksMHg4QiwweEQ4LDB4ODMsMHhGQiwweDAzLDB4NzcsMHgzNiwweEQxLDB4RTMsCisweDJFLDB4RkYsMHhBNywweEQ5LDB4NkEsMHhCRiwweDAxLDB4MDAsMHg4QSwweDQ0LDB4NUQsMHg4OCwweDQ0LDB4NUYsMHhFQiwweDI0LAorMHg4QSwweDQ0LDB4NUQsMHgwNCwweEZGLDB4OEEsMHg1NCwweDA0LDB4ODAsMHhDMiwweEZGLDB4MjIsMHhDMiwweDg4LDB4NDQsMHg1RCwKKzB4RUIsMHgxMiwweDhBLDB4NDQsMHg1RCwweEZFLDB4QzAsMHg4QSwweDU0LDB4MDQsMHg4MCwweEMyLDB4RkYsMHgyMiwweEMyLDB4ODgsCisweDQ0LDB4NUQsMHhFQiwweDAwLDB4RTksMHg2QiwweDAyLDB4OEIsMHg1QywweDA2LDB4ODMsMHhDMywweEZFLDB4RDEsMHhFMywweDhCLAorMHg0MCwweDA4LDB4ODksMHgwNCwweDhCLDB4MUMsMHhGRiwweDc3LDB4MDYsMHg2QSwweDAwLDB4NTYsMHhFOCwweDg1LDB4RkMsMHg4MywKKzB4QzQsMHgwNiwweDhCLDB4NUMsMHgwNiwweDRCLDB4RDEsMHhFMywweDhCLDB4NDAsMHgwOCwweDg5LDB4NDQsMHgwMiwweDhCLDB4NUMsCisweDAyLDB4RkYsMHg3NywweDA2LDB4NkEsMHgwMSwweDU2LDB4RTgsMHg2QSwweEZDLDB4ODMsMHhDNCwweDA2LDB4NkEsMHgwMSwweDU2LAorMHhFOCwweEIxLDB4RkEsMHg1OSwweDU5LDB4OEIsMHhEOCwweDgzLDB4RkIsMHgwMywweDc2LDB4MDMsMHhFOSwweDFGLDB4MDIsMHhEMSwKKzB4RTMsMHgyRSwweEZGLDB4QTcsMHhEMSwweDZBLDB4OEIsMHg1QywweDAyLDB4OEIsMHg0NywweDA0LDB4ODksMHg0NCwweDAyLDB4OEIsCisweDVDLDB4MDIsMHg4MCwweDNGLDB4NDQsMHg3NSwweDBELDB4OEIsMHg1QywweDAyLDB4OEEsMHg0NywweDAxLDB4QjQsMHgwMCwweDNCLAorMHg0NCwweDA0LDB4N0QsMHhFMiwweDhCLDB4NDYsMHgwNCwweEQxLDB4RTAsMHg4QiwweDFDLDB4MDMsMHhEOCwweDhCLDB4NDQsMHgwMiwKKzB4ODksMHg0NywweDA4LDB4OEIsMHg1QywweDA2LDB4NEIsMHhEMSwweEUzLDB4OEIsMHg0NCwweDAyLDB4ODksMHg0MCwweDA4LDB4RTksCisweERFLDB4MDEsMHg4QiwweDVDLDB4MDIsMHg4QiwweDQ3LDB4MDIsMHg4OSwweDQ0LDB4MDIsMHg4QiwweDVDLDB4MDIsMHg4MCwweDNGLAorMHg0NCwweDc1LDB4MEQsMHg4QiwweDVDLDB4MDIsMHg4QSwweDQ3LDB4MDEsMHhCNCwweDAwLDB4M0IsMHg0NCwweDA0LDB4N0QsMHhFMiwKKzB4OEIsMHg0NiwweDA0LDB4RDEsMHhFMCwweDhCLDB4MUMsMHgwMywweEQ4LDB4OEIsMHg0NCwweDAyLDB4ODksMHg0NywweDA4LDB4OEIsCisweDVDLDB4MDYsMHg0QiwweEQxLDB4RTMsMHg4QiwweDQ0LDB4MDIsMHg4OSwweDQwLDB4MDgsMHhFOSwweEEyLDB4MDEsMHhCRiwweDAxLAorMHgwMCwweEU5LDB4OUMsMHgwMSwweDhCLDB4NUMsMHgwMiwweDhBLDB4MDcsMHhCNCwweDAwLDB4ODksMHg0NiwweEY4LDB4QjksMHgwQywKKzB4MDAsMHhCQiwweEExLDB4NkEsMHgyRSwweDhCLDB4MDcsMHgzQiwweDQ2LDB4RjgsMHg3NCwweDA3LDB4NDMsMHg0MywweEUyLDB4RjQsCisweEU5LDB4NzcsMHgwMSwweDJFLDB4RkYsMHg2NywweDE4LDB4OEIsMHg0NiwweDA0LDB4RDEsMHhFMCwweDhCLDB4NUMsMHgwMiwweDAzLAorMHhEOCwweDhCLDB4NDcsMHgwOCwweDhCLDB4NUMsMHgwNiwweEZGLDB4NDQsMHgwNiwweEQxLDB4RTMsMHg4OSwweDQwLDB4MDgsMHg4QiwKKzB4MUMsMHg4MCwweDdGLDB4MDEsMHgwMCwweDc0LDB4MTIsMHg4QiwweDVDLDB4MDIsMHg4QSwweDQ3LDB4MDEsMHg4QiwweDFDLDB4OEEsCisweDU3LDB4MDEsMHhCNiwweDAwLDB4OEIsMHhEQSwweDg4LDB4NDAsMHgxOCwweEU5LDB4NDAsMHgwMSwweEZGLDB4NEMsMHgwNiwweEU5LAorMHgzQSwweDAxLDB4OEIsMHg1QywweDAyLDB4OEEsMHg0NywweDAxLDB4OEIsMHgxQywweDhBLDB4NTcsMHgwMSwweEI2LDB4MDAsMHg4QiwKKzB4REEsMHg4OCwweDQwLDB4MTgsMHhFOSwweDI1LDB4MDEsMHg4QiwweDVDLDB4MDIsMHg4QSwweDQ3LDB4MDEsMHg4QiwweDFDLDB4OEEsCisweDU3LDB4MDEsMHhCNiwweDAwLDB4OEIsMHhEQSwweDg4LDB4NDAsMHgxOCwweEZGLDB4NEMsMHgwNiwweEU5LDB4MEQsMHgwMSwweDhCLAorMHg1QywweDAyLDB4OEEsMHg0NywweDAxLDB4OEIsMHgxQywweDhBLDB4NTcsMHgwMSwweEI2LDB4MDAsMHg4QiwweERBLDB4MzAsMHg0MCwKKzB4MTgsMHhFOSwweEY4LDB4MDAsMHhCOCwweEYwLDB4MTAsMHg4QiwweEY4LDB4ODksMHg0NCwweDU0LDB4OEEsMHg0NCwweDVGLDB4ODgsCisweDQ0LDB4NUQsMHhFOSwweEU3LDB4MDAsMHg4QSwweDQ0LDB4MUMsMHg5OCwweDNELDB4MDIsMHgwMCwweDc0LDB4MDcsMHgzRCwweDAzLAorMHgwMCwweDc0LDB4MDIsMHhFQiwweDA3LDB4QzcsMHg0NiwweEZFLDB4MDAsMHgwMCwweEVCLDB4MkIsMHg4QSwweDQ0LDB4MUMsMHg5OCwKKzB4RDEsMHhFMCwweDhCLDB4RDgsMHhGRiwweEI3LDB4NjksMHgwMiwweDU2LDB4RTgsMHg2QiwweDA2LDB4NTksMHg1OSwweDZBLDB4MDEsCisweDU2LDB4RTgsMHg0MCwweEY5LDB4NTksMHg1OSwweDg5LDB4NDYsMHhGRSwweDgzLDB4N0UsMHhGRSwweDAwLDB4NzQsMHgwNiwweDgzLAorMHg3RSwweEZFLDB4MDMsMHg3NSwweEU5LDB4RUIsMHgwMCwweDgzLDB4N0UsMHhGRSwweDAzLDB4NzQsMHg2MiwweDhBLDB4NDQsMHgxQywKKzB4OTgsMHhEMSwweEUwLDB4OEIsMHhEOCwweEZGLDB4QjcsMHg2RCwweDAyLDB4NTYsMHhFOCwweDNBLDB4MDYsMHg1OSwweDU5LDB4NTYsCisweEU4LDB4NEQsMHg5NywweDU5LDB4ODksMHg0NiwweEZDLDB4OEIsMHg1RSwweEZDLDB4ODMsMHhFQiwweEZFLDB4ODMsMHhGQiwweDAzLAorMHg3NywweDMzLDB4RDEsMHhFMywweDJFLDB4RkYsMHhBNywweDk5LDB4NkEsMHg2OCwweEFDLDB4MDIsMHg1NiwweEU4LDB4MTcsMHgwNiwKKzB4NTksMHg1OSwweEVCLDB4MjMsMHg2OCwweDhGLDB4MDIsMHg1NiwweEU4LDB4MEMsMHgwNiwweDU5LDB4NTksMHhFQiwweDE4LDB4NjgsCisweDc1LDB4MDIsMHg1NiwweEU4LDB4MDEsMHgwNiwweDU5LDB4NTksMHhFQiwweDBELDB4NjgsMHhDNiwweDAyLDB4NTYsMHhFOCwweEY2LAorMHgwNSwweDU5LDB4NTksMHhFQiwweDAyLDB4RUIsMHgwMCwweDZBLDB4MDEsMHg1NiwweEU4LDB4QzcsMHhGOCwweDU5LDB4NTksMHhCRiwKKzB4MDEsMHgwMCwweEVCLDB4MzgsMHg2OCwweERELDB4MDIsMHg1NiwweEU4LDB4REMsMHgwNSwweDU5LDB4NTksMHg2QSwweDAxLDB4NTYsCisweEU4LDB4QjEsMHhGOCwweDU5LDB4NTksMHhCRiwweDAxLDB4MDAsMHhFQiwweDIyLDB4QjgsMHhEMCwweDMwLDB4OEIsMHhGOCwweDg5LAorMHg0NCwweDU0LDB4OEEsMHg0NCwweDYwLDB4ODgsMHg0NCwweDVELDB4RUIsMHgxMiwweEI4LDB4RTAsMHgyMCwweDhCLDB4RjgsMHg4OSwKKzB4NDQsMHg1NCwweDhBLDB4NDQsMHg1RSwweDg4LDB4NDQsMHg1RCwweEVCLDB4MDIsMHhFQiwweDAwLDB4RUIsMHgwMiwweEVCLDB4MDAsCisweEVCLDB4MDAsMHhFOSwweDQxLDB4RkMsMHg1RiwweDVFLDB4QzksMHhDMywweDE5LDB4NkEsMHgyNCwweDZBLDB4MkYsMHg2QSwweDNBLAorMHg2QSwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDAsMHg0MSwweDAwLDB4NDIsMHgwMCwweDQzLDB4MDAsMHg0NCwKKzB4MDAsMHg4MCwweDAwLDB4ODEsMHgwMCwweDgyLDB4MDAsMHhGRiwweDAwLDB4MTcsMHg2OSwweDU0LDB4NkEsMHg3QSwweDZBLDB4QTUsCisweDY5LDB4NTIsMHg2OSwweDk0LDB4NjksMHg2QSwweDZBLDB4NjcsMHg2OSwweDUyLDB4NjksMHg3RiwweDY5LDB4NjcsMHg2OSwweDRDLAorMHg2OSwweEY0LDB4NjgsMHg3NiwweDY4LDB4QjIsMHg2OCwweEVFLDB4NjgsMHhGNSwweDY3LDB4MDAsMHg2OCwweDEyLDB4NjgsMHhGNSwKKzB4NjcsMHg5RCwweDY3LDB4QTgsMHg2NywweEI0LDB4NjcsMHg5RCwweDY3LDB4MDAsMHgwMCwweDAxLDB4MDAsMHhGMCwweDEwLDB4RTAsCisweDIwLDB4RDAsMHgzMCwweDI3LDB4NjgsMHhGMiwweDY2LDB4QzMsMHg2NywweDIzLDB4NjcsMHgxMiwweDY3LDB4QzgsMHgwNCwweDAwLAorMHgwMCwweDU2LDB4NTcsMHg4QiwweDc2LDB4MDQsMHg4QSwweDQ0LDB4NTksMHg5OCwweDg5LDB4NDYsMHhGQywweDZBLDB4MDksMHg4QiwKKzB4NDYsMHhGQywweDA1LDB4ODQsMHgwMSwweDUwLDB4RTgsMHg5MywweDA4LDB4NTksMHg1OSwweDhCLDB4RjgsMHg4QiwweEM3LDB4MjUsCisweDAwLDB4RjAsMHgzRCwweDAwLDB4MTAsMHg3NSwweDU1LDB4OEIsMHhDNywweDI1LDB4RjAsMHgwMCwweDNELDB4RjAsMHgwMCwweDc1LAorMHg0QiwweDhCLDB4QzcsMHgyNSwweDAwLDB4MEYsMHhDMSwweEY4LDB4MDgsMHg4OSwweDQ2LDB4RkUsMHg4QiwweDQ0LDB4MDQsMHgzQiwKKzB4NDYsMHhGRSwweDdELDB4MDUsMHgzMywweEMwLDB4RTksMHhFRiwweDAwLDB4OEIsMHhDNywweDI1LDB4MEYsMHgwMCwweEJBLDB4MEYsCisweDAwLDB4MkIsMHhEMCwweDNCLDB4NTYsMHhGRSwweDc0LDB4MDUsMHgzMywweEMwLDB4RTksMHhEQiwweDAwLDB4QzcsMHg0NCwweDAyLAorMHgwNCwweDA5LDB4OEEsMHg0NiwweEZFLDB4ODgsMHg0NCwweDVGLDB4ODgsMHg0NCwweDVELDB4OEIsMHg1RSwweEZDLDB4RDEsMHhFMywKKzB4QzcsMHg4NywweEZDLDB4MDgsMHgwNCwweDA5LDB4QjgsMHhGMCwweDEwLDB4RTksMHhCQywweDAwLDB4OEIsMHhDNywweDI1LDB4MDAsCisweEYwLDB4M0QsMHgwMCwweDIwLDB4NzUsMHg1MiwweDhCLDB4QzcsMHgyNSwweEYwLDB4MDAsMHgzRCwweEUwLDB4MDAsMHg3NSwweDQ4LAorMHg4QiwweEM3LDB4MjUsMHgwMCwweDBGLDB4QzEsMHhGOCwweDA4LDB4ODksMHg0NiwweEZFLDB4ODMsMHg3RSwweEZFLDB4MDgsMHg3RSwKKzB4MDUsMHgzMywweEMwLDB4RTksMHg5MiwweDAwLDB4OEIsMHhDNywweDI1LDB4MEYsMHgwMCwweEJBLDB4MEYsMHgwMCwweDJCLDB4RDAsCisweDNCLDB4NTYsMHhGRSwweDc0LDB4MDUsMHgzMywweEMwLDB4RUIsMHg3RiwweDkwLDB4QzcsMHg0NCwweDAyLDB4MEMsMHgwOSwweDhBLAorMHg0NiwweEZFLDB4ODgsMHg0NCwweDVFLDB4ODgsMHg0NCwweDVELDB4OEIsMHg1RSwweEZDLDB4RDEsMHhFMywweEM3LDB4ODcsMHhGQywKKzB4MDgsMHgwQywweDA5LDB4QjgsMHhFMCwweDIwLDB4RUIsMHg2MCwweDhCLDB4QzcsMHgyNSwweDAwLDB4RjAsMHgzRCwweDAwLDB4MzAsCisweDc1LDB4NTIsMHg4QiwweEM3LDB4MjUsMHhGMCwweDAwLDB4M0QsMHhEMCwweDAwLDB4NzUsMHg0OCwweDhCLDB4QzcsMHgyNSwweDAwLAorMHgwRiwweEMxLDB4RjgsMHgwOCwweDg5LDB4NDYsMHhGRSwweDhCLDB4NDQsMHgwNCwweDNCLDB4NDYsMHhGRSwweDdELDB4MDQsMHgzMywKKzB4QzAsMHhFQiwweDM1LDB4OEIsMHhDNywweDI1LDB4MEYsMHgwMCwweEJBLDB4MEYsMHgwMCwweDJCLDB4RDAsMHgzQiwweDU2LDB4RkUsCisweDc0LDB4MDQsMHgzMywweEMwLDB4RUIsMHgyMiwweEM3LDB4NDQsMHgwMiwweDE0LDB4MDksMHg4QSwweDQ2LDB4RkUsMHg4OCwweDQ0LAorMHg2MCwweDg4LDB4NDQsMHg1RCwweDhCLDB4NUUsMHhGQywweEQxLDB4RTMsMHhDNywweDg3LDB4RkMsMHgwOCwweDE0LDB4MDksMHhCOCwKKzB4RDAsMHgzMCwweEVCLDB4MDQsMHgzMywweEMwLDB4RUIsMHgwMCwweDVGLDB4NUUsMHhDOSwweEMzLDB4QzgsMHgwNiwweDAwLDB4MDAsCisweDU2LDB4OEIsMHg3NiwweDA0LDB4NkEsMHgwOCwweDU2LDB4RTgsMHgzNSwweDA0LDB4NTksMHg1OSwweDhBLDB4NDQsMHg1OCwweDA0LAorMHg4MCwweDUwLDB4NTYsMHhFOCwweDI5LDB4MDQsMHg1OSwweDU5LDB4OEIsMHg0NCwweDU0LDB4M0IsMHg0NCwweDU2LDB4NzUsMHgwQSwKKzB4OEEsMHg0NCwweDVELDB4M0EsMHg0NCwweDJGLDB4NzUsMHgwMiwweEVCLDB4NjQsMHg4QiwweDQ0LDB4NTQsMHg4OSwweDQ0LDB4NTYsCisweDhCLDB4NUMsMHgwMiwweDhBLDB4NDcsMHgwMSwweDg4LDB4NDQsMHgyRiwweDhBLDB4NDQsMHg1RCwweEI0LDB4MDAsMHhDMSwweEUwLAorMHgwOCwweDhCLDB4NTQsMHg1NCwweDBCLDB4RDAsMHg4QSwweDQ0LDB4NUQsMHhCNCwweDAwLDB4QkIsMHgwRiwweDAwLDB4MkIsMHhEOCwKKzB4MEIsMHhEMywweDg5LDB4NTYsMHhGRSwweDZBLDB4MTAsMHg4QSwweDQ0LDB4NTksMHg5OCwweDA1LDB4MDQsMHgwMCwweDk5LDB4MDUsCisweDQwLDB4MDEsMHg4MywweEQyLDB4MDAsMHg1MiwweDUwLDB4RTgsMHg1NCwweDA4LDB4ODMsMHhDNCwweDA2LDB4ODksMHg1NiwweEZDLAorMHg4OSwweDQ2LDB4RkEsMHg4QiwweDQ2LDB4RkUsMHgwOSwweDQ2LDB4RkEsMHg4MywweDRFLDB4RkMsMHgwMCwweDZBLDB4MTksMHhGRiwKKzB4NzYsMHhGQywweEZGLDB4NzYsMHhGQSwweEU4LDB4NzMsMHgwNywweDgzLDB4QzQsMHgwNiwweEU4LDB4RkUsMHgwNywweDVFLDB4QzksCisweEMzLDB4QzgsMHgxQywweDAwLDB4MDAsMHg1NiwweDU3LDB4OEIsMHg1RSwweDA0LDB4OEEsMHg0NywweDU5LDB4OTgsMHg4QiwweEYwLAorMHg4QiwweDVFLDB4MDQsMHg4QSwweDQ3LDB4NUQsMHhCNCwweDAwLDB4ODksMHg0NiwweEU2LDB4ODMsMHg3RSwweEU2LDB4MDAsMHg3RCwKKzB4MEEsMHg4QiwweDVFLDB4MDQsMHg4QiwweDQ3LDB4MDQsMHg0OCwweDg5LDB4NDYsMHhFNiwweDhCLDB4NUUsMHgwNCwweDhCLDB4NDcsCisweDA0LDB4M0IsMHg0NiwweEU2LDB4N0YsMHgwNSwweEM3LDB4NDYsMHhFNiwweDAwLDB4MDAsMHg4QiwweDVFLDB4MDQsMHg4QSwweDQ2LAorMHhFNiwweDg4LDB4NDcsMHg1RCwweDhCLDB4REUsMHhEMSwweEUzLDB4OEIsMHg5RiwweDU5LDB4MDIsMHhDNiwweDQ3LDB4MDIsMHgyMCwKKzB4OEIsMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NTksMHgwMiwweEM2LDB4NDcsMHgwMywweDMwLDB4OEIsMHhERSwweEQxLDB4RTMsCisweDhCLDB4OUYsMHg2MSwweDAyLDB4QzYsMHg0NywweDAyLDB4MjAsMHg4QiwweERFLDB4RDEsMHhFMywweDhCLDB4OUYsMHg2MSwweDAyLAorMHhDNiwweDQ3LDB4MDMsMHgzMCwweDhCLDB4NDYsMHhFNiwweDg5LDB4NDYsMHhGQSwweDgzLDB4N0UsMHhGQSwweDAwLDB4NzQsMHgxOCwKKzB4OEIsMHg0NiwweEZBLDB4QkIsMHgwQSwweDAwLDB4MzMsMHhEMiwweEY3LDB4RjMsMHg4MCwweEMyLDB4MzAsMHg4QiwweERFLDB4RDEsCisweEUzLDB4OEIsMHg5RiwweDU5LDB4MDIsMHg4OCwweDU3LDB4MDMsMHhCQiwweDBBLDB4MDAsMHg4QiwweDQ2LDB4RkEsMHgzMywweEQyLAorMHhGNywweEYzLDB4ODksMHg0NiwweEZBLDB4ODMsMHg3RSwweEZBLDB4MDAsMHg3NCwweDE4LDB4OEIsMHg0NiwweEZBLDB4QkIsMHgwQSwKKzB4MDAsMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwweEUzLDB4OEIsMHg5RiwweDU5LDB4MDIsCisweDg4LDB4NTcsMHgwMiwweDhCLDB4NDYsMHhFNiwweDg5LDB4NDYsMHhGQSwweDgzLDB4N0UsMHhGQSwweDAwLDB4NzQsMHgxOCwweDhCLAorMHg0NiwweEZBLDB4QkIsMHgwQSwweDAwLDB4MzMsMHhEMiwweEY3LDB4RjMsMHg4MCwweEMyLDB4MzAsMHg4QiwweERFLDB4RDEsMHhFMywKKzB4OEIsMHg5RiwweDYxLDB4MDIsMHg4OCwweDU3LDB4MDMsMHhCQiwweDBBLDB4MDAsMHg4QiwweDQ2LDB4RkEsMHgzMywweEQyLDB4RjcsCisweEYzLDB4ODksMHg0NiwweEZBLDB4ODMsMHg3RSwweEZBLDB4MDAsMHg3NCwweDE4LDB4OEIsMHg0NiwweEZBLDB4QkIsMHgwQSwweDAwLAorMHgzMywweEQyLDB4RjcsMHhGMywweDgwLDB4QzIsMHgzMCwweDhCLDB4REUsMHhEMSwweEUzLDB4OEIsMHg5RiwweDYxLDB4MDIsMHg4OCwKKzB4NTcsMHgwMiwweDhCLDB4NUUsMHhFNiwweEQxLDB4RTMsMHhGRiwweEI3LDB4MTIsMHgwMiwweDZBLDB4MDAsMHhGRiwweDc2LDB4MDQsCisweEU4LDB4RDEsMHhGNiwweDgzLDB4QzQsMHgwNiwweDY4LDB4RDMsMHgwRiwweDZBLDB4MDEsMHhGRiwweDc2LDB4MDQsMHhFOCwweEMzLAorMHhGNiwweDgzLDB4QzQsMHgwNiwweEZGLDB4NzYsMHhFNiwweDU2LDB4RTgsMHgwMSwweDkzLDB4NTksMHg1OSwweDg5LDB4NTYsMHhGMiwKKzB4ODksMHg0NiwweEYwLDB4RkYsMHg3NiwweEU2LDB4NTYsMHhFOCwweDE0LDB4OTMsMHg1OSwweDU5LDB4ODksMHg1NiwweEVFLDB4ODksCisweDQ2LDB4RUMsMHg5QywweEZBLDB4QzQsMHg1RSwweEYwLDB4MjYsMHg4QiwweDA3LDB4ODksMHg0NiwweEVBLDB4QzQsMHg1RSwweEVDLAorMHgyNiwweDhCLDB4MDcsMHg4OSwweDQ2LDB4RTgsMHhCQSwweDUwLDB4RkYsMHhFRCwweDg5LDB4NDYsMHhGRSwweDlELDB4QzcsMHg0NiwKKzB4RTQsMHgwMSwweDAwLDB4RTgsMHhFRSwweEEwLDB4QkEsMHg1MCwweEZGLDB4RUQsMHg4OSwweDQ2LDB4RkMsMHg4QiwweDQ2LDB4RkMsCisweDJCLDB4NDYsMHhGRSwweDNELDB4RTgsMHgwMywweDczLDB4MDMsMHhFOSwweDgwLDB4MDEsMHg5QywweEZBLDB4QkEsMHg1MCwweEZGLAorMHhFRCwweDg5LDB4NDYsMHhGQywweDhCLDB4NDYsMHhGQywweDJCLDB4NDYsMHhGRSwweDg5LDB4NDYsMHhGOCwweEM0LDB4NUUsMHhGMCwKKzB4MjYsMHg4QiwweDA3LDB4MkIsMHg0NiwweEVBLDB4ODksMHg0NiwweEY2LDB4QzQsMHg1RSwweEYwLDB4MjYsMHg4QiwweDA3LDB4ODksCisweDQ2LDB4RUEsMHhDNCwweDVFLDB4RUMsMHgyNiwweDhCLDB4MDcsMHgyQiwweDQ2LDB4RTgsMHg4OSwweDQ2LDB4RjQsMHhDNCwweDVFLAorMHhFQywweDI2LDB4OEIsMHgwNywweDg5LDB4NDYsMHhFOCwweEJBLDB4NTAsMHhGRiwweEVELDB4ODksMHg0NiwweEZFLDB4OUQsMHg4MSwKKzB4N0UsMHhGOCwweEU4LDB4MDMsMHg3NiwweDFDLDB4RkYsMHg3NiwweEY4LDB4RkYsMHg3NiwweEY2LDB4RTgsMHg3NiwweDAxLDB4NTksCisweDU5LDB4ODksMHg0NiwweEY2LDB4RkYsMHg3NiwweEY4LDB4RkYsMHg3NiwweEY0LDB4RTgsMHg2OCwweDAxLDB4NTksMHg1OSwweDg5LAorMHg0NiwweEY0LDB4QkYsMHgwRSwweDAwLDB4RUIsMHgxNywweDhCLDB4REUsMHhEMSwweEUzLDB4OEIsMHg5RiwweDU5LDB4MDIsMHhDNiwKKzB4MDEsMHgyMCwweDhCLDB4REUsMHhEMSwweEUzLDB4OEIsMHg5RiwweDYxLDB4MDIsMHhDNiwweDAxLDB4MjAsMHg0NywweDgzLDB4RkYsCisweDExLDB4NzYsMHhFNCwweDhCLDB4REUsMHhEMSwweEUzLDB4OEIsMHg5RiwweDU5LDB4MDIsMHhDNiwweDQ3LDB4MEQsMHgzMCwweDhCLAorMHhERSwweEQxLDB4RTMsMHg4QiwweDlGLDB4NjEsMHgwMiwweEM2LDB4NDcsMHgwRCwweDMwLDB4ODMsMHg3RSwweEY2LDB4MDksMHg3NywKKzB4MDUsMHhCOCwweDBELDB4MDAsMHhFQiwweDI2LDB4ODMsMHg3RSwweEY2LDB4NjMsMHg3NywweDA1LDB4QjgsMHgwRSwweDAwLDB4RUIsCisweDFCLDB4ODEsMHg3RSwweEY2LDB4RTcsMHgwMywweDc3LDB4MDUsMHhCOCwweDBGLDB4MDAsMHhFQiwweDBGLDB4ODEsMHg3RSwweEY2LAorMHgwRiwweDI3LDB4NzcsMHgwNSwweEI4LDB4MTAsMHgwMCwweEVCLDB4MDMsMHhCOCwweDExLDB4MDAsMHg4QiwweEY4LDB4RUIsMHgyNSwKKzB4OEIsMHg0NiwweEY2LDB4QkIsMHgwQSwweDAwLDB4MzMsMHhEMiwweEY3LDB4RjMsMHg4MCwweEMyLDB4MzAsMHg4QiwweERFLDB4RDEsCisweEUzLDB4OEIsMHg5RiwweDU5LDB4MDIsMHg4OCwweDExLDB4NEYsMHhCQiwweDBBLDB4MDAsMHg4QiwweDQ2LDB4RjYsMHgzMywweEQyLAorMHhGNywweEYzLDB4ODksMHg0NiwweEY2LDB4ODMsMHg3RSwweEY2LDB4MDAsMHg3NSwweEQ1LDB4ODMsMHg3RSwweEY0LDB4MDksMHg3NywKKzB4MDUsMHhCOCwweDBELDB4MDAsMHhFQiwweDI2LDB4ODMsMHg3RSwweEY0LDB4NjMsMHg3NywweDA1LDB4QjgsMHgwRSwweDAwLDB4RUIsCisweDFCLDB4ODEsMHg3RSwweEY0LDB4RTcsMHgwMywweDc3LDB4MDUsMHhCOCwweDBGLDB4MDAsMHhFQiwweDBGLDB4ODEsMHg3RSwweEY0LAorMHgwRiwweDI3LDB4NzcsMHgwNSwweEI4LDB4MTAsMHgwMCwweEVCLDB4MDMsMHhCOCwweDExLDB4MDAsMHg4QiwweEY4LDB4RUIsMHgyNSwKKzB4OEIsMHg0NiwweEY0LDB4QkIsMHgwQSwweDAwLDB4MzMsMHhEMiwweEY3LDB4RjMsMHg4MCwweEMyLDB4MzAsMHg4QiwweERFLDB4RDEsCisweEUzLDB4OEIsMHg5RiwweDYxLDB4MDIsMHg4OCwweDExLDB4NEYsMHhCQiwweDBBLDB4MDAsMHg4QiwweDQ2LDB4RjQsMHgzMywweEQyLAorMHhGNywweEYzLDB4ODksMHg0NiwweEY0LDB4ODMsMHg3RSwweEY0LDB4MDAsMHg3NSwweEQ1LDB4OEIsMHhERSwweEQxLDB4RTMsMHhGRiwKKzB4QjcsMHg1OSwweDAyLDB4RkYsMHg3NiwweDA0LDB4RTgsMHg2RSwweDAwLDB4NTksMHg1OSwweDhCLDB4REUsMHhEMSwweEUzLDB4RkYsCisweEI3LDB4NjEsMHgwMiwweEZGLDB4NzYsMHgwNCwweEU4LDB4NUUsMHgwMCwweDU5LDB4NTksMHg2QSwweDAwLDB4RkYsMHg3NiwweDA0LAorMHhFOCwweDMxLDB4RjMsMHg1OSwweDU5LDB4OEIsMHhEOCwweDgzLDB4RkIsMHgwNCwweDc3LDB4MUYsMHhEMSwweEUzLDB4MkUsMHhGRiwKKzB4QTcsMHgxQiwweDcwLDB4RUIsMHgyMiwweEM3LDB4NDYsMHhFNCwweDAwLDB4MDAsMHhGRiwweDRFLDB4RTYsMHhFQiwweDBDLDB4QzcsCisweDQ2LDB4RTQsMHgwMCwweDAwLDB4RkYsMHg0NiwweEU2LDB4RUIsMHgwMiwweEVCLDB4MDAsMHg4MywweDdFLDB4RTQsMHgwMCwweDc0LAorMHgwMywweEU5LDB4MkEsMHhGRSwweEU5LDB4RDQsMHhGQywweDVGLDB4NUUsMHhDOSwweEMzLDB4RjMsMHg2RiwweEY1LDB4NkYsMHhGRiwKKzB4NkYsMHhGMywweDZGLDB4MDksMHg3MCwweDU1LDB4OEIsMHhFQywweDhCLDB4NDYsMHgwNCwweEI5LDB4RTgsMHgwMywweEY3LDB4RTEsCisweDhCLDB4NEUsMHgwNiwweEY3LDB4RjEsMHg1RCwweEMzLDB4NTUsMHg4QiwweEVDLDB4NTYsMHg4QiwweDc2LDB4MDYsMHhFQiwweDBFLAorMHg4QiwweERFLDB4NDYsMHg4QSwweDA3LDB4NTAsMHhGRiwweDc2LDB4MDQsMHhFOCwweDMzLDB4MDAsMHg1OSwweDU5LDB4ODAsMHgzQywKKzB4MDAsMHg3NSwweEVELDB4RUIsMHgwMCwweDVFLDB4NUQsMHhDMywweDU1LDB4OEIsMHhFQywweDU2LDB4OEIsMHg3NiwweDA2LDB4RUIsCisweDE0LDB4OEIsMHhERSwweDQ2LDB4OEEsMHgwNywweDUwLDB4RkYsMHg3NiwweDA0LDB4RTgsMHg0NSwweDAwLDB4NTksMHg1OSwweDBCLAorMHhDMCwweDc0LDB4MDIsMHhFQiwweDA3LDB4ODAsMHgzQywweDAwLDB4NzUsMHhFNywweEVCLDB4MDAsMHg1RSwweDVELDB4QzMsMHhDOCwKKzB4MDIsMHgwMCwweDAwLDB4NTYsMHg4QiwweDc2LDB4MDQsMHg4QSwweDQ0LDB4NUEsMHg5OCwweDg5LDB4NDYsMHhGRSwweDlDLDB4RkEsCisweDhBLDB4NDYsMHhGRSwweEJBLDB4RkUsMHgwMCwweEVFLDB4QkEsMHgwMiwweDAwLDB4RUMsMHhBOCwweDAyLDB4NzQsMHgwNiwweDlELAorMHhFOCwweDkxLDB4OUUsMHhFQiwweEU5LDB4QkEsMHgwMCwweDAwLDB4OEEsMHg0NiwweDA2LDB4RUUsMHg5RCwweEVCLDB4MDAsMHg1RSwKKzB4QzksMHhDMywweEM4LDB4MDQsMHgwMCwweDAwLDB4NTYsMHg4QiwweDc2LDB4MDQsMHg4QSwweDQ0LDB4NUEsMHg5OCwweDg5LDB4NDYsCisweEZFLDB4RTgsMHhFNiwweEExLDB4ODksMHg0NiwweEZDLDB4RTgsMHhFMCwweEExLDB4MkIsMHg0NiwweEZDLDB4M0QsMHhCOCwweDBCLAorMHg3NiwweDA1LDB4QjgsMHgwMSwweDAwLDB4RUIsMHgyMywweDlDLDB4RkEsMHg4QSwweDQ2LDB4RkUsMHhCQSwweEZFLDB4MDAsMHhFRSwKKzB4QkEsMHgwMiwweDAwLDB4RUMsMHhBOCwweDAyLDB4NzQsMHgwNiwweDlELDB4RTgsMHg0OCwweDlFLDB4RUIsMHhEOSwweEJBLDB4MDAsCisweDAwLDB4OEEsMHg0NiwweDA2LDB4RUUsMHg5RCwweDMzLDB4QzAsMHhFQiwweDAwLDB4NUUsMHhDOSwweEMzLDB4QzgsMHgwNCwweDAwLAorMHgwMCwweDU2LDB4NTcsMHg4QiwweDc2LDB4MDQsMHg4MywweDdFLDB4MDYsMHgwMCwweDc0LDB4MDcsMHg1NiwweEU4LDB4MDMsMHgwMSwKKzB4NTksMHhFQiwweDA1LDB4NTYsMHhFOCwweEEyLDB4MDAsMHg1OSwweDg4LDB4NDYsMHhGRiwweDgwLDB4N0UsMHhGRiwweDA4LDB4NzcsCisweDA2LDB4OEEsMHg0NiwweEZGLDB4RTksMHg4NCwweDAwLDB4ODAsMHg3RSwweEZGLDB4MEYsMHg3NiwweDAzLDB4RUIsMHg3OSwweDkwLAorMHg4QSwweDQ2LDB4RkYsMHhCNCwweDAwLDB4MkQsMHgwQSwweDAwLDB4OEIsMHhEOCwweDgzLDB4RkIsMHgwNCwweDc3LDB4NjcsMHhEMSwKKzB4RTMsMHgyRSwweEZGLDB4QTcsMHhBRiwweDcxLDB4QjAsMHgwMCwweEVCLDB4NjEsMHg1NiwweEU4LDB4NkIsMHgwMCwweDU5LDB4QjQsCisweDAwLDB4MjUsMHgwRiwweDAwLDB4ODksMHg0NiwweEZDLDB4NTYsMHhFOCwweDVFLDB4MDAsMHg1OSwweEI0LDB4MDAsMHg4QiwweEY4LAorMHg1NiwweEU4LDB4NTUsMHgwMCwweDU5LDB4QjQsMHgwMCwweEMxLDB4RTAsMHgwOCwweDhCLDB4RDcsMHgwMywweEQwLDB4OEIsMHhGQSwKKzB4OEIsMHg1RSwweEZDLDB4RDEsMHhFMywweDg5LDB4NzgsMHgzMCwweEVCLDB4MkUsMHg1NiwweEU4LDB4M0IsMHgwMCwweDU5LDB4ODgsCisweDQ0LDB4NUIsMHhFQiwweDI0LDB4NTYsMHhFOCwweDMxLDB4MDAsMHg1OSwweDg4LDB4NDQsMHg1MCwweDU2LDB4RTgsMHgyOSwweDAwLAorMHg1OSwweDg4LDB4NDQsMHg1MSwweDU2LDB4RTgsMHgyMSwweDAwLDB4NTksMHg4OCwweDQ0LDB4NTIsMHg1NiwweEU4LDB4MTksMHgwMCwKKzB4NTksMHg4OCwweDQ0LDB4NTMsMHhFQiwweDAyLDB4RUIsMHgwMCwweEU5LDB4NUIsMHhGRiwweDVGLDB4NUUsMHhDOSwweEMzLDB4NDYsCisweDcxLDB4QTYsMHg3MSwweDRBLDB4NzEsMHg3QSwweDcxLDB4ODQsMHg3MSwweEM4LDB4MDQsMHgwMCwweDAwLDB4NTYsMHg4QiwweDc2LAorMHgwNCwweDhBLDB4NDQsMHg1QSwweDk4LDB4ODksMHg0NiwweEZFLDB4OUMsMHhGQSwweDhBLDB4NDYsMHhGRSwweEJBLDB4RkUsMHgwMCwKKzB4RUUsMHhCQSwweDAyLDB4MDAsMHhFQywweEE4LDB4MDEsMHg3NSwweDA2LDB4OUQsMHhFOCwweDU3LDB4OUQsMHhFQiwweEU5LDB4QkEsCisweDAwLDB4MDAsMHhFQywweDg4LDB4NDYsMHhGRCwweDlELDB4OEEsMHg0NiwweEZELDB4RUIsMHgwMCwweDVFLDB4QzksMHhDMywweEM4LAorMHgwMiwweDAwLDB4MDAsMHg1NiwweDhCLDB4NzYsMHgwNCwweDhBLDB4NDQsMHg1QSwweDk4LDB4ODksMHg0NiwweEZFLDB4OUMsMHhGQSwKKzB4OEEsMHg0NiwweEZFLDB4QkEsMHhGRSwweDAwLDB4RUUsMHhCQSwweDAyLDB4MDAsMHhFQywweDMyLDB4RTQsMHgyNCwweDAxLDB4OUQsCisweDVFLDB4QzksMHhDMywweEM4LDB4MDYsMHgwMCwweDAwLDB4NTYsMHg4QiwweDc2LDB4MDQsMHg4QSwweDQ0LDB4NUEsMHg5OCwweDg5LAorMHg0NiwweEZFLDB4RTgsMHg4NSwweEEwLDB4ODksMHg0NiwweEZBLDB4RTgsMHg3RiwweEEwLDB4MkIsMHg0NiwweEZBLDB4M0QsMHhCOCwKKzB4MEIsMHg3NiwweDA0LDB4QjAsMHgwOCwweEVCLDB4MjQsMHg5QywweEZBLDB4OEEsMHg0NiwweEZFLDB4QkEsMHhGRSwweDAwLDB4RUUsCisweEJBLDB4MDIsMHgwMCwweEVDLDB4QTgsMHgwMSwweDc1LDB4MDYsMHg5RCwweEU4LDB4RTgsMHg5QywweEVCLDB4REEsMHhCQSwweDAwLAorMHgwMCwweEVDLDB4ODgsMHg0NiwweEZELDB4OUQsMHg4QSwweDQ2LDB4RkQsMHhFQiwweDAwLDB4NUUsMHhDOSwweEMzLDB4NTUsMHg4QiwKKzB4RUMsMHg1NiwweDhCLDB4NTYsMHgwNCwweDhBLDB4NDYsMHgwNiwweEVFLDB4MzMsMHhGNiwweEVCLDB4MDMsMHg1MCwweDU4LDB4NDYsCisweDgzLDB4RkUsMHgxNCwweDdDLDB4RjgsMHg1RSwweDVELDB4QzMsMHhDOCwweDAyLDB4MDAsMHgwMCwweDU2LDB4OEIsMHg1NiwweDA0LAorMHhFQywweDg4LDB4NDYsMHhGRiwweDMzLDB4RjYsMHhFQiwweDAzLDB4NTAsMHg1OCwweDQ2LDB4ODMsMHhGRSwweDE0LDB4N0MsMHhGOCwKKzB4OEEsMHg0NiwweEZGLDB4RUIsMHgwMCwweDVFLDB4QzksMHhDMywweEM4LDB4MDIsMHgwMCwweDAwLDB4NTYsMHg1NywweDhCLDB4NzYsCisweDA0LDB4ODMsMHgzRSwweEIwLDB4MEIsMHgwMCwweDc1LDB4MUYsMHhCQSwweDg4LDB4MDEsMHhCMCwweDAwLDB4RUUsMHhCQSwweDg2LAorMHgwMSwweEIwLDB4MDAsMHhFRSwweDZBLDB4MDksMHg2QSwweDAwLDB4NjgsMHgzMCwweDAxLDB4RTgsMHg3RCwweDAxLDB4ODMsMHhDNCwKKzB4MDYsMHhDNywweDA2LDB4QjAsMHgwQiwweDAxLDB4MDAsMHg2QSwweDA5LDB4OEIsMHhDNiwweDA1LDB4ODAsMHgwMSwweDUwLDB4RTgsCisweERBLDB4MDAsMHg1OSwweDU5LDB4OEIsMHhGOCwweDhCLDB4QzcsMHhDMSwweEU4LDB4MEMsMHgyNSwweDBGLDB4MDAsMHg4OSwweDQ2LAorMHhGRSwweDhCLDB4QzcsMHhDMSwweEU4LDB4MDgsMHgyNSwweDBGLDB4MDAsMHg4QiwweDU2LDB4RkUsMHg4MywweEYyLDB4MEMsMHgzQiwKKzB4QzIsMHg3NSwweDIxLDB4OEIsMHhDNywweEMxLDB4RTgsMHgwNCwweDI1LDB4MEYsMHgwMCwweDhCLDB4NTYsMHhGRSwweDgzLDB4RjIsCisweDA2LDB4M0IsMHhDMiwweDc1LDB4MEYsMHg4QiwweEM3LDB4MjUsMHgwRiwweDAwLDB4OEIsMHg1NiwweEZFLDB4ODMsMHhGMiwweDA5LAorMHgzQiwweEMyLDB4NzQsMHgwRCwweDZBLDB4MDcsMHg1NiwweEU4LDB4MzgsMHgwMCwweDU5LDB4NTksMHhDNywweDQ2LDB4RkUsMHgwNywKKzB4MDAsMHg4QSwweDQ2LDB4RkUsMHgwNCwweDgwLDB4QTIsMHgzMywweDAyLDB4OEIsMHhDNiwweEJBLDB4NjIsMHgwMCwweEY3LDB4RUEsCisweDhBLDB4NTYsMHhGRSwweDhCLDB4RDgsMHg4OCwweDk3LDB4NkMsMHgwMCwweDY4LDB4MzIsMHgwMiwweDhCLDB4QzYsMHhCQSwweDYyLAorMHgwMCwweEY3LDB4RUEsMHgwNSwweDE0LDB4MDAsMHg1MCwweEU4LDB4MEUsMHhGRCwweDU5LDB4NTksMHhFQiwweDAwLDB4NUYsMHg1RSwKKzB4QzksMHhDMywweEM4LDB4MDIsMHgwMCwweDAwLDB4NTYsMHg4QiwweDc2LDB4MDYsMHg4MywweEU2LDB4MEYsMHg4QiwweEM2LDB4QzEsCisweEUwLDB4MEMsMHg4QiwweEQ2LDB4ODMsMHhGMiwweDBDLDB4QzEsMHhFMiwweDA4LDB4MEIsMHhDMiwweDhCLDB4RDYsMHg4MywweEYyLAorMHgwNiwweEMxLDB4RTIsMHgwNCwweDBCLDB4QzIsMHg4QiwweEQ2LDB4ODMsMHhGMiwweDA5LDB4MEIsMHhDMiwweDg5LDB4NDYsMHhGRSwKKzB4NkEsMHgxOSwweDZBLDB4MTAsMHg4QiwweDQ2LDB4MDQsMHg5OSwweDA1LDB4NDAsMHgwMSwweDgzLDB4RDIsMHgwMCwweDUyLDB4NTAsCisweEU4LDB4NkIsMHgwMSwweDgzLDB4QzQsMHgwNiwweDBCLDB4NDYsMHhGRSwweDgzLDB4Q0EsMHgwMCwweDUyLDB4NTAsMHhFOCwweDlBLAorMHgwMCwweDgzLDB4QzQsMHgwNiwweEU4LDB4MjUsMHgwMSwweEVCLDB4MDAsMHg1RSwweEM5LDB4QzMsMHg1NSwweDhCLDB4RUMsMHg1NiwKKzB4NTcsMHgzMywweEZGLDB4NkEsMHgwMSwweDY4LDB4ODYsMHgwMSwweEU4LDB4QTMsMHhGRSwweDU5LDB4NTksMHhCMSwweDEwLDB4MkEsCisweDRFLDB4MDYsMHhEMywweDY2LDB4MDQsMHgzMywweEY2LDB4RUIsMHgyRSwweDgxLDB4N0UsMHgwNCwweDAwLDB4ODAsMHg3MiwweDA0LAorMHhCMCwweDAxLDB4RUIsMHgwMiwweEIwLDB4MDAsMHg1MCwweDY4LDB4ODgsMHgwMSwweEU4LDB4ODEsMHhGRSwweDU5LDB4NTksMHg2QSwKKzB4MDMsMHg2OCwweDg2LDB4MDEsMHhFOCwweDc3LDB4RkUsMHg1OSwweDU5LDB4NkEsMHgwMSwweDY4LDB4ODYsMHgwMSwweEU4LDB4NkQsCisweEZFLDB4NTksMHg1OSwweEQxLDB4NjYsMHgwNCwweDQ2LDB4M0IsMHg3NiwweDA2LDB4N0MsMHhDRCwweDMzLDB4RjYsMHhFQiwweDI0LAorMHhEMSwweEU3LDB4NkEsMHgwMywweDY4LDB4ODYsMHgwMSwweEU4LDB4NTQsMHhGRSwweDU5LDB4NTksMHg2QSwweDAxLDB4NjgsMHg4NiwKKzB4MDEsMHhFOCwweDRBLDB4RkUsMHg1OSwweDU5LDB4NjgsMHg4OCwweDAxLDB4RTgsMHg1QywweEZFLDB4NTksMHg5OCwweDI1LDB4MDEsCisweDAwLDB4MEIsMHhGOCwweDQ2LDB4ODMsMHhGRSwweDEwLDB4N0MsMHhENywweDZBLDB4MDAsMHg2OCwweDg2LDB4MDEsMHhFOCwweDJELAorMHhGRSwweDU5LDB4NTksMHg4QiwweEM3LDB4RUIsMHgwMCwweDVGLDB4NUUsMHg1RCwweEMzLDB4NTUsMHg4QiwweEVDLDB4NTYsMHg1NywKKzB4OEIsMHg3RSwweDA4LDB4NkEsMHgwMSwweDY4LDB4ODYsMHgwMSwweEU4LDB4MTMsMHhGRSwweDU5LDB4NTksMHhCOCwweDIwLDB4MDAsCisweDJCLDB4QzcsMHg1MCwweEZGLDB4NzYsMHgwNiwweEZGLDB4NzYsMHgwNCwweEU4LDB4QTIsMHgwMCwweDgzLDB4QzQsMHgwNiwweDg5LAorMHg1NiwweDA2LDB4ODksMHg0NiwweDA0LDB4MzMsMHhGNiwweEVCLDB4NDcsMHg4MSwweDdFLDB4MDYsMHgwMCwweDgwLDB4NzIsMHgwQywKKzB4NzUsMHgwNiwweDgzLDB4N0UsMHgwNCwweDAwLDB4NzIsMHgwNCwweEIwLDB4MDEsMHhFQiwweDAyLDB4QjAsMHgwMCwweDUwLDB4NjgsCisweDg4LDB4MDEsMHhFOCwweEQ5LDB4RkQsMHg1OSwweDU5LDB4NkEsMHgwMywweDY4LDB4ODYsMHgwMSwweEU4LDB4Q0YsMHhGRCwweDU5LAorMHg1OSwweDZBLDB4MDEsMHg2OCwweDg2LDB4MDEsMHhFOCwweEM1LDB4RkQsMHg1OSwweDU5LDB4NkEsMHgwMSwweEZGLDB4NzYsMHgwNiwKKzB4RkYsMHg3NiwweDA0LDB4RTgsMHg1OCwweDAwLDB4ODMsMHhDNCwweDA2LDB4ODksMHg1NiwweDA2LDB4ODksMHg0NiwweDA0LDB4NDYsCisweDNCLDB4RjcsMHg3QywweEI1LDB4NkEsMHgwMCwweDY4LDB4ODYsMHgwMSwweEU4LDB4QTIsMHhGRCwweDU5LDB4NTksMHg2QSwweDAwLAorMHg2OCwweDg2LDB4MDEsMHhFOCwweDk4LDB4RkQsMHg1OSwweDU5LDB4NUYsMHg1RSwweDVELDB4QzMsMHg1NSwweDhCLDB4RUMsMHg1NiwKKzB4NkEsMHgwMSwweDY4LDB4ODYsMHgwMSwweEU4LDB4ODYsMHhGRCwweDU5LDB4NTksMHgzMywweEY2LDB4RUIsMHgwMCwweDY4LDB4ODgsCisweDAxLDB4RTgsMHg5NCwweEZELDB4NTksMHhBOCwweDAxLDB4NzUsMHgwOCwweDhCLDB4QzYsMHg0NiwweDNELDB4NjQsMHgwMCwweDdDLAorMHhFRCwweDZBLDB4MDAsMHg2OCwweDg2LDB4MDEsMHhFOCwweDY1LDB4RkQsMHg1OSwweDU5LDB4NUUsMHg1RCwweEMzLDB4QzgsMHgwNCwKKzB4MDAsMHgwMCwweDhCLDB4NDYsMHgwNCwweDhCLDB4NTYsMHgwNiwweDhCLDB4NEUsMHgwOCwweEUzLDB4MDYsMHhEMSwweEUwLDB4RDEsCisweEQyLDB4RTIsMHhGQSwweDg5LDB4NDYsMHhGQywweDg5LDB4NTYsMHhGRSwweDhCLDB4NTYsMHhGRSwweDhCLDB4NDYsMHhGQywweEVCLAorMHgwMCwweEM5LDB4QzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4NTAsMHg3MiwweDY1LDB4NzYsMHg2OSwweDZGLDB4NzUsMHg3MywweDIwLDB4NEQsMHg2NSwweDZFLDB4NzUsMHgwMCwweDQyLDB4NjUsCisweDY3LDB4NjksMHg2RSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LAorMHgyMCwweDMwLDB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4MzEsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMiwKKzB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4MzMsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzNCwweDAwLDB4NTAsCisweDZGLDB4NzIsMHg3NCwweDIwLDB4MzUsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzNiwweDAwLDB4NTAsMHg2RiwweDcyLAorMHg3NCwweDIwLDB4MzcsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzOCwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwKKzB4MzksMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMSwweDMwLDB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4MzEsCisweDMxLDB4MDAsMHg1MCwweDZGLDB4NzIsMHg3NCwweDIwLDB4MzEsMHgzMiwweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDMxLAorMHgzMywweDAwLDB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDMxLDB4MzQsMHgwMCwweDUwLDB4NkYsMHg3MiwweDc0LDB4MjAsMHgzMSwKKzB4MzUsMHgwMCwweDlDLDB4MDEsMHhBMywweDAxLDB4QUEsMHgwMSwweEIxLDB4MDEsMHhCOCwweDAxLDB4QkYsMHgwMSwweEM2LDB4MDEsCisweENELDB4MDEsMHhENCwweDAxLDB4REIsMHgwMSwweEUyLDB4MDEsMHhFQSwweDAxLDB4RjIsMHgwMSwweEZBLDB4MDEsMHgwMiwweDAyLAorMHgwQSwweDAyLDB4MDgsMHgwMCwweDAwLDB4MDcsMHg4MSwweDAwLDB4MDMsMHg4MCwweDgwLDB4ODAsMHg5RiwweDkxLDB4OTUsMHg5MSwKKzB4OUYsMHgwMCwweDAzLDB4ODEsMHg4NCwweDhFLDB4OTUsMHg4NCwweDg0LDB4ODQsMHg4NCwweDAwLDB4MDMsMHg4MiwweDg0LDB4ODQsCisweDg0LDB4ODQsMHg5NSwweDhFLDB4ODQsMHgwMCwweDA0LDB4ODgsMHgwMCwweEIyLDB4MEIsMHhDNiwweDBCLDB4REEsMHgwQiwweEVFLAorMHgwQiwweDAyLDB4MEMsMHgxNiwweDBDLDB4MkEsMHgwQywweDNFLDB4MEMsMHg1MiwweDBDLDB4NzcsMHgwQywweDlDLDB4MEMsMHhCRSwKKzB4MEMsMHhFMCwweDBDLDB4MDIsMHgwRCwweDAxLDB4ODAsMHgyMCwweDU0LDB4NjUsMHg3MywweDc0LDB4MjAsMHg1MCwweDYxLDB4NzMsCisweDczLDB4NjUsMHg2NCwweDIwLDB4MUYsMHgyMCwweDUwLDB4NzIsMHg2NSwweDczLDB4NzMsMHgyMCwweDgwLDB4MDIsMHgwMCwweDAxLAorMHg4MCwweDIwLDB4NEQsMHg2OSwweDczLDB4NzMsMHg2OSwweDZFLDB4NjcsMHgyMCwweDUyLDB4NzgsMHgyMCwweDQ0LDB4NjEsMHg3NCwKKzB4NjEsMHgxRiwweDIwLDB4NTAsMHg3MiwweDY1LDB4NzMsMHg3MywweDIwLDB4ODAsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4NDIsCisweDYxLDB4NjQsMHgyMCwweDUyLDB4NzgsMHgyMCwweDQ0LDB4NjEsMHg3NCwweDYxLDB4MjAsMHgxRiwweDIwLDB4NTAsMHg3MiwweDY1LAorMHg3MywweDczLDB4MjAsMHg4MCwweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHg1OCwweDZELDB4NzQsMHg3MiwweDIwLDB4NDIsMHg3NSwKKzB4NzMsMHg3OSwweDFGLDB4MjAsMHg1MCwweDcyLDB4NjUsMHg3MywweDczLDB4MjAsMHg4MCwweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsCisweDZFLDB4NkYsMHg3NCwweDIwLDB4NjMsMHg3NSwweDcyLDB4NzIsMHg2NSwweDZFLDB4NzQsMHg2QywweDc5LDB4MUYsMHgyMCwweDIwLAorMHg2OSwweDZELDB4NzAsMHg2QywweDY1LDB4NkQsMHg2NSwweDZFLDB4NzQsMHg2NSwweDY0LDB4MDIsMHgwMCwweDI0LDB4MEQsMHgyRiwKKzB4MEQsMHgzQSwweDBELDB4NDUsMHgwRCwweDUwLDB4MEQsMHg1QiwweDBELDB4NjYsMHgwRCwweDcxLDB4MEQsMHg3QywweDBELDB4ODcsCisweDBELDB4OTIsMHgwRCwweDlELDB4MEQsMHhBOCwweDBELDB4QjMsMHgwRCwweEJFLDB4MEQsMHhDOSwweDBELDB4NTMsMHg4MCwweDJDLAorMHgzMiwweDU0LDB4NDQsMHgyMCwweDUzLDB4ODYsMHgyQywweDMzLDB4NDQsMHg1NCwweDUyLDB4MjAsMHg1MywweDgyLDB4MkMsMHgzMywKKzB4NTIsMHg1NCwweDUzLDB4MjAsMHgxRiwweDUzLDB4ODEsMHgyQywweDMyLDB4NTIsMHg0NCwweDIwLDB4NTMsMHg4NSwweDJDLDB4MzIsCisweDQzLDB4NDQsMHgyMCwweDUzLDB4ODMsMHgyQywweDMzLDB4NDMsMHg1NCwweDUzLDB4MjAsMHg1MywweDg0LDB4MkMsMHgzMywweDQ0LAorMHg1MywweDUyLDB4MjAsMHg1MywweDg3LDB4MkMsMHgzMiwweDUyLDB4NDksMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwKKzB4NDQsMHg0MywweDQ0LDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMiwweDMwLDB4MUYsMHgyNywweDUzLDB4ODUsCisweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LAorMHg4QSwweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDQ0LDB4NTMsMHg1MiwKKzB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMSwweDMxLDB4MUYsMHgyNywweDUzLDB4ODQsMHgyRSwweDMxLDB4ODEsCisweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLAorMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDQzLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwKKzB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNCwweDFGLDB4MjcsMHg1MywweDgzLDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsCisweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LAorMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDQ5LDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMiwKKzB4MzIsMHgxRiwweDI3LDB4NTMsMHg4NywweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsCisweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLAorMHgyMCwweDIwLDB4NDQsMHg1NCwweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNiwweDJGLDB4MzgsMHgxRiwKKzB4MjcsMHg1MywweDg2LDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsCisweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLAorMHg1MiwweDU0LDB4NTMsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM1LDB4MUYsMHgyNywweDUzLDB4ODIsMHgyRSwKKzB4MzEsMHg4MSwweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsCisweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NzgsMHg0NCwweDIwLAorMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMiwweDFGLDB4MjcsMHg1MywweDgxLDB4MkUsMHgzMCwweDUzLDB4NEQsMHg4MSwKKzB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsCisweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NTQsMHg3OCwweDQ0LDB4MjAsMHgyRCwweDIwLAorMHg3MCwweDY5LDB4NkUsMHgyMCwweDMzLDB4MUYsMHgyNywweDUzLDB4ODAsMHgyRSwweDMwLDB4NTMsMHg0RCwweDgxLDB4ODIsMHg2MywKKzB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsCisweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg0NCwweDQzLDB4NDQsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LAorMHg2RSwweDIwLDB4MzUsMHgxRiwweDI3LDB4NTMsMHg4NSwweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwKKzB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsCisweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1MywweDUyLDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNSwweDFGLAorMHgyNywweDUzLDB4ODQsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwKKzB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsCisweDQzLDB4NTQsMHg1MywweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzEsMHgxRiwweDI3LDB4NTMsMHg4MywweDJFLAorMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LDB4ODksMHg4QSwKKzB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NTIsMHg0OSwweDIwLDB4MkQsCisweDIwLDB4MjgsMHg2RSwweDJFLDB4NjMsMHgyRSwweDI5LDB4MUYsMHgyNywweDUzLDB4ODcsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLAorMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwKKzB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDQ0LDB4NTQsMHg1MiwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksCisweDZFLDB4MjAsMHgzMiwweDFGLDB4MjcsMHg1MywweDg2LDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLAorMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwKKzB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDU0LDB4NTMsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM3LDB4MUYsCisweDI3LDB4NTMsMHg4MiwweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg5MCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LAorMHg4NywweDg4LDB4ODksMHg4QSwweDhCLDB4OEMsMHg4RCwweDhFLDB4OEYsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwKKzB4NTIsMHg3OCwweDQ0LDB4MjAsMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzNiwweDFGLDB4MjcsMHg1MywweDgxLDB4MkUsCisweDMwLDB4NTMsMHg0RCwweDgxLDB4ODIsMHg2MywweDkwLDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDg4LAorMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NTQsMHg3OCwKKzB4NDQsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMzLDB4MUYsMHgyNywweDUzLDB4ODAsMHgyRSwweDMwLDB4NTMsCisweDRELDB4ODEsMHg4MiwweDYzLDB4OTAsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLAorMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg0NCwweDQzLDB4NDQsMHgyMCwKKzB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzUsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDg1LDB4MkUsCisweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLAorMHgwMSwweDgwLDB4MjAsMHgyMCwweDQ0LDB4NTMsMHg1MiwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzUsMHgxRiwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODQsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsCisweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDQzLDB4NTQsMHg1MywweDIwLAorMHgyRCwweDIwLDB4NzAsMHg2OSwweDZFLDB4MjAsMHgzMSwweDFGLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODMsMHgyRSwKKzB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsCisweDAxLDB4ODAsMHgyMCwweDIwLDB4NTIsMHg0OSwweDIwLDB4MkQsMHgyMCwweDI4LDB4NkUsMHgyRSwweDYzLDB4MkUsMHgyOSwweDFGLAorMHgyMCwweDIwLDB4MjAsMHgyMCwweDI3LDB4NTMsMHg4NywweDJFLDB4MzEsMHg4MSwweDgyLDB4NjMsMHg4OCwweDgwLDB4ODEsMHg4MiwKKzB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4NDQsMHg1NCwweDUyLDB4MjAsCisweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMyLDB4MUYsMHgyMCwweDIwLDB4MjAsMHgyMCwweDI3LDB4NTMsMHg4NiwweDJFLAorMHgzMSwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwKKzB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDU0LDB4NTMsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM3LDB4MUYsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDgyLDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLAorMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDc4LDB4NDQsMHgyMCwKKzB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzYsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDgxLDB4MkUsCisweDMwLDB4NTMsMHg0RCwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDI3LAorMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1NCwweDc4LDB4NDQsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwKKzB4MzMsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDgwLDB4MkUsMHgzMCwweDUzLDB4NEQsMHg4MSwweDgyLDB4NjMsCisweDg4LDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLAorMHg0NCwweDQzLDB4NDQsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDMyLDB4MzAsMHgxRiwweDIwLDB4MjAsMHgyMCwKKzB4MjAsMHgyNywweDUzLDB4ODUsMHgyRSwweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsCisweDg2LDB4ODcsMHgyNywweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDQ0LDB4NTMsMHg1MiwweDIwLDB4MkQsMHgyMCwweDcwLAorMHg2OSwweDZFLDB4MjAsMHgzMSwweDMxLDB4MUYsMHgyMCwweDIwLDB4MjAsMHgyMCwweDI3LDB4NTMsMHg4NCwweDJFLDB4MzEsMHg4MSwKKzB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsMHg4NywweDI3LDB4MDIsMHgwMCwweDAxLDB4ODAsCisweDIwLDB4MjAsMHg0MywweDU0LDB4NTMsMHgyMCwweDJELDB4MjAsMHg3MCwweDY5LDB4NkUsMHgyMCwweDM0LDB4MUYsMHgyMCwweDIwLAorMHgyMCwweDIwLDB4MjcsMHg1MywweDgzLDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwKKzB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDQ5LDB4MjAsMHgyRCwweDIwLDB4NzAsCisweDY5LDB4NkUsMHgyMCwweDMyLDB4MzIsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDg3LDB4MkUsMHgzMSwweDgxLAorMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwKKzB4MjAsMHgyMCwweDQ0LDB4NTQsMHg1MiwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzYsMHgyRiwweDM4LDB4MUYsCisweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDg2LDB4MkUsMHgzMSwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLAorMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1MiwweDU0LDB4NTMsMHgyMCwKKzB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzUsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywweDgyLDB4MkUsCisweDMxLDB4ODEsMHg4MiwweDYzLDB4ODgsMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLAorMHgwMSwweDgwLDB4MjAsMHgyMCwweDUyLDB4NzgsMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzIsMHgxRiwKKzB4MjAsMHgyMCwweDIwLDB4MjAsMHgyNywweDUzLDB4ODEsMHgyRSwweDMwLDB4NTMsMHg0RCwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsCisweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4MjcsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHg1NCwweDc4LAorMHg0NCwweDIwLDB4MkQsMHgyMCwweDcwLDB4NjksMHg2RSwweDIwLDB4MzMsMHgxRiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjcsMHg1MywKKzB4ODAsMHgyRSwweDMwLDB4NTMsMHg0RCwweDgxLDB4ODIsMHg2MywweDg4LDB4ODAsMHg4MSwweDgyLDB4ODMsMHg4NCwweDg1LDB4ODYsCisweDg3LDB4MjcsMHgwMiwweDAwLDB4NjgsMHgwNCwweDk2LDB4MDQsMHhCNiwweDAzLDB4M0MsMHgwNCwweDBFLDB4MDQsMHg4OSwweDAzLAorMHg1QywweDAzLDB4RTIsMHgwMywweDYwLDB4MDgsMHg4QSwweDA4LDB4QkUsMHgwNywweDM4LDB4MDgsMHgwRSwweDA4LDB4OTUsMHgwNywKKzB4NkMsMHgwNywweEU2LDB4MDcsMHgxQywweDA1LDB4NzQsMHgwNSwweEZBLDB4MDUsMHhDNCwweDA0LDB4RjAsMHgwNCwweENDLDB4MDUsCisweEEwLDB4MDUsMHg0OCwweDA1LDB4NzgsMHgwNiwweEM4LDB4MDYsMHg0MiwweDA3LDB4MjgsMHgwNiwweDUwLDB4MDYsMHgxOCwweDA3LAorMHhGMCwweDA2LDB4QTAsMHgwNiwweDAwLDB4MDAsMHhGNCwweDA4LDB4RjQsMHgwOCwweEQ0LDB4MEQsMHgwNCwweDA5LDB4MDQsMHgwOSwKKzB4MDQsMHgwOSwweDA0LDB4MDksMHg0MiwweDAwLDB4MEMsMHgwOSwweDFDLDB4MDksMHhFNSwweDBELDB4MDIsMHgwMCwweDE0LDB4MDksCisweDA0LDB4MDksMHhGNCwweDBELDB4NDMsMHgwMCwweDFDLDB4MDksMHgwQywweDA5LDB4MDUsMHgwRSwweDAwLDB4MDQsMHgwNCwweDA5LAorMHgxNCwweDA5LDB4MTIsMHgwRSwweDJDLDB4MDksMHgyQywweDA5LDB4MkMsMHgwOSwweDJDLDB4MDksMHgwMCwweDAwLDB4M0MsMHgwOSwKKzB4NkMsMHgwOSwweDFFLDB4MEUsMHg3NCwweDA5LDB4NzQsMHgwOSwweDc0LDB4MDksMHg3NCwweDA5LDB4MDAsMHgwMSwweDRDLDB4MDksCisweDJDLDB4MDksMHgyRCwweDBFLDB4NzQsMHgwOSwweDc0LDB4MDksMHg3NCwweDA5LDB4NzQsMHgwOSwweDAwLDB4MDIsMHg1QywweDA5LAorMHgzQywweDA5LDB4M0QsMHgwRSwweDc0LDB4MDksMHg3NCwweDA5LDB4NzQsMHgwOSwweDc0LDB4MDksMHgwMCwweDAzLDB4NkMsMHgwOSwKKzB4NEMsMHgwOSwweDRELDB4MEUsMHg3NCwweDA5LDB4NzQsMHgwOSwweDc0LDB4MDksMHg3NCwweDA5LDB4RkYsMHgwMCwweDJDLDB4MDksCisweDVDLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwNSwweDg0LDB4MDksMHhFQywweDA5LDB4NUUsMHgwRSwweEY0LDB4MDksMHhGNCwweDA5LAorMHhGNCwweDA5LDB4RjQsMHgwOSwweDAwLDB4MDYsMHg5NCwweDA5LDB4NzQsMHgwOSwweDY4LDB4MEUsMHhBQywweDBBLDB4QUMsMHgwQSwKKzB4QUMsMHgwQSwweEFDLDB4MEEsMHgwMCwweDA3LDB4QTQsMHgwOSwweDg0LDB4MDksMHg3MiwweDBFLDB4QkMsMHgwQSwweEJDLDB4MEEsCisweEJDLDB4MEEsMHhCQywweDBBLDB4MDAsMHgwOCwweEI0LDB4MDksMHg5NCwweDA5LDB4N0MsMHgwRSwweEQ0LDB4MEEsMHhENCwweDBBLAorMHhENCwweDBBLDB4RDQsMHgwQSwweDAwLDB4MEIsMHhDNCwweDA5LDB4QTQsMHgwOSwweDgzLDB4MEUsMHhGQywweDBBLDB4RkMsMHgwQSwKKzB4RkMsMHgwQSwweEZDLDB4MEEsMHgwMCwweDBDLDB4RDQsMHgwOSwweEI0LDB4MDksMHg5MCwweDBFLDB4MTQsMHgwQiwweDE0LDB4MEIsCisweDE0LDB4MEIsMHgxNCwweDBCLDB4MDAsMHgwMiwweEU0LDB4MDksMHhDNCwweDA5LDB4QTAsMHgwRSwweDJDLDB4MEIsMHgyQywweDBCLAorMHgyQywweDBCLDB4MkMsMHgwQiwweDA0LDB4MDAsMHhFQywweDA5LDB4RDQsMHgwOSwweDBFLDB4MDAsMHhGRiwweDAwLDB4NzQsMHgwOSwKKzB4RTQsMHgwOSwweDAwLDB4MDAsMHg4MiwweDAxLDB4RkMsMHgwOSwweEE0LDB4MEEsMHhBQywweDBFLDB4ODIsMHgwMiwweDA0LDB4MEEsCisweEY0LDB4MDksMHhBRiwweDBFLDB4ODIsMHgwMywweDBDLDB4MEEsMHhGQywweDA5LDB4QjIsMHgwRSwweDgyLDB4MDQsMHgxNCwweDBBLAorMHgwNCwweDBBLDB4QjYsMHgwRSwweDgyLDB4MDUsMHgxQywweDBBLDB4MEMsMHgwQSwweEJDLDB4MEUsMHg4MiwweDA2LDB4MjQsMHgwQSwKKzB4MTQsMHgwQSwweEMwLDB4MEUsMHg4MiwweDA3LDB4MkMsMHgwQSwweDFDLDB4MEEsMHhDNCwweDBFLDB4ODIsMHgwOCwweDM0LDB4MEEsCisweDI0LDB4MEEsMHhDOCwweDBFLDB4ODIsMHgwOSwweDNDLDB4MEEsMHgyQywweDBBLDB4Q0MsMHgwRSwweDgyLDB4MEEsMHg0NCwweDBBLAorMHgzNCwweDBBLDB4RDEsMHgwRSwweDgyLDB4MTAsMHg0QywweDBBLDB4M0MsMHgwQSwweEQ2LDB4MEUsMHg4MiwweDBCLDB4NTQsMHgwQSwKKzB4NDQsMHgwQSwweERCLDB4MEUsMHg4MiwweDExLDB4NUMsMHgwQSwweDRDLDB4MEEsMHhFMCwweDBFLDB4ODIsMHgwQywweDY0LDB4MEEsCisweDU0LDB4MEEsMHhFNSwweDBFLDB4ODIsMHgxMiwweDZDLDB4MEEsMHg1QywweDBBLDB4RUEsMHgwRSwweDgyLDB4MEQsMHg3NCwweDBBLAorMHg2NCwweDBBLDB4RUYsMHgwRSwweDgyLDB4MEUsMHg3QywweDBBLDB4NkMsMHgwQSwweEY0LDB4MEUsMHg4MiwweDBGLDB4ODQsMHgwQSwKKzB4NzQsMHgwQSwweEZCLDB4MEUsMHg4MiwweDEzLDB4OEMsMHgwQSwweDdDLDB4MEEsMHgwMiwweDBGLDB4ODIsMHgxNCwweDk0LDB4MEEsCisweDg0LDB4MEEsMHgwOSwweDBGLDB4ODIsMHgxNSwweDlDLDB4MEEsMHg4QywweDBBLDB4MTAsMHgwRiwweDgyLDB4MTYsMHhBNCwweDBBLAorMHg5NCwweDBBLDB4MTcsMHgwRiwweDgyLDB4MTcsMHhGNCwweDA5LDB4OUMsMHgwQSwweDFFLDB4MEYsMHg4MiwweDAyLDB4QjQsMHgwQSwKKzB4QjQsMHgwQSwweDI2LDB4MEYsMHg4MiwweDAzLDB4QUMsMHgwQSwweEFDLDB4MEEsMHgyRCwweDBGLDB4ODIsMHgwMCwweEM0LDB4MEEsCisweENDLDB4MEEsMHgzNCwweDBGLDB4ODIsMHgwMSwweENDLDB4MEEsMHhCQywweDBBLDB4M0YsMHgwRiwweDgyLDB4MDIsMHhCQywweDBBLAorMHhDNCwweDBBLDB4NEQsMHgwRiwweDgyLDB4MDAsMHhEQywweDBBLDB4RjQsMHgwQSwweDU5LDB4MEYsMHg4MiwweDAxLDB4RTQsMHgwQSwKKzB4RDQsMHgwQSwweDYzLDB4MEYsMHg4MiwweDAyLDB4RUMsMHgwQSwweERDLDB4MEEsMHg2RSwweDBGLDB4ODIsMHgwMywweEY0LDB4MEEsCisweEU0LDB4MEEsMHg3QSwweDBGLDB4ODIsMHgwNCwweEQ0LDB4MEEsMHhFQywweDBBLDB4ODcsMHgwRiwweDgyLDB4MDAsMHgwNCwweDBCLAorMHgwQywweDBCLDB4OTMsMHgwRiwweDgyLDB4MDEsMHgwQywweDBCLDB4RkMsMHgwQSwweDlCLDB4MEYsMHg4MiwweDAyLDB4RkMsMHgwQSwKKzB4MDQsMHgwQiwweEE3LDB4MEYsMHg4MiwweDAwLDB4MUMsMHgwQiwweDI0LDB4MEIsMHhCMCwweDBGLDB4ODIsMHgwMSwweDI0LDB4MEIsCisweDE0LDB4MEIsMHhCNSwweDBGLDB4ODIsMHgwMiwweDE0LDB4MEIsMHgxQywweDBCLDB4QkUsMHgwRiwweDQ0LDB4MDAsMHgzNCwweDBCLAorMHhBNCwweDBCLDB4OUMsMHgwMSwweDQ0LDB4MDEsMHgzQywweDBCLDB4MkMsMHgwQiwweEEzLDB4MDEsMHg0NCwweDAyLDB4NDQsMHgwQiwKKzB4MzQsMHgwQiwweEFBLDB4MDEsMHg0NCwweDAzLDB4NEMsMHgwQiwweDNDLDB4MEIsMHhCMSwweDAxLDB4NDQsMHgwNCwweDU0LDB4MEIsCisweDQ0LDB4MEIsMHhCOCwweDAxLDB4NDQsMHgwNSwweDVDLDB4MEIsMHg0QywweDBCLDB4QkYsMHgwMSwweDQ0LDB4MDYsMHg2NCwweDBCLAorMHg1NCwweDBCLDB4QzYsMHgwMSwweDQ0LDB4MDcsMHg2QywweDBCLDB4NUMsMHgwQiwweENELDB4MDEsMHg0NCwweDA4LDB4NzQsMHgwQiwKKzB4NjQsMHgwQiwweEQ0LDB4MDEsMHg0NCwweDA5LDB4N0MsMHgwQiwweDZDLDB4MEIsMHhEQiwweDAxLDB4NDQsMHgwQSwweDg0LDB4MEIsCisweDc0LDB4MEIsMHhFMiwweDAxLDB4NDQsMHgwQiwweDhDLDB4MEIsMHg3QywweDBCLDB4RUEsMHgwMSwweDQ0LDB4MEMsMHg5NCwweDBCLAorMHg4NCwweDBCLDB4RjIsMHgwMSwweDQ0LDB4MEQsMHg5QywweDBCLDB4OEMsMHgwQiwweEZBLDB4MDEsMHg0NCwweDBFLDB4QTQsMHgwQiwKKzB4OTQsMHgwQiwweDAyLDB4MDIsMHg0NCwweDBGLDB4MkMsMHgwQiwweDlDLDB4MEIsMHgwQSwweDAyLDB4MTcsMHgxRiwweDBGLDB4MkYsCisweDAwLDB4MDAsMHgwMSwweDgwLDB4NzgsMHg3OCwweDNBLDB4MjAsMHg3NCwweDc4LDB4MjAsMHg2MywweDcwLDB4NzMsMHgyMCwweDJBLAorMHgyQSwweDJBLDB4MkEsMHgyQSwweDAyLDB4MDAsMHgwMSwweDgwLDB4NzgsMHg3OCwweDNBLDB4MjAsMHg3NCwweDc4LDB4MjAsMHg2MywKKzB4NzAsMHg3MywweDIwLDB4MkEsMHgyQSwweDJBLDB4MkEsMHgyQSwweDAyLDB4MDAsMHgwMSwweDgwLDB4NzgsMHg3OCwweDNBLDB4MjAsCisweDc0LDB4NzgsMHgyMCwweDYzLDB4NzAsMHg3MywweDIwLDB4MkEsMHgyQSwweDJBLDB4MkEsMHgyQSwweDAyLDB4MDAsMHgwMSwweDgwLAorMHg3OCwweDc4LDB4M0EsMHgyMCwweDc0LDB4NzgsMHgyMCwweDYzLDB4NzAsMHg3MywweDIwLDB4MkEsMHgyQSwweDJBLDB4MkEsMHgyQSwKKzB4MDIsMHgwMCwweDAxLDB4QzAsMHg3OCwweDc4LDB4M0EsMHgyMCwweDcyLDB4NjMsMHgyMCwweDYzLDB4NzAsMHg3MywweDIwLDB4MkEsCisweDJBLDB4MkEsMHgyQSwweDJBLDB4MDIsMHgwMCwweDAxLDB4QzAsMHg3OCwweDc4LDB4M0EsMHgyMCwweDcyLDB4NjMsMHgyMCwweDYzLAorMHg3MCwweDczLDB4MjAsMHgyQSwweDJBLDB4MkEsMHgyQSwweDJBLDB4MDIsMHgwMCwweDAxLDB4QzAsMHg3OCwweDc4LDB4M0EsMHgyMCwKKzB4NzIsMHg2MywweDIwLDB4NjMsMHg3MCwweDczLDB4MjAsMHgyQSwweDJBLDB4MkEsMHgyQSwweDJBLDB4MDIsMHgwMCwweDAxLDB4QzAsCisweDc4LDB4NzgsMHgzQSwweDIwLDB4NzIsMHg2MywweDIwLDB4NjMsMHg3MCwweDczLDB4MjAsMHgyQSwweDJBLDB4MkEsMHgyQSwweDJBLAorMHgwMiwweDAwLDB4MDEsMHg4MCwweDQ5LDB4NkUsMHg3MywweDc0LDB4NjEsMHg2QywweDZDLDB4MjAsMHg0QywweDZGLDB4NkYsMHg3MCwKKzB4NjIsMHg2MSwweDYzLDB4NkIsMHgxRiwweDUwLDB4NzIsMHg2NSwweDczLDB4NzMsMHgyMCwweDgwLDB4MjAsMHg3NCwweDZGLDB4MjAsCisweDczLDB4NzQsMHg2MSwweDcyLDB4NzQsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4NDMsMHg2MSwweDYyLDB4NkMsMHg2NSwweDIwLAorMHg3NCwweDZGLDB4MjAsMHg1MiwweDY1LDB4NkQsMHg2RiwweDc0LDB4NjUsMHgxRiwweDUwLDB4NzIsMHg2NSwweDczLDB4NzMsMHgyMCwKKzB4ODAsMHgyMCwweDc0LDB4NkYsMHgyMCwweDczLDB4NzQsMHg2MSwweDcyLDB4NzQsMHgwMiwweDAwLDB4MDEsMHg4MCwweDIwLDB4NEMsCisweDZGLDB4NjMsMHg2MSwweDZDLDB4MjAsMHg0QywweDZGLDB4NkYsMHg3MCwweDYyLDB4NjEsMHg2MywweDZCLDB4MjAsMHgxRiwweDIwLAorMHgyMCwweDUyLDB4NzUsMHg2RSwweDZFLDB4NjksMHg2RSwweDY3LDB4MjAsMHgyRSwweDJFLDB4MkUsMHgwMiwweDAwLDB4MDEsMHg4MCwKKzB4NTIsMHg2NSwweDZELDB4NkYsMHg3NCwweDY1LDB4MjAsMHg0QywweDZGLDB4NkYsMHg3MCwweDYyLDB4NjEsMHg2MywweDZCLDB4MjAsCisweDFGLDB4MjAsMHgyMCwweDUyLDB4NzUsMHg2RSwweDZFLDB4NjksMHg2RSwweDY3LDB4MjAsMHgyRSwweDJFLDB4MkUsMHgwMiwweDAwLAorMHgwMSwweDgwLDB4MjAsMHg0OSwweDZFLDB4NzQsMHg3MiwweDZFLDB4NkMsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLDB4NjIsMHg2MSwKKzB4NjMsMHg2QiwweDFGLDB4MjAsMHgyMCwweDUyLDB4NzUsMHg2RSwweDZFLDB4NjksMHg2RSwweDY3LDB4MjAsMHgyRSwweDJFLDB4MkUsCisweDAyLDB4MDAsMHgwMSwweDgwLDB4NTQsMHg3MiwweDYxLDB4NkUsMHg3MywweDZELDB4NjksMHg3NCwweDIwLDB4NTAsMHg2MSwweDc0LAorMHg3NCwweDY1LDB4NzIsMHg2RSwweDFGLDB4MjAsMHgyMCwweDUyLDB4NzUsMHg2RSwweDZFLDB4NjksMHg2RSwweDY3LDB4MjAsMHgyRSwKKzB4MkUsMHgyRSwweDAyLDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDMwLDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4MCwweDAwLDB4MDEsCisweDgwLDB4MjAsMHgyMCwweDMxLDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4MSwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHgzMiwweDNBLAorMHgyMCwweDI3LDB4NDMsMHg4MiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MjAsMHgzMywweDNBLDB4MjAsMHgyNywweDQzLDB4ODMsMHgwMCwKKzB4MDEsMHg4MCwweDIwLDB4MjAsMHgzNCwweDNBLDB4MjAsMHgyNywweDQzLDB4ODQsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4MzUsCisweDNBLDB4MjAsMHgyNywweDQzLDB4ODUsMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4MzYsMHgzQSwweDIwLDB4MjcsMHg0MywweDg2LAorMHgwMCwweDAxLDB4ODAsMHgyMCwweDIwLDB4MzcsMHgzQSwweDIwLDB4MjcsMHg0MywweDg3LDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwKKzB4MzgsMHgzQSwweDIwLDB4MjcsMHg0MywweDg4LDB4MDAsMHgwMSwweDgwLDB4MjAsMHgyMCwweDM5LDB4M0EsMHgyMCwweDI3LDB4NDMsCisweDg5LDB4MDAsMHgwMSwweDgwLDB4MjAsMHgzMSwweDMwLDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4QSwweDAwLDB4MDEsMHg4MCwweDIwLAorMHgzMSwweDMxLDB4M0EsMHgyMCwweDI3LDB4NDMsMHg4QiwweDAwLDB4MDEsMHg4MCwweDIwLDB4MzEsMHgzMiwweDNBLDB4MjAsMHgyNywKKzB4NDMsMHg4QywweDAwLDB4MDEsMHg4MCwweDIwLDB4MzEsMHgzMywweDNBLDB4MjAsMHgyNywweDQzLDB4OEQsMHgwMCwweDAxLDB4ODAsCisweDIwLDB4MzEsMHgzNCwweDNBLDB4MjAsMHgyNywweDQzLDB4OEUsMHgwMCwweDAxLDB4ODAsMHgyMCwweDMxLDB4MzUsMHgzQSwweDIwLAorMHgyNywweDQzLDB4OEYsMHgwMCwweDJBLDB4MkEsMHgyMCwweDRELDB4NjEsMHg2OSwweDZFLDB4MjAsMHgyMCwweDRELDB4NjUsMHg2RSwKKzB4NzUsMHgyMCwweDJBLDB4MkEsMHgwMCwweDRELDB4NkYsMHg2RSwweDY5LDB4NzQsMHg2RiwweDcyLDB4MjAsMHg2MSwweDIwLDB4NTAsCisweDZGLDB4NzIsMHg3NCwweDAwLDB4NEQsMHg2RiwweDZFLDB4NjksMHg3NCwweDZGLDB4NzIsMHgyMCwweDYxLDB4MjAsMHg1MywweDY5LAorMHg2NywweDZFLDB4NjEsMHg2QywweDAwLDB4NDUsMHg3MywweDc0LDB4NjksMHg2RCwweDYxLDB4NzQsMHg2NSwweDIwLDB4NDMsMHg1MCwKKzB4NTMsMHgwMCwweDQ0LDB4NjksMHg2MSwweDY3LDB4NkUsMHg2RiwweDczLDB4NzQsMHg2OSwweDYzLDB4NzMsMHgwMCwweDRDLDB4NkYsCisweDYzLDB4NjEsMHg2QywweDIwLDB4NEMsMHg2RiwweDZGLDB4NzAsMHg2MiwweDYxLDB4NjMsMHg2QiwweDAwLDB4NTIsMHg2NSwweDZELAorMHg2RiwweDc0LDB4NjUsMHgyMCwweDRDLDB4NkYsMHg2RiwweDcwLDB4NjIsMHg2MSwweDYzLDB4NkIsMHgwMCwweDQ5LDB4NkUsMHg3NCwKKzB4NzIsMHg2RSwweDZDLDB4MjAsMHg0QywweDZGLDB4NkYsMHg3MCwweDYyLDB4NjEsMHg2MywweDZCLDB4MDAsMHg1NCwweDcyLDB4NjEsCisweDZFLDB4NzMsMHg2RCwweDY5LDB4NzQsMHgyMCwweDUwLDB4NjEsMHg3NCwweDc0LDB4NjUsMHg3MiwweDZFLDB4MDAsMHg0MiwweDYxLAorMHg3NSwweDY0LDB4MjAsMHg1MiwweDYxLDB4NzQsMHg2NSwweDAwLDB4NDQsMHg2MSwweDc0LDB4NjEsMHgyMCwweDQyLDB4NjksMHg3NCwKKzB4NzMsMHgwMCwweDUzLDB4NzQsMHg2RiwweDcwLDB4MjAsMHg0MiwweDY5LDB4NzQsMHg3MywweDAwLDB4NTAsMHg2MSwweDcyLDB4NjksCisweDc0LDB4NzksMHgwMCwweDQ0LDB4NjEsMHg3NCwweDYxLDB4MjAsMHg1MCwweDYxLDB4NzQsMHg3NCwweDY1LDB4NzIsMHg2RSwweDAwLAorMHg1NCwweDc4LDB4MjAsMHg0NiwweDZDLDB4NkYsMHg3NywweDIwLDB4NDMsMHg2RiwweDZFLDB4NzQsMHg3MiwweDZGLDB4NkMsMHgwMCwKKzB4NTAsMHg2RiwweDcyLDB4NzQsMHgyMCwweDRFLDB4NzUsMHg2RCwweDYyLDB4NjUsMHg3MiwweDAwLDB4MzUsMHgzMCwweDAwLDB4MzcsCisweDM1LDB4MDAsMHgzMSwweDMxLDB4MzAsMHgwMCwweDMxLDB4MzMsMHgzNCwweDJFLDB4MzUsMHgwMCwweDMxLDB4MzUsMHgzMCwweDAwLAorMHgzMiwweDMwLDB4MzAsMHgwMCwweDMzLDB4MzAsMHgzMCwweDAwLDB4MzYsMHgzMCwweDMwLDB4MDAsMHgzMSwweDMyLDB4MzAsMHgzMCwKKzB4MDAsMHgzMSwweDM4LDB4MzAsMHgzMCwweDAwLDB4MzIsMHgzMCwweDMwLDB4MzAsMHgwMCwweDMyLDB4MzQsMHgzMCwweDMwLDB4MDAsCisweDMzLDB4MzYsMHgzMCwweDMwLDB4MDAsMHgzNCwweDM4LDB4MzAsMHgzMCwweDAwLDB4MzcsMHgzMiwweDMwLDB4MzAsMHgwMCwweDM5LAorMHgzNiwweDMwLDB4MzAsMHgwMCwweDMxLDB4MzksMHgyQywweDMyLDB4MzAsMHgzMCwweDAwLDB4MzMsMHgzOCwweDJDLDB4MzQsMHgzMCwKKzB4MzAsMHgwMCwweDM1LDB4MzYsMHgyQywweDMwLDB4MzAsMHgzMCwweDAwLDB4MzUsMHgzNywweDJDLDB4MzYsMHgzMCwweDMwLDB4MDAsCisweDM2LDB4MzQsMHgyQywweDMwLDB4MzAsMHgzMCwweDAwLDB4MzcsMHgzNiwweDJDLDB4MzgsMHgzMCwweDMwLDB4MDAsMHgzMSwweDMxLAorMHgzNSwweDJDLDB4MzIsMHgzMCwweDMwLDB4MDAsMHgzNywweDIwLDB4NjIsMHg2OSwweDc0LDB4NzMsMHgwMCwweDM4LDB4MjAsMHg2MiwKKzB4NjksMHg3NCwweDczLDB4MDAsMHgzMSwweDIwLDB4NzMsMHg3NCwweDZGLDB4NzAsMHgyMCwweDYyLDB4NjksMHg3NCwweDAwLDB4MzEsCisweDJFLDB4MzUsMHgyMCwweDczLDB4NzQsMHg2RiwweDcwLDB4MjAsMHg2MiwweDY5LDB4NzQsMHg3MywweDAwLDB4MzIsMHgyMCwweDczLAorMHg3NCwweDZGLDB4NzAsMHgyMCwweDYyLDB4NjksMHg3NCwweDczLDB4MDAsMHg2RSwweDZGLDB4MjAsMHg3MCwweDYxLDB4NzIsMHg2OSwKKzB4NzQsMHg3OSwweDAwLDB4NkYsMHg2NCwweDY0LDB4MjAsMHg3MCwweDYxLDB4NzIsMHg2OSwweDc0LDB4NzksMHgwMCwweDY1LDB4NzYsCisweDY1LDB4NkUsMHgyMCwweDcwLDB4NjEsMHg3MiwweDY5LDB4NzQsMHg3OSwweDAwLDB4NzMsMHg3MCwweDYxLDB4NjMsMHg2NSwweDIwLAorMHg3MCwweDYxLDB4NzIsMHg2OSwweDc0LDB4NzksMHgwMCwweDZELDB4NjEsMHg3MiwweDZCLDB4MjAsMHg3MCwweDYxLDB4NzIsMHg2OSwKKzB4NzQsMHg3OSwweDAwLDB4NDMsMHg2RiwweDZDLDB4NzUsMHg2RCwweDZFLDB4NzMsMHgwMCwweDQyLDB4NjEsMHg3MiwweDYyLDB4NjUsCisweDcyLDB4MjAsMHg1MCwweDZGLDB4NkMsMHg2NSwweDAwLDB4NTUsMHg1NSwweDU1LDB4NTUsMHg1NSwweDJFLDB4MkUsMHgyRSwweDAwLAorMHg0RSwweDZGLDB4NkUsMHg2NSwweDAwLDB4NTgsMHg2RiwweDZFLDB4MkYsMHg1OCwweDZGLDB4NjYsMHg2NiwweDAwLDB4NDMsMHg1NCwKKzB4NTMsMHgwMCwweDUwLDB4NzIsMHg2NSwweDczLDB4NzMsMHgyMCwweDgwLDB4MjAsMHg2NiwweDZGLDB4NzIsMHgyMCwweDZELDB4NjUsCisweDZFLDB4NzUsMHgwMCwweDI4LDB4NjMsMHg2RiwweDc1LDB4NkUsMHg3NCwweDY5LDB4NkUsMHg2NywweDJFLDB4MkUsMHgyRSwweDI5LAorMHgwMCwweDAwLDB4NjUsMHg0RSwweDY0LDB4MjAsMHg0RiwweDY2LDB4MjAsMHg0MywweDZGLDB4NDQsMHg2NSwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJjbWQuYyBiL2RyaXZlcnMvY2hhci9pcDIvaTJjbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI5OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5jCkBAIC0wLDAgKzEsMjA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIChjKSAxOTk4IGJ5IENvbXB1dG9uZSBDb3Jwb3JhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogICBQQUNLQUdFOiAgICAgTGludXggdHR5IERldmljZSBEcml2ZXIgZm9yIEludGVsbGlQb3J0IGZhbWlseSBvZiBtdWx0aXBvcnQKKyogICAgICAgICAgICAgICAgc2VyaWFsIEkvTyBjb250cm9sbGVycy4KKyoKKyogICBERVNDUklQVElPTjogRGVmaW5pdGlvbiB0YWJsZSBmb3IgSW4tbGluZSBhbmQgQnlwYXNzIGNvbW1hbmRzLiBBcHBsaWNhYmxlCisqICAgICAgICAgICAgICAgIG9ubHkgd2hlbiB0aGUgc3RhbmRhcmQgbG9hZHdhcmUgaXMgYWN0aXZlLiAoVGhpcyBpcyBpbmNsdWRlZAorKiAgICAgICAgICAgICAgICBzb3VyY2UgY29kZSwgbm90IGEgc2VwYXJhdGUgY29tcGlsYXRpb24gbW9kdWxlLikKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUmV2aXNpb24gSGlzdG9yeToKKy8vCisvLyAxMCBPY3RvYmVyIDE5OTEgICBNQUcgRmlyc3QgRHJhZnQKKy8vICA3IE5vdmVtYmVyIDE5OTEgIE1BRyBSZWZsZWN0cyBhZGRpdGlvbmFsIGNvbW1hbmRzLgorLy8gMjQgRmVicnVhcnkgMTk5MiAgTUFHIEFkZGl0aW9uYWwgY29tbWFuZHMgZm9yIDEuNC54IGxvYWR3YXJlCisvLyAxMSBNYXJjaCAxOTkyICAgICBNQUcgQWRkaXRpb25hbCBjb21tYW5kcworLy8gMzAgTWFyY2ggMTk5MiAgICAgTUFHIEFkZGl0aW9uYWwgY29tbWFuZDogQ01EX0RTU19OT1cKKy8vIDE4IE1heSAxOTkyICAgICAgIE1BRyBEaXNjb3ZlcmVkIGNvbW1hbmRzIDM5ICYgNDAgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIGEKKy8vICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQ6IGFmZmVjdHMgaW1wbGVtZW50YXRpb24uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyoqKioqKioqKioqKgorLy8qIEluY2x1ZGVzICoKKy8vKioqKioqKioqKioqCisKKyNpbmNsdWRlICJpMmNtZC5oIiAgIC8qIFRvIGdldCBzb21lIGJpdC1kZWZpbmVzICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZXJlIGlzIHRoZSB0YWJsZSBvZiBnbG9iYWwgYXJyYXlzIHdoaWNoIHJlcHJlc2VudCBlYWNoIHR5cGUgb2YgY29tbWFuZAorLy8gc3VwcG9ydGVkIGluIHRoZSBJbnRlbGxpUG9ydCBzdGFuZGFyZCBsb2Fkd2FyZS4gU2VlIGFsc28gaTJjbWQuaAorLy8gZm9yIGEgbW9yZSBjb21wbGV0ZSBleHBsYW5hdGlvbiBvZiB3aGF0IGlzIGdvaW5nIG9uLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSGVyZSBhcmUgdGhlIHZhcmlvdXMgZ2xvYmFsczogbm90ZSB0aGF0IHRoZSBuYW1lcyBhcmUgbm90IHVzZWQgZXhjZXB0IHRocm91Z2gKKy8vIHRoZSBtYWNyb3MgZGVmaW5lZCBpbiBpMmNtZC5oLiBBbHNvIG5vdGUgdGhhdCBhbHRob3VnaCB0aGV5IGFyZSBjaGFyYWN0ZXIKKy8vIGFycmF5cyBoZXJlIChmb3IgZXh0ZW5kYWJpbGl0eSkgdGhleSBhcmUgY2FzdCB0byBzdHJ1Y3R1cmUgcG9pbnRlcnMgaW4gdGhlCisvLyBpMmNtZC5oIG1hY3Jvcy4gU2VlIGkyY21kLmggZm9yIGZsYWdzIGRlZmluaXRpb25zLgorCisvLyAgICAgICAgICAgICAgICAgICAgIExlbmd0aCBGbGFncyBDb21tYW5kCitzdGF0aWMgVUNIQVIgY3QwMltdID0geyAxLCBCVEgsICAgICAweDAyICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFRSIFVQCitzdGF0aWMgVUNIQVIgY3QwM1tdID0geyAxLCBCVEgsICAgICAweDAzICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFRSIEROCitzdGF0aWMgVUNIQVIgY3QwNFtdID0geyAxLCBCVEgsICAgICAweDA0ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gUlRTIFVQCitzdGF0aWMgVUNIQVIgY3QwNVtdID0geyAxLCBCVEgsICAgICAweDA1ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gUlRTIEROCitzdGF0aWMgVUNIQVIgY3QwNltdID0geyAxLCBCWVAsICAgICAweDA2ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gU1RBUlQgRkwKK3N0YXRpYyBVQ0hBUiBjdDA3W10gPSB7IDIsIEJUSCwgICAgIDB4MDcsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBCQVVECitzdGF0aWMgVUNIQVIgY3QwOFtdID0geyAyLCBCVEgsICAgICAweDA4LDAgICAgICAgICAgICAgICAgICAgfTsgLy8gQklUUworc3RhdGljIFVDSEFSIGN0MDlbXSA9IHsgMiwgQlRILCAgICAgMHgwOSwwICAgICAgICAgICAgICAgICAgIH07IC8vIFNUT1AKK3N0YXRpYyBVQ0hBUiBjdDEwW10gPSB7IDIsIEJUSCwgICAgIDB4MEEsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBQQVJJVFkKK3N0YXRpYyBVQ0hBUiBjdDExW10gPSB7IDIsIEJUSCwgICAgIDB4MEIsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBYT04KK3N0YXRpYyBVQ0hBUiBjdDEyW10gPSB7IDIsIEJUSCwgICAgIDB4MEMsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBYT0ZGCitzdGF0aWMgVUNIQVIgY3QxM1tdID0geyAxLCBCVEgsICAgICAweDBEICAgICAgICAgICAgICAgICAgICAgfTsgLy8gU1RPUCBGTAorc3RhdGljIFVDSEFSIGN0MTRbXSA9IHsgMSwgQllQfFZJUCwgMHgwRSAgICAgICAgICAgICAgICAgICAgIH07IC8vIEFDSyBIT1RLCisvL3N0YXRpYyBVQ0hBUiBjdDE1W109eyAyLCBCVEh8VklQLCAweDBGLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gSVJRIFNFVAorc3RhdGljIFVDSEFSIGN0MTZbXSA9IHsgMiwgSU5MLCAgICAgMHgxMCwwICAgICAgICAgICAgICAgICAgIH07IC8vIElYT05PUFRTCitzdGF0aWMgVUNIQVIgY3QxN1tdID0geyAyLCBJTkwsICAgICAweDExLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gT1hPTk9QVFMKK3N0YXRpYyBVQ0hBUiBjdDE4W10gPSB7IDEsIElOTCwgICAgIDB4MTIgICAgICAgICAgICAgICAgICAgICB9OyAvLyBDVFNFTkFCCitzdGF0aWMgVUNIQVIgY3QxOVtdID0geyAxLCBCVEgsICAgICAweDEzICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQ1RTRFNBQgorc3RhdGljIFVDSEFSIGN0MjBbXSA9IHsgMSwgSU5MLCAgICAgMHgxNCAgICAgICAgICAgICAgICAgICAgIH07IC8vIERDREVOQUIKK3N0YXRpYyBVQ0hBUiBjdDIxW10gPSB7IDEsIEJUSCwgICAgIDB4MTUgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEQ0REU0FCCitzdGF0aWMgVUNIQVIgY3QyMltdID0geyAxLCBCVEgsICAgICAweDE2ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFNSRU5BQgorc3RhdGljIFVDSEFSIGN0MjNbXSA9IHsgMSwgQlRILCAgICAgMHgxNyAgICAgICAgICAgICAgICAgICAgIH07IC8vIERTUkRTQUIKK3N0YXRpYyBVQ0hBUiBjdDI0W10gPSB7IDEsIEJUSCwgICAgIDB4MTggICAgICAgICAgICAgICAgICAgICB9OyAvLyBSSUVOQUIKK3N0YXRpYyBVQ0hBUiBjdDI1W10gPSB7IDEsIEJUSCwgICAgIDB4MTkgICAgICAgICAgICAgICAgICAgICB9OyAvLyBSSURTQUIKK3N0YXRpYyBVQ0hBUiBjdDI2W10gPSB7IDIsIEJUSCwgICAgIDB4MUEsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBCUktFTkFCCitzdGF0aWMgVUNIQVIgY3QyN1tdID0geyAxLCBCVEgsICAgICAweDFCICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQlJLRFNBQgorLy9zdGF0aWMgVUNIQVIgY3QyOFtdPXsgMiwgQlRILCAgICAgMHgxQywwICAgICAgICAgICAgICAgICAgIH07IC8vIE1BWEJMT0tTSVpFCisvL3N0YXRpYyBVQ0hBUiBjdDI5W109eyAyLCAwLCAgICAgICAweDFELDAgICAgICAgICAgICAgICAgICAgfTsgLy8gcmVzZXJ2ZWQKK3N0YXRpYyBVQ0hBUiBjdDMwW10gPSB7IDEsIElOTCwgICAgIDB4MUUgICAgICAgICAgICAgICAgICAgICB9OyAvLyBDVFNGTE9XRU5BQgorc3RhdGljIFVDSEFSIGN0MzFbXSA9IHsgMSwgSU5MLCAgICAgMHgxRiAgICAgICAgICAgICAgICAgICAgIH07IC8vIENUU0ZMT1dEU0FCCitzdGF0aWMgVUNIQVIgY3QzMltdID0geyAxLCBJTkwsICAgICAweDIwICAgICAgICAgICAgICAgICAgICAgfTsgLy8gUlRTRkxPV0VOQUIKK3N0YXRpYyBVQ0hBUiBjdDMzW10gPSB7IDEsIElOTCwgICAgIDB4MjEgICAgICAgICAgICAgICAgICAgICB9OyAvLyBSVFNGTE9XRFNBQgorc3RhdGljIFVDSEFSIGN0MzRbXSA9IHsgMiwgQlRILCAgICAgMHgyMiwwICAgICAgICAgICAgICAgICAgIH07IC8vIElTVFJJUE1PREUKK3N0YXRpYyBVQ0hBUiBjdDM1W10gPSB7IDIsIEJUSHxFTkQsIDB4MjMsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBTRU5EQlJFQUsKK3N0YXRpYyBVQ0hBUiBjdDM2W10gPSB7IDIsIEJUSCwgICAgIDB4MjQsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBTRVRFUlJNT0RFCisvL3N0YXRpYyBVQ0hBUiBjdDM2YVtdPXsgMywgSU5MLCAgICAweDI0LDAsMCAgICAgICAgICAgICAgICAgfTsgLy8gU0VUX1JFUExBQ0UKKworLy8gVGhlIGZvbGxvd2luZyBpcyBsaXN0ZWQgZm9yIGNvbXBsZXRlbmVzcywgYnV0IHNob3VsZCBuZXZlciBiZSBzZW50IGRpcmVjdGx5CisvLyBieSB1c2VyLWxldmVsIGNvZGUuIEl0IGlzIHNlbnQgb25seSBieSBsaWJyYXJ5IHJvdXRpbmVzIGluIHJlc3BvbnNlIHRvIGRhdGEKKy8vIG1vdmVtZW50LgorLy9zdGF0aWMgVUNIQVIgY3QzN1tdPXsgNSwgQllQfFZJUCwgMHgyNSwwLDAsMCwwICAgICAgICAgICAgIH07IC8vIEZMT1cgUEFDS0VUCisKKy8vIEJhY2sgdG8gbm9ybWFsCisvL3N0YXRpYyBVQ0hBUiBjdDM4W10gPSB7MTEsIEJUSHxWQVIsIDB4MjYsMCwwLDAsMCwwLDAsMCwwLDAsMCB9OyAvLyBERUYgS0VZIFNFUQorLy9zdGF0aWMgVUNIQVIgY3QzOVtdPXsgMywgQlRIfEVORCwgMHgyNywwLDAgICAgICAgICAgICAgICAgIH07IC8vIE9QT1NUT04KKy8vc3RhdGljIFVDSEFSIGN0NDBbXT17IDEsIEJUSHxFTkQsIDB4MjggICAgICAgICAgICAgICAgICAgICB9OyAvLyBPUE9TVE9GRgorc3RhdGljIFVDSEFSIGN0NDFbXSA9IHsgMSwgQllQLCAgICAgMHgyOSAgICAgICAgICAgICAgICAgICAgIH07IC8vIFJFU1VNRQorLy9zdGF0aWMgVUNIQVIgY3Q0MltdPXsgMiwgQlRILCAgICAgMHgyQSwwICAgICAgICAgICAgICAgICAgIH07IC8vIFRYQkFVRAorLy9zdGF0aWMgVUNIQVIgY3Q0M1tdPXsgMiwgQlRILCAgICAgMHgyQiwwICAgICAgICAgICAgICAgICAgIH07IC8vIFJYQkFVRAorLy9zdGF0aWMgVUNIQVIgY3Q0NFtdPXsgMiwgQlRILCAgICAgMHgyQywwICAgICAgICAgICAgICAgICAgIH07IC8vIE1TIFBJTkcKKy8vc3RhdGljIFVDSEFSIGN0NDVbXT17IDEsIEJUSCwgICAgIDB4MkQgICAgICAgICAgICAgICAgICAgICB9OyAvLyBIT1RFTkFCCisvL3N0YXRpYyBVQ0hBUiBjdDQ2W109eyAxLCBCVEgsICAgICAweDJFICAgICAgICAgICAgICAgICAgICAgfTsgLy8gSE9URFNBQgorc3RhdGljIFVDSEFSIGN0NDdbXSA9IHsgNywgQlRILCAgICAgMHgyRiwwLDAsMCwwLDAsMCAgICAgICAgIH07IC8vIFVOSVggRkxBR1MKKy8vc3RhdGljIFVDSEFSIGN0NDhbXT17IDEsIEJUSCwgICAgIDB4MzAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEU1JGTE9XRU5BQgorLy9zdGF0aWMgVUNIQVIgY3Q0OVtdPXsgMSwgQlRILCAgICAgMHgzMSAgICAgICAgICAgICAgICAgICAgIH07IC8vIERTUkZMT1dEU0FCCisvL3N0YXRpYyBVQ0hBUiBjdDUwW109eyAxLCBCVEgsICAgICAweDMyICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFRSRkxPV0VOQUIKKy8vc3RhdGljIFVDSEFSIGN0NTFbXT17IDEsIEJUSCwgICAgIDB4MzMgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEVFJGTE9XRFNBQgorLy9zdGF0aWMgVUNIQVIgY3Q1MltdPXsgMSwgQlRILCAgICAgMHgzNCAgICAgICAgICAgICAgICAgICAgIH07IC8vIEJBVURUQUJSRVNFVAorLy9zdGF0aWMgVUNIQVIgY3Q1M1tdID0geyAzLCBCVEgsICAgICAweDM1LDAsMCAgICAgICAgICAgICAgICAgfTsgLy8gQkFVRFJFTUFQCitzdGF0aWMgVUNIQVIgY3Q1NFtdID0geyAzLCBCVEgsICAgICAweDM2LDAsMCAgICAgICAgICAgICAgICAgfTsgLy8gQ1VTVE9NQkFVRDEKK3N0YXRpYyBVQ0hBUiBjdDU1W10gPSB7IDMsIEJUSCwgICAgIDB4MzcsMCwwICAgICAgICAgICAgICAgICB9OyAvLyBDVVNUT01CQVVEMgorc3RhdGljIFVDSEFSIGN0NTZbXSA9IHsgMiwgQlRIfEVORCwgMHgzOCwwICAgICAgICAgICAgICAgICAgIH07IC8vIFBBVVNFCitzdGF0aWMgVUNIQVIgY3Q1N1tdID0geyAxLCBCWVAsICAgICAweDM5ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gU1VTUEVORAorc3RhdGljIFVDSEFSIGN0NThbXSA9IHsgMSwgQllQLCAgICAgMHgzQSAgICAgICAgICAgICAgICAgICAgIH07IC8vIFVOU1VTUEVORAorc3RhdGljIFVDSEFSIGN0NTlbXSA9IHsgMiwgQlRILCAgICAgMHgzQiwwICAgICAgICAgICAgICAgICAgIH07IC8vIFBBUklUWUNISworc3RhdGljIFVDSEFSIGN0NjBbXSA9IHsgMSwgSU5MfFZJUCwgMHgzQyAgICAgICAgICAgICAgICAgICAgIH07IC8vIEJPT0tNQVJLUkVRCisvL3N0YXRpYyBVQ0hBUiBjdDYxW109eyAyLCBCVEgsICAgICAweDNELDAgICAgICAgICAgICAgICAgICAgfTsgLy8gSU5URVJOQUxMT09QCisvL3N0YXRpYyBVQ0hBUiBjdDYyW109eyAyLCBCVEgsICAgICAweDNFLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gSE9US1RJTUVPVVQKK3N0YXRpYyBVQ0hBUiBjdDYzW10gPSB7IDIsIElOTCwgICAgIDB4M0YsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBTRVRUWE9OCitzdGF0aWMgVUNIQVIgY3Q2NFtdID0geyAyLCBJTkwsICAgICAweDQwLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gU0VUVFhPRkYKKy8vc3RhdGljIFVDSEFSIGN0NjVbXT17IDIsIEJUSCwgICAgIDB4NDEsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBTRVRBVVRPUlRTCisvL3N0YXRpYyBVQ0hBUiBjdDY2W109eyAyLCBCVEgsICAgICAweDQyLDAgICAgICAgICAgICAgICAgICAgfTsgLy8gU0VUSElHSFdBVAorLy9zdGF0aWMgVUNIQVIgY3Q2N1tdPXsgMiwgQllQLCAgICAgMHg0MywwICAgICAgICAgICAgICAgICAgIH07IC8vIFNUQVJUU0VMRkwKKy8vc3RhdGljIFVDSEFSIGN0NjhbXT17IDIsIElOTCwgICAgIDB4NDQsMCAgICAgICAgICAgICAgICAgICB9OyAvLyBFTkRTRUxGTAorLy9zdGF0aWMgVUNIQVIgY3Q2OVtdPXsgMSwgQllQLCAgICAgMHg0NSAgICAgICAgICAgICAgICAgICAgIH07IC8vIEhXRkxPV19PRkYKKy8vc3RhdGljIFVDSEFSIGN0NzBbXT17IDEsIEJUSCwgICAgIDB4NDYgICAgICAgICAgICAgICAgICAgICB9OyAvLyBPRFNSRkxfRU5BQgorLy9zdGF0aWMgVUNIQVIgY3Q3MVtdPXsgMSwgQlRILCAgICAgMHg0NyAgICAgICAgICAgICAgICAgICAgIH07IC8vIE9EU1JGTF9EU0FCCisvL3N0YXRpYyBVQ0hBUiBjdDcyW109eyAxLCBCVEgsICAgICAweDQ4ICAgICAgICAgICAgICAgICAgICAgfTsgLy8gT0RDREZMX0VOQUIKKy8vc3RhdGljIFVDSEFSIGN0NzNbXT17IDEsIEJUSCwgICAgIDB4NDkgICAgICAgICAgICAgICAgICAgICB9OyAvLyBPRENERkxfRFNBQgorLy9zdGF0aWMgVUNIQVIgY3Q3NFtdPXsgMiwgQlRILCAgICAgMHg0QSwwICAgICAgICAgICAgICAgICAgIH07IC8vIExPQURMRVZFTAorLy9zdGF0aWMgVUNIQVIgY3Q3NVtdPXsgMiwgQlRILCAgICAgMHg0QiwwICAgICAgICAgICAgICAgICAgIH07IC8vIFNUQVREQVRBCisvL3N0YXRpYyBVQ0hBUiBjdDc2W109eyAxLCBCWVAsICAgICAweDRDICAgICAgICAgICAgICAgICAgICAgfTsgLy8gQlJFQUtfT04KKy8vc3RhdGljIFVDSEFSIGN0NzdbXT17IDEsIEJZUCwgICAgIDB4NEQgICAgICAgICAgICAgICAgICAgICB9OyAvLyBCUkVBS19PRkYKKy8vc3RhdGljIFVDSEFSIGN0NzhbXT17IDEsIEJZUCwgICAgIDB4NEUgICAgICAgICAgICAgICAgICAgICB9OyAvLyBHRVRGQworc3RhdGljIFVDSEFSIGN0NzlbXSA9IHsgMiwgQllQLCAgICAgMHg0RiwwICAgICAgICAgICAgICAgICAgIH07IC8vIFhNSVRfTk9XCisvL3N0YXRpYyBVQ0hBUiBjdDgwW109eyA0LCBCVEgsICAgICAweDUwLDAsMCwwICAgICAgICAgICAgICAgfTsgLy8gRElWSVNPUl9MQVRDSAorLy9zdGF0aWMgVUNIQVIgY3Q4MVtdPXsgMSwgQllQLCAgICAgMHg1MSAgICAgICAgICAgICAgICAgICAgIH07IC8vIEdFVF9TVEFUVVMKKy8vc3RhdGljIFVDSEFSIGN0ODJbXT17IDEsIEJZUCwgICAgIDB4NTIgICAgICAgICAgICAgICAgICAgICB9OyAvLyBHRVRfVFhDTlQKKy8vc3RhdGljIFVDSEFSIGN0ODNbXT17IDEsIEJZUCwgICAgIDB4NTMgICAgICAgICAgICAgICAgICAgICB9OyAvLyBHRVRfUlhDTlQKKy8vc3RhdGljIFVDSEFSIGN0ODRbXT17IDEsIEJZUCwgICAgIDB4NTQgICAgICAgICAgICAgICAgICAgICB9OyAvLyBHRVRfQk9YSURTCisvL3N0YXRpYyBVQ0hBUiBjdDg1W109ezEwLCBCWVAsICAgICAweDU1LDAsMCwwLDAsMCwwLDAsMCwwICAgfTsgLy8gRU5BQl9NVUxUCisvL3N0YXRpYyBVQ0hBUiBjdDg2W109eyAyLCBCVEgsICAgICAweDU2LDAgICAgICAgICAgICAgICAgICAgfTsgLy8gUkNWX0VOQUJMRQorc3RhdGljIFVDSEFSIGN0ODdbXSA9IHsgMSwgQllQLCAgICAgMHg1NyAgICAgICAgICAgICAgICAgICAgIH07IC8vIEhXX1RFU1QKKy8vc3RhdGljIFVDSEFSIGN0ODhbXT17IDMsIEJUSCwgICAgIDB4NTgsMCwwICAgICAgICAgICAgICAgICB9OyAvLyBSQ1ZfVEhSRVNIT0xECitzdGF0aWMgVUNIQVIgY3Q4OVtdPXsgMSwgQllQLCAgICAgMHg1OSAgICAgICAgICAgICAgICAgICAgIH07IC8vIERTU19OT1cKKy8vc3RhdGljIFVDSEFSIGN0OTBbXT17IDMsIEJZUCwgICAgIDB4NUEsMCwwICAgICAgICAgICAgICAgICB9OyAvLyBTZXQgU0lMTworLy9zdGF0aWMgVUNIQVIgY3Q5MVtdPXsgMiwgQllQLCAgICAgMHg1QiwwICAgICAgICAgICAgICAgICAgIH07IC8vIHRpbWVkIGJyZWFrCisKKy8vIFNvbWUgY29tcG9zaXRlIGNvbW1hbmRzIGFzIHdlbGwKKy8vc3RhdGljIFVDSEFSIGNjMDFbXT17IDIsIEJUSCwgICAgIDB4MDIsMHgwNCAgICAgICAgICAgICAgICB9OyAvLyBEVFIgJiBSVFMgVVAKKy8vc3RhdGljIFVDSEFSIGNjMDJbXT17IDIsIEJUSCwgICAgIDB4MDMsMHgwNSAgICAgICAgICAgICAgICB9OyAvLyBEVFIgJiBSVFMgRE4KKworLy8qKioqKioqKgorLy8qIENvZGUgKgorLy8qKioqKioqKgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJjbWRVbml4RmxhZ3MoaWZsYWcsIGNmbGFnLCBsZmxhZykKKy8vIFBhcmFtZXRlcnM6IFVuaXggdHR5IGZsYWdzCisvLworLy8gUmV0dXJuczogICAgUG9pbnRlciB0byBjb21tYW5kIHN0cnVjdHVyZQorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFRoaXMgcm91dGluZSBzZXRzIHRoZSBwYXJhbWV0ZXJzIG9mIGNvbW1hbmQgNDcgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZQorLy8gYXBwcm9wcmlhdGUgc3RydWN0dXJlLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2NtZFN5bnRheFB0cgoraTJjbWRVbml4RmxhZ3ModW5zaWduZWQgc2hvcnQgaWZsYWcsdW5zaWduZWQgc2hvcnQgY2ZsYWcsdW5zaWduZWQgc2hvcnQgbGZsYWcpCit7CisJY21kU3ludGF4UHRyIHBDTSA9IChjbWRTeW50YXhQdHIpIGN0NDc7CisKKwlwQ00tPmNtZFsxXSA9ICh1bnNpZ25lZCBjaGFyKSAgaWZsYWc7CisJcENNLT5jbWRbMl0gPSAodW5zaWduZWQgY2hhcikgKGlmbGFnID4+IDgpOworCXBDTS0+Y21kWzNdID0gKHVuc2lnbmVkIGNoYXIpICBjZmxhZzsKKwlwQ00tPmNtZFs0XSA9ICh1bnNpZ25lZCBjaGFyKSAoY2ZsYWcgPj4gOCk7CisJcENNLT5jbWRbNV0gPSAodW5zaWduZWQgY2hhcikgIGxmbGFnOworCXBDTS0+Y21kWzZdID0gKHVuc2lnbmVkIGNoYXIpIChsZmxhZyA+PiA4KTsKKwlyZXR1cm4gcENNOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaTJjbWRCYXVkRGVmKHdoaWNoLCByYXRlKQorLy8gUGFyYW1ldGVyczogPworLy8KKy8vIFJldHVybnM6ICAgIFBvaW50ZXIgdG8gY29tbWFuZCBzdHJ1Y3R1cmUKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgcGFyYW1ldGVycyBvZiBjb21tYW5kcyA1NCBvciA1NSAoYWNjb3JkaW5nIHRvIHRoZQorLy8gYXJndW1lbnQgd2hpY2gpLCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHN0cnVjdHVyZS4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitjbWRTeW50YXhQdHIKK2kyY21kQmF1ZERlZihpbnQgd2hpY2gsIHVuc2lnbmVkIHNob3J0IHJhdGUpCit7CisJY21kU3ludGF4UHRyIHBDTTsKKworCXN3aXRjaCh3aGljaCkKKwl7CisJY2FzZSAxOgorCQlwQ00gPSAoY21kU3ludGF4UHRyKSBjdDU0OworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgMjoKKwkJcENNID0gKGNtZFN5bnRheFB0cikgY3Q1NTsKKwkJYnJlYWs7CisJfQorCXBDTS0+Y21kWzFdID0gKHVuc2lnbmVkIGNoYXIpIHJhdGU7CisJcENNLT5jbWRbMl0gPSAodW5zaWduZWQgY2hhcikgKHJhdGUgPj4gOCk7CisJcmV0dXJuIHBDTTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5oIGIvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTcyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmgKQEAgLTAsMCArMSw2NDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgKGMpIDE5OTkgYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgSUkgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBEZWZpbml0aW9ucyBhbmQgc3VwcG9ydCBmb3IgSW4tbGluZSBhbmQgQnlwYXNzIGNvbW1hbmRzLgorKiAgICAgICAgICAgICAgICBBcHBsaWNhYmxlIG9ubHkgd2hlbiB0aGUgc3RhbmRhcmQgbG9hZHdhcmUgaXMgYWN0aXZlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZpc2lvbiBIaXN0b3J5OgorLy8KKy8vIDEwIE9jdG9iZXIgMTk5MSAgIE1BRyBGaXJzdCBEcmFmdAorLy8gIDcgTm92ZW1iZXIgMTk5MSAgTUFHIFJlZmxlY3RzIHNvbWUgbmV3IGNvbW1hbmRzCisvLyAyMCBGZWJydWFyeSAxOTkyICBNQUcgQ01EX0hPVEFDSyBjb3JyZWN0ZWQ6IG5vIGFyZ3VtZW50LgorLy8gMjQgRmVicnVhcnkgMTk5MiAgTUFHIFN1cHBvcnQgYWRkZWQgZm9yIG5ldyBjb21tYW5kcyBmb3IgMS40LnggbG9hZHdhcmUuCisvLyAxMSBNYXJjaCAxOTkyICAgICBNQUcgQWRkaXRpb25hbCBjb21tYW5kcy4KKy8vIDE2IE1hcmNoIDE5OTIgICAgIE1BRyBBZGRpdGlvbmFsIGNvbW1hbmRzLgorLy8gMzAgTWFyY2ggMTk5MiAgICAgTUFHIEFkZGl0aW9uYWwgY29tbWFuZDogQ01EX0RTU19OT1cKKy8vIDE4IE1heSAgIDE5OTIgICAgIE1BRyBDaGFuZ2VkIENNRF9PUE9TVAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIEkyQ01EX0ggICAgICAvLyBUbyBwcmV2ZW50IG11bHRpcGxlIGluY2x1ZGVzCisjZGVmaW5lIEkyQ01EX0ggICAxCisKKyNpbmNsdWRlICJpcDJ0eXBlcy5oIgorCisvLyBUaGlzIG1vZHVsZSBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGEgdW5pZm9ybSBtZXRob2Qgb2Ygc2VuZGluZyBjb21tYW5kcyB0bworLy8gdGhlIGJvYXJkIHRocm91Z2ggY29tbWFuZCBwYWNrZXRzLiBUaGUgZGlmZmljdWx0eSBpcywgc29tZSBjb21tYW5kcyB0YWtlCisvLyBwYXJhbWV0ZXJzLCBvdGhlcnMgZG8gbm90LiBGdXJ0aGVybW9yZSwgaXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIHNlbmQgc2V2ZXJhbAorLy8gY29tbWFuZHMgdG8gdGhlIHNhbWUgY2hhbm5lbCBhcyBwYXJ0IG9mIHRoZSBzYW1lIHBhY2tldC4gKFNlZSBhbHNvIGkycGFjay5oLikKKy8vCisvLyBUaGlzIG1vZHVsZSBpcyBkZXNpZ25lZCBzbyB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBiZSByZXNwb25zaWJsZSBmb3IKKy8vIHJlbWVtYmVyaW5nIHRoZSBleGFjdCBzeW50YXggb2YgZWFjaCBjb21tYW5kLCBvciBhdCBsZWFzdCBzbyB0aGF0IHRoZQorLy8gY29tcGlsZXIgY291bGQgY2hlY2sgdGhpbmdzIHNvbWV3aGF0LiBJJ2xsIGV4cGxhaW4gYXMgd2UgZ28uLi4KKy8vCisvLyBGaXJzdCwgYSBzdHJ1Y3R1cmUgd2hpY2ggY2FuIGVtYm9keSB0aGUgc3ludGF4IG9mIGVhY2ggdHlwZSBvZiBjb21tYW5kLgorLy8KK3R5cGVkZWYgc3RydWN0IF9jbWRTeW50YXgKK3sKKwlVQ0hBUiBsZW5ndGg7ICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjb21tYW5kCisJVUNIQVIgZmxhZ3M7ICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21tYW5kIChzZWUgYmVsb3cpCisKKwkvLyBUaGUgY29tbWFuZCBhbmQgaXRzIHBhcmFtZXRlcnMsIHdoaWNoIG1heSBiZSBvZiBhcmJpdHJhcnkgbGVuZ3RoLiBEb24ndAorCS8vIHdvcnJ5IHlldCBob3cgdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBpbml0aWFsaXplZDsgbWFjcm9zIGxhdGVyIHRha2UgY2FyZQorCS8vIG9mIGl0LiBBbHNvLCBkb24ndCB3b3JyeSBhYm91dCB0aGUgYXJiaXRyYXJ5IGxlbmd0aCBpc3N1ZTsgdGhpcyBzdHJ1Y3R1cmUKKwkvLyBpcyBuZXZlciB1c2VkIHRvIGFsbG9jYXRlIHNwYWNlIChzZWUgaTJjbWQuYykuCisJVUNIQVIgY21kWzJdOworfSBjbWRTeW50YXgsICpjbWRTeW50YXhQdHI7CisKKy8vIEJpdCBhc3NpZ25tZW50cyBmb3IgZmxhZ3MKKworI2RlZmluZSBJTkwgMSAgICAgICAgICAgLy8gU2V0IGlmIHN1aXRhYmxlIGZvciBpbmxpbmUgY29tbWFuZHMKKyNkZWZpbmUgQllQIDIgICAgICAgICAgIC8vIFNldCBpZiBzdWl0YWJsZSBmb3IgYnlwYXNzIGNvbW1hbmRzCisjZGVmaW5lIEJUSCAoSU5MfEJZUCkgICAvLyBzdWl0YWJsZSBmb3IgZWl0aGVyIQorI2RlZmluZSBFTkQgNCAgICAgICAgICAgLy8gU2V0IGlmIHRoaXMgbXVzdCBiZSB0aGUgbGFzdCBjb21tYW5kIGluIGEgYmxvY2sKKyNkZWZpbmUgVklQIDggICAgICAgICAgIC8vIFNldCBpZiB0aGlzIGNvbW1hbmQgaXMgc3BlY2lhbCBpbiBzb21lIHdheSBhbmQgcmVhbGx5CisJCQkJCQkvLyBzaG91bGQgb25seSBiZSBzZW50IGZyb20gdGhlIGxpYnJhcnktbGV2ZWwgYW5kIG5vdAorCQkJCQkJLy8gZGlyZWN0bHkgZnJvbSB1c2VyLWxldmVsCisjZGVmaW5lIFZBUiAweDEwICAgICAgICAvLyBUaGlzIGNvbW1hbmQgaXMgb2YgdmFyaWFibGUgbGVuZ3RoIQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFeHRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIGkyY21kLmMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmUgdG8gc2V0IHVwIHBhcmFtZXRlcnMgZm9yIHRoZSAiZGVmaW5lIGhvdC1rZXkgc2VxdWVuY2UiIGNvbW1hbmQuIFNpbmNlCisvLyB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciB0byBhc3NpZ24sIHdlIG11c3QgdXNlIGEgZnVuY3Rpb24gcmF0aGVyCisvLyB0aGFuIGEgbWFjcm8gKHVzZWQgdXN1YWxseSkuCisvLworZXh0ZXJuIGNtZFN5bnRheFB0ciBpMmNtZFVuaXhGbGFncyhVU0hPUlQgaWZsYWcsVVNIT1JUIGNmbGFnLFVTSE9SVCBsZmxhZyk7CitleHRlcm4gY21kU3ludGF4UHRyIGkyY21kQmF1ZERlZihpbnQgd2hpY2gsIFVTSE9SVCByYXRlKTsKKworLy8gRGVjbGFyYXRpb25zIGZvciB0aGUgZ2xvYmFsIGFycmF5cyB1c2VkIHRvIGJlYXIgdGhlIGNvbW1hbmRzIGFuZCB0aGVpcgorLy8gYXJndW1lbnRzLgorLy8KKy8vIE5vdGU6IFNpbmNlIHRoZXNlIGFyZSBnbG9iYWxzIGFuZCB0aGUgYXJndW1lbnRzIG1pZ2h0IGNoYW5nZSwgaXQgaXMgaW1wb3J0YW50CisvLyB0aGF0IHRoZSBsaWJyYXJ5IHJvdXRpbmUgQ09QWSB0aGVzZSBpbnRvIGJ1ZmZlcnMgZnJvbSB3aGVuY2UgdGhleSB3b3VsZCBiZQorLy8gc2VudCwgcmF0aGVyIHRoYW4gbWVyZWx5IHN0b3JpbmcgdGhlIHBvaW50ZXJzLiBJbiBtdWx0aS10aHJlYWRlZAorLy8gZW52aXJvbm1lbnRzLCBpbXBvcnRhbnQgdGhhdCB0aGUgY29weSBzaG91bGQgb2J0YWluIGJlZm9yZSBhbnkgY29udGV4dCBzd2l0Y2gKKy8vIGlzIGFsbG93ZWQuIEFsc28sIGZvciBwYXJhbWV0ZXJpemVkIGNvbW1hbmRzLCBETyBOT1QgSVNTVUUgVEhFIFNBTUUgQ09NTUFORAorLy8gTU9SRSBUSEFOIE9OQ0UgV0lUSCBUSEUgU0FNRSBQQVJBTUVURVJTIGluIHRoZSBzYW1lIGNhbGwuCisvLworc3RhdGljIFVDSEFSIGN0MDJbXTsKK3N0YXRpYyBVQ0hBUiBjdDAzW107CitzdGF0aWMgVUNIQVIgY3QwNFtdOworc3RhdGljIFVDSEFSIGN0MDVbXTsKK3N0YXRpYyBVQ0hBUiBjdDA2W107CitzdGF0aWMgVUNIQVIgY3QwN1tdOworc3RhdGljIFVDSEFSIGN0MDhbXTsKK3N0YXRpYyBVQ0hBUiBjdDA5W107CitzdGF0aWMgVUNIQVIgY3QxMFtdOworc3RhdGljIFVDSEFSIGN0MTFbXTsKK3N0YXRpYyBVQ0hBUiBjdDEyW107CitzdGF0aWMgVUNIQVIgY3QxM1tdOworc3RhdGljIFVDSEFSIGN0MTRbXTsKK3N0YXRpYyBVQ0hBUiBjdDE1W107CitzdGF0aWMgVUNIQVIgY3QxNltdOworc3RhdGljIFVDSEFSIGN0MTdbXTsKK3N0YXRpYyBVQ0hBUiBjdDE4W107CitzdGF0aWMgVUNIQVIgY3QxOVtdOworc3RhdGljIFVDSEFSIGN0MjBbXTsKK3N0YXRpYyBVQ0hBUiBjdDIxW107CitzdGF0aWMgVUNIQVIgY3QyMltdOworc3RhdGljIFVDSEFSIGN0MjNbXTsKK3N0YXRpYyBVQ0hBUiBjdDI0W107CitzdGF0aWMgVUNIQVIgY3QyNVtdOworc3RhdGljIFVDSEFSIGN0MjZbXTsKK3N0YXRpYyBVQ0hBUiBjdDI3W107CitzdGF0aWMgVUNIQVIgY3QyOFtdOworc3RhdGljIFVDSEFSIGN0MjlbXTsKK3N0YXRpYyBVQ0hBUiBjdDMwW107CitzdGF0aWMgVUNIQVIgY3QzMVtdOworc3RhdGljIFVDSEFSIGN0MzJbXTsKK3N0YXRpYyBVQ0hBUiBjdDMzW107CitzdGF0aWMgVUNIQVIgY3QzNFtdOworc3RhdGljIFVDSEFSIGN0MzVbXTsKK3N0YXRpYyBVQ0hBUiBjdDM2W107CitzdGF0aWMgVUNIQVIgY3QzNmFbXTsKK3N0YXRpYyBVQ0hBUiBjdDQxW107CitzdGF0aWMgVUNIQVIgY3Q0MltdOworc3RhdGljIFVDSEFSIGN0NDNbXTsKK3N0YXRpYyBVQ0hBUiBjdDQ0W107CitzdGF0aWMgVUNIQVIgY3Q0NVtdOworc3RhdGljIFVDSEFSIGN0NDZbXTsKK3N0YXRpYyBVQ0hBUiBjdDQ4W107CitzdGF0aWMgVUNIQVIgY3Q0OVtdOworc3RhdGljIFVDSEFSIGN0NTBbXTsKK3N0YXRpYyBVQ0hBUiBjdDUxW107CitzdGF0aWMgVUNIQVIgY3Q1MltdOworc3RhdGljIFVDSEFSIGN0NTZbXTsKK3N0YXRpYyBVQ0hBUiBjdDU3W107CitzdGF0aWMgVUNIQVIgY3Q1OFtdOworc3RhdGljIFVDSEFSIGN0NTlbXTsKK3N0YXRpYyBVQ0hBUiBjdDYwW107CitzdGF0aWMgVUNIQVIgY3Q2MVtdOworc3RhdGljIFVDSEFSIGN0NjJbXTsKK3N0YXRpYyBVQ0hBUiBjdDYzW107CitzdGF0aWMgVUNIQVIgY3Q2NFtdOworc3RhdGljIFVDSEFSIGN0NjVbXTsKK3N0YXRpYyBVQ0hBUiBjdDY2W107CitzdGF0aWMgVUNIQVIgY3Q2N1tdOworc3RhdGljIFVDSEFSIGN0NjhbXTsKK3N0YXRpYyBVQ0hBUiBjdDY5W107CitzdGF0aWMgVUNIQVIgY3Q3MFtdOworc3RhdGljIFVDSEFSIGN0NzFbXTsKK3N0YXRpYyBVQ0hBUiBjdDcyW107CitzdGF0aWMgVUNIQVIgY3Q3M1tdOworc3RhdGljIFVDSEFSIGN0NzRbXTsKK3N0YXRpYyBVQ0hBUiBjdDc1W107CitzdGF0aWMgVUNIQVIgY3Q3NltdOworc3RhdGljIFVDSEFSIGN0NzdbXTsKK3N0YXRpYyBVQ0hBUiBjdDc4W107CitzdGF0aWMgVUNIQVIgY3Q3OVtdOworc3RhdGljIFVDSEFSIGN0ODBbXTsKK3N0YXRpYyBVQ0hBUiBjdDgxW107CitzdGF0aWMgVUNIQVIgY3Q4MltdOworc3RhdGljIFVDSEFSIGN0ODNbXTsKK3N0YXRpYyBVQ0hBUiBjdDg0W107CitzdGF0aWMgVUNIQVIgY3Q4NVtdOworc3RhdGljIFVDSEFSIGN0ODZbXTsKK3N0YXRpYyBVQ0hBUiBjdDg3W107CitzdGF0aWMgVUNIQVIgY3Q4OFtdOworc3RhdGljIFVDSEFSIGN0ODlbXTsKK3N0YXRpYyBVQ0hBUiBjdDkwW107CitzdGF0aWMgVUNIQVIgY3Q5MVtdOworc3RhdGljIFVDSEFSIGNjMDFbXTsKK3N0YXRpYyBVQ0hBUiBjYzAyW107CisKKy8vIE5vdywgcmVmZXIgdG8gaTJjbWQuYywgYW5kIHNlZSB0aGUgY2hhcmFjdGVyIGFycmF5cyBkZWZpbmVkIHRoZXJlLiBUaGV5IGFyZQorLy8gY2FzdCBoZXJlIHRvIGNtZFN5bnRheFB0ci4KKy8vCisvLyBUaGVyZSBhcmUgbGlicmFyeSBmdW5jdGlvbnMgZm9yIGlzc3VpbmcgYnlwYXNzIG9yIGlubGluZSBjb21tYW5kcy4gVGhlc2UKKy8vIGZ1bmN0aW9ucyB0YWtlIG9uZSBvciBtb3JlIGFyZ3VtZW50cyBvZiB0aGUgdHlwZSBjbWRTeW50YXhQdHIuIFRoZSByb3V0aW5lCisvLyB0aGVuIGNhbiBmaWd1cmUgb3V0IGhvdyBsb25nIGVhY2ggY29tbWFuZCBpcyBzdXBwb3NlZCB0byBiZSBhbmQgZWFzaWx5IGFkZCBpdAorLy8gdG8gdGhlIGxpc3QuCisvLworLy8gRm9yIGVhc2Ugb2YgdXNlLCB3ZSBkZWZpbmUgbWFuaWZlc3RzIHdoaWNoIHJldHVybiBwb2ludGVycyB0byBhcHByb3ByaWF0ZQorLy8gY21kU3ludGF4UHRyIHRoaW5ncy4gQnV0IHNvbWUgY29tbWFuZHMgYWxzbyB0YWtlIGFyZ3VtZW50cy4gSWYgYSBzaW5nbGUKKy8vIGFyZ3VtZW50IGlzIHVzZWQsIHdlIGRlZmluZSBhIG1hY3JvIHdoaWNoIHBlcmZvcm1zIHRoZSBzaW5nbGUgYXNzaWdubWVudCBhbmQKKy8vICh0aHJvdWdoIHRoZSBleHBlZGllbnQgb2YgYSBjb21tYSBleHByZXNzaW9uKSByZWZlcmVuY2VzIHRoZSBhcHByb3ByaWF0ZQorLy8gcG9pbnRlci4gRm9yIGNvbW1hbmRzIHJlcXVpcmluZyBzZXZlcmFsIGFyZ3VtZW50cywgd2UgYWN0dWFsbHkgZGVmaW5lIGEKKy8vIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIGFzc2lnbm1lbnRzLgorCisjZGVmaW5lIENNRF9EVFJVUAkoY21kU3ludGF4UHRyKShjdDAyKQkvLyBSYWlzZSBEVFIKKyNkZWZpbmUgQ01EX0RUUkROCShjbWRTeW50YXhQdHIpKGN0MDMpCS8vIExvd2VyIERUUgorI2RlZmluZSBDTURfUlRTVVAJKGNtZFN5bnRheFB0cikoY3QwNCkJLy8gUmFpc2UgUlRTCisjZGVmaW5lIENNRF9SVFNETgkoY21kU3ludGF4UHRyKShjdDA1KQkvLyBMb3dlciBSVFMKKyNkZWZpbmUgQ01EX1NUQVJURkwJKGNtZFN5bnRheFB0cikoY3QwNikJLy8gU3RhcnQgRmx1c2hpbmcgRGF0YQorCisjZGVmaW5lIENNRF9EVFJSVFNfVVAgKGNtZFN5bnRheFB0cikoY2MwMSkJLy8gUmFpc2UgRFRSIGFuZCBSVFMKKyNkZWZpbmUgQ01EX0RUUlJUU19ETiAoY21kU3ludGF4UHRyKShjYzAyKQkvLyBMb3dlciBEVFIgYW5kIFJUUworCisvLyBTZXQgQmF1ZCBSYXRlIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZQorI2RlZmluZSBDTURfU0VUQkFVRChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MDcpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QwNykpCisKKyNkZWZpbmUgQ0JSXzUwICAgICAgIDEKKyNkZWZpbmUgQ0JSXzc1ICAgICAgIDIKKyNkZWZpbmUgQ0JSXzExMCAgICAgIDMKKyNkZWZpbmUgQ0JSXzEzNCAgICAgIDQKKyNkZWZpbmUgQ0JSXzE1MCAgICAgIDUKKyNkZWZpbmUgQ0JSXzIwMCAgICAgIDYKKyNkZWZpbmUgQ0JSXzMwMCAgICAgIDcKKyNkZWZpbmUgQ0JSXzYwMCAgICAgIDgKKyNkZWZpbmUgQ0JSXzEyMDAgICAgIDkKKyNkZWZpbmUgQ0JSXzE4MDAgICAgIDEwCisjZGVmaW5lIENCUl8yNDAwICAgICAxMQorI2RlZmluZSBDQlJfNDgwMCAgICAgMTIKKyNkZWZpbmUgQ0JSXzk2MDAgICAgIDEzCisjZGVmaW5lIENCUl8xOTIwMCAgICAxNAorI2RlZmluZSBDQlJfMzg0MDAgICAgMTUKKyNkZWZpbmUgQ0JSXzIwMDAgICAgIDE2CisjZGVmaW5lIENCUl8zNjAwICAgICAxNworI2RlZmluZSBDQlJfNzIwMCAgICAgMTgKKyNkZWZpbmUgQ0JSXzU2MDAwICAgIDE5CisjZGVmaW5lIENCUl81NzYwMCAgICAyMAorI2RlZmluZSBDQlJfNjQwMDAgICAgMjEKKyNkZWZpbmUgQ0JSXzc2ODAwICAgIDIyCisjZGVmaW5lIENCUl8xMTUyMDAgICAyMworI2RlZmluZSBDQlJfQzEgICAgICAgMjQgICAgLy8gQ3VzdG9tIGJhdWQgcmF0ZSAxCisjZGVmaW5lIENCUl9DMiAgICAgICAyNSAgICAvLyBDdXN0b20gYmF1ZCByYXRlIDIKKyNkZWZpbmUgQ0JSXzE1MzYwMCAgIDI2CisjZGVmaW5lIENCUl8yMzA0MDAgICAyNworI2RlZmluZSBDQlJfMzA3MjAwICAgMjgKKyNkZWZpbmUgQ0JSXzQ2MDgwMCAgIDI5CisjZGVmaW5lIENCUl85MjE2MDAgICAzMAorCisvLyBTZXQgQ2hhcmFjdGVyIHNpemUKKy8vCisjZGVmaW5lIENNRF9TRVRCSVRTKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QwOCkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDA4KSkKKworI2RlZmluZSBDU1pfNSAgMAorI2RlZmluZSBDU1pfNiAgMQorI2RlZmluZSBDU1pfNyAgMgorI2RlZmluZSBDU1pfOCAgMworCisvLyBTZXQgbnVtYmVyIG9mIHN0b3AgYml0cworLy8KKyNkZWZpbmUgQ01EX1NFVFNUT1AoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDA5KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MDkpKQorCisjZGVmaW5lIENTVF8xICAwCisjZGVmaW5lIENTVF8xNSAxICAvLyAxLjUgc3RvcCBiaXRzCisjZGVmaW5lIENTVF8yICAyCisKKy8vIFNldCBwYXJpdHkgb3B0aW9uCisvLworI2RlZmluZSBDTURfU0VUUEFSKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QxMCkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDEwKSkKKworI2RlZmluZSBDU1BfTlAgMCAgLy8gbm8gcGFyaXR5CisjZGVmaW5lIENTUF9PRCAxICAvLyBvZGQgcGFyaXR5CisjZGVmaW5lIENTUF9FViAyICAvLyBFdmVuIHBhcml0eQorI2RlZmluZSBDU1BfU1AgMyAgLy8gU3BhY2UgcGFyaXR5CisjZGVmaW5lIENTUF9NSyA0ICAvLyBNYXJrIHBhcml0eQorCisvLyBEZWZpbmUgeG9uIGNoYXIgZm9yIHRyYW5zbWl0dGVyIGZsb3cgY29udHJvbAorLy8KKyNkZWZpbmUgQ01EX0RFRl9JWE9OKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QxMSkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDExKSkKKworLy8gRGVmaW5lIHhvZmYgY2hhciBmb3IgdHJhbnNtaXR0ZXIgZmxvdyBjb250cm9sCisvLworI2RlZmluZSBDTURfREVGX0lYT0ZGKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QxMikpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDEyKSkKKworI2RlZmluZSBDTURfU1RPUEZMICAgKGNtZFN5bnRheFB0cikoY3QxMykgLy8gU3RvcCBGbHVzaGluZyBkYXRhCisKKy8vIEFja25vd2xlZGdlIHJlY2VpcHQgb2YgaG90a2V5IHNpZ25hbAorLy8KKyNkZWZpbmUgQ01EX0hPVEFDSyAgIChjbWRTeW50YXhQdHIpKGN0MTQpCisKKy8vIERlZmluZSBpcnEgbGV2ZWwgdG8gdXNlLiBTaG91bGQgYWN0dWFsbHkgYmUgc2VudCBieSBsaWJyYXJ5LWxldmVsIGNvZGUsIG5vdAorLy8gZGlyZWN0bHkgZnJvbSB1c2VyLi4uCisvLworI2RlZmluZSBDTURWQUxVRV9JUlEgMTUgLy8gRm9yIGxpYnJhcnkgdXNlIGF0IGluaXRpYWxpemF0aW9uLiBVbnRpbCB0aGlzIGNvbW1hbmQKKwkJCQkJCS8vIGlzIHNlbnQsIGJvYXJkIHByb2Nlc3NpbmcgZG9lc24ndCByZWFsbHkgc3RhcnQuCisjZGVmaW5lIENNRF9TRVRfSVJRKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QxNSkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDE1KSkKKworI2RlZmluZSBDSVJfUE9MTCAgMCAgLy8gTm8gSVJRIC0gUG9sbAorI2RlZmluZSBDSVJfMyAgICAgMyAgLy8gSVJRIDMKKyNkZWZpbmUgQ0lSXzQgICAgIDQgIC8vIElSUSA0CisjZGVmaW5lIENJUl81ICAgICA1ICAvLyBJUlEgNQorI2RlZmluZSBDSVJfNyAgICAgNyAgLy8gSVJRIDcKKyNkZWZpbmUgQ0lSXzEwICAgIDEwIC8vIElSUSAxMAorI2RlZmluZSBDSVJfMTEgICAgMTEgLy8gSVJRIDExCisjZGVmaW5lIENJUl8xMiAgICAxMiAvLyBJUlEgMTIKKyNkZWZpbmUgQ0lSXzE1ICAgIDE1IC8vIElSUSAxNQorCisvLyBTZWxlY3QgdHJhbnNtaXQgZmxvdyB4b24veG9mZiBvcHRpb25zCisvLworI2RlZmluZSBDTURfSVhPTl9PUFQoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDE2KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTYpKQorCisjZGVmaW5lIENJWF9OT05FICAwICAvLyBJbmNvbWluZyBYb24vWG9mZiBjaGFyYWN0ZXJzIG5vdCBzcGVjaWFsCisjZGVmaW5lIENJWF9YT04gICAxICAvLyBYb2ZmIGRpc2FibGUsIFhvbiBlbmFibGUKKyNkZWZpbmUgQ0lYX1hBTlkgIDIgIC8vIFhvZmYgZGlzYWJsZSwgYW55IGtleSBlbmFibGUKKworLy8gU2VsZWN0IHJlY2VpdmUgZmxvdyB4b24veG9mZiBvcHRpb25zCisvLworI2RlZmluZSBDTURfT1hPTl9PUFQoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDE3KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MTcpKQorCisjZGVmaW5lIENPWF9OT05FICAwICAvLyBEb24ndCBzZW5kIFhvbi9Yb2ZmCisjZGVmaW5lIENPWF9YT04gICAxICAvLyBTZW5kIHhvbi94b2ZmIHRvIHN0YXJ0L3N0b3AgaW5jb21pbmcgZGF0YQorCisKKyNkZWZpbmUgQ01EX0NUU19SRVAgIChjbWRTeW50YXhQdHIpKGN0MTgpIC8vIEVuYWJsZSAgQ1RTIHJlcG9ydGluZworI2RlZmluZSBDTURfQ1RTX05SRVAgKGNtZFN5bnRheFB0cikoY3QxOSkgLy8gRGlzYWJsZSBDVFMgcmVwb3J0aW5nCisKKyNkZWZpbmUgQ01EX0RDRF9SRVAgIChjbWRTeW50YXhQdHIpKGN0MjApIC8vIEVuYWJsZSAgRENEIHJlcG9ydGluZworI2RlZmluZSBDTURfRENEX05SRVAgKGNtZFN5bnRheFB0cikoY3QyMSkgLy8gRGlzYWJsZSBEQ0QgcmVwb3J0aW5nCisKKyNkZWZpbmUgQ01EX0RTUl9SRVAgIChjbWRTeW50YXhQdHIpKGN0MjIpIC8vIEVuYWJsZSAgRFNSIHJlcG9ydGluZworI2RlZmluZSBDTURfRFNSX05SRVAgKGNtZFN5bnRheFB0cikoY3QyMykgLy8gRGlzYWJsZSBEU1IgcmVwb3J0aW5nCisKKyNkZWZpbmUgQ01EX1JJX1JFUCAgIChjbWRTeW50YXhQdHIpKGN0MjQpIC8vIEVuYWJsZSAgUkkgIHJlcG9ydGluZworI2RlZmluZSBDTURfUklfTlJFUCAgKGNtZFN5bnRheFB0cikoY3QyNSkgLy8gRGlzYWJsZSBSSSAgcmVwb3J0aW5nCisKKy8vIEVuYWJsZSBicmVhayByZXBvcnRpbmcgYW5kIHNlbGVjdCBzdHlsZQorLy8KKyNkZWZpbmUgQ01EX0JSS19SRVAoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDI2KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0MjYpKQorCisjZGVmaW5lIENCS19TVEFUICAgICAweDAwICAvLyBSZXBvcnQgYnJlYWtzIGFzIGEgc3RhdHVzIChleGNlcHRpb24saXJxKQorI2RlZmluZSBDQktfTlVMTCAgICAgMHgwMSAgLy8gUmVwb3J0IGJyZWFrcyBhcyBhIGdvb2QgbnVsbAorI2RlZmluZSBDQktfU1RBVF9TRVEgMHgwMiAgLy8gUmVwb3J0IGJyZWFrcyBhcyBhIHN0YXR1cyBBTkQgYXMgaW4tYmFuZCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBzZXF1ZW5jZSBGRmgsIDAxaCwgMTBoCisjZGVmaW5lIENCS19TRVEgICAgICAweDAzICAvLyBSZXBvcnQgYnJlYWtzIGFzIHRoZSBpbi1iYW5kIAorCQkJCQkJICAgLy9zZXF1ZW5jZSBGRmgsIDAxaCwgMTBoIE9OTFkuCisjZGVmaW5lIENCS19GTFNIICAgICAweDA0ICAvLyBpZiB0aGlzIGJpdCBzZXQgYWxzbyBmbHVzaCBpbnB1dCBkYXRhCisjZGVmaW5lIENCS19QT1NJWCAgICAweDA4ICAvLyBpZiB0aGlzIGJpdCBzZXQgcmVwb3J0IGFzIEZGLDAsMCBzZXF1ZW5jZQorI2RlZmluZSBDQktfU0lOR0xFICAgMHgxMCAgLy8gaWYgdGhpcyBiaXQgc2V0IHdpdGggQ0JLX1NFUSBvciBDQktfU1RBVF9TRVEKKwkJCQkJCSAgIC8vdGhlbiByZXBvcnRzIHNpbmdsZSBudWxsIGluc3RlYWQgb2YgdHJpcGxlCisKKyNkZWZpbmUgQ01EX0JSS19OUkVQIChjbWRTeW50YXhQdHIpKGN0MjcpIC8vIERpc2FibGUgYnJlYWsgcmVwb3J0aW5nCisKKy8vIFNwZWNpZnkgbWF4aW11bSBibG9jayBzaXplIGZvciByZWNlaXZlZCBkYXRhCisvLworI2RlZmluZSBDTURfTUFYX0JMT0NLKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QyOCkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDI4KSkKKworLy8gLS0gQ09NTUFORCAyOSBpcyByZXNlcnZlZCAtLQorCisjZGVmaW5lIENNRF9DVFNGTF9FTkFCICAoY21kU3ludGF4UHRyKShjdDMwKSAvLyBFbmFibGUgIENUUyBmbG93IGNvbnRyb2wKKyNkZWZpbmUgQ01EX0NUU0ZMX0RTQUIgIChjbWRTeW50YXhQdHIpKGN0MzEpIC8vIERpc2FibGUgQ1RTIGZsb3cgY29udHJvbAorI2RlZmluZSBDTURfUlRTRkxfRU5BQiAgKGNtZFN5bnRheFB0cikoY3QzMikgLy8gRW5hYmxlICBSVFMgZmxvdyBjb250cm9sCisjZGVmaW5lIENNRF9SVFNGTF9EU0FCICAoY21kU3ludGF4UHRyKShjdDMzKSAvLyBEaXNhYmxlIFJUUyBmbG93IGNvbnRyb2wKKworLy8gU3BlY2lmeSBpc3RyaXAgb3B0aW9uCisvLworI2RlZmluZSBDTURfSVNUUklQX09QVChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0MzQpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3QzNCkpCisKKyNkZWZpbmUgQ0lTX05PU1RSSVAgIDAgIC8vIFN0cmlwIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIHNpemUKKyNkZWZpbmUgQ0lTX1NUUklQICAgIDEgIC8vIFN0cmlwIGFueSA4LWJpdCBjaGFyYWN0ZXJzIHRvIDcgYml0cworCisvLyBTZW5kIGEgYnJlYWsgb2YgYXJnIG1pbGxpc2Vjb25kcworLy8KKyNkZWZpbmUgQ01EX1NFTkRfQlJLKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QzNSkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDM1KSkKKworLy8gU2V0IGVycm9yIHJlcG9ydGluZyBtb2RlCisvLworI2RlZmluZSBDTURfU0VUX0VSUk9SKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3QzNikpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDM2KSkKKworI2RlZmluZSBDU0VfRVNUQVQgMCAgLy8gUmVwb3J0IGVycm9yIGluIGEgc3RhdHVzIHBhY2tldAorI2RlZmluZSBDU0VfTk9SRVAgMSAgLy8gVHJlYXQgY2hhcmFjdGVyIGFzIHRob3VnaCBpdCB3ZXJlIGdvb2QKKyNkZWZpbmUgQ1NFX0RST1AgIDIgIC8vIERpc2NhcmQgdGhlIGNoYXJhY3RlcgorI2RlZmluZSBDU0VfTlVMTCAgMyAgLy8gUmVwbGFjZSB3aXRoIGEgbnVsbAorI2RlZmluZSBDU0VfTUFSSyAgNCAgLy8gUmVwbGFjZSB3aXRoIGEgMy1jaGFyYWN0ZXIgc2VxdWVuY2UgKGFzIFVuaXgpCisKKyNkZWZpbmUgIENNRF9TRVRfUkVQTEFDRU1FTlQoYXJnLGNoKSAgIFwKKwkJCSgoKGNtZFN5bnRheFB0cikoY3QzNmEpKS0+Y21kWzFdID0gKGFyZyksIFwKKwkJCSgoKGNtZFN5bnRheFB0cikoY3QzNmEpKS0+Y21kWzJdID0gKGNoKSwgIFwKKwkJCShjbWRTeW50YXhQdHIpKGN0MzZhKSkKKworI2RlZmluZSBDU0VfUkVQTEFDRSAgMHg4CS8vIFJlcGxhY2UgdGhlIGVycm9yZWQgY2hhcmFjdGVyIHdpdGggdGhlCisJCQkJCQkJLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGRlZmluZWQgaGVyZQorCisjZGVmaW5lIENTRV9TVEFUX1JFUExBQ0UgICAweDE4CS8vIFJlcGxhY2UgdGhlIGVycm9yZWQgY2hhcmFjdGVyIHdpdGggdGhlCisJCQkJCQkJCS8vIHJlcGxhY2VtZW50IGNoYXJhY3RlciBkZWZpbmVkIGhlcmUgQU5ECisJCQkJCQkJCS8vIHJlcG9ydCB0aGUgZXJyb3IgYXMgYSBzdGF0dXMgcGFja2V0IChhcyBpbgorCQkJCQkJCQkvLyBDU0VfRVNUQVQpLgorCisKKy8vIENPTU1BTkQgMzcsIHRvIHNlbmQgZmxvdyBjb250cm9sIHBhY2tldHMsIGlzIGhhbmRsZWQgb25seSBieSBsb3ctbGV2ZWwKKy8vIGxpYnJhcnkgY29kZSBpbiByZXNwb25zZSB0byBkYXRhIG1vdmVtZW50IGFuZCBzaG91bGRuJ3QgZXZlciBiZSBzZW50IGJ5IHRoZQorLy8gdXNlciBjb2RlLiBTZWUgaTJwYWNrLmggYW5kIHRoZSBib2R5IG9mIGkybGliLmMgZm9yIGRldGFpbHMuCisKKy8vIEVuYWJsZSBvbi1ib2FyZCBwb3N0LXByb2Nlc3NpbmcsIHVzaW5nIG9wdGlvbnMgZ2l2ZW4gaW4gb2ZsYWcgYXJndW1lbnQuCisvLyBGb3JtZXJseSwgdGhpcyBjb21tYW5kIHdhcyBhdXRvbWF0aWNhbGx5IHByZWNlZGVkIGJ5IGEgQ01EX09QT1NUX09GRiBjb21tYW5kCisvLyBiZWNhdXNlIHRoZSBsb2Fkd2FyZSBkb2VzIG5vdCBwZXJtaXQgc2VuZGluZyBiYWNrLXRvLWJhY2sgQ01EX09QT1NUX09OCisvLyBjb21tYW5kcyB3aXRob3V0IGFuIGludGVydmVuaW5nIENNRF9PUE9TVF9PRkYuIEJVVCwgV0UgTEVBUk4gMTggTUFZIDkyLCB0aGF0CisvLyBDTURfT1BPU1RfT04gYW5kIENNRF9PUE9TVF9PRkYgbXVzdCBlYWNoIGJlIGF0IHRoZSBlbmQgb2YgYSBwYWNrZXQgKG9yIGluIGEKKy8vIHNvbG8gcGFja2V0KS4gVGhpcyBtZWFucyB0aGUgY2FsbGVyIG11c3Qgc3BlY2lmeSBzZXBhcmF0ZWx5IENNRF9PUE9TVF9PRkYsCisvLyBDTURfT1BPU1RfT04ocGFybSkgd2hlbiBoZSBjYWxscyBpMlF1ZXVlQ29tbWFuZHMoKS4gVGhhdCBmdW5jdGlvbiB3aWxsIGVuc3VyZQorLy8gZWFjaCBnZXRzIGEgc2VwYXJhdGUgcGFja2V0LiBFeHRyYSBDTURfT1BPU1RfT0ZGJ3MgYXJlIGFsd2F5cyBvay4KKy8vCisjZGVmaW5lIENNRF9PUE9TVF9PTihvZmxhZykgICBcCisJKCooVVNIT1JUICopKCgoY21kU3ludGF4UHRyKShjdDM5KSktPmNtZFsxXSkgPSAob2ZsYWcpLCBcCisJCShjbWRTeW50YXhQdHIpKGN0MzkpKQorCisjZGVmaW5lIENNRF9PUE9TVF9PRkYgICAoY21kU3ludGF4UHRyKShjdDQwKSAvLyBEaXNhYmxlIG9uLWJvYXJkIHBvc3QtcHJvYworCisjZGVmaW5lIENNRF9SRVNVTUUgICAoY21kU3ludGF4UHRyKShjdDQxKQkvLyBSZXN1bWU6IGJlaGF2ZSBhcyB0aG91Z2ggYW4gWE9OCisJCQkJCQkJCQkJCS8vIHdlcmUgcmVjZWl2ZWQ7CisKKy8vIFNldCBUcmFuc21pdCBiYXVkIHJhdGUgKHNlZSBjb21tYW5kIDcgZm9yIGFyZ3VtZW50cykKKy8vCisjZGVmaW5lIENNRF9TRVRCQVVEX1RYKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q0MikpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDQyKSkKKworLy8gU2V0IFJlY2VpdmUgYmF1ZCByYXRlIChzZWUgY29tbWFuZCA3IGZvciBhcmd1bWVudHMpCisvLworI2RlZmluZSBDTURfU0VUQkFVRF9SWChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NDMpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q0MykpCisKKy8vIFJlcXVlc3QgaW50ZXJydXB0IGZyb20gYm9hcmQgZWFjaCBhcmcgbWlsbGlzZWNvbmRzLiBJbnRlcnJ1cHQgd2lsbCBzcGVjaWZ5CisvLyAicmVjZWl2ZWQgZGF0YSIsIGV2ZW4gdGhvdWdoIHRoZXJlIG1heSBiZSBubyBkYXRhIHByZXNlbnQuIElmIGFyZyA9PSAwLAorLy8gZGlzYWJsZXMgYW55IHN1Y2ggaW50ZXJydXB0cy4KKy8vCisjZGVmaW5lIENNRF9QSU5HX1JFUShhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NDQpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q0NCkpCisKKyNkZWZpbmUgQ01EX0hPVF9FTkFCIChjbWRTeW50YXhQdHIpKGN0NDUpIC8vIEVuYWJsZSBIb3Qta2V5IGNoZWNraW5nCisjZGVmaW5lIENNRF9IT1RfRFNBQiAoY21kU3ludGF4UHRyKShjdDQ2KSAvLyBEaXNhYmxlIEhvdC1rZXkgY2hlY2tpbmcKKworLy8gQ09NTUFORCA0NzogU2VuZCBQcm90b2NvbCBpbmZvIHZpYSBVbml4IGZsYWdzOgorLy8gaWZsYWcgPSBVbml4IHR0eSB0X2lmbGFnCisvLyBjZmxhZyA9IFVuaXggdHR5IHRfY2ZsYWcKKy8vIGxmbGFnID0gVW5peCB0dHkgdF9sZmxhZworLy8gU2VlIFN5c3RlbSBWIFVuaXgvWGVuaXggZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG1lYW5pbmdzIG9mIHRoZSBiaXQgZmllbGRzCisvLyB3aXRoaW4gdGhlc2UgZmxhZ3MKKy8vCisjZGVmaW5lIENNRF9VTklYX0ZMQUdTKGlmbGFnLGNmbGFnLGxmbGFnKSBpMmNtZFVuaXhGbGFncyhpZmxhZyxjZmxhZyxsZmxhZykKKworI2RlZmluZSBDTURfRFNSRkxfRU5BQiAgKGNtZFN5bnRheFB0cikoY3Q0OCkgLy8gRW5hYmxlICBEU1IgcmVjZWl2ZXIgY3RybAorI2RlZmluZSBDTURfRFNSRkxfRFNBQiAgKGNtZFN5bnRheFB0cikoY3Q0OSkgLy8gRGlzYWJsZSBEU1IgcmVjZWl2ZXIgY3RybAorI2RlZmluZSBDTURfRFRSRkxfRU5BQiAgKGNtZFN5bnRheFB0cikoY3Q1MCkgLy8gRW5hYmxlICBEVFIgZmxvdyBjb250cm9sCisjZGVmaW5lIENNRF9EVFJGTF9EU0FCICAoY21kU3ludGF4UHRyKShjdDUxKSAvLyBEaXNhYmxlIERUUiBmbG93IGNvbnRyb2wKKyNkZWZpbmUgQ01EX0JBVURfUkVTRVQgIChjbWRTeW50YXhQdHIpKGN0NTIpIC8vIFJlc2V0IGJhdWRyYXRlIHRhYmxlCisKKy8vIENPTU1BTkQgNTQ6IERlZmluZSBjdXN0b20gcmF0ZSAjMQorLy8gcmF0ZSA9IChzaG9ydCkgMS8xMCBvZiB0aGUgZGVzaXJlZCBiYXVkIHJhdGUKKy8vCisjZGVmaW5lIENNRF9CQVVEX0RFRjEocmF0ZSkgaTJjbWRCYXVkRGVmKDEscmF0ZSkKKworLy8gQ09NTUFORCA1NTogRGVmaW5lIGN1c3RvbSByYXRlICMyCisvLyByYXRlID0gKHNob3J0KSAxLzEwIG9mIHRoZSBkZXNpcmVkIGJhdWQgcmF0ZQorLy8KKyNkZWZpbmUgQ01EX0JBVURfREVGMihyYXRlKSBpMmNtZEJhdWREZWYoMixyYXRlKQorCisvLyBQYXVzZSBhcmcgaHVuZHJlZHRocyBvZiBzZWNvbmRzLiAoTm90ZSwgdGhpcyBpcyBOT1QgbWlsbGlzZWNvbmRzLikKKy8vCisjZGVmaW5lIENNRF9QQVVTRShhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NTYpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q1NikpCisKKyNkZWZpbmUgQ01EX1NVU1BFTkQgICAgIChjbWRTeW50YXhQdHIpKGN0NTcpIC8vIFN1c3BlbmQgb3V0cHV0CisjZGVmaW5lIENNRF9VTlNVU1BFTkQgICAoY21kU3ludGF4UHRyKShjdDU4KSAvLyBVbi1TdXNwZW5kIG91dHB1dAorCisvLyBTZXQgcGFyaXR5LWNoZWNraW5nIG9wdGlvbnMKKy8vCisjZGVmaW5lIENNRF9QQVJDSEsoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDU5KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NTkpKQorCisjZGVmaW5lIENQS19FTkFCICAwICAgICAvLyBFbmFibGUgcGFyaXR5IGNoZWNraW5nIG9uIGlucHV0CisjZGVmaW5lIENQS19EU0FCICAxICAgICAvLyBEaXNhYmxlIHBhcml0eSBjaGVja2luZyBvbiBpbnB1dAorCisjZGVmaW5lIENNRF9CTUFSS19SRVEgICAoY21kU3ludGF4UHRyKShjdDYwKSAvLyBCb29rbWFyayByZXF1ZXN0CisKKworLy8gRW5hYmxlL0Rpc2FibGUgaW50ZXJuYWwgbG9vcGJhY2sgbW9kZQorLy8KKyNkZWZpbmUgQ01EX0lOTE9PUChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NjEpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q2MSkpCisKKyNkZWZpbmUgQ0lOX0RJU0FCTEUgIDAgIC8vIE5vcm1hbCBvcGVyYXRpb24gKGRlZmF1bHQpCisjZGVmaW5lIENJTl9FTkFCTEUgICAxICAvLyBJbnRlcm5hbCAobG9jYWwpIGxvb3BiYWNrCisjZGVmaW5lIENJTl9SRU1PVEUgICAyICAvLyBSZW1vdGUgbG9vcGJhY2sKKworLy8gU3BlY2lmeSB0aW1lb3V0IGZvciBob3RrZXlzOiBEZWxheSB3aWxsIGJlIChhcmcgeCAxMCkgbWlsbGlzZWNvbmRzLCBhcmcgPT0gMAorLy8gLS0+IG5vIHRpbWVvdXQ6IHdhaXQgZm9yZXZlci4KKy8vCisjZGVmaW5lIENNRF9IT1RfVElNRShhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NjIpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q2MikpCisKKworLy8gRGVmaW5lIChvdXRnb2luZykgeG9uIGZvciByZWNlaXZlIGZsb3cgY29udHJvbAorLy8KKyNkZWZpbmUgQ01EX0RFRl9PWE9OKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2MykpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDYzKSkKKworLy8gRGVmaW5lIChvdXRnb2luZykgeG9mZiBmb3IgcmVjZWl2ZXIgZmxvdyBjb250cm9sCisvLworI2RlZmluZSBDTURfREVGX09YT0ZGKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2NCkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDY0KSkKKworLy8gRW5hYmxlL0Rpc2FibGUgUlRTIG9uIHRyYW5zbWl0ICgxLzIgZHVwbGV4LXN0eWxlKQorLy8KKyNkZWZpbmUgQ01EX1JUU19YTUlUKGFyZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2NSkpLT5jbWRbMV0gPSAoYXJnKSwoY21kU3ludGF4UHRyKShjdDY1KSkKKworI2RlZmluZSBDSERfRElTQUJMRSAgMAorI2RlZmluZSBDSERfRU5BQkxFICAgMQorCisvLyBTZXQgaGlnaC13YXRlci1tYXJrIGxldmVsIChkZWJ1Z2dpbmcgdXNlIG9ubHkpCisvLworI2RlZmluZSBDTURfU0VUSElHSFdBVChhcmcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NjYpKS0+Y21kWzFdID0gKGFyZyksKGNtZFN5bnRheFB0cikoY3Q2NikpCisKKy8vIFN0YXJ0IGZsdXNoaW5nIHRhZ2dlZCBkYXRhICh0YWcgPSAwLTE0KQorLy8KKyNkZWZpbmUgQ01EX1NUQVJUX1NFTEZMKHRhZykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q2NykpLT5jbWRbMV0gPSAodGFnKSwoY21kU3ludGF4UHRyKShjdDY3KSkKKworLy8gRW5kIGZsdXNoaW5nIHRhZ2dlZCBkYXRhICh0YWcgPSAwLTE0KQorLy8KKyNkZWZpbmUgQ01EX0VORF9TRUxGTCh0YWcpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NjgpKS0+Y21kWzFdID0gKHRhZyksKGNtZFN5bnRheFB0cikoY3Q2OCkpCisKKyNkZWZpbmUgQ01EX0hXRkxPV19PRkYgIChjbWRTeW50YXhQdHIpKGN0NjkpIC8vIERpc2FibGUgSFcgVFggZmxvdyBjb250cm9sCisjZGVmaW5lIENNRF9PRFNSRkxfRU5BQiAoY21kU3ludGF4UHRyKShjdDcwKSAvLyBFbmFibGUgRFNSIG91dHB1dCBmL2MKKyNkZWZpbmUgQ01EX09EU1JGTF9EU0FCIChjbWRTeW50YXhQdHIpKGN0NzEpIC8vIERpc2FibGUgRFNSIG91dHB1dCBmL2MKKyNkZWZpbmUgQ01EX09EQ0RGTF9FTkFCIChjbWRTeW50YXhQdHIpKGN0NzIpIC8vIEVuYWJsZSBEQ0Qgb3V0cHV0IGYvYworI2RlZmluZSBDTURfT0RDREZMX0RTQUIgKGNtZFN5bnRheFB0cikoY3Q3MykgLy8gRGlzYWJsZSBEQ0Qgb3V0cHV0IGYvYworCisvLyBTZXQgdHJhbnNtaXQgaW50ZXJydXB0IGxvYWQgbGV2ZWwuIENvdW50IHNob3VsZCBiZSBhbiBldmVuIHZhbHVlIDItMTIKKy8vCisjZGVmaW5lIENNRF9MT0FETEVWRUwoY291bnQpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NzQpKS0+Y21kWzFdID0gKGNvdW50KSwoY21kU3ludGF4UHRyKShjdDc0KSkKKworLy8gSWYgcmVwb3J0aW5nIERTUyBjaGFuZ2VzLCBtYXAgdG8gY2hhcmFjdGVyIHNlcXVlbmNlIEZGaCwgMiwgTVNSCisvLworI2RlZmluZSBDTURfU1RBVERBVEEoYXJnKSBcCisJKCgoY21kU3ludGF4UHRyKShjdDc1KSktPmNtZFsxXSA9IChhcmcpLChjbWRTeW50YXhQdHIpKGN0NzUpKQorCisjZGVmaW5lIENTVERfRElTQUJMRS8vIFJlcG9ydCBEU1MgY2hhbmdlcyBhcyBzdGF0dXMgcGFja2V0cyBvbmx5IChkZWZhdWx0KQorI2RlZmluZSBDU1REX0VOQUJMRQkvLyBSZXBvcnQgRFNTIGNoYW5nZXMgYXMgaW4tYmFuZCBkYXRhIHNlcXVlbmNlIGFzIHdlbGwgYXMKKwkJCQkJLy8gYnkgc3RhdHVzIHBhY2tldC4KKworI2RlZmluZSBDTURfQlJFQUtfT04gICAgKGNtZFN5bnRheFB0cikoY3Q3NikvLyBTZXQgYnJlYWsgYW5kIHN0b3AgeG1pdAorI2RlZmluZSBDTURfQlJFQUtfT0ZGICAgKGNtZFN5bnRheFB0cikoY3Q3NykvLyBFbmQgYnJlYWsgYW5kIHJlc3RhcnQgeG1pdAorI2RlZmluZSBDTURfR0VURkMgICAgICAgKGNtZFN5bnRheFB0cikoY3Q3OCkvLyBSZXF1ZXN0IGZvciBmbG93IGNvbnRyb2wgcGFja2V0CisJCQkJCQkJCQkJCS8vIGZyb20gYm9hcmQuCisKKy8vIFRyYW5zbWl0IHRoaXMgY2hhcmFjdGVyIGltbWVkaWF0ZWx5CisvLworI2RlZmluZSBDTURfWE1JVF9OT1coY2gpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0NzkpKS0+Y21kWzFdID0gKGNoKSwoY21kU3ludGF4UHRyKShjdDc5KSkKKworLy8gU2V0IGJhdWQgcmF0ZSB2aWEgImRpdmlzb3IgbGF0Y2giCisvLworI2RlZmluZSBDTURfRElWSVNPUl9MQVRDSCh3aGljaCx2YWx1ZSkgXAorCQkJKCgoY21kU3ludGF4UHRyKShjdDgwKSktPmNtZFsxXSA9ICh3aGljaCksIFwKKwkJCSooVVNIT1JUICopKCgoY21kU3ludGF4UHRyKShjdDgwKSktPmNtZFsyXSkgPSAodmFsdWUpLCBcCisJCQkoY21kU3ludGF4UHRyKShjdDgwKSkKKworI2RlZmluZSBDRExfUlggMQkvLyBTZXQgcmVjZWl2ZXIgcmF0ZQorI2RlZmluZSBDRExfVFggMgkvLyBTZXQgdHJhbnNtaXQgcmF0ZQorCQkJCQkvLyAoQ0RMX1RYIHwgQ0RMX1JYKSBTZXQgYm90aCByYXRlcworCisvLyBSZXF1ZXN0IGZvciBzcGVjaWFsIGRpYWdub3N0aWMgc3RhdHVzIHBrdCBmcm9tIHRoZSBib2FyZC4KKy8vCisjZGVmaW5lIENNRF9HRVRfU1RBVFVTIChjbWRTeW50YXhQdHIpKGN0ODEpCisKKy8vIFJlcXVlc3QgdGltZS1zdGFtcGVkIHRyYW5zbWl0IGNoYXJhY3RlciBjb3VudCBwYWNrZXQuCisvLworI2RlZmluZSBDTURfR0VUX1RYQ05UICAoY21kU3ludGF4UHRyKShjdDgyKQorCisvLyBSZXF1ZXN0IHRpbWUtc3RhbXBlZCByZWNlaXZlIGNoYXJhY3RlciBjb3VudCBwYWNrZXQuCisvLworI2RlZmluZSBDTURfR0VUX1JYQ05UICAoY21kU3ludGF4UHRyKShjdDgzKQorCisvLyBSZXF1ZXN0IGZvciBib3gvYm9hcmQgSS5ELiBwYWNrZXQuCisjZGVmaW5lIENNRF9HRVRfQk9YSURTIChjbWRTeW50YXhQdHIpKGN0ODQpCisKKy8vIEVuYWJsZSBvciBkaXNhYmxlIG11bHRpcGxlIGNoYW5uZWxzIGFjY29yZGluZyB0byBiaXQtbWFwcGVkIHVzaG9ydHMgYm94IDEtNAorLy8KKyNkZWZpbmUgQ01EX0VOQUJfTVVMVChlbmFibGUsIGJveDEsIGJveDIsIGJveDMsIGJveDQpICAgIFwKKwkJCSgoKGNtZFN5dGF4UHRyKShjdDg1KSktPmNtZFsxXSA9IChlbmFibGUpLCAgICAgICAgICAgIFwKKwkJCSooVVNIT1JUICopKCgoY21kU3ludGF4UHRyKShjdDg1KSktPmNtZFsyXSkgPSAoYm94MSksIFwKKwkJCSooVVNIT1JUICopKCgoY21kU3ludGF4UHRyKShjdDg1KSktPmNtZFs0XSkgPSAoYm94MiksIFwKKwkJCSooVVNIT1JUICopKCgoY21kU3ludGF4UHRyKShjdDg1KSktPmNtZFs2XSkgPSAoYm94MyksIFwKKwkJCSooVVNIT1JUICopKCgoY21kU3ludGF4UHRyKShjdDg1KSktPmNtZFs4XSkgPSAoYm94NCksIFwKKwkJCShjbWRTeW50YXhQdHIpKGN0ODUpKQorCisjZGVmaW5lIENFTV9ESVNBQkxFICAwCisjZGVmaW5lIENFTV9FTkFCTEUgICAxCisKKy8vIEVuYWJsZSBvciBkaXNhYmxlIHJlY2VpdmVyIG9yIHJlY2VpdmVyIGludGVycnVwdHMgKGRlZmF1bHQgYm90aCBlbmFibGVkKQorLy8KKyNkZWZpbmUgQ01EX1JDVl9FTkFCTEUoY2gpIFwKKwkoKChjbWRTeW50YXhQdHIpKGN0ODYpKS0+Y21kWzFdID0gKGNoKSwoY21kU3ludGF4UHRyKShjdDg2KSkKKworI2RlZmluZSBDUkVfT0ZGICAgICAgMCAgLy8gRGlzYWJsZSB0aGUgcmVjZWl2ZXIKKyNkZWZpbmUgQ1JFX09OICAgICAgIDEgIC8vIEVuYWJsZSB0aGUgcmVjZWl2ZXIKKyNkZWZpbmUgQ1JFX0lOVE9GRiAgIDIgIC8vIERpc2FibGUgcmVjZWl2ZXIgaW50ZXJydXB0cyAodG8gbG9hZHdhcmUpCisjZGVmaW5lIENSRV9JTlRPTiAgICAzICAvLyBFbmFibGUgcmVjZWl2ZXIgaW50ZXJydXB0cyAodG8gbG9hZHdhcmUpCisKKy8vIFN0YXJ0cyB1cCBhIGhhcmR3YXJlIHRlc3QgcHJvY2Vzcywgd2hpY2ggcnVucyB0cmFuc3BhcmVudGx5LCBhbmQgc2VuZHMgYQorLy8gU1RBVF9IV0ZBSUwgcGFja2V0IGluIGNhc2UgYSBoYXJkd2FyZSBmYWlsdXJlIGlzIGRldGVjdGVkLgorLy8KKyNkZWZpbmUgQ01EX0hXX1RFU1QgIChjbWRTeW50YXhQdHIpKGN0ODcpCisKKy8vIENoYW5nZSByZWNlaXZlciB0aHJlc2hvbGQgYW5kIHRpbWVvdXQgdmFsdWU6CisvLyBEZWZhdWx0czogdGltZW91dCA9IDIwbVMKKy8vIHRocmVzaG9sZCBjb3VudCA9IDggd2hlbiBEVFJmbG93IG5vdCBpbiB1c2UsCisvLyB0aHJlc2hvbGQgY291bnQgPSA1IHdoZW4gRFRSZmxvdyBpbiB1c2UuCisvLworI2RlZmluZSBDTURfUkNWX1RIUkVTSE9MRChjb3VudCxtcykgXAorCQkJKCgoY21kU3ludGF4UHRyKShjdDg4KSktPmNtZFsxXSA9IChjb3VudCksIFwKKwkJCSgoY21kU3ludGF4UHRyKShjdDg4KSktPmNtZFsyXSA9IChtcyksIFwKKwkJCShjbWRTeW50YXhQdHIpKGN0ODgpKQorCisvLyBNYWtlcyB0aGUgbG9hZHdhcmUgcmVwb3J0IERTUyBzaWduYWxzIGZvciB0aGlzIGNoYW5uZWwgaW1tZWRpYXRlbHkuCisvLworI2RlZmluZSBDTURfRFNTX05PVyAoY21kU3ludGF4UHRyKShjdDg5KQorCQorLy8gU2V0IHRoZSByZWNlaXZlIHNpbG8gcGFyYW1ldGVycyAKKy8vIAl0aW1lb3V0IGlzIG1zIGlkbGUgd2FpdCB1bnRpbCBkZWxpdmVyeSAgICAgICAoflZUSU1FKQorLy8gCXRocmVzaG9sZCBpcyBtYXggY2hhcmFjdGVycyBjYXVzZSBpbnRlcnJ1cHQgICh+Vk1JTikKKy8vCisjZGVmaW5lIENNRF9TRVRfU0lMTyh0aW1lb3V0LHRocmVzaG9sZCkgXAorCQkJKCgoY21kU3ludGF4UHRyKShjdDkwKSktPmNtZFsxXSA9ICh0aW1lb3V0KSwgXAorCQkJKChjbWRTeW50YXhQdHIpKGN0OTApKS0+Y21kWzJdICA9ICh0aHJlc2hvbGQpLCBcCisJCQkoY21kU3ludGF4UHRyKShjdDkwKSkKKworLy8gU2V0IHRpbWVkIGJyZWFrIGluIGRlY2lzZWNvbmQgKDEvMTBzKQorLy8KKyNkZWZpbmUgQ01EX0xCUkVBSyhkcykgXAorCSgoKGNtZFN5bnRheFB0cikoY3Q5MSkpLT5jbWRbMV0gPSAoZHMpLChjbWRTeW50YXhQdHIpKGN0NjYpKQorCisKKworI2VuZGlmIC8vIEkyQ01EX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jIGIvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzNGQwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jCkBAIC0wLDAgKzEsMTQ4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OCBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IExvdy1sZXZlbCBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGRldmljZSBkcml2ZXIKKyogICAgICAgICAgICAgICAgKFRoaXMgaXMgaW5jbHVkZWQgc291cmNlIGNvZGUsIG5vdCBhIHNlcGFyYXRlIGNvbXBpbGF0aW9uCisqICAgICAgICAgICAgICAgIG1vZHVsZS4pCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBwcml2YXRlIHRvIHRoaXMgbW9kdWxlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb25zIGNhbGxlZCBvbmx5IGluZGlyZWN0bHkgdGhyb3VnaCBpMmVCb3JkU3RyIGVudHJpZXMuCisKK3N0YXRpYyBpbnQgaWlXcml0ZUJ1ZjE2KGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgaWlXcml0ZUJ1ZjgoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBpaVJlYWRCdWYxNihpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IGlpUmVhZEJ1ZjgoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWlSZWFkV29yZDE2KGkyZUJvcmRTdHJQdHIpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGlpUmVhZFdvcmQ4KGkyZUJvcmRTdHJQdHIpOworc3RhdGljIHZvaWQgaWlXcml0ZVdvcmQxNihpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBzaG9ydCk7CitzdGF0aWMgdm9pZCBpaVdyaXRlV29yZDgoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgc2hvcnQpOworCitzdGF0aWMgaW50IGlpV2FpdEZvclR4RW1wdHlJSShpMmVCb3JkU3RyUHRyLCBpbnQpOworc3RhdGljIGludCBpaVdhaXRGb3JUeEVtcHR5SUlFWChpMmVCb3JkU3RyUHRyLCBpbnQpOworc3RhdGljIGludCBpaVR4TWFpbEVtcHR5SUkoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgaW50IGlpVHhNYWlsRW1wdHlJSUVYKGkyZUJvcmRTdHJQdHIpOworc3RhdGljIGludCBpaVRyeVNlbmRNYWlsSUkoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgaW50IGlpVHJ5U2VuZE1haWxJSUVYKGkyZUJvcmRTdHJQdHIsIHVuc2lnbmVkIGNoYXIpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWlHZXRNYWlsSUkoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWlHZXRNYWlsSUlFWChpMmVCb3JkU3RyUHRyKTsKKworc3RhdGljIHZvaWQgaWlFbmFibGVNYWlsSXJxSUkoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdm9pZCBpaUVuYWJsZU1haWxJcnFJSUVYKGkyZUJvcmRTdHJQdHIpOworc3RhdGljIHZvaWQgaWlXcml0ZU1hc2tJSShpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyB2b2lkIGlpV3JpdGVNYXNrSUlFWChpMmVCb3JkU3RyUHRyLCB1bnNpZ25lZCBjaGFyKTsKKworc3RhdGljIHZvaWQgaWkyRGVsYXlUaW1lcih1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgaWkyRGVsYXlXYWtldXAodW5zaWduZWQgbG9uZyBpZCk7CitzdGF0aWMgdm9pZCBpaTJOb3Aodm9pZCk7CisKKy8vKioqKioqKioqKioqKioqCisvLyogU3RhdGljIERhdGEgKgorLy8qKioqKioqKioqKioqKioKKworc3RhdGljIGludCBpaTJTYWZlOyAgICAgICAgIC8vIFNhZmUgSS9PIGFkZHJlc3MgZm9yIGRlbGF5IHJvdXRpbmUKKworc3RhdGljIGludCBpaURlbGF5ZWQ7CS8vIFNldCB3aGVuIHRoZSBpaVJlc2V0RGVsYXkgZnVuY3Rpb24gaXMKKwkJCQkJCQkvLyBjYWxsZWQuIENsZWFyZWQgd2hlbiBBTlkgYm9hcmQgaXMgcmVzZXQuCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgKiBwRGVsYXlUaW1lcjsgICAvLyBVc2VkIGJ5IGlpRGVsYXlUaW1lcgorc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHBEZWxheVdhaXQ7ICAgIC8vIFVzZWQgYnkgaWlEZWxheVRpbWVyCitzdGF0aWMgcndsb2NrX3QgRGxfc3BpbmxvY2s7CisKKy8vKioqKioqKioKKy8vKiBDb2RlICoKKy8vKioqKioqKioKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbml0aWFsaXphdGlvbiBSb3V0aW5lcworLy8KKy8vIGlpU2V0QWRkcmVzcworLy8gaWlSZXNldAorLy8gaWlSZXNldERlbGF5CisvLyBpaUluaXRpYWxpemUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlFbGxpc0luaXQoKQorLy8gUGFyYW1ldGVyczogTm9uZQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIG9mIHRoZSBpaUVsbGlzIHN1YnN5c3RlbS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpRWxsaXNJbml0KHZvaWQpCit7CisJcERlbGF5VGltZXIgPSBrbWFsbG9jICggc2l6ZW9mIChzdHJ1Y3QgdGltZXJfbGlzdCksIEdGUF9LRVJORUwgKTsKKwlpbml0X3RpbWVyKHBEZWxheVRpbWVyKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwRGVsYXlXYWl0KTsKKwlMT0NLX0lOSVQoJkRsX3NwaW5sb2NrKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpRWxsaXNDbGVhbnVwKCkKKy8vIFBhcmFtZXRlcnM6IE5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSByZXF1aXJlZCBjbGVhbnVwIG9mIHRoZSBpaUVsbGlzIHN1YnN5c3RlbS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpRWxsaXNDbGVhbnVwKHZvaWQpCit7CisJaWYgKCBwRGVsYXlUaW1lciAhPSBOVUxMICkgeworCQlrZnJlZSAoIHBEZWxheVRpbWVyICk7CisJfQorfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlTZXRBZGRyZXNzKHBCLCBhZGRyZXNzLCBkZWxheSkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIGFkZHJlc3MgLSB0aGUgcHVycG9ydGVkIEkvTyBhZGRyZXNzIG9mIHRoZSBib2FyZAorLy8gICAgICAgICAgICAgZGVsYXkgICAtIHBvaW50ZXIgdG8gdGhlIDEtbXMgZGVsYXkgZnVuY3Rpb24gdG8gdXNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBhbmQgYW55IGZ1dHVyZSBvcGVyYXRpb25zIHRvIHRoaXMgYm9hcmQKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFRoaXMgcm91dGluZSAocm91Z2hseSkgY2hlY2tzIGZvciBhZGRyZXNzIHZhbGlkaXR5LCBzZXRzIHRoZSBpMmVWYWxpZCBPSyBhbmQKKy8vIHNldHMgdGhlIHN0YXRlIHRvIElJX1NUQVRFX0NPTEQgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlbid0IGV2ZW4gc2VudCBhIHJlc2V0CisvLyB5ZXQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpU2V0QWRkcmVzcyggaTJlQm9yZFN0clB0ciBwQiwgaW50IGFkZHJlc3MsIGRlbGF5RnVuY190IGRlbGF5ICkKK3sKKwkvLyBTaG91bGQgYW55IGZhaWx1cmUgb2NjdXIgYmVmb3JlIGluaXQgaXMgZmluaXNoZWQuLi4KKwlwQi0+aTJlVmFsaWQgPSBJMkVfSU5DT01QTEVURTsKKworCS8vIENhbm5vdCBjaGVjayB1cHBlciBsaW1pdCBleGNlcHQgZXh0cmVtZWx5OiBNaWdodCBiZSBtaWNyb2NoYW5uZWwKKwkvLyBBZGRyZXNzIG11c3QgYmUgb24gYW4gOC1ieXRlIGJvdW5kYXJ5CisKKwlpZiAoKHVuc2lnbmVkIGludClhZGRyZXNzIDw9IDB4MTAwCisJCXx8ICh1bnNpZ25lZCBpbnQpYWRkcmVzcyA+PSAweGZmZjgKKwkJfHwgKGFkZHJlc3MgJiAweDcpCisJCSkKKwl7CisJCUNPTVBMRVRFKHBCLEkyRUVfQkFEQUREUik7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBhY2NlbGVyYXRvcnMKKwlwQi0+aTJlQmFzZSAgICA9IGFkZHJlc3M7CisJcEItPmkyZURhdGEgICAgPSBhZGRyZXNzICsgRklGT19EQVRBOworCXBCLT5pMmVTdGF0dXMgID0gYWRkcmVzcyArIEZJRk9fU1RBVFVTOworCXBCLT5pMmVQb2ludGVyID0gYWRkcmVzcyArIEZJRk9fUFRSOworCXBCLT5pMmVYTWFpbCAgID0gYWRkcmVzcyArIEZJRk9fTUFJTDsKKwlwQi0+aTJlWE1hc2sgICA9IGFkZHJlc3MgKyBGSUZPX01BU0s7CisKKwkvLyBJbml0aWFsaXplIGkvbyBhZGRyZXNzIGZvciBpaTJEZWxheUlPCisJaWkyU2FmZSA9IGFkZHJlc3MgKyBGSUZPX05PUDsKKworCS8vIEluaXRpYWxpemUgdGhlIGRlbGF5IHJvdXRpbmUKKwlwQi0+aTJlRGVsYXkgPSAoKGRlbGF5ICE9IChkZWxheUZ1bmNfdClOVUxMKSA/IGRlbGF5IDogKGRlbGF5RnVuY190KWlpMk5vcCk7CisKKwlwQi0+aTJlVmFsaWQgPSBJMkVfTUFHSUM7CisJcEItPmkyZVN0YXRlID0gSUlfU1RBVEVfQ09MRDsKKworCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlSZXNldChwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byB0aGUgYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBBdHRlbXB0cyB0byByZXNldCB0aGUgYm9hcmQgKHNlZSBhbHNvIGkyaHcuaCkuIE5vcm1hbGx5LCB3ZSB3b3VsZCB1c2UgdGhpcyB0bworLy8gcmVzZXQgYSBib2FyZCBpbW1lZGlhdGVseSBhZnRlciBpaVNldEFkZHJlc3MoKSwgYnV0IGl0IGlzIHZhbGlkIHRvIHJlc2V0IGEKKy8vIGJvYXJkIGZyb20gYW55IHN0YXRlLCBzYXksIGluIG9yZGVyIHRvIGNoYW5nZSBvciByZS1sb2FkIGxvYWR3YXJlLiAoVW5kZXIKKy8vIHN1Y2ggY2lyY3Vtc3RhbmNlcywgbm8gcmVhc29uIHRvIHJlLXJ1biBpaVNldEFkZHJlc3MoKSwgd2hpY2ggaXMgd2h5IGl0IGlzIGEKKy8vIHNlcGFyYXRlIHJvdXRpbmUgYW5kIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHJvdXRpbmUuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpUmVzZXQoaTJlQm9yZFN0clB0ciBwQikKK3sKKwkvLyBNYWdpYyBudW1iZXIgc2hvdWxkIGJlIHNldCwgZWxzZSBldmVuIHRoZSBhZGRyZXNzIGlzIHN1c3BlY3QKKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQykKKwl7CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBRE1BR0lDKTsKKwl9CisKKwlPVVRCKHBCLT5pMmVCYXNlICsgRklGT19SRVNFVCwgMCk7ICAvLyBBbnkgZGF0YSB3aWxsIGRvCisJaWlEZWxheShwQiwgNTApOyAgICAgICAgICAgICAgICAgICAgLy8gUGF1c2UgYmV0d2VlbiByZXNldHMKKwlPVVRCKHBCLT5pMmVCYXNlICsgRklGT19SRVNFVCwgMCk7ICAvLyBTZWNvbmQgcmVzZXQKKworCS8vIFdlIG11c3Qgd2FpdCBiZWZvcmUgZXZlbiBhdHRlbXB0aW5nIHRvIHJlYWQgYW55dGhpbmcgZnJvbSB0aGUgRklGTzogdGhlCisJLy8gYm9hcmQncyBQLk8uUy5UIG1heSBhY3R1YWxseSBhdHRlbXB0IHRvIHJlYWQgYW5kIHdyaXRlIGl0cyBlbmQgb2YgdGhlCisJLy8gRklGTyBpbiBvcmRlciB0byBjaGVjayBmbGFncywgbG9vcCBiYWNrICh3aGVyZSBzdXBwb3J0ZWQpLCBldGMuIE9uCisJLy8gY29tcGxldGlvbiBvZiB0aGlzIHRlc3RpbmcgaXQgd291bGQgcmVzZXQgdGhlIEZJRk8sIGFuZCBvbiBjb21wbGV0aW9uCisJLy8gb2YgYWxsIC8vIFAuTy5TLlQuLCB3cml0ZSB0aGUgbWVzc2FnZS4gV2UgbXVzdCBub3QgbWlzdGFrZSBkYXRhIHdoaWNoCisJLy8gbWlnaHQgaGF2ZSBiZWVuIHNlbnQgZm9yIHRlc3RpbmcgYXMgcGFydCBvZiB0aGUgcmVzZXQgbWVzc2FnZS4gVG8KKwkvLyBiZXR0ZXIgdXRpbGl6ZSB0aW1lLCBzYXksIHdoZW4gcmVzZXR0aW5nIHNldmVyYWwgYm9hcmRzLCB3ZSBhbGxvdyB0aGUKKwkvLyBkZWxheSB0byBiZSBwZXJmb3JtZWQgZXh0ZXJuYWxseTsgaW4gdGhpcyB3YXkgdGhlIGNhbGxlciBjYW4gcmVzZXQgCisJLy8gc2V2ZXJhbCBib2FyZHMsIGRlbGF5IGEgc2luZ2xlIHRpbWUsIHRoZW4gY2FsbCB0aGUgaW5pdGlhbGl6YXRpb24KKwkvLyByb3V0aW5lIGZvciBhbGwuCisKKwlwQi0+aTJlU3RhdGUgPSBJSV9TVEFURV9SRVNFVDsKKworCWlpRGVsYXllZCA9IDA7CS8vIGkuZS4sIHRoZSBkZWxheSByb3V0aW5lIGhhc24ndCBiZWVuIGNhbGxlZCBzaW5jZSB0aGUgbW9zdAorCQkJCQkvLyByZWNlbnQgcmVzZXQuCisKKwkvLyBFbnN1cmUgYW55dGhpbmcgd2hpY2ggd291bGQgaGF2ZSBiZWVuIG9mIHVzZSB0byBzdGFuZGFyZCBsb2Fkd2FyZSBpcworCS8vIGJsYW5rZWQgb3V0LCBzaW5jZSBib2FyZCBoYXMgbm93IGZvcmdvdHRlbiBldmVyeXRoaW5nIS4KKworCXBCLT5pMmVVc2luZ0lycSA9IElSUV9VTkRFRklORUQ7IC8vIE5vdCBzZXQgdXAgdG8gdXNlIGFuIGludGVycnVwdCB5ZXQKKwlwQi0+aTJlV2FpdGluZ0ZvckVtcHR5RmlmbyA9IDA7CisJcEItPmkyZU91dE1haWxXYWl0aW5nID0gMDsKKwlwQi0+aTJlQ2hhbm5lbFB0ciA9IE5VTEw7CisJcEItPmkyZUNoYW5uZWxDbnQgPSAwOworCisJcEItPmkyZUxlYWRvZmZXb3JkWzBdID0gMDsKKwlwQi0+aTJlRmlmb0luSW50cyA9IDA7CisJcEItPmkyZUZpZm9PdXRJbnRzID0gMDsKKwlwQi0+aTJlRmF0YWxUcmFwID0gTlVMTDsKKwlwQi0+aTJlRmF0YWwgPSAwOworCisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlc2V0RGVsYXkocEIpCisvLyBQYXJhbWV0ZXJzOiBwQiAtIHBvaW50ZXIgdG8gdGhlIGJvYXJkIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgZXZlcnl0aGluZyBhcHBlYXJzIGNvcGFjZXRpYy4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIHRoZXJlIGlzIGFueSBlcnJvcjogdGhlIHBCLT5pMmVFcnJvciBmaWVsZCBoYXMgdGhlIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gVXNpbmcgdGhlIGRlbGF5IGRlZmluZWQgaW4gYm9hcmQgc3RydWN0dXJlLCB3YWl0cyB0d28gc2Vjb25kcyAoZm9yIGJvYXJkIHRvCisvLyByZXNldCkuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpUmVzZXREZWxheShpMmVCb3JkU3RyUHRyIHBCKQoreworCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKSB7CisJCUNPTVBMRVRFKHBCLCBJMkVFX0JBRE1BR0lDKTsKKwl9CisJaWYgKHBCLT5pMmVTdGF0ZSAhPSBJSV9TVEFURV9SRVNFVCkgeworCQlDT01QTEVURShwQiwgSTJFRV9CQURTVEFURSk7CisJfQorCWlpRGVsYXkocEIsMjAwMCk7ICAgICAgIC8qIE5vdyB3ZSB3YWl0IGZvciB0d28gc2Vjb25kcy4gKi8KKwlpaURlbGF5ZWQgPSAxOyAgICAgICAgICAvKiBEZWxheSBoYXMgYmVlbiBjYWxsZWQ6IG9rIHRvIGluaXRpYWxpemUgKi8KKwlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpSW5pdGlhbGl6ZShwQikKKy8vIFBhcmFtZXRlcnM6IHBCIC0gcG9pbnRlciB0byB0aGUgYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBBdHRlbXB0cyB0byByZWFkIHRoZSBQb3dlci1vbiByZXNldCBtZXNzYWdlLiBJbml0aWFsaXplcyBhbnkgcmVtYWluaW5nIGZpZWxkcworLy8gaW4gdGhlIHBCIHN0cnVjdHVyZS4KKy8vCisvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYXMgdGhlIHRoaXJkIHN0ZXAgb2YgYSBwcm9jZXNzIGJlZ2lubmluZyB3aXRoCisvLyBpaVJlc2V0KCksIHRoZW4gaWlSZXNldERlbGF5KCkuIFRoaXMgcm91dGluZSBjaGVja3MgdG8gc2VlIHRoYXQgdGhlIHN0cnVjdHVyZQorLy8gaXMgInZhbGlkIiBhbmQgaW4gdGhlIHJlc2V0IHN0YXRlLCBhbHNvIGNvbmZpcm1zIHRoYXQgdGhlIGRlbGF5IHJvdXRpbmUgaGFzCisvLyBiZWVuIGNhbGxlZCBzaW5jZSB0aGUgbGF0ZXN0IHJlc2V0ICh0byBhbnkgYm9hcmQhIG92ZXJseSBzdHJvbmchKS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlJbml0aWFsaXplKGkyZUJvcmRTdHJQdHIgcEIpCit7CisJaW50IGl0ZW1wOworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBzaG9ydCB1dGVtcDsKKwl1bnNpZ25lZCBpbnQgaWxpbWl0OworCisJaWYgKHBCLT5pMmVWYWxpZCAhPSBJMkVfTUFHSUMpCisJeworCQlDT01QTEVURShwQiwgSTJFRV9CQURNQUdJQyk7CisJfQorCisJaWYgKHBCLT5pMmVTdGF0ZSAhPSBJSV9TVEFURV9SRVNFVCB8fCAhaWlEZWxheWVkKQorCXsKKwkJQ09NUExFVEUocEIsIEkyRUVfQkFEU1RBVEUpOworCX0KKworCS8vIEluIGNhc2UgdGhlcmUgaXMgYSBmYWlsdXJlIHNob3J0IG9mIG91ciBjb21wbGV0ZWx5IHJlYWRpbmcgdGhlIHBvd2VyLXVwCisJLy8gbWVzc2FnZS4KKwlwQi0+aTJlVmFsaWQgPSBJMkVfSU5DT01QTEVURTsKKworCisJLy8gTm93IGF0dGVtcHQgdG8gcmVhZCB0aGUgbWVzc2FnZS4KKworCWZvciAoaXRlbXAgPSAwOyBpdGVtcCA8IHNpemVvZihwb3JTdHIpOyBpdGVtcCsrKQorCXsKKwkJLy8gV2UgZXhwZWN0IHRoZSBlbnRpcmUgbWVzc2FnZSBpcyByZWFkeS4KKwkJaWYgKEhBU19OT19JTlBVVChwQikpCisJCXsKKwkJCXBCLT5pMmVQb21TaXplID0gaXRlbXA7CisJCQlDT01QTEVURShwQiwgSTJFRV9QT1JNX1NIT1JUKTsKKwkJfQorCisJCXBCLT5pMmVQb20uY1tpdGVtcF0gPSBjID0gQllURV9GUk9NKHBCKTsKKworCQkvLyBXZSBjaGVjayB0aGUgbWFnaWMgbnVtYmVycyBhcyBzb29uIGFzIHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlIHJlYWQKKwkJLy8gKHJhdGhlciB0aGFuIGFmdGVyKSB0byBtaW5pbWl6ZSBlZmZlY3Qgb2YgcmVhZGluZyBzb21ldGhpbmcgd2UKKwkJLy8gYWxyZWFkeSBzdXNwZWN0IGNhbid0IGJlICJ1cyIuCisJCWlmICggIChpdGVtcCA9PSBQT1JfMV9JTkRFWCAmJiBjICE9IFBPUl9NQUdJQ18xKSB8fAorCQkJCShpdGVtcCA9PSBQT1JfMl9JTkRFWCAmJiBjICE9IFBPUl9NQUdJQ18yKSkKKwkJeworCQkJcEItPmkyZVBvbVNpemUgPSBpdGVtcCsxOworCQkJQ09NUExFVEUocEIsIEkyRUVfQkFETUFHSUMpOworCQl9CisJfQorCisJcEItPmkyZVBvbVNpemUgPSBpdGVtcDsKKworCS8vIEVuc3VyZSB0aGF0IHRoaXMgd2FzIGFsbCB0aGUgZGF0YS4uLgorCWlmIChIQVNfSU5QVVQocEIpKQorCQlDT01QTEVURShwQiwgSTJFRV9QT1JNX0xPTkcpOworCisJLy8gRm9yIG5vdywgd2UnbGwgZmFpbCB0byBpbml0aWFsaXplIGlmIFAuTy5TLlQgcmVwb3J0cyBiYWQgY2hpcCBtYXBwZXI6CisJLy8gSW1wbHlpbmcgd2Ugd2lsbCBub3QgYmUgYWJsZSB0byBkb3dubG9hZCBhbnkgY29kZSBlaXRoZXI6ICBUaGF0J3Mgb2s6IHRoZQorCS8vIGNvbmRpdGlvbiBpcyBwcmV0dHkgZXhwbGljaXQuCisJaWYgKHBCLT5pMmVQb20uZS5wb3JEaWFnMSAmIFBPUl9CQURfTUFQUEVSKQorCXsKKwkJQ09NUExFVEUocEIsIEkyRUVfUE9TVEVSUik7CisJfQorCisJLy8gRGV0ZXJtaW5lIGFueXRoaW5nIHdoaWNoIG11c3QgYmUgZG9uZSBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gdGhlIGZhbWlseQorCS8vIG9mIGJvYXJkcyEKKwlzd2l0Y2ggKHBCLT5pMmVQb20uZS5wb3JJRCAmIFBPUl9JRF9GQU1JTFkpCisJeworCWNhc2UgUE9SX0lEX0ZJSTogIC8vIEludGVsbGlQb3J0LUlJCisKKwkJcEItPmkyZUZpZm9TdHlsZSAgID0gRklGT19JSTsKKwkJcEItPmkyZUZpZm9TaXplICAgID0gNTEyOyAgICAgLy8gNTEyIGJ5dGVzLCBhbHdheXMKKwkJcEItPmkyZURhdGFXaWR0aDE2ID0gTk87CisKKwkJcEItPmkyZU1heElycSA9IDE1OwkvLyBCZWNhdXNlIGJvYXJkIGNhbm5vdCB0ZWxsIHVzIGl0IGlzIGluIGFuIDgtYml0CisJCQkJCQkJLy8gc2xvdCwgd2UgZG8gYWxsb3cgaXQgdG8gYmUgZG9uZSAoZG9jdW1lbnRhdGlvbiEpCisKKwkJcEItPmkyZUdvb2RNYXBbMV0gPQorCQlwQi0+aTJlR29vZE1hcFsyXSA9CisJCXBCLT5pMmVHb29kTWFwWzNdID0KKwkJcEItPmkyZUNoYW5uZWxNYXBbMV0gPQorCQlwQi0+aTJlQ2hhbm5lbE1hcFsyXSA9CisJCXBCLT5pMmVDaGFubmVsTWFwWzNdID0gMDsKKworCQlzd2l0Y2ggKHBCLT5pMmVQb20uZS5wb3JJRCAmIFBPUl9JRF9TSVpFKQorCQl7CisJCWNhc2UgUE9SX0lEX0lJXzQ6CisJCQlwQi0+aTJlR29vZE1hcFswXSA9CisJCQlwQi0+aTJlQ2hhbm5lbE1hcFswXSA9IDB4MGY7ICAvLyBmb3VyLXBvcnQKKworCQkJLy8gU2luY2UgcG9yUG9ydHMxIGlzIGJhc2VkIG9uIHRoZSBIYXJkd2FyZSBJRCByZWdpc3RlciwgdGhlIG51bWJlcnMKKwkJCS8vIHNob3VsZCBhbHdheXMgYmUgY29uc2lzdGVudCBmb3IgSW50ZWxsaVBvcnQtSUkuICBEaXR0byBiZWxvdy4uLgorCQkJaWYgKHBCLT5pMmVQb20uZS5wb3JQb3J0czEgIT0gNCkKKwkJCXsKKwkJCQlDT01QTEVURShwQiwgSTJFRV9JTkNPTlNJU1QpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JfSURfSUlfODoKKwkJY2FzZSBQT1JfSURfSUlfOFI6CisJCQlwQi0+aTJlR29vZE1hcFswXSA9CisJCQlwQi0+aTJlQ2hhbm5lbE1hcFswXSA9IDB4ZmY7ICAvLyBFaWdodCBwb3J0CisJCQlpZiAocEItPmkyZVBvbS5lLnBvclBvcnRzMSAhPSA4KQorCQkJeworCQkJCUNPTVBMRVRFKHBCLCBJMkVFX0lOQ09OU0lTVCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBPUl9JRF9JSV82OgorCQkJcEItPmkyZUdvb2RNYXBbMF0gPQorCQkJcEItPmkyZUNoYW5uZWxNYXBbMF0gPSAweDNmOyAgLy8gU2l4IFBvcnQKKwkJCWlmIChwQi0+aTJlUG9tLmUucG9yUG9ydHMxICE9IDYpCisJCQl7CisJCQkJQ09NUExFVEUocEIsIEkyRUVfSU5DT05TSVNUKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gRml4IHVwIHRoZSAiZ29vZCBjaGFubmVsIGxpc3QgYmFzZWQgb24gYW55IGVycm9ycyByZXBvcnRlZC4KKwkJaWYgKHBCLT5pMmVQb20uZS5wb3JEaWFnMSAmIFBPUl9CQURfVUFSVDEpCisJCXsKKwkJCXBCLT5pMmVHb29kTWFwWzBdICY9IH4weDBmOworCQl9CisKKwkJaWYgKHBCLT5pMmVQb20uZS5wb3JEaWFnMSAmIFBPUl9CQURfVUFSVDIpCisJCXsKKwkJCXBCLT5pMmVHb29kTWFwWzBdICY9IH4weGYwOworCQl9CisKKwkJYnJlYWs7ICAgLy8gUE9SX0lEX0ZJSSBjYXNlCisKKwljYXNlIFBPUl9JRF9GSUlFWDogICAvLyBJbnRlbGxpUG9ydC1JSUVYCisKKwkJcEItPmkyZUZpZm9TdHlsZSA9IEZJRk9fSUlFWDsKKworCQlpdGVtcCA9IHBCLT5pMmVQb20uZS5wb3JGaWZvU2l6ZTsKKworCQkvLyBJbXBsaWNpdCBhc3N1bXB0aW9uIHRoYXQgZmlmbyB3b3VsZCBub3QgZ3JvdyBiZXlvbmQgMzJrLCAKKwkJLy8gbm9yIHdvdWxkIGV2ZXIgYmUgbGVzcyB0aGFuIDI1Ni4KKworCQlpZiAoaXRlbXAgPCA4IHx8IGl0ZW1wID4gMTUpCisJCXsKKwkJCUNPTVBMRVRFKHBCLCBJMkVFX0lOQ09OU0lTVCk7CisJCX0KKwkJcEItPmkyZUZpZm9TaXplID0gKDEgPDwgaXRlbXApOworCisJCS8vIFRoZXNlIGFyZSBiYXNlZCBvbiB3aGF0IFAuTy5TLlQgdGhpbmtzIHNob3VsZCBiZSB0aGVyZSwgYmFzZWQgb24KKwkJLy8gYm94IElEIHJlZ2lzdGVycworCQlpbGltaXQgPSBwQi0+aTJlUG9tLmUucG9yTnVtQm94ZXM7CisJCWlmIChpbGltaXQgPiBBQlNfTUFYX0JPWEVTKQorCQl7CisJCQlpbGltaXQgPSBBQlNfTUFYX0JPWEVTOworCQl9CisKKwkJLy8gRm9yIGFzIG1hbnkgYm94ZXMgYXMgRVhJU1QsIGdpdmVzIHRoZSB0eXBlIG9mIGJveC4KKwkJLy8gQWRkZWQgOC82LzkzOiBjaGVjayBmb3IgdGhlIElTQS00IChhc2ljKSB3aGljaCBsb29rcyBsaWtlIGFuCisJCS8vIGV4cGFuZGFibGUgYnV0IGZvciB3aG9tICI4IG9yIDE2PyIgaXMgbm90IHRoZSByaWdodCBxdWVzdGlvbi4KKworCQl1dGVtcCA9IHBCLT5pMmVQb20uZS5wb3JGbGFnczsKKwkJaWYgKHV0ZW1wICYgUE9SX0NFWDQpCisJCXsKKwkJCXBCLT5pMmVDaGFubmVsTWFwWzBdID0gMHgwMDBmOworCQl9IGVsc2UgeworCQkJdXRlbXAgJj0gUE9SX0JPWEVTOworCQkJZm9yIChpdGVtcCA9IDA7IGl0ZW1wIDwgaWxpbWl0OyBpdGVtcCsrKQorCQkJeworCQkJCXBCLT5pMmVDaGFubmVsTWFwW2l0ZW1wXSA9IAorCQkJCQkoKHV0ZW1wICYgUE9SX0JPWF8xNikgPyAweGZmZmYgOiAweDAwZmYpOworCQkJCXV0ZW1wID4+PSAxOworCQkJfQorCQl9CisKKwkJLy8gVGhlc2UgYXJlIGJhc2VkIG9uIHdoYXQgUC5PLlMuVCBhY3R1YWxseSBmb3VuZC4KKworCQl1dGVtcCA9IChwQi0+aTJlUG9tLmUucG9yUG9ydHMyIDw8IDgpICsgcEItPmkyZVBvbS5lLnBvclBvcnRzMTsKKworCQlmb3IgKGl0ZW1wID0gMDsgaXRlbXAgPCBpbGltaXQ7IGl0ZW1wKyspCisJCXsKKwkJCXBCLT5pMmVHb29kTWFwW2l0ZW1wXSA9IDA7CisJCQlpZiAodXRlbXAgJiAxKSBwQi0+aTJlR29vZE1hcFtpdGVtcF0gfD0gMHgwMDBmOworCQkJaWYgKHV0ZW1wICYgMikgcEItPmkyZUdvb2RNYXBbaXRlbXBdIHw9IDB4MDBmMDsKKwkJCWlmICh1dGVtcCAmIDQpIHBCLT5pMmVHb29kTWFwW2l0ZW1wXSB8PSAweDBmMDA7CisJCQlpZiAodXRlbXAgJiA4KSBwQi0+aTJlR29vZE1hcFtpdGVtcF0gfD0gMHhmMDAwOworCQkJdXRlbXAgPj49IDQ7CisJCX0KKworCQkvLyBOb3cgZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIHRyYW5zZmVyIGluIDggb3IgMTYtYml0IG1vZGUuCisJCXN3aXRjaCAocEItPmkyZVBvbS5lLnBvckJ1cyAmIChQT1JfQlVTX1NMT1QxNiB8IFBPUl9CVVNfRElQMTYpICkKKwkJeworCQljYXNlIFBPUl9CVVNfU0xPVDE2IHwgUE9SX0JVU19ESVAxNjoKKwkJCXBCLT5pMmVEYXRhV2lkdGgxNiA9IFlFUzsKKwkJCXBCLT5pMmVNYXhJcnEgPSAxNTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SX0JVU19TTE9UMTY6CisJCQlwQi0+aTJlRGF0YVdpZHRoMTYgPSBOTzsKKwkJCXBCLT5pMmVNYXhJcnEgPSAxNTsKKwkJCWJyZWFrOworCisJCWNhc2UgMDoKKwkJY2FzZSBQT1JfQlVTX0RJUDE2OiAgICAgLy8gSW4gYW4gOC1iaXQgc2xvdCwgRElQIHN3aXRjaCBkb24ndCBjYXJlLgorCQlkZWZhdWx0OgorCQkJcEItPmkyZURhdGFXaWR0aDE2ID0gTk87CisJCQlwQi0+aTJlTWF4SXJxID0gNzsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOyAgIC8vIFBPUl9JRF9GSUlFWCBjYXNlCisKKwlkZWZhdWx0OiAgICAvLyBVbmtub3duIHR5cGUgb2YgYm9hcmQKKwkJQ09NUExFVEUocEIsIEkyRUVfQkFEX0ZBTUlMWSk7CisJCWJyZWFrOworCX0gIC8vIEVuZCB0aGUgc3dpdGNoIGJhc2VkIG9uIGZhbWlseQorCisJLy8gVGVtcG9yYXJpbHksIGNsYWltIHRoZXJlIGlzIG5vIHJvb20gaW4gdGhlIG91dGJvdW5kIGZpZm8uIAorCS8vIFdlIHdpbGwgbWFpbnRhaW4gdGhpcyB3aGVuZXZlciB3ZSBjaGVjayBmb3IgYW4gZW1wdHkgb3V0Ym91bmQgRklGTy4KKwlwQi0+aTJlRmlmb1JlbWFpbnMgPSAwOworCisJLy8gTm93LCBiYXNlZCBvbiB0aGUgYnVzIHR5cGUsIHNob3VsZCB3ZSBleHBlY3QgdG8gYmUgYWJsZSB0byByZS1jb25maWd1cmUKKwkvLyBpbnRlcnJ1cHRzIChzYXksIGZvciB0ZXN0aW5nIHB1cnBvc2VzKS4KKwlzd2l0Y2ggKHBCLT5pMmVQb20uZS5wb3JCdXMgJiBQT1JfQlVTX1RZUEUpCisJeworCWNhc2UgUE9SX0JVU19UX0lTQToKKwljYXNlIFBPUl9CVVNfVF9VTks6ICAvLyBJZiB0aGUgdHlwZSBvZiBidXMgaXMgdW5kZWNsYXJlZCwgYXNzdW1lIG9rLgorCQlwQi0+aTJlQ2hhbmdlSXJxID0gWUVTOworCQlicmVhazsKKwljYXNlIFBPUl9CVVNfVF9NQ0E6CisJY2FzZSBQT1JfQlVTX1RfRUlTQToKKwkJcEItPmkyZUNoYW5nZUlycSA9IE5POworCQlicmVhazsKKwlkZWZhdWx0OgorCQlDT01QTEVURShwQiwgSTJFRV9CQURCVVMpOworCX0KKworCWlmIChwQi0+aTJlRGF0YVdpZHRoMTYgPT0gWUVTKQorCXsKKwkJcEItPmkyZVdyaXRlQnVmICA9IGlpV3JpdGVCdWYxNjsKKwkJcEItPmkyZVJlYWRCdWYgICA9IGlpUmVhZEJ1ZjE2OworCQlwQi0+aTJlV3JpdGVXb3JkID0gaWlXcml0ZVdvcmQxNjsKKwkJcEItPmkyZVJlYWRXb3JkICA9IGlpUmVhZFdvcmQxNjsKKwl9IGVsc2UgeworCQlwQi0+aTJlV3JpdGVCdWYgID0gaWlXcml0ZUJ1Zjg7CisJCXBCLT5pMmVSZWFkQnVmICAgPSBpaVJlYWRCdWY4OworCQlwQi0+aTJlV3JpdGVXb3JkID0gaWlXcml0ZVdvcmQ4OworCQlwQi0+aTJlUmVhZFdvcmQgID0gaWlSZWFkV29yZDg7CisJfQorCisJc3dpdGNoKHBCLT5pMmVGaWZvU3R5bGUpCisJeworCWNhc2UgRklGT19JSToKKwkJcEItPmkyZVdhaXRGb3JUeEVtcHR5ID0gaWlXYWl0Rm9yVHhFbXB0eUlJOworCQlwQi0+aTJlVHhNYWlsRW1wdHkgICAgPSBpaVR4TWFpbEVtcHR5SUk7CisJCXBCLT5pMmVUcnlTZW5kTWFpbCAgICA9IGlpVHJ5U2VuZE1haWxJSTsKKwkJcEItPmkyZUdldE1haWwgICAgICAgID0gaWlHZXRNYWlsSUk7CisJCXBCLT5pMmVFbmFibGVNYWlsSXJxICA9IGlpRW5hYmxlTWFpbElycUlJOworCQlwQi0+aTJlV3JpdGVNYXNrICAgICAgPSBpaVdyaXRlTWFza0lJOworCisJCWJyZWFrOworCisJY2FzZSBGSUZPX0lJRVg6CisJCXBCLT5pMmVXYWl0Rm9yVHhFbXB0eSA9IGlpV2FpdEZvclR4RW1wdHlJSUVYOworCQlwQi0+aTJlVHhNYWlsRW1wdHkgICAgPSBpaVR4TWFpbEVtcHR5SUlFWDsKKwkJcEItPmkyZVRyeVNlbmRNYWlsICAgID0gaWlUcnlTZW5kTWFpbElJRVg7CisJCXBCLT5pMmVHZXRNYWlsICAgICAgICA9IGlpR2V0TWFpbElJRVg7CisJCXBCLT5pMmVFbmFibGVNYWlsSXJxICA9IGlpRW5hYmxlTWFpbElycUlJRVg7CisJCXBCLT5pMmVXcml0ZU1hc2sgICAgICA9IGlpV3JpdGVNYXNrSUlFWDsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUNPTVBMRVRFKHBCLCBJMkVFX0lOQ09OU0lTVCk7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpbmZvcm1hdGlvbi4KKwlwQi0+aTJlU3RhdGUgPSBJSV9TVEFURV9SRUFEWTsgICAvLyBSZWFkeSB0byBsb2FkIGxvYWR3YXJlLgorCisJLy8gU29tZSBGaW5hbCBjbGVhbnVwOgorCS8vIEZvciBzb21lIGJvYXJkcywgdGhlIGJvb3RzdHJhcCBmaXJtd2FyZSBtYXkgcGVyZm9ybSBzb21lIHNvcnQgb2YgdGVzdAorCS8vIHJlc3VsdGluZyBpbiBhIHN0cmF5IGNoYXJhY3RlciBwZW5kaW5nIGluIHRoZSBpbmNvbWluZyBtYWlsYm94LiBJZiBvbmUgaXMKKwkvLyB0aGVyZSwgaXQgc2hvdWxkIGJlIHJlYWQgYW5kIGRpc2NhcmRlZCwgZXNwZWNpYWxseSBzaW5jZSBmb3IgdGhlIHN0YW5kYXJkCisJLy8gZmlybXdhcmUsIGl0J3MgdGhlIG1haWxib3ggdGhhdCBpbnRlcnJ1cHRzIHRoZSBob3N0LgorCisJcEItPmkyZVN0YXJ0TWFpbCA9IGlpR2V0TWFpbChwQik7CisKKwkvLyBUaHJvdyBpdCBhd2F5IGFuZCBjbGVhciB0aGUgbWFpbGJveCBzdHJ1Y3R1cmUgZWxlbWVudAorCXBCLT5pMmVTdGFydE1haWwgPSBOT19NQUlMX0hFUkU7CisKKwkvLyBFdmVyeXRoaW5nIGlzIG9rIG5vdywgcmV0dXJuIHdpdGggZ29vZCBzdGF0dXMvCisKKwlwQi0+aTJlVmFsaWQgPSBJMkVfTUFHSUM7CisJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRGVsYXkgUm91dGluZXMKKy8vCisvLyBpaURlbGF5SU8KKy8vIGlpTm9wCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHZvaWQKK2lpMkRlbGF5V2FrZXVwKHVuc2lnbmVkIGxvbmcgaWQpCit7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICggJnBEZWxheVdhaXQgKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpMkRlbGF5VGltZXIobXNlY29uZHMpCisvLyBQYXJhbWV0ZXJzOiBtc2Vjb25kcyAtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gVGhpcyByb3V0aW5lIGRlbGF5cyBmb3IgYXBwcm94aW1hdGVseSBtc2Vjb25kcyBtaWxsaXNlY29uZHMgYW5kIGlzIGludGVuZGVkCisvLyB0byBiZSBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoIGkyRGVsYXkgZmllbGQgaW4gaTJlQm9yZFN0ci4gSXQgdXNlcyB0aGUKKy8vIExpbnV4IHRpbWVyX2xpc3QgbWVjaGFuaXNtLgorLy8KKy8vIFRoZSBMaW51eCB0aW1lcnMgdXNlIGEgdW5pdCBjYWxsZWQgImppZmZpZXMiIHdoaWNoIGFyZSAxMG1TIGluIHRoZSBJbnRlbAorLy8gYXJjaGl0ZWN0dXJlLiBUaGlzIGZ1bmN0aW9uIHJvdW5kcyB0aGUgZGVsYXkgcGVyaW9kIHVwIHRvIHRoZSBuZXh0ICJqaWZmeSIuCisvLyBJbiB0aGUgQWxwaGEgYXJjaGl0ZWN0dXJlIHRoZSAiamlmZnkiIGlzIDFtUywgYnV0IHRoaXMgZHJpdmVyIGlzIG5vdCBpbnRlbmRlZAorLy8gZm9yIEFscGhhIHBsYXRmb3JtcyBhdCB0aGlzIHRpbWUuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpaTJEZWxheVRpbWVyKHVuc2lnbmVkIGludCBtc2Vjb25kcykKK3sKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKworCWluaXRfdGltZXIgKCBwRGVsYXlUaW1lciApOworCisJYWRkX3dhaXRfcXVldWUoJnBEZWxheVdhaXQsICZ3YWl0KTsKKworCXNldF9jdXJyZW50X3N0YXRlKCBUQVNLX0lOVEVSUlVQVElCTEUgKTsKKworCXBEZWxheVRpbWVyLT5leHBpcmVzICA9IGppZmZpZXMgKyAoIG1zZWNvbmRzICsgOSApIC8gMTA7CisJcERlbGF5VGltZXItPmZ1bmN0aW9uID0gaWkyRGVsYXlXYWtldXA7CisJcERlbGF5VGltZXItPmRhdGEgICAgID0gMDsKKworCWFkZF90aW1lciAoIHBEZWxheVRpbWVyICk7CisKKwlzY2hlZHVsZSgpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoIFRBU0tfUlVOTklORyApOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwRGVsYXlXYWl0LCAmd2FpdCk7CisKKwlkZWxfdGltZXIgKCBwRGVsYXlUaW1lciApOworfQorCisjaWYgMAorLy9zdGF0aWMgdm9pZCBpaTJEZWxheUlPKHVuc2lnbmVkIGludCk7CisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gISEhIE5vdCBVc2VkLCB0aGlzIGlzIERPUyBjcmFwLCBzb21lIG9mIHlvdSB5b3VuZyBmb2xrcyBtYXkgYmUgaW50ZXJlc3RlZCBpbgorLy8gICAgIGluIGhvdyB0aGluZ3Mgd2VyZSBkb25lIGluIHRoZSBzdG9uZSBhZ2Ugb2YgY2FjdWxhdGluZyBtYWNoaW5lcyAgICAgICAhISEKKy8vIEZ1bmN0aW9uOiAgIGlpMkRlbGF5SU8obXNlY29uZHMpCisvLyBQYXJhbWV0ZXJzOiBtc2Vjb25kcyAtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gVGhpcyByb3V0aW5lIGRlbGF5cyBmb3IgYXBwcm94aW1hdGVseSBtc2Vjb25kcyBtaWxsaXNlY29uZHMgYW5kIGlzIGludGVuZGVkCisvLyB0byBiZSBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoIGkyRGVsYXkgZmllbGQgaW4gaTJlQm9yZFN0ci4gSXQgaXMgaW50ZW5kZWQKKy8vIGZvciB1c2Ugd2hlcmUgYSBjbG9jay1iYXNlZCBmdW5jdGlvbiBpcyBpbXBvc3NpYmxlOiBmb3IgZXhhbXBsZSwgRE9TIGRyaXZlcnMuCisvLworLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBJTiBpbnN0cnVjdGlvbiB0byBwbGFjZSBib3VuZHMgb24gdGhlIHRpbWluZyBhbmQKKy8vIGFzc3VtZXMgdGhhdCBpaTJTYWZlIGhhcyBiZWVuIHNldC4gVGhpcyBpcyBiZWNhdXNlIEkvTyBpbnN0cnVjdGlvbnMgYXJlIG5vdAorLy8gc3ViamVjdCB0byBjYWNoaW5nIGFuZCB3aWxsIHRoZXJlZm9yZSB0YWtlIGEgY2VydGFpbiBtaW5pbXVtIHRpbWUuIFRvIGVuc3VyZQorLy8gdGhlIGRlbGF5IGlzIGF0IGxlYXN0IGxvbmcgZW5vdWdoIG9uIGZhc3QgbWFjaGluZXMsIGl0IGlzIGJhc2VkIG9uIHNvbWUKKy8vIGZhc3Rlc3QtY2FzZSBjYWxjdWxhdGlvbnMuICBPbiBzbG93ZXIgbWFjaGluZXMgdGhpcyBtYXkgY2F1c2UgVkVSWSBsb25nCisvLyBkZWxheXMuICgzIHggZmFzdGVzdCBjYXNlKS4gSW4gdGhlIGZhc3Rlc3QgY2FzZSwgZXZlcnl0aGluZyBpcyBjYWNoZWQgZXhjZXB0CisvLyB0aGUgSS9PIGluc3RydWN0aW9uIGl0c2VsZi4KKy8vCisvLyBUaW1pbmcgY2FsY3VsYXRpb25zOgorLy8gVGhlIGZhc3Rlc3QgYnVzIHNwZWVkIGZvciBJL08gb3BlcmF0aW9ucyBpcyBsaWtlbHkgdG8gYmUgMTAgTUh6LiBUaGUgSS9PCisvLyBvcGVyYXRpb24gaW4gcXVlc3Rpb24gaXMgYSBieXRlIG9wZXJhdGlvbiB0byBhbiBvZGQgYWRkcmVzcy4gRm9yIDgtYml0CisvLyBvcGVyYXRpb25zLCB0aGUgYXJjaGl0ZWN0dXJlIGdlbmVyYWxseSBlbmZvcmNlcyB0d28gd2FpdCBzdGF0ZXMuIEF0IDEwIE1IeiwgYQorLy8gc2luZ2xlIGN5Y2xlIHRpbWUgaXMgMTAwblMuIEEgcmVhZCBvcGVyYXRpb24gYXQgdHdvIHdhaXQgc3RhdGVzIHRha2VzIDYKKy8vIGN5Y2xlcyBmb3IgYSB0b3RhbCB0aW1lIG9mIDYwMG5TLiBUaGVyZWZvcmUgYXBwcm94aW1hdGVseSAxNjY2IGl0ZXJhdGlvbnMKKy8vIHdvdWxkIGJlIHJlcXVpcmVkIHRvIGdlbmVyYXRlIGEgc2luZ2xlIG1pbGxpc2Vjb25kIGRlbGF5LiBUaGUgd29yc3QKKy8vIChyZWFzb25hYmxlKSBjYXNlIHdvdWxkIGJlIGFuIDhNSHogc3lzdGVtIHdpdGggbm8gY2FjaGVpbmcuIEluIHRoaXMgY2FzZSwgdGhlCisvLyBJL08gaW5zdHJ1Y3Rpb24gd291bGQgdGFrZSAxMjVuUyB4IDYgY3lsZXMgPSA3NTAgblMuIE1vcmUgaW1wb3J0YW50bHksIGNvZGUKKy8vIGZldGNoIG9mIG90aGVyIGluc3RydWN0aW9ucyBpbiB0aGUgbG9vcCB3b3VsZCB0YWtlIHRpbWUgKHplcm8gd2FpdCBzdGF0ZXMsCisvLyBob3dldmVyKSBhbmQgd291bGQgYmUgaGFyZCB0byBlc3RpbWF0ZS4gVGhpcyBpcyBtaW5pbWl6ZWQgYnkgdXNpbmcgaW4tbGluZQorLy8gYXNzZW1ibGVyIGZvciB0aGUgaW4gaW5uZXIgbG9vcCBvZiBJTiBpbnN0cnVjdGlvbnMuIFRoaXMgY29uc2lzdHMgb2YganVzdCBhCisvLyBmZXcgYnl0ZXMuIFNvIHdlJ2xsIGd1ZXNzIGFib3V0IGZvdXIgY29kZSBmZXRjaGVzIHBlciBsb29wLiBFYWNoIGNvZGUgZmV0Y2gKKy8vIHNob3VsZCB0YWtlIGZvdXIgY3ljbGVzLCBzbyB3ZSBoYXZlIDEyNW5TICogOCA9IDEwMDBuUy4gV29yc3QgY2FzZSB0aGVuIGlzCisvLyB0aGF0IHdoYXQgc2hvdWxkIGhhdmUgdGFrZW4gMSBtUyB0YWtlcyBpbnN0ZWFkIDE2NjYgKiAoMTc1MCkgPSAyLjkgbVMuCisvLworLy8gU28gbXVjaCBmb3IgdGhlb3JldGljYWwgdGltaW5nczogcmVzdWx0cyB1c2luZyAxNjY2IHZhbHVlIG9uIHNvbWUgYWN0dWFsCisvLyBtYWNoaW5lczoKKy8vIElCTSAgICAgIDI4NiAgICAgIDZNSHogICAgIDMuMTUgbVMKKy8vIFplbml0aCAgIDM4NiAgICAgIDMzTUh6ICAgIDIuNDUgbVMKKy8vIChicmFuZFgpIDM4NiAgICAgIDMzTUh6ICAgIDEuOTAgbVMgIChoYXMgY2FjaGUpCisvLyAoYnJhbmRZKSA0ODYgICAgICAzM01IeiAgICAyLjM1IG1TCisvLyBOQ1IgICAgICA0ODYgICAgICA/PyAgICAgICAxLjY1IG1TIChtaWNyb2NoYW5uZWwpCisvLworLy8gRm9yIG1vc3QgbWFjaGluZXMsIGl0IGlzIHByb2JhYmx5IHNhZmUgdG8gc2NhbGUgdGhpcyBudW1iZXIgYmFjayAocmVtZW1iZXIsCisvLyBmb3Igcm9idXN0IG9wZXJhdGlvbiB1c2UgYW4gYWN0dWFsIHRpbWVkIGRlbGF5IGlmIHBvc3NpYmxlKSwgc28gd2UgYXJlIHVzaW5nCisvLyBhIHZhbHVlIG9mIDExOTAuIFRoaXMgeWllbGRzIDEuMTcgbVMgZm9yIHRoZSBmYXN0ZXN0IG1hY2hpbmUgaW4gb3VyIHNhbXBsZSwKKy8vIDEuNzUgbVMgZm9yIHR5cGljYWwgMzg2IG1hY2hpbmVzLCBhbmQgMi4yNSBtUyB0aGUgYWJzb2x1dGUgc2xvd2VzdCBtYWNoaW5lLgorLy8KKy8vIDEvMjkvOTM6CisvLyBUaGUgYWJvdmUgdGltaW5ncyBhcmUgdG9vIHNsb3cuIEFjdHVhbCBjeWNsZSB0aW1lcyBtaWdodCBiZSBmYXN0ZXIuIElTQSBjeWNsZQorLy8gdGltZXMgY291bGQgYXBwcm9hY2ggNTAwIG5TLCBhbmQgLi4uCisvLyBUaGUgSUJNIG1vZGVsIDc3IGJlaW5nIG1pY3JvY2hhbm5lbCBoYXMgbm8gd2FpdCBzdGF0ZXMgZm9yIDgtYml0IHJlYWRzIGFuZAorLy8gc2VlbXMgdG8gYmUgYWNjZXNzaW5nIHRoZSBJL08gYXQgNDQwIG5TIHBlciBhY2Nlc3MgKGZyb20gc3RhcnQgb2Ygb25lIHRvCisvLyBzdGFydCBvZiBuZXh0KS4gVGhpcyB3b3VsZCBpbXBseSB3ZSBuZWVkIDEwMDAvLjQ0MCA9IDIyNzIgaXRlcmF0aW9ucyB0bworLy8gZ3VhcmFudGVlIHdlIGFyZSBmYXN0IGVub3VnaC4gSW4gYWN0dWFsIHRlc3RpbmcsIHdlIHNlZSB0aGF0IDIgKiAxMTkwIGFyZSBpbgorLy8gZmFjdCBlbm91Z2guIEZvciBkaWFnbm9zdGljcywgd2Uga2VlcCB0aGUgbGV2ZWwgYXQgMTE5MCwgYnV0IGRldmVsb3BlcnMgbm90ZQorLy8gdGhpcyBuZWVkcyB0dW5pbmcuCisvLworLy8gU2FmZSBhc3N1bXB0aW9uOiAgMjI3MCBpL28gcmVhZHMgPSAxIG1pbGxpc2Vjb25kCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCitzdGF0aWMgaW50IGlpMkRlbFZhbHVlID0gMTE5MDsgIC8vIFNlZSB0aW1pbmcgY2FsY3VsYXRpb25zIGJlbG93CisJCQkJCQkvLyAxNjY2IGZvciBmYXN0ZXN0IHRoZW9yZXRpY2FsIG1hY2hpbmUKKwkJCQkJCS8vIDExOTAgc2FmZSBmb3IgbW9zdCBmYXN0IDM4NiBtYWNoaW5lcworCQkJCQkJLy8gMTAwMCBmb3IgZmFzdGVzdCBtYWNoaW5lIHRlc3RlZCBoZXJlCisJCQkJCQkvLyAgNTQwIChzaWMpIGZvciBBVDI4Ni82TWh6CitzdGF0aWMgdm9pZAoraWkyRGVsYXlJTyh1bnNpZ25lZCBpbnQgbXNlY29uZHMpCit7CisJaWYgKCFpaTJTYWZlKSAKKwkJcmV0dXJuOyAgIC8qIERvIG5vdGhpbmcgaWYgdGhpcyB2YXJpYWJsZSB1bmluaXRpYWxpemVkICovCisKKwl3aGlsZShtc2Vjb25kcy0tKSB7CisJCWludCBpID0gaWkyRGVsVmFsdWU7CisJCXdoaWxlICggaS0tICkgeworCQkJSU5CICggaWkyU2FmZSApOworCQl9CisJfQorfQorI2VuZGlmIAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWkyTm9wKCkKKy8vIFBhcmFtZXRlcnM6IE5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICBOb3RoaW5nCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gaWlJbml0aWFsaXplIHdpbGwgc2V0IGkyZURlbGF5IHRvIHRoaXMgaWYgdGhlIGRlbGF5IHBhcmFtZXRlciBpcyBOVUxMLiBUaGlzCisvLyBzYXZlcyBjaGVja2luZyBmb3IgYSBOVUxMIHBvaW50ZXIgYXQgZXZlcnkgY2FsbC4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWkyTm9wKHZvaWQpCit7CisJcmV0dXJuOwkvLyBubyBteXN0ZXJ5IGhlcmUKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSb3V0aW5lcyB3aGljaCBhcmUgYXZhaWxhYmxlIGluIDgvMTYtYml0IHZlcnNpb25zLCBvcgorLy8gaW4gZGlmZmVyZW50IGZpZm8gc3R5bGVzLiBUaGVzZSBhcmUgQUxMIGNhbGxlZAorLy8gaW5kaXJlY3RseSB0aHJvdWdoIHRoZSBib2FyZCBzdHJ1Y3R1cmUuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV3JpdGVCdWYxNihwQiwgYWRkcmVzcywgY291bnQpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIGFkZHJlc3MgLSBhZGRyZXNzIG9mIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgIGNvdW50ICAgLSBudW1iZXIgb2YgZGF0YSBieXRlcyB0byB3cml0ZQorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgZXZlcnl0aGluZyBhcHBlYXJzIGNvcGFjZXRpYy4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIHRoZXJlIGlzIGFueSBlcnJvcjogdGhlIHBCLT5pMmVFcnJvciBmaWVsZCBoYXMgdGhlIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gV3JpdGVzICdjb3VudCcgYnl0ZXMgZnJvbSAnYWRkcmVzcycgdG8gdGhlIGRhdGEgZmlmbyBzcGVjaWZpZWQgYnkgdGhlIGJvYXJkCisvLyBzdHJ1Y3R1cmUgcG9pbnRlciBwQi4gU2hvdWxkIGNvdW50IGhhcHBlbiB0byBiZSBvZGQsIGFuIGV4dHJhIHBhZCBieXRlIGlzCisvLyBzZW50IChpZGVudGl0eSB1bmtub3duLi4uKS4gVXNlcyAxNi1iaXQgKHdvcmQpIG9wZXJhdGlvbnMuIElzIGNhbGxlZAorLy8gaW5kaXJlY3RseSB0aHJvdWdoIHBCLT5pMmVXcml0ZUJ1Zi4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlXcml0ZUJ1ZjE2KGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MsIGludCBjb3VudCkKK3sKKwkvLyBSdWRpbWVudGFyeSBzYW5pdHkgY2hlY2tpbmcgaGVyZS4KKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQykKKwkJQ09NUExFVEUocEIsIEkyRUVfSU5WQUxJRCk7CisKKwlPVVRTVyAoIHBCLT5pMmVEYXRhLCBhZGRyZXNzLCBjb3VudCk7CisKKwlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpV3JpdGVCdWY4KHBCLCBhZGRyZXNzLCBjb3VudCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgYWRkcmVzcyAtIGFkZHJlc3Mgb2YgZGF0YSB0byB3cml0ZQorLy8gICAgICAgICAgICAgY291bnQgICAtIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIHdyaXRlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBXcml0ZXMgJ2NvdW50JyBieXRlcyBmcm9tICdhZGRyZXNzJyB0byB0aGUgZGF0YSBmaWZvIHNwZWNpZmllZCBieSB0aGUgYm9hcmQKKy8vIHN0cnVjdHVyZSBwb2ludGVyIHBCLiBTaG91bGQgY291bnQgaGFwcGVuIHRvIGJlIG9kZCwgYW4gZXh0cmEgcGFkIGJ5dGUgaXMKKy8vIHNlbnQgKGlkZW50aXR5IHVua25vd24uLi4pLiBUaGlzIGlzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgMTYtYml0IHZlcnNpb24uCisvLyBVc2VzIDgtYml0IChieXRlKSBvcGVyYXRpb25zLiBJcyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoIHBCLT5pMmVXcml0ZUJ1Zi4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlXcml0ZUJ1ZjgoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciAqYWRkcmVzcywgaW50IGNvdW50KQoreworCS8qIFJ1ZGltZW50YXJ5IHNhbml0eSBjaGVja2luZyBoZXJlICovCisJaWYgKHBCLT5pMmVWYWxpZCAhPSBJMkVfTUFHSUMpCisJCUNPTVBMRVRFKHBCLCBJMkVFX0lOVkFMSUQpOworCisJT1VUU0IgKCBwQi0+aTJlRGF0YSwgYWRkcmVzcywgY291bnQgKTsKKworCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlSZWFkQnVmMTYocEIsIGFkZHJlc3MsIGNvdW50KQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBhZGRyZXNzIC0gYWRkcmVzcyB0byBwdXQgZGF0YSByZWFkCisvLyAgICAgICAgICAgICBjb3VudCAgIC0gbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdG8gcmVhZAorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgZXZlcnl0aGluZyBhcHBlYXJzIGNvcGFjZXRpYy4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIHRoZXJlIGlzIGFueSBlcnJvcjogdGhlIHBCLT5pMmVFcnJvciBmaWVsZCBoYXMgdGhlIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gUmVhZHMgJ2NvdW50JyBieXRlcyBpbnRvICdhZGRyZXNzJyBmcm9tIHRoZSBkYXRhIGZpZm8gc3BlY2lmaWVkIGJ5IHRoZSBib2FyZAorLy8gc3RydWN0dXJlIHBvaW50ZXIgcEIuIFNob3VsZCBjb3VudCBoYXBwZW4gdG8gYmUgb2RkLCBhbiBleHRyYSBwYWQgYnl0ZSBpcworLy8gcmVjZWl2ZWQgKGlkZW50aXR5IHVua25vd24uLi4pLiBVc2VzIDE2LWJpdCAod29yZCkgb3BlcmF0aW9ucy4gSXMgY2FsbGVkCisvLyBpbmRpcmVjdGx5IHRocm91Z2ggcEItPmkyZVJlYWRCdWYuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpUmVhZEJ1ZjE2KGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MsIGludCBjb3VudCkKK3sKKwkvLyBSdWRpbWVudGFyeSBzYW5pdHkgY2hlY2tpbmcgaGVyZS4KKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQykKKwkJQ09NUExFVEUocEIsIEkyRUVfSU5WQUxJRCk7CisKKwlJTlNXICggcEItPmkyZURhdGEsIGFkZHJlc3MsIGNvdW50KTsKKworCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlSZWFkQnVmOChwQiwgYWRkcmVzcywgY291bnQpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIGFkZHJlc3MgLSBhZGRyZXNzIHRvIHB1dCBkYXRhIHJlYWQKKy8vICAgICAgICAgICAgIGNvdW50ICAgLSBudW1iZXIgb2YgZGF0YSBieXRlcyB0byByZWFkCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBSZWFkcyAnY291bnQnIGJ5dGVzIGludG8gJ2FkZHJlc3MnIGZyb20gdGhlIGRhdGEgZmlmbyBzcGVjaWZpZWQgYnkgdGhlIGJvYXJkCisvLyBzdHJ1Y3R1cmUgcG9pbnRlciBwQi4gU2hvdWxkIGNvdW50IGhhcHBlbiB0byBiZSBvZGQsIGFuIGV4dHJhIHBhZCBieXRlIGlzCisvLyByZWNlaXZlZCAoaWRlbnRpdHkgdW5rbm93bi4uLikuIFRoaXMgdG8gbWF0Y2ggdGhlIDE2LWJpdCBiZWhhdmlvdXIuIFVzZXMKKy8vIDgtYml0IChieXRlKSBvcGVyYXRpb25zLiBJcyBjYWxsZWQgaW5kaXJlY3RseSB0aHJvdWdoIHBCLT5pMmVSZWFkQnVmLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVJlYWRCdWY4KGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MsIGludCBjb3VudCkKK3sKKwkvLyBSdWRpbWVudGFyeSBzYW5pdHkgY2hlY2tpbmcgaGVyZS4KKwlpZiAocEItPmkyZVZhbGlkICE9IEkyRV9NQUdJQykKKwkJQ09NUExFVEUocEIsIEkyRUVfSU5WQUxJRCk7CisKKwlJTlNCICggcEItPmkyZURhdGEsIGFkZHJlc3MsIGNvdW50KTsKKworCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlSZWFkV29yZDE2KHBCKQorLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBSZXR1cm5zIHRoZSB3b3JkIHJlYWQgZnJvbSB0aGUgZGF0YSBmaWZvIHNwZWNpZmllZCBieSB0aGUgYm9hcmQtc3RydWN0dXJlCisvLyBwb2ludGVyIHBCLiBVc2VzIGEgMTYtYml0IG9wZXJhdGlvbi4gSXMgY2FsbGVkIGluZGlyZWN0bHkgdGhyb3VnaAorLy8gcEItPmkyZVJlYWRXb3JkLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK2lpUmVhZFdvcmQxNihpMmVCb3JkU3RyUHRyIHBCKQoreworCXJldHVybiAodW5zaWduZWQgc2hvcnQpKCBJTlcocEItPmkyZURhdGEpICk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVJlYWRXb3JkOChwQikKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgZXZlcnl0aGluZyBhcHBlYXJzIGNvcGFjZXRpYy4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIHRoZXJlIGlzIGFueSBlcnJvcjogdGhlIHBCLT5pMmVFcnJvciBmaWVsZCBoYXMgdGhlIGVycm9yCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gUmV0dXJucyB0aGUgd29yZCByZWFkIGZyb20gdGhlIGRhdGEgZmlmbyBzcGVjaWZpZWQgYnkgdGhlIGJvYXJkLXN0cnVjdHVyZQorLy8gcG9pbnRlciBwQi4gVXNlcyB0d28gOC1iaXQgb3BlcmF0aW9ucy4gQnl0ZXMgYXJlIGFzc3VtZWQgdG8gYmUgTFNCIGZpcnN0LiBJcworLy8gY2FsbGVkIGluZGlyZWN0bHkgdGhyb3VnaCBwQi0+aTJlUmVhZFdvcmQuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAoraWlSZWFkV29yZDgoaTJlQm9yZFN0clB0ciBwQikKK3sKKwl1bnNpZ25lZCBzaG9ydCB1cnM7CisKKwl1cnMgPSBJTkIgKCBwQi0+aTJlRGF0YSApOworCisJcmV0dXJuICggKCBJTkIgKCBwQi0+aTJlRGF0YSApIDw8IDggKSB8IHVycyApOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlXcml0ZVdvcmQxNihwQiwgdmFsdWUpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLyAgICAgICAgICAgICB2YWx1ZSAtIGRhdGEgdG8gd3JpdGUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIGV2ZXJ5dGhpbmcgYXBwZWFycyBjb3BhY2V0aWMuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiB0aGVyZSBpcyBhbnkgZXJyb3I6IHRoZSBwQi0+aTJlRXJyb3IgZmllbGQgaGFzIHRoZSBlcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdyaXRlcyB0aGUgd29yZCAndmFsdWUnIHRvIHRoZSBkYXRhIGZpZm8gc3BlY2lmaWVkIGJ5IHRoZSBib2FyZC1zdHJ1Y3R1cmUKKy8vIHBvaW50ZXIgcEIuIFVzZXMgMTYtYml0IG9wZXJhdGlvbi4gSXMgY2FsbGVkIGluZGlyZWN0bHkgdGhyb3VnaAorLy8gcEItPmkyZVdyaXRlV29yZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpV3JpdGVXb3JkMTYoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJV09SRF9UTyhwQiwgKGludCl2YWx1ZSk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVdyaXRlV29yZDgocEIsIHZhbHVlKQorLy8gUGFyYW1ldGVyczogcEIgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgdmFsdWUgLSBkYXRhIHRvIHdyaXRlCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiBldmVyeXRoaW5nIGFwcGVhcnMgY29wYWNldGljLgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgdGhlcmUgaXMgYW55IGVycm9yOiB0aGUgcEItPmkyZUVycm9yIGZpZWxkIGhhcyB0aGUgZXJyb3IKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBXcml0ZXMgdGhlIHdvcmQgJ3ZhbHVlJyB0byB0aGUgZGF0YSBmaWZvIHNwZWNpZmllZCBieSB0aGUgYm9hcmQtc3RydWN0dXJlCisvLyBwb2ludGVyIHBCLiBVc2VzIHR3byA4LWJpdCBvcGVyYXRpb25zICh3cml0ZXMgTFNCIGZpcnN0KS4gSXMgY2FsbGVkCisvLyBpbmRpcmVjdGx5IHRocm91Z2ggcEItPmkyZVdyaXRlV29yZC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpV3JpdGVXb3JkOChpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlCWVRFX1RPKHBCLCAoY2hhcil2YWx1ZSk7CisJQllURV9UTyhwQiwgKGNoYXIpKHZhbHVlID4+IDgpICk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVdhaXRGb3JUeEVtcHR5SUkocEIsIG1TZGVsYXkpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIG1TZGVsYXkgLSBwZXJpb2QgdG8gd2FpdCBiZWZvcmUgcmV0dXJuaW5nCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiB0aGUgRklGTyBpcyBlbXB0eS4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIGl0IG5vdCBlbXB0eSBpbiB0aGUgcmVxdWlyZWQgdGltZTogdGhlIHBCLT5pMmVFcnJvcgorLy8gICAgICAgICAgICAgZmllbGQgaGFzIHRoZSBlcnJvci4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBXYWl0cyB1cCB0byAibVNkZWxheSIgbWlsbGlzZWNvbmRzIGZvciB0aGUgb3V0Z29pbmcgRklGTyB0byBiZWNvbWUgZW1wdHk7IGlmCisvLyBub3QgZW1wdHkgYnkgdGhlIHJlcXVpcmVkIHRpbWUsIHJldHVybnMgZmFsc2UgYW5kIGVycm9yIGluIHBCLT5pMmVFcnJvciwKKy8vIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCisvLworLy8gbVNkZWxheSA9PSAwIGlzIHRha2VuIHRvIG1lYW4gbXVzdCBiZSBlbXB0eSBvbiB0aGUgZmlyc3QgdGVzdC4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUkgLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyBOb3RlIHRoaXMgcm91dGluZSBpcyBvcmdhbml6ZWQgc28gdGhhdCBpZiBzdGF0dXMgaXMgb2sgdGhlcmUgaXMgbm8gZGVsYXkgYXQKKy8vIGFsbCBjYWxsZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgdGVzdC4gIElzIGNhbGxlZCBpbmRpcmVjdGx5IHRocm91Z2gKKy8vIHBCLT5pMmVXYWl0Rm9yVHhFbXB0eS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlXYWl0Rm9yVHhFbXB0eUlJKGkyZUJvcmRTdHJQdHIgcEIsIGludCBtU2RlbGF5KQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50IGl0ZW1wOworCisJZm9yICg7OykKKwl7CisJCS8vIFRoaXMgcm91dGluZSBoaW5nZXMgb24gYmVpbmcgYWJsZSB0byBzZWUgdGhlICJvdGhlciIgc3RhdHVzIHJlZ2lzdGVyCisJCS8vIChhcyBzZWVuIGJ5IHRoZSBsb2NhbCBwcm9jZXNzb3IpLiAgSGlzIGluY29taW5nIGZpZm8gaXMgb3VyIG91dGdvaW5nCisJCS8vIEZJRk8uCisJCS8vCisJCS8vIEJ5IHRoZSBuYXR1cmUgb2YgdGhpcyByb3V0aW5lLCB5b3Ugd291bGQgYmUgdXNpbmcgdGhpcyBhcyBwYXJ0IG9mIGEKKwkJLy8gbGFyZ2VyIGF0b21pYyBjb250ZXh0OiBpLmUuLCB5b3Ugd291bGQgdXNlIHRoaXMgcm91dGluZSB0byBlbnN1cmUgdGhlCisJCS8vIGZpZm8gZW1wdHksIHRoZW4gYWN0IG9uIHRoaXMgaW5mb3JtYXRpb24uIEJldHdlZW4gdGhlc2UgdHdvIGhhbHZlcywgCisJCS8vIHlvdSB3aWxsIGdlbmVyYWxseSBub3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdHMgb3IgaW4gYW55IHdheSAKKwkJLy8gZGlzcnVwdCB0aGUgYXNzdW1wdGlvbnMgaW1wbGljaXQgaW4gdGhlIGxhcmdlciBjb250ZXh0LgorCQkvLworCQkvLyBFdmVuIHdvcnNlLCBob3dldmVyLCB0aGlzIHJvdXRpbmUgInNoaWZ0cyIgdGhlIHN0YXR1cyByZWdpc3RlciB0byAKKwkJLy8gcG9pbnQgdG8gdGhlIGxvY2FsIHN0YXR1cyByZWdpc3RlciB3aGljaCBpcyBub3QgdGhlIHVzdWFsIHNpdHVhdGlvbi4KKwkJLy8gVGhlcmVmb3JlIGZvciBleHRyYSBzYWZldHksIHdlIGZvcmNlIHRoZSBjcml0aWNhbCBzZWN0aW9uIHRvIGJlCisJCS8vIGNvbXBsZXRlbHkgYXRvbWljLCBhbmQgcGljayB1cCBhZnRlciBvdXJzZWx2ZXMgYmVmb3JlIGFsbG93aW5nIGFueQorCQkvLyBpbnRlcnJ1cHRzIG9mIGFueSBraW5kLgorCisKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZEbF9zcGlubG9jayxmbGFncykKKwkJT1VUQihwQi0+aTJlUG9pbnRlciwgU0VMX0NPTU1BTkQpOworCQlPVVRCKHBCLT5pMmVQb2ludGVyLCBTRUxfQ01EX1NIKTsKKworCQlpdGVtcCA9IElOQihwQi0+aTJlU3RhdHVzKTsKKworCQlPVVRCKHBCLT5pMmVQb2ludGVyLCBTRUxfQ09NTUFORCk7CisJCU9VVEIocEItPmkyZVBvaW50ZXIsIFNFTF9DTURfVU5TSCk7CisKKwkJaWYgKGl0ZW1wICYgU1RfSU5fRU1QVFkpCisJCXsKKwkJCVVQREFURV9GSUZPX1JPT00ocEIpOworCQkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJkRsX3NwaW5sb2NrLGZsYWdzKQorCQkJQ09NUExFVEUocEIsIEkyRUVfR09PRCk7CisJCX0KKworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmRGxfc3BpbmxvY2ssZmxhZ3MpCisKKwkJaWYgKG1TZGVsYXktLSA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWlEZWxheShwQiwgMSk7ICAgICAgLyogMSBtUyBncmFudWxhcml0eSBvbiBjaGVja2luZyBjb25kaXRpb24gKi8KKwl9CisJQ09NUExFVEUocEIsIEkyRUVfVFhFX1RJTUUpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlXYWl0Rm9yVHhFbXB0eUlJRVgocEIsIG1TZGVsYXkpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIG1TZGVsYXkgLSBwZXJpb2QgdG8gd2FpdCBiZWZvcmUgcmV0dXJuaW5nCisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiB0aGUgRklGTyBpcyBlbXB0eS4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIGl0IG5vdCBlbXB0eSBpbiB0aGUgcmVxdWlyZWQgdGltZTogdGhlIHBCLT5pMmVFcnJvcgorLy8gICAgICAgICAgICAgZmllbGQgaGFzIHRoZSBlcnJvci4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBXYWl0cyB1cCB0byAibVNkZWxheSIgbWlsbGlzZWNvbmRzIGZvciB0aGUgb3V0Z29pbmcgRklGTyB0byBiZWNvbWUgZW1wdHk7IGlmCisvLyBub3QgZW1wdHkgYnkgdGhlIHJlcXVpcmVkIHRpbWUsIHJldHVybnMgZmFsc2UgYW5kIGVycm9yIGluIHBCLT5pMmVFcnJvciwKKy8vIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCisvLworLy8gbVNkZWxheSA9PSAwIGlzIHRha2VuIHRvIG1lYW4gbXVzdCBiZSBlbXB0eSBvbiB0aGUgZmlyc3QgdGVzdC4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUlFWCAtIHN0eWxlIEZJRk8ncworLy8KKy8vIE5vdGUgdGhpcyByb3V0aW5lIGlzIG9yZ2FuaXplZCBzbyB0aGF0IGlmIHN0YXR1cyBpcyBvayB0aGVyZSBpcyBubyBkZWxheSBhdAorLy8gYWxsIGNhbGxlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSB0ZXN0LiAgSXMgY2FsbGVkIGluZGlyZWN0bHkgdGhyb3VnaAorLy8gcEItPmkyZVdhaXRGb3JUeEVtcHR5LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVdhaXRGb3JUeEVtcHR5SUlFWChpMmVCb3JkU3RyUHRyIHBCLCBpbnQgbVNkZWxheSkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJZm9yICg7OykKKwl7CisJCS8vIEJ5IHRoZSBuYXR1cmUgb2YgdGhpcyByb3V0aW5lLCB5b3Ugd291bGQgYmUgdXNpbmcgdGhpcyBhcyBwYXJ0IG9mIGEKKwkJLy8gbGFyZ2VyIGF0b21pYyBjb250ZXh0OiBpLmUuLCB5b3Ugd291bGQgdXNlIHRoaXMgcm91dGluZSB0byBlbnN1cmUgdGhlCisJCS8vIGZpZm8gZW1wdHksIHRoZW4gYWN0IG9uIHRoaXMgaW5mb3JtYXRpb24uIEJldHdlZW4gdGhlc2UgdHdvIGhhbHZlcywKKwkJLy8geW91IHdpbGwgZ2VuZXJhbGx5IG5vdCB3YW50IHRvIHNlcnZpY2UgaW50ZXJydXB0cyBvciBpbiBhbnkgd2F5CisJCS8vIGRpc3J1cHQgdGhlIGFzc3VtcHRpb25zIGltcGxpY2l0IGluIHRoZSBsYXJnZXIgY29udGV4dC4KKworCQlXUklURV9MT0NLX0lSUVNBVkUoJkRsX3NwaW5sb2NrLGZsYWdzKQorCisJCWlmIChJTkIocEItPmkyZVN0YXR1cykgJiBTVEVfT1VUX01UKSB7CisJCQlVUERBVEVfRklGT19ST09NKHBCKTsKKwkJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZEbF9zcGlubG9jayxmbGFncykKKwkJCUNPTVBMRVRFKHBCLCBJMkVFX0dPT0QpOworCQl9CisJCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZEbF9zcGlubG9jayxmbGFncykKKworCQlpZiAobVNkZWxheS0tID09IDApCisJCQlicmVhazsKKworCQlpaURlbGF5KHBCLCAxKTsgICAgICAvLyAxIG1TIGdyYW51bGFyaXR5IG9uIGNoZWNraW5nIGNvbmRpdGlvbgorCX0KKwlDT01QTEVURShwQiwgSTJFRV9UWEVfVElNRSk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVR4TWFpbEVtcHR5SUkocEIpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICBUcnVlIGlmIHRoZSB0cmFuc21pdCBtYWlsYm94IGlzIGVtcHR5LgorLy8gICAgICAgICAgICAgRmFsc2UgaWYgaXQgbm90IGVtcHR5LgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgdHJhbnNtaXQgbWFpbGJveCBpcyBlbXB0eSAoYW5kCisvLyB0aGVyZWZvcmUgYWJsZSB0byBhY2NlcHQgbW9yZSBtYWlsKQorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSSAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaVR4TWFpbEVtcHR5SUkoaTJlQm9yZFN0clB0ciBwQikKK3sKKwlpbnQgcG9ydCA9IHBCLT5pMmVQb2ludGVyOworCU9VVEIgKCBwb3J0LCBTRUxfT1VUTUFJTCApOworCXJldHVybiAoIElOQihwb3J0KSA9PSAwICk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVR4TWFpbEVtcHR5SUlFWChwQikKKy8vIFBhcmFtZXRlcnM6IHBCICAgICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgdGhlIHRyYW5zbWl0IG1haWxib3ggaXMgZW1wdHkuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiBpdCBub3QgZW1wdHkuCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gUmV0dXJucyB0cnVlIG9yIGZhbHNlIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSB0cmFuc21pdCBtYWlsYm94IGlzIGVtcHR5IChhbmQKKy8vIHRoZXJlZm9yZSBhYmxlIHRvIGFjY2VwdCBtb3JlIG1haWwpCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJRVggLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlUeE1haWxFbXB0eUlJRVgoaTJlQm9yZFN0clB0ciBwQikKK3sKKwlyZXR1cm4gIShJTkIocEItPmkyZVN0YXR1cykgJiBTVEVfT1VUX01BSUwpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlUcnlTZW5kTWFpbElJKHBCLG1haWwpCisvLyBQYXJhbWV0ZXJzOiBwQiAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIG1haWwgLSB2YWx1ZSB0byB3cml0ZSB0byBtYWlsYm94CisvLworLy8gUmV0dXJuczogICAgVHJ1ZSBpZiB0aGUgdHJhbnNtaXQgbWFpbGJveCBpcyBlbXB0eSwgYW5kIG1haWwgaXMgc2VudC4KKy8vICAgICAgICAgICAgIEZhbHNlIGlmIGl0IG5vdCBlbXB0eS4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBJZiBvdXRnb2luZyBtYWlsYm94IGlzIGVtcHR5LCBzZW5kcyBtYWlsIGFuZCByZXR1cm5zIHRydWUuIElmIG91dGdvaW5nCisvLyBtYWlsYm94IGlzIG5vdCBlbXB0eSwgcmV0dXJucyBmYWxzZS4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUkgLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlUcnlTZW5kTWFpbElJKGkyZUJvcmRTdHJQdHIgcEIsIHVuc2lnbmVkIGNoYXIgbWFpbCkKK3sKKwlpbnQgcG9ydCA9IHBCLT5pMmVQb2ludGVyOworCisJT1VUQihwb3J0LCBTRUxfT1VUTUFJTCk7CisJaWYgKElOQihwb3J0KSA9PSAwKSB7CisJCU9VVEIocG9ydCwgU0VMX09VVE1BSUwpOworCQlPVVRCKHBvcnQsIG1haWwpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVRyeVNlbmRNYWlsSUlFWChwQixtYWlsKQorLy8gUGFyYW1ldGVyczogcEIgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLyAgICAgICAgICAgICBtYWlsIC0gdmFsdWUgdG8gd3JpdGUgdG8gbWFpbGJveAorLy8KKy8vIFJldHVybnM6ICAgIFRydWUgaWYgdGhlIHRyYW5zbWl0IG1haWxib3ggaXMgZW1wdHksIGFuZCBtYWlsIGlzIHNlbnQuCisvLyAgICAgICAgICAgICBGYWxzZSBpZiBpdCBub3QgZW1wdHkuCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gSWYgb3V0Z29pbmcgbWFpbGJveCBpcyBlbXB0eSwgc2VuZHMgbWFpbCBhbmQgcmV0dXJucyB0cnVlLiBJZiBvdXRnb2luZworLy8gbWFpbGJveCBpcyBub3QgZW1wdHksIHJldHVybnMgZmFsc2UuCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJRVggLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludAoraWlUcnlTZW5kTWFpbElJRVgoaTJlQm9yZFN0clB0ciBwQiwgdW5zaWduZWQgY2hhciBtYWlsKQoreworCWlmKElOQihwQi0+aTJlU3RhdHVzKSAmIFNURV9PVVRfTUFJTCkgeworCQlyZXR1cm4gMDsKKwl9CisJT1VUQihwQi0+aTJlWE1haWwsIG1haWwpOworCXJldHVybiAxOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlHZXRNYWlsSUkocEIsbWFpbCkKKy8vIFBhcmFtZXRlcnM6IHBCICAgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgIE1haWxib3ggZGF0YSBvciBOT19NQUlMX0hFUkUuCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gSWYgbm8gbWFpbCBhdmFpbGFibGUsIHJldHVybnMgTk9fTUFJTF9IRVJFIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkYXRhIGZyb20KKy8vIHRoZSBtYWlsYm94LCB3aGljaCBpcyBndWFyYW50ZWVkICE9IE5PX01BSUxfSEVSRS4KKy8vCisvLyBUaGlzIHZlcnNpb24gb3BlcmF0ZXMgb24gSW50ZWxsaVBvcnQtSUkgLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHVuc2lnbmVkIHNob3J0CitpaUdldE1haWxJSShpMmVCb3JkU3RyUHRyIHBCKQoreworCWlmIChIQVNfTUFJTChwQikpIHsKKwkJT1VUQihwQi0+aTJlUG9pbnRlciwgU0VMX0lOTUFJTCk7CisJCXJldHVybiBJTkIocEItPmkyZVBvaW50ZXIpOworCX0gZWxzZSB7CisJCXJldHVybiBOT19NQUlMX0hFUkU7CisJfQorfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlHZXRNYWlsSUlFWChwQixtYWlsKQorLy8gUGFyYW1ldGVyczogcEIgICAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgTWFpbGJveCBkYXRhIG9yIE5PX01BSUxfSEVSRS4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBJZiBubyBtYWlsIGF2YWlsYWJsZSwgcmV0dXJucyBOT19NQUlMX0hFUkUgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGRhdGEgZnJvbQorLy8gdGhlIG1haWxib3gsIHdoaWNoIGlzIGd1YXJhbnRlZWQgIT0gTk9fTUFJTF9IRVJFLgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSUVYIC0gc3R5bGUgRklGTydzCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAoraWlHZXRNYWlsSUlFWChpMmVCb3JkU3RyUHRyIHBCKQoreworCWlmIChIQVNfTUFJTChwQikpIHsKKwkJcmV0dXJuIElOQihwQi0+aTJlWE1haWwpOworCX0gZWxzZSB7CisJCXJldHVybiBOT19NQUlMX0hFUkU7CisJfQorfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgaWlFbmFibGVNYWlsSXJxSUkocEIpCisvLyBQYXJhbWV0ZXJzOiBwQiAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIEVuYWJsZXMgYm9hcmQgdG8gaW50ZXJydXB0IGhvc3QgKG9ubHkpIGJ5IHdyaXRpbmcgdG8gaG9zdCdzIGluLWJvdW5kIG1haWxib3guCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJIC0gc3R5bGUgRklGTydzCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkCitpaUVuYWJsZU1haWxJcnFJSShpMmVCb3JkU3RyUHRyIHBCKQoreworCU9VVEIocEItPmkyZVBvaW50ZXIsIFNFTF9NQVNLKTsKKwlPVVRCKHBCLT5pMmVQb2ludGVyLCBTVF9JTl9NQUlMKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpRW5hYmxlTWFpbElycUlJRVgocEIpCisvLyBQYXJhbWV0ZXJzOiBwQiAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIEVuYWJsZXMgYm9hcmQgdG8gaW50ZXJydXB0IGhvc3QgKG9ubHkpIGJ5IHdyaXRpbmcgdG8gaG9zdCdzIGluLWJvdW5kIG1haWxib3guCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJRVggLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpRW5hYmxlTWFpbElycUlJRVgoaTJlQm9yZFN0clB0ciBwQikKK3sKKwlPVVRCKHBCLT5pMmVYTWFzaywgTVhfSU5fTUFJTCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVdyaXRlTWFza0lJKHBCKQorLy8gUGFyYW1ldGVyczogcEIgLSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgIE5vdGhpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBXcml0ZXMgYXJiaXRyYXJ5IHZhbHVlIHRvIHRoZSBtYXNrIHJlZ2lzdGVyLgorLy8KKy8vIFRoaXMgdmVyc2lvbiBvcGVyYXRlcyBvbiBJbnRlbGxpUG9ydC1JSSAtIHN0eWxlIEZJRk8ncworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZAoraWlXcml0ZU1hc2tJSShpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCU9VVEIocEItPmkyZVBvaW50ZXIsIFNFTF9NQVNLKTsKKwlPVVRCKHBCLT5pMmVQb2ludGVyLCB2YWx1ZSk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaVdyaXRlTWFza0lJRVgocEIpCisvLyBQYXJhbWV0ZXJzOiBwQiAtIHBvaW50ZXIgdG8gYm9hcmQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgTm90aGluZworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIFdyaXRlcyBhcmJpdHJhcnkgdmFsdWUgdG8gdGhlIG1hc2sgcmVnaXN0ZXIuCisvLworLy8gVGhpcyB2ZXJzaW9uIG9wZXJhdGVzIG9uIEludGVsbGlQb3J0LUlJRVggLSBzdHlsZSBGSUZPJ3MKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQKK2lpV3JpdGVNYXNrSUlFWChpMmVCb3JkU3RyUHRyIHBCLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCU9VVEIocEItPmkyZVhNYXNrLCB2YWx1ZSk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBGdW5jdGlvbjogICBpaURvd25sb2FkQmxvY2socEIsIHBTb3VyY2UsIGlzU3RhbmRhcmQpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIHBTb3VyY2UgICAgLSBsb2Fkd2FyZSBibG9jayB0byBkb3dubG9hZAorLy8gICAgICAgICAgICAgaXNTdGFuZGFyZCAtIFRydWUgaWYgInN0YW5kYXJkIiBsb2Fkd2FyZSwgZWxzZSBmYWxzZS4KKy8vCisvLyBSZXR1cm5zOiAgICBTdWNjZXNzIG9yIEZhaWx1cmUKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyBEb3dubG9hZHMgYSBzaW5nbGUgYmxvY2sgKGF0IHBTb3VyY2UpdG8gdGhlIGJvYXJkIHJlZmVyZW5jZWQgYnkgcEIuIENhbGxlcgorLy8gc2V0cyBpc1N0YW5kYXJkIHRvIHRydWUvZmFsc2UgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlICJzdGFuZGFyZCIgbG9hZHdhcmUgaXMKKy8vIHdoYXQncyBiZWluZyBsb2FkZWQuIFRoZSBub3JtYWwgcHJvY2VzcywgdGhlbiwgaXMgdG8gcGVyZm9ybSBhbiBpaUluaXRpYWxpemUKKy8vIHRvIHRoZSBib2FyZCwgdGhlbiBwZXJmb3JtIHNvbWUgbnVtYmVyIG9mIGlpRG93bmxvYWRCbG9ja3MgdXNpbmcgdGhlIHJldHVybmVkCisvLyBzdGF0ZSB0byBkZXRlcm1pbmUgd2hlbiBkb3dubG9hZCBpcyBjb21wbGV0ZS4KKy8vCisvLyBQb3NzaWJsZSByZXR1cm4gdmFsdWVzOiAoc2VlIEkyRUxMSVMuSCkKKy8vIElJX0RPV05fQkFEVkFMSUQKKy8vIElJX0RPV05fQkFERklMRQorLy8gSUlfRE9XTl9DT05USU5VSU5HCisvLyBJSV9ET1dOX0dPT0QKKy8vIElJX0RPV05fQkFECisvLyBJSV9ET1dOX0JBRFNUQVRFCisvLyBJSV9ET1dOX1RJTUVPVVQKKy8vCisvLyBVc2VzIHRoZSBpMmVTdGF0ZSBhbmQgaTJlVG9Mb2FkIGZpZWxkcyAoaW5pdGlhbGl6ZWQgYXQgaWlJbml0aWFsaXplKSB0bworLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgYmxvY2ssIHdoZXRoZXIgdG8gY2hlY2sgZm9yIG1hZ2ljCisvLyBudW1iZXJzLCBob3cgbWFueSBibG9ja3MgdGhlcmUgYXJlIHRvIGdvLi4uCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQKK2lpRG93bmxvYWRCbG9jayAoIGkyZUJvcmRTdHJQdHIgcEIsIGxvYWRIZHJTdHJQdHIgcFNvdXJjZSwgaW50IGlzU3RhbmRhcmQpCit7CisJaW50IGl0ZW1wOworCWludCBsb2FkZWRGaXJzdDsKKworCWlmIChwQi0+aTJlVmFsaWQgIT0gSTJFX01BR0lDKSByZXR1cm4gSUlfRE9XTl9CQURWQUxJRDsKKworCXN3aXRjaChwQi0+aTJlU3RhdGUpCisJeworCWNhc2UgSUlfU1RBVEVfUkVBRFk6CisKKwkJLy8gTG9hZGluZyB0aGUgZmlyc3QgYmxvY2sgYWZ0ZXIgcmVzZXQuIE11c3QgY2hlY2sgdGhlIG1hZ2ljIG51bWJlciBvZiB0aGUKKwkJLy8gbG9hZGZpbGUsIHN0b3JlIHRoZSBudW1iZXIgb2YgYmxvY2tzIHdlIGV4cGVjdCB0byBsb2FkLgorCQlpZiAocFNvdXJjZS0+ZS5sb2FkTWFnaWMgIT0gTUFHSUNfTE9BREZJTEUpCisJCXsKKwkJCXJldHVybiBJSV9ET1dOX0JBREZJTEU7CisJCX0KKworCQkvLyBOZXh0IHdlIHN0b3JlIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIHRvIGxvYWQsIGluY2x1ZGluZyB0aGlzIG9uZS4KKwkJcEItPmkyZVRvTG9hZCA9IDEgKyBwU291cmNlLT5lLmxvYWRCbG9ja3NNb3JlOworCisJCS8vIFNldCB0aGUgc3RhdGUsIHN0b3JlIHRoZSB2ZXJzaW9uIG51bWJlcnMuICgnQ2F1c2UgdGhpcyBtYXkgaGF2ZSBjb21lCisJCS8vIGZyb20gYSBmaWxlIC0gd2UgbWlnaHQgd2FudCB0byByZXBvcnQgdGhlc2UgdmVyc2lvbnMgYW5kIHJldmlzaW9ucyBpbgorCQkvLyBjYXNlIG9mIGFuIGVycm9yIQorCQlwQi0+aTJlU3RhdGUgPSBJSV9TVEFURV9MT0FESU5HOworCQlwQi0+aTJlTFZlcnNpb24gPSBwU291cmNlLT5lLmxvYWRWZXJzaW9uOworCQlwQi0+aTJlTFJldmlzaW9uID0gcFNvdXJjZS0+ZS5sb2FkUmV2aXNpb247CisJCXBCLT5pMmVMU3ViID0gcFNvdXJjZS0+ZS5sb2FkU3ViUmV2aXNpb247CisKKwkJLy8gVGhlIHRpbWUgYW5kIGRhdGUgb2YgY29tcGlsYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgYnV0IGRvbid0IGJvdGhlcgorCQkvLyBzdG9yaW5nIGl0IGZvciBub3JtYWwgcHVycG9zZXMuCisJCWxvYWRlZEZpcnN0ID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIElJX1NUQVRFX0xPQURJTkc6CisJCWxvYWRlZEZpcnN0ID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gSUlfRE9XTl9CQURTVEFURTsKKwl9CisKKwkvLyBOb3cgd2UgbXVzdCBiZSBpbiB0aGUgSUlfU1RBVEVfTE9BRElORyBzdGF0ZSwgYW5kIHdlIGFzc3VtZSBpMmVUb0xvYWQKKwkvLyBtdXN0IGJlIHBvc2l0aXZlIHN0aWxsLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIGNsZWFuZWQgdXAgbGFzdAorCS8vIHRpbWUgYW5kIHNldCB0aGUgc3RhdGUgdG8gSUlfU1RBVEVfTE9BREVELgorCWlmICghaWlXYWl0Rm9yVHhFbXB0eShwQiwgTUFYX0RMT0FEX1JFQURfVElNRSkpIHsKKwkJcmV0dXJuIElJX0RPV05fVElNRU9VVDsKKwl9CisKKwlpZiAoIWlpV3JpdGVCdWYocEIsIHBTb3VyY2UtPmMsIExPQURXQVJFX0JMT0NLX1NJWkUpKSB7CisJCXJldHVybiBJSV9ET1dOX0JBRFZBTElEOworCX0KKworCS8vIElmIHdlIGp1c3QgbG9hZGVkIHRoZSBmaXJzdCBibG9jaywgd2FpdCBmb3IgdGhlIGZpZm8gdG8gZW1wdHkgYW4gZXh0cmEKKwkvLyBsb25nIHRpbWUgdG8gYWxsb3cgZm9yIGFueSBzcGVjaWFsIHN0YXJ0dXAgY29kZSBpbiB0aGUgZmlybXdhcmUsIGxpa2UKKwkvLyBzZW5kaW5nIHN0YXR1cyBtZXNzYWdlcyB0byB0aGUgTENEJ3MuCisKKwlpZiAobG9hZGVkRmlyc3QpIHsKKwkJaWYgKCFpaVdhaXRGb3JUeEVtcHR5KHBCLCBNQVhfRExPQURfU1RBUlRfVElNRSkpIHsKKwkJCXJldHVybiBJSV9ET1dOX1RJTUVPVVQ7CisJCX0KKwl9CisKKwkvLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHdhcyBvdXIgbGFzdCBibG9jayEKKwlpZiAoLS0ocEItPmkyZVRvTG9hZCkpIHsKKwkJcmV0dXJuIElJX0RPV05fQ09OVElOVUlORzsgICAgLy8gbW9yZSB0byBjb21lLi4uCisJfQorCisJLy8gSXQgV0FTIG91ciBsYXN0IGJsb2NrOiBDbGVhbiB1cCBvcGVyYXRpb25zLi4uCisJLy8gLi4uV2FpdCBmb3IgbGFzdCBidWZmZXIgdG8gZHJhaW4gZnJvbSB0aGUgYm9hcmQuLi4KKwlpZiAoIWlpV2FpdEZvclR4RW1wdHkocEIsIE1BWF9ETE9BRF9SRUFEX1RJTUUpKSB7CisJCXJldHVybiBJSV9ET1dOX1RJTUVPVVQ7CisJfQorCS8vIElmIHRoZXJlIHdlcmUgb25seSBhIHNpbmdsZSBibG9jayB3cml0dGVuLCB0aGlzIHdvdWxkIGNvbWUgYmFjaworCS8vIGltbWVkaWF0ZWx5IGFuZCBiZSBoYXJtbGVzcywgdGhvdWdoIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkuCisJaXRlbXAgPSBNQVhfRExPQURfQUNLX1RJTUUvMTA7CisJd2hpbGUgKC0taXRlbXApIHsKKwkJaWYgKEhBU19JTlBVVChwQikpIHsKKwkJCXN3aXRjaChCWVRFX0ZST00ocEIpKQorCQkJeworCQkJY2FzZSBMT0FEV0FSRV9PSzoKKwkJCQlwQi0+aTJlU3RhdGUgPQorCQkJCQlpc1N0YW5kYXJkID8gSUlfU1RBVEVfU1RETE9BREVEIDpJSV9TVEFURV9MT0FERUQ7CisKKwkJCQkvLyBTb21lIHJldmlzaW9ucyBvZiB0aGUgYm9vdHN0cmFwIGZpcm13YXJlIChlLmcuIElTQS04IDEuMC4yKQorCQkJCS8vIHdpbGwsIC8vIGlmIHRoZXJlIGlzIGEgZGVidWcgcG9ydCBhdHRhY2hlZCwgcmVxdWlyZSBzb21lCisJCQkJLy8gdGltZSB0byBzZW5kIGluZm9ybWF0aW9uIHRvIHRoZSBkZWJ1ZyBwb3J0IG5vdy4gSXQgd2lsbCBkbworCQkJCS8vIHRoaXMgYmVmb3JlIC8vIGV4ZWN1dGluZyBhbnkgb2YgdGhlIGNvZGUgd2UganVzdCBkb3dubG9hZGVkLgorCQkJCS8vIEl0IG1heSB0YWtlIHVwIHRvIDcwMCBtaWxsaXNlY29uZHMuCisJCQkJaWYgKHBCLT5pMmVQb20uZS5wb3JEaWFnMiAmIFBPUl9ERUJVR19QT1JUKSB7CisJCQkJCWlpRGVsYXkocEIsIDcwMCk7CisJCQkJfQorCisJCQkJcmV0dXJuIElJX0RPV05fR09PRDsKKworCQkJY2FzZSBMT0FEV0FSRV9CQUQ6CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBJSV9ET1dOX0JBRDsKKwkJCX0KKwkJfQorCisJCWlpRGVsYXkocEIsIDEwKTsgICAgICAvLyAxMCBtUyBncmFudWxhcml0eSBvbiBjaGVja2luZyBjb25kaXRpb24KKwl9CisKKwkvLyBEcm9wLXRocm91Z2ggLS0+IHRpbWVkIG91dCB3YWl0aW5nIGZvciBmaXJtd2FyZSBjb25maXJtYXRpb24KKworCXBCLT5pMmVTdGF0ZSA9IElJX1NUQVRFX0JBRExPQUQ7CisJcmV0dXJuIElJX0RPV05fVElNRU9VVDsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEZ1bmN0aW9uOiAgIGlpRG93bmxvYWRBbGwocEIsIHBTb3VyY2UsIGlzU3RhbmRhcmQsIHNpemUpCisvLyBQYXJhbWV0ZXJzOiBwQiAgICAgICAgIC0gcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgIHBTb3VyY2UgICAgLSBsb2Fkd2FyZSBibG9jayB0byBkb3dubG9hZAorLy8gICAgICAgICAgICAgaXNTdGFuZGFyZCAtIFRydWUgaWYgInN0YW5kYXJkIiBsb2Fkd2FyZSwgZWxzZSBmYWxzZS4KKy8vICAgICAgICAgICAgIHNpemUgICAgICAgLSBzaXplIG9mIGRhdGEgdG8gZG93bmxvYWQgKGluIGJ5dGVzKQorLy8KKy8vIFJldHVybnM6ICAgIFN1Y2Nlc3Mgb3IgRmFpbHVyZQorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vIEdpdmVuIGEgcG9pbnRlciB0byBhIGJvYXJkIHN0cnVjdHVyZSwgYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc29tZQorLy8gbG9hZHdhcmUsIHdoZXRoZXIgaXQgaXMgY29uc2lkZXJlZCB0aGUgInN0YW5kYXJkIGxvYWR3YXJlIiwgYW5kIHRoZSBzaXplIG9mCisvLyB0aGUgYXJyYXkgaW4gYnl0ZXMgbG9hZHMgdGhlIGVudGlyZSBhcnJheSB0byB0aGUgYm9hcmQgYXMgbG9hZHdhcmUuCisvLworLy8gQXNzdW1lcyB0aGUgYm9hcmQgaGFzIGJlZW4gZnJlc2hseSByZXNldCBhbmQgdGhlIHBvd2VyLXVwIHJlc2V0IG1lc3NhZ2UgcmVhZC4KKy8vIChpLmUuLCBpbiBJSV9TVEFURV9SRUFEWSkuIENvbXBsYWlucyBpZiBzdGF0ZSBpcyBiYWQsIG9yIGlmIHRoZXJlIHNlZW1zIHRvIGJlCisvLyB0b28gbXVjaCBvciB0b28gbGl0dGxlIGRhdGEgdG8gbG9hZCwgb3IgaWYgaWlEb3dubG9hZEJsb2NrIGNvbXBsYWlucy4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50CitpaURvd25sb2FkQWxsKGkyZUJvcmRTdHJQdHIgcEIsIGxvYWRIZHJTdHJQdHIgcFNvdXJjZSwgaW50IGlzU3RhbmRhcmQsIGludCBzaXplKQoreworCWludCBzdGF0dXM7CisKKwkvLyBXZSBrbm93IChmcm9tIGNvbnRleHQpIGJvYXJkIHNob3VsZCBiZSByZWFkeSBmb3IgdGhlIGZpcnN0IGJsb2NrIG9mCisJLy8gZG93bmxvYWQuICBDb21wbGFpbiBpZiBub3QuCisJaWYgKHBCLT5pMmVTdGF0ZSAhPSBJSV9TVEFURV9SRUFEWSkgcmV0dXJuIElJX0RPV05fQkFEU1RBVEU7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJc2l6ZSAtPSBMT0FEV0FSRV9CTE9DS19TSVpFOwkvLyBIb3cgbXVjaCBkYXRhIHNob3VsZCB0aGVyZSBiZSBsZWZ0IHRvCisJCQkJCQkJCQkJLy8gbG9hZCBhZnRlciB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbiA/CisKKwkJLy8gTm90ZSB3ZSBqdXN0IGJ1bXAgcFNvdXJjZSBieSAib25lIiwgYmVjYXVzZSBpdHMgc2l6ZSBpcyBhY3R1YWxseSB0aGF0CisJCS8vIG9mIGFuIGVudGlyZSBibG9jaywgc2FtZSBhcyBMT0FEV0FSRV9CTE9DS19TSVpFLgorCQlzdGF0dXMgPSBpaURvd25sb2FkQmxvY2socEIsIHBTb3VyY2UrKywgaXNTdGFuZGFyZCk7CisKKwkJc3dpdGNoKHN0YXR1cykKKwkJeworCQljYXNlIElJX0RPV05fR09PRDoKKwkJCXJldHVybiAoIChzaXplID4gMCkgPyBJSV9ET1dOX09WRVIgOiBJSV9ET1dOX0dPT0QpOworCisJCWNhc2UgSUlfRE9XTl9DT05USU5VSU5HOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisKKwkvLyBXZSBzaG91bGRuJ3QgZHJvcCBvdXQ6IGl0IG1lYW5zICJ3aGlsZSIgY2F1Z2h0IHVzIHdpdGggbm90aGluZyBsZWZ0IHRvCisJLy8gZG93bmxvYWQsIHlldCB0aGUgcHJldmlvdXMgRG93bmxvYWRCbG9jayBkaWQgbm90IHJldHVybiBjb21wbGV0ZS4gRXJnbywKKwkvLyBub3QgZW5vdWdoIGRhdGEgdG8gbWF0Y2ggdGhlIHNpemUgYnl0ZSBpbiB0aGUgaGVhZGVyLgorCXJldHVybiBJSV9ET1dOX1VOREVSOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmggYi9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTBiMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmgKQEAgLTAsMCArMSw2MTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgKGMpIDE5OTkgYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgSUkgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBNYWlubGluZSBjb2RlIGZvciB0aGUgZGV2aWNlIGRyaXZlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpMmVsbGlzLmgKKy8vCisvLyBJbnRlbGxpUG9ydC1JSSBhbmQgSW50ZWxsaVBvcnQtSUlFWAorLy8KKy8vIEV4dHJlbWVseQorLy8gTG93CisvLyBMZXZlbAorLy8gSW50ZXJmYWNlCisvLyBTZXJ2aWNlcworLy8KKy8vIFN0cnVjdHVyZSBEZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZvciAiRUxMSVMiIHNlcnZpY2Ugcm91dGluZXMgZm91bmQgaW4KKy8vIGkyZWxsaXMuYworLy8KKy8vIFRoZXNlIHJvdXRpbmVzIGFyZSBiYXNlZCBvbiBwcm9wZXJ0aWVzIG9mIHRoZSBJbnRlbGxpUG9ydC1JSSBhbmQgLUlJRVgKKy8vIGhhcmR3YXJlIGFuZCBib290c3RyYXAgZmlybXdhcmUsIGFuZCBhcmUgbm90IHNlbnNpdGl2ZSB0byBwYXJ0aWN1bGFyCisvLyBjb252ZW50aW9ucyBvZiBhbnkgcGFydGljdWxhciBsb2Fkd2FyZS4KKy8vCisvLyBVbmxpa2UgaTJody5oLCB3aGljaCBwcm92aWRlcyBJUk9OQ0xBRCBoYXJkd2FyZSBkZWZpbml0aW9ucywgdGhlIG1hdGVyaWFsCisvLyBoZXJlIGFuZCBpbiBpMmVsbGlzLmMgaXMgaW50ZW5kZWQgdG8gcHJvdmljZSBhIHVzZWZ1bCwgYnV0IG5vdCByZXF1aXJlZCwKKy8vIGxheWVyIG9mIGluc3VsYXRpb24gZnJvbSB0aGUgaGFyZHdhcmUgc3BlY2lmaWNzLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZm5kZWYgIEkyRUxMSVNfSCAgIC8qIFRvIHByZXZlbnQgbXVsdGlwbGUgaW5jbHVkZXMgKi8KKyNkZWZpbmUgIEkyRUxMSVNfSCAgIDEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZpc2lvbiBIaXN0b3J5OgorLy8KKy8vIDMwIFNlcHRlbWJlciAxOTkxIE1BRyBGaXJzdCBEcmFmdCBTdGFydGVkCisvLyAxMiBPY3RvYmVyICAgMTk5MSAuLi5jb250aW51ZWQuLi4KKy8vCisvLyAyMCBEZWNlbWJlciAgMTk5NiBBS00gTGludXggdmVyc2lvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFuZGF0b3J5IEluY2x1ZGVzOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiaXAydHlwZXMuaCIKKyNpbmNsdWRlICJpMmh3LmgiICAgICAgIC8vIFRoZSBoYXJkd2FyZSBkZWZpbml0aW9ucworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1RBVF9CT1hJRFMgcGFja2V0cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUFYX0JPWAkJNAorCit0eXBlZGVmIHN0cnVjdCBfYmlkU3RhdAoreworCXVuc2lnbmVkIGNoYXIgYmlkX3ZhbHVlW01BWF9CT1hdOworfSBiaWRTdGF0LCAqYmlkU3RhdFB0cjsKKworLy8gVGhpcyBwYWNrZXQgaXMgc2VudCBpbiByZXNwb25zZSB0byBhIENNRF9HRVRfQk9YSURTIGJ5cGFzcyBjb21tYW5kLiBGb3IgLUlJRVgKKy8vIGJvYXJkcywgcmVwb3J0cyB0aGUgaGFyZHdhcmUtc3BlY2lmaWMgImFzeW5jaHJvbm91cyByZXNvdXJjZSByZWdpc3RlciIgb24KKy8vIGVhY2ggZXhwYW5zaW9uIGJveC4gQm94ZXMgbm90IHByZXNlbnQgcmVwb3J0IDB4ZmYuIEZvciAtSUkgYm9hcmRzLCB0aGUgZmlyc3QKKy8vIGVsZW1lbnQgY29udGFpbnMgMHg4MCBmb3IgOC1wb3J0LCAweDQwIGZvciA0LXBvcnQgYm9hcmRzLgorCisvLyBCb3ggSURzIGFrYSBBUlIgb3IgQXN5bmMgUmVzb3VyY2UgUmVnaXN0ZXIgKG1vcmUgdGhhbiB5b3Ugd2FudCB0byBrbm93KQorLy8gICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorLy8gICBGICAgRiAgIE4gICBOICAgTCAgIFMgICBTICAgUworLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gICBGICAgRiAgIC0gIFByb2R1Y3QgRmFtaWx5IERlc2lnbmF0b3IKKy8vICAgPT09PT0rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisvLyAgIDAgICAwICAgLSAgSW50ZWxsaXBvcnQgSUkgRVggLyBJU0EtOAorLy8gICAxICAgMCAgIC0gIEludGVsbGlTZXJ2ZXIKKy8vICAgMCAgIDEgICAtICBTQUMgLSBQb3J0IERldmljZSAoSW50ZWxsaXBvcnQgSUlJID8/PyApCisvLyAgICAgICAgICAgPT09PT0rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKy8vICAgICAgICAgICBOICAgTiAgIC0gIE51bWJlciBvZiBQb3J0cworLy8gICAgICAgICAgIDAgICAwICAgLSAgOCAgKGVpZ2h0KQorLy8gICAgICAgICAgIDAgICAxICAgLSAgNCAgKGZvdXIpCisvLyAgICAgICAgICAgMSAgIDAgICAtICAxMiAodHdlbHZlKQorLy8gICAgICAgICAgIDEgICAxICAgLSAgMTYgKHNpeHRlZW4pCisvLyAgICAgICAgICAgICAgICAgICA9KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworLy8gICAgICAgICAgICAgICAgICAgTCAgLSAgIExDRCBEaXNwbGF5IE1vZHVsZSBQcmVzZW50CisvLyAgICAgICAgICAgICAgICAgICAwICAtICAgTm8KKy8vICAgICAgICAgICAgICAgICAgIDEgIC0gICBMQ0QgbW9kdWxlIHByZXNlbnQKKy8vICAgICAgICAgICAgICAgICAgID09PT09PT09PSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKy8vICAgICAgICAgICAgICAgICAgICAgIFMgICBTICAgUyAtIEFzeW5jIFNpZ25hbHMgU3VwcG9ydGVkIERlc2lnbmF0b3IKKy8vICAgICAgICAgICAgICAgICAgICAgIDAgICAwICAgMCAtIDhkc3MsIE1vZCBEQ0UgREIyNSBGZW1hbGUKKy8vICAgICAgICAgICAgICAgICAgICAgIDAgICAwICAgMSAtIDZkc3MsIFJKLTQ1CisvLyAgICAgICAgICAgICAgICAgICAgICAwICAgMSAgIDAgLSBSUy0yMzIvNDIyIGRzcywgREIyNSBGZW1hbGUKKy8vICAgICAgICAgICAgICAgICAgICAgIDAgICAxICAgMSAtIFJTLTIzMi80MjIgZHNzLCBzZXBhcmF0ZSAyMzIvNDIyIERCMjUgRmVtYWxlCisvLyAgICAgICAgICAgICAgICAgICAgICAxICAgMCAgIDAgLSA2ZHNzLCA5MjEuNiBJL0Ygd2l0aCBTVDY1NCdzCisvLyAgICAgICAgICAgICAgICAgICAgICAxICAgMCAgIDEgLSBSUy00MjMvMjMyIDhkc3MsIFJKLTQ1IDEwUGluCisvLyAgICAgICAgICAgICAgICAgICAgICAxICAgMSAgIDAgLSA2ZHNzLCBNb2QgRENFIERCMjUgRmVtYWxlCisvLyAgICAgICAgICAgICAgICAgICAgICAxICAgMSAgIDEgLSBOTyBCT1ggUFJFU0VOVAorCisjZGVmaW5lIEZGKGMpCSgoYyAmIDB4QzApID4+IDYpCisjZGVmaW5lIE5OKGMpCSgoYyAmIDB4MzApID4+IDQpCisjZGVmaW5lIEwoYykJKChjICYgMHgwOCkgPj4gMykKKyNkZWZpbmUgU1NTKGMpCSAoYyAmIDB4MDcpCisKKyNkZWZpbmUgQklEX0hBU182NTQoeCkJKFNTUyh4KSA9PSAweDA0KQorI2RlZmluZSBCSURfTk9fQk9YCTB4ZmYgLyogbm8gYm94ICovCisjZGVmaW5lIEJJRF84UE9SVCAgCTB4ODAgLyogSVAyLTggcG9ydCAqLworI2RlZmluZSBCSURfNFBPUlQgICAJMHg4MSAvKiBJUDItNCBwb3J0ICovCisjZGVmaW5lIEJJRF9FWFBfTUFTSyAgIAkweDMwIC8qIElQMi1FWCAgKi8KKyNkZWZpbmUgQklEX0VYUF84UE9SVAkweDAwIC8qICAgICA4LCAqLworI2RlZmluZSBCSURfRVhQXzRQT1JUCTB4MTAgLyogICAgIDQsICovCisjZGVmaW5lIEJJRF9FWFBfVU5ERUYJMHgyMCAvKiAgICAgVU5ERUYsICovCisjZGVmaW5lIEJJRF9FWFBfMTZQT1JUCTB4MzAgLyogICAgMTYsICovCisjZGVmaW5lIEJJRF9MQ0RfQ1RSTCAgIAkweDA4IC8qIExDRCBDb250cm9sbGVyICovCisjZGVmaW5lIEJJRF9MQ0RfTk9ORQkweDAwIC8qIC0gbm8gY29udHJvbGxlciBwcmVzZW50ICovCisjZGVmaW5lIEJJRF9MQ0RfUFJFUyAgIAkweDA4IC8qIC0gY29udHJvbGxlciBwcmVzZW50ICovCisjZGVmaW5lIEJJRF9DT05fTUFTSwkweDA3IC8qIC0gY29ubmVjdG9yIHBpbm91dHMgKi8KKyNkZWZpbmUgQklEX0NPTl9EQjI1CTB4MDAgLyogLSBEQi0yNSBGICovCisjZGVmaW5lIEJJRF9DT05fUko0NQkweDAxIC8qIC0gcmo0NSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaTJlQm9yZFN0cgorLy8KKy8vIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gdGhlIEVMTElTIHJvdXRpbmVzIHJlcXVpcmUgaW4KKy8vIGRlYWxpbmcgd2l0aCBhIHBhcnRpY3VsYXIgYm9hcmQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlcmUgYXJlIHNvbWUgcXVldWVzIGhlcmUgd2hpY2ggYXJlIGd1YXJhbnRlZWQgdG8gbmV2ZXIgY29udGFpbiB0aGUgZW50cnkKKy8vIGZvciBhIHNpbmdsZSBjaGFubmVsIHR3aWNlLiBTbyB0aGV5IG11c3QgYmUgc2xpZ2h0bHkgbGFyZ2VyIHRvIGFsbG93CisvLyB1bmFtYmlndW91cyBmdWxsL2VtcHR5IG1hbmFnZW1lbnQKKy8vCisjZGVmaW5lIENIX1FVRVVFX1NJWkUgQUJTX01PU1RfUE9SVFMrMgorCit0eXBlZGVmIHN0cnVjdCBfaTJlQm9yZFN0cgoreworCXBvclN0ciAgICAgICAgIGkyZVBvbTsJLy8gU3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHBvd2VyLW9uIG1lc3NhZ2UuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVQb21TaXplOworCQkJCQkJLy8gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIGlmCisJCQkJCQkvLyBkaWZmZXJlbnQgZnJvbSBzaXplb2YgaTJlUG9tLCBpbmRpY2F0ZXMKKwkJCQkJCS8vIHRoZXJlIGlzIGFuIGVycm9yIQorCisJdW5zaWduZWQgc2hvcnQgaTJlU3RhcnRNYWlsOworCQkJCQkJLy8gQ29udGFpbnMgd2hhdGV2ZXIgaW5ib3VuZCBtYWlsYm94IGRhdGEKKwkJCQkJCS8vIHByZXNlbnQgYXQgc3RhcnR1cC4gTk9fTUFJTF9IRVJFIGluZGljYXRlcworCQkJCQkJLy8gbm90aGluZyB3YXMgcHJlc2VudC4gTm8gc3BlY2lhbAorCQkJCQkJLy8gc2lnbmlmaWNhbmNlIGFzIG9mIHRoaXMgd3JpdGluZywgYnV0IG1heSBiZQorCQkJCQkJLy8gdXNlZnVsIGZvciBkaWFnbm9zdGljIHJlYXNvbnMuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVWYWxpZDsKKwkJCQkJCS8vIEluZGljYXRlcyB2YWxpZGl0eSBvZiB0aGUgc3RydWN0dXJlOyBpZgorCQkJCQkJLy8gaTJlVmFsaWQgPT0gSTJFX01BR0lDLCB0aGVuIHdlIGNhbiB0cnVzdAorCQkJCQkJLy8gdGhlIG90aGVyIGZpZWxkcy4gU29tZSAoZXNwZWNpYWxseQorCQkJCQkJLy8gaW5pdGlhbGl6YXRpb24pIGZ1bmN0aW9ucyBhcmUgZ29vZCBhYm91dAorCQkJCQkJLy8gY2hlY2tpbmcgZm9yIHZhbGlkaXR5LiAgTWFueSBmdW5jdGlvbnMgZG8KKwkJCQkJCS8vIG5vdCwgaXQgYmVpbmcgYXNzdW1lZCB0aGF0IHRoZSBsYXJnZXIKKwkJCQkJCS8vIGNvbnRleHQgYXNzdXJlcyB3ZSBhcmUgdXNpbmcgYSB2YWxpZAorCQkJCQkJLy8gaTJlQm9yZFN0clB0ci4KKworCXVuc2lnbmVkIHNob3J0IGkyZUVycm9yOworCQkJCQkJLy8gVXNlZCBmb3IgcmV0dXJuaW5nIGFuIGVycm9yIGNvbmRpdGlvbiBmcm9tCisJCQkJCQkvLyBzZXZlcmFsIGZ1bmN0aW9ucyB3aGljaCB1c2UgaTJlQm9yZFN0clB0cgorCQkJCQkJLy8gYXMgYW4gYXJndW1lbnQuCisKKwkvLyBBY2NlbGVyYXRvcnMgdG8gY2hhcmFjdGVyaXplIHNlcGFyYXRlIGZlYXR1cmVzIG9mIGEgYm9hcmQsIGRlcml2ZWQgZnJvbSBhCisJLy8gbnVtYmVyIG9mIHNvdXJjZXMuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVGaWZvU2l6ZTsKKwkJCQkJCS8vIEFsd2F5cywgdGhlIHNpemUgb2YgdGhlIEZJRk8uIEZvcgorCQkJCQkJLy8gSW50ZWxsaVBvcnQtSUksIGFsd2F5cyB0aGUgc2FtZSwgZm9yIC1JSUVYCisJCQkJCQkvLyB0YWtlbiBmcm9tIHRoZSBQb3dlci1PbiByZXNldCBtZXNzYWdlLgorCisJdm9sYXRpbGUgCisJdW5zaWduZWQgc2hvcnQgaTJlRmlmb1JlbWFpbnM7CisJCQkJCQkvLyBVc2VkIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uIHRvIGluZGljYXRlIGEKKwkJCQkJCS8vIGxvd2VyIGJvdW5kIG9uIHRoZSBhbW91bnQgb2YgZGF0YSB3aGljaAorCQkJCQkJLy8gbWlnaHQgYmUgaW4gdGhlIG91dGJvdW5kIGZpZm8uCisKKwl1bnNpZ25lZCBjaGFyICBpMmVGaWZvU3R5bGU7CisJCQkJCQkvLyBBY2NlbGVyYXRvciB3aGljaCB0ZWxscyB3aGljaCBzdHlsZSAoLUlJIG9yCisJCQkJCQkvLyAtSUlFWCkgRklGTyB3ZSBhcmUgdXNpbmcuCisKKwl1bnNpZ25lZCBjaGFyICBpMmVEYXRhV2lkdGgxNjsKKwkJCQkJCS8vIEFjY2VsZXJhdG9yIHdoaWNoIHRlbGxzIHdoZXRoZXIgd2Ugc2hvdWxkCisJCQkJCQkvLyBkbyA4IG9yIDE2LWJpdCBkYXRhIHRyYW5zZmVycy4KKworCXVuc2lnbmVkIGNoYXIgIGkyZU1heElycTsKKwkJCQkJCS8vIFRoZSBoaWdoZXN0IGFsbG93YWJsZSBJUlEsIGJhc2VkIG9uIHRoZQorCQkJCQkJLy8gc2xvdCBzaXplLgorCisJdW5zaWduZWQgY2hhciAgaTJlQ2hhbmdlSXJxOworCQkJCQkJLy8gV2hldGhlciB0aXMgdmFsaWQgdG8gY2hhbmdlIElSUSdzCisJCQkJCQkvLyBJU0EgPSBvaywgRUlTQSwgTWljcm9DaGFubmVsLCBubworCisJLy8gQWNjZWxlcmF0b3JzIGZvciB2YXJpb3VzIGFkZHJlc3NlcyBvbiB0aGUgYm9hcmQKKwlpbnQgICAgICAgICAgICBpMmVCYXNlOyAgICAgICAgLy8gSS9PIEFkZHJlc3Mgb2YgdGhlIEJvYXJkCisJaW50ICAgICAgICAgICAgaTJlRGF0YTsgICAgICAgIC8vIEZyb20gaGVyZSBkYXRhIHRyYW5zZmVycyBoYXBwZW4KKwlpbnQgICAgICAgICAgICBpMmVTdGF0dXM7ICAgICAgLy8gRnJvbSBoZXJlIHN0YXR1cyByZWFkcyBoYXBwZW4KKwlpbnQgICAgICAgICAgICBpMmVQb2ludGVyOyAgICAgLy8gKEludGVsbGlQb3J0LUlJOiBwb2ludGVyL2NvbW1hbmRzKQorCWludCAgICAgICAgICAgIGkyZVhNYWlsOyAgICAgICAvLyAoSW50ZWxsaVBPcnQtSUlFWDogbWFpbGJveGVzCisJaW50ICAgICAgICAgICAgaTJlWE1hc2s7ICAgICAgIC8vIChJbnRlbGxpUG9ydC1JSUVYOiBtYXNrIHdyaXRlCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBJbmZvcm1hdGlvbiBwcmVzZW50ZWQgaW4gYSBjb21tb24gZm9ybWF0IGFjcm9zcyBib2FyZHMKKwkvLyBGb3IgZWFjaCBib3gsIGJpdCBtYXAgb2YgdGhlIGNoYW5uZWxzIHByZXNlbnQuICBCb3ggY2xvc2VzdCB0byAKKwkvLyB0aGUgaG9zdCBpcyBib3ggMC4gTFNCIGlzIGNoYW5uZWwgMC4gSW50ZWxsaVBvcnQtSUkgKG5vbi1leHBhbmRhYmxlKQorCS8vIGlzIHRha2VuIHRvIGJlIGJveCAwLiBUaGVzZSBhcmUgZGVyaXZlZCBmcm9tIHByb2R1Y3QgaS5kLiByZWdpc3RlcnMuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVDaGFubmVsTWFwW0FCU19NQVhfQk9YRVNdOworCisJLy8gU2FtZSBhcyBhYm92ZSwgZXhjZXB0IGVhY2ggaXMgZGVyaXZlZCBmcm9tIGZpcm13YXJlIGF0dGVtcHRpbmcgdG8gZGV0ZWN0CisJLy8gdGhlIHVhcnQgcHJlc2VuY2UgKGJ5IHJlYWRpbmcgYSB2YWxpZCBHRlJDUiByZWdpc3RlcikuIElmIGJpdHMgYXJlIHNldCBpbgorCS8vIGkyZUNoYW5uZWxNYXAgYW5kIG5vdCBpbiBpMmVHb29kTWFwLCB0aGVyZSBpcyBhIHBvdGVudGlhbCBwcm9ibGVtLgorCisJdW5zaWduZWQgc2hvcnQgaTJlR29vZE1hcFtBQlNfTUFYX0JPWEVTXTsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEZvciBpbmRpcmVjdCBmdW5jdGlvbiBjYWxscworCisJLy8gUm91dGluZSB0byBjYXVzZSBhbiBOLW1pbGxpc2Vjb25kIGRlbGF5OiBQYXRjaGVkIGJ5IHRoZSBpaTJJbml0aWFsaXplCisJLy8gZnVuY3Rpb24uCisKKwl2b2lkICAoKmkyZURlbGF5KSh1bnNpZ25lZCBpbnQpOworCisJLy8gUm91dGluZSB0byB3cml0ZSBOIGJ5dGVzIHRvIHRoZSBib2FyZCB0aHJvdWdoIHRoZSBGSUZPLiBSZXR1cm5zIHRydWUgaWYKKwkvLyBhbGwgY29wYWNldGljLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgZXJyb3IgaXMgaW4gaTJlRXJyb3IgZmllbGQuCisJLy8gSUYgQ09VTlQgSVMgT0RELCBST1VORFMgVVAgVE8gVEhFIE5FWFQgRVZFTiBOVU1CRVIuCisKKwlpbnQgICAoKmkyZVdyaXRlQnVmKShzdHJ1Y3QgX2kyZUJvcmRTdHIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworCisJLy8gUm91dGluZSB0byByZWFkIE4gYnl0ZXMgZnJvbSB0aGUgYm9hcmQgdGhyb3VnaCB0aGUgRklGTy4gUmV0dXJucyB0cnVlIGlmCisJLy8gY29wYWNldGljLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgZXJyb3IgaW4gaTJlRXJyb3IuCisJLy8gSUYgQ09VTlQgSVMgT0RELCBST1VORFMgVVAgVE8gVEhFIE5FWFQgRVZFTiBOVU1CRVIuCisKKwlpbnQgICAoKmkyZVJlYWRCdWYpKHN0cnVjdCBfaTJlQm9yZFN0ciAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CisKKwkvLyBSZXR1cm5zIGEgd29yZCBmcm9tIEZJRk8uIFdpbGwgdXNlIDIgYnl0ZSBvcGVyYXRpb25zIGlmIG5lZWRlZC4KKworCXVuc2lnbmVkIHNob3J0ICgqaTJlUmVhZFdvcmQpKHN0cnVjdCBfaTJlQm9yZFN0ciAqKTsKKworCS8vIFdyaXRlcyBhIHdvcmQgdG8gRklGTy4gV2lsbCB1c2UgMiBieXRlIG9wZXJhdGlvbnMgaWYgbmVlZGVkLgorCisJdm9pZCAgKCppMmVXcml0ZVdvcmQpKHN0cnVjdCBfaTJlQm9yZFN0ciAqLCB1bnNpZ25lZCBzaG9ydCk7CisKKwkvLyBXYWl0cyBzcGVjaWZpZWQgdGltZSBmb3IgdGhlIFRyYW5zbWl0IEZJRk8gdG8gZ28gZW1wdHkuIFJldHVybnMgdHJ1ZSBpZgorCS8vICBvaywgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UgYW5kIGVycm9yIGluIGkyZUVycm9yLgorCisJaW50ICAgKCppMmVXYWl0Rm9yVHhFbXB0eSkoc3RydWN0IF9pMmVCb3JkU3RyICosIGludCk7CisKKwkvLyBSZXR1cm5zIHRydWUgb3IgZmFsc2UgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIG91dGdvaW5nIG1haWxib3ggaXMgZW1wdHkuCisKKwlpbnQgICAoKmkyZVR4TWFpbEVtcHR5KShzdHJ1Y3QgX2kyZUJvcmRTdHIgKik7CisKKwkvLyBDaGVja3Mgd2hldGhlciBvdXRnb2luZyBtYWlsYm94IGlzIGVtcHR5LiAgSWYgc28sIHNlbmRzIG1haWwgYW5kIHJldHVybnMKKwkvLyB0cnVlLiAgT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisKKwlpbnQgICAoKmkyZVRyeVNlbmRNYWlsKShzdHJ1Y3QgX2kyZUJvcmRTdHIgKiwgdW5zaWduZWQgY2hhcik7CisKKwkvLyBJZiBubyBtYWlsIGF2YWlsYWJsZSwgcmV0dXJucyBOT19NQUlMX0hFUkUsIGVsc2UgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlCisJLy8gbWFpbGJveCAoZ3VhcmFudGVlZCBjYW4ndCBiZSBOT19NQUlMX0hFUkUpLgorCisJdW5zaWduZWQgc2hvcnQgKCppMmVHZXRNYWlsKShzdHJ1Y3QgX2kyZUJvcmRTdHIgKik7CisKKwkvLyBFbmFibGVzIHRoZSBib2FyZCB0byBpbnRlcnJ1cHQgdGhlIGhvc3Qgd2hlbiBpdCB3cml0ZXMgdG8gdGhlIG1haWxib3guCisJLy8gSXJxcyB3aWxsIG5vdCBvY2N1ciwgaG93ZXZlciwgdW50aWwgdGhlIGxvYWR3YXJlIHNlcGFyYXRlbHkgZW5hYmxlcworCS8vIGludGVycnVwdCBnZW5lcmF0aW9uIHRvIHRoZSBob3N0LiAgVGhlIHN0YW5kYXJkIGxvYWR3YXJlIGRvZXMgdGhpcyBpbgorCS8vIHJlc3BvbnNlIHRvIGEgY29tbWFuZCBwYWNrZXQgc2VudCBieSB0aGUgaG9zdC4gKEFsc28sIGRpc2FibGVzCisJLy8gYW55IG90aGVyIHBvdGVudGlhbCBpbnRlcnJ1cHQgc291cmNlcyBmcm9tIHRoZSBib2FyZCAtLSBvdGhlciB0aGFuIHRoZQorCS8vIGluYm91bmQgbWFpbGJveCkuCisKKwl2b2lkICAoKmkyZUVuYWJsZU1haWxJcnEpKHN0cnVjdCBfaTJlQm9yZFN0ciAqKTsKKworCS8vIFdyaXRlcyBhbiBhcmJpdHJhcnkgdmFsdWUgdG8gdGhlIG1hc2sgcmVnaXN0ZXIuCisKKwl2b2lkICAoKmkyZVdyaXRlTWFzaykoc3RydWN0IF9pMmVCb3JkU3RyICosIHVuc2lnbmVkIGNoYXIpOworCisKKwkvLyBTdGF0ZSBpbmZvcm1hdGlvbgorCisJLy8gRHVyaW5nIGRvd25sb2FkaW5nLCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBibG9ja3MgcmVtYWluaW5nIHRvIGRvd25sb2FkCisJLy8gdG8gdGhlIGJvYXJkLgorCisJc2hvcnQgaTJlVG9Mb2FkOworCisJLy8gU3RhdGUgb2YgYm9hcmQgKHNlZSBtYW5pZmVzdHMgYmVsb3cpIChlLmcuLCB3aGV0aGVyIGluIHJlc2V0IGNvbmRpdGlvbiwKKwkvLyB3aGV0aGVyIHN0YW5kYXJkIGxvYWR3YXJlIGlzIGluc3RhbGxlZCwgZXRjLgorCisJdW5zaWduZWQgY2hhciAgaTJlU3RhdGU7CisKKwkvLyBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG9ubHkgdmFsaWQgd2hlbiB0aGVyZSBpcyBsb2Fkd2FyZSBydW5uaW5nIG9uIHRoZQorCS8vIGJvYXJkLiAoaTJlU3RhdGUgPT0gSUlfU1RBVEVfTE9BREVEIG9yIGkyZVN0YXRlID09IElJX1NUQVRFX1NURExPQURFRCApCisKKwl1bnNpZ25lZCBjaGFyICBpMmVMVmVyc2lvbjsgIC8vIExvYWR3YXJlIHZlcnNpb24KKwl1bnNpZ25lZCBjaGFyICBpMmVMUmV2aXNpb247IC8vIExvYWR3YXJlIHJldmlzaW9uCisJdW5zaWduZWQgY2hhciAgaTJlTFN1YjsgICAgICAvLyBMb2Fkd2FyZSBzdWJyZXZpc2lvbgorCisJLy8gRmxhZ3Mgd2hpY2ggb25seSBoYXZlIG1lYW5pbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHN0YW5kYXJkIGxvYWR3YXJlLgorCS8vIFNvbWV3aGF0IHZpb2xhdGVzIHRoZSBsYXllcmluZyBjb25jZXB0LCBidXQgdGhlcmUgaXMgc28gbGl0dGxlIGFkZGl0aW9uYWwKKwkvLyBuZWVkZWQgYXQgdGhlIGJvYXJkIGxldmVsICh3aGlsZSBtdWNoIGFkZGl0aW9uYWwgYXQgdGhlIGNoYW5uZWwgbGV2ZWwpLAorCS8vIHRoYXQgdGhpcyBiZWF0cyBtYWludGFpbmluZyB0d28gZGlmZmVyZW50IHBlci1ib2FyZCBzdHJ1Y3R1cmVzLgorCisJLy8gSW5kaWNhdGVzIHdoaWNoIElSUSB0aGUgYm9hcmQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKGZyb20gc29mdHdhcmUpIHRvIHVzZQorCS8vIEZvciBNaWNyb0NoYW5uZWwgYm9hcmRzLCBhbnkgdmFsdWUgZGlmZmVyZW50IGZyb20gSVJRX1VOREVGSU5FRCBtZWFucworCS8vIHRoYXQgdGhlIHNvZnR3YXJlIGNvbW1hbmQgaGFzIGJlZW4gc2VudCB0byBlbmFibGUgaW50ZXJydXB0cyAob3Igc3BlY2lmeQorCS8vIHRoZXkgYXJlIGRpc2FibGVkKS4gU3BlY2lhbCB2YWx1ZTogSVJRX1VOREVGSU5FRCBpbmRpY2F0ZXMgdGhhdCB0aGUKKwkvLyBzb2Z0d2FyZSBjb21tYW5kIHRvIHNlbGVjdCB0aGUgaW50ZXJydXB0IGhhcyBub3QgeWV0IGJlZW4gc2VudCwgdGhlcmVmb3JlCisJLy8gKHNpbmNlIHRoZSBzdGFuZGFyZCBsb2Fkd2FyZSBpbnNpc3RzIHRoYXQgaXQgYmUgc2VudCBiZWZvcmUgYW55IG90aGVyCisJLy8gcGFja2V0cyBhcmUgc2VudCkgbm8gb3RoZXIgcGFja2V0cyBzaG91bGQgYmUgc2VudCB5ZXQuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVVc2luZ0lycTsKKworCS8vIFRoaXMgaXMgc2V0IHdoZW4gd2UgaGl0IHRoZSBNQl9PVVRfU1RVRkZFRCBtYWlsYm94LCB3aGljaCBwcmV2ZW50cyB1cworCS8vIHB1dHRpbmcgbW9yZSBpbiB0aGUgbWFpbGJveCB1bnRpbCBhbiBhcHByb3ByaWF0ZSBtYWlsYm94IG1lc3NhZ2UgaXMKKwkvLyByZWNlaXZlZC4KKworCXVuc2lnbmVkIGNoYXIgIGkyZVdhaXRpbmdGb3JFbXB0eUZpZm87CisKKwkvLyBBbnkgbWFpbGJveCBiaXRzIHdhaXRpbmcgdG8gYmUgc2VudCB0byB0aGUgYm9hcmQgYXJlIE9SJ2VkIGluIGhlcmUuCisKKwl1bnNpZ25lZCBjaGFyICBpMmVPdXRNYWlsV2FpdGluZzsKKworCS8vIFRoZSBoZWFkIG9mIGFueSBpbmNvbWluZyBwYWNrZXQgaXMgcmVhZCBpbnRvIGhlcmUsIGlzIHRoZW4gZXhhbWluZWQgYW5kIAorCS8vIHdlIGRpc3BhdGNoIGFjY29yZGluZ2x5LgorCisJdW5zaWduZWQgc2hvcnQgaTJlTGVhZG9mZldvcmRbMV07CisKKwkvLyBSdW5uaW5nIGNvdW50ZXIgb2YgaW50ZXJydXB0cyB3aGVyZSB0aGUgbWFpbGJveCBpbmRpY2F0ZWQgaW5jb21pbmcgZGF0YS4KKworCXVuc2lnbmVkIHNob3J0IGkyZUZpZm9JbkludHM7CisKKwkvLyBSdW5uaW5nIGNvdW50ZXIgb2YgaW50ZXJydXB0cyB3aGVyZSB0aGUgbWFpbGJveCBpbmRpY2F0ZWQgb3V0Z29pbmcgZGF0YQorCS8vIGhhZCBiZWVuIHN0cmlwcGVkLgorCisJdW5zaWduZWQgc2hvcnQgaTJlRmlmb091dEludHM7CisKKwkvLyBJZiBub3Qgdm9pZCwgZ2l2ZXMgdGhlIGFkZHJlc3Mgb2YgYSByb3V0aW5lIHRvIGNhbGwgaWYgZmF0YWwgYm9hcmQgZXJyb3IKKwkvLyBpcyBmb3VuZCAob25seSBhcHBsaWVzIHRvIHN0YW5kYXJkIGwvdykuCisKKwl2b2lkICAoKmkyZUZhdGFsVHJhcCkoc3RydWN0IF9pMmVCb3JkU3RyICopOworCisJLy8gV2lsbCBwb2ludCB0byBhbiBhcnJheSBvZiBzb21lIHNvcnQgb2YgY2hhbm5lbCBzdHJ1Y3R1cmVzICh3aG9zZSBmb3JtYXQKKwkvLyBpcyB1bmtub3duIGF0IHRoaXMgbGV2ZWwsIGJlaW5nIGEgZnVuY3Rpb24gb2Ygd2hhdCBsb2Fkd2FyZSBpcworCS8vIGluc3RhbGxlZCBhbmQgdGhlIGNvZGUgY29uZmlndXJhdGlvbiAobWF4IHNpemVzIG9mIGJ1ZmZlcnMsIGV0Yy4pKS4KKworCXZvaWQgICppMmVDaGFubmVsUHRyOworCisJLy8gU2V0IGluZGljYXRlcyB0aGF0IHRoZSBib2FyZCBoYXMgZ29uZSBmYXRhbC4KKworCXVuc2lnbmVkIHNob3J0IGkyZUZhdGFsOworCisJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBwb2ludGVkIHRvIGJ5IGkyZUNoYW5uZWxQdHIuCisKKwl1bnNpZ25lZCBzaG9ydCBpMmVDaGFubmVsQ250OworCisJLy8gUmluZy1idWZmZXJzIG9mIGNoYW5uZWwgc3RydWN0dXJlcyB3aG9zZSBjaGFubmVscyBoYXZlIHBhcnRpY3VsYXIgbmVlZHMuCisKKwlyd2xvY2tfdAlGYnVmX3NwaW5sb2NrOworCXZvbGF0aWxlCisJdW5zaWduZWQgc2hvcnQgaTJGYnVmX3N0cmlwOwkvLyBTdHJpcCBpbmRleAorCXZvbGF0aWxlIAorCXVuc2lnbmVkIHNob3J0IGkyRmJ1Zl9zdHVmZjsJLy8gU3R1ZmYgaW5kZXgKKwl2b2lkICAqaTJGYnVmW0NIX1FVRVVFX1NJWkVdOwkvLyBBbiBhcnJheSBvZiBjaGFubmVsIHBvaW50ZXJzCisJCQkJCQkJCQkvLyBvZiBjaGFubmVscyB3aG8gbmVlZCB0byBzZW5kCisJCQkJCQkJCQkvLyBmbG93IGNvbnRyb2wgcGFja2V0cy4KKwlyd2xvY2tfdAlEYnVmX3NwaW5sb2NrOworCXZvbGF0aWxlCisJdW5zaWduZWQgc2hvcnQgaTJEYnVmX3N0cmlwOwkvLyBTdHJpcCBpbmRleAorCXZvbGF0aWxlCisJdW5zaWduZWQgc2hvcnQgaTJEYnVmX3N0dWZmOwkvLyBTdHVmZiBpbmRleAorCXZvaWQgICppMkRidWZbQ0hfUVVFVUVfU0laRV07CS8vIEFuIGFycmF5IG9mIGNoYW5uZWwgcG9pbnRlcnMKKwkJCQkJCQkJCS8vIG9mIGNoYW5uZWxzIHdobyBuZWVkIHRvIHNlbmQKKwkJCQkJCQkJCS8vIGRhdGEgb3IgaW4tbGluZSBjb21tYW5kIHBhY2tldHMuCisJcndsb2NrX3QJQmJ1Zl9zcGlubG9jazsKKwl2b2xhdGlsZQorCXVuc2lnbmVkIHNob3J0IGkyQmJ1Zl9zdHJpcDsJLy8gU3RyaXAgaW5kZXgKKwl2b2xhdGlsZQorCXVuc2lnbmVkIHNob3J0IGkyQmJ1Zl9zdHVmZjsJLy8gU3R1ZmYgaW5kZXgKKwl2b2lkICAqaTJCYnVmW0NIX1FVRVVFX1NJWkVdOwkvLyBBbiBhcnJheSBvZiBjaGFubmVsIHBvaW50ZXJzCisJCQkJCQkJCQkvLyBvZiBjaGFubmVscyB3aG8gbmVlZCB0byBzZW5kCisJCQkJCQkJCQkvLyBieXBhc3MgY29tbWFuZCBwYWNrZXRzLgorCisJLyoKKwkgKiBBIHNldCBvZiBmbGFncyB0byBpbmRpY2F0ZSB0aGF0IGNlcnRhaW4gZXZlbnRzIGhhdmUgb2NjdXJyZWQgb24gYXQgbGVhc3QKKwkgKiBvbmUgb2YgdGhlIHBvcnRzIG9uIHRoaXMgYm9hcmQuIFdlIHVzZSB0aGlzIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHNwaW4KKwkgKiB0aHJvdWdoIHRoZSBjaGFubmVscyBsb29raW5nIGZvciBicmVha3MsIGV0Yy4KKwkgKi8KKwlpbnQJCWdvdF9pbnB1dDsKKwlpbnQJCXN0YXR1c19jaGFuZ2U7CisJYmlkU3RhdAljaGFubmVsQnR5cGVzOworCisJLyoKKwkgKiBEZWJ1Z2dpbmcgY291bnRlcnMsIGV0Yy4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGRlYnVnRmxvd1F1ZXVlZDsKKwl1bnNpZ25lZCBsb25nIGRlYnVnSW5saW5lUXVldWVkOworCXVuc2lnbmVkIGxvbmcgZGVidWdEYXRhUXVldWVkOworCXVuc2lnbmVkIGxvbmcgZGVidWdCeXBhc3NRdWV1ZWQ7CisJdW5zaWduZWQgbG9uZyBkZWJ1Z0Zsb3dDb3VudDsKKwl1bnNpZ25lZCBsb25nIGRlYnVnSW5saW5lQ291bnQ7CisJdW5zaWduZWQgbG9uZyBkZWJ1Z0J5cGFzc0NvdW50OworCQorCXJ3bG9ja190CXJlYWRfZmlmb19zcGlubG9jazsKKwlyd2xvY2tfdAl3cml0ZV9maWZvX3NwaW5sb2NrOworCisvLwlGb3IgcXVldWluZyBpbnRlcnJ1cHQgYm90dG9tIGhhbGYgaGFuZGxlcnMuCS9cL1x8PW1odz18XC9cLworCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWVfaW50ZXJydXB0OworCisJc3RydWN0IHRpbWVyX2xpc3QgIFNlbmRQZW5kaW5nVGltZXI7ICAgLy8gVXNlZCBieSBpaVNlbmRQZW5kaW5nCisJdW5zaWduZWQgaW50CVNlbmRQZW5kaW5nUmV0cnk7Cit9IGkyZUJvcmRTdHIsICppMmVCb3JkU3RyUHRyOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY3JvIERlZmluaXRpb25zIGZvciB0aGUgaW5kaXJlY3QgY2FsbHMgZGVmaW5lZCBpbiB0aGUgaTJlQm9yZFN0cgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2RlZmluZSBpaURlbGF5KGEsYikgICAgICAgICAgKCooYSktPmkyZURlbGF5KShiKQorI2RlZmluZSBpaVdyaXRlQnVmKGEsYixjKSAgICAgKCooYSktPmkyZVdyaXRlQnVmKShhLGIsYykKKyNkZWZpbmUgaWlSZWFkQnVmKGEsYixjKSAgICAgICgqKGEpLT5pMmVSZWFkQnVmKShhLGIsYykKKworI2RlZmluZSBpaVdyaXRlV29yZChhLGIpICAgICAgKCooYSktPmkyZVdyaXRlV29yZCkoYSxiKQorI2RlZmluZSBpaVJlYWRXb3JkKGEpICAgICAgICAgKCooYSktPmkyZVJlYWRXb3JkKShhKQorCisjZGVmaW5lIGlpV2FpdEZvclR4RW1wdHkoYSxiKSAoKihhKS0+aTJlV2FpdEZvclR4RW1wdHkpKGEsYikKKworI2RlZmluZSBpaVR4TWFpbEVtcHR5KGEpICAgICAgKCooYSktPmkyZVR4TWFpbEVtcHR5KShhKQorI2RlZmluZSBpaVRyeVNlbmRNYWlsKGEsYikgICAgKCooYSktPmkyZVRyeVNlbmRNYWlsKShhLGIpCisKKyNkZWZpbmUgaWlHZXRNYWlsKGEpICAgICAgICAgICgqKGEpLT5pMmVHZXRNYWlsKShhKQorI2RlZmluZSBpaUVuYWJsZU1haWxJcnEoYSkgICAgKCooYSktPmkyZUVuYWJsZU1haWxJcnEpKGEpCisjZGVmaW5lIGlpRGlzYWJsZU1haWxJcnEoYSkgICAoKihhKS0+aTJlV3JpdGVNYXNrKShhLDApCisjZGVmaW5lIGlpV3JpdGVNYXNrKGEsYikgICAgICAoKihhKS0+aTJlV3JpdGVNYXNrKShhLGIpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFuaWZlc3RzIGZvciBpMmVCb3JkU3RyOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgWUVTIDEKKyNkZWZpbmUgTk8gIDAKKworI2RlZmluZSBOVUxMRlVOQyAodm9pZCAoKikodm9pZCkpMAorI2RlZmluZSBOVUxMUFRSICh2b2lkICopMAorCit0eXBlZGVmIHZvaWQgKCpkZWxheUZ1bmNfdCkodW5zaWduZWQgaW50KTsKKworLy8gaTJlVmFsaWQKKy8vCisjZGVmaW5lIEkyRV9NQUdJQyAgICAgICAweDQyNTEgICAvLyBTdHJ1Y3R1cmUgaXMgdmFsaWQuCisjZGVmaW5lIEkyRV9JTkNPTVBMRVRFICAweDExMjIgICAvLyBTdHJ1Y3R1cmUgZmFpbGVkIGR1cmluZyBpbml0LgorCisKKy8vIGkyZUVycm9yCisvLworI2RlZmluZSBJMkVFX0dPT0QgICAgICAgMAkvLyBPcGVyYXRpb24gc3VjY2Vzc2Z1bAorI2RlZmluZSBJMkVFX0JBREFERFIgICAgMQkvLyBBZGRyZXNzIG91dCBvZiByYW5nZQorI2RlZmluZSBJMkVFX0JBRFNUQVRFICAgMgkvLyBBdHRlbXB0IHRvIHBlcmZvcm0gYSBmdW5jdGlvbiB3aGVuIHRoZSBib2FyZAorCQkJCQkJCS8vIHN0cnVjdHVyZSB3YXMgaW4gdGhlIGluY29ycmVjdCBzdGF0ZQorI2RlZmluZSBJMkVFX0JBRE1BR0lDICAgMwkvLyBCYWQgbWFnaWMgbnVtYmVyIGZyb20gUG93ZXIgT24gdGVzdCAoaTJlUG9tU2l6ZQorCQkJCQkJCS8vIHJlZmxlY3RzIHdoYXQgd2FzIHJlYWQKKyNkZWZpbmUgSTJFRV9QT1JNX1NIT1JUIDQJLy8gUG93ZXIgT24gbWVzc2FnZSB0b28gc2hvcnQKKyNkZWZpbmUgSTJFRV9QT1JNX0xPTkcgIDUJLy8gUG93ZXIgT24gbWVzc2FnZSB0b28gbG9uZworI2RlZmluZSBJMkVFX0JBRF9GQU1JTFkgNgkvLyBVbi1zdXBwb3J0ZWQgYm9hcmQgZmFtaWx5IHR5cGUKKyNkZWZpbmUgSTJFRV9JTkNPTlNJU1QgIDcJLy8gRmlybXdhcmUgcmVwb3J0cyBzb21ldGhpbmcgaW1wb3NzaWJsZSwKKwkJCQkJCQkvLyBlLmcuIHVuZXhwZWN0ZWQgbnVtYmVyIG9mIHBvcnRzLi4uIEFsbW9zdCBubworCQkJCQkJCS8vIGV4Y3VzZSBvdGhlciB0aGFuIGJhZCBGSUZPLi4uCisjZGVmaW5lIEkyRUVfUE9TVEVSUiAgICA4CS8vIFBvd2VyLU9uIHNlbGYgdGVzdCByZXBvcnRlZCBhIGJhZCBlcnJvcgorI2RlZmluZSBJMkVFX0JBREJVUyAgICAgOQkvLyBVbmtub3duIEJ1cyB0eXBlIGRlY2xhcmVkIGluIG1lc3NhZ2UKKyNkZWZpbmUgSTJFRV9UWEVfVElNRSAgIDEwCS8vIFRpbWVkIG91dCB3YWl0aW5nIGZvciBUWCBGaWZvIHRvIGVtcHR5CisjZGVmaW5lIEkyRUVfSU5WQUxJRCAgICAxMQkvLyBpMmVWYWxpZCBmaWVsZCBkb2VzIG5vdCBpbmRpY2F0ZSBhIHZhbGlkIGFuZAorCQkJCQkJCS8vIGNvbXBsZXRlIGJvYXJkIHN0cnVjdHVyZSAoZm9yIGZ1bmN0aW9ucyB3aGljaAorCQkJCQkJCS8vIHJlcXVpcmUgdGhpcyBiZSBzby4pCisjZGVmaW5lIEkyRUVfQkFEX1BPUlQgICAxMgkvLyBEaXNjcmVwYW5jeSBiZXR3ZWVuIGNoYW5uZWxzIGFjdHVhbGx5IGZvdW5kIGFuZAorCQkJCQkJCS8vIHdoYXQgdGhlIHByb2R1Y3QgaXMgc3VwcG9zZWQgdG8gaGF2ZS4gQ2hlY2sKKwkJCQkJCQkvLyBpMmVHb29kTWFwIHZzIGkyZUNoYW5uZWxNYXAgZm9yIGRldGFpbHMuCisjZGVmaW5lIEkyRUVfQkFEX0lSUSAgICAxMwkvLyBTb21lb25lIHNwZWNpZmllZCBhbiB1bnN1cHBvcnRlZCBJUlEKKyNkZWZpbmUgSTJFRV9OT0NIQU5ORUxTIDE0CS8vIE5vIGNoYW5uZWwgc3RydWN0dXJlcyBoYXZlIGJlZW4gZGVmaW5lZCAoZm9yCisJCQkJCQkJLy8gZnVuY3Rpb25zIHJlcXVpcmluZyB0aGlzKS4KKworLy8gaTJlRmlmb1N0eWxlCisvLworI2RlZmluZSBGSUZPX0lJICAgMCAgLyogSW50ZWxsaVBvcnQtSUkgc3R5bGU6IHNlZSBhbHNvIGkyaHcuaCAqLworI2RlZmluZSBGSUZPX0lJRVggMSAgLyogSW50ZWxsaVBvcnQtSUlFWCBzdHlsZSAqLworCisvLyBpMmVHZXRNYWlsCisvLworI2RlZmluZSBOT19NQUlMX0hFUkUgICAgMHgxMTExCS8vIFNpbmNlIG1haWwgaXMgdW5zaWduZWQgY2hhciwgY2Fubm90IHBvc3NpYmx5CisJCQkJCQkJCS8vIHByb21vdGUgdG8gMHgxMTExLgorLy8gaTJlU3RhdGUKKy8vCisjZGVmaW5lIElJX1NUQVRFX0NPTEQgICAgICAwICAvLyBBZGRyZXNzZXMgaGF2ZSBiZWVuIGRlZmluZWQsIGJ1dCBib2FyZCBub3QgZXZlbgorCQkJCQkJCSAgLy8gcmVzZXQgeWV0LgorI2RlZmluZSBJSV9TVEFURV9SRVNFVCAgICAgMSAgLy8gQm9hcmQsaWYgaXQgZXhpc3RzLCBoYXMganVzdCBiZWVuIHJlc2V0CisjZGVmaW5lIElJX1NUQVRFX1JFQURZICAgICAyICAvLyBCb2FyZCByZWFkeSBmb3IgaXRzIGZpcnN0IGJsb2NrCisjZGVmaW5lIElJX1NUQVRFX0xPQURJTkcgICAzICAvLyBCb2FyZCBjb250aW51aW5nIGxvYWQKKyNkZWZpbmUgSUlfU1RBVEVfTE9BREVEICAgIDQgIC8vIEJvYXJkIGhhcyBmaW5pc2hlZCBsb2FkOiBzdGF0dXMgb2sKKyNkZWZpbmUgSUlfU1RBVEVfQkFETE9BRCAgIDUgIC8vIEJvYXJkIGhhcyBmaW5pc2hlZCBsb2FkOiBmYWlsZWQhCisjZGVmaW5lIElJX1NUQVRFX1NURExPQURFRCA2ICAvLyBCb2FyZCBoYXMgZmluaXNoZWQgbG9hZDogc3RhbmRhcmQgZmlybXdhcmUKKworLy8gaTJlVXNpbmdJcnEKKy8vCisjZGVmaW5lIElSUV9VTkRFRklORUQgICAweDEzNTIgIC8vIE5vIHZhbGlkIGlycSAob3IgcG9sbGluZyA9IDApIGNhbiBldmVyCisJCQkJCQkJCS8vIHByb21vdGUgdG8gdGhpcyEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIYW5keSBNYWNyb3MgZm9yIGkyZWxsaXMuYyBhbmQgb3RoZXJzCisvLyBOb3RlIHRoZXNlIGFyZSBjb21tb24gdG8gLUlJIGFuZCAtSUlFWAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3R1cmUsIGRvZXMgdGhlIGlucHV0IEZJRk8gaGF2ZSBhbnkgZGF0YSBvcgorLy8gbm90PworLy8KKyNkZWZpbmUgSEFTX0lOUFVUKHBCKSAgICAgICEoSU5CKHBCLT5pMmVTdGF0dXMpICYgU1RfSU5fRU1QVFkpCisjZGVmaW5lIEhBU19OT19JTlBVVChwQikgICAoSU5CKHBCLT5pMmVTdGF0dXMpICYgU1RfSU5fRU1QVFkpCisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUsIHJlYWQgYSBieXRlIG9yIHdvcmQgZnJvbSB0aGUgZmlmbworLy8KKyNkZWZpbmUgQllURV9GUk9NKHBCKSAgICAgICh1bnNpZ25lZCBjaGFyKUlOQihwQi0+aTJlRGF0YSkKKyNkZWZpbmUgV09SRF9GUk9NKHBCKSAgICAgICh1bnNpZ25lZCBzaG9ydClJTlcocEItPmkyZURhdGEpCisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byBib2FyZCBzdHJ1Y3R1cmUsIGlzIHRoZXJlIHJvb20gZm9yIGFueSBkYXRhIHRvIGJlIHdyaXR0ZW4KKy8vIHRvIHRoZSBkYXRhIGZpZm8/CisvLworI2RlZmluZSBIQVNfT1VUUk9PTShwQikgICAgIShJTkIocEItPmkyZVN0YXR1cykgJiBTVF9PVVRfRlVMTCkKKyNkZWZpbmUgSEFTX05PX09VVFJPT00ocEIpIChJTkIocEItPmkyZVN0YXR1cykgJiBTVF9PVVRfRlVMTCkKKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIGJvYXJkIHN0cnVjdHVyZSwgd3JpdGUgYSBzaW5nbGUgYnl0ZSB0byB0aGUgZmlmbworLy8gc3RydWN0dXJlLiBOb3RlIHRoYXQgZm9yIDE2LWJpdCBpbnRlcmZhY2VzLCB0aGUgaGlnaCBvcmRlciBieXRlIGlzIHVuZGVmaW5lZAorLy8gYW5kIHVua25vd24uCisvLworI2RlZmluZSBCWVRFX1RPKHBCLCBjKSAgICAgT1VUQihwQi0+aTJlRGF0YSwoYykpCisKKy8vIFdyaXRlIGEgd29yZCB0byB0aGUgZmlmbyBzdHJ1Y3R1cmUuIEZvciA4LWJpdCBpbnRlcmZhY2VzLCB0aGlzIG1heSBoYXZlCisvLyB1bmtub3duIHJlc3VsdHMuCisvLworI2RlZmluZSBXT1JEX1RPKHBCLCBjKSAgICAgT1VUVyhwQi0+aTJlRGF0YSwoYykpCisKKy8vIEdpdmVuIGEgcG9pbnRlciB0byB0aGUgYm9hcmQgc3RydWN0dXJlLCBpcyB0aGVyZSBhbnl0aGluZyBpbiB0aGUgaW5jb21pbmcKKy8vIG1haWxib3g/CisvLworI2RlZmluZSBIQVNfTUFJTChwQikgICAgICAgKElOQihwQi0+aTJlU3RhdHVzKSAmIFNUX0lOX01BSUwpCisKKyNkZWZpbmUgVVBEQVRFX0ZJRk9fUk9PTShwQikgIChwQiktPmkyZUZpZm9SZW1haW5zPShwQiktPmkyZUZpZm9TaXplCisKKy8vIEhhbmR5IG1hY3JvIHRvIHJvdW5kIHVwIGEgbnVtYmVyIChsaWtlIHRoZSBidWZmZXIgd3JpdGUgYW5kIHJlYWQgcm91dGluZXMgZG8pCisvLyAKKyNkZWZpbmUgUk9VTkRVUChudW1iZXIpICAgICgoKG51bWJlcikrMSkgJiAofjEpKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb24gRGVjbGFyYXRpb25zIGZvciBpMmVsbGlzLmMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb25zIGNhbGxlZCBkaXJlY3RseQorLy8KKy8vIEluaXRpYWxpemF0aW9uIG9mIGEgYm9hcmQgJiBzdHJ1Y3R1cmUgaXMgaW4gZm91ciAoZml2ZSEpIHBhcnRzOgorLy8KKy8vIDApIGlpRWxsaXNJbml0KCkgIC0gSW5pdGlhbGl6ZSBpaUVsbGlzIHN1YnN5c3RlbS4KKy8vIDEpIGlpU2V0QWRkcmVzcygpIC0gRGVmaW5lIHRoZSBib2FyZCBhZGRyZXNzICYgZGVsYXkgZnVuY3Rpb24gZm9yIGEgYm9hcmQuCisvLyAyKSBpaVJlc2V0KCkgICAgICAtIFJlc2V0IHRoZSBib2FyZCAgIChwcm92aWRlZCBpdCBleGlzdHMpCisvLyAgICAgICAtLSBOb3RlIHlvdSBtYXkgZG8gdGhpcyB0byBzZXZlcmFsIGJvYXJkcyAtLQorLy8gMykgaWlSZXNldERlbGF5KCkgLSBEZWxheSBmb3IgMiBzZWNvbmRzIChvbmNlIGZvciBhbGwgYm9hcmRzKQorLy8gNCkgaWlJbml0aWFsaXplKCkgLSBBdHRlbXB0IHRvIHJlYWQgUG93ZXItdXAgbWVzc2FnZTsgZnVydGhlciBpbml0aWFsaXplCisvLyAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdG9ycworLy8KKy8vIFRoZW4geW91IG1heSB1c2UgaWlEb3dubG9hZEFsbCgpIG9yIGlpRG93bmxvYWRGaWxlKCkgKGluIGkyZmlsZS5jKSB0byB3cml0ZQorLy8gbG9hZHdhcmUuICBUbyBjaGFuZ2UgbG9hZHdhcmUsIHlvdSBtdXN0IGJlZ2luIGFnYWluIHdpdGggc3RlcCAyLCByZXNldHRpbmcKKy8vIHRoZSBib2FyZCBhZ2FpbiAoc3RlcCAxIG5vdCBuZWVkZWQpLgorCitzdGF0aWMgdm9pZCBpaUVsbGlzSW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgaWlTZXRBZGRyZXNzKGkyZUJvcmRTdHJQdHIsIGludCwgZGVsYXlGdW5jX3QgKTsKK3N0YXRpYyBpbnQgaWlSZXNldChpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyBpbnQgaWlSZXNldERlbGF5KGkyZUJvcmRTdHJQdHIpOworc3RhdGljIGludCBpaUluaXRpYWxpemUoaTJlQm9yZFN0clB0cik7CisKKy8vIFJvdXRpbmUgdG8gdmFsaWRhdGUgdGhhdCBhbGwgY2hhbm5lbHMgZXhwZWN0ZWQgYXJlIHRoZXJlLgorLy8KK2V4dGVybiBpbnQgaWlWYWxpZGF0ZUNoYW5uZWxzKGkyZUJvcmRTdHJQdHIpOworCisvLyBSb3V0aW5lIHVzZWQgdG8gZG93bmxvYWQgYSBibG9jayBvZiBsb2Fkd2FyZS4KKy8vCitzdGF0aWMgaW50IGlpRG93bmxvYWRCbG9jayhpMmVCb3JkU3RyUHRyLCBsb2FkSGRyU3RyUHRyLCBpbnQpOworCisvLyBSZXR1cm4gdmFsdWVzIGdpdmVuIGJ5IGlpRG93bmxvYWRCbG9jaywgaWlEb3dubG9hZEFsbCwgaWlEb3dubG9hZEZpbGU6CisvLworI2RlZmluZSBJSV9ET1dOX0JBRFZBTElEICAgMAkvLyBib2FyZCBzdHJ1Y3R1cmUgaXMgaW52YWxpZAorI2RlZmluZSBJSV9ET1dOX0NPTlRJTlVJTkcgMQkvLyBTbyBmYXIsIHNvIGdvb2QsIGZpcm13YXJlIGV4cGVjdHMgbW9yZQorI2RlZmluZSBJSV9ET1dOX0dPT0QgICAgICAgMgkvLyBEb3dubG9hZCBjb21wbGV0ZSwgQ1JDIGdvb2QKKyNkZWZpbmUgSUlfRE9XTl9CQUQgICAgICAgIDMJLy8gRG93bmxvYWQgY29tcGxldGUsIGJ1dCBDUkMgYmFkCisjZGVmaW5lIElJX0RPV05fQkFERklMRSAgICA0CS8vIEJhZCBtYWdpYyBudW1iZXIgaW4gbG9hZHdhcmUgZmlsZQorI2RlZmluZSBJSV9ET1dOX0JBRFNUQVRFICAgNQkvLyBCb2FyZCBpcyBpbiBhbiBpbmFwcHJvcHJpYXRlIHN0YXRlIGZvcgorCQkJCQkJCQkvLyBkb3dubG9hZGluZyBsb2Fkd2FyZS4gKHNlZSBpMmVTdGF0ZSkKKyNkZWZpbmUgSUlfRE9XTl9USU1FT1VUICAgIDYJLy8gVGltZW91dCB3YWl0aW5nIGZvciBmaXJtd2FyZQorI2RlZmluZSBJSV9ET1dOX09WRVIgICAgICAgNwkvLyBUb28gbXVjaCBkYXRhCisjZGVmaW5lIElJX0RPV05fVU5ERVIgICAgICA4CS8vIE5vdCBlbm91Z2ggZGF0YQorI2RlZmluZSBJSV9ET1dOX05PRklMRSAgICAgOQkvLyBMb2Fkd2FyZSBmaWxlIG5vdCBmb3VuZAorCisvLyBSb3V0aW5lIHRvIGRvd25sb2FkIGFuIGVudGlyZSBsb2Fkd2FyZSBtb2R1bGU6IFJldHVybiB2YWx1ZXMgYXJlIGEgc3Vic2V0IG9mCisvLyBpaURvd25sb2FkQmxvY2sncywgZXhjbHVkaW5nLCBvZiBjb3Vyc2UsIElJX0RPV05fQ09OVElOVUlORworLy8KK3N0YXRpYyBpbnQgaWlEb3dubG9hZEFsbChpMmVCb3JkU3RyUHRyLCBsb2FkSGRyU3RyUHRyLCBpbnQsIGludCk7CisKKy8vIENhbGxlZCBpbmRpcmVjdGx5IGFsd2F5cy4gIE5lZWRlZCBleHRlcm5hbGx5IHNvIHRoZSByb3V0aW5lIG1pZ2h0IGJlCisvLyBTUEVDSUZJRUQgYXMgYW4gYXJndW1lbnQgdG8gaWlSZXNldCgpCisvLworLy9zdGF0aWMgdm9pZCBpaTJEZWxheUlPKHVuc2lnbmVkIGludCk7CQkvLyBOLW1pbGxpc2Vjb25kIGRlbGF5IHVzaW5nCisJCQkJCQkJCQkJCS8vaGFyZHdhcmUgc3BpbgorLy9zdGF0aWMgdm9pZCBpaTJEZWxheVRpbWVyKHVuc2lnbmVkIGludCk7CS8vIE4tbWlsbGlzZWNvbmQgZGVsYXkgdXNpbmcgTGludXgKKwkJCQkJCQkJCQkJLy90aW1lcgorCisvLyBNYW55IGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgcmV0dXJuIFRydWUgaWYgZ29vZCwgRmFsc2Ugb3RoZXJ3aXNlLCB3aXRoIGFuCisvLyBlcnJvciBjb2RlIGluIGkyZUVycm9yIGZpZWxkLiBIZXJlIGlzIGEgaGFuZHkgbWFjcm8gZm9yIHNldHRpbmcgdGhlIGVycm9yCisvLyBjb2RlIGFuZCByZXR1cm5pbmcuCisvLworI2RlZmluZSBDT01QTEVURShwQixjb2RlKSBcCisJaWYoMSl7IFwKKwkJIHBCLT5pMmVFcnJvciA9IGNvZGU7IFwKKwkJIHJldHVybiAoY29kZSA9PSBJMkVFX0dPT0QpO1wKKwl9CisKKyNlbmRpZiAgIC8vIEkyRUxMSVNfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pMmh3LmggYi9kcml2ZXJzL2NoYXIvaXAyL2kyaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZlMDRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmh3LmgKQEAgLTAsMCArMSw2NDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgKGMpIDE5OTkgYnkgQ29tcHV0b25lIENvcnBvcmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiAgIFBBQ0tBR0U6ICAgICBMaW51eCB0dHkgRGV2aWNlIERyaXZlciBmb3IgSW50ZWxsaVBvcnQgSUkgZmFtaWx5IG9mIG11bHRpcG9ydAorKiAgICAgICAgICAgICAgICBzZXJpYWwgSS9PIGNvbnRyb2xsZXJzLgorKgorKiAgIERFU0NSSVBUSU9OOiBEZWZpbml0aW9ucyBsaW1pdGVkIHRvIHByb3BlcnRpZXMgb2YgdGhlIGhhcmR3YXJlIG9yIHRoZQorKiAgICAgICAgICAgICAgICBib290c3RyYXAgZmlybXdhcmUuIEFzIHN1Y2gsIHRoZXkgYXJlIGFwcGxpY2FibGUgcmVnYXJkbGVzcyBvZgorKiAgICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtIG9yIGxvYWR3YXJlIChzdGFuZGFyZCBvciBkaWFnbm9zdGljKS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEkySFdfSAorI2RlZmluZSBJMkhXX0ggMQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMjMgU2VwdGVtYmVyIDE5OTEgTUFHICAgRmlyc3QgRHJhZnQgU3RhcnRlZC4uLnRocm91Z2guLi4KKy8vIDExIE9jdG9iZXIgMTk5MSAgIC4uLiAgIENvbnRpbnVpbmcgZGV2ZWxvcG1lbnQuLi4KKy8vICA2IEF1Z3VzdCAxOTkzICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIElTQS00IChhc2ljKSB3aGljaCBpcyBhcmNoaXRlY3RlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgYXMgYW4gSVNBLUNFWCB3aXRoIGEgc2luZ2xlIDQtcG9ydCBib3guCisvLworLy8gMjAgRGVjZW1iZXIgMTk5NiAgQUtNICAgVmVyc2lvbiBmb3IgTGludXgKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSEFSRFdBUkUgREVTQ1JJUFRJT046CisKK0ludHJvZHVjdGlvbjoKKworVGhlIEludGVsbGlQb3J0LUlJIGFuZCBJbnRlbGxpUG9ydC1JSUVYIHByb2R1Y3RzIG9jY3VweSBhIGJsb2NrIG9mIGVpZ2h0ICg4KQorYWRkcmVzc2VzIGluIHRoZSBob3N0J3MgSS9PIHNwYWNlLgorCitTb21lIGFkZHJlc3NlcyBhcmUgdXNlZCB0byB0cmFuc2ZlciBkYXRhIHRvL2Zyb20gdGhlIGJvYXJkLCBzb21lIHRvIHRyYW5zZmVyCitzby1jYWxsZWQgIm1haWxib3giIG1lc3NhZ2VzLCBhbmQgc29tZSB0byByZWFkIGJpdC1tYXBwZWQgc3RhdHVzIGluZm9ybWF0aW9uLgorV2hpbGUgYWxsIHRoZSBwcm9kdWN0cyBpbiB0aGUgbGluZSBhcmUgZnVuY3Rpb25hbGx5IHNpbWlsYXIsIHNvbWUgdXNlIGEgMTYtYml0CitkYXRhIHBhdGggdG8gdHJhbnNmZXIgZGF0YSB3aGlsZSBvdGhlcnMgdXNlIGFuIDgtYml0IHBhdGguIEFsc28sIHRoZSB1c2Ugb2YKK2NvbW1hbmQgL3N0YXR1cy9tYWlsYm94IHJlZ2lzdGVycyBkaWZmZXJzIHNsaWdodGx5IGJldHdlZW4gdGhlIElJIGFuZCBJSUVYCiticmFuY2hlcyBvZiB0aGUgZmFtaWx5LgorCitUaGUgaG9zdCBkZXRlcm1pbmVzIHdoYXQgdHlwZSBvZiBib2FyZCBpdCBpcyBkZWFsaW5nIHdpdGggYnkgcmVhZGluZyBhIHN0cmluZyBvZgorc2l4dGVlbiBjaGFyYWN0ZXJzIGZyb20gdGhlIGJvYXJkLiBUaGVzZSBjaGFyYWN0ZXJzIGFyZSBhbHdheXMgcGxhY2VkIGluIHRoZQorZmlmbyBieSB0aGUgYm9hcmQncyBsb2NhbCBwcm9jZXNzb3Igd2hlbmV2ZXIgdGhlIGJvYXJkIGlzIHJlc2V0IChlaXRoZXIgZnJvbQorcG93ZXItb24gb3IgdW5kZXIgc29mdHdhcmUgY29udHJvbCkgYW5kIGFyZSBrbm93biBhcyB0aGUgIlBvd2VyLW9uIFJlc2V0CitNZXNzYWdlLiIgSW4gb3JkZXIgdGhhdCB0aGlzIG1lc3NhZ2UgY2FuIGJlIHJlYWQgZnJvbSBlaXRoZXIgdHlwZSBvZiBib2FyZCwgdGhlCitoYXJkd2FyZSByZWdpc3RlcnMgdXNlZCBpbiByZWFkaW5nIHRoaXMgbWVzc2FnZSBhcmUgdGhlIHNhbWUuIE9uY2UgdGhpcyBtZXNzYWdlCitoYXMgYmVlbiByZWFkIGJ5IHRoZSBob3N0LCB0aGVuIGl0IGhhcyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gb3BlcmF0ZS4KKworR2VuZXJhbCBEaWZmZXJlbmNlcyBiZXR3ZWVuIGJvYXJkczoKKworVGhlIGdyZWF0ZXN0IHN0cnVjdHVyYWwgZGlmZmVyZW5jZSBpcyBiZXR3ZWVuIHRoZSAtSUkgYW5kIC1JSUVYIGZhbWlsaWVzIG9mCitwcm9kdWN0LiBUaGUgLUlJIGJvYXJkcyB1c2UgdGhlIEFtNDcwMSBkdWFsIDUxMng4IGJpZGlyZWN0aW9uYWwgZmlmbyB0byBzdXBwb3J0Cit0aGUgZGF0YSBwYXRoLCBtYWlsYm94IHJlZ2lzdGVycywgYW5kIHN0YXR1cyByZWdpc3RlcnMuIFRoaXMgY2hpcCBjb250YWlucyBzb21lCitmZWF0dXJlcyB3aGljaCBhcmUgbm90IHVzZWQgaW4gdGhlIEludGVsbGlQb3J0LUlJIHByb2R1Y3RzOyBhIGRlc2NyaXB0aW9uIG9mCit0aGVzZSBpcyBvbWl0dGVkIGhlcmUuIEJlY2F1c2Ugb2YgdGhlc2UgbWFueSBmZWF0dXJlcywgaXQgY29udGFpbnMgbWFueQorcmVnaXN0ZXJzLCB0b28gbWFueSB0byBhY2Nlc3MgZGlyZWN0bHkgd2l0aGluIGEgc21hbGwgYWRkcmVzcyBzcGFjZS4gVGhleSBhcmUKK2FjY2Vzc2VkIGJ5IGZpcnN0IHdyaXRpbmcgYSB2YWx1ZSB0byBhICJwb2ludGVyIiByZWdpc3Rlci4gVGhpcyB2YWx1ZSBzZWxlY3RzCit0aGUgcmVnaXN0ZXIgdG8gYmUgYWNjZXNzZWQuICBUaGUgbmV4dCByZWFkIG9yIHdyaXRlIHRvIHRoYXQgYWRkcmVzcyBhY2Nlc3NlcwordGhlIHNlbGVjdGVkIHJlZ2lzdGVyIHJhdGhlciB0aGFuIHRoZSBwb2ludGVyIHJlZ2lzdGVyLgorCitUaGUgLUlJRVggYm9hcmRzIHVzZSBhIHByb3ByaWV0YXJ5IGRlc2lnbiBzaW1pbGFyIHRvIHRoZSBBbTQ3MDEgaW4gZnVuY3Rpb24uIEJ1dAorYmVjYXVzZSBvZiBhIHNpbXBsZXIsIG1vcmUgc3RyZWFtbGluZWQgZGVzaWduIGl0IGRvZXNuJ3QgcmVxdWlyZSBzbyBtYW55CityZWdpc3RlcnMuIFRoaXMgbWVhbnMgdGhleSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgaW4gc2luZ2xlIG9wZXJhdGlvbnMgcmF0aGVyCit0aGFuIHRocm91Z2ggYSBwb2ludGVyIHJlZ2lzdGVyLgorCitCZXNpZGVzIHRoZXNlIGRpZmZlcmVuY2VzLCB0aGVyZSBhcmUgZGlmZmVyZW5jZXMgaW4gd2hldGhlciA4LWJpdCBvciAxNi1iaXQKK3RyYW5zZmVycyBhcmUgdXNlZCB0byBtb3ZlIGRhdGEgdG8gdGhlIGJvYXJkLgorCitUaGUgLUlJIGJvYXJkcyBhcmUgY2FwYWJsZSBvbmx5IG9mIDgtYml0IGRhdGEgdHJhbnNmZXJzLCB3aGlsZSB0aGUgLUlJRVggYm9hcmRzCittYXkgYmUgY29uZmlndXJlZCBmb3IgZWl0aGVyIDgtYml0IG9yIDE2LWJpdCBkYXRhIHRyYW5zZmVycy4gSWYgdGhlIG9uLWJvYXJkIERJUAorc3dpdGNoICM4IGlzIE9OLCBhbmQgdGhlIGNhcmQgaGFzIGJlZW4gaW5zdGFsbGVkIGluIGEgMTYtYml0IHNsb3QsIDE2LWJpdAordHJhbnNmZXJzIGFyZSBzdXBwb3J0ZWQgKGFuZCB3aWxsIGJlIGV4cGVjdGVkIGJ5IHRoZSBzdGFuZGFyZCBsb2Fkd2FyZSkuIFRoZQorb24tYm9hcmQgZmlybXdhcmUgY2FuIGRldGVybWluZSB0aGUgcG9zaXRpb24gb2YgdGhlIHN3aXRjaCwgYW5kIHdoZXRoZXIgdGhlCitib2FyZCBpcyBpbnN0YWxsZWQgaW4gYSAxNi1iaXQgc2xvdDsgaXQgc3VwcGxpZXMgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgaG9zdCBhcworcGFydCBvZiB0aGUgcG93ZXItdXAgcmVzZXQgbWVzc2FnZS4KKworVGhlIGNvbmZpZ3VyYXRpb24gc3dpdGNoICgjOCkgYW5kIHNsb3Qgc2VsZWN0aW9uIGRvIG5vdCBkaXJlY3RseSBjb25maWd1cmUgdGhlCitoYXJkd2FyZS4gSXQgaXMgdXAgdG8gdGhlIG9uLWJvYXJkIGxvYWR3YXJlIGFuZCBob3N0LWJhc2VkIGRyaXZlcnMgdG8gYWN0CithY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIG9wdGlvbnMuIFRoYXQgaXMsIGxvYWR3YXJlIGFuZCBkcml2ZXJzIGNvdWxkIGJlCit3cml0dGVuIHRvIHBlcmZvcm0gOC1iaXQgdHJhbnNmZXJzIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHRoZSBESVAgc3dpdGNoIG9yCitzbG90IChhbmQgaW4gYSBkaWFnbm9zdGljIGVudmlyb25tZW50IG1pZ2h0IHdlbGwgZG8gc28pLiBMaWtld2lzZSwgMTYtYml0Cit0cmFuc2ZlcnMgY291bGQgYmUgcGVyZm9ybWVkIGFzIGxvbmcgYXMgdGhlIGNhcmQgaXMgaW4gYSAxNi1iaXQgc2xvdC4KKworTm90ZSB0aGUgc2xvdCBzZWxlY3Rpb24gYW5kIERJUCBzd2l0Y2ggc2VsZWN0aW9uIGFyZSBwcm92aWRlZCBzZXBhcmF0ZWx5OiBhCitib2FyZCBydW5uaW5nIGluIDgtYml0IG1vZGUgaW4gYSAxNi1iaXQgc2xvdCBoYXMgYSBncmVhdGVyIHJhbmdlIG9mIHBvc3NpYmxlCitpbnRlcnJ1cHRzIHRvIGNob29zZSBmcm9tOyBpbmZvcm1hdGlvbiBvZiBwb3RlbnRpYWwgdXNlIHRvIHRoZSBob3N0LgorCitBbGwgOC1iaXQgZGF0YSB0cmFuc2ZlcnMgYXJlIGRvbmUgaW4gdGhlIHNhbWUgd2F5LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb24gYQorLUlJIGJvYXJkIG9yIGEgLUlJRVggYm9hcmQuCisKK1RoZSBob3N0IG11c3QgY29uc2lkZXIgdHdvIHRoaW5ncyB0aGVuOiAxKSB3aGV0aGVyIGEgLUlJIG9yIC1JSUVYIHByb2R1Y3QgaXMKK2JlaW5nIHVzZWQsIGFuZCAyKSB3aGV0aGVyIGFuIDgtYml0IG9yIDE2LWJpdCBkYXRhIHBhdGggaXMgdXNlZC4KKworQSBmdXJ0aGVyIGRpZmZlcmVuY2UgaXMgdGhhdCAtSUkgYm9hcmRzIGFsd2F5cyBoYXZlIGEgNTEyLWJ5dGUgZmlmbyBvcGVyYXRpbmcgaW4KK2VhY2ggZGlyZWN0aW9uLiAtSUlFWCBib2FyZHMgbWF5IHVzZSBmaWZvcyBvZiB2YXJ5aW5nIHNpemU7IHRoaXMgc2l6ZSBpcworcmVwb3J0ZWQgYXMgcGFydCBvZiB0aGUgcG93ZXItdXAgbWVzc2FnZS4KKworSS9PIE1hcCBPZiBJbnRlbGxpUG9ydC1JSSBhbmQgSW50ZWxsaVBvcnQtSUlFWCBib2FyZHM6CisoUmVsYXRpdmUgdG8gdGhlIGNob3NlbiBiYXNlIGFkZHJlc3MpCisKK0FkZHIgIFIvVyAgICAgIEludGVsbGlQb3J0LUlJICAgIEludGVsbGlQb3J0LUlJRVgKKy0tLS0gIC0tLSAgICAgIC0tLS0tLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0KKzAgICAgIFIvVyAgICAgIERhdGEgUG9ydCAoYnl0ZSkgIERhdGEgUG9ydCAoYnl0ZSBvciB3b3JkKQorMSAgICAgUi9XICAgICAgKE5vdCB1c2VkKSAgICAgICAgKE1TQiBvZiB3b3JkLXdpZGUgZGF0YSB3cml0dGVuIHRvIERhdGEgUG9ydCkKKzIgICAgIFIgICAgICAgIFN0YXR1cyBSZWdpc3RlciAgIFN0YXR1cyBSZWdpc3RlcgorMiAgICAgVyAgICAgICAgUG9pbnRlciBSZWdpc3RlciAgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIKKzMgICAgIFIvVyAgICAgIChOb3QgdXNlZCkgICAgICAgIE1haWxib3ggUmVnaXN0ZXJzICg2IGJpdHM6IDExMTExMTAwKQorNCw1ICAgLS0gICAgICAgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBwcm9kdWN0cworNiAgICAgLS0gICAgICAgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBwcm9kdWN0cworNyAgICAgUiAgICAgICAgR3VhcmFudGVlZCB0byBoYXZlIG5vIGVmZmVjdAorNyAgICAgVyAgICAgICAgSGFyZHdhcmUgcmVzZXQgb2YgYm9hcmQuCisKKworUnVsZXM6CitBbGwgZGF0YSB0cmFuc2ZlcnMgYXJlIHBlcmZvcm1lZCB1c2luZyB0aGUgZXZlbiBpL28gYWRkcmVzcy4gSWYgYnl0ZS13aWRlIGRhdGEKK3RyYW5zZmVycyBhcmUgYmVpbmcgdXNlZCwgZG8gSU5CL09VVEIgb3BlcmF0aW9ucyBvbiB0aGUgZGF0YSBwb3J0LiBJZiB3b3JkLXdpZGUKK3RyYW5zZmVycyBhcmUgdXNlZCwgZG8gSU5XL09VVFcgb3BlcmF0aW9ucy4gSW4gc29tZSBjaXJjdW1zdGFuY2VzIChzdWNoIGFzCityZWFkaW5nIHRoZSBwb3dlci11cCBtZXNzYWdlKSB5b3Ugd2lsbCBkbyBJTkIgZnJvbSB0aGUgZGF0YSBwb3J0LCBidXQgaW4gdGhpcworY2FzZSB0aGUgTVNCIG9mIGVhY2ggd29yZCByZWFkIGlzIGxvc3QuIFdoZW4gYWNjZXNzaW5nIGFsbCBvdGhlciB1bnJlc2VydmVkCityZWdpc3RlcnMsIHVzZSBieXRlIG9wZXJhdGlvbnMgb25seS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYW5kYXRvcnkgSW5jbHVkZXM6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNpbmNsdWRlICJpcDJ0eXBlcy5oIgorI2luY2x1ZGUgImkyb3MuaCIgICAgLyogRm9yIGFueSBvLnMuLCBjb21waWxlciwgb3IgaG9zdC1yZWxhdGVkIGlzc3VlcyAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hbmlmZXN0cyBmb3IgdGhlIEkvTyBtYXA6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFIvVzogRGF0YSBwb3J0IChieXRlKSBmb3IgSW50ZWxsaVBvcnQtSUksCisvLyBSL1c6IERhdGEgcG9ydCAoYnl0ZSBvciB3b3JkKSBmb3IgSW50ZWxsaVBvcnQtSUlFWAorLy8gSW5jb21pbmcgb3Igb3V0Z29pbmcgZGF0YSBwYXNzZXMgdGhyb3VnaCBhIEZJRk8sIHRoZSBzdGF0dXMgb2Ygd2hpY2ggaXMKKy8vIGF2YWlsYWJsZSBpbiBzb21lIG9mIHRoZSBiaXRzIGluIEZJRk9fU1RBVFVTLiBUaGlzIChiaWRpcmVjdGlvbmFsKSBGSUZPIGlzCisvLyB0aGUgcHJpbWFyeSBtZWFucyBvZiB0cmFuc2ZlcnJpbmcgZGF0YSwgY29tbWFuZHMsIGZsb3ctY29udHJvbCwgYW5kIHN0YXR1cworLy8gaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhbmQgYm9hcmQuCisvLworI2RlZmluZSBGSUZPX0RBVEEgMAorCisvLyBBbm90aGVyIHdheSBvZiBwYXNzaW5nIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGJvYXJkIGFuZCB0aGUgaG9zdCBpcworLy8gdGhyb3VnaCAibWFpbGJveGVzIi4gVW5saWtlIGEgRklGTywgYSBtYWlsYm94IGhvbGRzIG9ubHkgYSBzaW5nbGUgYnl0ZSBvZgorLy8gZGF0YS4gIFdyaXRpbmcgZGF0YSB0byB0aGUgbWFpbGJveCBjYXVzZXMgYSBzdGF0dXMgYml0IHRvIGJlIHNldCwgYW5kCisvLyBwb3RlbnRpYWxseSBpbnRlcnJ1cHRpbmcgdGhlIGludGVuZGVkIHJlY2VpdmVyLiBUaGUgc2VuZGVyIGhhcyBzb21lIHdheSB0bworLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRhdGEgaGFzIGJlZW4gcmVhZCB5ZXQ7IGFzIHNvb24gYXMgaXQgaGFzLCBpdCBtYXkgc2VuZAorLy8gbW9yZS4gVGhlIG1haWxib3hlcyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBvbiAtSUkgYW5kIC1JSUVYIHByb2R1Y3RzLCBhcworLy8gc3VnZ2VzdGVkIGJlbG93LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlYWQ6IFN0YXR1cyBSZWdpc3RlciBmb3IgSW50ZWxsaVBvcnQtSUkgb3IgLUlJRVgKKy8vIFRoZSBwcmVzZW5jZSBvZiBhbnkgYml0IHNldCBoZXJlIHdpbGwgY2F1c2UgYW4gaW50ZXJydXB0IHRvIHRoZSBob3N0LAorLy8gcHJvdmlkZWQgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGhhcyBiZWVuIHVubWFza2VkIGluIHRoZSBpbnRlcnJ1cHQgbWFzaworLy8gcmVnaXN0ZXIuIEZ1cnRoZXJtb3JlLCBpbnRlcnJ1cHRzIHRvIHRoZSBob3N0IGFyZSBkaXNhYmxlZCBnbG9iYWxseSB1bnRpbCB0aGUKKy8vIGxvYWR3YXJlIHNlbGVjdHMgdGhlIGlycSBsaW5lIHRvIHVzZS4gV2l0aCB0aGUgZXhjZXB0aW9uIG9mIFNUTl9NUiwgdGhlIGJpdHMKKy8vIHJlbWFpbiBzZXQgc28gbG9uZyBhcyB0aGUgYXNzb2NpYXRlZCBjb25kaXRpb24gaXMgdHJ1ZS4KKy8vCisjZGVmaW5lIEZJRk9fU1RBVFVTIDIKKworLy8gQml0IG1hcCBvZiBzdGF0dXMgYml0cyB3aGljaCBhcmUgaWRlbnRpY2FsIGZvciAtSUkgYW5kIC1JSUVYCisvLworI2RlZmluZSBTVF9PVVRfRlVMTCAgMHg0MCAgLy8gT3V0Ym91bmQgRklGTyBmdWxsCisjZGVmaW5lIFNUX0lOX0VNUFRZICAweDIwICAvLyBJbmJvdW5kIEZJRk8gZW1wdHkKKyNkZWZpbmUgU1RfSU5fTUFJTCAgIDB4MDQgIC8vIEluYm91bmQgTWFpbGJveCBmdWxsCisKKy8vIFRoZSBmb2xsb3dpbmcgZXhpc3RzIG9ubHkgb24gdGhlIEludGVsbGlwb3J0LUlJRVgsIGFuZCBpbmRpY2F0ZXMgdGhhdCB0aGUKKy8vIGJvYXJkIGhhcyBub3QgcmVhZCB0aGUgbGFzdCBvdXRnb2luZyBtYWlsYm94IGRhdGEgeWV0LiBJbiB0aGUgSW50ZWxsaVBvcnQtSUksCisvLyB0aGUgb3V0Z29pbmcgbWFpbGJveCBtYXkgYmUgcmVhZCBiYWNrOiBhIHplcm8gaW5kaWNhdGVzIHRoZSBib2FyZCBoYXMgcmVhZAorLy8gdGhlIGRhdGEuCisvLworI2RlZmluZSBTVEVfT1VUX01BSUwgMHg4MCAgLy8gT3V0Ym91bmQgbWFpbGJveCBmdWxsICghKQorCisvLyBUaGUgZm9sbG93aW5nIGJpdHMgYXJlIGRlZmluZWQgZGlmZmVyZW50bHkgZm9yIC1JSSBhbmQgLUlJRVggYm9hcmRzLiBDb2RlCisvLyB3aGljaCByZWxpZXMgb24gdGhlc2UgYml0cyB3aWxsIG5lZWQgdG8gYmUgZnVuY3Rpb25hbGx5IGRpZmZlcmVudCBmb3IgdGhlIHR3bworLy8gdHlwZXMgb2YgYm9hcmRzIGFuZCBzaG91bGQgYmUgZ2VuZXJhbGx5IGF2b2lkZWQgYmVjYXVzZSBvZiB0aGUgYWRkaXRpb25hbAorLy8gY29tcGxleGl0eSB0aGlzIGNyZWF0ZXM6CisKKy8vIEJpdCBtYXAgb2Ygc3RhdHVzIGJpdHMgb25seSBvbiAtSUkKKworLy8gRmlmbyBoYXMgYmVlbiBSRVNFVCAoY2xlYXJlZCB3aGVuIHRoZSBzdGF0dXMgcmVnaXN0ZXIgaXMgcmVhZCkuIE5vdGUgdGhhdAorLy8gdGhpcyBjb25kaXRpb24gY2Fubm90IGJlIG1hc2tlZCBhbmQgd291bGQgYWx3YXlzIGludGVycnVwdCB0aGUgaG9zdCwgZXhjZXB0CisvLyB0aGF0IHRoZSBoYXJkd2FyZSByZXNldCBhbHNvIGRpc2FibGVzIGludGVycnVwdHMgZ2xvYmFsbHkgZnJvbSB0aGUgYm9hcmQKKy8vIHVudGlsIHJlLWVuYWJsZWQgYnkgbG9hZHdhcmUuIFRoaXMgY291bGQgYWxzbyBhcmlzZSBmcm9tIHRoZQorLy8gQW00NzAxLXN1cHBvcnRlZCBjb21tYW5kIHRvIHJlc2V0IHRoZSBjaGlwLCBidXQgdGhpcyBjb21tYW5kIGlzIGdlbmVyYWxseSBub3QKKy8vIHVzZWQgaGVyZS4KKy8vCisjZGVmaW5lIFNUTl9NUiAgICAgICAweDgwCisKKy8vIFNlZSB0aGUgQU1EIEFtNDcwMSBkYXRhIHNoZWV0IGZvciBkZXRhaWxzIG9uIHRoZSBmb2xsb3dpbmcgZm91ciBiaXRzLiBUaGV5CisvLyBhcmUgbm90IHByZXNlbnRseSB1c2VkIGJ5IENvbXB1dG9uZSBkcml2ZXJzLgorLy8KKyNkZWZpbmUgU1ROX09VVF9BRiAgMHgxMCAgLy8gT3V0Ym91bmQgRklGTyBhbG1vc3QgZnVsbCAocHJvZ3JhbW1hYmxlKQorI2RlZmluZSBTVE5fSU5fQUUgICAweDA4ICAvLyBJbmJvdW5kIEZJRk8gYWxtb3N0IGVtcHR5IChwcm9ncmFtbWFibGUpCisjZGVmaW5lIFNUTl9CRCAgICAgIDB4MDIgIC8vIEluYm91bmQgYnl0ZSBkZXRlY3RlZAorI2RlZmluZSBTVE5fUEUgICAgICAweDAxICAvLyBQYXJpdHkvRnJhbWluZyBjb25kaXRpb24gZGV0ZWN0ZWQKKworLy8gQml0LW1hcCBvZiBzdGF0dXMgYml0cyBvbmx5IG9uIC1JSUVYCisvLworI2RlZmluZSBTVEVfT1VUX0hGICAweDEwICAvLyBPdXRib3VuZCBGSUZPIGhhbGYgZnVsbAorI2RlZmluZSBTVEVfSU5fSEYgICAweDA4ICAvLyBJbmJvdW5kIEZJRk8gaGFsZiBmdWxsCisjZGVmaW5lIFNURV9JTl9GVUxMIDB4MDIgIC8vIEluYm91bmQgRklGTyBmdWxsCisjZGVmaW5lIFNURV9PVVRfTVQgIDB4MDEgIC8vIE91dGJvdW5kIEZJRk8gZW1wdHkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW50ZWxsaXBvcnQtSUkgLS0gV3JpdGUgT25seTogdGhlIHBvaW50ZXIgcmVnaXN0ZXIuCisvLyBWYWx1ZXMgYXJlIHdyaXR0ZW4gdG8gdGhpcyByZWdpc3RlciB0byBzZWxlY3QgdGhlIEFtNDcwMSBpbnRlcm5hbCByZWdpc3RlciB0bworLy8gYmUgYWNjZXNzZWQgb24gdGhlIG5leHQgb3BlcmF0aW9uLgorLy8KKyNkZWZpbmUgRklGT19QVFIgICAgMHgwMgorCisvLyBWYWx1ZXMgZm9yIHRoZSBwb2ludGVyIHJlZ2lzdGVyCisvLworI2RlZmluZSBTRUxfQ09NTUFORCAweDEgICAgLy8gU2VsZWN0cyB0aGUgQW00NzAxIGNvbW1hbmQgcmVnaXN0ZXIKKworLy8gU29tZSBwb3NzaWJsZSBjb21tYW5kczoKKy8vCisjZGVmaW5lIFNFTF9DTURfTVIgIDB4ODAJLy8gQW00NzAxIGNvbW1hbmQgdG8gcmVzZXQgdGhlIGNoaXAKKyNkZWZpbmUgU0VMX0NNRF9TSCAgMHg0MAkvLyBBbTQ3MDEgY29tbWFuZCB0byBtYXAgdGhlICJvdGhlciIgcG9ydCBpbnRvIHRoZQorCQkJCQkJCS8vIHN0YXR1cyByZWdpc3Rlci4KKyNkZWZpbmUgU0VMX0NNRF9VTlNIICAgMAkvLyBBbTQ3MDEgY29tbWFuZCB0byAidW5zaGlmdCI6IHBvcnQgbWFwcyBpbnRvIGl0cworCQkJCQkJCS8vIG93biBzdGF0dXMgcmVnaXN0ZXIuCisjZGVmaW5lIFNFTF9NQVNLICAgICAweDIJLy8gU2VsZWN0cyB0aGUgQW00NzAxIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyLiBUaGUKKwkJCQkJCQkvLyBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciBpcyBiaXQtbWFwcGVkIHRvIG1hdGNoIAorCQkJCQkJCS8vIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKEZJRk9fU1RBVFVTKSBleGNlcHQgZm9yCisJCQkJCQkJLy8gU1ROX01SLiAoU2VlIGFib3ZlLikKKyNkZWZpbmUgU0VMX0JZVEVfREVUIDB4MwkvLyBTZWxlY3RzIHRoZSBBbTQ3MDEgYnl0ZS1kZXRlY3QgcmVnaXN0ZXIuIChOb3QKKwkJCQkJCQkvLyBub3JtYWxseSB1c2VkIGV4Y2VwdCBpbiBkaWFnbm9zdGljcy4pCisjZGVmaW5lIFNFTF9PVVRNQUlMICAweDQJLy8gU2VsZWN0cyB0aGUgb3V0Ym91bmQgbWFpbGJveCAoUi9XKS4gUmVhZGluZyBiYWNrCisJCQkJCQkJLy8gYSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBtYWlsYm94IGhhcworCQkJCQkJCS8vIGJlZW4gcmVhZCBieSB0aGUgYm9hcmQgYW5kIGlzIGF2YWlsYWJsZSBmb3IgbW9yZQorCQkJCQkJCS8vIGRhdGEuLyBXcml0aW5nIHRvIHRoZSBtYWlsYm94IG9wdGlvbmFsbHkKKwkJCQkJCQkvLyBpbnRlcnJ1cHRzIHRoZSBib2FyZCwgZGVwZW5kaW5nIG9uIHRoZSBsb2Fkd2FyZSdzCisJCQkJCQkJLy8gc2V0dGluZyBvZiBpdHMgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIuCisjZGVmaW5lIFNFTF9BRUFGICAgICAweDUJLy8gU2VsZWN0cyBBRS9BRiB0aHJlc2hvbGQgcmVnaXN0ZXIuCisjZGVmaW5lIFNFTF9JTk1BSUwgICAweDYJLy8gU2VsZWN0cyB0aGUgaW5ib3VuZCBtYWlsYm94IChSZWFkKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50ZWxsaVBvcnQtSUlFWCAtLSAgV3JpdGUgT25seTogaW50ZXJydXB0IG1hc2sgKGFuZCBtaXNjIGZsYWdzKSByZWdpc3RlcjoKKy8vIFVubGlrZSBJbnRlbGxpUG9ydC1JSSwgYml0IGFzc2lnbm1lbnRzIGRvIE5PVCBtYXRjaCB0aG9zZSBvZiB0aGUgc3RhdHVzCisvLyByZWdpc3Rlci4KKy8vCisjZGVmaW5lIEZJRk9fTUFTSyAgICAweDIKKworLy8gTWFpbGJveCByZWFkYmFjayBzZWxlY3Q6CisvLyBJZiBzZXQsIHJlYWRzIHRvIEZJRk9fTUFJTCB3aWxsIHJlYWQgdGhlIE9VVEJPVU5EIG1haWxib3ggKGhvc3QgdG8gYm9hcmQpLiBJZgorLy8gY2xlYXIgKGRlZmF1bHQgb24gcmVzZXQpIHJlYWRzIHRvIEZJRk9fTUFJTCB3aWxsIHJlYWQgdGhlIElOQk9VTkQgbWFpbGJveC4KKy8vIFRoaXMgaXMgdGhlIG5vcm1hbCBzaXR1YXRpb24uIFRoZSBjbGVhcmluZyBvZiBhIG1haWxib3ggaXMgZGV0ZXJtaW5lZCBvbgorLy8gLUlJRVggYm9hcmRzIGJ5IHdhaXRpbmcgZm9yIHRoZSBTVEVfT1VUX01BSUwgYml0IHRvIGNsZWFyLiBSZWFkYmFjaworLy8gY2FwYWJpbGl0eSBpcyBwcm92aWRlZCBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBvbmx5LgorLy8KKyNkZWZpbmUgIE1YX09VVE1BSUxfUlNFTCAgIDB4ODAKKworI2RlZmluZSAgTVhfSU5fTUFJTCAgMHg0MAkvLyBFbmFibGVzIGludGVycnVwdHMgd2hlbiBpbmNvbWluZyBtYWlsYm94IGdvZXMKKwkJCQkJCQkvLyBmdWxsIChTVF9JTl9NQUlMIHNldCkuCisjZGVmaW5lICBNWF9JTl9GVUxMICAweDIwCS8vIEVuYWJsZXMgaW50ZXJydXB0cyB3aGVuIGluY29taW5nIEZJRk8gZ29lcyBmdWxsCisJCQkJCQkJLy8gKFNURV9JTl9GVUxMKS4KKyNkZWZpbmUgIE1YX0lOX01UICAgIDB4MDgJLy8gRW5hYmxlcyBpbnRlcnJ1cHRzIHdoZW4gaW5jb21pbmcgRklGTyBnb2VzIGVtcHR5CisJCQkJCQkJLy8gKFNUX0lOX01UKS4KKyNkZWZpbmUgIE1YX09VVF9GVUxMIDB4MDQJLy8gRW5hYmxlcyBpbnRlcnJ1cHRzIHdoZW4gb3V0Z29pbmcgRklGTyBnb2VzIGZ1bGwKKwkJCQkJCQkvLyAoU1RfT1VUX0ZVTEwpLgorI2RlZmluZSAgTVhfT1VUX01UICAgMHgwMQkvLyBFbmFibGVzIGludGVycnVwdHMgd2hlbiBvdXRnb2luZyBGSUZPIGdvZXMgZW1wdHkKKwkJCQkJCQkvLyAoU1RFX09VVF9NVCkuCisKKy8vIEFueSByZW1haW5pbmcgYml0cyBhcmUgcmVzZXJ2ZWQsIGFuZCBzaG91bGQgYmUgd3JpdHRlbiB0byBaRVJPIGZvcgorLy8gY29tcGF0aWJpbGl0eSB3aXRoIGZ1dHVyZSBDb21wdXRvbmUgcHJvZHVjdHMuCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRlbGxpUG9ydC1JSUVYOiAtLSBUaGVzZSBhcmUgb25seSA2LWJpdCBtYWlsYm94ZXMgISEhIC0tIDExMTExMTAwIChsb3cgdHdvCisvLyBiaXRzIGFsd2F5cyByZWFkIGJhY2sgMCkuCisvLyBSZWFkOiAgT25lIG9mIHRoZSBtYWlsYm94ZXMsIHVzdWFsbHkgSW5ib3VuZC4KKy8vICAgICAgICBJbmJvdW5kIE1haWxib3ggKE1YX09VVE1BSUxfUlNFTCA9IDApCisvLyAgICAgICAgT3V0Ym91bmQgTWFpbGJveCAoTVhfT1VUTUFJTF9SU0VMID0gMSkKKy8vIFdyaXRlOiBPdXRib3VuZCBNYWlsYm94CisvLyBGb3IgdGhlIEludGVsbGlQb3J0LUlJIGJvYXJkcywgdGhlIG91dGJvdW5kIG1haWxib3ggaXMgcmVhZCBiYWNrIHRvIGRldGVybWluZQorLy8gd2hldGhlciB0aGUgYm9hcmQgaGFzIHJlYWQgdGhlIGRhdGEgKDAgLS0+IGRhdGEgaGFzIGJlZW4gcmVhZCkuIEZvciB0aGUKKy8vIEludGVsbGlQb3J0LUlJRVgsIHRoaXMgaXMgZG9uZSBieSByZWFkaW5nIGEgc3RhdHVzIHJlZ2lzdGVyLiBUbyBkZXRlcm1pbmUKKy8vIHdoZXRoZXIgbWFpbGJveCBpcyBhdmFpbGFibGUgZm9yIG1vcmUgb3V0Ym91bmQgZGF0YSwgdXNlIHRoZSBTVEVfT1VUX01BSUwgYml0CisvLyBpbiBGSUZPX1NUQVRVUy4gTW9yZW92ZXIsIGFsdGhvdWdoIHRoZSBPdXRib3VuZCBNYWlsYm94IGNhbiBiZSByZWFkIGJhY2sgYnkKKy8vIHNldHRpbmcgTVhfT1VUTUFJTF9SU0VMLCBpdCBpcyBOT1QgY2xlYXJlZCB3aGVuIHRoZSBib2FyZCByZWFkcyBpdCwgYXMgaXMgdGhlCisvLyBjYXNlIHdpdGggdGhlIC1JSSBib2FyZHMuIEZvciB0aGlzIHJlYXNvbiwgRklGT19NQUlMIGlzIG5vcm1hbGx5IHVzZWQgdG8gcmVhZAorLy8gdGhlIGluYm91bmQgRklGTywgYW5kIE1YX09VVE1BSUxfUlNFTCBrZXB0IGNsZWFyLiAoU2VlIGFib3ZlIGZvcgorLy8gTVhfT1VUTUFJTF9SU0VMIGRlc2NyaXB0aW9uLikKKy8vCisjZGVmaW5lICBGSUZPX01BSUwgICAweDMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdSSVRFIE9OTFk6ICBSZXNldHMgdGhlIGJvYXJkLiAoRGF0YSBkb2Vzbid0IG1hdHRlcikuCisvLworI2RlZmluZSAgRklGT19SRVNFVCAgMHg3CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSRUFEIE9OTFk6ICBXaWxsIGhhdmUgbm8gZWZmZWN0LiAoRGF0YSBpcyB1bmRlZmluZWQuKQorLy8gQWN0dWFsbHksIHRoZXJlIHdpbGwgYmUgYW4gZWZmZWN0LCBpbiB0aGF0IHRoZSBvcGVyYXRpb24gaXMgc3VyZSB0byBnZW5lcmF0ZQorLy8gYSBidXMgY3ljbGU6IHZpei4sIGFuIEkvTyBieXRlIFJlYWQuIFRoaXMgZmFjdCBjYW4gYmUgdXNlZCB0byBlbmZvcmNlIHNob3J0CisvLyBkZWxheXMgd2hlbiBubyBjb21wYXJhYmxlIHRpbWUgY29uc3RhbnQgaXMgYXZhaWxhYmxlLgorLy8KKyNkZWZpbmUgIEZJRk9fTk9QICAgIDB4NworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkVTRVQgJiBQT1dFUi1PTiBSRVNFVCBNRVNTQUdFCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUkVTRVQ6CisKK1RoZSBJbnRlbGxpUG9ydC1JSSBhbmQgLUlJRVggYm9hcmRzIGFyZSByZXNldCBpbiB0aHJlZSB3YXlzOiBQb3dlci11cCwgY2hhbm5lbAorcmVzZXQsIGFuZCB2aWEgYSB3cml0ZSB0byB0aGUgcmVzZXQgcmVnaXN0ZXIgZGVzY3JpYmVkIGFib3ZlLiBGb3IgcHJvZHVjdHMgdXNpbmcKK3RoZSBJU0EgYnVzLCB0aGVzZSB0aHJlZSBzb3VyY2VzIG9mIHJlc2V0IGFyZSBlcXV2YWxlbnQuIEZvciBNQ0EgYW5kIEVJU0EgYnVzZXMsCit0aGUgUG93ZXItdXAgYW5kIGNoYW5uZWwgcmVzZXQgc291cmNlcyBjYXVzZSBhZGRpdGlvbmFsIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uCit3aGljaCBzaG91bGQgb25seSBvY2N1ciBhdCBzeXN0ZW0gc3RhcnR1cCB0aW1lLgorCitUaGUgdGhpcmQgdHlwZSBvZiByZXNldCwgY2FsbGVkIGEgImNvbW1hbmQgcmVzZXQiLCBpcyBkb25lIGJ5IHdyaXRpbmcgYW55IGRhdGEKK3RvIHRoZSBGSUZPX1JFU0VUIGFkZHJlc3MgZGVzY3JpYmVkIGFib3ZlLiBUaGlzIHJlc2V0cyB0aGUgb24tYm9hcmQgcHJvY2Vzc29yLAorRklGTywgVUFSVFMsIGFuZCBhc3NvY2lhdGVkIGhhcmR3YXJlLgorCitUaGlzIHBhc3NlcyBjb250cm9sIG9mIHRoZSBib2FyZCB0byB0aGUgYm9vdHN0cmFwIGZpcm13YXJlLCB3aGljaCBwZXJmb3JtcyBhCitQb3dlci1PbiBTZWxmIFRlc3QgYW5kIHdoaWNoIGRldGVjdHMgaXRzIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gRm9yIGV4YW1wbGUsCistSUlFWCBwcm9kdWN0cyBkZXRlcm1pbmUgdGhlIHNpemUgb2YgRklGTyB3aGljaCBoYXMgYmVlbiBpbnN0YWxsZWQsIGFuZCB0aGUKK251bWJlciBhbmQgdHlwZSBvZiBleHBhbnNpb24gYm94ZXMgYXR0YWNoZWQuCisKK1RoaXMgYW5kIG90aGVyIGluZm9ybWF0aW9uIGlzIHRoZW4gd3JpdHRlbiB0byB0aGUgRklGTyBpbiBhIDE2LWJ5dGUgZGF0YSBibG9jawordG8gYmUgcmVhZCBieSB0aGUgaG9zdC4gVGhpcyBibG9jayBpcyBndWFyYW50ZWVkIHRvIGJlIHByZXNlbnQgd2l0aGluIHR3byAoMikKK3NlY29uZHMgb2YgaGF2aW5nIHJlY2VpdmVkIHRoZSBjb21tYW5kIHJlc2V0LiBUaGUgZmlybXdhcmUgaXMgbm93IHJlYWR5IHRvCityZWNlaXZlIGxvYWR3YXJlIGZyb20gdGhlIGhvc3QuCisKK0l0IGlzIGdvb2QgcHJhY3RpY2UgdG8gcGVyZm9ybSBhIGNvbW1hbmQgcmVzZXQgdG8gdGhlIGJvYXJkIGV4cGxpY2l0bHkgYXMgcGFydAorb2YgeW91ciBzb2Z0d2FyZSBpbml0aWFsaXphdGlvbi4gIFRoaXMgYWxsb3dzIHlvdXIgY29kZSB0byBwcm9wZXJseSByZXN0YXJ0IGZyb20KK2Egc29mdCBib290LiAoTWFueSBzeXN0ZW1zIGRvIG5vdCBpc3N1ZSBjaGFubmVsIHJlc2V0IG9uIHNvZnQgYm9vdCkuCisKK0JlY2F1c2Ugb2YgYSBoYXJkd2FyZSByZXNldCBwcm9ibGVtIG9uIHNvbWUgb2YgdGhlIENpcnJ1cyBMb2dpYyAxNDAwJ3Mgd2hpY2ggYXJlCit1c2VkIG9uIHRoZSBwcm9kdWN0LCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSByZXNldCB0aGUgYm9hcmQgdHdpY2UsIHNlcGFyYXRlZAorYnkgYW4gYXBwcm94aW1hdGVseSA1MCBtaWxsaXNlY29uZHMgZGVsYXkuIChWRVJZIGFwcHJveGltYXRlbHk6IHByb2JhYmx5IG9rIHRvCitiZSBvZmYgYnkgYSBmYWN0b3Igb2YgZml2ZS4gVGhlIGltcG9ydGFudCBwb2ludCBpcyB0aGF0IHRoZSBmaXJzdCBjb21tYW5kIHJlc2V0CitpbiBmYWN0IGdlbmVyYXRlcyBhIHJlc2V0IHB1bHNlIG9uIHRoZSBib2FyZC4gVGhpcyBwdWxzZSBpcyBndWFyYW50ZWVkIHRvIGxhc3QKK2xlc3MgdGhhbiAxMCBtaWxsaXNlY29uZHMuIFRoZSBhZGRpdGlvbmFsIGRlbGF5IGVuc3VyZXMgdGhlIDE0MDAgaGFzIGhhZCB0aGUKK2NoYW5jZSB0byByZXNwb25kIHN1ZmZpY2llbnRseSB0byB0aGUgZmlyc3QgcmVzZXQuIFdoeSBub3QgYSBsb25nZXIgZGVsYXk/IE11Y2gKK21vcmUgdGhhbiA1MCBtaWxsaXNlY29uZHMgZ2V0cyB0byBiZSBub3RpY2FibGUsIGJ1dCB0aGUgYm9hcmQgd291bGQgc3RpbGwgd29yay4KKworT25jZSBhbGwgMTYgYnl0ZXMgb2YgdGhlIFBvd2VyLW9uIFJlc2V0IE1lc3NhZ2UgaGF2ZSBiZWVuIHJlYWQsIHRoZSBib290c3RyYXAKK2Zpcm13YXJlIGlzIHJlYWR5IHRvIHJlY2VpdmUgbG9hZHdhcmUuCisKK05vdGUgb24gUG93ZXItb24gUmVzZXQgTWVzc2FnZSBmb3JtYXQ6CitUaGUgdmFyaW91cyBmaWVsZHMgaGF2ZSBiZWVuIGRlc2lnbmVkIHdpdGggZnV0dXJlIGV4cGFuc2lvbiBpbiB2aWV3LgorQ29tYmluYXRpb25zIG9mIGJpdGZpZWxkcyBhbmQgdmFsdWVzIGhhdmUgYmVlbiBkZWZpbmVkIHdoaWNoIGRlZmluZSBwcm9kdWN0cword2hpY2ggbWF5IG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoaXMgaGFzIGJlZW4gZG9uZSB0byBhbGxvdyBkcml2ZXJzIHRvIGFudGljaXBhdGUKK3RoZSBwb3NzaWJsZSBpbnRyb2R1Y3Rpb24gb2YgcHJvZHVjdHMgaW4gYSBzeXN0ZW1hdGljIGZhc2hpb24uIFRoaXMgaXMgbm90CitpbnRlbmRlZCB0byBzdWdnZXN0IHRoYXQgZWFjaCBwb3RlbnRpYWwgcHJvZHVjdCBpcyBhY3R1YWxseSB1bmRlciBjb25zaWRlcmF0aW9uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3JtYXQgb2YgUG93ZXItb24gUmVzZXQgTWVzc2FnZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdW5pb24gX3BvclN0cgkJLy8gInBvciIgc3RhbmRzIGZvciBQb3dlciBPbiBSZXNldAoreworCXVuc2lnbmVkIGNoYXIgIGNbMTZdOwkvLyBhcnJheSB1c2VkIHdoZW4gY29uc2lkZXJpbmcgdGhlIG1lc3NhZ2UgYXMgYQorCQkJCQkJCS8vIHN0cmluZyBvZiB1bmRpZmZlcmVudGlhdGVkIGNoYXJhY3RlcnMKKworCXN0cnVjdAkJCQkJLy8gRWxlbWVudHMgdXNlZCB3aGVuIGNvbnNpZGVyaW5nIHZhbHVlcworCXsKKwkJLy8gVGhlIGZpcnN0IHR3byBieXRlcyBvdXQgb2YgdGhlIEZJRk8gYXJlIHR3byBtYWdpYyBudW1iZXJzLiBUaGVzZSBhcmUKKwkJLy8gaW50ZW5kZWQgdG8gZXN0YWJsaXNoIHRoYXQgdGhlcmUgaXMgaW5kZWVkIGEgbWVtYmVyIG9mIHRoZQorCQkvLyBJbnRlbGxpUG9ydC1JSShFWCkgZmFtaWx5IHByZXNlbnQuIFRoZSByZW1haW5pbmcgYnl0ZXMgbWF5IGJlIAorCQkvLyBleHBlY3RlZCAvLyB0byBiZSB2YWxpZC4gV2hlbiByZWFkaW5nIHRoZSBQb3dlci1vbiBSZXNldCBtZXNzYWdlLCAKKwkJLy8gaWYgdGhlIG1hZ2ljIG51bWJlcnMgZG8gbm90IG1hdGNoIGl0IGlzIHByb2JhYmx5IGJlc3QgdG8gc3RvcAorCQkvLyByZWFkaW5nIGltbWVkaWF0ZWx5LiBZb3UgYXJlIGNlcnRhaW5seSBub3QgcmVhZGluZyBvdXIgYm9hcmQgKHVubGVzcworCQkvLyBoYXJkd2FyZSBpcyBmYXVsdHkpLCBhbmQgbWF5IGluIGZhY3QgYmUgcmVhZGluZyBzb21lIG90aGVyIHBpZWNlIG9mCisJCS8vIGhhcmR3YXJlLgorCisJCXVuc2lnbmVkIGNoYXIgcG9yTWFnaWMxOyAgIC8vIG1hZ2ljIG51bWJlcjogZmlyc3QgYnl0ZSA9PSBQT1JfTUFHSUNfMSAKKwkJdW5zaWduZWQgY2hhciBwb3JNYWdpYzI7ICAgLy8gbWFnaWMgbnVtYmVyOiBzZWNvbmQgYnl0ZSA9PSBQT1JfTUFHSUNfMiAKKworCQkvLyBUaGUgVmVyc2lvbiwgUmV2aXNpb24sIGFuZCBTdWJyZXZpc2lvbiBhcmUgc3RvcmVkIGFzIGFic29sdXRlIG51bWJlcnMKKwkJLy8gYW5kIHdvdWxkIG5vcm1hbGx5IGJlIGRpc3BsYXllZCBpbiB0aGUgZm9ybWF0IFYuUi5TIChlLmcuIDEuMC4yKQorCisJCXVuc2lnbmVkIGNoYXIgcG9yVmVyc2lvbjsgIC8vIEJvb3RzdHJhcCBmaXJtd2FyZSB2ZXJzaW9uIG51bWJlcgorCQl1bnNpZ25lZCBjaGFyIHBvclJldmlzaW9uOyAvLyBCb290c3RyYXAgZmlybXdhcmUgcmV2aXNpb24gbnVtYmVyCisJCXVuc2lnbmVkIGNoYXIgcG9yU3ViUmV2OyAgIC8vIEJvb3RzdHJhcCBmaXJtd2FyZSBzdWItcmV2aXNpb24gbnVtYmVyCisKKwkJdW5zaWduZWQgY2hhciBwb3JJRDsJLy8gUHJvZHVjdCBJRDogIEJpdC1tYXBwZWQgYWNjb3JkaW5nIHRvCisJCQkJCQkJCS8vIGNvbnZlbnRpb25zIGRlc2NyaWJlZCBiZWxvdy4gQW1vbmcgb3RoZXIKKwkJCQkJCQkJLy8gdGhpbmdzLCB0aGlzIGFsbG93cyB1cyB0byBkaXN0aW5ndWlzaAorCQkJCQkJCQkvLyBJbnRlbGxpUG9ydC1JSSBib2FyZHMgZnJvbSBJbnRlbGxpUG9ydC1JSUVYCisJCQkJCQkJCS8vIGJvYXJkcy4KKworCQl1bnNpZ25lZCBjaGFyIHBvckJ1czsJLy8gSW50ZWxsaVBvcnQtSUk6IFVudXNlZAorCQkJCQkJCQkvLyBJbnRlbGxpUG9ydC1JSUVYOiBCdXMgSW5mb3JtYXRpb246CisJCQkJCQkJCS8vIEJpdC1tYXBwZWQgYmVsb3cKKworCQl1bnNpZ25lZCBjaGFyIHBvck1lbW9yeTsJLy8gT24tYm9hcmQgRFJBTSBzaXplOiBpbiAzMmsgYmxvY2tzCisKKwkJLy8gcG9yUG9ydHMxIChhbmQgcG9yUG9ydHMyKSBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHBvcnRzIHdoaWNoIGFyZQorCQkvLyBhdmFpbGFibGUgdG8gdGhlIGJvYXJkLiBGb3Igbm9uLWV4cGFuZGFibGUgcHJvZHVjdCwgYSBzaW5nbGUgbnVtYmVyIAorCQkvLyBpcyBzdWZmaWNpZW50LiBGb3IgZXhwYW5kYWJsZSBwcm9kdWN0LCB0aGUgYm9hcmQgbWF5IGJlIGNvbm5lY3RlZAorCQkvLyB0byBhcyBtYW55IGFzIGZvdXIgYm94ZXMuIEVhY2ggYm94IG1heSBiZSAoc28gZmFyKSBlaXRoZXIgYSAxNi1wb3J0CisJCS8vIG9yIGFuIDgtcG9ydCBzaXplLiBXaGVuZXZlciBhbiA4LXBvcnQgYm94IGlzIHVzZWQsIHRoZSByZW1haW5pbmcgOAorCQkvLyBwb3J0cyBsZWF2ZSBnYXBzIGJldHdlZW4gZXhpc3RpbmcgY2hhbm5lbHMuIEZvciB0aGF0IHJlYXNvbiwKKwkJLy8gZXhwYW5kYWJsZSBwcm9kdWN0cyBtdXN0IHJlcG9ydCBhIE1BUCBvZiBhdmFpbGFibGUgY2hhbm5lbHMuIFNpbmNlIAorCQkvLyBlYWNoIFVBUlQgc3VwcG9ydHMgZm91ciBwb3J0cywgd2UgcmVwcmVzZW50IGVhY2ggVUFSVCBmb3VuZCBieSBhCisJCS8vIHNpbmdsZSBiaXQuIFVzaW5nIHR3byBieXRlcyB0byBzdXBwbHkgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gd2UKKwkJLy8gcmVwb3J0IHRoZSBwcmVzZW5zZSBvciBhYnNlbnNlIG9mIHVwIHRvIDE2IFVBUlRTLCBvciA2NCBwb3J0cyBpbgorCQkvLyBzdGVwcyBvZiA0IHBvcnRzLiBGb3IgLUlJRVggcHJvZHVjdHMsIHRoZSBwb3J0cyBhcmUgbnVtYmVyZWQKKwkJLy8gc3RhcnRpbmcgYXQgdGhlIGJveCBjbG9zZXN0IHRvIHRoZSBjb250cm9sbGVyIGluIHRoZSAiY2hhaW4iLgorCisJCS8vIEludGVycHJldGVkIERpZmZlcmVudGx5IGZvciBJbnRlbGxpUG9ydC1JSSBhbmQgLUlJRVguCisJCS8vIC1JSTogICBOdW1iZXIgb2YgcG9ydHMgKERlcml2ZWQgYWN0dWFsbHkgZnJvbSBwcm9kdWN0IElEKS4gU2VlCisJCS8vIERpYWcxJjIgdG8gaW5kaWNhdGUgaWYgdWFydCB3YXMgYWN0dWFsbHkgZGV0ZWN0ZWQuCisJCS8vIC1JSUVYOiBCaXQtbWFwIG9mIFVBUlRTIGZvdW5kLCBMU0IgKHNlZSBiZWxvdyBmb3IgTVNCIG9mIHRoaXMpLiBUaGlzCisJCS8vICAgICAgICBiaXRtYXAgaXMgYmFzZWQgb24gZGV0ZWN0aW5nIHRoZSB1YXJ0cyB0aGVtc2VsdmVzOyAKKwkJLy8gICAgICAgIHNlZSBwb3JGbGFncyBmb3IgaW5mb3JtYXRpb24gZnJvbSB0aGUgYm94IGkuZCdzLgorCQl1bnNpZ25lZCBjaGFyICBwb3JQb3J0czE7CisKKwkJdW5zaWduZWQgY2hhciAgcG9yRGlhZzE7CS8vIFJlc3VsdHMgb2Ygb24tYm9hcmQgUC5PLlMuVCwgMXN0IGJ5dGUKKwkJdW5zaWduZWQgY2hhciAgcG9yRGlhZzI7CS8vIFJlc3VsdHMgb2Ygb24tYm9hcmQgUC5PLlMuVCwgMm5kIGJ5dGUKKwkJdW5zaWduZWQgY2hhciAgcG9yU3BlZWQ7CS8vIFNwZWVkIG9mIGxvY2FsIENQVTogZ2l2ZW4gYXMgTUh6IHgxMAorCQkJCQkJCQkJLy8gZS5nLiwgMTYuMCBNSHogQ1BVIGlzIHJlcG9ydGVkIGFzIDE2MAorCQl1bnNpZ25lZCBjaGFyICBwb3JGbGFnczsJLy8gTWlzYyBpbmZvcm1hdGlvbiAoc2VlIG1hbmlmZXN0cyBiZWxvdykKKwkJCQkJCQkJCS8vIEJpdC1tYXBwZWQ6IENQVSB0eXBlLCBVQVJUJ3MgcHJlc2VudAorCisJCXVuc2lnbmVkIGNoYXIgIHBvclBvcnRzMjsJLy8gLUlJOiAgVW5kZWZpbmVkCisJCQkJCQkJCQkvLyAtSUlFWDogQml0LW1hcCBvZiBVQVJUUyBmb3VuZCwgTVNCIChzZWUKKwkJCQkJCQkJCS8vICAgICAgICBhYm92ZSBmb3IgTFNCKQorCisJCS8vIEludGVsbGlQb3J0LUlJOiB1bmRlZmluZWQKKwkJLy8gSW50ZWxsaVBvcnQtSUlFWDogMSA8PCBwb3JGaWZvU2l6ZSBnaXZlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZQorCQkvLyBob3N0IGludGVyZmFjZSBGSUZPLCBpbiBlYWNoIGRpcmVjdGlvbi4gV2hlbiBydW5uaW5nIHRoZSAtSUlFWCBpbgorCQkvLyA4LWJpdCBtb2RlLCBmaWZvIGNhcGFjaXR5IGlzIGhhbHZlZC4gVGhlIGJvb3RzdHJhcCBmaXJtd2FyZSB3aWxsCisJCS8vIGhhdmUgYWxyZWFkeSBhY2NvdW50ZWQgZm9yIHRoaXMgZmFjdCBpbiBnZW5lcmF0aW5nIHRoaXMgbnVtYmVyLgorCQl1bnNpZ25lZCBjaGFyICBwb3JGaWZvU2l6ZTsKKworCQkvLyBJbnRlbGxpUG9ydC1JSTogdW5kZWZpbmVkCisJCS8vIEludGVsbGlQb3J0LUlJRVg6IFRoZSBudW1iZXIgb2YgYm94ZXMgY29ubmVjdGVkLiAoUHJlc2VudGx5IDEtNCkKKwkJdW5zaWduZWQgY2hhciAgcG9yTnVtQm94ZXM7CisJfSBlOworfSBwb3JTdHIsICpwb3JTdHJQdHI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhbHVlcyBmb3IgcG9yU3RyIGZpZWxkcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9yTWFnaWMxLCBwb3JNYWdpYzIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgIFBPUl9NQUdJQ18xICAgIDB4OTYgIC8vIFRoZSBvbmx5IHZhbGlkIHZhbHVlIGZvciBwb3JNYWdpYzEKKyNkZWZpbmUgIFBPUl9NQUdJQ18yICAgIDB4MzUgIC8vIFRoZSBvbmx5IHZhbGlkIHZhbHVlIGZvciBwb3JNYWdpYzIKKyNkZWZpbmUgIFBPUl8xX0lOREVYICAgIDAgICAgIC8vIEJ5dGUgcG9zaXRpb24gb2YgUE9SX01BR0lDXzEKKyNkZWZpbmUgIFBPUl8yX0lOREVYICAgIDEgICAgIC8vIERpdHRvIGZvciBQT1JfTUFHSUNfMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBvcklECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisjZGVmaW5lICBQT1JfSURfRkFNSUxZICAweGMwCS8vIFRoZXNlIGJpdHMgaW5kaWNhdGUgdGhlIGdlbmVyYWwgZmFtaWx5IG9mCisJCQkJCQkJCS8vIHByb2R1Y3QuCisjZGVmaW5lICBQT1JfSURfRklJICAgICAweDAwCS8vIEZhbWlseSBpcyAiSW50ZWxsaVBvcnQtSUkiCisjZGVmaW5lICBQT1JfSURfRklJRVggICAweDQwCS8vIEZhbWlseSBpcyAiSW50ZWxsaVBvcnQtSUlFWCIKKworLy8gVGhlc2UgYml0cyBhcmUgcmVzZXJ2ZWQsIHByZXNlbnRseSB6ZXJvLiBNYXkgYmUgdXNlZCBhdCBhIGxhdGVyIGRhdGUgdG8KKy8vIGNvbnZleSBvdGhlciBwcm9kdWN0IGluZm9ybWF0aW9uLgorLy8KKyNkZWZpbmUgUE9SX0lEX1JFU0VSVkVEIDB4M2MKKworI2RlZmluZSBQT1JfSURfU0laRSAgICAgMHgwMwkvLyBSZW1haW5pbmcgYml0cyBpbmRpY2F0ZSBudW1iZXIgb2YgcG9ydHMgJgorCQkJCQkJCQkvLyBDb25uZWN0b3IgaW5mb3JtYXRpb24uCisjZGVmaW5lIFBPUl9JRF9JSV84ICAgICAweDAwCS8vIEZvciBJbnRlbGxpUG9ydC1JSSwgaW5kaWNhdGVzIDgtcG9ydCB1c2luZworCQkJCQkJCQkvLyBzdGFuZGFyZCBicmljay4KKyNkZWZpbmUgUE9SX0lEX0lJXzhSICAgIDB4MDEJLy8gRm9yIEludGVsbGlQb3J0LUlJLCBpbmRpY2F0ZXMgOC1wb3J0IHVzaW5nCisJCQkJCQkJCS8vIFJKMTEncyAobm8gQ1RTKQorI2RlZmluZSBQT1JfSURfSUlfNiAgICAgMHgwMgkvLyBGb3IgSW50ZWxsaVBvcnQtSUksIGluZGljYXRlcyA2LXBvcnQgdXNpbmcKKwkJCQkJCQkJLy8gUko0NSdzCisjZGVmaW5lIFBPUl9JRF9JSV80ICAgICAweDAzCS8vIEZvciBJbnRlbGxpUG9ydC1JSSwgaW5kaWNhdGVzIDQtcG9ydCB1c2luZworCQkJCQkJCQkvLyA0eFJKNDUgY29ubmVjdG9ycworI2RlZmluZSBQT1JfSURfRVggICAgICAgMHgwMAkvLyBGb3IgSW50ZWxsaVBvcnQtSUlFWCwgaW5kaWNhdGVzIHN0YW5kYXJkCisJCQkJCQkJCS8vIGV4cGFuZGFibGUgY29udHJvbGxlciAob3RoZXIgdmFsdWVzIHJlc2VydmVkKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBvckJ1cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEludGVsbGlQb3J0LUlJRVggb25seTogQm9hcmQgaXMgaW5zdGFsbGVkIGluIGEgMTYtYml0IHNsb3QKKy8vCisjZGVmaW5lIFBPUl9CVVNfU0xPVDE2ICAweDIwCisKKy8vIEludGVsbGlQb3J0LUlJRVggb25seTogRElQIHN3aXRjaCAjOCBpcyBvbiwgc2VsZWN0aW5nIDE2LWJpdCBob3N0IGludGVyZmFjZQorLy8gb3BlcmF0aW9uLgorLy8gCisjZGVmaW5lIFBPUl9CVVNfRElQMTYgICAweDEwCisKKy8vIEJpdHMgMC0yIGluZGljYXRlIHR5cGUgb2YgYnVzOiBUaGlzIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgYm9vdHN0cmFwCisvLyBsb2Fkd2FyZSwgZGlmZmVyZW50IGxvYWR3YXJlIGJlaW5nIHVzZWQgb24gZGlmZmVyZW50IHByb2R1Y3RzIGZvciBkaWZmZXJlbnQKKy8vIGJ1c2VzLiBGb3IgbW9zdCBzaXR1YXRpb25zLCB0aGUgZHJpdmVycyBkbyBub3QgbmVlZCB0aGlzIGluZm9ybWF0aW9uOyBidXQgaXQKKy8vIGlzIGhhbmR5IGluIGEgZGlhZ25vc3RpYyBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIG9uIG1pY3JvY2hhbm5lbCBib2FyZHMsCisvLyB5b3Ugd291bGQgbm90IHdhbnQgdG8gdHJ5IHRvIHRlc3Qgc2V2ZXJhbCBpbnRlcnJ1cHRzLCBvbmx5IHRoZSBvbmUgZm9yIHdoaWNoCisvLyB5b3Ugd2VyZSBjb25maWd1cmVkLgorLy8KKyNkZWZpbmUgIFBPUl9CVVNfVFlQRSAgIDB4MDcKKworLy8gVW5rbm93bjogIHRoaXMgcHJvZHVjdCBkb2Vzbid0IGtub3cgd2hhdCBidXMgaXQgaXMgcnVubmluZyBpbi4gKGUuZy4gaWYgc2FtZQorLy8gYm9vdHN0cmFwIGZpcm13YXJlIHdlcmUgd2FudGVkIGZvciB0d28gZGlmZmVyZW50IGJ1c2VzLikKKy8vCisjZGVmaW5lICBQT1JfQlVTX1RfVU5LICAwCisKKy8vIE5vdGU6IGV4aXN0aW5nIGZpcm13YXJlIGZvciBJU0EtOCBhbmQgTUMtOCBjdXJyZW50bHkgcmVwb3J0IHRoZSBQT1JfQlVTX1RfVU5LCisvLyBzdGF0ZSwgc2luY2UgdGhlIHNhbWUgYm9vdHN0cmFwIGZpcm13YXJlIGlzIHVzZWQgZm9yIGVhY2guCisKKyNkZWZpbmUgIFBPUl9CVVNfVF9NQ0EgIDEgIC8vIE1DQSBCVVMgKi8KKyNkZWZpbmUgIFBPUl9CVVNfVF9FSVNBIDIgIC8vIEVJU0EgQlVTICovCisjZGVmaW5lICBQT1JfQlVTX1RfSVNBICAzICAvLyBJU0EgQlVTICovCisKKy8vIFZhbHVlcyA0LTcgUmVzZXJ2ZWQKKworLy8gUmVtYWluaW5nIGJpdHMgYXJlIHJlc2VydmVkCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcG9yRGlhZzEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lICBQT1JfQkFEX01BUFBFUiAweDgwCS8vIEhXIGZhaWx1cmUgb24gUC5PLlMuVDogQ2hpcCBtYXBwZXIgZmFpbGVkCisKKy8vIFRoZXNlIHR3byBiaXRzIHZhbGlkIG9ubHkgZm9yIHRoZSBJbnRlbGxpUG9ydC1JSQorLy8KKyNkZWZpbmUgIFBPUl9CQURfVUFSVDEgIDB4MDEJLy8gRmlyc3QgIDE0MDAgYmFkCisjZGVmaW5lICBQT1JfQkFEX1VBUlQyICAweDAyCS8vIFNlY29uZCAxNDAwIGJhZAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBvckRpYWcyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSAgUE9SX0RFQlVHX1BPUlQgMHg4MAkvLyBkZWJ1ZyBwb3J0IHdhcyBkZXRlY3RlZCBieSB0aGUgUC5PLlMuVAorI2RlZmluZSAgUE9SX0RJQUdfT0sgICAgMHgwMAkvLyBJbmRpY2F0ZXMgcGFzc2FnZTogRmFpbHVyZSBjb2RlcyBub3QgeWV0CisJCQkJCQkJCS8vIGF2YWlsYWJsZS4KKwkJCQkJCQkJLy8gT3RoZXIgYml0cyB1bmRlZmluZWQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBvckZsYWdzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSAgUE9SX0NQVSAgICAgMHgwMwkvLyBUaGVzZSBiaXRzIGluZGljYXRlIHN1cHBvc2VkIENQVSB0eXBlCisjZGVmaW5lICBQT1JfQ1BVXzggICAweDAxCS8vIEJvYXJkIHVzZXMgYW4gODAxODggKG5vIHN1Y2ggdGhpbmcgeWV0KQorI2RlZmluZSAgUE9SX0NQVV82ICAgMHgwMgkvLyBCb2FyZCB1c2VzIGFuIDgwMTg2IChhbGwgZXhpc3RpbmcgcHJvZHVjdHMpCisjZGVmaW5lICBQT1JfQ0VYNCAgICAweDA0CS8vIElmIHNldCwgdGhpcyBpcyBhbiBJU0EtQ0VYLzQ6IEFuIElTQS00IChhc2ljKQorCQkJCQkJCS8vIHdoaWNoIGlzIGFyY2hpdGVjdGVkIGxpa2UgYW4gSVNBLUNFWCBjb25uZWN0ZWQKKwkJCQkJCQkvLyB0byBhIChoaXRoZXJ0byBpbXBvc3NpYmxlKSA0LXBvcnQgYm94LgorI2RlZmluZSBQT1JfQk9YRVMgICAgMHhmMAkvLyBWYWxpZCBmb3IgSW50ZWxsaVBvcnQtSUlFWCBvbmx5OiBNYXAgb2YgQm94CisJCQkJCQkJLy8gc2l6ZXMgYmFzZWQgb24gYm94IEkuRC4KKyNkZWZpbmUgUE9SX0JPWF8xNiAgIDB4MTAJLy8gU2V0IGluZGljYXRlcyAxNi1wb3J0LCBjbGVhciA4LXBvcnQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMT0FEV0FSRSBhbmQgRE9XTkxPQURJTkcgQ09ERQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCitMb2Fkd2FyZSBtYXkgYmUgc2VudCB0byB0aGUgYm9hcmQgaW4gdHdvIHdheXM6CisxKSBJdCBtYXkgYmUgcmVhZCBmcm9tIGEgKGJpbmFyeSBpbWFnZSkgZGF0YSBmaWxlIGJsb2NrIGJ5IGJsb2NrIGFzIGVhY2ggYmxvY2sKKwlpcyBzZW50IHRvIHRoZSBib2FyZC4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gdGhlIGluaXRpYWxpemF0aW9uIGlzCisJcGVyZm9ybWVkIGJ5IGNvZGUgd2hpY2ggY2FuIGFjY2VzcyB5b3VyIGZpbGUgc3lzdGVtLiBUaGlzIGlzIG1vc3Qgc3VpdGFibGUKKwlmb3IgZGlhZ25vc3RpY3MgYW5kIGFwcGljYXRpb25zIHdoaWNoIHVzZSB0aGUgaW50ZXJmYWNlIGxpYnJhcnkgZGlyZWN0bHkuCisKKzIpIEl0IG1heSBiZSBoYXJkLWNvZGVkIGludG8geW91ciBzb3VyY2UgYnkgaW5jbHVkaW5nIGEgLmggZmlsZSAodHlwaWNhbGx5CisJc3VwcGxpZWQgYnkgQ29tcHV0b25lKSwgd2hpY2ggZGVjbGFyZXMgYSBkYXRhIGFycmF5IGFuZCBpbml0aWFsaXplcyBldmVyeQorCWVsZW1lbnQuIFRoaXMgYWNoZWl2ZXMgdGhlIHNhbWUgcmVzdWx0IGFzIGlmIGFuIGVudGlyZSBsb2Fkd2FyZSBmaWxlIGhhZCAKKwliZWVuIHJlYWQgaW50byB0aGUgYXJyYXkuCisKKwlUaGlzIHJlcXVpcmVzIG1vcmUgZGF0YSBzcGFjZSBpbiB5b3VyIHByb2dyYW0sIGJ1dCBhY2Nlc3MgdG8gdGhlIGZpbGUgc3lzdGVtCisJaXMgbm90IHJlcXVpcmVkLiBUaGlzIG1ldGhvZCBpcyBtb3JlIHN1aXRlZCB0byBkcml2ZXIgY29kZSwgd2hpY2ggdHlwaWNhbGx5CisJaXMgcnVubmluZyBhdCBhIGxldmVsIHRvbyBsb3cgdG8gYWNjZXNzIHRoZSBmaWxlIHN5c3RlbSBkaXJlY3RseS4KKworQXQgcHJlc2VudCwgbG9hZHdhcmUgY2FuIG9ubHkgYmUgZ2VuZXJhdGVkIGF0IENvbXB1dG9uZS4KKworQWxsIExvYWR3YXJlIGJlZ2lucyB3aXRoIGEgaGVhZGVyIGFyZWEgd2hpY2ggaGFzIGEgcGFydGljdWxhciBmb3JtYXQuIFRoaXMKK2luY2x1ZGVzIGEgbWFnaWMgbnVtYmVyIHdoaWNoIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYmVpbmcgKHB1cnBvcnRlZGx5KQorbG9hZHdhcmUsIENSQyAoZm9yIHRoZSBsb2FkZXIpLCBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRm9ybWF0IG9mIGxvYWR3YXJlIGJsb2NrCisvLworLy8gVGhpcyBpcyBkZWZpbmVkIGFzIGEgdW5pb24gc28gd2UgY2FuIHBhc3MgYSBwb2ludGVyIHRvIG9uZSBvZiB0aGVzZSBpdGVtcworLy8gYW5kIChpZiBpdCBpcyB0aGUgZmlyc3QgYmxvY2spIHBpY2sgb3V0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLCBldGMuCisvLworLy8gT3RoZXJ3aXNlLCB0byBkZWFsIHdpdGggdGhpcyBhcyBhIHNpbXBsZSBjaGFyYWN0ZXIgYXJyYXkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTE9BRFdBUkVfQkxPQ0tfU0laRSAgIDUxMiAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBlYWNoIGJsb2NrIG9mIGxvYWR3YXJlCisKK3R5cGVkZWYgdW5pb24gX2xvYWRIZHJTdHIKK3sKKwl1bnNpZ25lZCBjaGFyIGNbTE9BRFdBUkVfQkxPQ0tfU0laRV07ICAvLyBWYWxpZCBmb3IgZXZlcnkgYmxvY2sKKworCXN0cnVjdAkvLyBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGZvciBvbmx5IHRoZSBmaXJzdCBibG9jayBvZiBsb2Fkd2FyZS4KKwl7CisJCXVuc2lnbmVkIGNoYXIgbG9hZE1hZ2ljOwkJLy8gTWFnaWMgbnVtYmVyOiBzZWUgYmVsb3cKKwkJdW5zaWduZWQgY2hhciBsb2FkQmxvY2tzTW9yZTsJLy8gSG93IG1hbnkgbW9yZSBibG9ja3M/CisJCXVuc2lnbmVkIGNoYXIgbG9hZENSQ1syXTsJCS8vIFR3byBDUkMgYnl0ZXM6IHVzZWQgYnkgbG9hZGVyCisJCXVuc2lnbmVkIGNoYXIgbG9hZFZlcnNpb247CQkvLyBWZXJzaW9uIG51bWJlcgorCQl1bnNpZ25lZCBjaGFyIGxvYWRSZXZpc2lvbjsJCS8vIFJldmlzaW9uIG51bWJlcgorCQl1bnNpZ25lZCBjaGFyIGxvYWRTdWJSZXZpc2lvbjsJLy8gU3ViLXJldmlzaW9uIG51bWJlcgorCQl1bnNpZ25lZCBjaGFyIGxvYWRTcGFyZXNbOV07CS8vIFByZXNlbnRseSB1bnVzZWQKKwkJdW5zaWduZWQgY2hhciBsb2FkRGF0ZXNbMzJdOwkvLyBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHdoaWNoIGNhbiBnaXZlCisJCQkJCQkJCQkJLy8gZGF0ZSBhbmQgdGltZSBvZiBjb21waWxhdGlvbgorCX0gZTsKK30gbG9hZEhkclN0ciwgKmxvYWRIZHJTdHJQdHI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbmVzIGZvciBkb3dubG9hZGluZyBjb2RlOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhlIGxvYWRNYWdpYyBmaWVsZCBpbiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGxvYWRmaWxlIG11c3QgYmUgdGhpcywgZWxzZSB0aGUKKy8vIGZpbGUgaXMgbm90IHZhbGlkLgorLy8KKyNkZWZpbmUgIE1BR0lDX0xPQURGSUxFIDB4M2MKKworLy8gSG93IGRvIHdlIGtub3cgdGhlIGxvYWQgd2FzIHN1Y2Nlc3NmdWw/IE9uIGNvbXBsZXRpb24gb2YgdGhlIGxvYWQsIHRoZQorLy8gYm9vdHN0cmFwIGZpcm13YXJlIHJldHVybnMgYSBjb2RlIHRvIGluZGljYXRlIHdoZXRoZXIgaXQgdGhvdWdodCB0aGUgZG93bmxvYWQKKy8vIHdhcyB2YWxpZCBhbmQgaW50ZW5kcyB0byBleGVjdXRlIGl0LiBUaGVzZSBhcmUgdGhlIG9ubHkgcG9zc2libGUgdmFsaWQgY29kZXM6CisvLworI2RlZmluZSAgTE9BRFdBUkVfT0sgICAgMHhjMyAgICAgICAgLy8gRG93bmxvYWQgd2FzIG9rCisjZGVmaW5lICBMT0FEV0FSRV9CQUQgICAweDVhICAgICAgICAvLyBEb3dubG9hZCB3YXMgYmFkIChDUkMgZXJyb3IpCisKKy8vIENvbnN0YW50cyBhcHBsaWNhYmxlIHRvIHdyaXRpbmcgYmxvY2tzIG9mIGxvYWR3YXJlOgorLy8gVGhlIGZpcnN0IGJsb2NrIG9mIGxvYWR3YXJlIG1pZ2h0IHRha2UgNjAwIG1TIHRvIGxvYWQsIGluIGV4dHJlbWUgY2FzZXMuCisvLyAoRXhwYW5kYWJsZSBib2FyZDogd29yc3QgY2FzZSBmb3Igc2VuZGluZyBzdGFydHVwIG1lc3NhZ2VzIHRvIHRoZSBMQ0QncykuCisvLyBUaGUgNjAwbVMgZmlndXJlIGlzIG5vdCByZWFsbHkgYSBjYWxjdWxhdGlvbiwgYnV0IGEgY29uc2VydmF0aXZlCisvLyBndWVzcy9ndWFyYW50ZWUuIFVzdWFsbHkgdGhpcyB3aWxsIGJlIHdpdGhpbiAxMDAgbVMsIGxpa2Ugc3Vic2VxdWVudCBibG9ja3MuCisvLworI2RlZmluZSAgTUFYX0RMT0FEX1NUQVJUX1RJTUUgMTAwMCAgLy8gMTAwMCBtUworI2RlZmluZSAgTUFYX0RMT0FEX1JFQURfVElNRSAgMTAwICAgLy8gMTAwIG1TCisKKy8vIEZpcm13YXJlIHNob3VsZCByZXNwb25kIHdpdGggc3RhdHVzIChzZWUgYWJvdmUpIHdpdGhpbiB0aGlzIGxvbmcgb2YgaG9zdAorLy8gaGF2aW5nIHNlbnQgdGhlIGZpbmFsIGJsb2NrLgorLy8KKyNkZWZpbmUgIE1BWF9ETE9BRF9BQ0tfVElNRSAgIDEwMCAgIC8vIDEwMCBtUywgYWdhaW4hCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNQVhJTVVNIE5VTUJFUiBPRiBQT1JUUyBQRVIgQk9BUkQ6CisvLyBUaGlzIGlzIGZpeGVkIGZvciBub3cgKHdpdGggdGhlIGV4cGFuZGFibGUpLCBidXQgbWF5CisvLyBiZSBleHBhbmRpbmcgYWNjb3JkaW5nIHRvIGV2ZW4gbmV3ZXIgcHJvZHVjdHMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgQUJTX01BWF9CT1hFUyAgIDQgICAgIC8vIEFic29sdXRlIG1vc3QgYm94ZXMgcGVyIGJvYXJkCisjZGVmaW5lIEFCU19CSUdHRVNUX0JPWCAxNiAgICAvLyBBYnNvbHV0ZSB0aGUgbW9zdCBwb3J0cyBwZXIgYm94CisjZGVmaW5lIEFCU19NT1NUX1BPUlRTICAoQUJTX01BWF9CT1hFUyAqIEFCU19CSUdHRVNUX0JPWCkKKworI2VuZGlmICAgLy8gSTJIV19ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuYyBiL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmM1ZjMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCkBAIC0wLDAgKzEsMjIxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAoYykgMTk5OSBieSBDb21wdXRvbmUgQ29ycG9yYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqICAgUEFDS0FHRTogICAgIExpbnV4IHR0eSBEZXZpY2UgRHJpdmVyIGZvciBJbnRlbGxpUG9ydCBmYW1pbHkgb2YgbXVsdGlwb3J0CisqICAgICAgICAgICAgICAgIHNlcmlhbCBJL08gY29udHJvbGxlcnMuCisqCisqICAgREVTQ1JJUFRJT046IEhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBkZXZpY2UgZHJpdmVyLiBVc2VzIHRoZQorKiAgICAgICAgICAgICAgICBFeHRyZW1lbHkgTG93IExldmVsIEludGVyZmFjZSBTdXBwb3J0IChpMmVsbGlzLmMpLiBQcm92aWRlcyBhbgorKiAgICAgICAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHN0YW5kYXJkIGxvYWR3YXJlLCB0byBzdXBwb3J0IGRyaXZlcnMgb3IKKyogICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY29kZS4gKFRoaXMgaXMgaW5jbHVkZWQgc291cmNlIGNvZGUsIG5vdCBhIHNlcGFyYXRlCisqICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uIG1vZHVsZS4pCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vdGUgb24gU3RyYXRlZ3k6CisvLyBPbmNlIHRoZSBib2FyZCBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgd2lsbCBpbnRlcnJ1cHQgdXMgd2hlbjoKKy8vIDEpIEl0IGhhcyBzb21ldGhpbmcgaW4gdGhlIGZpZm8gZm9yIHVzIHRvIHJlYWQgKGluY29taW5nIGRhdGEsIGZsb3cgY29udHJvbAorLy8gcGFja2V0cywgb3Igd2hhdGV2ZXIpLgorLy8gMikgSXQgaGFzIHN0cmlwcGVkIHdoYXRldmVyIHdlIGhhdmUgc2VudCBsYXN0IHRpbWUgaW4gdGhlIEZJRk8gKGFuZAorLy8gY29uc2VxdWVudGx5IGlzIHJlYWR5IGZvciBtb3JlKS4KKy8vCisvLyBOb3RlIGFsc28gdGhhdCB0aGUgYnVmZmVyIHNpemVzIGRlY2xhcmVkIGluIGkybGliLmggYXJlIFZFUlkgU01BTEwuIFRoaXMKKy8vIHdvcnNlbnMgcGVyZm9ybWFuY2UgY29uc2lkZXJhYmx5LCBidXQgaXMgZG9uZSBzbyB0aGF0IGEgZ3JlYXQgbWFueSBjaGFubmVscworLy8gbWlnaHQgdXNlIG9ubHkgYSBsaXR0bGUgbWVtb3J5LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmlzaW9uIEhpc3Rvcnk6CisvLworLy8gMC4wMCAtICA0LzE2LzkxIC0tLSBGaXJzdCBEcmFmdAorLy8gMC4wMSAtICA0LzI5LzkxIC0tLSAxc3QgYmV0YSByZWxlYXNlCisvLyAwLjAyIC0gIDYvMTQvOTEgLS0tIENoYW5nZXMgdG8gYWxsb3cgc21hbGwgbW9kZWwgY29tcGlsYXRpb24KKy8vIDAuMDMgLSAgNi8xNy85MSBNQUcgQnJlYWsgcmVwb3J0aW5nIHByb3RlY3RlZCBmcm9tIGludGVycnVwdHMgcm91dGluZXMgd2l0aAorLy8gICAgICAgICAgICAgICAgICAgICBpbi1saW5lIGFzbSBhZGRlZCBmb3IgbW92aW5nIGRhdGEgdG8vZnJvbSByaW5nIGJ1ZmZlcnMsCisvLyAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2luZyBhIHZhcmlldHkgb2YgbWV0aG9kcyB1c2VkIHByZXZpb3VzbHkuCisvLyAwLjA0IC0gIDYvMjEvOTEgTUFHIEluaXRpYWwgZmxvdy1jb250cm9sIHBhY2tldHMgbm90IHF1ZXVlZCB1bnRpbAorLy8gICAgICAgICAgICAgICAgICAgICBpMl9lbmFibGVfaW50ZXJydXB0cyB0aW1lLiBGb3JtZXIgdmVyc2lvbnMgd291bGQgZW5xdWV1ZQorLy8gICAgICAgICAgICAgICAgICAgICB0aGVtIGF0IGkyX2luaXRfY2hhbm5lbCB0aW1lLCBiZWZvcmUgd2Uga25ldyBob3cgbWFueQorLy8gICAgICAgICAgICAgICAgICAgICBjaGFubmVscyB3ZXJlIHN1cHBvc2VkIHRvIGV4aXN0IQorLy8gMC4wNSAtIDEwLzEyLzkxIE1BRyBNYWpvciBjaGFuZ2VzOiB3b3JrcyB0aHJvdWdoIHRoZSBlbGxpcy5jIHJvdXRpbmVzIG5vdzsKKy8vICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgbmV3IDE2LWJpdCBwcm90b2NvbCBhbmQgZXhwYW5kYWJsZSBib2FyZHMuCisvLyAgICAgIC0gMTAvMjQvOTEgTUFHIE1vc3QgY2hhbmdlcyBpbiBwbGFjZSBhbmQgc3RhYmxlLgorLy8gMC4wNiAtICAyLzIwLzkyIE1BRyBGb3JtYXQgb2YgQ01EX0hPVEFDSyBjb3JyZWN0ZWQ6IHRoZSBjb21tYW5kIHRha2VzIG5vCisvLyAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LgorLy8gMC4wNyAtLSAzLzExLzkyIE1BRyBTdXBwb3J0IGFkZGVkIHRvIHN0b3JlIHNwZWNpYWwgcGFja2V0IHR5cGVzIGF0IGludGVycnVwdAorLy8gICAgICAgICAgICAgICAgICAgICBsZXZlbCAobW9zdGx5IHJlc3BvbnNlcyB0byBzcGVjaWZpYyBjb21tYW5kcy4pCisvLyAwLjA4IC0tIDMvMzAvOTIgTUFHIFN1cHBvcnQgYWRkZWQgZm9yIFNUQVRfTU9ERU0gcGFja2V0CisvLyAwLjA5IC0tIDYvMjQvOTMgTUFHIGkyTGluay4uLiBuZWVkZWQgdG8gdXBkYXRlIG51bWJlciBvZiBib2FyZHMgQkVGT1JFCisvLyAgICAgICAgICAgICAgICAgICAgIHR1cm5pbmcgb24gdGhlIGludGVycnVwdC4KKy8vIDAuMTAgLS0gNi8yNS85MyBNQUcgVG8gYXZvaWQgZ3J1ZXNvbWUgZGVhdGggZnJvbSBhIGJhZCBib2FyZCwgd2Ugc2FuaXR5IGNoZWNrCisvLyAgICAgICAgICAgICAgICAgICAgIHNvbWUgaW5jb21pbmcuCisvLworLy8gMS4xICAtIDEyLzI1Lzk2IEFLTSBMaW51eCB2ZXJzaW9uLgorLy8gICAgICAtIDEwLzA5Lzk4IERNQyBSZXZpc2VkIExpbnV4IHZlcnNpb24uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyoqKioqKioqKioqKgorLy8qIEluY2x1ZGVzICoKKy8vKioqKioqKioqKioqCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgImkybGliLmgiCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKgorLy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKgorLy8qKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIHZvaWQgaTJRdWV1ZU5lZWRzKGkyZUJvcmRTdHJQdHIsIGkyQ2hhblN0clB0ciwgaW50KTsKK3N0YXRpYyBpMkNoYW5TdHJQdHIgaTJEZVF1ZXVlTmVlZHMoaTJlQm9yZFN0clB0ciwgaW50ICk7CitzdGF0aWMgdm9pZCBpMlN0cmlwRmlmbyhpMmVCb3JkU3RyUHRyKTsKK3N0YXRpYyB2b2lkIGkyU3R1ZmZGaWZvQnlwYXNzKGkyZUJvcmRTdHJQdHIpOworc3RhdGljIHZvaWQgaTJTdHVmZkZpZm9GbG93KGkyZUJvcmRTdHJQdHIpOworc3RhdGljIHZvaWQgaTJTdHVmZkZpZm9JbmxpbmUoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgaW50IGkyUmV0cnlGbHVzaE91dHB1dChpMkNoYW5TdHJQdHIpOworCisvLyBOb3QgYSBkb2N1bWVudGVkIHBhcnQgb2YgdGhlIGxpYnJhcnkgcm91dGluZXMgKGNhcmVmdWwuLi4pIGJ1dCB0aGUgRGlhZ25vc3RpYworLy8gaTJkaWFnLmMgZmluZHMgdGhlbSB1c2VmdWwgdG8gaGVscCB0aGUgdGhyb3VnaHB1dCBpbiBjZXJ0YWluIGxpbWl0ZWQKKy8vIHNpbmdsZS10aHJlYWRlZCBvcGVyYXRpb25zLgorc3RhdGljIHZvaWQgaWlTZW5kUGVuZGluZ01haWwoaTJlQm9yZFN0clB0cik7CitzdGF0aWMgdm9pZCBzZXJ2aWNlT3V0Z29pbmdGaWZvKGkyZUJvcmRTdHJQdHIpOworCisvLyBGdW5jdGlvbnMgZGVmaW5lZCBpbiBpcDIuYyBhcyBwYXJ0IG9mIGludGVycnVwdCBoYW5kbGluZworc3RhdGljIHZvaWQgZG9faW5wdXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIGRvX3N0YXR1cyh2b2lkICopOworCisvLyoqKioqKioqKioqKioqKgorLy8qIERlYnVnICBEYXRhICoKKy8vKioqKioqKioqKioqKioqCisjaWZkZWYgREVCVUdfRklGTworCit1bnNpZ25lZCBjaGFyIERCR0J1ZlsweDQwMDBdOwordW5zaWduZWQgc2hvcnQgSSA9IDA7CisKK3N0YXRpYyB2b2lkCitXcml0ZURCR0J1ZihjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIHNob3J0IG4gKSAKK3sKKwljaGFyICpwID0gc3JjOworCisJLy8gWFhYOiBXZSBuZWVkIGEgc3BpbiBsb2NrIGhlcmUgaWYgd2UgZXZlciB1c2UgdGhpcyBhZ2FpbgorCisJd2hpbGUgKCpzKSB7CS8vIGNvcHkgbGFiZWwKKwkJREJHQnVmW0ldID0gKnMrKzsKKwkJSSA9IEkrKyAmIDB4M2ZmZjsKKwl9CisJd2hpbGUgKG4tLSkgewkvLyBjb3B5IGRhdGEKKwkJREJHQnVmW0ldID0gKnArKzsKKwkJSSA9IEkrKyAmIDB4M2ZmZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitmYXRhbGl0eShpMmVCb3JkU3RyUHRyIHBCICkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wO2k8c2l6ZW9mKERCR0J1Zik7aSsrKSB7CisJCWlmICgoaSUxNikgPT0gMCkKKwkJCXByaW50aygiXG4lNHg6IixpKTsKKwkJcHJpbnRrKCIlMDJ4ICIsREJHQnVmW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCWZvciAoaT0wO2k8c2l6ZW9mKERCR0J1Zik7aSsrKSB7CisJCWlmICgoaSUxNikgPT0gMCkKKwkJCXByaW50aygiXG4lNHg6IixpKTsKKwkJaWYgKERCR0J1ZltpXSA+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+PSAwICovCit9OworCitzdGF0aWMgaW50IGlwbWlfaW5pdF9tc2doYW5kbGVyKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoaW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaXBtaSBtZXNzYWdlIGhhbmRsZXIgdmVyc2lvbiAiCisJICAgICAgIElQTUlfTVNHSEFORExFUl9WRVJTSU9OICJcbiIpOworCisJZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJCWlwbWlfaW50ZXJmYWNlc1tpXSA9IE5VTEw7CisJfQorCisJcHJvY19pcG1pX3Jvb3QgPSBwcm9jX21rZGlyKCJpcG1pIiwgTlVMTCk7CisJaWYgKCFwcm9jX2lwbWlfcm9vdCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gY3JlYXRlIElQTUkgcHJvYyBkaXIiKTsKKwkgICAgcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJvY19pcG1pX3Jvb3QtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlpbml0X3RpbWVyKCZpcG1pX3RpbWVyKTsKKwlpcG1pX3RpbWVyLmRhdGEgPSAwOworCWlwbWlfdGltZXIuZnVuY3Rpb24gPSBpcG1pX3RpbWVvdXQ7CisJaXBtaV90aW1lci5leHBpcmVzID0gamlmZmllcyArIElQTUlfVElNRU9VVF9KSUZGSUVTOworCWFkZF90aW1lcigmaXBtaV90aW1lcik7CisKKwlub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX2Jsb2NrKTsKKworCWluaXRpYWxpemVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbml0IGludCBpcG1pX2luaXRfbXNnaGFuZGxlcl9tb2Qodm9pZCkKK3sKKwlpcG1pX2luaXRfbXNnaGFuZGxlcigpOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgY2xlYW51cF9pcG1pKHZvaWQpCit7CisJaW50IGNvdW50OworCisJaWYgKCFpbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX2Jsb2NrKTsKKworCS8qIFRoaXMgY2FuJ3QgYmUgY2FsbGVkIGlmIGFueSBpbnRlcmZhY2VzIGV4aXN0LCBzbyBubyB3b3JyeSBhYm91dAorCSAgIHNodXR0aW5nIGRvd24gdGhlIGludGVyZmFjZXMuICovCisKKwkvKiBUZWxsIHRoZSB0aW1lciB0byBzdG9wLCB0aGVuIHdhaXQgZm9yIGl0IHRvIHN0b3AuICBUaGlzIGF2b2lkcworCSAgIHByb2JsZW1zIHdpdGggcmFjZSBjb25kaXRpb25zIHJlbW92aW5nIHRoZSB0aW1lciBoZXJlLiAqLworCXN0b3Bfb3BlcmF0aW9uID0gMTsKKwl3aGlsZSAoIXRpbWVyX3N0b3BwZWQpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfaXBtaV9yb290LT5uYW1lLCAmcHJvY19yb290KTsKKworCWluaXRpYWxpemVkID0gMDsKKworCS8qIENoZWNrIGZvciBidWZmZXIgbGVha3MuICovCisJY291bnQgPSBhdG9taWNfcmVhZCgmc21pX21zZ19pbnVzZV9jb3VudCk7CisJaWYgKGNvdW50ICE9IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJTTUkgbWVzc2FnZSBjb3VudCAlZCBhdCBleGl0XG4iLAorCQkgICAgICAgY291bnQpOworCWNvdW50ID0gYXRvbWljX3JlYWQoJnJlY3ZfbXNnX2ludXNlX2NvdW50KTsKKwlpZiAoY291bnQgIT0gMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInJlY3YgbWVzc2FnZSBjb3VudCAlZCBhdCBleGl0XG4iLAorCQkgICAgICAgY291bnQpOworfQorbW9kdWxlX2V4aXQoY2xlYW51cF9pcG1pKTsKKworbW9kdWxlX2luaXQoaXBtaV9pbml0X21zZ2hhbmRsZXJfbW9kKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChpcG1pX2NyZWF0ZV91c2VyKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9kZXN0cm95X3VzZXIpOworRVhQT1JUX1NZTUJPTChpcG1pX2dldF92ZXJzaW9uKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9yZXF1ZXN0X3NldHRpbWUpOworRVhQT1JUX1NZTUJPTChpcG1pX3JlcXVlc3Rfc3VwcGx5X21zZ3MpOworRVhQT1JUX1NZTUJPTChpcG1pX3JlZ2lzdGVyX3NtaSk7CitFWFBPUlRfU1lNQk9MKGlwbWlfdW5yZWdpc3Rlcl9zbWkpOworRVhQT1JUX1NZTUJPTChpcG1pX3JlZ2lzdGVyX2Zvcl9jbWQpOworRVhQT1JUX1NZTUJPTChpcG1pX3VucmVnaXN0ZXJfZm9yX2NtZCk7CitFWFBPUlRfU1lNQk9MKGlwbWlfc21pX21zZ19yZWNlaXZlZCk7CitFWFBPUlRfU1lNQk9MKGlwbWlfc21pX3dhdGNoZG9nX3ByZXRpbWVvdXQpOworRVhQT1JUX1NZTUJPTChpcG1pX2FsbG9jX3NtaV9tc2cpOworRVhQT1JUX1NZTUJPTChpcG1pX2FkZHJfbGVuZ3RoKTsKK0VYUE9SVF9TWU1CT0woaXBtaV92YWxpZGF0ZV9hZGRyKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9zZXRfZ2V0c19ldmVudHMpOworRVhQT1JUX1NZTUJPTChpcG1pX3NtaV93YXRjaGVyX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaXBtaV9zZXRfbXlfYWRkcmVzcyk7CitFWFBPUlRfU1lNQk9MKGlwbWlfZ2V0X215X2FkZHJlc3MpOworRVhQT1JUX1NZTUJPTChpcG1pX3NldF9teV9MVU4pOworRVhQT1JUX1NZTUJPTChpcG1pX2dldF9teV9MVU4pOworRVhQT1JUX1NZTUJPTChpcG1pX3NtaV9hZGRfcHJvY19lbnRyeSk7CitFWFBPUlRfU1lNQk9MKGlwbWlfdXNlcl9zZXRfcnVuX3RvX2NvbXBsZXRpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNWNkYzZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCkBAIC0wLDAgKzEsNTQ5IEBACisvKgorICogaXBtaV9wb3dlcm9mZi5jCisgKgorICogTW9udGFWaXN0YSBJUE1JIFBvd2Vyb2ZmIGV4dGVuc2lvbiB0byBzeXNfcmVib290CisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIFN0ZXZlbiBEYWtlIDxzZGFrZUBtdmlzdGEuY29tPgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxjbWlueWFyZEBtdmlzdGEuY29tPgorICogICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwbWlfc21pLmg+CisKKyNkZWZpbmUgUEZYICJJUE1JIHBvd2Vyb2ZmOiAiCisjZGVmaW5lIElQTUlfUE9XRVJPRkZfVkVSU0lPTgkidjMzIgorCisvKiBXaGVyZSB0byB3ZSBpbnNlcnQgb3VyIHBvd2Vyb2ZmIGZ1bmN0aW9uPyAqLworZXh0ZXJuIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOworCisvKiBTdHVmZiBmcm9tIHRoZSBnZXQgZGV2aWNlIGlkIGNvbW1hbmQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1mZ19pZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJvZF9pZDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNhcGFiaWxpdGllczsKKworLyogV2UgdXNlIG91ciBvd24gbWVzc2FnZXMgZm9yIHRoaXMgb3BlcmF0aW9uLCB3ZSBkb24ndCBsZXQgdGhlIHN5c3RlbQorICAgYWxsb2NhdGUgdGhlbSwgc2luY2Ugd2UgbWF5IGJlIGluIGEgcGFuaWMgc2l0dWF0aW9uLiAgVGhlIHdob2xlCisgICB0aGluZyBpcyBzaW5nbGUtdGhyZWFkZWQsIGFueXdheSwgc28gbXVsdGlwbGUgbWVzc2FnZXMgYXJlIG5vdAorICAgcmVxdWlyZWQuICovCitzdGF0aWMgdm9pZCBkdW1teV9zbWlfZnJlZShzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7Cit9CitzdGF0aWMgdm9pZCBkdW1teV9yZWN2X2ZyZWUoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKK3sKK30KK3N0YXRpYyBzdHJ1Y3QgaXBtaV9zbWlfbXNnIGhhbHRfc21pX21zZyA9Cit7CisJLmRvbmUgPSBkdW1teV9zbWlfZnJlZQorfTsKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9yZWN2X21zZyBoYWx0X3JlY3ZfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3JlY3ZfZnJlZQorfTsKKworCisvKgorICogQ29kZSB0byBzZW5kIGEgbWVzc2FnZSBhbmQgd2FpdCBmb3IgdGhlIHJlcG9uc2UuCisgKi8KKworc3RhdGljIHZvaWQgcmVjZWl2ZV9oYW5kbGVyKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZywgdm9pZCAqaGFuZGxlcl9kYXRhKQoreworCXN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IHJlY3ZfbXNnLT51c2VyX21zZ19kYXRhOworCisJaWYgKHNlbSkKKwkJdXAoc2VtKTsKK30KKworc3RhdGljIHN0cnVjdCBpcG1pX3VzZXJfaG5kbCBpcG1pX3Bvd2Vyb2ZmX2hhbmRsZXIgPQoreworCS5pcG1pX3JlY3ZfaG5kbCA9IHJlY2VpdmVfaGFuZGxlcgorfTsKKworCitzdGF0aWMgaW50IGlwbWlfcmVxdWVzdF93YWl0X2Zvcl9yZXNwb25zZShpcG1pX3VzZXJfdCAgICAgICAgICAgIHVzZXIsCisJCQkJCSAgc3RydWN0IGlwbWlfYWRkciAgICAgICAqYWRkciwKKwkJCQkJICBzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICpzZW5kX21zZykKK3sKKwlpbnQgICAgICAgICAgICAgIHJ2OworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCisJc2VtYV9pbml0ICgmc2VtLCAwKTsKKworCXJ2ID0gaXBtaV9yZXF1ZXN0X3N1cHBseV9tc2dzKHVzZXIsIGFkZHIsIDAsIHNlbmRfbXNnLCAmc2VtLAorCQkJCSAgICAgICZoYWx0X3NtaV9tc2csICZoYWx0X3JlY3ZfbXNnLCAwKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCWRvd24gKCZzZW0pOworCisJcmV0dXJuIGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMF07Cit9CisKKy8qIFdlIGFyZSBpbiBydW4tdG8tY29tcGxldGlvbiBtb2RlLCBubyBzZW1hcGhvcmUgaXMgZGVzaXJlZC4gKi8KK3N0YXRpYyBpbnQgaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUoaXBtaV91c2VyX3QgICAgICAgICAgICB1c2VyLAorCQkJCSAgIHN0cnVjdCBpcG1pX2FkZHIgICAgICAgKmFkZHIsCisJCQkJICAgc3RydWN0IGtlcm5lbF9pcG1pX21zZyAqc2VuZF9tc2cpCit7CisJaW50ICAgICAgICAgICAgICBydjsKKworCXJ2ID0gaXBtaV9yZXF1ZXN0X3N1cHBseV9tc2dzKHVzZXIsIGFkZHIsIDAsIHNlbmRfbXNnLCBOVUxMLAorCQkJCSAgICAgICZoYWx0X3NtaV9tc2csICZoYWx0X3JlY3ZfbXNnLCAwKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCXJldHVybiBoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzBdOworfQorCisvKgorICogQVRDQSBTdXBwb3J0CisgKi8KKworI2RlZmluZSBJUE1JX05FVEZOX0FUQ0EJCQkweDJjCisjZGVmaW5lIElQTUlfQVRDQV9TRVRfUE9XRVJfQ01ECQkweDExCisjZGVmaW5lIElQTUlfQVRDQV9HRVRfQUREUl9JTkZPX0NNRAkweDAxCisjZGVmaW5lIElQTUlfUElDTUdfSUQJCQkwCisKK3N0YXRpYyBpbnQgaXBtaV9hdGNhX2RldGVjdCAoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgc21pX2FkZHI7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIHNlbmRfbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb25maWd1cmUgSVBNSSBhZGRyZXNzIGZvciBsb2NhbCBhY2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIHNtaV9hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisgICAgICAgIHNtaV9hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworICAgICAgICBzbWlfYWRkci5sdW4gPSAwOworCisJLyoKKwkgKiBVc2UgZ2V0IGFkZHJlc3MgaW5mbyB0byBjaGVjayBhbmQgc2VlIGlmIHdlIGFyZSBBVENBCisJICovCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX0FUQ0E7CisJc2VuZF9tc2cuY21kID0gSVBNSV9BVENBX0dFVF9BRERSX0lORk9fQ01EOworCWRhdGFbMF0gPSBJUE1JX1BJQ01HX0lEOworCXNlbmRfbXNnLmRhdGEgPSBkYXRhOworCXNlbmRfbXNnLmRhdGFfbGVuID0gc2l6ZW9mKGRhdGEpOworCXJ2ID0gaXBtaV9yZXF1ZXN0X3dhaXRfZm9yX3Jlc3BvbnNlKHVzZXIsCisJCQkJCSAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmc21pX2FkZHIsCisJCQkJCSAgICAmc2VuZF9tc2cpOworCXJldHVybiAhcnY7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfcG93ZXJvZmZfYXRjYSAoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgc21pX2FkZHI7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIHNlbmRfbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVs0XTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb25maWd1cmUgSVBNSSBhZGRyZXNzIGZvciBsb2NhbCBhY2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIHNtaV9hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisgICAgICAgIHNtaV9hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworICAgICAgICBzbWlfYWRkci5sdW4gPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlBvd2VyaW5nIGRvd24gdmlhIEFUQ0EgcG93ZXIgY29tbWFuZFxuIik7CisKKwkvKgorCSAqIFBvd2VyIGRvd24KKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fQVRDQTsKKwlzZW5kX21zZy5jbWQgPSBJUE1JX0FUQ0FfU0VUX1BPV0VSX0NNRDsKKwlkYXRhWzBdID0gSVBNSV9QSUNNR19JRDsKKwlkYXRhWzFdID0gMDsgLyogRlJVIGlkICovCisJZGF0YVsyXSA9IDA7IC8qIFBvd2VyIExldmVsICovCisJZGF0YVszXSA9IDA7IC8qIERvbid0IGNoYW5nZSBzYXZlZCBwcmVzZXRzICovCisJc2VuZF9tc2cuZGF0YSA9IGRhdGE7CisJc2VuZF9tc2cuZGF0YV9sZW4gPSBzaXplb2YgKGRhdGEpOworCXJ2ID0gaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKKwkJCQkgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkgICAgICZzZW5kX21zZyk7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBzZW5kIEFUQ0EgcG93ZXJkb3duIG1lc3NhZ2UsIgorCQkgICAgICAgIiBJUE1JIGVycm9yIDB4JXhcbiIsIHJ2KTsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OgorCXJldHVybjsKK30KKworLyoKKyAqIENQSTEgU3VwcG9ydAorICovCisKKyNkZWZpbmUgSVBNSV9ORVRGTl9PRU1fMQkJCQkweGY4CisjZGVmaW5lIE9FTV9HUlBfQ01EX1NFVF9SRVNFVF9TVEFURQkJMHg4NAorI2RlZmluZSBPRU1fR1JQX0NNRF9TRVRfUE9XRVJfU1RBVEUJCTB4ODIKKyNkZWZpbmUgSVBNSV9ORVRGTl9PRU1fOAkJCQkweGY4CisjZGVmaW5lIE9FTV9HUlBfQ01EX1JFUVVFU1RfSE9UU1dBUF9DVFJMCTB4ODAKKyNkZWZpbmUgT0VNX0dSUF9DTURfR0VUX1NMT1RfR0EJCQkweGEzCisjZGVmaW5lIElQTUlfTkVURk5fU0VOU09SX0VWVAkJCTB4MTAKKyNkZWZpbmUgSVBNSV9DTURfR0VUX0VWRU5UX1JFQ0VJVkVSCQkweDAxCisKKyNkZWZpbmUgSVBNSV9DUEkxX1BST0RVQ1RfSUQJCTB4MDAwMTU3CisjZGVmaW5lIElQTUlfQ1BJMV9NQU5VRkFDVFVSRVJfSUQJMHgwMTA4CisKK3N0YXRpYyBpbnQgaXBtaV9jcGkxX2RldGVjdCAoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlyZXR1cm4gKChtZmdfaWQgPT0gSVBNSV9DUEkxX01BTlVGQUNUVVJFUl9JRCkKKwkJJiYgKHByb2RfaWQgPT0gSVBNSV9DUEkxX1BST0RVQ1RfSUQpKTsKK30KKworc3RhdGljIHZvaWQgaXBtaV9wb3dlcm9mZl9jcGkxIChpcG1pX3VzZXJfdCB1c2VyKQoreworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciBzbWlfYWRkcjsKKwlzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgICAgICAgICAgICAgaXBtYl9hZGRyOworCXN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgICAgICAgICAgICBzZW5kX21zZzsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnY7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV07CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3Q7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIGhvdHN3YXBfaXBtYjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgYWVyX2FkZHI7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIGFlcl9sdW47CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29uZmlndXJlIElQTUkgYWRkcmVzcyBmb3IgbG9jYWwgYWNjZXNzCisgICAgICAgICAqLworICAgICAgICBzbWlfYWRkci5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworICAgICAgICBzbWlfYWRkci5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKKyAgICAgICAgc21pX2FkZHIubHVuID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJQb3dlcmluZyBkb3duIHZpYSBDUEkxIHBvd2VyIGNvbW1hbmRcbiIpOworCisJLyoKKwkgKiBHZXQgSVBNSSBpcG1iIGFkZHJlc3MKKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fT0VNXzggPj4gMjsKKwlzZW5kX21zZy5jbWQgPSBPRU1fR1JQX0NNRF9HRVRfU0xPVF9HQTsKKwlzZW5kX21zZy5kYXRhID0gTlVMTDsKKwlzZW5kX21zZy5kYXRhX2xlbiA9IDA7CisJcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAorCQkJCSAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAorCQkJCSAgICAgJnNlbmRfbXNnKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OworCXNsb3QgPSBoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzFdOworCWhvdHN3YXBfaXBtYiA9IChzbG90ID4gOSkgPyAoMHhiMCArIDIgKiBzbG90KSA6ICgweGFlICsgMiAqIHNsb3QpOworCisJLyoKKwkgKiBHZXQgYWN0aXZlIGV2ZW50IHJlY2VpdmVyCisJICovCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX1NFTlNPUl9FVlQgPj4gMjsKKwlzZW5kX21zZy5jbWQgPSBJUE1JX0NNRF9HRVRfRVZFTlRfUkVDRUlWRVI7CisJc2VuZF9tc2cuZGF0YSA9IE5VTEw7CisJc2VuZF9tc2cuZGF0YV9sZW4gPSAwOworCXJ2ID0gaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKKwkJCQkgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkgICAgICZzZW5kX21zZyk7CisJaWYgKHJ2KQorCQlnb3RvIG91dDsKKwlhZXJfYWRkciA9IGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMV07CisJYWVyX2x1biA9IGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMl07CisKKwkvKgorCSAqIFNldHVwIElQTUIgYWRkcmVzcyB0YXJnZXQgaW5zdGVhZCBvZiBsb2NhbCB0YXJnZXQKKwkgKi8KKwlpcG1iX2FkZHIuYWRkcl90eXBlID0gSVBNSV9JUE1CX0FERFJfVFlQRTsKKwlpcG1iX2FkZHIuY2hhbm5lbCA9IDA7CisJaXBtYl9hZGRyLnNsYXZlX2FkZHIgPSBhZXJfYWRkcjsKKwlpcG1iX2FkZHIubHVuID0gYWVyX2x1bjsKKworCS8qCisJICogU2VuZCByZXF1ZXN0IGhvdHN3YXAgY29udHJvbCB0byByZW1vdmUgYmxhZGUgZnJvbSBkcHYKKwkgKi8KKwlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fT0VNXzggPj4gMjsKKwlzZW5kX21zZy5jbWQgPSBPRU1fR1JQX0NNRF9SRVFVRVNUX0hPVFNXQVBfQ1RSTDsKKwlzZW5kX21zZy5kYXRhID0gJmhvdHN3YXBfaXBtYjsKKwlzZW5kX21zZy5kYXRhX2xlbiA9IDE7CisJaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKKwkJCQkoc3RydWN0IGlwbWlfYWRkciAqKSAmaXBtYl9hZGRyLAorCQkJCSZzZW5kX21zZyk7CisKKwkvKgorCSAqIFNldCByZXNldCBhc3NlcnRlZAorCSAqLworCXNlbmRfbXNnLm5ldGZuID0gSVBNSV9ORVRGTl9PRU1fMSA+PiAyOworCXNlbmRfbXNnLmNtZCA9IE9FTV9HUlBfQ01EX1NFVF9SRVNFVF9TVEFURTsKKwlzZW5kX21zZy5kYXRhID0gZGF0YTsKKwlkYXRhWzBdID0gMTsgLyogUmVzZXQgYXNzZXJ0ZWQgc3RhdGUgKi8KKwlzZW5kX21zZy5kYXRhX2xlbiA9IDE7CisJcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAorCQkJCSAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAorCQkJCSAgICAgJnNlbmRfbXNnKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBQb3dlciBkb3duCisJICovCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX09FTV8xID4+IDI7CisJc2VuZF9tc2cuY21kID0gT0VNX0dSUF9DTURfU0VUX1BPV0VSX1NUQVRFOworCXNlbmRfbXNnLmRhdGEgPSBkYXRhOworCWRhdGFbMF0gPSAxOyAvKiBQb3dlciBkb3duIHN0YXRlICovCisJc2VuZF9tc2cuZGF0YV9sZW4gPSAxOworCXJ2ID0gaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKKwkJCQkgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkgICAgICZzZW5kX21zZyk7CisJaWYgKHJ2KQorCQlnb3RvIG91dDsKKworIG91dDoKKwlyZXR1cm47Cit9CisKKy8qCisgKiBTdGFuZGFyZCBjaGFzc2lzIHN1cHBvcnQKKyAqLworCisjZGVmaW5lIElQTUlfTkVURk5fQ0hBU1NJU19SRVFVRVNUCTAKKyNkZWZpbmUgSVBNSV9DSEFTU0lTX0NPTlRST0xfQ01ECTB4MDIKKworc3RhdGljIGludCBpcG1pX2NoYXNzaXNfZGV0ZWN0IChpcG1pX3VzZXJfdCB1c2VyKQoreworCS8qIENoYXNzaXMgc3VwcG9ydCwgdXNlIGl0LiAqLworCXJldHVybiAoY2FwYWJpbGl0aWVzICYgMHg4MCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfcG93ZXJvZmZfY2hhc3NpcyAoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgc21pX2FkZHI7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIHNlbmRfbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb25maWd1cmUgSVBNSSBhZGRyZXNzIGZvciBsb2NhbCBhY2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIHNtaV9hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisgICAgICAgIHNtaV9hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworICAgICAgICBzbWlfYWRkci5sdW4gPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlBvd2VyaW5nIGRvd24gdmlhIElQTUkgY2hhc3NpcyBjb250cm9sIGNvbW1hbmRcbiIpOworCisJLyoKKwkgKiBQb3dlciBkb3duCisJICovCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX0NIQVNTSVNfUkVRVUVTVDsKKwlzZW5kX21zZy5jbWQgPSBJUE1JX0NIQVNTSVNfQ09OVFJPTF9DTUQ7CisJZGF0YVswXSA9IDA7IC8qIFBvd2VyIGRvd24gKi8KKwlzZW5kX21zZy5kYXRhID0gZGF0YTsKKwlzZW5kX21zZy5kYXRhX2xlbiA9IHNpemVvZihkYXRhKTsKKwlydiA9IGlwbWlfcmVxdWVzdF9pbl9yY19tb2RlKHVzZXIsCisJCQkJICAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmc21pX2FkZHIsCisJCQkJICAgICAmc2VuZF9tc2cpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gc2VuZCBjaGFzc2lzIHBvd2VyZG93biBtZXNzYWdlLCIKKwkJICAgICAgICIgSVBNSSBlcnJvciAweCV4XG4iLCBydik7CisJCWdvdG8gb3V0OworCX0KKworIG91dDoKKwlyZXR1cm47Cit9CisKKworLyogVGFibGUgb2YgcG9zc2libGUgcG93ZXIgb2ZmIGZ1bmN0aW9ucy4gKi8KK3N0cnVjdCBwb3dlcm9mZl9mdW5jdGlvbiB7CisJY2hhciAqcGxhdGZvcm1fdHlwZTsKKwlpbnQgICgqZGV0ZWN0KShpcG1pX3VzZXJfdCB1c2VyKTsKKwl2b2lkICgqcG93ZXJvZmZfZnVuYykoaXBtaV91c2VyX3QgdXNlcik7Cit9OworCitzdGF0aWMgc3RydWN0IHBvd2Vyb2ZmX2Z1bmN0aW9uIHBvd2Vyb2ZmX2Z1bmN0aW9uc1tdID0geworCXsgLnBsYXRmb3JtX3R5cGUJPSAiQVRDQSIsCisJICAuZGV0ZWN0CQk9IGlwbWlfYXRjYV9kZXRlY3QsCisJICAucG93ZXJvZmZfZnVuYwk9IGlwbWlfcG93ZXJvZmZfYXRjYSB9LAorCXsgLnBsYXRmb3JtX3R5cGUJPSAiQ1BJMSIsCisJICAuZGV0ZWN0CQk9IGlwbWlfY3BpMV9kZXRlY3QsCisJICAucG93ZXJvZmZfZnVuYwk9IGlwbWlfcG93ZXJvZmZfY3BpMSB9LAorCS8qIENoYXNzaXMgc2hvdWxkIGdlbmVyYWxseSBiZSBsYXN0LCBvdGhlciB0aGluZ3Mgc2hvdWxkIG92ZXJyaWRlCisJICAgaXQuICovCisJeyAucGxhdGZvcm1fdHlwZQk9ICJjaGFzc2lzIiwKKwkgIC5kZXRlY3QJCT0gaXBtaV9jaGFzc2lzX2RldGVjdCwKKwkgIC5wb3dlcm9mZl9mdW5jCT0gaXBtaV9wb3dlcm9mZl9jaGFzc2lzIH0sCit9OworI2RlZmluZSBOVU1fUE9fRlVOQ1MgKHNpemVvZihwb3dlcm9mZl9mdW5jdGlvbnMpIFwKKwkJICAgICAgLyBzaXplb2Yoc3RydWN0IHBvd2Vyb2ZmX2Z1bmN0aW9uKSkKKworCisvKiBPdXIgbG9jYWwgc3RhdGUuICovCitzdGF0aWMgaW50IHJlYWR5ID0gMDsKK3N0YXRpYyBpcG1pX3VzZXJfdCBpcG1pX3VzZXI7CitzdGF0aWMgdm9pZCAoKnNwZWNpZmljX3Bvd2Vyb2ZmX2Z1bmMpKGlwbWlfdXNlcl90IHVzZXIpID0gTlVMTDsKKworLyogSG9sZHMgdGhlIG9sZCBwb3dlcm9mZiBmdW5jdGlvbiBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBvbiByZW1vdmFsLiAqLworc3RhdGljIHZvaWQgKCpvbGRfcG93ZXJvZmZfZnVuYykodm9pZCk7CisKKworLyogQ2FsbGVkIG9uIGEgcG93ZXJkb3duIHJlcXVlc3QuICovCitzdGF0aWMgdm9pZCBpcG1pX3Bvd2Vyb2ZmX2Z1bmN0aW9uICh2b2lkKQoreworCWlmICghcmVhZHkpCisJCXJldHVybjsKKworCS8qIFVzZSBydW4tdG8tY29tcGxldGlvbiBtb2RlLCBzaW5jZSBpbnRlcnJ1cHRzIG1heSBiZSBvZmYuICovCisJaXBtaV91c2VyX3NldF9ydW5fdG9fY29tcGxldGlvbihpcG1pX3VzZXIsIDEpOworCXNwZWNpZmljX3Bvd2Vyb2ZmX2Z1bmMoaXBtaV91c2VyKTsKKwlpcG1pX3VzZXJfc2V0X3J1bl90b19jb21wbGV0aW9uKGlwbWlfdXNlciwgMCk7Cit9CisKKy8qIFdhaXQgZm9yIGFuIElQTUkgaW50ZXJmYWNlIHRvIGJlIGluc3RhbGxlZCwgdGhlIGZpcnN0IG9uZSBpbnN0YWxsZWQKKyAgIHdpbGwgYmUgZ3JhYmJlZCBieSB0aGlzIGNvZGUgYW5kIHVzZWQgdG8gcGVyZm9ybSB0aGUgcG93ZXJkb3duLiAqLworc3RhdGljIHZvaWQgaXBtaV9wb19uZXdfc21pKGludCBpZl9udW0pCit7CisJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyIHNtaV9hZGRyOworCXN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgICAgICAgICAgICBzZW5kX21zZzsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnY7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisKKwlpZiAocmVhZHkpCisJCXJldHVybjsKKworCXJ2ID0gaXBtaV9jcmVhdGVfdXNlcihpZl9udW0sICZpcG1pX3Bvd2Vyb2ZmX2hhbmRsZXIsIE5VTEwsICZpcG1pX3VzZXIpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjb3VsZCBub3QgY3JlYXRlIElQTUkgdXNlciwgZXJyb3IgJWRcbiIsCisJCSAgICAgICBydik7CisJCXJldHVybjsKKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRG8gYSBnZXQgZGV2aWNlIGlkZSBhbmQgc3RvcmUgc29tZSByZXN1bHRzLCBzaW5jZSB0aGlzIGlzCisJICogdXNlZCBieSBzZXZlcmFsIGZ1bmN0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIHNtaV9hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisgICAgICAgIHNtaV9hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworICAgICAgICBzbWlfYWRkci5sdW4gPSAwOworCisJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX0FQUF9SRVFVRVNUOworCXNlbmRfbXNnLmNtZCA9IElQTUlfR0VUX0RFVklDRV9JRF9DTUQ7CisJc2VuZF9tc2cuZGF0YSA9IE5VTEw7CisJc2VuZF9tc2cuZGF0YV9sZW4gPSAwOworCXJ2ID0gaXBtaV9yZXF1ZXN0X3dhaXRfZm9yX3Jlc3BvbnNlKGlwbWlfdXNlciwKKwkJCQkJICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKwkJCQkJICAgICZzZW5kX21zZyk7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBzZW5kIElQTUkgZ2V0IGRldmljZSBpZCBpbmZvLCIKKwkJICAgICAgICIgSVBNSSBlcnJvciAweCV4XG4iLCBydik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoaGFsdF9yZWN2X21zZy5tc2cuZGF0YV9sZW4gPCAxMikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIoY2hhc3NpcykgSVBNSSBnZXQgZGV2aWNlIGlkIGluZm8gdG9vLCIKKwkJICAgICAgICIgc2hvcnQsIHdhcyAlZCBieXRlcywgbmVlZGVkICVkIGJ5dGVzXG4iLAorCQkgICAgICAgaGFsdF9yZWN2X21zZy5tc2cuZGF0YV9sZW4sIDEyKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCW1mZ19pZCA9IChoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzddCisJCSAgfCAoaGFsdF9yZWN2X21zZy5tc2cuZGF0YVs4XSA8PCA4KQorCQkgIHwgKGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbOV0gPDwgMTYpKTsKKwlwcm9kX2lkID0gKGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMTBdCisJCSAgIHwgKGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMTFdIDw8IDgpKTsKKwljYXBhYmlsaXRpZXMgPSBoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzZdOworCisKKwkvKiBTY2FuIGZvciBhIHBvd2Vyb2ZmIG1ldGhvZCAqLworCWZvciAoaT0wOyBpPE5VTV9QT19GVU5DUzsgaSsrKSB7CisJCWlmIChwb3dlcm9mZl9mdW5jdGlvbnNbaV0uZGV0ZWN0KGlwbWlfdXNlcikpCisJCQlnb3RvIGZvdW5kOworCX0KKworIG91dF9lcnI6CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGZpbmQgYSBwb3dlcm9mZiBmdW5jdGlvbiB0aGF0IgorCSAgICAgICAiIHdpbGwgd29yaywgZ2l2aW5nIHVwXG4iKTsKKwlpcG1pX2Rlc3Ryb3lfdXNlcihpcG1pX3VzZXIpOworCXJldHVybjsKKworIGZvdW5kOgorCXByaW50ayhLRVJOX0lORk8gUEZYICJGb3VuZCBhICVzIHN0eWxlIHBvd2Vyb2ZmIGZ1bmN0aW9uXG4iLAorCSAgICAgICBwb3dlcm9mZl9mdW5jdGlvbnNbaV0ucGxhdGZvcm1fdHlwZSk7CisJc3BlY2lmaWNfcG93ZXJvZmZfZnVuYyA9IHBvd2Vyb2ZmX2Z1bmN0aW9uc1tpXS5wb3dlcm9mZl9mdW5jOworCW9sZF9wb3dlcm9mZl9mdW5jID0gcG1fcG93ZXJfb2ZmOworCXBtX3Bvd2VyX29mZiA9IGlwbWlfcG93ZXJvZmZfZnVuY3Rpb247CisJcmVhZHkgPSAxOworfQorCitzdGF0aWMgdm9pZCBpcG1pX3BvX3NtaV9nb25lKGludCBpZl9udW0pCit7CisJLyogVGhpcyBjYW4gbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIG9uY2UgcG93ZXJvZmYgZHJpdmVyIGlzCisJICAgcmVnaXN0ZXJlZCwgdGhlIGludGVyZmFjZSBjYW4ndCBnbyBhd2F5IHVudGlsIHRoZSBwb3dlcgorCSAgIGRyaXZlciBpcyB1bnJlZ2lzdGVyZWQuICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9zbWlfd2F0Y2hlciBzbWlfd2F0Y2hlciA9Cit7CisJLm93bmVyICAgID0gVEhJU19NT0RVTEUsCisJLm5ld19zbWkgID0gaXBtaV9wb19uZXdfc21pLAorCS5zbWlfZ29uZSA9IGlwbWlfcG9fc21pX2dvbmUKK307CisKKworLyoKKyAqIFN0YXJ0dXAgYW5kIHNodXRkb3duIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGludCBpcG1pX3Bvd2Vyb2ZmX2luaXQgKHZvaWQpCit7CisJaW50IHJ2OworCisJcHJpbnRrICgiQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUgLSIKKwkJIiBJUE1JIFBvd2VyZG93biB2aWEgc3lzX3JlYm9vdCB2ZXJzaW9uICIKKwkJSVBNSV9QT1dFUk9GRl9WRVJTSU9OICIuXG4iKTsKKworCXJ2ID0gaXBtaV9zbWlfd2F0Y2hlcl9yZWdpc3Rlcigmc21pX3dhdGNoZXIpOworCWlmIChydikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIFNNSSB3YXRjaGVyOiAlZFxuIiwgcnYpOworCisJcmV0dXJuIHJ2OworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgX19leGl0IHZvaWQgaXBtaV9wb3dlcm9mZl9jbGVhbnVwKHZvaWQpCit7CisJaW50IHJ2OworCisJaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CisKKwlpZiAocmVhZHkpIHsKKwkJcnYgPSBpcG1pX2Rlc3Ryb3lfdXNlcihpcG1pX3VzZXIpOworCQlpZiAocnYpCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJjb3VsZCBub3QgY2xlYW51cCB0aGUgSVBNSSIKKwkJCSAgICAgICAiIHVzZXI6IDB4JXhcbiIsIHJ2KTsKKwkJcG1fcG93ZXJfb2ZmID0gb2xkX3Bvd2Vyb2ZmX2Z1bmM7CisJfQorfQorbW9kdWxlX2V4aXQoaXBtaV9wb3dlcm9mZl9jbGVhbnVwKTsKKyNlbmRpZgorCittb2R1bGVfaW5pdChpcG1pX3Bvd2Vyb2ZmX2luaXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWRlMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKQEAgLTAsMCArMSwyMzU5IEBACisvKgorICogaXBtaV9zaS5jCisgKgorICogVGhlIGludGVyZmFjZSB0byB0aGUgSVBNSSBkcml2ZXIgZm9yIHRoZSBzeXN0ZW0gaW50ZXJmYWNlcyAoS0NTLCBTTUlDLAorICogQlQpLgorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBob2xkcyB0aGUgInBvbGljeSIgZm9yIHRoZSBpbnRlcmZhY2UgdG8gdGhlIFNNSSBzdGF0ZQorICogbWFjaGluZS4gIEl0IGRvZXMgdGhlIGNvbmZpZ3VyYXRpb24sIGhhbmRsZXMgdGltZXJzIGFuZCBpbnRlcnJ1cHRzLAorICogYW5kIGRyaXZlcyB0aGUgcmVhbCBTTUkgc3RhdGUgbWFjaGluZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKyNpbmNsdWRlIDxsaW51eC9ocnRpbWUuaD4KKyMgaWYgZGVmaW5lZChzY2hlZHVsZV9uZXh0X2ludCkKKy8qIE9sZCBoaWdoLXJlcyB0aW1lciBjb2RlLCBkbyB0cmFuc2xhdGlvbnMuICovCisjICBkZWZpbmUgZ2V0X2FyY2hfY3ljbGVzKGEpIHF1aWNrX3VwZGF0ZV9qaWZmaWVzX3N1YihhKQorIyAgZGVmaW5lIGFyY2hfY3ljbGVzX3Blcl9qaWZmeSBjeWNsZXNfcGVyX2ppZmZpZXMKKyMgZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfdXNlY190b190aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdCwgbG9uZyB2KQoreworCXQtPnN1Yl9leHBpcmVzICs9IG5zZWNfdG9fYXJjaF9jeWNsZSh2ICogMTAwMCk7CisJd2hpbGUgKHQtPnN1Yl9leHBpcmVzID49IGFyY2hfY3ljbGVzX3Blcl9qaWZmeSkKKwl7CisJCXQtPmV4cGlyZXMrKzsKKwkJdC0+c3ViX2V4cGlyZXMgLT0gYXJjaF9jeWNsZXNfcGVyX2ppZmZ5OworCX0KK30KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaV9zbWkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJpcG1pX3NpX3NtLmgiCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjZGVmaW5lIElQTUlfU0lfVkVSU0lPTiAidjMzIgorCisvKiBNZWFzdXJlIHRpbWVzIGJldHdlZW4gZXZlbnRzIGluIHRoZSBkcml2ZXIuICovCisjdW5kZWYgREVCVUdfVElNSU5HCisKKy8qIENhbGwgZXZlcnkgMTAgbXMuICovCisjZGVmaW5lIFNJX1RJTUVPVVRfVElNRV9VU0VDCTEwMDAwCisjZGVmaW5lIFNJX1VTRUNfUEVSX0pJRkZZCSgxMDAwMDAwL0haKQorI2RlZmluZSBTSV9USU1FT1VUX0pJRkZJRVMJKFNJX1RJTUVPVVRfVElNRV9VU0VDL1NJX1VTRUNfUEVSX0pJRkZZKQorI2RlZmluZSBTSV9TSE9SVF9USU1FT1VUX1VTRUMgIDI1MCAvKiAuMjVtcyB3aGVuIHRoZSBTTSByZXF1ZXN0IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHRpbWVvdXQgKi8KKworZW51bSBzaV9pbnRmX3N0YXRlIHsKKwlTSV9OT1JNQUwsCisJU0lfR0VUVElOR19GTEFHUywKKwlTSV9HRVRUSU5HX0VWRU5UUywKKwlTSV9DTEVBUklOR19GTEFHUywKKwlTSV9DTEVBUklOR19GTEFHU19USEVOX1NFVF9JUlEsCisJU0lfR0VUVElOR19NRVNTQUdFUywKKwlTSV9FTkFCTEVfSU5URVJSVVBUUzEsCisJU0lfRU5BQkxFX0lOVEVSUlVQVFMyCisJLyogRklYTUUgLSBhZGQgd2F0Y2hkb2cgc3R1ZmYuICovCit9OworCitlbnVtIHNpX3R5cGUgeworICAgIFNJX0tDUywgU0lfU01JQywgU0lfQlQKK307CisKK3N0cnVjdCBzbWlfaW5mbworeworCWlwbWlfc21pX3QgICAgICAgICAgICAgaW50ZjsKKwlzdHJ1Y3Qgc2lfc21fZGF0YSAgICAgICpzaV9zbTsKKwlzdHJ1Y3Qgc2lfc21faGFuZGxlcnMgICpoYW5kbGVyczsKKwllbnVtIHNpX3R5cGUgICAgICAgICAgIHNpX3R5cGU7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICBzaV9sb2NrOworCXNwaW5sb2NrX3QgICAgICAgICAgICAgbXNnX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICB4bWl0X21zZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICBocF94bWl0X21zZ3M7CisJc3RydWN0IGlwbWlfc21pX21zZyAgICAqY3Vycl9tc2c7CisJZW51bSBzaV9pbnRmX3N0YXRlICAgICBzaV9zdGF0ZTsKKworCS8qIFVzZWQgdG8gaGFuZGxlIHRoZSB2YXJpb3VzIHR5cGVzIG9mIEkvTyB0aGF0IGNhbiBvY2N1ciB3aXRoCisgICAgICAgICAgIElQTUkgKi8KKwlzdHJ1Y3Qgc2lfc21faW8gaW87CisJaW50ICgqaW9fc2V0dXApKHN0cnVjdCBzbWlfaW5mbyAqaW5mbyk7CisJdm9pZCAoKmlvX2NsZWFudXApKHN0cnVjdCBzbWlfaW5mbyAqaW5mbyk7CisJaW50ICgqaXJxX3NldHVwKShzdHJ1Y3Qgc21pX2luZm8gKmluZm8pOworCXZvaWQgKCppcnFfY2xlYW51cCkoc3RydWN0IHNtaV9pbmZvICppbmZvKTsKKwl1bnNpZ25lZCBpbnQgaW9fc2l6ZTsKKworCS8qIEZsYWdzIGZyb20gdGhlIGxhc3QgR0VUX01TR19GTEFHUyBjb21tYW5kLCB1c2VkIHdoZW4gYW4gQVRUTgorCSAgIGlzIHNldCB0byBob2xkIHRoZSBmbGFncyB1bnRpbCB3ZSBhcmUgZG9uZSBoYW5kbGluZyBldmVyeXRoaW5nCisJICAgZnJvbSB0aGUgZmxhZ3MuICovCisjZGVmaW5lIFJFQ0VJVkVfTVNHX0FWQUlMCTB4MDEKKyNkZWZpbmUgRVZFTlRfTVNHX0JVRkZFUl9GVUxMCTB4MDIKKyNkZWZpbmUgV0RUX1BSRV9USU1FT1VUX0lOVAkweDA4CisJdW5zaWduZWQgY2hhciAgICAgICBtc2dfZmxhZ3M7CisKKwkvKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIHJlcXVlc3QgZXZlbnRzIHRoZSBuZXh0IHRpbWUgdGhlCisJICAgc3RhdGUgbWFjaGluZSBpcyBpZGxlLiAqLworCWF0b21pY190ICAgICAgICAgICAgcmVxX2V2ZW50czsKKworCS8qIElmIHRydWUsIHJ1biB0aGUgc3RhdGUgbWFjaGluZSB0byBjb21wbGV0aW9uIG9uIGV2ZXJ5IHNlbmQKKwkgICBjYWxsLiAgR2VuZXJhbGx5IHVzZWQgYWZ0ZXIgYSBwYW5pYyB0byBtYWtlIHN1cmUgc3R1ZmYgZ29lcworCSAgIG91dC4gKi8KKwlpbnQgICAgICAgICAgICAgICAgIHJ1bl90b19jb21wbGV0aW9uOworCisJLyogVGhlIEkvTyBwb3J0IG9mIGFuIFNJIGludGVyZmFjZS4gKi8KKwlpbnQgICAgICAgICAgICAgICAgIHBvcnQ7CisKKwkvKiBUaGUgc3BhY2UgYmV0d2VlbiBzdGFydCBhZGRyZXNzZXMgb2YgdGhlIHR3byBwb3J0cy4gIEZvcgorCSAgIGluc3RhbmNlLCBpZiB0aGUgZmlyc3QgcG9ydCBpcyAweGNhMiBhbmQgdGhlIHNwYWNpbmcgaXMgNCwgdGhlbgorCSAgIHRoZSBzZWNvbmQgcG9ydCBpcyAweGNhNi4gKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgIHNwYWNpbmc7CisKKwkvKiB6ZXJvIGlmIG5vIGlycTsgKi8KKwlpbnQgICAgICAgICAgICAgICAgIGlycTsKKworCS8qIFRoZSB0aW1lciBmb3IgdGhpcyBzaS4gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCAgIHNpX3RpbWVyOworCisJLyogVGhlIHRpbWUgKGluIGppZmZpZXMpIHRoZSBsYXN0IHRpbWVvdXQgb2NjdXJyZWQgYXQuICovCisJdW5zaWduZWQgbG9uZyAgICAgICBsYXN0X3RpbWVvdXRfamlmZmllczsKKworCS8qIFVzZWQgdG8gZ3JhY2VmdWxseSBzdG9wIHRoZSB0aW1lciB3aXRob3V0IHJhY2UgY29uZGl0aW9ucy4gKi8KKwl2b2xhdGlsZSBpbnQgICAgICAgIHN0b3Bfb3BlcmF0aW9uOworCXZvbGF0aWxlIGludCAgICAgICAgdGltZXJfc3RvcHBlZDsKKworCS8qIFRoZSBkcml2ZXIgd2lsbCBkaXNhYmxlIGludGVycnVwdHMgd2hlbiBpdCBnZXRzIGludG8gYQorCSAgIHNpdHVhdGlvbiB3aGVyZSBpdCBjYW5ub3QgaGFuZGxlIG1lc3NhZ2VzIGR1ZSB0byBsYWNrIG9mCisJICAgbWVtb3J5LiAgT25jZSB0aGF0IHNpdHVhdGlvbiBjbGVhcnMgdXAsIGl0IHdpbGwgcmUtZW5hYmxlCisJICAgaW50ZXJydXB0cy4gKi8KKwlpbnQgaW50ZXJydXB0X2Rpc2FibGVkOworCisJdW5zaWduZWQgY2hhciBpcG1pX3NpX2Rldl9yZXY7CisJdW5zaWduZWQgY2hhciBpcG1pX3NpX2Z3X3Jldl9tYWpvcjsKKwl1bnNpZ25lZCBjaGFyIGlwbWlfc2lfZndfcmV2X21pbm9yOworCXVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21ham9yOworCXVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21pbm9yOworCisJLyogU2xhdmUgYWRkcmVzcywgY291bGQgYmUgcmVwb3J0ZWQgZnJvbSBETUkuICovCisJdW5zaWduZWQgY2hhciBzbGF2ZV9hZGRyOworCisJLyogQ291bnRlcnMgYW5kIHRoaW5ncyBmb3IgdGhlIHByb2MgZmlsZXN5c3RlbS4gKi8KKwlzcGlubG9ja190IGNvdW50X2xvY2s7CisJdW5zaWduZWQgbG9uZyBzaG9ydF90aW1lb3V0czsKKwl1bnNpZ25lZCBsb25nIGxvbmdfdGltZW91dHM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0X3Jlc3RhcnRzOworCXVuc2lnbmVkIGxvbmcgaWRsZXM7CisJdW5zaWduZWQgbG9uZyBpbnRlcnJ1cHRzOworCXVuc2lnbmVkIGxvbmcgYXR0ZW50aW9uczsKKwl1bnNpZ25lZCBsb25nIGZsYWdfZmV0Y2hlczsKKwl1bnNpZ25lZCBsb25nIGhvc2VkX2NvdW50OworCXVuc2lnbmVkIGxvbmcgY29tcGxldGVfdHJhbnNhY3Rpb25zOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzOworCXVuc2lnbmVkIGxvbmcgd2F0Y2hkb2dfcHJldGltZW91dHM7CisJdW5zaWduZWQgbG9uZyBpbmNvbWluZ19tZXNzYWdlczsKK307CisKK3N0YXRpYyB2b2lkIHNpX3Jlc3RhcnRfc2hvcnRfdGltZXIoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbyk7CisKK3N0YXRpYyB2b2lkIGRlbGl2ZXJfcmVjdl9tc2coc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbywKKwkJCSAgICAgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQoreworCS8qIERlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gdGhlIHVwcGVyIGxheWVyIHdpdGggdGhlIGxvY2sKKyAgICAgICAgICAgcmVsZWFzZWQuICovCisJc3Bpbl91bmxvY2soJihzbWlfaW5mby0+c2lfbG9jaykpOworCWlwbWlfc21pX21zZ19yZWNlaXZlZChzbWlfaW5mby0+aW50ZiwgbXNnKTsKKwlzcGluX2xvY2soJihzbWlfaW5mby0+c2lfbG9jaykpOworfQorCitzdGF0aWMgdm9pZCByZXR1cm5faG9zZWRfbXNnKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJc3RydWN0IGlwbWlfc21pX21zZyAqbXNnID0gc21pX2luZm8tPmN1cnJfbXNnOworCisJLyogTWFrZSBpdCBhIHJlcG9uc2UgKi8KKwltc2ctPnJzcFswXSA9IG1zZy0+ZGF0YVswXSB8IDQ7CisJbXNnLT5yc3BbMV0gPSBtc2ctPmRhdGFbMV07CisJbXNnLT5yc3BbMl0gPSAweEZGOyAvKiBVbmtub3duIGVycm9yLiAqLworCW1zZy0+cnNwX3NpemUgPSAzOworCisJc21pX2luZm8tPmN1cnJfbXNnID0gTlVMTDsKKwlkZWxpdmVyX3JlY3ZfbXNnKHNtaV9pbmZvLCBtc2cpOworfQorCitzdGF0aWMgZW51bSBzaV9zbV9yZXN1bHQgc3RhcnRfbmV4dF9tc2coc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlpbnQgICAgICAgICAgICAgIHJ2OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gTlVMTDsKKyNpZmRlZiBERUJVR19USU1JTkcKKwlzdHJ1Y3QgdGltZXZhbCB0OworI2VuZGlmCisKKwkvKiBObyBuZWVkIHRvIHNhdmUgZmxhZ3MsIHdlIGFsZWFkeSBoYXZlIGludGVycnVwdHMgb2ZmIGFuZCB3ZQorCSAgIGFscmVhZHkgaG9sZCB0aGUgU01JIGxvY2suICovCisJc3Bpbl9sb2NrKCYoc21pX2luZm8tPm1zZ19sb2NrKSk7CisKKwkvKiBQaWNrIHRoZSBoaWdoIHByaW9yaXR5IHF1ZXVlIGZpcnN0LiAqLworCWlmICghIGxpc3RfZW1wdHkoJihzbWlfaW5mby0+aHBfeG1pdF9tc2dzKSkpIHsKKwkJZW50cnkgPSBzbWlfaW5mby0+aHBfeG1pdF9tc2dzLm5leHQ7CisJfSBlbHNlIGlmICghIGxpc3RfZW1wdHkoJihzbWlfaW5mby0+eG1pdF9tc2dzKSkpIHsKKwkJZW50cnkgPSBzbWlfaW5mby0+eG1pdF9tc2dzLm5leHQ7CisJfQorCisJaWYgKCFlbnRyeSkgeworCQlzbWlfaW5mby0+Y3Vycl9tc2cgPSBOVUxMOworCQlydiA9IFNJX1NNX0lETEU7CisJfSBlbHNlIHsKKwkJaW50IGVycjsKKworCQlsaXN0X2RlbChlbnRyeSk7CisJCXNtaV9pbmZvLT5jdXJyX21zZyA9IGxpc3RfZW50cnkoZW50cnksCisJCQkJCQlzdHJ1Y3QgaXBtaV9zbWlfbXNnLAorCQkJCQkJbGluayk7CisjaWZkZWYgREVCVUdfVElNSU5HCisJCWRvX2dldHRpbWVvZmRheSgmdCk7CisJCXByaW50aygiKipTdGFydDI6ICVkLiU5LjlkXG4iLCB0LnR2X3NlYywgdC50dl91c2VjKTsKKyNlbmRpZgorCQllcnIgPSBzbWlfaW5mby0+aGFuZGxlcnMtPnN0YXJ0X3RyYW5zYWN0aW9uKAorCQkJc21pX2luZm8tPnNpX3NtLAorCQkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhLAorCQkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhX3NpemUpOworCQlpZiAoZXJyKSB7CisJCQlyZXR1cm5faG9zZWRfbXNnKHNtaV9pbmZvKTsKKwkJfQorCisJCXJ2ID0gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOworCX0KKwlzcGluX3VubG9jaygmKHNtaV9pbmZvLT5tc2dfbG9jaykpOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBzdGFydF9lbmFibGVfaXJxKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJdW5zaWduZWQgY2hhciBtc2dbMl07CisKKwkvKiBJZiB3ZSBhcmUgZW5hYmxpbmcgaW50ZXJydXB0cywgd2UgaGF2ZSB0byB0ZWxsIHRoZQorCSAgIEJNQyB0byB1c2UgdGhlbS4gKi8KKwltc2dbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwltc2dbMV0gPSBJUE1JX0dFVF9CTUNfR0xPQkFMX0VOQUJMRVNfQ01EOworCisJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbihzbWlfaW5mby0+c2lfc20sIG1zZywgMik7CisJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfRU5BQkxFX0lOVEVSUlVQVFMxOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9jbGVhcl9mbGFncyhzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCXVuc2lnbmVkIGNoYXIgbXNnWzNdOworCisJLyogTWFrZSBzdXJlIHRoZSB3YXRjaGRvZyBwcmUtdGltZW91dCBmbGFnIGlzIG5vdCBzZXQgYXQgc3RhcnR1cC4gKi8KKwltc2dbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwltc2dbMV0gPSBJUE1JX0NMRUFSX01TR19GTEFHU19DTUQ7CisJbXNnWzJdID0gV0RUX1BSRV9USU1FT1VUX0lOVDsKKworCXNtaV9pbmZvLT5oYW5kbGVycy0+c3RhcnRfdHJhbnNhY3Rpb24oc21pX2luZm8tPnNpX3NtLCBtc2csIDMpOworCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX0NMRUFSSU5HX0ZMQUdTOworfQorCisvKiBXaGVuIHdlIGhhdmUgYSBzaXR1dGFpb24gd2hlcmUgd2UgcnVuIG91dCBvZiBtZW1vcnkgYW5kIGNhbm5vdAorICAgYWxsb2NhdGUgbWVzc2FnZXMsIHdlIGp1c3QgbGVhdmUgdGhlbSBpbiB0aGUgQk1DIGFuZCBydW4gdGhlIHN5c3RlbQorICAgcG9sbGVkIHVudGlsIHdlIGNhbiBhbGxvY2F0ZSBzb21lIG1lbW9yeS4gIE9uY2Ugd2UgaGF2ZSBzb21lCisgICBtZW1vcnksIHdlIHdpbGwgcmUtZW5hYmxlIHRoZSBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9zaV9pcnEoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlpZiAoKHNtaV9pbmZvLT5pcnEpICYmICghc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCkpIHsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKHNtaV9pbmZvLT5pcnEpOworCQlzbWlfaW5mby0+aW50ZXJydXB0X2Rpc2FibGVkID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfc2lfaXJxKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJaWYgKChzbWlfaW5mby0+aXJxKSAmJiAoc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCkpIHsKKwkJZW5hYmxlX2lycShzbWlfaW5mby0+aXJxKTsKKwkJc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZmxhZ3Moc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwlpZiAoc21pX2luZm8tPm1zZ19mbGFncyAmIFdEVF9QUkVfVElNRU9VVF9JTlQpIHsKKwkJLyogV2F0Y2hkb2cgcHJlLXRpbWVvdXQgKi8KKwkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCXNtaV9pbmZvLT53YXRjaGRvZ19wcmV0aW1lb3V0cysrOworCQlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJCXN0YXJ0X2NsZWFyX2ZsYWdzKHNtaV9pbmZvKTsKKwkJc21pX2luZm8tPm1zZ19mbGFncyAmPSB+V0RUX1BSRV9USU1FT1VUX0lOVDsKKwkJc3Bpbl91bmxvY2soJihzbWlfaW5mby0+c2lfbG9jaykpOworCQlpcG1pX3NtaV93YXRjaGRvZ19wcmV0aW1lb3V0KHNtaV9pbmZvLT5pbnRmKTsKKwkJc3Bpbl9sb2NrKCYoc21pX2luZm8tPnNpX2xvY2spKTsKKwl9IGVsc2UgaWYgKHNtaV9pbmZvLT5tc2dfZmxhZ3MgJiBSRUNFSVZFX01TR19BVkFJTCkgeworCQkvKiBNZXNzYWdlcyBhdmFpbGFibGUuICovCisJCXNtaV9pbmZvLT5jdXJyX21zZyA9IGlwbWlfYWxsb2Nfc21pX21zZygpOworCQlpZiAoIXNtaV9pbmZvLT5jdXJyX21zZykgeworCQkJZGlzYWJsZV9zaV9pcnEoc21pX2luZm8pOworCQkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQkJcmV0dXJuOworCQl9CisJCWVuYWJsZV9zaV9pcnEoc21pX2luZm8pOworCisJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YVswXSA9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpOworCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFbMV0gPSBJUE1JX0dFVF9NU0dfQ01EOworCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFfc2l6ZSA9IDI7CisKKwkJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbigKKwkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YSwKKwkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YV9zaXplKTsKKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfR0VUVElOR19NRVNTQUdFUzsKKwl9IGVsc2UgaWYgKHNtaV9pbmZvLT5tc2dfZmxhZ3MgJiBFVkVOVF9NU0dfQlVGRkVSX0ZVTEwpIHsKKwkJLyogRXZlbnRzIGF2YWlsYWJsZS4gKi8KKwkJc21pX2luZm8tPmN1cnJfbXNnID0gaXBtaV9hbGxvY19zbWlfbXNnKCk7CisJCWlmICghc21pX2luZm8tPmN1cnJfbXNnKSB7CisJCQlkaXNhYmxlX3NpX2lycShzbWlfaW5mbyk7CisJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CisJCQlyZXR1cm47CisJCX0KKwkJZW5hYmxlX3NpX2lycShzbWlfaW5mbyk7CisKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhWzBdID0gKElQTUlfTkVURk5fQVBQX1JFUVVFU1QgPDwgMik7CisJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YVsxXSA9IElQTUlfUkVBRF9FVkVOVF9NU0dfQlVGRkVSX0NNRDsKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhX3NpemUgPSAyOworCisJCXNtaV9pbmZvLT5oYW5kbGVycy0+c3RhcnRfdHJhbnNhY3Rpb24oCisJCQlzbWlfaW5mby0+c2lfc20sCisJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGEsCisJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFfc2l6ZSk7CisJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX0dFVFRJTkdfRVZFTlRTOworCX0gZWxzZSB7CisJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX05PUk1BTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV90cmFuc2FjdGlvbl9kb25lKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCit7CisJc3RydWN0IGlwbWlfc21pX21zZyAqbXNnOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsIHQ7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnQpOworCXByaW50aygiKipEb25lOiAlZC4lOS45ZFxuIiwgdC50dl9zZWMsIHQudHZfdXNlYyk7CisjZW5kaWYKKwlzd2l0Y2ggKHNtaV9pbmZvLT5zaV9zdGF0ZSkgeworCWNhc2UgU0lfTk9STUFMOgorCQlpZiAoIXNtaV9pbmZvLT5jdXJyX21zZykKKwkJCWJyZWFrOworCisJCXNtaV9pbmZvLT5jdXJyX21zZy0+cnNwX3NpemUKKwkJCT0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KAorCQkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPnJzcCwKKwkJCQlJUE1JX01BWF9NU0dfTEVOR1RIKTsKKworCQkvKiBEbyB0aGlzIGhlcmUgYmVjYXNlIGRlbGl2ZXJfcmVjdl9tc2coKSByZWxlYXNlcyB0aGUKKwkJICAgbG9jaywgYW5kIGEgbmV3IG1lc3NhZ2UgY2FuIGJlIHB1dCBpbiBkdXJpbmcgdGhlCisJCSAgIHRpbWUgdGhlIGxvY2sgaXMgcmVsZWFzZWQuICovCisJCW1zZyA9IHNtaV9pbmZvLT5jdXJyX21zZzsKKwkJc21pX2luZm8tPmN1cnJfbXNnID0gTlVMTDsKKwkJZGVsaXZlcl9yZWN2X21zZyhzbWlfaW5mbywgbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJX0dFVFRJTkdfRkxBR1M6CisJeworCQl1bnNpZ25lZCBjaGFyIG1zZ1s0XTsKKwkJdW5zaWduZWQgaW50ICBsZW47CisKKwkJLyogV2UgZ290IHRoZSBmbGFncyBmcm9tIHRoZSBTTUksIG5vdyBoYW5kbGUgdGhlbS4gKi8KKwkJbGVuID0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KHNtaV9pbmZvLT5zaV9zbSwgbXNnLCA0KTsKKwkJaWYgKG1zZ1syXSAhPSAwKSB7CisJCQkvKiBFcnJvciBmZXRjaGluZyBmbGFncywganVzdCBnaXZlIHVwIGZvcgorCQkJICAgbm93LiAqLworCQkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQl9IGVsc2UgaWYgKGxlbiA8IDQpIHsKKwkJCS8qIEhtbSwgbm8gZmxhZ3MuICBUaGF0J3MgdGVjaG5pY2FsbHkgaWxsZWdhbCwgYnV0CisJCQkgICBkb24ndCB1c2UgdW5pbml0aWFsaXplZCBkYXRhLiAqLworCQkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQl9IGVsc2UgeworCQkJc21pX2luZm8tPm1zZ19mbGFncyA9IG1zZ1szXTsKKwkJCWhhbmRsZV9mbGFncyhzbWlfaW5mbyk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSV9DTEVBUklOR19GTEFHUzoKKwljYXNlIFNJX0NMRUFSSU5HX0ZMQUdTX1RIRU5fU0VUX0lSUToKKwl7CisJCXVuc2lnbmVkIGNoYXIgbXNnWzNdOworCisJCS8qIFdlIGNsZWFyZWQgdGhlIGZsYWdzLiAqLworCQlzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoc21pX2luZm8tPnNpX3NtLCBtc2csIDMpOworCQlpZiAobXNnWzJdICE9IDApIHsKKwkJCS8qIEVycm9yIGNsZWFyaW5nIGZsYWdzICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImlwbWlfc2k6IEVycm9yIGNsZWFyaW5nIGZsYWdzOiAlMi4yeFxuIiwKKwkJCSAgICAgICBtc2dbMl0pOworCQl9CisJCWlmIChzbWlfaW5mby0+c2lfc3RhdGUgPT0gU0lfQ0xFQVJJTkdfRkxBR1NfVEhFTl9TRVRfSVJRKQorCQkJc3RhcnRfZW5hYmxlX2lycShzbWlfaW5mbyk7CisJCWVsc2UKKwkJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX05PUk1BTDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSV9HRVRUSU5HX0VWRU5UUzoKKwl7CisJCXNtaV9pbmZvLT5jdXJyX21zZy0+cnNwX3NpemUKKwkJCT0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KAorCQkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPnJzcCwKKwkJCQlJUE1JX01BWF9NU0dfTEVOR1RIKTsKKworCQkvKiBEbyB0aGlzIGhlcmUgYmVjYXNlIGRlbGl2ZXJfcmVjdl9tc2coKSByZWxlYXNlcyB0aGUKKwkJICAgbG9jaywgYW5kIGEgbmV3IG1lc3NhZ2UgY2FuIGJlIHB1dCBpbiBkdXJpbmcgdGhlCisJCSAgIHRpbWUgdGhlIGxvY2sgaXMgcmVsZWFzZWQuICovCisJCW1zZyA9IHNtaV9pbmZvLT5jdXJyX21zZzsKKwkJc21pX2luZm8tPmN1cnJfbXNnID0gTlVMTDsKKwkJaWYgKG1zZy0+cnNwWzJdICE9IDApIHsKKwkJCS8qIEVycm9yIGdldHRpbmcgZXZlbnQsIHByb2JhYmx5IGRvbmUuICovCisJCQltc2ctPmRvbmUobXNnKTsKKworCQkJLyogVGFrZSBvZmYgdGhlIGV2ZW50IGZsYWcuICovCisJCQlzbWlfaW5mby0+bXNnX2ZsYWdzICY9IH5FVkVOVF9NU0dfQlVGRkVSX0ZVTEw7CisJCQloYW5kbGVfZmxhZ3Moc21pX2luZm8pOworCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCQlzbWlfaW5mby0+ZXZlbnRzKys7CisJCQlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJCQkvKiBEbyB0aGlzIGJlZm9yZSB3ZSBkZWxpdmVyIHRoZSBtZXNzYWdlCisJCQkgICBiZWNhdXNlIGRlbGl2ZXJpbmcgdGhlIG1lc3NhZ2UgcmVsZWFzZXMgdGhlCisJCQkgICBsb2NrIGFuZCBzb21ldGhpbmcgZWxzZSBjYW4gbWVzcyB3aXRoIHRoZQorCQkJICAgc3RhdGUuICovCisJCQloYW5kbGVfZmxhZ3Moc21pX2luZm8pOworCisJCQlkZWxpdmVyX3JlY3ZfbXNnKHNtaV9pbmZvLCBtc2cpOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgU0lfR0VUVElOR19NRVNTQUdFUzoKKwl7CisJCXNtaV9pbmZvLT5jdXJyX21zZy0+cnNwX3NpemUKKwkJCT0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KAorCQkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCQlzbWlfaW5mby0+Y3Vycl9tc2ctPnJzcCwKKwkJCQlJUE1JX01BWF9NU0dfTEVOR1RIKTsKKworCQkvKiBEbyB0aGlzIGhlcmUgYmVjYXNlIGRlbGl2ZXJfcmVjdl9tc2coKSByZWxlYXNlcyB0aGUKKwkJICAgbG9jaywgYW5kIGEgbmV3IG1lc3NhZ2UgY2FuIGJlIHB1dCBpbiBkdXJpbmcgdGhlCisJCSAgIHRpbWUgdGhlIGxvY2sgaXMgcmVsZWFzZWQuICovCisJCW1zZyA9IHNtaV9pbmZvLT5jdXJyX21zZzsKKwkJc21pX2luZm8tPmN1cnJfbXNnID0gTlVMTDsKKwkJaWYgKG1zZy0+cnNwWzJdICE9IDApIHsKKwkJCS8qIEVycm9yIGdldHRpbmcgZXZlbnQsIHByb2JhYmx5IGRvbmUuICovCisJCQltc2ctPmRvbmUobXNnKTsKKworCQkJLyogVGFrZSBvZmYgdGhlIG1zZyBmbGFnLiAqLworCQkJc21pX2luZm8tPm1zZ19mbGFncyAmPSB+UkVDRUlWRV9NU0dfQVZBSUw7CisJCQloYW5kbGVfZmxhZ3Moc21pX2luZm8pOworCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCQlzbWlfaW5mby0+aW5jb21pbmdfbWVzc2FnZXMrKzsKKwkJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJCS8qIERvIHRoaXMgYmVmb3JlIHdlIGRlbGl2ZXIgdGhlIG1lc3NhZ2UKKwkJCSAgIGJlY2F1c2UgZGVsaXZlcmluZyB0aGUgbWVzc2FnZSByZWxlYXNlcyB0aGUKKwkJCSAgIGxvY2sgYW5kIHNvbWV0aGluZyBlbHNlIGNhbiBtZXNzIHdpdGggdGhlCisJCQkgICBzdGF0ZS4gKi8KKwkJCWhhbmRsZV9mbGFncyhzbWlfaW5mbyk7CisKKwkJCWRlbGl2ZXJfcmVjdl9tc2coc21pX2luZm8sIG1zZyk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSV9FTkFCTEVfSU5URVJSVVBUUzE6CisJeworCQl1bnNpZ25lZCBjaGFyIG1zZ1s0XTsKKworCQkvKiBXZSBnb3QgdGhlIGZsYWdzIGZyb20gdGhlIFNNSSwgbm93IGhhbmRsZSB0aGVtLiAqLworCQlzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoc21pX2luZm8tPnNpX3NtLCBtc2csIDQpOworCQlpZiAobXNnWzJdICE9IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiaXBtaV9zaTogQ291bGQgbm90IGVuYWJsZSBpbnRlcnJ1cHRzIgorCQkJICAgICAgICIsIGZhaWxlZCBnZXQsIHVzaW5nIHBvbGxlZCBtb2RlLlxuIik7CisJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9OT1JNQUw7CisJCX0gZWxzZSB7CisJCQltc2dbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwkJCW1zZ1sxXSA9IElQTUlfU0VUX0JNQ19HTE9CQUxfRU5BQkxFU19DTUQ7CisJCQltc2dbMl0gPSBtc2dbM10gfCAxOyAvKiBlbmFibGUgbXNnIHF1ZXVlIGludCAqLworCQkJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbigKKwkJCQlzbWlfaW5mby0+c2lfc20sIG1zZywgMyk7CisJCQlzbWlfaW5mby0+c2lfc3RhdGUgPSBTSV9FTkFCTEVfSU5URVJSVVBUUzI7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSV9FTkFCTEVfSU5URVJSVVBUUzI6CisJeworCQl1bnNpZ25lZCBjaGFyIG1zZ1s0XTsKKworCQkvKiBXZSBnb3QgdGhlIGZsYWdzIGZyb20gdGhlIFNNSSwgbm93IGhhbmRsZSB0aGVtLiAqLworCQlzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoc21pX2luZm8tPnNpX3NtLCBtc2csIDQpOworCQlpZiAobXNnWzJdICE9IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiaXBtaV9zaTogQ291bGQgbm90IGVuYWJsZSBpbnRlcnJ1cHRzIgorCQkJICAgICAgICIsIGZhaWxlZCBzZXQsIHVzaW5nIHBvbGxlZCBtb2RlLlxuIik7CisJCX0KKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQlicmVhazsKKwl9CisJfQorfQorCisvKiBDYWxsZWQgb24gdGltZW91dHMgYW5kIGV2ZW50cy4gIFRpbWVvdXRzIHNob3VsZCBwYXNzIHRoZSBlbGFwc2VkCisgICB0aW1lLCBpbnRlcnJ1cHRzIHNob3VsZCBwYXNzIGluIHplcm8uICovCitzdGF0aWMgZW51bSBzaV9zbV9yZXN1bHQgc21pX2V2ZW50X2hhbmRsZXIoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbywKKwkJCQkJICAgaW50IHRpbWUpCit7CisJZW51bSBzaV9zbV9yZXN1bHQgc2lfc21fcmVzdWx0OworCisgcmVzdGFydDoKKwkvKiBUaGVyZSB1c2VkIHRvIGJlIGEgbG9vcCBoZXJlIHRoYXQgd2FpdGVkIGEgbGl0dGxlIHdoaWxlCisJICAgKGFyb3VuZCAyNXVzKSBiZWZvcmUgZ2l2aW5nIHVwLiAgVGhhdCB0dXJuZWQgb3V0IHRvIGJlCisJICAgcG9pbnRsZXNzLCB0aGUgbWluaW11bSBkZWxheXMgSSB3YXMgc2VlaW5nIHdlcmUgaW4gdGhlIDMwMHVzCisJICAgcmFuZ2UsIHdoaWNoIGlzIGZhciB0b28gbG9uZyB0byB3YWl0IGluIGFuIGludGVycnVwdC4gIFNvCisJICAgd2UganVzdCBydW4gdW50aWwgdGhlIHN0YXRlIG1hY2hpbmUgdGVsbHMgdXMgc29tZXRoaW5nCisJICAgaGFwcGVuZWQgb3IgaXQgbmVlZHMgYSBkZWxheS4gKi8KKwlzaV9zbV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgdGltZSk7CisJdGltZSA9IDA7CisJd2hpbGUgKHNpX3NtX3Jlc3VsdCA9PSBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVkpCisJeworCQlzaV9zbV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgMCk7CisJfQorCisJaWYgKHNpX3NtX3Jlc3VsdCA9PSBTSV9TTV9UUkFOU0FDVElPTl9DT01QTEVURSkKKwl7CisJCXNwaW5fbG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCQlzbWlfaW5mby0+Y29tcGxldGVfdHJhbnNhY3Rpb25zKys7CisJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJaGFuZGxlX3RyYW5zYWN0aW9uX2RvbmUoc21pX2luZm8pOworCQlzaV9zbV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgMCk7CisJfQorCWVsc2UgaWYgKHNpX3NtX3Jlc3VsdCA9PSBTSV9TTV9IT1NFRCkKKwl7CisJCXNwaW5fbG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCQlzbWlfaW5mby0+aG9zZWRfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKworCQkvKiBEbyB0aGUgYmVmb3JlIHJldHVybl9ob3NlZF9tc2csIGJlY2F1c2UgdGhhdAorCQkgICByZWxlYXNlcyB0aGUgbG9jay4gKi8KKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOworCQlpZiAoc21pX2luZm8tPmN1cnJfbXNnICE9IE5VTEwpIHsKKwkJCS8qIElmIHdlIHdlcmUgaGFuZGxpbmcgYSB1c2VyIG1lc3NhZ2UsIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSByZXNwb25zZSB0byBzZW5kIHRvIHRoZSB1cHBlciBsYXllciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsbCBpdCBhYm91dCB0aGUgZXJyb3IuICovCisJCQlyZXR1cm5faG9zZWRfbXNnKHNtaV9pbmZvKTsKKwkJfQorCQlzaV9zbV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgMCk7CisJfQorCisJLyogV2UgcHJlZmVyIGhhbmRsaW5nIGF0dG4gb3ZlciBuZXcgbWVzc2FnZXMuICovCisJaWYgKHNpX3NtX3Jlc3VsdCA9PSBTSV9TTV9BVFROKQorCXsKKwkJdW5zaWduZWQgY2hhciBtc2dbMl07CisKKwkJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJCXNtaV9pbmZvLT5hdHRlbnRpb25zKys7CisJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJLyogR290IGEgYXR0biwgc2VuZCBkb3duIGEgZ2V0IG1lc3NhZ2UgZmxhZ3MgdG8gc2VlCisgICAgICAgICAgICAgICAgICAgd2hhdCdzIGNhdXNpbmcgaXQuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGFuZGxlCisgICAgICAgICAgICAgICAgICAgdGhpcyBpbiB0aGUgdXBwZXIgbGF5ZXIsIGJ1dCBkdWUgdG8gdGhlIHdheQorICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgd29yayB3aXRoIHRoZSBTTUksIHRoYXQncyBub3QgcmVhbGx5CisgICAgICAgICAgICAgICAgICAgcG9zc2libGUuICovCisJCW1zZ1swXSA9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDIpOworCQltc2dbMV0gPSBJUE1JX0dFVF9NU0dfRkxBR1NfQ01EOworCisJCXNtaV9pbmZvLT5oYW5kbGVycy0+c3RhcnRfdHJhbnNhY3Rpb24oCisJCQlzbWlfaW5mby0+c2lfc20sIG1zZywgMik7CisJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX0dFVFRJTkdfRkxBR1M7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgY3VycmVudGx5IGlkbGUsIHRyeSB0byBzdGFydCB0aGUgbmV4dCBtZXNzYWdlLiAqLworCWlmIChzaV9zbV9yZXN1bHQgPT0gU0lfU01fSURMRSkgeworCQlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwkJc21pX2luZm8tPmlkbGVzKys7CisJCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisKKwkJc2lfc21fcmVzdWx0ID0gc3RhcnRfbmV4dF9tc2coc21pX2luZm8pOworCQlpZiAoc2lfc21fcmVzdWx0ICE9IFNJX1NNX0lETEUpCisJCQlnb3RvIHJlc3RhcnQ7CisgICAgICAgIH0KKworCWlmICgoc2lfc21fcmVzdWx0ID09IFNJX1NNX0lETEUpCisJICAgICYmIChhdG9taWNfcmVhZCgmc21pX2luZm8tPnJlcV9ldmVudHMpKSkKKwl7CisJCS8qIFdlIGFyZSBpZGxlIGFuZCB0aGUgdXBwZXIgbGF5ZXIgcmVxdWVzdGVkIHRoYXQgSSBmZXRjaAorCQkgICBldmVudHMsIHNvIGRvIHNvLiAqLworCQl1bnNpZ25lZCBjaGFyIG1zZ1syXTsKKworCQlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKKwkJc21pX2luZm8tPmZsYWdfZmV0Y2hlcysrOworCQlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJCWF0b21pY19zZXQoJnNtaV9pbmZvLT5yZXFfZXZlbnRzLCAwKTsKKwkJbXNnWzBdID0gKElQTUlfTkVURk5fQVBQX1JFUVVFU1QgPDwgMik7CisJCW1zZ1sxXSA9IElQTUlfR0VUX01TR19GTEFHU19DTUQ7CisKKwkJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbigKKwkJCXNtaV9pbmZvLT5zaV9zbSwgbXNnLCAyKTsKKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfR0VUVElOR19GTEFHUzsKKwkJZ290byByZXN0YXJ0OworCX0KKworCXJldHVybiBzaV9zbV9yZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRlcih2b2lkICAgICAgICAgICAgICAgICpzZW5kX2luZm8sCisJCSAgIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZywKKwkJICAgaW50ICAgICAgICAgICAgICAgICBwcmlvcml0eSkKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gICAqc21pX2luZm8gPSBzZW5kX2luZm87CisJZW51bSBzaV9zbV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsICAgIHQ7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoc21pX2luZm8tPm1zZ19sb2NrKSwgZmxhZ3MpOworI2lmZGVmIERFQlVHX1RJTUlORworCWRvX2dldHRpbWVvZmRheSgmdCk7CisJcHJpbnRrKCIqKkVucXVldWU6ICVkLiU5LjlkXG4iLCB0LnR2X3NlYywgdC50dl91c2VjKTsKKyNlbmRpZgorCisJaWYgKHNtaV9pbmZvLT5ydW5fdG9fY29tcGxldGlvbikgeworCQkvKiBJZiB3ZSBhcmUgcnVubmluZyB0byBjb21wbGV0aW9uLCB0aGVuIHRocm93IGl0IGluCisJCSAgIHRoZSBsaXN0IGFuZCBydW4gdHJhbnNhY3Rpb25zIHVudGlsIGV2ZXJ5dGhpbmcgaXMKKwkJICAgY2xlYXIuICBQcmlvcml0eSBkb2Vzbid0IG1hdHRlciBoZXJlLiAqLworCQlsaXN0X2FkZF90YWlsKCYobXNnLT5saW5rKSwgJihzbWlfaW5mby0+eG1pdF9tc2dzKSk7CisKKwkJLyogV2UgaGF2ZSB0byByZWxlYXNlIHRoZSBtc2cgbG9jayBhbmQgY2xhaW0gdGhlIHNtaQorCQkgICBsb2NrIGluIHRoaXMgY2FzZSwgYmVjYXVzZSBvZiByYWNlIGNvbmRpdGlvbnMuICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzbWlfaW5mby0+bXNnX2xvY2spLCBmbGFncyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKKwkJcmVzdWx0ID0gc21pX2V2ZW50X2hhbmRsZXIoc21pX2luZm8sIDApOworCQl3aGlsZSAocmVzdWx0ICE9IFNJX1NNX0lETEUpIHsKKwkJCXVkZWxheShTSV9TSE9SVF9USU1FT1VUX1VTRUMpOworCQkJcmVzdWx0ID0gc21pX2V2ZW50X2hhbmRsZXIoc21pX2luZm8sCisJCQkJCQkgICBTSV9TSE9SVF9USU1FT1VUX1VTRUMpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWlmIChwcmlvcml0eSA+IDApIHsKKwkJCWxpc3RfYWRkX3RhaWwoJihtc2ctPmxpbmspLCAmKHNtaV9pbmZvLT5ocF94bWl0X21zZ3MpKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfYWRkX3RhaWwoJihtc2ctPmxpbmspLCAmKHNtaV9pbmZvLT54bWl0X21zZ3MpKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPm1zZ19sb2NrKSwgZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKKwlpZiAoKHNtaV9pbmZvLT5zaV9zdGF0ZSA9PSBTSV9OT1JNQUwpCisJICAgICYmIChzbWlfaW5mby0+Y3Vycl9tc2cgPT0gTlVMTCkpCisJeworCQlzdGFydF9uZXh0X21zZyhzbWlfaW5mbyk7CisJCXNpX3Jlc3RhcnRfc2hvcnRfdGltZXIoc21pX2luZm8pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9ydW5fdG9fY29tcGxldGlvbih2b2lkICpzZW5kX2luZm8sIGludCBpX3J1bl90b19jb21wbGV0aW9uKQoreworCXN0cnVjdCBzbWlfaW5mbyAgICpzbWlfaW5mbyA9IHNlbmRfaW5mbzsKKwllbnVtIHNpX3NtX3Jlc3VsdCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCisJc21pX2luZm8tPnJ1bl90b19jb21wbGV0aW9uID0gaV9ydW5fdG9fY29tcGxldGlvbjsKKwlpZiAoaV9ydW5fdG9fY29tcGxldGlvbikgeworCQlyZXN1bHQgPSBzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywgMCk7CisJCXdoaWxlIChyZXN1bHQgIT0gU0lfU01fSURMRSkgeworCQkJdWRlbGF5KFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CisJCQlyZXN1bHQgPSBzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywKKwkJCQkJCSAgIFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHBvbGwodm9pZCAqc2VuZF9pbmZvKQoreworCXN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8gPSBzZW5kX2luZm87CisKKwlzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfZXZlbnRzKHZvaWQgKnNlbmRfaW5mbykKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvID0gc2VuZF9pbmZvOworCisJYXRvbWljX3NldCgmc21pX2luZm8tPnJlcV9ldmVudHMsIDEpOworfQorCitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZiBhbmQgd2l0aCB0aGUgc2lfbG9jayBoZWxkLiAqLworc3RhdGljIHZvaWQgc2lfcmVzdGFydF9zaG9ydF90aW1lcihzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworI2lmIGRlZmluZWQoQ09ORklHX0hJR0hfUkVTX1RJTUVSUykKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgamlmZmllc19ub3c7CisKKwlpZiAoZGVsX3RpbWVyKCYoc21pX2luZm8tPnNpX3RpbWVyKSkpIHsKKwkJLyogSWYgd2UgZG9uJ3QgZGVsZXRlIHRoZSB0aW1lciwgdGhlbiBpdCB3aWxsIGdvIG9mZgorCQkgICBpbW1lZGlhdGVseSwgYW55d2F5LiAgU28gd2Ugb25seSBwcm9jZXNzIGlmIHdlCisJCSAgIGFjdHVhbGx5IGRlbGV0ZSB0aGUgdGltZXIuICovCisKKwkJLyogV2UgYWxyZWFkeSBoYXZlIGlycXNhdmUgb24sIHNvIG5vIG5lZWQgZm9yIGl0CisgICAgICAgICAgICAgICAgICAgaGVyZS4gKi8KKwkJcmVhZF9sb2NrKCZ4dGltZV9sb2NrKTsKKwkJamlmZmllc19ub3cgPSBqaWZmaWVzOworCQlzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXNfbm93OworCQlzbWlfaW5mby0+c2lfdGltZXIuc3ViX2V4cGlyZXMgPSBnZXRfYXJjaF9jeWNsZXMoamlmZmllc19ub3cpOworCisJCWFkZF91c2VjX3RvX3RpbWVyKCZzbWlfaW5mby0+c2lfdGltZXIsIFNJX1NIT1JUX1RJTUVPVVRfVVNFQyk7CisKKwkJYWRkX3RpbWVyKCYoc21pX2luZm8tPnNpX3RpbWVyKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworCQlzbWlfaW5mby0+dGltZW91dF9yZXN0YXJ0cysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBzbWlfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNtaV9pbmZvICAgKnNtaV9pbmZvID0gKHN0cnVjdCBzbWlfaW5mbyAqKSBkYXRhOworCWVudW0gc2lfc21fcmVzdWx0IHNtaV9yZXN1bHQ7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyAgICAgamlmZmllc19ub3c7CisJdW5zaWduZWQgbG9uZyAgICAgdGltZV9kaWZmOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsICAgIHQ7CisjZW5kaWYKKworCWlmIChzbWlfaW5mby0+c3RvcF9vcGVyYXRpb24pIHsKKwkJc21pX2luZm8tPnRpbWVyX3N0b3BwZWQgPSAxOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJihzbWlfaW5mby0+c2lfbG9jayksIGZsYWdzKTsKKyNpZmRlZiBERUJVR19USU1JTkcKKwlkb19nZXR0aW1lb2ZkYXkoJnQpOworCXByaW50aygiKipUaW1lcjogJWQuJTkuOWRcbiIsIHQudHZfc2VjLCB0LnR2X3VzZWMpOworI2VuZGlmCisJamlmZmllc19ub3cgPSBqaWZmaWVzOworCXRpbWVfZGlmZiA9ICgoamlmZmllc19ub3cgLSBzbWlfaW5mby0+bGFzdF90aW1lb3V0X2ppZmZpZXMpCisJCSAgICAgKiBTSV9VU0VDX1BFUl9KSUZGWSk7CisJc21pX3Jlc3VsdCA9IHNtaV9ldmVudF9oYW5kbGVyKHNtaV9pbmZvLCB0aW1lX2RpZmYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCisJc21pX2luZm8tPmxhc3RfdGltZW91dF9qaWZmaWVzID0gamlmZmllc19ub3c7CisKKwlpZiAoKHNtaV9pbmZvLT5pcnEpICYmICghIHNtaV9pbmZvLT5pbnRlcnJ1cHRfZGlzYWJsZWQpKSB7CisJCS8qIFJ1bm5pbmcgd2l0aCBpbnRlcnJ1cHRzLCBvbmx5IGRvIGxvbmcgdGltZW91dHMuICovCisJCXNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzID0gamlmZmllcyArIFNJX1RJTUVPVVRfSklGRklFUzsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJCXNtaV9pbmZvLT5sb25nX3RpbWVvdXRzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJCWdvdG8gZG9fYWRkX3RpbWVyOworCX0KKworCS8qIElmIHRoZSBzdGF0ZSBtYWNoaW5lIGFza3MgZm9yIGEgc2hvcnQgZGVsYXksIHRoZW4gc2hvcnRlbgorICAgICAgICAgICB0aGUgdGltZXIgdGltZW91dC4gKi8KKwlpZiAoc21pX3Jlc3VsdCA9PSBTSV9TTV9DQUxMX1dJVEhfREVMQVkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNtaV9pbmZvLT5jb3VudF9sb2NrLCBmbGFncyk7CisJCXNtaV9pbmZvLT5zaG9ydF90aW1lb3V0cysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworI2lmIGRlZmluZWQoQ09ORklHX0hJR0hfUkVTX1RJTUVSUykKKwkJcmVhZF9sb2NrKCZ4dGltZV9sb2NrKTsKKyAgICAgICAgICAgICAgICBzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgc21pX2luZm8tPnNpX3RpbWVyLnN1Yl9leHBpcmVzCisgICAgICAgICAgICAgICAgICAgICAgICA9IGdldF9hcmNoX2N5Y2xlcyhzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyk7CisgICAgICAgICAgICAgICAgcmVhZF91bmxvY2soJnh0aW1lX2xvY2spOworCQlhZGRfdXNlY190b190aW1lcigmc21pX2luZm8tPnNpX3RpbWVyLCBTSV9TSE9SVF9USU1FT1VUX1VTRUMpOworI2Vsc2UKKwkJc21pX2luZm8tPnNpX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworCQlzbWlfaW5mby0+bG9uZ190aW1lb3V0cysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOworCQlzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBTSV9USU1FT1VUX0pJRkZJRVM7CisjaWYgZGVmaW5lZChDT05GSUdfSElHSF9SRVNfVElNRVJTKQorCQlzbWlfaW5mby0+c2lfdGltZXIuc3ViX2V4cGlyZXMgPSAwOworI2VuZGlmCisJfQorCisgZG9fYWRkX3RpbWVyOgorCWFkZF90aW1lcigmKHNtaV9pbmZvLT5zaV90aW1lcikpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2lfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbyA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworI2lmZGVmIERFQlVHX1RJTUlORworCXN0cnVjdCB0aW1ldmFsICB0OworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCisJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJc21pX2luZm8tPmludGVycnVwdHMrKzsKKwlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJaWYgKHNtaV9pbmZvLT5zdG9wX29wZXJhdGlvbikKKwkJZ290byBvdXQ7CisKKyNpZmRlZiBERUJVR19USU1JTkcKKwlkb19nZXR0aW1lb2ZkYXkoJnQpOworCXByaW50aygiKipJbnRlcnJ1cHQ6ICVkLiU5LjlkXG4iLCB0LnR2X3NlYywgdC50dl91c2VjKTsKKyNlbmRpZgorCXNtaV9ldmVudF9oYW5kbGVyKHNtaV9pbmZvLCAwKTsKKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcG1pX3NtaV9oYW5kbGVycyBoYW5kbGVycyA9Cit7CisJLm93bmVyICAgICAgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkuc2VuZGVyCQkJPSBzZW5kZXIsCisJLnJlcXVlc3RfZXZlbnRzCQk9IHJlcXVlc3RfZXZlbnRzLAorCS5zZXRfcnVuX3RvX2NvbXBsZXRpb24gID0gc2V0X3J1bl90b19jb21wbGV0aW9uLAorCS5wb2xsCQkJPSBwb2xsLAorfTsKKworLyogVGhlcmUgY2FuIGJlIDQgSU8gcG9ydHMgcGFzc2VkIGluICh3aXRoIG9yIHdpdGhvdXQgSVJRcyksIDQgYWRkcmVzc2VzLAorICAgYSBkZWZhdWx0IElPIHBvcnQsIGFuZCAxIEFDUEkvU1BNSSBhZGRyZXNzLiAgVGhhdCBzZXRzIFNJX01BWF9EUklWRVJTICovCisKKyNkZWZpbmUgU0lfTUFYX1BBUk1TIDQKKyNkZWZpbmUgU0lfTUFYX0RSSVZFUlMgKChTSV9NQVhfUEFSTVMgKiAyKSArIDIpCitzdGF0aWMgc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mb3NbU0lfTUFYX0RSSVZFUlNdID0KK3sgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworCisjZGVmaW5lIERFVklDRV9OQU1FICJpcG1pX3NpIgorCisjZGVmaW5lIERFRkFVTFRfS0NTX0lPX1BPUlQJMHhjYTIKKyNkZWZpbmUgREVGQVVMVF9TTUlDX0lPX1BPUlQJMHhjYTkKKyNkZWZpbmUgREVGQVVMVF9CVF9JT19QT1JUCTB4ZTQKKyNkZWZpbmUgREVGQVVMVF9SRUdTUEFDSU5HCTEKKworc3RhdGljIGludCAgICAgICAgICAgc2lfdHJ5ZGVmYXVsdHMgPSAxOworc3RhdGljIGNoYXIgICAgICAgICAgKnNpX3R5cGVbU0lfTUFYX1BBUk1TXTsKKyNkZWZpbmUgTUFYX1NJX1RZUEVfU1RSIDMwCitzdGF0aWMgY2hhciAgICAgICAgICBzaV90eXBlX3N0cltNQVhfU0lfVFlQRV9TVFJdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWRkcnNbU0lfTUFYX1BBUk1TXTsKK3N0YXRpYyBpbnQgbnVtX2FkZHJzOworc3RhdGljIHVuc2lnbmVkIGludCAgcG9ydHNbU0lfTUFYX1BBUk1TXTsKK3N0YXRpYyBpbnQgbnVtX3BvcnRzOworc3RhdGljIGludCAgICAgICAgICAgaXJxc1tTSV9NQVhfUEFSTVNdOworc3RhdGljIGludCBudW1faXJxczsKK3N0YXRpYyBpbnQgICAgICAgICAgIHJlZ3NwYWNpbmdzW1NJX01BWF9QQVJNU107CitzdGF0aWMgaW50IG51bV9yZWdzcGFjaW5ncyA9IDA7CitzdGF0aWMgaW50ICAgICAgICAgICByZWdzaXplc1tTSV9NQVhfUEFSTVNdOworc3RhdGljIGludCBudW1fcmVnc2l6ZXMgPSAwOworc3RhdGljIGludCAgICAgICAgICAgcmVnc2hpZnRzW1NJX01BWF9QQVJNU107CitzdGF0aWMgaW50IG51bV9yZWdzaGlmdHMgPSAwOworc3RhdGljIGludCBzbGF2ZV9hZGRyc1tTSV9NQVhfUEFSTVNdOworc3RhdGljIGludCBudW1fc2xhdmVfYWRkcnMgPSAwOworCisKK21vZHVsZV9wYXJhbV9uYW1lZCh0cnlkZWZhdWx0cywgc2lfdHJ5ZGVmYXVsdHMsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyh0cnlkZWZhdWx0cywgIlNldHRpbmcgdGhpcyB0byAnZmFsc2UnIHdpbGwgZGlzYWJsZSB0aGUiCisJCSAiIGRlZmF1bHQgc2NhbiBvZiB0aGUgS0NTIGFuZCBTTUlDIGludGVyZmFjZSBhdCB0aGUgc3RhbmRhcmQiCisJCSAiIGFkZHJlc3MiKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcodHlwZSwgc2lfdHlwZV9zdHIsIE1BWF9TSV9UWVBFX1NUUiwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHR5cGUsICJEZWZpbmVzIHRoZSB0eXBlIG9mIGVhY2ggaW50ZXJmYWNlLCBlYWNoIgorCQkgIiBpbnRlcmZhY2Ugc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIFRoZSB0eXBlcyBhcmUgJ2tjcycsIgorCQkgIiAnc21pYycsIGFuZCAnYnQnLiAgRm9yIGV4YW1wbGUgc2lfdHlwZT1rY3MsYnQgd2lsbCBzZXQiCisJCSAiIHRoZSBmaXJzdCBpbnRlcmZhY2UgdG8ga2NzIGFuZCB0aGUgc2Vjb25kIHRvIGJ0Iik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYWRkcnMsIGxvbmcsICZudW1fYWRkcnMsIDApOworTU9EVUxFX1BBUk1fREVTQyhhZGRycywgIlNldHMgdGhlIG1lbW9yeSBhZGRyZXNzIG9mIGVhY2ggaW50ZXJmYWNlLCB0aGUiCisJCSAiIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgT25seSB1c2UgaWYgYW4gaW50ZXJmYWNlIgorCQkgIiBpcyBpbiBtZW1vcnkuICBPdGhlcndpc2UsIHNldCBpdCB0byB6ZXJvIG9yIGxlYXZlIgorCQkgIiBpdCBibGFuay4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgaW50LCAmbnVtX3BvcnRzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJTZXRzIHRoZSBwb3J0IGFkZHJlc3Mgb2YgZWFjaCBpbnRlcmZhY2UsIHRoZSIKKwkJICIgYWRkcmVzc2VzIHNlcGFyYXRlZCBieSBjb21tYXMuICBPbmx5IHVzZSBpZiBhbiBpbnRlcmZhY2UiCisJCSAiIGlzIGEgcG9ydC4gIE90aGVyd2lzZSwgc2V0IGl0IHRvIHplcm8gb3IgbGVhdmUiCisJCSAiIGl0IGJsYW5rLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycXMsIGludCwgJm51bV9pcnFzLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxcywgIlNldHMgdGhlIGludGVycnVwdCBvZiBlYWNoIGludGVyZmFjZSwgdGhlIgorCQkgIiBhZGRyZXNzZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIE9ubHkgdXNlIGlmIGFuIGludGVyZmFjZSIKKwkJICIgaGFzIGFuIGludGVycnVwdC4gIE90aGVyd2lzZSwgc2V0IGl0IHRvIHplcm8gb3IgbGVhdmUiCisJCSAiIGl0IGJsYW5rLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHJlZ3NwYWNpbmdzLCBpbnQsICZudW1fcmVnc3BhY2luZ3MsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZWdzcGFjaW5ncywgIlRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiB0aGUgc3RhcnQgYWRkcmVzcyIKKwkJICIgYW5kIGVhY2ggc3VjY2Vzc2l2ZSByZWdpc3RlciB1c2VkIGJ5IHRoZSBpbnRlcmZhY2UuICBGb3IiCisJCSAiIGluc3RhbmNlLCBpZiB0aGUgc3RhcnQgYWRkcmVzcyBpcyAweGNhMiBhbmQgdGhlIHNwYWNpbmciCisJCSAiIGlzIDIsIHRoZW4gdGhlIHNlY29uZCBhZGRyZXNzIGlzIGF0IDB4Y2E0LiAgRGVmYXVsdHMiCisJCSAiIHRvIDEuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocmVnc2l6ZXMsIGludCwgJm51bV9yZWdzaXplcywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlZ3NpemVzLCAiVGhlIHNpemUgb2YgdGhlIHNwZWNpZmljIElQTUkgcmVnaXN0ZXIgaW4gYnl0ZXMuIgorCQkgIiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgYmUgMSwgMiwgNCwgb3IgOCBmb3IgYW4gOC1iaXQsIgorCQkgIiAxNi1iaXQsIDMyLWJpdCwgb3IgNjQtYml0IHJlZ2lzdGVyLiAgVXNlIHRoaXMgaWYgeW91IgorCQkgIiB0aGUgOC1iaXQgSVBNSSByZWdpc3RlciBoYXMgdG8gYmUgcmVhZCBmcm9tIGEgbGFyZ2VyIgorCQkgIiByZWdpc3Rlci4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShyZWdzaGlmdHMsIGludCwgJm51bV9yZWdzaGlmdHMsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZWdzaGlmdHMsICJUaGUgYW1vdW50IHRvIHNoaWZ0IHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUuIgorCQkgIiBJUE1JIHJlZ2lzdGVyLCBpbiBiaXRzLiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgZGF0YSIKKwkJICIgaXMgcmVhZCBmcm9tIGEgMzItYml0IHdvcmQgYW5kIHRoZSBJUE1JIGRhdGEgaXMgaW4iCisJCSAiIGJpdCA4LTE1LCB0aGVuIHRoZSBzaGlmdCB3b3VsZCBiZSA4Iik7Cittb2R1bGVfcGFyYW1fYXJyYXkoc2xhdmVfYWRkcnMsIGludCwgJm51bV9zbGF2ZV9hZGRycywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNsYXZlX2FkZHJzLCAiU2V0IHRoZSBkZWZhdWx0IElQTUIgc2xhdmUgYWRkcmVzcyBmb3IiCisJCSAiIHRoZSBjb250cm9sbGVyLiAgTm9ybWFsbHkgdGhpcyBpcyAweDIwLCBidXQgY2FuIGJlIgorCQkgIiBvdmVycmlkZGVuIGJ5IHRoaXMgcGFybS4gIFRoaXMgaXMgYW4gYXJyYXkgaW5kZXhlZCIKKwkJICIgYnkgaW50ZXJmYWNlIG51bWJlci4iKTsKKworCisjZGVmaW5lIElQTUlfTUVNX0FERFJfU1BBQ0UgMQorI2RlZmluZSBJUE1JX0lPX0FERFJfU1BBQ0UgIDIKKworI2lmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpIHx8IGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfUENJKQorc3RhdGljIGludCBpc19uZXdfaW50ZXJmYWNlKGludCBpbnRmLCB1OCBhZGRyX3NwYWNlLCB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTSV9NQVhfUEFSTVM7ICsraSkgeworCQkvKiBEb24ndCBjaGVjayBvdXIgYWRkcmVzcy4gKi8KKwkJaWYgKGkgPT0gaW50ZikKKwkJCWNvbnRpbnVlOworCQlpZiAoc2lfdHlwZVtpXSAhPSBOVUxMKSB7CisJCQlpZiAoKGFkZHJfc3BhY2UgPT0gSVBNSV9NRU1fQUREUl9TUEFDRSAmJgorCQkJICAgICBiYXNlX2FkZHIgPT0gYWRkcnNbaV0pIHx8CisJCQkgICAgKGFkZHJfc3BhY2UgPT0gSVBNSV9JT19BRERSX1NQQUNFICYmCisJCQkgICAgIGJhc2VfYWRkciA9PSBwb3J0c1tpXSkpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzdGRfaXJxX3NldHVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKK3sKKwlpbnQgcnY7CisKKwlpZiAoIWluZm8tPmlycSkKKwkJcmV0dXJuIDA7CisKKwlydiA9IHJlcXVlc3RfaXJxKGluZm8tPmlycSwKKwkJCSBzaV9pcnFfaGFuZGxlciwKKwkJCSBTQV9JTlRFUlJVUFQsCisJCQkgREVWSUNFX05BTUUsCisJCQkgaW5mbyk7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJpcG1pX3NpOiAlcyB1bmFibGUgdG8gY2xhaW0gaW50ZXJydXB0ICVkLCIKKwkJICAgICAgICIgcnVubmluZyBwb2xsZWRcbiIsCisJCSAgICAgICBERVZJQ0VfTkFNRSwgaW5mby0+aXJxKTsKKwkJaW5mby0+aXJxID0gMDsKKwl9IGVsc2UgeworCQlwcmludGsoIiAgVXNpbmcgaXJxICVkXG4iLCBpbmZvLT5pcnEpOworCX0KKworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgc3RkX2lycV9jbGVhbnVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8tPmlycSkKKwkJcmV0dXJuOworCisJZnJlZV9pcnEoaW5mby0+aXJxLCBpbmZvKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcG9ydF9pbmIoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgKmFkZHIgPSBpby0+aW5mbzsKKworCXJldHVybiBpbmIoKCphZGRyKSsob2Zmc2V0KmlvLT5yZWdzcGFjaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfb3V0YihzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW8tPmluZm87CisKKwlvdXRiKGIsICgqYWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBvcnRfaW53KHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW8tPmluZm87CisKKwlyZXR1cm4gKGludygoKmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpID4+IGlvLT5yZWdzaGlmdCkgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBwb3J0X291dHcoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgICAgdW5zaWduZWQgY2hhciBiKQoreworCXVuc2lnbmVkIGludCAqYWRkciA9IGlvLT5pbmZvOworCisJb3V0dyhiIDw8IGlvLT5yZWdzaGlmdCwgKCphZGRyKSsob2Zmc2V0ICogaW8tPnJlZ3NwYWNpbmcpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcG9ydF9pbmwoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgKmFkZHIgPSBpby0+aW5mbzsKKworCXJldHVybiAoaW5sKCgqYWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSkgPj4gaW8tPnJlZ3NoaWZ0KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfb3V0bChzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW8tPmluZm87CisKKwlvdXRsKGIgPDwgaW8tPnJlZ3NoaWZ0LCAoKmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpOworfQorCitzdGF0aWMgdm9pZCBwb3J0X2NsZWFudXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGludCAqYWRkciA9IGluZm8tPmlvLmluZm87CisJaW50ICAgICAgICAgICBtYXBzaXplOworCisJaWYgKGFkZHIgJiYgKCphZGRyKSkgeworCQltYXBzaXplID0gKChpbmZvLT5pb19zaXplICogaW5mby0+aW8ucmVnc3BhY2luZykKKwkJCSAgIC0gKGluZm8tPmlvLnJlZ3NwYWNpbmcgLSBpbmZvLT5pby5yZWdzaXplKSk7CisKKwkJcmVsZWFzZV9yZWdpb24gKCphZGRyLCBtYXBzaXplKTsKKwl9CisJa2ZyZWUoaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9zZXR1cChzdHJ1Y3Qgc21pX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50ICphZGRyID0gaW5mby0+aW8uaW5mbzsKKwlpbnQgICAgICAgICAgIG1hcHNpemU7CisKKwlpZiAoIWFkZHIgfHwgKCEqYWRkcikpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mby0+aW9fY2xlYW51cCA9IHBvcnRfY2xlYW51cDsKKworCS8qIEZpZ3VyZSBvdXQgdGhlIGFjdHVhbCBpbmIvaW53L2lubC9ldGMgcm91dGluZSB0byB1c2UgYmFzZWQKKwkgICB1cG9uIHRoZSByZWdpc3RlciBzaXplLiAqLworCXN3aXRjaCAoaW5mby0+aW8ucmVnc2l6ZSkgeworCWNhc2UgMToKKwkJaW5mby0+aW8uaW5wdXRiID0gcG9ydF9pbmI7CisJCWluZm8tPmlvLm91dHB1dGIgPSBwb3J0X291dGI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW5mby0+aW8uaW5wdXRiID0gcG9ydF9pbnc7CisJCWluZm8tPmlvLm91dHB1dGIgPSBwb3J0X291dHc7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaW5mby0+aW8uaW5wdXRiID0gcG9ydF9pbmw7CisJCWluZm8tPmlvLm91dHB1dGIgPSBwb3J0X291dGw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiaXBtaV9zaTogSW52YWxpZCByZWdpc3RlciBzaXplOiAlZFxuIiwKKwkJICAgICAgIGluZm8tPmlvLnJlZ3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgdG8gY2xhaW0uICBUaGlzIGlzIGFuCisJICogdW51c3VhbCBsb29raW5nIGNhbGN1bGF0aW9uLCBidXQgaXQgYXZvaWRzIGNsYWltaW5nIGFueQorCSAqIG1vcmUgbWVtb3J5IHRoYW4gaXQgaGFzIHRvLiAgSXQgd2lsbCBjbGFpbSBldmVyeXRoaW5nCisJICogYmV0d2VlbiB0aGUgZmlyc3QgYWRkcmVzcyB0byB0aGUgZW5kIG9mIHRoZSBsYXN0IGZ1bGwKKwkgKiByZWdpc3Rlci4gKi8KKwltYXBzaXplID0gKChpbmZvLT5pb19zaXplICogaW5mby0+aW8ucmVnc3BhY2luZykKKwkJICAgLSAoaW5mby0+aW8ucmVnc3BhY2luZyAtIGluZm8tPmlvLnJlZ3NpemUpKTsKKworCWlmIChyZXF1ZXN0X3JlZ2lvbigqYWRkciwgbWFwc2l6ZSwgREVWSUNFX05BTUUpID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRyeV9pbml0X3BvcnQoaW50IGludGZfbnVtLCBzdHJ1Y3Qgc21pX2luZm8gKipuZXdfaW5mbykKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gKmluZm87CisKKwlpZiAoIXBvcnRzW2ludGZfbnVtXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWlzX25ld19pbnRlcmZhY2UoaW50Zl9udW0sIElQTUlfSU9fQUREUl9TUEFDRSwKKwkJCSAgICAgIHBvcnRzW2ludGZfbnVtXSkpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDEpXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWluZm8tPmlvX3NldHVwID0gcG9ydF9zZXR1cDsKKwlpbmZvLT5pby5pbmZvID0gJihwb3J0c1tpbnRmX251bV0pOworCWluZm8tPmlvLmFkZHIgPSBOVUxMOworCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NpemUgPSByZWdzaXplc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzaXplKQorCQlpbmZvLT5pby5yZWdzaXplID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NoaWZ0ID0gcmVnc2hpZnRzW2ludGZfbnVtXTsKKwlpbmZvLT5pcnEgPSAwOworCWluZm8tPmlycV9zZXR1cCA9IE5VTEw7CisJKm5ld19pbmZvID0gaW5mbzsKKworCWlmIChzaV90eXBlW2ludGZfbnVtXSA9PSBOVUxMKQorCQlzaV90eXBlW2ludGZfbnVtXSA9ICJrY3MiOworCisJcHJpbnRrKCJpcG1pX3NpOiBUcnlpbmcgXCIlc1wiIGF0IEkvTyBwb3J0IDB4JXhcbiIsCisJICAgICAgIHNpX3R5cGVbaW50Zl9udW1dLCBwb3J0c1tpbnRmX251bV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtZW1faW5iKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRiKChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lbV9vdXRiKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSAgICAgdW5zaWduZWQgY2hhciBiKQoreworCXdyaXRlYihiLCAoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtZW1faW53KHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIChyZWFkdygoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpID4+IGlvLT5yZWdzaGlmdCkKKwkJJiYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgbWVtX291dHcoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJd3JpdGViKGIgPDwgaW8tPnJlZ3NoaWZ0LCAoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtZW1faW5sKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIChyZWFkbCgoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpID4+IGlvLT5yZWdzaGlmdCkKKwkJJiYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgbWVtX291dGwoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgICB1bnNpZ25lZCBjaGFyIGIpCit7CisJd3JpdGVsKGIgPDwgaW8tPnJlZ3NoaWZ0LCAoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpOworfQorCisjaWZkZWYgcmVhZHEKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1lbV9pbnEoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKHJlYWRxKChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSkgPj4gaW8tPnJlZ3NoaWZ0KQorCQkmJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBtZW1fb3V0cShzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgIHVuc2lnbmVkIGNoYXIgYikKK3sKKwl3cml0ZXEoYiA8PCBpby0+cmVnc2hpZnQsIChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbWVtX2NsZWFudXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgKmFkZHIgPSBpbmZvLT5pby5pbmZvOworCWludCAgICAgICAgICAgbWFwc2l6ZTsKKworCWlmIChpbmZvLT5pby5hZGRyKSB7CisJCWlvdW5tYXAoaW5mby0+aW8uYWRkcik7CisKKwkJbWFwc2l6ZSA9ICgoaW5mby0+aW9fc2l6ZSAqIGluZm8tPmlvLnJlZ3NwYWNpbmcpCisJCQkgICAtIChpbmZvLT5pby5yZWdzcGFjaW5nIC0gaW5mby0+aW8ucmVnc2l6ZSkpOworCisJCXJlbGVhc2VfbWVtX3JlZ2lvbigqYWRkciwgbWFwc2l6ZSk7CisJfQorCWtmcmVlKGluZm8pOworfQorCitzdGF0aWMgaW50IG1lbV9zZXR1cChzdHJ1Y3Qgc21pX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyAqYWRkciA9IGluZm8tPmlvLmluZm87CisJaW50ICAgICAgICAgICBtYXBzaXplOworCisJaWYgKCFhZGRyIHx8ICghKmFkZHIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWluZm8tPmlvX2NsZWFudXAgPSBtZW1fY2xlYW51cDsKKworCS8qIEZpZ3VyZSBvdXQgdGhlIGFjdHVhbCByZWFkYi9yZWFkdy9yZWFkbC9ldGMgcm91dGluZSB0byB1c2UgYmFzZWQKKwkgICB1cG9uIHRoZSByZWdpc3RlciBzaXplLiAqLworCXN3aXRjaCAoaW5mby0+aW8ucmVnc2l6ZSkgeworCWNhc2UgMToKKwkJaW5mby0+aW8uaW5wdXRiID0gbWVtX2luYjsKKwkJaW5mby0+aW8ub3V0cHV0YiA9IG1lbV9vdXRiOworCQlicmVhazsKKwljYXNlIDI6CisJCWluZm8tPmlvLmlucHV0YiA9IG1lbV9pbnc7CisJCWluZm8tPmlvLm91dHB1dGIgPSBtZW1fb3V0dzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpbmZvLT5pby5pbnB1dGIgPSBtZW1faW5sOworCQlpbmZvLT5pby5vdXRwdXRiID0gbWVtX291dGw7CisJCWJyZWFrOworI2lmZGVmIHJlYWRxCisJY2FzZSA4OgorCQlpbmZvLT5pby5pbnB1dGIgPSBtZW1faW5xOworCQlpbmZvLT5pby5vdXRwdXRiID0gbWVtX291dHE7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJpcG1pX3NpOiBJbnZhbGlkIHJlZ2lzdGVyIHNpemU6ICVkXG4iLAorCQkgICAgICAgaW5mby0+aW8ucmVnc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENhbGN1bGF0ZSB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB0byBjbGFpbS4gIFRoaXMgaXMgYW4KKwkgKiB1bnVzdWFsIGxvb2tpbmcgY2FsY3VsYXRpb24sIGJ1dCBpdCBhdm9pZHMgY2xhaW1pbmcgYW55CisJICogbW9yZSBtZW1vcnkgdGhhbiBpdCBoYXMgdG8uICBJdCB3aWxsIGNsYWltIGV2ZXJ5dGhpbmcKKwkgKiBiZXR3ZWVuIHRoZSBmaXJzdCBhZGRyZXNzIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgZnVsbAorCSAqIHJlZ2lzdGVyLiAqLworCW1hcHNpemUgPSAoKGluZm8tPmlvX3NpemUgKiBpbmZvLT5pby5yZWdzcGFjaW5nKQorCQkgICAtIChpbmZvLT5pby5yZWdzcGFjaW5nIC0gaW5mby0+aW8ucmVnc2l6ZSkpOworCisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbigqYWRkciwgbWFwc2l6ZSwgREVWSUNFX05BTUUpID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJaW5mby0+aW8uYWRkciA9IGlvcmVtYXAoKmFkZHIsIG1hcHNpemUpOworCWlmIChpbmZvLT5pby5hZGRyID09IE5VTEwpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKCphZGRyLCBtYXBzaXplKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRyeV9pbml0X21lbShpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKm5ld19pbmZvKQoreworCXN0cnVjdCBzbWlfaW5mbyAqaW5mbzsKKworCWlmICghYWRkcnNbaW50Zl9udW1dKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghaXNfbmV3X2ludGVyZmFjZShpbnRmX251bSwgSVBNSV9NRU1fQUREUl9TUEFDRSwKKwkJCSAgICAgIGFkZHJzW2ludGZfbnVtXSkpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDIpXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWluZm8tPmlvX3NldHVwID0gbWVtX3NldHVwOworCWluZm8tPmlvLmluZm8gPSAmYWRkcnNbaW50Zl9udW1dOworCWluZm8tPmlvLmFkZHIgPSBOVUxMOworCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NpemUgPSByZWdzaXplc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzaXplKQorCQlpbmZvLT5pby5yZWdzaXplID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NoaWZ0ID0gcmVnc2hpZnRzW2ludGZfbnVtXTsKKwlpbmZvLT5pcnEgPSAwOworCWluZm8tPmlycV9zZXR1cCA9IE5VTEw7CisJKm5ld19pbmZvID0gaW5mbzsKKworCWlmIChzaV90eXBlW2ludGZfbnVtXSA9PSBOVUxMKQorCQlzaV90eXBlW2ludGZfbnVtXSA9ICJrY3MiOworCisJcHJpbnRrKCJpcG1pX3NpOiBUcnlpbmcgXCIlc1wiIGF0IG1lbW9yeSBhZGRyZXNzIDB4JWx4XG4iLAorCSAgICAgICBzaV90eXBlW2ludGZfbnVtXSwgYWRkcnNbaW50Zl9udW1dKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX0FDUElfSU5URVJQUkVURVIKKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworLyogT25jZSB3ZSBnZXQgYW4gQUNQSSBmYWlsdXJlLCB3ZSBkb24ndCB0cnkgYW55IG1vcmUsIGJlY2F1c2Ugd2UgZ28KKyAgIHRocm91Z2ggdGhlIHRhYmxlcyBzZXF1ZW50aWFsbHkuICBPbmNlIHdlIGRvbid0IGZpbmQgYSB0YWJsZSwgdGhlcmUKKyAgIGFyZSBubyBtb3JlLiAqLworc3RhdGljIGludCBhY3BpX2ZhaWx1cmUgPSAwOworCisvKiBGb3IgR1BFLXR5cGUgaW50ZXJydXB0cy4gKi8KK3N0YXRpYyB1MzIgaXBtaV9hY3BpX2dwZSh2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8gPSBjb250ZXh0OworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKyNpZmRlZiBERUJVR19USU1JTkcKKwlzdHJ1Y3QgdGltZXZhbCB0OworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNtaV9pbmZvLT5zaV9sb2NrKSwgZmxhZ3MpOworCisJc3Bpbl9sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7CisJc21pX2luZm8tPmludGVycnVwdHMrKzsKKwlzcGluX3VubG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOworCisJaWYgKHNtaV9pbmZvLT5zdG9wX29wZXJhdGlvbikKKwkJZ290byBvdXQ7CisKKyNpZmRlZiBERUJVR19USU1JTkcKKwlkb19nZXR0aW1lb2ZkYXkoJnQpOworCXByaW50aygiKipBQ1BJX0dQRTogJWQuJTkuOWRcbiIsIHQudHZfc2VjLCB0LnR2X3VzZWMpOworI2VuZGlmCisJc21pX2V2ZW50X2hhbmRsZXIoc21pX2luZm8sIDApOworIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoc21pX2luZm8tPnNpX2xvY2spLCBmbGFncyk7CisKKwlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKK30KKworc3RhdGljIGludCBhY3BpX2dwZV9pcnFfc2V0dXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmICghaW5mby0+aXJxKQorCQlyZXR1cm4gMDsKKworCS8qIEZJWE1FIC0gaXMgbGV2ZWwgdHJpZ2dlcmVkIHJpZ2h0PyAqLworCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcihOVUxMLAorCQkJCQkgIGluZm8tPmlycSwKKwkJCQkJICBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQsCisJCQkJCSAgJmlwbWlfYWNwaV9ncGUsCisJCQkJCSAgaW5mbyk7CisJaWYgKHN0YXR1cyAhPSBBRV9PSykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiaXBtaV9zaTogJXMgdW5hYmxlIHRvIGNsYWltIEFDUEkgR1BFICVkLCIKKwkJICAgICAgICIgcnVubmluZyBwb2xsZWRcbiIsCisJCSAgICAgICBERVZJQ0VfTkFNRSwgaW5mby0+aXJxKTsKKwkJaW5mby0+aXJxID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIgIFVzaW5nIEFDUEkgR1BFICVkXG4iLCBpbmZvLT5pcnEpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfZ3BlX2lycV9jbGVhbnVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8tPmlycSkKKwkJcmV0dXJuOworCisJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgaW5mby0+aXJxLCAmaXBtaV9hY3BpX2dwZSk7Cit9CisKKy8qCisgKiBEZWZpbmVkIGF0CisgKiBodHRwOi8vaDIxMDA3Lnd3dzIuaHAuY29tL2RzcHAvZmlsZXMvdW5wcm90ZWN0ZWQvZGV2cmVzb3VyY2UvRG9jcy9UZWNoUGFwZXJzL0lBNjQvaHBzcG1pLnBkZgorICovCitzdHJ1Y3QgU1BNSVRhYmxlIHsKKwlzOAlTaWduYXR1cmVbNF07CisJdTMyCUxlbmd0aDsKKwl1OAlSZXZpc2lvbjsKKwl1OAlDaGVja3N1bTsKKwlzOAlPRU1JRFs2XTsKKwlzOAlPRU1UYWJsZUlEWzhdOworCXM4CU9FTVJldmlzaW9uWzRdOworCXM4CUNyZWF0b3JJRFs0XTsKKwlzOAlDcmVhdG9yUmV2aXNpb25bNF07CisJdTgJSW50ZXJmYWNlVHlwZTsKKwl1OAlJUE1JbGVnYWN5OworCXMxNglTcGVjaWZpY2F0aW9uUmV2aXNpb247CisKKwkvKgorCSAqIEJpdCAwIC0gU0NJIGludGVycnVwdCBzdXBwb3J0ZWQKKwkgKiBCaXQgMSAtIEkvTyBBUElDL1NBUElDCisJICovCisJdTgJSW50ZXJydXB0VHlwZTsKKworCS8qIElmIGJpdCAwIG9mIEludGVycnVwdFR5cGUgaXMgc2V0LCB0aGVuIHRoaXMgaXMgdGhlIFNDSQorICAgICAgICAgICBpbnRlcnJ1cHQgaW4gdGhlIEdQRXhfU1RTIHJlZ2lzdGVyLiAqLworCXU4CUdQRTsKKworCXMxNglSZXNlcnZlZDsKKworCS8qIElmIGJpdCAxIG9mIEludGVycnVwdFR5cGUgaXMgc2V0LCB0aGVuIHRoaXMgaXMgdGhlIEkvTworICAgICAgICAgICBBUElDL1NBUElDIGludGVycnVwdC4gKi8KKwl1MzIJR2xvYmFsU3lzdGVtSW50ZXJydXB0OworCisJLyogVGhlIGFjdHVhbCByZWdpc3RlciBhZGRyZXNzLiAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBhZGRyOworCisJdTgJVUlEWzRdOworCisJczggICAgICBzcG1pX2lkWzFdOyAvKiBBICdcMCcgdGVybWluYXRlZCBhcnJheSBzdGFydHMgaGVyZS4gKi8KK307CisKK3N0YXRpYyBpbnQgdHJ5X2luaXRfYWNwaShpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKm5ld19pbmZvKQoreworCXN0cnVjdCBzbWlfaW5mbyAgKmluZm87CisJYWNwaV9zdGF0dXMgICAgICBzdGF0dXM7CisJc3RydWN0IFNQTUlUYWJsZSAqc3BtaTsKKwljaGFyICAgICAgICAgICAgICppb190eXBlOworCXU4IAkJIGFkZHJfc3BhY2U7CisKKwlpZiAoYWNwaV9mYWlsdXJlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKCJTUE1JIiwgaW50Zl9udW0rMSwKKwkJCQkJIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLAorCQkJCQkgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikgJnNwbWkpOworCWlmIChzdGF0dXMgIT0gQUVfT0spIHsKKwkJYWNwaV9mYWlsdXJlID0gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHNwbWktPklQTUlsZWdhY3kgIT0gMSkgeworCSAgICBwcmludGsoS0VSTl9JTkZPICJJUE1JOiBCYWQgU1BNSSBsZWdhY3kgJWRcbiIsIHNwbWktPklQTUlsZWdhY3kpOworICAJICAgIHJldHVybiAtRU5PREVWOworCX0KKworCWlmIChzcG1pLT5hZGRyLmFkZHJlc3Nfc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkKKwkJYWRkcl9zcGFjZSA9IElQTUlfTUVNX0FERFJfU1BBQ0U7CisJZWxzZQorCQlhZGRyX3NwYWNlID0gSVBNSV9JT19BRERSX1NQQUNFOworCWlmICghaXNfbmV3X2ludGVyZmFjZSgtMSwgYWRkcl9zcGFjZSwgc3BtaS0+YWRkci5hZGRyZXNzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXNwbWktPmFkZHIucmVnaXN0ZXJfYml0X3dpZHRoKSB7CisJCWFjcGlfZmFpbHVyZSA9IDE7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEZpZ3VyZSBvdXQgdGhlIGludGVyZmFjZSB0eXBlLiAqLworCXN3aXRjaCAoc3BtaS0+SW50ZXJmYWNlVHlwZSkKKwl7CisJY2FzZSAxOgkvKiBLQ1MgKi8KKwkJc2lfdHlwZVtpbnRmX251bV0gPSAia2NzIjsKKwkJYnJlYWs7CisKKwljYXNlIDI6CS8qIFNNSUMgKi8KKwkJc2lfdHlwZVtpbnRmX251bV0gPSAic21pYyI7CisJCWJyZWFrOworCisJY2FzZSAzOgkvKiBCVCAqLworCQlzaV90eXBlW2ludGZfbnVtXSA9ICJidCI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXBtaV9zaTogVW5rbm93biBBQ1BJL1NQTUkgU0kgdHlwZSAlZFxuIiwKKwkJCXNwbWktPkludGVyZmFjZVR5cGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcG1pX3NpOiBDb3VsZCBub3QgYWxsb2NhdGUgU0kgZGF0YSAoMylcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaWYgKHNwbWktPkludGVycnVwdFR5cGUgJiAxKSB7CisJCS8qIFdlJ3ZlIGdvdCBhIEdQRSBpbnRlcnJ1cHQuICovCisJCWluZm8tPmlycSA9IHNwbWktPkdQRTsKKwkJaW5mby0+aXJxX3NldHVwID0gYWNwaV9ncGVfaXJxX3NldHVwOworCQlpbmZvLT5pcnFfY2xlYW51cCA9IGFjcGlfZ3BlX2lycV9jbGVhbnVwOworCX0gZWxzZSBpZiAoc3BtaS0+SW50ZXJydXB0VHlwZSAmIDIpIHsKKwkJLyogV2UndmUgZ290IGFuIEFQSUMvU0FQSUMgaW50ZXJydXB0LiAqLworCQlpbmZvLT5pcnEgPSBzcG1pLT5HbG9iYWxTeXN0ZW1JbnRlcnJ1cHQ7CisJCWluZm8tPmlycV9zZXR1cCA9IHN0ZF9pcnFfc2V0dXA7CisJCWluZm8tPmlycV9jbGVhbnVwID0gc3RkX2lycV9jbGVhbnVwOworCX0gZWxzZSB7CisJCS8qIFVzZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgc2V0dGluZy4gKi8KKwkJaW5mby0+aXJxID0gMDsKKwkJaW5mby0+aXJxX3NldHVwID0gTlVMTDsKKwl9CisKKwlyZWdzcGFjaW5nc1tpbnRmX251bV0gPSBzcG1pLT5hZGRyLnJlZ2lzdGVyX2JpdF93aWR0aCAvIDg7CisJaW5mby0+aW8ucmVnc3BhY2luZyA9IHNwbWktPmFkZHIucmVnaXN0ZXJfYml0X3dpZHRoIC8gODsKKwlyZWdzaXplc1tpbnRmX251bV0gPSByZWdzcGFjaW5nc1tpbnRmX251bV07CisJaW5mby0+aW8ucmVnc2l6ZSA9IHJlZ3NpemVzW2ludGZfbnVtXTsKKwlyZWdzaGlmdHNbaW50Zl9udW1dID0gc3BtaS0+YWRkci5yZWdpc3Rlcl9iaXRfb2Zmc2V0OworCWluZm8tPmlvLnJlZ3NoaWZ0ID0gcmVnc2hpZnRzW2ludGZfbnVtXTsKKworCWlmIChzcG1pLT5hZGRyLmFkZHJlc3Nfc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkgeworCQlpb190eXBlID0gIm1lbW9yeSI7CisJCWluZm8tPmlvX3NldHVwID0gbWVtX3NldHVwOworCQlhZGRyc1tpbnRmX251bV0gPSBzcG1pLT5hZGRyLmFkZHJlc3M7CisJCWluZm8tPmlvLmluZm8gPSAmKGFkZHJzW2ludGZfbnVtXSk7CisJfSBlbHNlIGlmIChzcG1pLT5hZGRyLmFkZHJlc3Nfc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKSB7CisJCWlvX3R5cGUgPSAiSS9PIjsKKwkJaW5mby0+aW9fc2V0dXAgPSBwb3J0X3NldHVwOworCQlwb3J0c1tpbnRmX251bV0gPSBzcG1pLT5hZGRyLmFkZHJlc3M7CisJCWluZm8tPmlvLmluZm8gPSAmKHBvcnRzW2ludGZfbnVtXSk7CisJfSBlbHNlIHsKKwkJa2ZyZWUoaW5mbyk7CisJCXByaW50aygiaXBtaV9zaTogVW5rbm93biBBQ1BJIEkvTyBBZGRyZXNzIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkqbmV3X2luZm8gPSBpbmZvOworCisJcHJpbnRrKCJpcG1pX3NpOiBBQ1BJL1NQTUkgc3BlY2lmaWVzIFwiJXNcIiAlcyBTSSBAIDB4JWx4XG4iLAorCSAgICAgICBzaV90eXBlW2ludGZfbnVtXSwgaW9fdHlwZSwgKHVuc2lnbmVkIGxvbmcpIHNwbWktPmFkZHIuYWRkcmVzcyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODYKK3R5cGVkZWYgc3RydWN0IGRtaV9pcG1pX2RhdGEKK3sKKwl1OCAgIAkJdHlwZTsKKwl1OCAgIAkJYWRkcl9zcGFjZTsKKwl1bnNpZ25lZCBsb25nCWJhc2VfYWRkcjsKKwl1OCAgIAkJaXJxOworCXU4ICAgICAgICAgICAgICBvZmZzZXQ7CisJdTggICAgICAgICAgICAgIHNsYXZlX2FkZHI7Cit9IGRtaV9pcG1pX2RhdGFfdDsKKworc3RhdGljIGRtaV9pcG1pX2RhdGFfdCBkbWlfZGF0YVtTSV9NQVhfRFJJVkVSU107CitzdGF0aWMgaW50IGRtaV9kYXRhX2VudHJpZXM7CisKK3R5cGVkZWYgc3RydWN0IGRtaV9oZWFkZXIKK3sKKwl1OAl0eXBlOworCXU4CWxlbmd0aDsKKwl1MTYJaGFuZGxlOworfSBkbWlfaGVhZGVyX3Q7CisKK3N0YXRpYyBpbnQgZGVjb2RlX2RtaShkbWlfaGVhZGVyX3QgKmRtLCBpbnQgaW50Zl9udW0pCit7CisJdTgJCSpkYXRhID0gKHU4ICopZG07CisJdW5zaWduZWQgbG9uZyAgCWJhc2VfYWRkcjsKKwl1OAkJcmVnX3NwYWNpbmc7CisJdTggICAgICAgICAgICAgIGxlbiA9IGRtLT5sZW5ndGg7CisJZG1pX2lwbWlfZGF0YV90ICppcG1pX2RhdGEgPSBkbWlfZGF0YStpbnRmX251bTsKKworCWlwbWlfZGF0YS0+dHlwZSA9IGRhdGFbNF07CisKKwltZW1jcHkoJmJhc2VfYWRkciwgZGF0YSs4LCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWlmIChsZW4gPj0gMHgxMSkgeworCQlpZiAoYmFzZV9hZGRyICYgMSkgeworCQkJLyogSS9PICovCisJCQliYXNlX2FkZHIgJj0gMHhGRkZFOworCQkJaXBtaV9kYXRhLT5hZGRyX3NwYWNlID0gSVBNSV9JT19BRERSX1NQQUNFOworCQl9CisJCWVsc2UgeworCQkJLyogTWVtb3J5ICovCisJCQlpcG1pX2RhdGEtPmFkZHJfc3BhY2UgPSBJUE1JX01FTV9BRERSX1NQQUNFOworCQl9CisJCS8qIElmIGJpdCA0IG9mIGJ5dGUgMHgxMCBpcyBzZXQsIHRoZW4gdGhlIGxzYiBmb3IgdGhlIGFkZHJlc3MKKwkJICAgaXMgb2RkLiAqLworCQlpcG1pX2RhdGEtPmJhc2VfYWRkciA9IGJhc2VfYWRkciB8ICgoZGF0YVsweDEwXSAmIDB4MTApID4+IDQpOworCisJCWlwbWlfZGF0YS0+aXJxID0gZGF0YVsweDExXTsKKworCQkvKiBUaGUgdG9wIHR3byBiaXRzIG9mIGJ5dGUgMHgxMCBob2xkIHRoZSByZWdpc3RlciBzcGFjaW5nLiAqLworCQlyZWdfc3BhY2luZyA9IChkYXRhWzB4MTBdICYgMHhDMCkgPj4gNjsKKwkJc3dpdGNoKHJlZ19zcGFjaW5nKXsKKwkJY2FzZSAweDAwOiAvKiBCeXRlIGJvdW5kYXJpZXMgKi8KKwkJICAgIGlwbWlfZGF0YS0+b2Zmc2V0ID0gMTsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MDE6IC8qIDMyLWJpdCBib3VuZGFyaWVzICovCisJCSAgICBpcG1pX2RhdGEtPm9mZnNldCA9IDQ7CisJCSAgICBicmVhazsKKwkJY2FzZSAweDAyOiAvKiAxNi1ieXRlIGJvdW5kYXJpZXMgKi8KKwkJICAgIGlwbWlfZGF0YS0+b2Zmc2V0ID0gMTY7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIC8qIFNvbWUgb3RoZXIgaW50ZXJmYWNlLCBqdXN0IGlnbm9yZSBpdC4gKi8KKwkJICAgIHJldHVybiAtRUlPOworCQl9CisJfSBlbHNlIHsKKwkJLyogT2xkIERNSSBzcGVjLiAqLworCQlpcG1pX2RhdGEtPmJhc2VfYWRkciA9IGJhc2VfYWRkcjsKKwkJaXBtaV9kYXRhLT5hZGRyX3NwYWNlID0gSVBNSV9JT19BRERSX1NQQUNFOworCQlpcG1pX2RhdGEtPm9mZnNldCA9IDE7CisJfQorCisJaXBtaV9kYXRhLT5zbGF2ZV9hZGRyID0gZGF0YVs2XTsKKworCWlmIChpc19uZXdfaW50ZXJmYWNlKC0xLCBpcG1pX2RhdGEtPmFkZHJfc3BhY2UsaXBtaV9kYXRhLT5iYXNlX2FkZHIpKSB7CisJCWRtaV9kYXRhX2VudHJpZXMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KGlwbWlfZGF0YSwgMCwgc2l6ZW9mKGRtaV9pcG1pX2RhdGFfdCkpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGRtaV90YWJsZSh1MzIgYmFzZSwgaW50IGxlbiwgaW50IG51bSkKK3sKKwl1OCAJCSAgKmJ1ZjsKKwlzdHJ1Y3QgZG1pX2hlYWRlciAqZG07CisJdTggCQkgICpkYXRhOworCWludCAJCSAgaT0xOworCWludAkJICBzdGF0dXM9LTE7CisJaW50ICAgICAgICAgICAgICAgaW50Zl9udW0gPSAwOworCisJYnVmID0gaW9yZW1hcChiYXNlLCBsZW4pOworCWlmKGJ1Zj09TlVMTCkKKwkJcmV0dXJuIC0xOworCisJZGF0YSA9IGJ1ZjsKKworCXdoaWxlKGk8bnVtICYmIChkYXRhIC0gYnVmKSA8IGxlbikKKwl7CisJCWRtPShkbWlfaGVhZGVyX3QgKilkYXRhOworCisJCWlmKChkYXRhLWJ1ZitkbS0+bGVuZ3RoKSA+PSBsZW4pCisgICAgICAgIAkJYnJlYWs7CisKKwkJaWYgKGRtLT50eXBlID09IDM4KSB7CisJCQlpZiAoZGVjb2RlX2RtaShkbSwgaW50Zl9udW0pID09IDApIHsKKwkJCQlpbnRmX251bSsrOworCQkJCWlmIChpbnRmX251bSA+PSBTSV9NQVhfRFJJVkVSUykKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCSAgICAgICAgZGF0YSs9ZG0tPmxlbmd0aDsKKwkJd2hpbGUoKGRhdGEtYnVmKSA8IGxlbiAmJiAoKmRhdGEgfHwgZGF0YVsxXSkpCisJCQlkYXRhKys7CisJCWRhdGErPTI7CisJCWkrKzsKKwl9CisJaW91bm1hcChidWYpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaW5saW5lIHN0YXRpYyBpbnQgZG1pX2NoZWNrc3VtKHU4ICpidWYpCit7CisJdTggICBzdW09MDsKKwlpbnQgIGE7CisKKwlmb3IoYT0wOyBhPDE1OyBhKyspCisJCXN1bSs9YnVmW2FdOworCXJldHVybiAoc3VtPT0wKTsKK30KKworc3RhdGljIGludCBkbWlfZGVjb2RlKHZvaWQpCit7CisJdTggICBidWZbMTVdOworCXUzMiAgZnA9MHhGMDAwMDsKKworI2lmZGVmIENPTkZJR19TSU1OT1cKKwlyZXR1cm4gLTE7CisjZW5kaWYKKworCXdoaWxlKGZwIDwgMHhGRkZGRikKKwl7CisJCWlzYV9tZW1jcHlfZnJvbWlvKGJ1ZiwgZnAsIDE1KTsKKwkJaWYobWVtY21wKGJ1ZiwgIl9ETUlfIiwgNSk9PTAgJiYgZG1pX2NoZWNrc3VtKGJ1ZikpCisJCXsKKwkJCXUxNiBudW09YnVmWzEzXTw8OHxidWZbMTJdOworCQkJdTE2IGxlbj1idWZbN108PDh8YnVmWzZdOworCQkJdTMyIGJhc2U9YnVmWzExXTw8MjR8YnVmWzEwXTw8MTZ8YnVmWzldPDw4fGJ1Zls4XTsKKworCQkJaWYoZG1pX3RhYmxlKGJhc2UsIGxlbiwgbnVtKSA9PSAwKQorCQkJCXJldHVybiAwOworCQl9CisJCWZwKz0xNjsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X2luaXRfc21iaW9zKGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqbmV3X2luZm8pCit7CisJc3RydWN0IHNtaV9pbmZvICAgKmluZm87CisJZG1pX2lwbWlfZGF0YV90ICAgKmlwbWlfZGF0YSA9IGRtaV9kYXRhK2ludGZfbnVtOworCWNoYXIgICAgICAgICAgICAgICppb190eXBlOworCisJaWYgKGludGZfbnVtID49IGRtaV9kYXRhX2VudHJpZXMpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoKGlwbWlfZGF0YS0+dHlwZSkgeworCQljYXNlIDB4MDE6IC8qIEtDUyAqLworCQkJc2lfdHlwZVtpbnRmX251bV0gPSAia2NzIjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6IC8qIFNNSUMgKi8KKwkJCXNpX3R5cGVbaW50Zl9udW1dID0gInNtaWMiOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzogLyogQlQgKi8KKwkJCXNpX3R5cGVbaW50Zl9udW1dID0gImJ0IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU87CisJfQorCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDQpXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWlmIChpcG1pX2RhdGEtPmFkZHJfc3BhY2UgPT0gMSkgeworCQlpb190eXBlID0gIm1lbW9yeSI7CisJCWluZm8tPmlvX3NldHVwID0gbWVtX3NldHVwOworCQlhZGRyc1tpbnRmX251bV0gPSBpcG1pX2RhdGEtPmJhc2VfYWRkcjsKKwkJaW5mby0+aW8uaW5mbyA9ICYoYWRkcnNbaW50Zl9udW1dKTsKKwl9IGVsc2UgaWYgKGlwbWlfZGF0YS0+YWRkcl9zcGFjZSA9PSAyKSB7CisJCWlvX3R5cGUgPSAiSS9PIjsKKwkJaW5mby0+aW9fc2V0dXAgPSBwb3J0X3NldHVwOworCQlwb3J0c1tpbnRmX251bV0gPSBpcG1pX2RhdGEtPmJhc2VfYWRkcjsKKwkJaW5mby0+aW8uaW5mbyA9ICYocG9ydHNbaW50Zl9udW1dKTsKKwl9IGVsc2UgeworCQlrZnJlZShpbmZvKTsKKwkJcHJpbnRrKCJpcG1pX3NpOiBVbmtub3duIFNNQklPUyBJL08gQWRkcmVzcyB0eXBlLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJlZ3NwYWNpbmdzW2ludGZfbnVtXSA9IGlwbWlfZGF0YS0+b2Zmc2V0OworCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07CisJaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NpemUgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJaW5mby0+aW8ucmVnc2hpZnQgPSByZWdzaGlmdHNbaW50Zl9udW1dOworCisJaW5mby0+c2xhdmVfYWRkciA9IGlwbWlfZGF0YS0+c2xhdmVfYWRkcjsKKworCWlycXNbaW50Zl9udW1dID0gaXBtaV9kYXRhLT5pcnE7CisKKwkqbmV3X2luZm8gPSBpbmZvOworCisJcHJpbnRrKCJpcG1pX3NpOiBGb3VuZCBTTUJJT1Mtc3BlY2lmaWVkIHN0YXRlIG1hY2hpbmUgYXQgJXMiCisJICAgICAgICIgYWRkcmVzcyAweCVseCwgc2xhdmUgYWRkcmVzcyAweCV4XG4iLAorCSAgICAgICBpb190eXBlLCAodW5zaWduZWQgbG9uZylpcG1pX2RhdGEtPmJhc2VfYWRkciwKKwkgICAgICAgaXBtaV9kYXRhLT5zbGF2ZV9hZGRyKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfWDg2ICovCisKKyNpZmRlZiBDT05GSUdfUENJCisKKyNkZWZpbmUgUENJX0VSTUNfQ0xBU1NDT0RFICAweDBDMDcwMAorI2RlZmluZSBQQ0lfSFBfVkVORE9SX0lEICAgIDB4MTAzQworI2RlZmluZSBQQ0lfTU1DX0RFVklDRV9JRCAgIDB4MTIxQQorI2RlZmluZSBQQ0lfTU1DX0FERFJfQ1cgICAgIDB4MTAKKworLyogQXZvaWQgbW9yZSB0aGFuIG9uZSBhdHRlbXB0IHRvIHByb2JlIHBjaSBzbWljLiAqLworc3RhdGljIGludCBwY2lfc21pY19jaGVja2VkID0gMDsKKworc3RhdGljIGludCBmaW5kX3BjaV9zbWljKGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqbmV3X2luZm8pCit7CisJc3RydWN0IHNtaV9pbmZvICAqaW5mbzsKKwlpbnQgICAgICAgICAgICAgIGVycm9yOworCXN0cnVjdCBwY2lfZGV2ICAgKnBjaV9kZXYgPSBOVUxMOworCXUxNiAgICAJCSBiYXNlX2FkZHI7CisJaW50ICAgICAgICAgICAgICBmZV9ybWMgPSAwOworCisJaWYgKHBjaV9zbWljX2NoZWNrZWQpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpX3NtaWNfY2hlY2tlZCA9IDE7CisKKwlpZiAoKHBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfSFBfVkVORE9SX0lELCBQQ0lfTU1DX0RFVklDRV9JRCwKKwkJCQkgICAgICAgTlVMTCkpKQorCQk7CisJZWxzZSBpZiAoKHBjaV9kZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9FUk1DX0NMQVNTQ09ERSwgTlVMTCkpICYmCisJCSBwY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9IUF9WRU5ET1JfSUQpCisJCWZlX3JtYyA9IDE7CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVycm9yID0gcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX01NQ19BRERSX0NXLCAmYmFzZV9hZGRyKTsKKwlpZiAoZXJyb3IpCisJeworCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogcGNpX3JlYWRfY29uZmlnX3dvcmQoKSBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICAgICBlcnJvcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEJpdCAwOiAxIHNwZWNpZmllcyBwcm9ncmFtbWVkIEkvTywgMCBzcGVjaWZpZXMgbWVtb3J5IG1hcHBlZCBJL08gKi8KKwlpZiAoIShiYXNlX2FkZHIgJiAweDAwMDEpKQorCXsKKwkJcGNpX2Rldl9wdXQocGNpX2Rldik7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlwbWlfc2k6IG1lbW9yeSBtYXBwZWQgSS9PIG5vdCBzdXBwb3J0ZWQgZm9yIFBDSSIKKwkJICAgICAgICIgc21pYy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwliYXNlX2FkZHIgJj0gMHhGRkZFOworCWlmICghZmVfcm1jKQorCQkvKiBEYXRhIHJlZ2lzdGVyIHN0YXJ0cyBhdCBiYXNlIGFkZHJlc3MgKyAxIGluIGVSTUMgKi8KKwkJKytiYXNlX2FkZHI7CisKKwlpZiAoIWlzX25ld19pbnRlcmZhY2UoLTEsIElQTUlfSU9fQUREUl9TUEFDRSwgYmFzZV9hZGRyKSkgeworCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCQlwcmludGsoS0VSTl9FUlIgImlwbWlfc2k6IENvdWxkIG5vdCBhbGxvY2F0ZSBTSSBkYXRhICg1KVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKwlpbmZvLT5pb19zZXR1cCA9IHBvcnRfc2V0dXA7CisJcG9ydHNbaW50Zl9udW1dID0gYmFzZV9hZGRyOworCWluZm8tPmlvLmluZm8gPSAmKHBvcnRzW2ludGZfbnVtXSk7CisJaW5mby0+aW8ucmVnc3BhY2luZyA9IHJlZ3NwYWNpbmdzW2ludGZfbnVtXTsKKwlpZiAoIWluZm8tPmlvLnJlZ3NwYWNpbmcpCisJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJaW5mby0+aW8ucmVnc2l6ZSA9IERFRkFVTFRfUkVHU1BBQ0lORzsKKwlpbmZvLT5pby5yZWdzaGlmdCA9IHJlZ3NoaWZ0c1tpbnRmX251bV07CisKKwkqbmV3X2luZm8gPSBpbmZvOworCisJaXJxc1tpbnRmX251bV0gPSBwY2lfZGV2LT5pcnE7CisJc2lfdHlwZVtpbnRmX251bV0gPSAic21pYyI7CisKKwlwcmludGsoImlwbWlfc2k6IEZvdW5kIFBDSSBTTUlDIGF0IEkvTyBhZGRyZXNzIDB4JWx4XG4iLAorCQkobG9uZyB1bnNpZ25lZCBpbnQpIGJhc2VfYWRkcik7CisKKwlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKK3N0YXRpYyBpbnQgdHJ5X2luaXRfcGx1Z19hbmRfcGxheShpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKm5ld19pbmZvKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAoZmluZF9wY2lfc21pYyhpbnRmX251bSwgbmV3X2luZm8pPT0wKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCS8qIEluY2x1ZGUgb3RoZXIgbWV0aG9kcyBoZXJlLiAqLworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworc3RhdGljIGludCB0cnlfZ2V0X2Rldl9pZChzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCXVuc2lnbmVkIGNoYXIgICAgICBtc2dbMl07CisJdW5zaWduZWQgY2hhciAgICAgICpyZXNwOworCXVuc2lnbmVkIGxvbmcgICAgICByZXNwX2xlbjsKKwllbnVtIHNpX3NtX3Jlc3VsdCBzbWlfcmVzdWx0OworCWludCAgICAgICAgICAgICAgIHJ2ID0gMDsKKworCXJlc3AgPSBrbWFsbG9jKElQTUlfTUFYX01TR19MRU5HVEgsIEdGUF9LRVJORUwpOworCWlmICghcmVzcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBEbyBhIEdldCBEZXZpY2UgSUQgY29tbWFuZCwgc2luY2UgaXQgY29tZXMgYmFjayB3aXRoIHNvbWUKKwkgICB1c2VmdWwgaW5mby4gKi8KKwltc2dbMF0gPSBJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDI7CisJbXNnWzFdID0gSVBNSV9HRVRfREVWSUNFX0lEX0NNRDsKKwlzbWlfaW5mby0+aGFuZGxlcnMtPnN0YXJ0X3RyYW5zYWN0aW9uKHNtaV9pbmZvLT5zaV9zbSwgbXNnLCAyKTsKKworCXNtaV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KHNtaV9pbmZvLT5zaV9zbSwgMCk7CisJZm9yICg7OykKKwl7CisJCWlmIChzbWlfcmVzdWx0ID09IFNJX1NNX0NBTExfV0lUSF9ERUxBWSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJCXNtaV9yZXN1bHQgPSBzbWlfaW5mby0+aGFuZGxlcnMtPmV2ZW50KAorCQkJCXNtaV9pbmZvLT5zaV9zbSwgMTAwKTsKKwkJfQorCQllbHNlIGlmIChzbWlfcmVzdWx0ID09IFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWSkKKwkJeworCQkJc21pX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoCisJCQkJc21pX2luZm8tPnNpX3NtLCAwKTsKKwkJfQorCQllbHNlCisJCQlicmVhazsKKwl9CisJaWYgKHNtaV9yZXN1bHQgPT0gU0lfU01fSE9TRUQpIHsKKwkJLyogV2UgY291bGRuJ3QgZ2V0IHRoZSBzdGF0ZSBtYWNoaW5lIHRvIHJ1biwgc28gd2hhdGV2ZXIncyBhdAorCQkgICB0aGUgcG9ydCBpcyBwcm9iYWJseSBub3QgYW4gSVBNSSBTTUkgaW50ZXJmYWNlLiAqLworCQlydiA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE90aGVyd2lzZSwgd2UgZ290IHNvbWUgZGF0YS4gKi8KKwlyZXNwX2xlbiA9IHNtaV9pbmZvLT5oYW5kbGVycy0+Z2V0X3Jlc3VsdChzbWlfaW5mby0+c2lfc20sCisJCQkJCQkgIHJlc3AsIElQTUlfTUFYX01TR19MRU5HVEgpOworCWlmIChyZXNwX2xlbiA8IDYpIHsKKwkJLyogVGhhdCdzIG9kZCwgaXQgc2hvdWxkIGJlIGxvbmdlci4gKi8KKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKHJlc3BbMV0gIT0gSVBNSV9HRVRfREVWSUNFX0lEX0NNRCkgfHwgKHJlc3BbMl0gIT0gMCkpIHsKKwkJLyogVGhhdCdzIG9kZCwgaXQgc2hvdWxkbid0IGJlIGFibGUgdG8gZmFpbC4gKi8KKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBSZWNvcmQgaW5mbyBmcm9tIHRoZSBnZXQgZGV2aWNlIGlkLCBpbiBjYXNlIHdlIG5lZWQgaXQuICovCisJc21pX2luZm8tPmlwbWlfc2lfZGV2X3JldiA9IHJlc3BbNF0gJiAweGY7CisJc21pX2luZm8tPmlwbWlfc2lfZndfcmV2X21ham9yID0gcmVzcFs1XSAmIDB4N2Y7CisJc21pX2luZm8tPmlwbWlfc2lfZndfcmV2X21pbm9yID0gcmVzcFs2XTsKKwlzbWlfaW5mby0+aXBtaV92ZXJzaW9uX21ham9yID0gcmVzcFs3XSAmIDB4ZjsKKwlzbWlfaW5mby0+aXBtaV92ZXJzaW9uX21pbm9yID0gcmVzcFs3XSA+PiA0OworCisgb3V0OgorCWtmcmVlKHJlc3ApOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCB0eXBlX2ZpbGVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJY2hhciAgICAgICAgICAgICpvdXQgPSAoY2hhciAqKSBwYWdlOworCXN0cnVjdCBzbWlfaW5mbyAqc21pID0gZGF0YTsKKworCXN3aXRjaCAoc21pLT5zaV90eXBlKSB7CisJICAgIGNhc2UgU0lfS0NTOgorCQlyZXR1cm4gc3ByaW50ZihvdXQsICJrY3NcbiIpOworCSAgICBjYXNlIFNJX1NNSUM6CisJCXJldHVybiBzcHJpbnRmKG91dCwgInNtaWNcbiIpOworCSAgICBjYXNlIFNJX0JUOgorCQlyZXR1cm4gc3ByaW50ZihvdXQsICJidFxuIik7CisJICAgIGRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBzdGF0X2ZpbGVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJY2hhciAgICAgICAgICAgICpvdXQgPSAoY2hhciAqKSBwYWdlOworCXN0cnVjdCBzbWlfaW5mbyAqc21pID0gZGF0YTsKKworCW91dCArPSBzcHJpbnRmKG91dCwgImludGVycnVwdHNfZW5hYmxlZDogICAgJWRcbiIsCisJCSAgICAgICBzbWktPmlycSAmJiAhc21pLT5pbnRlcnJ1cHRfZGlzYWJsZWQpOworCW91dCArPSBzcHJpbnRmKG91dCwgInNob3J0X3RpbWVvdXRzOiAgICAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT5zaG9ydF90aW1lb3V0cyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAibG9uZ190aW1lb3V0czogICAgICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPmxvbmdfdGltZW91dHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgInRpbWVvdXRfcmVzdGFydHM6ICAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT50aW1lb3V0X3Jlc3RhcnRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJpZGxlczogICAgICAgICAgICAgICAgICVsZFxuIiwKKwkJICAgICAgIHNtaS0+aWRsZXMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImludGVycnVwdHM6ICAgICAgICAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT5pbnRlcnJ1cHRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJhdHRlbnRpb25zOiAgICAgICAgICAgICVsZFxuIiwKKwkJICAgICAgIHNtaS0+YXR0ZW50aW9ucyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiZmxhZ19mZXRjaGVzOiAgICAgICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPmZsYWdfZmV0Y2hlcyk7CisJb3V0ICs9IHNwcmludGYob3V0LCAiaG9zZWRfY291bnQ6ICAgICAgICAgICAlbGRcbiIsCisJCSAgICAgICBzbWktPmhvc2VkX2NvdW50KTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJjb21wbGV0ZV90cmFuc2FjdGlvbnM6ICVsZFxuIiwKKwkJICAgICAgIHNtaS0+Y29tcGxldGVfdHJhbnNhY3Rpb25zKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJldmVudHM6ICAgICAgICAgICAgICAgICVsZFxuIiwKKwkJICAgICAgIHNtaS0+ZXZlbnRzKTsKKwlvdXQgKz0gc3ByaW50ZihvdXQsICJ3YXRjaGRvZ19wcmV0aW1lb3V0czogICVsZFxuIiwKKwkJICAgICAgIHNtaS0+d2F0Y2hkb2dfcHJldGltZW91dHMpOworCW91dCArPSBzcHJpbnRmKG91dCwgImluY29taW5nX21lc3NhZ2VzOiAgICAgJWxkXG4iLAorCQkgICAgICAgc21pLT5pbmNvbWluZ19tZXNzYWdlcyk7CisKKwlyZXR1cm4gKG91dCAtICgoY2hhciAqKSBwYWdlKSk7Cit9CisKKy8qIFJldHVybnMgMCBpZiBpbml0aWFsaXplZCwgb3IgbmVnYXRpdmUgb24gYW4gZXJyb3IuICovCitzdGF0aWMgaW50IGluaXRfb25lX3NtaShpbnQgaW50Zl9udW0sIHN0cnVjdCBzbWlfaW5mbyAqKnNtaSkKK3sKKwlpbnQJCXJ2OworCXN0cnVjdCBzbWlfaW5mbyAqbmV3X3NtaTsKKworCisJcnYgPSB0cnlfaW5pdF9tZW0oaW50Zl9udW0sICZuZXdfc21pKTsKKwlpZiAocnYpCisJCXJ2ID0gdHJ5X2luaXRfcG9ydChpbnRmX251bSwgJm5ld19zbWkpOworI2lmZGVmIENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSCisJaWYgKChydikgJiYgKHNpX3RyeWRlZmF1bHRzKSkgeworCQlydiA9IHRyeV9pbml0X2FjcGkoaW50Zl9udW0sICZuZXdfc21pKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2CisJaWYgKChydikgJiYgKHNpX3RyeWRlZmF1bHRzKSkgeworCQlydiA9IHRyeV9pbml0X3NtYmlvcyhpbnRmX251bSwgJm5ld19zbWkpOworICAgICAgICB9CisjZW5kaWYKKwlpZiAoKHJ2KSAmJiAoc2lfdHJ5ZGVmYXVsdHMpKSB7CisJCXJ2ID0gdHJ5X2luaXRfcGx1Z19hbmRfcGxheShpbnRmX251bSwgJm5ld19zbWkpOworCX0KKworCisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CisKKwkvKiBTbyB3ZSBrbm93IG5vdCB0byBmcmVlIGl0IHVubGVzcyB3ZSBoYXZlIGFsbG9jYXRlZCBvbmUuICovCisJbmV3X3NtaS0+aW50ZiA9IE5VTEw7CisJbmV3X3NtaS0+c2lfc20gPSBOVUxMOworCW5ld19zbWktPmhhbmRsZXJzID0gTlVMTDsKKworCWlmICghbmV3X3NtaS0+aXJxX3NldHVwKSB7CisJCW5ld19zbWktPmlycSA9IGlycXNbaW50Zl9udW1dOworCQluZXdfc21pLT5pcnFfc2V0dXAgPSBzdGRfaXJxX3NldHVwOworCQluZXdfc21pLT5pcnFfY2xlYW51cCA9IHN0ZF9pcnFfY2xlYW51cDsKKwl9CisKKwkvKiBEZWZhdWx0IHRvIEtDUyBpZiBubyB0eXBlIGlzIHNwZWNpZmllZC4gKi8KKwlpZiAoc2lfdHlwZVtpbnRmX251bV0gPT0gTlVMTCkgeworCQlpZiAoc2lfdHJ5ZGVmYXVsdHMpCisJCQlzaV90eXBlW2ludGZfbnVtXSA9ICJrY3MiOworCQllbHNlIHsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKworCS8qIFNldCB1cCB0aGUgc3RhdGUgbWFjaGluZSB0byB1c2UuICovCisJaWYgKHN0cmNtcChzaV90eXBlW2ludGZfbnVtXSwgImtjcyIpID09IDApIHsKKwkJbmV3X3NtaS0+aGFuZGxlcnMgPSAma2NzX3NtaV9oYW5kbGVyczsKKwkJbmV3X3NtaS0+c2lfdHlwZSA9IFNJX0tDUzsKKwl9IGVsc2UgaWYgKHN0cmNtcChzaV90eXBlW2ludGZfbnVtXSwgInNtaWMiKSA9PSAwKSB7CisJCW5ld19zbWktPmhhbmRsZXJzID0gJnNtaWNfc21pX2hhbmRsZXJzOworCQluZXdfc21pLT5zaV90eXBlID0gU0lfU01JQzsKKwl9IGVsc2UgaWYgKHN0cmNtcChzaV90eXBlW2ludGZfbnVtXSwgImJ0IikgPT0gMCkgeworCQluZXdfc21pLT5oYW5kbGVycyA9ICZidF9zbWlfaGFuZGxlcnM7CisJCW5ld19zbWktPnNpX3R5cGUgPSBTSV9CVDsKKwl9IGVsc2UgeworCQkvKiBObyBzdXBwb3J0IGZvciBhbnl0aGluZyBlbHNlIHlldC4gKi8KKwkJcnYgPSAtRUlPOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIHN0YXRlIG1hY2hpbmUncyBkYXRhIGFuZCBpbml0aWFsaXplIGl0LiAqLworCW5ld19zbWktPnNpX3NtID0ga21hbGxvYyhuZXdfc21pLT5oYW5kbGVycy0+c2l6ZSgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19zbWktPnNpX3NtKSB7CisJCXByaW50aygiIENvdWxkIG5vdCBhbGxvY2F0ZSBzdGF0ZSBtYWNoaW5lIG1lbW9yeVxuIik7CisJCXJ2ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZXJyOworCX0KKwluZXdfc21pLT5pb19zaXplID0gbmV3X3NtaS0+aGFuZGxlcnMtPmluaXRfZGF0YShuZXdfc21pLT5zaV9zbSwKKwkJCQkJCQkmbmV3X3NtaS0+aW8pOworCisJLyogTm93IHRoYXQgd2Uga25vdyB0aGUgSS9PIHNpemUsIHdlIGNhbiBzZXQgdXAgdGhlIEkvTy4gKi8KKwlydiA9IG5ld19zbWktPmlvX3NldHVwKG5ld19zbWkpOworCWlmIChydikgeworCQlwcmludGsoIiBDb3VsZCBub3Qgc2V0IHVwIEkvTyBzcGFjZVxuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmKG5ld19zbWktPnNpX2xvY2spKTsKKwlzcGluX2xvY2tfaW5pdCgmKG5ld19zbWktPm1zZ19sb2NrKSk7CisJc3Bpbl9sb2NrX2luaXQoJihuZXdfc21pLT5jb3VudF9sb2NrKSk7CisKKwkvKiBEbyBsb3ctbGV2ZWwgZGV0ZWN0aW9uIGZpcnN0LiAqLworCWlmIChuZXdfc21pLT5oYW5kbGVycy0+ZGV0ZWN0KG5ld19zbWktPnNpX3NtKSkgeworCQlydiA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiBBdHRlbXB0IGEgZ2V0IGRldmljZSBpZCBjb21tYW5kLiAgSWYgaXQgZmFpbHMsIHdlIHByb2JhYmx5CisgICAgICAgICAgIGRvbid0IGhhdmUgYSBTTUkgaGVyZS4gKi8KKwlydiA9IHRyeV9nZXRfZGV2X2lkKG5ld19zbWkpOworCWlmIChydikKKwkJZ290byBvdXRfZXJyOworCisJLyogVHJ5IHRvIGNsYWltIGFueSBpbnRlcnJ1cHRzLiAqLworCW5ld19zbWktPmlycV9zZXR1cChuZXdfc21pKTsKKworCUlOSVRfTElTVF9IRUFEKCYobmV3X3NtaS0+eG1pdF9tc2dzKSk7CisJSU5JVF9MSVNUX0hFQUQoJihuZXdfc21pLT5ocF94bWl0X21zZ3MpKTsKKwluZXdfc21pLT5jdXJyX21zZyA9IE5VTEw7CisJYXRvbWljX3NldCgmbmV3X3NtaS0+cmVxX2V2ZW50cywgMCk7CisJbmV3X3NtaS0+cnVuX3RvX2NvbXBsZXRpb24gPSAwOworCisJbmV3X3NtaS0+aW50ZXJydXB0X2Rpc2FibGVkID0gMDsKKwluZXdfc21pLT50aW1lcl9zdG9wcGVkID0gMDsKKwluZXdfc21pLT5zdG9wX29wZXJhdGlvbiA9IDA7CisKKwkvKiBTdGFydCBjbGVhcmluZyB0aGUgZmxhZ3MgYmVmb3JlIHdlIGVuYWJsZSBpbnRlcnJ1cHRzIG9yIHRoZQorCSAgIHRpbWVyIHRvIGF2b2lkIHJhY2luZyB3aXRoIHRoZSB0aW1lci4gKi8KKwlzdGFydF9jbGVhcl9mbGFncyhuZXdfc21pKTsKKwkvKiBJUlEgaXMgZGVmaW5lZCB0byBiZSBzZXQgd2hlbiBub24temVyby4gKi8KKwlpZiAobmV3X3NtaS0+aXJxKQorCQluZXdfc21pLT5zaV9zdGF0ZSA9IFNJX0NMRUFSSU5HX0ZMQUdTX1RIRU5fU0VUX0lSUTsKKworCS8qIFRoZSBpcG1pX3JlZ2lzdGVyX3NtaSgpIGNvZGUgZG9lcyBzb21lIG9wZXJhdGlvbnMgdG8KKwkgICBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24sIHNvIHdlIG11c3QgYmUgcmVhZHkgdG8KKwkgICBoYW5kbGUgb3BlcmF0aW9ucyBiZWZvcmUgaXQgaXMgY2FsbGVkLiAgVGhpcyBtZWFucyB3ZSBoYXZlCisJICAgdG8gc3RvcCB0aGUgdGltZXIgaWYgd2UgZ2V0IGFuIGVycm9yIGFmdGVyIHRoaXMgcG9pbnQuICovCisJaW5pdF90aW1lcigmKG5ld19zbWktPnNpX3RpbWVyKSk7CisJbmV3X3NtaS0+c2lfdGltZXIuZGF0YSA9IChsb25nKSBuZXdfc21pOworCW5ld19zbWktPnNpX3RpbWVyLmZ1bmN0aW9uID0gc21pX3RpbWVvdXQ7CisJbmV3X3NtaS0+bGFzdF90aW1lb3V0X2ppZmZpZXMgPSBqaWZmaWVzOworCW5ld19zbWktPnNpX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU0lfVElNRU9VVF9KSUZGSUVTOworCWFkZF90aW1lcigmKG5ld19zbWktPnNpX3RpbWVyKSk7CisKKwlydiA9IGlwbWlfcmVnaXN0ZXJfc21pKCZoYW5kbGVycywKKwkJCSAgICAgICBuZXdfc21pLAorCQkJICAgICAgIG5ld19zbWktPmlwbWlfdmVyc2lvbl9tYWpvciwKKwkJCSAgICAgICBuZXdfc21pLT5pcG1pX3ZlcnNpb25fbWlub3IsCisJCQkgICAgICAgbmV3X3NtaS0+c2xhdmVfYWRkciwKKwkJCSAgICAgICAmKG5ld19zbWktPmludGYpKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogVW5hYmxlIHRvIHJlZ2lzdGVyIGRldmljZTogZXJyb3IgJWRcbiIsCisJCSAgICAgICBydik7CisJCWdvdG8gb3V0X2Vycl9zdG9wX3RpbWVyOworCX0KKworCXJ2ID0gaXBtaV9zbWlfYWRkX3Byb2NfZW50cnkobmV3X3NtaS0+aW50ZiwgInR5cGUiLAorCQkJCSAgICAgdHlwZV9maWxlX3JlYWRfcHJvYywgTlVMTCwKKwkJCQkgICAgIG5ld19zbWksIFRISVNfTU9EVUxFKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogVW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGVudHJ5OiAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwkJZ290byBvdXRfZXJyX3N0b3BfdGltZXI7CisJfQorCisJcnYgPSBpcG1pX3NtaV9hZGRfcHJvY19lbnRyeShuZXdfc21pLT5pbnRmLCAic2lfc3RhdHMiLAorCQkJCSAgICAgc3RhdF9maWxlX3JlYWRfcHJvYywgTlVMTCwKKwkJCQkgICAgIG5ld19zbWksIFRISVNfTU9EVUxFKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogVW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGVudHJ5OiAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwkJZ290byBvdXRfZXJyX3N0b3BfdGltZXI7CisJfQorCisJKnNtaSA9IG5ld19zbWk7CisKKwlwcmludGsoIiBJUE1JICVzIGludGVyZmFjZSBpbml0aWFsaXplZFxuIiwgc2lfdHlwZVtpbnRmX251bV0pOworCisJcmV0dXJuIDA7CisKKyBvdXRfZXJyX3N0b3BfdGltZXI6CisJbmV3X3NtaS0+c3RvcF9vcGVyYXRpb24gPSAxOworCisJLyogV2FpdCBmb3IgdGhlIHRpbWVyIHRvIHN0b3AuICBUaGlzIGF2b2lkcyBwcm9ibGVtcyB3aXRoIHJhY2UKKwkgICBjb25kaXRpb25zIHJlbW92aW5nIHRoZSB0aW1lciBoZXJlLiAqLworCXdoaWxlICghbmV3X3NtaS0+dGltZXJfc3RvcHBlZCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisgb3V0X2VycjoKKwlpZiAobmV3X3NtaS0+aW50ZikKKwkJaXBtaV91bnJlZ2lzdGVyX3NtaShuZXdfc21pLT5pbnRmKTsKKworCW5ld19zbWktPmlycV9jbGVhbnVwKG5ld19zbWkpOworCisJLyogV2FpdCB1bnRpbCB3ZSBrbm93IHRoYXQgd2UgYXJlIG91dCBvZiBhbnkgaW50ZXJydXB0CisJICAgaGFuZGxlcnMgbWlnaHQgaGF2ZSBiZWVuIHJ1bm5pbmcgYmVmb3JlIHdlIGZyZWVkIHRoZQorCSAgIGludGVycnVwdC4gKi8KKwlzeW5jaHJvbml6ZV9rZXJuZWwoKTsKKworCWlmIChuZXdfc21pLT5zaV9zbSkgeworCQlpZiAobmV3X3NtaS0+aGFuZGxlcnMpCisJCQluZXdfc21pLT5oYW5kbGVycy0+Y2xlYW51cChuZXdfc21pLT5zaV9zbSk7CisJCWtmcmVlKG5ld19zbWktPnNpX3NtKTsKKwl9CisJbmV3X3NtaS0+aW9fY2xlYW51cChuZXdfc21pKTsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIF9faW5pdCBpbnQgaW5pdF9pcG1pX3NpKHZvaWQpCit7CisJaW50ICBydiA9IDA7CisJaW50ICBwb3MgPSAwOworCWludCAgaTsKKwljaGFyICpzdHI7CisKKwlpZiAoaW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCWluaXRpYWxpemVkID0gMTsKKworCS8qIFBhcnNlIG91dCB0aGUgc2lfdHlwZSBzdHJpbmcgaW50byBpdHMgY29tcG9uZW50cy4gKi8KKwlzdHIgPSBzaV90eXBlX3N0cjsKKwlpZiAoKnN0ciAhPSAnXDAnKSB7CisJCWZvciAoaT0wOyAoaTxTSV9NQVhfUEFSTVMpICYmICgqc3RyICE9ICdcMCcpOyBpKyspIHsKKwkJCXNpX3R5cGVbaV0gPSBzdHI7CisJCQlzdHIgPSBzdHJjaHIoc3RyLCAnLCcpOworCQkJaWYgKHN0cikgeworCQkJCSpzdHIgPSAnXDAnOworCQkJCXN0cisrOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gIklQTUkgU3lzdGVtIEludGVyZmFjZSBkcml2ZXIgdmVyc2lvbiAiCisJICAgICAgIElQTUlfU0lfVkVSU0lPTik7CisJaWYgKGtjc19zbWlfaGFuZGxlcnMudmVyc2lvbikKKwkJcHJpbnRrKCIsIEtDUyB2ZXJzaW9uICVzIiwga2NzX3NtaV9oYW5kbGVycy52ZXJzaW9uKTsKKwlpZiAoc21pY19zbWlfaGFuZGxlcnMudmVyc2lvbikKKwkJcHJpbnRrKCIsIFNNSUMgdmVyc2lvbiAlcyIsIHNtaWNfc21pX2hhbmRsZXJzLnZlcnNpb24pOworCWlmIChidF9zbWlfaGFuZGxlcnMudmVyc2lvbikKKyAgIAkgICAgICAgIHByaW50aygiLCBCVCB2ZXJzaW9uICVzIiwgYnRfc21pX2hhbmRsZXJzLnZlcnNpb24pOworCXByaW50aygiXG4iKTsKKworI2lmZGVmIENPTkZJR19YODYKKwlkbWlfZGVjb2RlKCk7CisjZW5kaWYKKworCXJ2ID0gaW5pdF9vbmVfc21pKDAsICYoc21pX2luZm9zW3Bvc10pKTsKKwlpZiAocnYgJiYgIXBvcnRzWzBdICYmIHNpX3RyeWRlZmF1bHRzKSB7CisJCS8qIElmIHdlIGFyZSB0cnlpbmcgZGVmYXVsdHMgYW5kIHRoZSBpbml0aWFsIHBvcnQgaXMKKyAgICAgICAgICAgICAgICAgICBub3Qgc2V0LCB0aGVuIHNldCBpdC4gKi8KKwkJc2lfdHlwZVswXSA9ICJrY3MiOworCQlwb3J0c1swXSA9IERFRkFVTFRfS0NTX0lPX1BPUlQ7CisJCXJ2ID0gaW5pdF9vbmVfc21pKDAsICYoc21pX2luZm9zW3Bvc10pKTsKKwkJaWYgKHJ2KSB7CisJCQkvKiBObyBLQ1MgLSB0cnkgU01JQyAqLworCQkJc2lfdHlwZVswXSA9ICJzbWljIjsKKwkJCXBvcnRzWzBdID0gREVGQVVMVF9TTUlDX0lPX1BPUlQ7CisJCQlydiA9IGluaXRfb25lX3NtaSgwLCAmKHNtaV9pbmZvc1twb3NdKSk7CisJCX0KKwkJaWYgKHJ2KSB7CisJCQkvKiBObyBTTUlDIC0gdHJ5IEJUICovCisJCQlzaV90eXBlWzBdID0gImJ0IjsKKwkJCXBvcnRzWzBdID0gREVGQVVMVF9CVF9JT19QT1JUOworCQkJcnYgPSBpbml0X29uZV9zbWkoMCwgJihzbWlfaW5mb3NbcG9zXSkpOworCQl9CisJfQorCWlmIChydiA9PSAwKQorCQlwb3MrKzsKKworCWZvciAoaT0xOyBpIDwgU0lfTUFYX1BBUk1TOyBpKyspIHsKKwkJcnYgPSBpbml0X29uZV9zbWkoaSwgJihzbWlfaW5mb3NbcG9zXSkpOworCQlpZiAocnYgPT0gMCkKKwkJCXBvcysrOworCX0KKworCWlmIChzbWlfaW5mb3NbMF0gPT0gTlVMTCkgeworCQlwcmludGsoImlwbWlfc2k6IFVuYWJsZSB0byBmaW5kIGFueSBTeXN0ZW0gSW50ZXJmYWNlKHMpXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChpbml0X2lwbWlfc2kpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9vbmVfc2koc3RydWN0IHNtaV9pbmZvICp0b19jbGVhbikKK3sKKwlpbnQgICAgICAgICAgIHJ2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoISB0b19jbGVhbikKKwkJcmV0dXJuOworCisJLyogVGVsbCB0aGUgdGltZXIgYW5kIGludGVycnVwdCBoYW5kbGVycyB0aGF0IHdlIGFyZSBzaHV0dGluZworCSAgIGRvd24uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJih0b19jbGVhbi0+c2lfbG9jayksIGZsYWdzKTsKKwlzcGluX2xvY2soJih0b19jbGVhbi0+bXNnX2xvY2spKTsKKworCXRvX2NsZWFuLT5zdG9wX29wZXJhdGlvbiA9IDE7CisKKwl0b19jbGVhbi0+aXJxX2NsZWFudXAodG9fY2xlYW4pOworCisJc3Bpbl91bmxvY2soJih0b19jbGVhbi0+bXNnX2xvY2spKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYodG9fY2xlYW4tPnNpX2xvY2spLCBmbGFncyk7CisKKwkvKiBXYWl0IHVudGlsIHdlIGtub3cgdGhhdCB3ZSBhcmUgb3V0IG9mIGFueSBpbnRlcnJ1cHQKKwkgICBoYW5kbGVycyBtaWdodCBoYXZlIGJlZW4gcnVubmluZyBiZWZvcmUgd2UgZnJlZWQgdGhlCisJICAgaW50ZXJydXB0LiAqLworCXN5bmNocm9uaXplX2tlcm5lbCgpOworCisJLyogV2FpdCBmb3IgdGhlIHRpbWVyIHRvIHN0b3AuICBUaGlzIGF2b2lkcyBwcm9ibGVtcyB3aXRoIHJhY2UKKwkgICBjb25kaXRpb25zIHJlbW92aW5nIHRoZSB0aW1lciBoZXJlLiAqLworCXdoaWxlICghdG9fY2xlYW4tPnRpbWVyX3N0b3BwZWQpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCS8qIEludGVycnVwdHMgYW5kIHRpbWVvdXRzIGFyZSBzdG9wcGVkLCBub3cgbWFrZSBzdXJlIHRoZQorCSAgIGludGVyZmFjZSBpcyBpbiBhIGNsZWFuIHN0YXRlLiAqLworCXdoaWxlICgodG9fY2xlYW4tPmN1cnJfbXNnKSB8fCAodG9fY2xlYW4tPnNpX3N0YXRlICE9IFNJX05PUk1BTCkpIHsKKwkJcG9sbCh0b19jbGVhbik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlydiA9IGlwbWlfdW5yZWdpc3Rlcl9zbWkodG9fY2xlYW4tPmludGYpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpcG1pX3NpOiBVbmFibGUgdG8gdW5yZWdpc3RlciBkZXZpY2U6IGVycm5vPSVkXG4iLAorCQkgICAgICAgcnYpOworCX0KKworCXRvX2NsZWFuLT5oYW5kbGVycy0+Y2xlYW51cCh0b19jbGVhbi0+c2lfc20pOworCisJa2ZyZWUodG9fY2xlYW4tPnNpX3NtKTsKKworCXRvX2NsZWFuLT5pb19jbGVhbnVwKHRvX2NsZWFuKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGNsZWFudXBfaXBtaV9zaSh2b2lkKQoreworCWludCBpOworCisJaWYgKCFpbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJZm9yIChpPTA7IGk8U0lfTUFYX0RSSVZFUlM7IGkrKykgeworCQljbGVhbnVwX29uZV9zaShzbWlfaW5mb3NbaV0pOworCX0KK30KK21vZHVsZV9leGl0KGNsZWFudXBfaXBtaV9zaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfc20uaCBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDIxMmIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9zbS5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogaXBtaV9zaV9zbS5oCisgKgorICogU3RhdGUgbWFjaGluZSBpbnRlcmZhY2UgZm9yIGxvdy1sZXZlbCBJUE1JIHN5c3RlbSBtYW5hZ2VtZW50CisgKiBpbnRlcmZhY2Ugc3RhdGUgbWFjaGluZXMuICBUaGlzIGNvZGUgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuCisgKiB0aGUgaXBtaV9zbWkgY29kZSAodGhhdCBoYW5kbGVzIHRoZSBwb2xpY3kgb2YgYSBLQ1MsIFNNSUMsIG9yCisgKiBCVCBpbnRlcmZhY2UpIGFuZCB0aGUgYWN0dWFsIGxvdy1sZXZlbCBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogVGhpcyBpcyBkZWZpbmVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lcyB0aGVtc2VsdmVzLCBpdCBpcyBhbiBvcGFxdWUKKyAgIGRhdGEgdHlwZSBmb3IgdGhlbSB0byB1c2UuICovCitzdHJ1Y3Qgc2lfc21fZGF0YTsKKworLyogVGhlIHN0cnVjdHVyZSBmb3IgZG9pbmcgSS9PIGluIHRoZSBzdGF0ZSBtYWNoaW5lLiAgVGhlIHN0YXRlCisgICBtYWNoaW5lIGRvZXNuJ3QgaGF2ZSB0aGUgYWN0dWFsIEkvTyByb3V0aW5lcywgdGhleSBhcmUgZG9uZSB0aHJvdWdoCisgICB0aGlzIGludGVyZmFjZS4gKi8KK3N0cnVjdCBzaV9zbV9pbworeworCXVuc2lnbmVkIGNoYXIgKCppbnB1dGIpKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpOworCXZvaWQgKCpvdXRwdXRiKShzdHJ1Y3Qgc2lfc21faW8gKmlvLAorCQkJdW5zaWduZWQgaW50ICBvZmZzZXQsCisJCQl1bnNpZ25lZCBjaGFyIGIpOworCisJLyogR2VuZXJpYyBpbmZvIHVzZWQgYnkgdGhlIGFjdHVhbCBoYW5kbGluZyByb3V0aW5lcywgdGhlCisgICAgICAgICAgIHN0YXRlIG1hY2hpbmUgc2hvdWxkbid0IHRvdWNoIHRoZXNlLiAqLworCXZvaWQgKmluZm87CisJdm9pZCAqYWRkcjsKKwlpbnQgIHJlZ3NwYWNpbmc7CisJaW50ICByZWdzaXplOworCWludCAgcmVnc2hpZnQ7Cit9OworCisvKiBSZXN1bHRzIG9mIFNNSSBldmVudHMuICovCitlbnVtIHNpX3NtX3Jlc3VsdAoreworCVNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWSwgLyogQ2FsbCB0aGUgZHJpdmVyIGFnYWluIGltbWVkaWF0ZWx5ICovCisJU0lfU01fQ0FMTF9XSVRIX0RFTEFZLAkvKiBEZWxheSBzb21lIGJlZm9yZSBjYWxsaW5nIGFnYWluLiAqLworCVNJX1NNX1RSQU5TQUNUSU9OX0NPTVBMRVRFLCAvKiBBIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLiAqLworCVNJX1NNX0lETEUsCQkvKiBUaGUgU00gaXMgaW4gaWRsZSBzdGF0ZS4gKi8KKwlTSV9TTV9IT1NFRCwJCS8qIFRoZSBoYXJkd2FyZSB2aW9sYXRlZCB0aGUgc3RhdGUgbWFjaGluZS4gKi8KKwlTSV9TTV9BVFROCQkvKiBUaGUgaGFyZHdhcmUgaXMgYXNzZXJ0aW5nIGF0dG4gYW5kIHRoZQorCQkJCSAgIHN0YXRlIG1hY2hpbmUgaXMgaWRsZS4gKi8KK307CisKKy8qIEhhbmRsZXJzIGZvciB0aGUgU01JIHN0YXRlIG1hY2hpbmUuICovCitzdHJ1Y3Qgc2lfc21faGFuZGxlcnMKK3sKKwkvKiBQdXQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBzdGF0ZSBtYWNoaW5lIGhlcmUgc28gdGhlCisgICAgICAgICAgIHVwcGVyIGxheWVyIGNhbiBwcmludCBpdC4gKi8KKwljaGFyICp2ZXJzaW9uOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBhbmQgcmV0dXJuIHRoZSBhbW91bnQgb2YgSS9PIHNwYWNlIHRvCisgICAgICAgICAgIHJlc2VydmUgZm9yIHRoZSBzcGFjZS4gKi8KKwl1bnNpZ25lZCBpbnQgKCppbml0X2RhdGEpKHN0cnVjdCBzaV9zbV9kYXRhICpzbWksCisJCQkJICBzdHJ1Y3Qgc2lfc21faW8gICAqaW8pOworCisJLyogU3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24gaW4gdGhlIHN0YXRlIG1hY2hpbmUuICBUaGlzIHdpbGwKKwkgICByZXR1cm4gLTIgaWYgdGhlIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIC0xIGlmIHRoZSBzaXplCisJICAgaXMgaW52YWxpZCAodG8gbGFyZ2Ugb3IgdG9vIHNtYWxsKSwgb3IgMCBpZiB0aGUgdHJhbnNhY3Rpb24KKwkgICBpcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAqLworCWludCAoKnN0YXJ0X3RyYW5zYWN0aW9uKShzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pLAorCQkJCSB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKwkvKiBSZXR1cm4gdGhlIHJlc3VsdHMgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uLiAgVGhpcyB3aWxsIHJldHVybgorCSAgIC0xIGlmIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLCB6ZXJvIGlmIG5vIHRyYW5zYWN0aW9uIGlzCisJICAgcHJlc2VudCwgb3IgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIHJlc3VsdCBkYXRhLiAqLworCWludCAoKmdldF9yZXN1bHQpKHN0cnVjdCBzaV9zbV9kYXRhICpzbWksCisJCQkgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW5ndGgpOworCisJLyogQ2FsbCB0aGlzIHBlcmlvZGljYWxseSAoZm9yIGEgcG9sbGVkIGludGVyZmFjZSkgb3IgdXBvbgorCSAgIHJlY2VpdmluZyBhbiBpbnRlcnJ1cHQgKGZvciBhIGludGVycnVwdC1kcml2ZW4gaW50ZXJmYWNlKS4KKwkgICBJZiBpbnRlcnJ1cHQgZHJpdmVuLCB5b3Ugc2hvdWxkIHByb2JhYmx5IHBvbGwgdGhpcworCSAgIHBlcmlvZGljYWxseSB3aGVuIG5vdCBpbiBpZGxlIHN0YXRlLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkCisJICAgd2l0aCB0aGUgdGltZSB0aGF0IHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsLCBpZiBpdCBpcworCSAgIHNpZ25pZmljYW50LiAgVGltZSBpcyBpbiBtaWNyb3NlY29uZHMuICovCisJZW51bSBzaV9zbV9yZXN1bHQgKCpldmVudCkoc3RydWN0IHNpX3NtX2RhdGEgKnNtaSwgbG9uZyB0aW1lKTsKKworCS8qIEF0dGVtcHQgdG8gZGV0ZWN0IGFuIFNNSS4gIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5vbnplcm8KKyAgICAgICAgICAgb24gZmFpbHVyZS4gKi8KKwlpbnQgKCpkZXRlY3QpKHN0cnVjdCBzaV9zbV9kYXRhICpzbWkpOworCisJLyogVGhlIGludGVyZmFjZSBpcyBzaHV0dGluZyBkb3duLCBzbyBjbGVhbiBpdCB1cC4gKi8KKwl2b2lkICgqY2xlYW51cCkoc3RydWN0IHNpX3NtX2RhdGEgKnNtaSk7CisKKwkvKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIFNNSSBzdHJ1Y3R1cmUgaW4gYnl0ZXMuICovCisJaW50ICgqc2l6ZSkodm9pZCk7Cit9OworCisvKiBDdXJyZW50IHN0YXRlIG1hY2hpbmVzIHRoYXQgd2UgY2FuIHVzZS4gKi8KK2V4dGVybiBzdHJ1Y3Qgc2lfc21faGFuZGxlcnMga2NzX3NtaV9oYW5kbGVyczsKK2V4dGVybiBzdHJ1Y3Qgc2lfc21faGFuZGxlcnMgc21pY19zbWlfaGFuZGxlcnM7CitleHRlcm4gc3RydWN0IHNpX3NtX2hhbmRsZXJzIGJ0X3NtaV9oYW5kbGVyczsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zbWljX3NtLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NtaWNfc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE4NzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zbWljX3NtLmMKQEAgLTAsMCArMSw1OTkgQEAKKy8qCisgKiBpcG1pX3NtaWNfc20uYworICoKKyAqIFRoZSBzdGF0ZS1tYWNoaW5lIGRyaXZlciBmb3IgYW4gSVBNSSBTTUlDIGRyaXZlcgorICoKKyAqIEl0IHN0YXJ0ZWQgYXMgYSBjb3B5IG9mIENvcmV5IE1pbnlhcmQncyBkcml2ZXIgZm9yIHRoZSBLU0MgaW50ZXJmYWNlCisgKiBhbmQgdGhlIGtlcm5lbCBwYXRjaCAibW1jZGV2LXBhdGNoLTI0NSIgYnkgSFAKKyAqCisgKiBtb2RpZmllZCBieToJSGFubmVzIFNjaHVseiA8c2NodWx6QHNjaHdhYXIuY29tPgorICoJCWlwbWlAc2Nod2Fhci5jb20KKyAqCisgKgorICogQ29yZXkgTWlueWFyZCdzIGRyaXZlciBmb3IgdGhlIEtTQyBpbnRlcmZhY2UgaGFzIHRoZSBmb2xsb3dpbmcKKyAqIGNvcHlyaWdodCBub3RpY2U6CisgKiAgIENvcHlyaWdodCAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqIHRoZSBrZXJuZWwgcGF0Y2ggIm1tY2Rldi1wYXRjaC0yNDUiIGJ5IEhQIGhhcyB0aGUgZm9sbG93aW5nCisgKiBjb3B5cmlnaHQgbm90aWNlOgorICogKGMpIENvcHlyaWdodCAyMDAxIEdyYW50IEdydW5kbGVyIChjKSBDb3B5cmlnaHQKKyAqIDIwMDEgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+IC8qIEZvciBwcmludGsuICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CQkvKiBmb3IgY29tcGxldGlvbiBjb2RlcyAqLworI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKKworI2RlZmluZSBJUE1JX1NNSUNfVkVSU0lPTiAidjMzIgorCisvKiBzbWljX2RlYnVnIGlzIGEgYml0LWZpZWxkCisgKglTTUlDX0RFQlVHX0VOQUJMRSAtCXR1cm5lZCBvbiBmb3Igbm93CisgKglTTUlDX0RFQlVHX01TRyAtCWNvbW1hbmRzIGFuZCB0aGVpciByZXNwb25zZXMKKyAqCVNNSUNfREVCVUdfU1RBVEVTIC0Jc3RhdGUgbWFjaGluZQorKi8KKyNkZWZpbmUgU01JQ19ERUJVR19TVEFURVMJNAorI2RlZmluZSBTTUlDX0RFQlVHX01TRwkJMgorI2RlZmluZQlTTUlDX0RFQlVHX0VOQUJMRQkxCisKK3N0YXRpYyBpbnQgc21pY19kZWJ1ZyA9IDE7CisKK2VudW0gc21pY19zdGF0ZXMgeworCVNNSUNfSURMRSwKKwlTTUlDX1NUQVJUX09QLAorCVNNSUNfT1BfT0ssCisJU01JQ19XUklURV9TVEFSVCwKKwlTTUlDX1dSSVRFX05FWFQsCisJU01JQ19XUklURV9FTkQsCisJU01JQ19XUklURTJSRUFELAorCVNNSUNfUkVBRF9TVEFSVCwKKwlTTUlDX1JFQURfTkVYVCwKKwlTTUlDX1JFQURfRU5ELAorCVNNSUNfSE9TRUQKK307CisKKyNkZWZpbmUgTUFYX1NNSUNfUkVBRF9TSVpFIDgwCisjZGVmaW5lIE1BWF9TTUlDX1dSSVRFX1NJWkUgODAKKyNkZWZpbmUgU01JQ19NQVhfRVJST1JfUkVUUklFUyAzCisKKy8qIFRpbWVvdXRzIGluIG1pY3Jvc2Vjb25kcy4gKi8KKyNkZWZpbmUgU01JQ19SRVRSWV9USU1FT1VUIDEwMDAwMAorCisvKiBTTUlDIEZsYWdzIFJlZ2lzdGVyIEJpdHMgKi8KKyNkZWZpbmUgU01JQ19SWF9EQVRBX1JFQURZCTB4ODAKKyNkZWZpbmUgU01JQ19UWF9EQVRBX1JFQURZCTB4NDAKKyNkZWZpbmUgU01JQ19TTUkJCTB4MTAKKyNkZWZpbmUgU01JQ19FVk1fREFUQV9BVkFJTAkweDA4CisjZGVmaW5lIFNNSUNfU01TX0RBVEFfQVZBSUwJMHgwNAorI2RlZmluZSBTTUlDX0ZMQUdfQlNZCQkweDAxCisKKy8qIFNNSUMgRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUJRUNfTk9fRVJST1IJCTB4MDAKKyNkZWZpbmUJRUNfQUJPUlRFRAkJMHgwMQorI2RlZmluZQlFQ19JTExFR0FMX0NPTlRST0wJMHgwMgorI2RlZmluZQlFQ19OT19SRVNQT05TRQkJMHgwMworI2RlZmluZQlFQ19JTExFR0FMX0NPTU1BTkQJMHgwNAorI2RlZmluZQlFQ19CVUZGRVJfRlVMTAkJMHgwNQorCitzdHJ1Y3Qgc2lfc21fZGF0YQoreworCWVudW0gc21pY19zdGF0ZXMgc3RhdGU7CisJc3RydWN0IHNpX3NtX2lvICppbzsKKyAgICAgICAgdW5zaWduZWQgY2hhcgkgd3JpdGVfZGF0YVtNQVhfU01JQ19XUklURV9TSVpFXTsKKyAgICAgICAgaW50CQkgd3JpdGVfcG9zOworICAgICAgICBpbnQJCSB3cml0ZV9jb3VudDsKKyAgICAgICAgaW50CQkgb3JpZ193cml0ZV9jb3VudDsKKyAgICAgICAgdW5zaWduZWQgY2hhcgkgcmVhZF9kYXRhW01BWF9TTUlDX1JFQURfU0laRV07CisgICAgICAgIGludAkJIHJlYWRfcG9zOworICAgICAgICBpbnQJCSB0cnVuY2F0ZWQ7CisgICAgICAgIHVuc2lnbmVkIGludAkgZXJyb3JfcmV0cmllczsKKyAgICAgICAgbG9uZwkJIHNtaWNfdGltZW91dDsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF9zbWljX2RhdGEgKHN0cnVjdCBzaV9zbV9kYXRhICpzbWljLAorCQkJCSAgICBzdHJ1Y3Qgc2lfc21faW8gKmlvKQoreworCXNtaWMtPnN0YXRlID0gU01JQ19JRExFOworCXNtaWMtPmlvID0gaW87CisJc21pYy0+d3JpdGVfcG9zID0gMDsKKwlzbWljLT53cml0ZV9jb3VudCA9IDA7CisJc21pYy0+b3JpZ193cml0ZV9jb3VudCA9IDA7CisJc21pYy0+cmVhZF9wb3MgPSAwOworCXNtaWMtPmVycm9yX3JldHJpZXMgPSAwOworCXNtaWMtPnRydW5jYXRlZCA9IDA7CisJc21pYy0+c21pY190aW1lb3V0ID0gU01JQ19SRVRSWV9USU1FT1VUOworCisJLyogV2UgdXNlIDMgYnl0ZXMgb2YgSS9PLiAqLworCXJldHVybiAzOworfQorCitzdGF0aWMgaW50IHN0YXJ0X3NtaWNfdHJhbnNhY3Rpb24oc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsCisJCQkJICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICgoc2l6ZSA8IDIpIHx8IChzaXplID4gTUFYX1NNSUNfV1JJVEVfU0laRSkpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoKHNtaWMtPnN0YXRlICE9IFNNSUNfSURMRSkgJiYgKHNtaWMtPnN0YXRlICE9IFNNSUNfSE9TRUQpKSB7CisJCXJldHVybiAtMjsKKwl9CisJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX01TRykgeworCQlwcmludGsoS0VSTl9JTkZPICJzdGFydF9zbWljX3RyYW5zYWN0aW9uIC0iKTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKKwkJCXByaW50ayAoIiAlMDJ4IiwgKHVuc2lnbmVkIGNoYXIpIChkYXRhIFtpXSkpOworCQl9CisJCXByaW50ayAoIlxuIik7CisJfQorCXNtaWMtPmVycm9yX3JldHJpZXMgPSAwOworCW1lbWNweShzbWljLT53cml0ZV9kYXRhLCBkYXRhLCBzaXplKTsKKwlzbWljLT53cml0ZV9jb3VudCA9IHNpemU7CisJc21pYy0+b3JpZ193cml0ZV9jb3VudCA9IHNpemU7CisJc21pYy0+d3JpdGVfcG9zID0gMDsKKwlzbWljLT5yZWFkX3BvcyA9IDA7CisJc21pYy0+c3RhdGUgPSBTTUlDX1NUQVJUX09QOworCXNtaWMtPnNtaWNfdGltZW91dCA9IFNNSUNfUkVUUllfVElNRU9VVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbWljX2dldF9yZXN1bHQoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsCisJCQkgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCisJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX01TRykgeworCQlwcmludGsgKEtFUk5fSU5GTyAic21pY19nZXQgcmVzdWx0IC0iKTsKKwkJZm9yIChpID0gMDsgaSA8IHNtaWMtPnJlYWRfcG9zOyBpICsrKSB7CisJCQlwcmludGsgKCIgJTAyeCIsIChzbWljLT5yZWFkX2RhdGEgW2ldKSk7CisJCX0KKwkJcHJpbnRrICgiXG4iKTsKKwl9CisJaWYgKGxlbmd0aCA8IHNtaWMtPnJlYWRfcG9zKSB7CisJCXNtaWMtPnJlYWRfcG9zID0gbGVuZ3RoOworCQlzbWljLT50cnVuY2F0ZWQgPSAxOworCX0KKwltZW1jcHkoZGF0YSwgc21pYy0+cmVhZF9kYXRhLCBzbWljLT5yZWFkX3Bvcyk7CisKKwlpZiAoKGxlbmd0aCA+PSAzKSAmJiAoc21pYy0+cmVhZF9wb3MgPCAzKSkgeworCQlkYXRhWzJdID0gSVBNSV9FUlJfVU5TUEVDSUZJRUQ7CisJCXNtaWMtPnJlYWRfcG9zID0gMzsKKwl9CisJaWYgKHNtaWMtPnRydW5jYXRlZCkgeworCQlkYXRhWzJdID0gSVBNSV9FUlJfTVNHX1RSVU5DQVRFRDsKKwkJc21pYy0+dHJ1bmNhdGVkID0gMDsKKwl9CisJcmV0dXJuIHNtaWMtPnJlYWRfcG9zOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9zbWljX2ZsYWdzKHN0cnVjdCBzaV9zbV9kYXRhICpzbWljKQoreworCXJldHVybiBzbWljLT5pby0+aW5wdXRiKHNtaWMtPmlvLCAyKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRfc21pY19zdGF0dXMoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMpCit7CisJcmV0dXJuIHNtaWMtPmlvLT5pbnB1dGIoc21pYy0+aW8sIDEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9zbWljX2RhdGEoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMpCit7CisJcmV0dXJuIHNtaWMtPmlvLT5pbnB1dGIoc21pYy0+aW8sIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc21pY19mbGFncyhzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYywKKwkJCQkgICAgdW5zaWduZWQgY2hhciAgIGZsYWdzKQoreworCXNtaWMtPmlvLT5vdXRwdXRiKHNtaWMtPmlvLCAyLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zbWljX2NvbnRyb2woc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciAgIGNvbnRyb2wpCit7CisJc21pYy0+aW8tPm91dHB1dGIoc21pYy0+aW8sIDEsIGNvbnRyb2wpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc2lfc21fZGF0YSAoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsCisJCQkJICAgdW5zaWduZWQgY2hhciAgIGRhdGEpCit7CisJc21pYy0+aW8tPm91dHB1dGIoc21pYy0+aW8sIDAsIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsIGNoYXIgKnJlYXNvbikKK3sKKwkoc21pYy0+ZXJyb3JfcmV0cmllcykrKzsKKwlpZiAoc21pYy0+ZXJyb3JfcmV0cmllcyA+IFNNSUNfTUFYX0VSUk9SX1JFVFJJRVMpIHsKKwkJaWYgKHNtaWNfZGVidWcgJiBTTUlDX0RFQlVHX0VOQUJMRSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJpcG1pX3NtaWNfZHJ2OiBzbWljIGhvc2VkOiAlc1xuIiwgcmVhc29uKTsKKwkJfQorCQlzbWljLT5zdGF0ZSA9IFNNSUNfSE9TRUQ7CisJfSBlbHNlIHsKKwkJc21pYy0+d3JpdGVfY291bnQgPSBzbWljLT5vcmlnX3dyaXRlX2NvdW50OworCQlzbWljLT53cml0ZV9wb3MgPSAwOworCQlzbWljLT5yZWFkX3BvcyA9IDA7CisJCXNtaWMtPnN0YXRlID0gU01JQ19TVEFSVF9PUDsKKwkJc21pYy0+c21pY190aW1lb3V0ID0gU01JQ19SRVRSWV9USU1FT1VUOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX25leHRfYnl0ZShzdHJ1Y3Qgc2lfc21fZGF0YSAqc21pYykKK3sKKwl3cml0ZV9zaV9zbV9kYXRhKHNtaWMsIHNtaWMtPndyaXRlX2RhdGFbc21pYy0+d3JpdGVfcG9zXSk7CisJKHNtaWMtPndyaXRlX3BvcykrKzsKKwkoc21pYy0+d3JpdGVfY291bnQpLS07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkX25leHRfYnl0ZSAoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMpCit7CisJaWYgKHNtaWMtPnJlYWRfcG9zID49IE1BWF9TTUlDX1JFQURfU0laRSkgeworCQlyZWFkX3NtaWNfZGF0YSAoc21pYyk7CisJCXNtaWMtPnRydW5jYXRlZCA9IDE7CisJfSBlbHNlIHsKKwkJc21pYy0+cmVhZF9kYXRhW3NtaWMtPnJlYWRfcG9zXSA9IHJlYWRfc21pY19kYXRhKHNtaWMpOworCQkoc21pYy0+cmVhZF9wb3MpKys7CisJfQorfQorCisvKiAgU01JQyBDb250cm9sL1N0YXR1cyBDb2RlIENvbXBvbmVudHMgKi8KKyNkZWZpbmUJU01JQ19HRVRfU1RBVFVTCQkweDAwCS8qIENvbnRyb2wgZm9ybSdzIG5hbWUgKi8KKyNkZWZpbmUJU01JQ19SRUFEWQkJMHgwMAkvKiBTdGF0dXMgIGZvcm0ncyBuYW1lICovCisjZGVmaW5lCVNNSUNfV1JfU1RBUlQJCTB4MDEJLyogVW5pZmllZCBDb250cm9sL1N0YXR1cyBuYW1lcy4uLiAqLworI2RlZmluZQlTTUlDX1dSX05FWFQJCTB4MDIKKyNkZWZpbmUJU01JQ19XUl9FTkQJCTB4MDMKKyNkZWZpbmUJU01JQ19SRF9TVEFSVAkJMHgwNAorI2RlZmluZQlTTUlDX1JEX05FWFQJCTB4MDUKKyNkZWZpbmUJU01JQ19SRF9FTkQJCTB4MDYKKyNkZWZpbmUJU01JQ19DT0RFX01BU0sJCTB4MGYKKworI2RlZmluZQlTTUlDX0NPTlRST0wJCTB4MDAKKyNkZWZpbmUJU01JQ19TVEFUVVMJCTB4ODAKKyNkZWZpbmUJU01JQ19DU19NQVNLCQkweDgwCisKKyNkZWZpbmUJU01JQ19TTVMJCTB4NDAKKyNkZWZpbmUJU01JQ19TTU0JCTB4NjAKKyNkZWZpbmUJU01JQ19TVFJFQU1fTUFTSwkweDYwCisKKy8qICBTTUlDIENvbnRyb2wgQ29kZXMgKi8KKyNkZWZpbmUJU01JQ19DQ19TTVNfR0VUX1NUQVRVUwkoU01JQ19DT05UUk9MfFNNSUNfU01TfFNNSUNfR0VUX1NUQVRVUykKKyNkZWZpbmUJU01JQ19DQ19TTVNfV1JfU1RBUlQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1dSX1NUQVJUKQorI2RlZmluZQlTTUlDX0NDX1NNU19XUl9ORVhUCShTTUlDX0NPTlRST0x8U01JQ19TTVN8U01JQ19XUl9ORVhUKQorI2RlZmluZQlTTUlDX0NDX1NNU19XUl9FTkQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1dSX0VORCkKKyNkZWZpbmUJU01JQ19DQ19TTVNfUkRfU1RBUlQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1JEX1NUQVJUKQorI2RlZmluZQlTTUlDX0NDX1NNU19SRF9ORVhUCShTTUlDX0NPTlRST0x8U01JQ19TTVN8U01JQ19SRF9ORVhUKQorI2RlZmluZQlTTUlDX0NDX1NNU19SRF9FTkQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNU3xTTUlDX1JEX0VORCkKKworI2RlZmluZQlTTUlDX0NDX1NNTV9HRVRfU1RBVFVTCShTTUlDX0NPTlRST0x8U01JQ19TTU18U01JQ19HRVRfU1RBVFVTKQorI2RlZmluZQlTTUlDX0NDX1NNTV9XUl9TVEFSVAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfV1JfU1RBUlQpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1dSX05FWFQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNTXxTTUlDX1dSX05FWFQpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1dSX0VORAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfV1JfRU5EKQorI2RlZmluZQlTTUlDX0NDX1NNTV9SRF9TVEFSVAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfUkRfU1RBUlQpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1JEX05FWFQJKFNNSUNfQ09OVFJPTHxTTUlDX1NNTXxTTUlDX1JEX05FWFQpCisjZGVmaW5lCVNNSUNfQ0NfU01NX1JEX0VORAkoU01JQ19DT05UUk9MfFNNSUNfU01NfFNNSUNfUkRfRU5EKQorCisvKiAgU01JQyBTdGF0dXMgQ29kZXMgKi8KKyNkZWZpbmUJU01JQ19TQ19TTVNfUkVBRFkJKFNNSUNfU1RBVFVTfFNNSUNfU01TfFNNSUNfUkVBRFkpCisjZGVmaW5lCVNNSUNfU0NfU01TX1dSX1NUQVJUCShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1dSX1NUQVJUKQorI2RlZmluZQlTTUlDX1NDX1NNU19XUl9ORVhUCShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1dSX05FWFQpCisjZGVmaW5lCVNNSUNfU0NfU01TX1dSX0VORAkoU01JQ19TVEFUVVN8U01JQ19TTVN8U01JQ19XUl9FTkQpCisjZGVmaW5lCVNNSUNfU0NfU01TX1JEX1NUQVJUCShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1JEX1NUQVJUKQorI2RlZmluZQlTTUlDX1NDX1NNU19SRF9ORVhUCShTTUlDX1NUQVRVU3xTTUlDX1NNU3xTTUlDX1JEX05FWFQpCisjZGVmaW5lCVNNSUNfU0NfU01TX1JEX0VORAkoU01JQ19TVEFUVVN8U01JQ19TTVN8U01JQ19SRF9FTkQpCisKKyNkZWZpbmUJU01JQ19TQ19TTU1fUkVBRFkJKFNNSUNfU1RBVFVTfFNNSUNfU01NfFNNSUNfUkVBRFkpCisjZGVmaW5lCVNNSUNfU0NfU01NX1dSX1NUQVJUCShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1dSX1NUQVJUKQorI2RlZmluZQlTTUlDX1NDX1NNTV9XUl9ORVhUCShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1dSX05FWFQpCisjZGVmaW5lCVNNSUNfU0NfU01NX1dSX0VORAkoU01JQ19TVEFUVVN8U01JQ19TTU18U01JQ19XUl9FTkQpCisjZGVmaW5lCVNNSUNfU0NfU01NX1JEX1NUQVJUCShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1JEX1NUQVJUKQorI2RlZmluZQlTTUlDX1NDX1NNTV9SRF9ORVhUCShTTUlDX1NUQVRVU3xTTUlDX1NNTXxTTUlDX1JEX05FWFQpCisjZGVmaW5lCVNNSUNfU0NfU01NX1JEX0VORAkoU01JQ19TVEFUVVN8U01JQ19TTU18U01JQ19SRF9FTkQpCisKKy8qIHRoZXNlIGFyZSB0aGUgY29udHJvbC9zdGF0dXMgY29kZXMgd2UgYWN0dWFsbHkgdXNlCisJU01JQ19DQ19TTVNfR0VUX1NUQVRVUwkweDQwCisJU01JQ19DQ19TTVNfV1JfU1RBUlQJMHg0MQorCVNNSUNfQ0NfU01TX1dSX05FWFQJMHg0MgorCVNNSUNfQ0NfU01TX1dSX0VORAkweDQzCisJU01JQ19DQ19TTVNfUkRfU1RBUlQJMHg0NAorCVNNSUNfQ0NfU01TX1JEX05FWFQJMHg0NQorCVNNSUNfQ0NfU01TX1JEX0VORAkweDQ2CisKKwlTTUlDX1NDX1NNU19SRUFEWQkweEMwCisJU01JQ19TQ19TTVNfV1JfU1RBUlQJMHhDMQorCVNNSUNfU0NfU01TX1dSX05FWFQJMHhDMgorCVNNSUNfU0NfU01TX1dSX0VORAkweEMzCisJU01JQ19TQ19TTVNfUkRfU1RBUlQJMHhDNAorCVNNSUNfU0NfU01TX1JEX05FWFQJMHhDNQorCVNNSUNfU0NfU01TX1JEX0VORAkweEM2CisqLworCitzdGF0aWMgZW51bSBzaV9zbV9yZXN1bHQgc21pY19ldmVudCAoc3RydWN0IHNpX3NtX2RhdGEgKnNtaWMsIGxvbmcgdGltZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKworCWlmIChzbWljLT5zdGF0ZSA9PSBTTUlDX0hPU0VEKSB7CisJCWluaXRfc21pY19kYXRhKHNtaWMsIHNtaWMtPmlvKTsKKwkJcmV0dXJuIFNJX1NNX0hPU0VEOworCX0KKwlpZiAoc21pYy0+c3RhdGUgIT0gU01JQ19JRExFKSB7CisJCWlmIChzbWljX2RlYnVnICYgU01JQ19ERUJVR19TVEFURVMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAic21pY19ldmVudCAtIHNtaWMtPnNtaWNfdGltZW91dCA9ICVsZCwiCisJCQkgICAgICAgIiB0aW1lID0gJWxkXG4iLAorCQkJICAgICAgIHNtaWMtPnNtaWNfdGltZW91dCwgdGltZSk7CisJCX0KKy8qIEZJWE1FOiBzbWljX2V2ZW50IGlzIHNvbWV0aW1lcyBjYWxsZWQgd2l0aCB0aW1lID4gU01JQ19SRVRSWV9USU1FT1VUICovCisJCWlmICh0aW1lIDwgU01JQ19SRVRSWV9USU1FT1VUKSB7CisJCQlzbWljLT5zbWljX3RpbWVvdXQgLT0gdGltZTsKKwkJCWlmIChzbWljLT5zbWljX3RpbWVvdXQgPCAwKSB7CisJCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc21pYywgInNtaWMgdGltZWQgb3V0LiIpOworCQkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCQl9CisJCX0KKwl9CisJZmxhZ3MgPSByZWFkX3NtaWNfZmxhZ3Moc21pYyk7CisJaWYgKGZsYWdzICYgU01JQ19GTEFHX0JTWSkKKwkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKworCXN0YXR1cyA9IHJlYWRfc21pY19zdGF0dXMgKHNtaWMpOworCWlmIChzbWljX2RlYnVnICYgU01JQ19ERUJVR19TVEFURVMpCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJzbWljX2V2ZW50IC0gc3RhdGUgPSAlZCwgZmxhZ3MgPSAweCUwMngsIgorCQkgICAgICAgIiBzdGF0dXMgPSAweCUwMnhcbiIsCisJCSAgICAgICBzbWljLT5zdGF0ZSwgZmxhZ3MsIHN0YXR1cyk7CisKKwlzd2l0Y2ggKHNtaWMtPnN0YXRlKSB7CisJY2FzZSBTTUlDX0lETEU6CisJCS8qIGluIElETEUgd2UgY2hlY2sgZm9yIGF2YWlsYWJsZSBtZXNzYWdlcyAqLworCQlpZiAoZmxhZ3MgJiAoU01JQ19TTUkgfAorCQkJICAgICBTTUlDX0VWTV9EQVRBX0FWQUlMIHwgU01JQ19TTVNfREFUQV9BVkFJTCkpCisJCXsKKwkJCXJldHVybiBTSV9TTV9BVFROOworCQl9CisJCXJldHVybiBTSV9TTV9JRExFOworCisJY2FzZSBTTUlDX1NUQVJUX09QOgorCQkvKiBzYW5pdHkgY2hlY2sgd2hldGhlciBzbWljIGlzIHJlYWxseSBpZGxlICovCisJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19HRVRfU1RBVFVTKTsKKwkJd3JpdGVfc21pY19mbGFncyhzbWljLCBmbGFncyB8IFNNSUNfRkxBR19CU1kpOworCQlzbWljLT5zdGF0ZSA9IFNNSUNfT1BfT0s7CisJCWJyZWFrOworCisJY2FzZSBTTUlDX09QX09LOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1JFQURZKSB7CisJCQkJLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc21pYywKKwkJCQkJICAgICAic3RhdGUgPSBTTUlDX09QX09LLCIKKwkJCQkJICAgICAiIHN0YXR1cyAhPSBTTUlDX1NDX1NNU19SRUFEWSIpOworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfQorCQkvKiBPSyBzbyBmYXI7IHNtaWMgaXMgaWRsZSBsZXQgdXMgc3RhcnQgLi4uICovCisJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19XUl9TVEFSVCk7CisJCXdyaXRlX25leHRfYnl0ZShzbWljKTsKKwkJd3JpdGVfc21pY19mbGFncyhzbWljLCBmbGFncyB8IFNNSUNfRkxBR19CU1kpOworCQlzbWljLT5zdGF0ZSA9IFNNSUNfV1JJVEVfU1RBUlQ7CisJCWJyZWFrOworCisJY2FzZSBTTUlDX1dSSVRFX1NUQVJUOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1dSX1NUQVJUKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfV1JJVEVfU1RBUlQsICIKKwkJCQkJICAgICAic3RhdHVzICE9IFNNSUNfU0NfU01TX1dSX1NUQVJUIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCS8qIHdlIG11c3Qgbm90IGlzc3VlIFdSXyhORVhUfEVORCkgdW5sZXNzCisgICAgICAgICAgICAgICAgICAgVFhfREFUQV9SRUFEWSBpcyBzZXQgKi8KKwkJaWYgKGZsYWdzICYgU01JQ19UWF9EQVRBX1JFQURZKSB7CisJCQlpZiAoc21pYy0+d3JpdGVfY291bnQgPT0gMSkgeworCQkJCS8qIGxhc3QgYnl0ZSAqLworCQkJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19XUl9FTkQpOworCQkJCXNtaWMtPnN0YXRlID0gU01JQ19XUklURV9FTkQ7CisJCQl9IGVsc2UgeworCQkJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19XUl9ORVhUKTsKKwkJCQlzbWljLT5zdGF0ZSA9IFNNSUNfV1JJVEVfTkVYVDsKKwkJCX0KKwkJCXdyaXRlX25leHRfYnl0ZShzbWljKTsKKwkJCXdyaXRlX3NtaWNfZmxhZ3Moc21pYywgZmxhZ3MgfCBTTUlDX0ZMQUdfQlNZKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNSUNfV1JJVEVfTkVYVDoKKwkJaWYgKHN0YXR1cyAhPSBTTUlDX1NDX1NNU19XUl9ORVhUKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfV1JJVEVfTkVYVCwgIgorCQkJCQkgICAgICJzdGF0dXMgIT0gU01JQ19TQ19TTVNfV1JfTkVYVCIpOworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfQorCQkvKiB0aGlzIGlzIHRoZSBzYW1lIGNvZGUgYXMgaW4gU01JQ19XUklURV9TVEFSVCAqLworCQlpZiAoZmxhZ3MgJiBTTUlDX1RYX0RBVEFfUkVBRFkpIHsKKwkJCWlmIChzbWljLT53cml0ZV9jb3VudCA9PSAxKSB7CisJCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1dSX0VORCk7CisJCQkJc21pYy0+c3RhdGUgPSBTTUlDX1dSSVRFX0VORDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19XUl9ORVhUKTsKKwkJCQlzbWljLT5zdGF0ZSA9IFNNSUNfV1JJVEVfTkVYVDsKKwkJCX0KKwkJCXdyaXRlX25leHRfYnl0ZShzbWljKTsKKwkJCXdyaXRlX3NtaWNfZmxhZ3Moc21pYywgZmxhZ3MgfCBTTUlDX0ZMQUdfQlNZKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNSUNfV1JJVEVfRU5EOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1dSX0VORCkgeworCQkJc3RhcnRfZXJyb3JfcmVjb3ZlcnkgKHNtaWMsCisJCQkJCSAgICAgICJzdGF0ZSA9IFNNSUNfV1JJVEVfRU5ELCAiCisJCQkJCSAgICAgICJzdGF0dXMgIT0gU01JQ19TQ19TTVNfV1JfRU5EIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCS8qIGRhdGEgcmVnaXN0ZXIgaG9sZHMgYW4gZXJyb3IgY29kZSAqLworCQlkYXRhID0gcmVhZF9zbWljX2RhdGEoc21pYyk7CisJCWlmIChkYXRhICE9IDApIHsKKwkJCWlmIChzbWljX2RlYnVnICYgU01JQ19ERUJVR19FTkFCTEUpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICJTTUlDX1dSSVRFX0VORDogZGF0YSA9ICUwMnhcbiIsIGRhdGEpOworCQkJfQorCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc21pYywKKwkJCQkJICAgICAic3RhdGUgPSBTTUlDX1dSSVRFX0VORCwgIgorCQkJCQkgICAgICJkYXRhICE9IFNVQ0NFU1MiKTsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0gZWxzZSB7CisJCQlzbWljLT5zdGF0ZSA9IFNNSUNfV1JJVEUyUkVBRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU01JQ19XUklURTJSRUFEOgorCQkvKiB3ZSBtdXN0IHdhaXQgZm9yIFJYX0RBVEFfUkVBRFkgdG8gYmUgc2V0IGJlZm9yZSB3ZQorICAgICAgICAgICAgICAgICAgIGNhbiBjb250aW51ZSAqLworCQlpZiAoZmxhZ3MgJiBTTUlDX1JYX0RBVEFfUkVBRFkpIHsKKwkJCXdyaXRlX3NtaWNfY29udHJvbChzbWljLCBTTUlDX0NDX1NNU19SRF9TVEFSVCk7CisJCQl3cml0ZV9zbWljX2ZsYWdzKHNtaWMsIGZsYWdzIHwgU01JQ19GTEFHX0JTWSk7CisJCQlzbWljLT5zdGF0ZSA9IFNNSUNfUkVBRF9TVEFSVDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNNSUNfUkVBRF9TVEFSVDoKKwkJaWYgKHN0YXR1cyAhPSBTTUlDX1NDX1NNU19SRF9TVEFSVCkgeworCQkJc3RhcnRfZXJyb3JfcmVjb3Zlcnkoc21pYywKKwkJCQkJICAgICAic3RhdGUgPSBTTUlDX1JFQURfU1RBUlQsICIKKwkJCQkJICAgICAic3RhdHVzICE9IFNNSUNfU0NfU01TX1JEX1NUQVJUIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCWlmIChmbGFncyAmIFNNSUNfUlhfREFUQV9SRUFEWSkgeworCQkJcmVhZF9uZXh0X2J5dGUoc21pYyk7CisJCQl3cml0ZV9zbWljX2NvbnRyb2woc21pYywgU01JQ19DQ19TTVNfUkRfTkVYVCk7CisJCQl3cml0ZV9zbWljX2ZsYWdzKHNtaWMsIGZsYWdzIHwgU01JQ19GTEFHX0JTWSk7CisJCQlzbWljLT5zdGF0ZSA9IFNNSUNfUkVBRF9ORVhUOworCQl9IGVsc2UgeworCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU01JQ19SRUFEX05FWFQ6CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCS8qIHNtaWMgdGVsbHMgdXMgdGhhdCB0aGlzIGlzIHRoZSBsYXN0IGJ5dGUgdG8gYmUgcmVhZAorICAgICAgICAgICAgICAgICAgIC0tPiBjbGVhbiB1cCAqLworCQljYXNlIFNNSUNfU0NfU01TX1JEX0VORDoKKwkJCXJlYWRfbmV4dF9ieXRlKHNtaWMpOworCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1JEX0VORCk7CisJCQl3cml0ZV9zbWljX2ZsYWdzKHNtaWMsIGZsYWdzIHwgU01JQ19GTEFHX0JTWSk7CisJCQlzbWljLT5zdGF0ZSA9IFNNSUNfUkVBRF9FTkQ7CisJCQlicmVhazsKKwkJY2FzZSBTTUlDX1NDX1NNU19SRF9ORVhUOgorCQkJaWYgKGZsYWdzICYgU01JQ19SWF9EQVRBX1JFQURZKSB7CisJCQkJcmVhZF9uZXh0X2J5dGUoc21pYyk7CisJCQkJd3JpdGVfc21pY19jb250cm9sKHNtaWMsIFNNSUNfQ0NfU01TX1JEX05FWFQpOworCQkJCXdyaXRlX3NtaWNfZmxhZ3Moc21pYywgZmxhZ3MgfCBTTUlDX0ZMQUdfQlNZKTsKKwkJCQlzbWljLT5zdGF0ZSA9IFNNSUNfUkVBRF9ORVhUOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeSgKKwkJCQlzbWljLAorCQkJCSJzdGF0ZSA9IFNNSUNfUkVBRF9ORVhULCAiCisJCQkJInN0YXR1cyAhPSBTTUlDX1NDX1NNU19SRF8oTkVYVHxFTkQpIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTUlDX1JFQURfRU5EOgorCQlpZiAoc3RhdHVzICE9IFNNSUNfU0NfU01TX1JFQURZKSB7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfUkVBRF9FTkQsICIKKwkJCQkJICAgICAic3RhdHVzICE9IFNNSUNfU0NfU01TX1JFQURZIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJCWRhdGEgPSByZWFkX3NtaWNfZGF0YShzbWljKTsKKwkJLyogZGF0YSByZWdpc3RlciBob2xkcyBhbiBlcnJvciBjb2RlICovCisJCWlmIChkYXRhICE9IDApIHsKKwkJCWlmIChzbWljX2RlYnVnICYgU01JQ19ERUJVR19FTkFCTEUpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICJTTUlDX1JFQURfRU5EOiBkYXRhID0gJTAyeFxuIiwgZGF0YSk7CisJCQl9CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLAorCQkJCQkgICAgICJzdGF0ZSA9IFNNSUNfUkVBRF9FTkQsICIKKwkJCQkJICAgICAiZGF0YSAhPSBTVUNDRVNTIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9IGVsc2UgeworCQkJc21pYy0+c3RhdGUgPSBTTUlDX0lETEU7CisJCQlyZXR1cm4gU0lfU01fVFJBTlNBQ1RJT05fQ09NUExFVEU7CisJCX0KKworCWNhc2UgU01JQ19IT1NFRDoKKwkJaW5pdF9zbWljX2RhdGEoc21pYywgc21pYy0+aW8pOworCQlyZXR1cm4gU0lfU01fSE9TRUQ7CisKKwlkZWZhdWx0OgorCQlpZiAoc21pY19kZWJ1ZyAmIFNNSUNfREVCVUdfRU5BQkxFKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzbWljLT5zdGF0ZSA9ICVkXG4iLCBzbWljLT5zdGF0ZSk7CisJCQlzdGFydF9lcnJvcl9yZWNvdmVyeShzbWljLCAic3RhdGUgPSBVTktOT1dOIik7CisJCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOworCQl9CisJfQorCXNtaWMtPnNtaWNfdGltZW91dCA9IFNNSUNfUkVUUllfVElNRU9VVDsKKwlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOworfQorCitzdGF0aWMgaW50IHNtaWNfZGV0ZWN0KHN0cnVjdCBzaV9zbV9kYXRhICpzbWljKQoreworCS8qIEl0J3MgaW1wb3NzaWJsZSBmb3IgdGhlIFNNSUMgZm5hZ3MgcmVnaXN0ZXIgdG8gYmUgYWxsIDEncywKKwkgICAoYXNzdW1pbmcgYSBwcm9wZXJseSBmdW5jdGlvbmluZywgc2VsZi1pbml0aWFsaXplZCBCTUMpCisJICAgYnV0IHRoYXQncyB3aGF0IHlvdSBnZXQgZnJvbSByZWFkaW5nIGEgYm9ndXMgYWRkcmVzcywgc28gd2UKKwkgICB0ZXN0IHRoYXQgZmlyc3QuICovCisJaWYgKHJlYWRfc21pY19mbGFncyhzbWljKSA9PSAweGZmKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbWljX2NsZWFudXAoc3RydWN0IHNpX3NtX2RhdGEgKmtjcykKK3sKK30KKworc3RhdGljIGludCBzbWljX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzaV9zbV9kYXRhKTsKK30KKworc3RydWN0IHNpX3NtX2hhbmRsZXJzIHNtaWNfc21pX2hhbmRsZXJzID0KK3sKKwkudmVyc2lvbiAgICAgICAgICAgPSBJUE1JX1NNSUNfVkVSU0lPTiwKKwkuaW5pdF9kYXRhICAgICAgICAgPSBpbml0X3NtaWNfZGF0YSwKKwkuc3RhcnRfdHJhbnNhY3Rpb24gPSBzdGFydF9zbWljX3RyYW5zYWN0aW9uLAorCS5nZXRfcmVzdWx0ICAgICAgICA9IHNtaWNfZ2V0X3Jlc3VsdCwKKwkuZXZlbnQgICAgICAgICAgICAgPSBzbWljX2V2ZW50LAorCS5kZXRlY3QgICAgICAgICAgICA9IHNtaWNfZGV0ZWN0LAorCS5jbGVhbnVwICAgICAgICAgICA9IHNtaWNfY2xlYW51cCwKKwkuc2l6ZSAgICAgICAgICAgICAgPSBzbWljX3NpemUsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzA5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKQEAgLTAsMCArMSwxMDY4IEBACisvKgorICogaXBtaV93YXRjaGRvZy5jCisgKgorICogQSB3YXRjaGRvZyB0aW1lciBiYXNlZCB1cG9uIHRoZSBJUE1JIGludGVyZmFjZS4KKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgQ29yZXkgTWlueWFyZCA8bWlueWFyZEBtdmlzdGEuY29tPgorICogICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICogIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pX3NtaS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNlbmRpZgorCisjZGVmaW5lCVBGWCAiSVBNSSBXYXRjaGRvZzogIgorCisjZGVmaW5lIElQTUlfV0FUQ0hET0dfVkVSU0lPTiAidjMzIgorCisvKgorICogVGhlIElQTUkgY29tbWFuZC9yZXNwb25zZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyLgorICovCisKKy8qIHZhbHVlcyBmb3IgYnl0ZSAxIG9mIHRoZSBzZXQgY29tbWFuZCwgYnl0ZSAyIG9mIHRoZSBnZXQgcmVzcG9uc2UuICovCisjZGVmaW5lIFdET0dfRE9OVF9MT0cJCSgxIDw8IDcpCisjZGVmaW5lIFdET0dfRE9OVF9TVE9QX09OX1NFVAkoMSA8PCA2KQorI2RlZmluZSBXRE9HX1NFVF9USU1FUl9VU0UoYnl0ZSwgdXNlKSBcCisJYnl0ZSA9ICgoYnl0ZSkgJiAweGY4KSB8ICgodXNlKSAmIDB4NykKKyNkZWZpbmUgV0RPR19HRVRfVElNRVJfVVNFKGJ5dGUpICgoYnl0ZSkgJiAweDcpCisjZGVmaW5lIFdET0dfVElNRVJfVVNFX0JJT1NfRlJCMgkxCisjZGVmaW5lIFdET0dfVElNRVJfVVNFX0JJT1NfUE9TVAkyCisjZGVmaW5lIFdET0dfVElNRVJfVVNFX09TX0xPQUQJCTMKKyNkZWZpbmUgV0RPR19USU1FUl9VU0VfU01TX09TCQk0CisjZGVmaW5lIFdET0dfVElNRVJfVVNFX09FTQkJNQorCisvKiB2YWx1ZXMgZm9yIGJ5dGUgMiBvZiB0aGUgc2V0IGNvbW1hbmQsIGJ5dGUgMyBvZiB0aGUgZ2V0IHJlc3BvbnNlLiAqLworI2RlZmluZSBXRE9HX1NFVF9QUkVUSU1FT1VUX0FDVChieXRlLCB1c2UpIFwKKwlieXRlID0gKChieXRlKSAmIDB4OGYpIHwgKCgodXNlKSAmIDB4NykgPDwgNCkKKyNkZWZpbmUgV0RPR19HRVRfUFJFVElNRU9VVF9BQ1QoYnl0ZSkgKCgoYnl0ZSkgPj4gNCkgJiAweDcpCisjZGVmaW5lIFdET0dfUFJFVElNRU9VVF9OT05FCQkwCisjZGVmaW5lIFdET0dfUFJFVElNRU9VVF9TTUkJCTEKKyNkZWZpbmUgV0RPR19QUkVUSU1FT1VUX05NSQkJMgorI2RlZmluZSBXRE9HX1BSRVRJTUVPVVRfTVNHX0lOVAkJMworCisvKiBPcGVyYXRpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhIHByZXRpbW91dC4gKi8KKyNkZWZpbmUgV0RPR19QUkVPUF9OT05FCQkwCisjZGVmaW5lIFdET0dfUFJFT1BfUEFOSUMJMQorI2RlZmluZSBXRE9HX1BSRU9QX0dJVkVfREFUQQkyIC8qIENhdXNlIGRhdGEgdG8gYmUgYXZhaWxhYmxlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC4gIERvZXNuJ3Qgd29yayBpbiBOTUkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLiAqLworCisvKiBBY3Rpb25zIHRvIHBlcmZvcm0gb24gYSBmdWxsIHRpbWVvdXQuICovCisjZGVmaW5lIFdET0dfU0VUX1RJTUVPVVRfQUNUKGJ5dGUsIHVzZSkgXAorCWJ5dGUgPSAoKGJ5dGUpICYgMHhmOCkgfCAoKHVzZSkgJiAweDcpCisjZGVmaW5lIFdET0dfR0VUX1RJTUVPVVRfQUNUKGJ5dGUpICgoYnl0ZSkgJiAweDcpCisjZGVmaW5lIFdET0dfVElNRU9VVF9OT05FCQkwCisjZGVmaW5lIFdET0dfVElNRU9VVF9SRVNFVAkJMQorI2RlZmluZSBXRE9HX1RJTUVPVVRfUE9XRVJfRE9XTgkJMgorI2RlZmluZSBXRE9HX1RJTUVPVVRfUE9XRVJfQ1lDTEUJMworCisvKiBCeXRlIDMgb2YgdGhlIGdldCBjb21tYW5kLCBieXRlIDQgb2YgdGhlIGdldCByZXNwb25zZSBpcyB0aGUKKyAgIHByZS10aW1lb3V0IGluIHNlY29uZHMuICovCisKKy8qIEJpdHMgZm9yIHNldHRpbmcgYnl0ZSA0IG9mIHRoZSBzZXQgY29tbWFuZCwgYnl0ZSA1IG9mIHRoZSBnZXQgcmVzcG9uc2UuICovCisjZGVmaW5lIFdET0dfRVhQSVJFX0NMRUFSX0JJT1NfRlJCMgkoMSA8PCAxKQorI2RlZmluZSBXRE9HX0VYUElSRV9DTEVBUl9CSU9TX1BPU1QJKDEgPDwgMikKKyNkZWZpbmUgV0RPR19FWFBJUkVfQ0xFQVJfT1NfTE9BRAkoMSA8PCAzKQorI2RlZmluZSBXRE9HX0VYUElSRV9DTEVBUl9TTVNfT1MJKDEgPDwgNCkKKyNkZWZpbmUgV0RPR19FWFBJUkVfQ0xFQVJfT0VNCQkoMSA8PCA1KQorCisvKiBTZXR0aW5nL2dldHRpbmcgdGhlIHdhdGNoZG9nIHRpbWVyIHZhbHVlLiAgVGhpcyBpcyBmb3IgYnl0ZXMgNSBhbmQKKyAgIDYgKHRoZSB0aW1lb3V0IHRpbWUpIG9mIHRoZSBzZXQgY29tbWFuZCwgYW5kIGJ5dGVzIDYgYW5kIDcgKHRoZQorICAgdGltZW91dCB0aW1lKSBhbmQgOCBhbmQgOSAodGhlIGN1cnJlbnQgY291bnRkb3duIHZhbHVlKSBvZiB0aGUKKyAgIHJlc3BvbnNlLiAgVGhlIHRpbWVvdXQgdmFsdWUgaXMgZ2l2ZW4gaW4gc2Vjb25kcyAoaW4gdGhlIGNvbW1hbmQgaXQKKyAgIGlzIDEwMG1zIGludGVydmFscykuICovCisjZGVmaW5lIFdET0dfU0VUX1RJTUVPVVQoYnl0ZTEsIGJ5dGUyLCB2YWwpIFwKKwkoYnl0ZTEpID0gKCgodmFsKSAqIDEwKSAmIDB4ZmYpLCAoYnl0ZTIpID0gKCgodmFsKSAqIDEwKSA+PiA4KQorI2RlZmluZSBXRE9HX0dFVF9USU1FT1VUKGJ5dGUxLCBieXRlMikgXAorCSgoKGJ5dGUxKSB8ICgoYnl0ZTIpIDw8IDgpKSAvIDEwKQorCisjZGVmaW5lIElQTUlfV0RPR19SRVNFVF9USU1FUgkJMHgyMgorI2RlZmluZSBJUE1JX1dET0dfU0VUX1RJTUVSCQkweDI0CisjZGVmaW5lIElQTUlfV0RPR19HRVRfVElNRVIJCTB4MjUKKworLyogVGhlc2UgYXJlIGhlcmUgdW50aWwgdGhlIHJlYWwgb25lcyBnZXQgaW50byB0aGUgd2F0Y2hkb2cuaCBpbnRlcmZhY2UuICovCisjaWZuZGVmIFdESU9DX0dFVFRJTUVPVVQKKyNkZWZpbmUJV0RJT0NfR0VUVElNRU9VVCAgICAgICAgX0lPVyhXQVRDSERPR19JT0NUTF9CQVNFLCAyMCwgaW50KQorI2VuZGlmCisjaWZuZGVmIFdESU9DX1NFVF9QUkVUSU1FT1VUCisjZGVmaW5lCVdESU9DX1NFVF9QUkVUSU1FT1VUICAgICBfSU9XKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDIxLCBpbnQpCisjZW5kaWYKKyNpZm5kZWYgV0RJT0NfR0VUX1BSRVRJTUVPVVQKKyNkZWZpbmUJV0RJT0NfR0VUX1BSRVRJTUVPVVQgICAgIF9JT1coV0FUQ0hET0dfSU9DVExfQkFTRSwgMjIsIGludCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IG5vd2F5b3V0OworI2VuZGlmCisKK3N0YXRpYyBpcG1pX3VzZXJfdCB3YXRjaGRvZ191c2VyID0gTlVMTDsKKworLyogRGVmYXVsdCB0aGUgdGltZW91dCB0byAxMCBzZWNvbmRzLiAqLworc3RhdGljIGludCB0aW1lb3V0ID0gMTA7CisKKy8qIFRoZSBwcmUtdGltZW91dCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiAqLworc3RhdGljIGludCBwcmV0aW1lb3V0ID0gMDsKKworLyogRGVmYXVsdCBhY3Rpb24gaXMgdG8gcmVzZXQgdGhlIGJvYXJkIG9uIGEgdGltZW91dC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFjdGlvbl92YWwgPSBXRE9HX1RJTUVPVVRfUkVTRVQ7CisKK3N0YXRpYyBjaGFyIGFjdGlvblsxNl0gPSAicmVzZXQiOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwcmVhY3Rpb25fdmFsID0gV0RPR19QUkVUSU1FT1VUX05PTkU7CisKK3N0YXRpYyBjaGFyIHByZWFjdGlvblsxNl0gPSAicHJlX25vbmUiOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwcmVvcF92YWwgPSBXRE9HX1BSRU9QX05PTkU7CisKK3N0YXRpYyBjaGFyIHByZW9wWzE2XSA9ICJwcmVvcF9ub25lIjsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBtaV9yZWFkX2xvY2spOworc3RhdGljIGNoYXIgZGF0YV90b19yZWFkID0gMDsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyZWFkX3EpOworc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5bmNfcSA9IE5VTEw7CitzdGF0aWMgY2hhciBwcmV0aW1lb3V0X3NpbmNlX2xhc3RfaGVhcnRiZWF0ID0gMDsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKKworLyogSWYgdHJ1ZSwgdGhlIGRyaXZlciB3aWxsIHN0YXJ0IHJ1bm5pbmcgYXMgc29vbiBhcyBpdCBpcyBjb25maWd1cmVkCisgICBhbmQgcmVhZHkuICovCitzdGF0aWMgaW50IHN0YXJ0X25vdyA9IDA7CisKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiVGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLiIpOworbW9kdWxlX3BhcmFtKHByZXRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZXRpbWVvdXQsICJQcmV0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMuIik7Cittb2R1bGVfcGFyYW1fc3RyaW5nKGFjdGlvbiwgYWN0aW9uLCBzaXplb2YoYWN0aW9uKSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFjdGlvbiwgIlRpbWVvdXQgYWN0aW9uLiBPbmUgb2Y6ICIKKwkJICJyZXNldCwgbm9uZSwgcG93ZXJfY3ljbGUsIHBvd2VyX29mZi4iKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcocHJlYWN0aW9uLCBwcmVhY3Rpb24sIHNpemVvZihwcmVhY3Rpb24pLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJlYWN0aW9uLCAiUHJldGltZW91dCBhY3Rpb24uICBPbmUgb2Y6ICIKKwkJICJwcmVfbm9uZSwgcHJlX3NtaSwgcHJlX25taSwgcHJlX2ludC4iKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcocHJlb3AsIHByZW9wLCBzaXplb2YocHJlb3ApLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJlb3AsICJQcmV0aW1lb3V0IGRyaXZlciBvcGVyYXRpb24uICBPbmUgb2Y6ICIKKwkJICJwcmVvcF9ub25lLCBwcmVvcF9wYW5pYywgcHJlb3BfZ2l2ZV9kYXRhLiIpOworbW9kdWxlX3BhcmFtKHN0YXJ0X25vdywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhcnRfbm93LCAiU2V0IHRvIDEgdG8gc3RhcnQgdGhlIHdhdGNoZG9nIGFzIgorCQkgInNvb24gYXMgdGhlIGRyaXZlciBpcyBsb2FkZWQuIik7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKKworLyogRGVmYXVsdCBzdGF0ZSBvZiB0aGUgdGltZXIuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX05PTkU7CisKKy8qIElmIHNodXR0aW5nIGRvd24gdmlhIElQTUksIHdlIGlnbm9yZSB0aGUgaGVhcnRiZWF0LiAqLworc3RhdGljIGludCBpcG1pX2lnbm9yZV9oZWFydGJlYXQgPSAwOworCisvKiBJcyBzb21lb25lIHVzaW5nIHRoZSB3YXRjaGRvZz8gIE9ubHkgb25lIHVzZXIgaXMgYWxsb3dlZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwbWlfd2RvZ19vcGVuID0gMDsKKworLyogSWYgc2V0IHRvIDEsIHRoZSBoZWFydGJlYXQgY29tbWFuZCB3aWxsIHNldCB0aGUgc3RhdGUgdG8gcmVzZXQgYW5kCisgICBzdGFydCB0aGUgdGltZXIuICBUaGUgdGltZXIgZG9lc24ndCBub3JtYWxseSBydW4gd2hlbiB0aGUgZHJpdmVyIGlzCisgICBmaXJzdCBvcGVuZWQgdW50aWwgdGhlIGhlYXJ0YmVhdCBpcyBzZXQgdGhlIGZpcnN0IHRpbWUsIHRoaXMKKyAgIHZhcmlhYmxlIGlzIHVzZWQgdG8gYWNjb21wbGlzaCB0aGlzLiAqLworc3RhdGljIGludCBpcG1pX3N0YXJ0X3RpbWVyX29uX2hlYXJ0YmVhdCA9IDA7CisKKy8qIElQTUkgdmVyc2lvbiBvZiB0aGUgQk1DLiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21ham9yOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21pbm9yOworCisKK3N0YXRpYyBpbnQgaXBtaV9oZWFydGJlYXQodm9pZCk7CitzdGF0aWMgdm9pZCBwYW5pY19oYWx0X2lwbWlfaGVhcnRiZWF0KHZvaWQpOworCisKKy8qIFdlIHVzZSBhIHNlbWFwaG9yZSB0byBtYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSB0aGluZyBjYW4gc2VuZCBhIHNldAorICAgdGltZW91dCBhdCBvbmUgdGltZSwgYmVjYXVzZSB3ZSBvbmx5IGhhdmUgb25lIGNvcHkgb2YgdGhlIGRhdGEuCisgICBUaGUgc2VtYXBob3JlIGlzIGNsYWltZWQgd2hlbiB0aGUgc2V0X3RpbWVvdXQgaXMgc2VudCBhbmQgZnJlZWQKKyAgIHdoZW4gYm90aCBtZXNzYWdlcyBhcmUgZnJlZS4gKi8KK3N0YXRpYyBhdG9taWNfdCBzZXRfdGltZW91dF90b2ZyZWUgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHNldF90aW1lb3V0X2xvY2spOworc3RhdGljIHZvaWQgc2V0X3RpbWVvdXRfZnJlZV9zbWkoc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQoreworICAgIGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzZXRfdGltZW91dF90b2ZyZWUpKQorCSAgICB1cCgmc2V0X3RpbWVvdXRfbG9jayk7Cit9CitzdGF0aWMgdm9pZCBzZXRfdGltZW91dF9mcmVlX3JlY3Yoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKK3sKKyAgICBpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2V0X3RpbWVvdXRfdG9mcmVlKSkKKwkgICAgdXAoJnNldF90aW1lb3V0X2xvY2spOworfQorc3RhdGljIHN0cnVjdCBpcG1pX3NtaV9tc2cgc2V0X3RpbWVvdXRfc21pX21zZyA9Cit7CisJLmRvbmUgPSBzZXRfdGltZW91dF9mcmVlX3NtaQorfTsKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9yZWN2X21zZyBzZXRfdGltZW91dF9yZWN2X21zZyA9Cit7CisJLmRvbmUgPSBzZXRfdGltZW91dF9mcmVlX3JlY3YKK307CisgCitzdGF0aWMgaW50IGlfaXBtaV9zZXRfdGltZW91dChzdHJ1Y3QgaXBtaV9zbWlfbXNnICAqc21pX21zZywKKwkJCSAgICAgIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICpyZWN2X21zZywKKwkJCSAgICAgIGludCAgICAgICAgICAgICAgICAgICpzZW5kX2hlYXJ0YmVhdF9ub3cpCit7CisJc3RydWN0IGtlcm5lbF9pcG1pX21zZyAgICAgICAgICAgIG1zZzsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnY7CisJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyIGFkZHI7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhibm93ID0gMDsKKworCisJZGF0YVswXSA9IDA7CisJV0RPR19TRVRfVElNRVJfVVNFKGRhdGFbMF0sIFdET0dfVElNRVJfVVNFX1NNU19PUyk7CisKKwlpZiAoKGlwbWlfdmVyc2lvbl9tYWpvciA+IDEpCisJICAgIHx8ICgoaXBtaV92ZXJzaW9uX21ham9yID09IDEpICYmIChpcG1pX3ZlcnNpb25fbWlub3IgPj0gNSkpKQorCXsKKwkJLyogVGhpcyBpcyBhbiBJUE1JIDEuNS1vbmx5IGZlYXR1cmUuICovCisJCWRhdGFbMF0gfD0gV0RPR19ET05UX1NUT1BfT05fU0VUOworCX0gZWxzZSBpZiAoaXBtaV93YXRjaGRvZ19zdGF0ZSAhPSBXRE9HX1RJTUVPVVRfTk9ORSkgeworCQkvKiBJbiBpcG1pIDEuMCwgc2V0dGluZyB0aGUgdGltZXIgc3RvcHMgdGhlIHdhdGNoZG9nLCB3ZQorCQkgICBuZWVkIHRvIHN0YXJ0IGl0IGJhY2sgdXAgYWdhaW4uICovCisJCWhibm93ID0gMTsKKwl9CisKKwlkYXRhWzFdID0gMDsKKwlXRE9HX1NFVF9USU1FT1VUX0FDVChkYXRhWzFdLCBpcG1pX3dhdGNoZG9nX3N0YXRlKTsKKwlpZiAocHJldGltZW91dCA+IDApIHsKKwkgICAgV0RPR19TRVRfUFJFVElNRU9VVF9BQ1QoZGF0YVsxXSwgcHJlYWN0aW9uX3ZhbCk7CisJICAgIGRhdGFbMl0gPSBwcmV0aW1lb3V0OworCX0gZWxzZSB7CisJICAgIFdET0dfU0VUX1BSRVRJTUVPVVRfQUNUKGRhdGFbMV0sIFdET0dfUFJFVElNRU9VVF9OT05FKTsKKwkgICAgZGF0YVsyXSA9IDA7IC8qIE5vIHByZXRpbWVvdXQuICovCisJfQorCWRhdGFbM10gPSAwOworCVdET0dfU0VUX1RJTUVPVVQoZGF0YVs0XSwgZGF0YVs1XSwgdGltZW91dCk7CisKKwlhZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisJYWRkci5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKKwlhZGRyLmx1biA9IDA7CisKKwltc2cubmV0Zm4gPSAweDA2OworCW1zZy5jbWQgPSBJUE1JX1dET0dfU0VUX1RJTUVSOworCW1zZy5kYXRhID0gZGF0YTsKKwltc2cuZGF0YV9sZW4gPSBzaXplb2YoZGF0YSk7CisJcnYgPSBpcG1pX3JlcXVlc3Rfc3VwcGx5X21zZ3Mod2F0Y2hkb2dfdXNlciwKKwkJCQkgICAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmYWRkciwKKwkJCQkgICAgICAwLAorCQkJCSAgICAgICZtc2csCisJCQkJICAgICAgTlVMTCwKKwkJCQkgICAgICBzbWlfbXNnLAorCQkJCSAgICAgIHJlY3ZfbXNnLAorCQkJCSAgICAgIDEpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAic2V0IHRpbWVvdXQgZXJyb3I6ICVkXG4iLAorCQkgICAgICAgcnYpOworCX0KKworCWlmIChzZW5kX2hlYXJ0YmVhdF9ub3cpCisJICAgICpzZW5kX2hlYXJ0YmVhdF9ub3cgPSBoYm5vdzsKKworCXJldHVybiBydjsKK30KKworLyogUGFyYW1ldGVycyB0byBpcG1pX3NldF90aW1lb3V0ICovCisjZGVmaW5lIElQTUlfU0VUX1RJTUVPVVRfTk9fSEIJCQkwCisjZGVmaW5lIElQTUlfU0VUX1RJTUVPVVRfSEJfSUZfTkVDRVNTQVJZCTEKKyNkZWZpbmUgSVBNSV9TRVRfVElNRU9VVF9GT1JDRV9IQgkJMgorCitzdGF0aWMgaW50IGlwbWlfc2V0X3RpbWVvdXQoaW50IGRvX2hlYXJ0YmVhdCkKK3sKKwlpbnQgc2VuZF9oZWFydGJlYXRfbm93OworCWludCBydjsKKworCisJLyogV2UgY2FuIG9ubHkgc2VuZCBvbmUgb2YgdGhlc2UgYXQgYSB0aW1lLiAqLworCWRvd24oJnNldF90aW1lb3V0X2xvY2spOworCisJYXRvbWljX3NldCgmc2V0X3RpbWVvdXRfdG9mcmVlLCAyKTsKKworCXJ2ID0gaV9pcG1pX3NldF90aW1lb3V0KCZzZXRfdGltZW91dF9zbWlfbXNnLAorCQkJCSZzZXRfdGltZW91dF9yZWN2X21zZywKKwkJCQkmc2VuZF9oZWFydGJlYXRfbm93KTsKKwlpZiAocnYpIHsKKwkJdXAoJnNldF90aW1lb3V0X2xvY2spOworCX0gZWxzZSB7CisJCWlmICgoZG9faGVhcnRiZWF0ID09IElQTUlfU0VUX1RJTUVPVVRfRk9SQ0VfSEIpCisJCSAgICB8fCAoKHNlbmRfaGVhcnRiZWF0X25vdykKKwkJCSYmIChkb19oZWFydGJlYXQgPT0gSVBNSV9TRVRfVElNRU9VVF9IQl9JRl9ORUNFU1NBUlkpKSkKKwkJeworCQkJcnYgPSBpcG1pX2hlYXJ0YmVhdCgpOworCQl9CisJfQorCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBkdW1teV9zbWlfZnJlZShzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7Cit9CitzdGF0aWMgdm9pZCBkdW1teV9yZWN2X2ZyZWUoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZykKK3sKK30KK3N0YXRpYyBzdHJ1Y3QgaXBtaV9zbWlfbXNnIHBhbmljX2hhbHRfc21pX21zZyA9Cit7CisJLmRvbmUgPSBkdW1teV9zbWlfZnJlZQorfTsKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9yZWN2X21zZyBwYW5pY19oYWx0X3JlY3ZfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3JlY3ZfZnJlZQorfTsKKworLyogU3BlY2lhbCBjYWxsLCBkb2Vzbid0IGNsYWltIGFueSBsb2Nrcy4gIFRoaXMgaXMgb25seSB0byBiZSBjYWxsZWQKKyAgIGF0IHBhbmljIG9yIGhhbHQgdGltZSwgaW4gcnVuLXRvLWNvbXBsZXRpb24gbW9kZSwgd2hlbiB0aGUgY2FsbGVyCisgICBpcyB0aGUgb25seSBDUFUgYW5kIHRoZSBvbmx5IHRoaW5nIHRoYXQgd2lsbCBiZSBnb2luZyBpcyB0aGVzZSBJUE1JCisgICBjYWxscy4gKi8KK3N0YXRpYyB2b2lkIHBhbmljX2hhbHRfaXBtaV9zZXRfdGltZW91dCh2b2lkKQoreworCWludCBzZW5kX2hlYXJ0YmVhdF9ub3c7CisJaW50IHJ2OworCisJcnYgPSBpX2lwbWlfc2V0X3RpbWVvdXQoJnBhbmljX2hhbHRfc21pX21zZywKKwkJCQkmcGFuaWNfaGFsdF9yZWN2X21zZywKKwkJCQkmc2VuZF9oZWFydGJlYXRfbm93KTsKKwlpZiAoIXJ2KSB7CisJCWlmIChzZW5kX2hlYXJ0YmVhdF9ub3cpCisJCQlwYW5pY19oYWx0X2lwbWlfaGVhcnRiZWF0KCk7CisJfQorfQorCisvKiBXZSB1c2UgYSBzZW1hcGhvcmUgdG8gbWFrZSBzdXJlIHRoYXQgb25seSBvbmUgdGhpbmcgY2FuIHNlbmQgYQorICAgaGVhcnRiZWF0IGF0IG9uZSB0aW1lLCBiZWNhdXNlIHdlIG9ubHkgaGF2ZSBvbmUgY29weSBvZiB0aGUgZGF0YS4KKyAgIFRoZSBzZW1hcGhvcmUgaXMgY2xhaW1lZCB3aGVuIHRoZSBzZXRfdGltZW91dCBpcyBzZW50IGFuZCBmcmVlZAorICAgd2hlbiBib3RoIG1lc3NhZ2VzIGFyZSBmcmVlLiAqLworc3RhdGljIGF0b21pY190IGhlYXJ0YmVhdF90b2ZyZWUgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGhlYXJ0YmVhdF9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYX0xPQ0tFRChoZWFydGJlYXRfd2FpdF9sb2NrKTsKK3N0YXRpYyB2b2lkIGhlYXJ0YmVhdF9mcmVlX3NtaShzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCit7CisgICAgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmhlYXJ0YmVhdF90b2ZyZWUpKQorCSAgICB1cCgmaGVhcnRiZWF0X3dhaXRfbG9jayk7Cit9CitzdGF0aWMgdm9pZCBoZWFydGJlYXRfZnJlZV9yZWN2KHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCit7CisgICAgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmhlYXJ0YmVhdF90b2ZyZWUpKQorCSAgICB1cCgmaGVhcnRiZWF0X3dhaXRfbG9jayk7Cit9CitzdGF0aWMgc3RydWN0IGlwbWlfc21pX21zZyBoZWFydGJlYXRfc21pX21zZyA9Cit7CisJLmRvbmUgPSBoZWFydGJlYXRfZnJlZV9zbWkKK307CitzdGF0aWMgc3RydWN0IGlwbWlfcmVjdl9tc2cgaGVhcnRiZWF0X3JlY3ZfbXNnID0KK3sKKwkuZG9uZSA9IGhlYXJ0YmVhdF9mcmVlX3JlY3YKK307CisgCitzdGF0aWMgc3RydWN0IGlwbWlfc21pX21zZyBwYW5pY19oYWx0X2hlYXJ0YmVhdF9zbWlfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3NtaV9mcmVlCit9Oworc3RhdGljIHN0cnVjdCBpcG1pX3JlY3ZfbXNnIHBhbmljX2hhbHRfaGVhcnRiZWF0X3JlY3ZfbXNnID0KK3sKKwkuZG9uZSA9IGR1bW15X3JlY3ZfZnJlZQorfTsKKyAKK3N0YXRpYyBpbnQgaXBtaV9oZWFydGJlYXQodm9pZCkKK3sKKwlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgbXNnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKwlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgYWRkcjsKKworCWlmIChpcG1pX2lnbm9yZV9oZWFydGJlYXQpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlwbWlfc3RhcnRfdGltZXJfb25faGVhcnRiZWF0KSB7CisJCWlwbWlfc3RhcnRfdGltZXJfb25faGVhcnRiZWF0ID0gMDsKKwkJaXBtaV93YXRjaGRvZ19zdGF0ZSA9IGFjdGlvbl92YWw7CisJCXJldHVybiBpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfRk9SQ0VfSEIpOworCX0gZWxzZSBpZiAocHJldGltZW91dF9zaW5jZV9sYXN0X2hlYXJ0YmVhdCkgeworCQkvKiBBIHByZXRpbWVvdXQgb2NjdXJyZWQsIG1ha2Ugc3VyZSB3ZSBzZXQgdGhlIHRpbWVvdXQuCisJCSAgIFdlIGRvbid0IHdhbnQgdG8gc2V0IHRoZSBhY3Rpb24sIHRob3VnaCwgd2Ugd2FudCB0bworCQkgICBsZWF2ZSB0aGF0IGFsb25lICh0aHVzIGl0IGNhbid0IGJlIGNvbWJpbmVkIHdpdGggdGhlCisJCSAgIGFib3ZlIG9wZXJhdGlvbi4gKi8KKwkJcHJldGltZW91dF9zaW5jZV9sYXN0X2hlYXJ0YmVhdCA9IDA7CisJCXJldHVybiBpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfSEJfSUZfTkVDRVNTQVJZKTsKKwl9CisKKwlkb3duKCZoZWFydGJlYXRfbG9jayk7CisKKwlhdG9taWNfc2V0KCZoZWFydGJlYXRfdG9mcmVlLCAyKTsKKworCS8qIERvbid0IHJlc2V0IHRoZSB0aW1lciBpZiB3ZSBoYXZlIHRoZSB0aW1lciB0dXJuZWQgb2ZmLCB0aGF0CisgICAgICAgICAgIHJlLWVuYWJsZXMgdGhlIHdhdGNoZG9nLiAqLworCWlmIChpcG1pX3dhdGNoZG9nX3N0YXRlID09IFdET0dfVElNRU9VVF9OT05FKSB7CisJCXVwKCZoZWFydGJlYXRfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCWFkZHIuYWRkcl90eXBlID0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRTsKKwlhZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworCWFkZHIubHVuID0gMDsKKworCW1zZy5uZXRmbiA9IDB4MDY7CisJbXNnLmNtZCA9IElQTUlfV0RPR19SRVNFVF9USU1FUjsKKwltc2cuZGF0YSA9IE5VTEw7CisJbXNnLmRhdGFfbGVuID0gMDsKKwlydiA9IGlwbWlfcmVxdWVzdF9zdXBwbHlfbXNncyh3YXRjaGRvZ191c2VyLAorCQkJCSAgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZhZGRyLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgJm1zZywKKwkJCQkgICAgICBOVUxMLAorCQkJCSAgICAgICZoZWFydGJlYXRfc21pX21zZywKKwkJCQkgICAgICAmaGVhcnRiZWF0X3JlY3ZfbXNnLAorCQkJCSAgICAgIDEpOworCWlmIChydikgeworCQl1cCgmaGVhcnRiZWF0X2xvY2spOworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiaGVhcnRiZWF0IGZhaWx1cmU6ICVkXG4iLAorCQkgICAgICAgcnYpOworCQlyZXR1cm4gcnY7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGhlYXJ0YmVhdCB0byBiZSBzZW50LiAqLworCWRvd24oJmhlYXJ0YmVhdF93YWl0X2xvY2spOworCisJaWYgKGhlYXJ0YmVhdF9yZWN2X21zZy5tc2cuZGF0YVswXSAhPSAwKSB7CisJICAgIC8qIEdvdCBhbiBlcnJvciBpbiB0aGUgaGVhcnRiZWF0IHJlc3BvbnNlLiAgSXQgd2FzIGFscmVhZHkKKwkgICAgICAgcmVwb3J0ZWQgaW4gaXBtaV93ZG9nX21zZ19oYW5kbGVyLCBidXQgd2Ugc2hvdWxkIHJldHVybgorCSAgICAgICBhbiBlcnJvciBoZXJlLiAqLworCSAgICBydiA9IC1FSU5WQUw7CisJfQorCisJdXAoJmhlYXJ0YmVhdF9sb2NrKTsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgcGFuaWNfaGFsdF9pcG1pX2hlYXJ0YmVhdCh2b2lkKQoreworCXN0cnVjdCBrZXJuZWxfaXBtaV9tc2cgICAgICAgICAgICAgbXNnOworCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciBhZGRyOworCisKKwkvKiBEb24ndCByZXNldCB0aGUgdGltZXIgaWYgd2UgaGF2ZSB0aGUgdGltZXIgdHVybmVkIG9mZiwgdGhhdAorICAgICAgICAgICByZS1lbmFibGVzIHRoZSB3YXRjaGRvZy4gKi8KKwlpZiAoaXBtaV93YXRjaGRvZ19zdGF0ZSA9PSBXRE9HX1RJTUVPVVRfTk9ORSkKKwkJcmV0dXJuOworCisJYWRkci5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworCWFkZHIuY2hhbm5lbCA9IElQTUlfQk1DX0NIQU5ORUw7CisJYWRkci5sdW4gPSAwOworCisJbXNnLm5ldGZuID0gMHgwNjsKKwltc2cuY21kID0gSVBNSV9XRE9HX1JFU0VUX1RJTUVSOworCW1zZy5kYXRhID0gTlVMTDsKKwltc2cuZGF0YV9sZW4gPSAwOworCWlwbWlfcmVxdWVzdF9zdXBwbHlfbXNncyh3YXRjaGRvZ191c2VyLAorCQkJCSAoc3RydWN0IGlwbWlfYWRkciAqKSAmYWRkciwKKwkJCQkgMCwKKwkJCQkgJm1zZywKKwkJCQkgTlVMTCwKKwkJCQkgJnBhbmljX2hhbHRfaGVhcnRiZWF0X3NtaV9tc2csCisJCQkJICZwYW5pY19oYWx0X2hlYXJ0YmVhdF9yZWN2X21zZywKKwkJCQkgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudD0KK3sKKwkub3B0aW9ucwk9IDAsCS8qIFdESU9GX1NFVFRJTUVPVVQsICovCisJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCS5pZGVudGl0eQk9ICJJUE1JIgorfTsKKworc3RhdGljIGludCBpcG1pX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgaTsKKwlpbnQgdmFsOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaSA9IGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpOworCQlyZXR1cm4gaSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpID0gY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpOworCQlpZiAoaSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl0aW1lb3V0ID0gdmFsOworCQlyZXR1cm4gaXBtaV9zZXRfdGltZW91dChJUE1JX1NFVF9USU1FT1VUX0hCX0lGX05FQ0VTU0FSWSk7CisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCWkgPSBjb3B5X3RvX3VzZXIoYXJncCwgJnRpbWVvdXQsIHNpemVvZih0aW1lb3V0KSk7CisJCWlmIChpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBXRElPQ19TRVRfUFJFVElNRU9VVDoKKwkJaSA9IGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKTsKKwkJaWYgKGkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHJldGltZW91dCA9IHZhbDsKKwkJcmV0dXJuIGlwbWlfc2V0X3RpbWVvdXQoSVBNSV9TRVRfVElNRU9VVF9IQl9JRl9ORUNFU1NBUlkpOworCisJY2FzZSBXRElPQ19HRVRfUFJFVElNRU9VVDoKKwkJaSA9IGNvcHlfdG9fdXNlcihhcmdwLCAmcHJldGltZW91dCwgc2l6ZW9mKHByZXRpbWVvdXQpKTsKKwkJaWYgKGkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJcmV0dXJuIGlwbWlfaGVhcnRiZWF0KCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCWkgPSBjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSk7CisJCWlmIChpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgJiBXRElPU19ESVNBQkxFQ0FSRCkKKwkJeworCQkJaXBtaV93YXRjaGRvZ19zdGF0ZSA9IFdET0dfVElNRU9VVF9OT05FOworCQkJaXBtaV9zZXRfdGltZW91dChJUE1JX1NFVF9USU1FT1VUX05PX0hCKTsKKwkJCWlwbWlfc3RhcnRfdGltZXJfb25faGVhcnRiZWF0ID0gMDsKKwkJfQorCisJCWlmICh2YWwgJiBXRElPU19FTkFCTEVDQVJEKQorCQl7CisJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gYWN0aW9uX3ZhbDsKKwkJCWlwbWlfc2V0X3RpbWVvdXQoSVBNSV9TRVRfVElNRU9VVF9GT1JDRV9IQik7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJdmFsID0gMDsKKwkJaSA9IGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsLCBzaXplb2YodmFsKSk7CisJCWlmIChpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlwbWlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIGNvbnN0IGNoYXIgIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgICAgICBsZW4sCisJCQkgIGxvZmZfdCAgICAgICpwcG9zKQoreworCWludCBydjsKKworCWlmIChsZW4pIHsKKwkgICAgCWlmICghbm93YXlvdXQpIHsKKwkJICAgIAlzaXplX3QgaTsKKworCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisgICAgCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQlydiA9IGlwbWlfaGVhcnRiZWF0KCk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBpcG1pX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgY2hhciAgICAgICAgX191c2VyICpidWYsCisJCQkgc2l6ZV90ICAgICAgY291bnQsCisJCQkgbG9mZl90ICAgICAgKnBwb3MpCit7CisJaW50ICAgICAgICAgIHJ2ID0gMDsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKworCWlmIChjb3VudCA8PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIFJlYWRpbmcgcmV0dXJucyBpZiB0aGUgcHJldGltZW91dCBoYXMgZ29uZSBvZmYsIGFuZCBpdCBvbmx5IGRvZXMKKwkgICBpdCBvbmNlIHBlciBwcmV0aW1lb3V0LiAqLworCXNwaW5fbG9jaygmaXBtaV9yZWFkX2xvY2spOworCWlmICghZGF0YV90b19yZWFkKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcnYgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0KKwkJCisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwkJYWRkX3dhaXRfcXVldWUoJnJlYWRfcSwgJndhaXQpOworCQl3aGlsZSAoIWRhdGFfdG9fcmVhZCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fdW5sb2NrKCZpcG1pX3JlYWRfbG9jayk7CisJCQlzY2hlZHVsZSgpOworCQkJc3Bpbl9sb2NrKCZpcG1pX3JlYWRfbG9jayk7CisJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnJlYWRfcSwgJndhaXQpOworCSAgICAKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlydiA9IC1FUkVTVEFSVFNZUzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWRhdGFfdG9fcmVhZCA9IDA7CisKKyBvdXQ6CisJc3Bpbl91bmxvY2soJmlwbWlfcmVhZF9sb2NrKTsKKworCWlmIChydiA9PSAwKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZGF0YV90b19yZWFkLCAxKSkKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJcnYgPSAxOworCX0KKworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBpcG1pX29wZW4oc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKyAgICAgICAgc3dpdGNoIChpbWlub3IoaW5vKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV0FUQ0hET0dfTUlOT1I6CisJCSAgICBpZih0ZXN0X2FuZF9zZXRfYml0KDAsICZpcG1pX3dkb2dfb3BlbikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworCisJCSAgICAvKiBEb24ndCBzdGFydCB0aGUgdGltZXIgbm93LCBsZXQgaXQgc3RhcnQgb24gdGhlCisJCSAgICAgICBmaXJzdCBoZWFydGJlYXQuICovCisJCSAgICBpcG1pX3N0YXJ0X3RpbWVyX29uX2hlYXJ0YmVhdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBub25zZWVrYWJsZV9vcGVuKGlubywgZmlsZXApOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtRU5PREVWKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlwbWlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJCisJcG9sbF93YWl0KGZpbGUsICZyZWFkX3EsIHdhaXQpOworCisJc3Bpbl9sb2NrKCZpcG1pX3JlYWRfbG9jayk7CisJaWYgKGRhdGFfdG9fcmVhZCkKKwkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7CisJc3Bpbl91bmxvY2soJmlwbWlfcmVhZF9sb2NrKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGlwbWlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZmYXN5bmNfcSk7CisKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgaXBtaV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCWlmIChpbWlub3IoaW5vKT09V0FUQ0hET0dfTUlOT1IpCisJeworCQlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX05PTkU7CisJCQlpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfTk9fSEIpOworCQkJY2xlYXJfYml0KDAsICZpcG1pX3dkb2dfb3Blbik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCQlpcG1pX2hlYXJ0YmVhdCgpOworCQl9CisJfQorCisJaXBtaV9mYXN5bmMgKC0xLCBmaWxlcCwgMCk7CisJZXhwZWN0X2Nsb3NlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcG1pX3dkb2dfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5yZWFkICAgID0gaXBtaV9yZWFkLAorCS5wb2xsICAgID0gaXBtaV9wb2xsLAorCS53cml0ZSAgID0gaXBtaV93cml0ZSwKKwkuaW9jdGwgICA9IGlwbWlfaW9jdGwsCisJLm9wZW4gICAgPSBpcG1pX29wZW4sCisJLnJlbGVhc2UgPSBpcG1pX2Nsb3NlLAorCS5mYXN5bmMgID0gaXBtaV9mYXN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgaXBtaV93ZG9nX21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJmlwbWlfd2RvZ19mb3BzCit9OworCitzdGF0aWMgREVDTEFSRV9SV1NFTShyZWdpc3Rlcl9zZW0pOworCitzdGF0aWMgdm9pZCBpcG1pX3dkb2dfbXNnX2hhbmRsZXIoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZywKKwkJCQkgIHZvaWQgICAgICAgICAgICAgICAgICpoYW5kbGVyX2RhdGEpCit7CisJaWYgKG1zZy0+bXNnLmRhdGFbMF0gIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZXNwb25zZTogRXJyb3IgJXggb24gY21kICV4XG4iLAorCQkgICAgICAgbXNnLT5tc2cuZGF0YVswXSwKKwkJICAgICAgIG1zZy0+bXNnLmNtZCk7CisJfQorCQorCWlwbWlfZnJlZV9yZWN2X21zZyhtc2cpOworfQorCitzdGF0aWMgdm9pZCBpcG1pX3dkb2dfcHJldGltZW91dF9oYW5kbGVyKHZvaWQgKmhhbmRsZXJfZGF0YSkKK3sKKwlpZiAocHJlYWN0aW9uX3ZhbCAhPSBXRE9HX1BSRVRJTUVPVVRfTk9ORSkgeworCQlpZiAocHJlb3BfdmFsID09IFdET0dfUFJFT1BfUEFOSUMpCisJCQlwYW5pYygiV2F0Y2hkb2cgcHJlLXRpbWVvdXQiKTsKKwkJZWxzZSBpZiAocHJlb3BfdmFsID09IFdET0dfUFJFT1BfR0lWRV9EQVRBKSB7CisJCQlzcGluX2xvY2soJmlwbWlfcmVhZF9sb2NrKTsKKwkJCWRhdGFfdG9fcmVhZCA9IDE7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJlYWRfcSk7CisJCQlraWxsX2Zhc3luYygmZmFzeW5jX3EsIFNJR0lPLCBQT0xMX0lOKTsKKworCQkJc3Bpbl91bmxvY2soJmlwbWlfcmVhZF9sb2NrKTsKKwkJfQorCX0KKworCS8qIE9uIHNvbWUgbWFjaGluZXMsIHRoZSBoZWFydGJlYXQgd2lsbCBnaXZlCisJICAgYW4gZXJyb3IgYW5kIG5vdCB3b3JrIHVubGVzcyB3ZSByZS1lbmFibGUKKwkgICB0aGUgdGltZXIuICAgU28gZG8gc28uICovCisJcHJldGltZW91dF9zaW5jZV9sYXN0X2hlYXJ0YmVhdCA9IDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBtaV91c2VyX2huZGwgaXBtaV9obmRscnMgPQoreworCS5pcG1pX3JlY3ZfaG5kbCAgICAgICAgICAgPSBpcG1pX3dkb2dfbXNnX2hhbmRsZXIsCisJLmlwbWlfd2F0Y2hkb2dfcHJldGltZW91dCA9IGlwbWlfd2RvZ19wcmV0aW1lb3V0X2hhbmRsZXIKK307CisKK3N0YXRpYyB2b2lkIGlwbWlfcmVnaXN0ZXJfd2F0Y2hkb2coaW50IGlwbWlfaW50ZikKK3sKKwlpbnQgcnYgPSAtRUJVU1k7CisKKwlkb3duX3dyaXRlKCZyZWdpc3Rlcl9zZW0pOworCWlmICh3YXRjaGRvZ191c2VyKQorCQlnb3RvIG91dDsKKworCXJ2ID0gaXBtaV9jcmVhdGVfdXNlcihpcG1pX2ludGYsICZpcG1pX2huZGxycywgTlVMTCwgJndhdGNoZG9nX3VzZXIpOworCWlmIChydiA8IDApIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuYWJsZSB0byByZWdpc3RlciB3aXRoIGlwbWlcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpcG1pX2dldF92ZXJzaW9uKHdhdGNoZG9nX3VzZXIsCisJCQkgJmlwbWlfdmVyc2lvbl9tYWpvciwKKwkJCSAmaXBtaV92ZXJzaW9uX21pbm9yKTsKKworCXJ2ID0gbWlzY19yZWdpc3RlcigmaXBtaV93ZG9nX21pc2NkZXYpOworCWlmIChydiA8IDApIHsKKwkJaXBtaV9kZXN0cm95X3VzZXIod2F0Y2hkb2dfdXNlcik7CisJCXdhdGNoZG9nX3VzZXIgPSBOVUxMOworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwl9CisKKyBvdXQ6CisJdXBfd3JpdGUoJnJlZ2lzdGVyX3NlbSk7CisKKwlpZiAoKHN0YXJ0X25vdykgJiYgKHJ2ID09IDApKSB7CisJCS8qIFJ1biBmcm9tIHN0YXJ0dXAsIHNvIHN0YXJ0IHRoZSB0aW1lciBub3cuICovCisJCXN0YXJ0X25vdyA9IDA7IC8qIERpc2FibGUgdGhpcyBmdW5jdGlvbiBhZnRlciBmaXJzdCBzdGFydHVwLiAqLworCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gYWN0aW9uX3ZhbDsKKwkJaXBtaV9zZXRfdGltZW91dChJUE1JX1NFVF9USU1FT1VUX0ZPUkNFX0hCKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlN0YXJ0aW5nIG5vdyFcbiIpOworCX0KK30KKworI2lmZGVmIEhBVkVfTk1JX0hBTkRMRVIKK3N0YXRpYyBpbnQKK2lwbWlfbm1pKHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjcHUsIGludCBoYW5kbGVkKQoreworCS8qIElmIG5vIG9uZSBlbHNlIGhhbmRsZWQgdGhlIE5NSSwgd2UgYXNzdW1lIGl0IHdhcyB0aGUgSVBNSQorICAgICAgICAgICB3YXRjaGRvZy4gKi8KKwlpZiAoKCFoYW5kbGVkKSAmJiAocHJlb3BfdmFsID09IFdET0dfUFJFT1BfUEFOSUMpKQorCQlwYW5pYyhQRlggInByZS10aW1lb3V0Iik7CisKKwkvKiBPbiBzb21lIG1hY2hpbmVzLCB0aGUgaGVhcnRiZWF0IHdpbGwgZ2l2ZQorCSAgIGFuIGVycm9yIGFuZCBub3Qgd29yayB1bmxlc3Mgd2UgcmUtZW5hYmxlCisJICAgdGhlIHRpbWVyLiAgIFNvIGRvIHNvLiAqLworCXByZXRpbWVvdXRfc2luY2VfbGFzdF9oZWFydGJlYXQgPSAxOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5taV9oYW5kbGVyIGlwbWlfbm1pX2hhbmRsZXIgPQoreworCS5saW5rICAgICA9IExJU1RfSEVBRF9JTklUKGlwbWlfbm1pX2hhbmRsZXIubGluayksCisJLmRldl9uYW1lID0gImlwbWlfd2F0Y2hkb2ciLAorCS5kZXZfaWQgICA9IE5VTEwsCisJLmhhbmRsZXIgID0gaXBtaV9ubWksCisJLnByaW9yaXR5ID0gMCwgLyogQ2FsbCB1cyBsYXN0LiAqLworfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHdkb2dfcmVib290X2hhbmRsZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBjb2RlLAorCQkJICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqdW51c2VkKQoreworCXN0YXRpYyBpbnQgcmVib290X2V2ZW50X2hhbmRsZWQgPSAwOworCisJaWYgKCh3YXRjaGRvZ191c2VyKSAmJiAoIXJlYm9vdF9ldmVudF9oYW5kbGVkKSkgeworCQkvKiBNYWtlIHN1cmUgd2Ugb25seSBkbyB0aGlzIG9uY2UuICovCisJCXJlYm9vdF9ldmVudF9oYW5kbGVkID0gMTsKKworCQlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKSB7CisJCQkvKiBEaXNhYmxlIHRoZSBXRFQgaWYgd2UgYXJlIHNodXR0aW5nIGRvd24uICovCisJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX05PTkU7CisJCQlwYW5pY19oYWx0X2lwbWlfc2V0X3RpbWVvdXQoKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNldCBhIGxvbmcgdGltZXIgdG8gbGV0IHRoZSByZWJvb3QgaGFwcGVucywgYnV0CisJCQkgICByZWJvb3QgaWYgaXQgaGFuZ3MuICovCisJCQl0aW1lb3V0ID0gMTIwOworCQkJcHJldGltZW91dCA9IDA7CisJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX1JFU0VUOworCQkJcGFuaWNfaGFsdF9pcG1pX3NldF90aW1lb3V0KCk7CisJCX0KKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZG9nX3JlYm9vdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHdkb2dfcmVib290X2hhbmRsZXIsCisJLm5leHQJCT0gTlVMTCwKKwkucHJpb3JpdHkJPSAwCit9OworCitzdGF0aWMgaW50IHdkb2dfcGFuaWNfaGFuZGxlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgZXZlbnQsCisJCQkgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKnVudXNlZCkKK3sKKwlzdGF0aWMgaW50IHBhbmljX2V2ZW50X2hhbmRsZWQgPSAwOworCisJLyogT24gYSBwYW5pYywgaWYgd2UgaGF2ZSBhIHBhbmljIHRpbWVvdXQsIG1ha2Ugc3VyZSB0aGF0IHRoZSB0aGluZworCSAgIHJlYm9vdHMsIGV2ZW4gaWYgaXQgaGFuZ3MgZHVyaW5nIHRoYXQgcGFuaWMuICovCisJaWYgKHdhdGNoZG9nX3VzZXIgJiYgIXBhbmljX2V2ZW50X2hhbmRsZWQpIHsKKwkJLyogTWFrZSBzdXJlIHRoZSBwYW5pYyBkb2Vzbid0IGhhbmcsIGFuZCBtYWtlIHN1cmUgd2UKKwkJICAgZG8gdGhpcyBvbmx5IG9uY2UuICovCisJCXBhbmljX2V2ZW50X2hhbmRsZWQgPSAxOworCSAgICAKKwkJdGltZW91dCA9IDI1NTsKKwkJcHJldGltZW91dCA9IDA7CisJCWlwbWlfd2F0Y2hkb2dfc3RhdGUgPSBXRE9HX1RJTUVPVVRfUkVTRVQ7CisJCXBhbmljX2hhbHRfaXBtaV9zZXRfdGltZW91dCgpOworCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2RvZ19wYW5pY19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHdkb2dfcGFuaWNfaGFuZGxlciwKKwkubmV4dAkJPSBOVUxMLAorCS5wcmlvcml0eQk9IDE1MAkvKiBwcmlvcml0eTogSU5UX01BWCA+PSB4ID49IDAgKi8KK307CisKKworc3RhdGljIHZvaWQgaXBtaV9uZXdfc21pKGludCBpZl9udW0pCit7CisJaXBtaV9yZWdpc3Rlcl93YXRjaGRvZyhpZl9udW0pOworfQorCitzdGF0aWMgdm9pZCBpcG1pX3NtaV9nb25lKGludCBpZl9udW0pCit7CisJLyogVGhpcyBjYW4gbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIG9uY2UgdGhlIHdhdGNoZG9nIGlzCisJICAgcmVnaXN0ZXJlZCwgdGhlIGludGVyZmFjZSBjYW4ndCBnbyBhd2F5IHVudGlsIHRoZSB3YXRjaGRvZworCSAgIGlzIHVucmVnaXN0ZXJlZC4gKi8KK30KKworc3RhdGljIHN0cnVjdCBpcG1pX3NtaV93YXRjaGVyIHNtaV93YXRjaGVyID0KK3sKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkubmV3X3NtaSAgPSBpcG1pX25ld19zbWksCisJLnNtaV9nb25lID0gaXBtaV9zbWlfZ29uZQorfTsKKworc3RhdGljIGludCBfX2luaXQgaXBtaV93ZG9nX2luaXQodm9pZCkKK3sKKwlpbnQgcnY7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiZHJpdmVyIHZlcnNpb24gIgorCSAgICAgICBJUE1JX1dBVENIRE9HX1ZFUlNJT04gIlxuIik7CisKKwlpZiAoc3RyY21wKGFjdGlvbiwgInJlc2V0IikgPT0gMCkgeworCQlhY3Rpb25fdmFsID0gV0RPR19USU1FT1VUX1JFU0VUOworCX0gZWxzZSBpZiAoc3RyY21wKGFjdGlvbiwgIm5vbmUiKSA9PSAwKSB7CisJCWFjdGlvbl92YWwgPSBXRE9HX1RJTUVPVVRfTk9ORTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJwb3dlcl9jeWNsZSIpID09IDApIHsKKwkJYWN0aW9uX3ZhbCA9IFdET0dfVElNRU9VVF9QT1dFUl9DWUNMRTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJwb3dlcl9vZmYiKSA9PSAwKSB7CisJCWFjdGlvbl92YWwgPSBXRE9HX1RJTUVPVVRfUE9XRVJfRE9XTjsKKwl9IGVsc2UgeworCQlhY3Rpb25fdmFsID0gV0RPR19USU1FT1VUX1JFU0VUOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiVW5rbm93biBhY3Rpb24gJyVzJywgZGVmYXVsdGluZyB0byIKKwkJICAgICAgICIgcmVzZXRcbiIsIGFjdGlvbik7CisJfQorCisJaWYgKHN0cmNtcChwcmVhY3Rpb24sICJwcmVfbm9uZSIpID09IDApIHsKKwkJcHJlYWN0aW9uX3ZhbCA9IFdET0dfUFJFVElNRU9VVF9OT05FOworCX0gZWxzZSBpZiAoc3RyY21wKHByZWFjdGlvbiwgInByZV9zbWkiKSA9PSAwKSB7CisJCXByZWFjdGlvbl92YWwgPSBXRE9HX1BSRVRJTUVPVVRfU01JOworI2lmZGVmIEhBVkVfTk1JX0hBTkRMRVIKKwl9IGVsc2UgaWYgKHN0cmNtcChwcmVhY3Rpb24sICJwcmVfbm1pIikgPT0gMCkgeworCQlwcmVhY3Rpb25fdmFsID0gV0RPR19QUkVUSU1FT1VUX05NSTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoc3RyY21wKHByZWFjdGlvbiwgInByZV9pbnQiKSA9PSAwKSB7CisJCXByZWFjdGlvbl92YWwgPSBXRE9HX1BSRVRJTUVPVVRfTVNHX0lOVDsKKwl9IGVsc2UgeworCQlwcmVhY3Rpb25fdmFsID0gV0RPR19QUkVUSU1FT1VUX05PTkU7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJVbmtub3duIHByZWFjdGlvbiAnJXMnLCBkZWZhdWx0aW5nIHRvIgorCQkgICAgICAgIiBub25lXG4iLCBwcmVhY3Rpb24pOworCX0KKworCWlmIChzdHJjbXAocHJlb3AsICJwcmVvcF9ub25lIikgPT0gMCkgeworCQlwcmVvcF92YWwgPSBXRE9HX1BSRU9QX05PTkU7CisJfSBlbHNlIGlmIChzdHJjbXAocHJlb3AsICJwcmVvcF9wYW5pYyIpID09IDApIHsKKwkJcHJlb3BfdmFsID0gV0RPR19QUkVPUF9QQU5JQzsKKwl9IGVsc2UgaWYgKHN0cmNtcChwcmVvcCwgInByZW9wX2dpdmVfZGF0YSIpID09IDApIHsKKwkJcHJlb3BfdmFsID0gV0RPR19QUkVPUF9HSVZFX0RBVEE7CisJfSBlbHNlIHsKKwkJcHJlb3BfdmFsID0gV0RPR19QUkVPUF9OT05FOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiVW5rbm93biBwcmVvcCAnJXMnLCBkZWZhdWx0aW5nIHRvIgorCQkgICAgICAgIiBub25lXG4iLCBwcmVvcCk7CisJfQorCisjaWZkZWYgSEFWRV9OTUlfSEFORExFUgorCWlmIChwcmVhY3Rpb25fdmFsID09IFdET0dfUFJFVElNRU9VVF9OTUkpIHsKKwkJaWYgKHByZW9wX3ZhbCA9PSBXRE9HX1BSRU9QX0dJVkVfREFUQSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlByZXRpbWVvdXQgb3AgaXMgdG8gZ2l2ZSBkYXRhIgorCQkJICAgICAgICIgYnV0IE5NSSBwcmV0aW1lb3V0IGlzIGVuYWJsZWQsIHNldHRpbmciCisJCQkgICAgICAgIiBwcmV0aW1lb3V0IG9wIHRvIG5vbmVcbiIpOworCQkJcHJlb3BfdmFsID0gV0RPR19QUkVPUF9OT05FOworCQl9CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJubWlfd2F0Y2hkb2cgaXMgc2V0IHRvIElPIEFQSUMiCisJCQkgICAgICAgIiBtb2RlICh2YWx1ZSBpcyAlZCksIHRoYXQgaXMgaW5jb21wYXRpYmxlIgorCQkJICAgICAgICIgd2l0aCB1c2luZyBOTUkgaW4gdGhlIElQTUkgd2F0Y2hkb2cuIgorCQkJICAgICAgICIgRGlzYWJsaW5nIElQTUkgbm1pIHByZXRpbWVvdXQuXG4iLAorCQkJICAgICAgIG5taV93YXRjaGRvZyk7CisJCQlwcmVhY3Rpb25fdmFsID0gV0RPR19QUkVUSU1FT1VUX05PTkU7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJcnYgPSByZXF1ZXN0X25taSgmaXBtaV9ubWlfaGFuZGxlcik7CisJCWlmIChydikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkNhbid0IHJlZ2lzdGVyIG5taSBoYW5kbGVyXG4iKTsKKwkJCXJldHVybiBydjsKKwkJfQorI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCQl9CisjZW5kaWYKKwl9CisjZW5kaWYKKworCXJ2ID0gaXBtaV9zbWlfd2F0Y2hlcl9yZWdpc3Rlcigmc21pX3dhdGNoZXIpOworCWlmIChydikgeworI2lmZGVmIEhBVkVfTk1JX0hBTkRMRVIKKwkJaWYgKHByZWFjdGlvbl92YWwgPT0gV0RPR19QUkVUSU1FT1VUX05NSSkKKwkJCXJlbGVhc2Vfbm1pKCZpcG1pX25taV9oYW5kbGVyKTsKKyNlbmRpZgorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiY2FuJ3QgcmVnaXN0ZXIgc21pIHdhdGNoZXJcbiIpOworCQlyZXR1cm4gcnY7CisJfQorCisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZG9nX3JlYm9vdF9ub3RpZmllcik7CisJbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZ3ZG9nX3BhbmljX25vdGlmaWVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgaXBtaV91bnJlZ2lzdGVyX3dhdGNoZG9nKHZvaWQpCit7CisJaW50IHJ2OworCisJZG93bl93cml0ZSgmcmVnaXN0ZXJfc2VtKTsKKworI2lmZGVmIEhBVkVfTk1JX0hBTkRMRVIKKwlpZiAocHJlYWN0aW9uX3ZhbCA9PSBXRE9HX1BSRVRJTUVPVVRfTk1JKQorCQlyZWxlYXNlX25taSgmaXBtaV9ubWlfaGFuZGxlcik7CisjZW5kaWYKKworCW5vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZ3ZG9nX3BhbmljX25vdGlmaWVyKTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2RvZ19yZWJvb3Rfbm90aWZpZXIpOworCisJaWYgKCEgd2F0Y2hkb2dfdXNlcikKKwkJZ290byBvdXQ7CisKKwkvKiBNYWtlIHN1cmUgbm8gb25lIGNhbiBjYWxsIHVzIGFueSBtb3JlLiAqLworCW1pc2NfZGVyZWdpc3RlcigmaXBtaV93ZG9nX21pc2NkZXYpOworCisJLyogV2FpdCB0byBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgbWFrZXMgaXQgb3V0LiAgVGhlIGxvd2VyIGxheWVyIGhhcworCSAgIHBvaW50ZXJzIHRvIG91ciBidWZmZXJzLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBkb25lIGJlZm9yZQorCSAgIHdlIHJlbGVhc2Ugb3VyIG1lbW9yeS4gKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJnNldF90aW1lb3V0X3RvZnJlZSkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCS8qIERpc2Nvbm5lY3QgZnJvbSBJUE1JLiAqLworCXJ2ID0gaXBtaV9kZXN0cm95X3VzZXIod2F0Y2hkb2dfdXNlcik7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJlcnJvciB1bmxpbmtpbmcgZnJvbSBJUE1JOiAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwl9CisJd2F0Y2hkb2dfdXNlciA9IE5VTEw7CisKKyBvdXQ6CisJdXBfd3JpdGUoJnJlZ2lzdGVyX3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcG1pX3dkb2dfZXhpdCh2b2lkKQoreworCWlwbWlfc21pX3dhdGNoZXJfdW5yZWdpc3Rlcigmc21pX3dhdGNoZXIpOworCWlwbWlfdW5yZWdpc3Rlcl93YXRjaGRvZygpOworfQorbW9kdWxlX2V4aXQoaXBtaV93ZG9nX2V4aXQpOworbW9kdWxlX2luaXQoaXBtaV93ZG9nX2luaXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWM3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKQEAgLTAsMCArMSwyMDc5IEBACisvKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglPcmlnaW5hbCBkcml2ZXIgY29kZSBzdXBwbGllZCBieSBNdWx0aS1UZWNoCisgKgorICoJQ2hhbmdlcworICoJMS85Lzk4CWFsYW5AcmVkaGF0LmNvbQkJTWVyZ2UgdG8gMi4wLngga2VybmVsIHRyZWUKKyAqCQkJCQlPYnRhaW4gYW5kIHVzZSBvZmZpY2lhbCBtYWpvci9taW5vcnMKKyAqCQkJCQlMb2FkZXIgc3dpdGNoZWQgdG8gYSBtaXNjIGRldmljZQorICoJCQkJCShmaXhlZCByYW5nZSBjaGVjayBidWcgYXMgYSBzaWRlIGVmZmVjdCkKKyAqCQkJCQlQcmludGsgY2xlYW4gdXAKKyAqCTkvMTIvOTgJYWxhbkByZWRoYXQuY29tCQlSb3VnaCBwb3J0IHRvIDIuMS54CisgKgorICoJMTAvNi85OSBzYW1lZXIJCQlNZXJnZWQgdGhlIElTQSBhbmQgUENJIGRyaXZlcnMgdG8KKyAqCQkJCQlhIG5ldyB1bmlmaWVkIGRyaXZlci4KKyAqCisgKgkzLzkvOTkJc2FtZWVyCQkJQWRkZWQgc3VwcG9ydCBmb3IgSVNJNDYxNiBjYXJkcy4KKyAqCisgKgkxNi85Lzk5CXNhbWVlcgkJCVdlIGRvIG5vdCBmb3JjZSBSVFMgbG93IGFueW1vcmUuCisgKgkJCQkJVGhpcyBpcyB0byBwcmV2ZW50IHRoZSBmaXJtd2FyZSAKKyAqCQkJCQlmcm9tIGdldHRpbmcgY29uZnVzZWQuCisgKgorICoJMjYvMTAvOTkgc2FtZWVyCQkJQ29zbWV0aWMgY2hhbmdlczpUaGUgZHJpdmVyIG5vdworICoJCQkJCWR1bXBzIHRoZSBQb3J0IENvdW50IGluZm9ybWF0aW9uCisgKgkJCQkJYWxvbmcgd2l0aCBJL08gYWRkcmVzcyBhbmQgSVJRLgorICoKKyAqCTEzLzEyLzk5IHNhbWVlcgkJCUZpeGVkIHRoZSBwcm9ibGVtIHdpdGggSVJRIHNoYXJpbmcuCisgKgorICoJMTAvNS8wMCAgc2FtZWVyCQkJRml4ZWQgaXNpY29tX3NodXRkb3duX2JvYXJkKCkKKyAqCQkJCQl0byBub3QgbG93ZXIgRFRSIG9uIGFsbCB0aGUgcG9ydHMKKyAqCQkJCQl3aGVuIHRoZSBsYXN0IHBvcnQgb24gdGhlIGNhcmQgaXMgCisgKgkJCQkJY2xvc2VkLgorICoKKyAqCTEwLzUvMDAgIHNhbWVlcgkJCVNpZ25hbCBtYXNrIHNldHVwIGNvbW1hbmQgYWRkZWQKKyAqCQkJCQl0byAgaXNpY29tX3NldHVwX3BvcnQgYW5kIAorICoJCQkJCWlzaWNvbV9zaHV0ZG93bl9wb3J0LgorICoKKyAqCTI0LzUvMDAgIHNhbWVlcgkJCVRoZSBkcml2ZXIgaXMgbm93IFNNUCBhd2FyZS4KKyAqCQkJCQkKKyAqCQorICoJMjcvMTEvMDAgVmluYXlhayBQIFJpc2J1ZAlGaXhlZCB0aGUgRHJpdmVyIENyYXNoIFByb2JsZW0KKyAqCQorICoJCisgKgkwMy8wMS8wMSAgYW5pbCAucwkJQWRkZWQgc3VwcG9ydCBmb3IgcmVzZXR0aW5nIHRoZQorICoJCQkJCWludGVybmFsIG1vZGVtcyBvbiBJU0kgY2FyZHMuCisgKgorICoJMDgvMDIvMDEgIGFuaWwgLnMJCVVwZ3JhZGVkIHRoZSBkcml2ZXIgZm9yIGtlcm5lbAorICoJCQkJCTIuNC54CisgKgorICogICAgICAxMS8wNC8wMSAgS2V2aW4JCQlGaXhlZCBmaXJtd2FyZSBsb2FkIHByb2JsZW0gd2l0aAorICoJCQkJCUlTSUhQLTRYIGNhcmQKKyAqCQorICoJMzAvMDQvMDEgIGFuaWwgLnMJCUZpeGVkIHRoZSByZW1vdGUgbG9naW4gdGhyb3VnaAorICoJCQkJCUlTSSBwb3J0IHByb2JsZW0uIE5vdyB0aGUgbGluaworICoJCQkJCWRvZXMgbm90IGdvIGRvd24gYmVmb3JlIHBhc3N3b3JkCisgKgkJCQkJcHJvbXB0LgorICoKKyAqCTAzLzA1LzAxICBhbmlsIC5zCQlGaXhlZCB0aGUgcHJvYmxlbSB3aXRoIElSUSBzaGFyaW5nCisgKgkJCQkJYW1vbmcgSVNJLVBDSSBjYXJkcy4KKyAqCisgKgkwMy8wNS8wMSAgYW5pbCAucwkJQWRkZWQgc3VwcG9ydCB0byBkaXNwbGF5IHRoZSB2ZXJzaW9uCisgKgkJCQkJaW5mbyBkdXJpbmcgaW5zbW9kIGFzIHdlbGwgYXMgbW9kdWxlIAorICoJCQkJCWxpc3RpbmcgYnkgbHNtb2QuCisgKgkKKyAqCTEwLzA1LzAxICBhbmlsIC5zCQlEb25lIHRoZSBtb2RpZmljYXRpb25zIHRvIHRoZSBzb3VyY2UKKyAqCQkJCQlmaWxlIGFuZCBJbnN0YWxsIHNjcmlwdCBzbyB0aGF0IHRoZQorICoJCQkJCXNhbWUgaW5zdGFsbGF0aW9uIGNhbiBiZSB1c2VkIGZvcgorICoJCQkJCTIuMi54IGFuZCAyLjQueCBrZXJuZWwuCisgKgorICoJMDYvMDYvMDEgIGFuaWwgLnMJCU5vdyB3ZSBkcm9wIGJvdGggZHRyIGFuZCBydHMgZHVyaW5nCisgKgkJCQkJc2h1dGRvd25fcG9ydCBhcyB3ZWxsIGFzIHJhaXNlIHRoZW0KKyAqCQkJCQlkdXJpbmcgaXNpY29tX2NvbmZpZ19wb3J0LgorICogIAkKKyAqCTA5LzA2LzAxIGFjbWVAY29uZWN0aXZhLmNvbS5icgl1c2UgY2FwYWJsZSwgbm90IHN1c2VyLCBkbworICoJCQkJCXJlc3RvcmVfZmxhZ3Mgb24gZmFpbHVyZSBpbgorICoJCQkJCWlzaWNvbV9zZW5kX2JyZWFrLCB2ZXJpZnkgcHV0X3VzZXIKKyAqCQkJCQlyZXN1bHQKKyAqCisgKiAgCTExLzAyLzAzICByYW5qZWV0aAkJQWRkZWQgc3VwcG9ydCBmb3IgMjMwIEticHMgYW5kIDQ2MCBLYnBzCisgKiAgCQkJCQlCYXVkIGluZGV4IGV4dGVuZGVkIHRvIDIxCisgKiAgCQorICogIAkyMC8wMy8wMyAgcmFuamVldGgJCU1hZGUgdG8gd29yayBmb3IgTGludXggQWR2YW5jZWQgc2VydmVyLgorICogIAkJCQkJVGFrZW4gY2FyZSBvZiBsaWNlbnNlIHdhcm5pbmcuCQorICogICAgICAKKyAqCTEwLzEyLzAzICBSYXZpbmRyYQkJTWFkZSB0byB3b3JrIGZvciBGZWRvcmEgQ29yZSAxIG9mIAorICoJCQkJCVJlZCBIYXQgRGlzdHJpYnV0aW9uCisgKgorICoJMDYvMDEvMDUgIEFsYW4gQ294IAkJTWVyZ2VkIHRoZSBJU0kgYW5kIGJhc2Uga2VybmVsIHN0cmFuZHMKKyAqCQkJCQlpbnRvIGEgc2luZ2xlIDIuNiBkcml2ZXIKKyAqCisgKgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVRvIHVzZSB0aGlzIGRyaXZlciB5b3UgYWxzbyBuZWVkIHRoZSBzdXBwb3J0IHBhY2thZ2UuIFlvdSAKKyAqCWNhbiBmaW5kIHRoaXMgaW4gUlBNIGZvcm1hdCBvbgorICoJCWZ0cDovL2Z0cC5saW51eC5vcmcudWsvcHViL2xpbnV4L2FsYW4KKyAqIAkKKyAqCVlvdSBjYW4gZmluZCB0aGUgb3JpZ2luYWwgdG9vbHMgZm9yIHRoaXMgZGlyZWN0IGZyb20gTXVsdGl0ZWNoCisgKgkJZnRwOi8vZnRwLm11bHRpdGVjaC5jb20vSVNJLUNhcmRzLworICoKKyAqCUhhdmluZyBpbnN0YWxsZWQgdGhlIGNhcmRzIHRoZSBtb2R1bGUgb3B0aW9ucyAoL2V0Yy9tb2Rwcm9iZS5jb25mKQorICoKKyAqCW9wdGlvbnMgaXNpY29tICAgaW89Y2FyZDEsY2FyZDIsY2FyZDMsY2FyZDQgaXJxPWNhcmQxLGNhcmQyLGNhcmQzLGNhcmQ0CisgKgorICoJT21pdCB0aG9zZSBlbnRyaWVzIGZvciBib2FyZHMgeW91IGRvbid0IGhhdmUgaW5zdGFsbGVkLgorICoKKyAqCVRPRE8KKyAqCQlIb3RwbHVnCisgKgkJTWVyZ2UgdGVzdGluZworICoJCTY0LWJpdCB2ZXJpZmljYXRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8bGludXgvaXNpY29tLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpc2ljb21fcGNpX3RibFtdID0geworCXsgVkVORE9SX0lELCAweDIwMjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFZFTkRPUl9JRCwgMHgyMDUxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBWRU5ET1JfSUQsIDB4MjA1MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgVkVORE9SX0lELCAweDIwNTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFZFTkRPUl9JRCwgMHgyMDU0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBWRU5ET1JfSUQsIDB4MjA1NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgVkVORE9SX0lELCAweDIwNTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFZFTkRPUl9JRCwgMHgyMDU3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBWRU5ET1JfSUQsIDB4MjA1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlzaWNvbV9wY2lfdGJsKTsKKworc3RhdGljIGludCBwcmV2X2NhcmQgPSAzOwkvKglzdGFydCBzZXJ2aWNpbmcgaXNpX2NhcmRbMF0JKi8KK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaXNpY29tX25vcm1hbDsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHR4Oworc3RhdGljIGNoYXIgcmVfc2NoZWR1bGUgPSAxOworI2lmZGVmIElTSUNPTV9ERUJVRworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHhfY291bnQgPSAwOworI2VuZGlmCisKK3N0YXRpYyBpbnQgSVNJTG9hZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIHZvaWQgaXNpY29tX3R4KHVuc2lnbmVkIGxvbmcgX2RhdGEpOworc3RhdGljIHZvaWQgaXNpY29tX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0bXBfYnVmOworc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOworCisvKiAgIGJhdWQgaW5kZXggbWFwcGluZ3MgZnJvbSBsaW51eCBkZWZucyB0byBpc2kgKi8KKworc3RhdGljIHNpZ25lZCBjaGFyIGxpbnV4Yl90b19pc2liW10gPSB7CisJLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDExLCAxMywgMTUsIDE2LCAxNywgICAgIAorCTE4LCAxOQorfTsKKworc3RydWN0CWlzaV9ib2FyZCB7CisJdW5zaWduZWQgc2hvcnQJCWJhc2U7CisJdW5zaWduZWQgY2hhcgkJaXJxOworCXVuc2lnbmVkIGNoYXIJCXBvcnRfY291bnQ7CisJdW5zaWduZWQgc2hvcnQJCXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAkJcG9ydF9zdGF0dXM7IC8qIGVhY2ggYml0IHJlcHJlc2VudHMgYSBzaW5nbGUgcG9ydCAqLworCXVuc2lnbmVkIHNob3J0CQlzaGlmdF9jb3VudDsKKwlzdHJ1Y3QgaXNpX3BvcnQJCSogcG9ydHM7CisJc2lnbmVkIGNoYXIJCWNvdW50OworCXVuc2lnbmVkIGNoYXIJCWlzYTsKKwlzcGlubG9ja190CQljYXJkX2xvY2s7IC8qIENhcmQgd2lkZSBsb2NrIDExLzUvMDAgLXNhbWVlciAqLworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworfTsKKworc3RydWN0CWlzaV9wb3J0IHsKKwl1bnNpZ25lZCBzaG9ydAkJbWFnaWM7CisJdW5zaWduZWQgaW50CQlmbGFnczsKKwlpbnQJCQljb3VudDsKKwlpbnQJCQlibG9ja2VkX29wZW47CisJaW50CQkJY2xvc2VfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQJCWNoYW5uZWw7CisJdW5zaWduZWQgc2hvcnQJCXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OworCXN0cnVjdCBpc2lfYm9hcmQJKiBjYXJkOworCXN0cnVjdCB0dHlfc3RydWN0IAkqIHR0eTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJaGFuZ3VwX3RxOworCXN0cnVjdCB3b3JrX3N0cnVjdAliaF90cXVldWU7CisJdW5zaWduZWQgY2hhcgkJKiB4bWl0X2J1ZjsKKwlpbnQJCQl4bWl0X2hlYWQ7CisJaW50CQkJeG1pdF90YWlsOworCWludAkJCXhtaXRfY250OworfTsKKworc3RhdGljIHN0cnVjdCBpc2lfYm9hcmQgaXNpX2NhcmRbQk9BUkRfQ09VTlRdOworc3RhdGljIHN0cnVjdCBpc2lfcG9ydCAgaXNpX3BvcnRzW1BPUlRfQ09VTlRdOworCisvKgorICoJTG9ja2luZyBmdW5jdGlvbnMgZm9yIGNhcmQgbGV2ZWwgbG9ja2luZy4gV2UgbmVlZCB0byBvd24gYm90aAorICoJdGhlIGtlcm5lbCBsb2NrIGZvciB0aGUgY2FyZCBhbmQgaGF2ZSB0aGUgY2FyZCBpbiBhIHBvc2l0aW9uIHRoYXQKKyAqCWl0IHdhbnRzIHRvIHRhbGsuCisgKi8KKyAKK3N0YXRpYyBpbnQgbG9ja19jYXJkKHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCit7CisJY2hhcgkJcmV0cmllczsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDA7IHJldHJpZXMrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7CisJCWlmIChpbncoYmFzZSArIDB4ZSkgJiAweDEpIHsKKwkJCXJldHVybiAxOyAKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOworCQkJdWRlbGF5KDEwMDApOyAgIC8qIDFtcyAqLworCQl9CisJfQorCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogRmFpbGVkIHRvIGxvY2sgQ2FyZCAoMHgleClcbiIsIGNhcmQtPmJhc2UpOworCXJldHVybiAwOwkvKiBGYWlsZWQgdG8gYXF1aXJlIHRoZSBjYXJkISAqLworfQorCitzdGF0aWMgaW50IGxvY2tfY2FyZF9hdF9pbnRlcnJ1cHQoc3RydWN0IGlzaV9ib2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBjaGFyCQlyZXRyaWVzOworCXVuc2lnbmVkIHNob3J0IAkJYmFzZSA9IGNhcmQtPmJhc2U7CisKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMjAwOyByZXRyaWVzKyspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOworCisJCWlmIChpbncoYmFzZSArIDB4ZSkgJiAweDEpCisJCQlyZXR1cm4gMTsgCisJCWVsc2UKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOworCX0KKwkvKiBGYWlsaW5nIGluIGludGVycnVwdCBpcyBhbiBhY2NlcHRhYmxlIGV2ZW50ICovCisJcmV0dXJuIDA7CS8qIEZhaWxlZCB0byBhcXVpcmUgdGhlIGNhcmQhICovCit9CisKK3N0YXRpYyB2b2lkIHVubG9ja19jYXJkKHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7Cit9CisKKy8qCisgKiAgSVNJIENhcmQgc3BlY2lmaWMgb3BzIC4uLgorICovCisgCitzdGF0aWMgdm9pZCByYWlzZV9kdHIoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KDB4MDUwNCwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwlwb3J0LT5zdGF0dXMgfD0gSVNJX0RUUjsKKwl1bmxvY2tfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRyb3BfZHRyKHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCit7CQorCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHgwNDA0LCBiYXNlKTsKKwlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOwkKKwlwb3J0LT5zdGF0dXMgJj0gfklTSV9EVFI7CisJdW5sb2NrX2NhcmQoY2FyZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWlzZV9ydHMoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KDB4MGEwNCwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsJCisJcG9ydC0+c3RhdHVzIHw9IElTSV9SVFM7CisJdW5sb2NrX2NhcmQoY2FyZCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZHJvcF9ydHMoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KDB4MDgwNCwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsJCisJcG9ydC0+c3RhdHVzICY9IH5JU0lfUlRTOworCXVubG9ja19jYXJkKGNhcmQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmFpc2VfZHRyX3J0cyhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCisJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCisJCXJldHVybjsKKworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHgwZjA0LCBiYXNlKTsKKwlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCXBvcnQtPnN0YXR1cyB8PSAoSVNJX0RUUiB8IElTSV9SVFMpOworCXVubG9ja19jYXJkKGNhcmQpOworfQorCitzdGF0aWMgdm9pZCBkcm9wX2R0cl9ydHMoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KDB4MGMwNCwgYmFzZSk7CisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsJCisJcG9ydC0+c3RhdHVzICY9IH4oSVNJX1JUUyB8IElTSV9EVFIpOworCXVubG9ja19jYXJkKGNhcmQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga2lsbF9xdWV1ZShzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0LCBzaG9ydCBxdWV1ZSkKK3sKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisKKwlvdXR3KDB4ODAwMCB8IChjaGFubmVsIDw8IGNhcmQtPnNoaWZ0X2NvdW50KSB8IDB4MDIgLCBiYXNlKTsKKwlvdXR3KChxdWV1ZSA8PCA4KSB8IDB4MDYsIGJhc2UpOworCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CQorCXVubG9ja19jYXJkKGNhcmQpOworfQorCisKKy8qIAorICogIEZpcm13YXJlIGxvYWRlciBkcml2ZXIgc3BlY2lmaWMgcm91dGluZXMuIFRoaXMgbmVlZHMgdG8gbW9zdGx5IGRpZQorICogIGFuZCBiZSByZXBsYWNlZCB3aXRoIHJlcXVlc3RfZmlybXdhcmUuCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgSVNJTG9hZF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gSVNJTG9hZF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpc2lsb2FkZXJfZGV2aWNlID0geworCUlTSUxPQURfTUlTQ19NSU5PUiwgImlzaWN0bCIsICZJU0lMb2FkX2ZvcHMKK307CisKKyAKK3N0YXRpYyBpbmxpbmUgaW50IFdhaXRUaWxsQ2FyZElzRnJlZSh1bnNpZ25lZCBzaG9ydCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgY291bnQ9MDsKKwl3aGlsZSggKCEoaW53KGJhc2UrMHhlKSAmIDB4MSkpICYmIChjb3VudCsrIDwgNjAwMDAwMCkpOworCWlmIChpbncoYmFzZSsweGUpJjB4MSkgIAorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IElTSUxvYWRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBjYXJkLCBpLCBqLCBzaWduYXR1cmUsIHN0YXR1cywgcG9ydGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIHQ7CisJdW5zaWduZWQgc2hvcnQgd29yZF9jb3VudCwgYmFzZTsKKwliaW5fZnJhbWUgZnJhbWU7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJLyogZXhlY19yZWNvcmQgZXhlY19yZWM7ICovCisJCisJaWYoZ2V0X3VzZXIoY2FyZCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCWlmKGNhcmQgPCAwIHx8IGNhcmQgPj0gQk9BUkRfQ09VTlQpCisJCXJldHVybiAtRU5YSU87CisJCQorCWJhc2U9aXNpX2NhcmRbY2FyZF0uYmFzZTsKKwkKKwlpZihiYXNlPT0wKQorCQlyZXR1cm4gLUVOWElPOwkvKiBkaXNhYmxlZCBvciBub3QgdXNlZCAqLworCQorCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBNSU9DVExfUkVTRVRfQ0FSRDoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUxvYWQ6UmVzZXR0aW5nIENhcmQlZCBhdCAweCV4ICIsY2FyZCsxLGJhc2UpOworCQkJCQkJCQkKKwkJCWludyhiYXNlKzB4OCk7CisJCQkKKwkJCWZvcih0PWppZmZpZXMrSFovMTAwO3RpbWVfYmVmb3JlKGppZmZpZXMsIHQpOyk7CisJCQkJCisJCQlvdXR3KDAsYmFzZSsweDgpOyAvKiBSZXNldCAqLworCQkJCisJCQlmb3Ioaj0xO2o8PTM7aisrKSB7CisJCQkJZm9yKHQ9amlmZmllcytIWjt0aW1lX2JlZm9yZShqaWZmaWVzLCB0KTspOworCQkJCXByaW50aygiLiIpOworCQkJfQkKKwkJCXNpZ25hdHVyZT0oaW53KGJhc2UrMHg0KSkgJiAweGZmOwkKKwkJCWlmIChpc2lfY2FyZFtjYXJkXS5pc2EpIHsKKwkJCQkJCisJCQkJaWYgKCEoaW53KGJhc2UrMHhlKSAmIDB4MSkgfHwgKGludyhiYXNlKzB4MikpKSB7CisjaWZkZWYgSVNJQ09NX0RFQlVHCQkJCQorCQkJCQlwcmludGsoIlxuYmFzZSsweDI9MHgleCAsIGJhc2UrMHhlPTB4JXgiLGludyhiYXNlKzB4MiksaW53KGJhc2UrMHhlKSk7CisjZW5kaWYJCQkJCisJCQkJCXByaW50aygiXG5JU0lMb2FkOklTQSBDYXJkJWQgcmVzZXQgZmFpbHVyZSAoUG9zc2libGUgYmFkIEkvTyBQb3J0IEFkZHJlc3MgMHgleCkuXG4iLGNhcmQrMSxiYXNlKTsKKwkJCQkJcmV0dXJuIC1FSU87CQkJCQkKKwkJCQl9CisJCQl9CQorCQkJZWxzZSB7CisJCQkJcG9ydGNvdW50ID0gaW53KGJhc2UrMHgyKTsKKwkJCQlpZiAoIShpbncoYmFzZSsweGUpICYgMHgxKSB8fCAoKHBvcnRjb3VudCE9MCkgJiYgKHBvcnRjb3VudCE9NCkgJiYgKHBvcnRjb3VudCE9OCkpKSB7CQorI2lmZGVmIElTSUNPTV9ERUJVRworCQkJCQlwcmludGsoIlxuYmFzZSsweDI9MHgleCAsIGJhc2UrMHhlPTB4JXgiLGludyhiYXNlKzB4MiksaW53KGJhc2UrMHhlKSk7CisjZW5kaWYKKwkJCQkJcHJpbnRrKCJcbklTSUxvYWQ6UENJIENhcmQlZCByZXNldCBmYWlsdXJlIChQb3NzaWJsZSBiYWQgSS9PIFBvcnQgQWRkcmVzcyAweCV4KS5cbiIsY2FyZCsxLGJhc2UpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQl9CQorCQkJc3dpdGNoKHNpZ25hdHVyZSkgeworCQkJY2FzZQkweGE1OgorCQkJY2FzZQkweGJiOgorCQkJY2FzZQkweGRkOgkKKwkJCQkJaWYgKGlzaV9jYXJkW2NhcmRdLmlzYSkgCisJCQkJCQlpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50ID0gODsKKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAocG9ydGNvdW50ID09IDQpCisJCQkJCQkJaXNpX2NhcmRbY2FyZF0ucG9ydF9jb3VudCA9IDQ7CisJCQkJCQllbHNlCisJCQkJCQkJaXNpX2NhcmRbY2FyZF0ucG9ydF9jb3VudCA9IDg7CisJCQkJCX0JCisJCQkJICAgICAJaXNpX2NhcmRbY2FyZF0uc2hpZnRfY291bnQgPSAxMjsKKwkJCQkgICAgIAlicmVhazsKKwkJCQkgICAgICAgIAorCQkJY2FzZQkweGNjOglpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50ID0gMTY7CisJCQkJCWlzaV9jYXJkW2NhcmRdLnNoaWZ0X2NvdW50ID0gMTE7CisJCQkJCWJyZWFrOyAgCQkJCisJCQkJCQorCQkJZGVmYXVsdDogcHJpbnRrKCJJU0lMb2FkOkNhcmQlZCByZXNldCBmYWlsdXJlIChQb3NzaWJsZSBiYWQgSS9PIFBvcnQgQWRkcmVzcyAweCV4KS5cbiIsY2FyZCsxLGJhc2UpOworI2lmZGVmIElTSUNPTV9ERUJVRwkJCQorCQkJCSBwcmludGsoIlNpZz0weCV4XG4iLHNpZ25hdHVyZSk7CisjZW5kaWYJCQkJIAorCQkJCSByZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXByaW50aygiLURvbmVcbiIpOworCQkJcmV0dXJuIHB1dF91c2VyKHNpZ25hdHVyZSwodW5zaWduZWQgX191c2VyICopYXJncCk7CisJCQkJCQkKKwljYXNlCU1JT0NUTF9MT0FEX0ZJUk1XQVJFOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQkJCisJCQlpZihjb3B5X2Zyb21fdXNlcigmZnJhbWUsIGFyZ3AsIHNpemVvZihiaW5fZnJhbWUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQorCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCQorCQkJb3V0dygweGYwLGJhc2UpOwkvKiBzdGFydCB1cGxvYWQgc2VxdWVuY2UgKi8gCisJCQlvdXR3KDB4MDAsYmFzZSk7CisJCQlvdXR3KChmcmFtZS5hZGRyKSwgYmFzZSk7LyogICAgICBsc2Igb2YgYWRkZXJlc3MgICAgKi8KKwkJCQorCQkJd29yZF9jb3VudD0oZnJhbWUuY291bnQgPj4gMSkgKyBmcmFtZS5jb3VudCAlIDI7CisJCQlvdXR3KHdvcmRfY291bnQsIGJhc2UpOworCQkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwkJCQorCQkJZm9yKGk9MDtpPD0weDJmO2krKyk7CS8qIGEgd2VlIGJpdCBvZiBkZWxheSAqLworCQkJCisJCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKSAKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCQkKKwkJCWlmICgoc3RhdHVzPWludyhiYXNlKzB4NCkpIT0wKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJTG9hZDpDYXJkJWQgcmVqZWN0ZWQgbG9hZCBoZWFkZXI6XG5BZGRyZXNzOjB4JXggXG5Db3VudDoweCV4IFxuU3RhdHVzOjB4JXggXG4iLCAKKwkJCQljYXJkKzEsIGZyYW1lLmFkZHIsIGZyYW1lLmNvdW50LCBzdGF0dXMpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJb3V0c3coYmFzZSwgKHZvaWQgKikgZnJhbWUuYmluX2RhdGEsIHdvcmRfY291bnQpOworCQkJCisJCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCQkJCisJCQlmb3IoaT0wO2k8PTB4MGY7aSsrKTsJLyogYW5vdGhlciB3ZWUgYml0IG9mIGRlbGF5ICovIAorCQkJCisJCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKSAKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCQkKKwkJCWlmICgoc3RhdHVzPWludyhiYXNlKzB4NCkpIT0wKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJU0lMb2FkOkNhcmQlZCBnb3Qgb3V0IG9mIHN5bmMuQ2FyZCBTdGF0dXM6MHgleFxuIixjYXJkKzEsIHN0YXR1cyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CQorCQkJcmV0dXJuIDA7CisJCQkJCQkKKwljYXNlCU1JT0NUTF9SRUFEX0ZJUk1XQVJFOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQkJCisJCQlpZihjb3B5X2Zyb21fdXNlcigmZnJhbWUsIGFyZ3AsIHNpemVvZihiaW5faGVhZGVyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkKKwkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpCisJCQkJcmV0dXJuIC1FSU87CisJCQkKKwkJCW91dHcoMHhmMSxiYXNlKTsJLyogc3RhcnQgZG93bmxvYWQgc2VxdWVuY2UgKi8gCisJCQlvdXR3KDB4MDAsYmFzZSk7CisJCQlvdXR3KChmcmFtZS5hZGRyKSwgYmFzZSk7LyogICAgICBsc2Igb2YgYWRkZXJlc3MgICAgKi8KKwkJCQorCQkJd29yZF9jb3VudD0oZnJhbWUuY291bnQgPj4gMSkgKyBmcmFtZS5jb3VudCAlIDI7CisJCQlvdXR3KHdvcmRfY291bnQrMSwgYmFzZSk7CisJCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCQkJCisJCQlmb3IoaT0wO2k8PTB4ZjtpKyspOwkvKiBhIHdlZSBiaXQgb2YgZGVsYXkgKi8KKwkJCQorCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkgCisJCQkJcmV0dXJuIC1FSU87CisJCQkJCisJCQlpZiAoKHN0YXR1cz1pbncoYmFzZSsweDQpKSE9MCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUxvYWQ6Q2FyZCVkIHJlamVjdGVkIHZlcmlmeSBoZWFkZXI6XG5BZGRyZXNzOjB4JXggXG5Db3VudDoweCV4IFxuU3RhdHVzOjB4JXggXG4iLCAKKwkJCQljYXJkKzEsIGZyYW1lLmFkZHIsIGZyYW1lLmNvdW50LCBzdGF0dXMpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJCisJCQlpbncoYmFzZSk7CisJCQlpbnN3KGJhc2UsIGZyYW1lLmJpbl9kYXRhLCB3b3JkX2NvdW50KTsKKwkJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJCQkKKwkJCWZvcihpPTA7aTw9MHgwZjtpKyspOwkvKiBhbm90aGVyIHdlZSBiaXQgb2YgZGVsYXkgKi8gCisJCQkKKwkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpIAorCQkJCXJldHVybiAtRUlPOworCQkJCQorCQkJaWYgKChzdGF0dXM9aW53KGJhc2UrMHg0KSkhPTApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklTSUxvYWQ6Q2FyZCVkIHZlcmlmeSBnb3Qgb3V0IG9mIHN5bmMuQ2FyZCBTdGF0dXM6MHgleFxuIixjYXJkKzEsIHN0YXR1cyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CQorCQkJCisJCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJmZyYW1lLCBzaXplb2YoYmluX2ZyYW1lKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkKKwljYXNlCU1JT0NUTF9YRkVSX0NUUkw6CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpIAorCQkJCXJldHVybiAtRUlPOworCQkJCQkKKwkJCW91dHcoMHhmMiwgYmFzZSk7CisJCQlvdXR3KDB4ODAwLCBiYXNlKTsKKwkJCW91dHcoMHgwLCBiYXNlKTsKKwkJCW91dHcoMHgwLCBiYXNlKTsKKwkJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJCQlvdXR3KDB4MCwgYmFzZSsweDQpOyAgICAvKiBmb3IgSVNJNDYwOCBjYXJkcyAqLworCQkJCQkJCQorCQkJaXNpX2NhcmRbY2FyZF0uc3RhdHVzIHw9IEZJUk1XQVJFX0xPQURFRDsKKwkJCXJldHVybiAwOwkKKwkJCQorCWRlZmF1bHQ6CisjaWZkZWYgSVNJQ09NX0RFQlVHCQorCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJTG9hZDogUmVjZWl2ZWQgSW9jdGwgY21kIDB4JXguXG4iLCBjbWQpOyAKKyNlbmRpZgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQorCX0KKwkKK30KKwkJICAgICAgICAJCisKKy8qCisgKglJU0lDT00gRHJpdmVyIHNwZWNpZmljIHJvdXRpbmVzIC4uLgorICoKKyAqLworIAorc3RhdGljIGlubGluZSBpbnQgaXNpY29tX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBpc2lfcG9ydCBjb25zdCAqIHBvcnQsIGNoYXIgKm5hbWUsIAorCQkJCQljb25zdCBjaGFyICogcm91dGluZSkKK3sKKyNpZmRlZiBJU0lDT01fREVCVUcgCisJc3RhdGljIGNvbnN0IGNoYXIgKiBiYWRtYWdpYyA9IAorCQkJS0VSTl9XQVJOSU5HICJJU0lDT006IFdhcm5pbmc6IGJhZCBpc2ljb20gbWFnaWMgZm9yIGRldiAlcyBpbiAlcy5cbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBiYWRwb3J0ID0gCisJCQlLRVJOX1dBUk5JTkcgIklTSUNPTTogV2FybmluZzogTlVMTCBpc2ljb20gcG9ydCBmb3IgZGV2ICVzIGluICVzLlxuIjsJCQorCWlmICghcG9ydCkgeworCQlwcmludGsoYmFkcG9ydCwgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAocG9ydC0+bWFnaWMgIT0gSVNJQ09NX01BR0lDKSB7CisJCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0JCisjZW5kaWYJCisJcmV0dXJuIDA7Cit9CisJCQkKKy8qCisgKglUcmFuc21pdHRlci4gCisgKgorICoJV2Ugc2hvdmVsIGRhdGEgaW50byB0aGUgY2FyZCBidWZmZXJzIG9uIGEgcmVndWxhciBiYXNpcy4gVGhlIGNhcmQKKyAqCXdpbGwgZG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmsgZm9yIHVzLgorICovCisKK3N0YXRpYyB2b2lkIGlzaWNvbV90eCh1bnNpZ25lZCBsb25nIF9kYXRhKQoreworCXNob3J0IGNvdW50ID0gKEJPQVJEX0NPVU5ULTEpLCBjYXJkLCBiYXNlOworCXNob3J0IHR4Y291bnQsIHdyZCwgcmVzaWR1ZSwgd29yZF9jb3VudCwgY250OworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHk7CisJCisjaWZkZWYgSVNJQ09NX0RFQlVHCisJKyt0eF9jb3VudDsKKyNlbmRpZgkKKwkKKwkvKglmaW5kIG5leHQgYWN0aXZlIGJvYXJkCSovCisJY2FyZCA9IChwcmV2X2NhcmQgKyAxKSAmIDB4MDAwMzsKKwl3aGlsZShjb3VudC0tID4gMCkgeworCQlpZiAoaXNpX2NhcmRbY2FyZF0uc3RhdHVzICYgQk9BUkRfQUNUSVZFKSAKKwkJCWJyZWFrOworCQljYXJkID0gKGNhcmQgKyAxKSAmIDB4MDAwMzsJCisJfQorCWlmICghKGlzaV9jYXJkW2NhcmRdLnN0YXR1cyAmIEJPQVJEX0FDVElWRSkpCisJCWdvdG8gc2NoZWRfYWdhaW47CisJCQorCXByZXZfY2FyZCA9IGNhcmQ7CisJCisJY291bnQgPSBpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50OworCXBvcnQgPSBpc2lfY2FyZFtjYXJkXS5wb3J0czsKKwliYXNlID0gaXNpX2NhcmRbY2FyZF0uYmFzZTsKKwlmb3IgKDtjb3VudCA+IDA7Y291bnQtLSwgcG9ydCsrKSB7CisJCWlmICghbG9ja19jYXJkX2F0X2ludGVycnVwdCgmaXNpX2NhcmRbY2FyZF0pKQorCQkJY29udGludWU7CisJCS8qIHBvcnQgbm90IGFjdGl2ZSBvciB0eCBkaXNhYmxlZCB0byBmb3JjZSBmbG93IGNvbnRyb2wgKi8KKwkJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgfHwKKwkJIAkhKHBvcnQtPnN0YXR1cyAmIElTSV9UWE9LKSkKKwkJCXVubG9ja19jYXJkKCZpc2lfY2FyZFtjYXJkXSk7CisJCQljb250aW51ZTsKKwkJCisJCXR0eSA9IHBvcnQtPnR0eTsKKwkJCisJCQorCQlpZih0dHkgPT0gTlVMTCkgeworCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQl0eGNvdW50ID0gbWluX3Qoc2hvcnQsIFRYX1NJWkUsIHBvcnQtPnhtaXRfY250KTsKKwkJaWYgKHR4Y291bnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkKSB7CisJCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCEoaW53KGJhc2UgKyAweDAyKSAmICgxIDw8IHBvcnQtPmNoYW5uZWwpKSkgeworCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwkJCWNvbnRpbnVlOwkJCisJCX0KKyNpZmRlZiBJU0lDT01fREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogdHhpbmcgJWQgYnl0ZXMsIHBvcnQlZC5cbiIsIAorCQkJCXR4Y291bnQsIHBvcnQtPmNoYW5uZWwrMSk7IAorI2VuZGlmCQorCQlvdXR3KChwb3J0LT5jaGFubmVsIDw8IGlzaV9jYXJkW2NhcmRdLnNoaWZ0X2NvdW50KSB8IHR4Y291bnQKKwkJCQkJLCBiYXNlKTsKKwkJcmVzaWR1ZSA9IE5POworCQl3cmQgPSAwOwkJCQorCQl3aGlsZSAoMSkgeworCQkJY250ID0gbWluX3QoaW50LCB0eGNvdW50LCAoU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfdGFpbCkpOworCQkJaWYgKHJlc2lkdWUgPT0gWUVTKSB7CisJCQkJcmVzaWR1ZSA9IE5POworCQkJCWlmIChjbnQgPiAwKSB7CisJCQkJCXdyZCB8PSAocG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF90YWlsXSA8PCA4KTsKKwkJCQkJcG9ydC0+eG1pdF90YWlsID0gKHBvcnQtPnhtaXRfdGFpbCArIDEpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJCQkJcG9ydC0+eG1pdF9jbnQtLTsKKwkJCQkJdHhjb3VudC0tOworCQkJCQljbnQtLTsKKwkJCQkJb3V0dyh3cmQsIGJhc2UpOwkJCQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJb3V0dyh3cmQsIGJhc2UpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CQkKKwkJCWlmIChjbnQgPD0gMCkgYnJlYWs7CisJCQl3b3JkX2NvdW50ID0gY250ID4+IDE7CisJCQlvdXRzdyhiYXNlLCBwb3J0LT54bWl0X2J1Zitwb3J0LT54bWl0X3RhaWwsIHdvcmRfY291bnQpOworCQkJcG9ydC0+eG1pdF90YWlsID0gKHBvcnQtPnhtaXRfdGFpbCArICh3b3JkX2NvdW50IDw8IDEpKSAmCisJCQkJCQkoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCQkJdHhjb3VudCAtPSAod29yZF9jb3VudCA8PCAxKTsKKwkJCXBvcnQtPnhtaXRfY250IC09ICh3b3JkX2NvdW50IDw8IDEpOworCQkJaWYgKGNudCAmIDB4MDAwMSkgeworCQkJCXJlc2lkdWUgPSBZRVM7CisJCQkJd3JkID0gcG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF90YWlsXTsKKwkJCQlwb3J0LT54bWl0X3RhaWwgPSAocG9ydC0+eG1pdF90YWlsICsgMSkgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCQkJCXBvcnQtPnhtaXRfY250LS07CisJCQkJdHhjb3VudC0tOworCQkJfQorCQl9CisKKwkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwkJaWYgKHBvcnQtPnhtaXRfY250IDw9IDApCisJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9UWE9LOworCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gV0FLRVVQX0NIQVJTKQorCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+YmhfdHF1ZXVlKTsKKwkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwl9CQorCisJLyoJc2NoZWR1bGUgYW5vdGhlciB0eCBmb3IgaG9wZWZ1bGx5IGluIGFib3V0IDEwbXMJKi8JCitzY2hlZF9hZ2FpbjoJCisJaWYgKCFyZV9zY2hlZHVsZSkJCisJCXJldHVybjsKKwlpbml0X3RpbWVyKCZ0eCk7CisJdHguZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8xMDA7CisJdHguZGF0YSA9IDA7CisJdHguZnVuY3Rpb24gPSBpc2ljb21fdHg7CisJYWRkX3RpbWVyKCZ0eCk7CisJCisJcmV0dXJuOwkKK30JCQorIAorLyogCUludGVycnVwdCBoYW5kbGVycyAJKi8KKworIAorc3RhdGljIHZvaWQgaXNpY29tX2JvdHRvbWhhbGYodm9pZCAqIGRhdGEpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgZGF0YTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSA9IHBvcnQtPnR0eTsKKwkKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCisJdHR5X3dha2V1cCh0dHkpOwkKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Cit9IAkJCisgCQkKKy8qCisgKglNYWluIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUgCisgKi8KKyAKK3N0YXRpYyBpcnFyZXR1cm5fdCBpc2ljb21faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQ7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlLCBoZWFkZXIsIHdvcmRfY291bnQsIGNvdW50OworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsKKwlzaG9ydCBieXRlX2NvdW50OworCQorCWNhcmQgPSAoc3RydWN0IGlzaV9ib2FyZCAqKSBkZXZfaWQ7CisKKwlpZiAoIWNhcmQgfHwgIShjYXJkLT5zdGF0dXMgJiBGSVJNV0FSRV9MT0FERUQpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJCisJYmFzZSA9IGNhcmQtPmJhc2U7CisJc3Bpbl9sb2NrKCZjYXJkLT5jYXJkX2xvY2spOworCQorCWlmIChjYXJkLT5pc2EgPT0gTk8pIHsKKwkJLyoKKwkJICogICAgICBkaXNhYmxlIGFueSBpbnRlcnJ1cHRzIGZyb20gdGhlIFBDSSBjYXJkIGFuZCBsb3dlciB0aGUKKwkJICogICAgICBpbnRlcnJ1cHQgbGluZQorCQkgKi8KKwkJb3V0dygweDgwMDAsIGJhc2UrMHgwNCk7CisJCUNsZWFySW50ZXJydXB0KGJhc2UpOworCX0KKwkKKwlpbncoYmFzZSk7CQkvKiBnZXQgdGhlIGR1bW15IHdvcmQgb3V0ICovCisJaGVhZGVyID0gaW53KGJhc2UpOworCWNoYW5uZWwgPSAoaGVhZGVyICYgMHg3ODAwKSA+PiBjYXJkLT5zaGlmdF9jb3VudDsKKwlieXRlX2NvdW50ID0gaGVhZGVyICYgMHhmZjsKKworCWlmIChjaGFubmVsICsgMSA+IGNhcmQtPnBvcnRfY291bnQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJQ09NOiBpc2ljb21faW50ZXJydXB0KDB4JXgpOiAlZChjaGFubmVsKSA+IHBvcnRfY291bnQuXG4iLAorCQkJCWJhc2UsIGNoYW5uZWwrMSk7CisJCWlmIChjYXJkLT5pc2EpCisJCQlDbGVhckludGVycnVwdChiYXNlKTsKKwkJZWxzZQorCQkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCQkKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmNhcmRfbG9jayk7CisJCXJldHVybiBJUlFfSEFORExFRDsJCQkKKwl9CisJcG9ydCA9IGNhcmQtPnBvcnRzICsgY2hhbm5lbDsKKwlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeworCQlpZiAoY2FyZC0+aXNhKQorCQkJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7CisJCWVsc2UKKwkJCW91dHcoMHgwMDAwLCBiYXNlKzB4MDQpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQkKKwkJCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICh0dHkgPT0gTlVMTCkgeworCQl3b3JkX2NvdW50ID0gYnl0ZV9jb3VudCA+PiAxOworCQl3aGlsZShieXRlX2NvdW50ID4gMSkgeworCQkJaW53KGJhc2UpOworCQkJYnl0ZV9jb3VudCAtPSAyOworCQl9CisJCWlmIChieXRlX2NvdW50ICYgMHgwMSkKKwkJCWludyhiYXNlKTsKKwkJaWYgKGNhcmQtPmlzYSA9PSBZRVMpCisJCQlDbGVhckludGVycnVwdChiYXNlKTsKKwkJZWxzZQorCQkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCXNwaW5fdW5sb2NrKCZjYXJkLT5jYXJkX2xvY2spOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCQorCWlmIChoZWFkZXIgJiAweDgwMDApIHsJCS8qIFN0YXR1cyBQYWNrZXQgKi8KKwkJaGVhZGVyID0gaW53KGJhc2UpOworCQlzd2l0Y2goaGVhZGVyICYgMHhmZikgeworCQkJY2FzZSAwOgkvKiBDaGFuZ2UgaW4gRUlBIHNpZ25hbHMgKi8KKwkJCQkKKwkJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgeworCQkJCQlpZiAocG9ydC0+c3RhdHVzICYgSVNJX0RDRCkgeworCQkJCQkJaWYgKCEoaGVhZGVyICYgSVNJX0RDRCkpIHsKKwkJCQkJCS8qIENhcnJpZXIgaGFzIGJlZW4gbG9zdCAgKi8KKyNpZmRlZiBJU0lDT01fREVCVUcJCQkJCQkKKwkJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBpbnRlcnJ1cHQ6IERDRC0+bG93LlxuIik7CisjZW5kaWYJCQkJCQkJCisJCQkJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfRENEOworCQkJCQkJCXNjaGVkdWxlX3dvcmsoJnBvcnQtPmhhbmd1cF90cSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAoaGVhZGVyICYgSVNJX0RDRCkgeworCQkJCQkJLyogQ2FycmllciBoYXMgYmVlbiBkZXRlY3RlZCAqLworI2lmZGVmIElTSUNPTV9ERUJVRworCQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGludGVycnVwdDogRENELT5oaWdoLlxuIik7CisjZW5kaWYJCQkJCQkJCisJCQkJCQkJcG9ydC0+c3RhdHVzIHw9IElTSV9EQ0Q7CisJCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlpZiAoaGVhZGVyICYgSVNJX0RDRCkgCisJCQkJCQlwb3J0LT5zdGF0dXMgfD0gSVNJX0RDRDsKKwkJCQkJZWxzZQorCQkJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfRENEOworCQkJCX0JCisJCQkJCisJCQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfQ1RTX0ZMT1cpIHsKKwkJCQkJaWYgKHBvcnQtPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJCQkJaWYgKGhlYWRlciAmIElTSV9DVFMpIHsKKwkJCQkJCQlwb3J0LT50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCQkJCS8qIHN0YXJ0IHR4IGluZyAqLworCQkJCQkJCXBvcnQtPnN0YXR1cyB8PSAoSVNJX1RYT0sgfCBJU0lfQ1RTKTsKKwkJCQkJCQlzY2hlZHVsZV93b3JrKCZwb3J0LT5iaF90cXVldWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJaWYgKCEoaGVhZGVyICYgSVNJX0NUUykpIHsKKwkJCQkJCQlwb3J0LT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCQkJCS8qIHN0b3AgdHggaW5nICovCisJCQkJCQkJcG9ydC0+c3RhdHVzICY9IH4oSVNJX1RYT0sgfCBJU0lfQ1RTKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaWYgKGhlYWRlciAmIElTSV9DVFMpIAorCQkJCQkJcG9ydC0+c3RhdHVzIHw9IElTSV9DVFM7CisJCQkJCWVsc2UKKwkJCQkJCXBvcnQtPnN0YXR1cyAmPSB+SVNJX0NUUzsKKwkJCQl9CisJCQkJCisJCQkJaWYgKGhlYWRlciAmIElTSV9EU1IpIAorCQkJCQlwb3J0LT5zdGF0dXMgfD0gSVNJX0RTUjsKKwkJCQllbHNlCisJCQkJCXBvcnQtPnN0YXR1cyAmPSB+SVNJX0RTUjsKKwkJCQkKKwkJCQlpZiAoaGVhZGVyICYgSVNJX1JJKSAKKwkJCQkJcG9ydC0+c3RhdHVzIHw9IElTSV9SSTsKKwkJCQllbHNlCisJCQkJCXBvcnQtPnN0YXR1cyAmPSB+SVNJX1JJOwkJCQkJCQorCQkJCQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSAxOgkvKiBSZWNlaXZlZCBCcmVhayAhISEJICovCisJCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQorCQkJCQlicmVhazsKKwkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0JSRUFLOworCQkJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworCQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX1NBSykKKwkJCQkJZG9fU0FLKHR0eSk7CisJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIDI6CS8qIFN0YXRpc3RpY3MJCSAqLworCQkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGlzaWNvbV9pbnRlcnJ1cHQ6IHN0YXRzISEhLlxuIik7CQkJCisJCQkJYnJlYWs7CisJCQkJCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogSW50cjogVW5rbm93biBjb2RlIGluIHN0YXR1cyBwYWNrZXQuXG4iKTsKKwkJCQlicmVhazsKKwkJfQkgCisJfQorCWVsc2UgewkJCQkvKiBEYXRhICAgUGFja2V0ICovCisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgc2hvcnQsIGJ5dGVfY291bnQsIChUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50KSk7CisjaWZkZWYgSVNJQ09NX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IEludHI6IENhbiByeCAlZCBvZiAlZCBieXRlcy5cbiIsIAorCQkJCQljb3VudCwgYnl0ZV9jb3VudCk7CisjZW5kaWYJCQkKKwkJd29yZF9jb3VudCA9IGNvdW50ID4+IDE7CisJCWluc3coYmFzZSwgdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgd29yZF9jb3VudCk7CisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gKHdvcmRfY291bnQgPDwgMSk7CQkKKwkJYnl0ZV9jb3VudCAtPSAod29yZF9jb3VudCA8PCAxKTsKKwkJaWYgKGNvdW50ICYgMHgwMDAxKSB7CisJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gKGNoYXIpKGludyhiYXNlKSAmIDB4ZmYpOworCQkJYnl0ZV9jb3VudCAtPSAyOworCQl9CQorCQltZW1zZXQodHR5LT5mbGlwLmZsYWdfYnVmX3B0ciwgMCwgY291bnQpOworCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyICs9IGNvdW50OworCQl0dHktPmZsaXAuY291bnQgKz0gY291bnQ7CisJCQorCQlpZiAoYnl0ZV9jb3VudCA+IDApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IEludHIoMHgleDolZCk6IEZsaXAgYnVmZmVyIG92ZXJmbG93ISBkcm9wcGluZyBieXRlcy4uLlxuIiwKKwkJCQkJYmFzZSwgY2hhbm5lbCsxKTsKKwkJCXdoaWxlKGJ5dGVfY291bnQgPiAwKSB7IC8qIGRyYWluIG91dCB1bnJlYWQgeHRyYSBkYXRhICovCisJCQkJaW53KGJhc2UpOworCQkJCWJ5dGVfY291bnQgLT0gMjsKKwkJCX0KKwkJfQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwl9CisJaWYgKGNhcmQtPmlzYSA9PSBZRVMpCisJCUNsZWFySW50ZXJydXB0KGJhc2UpOworCWVsc2UKKwkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCQorCXJldHVybiBJUlFfSEFORExFRDsKK30gCisKK3N0YXRpYyB2b2lkIGlzaWNvbV9jb25maWdfcG9ydChzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwl1bnNpZ25lZCBsb25nIGJhdWQ7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbF9zZXR1cCwgYmFzZSA9IGNhcmQtPmJhc2U7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWwsIHNoaWZ0X2NvdW50ID0gY2FyZC0+c2hpZnRfY291bnQ7CisJdW5zaWduZWQgY2hhciBmbG93X2N0cmw7CisJCisJaWYgKCEodHR5ID0gcG9ydC0+dHR5KSB8fCAhdHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisJYmF1ZCA9IENfQkFVRCh0dHkpOworCWlmIChiYXVkICYgQ0JBVURFWCkgeworCQliYXVkICY9IH5DQkFVREVYOworCQkKKwkJLyogIGlmIENCQVVERVggYml0IGlzIG9uIGFuZCB0aGUgYmF1ZCBpcyBzZXQgdG8gZWl0aGVyIDUwIG9yIDc1CisJCSAqICB0aGVuIHRoZSBjYXJkIGlzIHByb2dyYW1tZWQgZm9yIDU3LjZLYnBzIG9yIDExNUticHMKKwkJICogIHJlc3BlY3RpdmVseS4KKwkJICovICAgCisJCSAKKwkJaWYgKGJhdWQgPCAxIHx8IGJhdWQgPiAyKQorCQkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVREVYOworCQllbHNlCisJCQliYXVkICs9IDE1OworCX0JCisJaWYgKGJhdWQgPT0gMTUpIHsKKwkKKwkJLyogIHRoZSBBU1lOQ19TUERfSEkgYW5kIEFTWU5DX1NQRF9WSEkgb3B0aW9ucyBhcmUgc2V0IAorCQkgKiAgYnkgdGhlIHNldF9zZXJpYWxfaW5mbyBpb2N0bCAuLi4gdGhpcyBpcyBkb25lIGJ5CisJCSAqICB0aGUgJ3NldHNlcmlhbCcgdXRpbGl0eS4KKwkJICovICAKKwkJCQorCQlpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCWJhdWQrKzsgICAgIC8qICA1Ny42IEticHMgKi8KKwkJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJYmF1ZCArPTI7ICAgLyogIDExNSAgS2JwcyAqLwkgCisJfQorCWlmIChsaW51eGJfdG9faXNpYltiYXVkXSA9PSAtMSkgeworCQkvKiBoYW5nIHVwICovCisJIAlkcm9wX2R0cihwb3J0KTsKKwkgCXJldHVybjsKKwl9CQorCWVsc2UgIAorCQlyYWlzZV9kdHIocG9ydCk7CisJCQorCWlmIChsb2NrX2NhcmQoY2FyZCkpIHsKKwkJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBzaGlmdF9jb3VudCkgfDB4MDMsIGJhc2UpOworCQlvdXR3KGxpbnV4Yl90b19pc2liW2JhdWRdIDw8IDggfCAweDAzLCBiYXNlKTsKKwkJY2hhbm5lbF9zZXR1cCA9IDA7CisJCXN3aXRjaChDX0NTSVpFKHR0eSkpIHsKKwkJCWNhc2UgQ1M1OgorCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTNTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1M2OgorCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1M3OgorCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTNzsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1M4OgorCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTODsKKwkJCQlicmVhazsKKwkJfQorCQkJCisJCWlmIChDX0NTVE9QQih0dHkpKQorCQkJY2hhbm5lbF9zZXR1cCB8PSBJU0lDT01fMlNCOworCQlpZiAoQ19QQVJFTkIodHR5KSkgeworCQkJY2hhbm5lbF9zZXR1cCB8PSBJU0lDT01fRVZQQVI7CisJCQlpZiAoQ19QQVJPREQodHR5KSkKKwkJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV9PRFBBUjsJCisJCX0KKwkJb3V0dyhjaGFubmVsX3NldHVwLCBiYXNlKTsJCisJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJCXVubG9ja19jYXJkKGNhcmQpOwkKKwl9CQorCWlmIChDX0NMT0NBTCh0dHkpKQorCQlwb3J0LT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCQlwb3J0LT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsJCisJCisJLyogZmxvdyBjb250cm9sIHNldHRpbmdzIC4uLiovCisJZmxvd19jdHJsID0gMDsKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7CisJaWYgKENfQ1JUU0NUUyh0dHkpKSB7CisJCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCQlmbG93X2N0cmwgfD0gSVNJQ09NX0NUU1JUUzsKKwl9CQorCWlmIChJX0lYT04odHR5KSkJCisJCWZsb3dfY3RybCB8PSBJU0lDT01fUkVTUE9ORF9YT05YT0ZGOworCWlmIChJX0lYT0ZGKHR0eSkpCisJCWZsb3dfY3RybCB8PSBJU0lDT01fSU5JVElBVEVfWE9OWE9GRjsJCisJCQorCWlmIChsb2NrX2NhcmQoY2FyZCkpIHsKKwkJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBzaGlmdF9jb3VudCkgfDB4MDQsIGJhc2UpOworCQlvdXR3KGZsb3dfY3RybCA8PCA4IHwgMHgwNSwgYmFzZSk7CisJCW91dHcoKFNUT1BfQ0hBUih0dHkpKSA8PCA4IHwgKFNUQVJUX0NIQVIodHR5KSksIGJhc2UpOworCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCQl1bmxvY2tfY2FyZChjYXJkKTsKKwl9CisJCisJLyoJcnggZW5hYmxlZCAtPiBlbmFibGUgcG9ydCBmb3Igcnggb24gdGhlIGNhcmQJKi8KKwlpZiAoQ19DUkVBRCh0dHkpKSB7CisJCWNhcmQtPnBvcnRfc3RhdHVzIHw9ICgxIDw8IGNoYW5uZWwpOworCQlvdXR3KGNhcmQtPnBvcnRfc3RhdHVzLCBiYXNlICsgMHgwMik7CisJfQorfQorIAorLyogb3BlbiBldCBhbGwgKi8gCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2ljb21fc2V0dXBfYm9hcmQoc3RydWN0IGlzaV9ib2FyZCAqIGJwKQoreworCWludCBjaGFubmVsOworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChicC0+c3RhdHVzICYgQk9BUkRfQUNUSVZFKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwb3J0ID0gYnAtPnBvcnRzOworCWJwLT5zdGF0dXMgfD0gQk9BUkRfQUNUSVZFOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlmb3IoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBicC0+cG9ydF9jb3VudDsgY2hhbm5lbCsrLCBwb3J0KyspCisJCWRyb3BfZHRyX3J0cyhwb3J0KTsKKwlyZXR1cm47Cit9CisgCitzdGF0aWMgaW50IGlzaWNvbV9zZXR1cF9wb3J0KHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghcG9ydC0+eG1pdF9idWYpIHsKKwkJdW5zaWduZWQgbG9uZyBwYWdlOworCQkKKwkJaWYgKCEocGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKSkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJCisJCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQkJZnJlZV9wYWdlKHBhZ2UpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCQlwb3J0LT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CQorCX0JCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKHBvcnQtPnR0eSkKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnBvcnQtPnR0eS0+ZmxhZ3MpOworCWlmIChwb3J0LT5jb3VudCA9PSAxKQorCQljYXJkLT5jb3VudCsrOworCQkKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJCisJLyoJZGlzY2FyZCBhbnkgcmVzaWR1YWwgZGF0YQkqLworCWtpbGxfcXVldWUocG9ydCwgSVNJQ09NX0tJTExUWCB8IElTSUNPTV9LSUxMUlgpOworCQorCWlzaWNvbV9jb25maWdfcG9ydChwb3J0KTsKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gMDsJCQorfSAKKyAKK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpIAoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwlpbnQgZG9fY2xvY2FsID0gMCwgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvKiBibG9jayBpZiBwb3J0IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNsb3NlZCAqLworCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgcG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB7CisjaWZkZWYgSVNJQ09NX0RFQlVHCQorCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBibG9ja190aWxfcmVhZHk6IGNsb3NlIGluIHByb2dyZXNzLlxuIik7CisjZW5kaWYJCQorCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwb3J0LT5jbG9zZV93YWl0KTsKKwkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHVybiAtRUFHQUlOOworCQllbHNlCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwkKKwkvKiBpZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQgLi4uICovCisJCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworI2lmZGVmIElTSUNPTV9ERUJVRwkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogYmxvY2tfdGlsX3JlYWR5OiBub24tYmxvY2sgbW9kZS5cbiIpOworI2VuZGlmCQkKKwkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CQorCX0JCisJCisJaWYgKENfQ0xPQ0FMKHR0eSkpCisJCWRvX2Nsb2NhbCA9IDE7CisJCisJLyogYmxvY2sgd2FpdGluZyBmb3IgRENEIHRvIGJlIGFzc2VydGVkLCBhbmQgd2hpbGUgCisJCQkJCQljYWxsb3V0IGRldiBpcyBidXN5ICovCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlwb3J0LT5jb3VudC0tOworCXBvcnQtPmJsb2NrZWRfb3BlbisrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQorCXdoaWxlICgxKSB7CisJCXJhaXNlX2R0cl9ydHMocG9ydCk7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeyAJCisJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0JCisJCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKwkJICAgIChkb19jbG9jYWwgfHwgKHBvcnQtPnN0YXR1cyAmIElTSV9EQ0QpKSkgeworCQkJYnJlYWs7CisJCX0JCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsJCQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlwb3J0LT5jb3VudCsrOworCXBvcnQtPmJsb2NrZWRfb3Blbi0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwlyZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBpbnQgaXNpY29tX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0OworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkOworCXVuc2lnbmVkIGludCBsaW5lLCBib2FyZDsKKwlpbnQgZXJyb3I7CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlpZiAobGluZSA8IDAgfHwgbGluZSA+IFBPUlRfQ09VTlQtMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYm9hcmQgPSBCT0FSRChsaW5lKTsKKwljYXJkID0gJmlzaV9jYXJkW2JvYXJkXTsKKwkKKwlpZiAoIShjYXJkLT5zdGF0dXMgJiBGSVJNV0FSRV9MT0FERUQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwkvKiAgb3BlbiBvbiBhIHBvcnQgZ3JlYXRlciB0aGFuIHRoZSBwb3J0IGNvdW50IGZvciB0aGUgY2FyZCAhISEgKi8KKwlpZiAobGluZSA+ICgoYm9hcmQgKiAxNikgKyBjYXJkLT5wb3J0X2NvdW50IC0gMSkpCisJCXJldHVybiAtRU5PREVWOworCisJcG9ydCA9ICZpc2lfcG9ydHNbbGluZV07CQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX29wZW4iKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCQorCWlzaWNvbV9zZXR1cF9ib2FyZChjYXJkKTsJCQorCQorCXBvcnQtPmNvdW50Kys7CisJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnQ7CisJcG9ydC0+dHR5ID0gdHR5OworCWlmICgoZXJyb3IgPSBpc2ljb21fc2V0dXBfcG9ydChwb3J0KSkhPTApCisJCXJldHVybiBlcnJvcjsKKwlpZiAoKGVycm9yID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgcG9ydCkpIT0wKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsgICAgICAJCQorfQorIAorLyogY2xvc2UgZXQgYWxsICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2ljb21fc2h1dGRvd25fYm9hcmQoc3RydWN0IGlzaV9ib2FyZCAqIGJwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChicC0+c3RhdHVzICYgQk9BUkRfQUNUSVZFKSB7CisJCWJwLT5zdGF0dXMgJj0gfkJPQVJEX0FDVElWRTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBpc2ljb21fc2h1dGRvd25fcG9ydChzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsJCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CQorCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBvcnQtPnhtaXRfYnVmKTsKKwkJcG9ydC0+eG1pdF9idWYgPSBOVUxMOworCX0JCisJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCS8qIDNyZCBPY3RvYmVyIDIwMDAgOiBWaW5heWFrIFAgUmlzYnVkICovCisJcG9ydC0+dHR5ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkKKwkvKkZpeCBkb25lIGJ5IEFuaWwgLlMgb24gMzAtMDQtMjAwMQorCXJlbW90ZSBsb2dpbiB0aHJvdWdoIGlzaSBwb3J0IGhhcyBkdHIgdG9nZ2xlIHByb2JsZW0KKwlkdWUgdG8gd2hpY2ggdGhlIGNhcnJpZXIgZHJvcHMgYmVmb3JlIHRoZSBwYXNzd29yZCBwcm9tcHQKKwlhcHBlYXJzIG9uIHRoZSByZW1vdGUgZW5kLiBOb3cgd2UgZHJvcCB0aGUgZHRyIG9ubHkgaWYgdGhlIAorCUhVUENMKEhhbmd1cCBvbiBjbG9zZSkgZmxhZyBpcyBzZXQgZm9yIHRoZSB0dHkqLworCQorCWlmIChDX0hVUENMKHR0eSkpIAorCQkvKiBkcm9wIGR0ciBvbiB0aGlzIHBvcnQgKi8KKwkJZHJvcF9kdHIocG9ydCk7CisJCQorCS8qIGFueSBvdGhlciBwb3J0IHVuaW5pdHMgICovIAorCWlmICh0dHkpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CisJCisJaWYgKC0tY2FyZC0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGlzaWNvbV9zaHV0ZG93bl9wb3J0OiBiYWQgYm9hcmQoMHgleCkgY291bnQgJWQuXG4iLAorCQkJY2FyZC0+YmFzZSwgY2FyZC0+Y291bnQpOworCQljYXJkLT5jb3VudCA9IDA7CQorCX0KKwkKKwkvKiBsYXN0IHBvcnQgd2FzIGNsb3NlZCAsIHNodXRkb3duIHRoYXQgYm9hZCB0b28gKi8KKwlpZihDX0hVUENMKHR0eSkpIHsKKwkJaWYgKCFjYXJkLT5jb3VudCkKKwkJCWlzaWNvbV9zaHV0ZG93bl9ib2FyZChjYXJkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlzaWNvbV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCFwb3J0KQorCQlyZXR1cm47CisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fY2xvc2UiKSkKKwkJcmV0dXJuOworCQorI2lmZGVmIElTSUNPTV9ERUJVRwkJCisJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogQ2xvc2Ugc3RhcnQhISEuXG4iKTsKKyNlbmRpZgkKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHR0eS0+Y291bnQgPT0gMSAmJiBwb3J0LT5jb3VudCAhPSAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTooMHgleCkgaXNpY29tX2Nsb3NlOiBiYWQgcG9ydCBjb3VudCIKKwkJCSJ0dHktPmNvdW50ID0gMQlwb3J0IGNvdW50ID0gJWQuXG4iLAorCQkJY2FyZC0+YmFzZSwgcG9ydC0+Y291bnQpOworCQlwb3J0LT5jb3VudCA9IDE7CisJfQorCWlmICgtLXBvcnQtPmNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006KDB4JXgpIGlzaWNvbV9jbG9zZTogYmFkIHBvcnQgY291bnQgZm9yIgorCQkJImNoYW5uZWwlZCA9ICVkIiwgY2FyZC0+YmFzZSwgcG9ydC0+Y2hhbm5lbCwgCisJCQlwb3J0LT5jb3VudCk7CisJCXBvcnQtPmNvdW50ID0gMDsJCisJfQorCQorCWlmIChwb3J0LT5jb3VudCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0gCQorCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisJdHR5LT5jbG9zaW5nID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkKKwlpZiAocG9ydC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydC0+Y2xvc2luZ193YWl0KTsKKwkvKiBpbmRpY2F0ZSB0byB0aGUgY2FyZCB0aGF0IG5vIG1vcmUgZGF0YSBjYW4gYmUgcmVjZWl2ZWQgCisJICAgb24gdGhpcyBwb3J0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7ICAgCisJCWNhcmQtPnBvcnRfc3RhdHVzICY9IH4oMSA8PCBwb3J0LT5jaGFubmVsKTsKKwkJb3V0dyhjYXJkLT5wb3J0X3N0YXR1cywgY2FyZC0+YmFzZSArIDB4MDIpOworCX0JCisJaXNpY29tX3NodXRkb3duX3BvcnQocG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwl0dHktPmNsb3NpbmcgPSAwOworCisJaWYgKHBvcnQtPmJsb2NrZWRfb3BlbikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHBvcnQtPmNsb3NlX2RlbGF5KSB7CisjaWZkZWYgSVNJQ09NX0RFQlVHCQkJCisJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBzY2hlZHVsaW5nIHVudGlsIHRpbWUgb3V0LlxuIik7CisjZW5kaWYJCQkKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydC0+Y2xvc2VfZGVsYXkpKTsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKKwl9CQorCXBvcnQtPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0NMT1NJTkcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIHdyaXRlIGV0IGFsbCAqLworc3RhdGljIGludCBpc2ljb21fd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY250LCB0b3RhbCA9IDA7CisKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV93cml0ZSIpKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpCisJCXJldHVybiAwOworCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCisJd2hpbGUoMSkgewkKKwkJY250ID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudCAtIDEsCisJCQkJCSAgICBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9oZWFkKSk7CisJCWlmIChjbnQgPD0gMCkgCisJCQlicmVhazsKKwkJCisJCW1lbWNweShwb3J0LT54bWl0X2J1ZiArIHBvcnQtPnhtaXRfaGVhZCwgYnVmLCBjbnQpOworCQlwb3J0LT54bWl0X2hlYWQgPSAocG9ydC0+eG1pdF9oZWFkICsgY250KSAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCXBvcnQtPnhtaXRfY250ICs9IGNudDsKKwkJYnVmICs9IGNudDsKKwkJY291bnQgLT0gY250OworCQl0b3RhbCArPSBjbnQ7CisJfQkJCisJaWYgKHBvcnQtPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkKKwkJcG9ydC0+c3RhdHVzIHw9IElTSV9UWE9LOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCXJldHVybiB0b3RhbDsJCit9CisKKy8qIHB1dF9jaGFyIGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fcHV0X2NoYXIiKSkKKwkJcmV0dXJuOworCQorCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZikKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmIChwb3J0LT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwkKKwlwb3J0LT54bWl0X2J1Zltwb3J0LT54bWl0X2hlYWQrK10gPSBjaDsKKwlwb3J0LT54bWl0X2hlYWQgJj0gKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwlwb3J0LT54bWl0X2NudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworfQorCisvKiBmbHVzaF9jaGFycyBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX2ZsdXNoX2NoYXJzIikpCisJCXJldHVybjsKKwkKKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8ICFwb3J0LT54bWl0X2J1ZikKKwkJcmV0dXJuOworCQkKKwkvKiB0aGlzIHRlbGxzIHRoZSB0cmFuc21pdHRlciB0byBjb25zaWRlciB0aGlzIHBvcnQgZm9yCisJICAgZGF0YSBvdXRwdXQgdG8gdGhlIGNhcmQgLi4uIHRoYXQncyB0aGUgYmVzdCB3ZSBjYW4gZG8uICovCisJcG9ydC0+c3RhdHVzIHw9IElTSV9UWE9LOwkKK30KKworLyogd3JpdGVfcm9vbSBldCBhbGwgKi8KK3N0YXRpYyBpbnQgaXNpY29tX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgZnJlZTsKKworCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisJCisJZnJlZSA9IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudCAtIDE7CisJaWYgKGZyZWUgPCAwKQorCQlmcmVlID0gMDsKKwlyZXR1cm4gZnJlZTsKK30KKworLyogY2hhcnNfaW5fYnVmZmVyIGV0IGFsbCAqLworc3RhdGljIGludCBpc2ljb21fY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fY2hhcnNfaW5fYnVmZmVyIikpCisJCXJldHVybiAwOworCXJldHVybiBwb3J0LT54bWl0X2NudDsKK30KKworLyogaW9jdGwgZXQgYWxsICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXNpY29tX3NlbmRfYnJlYWsoc3RydWN0IGlzaV9wb3J0ICogcG9ydCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIHNob3J0IGJhc2UgPSBjYXJkLT5iYXNlOwkKKwkKKwlpZighbG9ja19jYXJkKGNhcmQpKQorCQlyZXR1cm47CisJCQorCW91dHcoMHg4MDAwIHwgKChwb3J0LT5jaGFubmVsKSA8PCAoY2FyZC0+c2hpZnRfY291bnQpKSB8IDB4MywgYmFzZSk7CisJb3V0dygobGVuZ3RoICYgMHhmZikgPDwgOCB8IDB4MDAsIGJhc2UpOworCW91dHcoKGxlbmd0aCAmIDB4ZmYwMCksIGJhc2UpOworCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisKKwl1bmxvY2tfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGludCBpc2ljb21fdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkvKiBqdXN0IHNlbmQgdGhlIHBvcnQgc3RhdHVzICovCisJdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gcG9ydC0+c3RhdHVzOworCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21faW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJcmV0dXJuICAoKHN0YXR1cyAmIElTSV9SVFMpID8gVElPQ01fUlRTIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9EVFIpID8gVElPQ01fRFRSIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9EQ0QpID8gVElPQ01fQ0FSIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9EU1IpID8gVElPQ01fRFNSIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9DVFMpID8gVElPQ01fQ1RTIDogMCkgfAorCQkoKHN0YXR1cyAmIElTSV9SSSApID8gVElPQ01fUkkgIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgaXNpY29tX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21faW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJcmFpc2VfcnRzKHBvcnQpOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCXJhaXNlX2R0cihwb3J0KTsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJZHJvcF9ydHMocG9ydCk7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlkcm9wX2R0cihwb3J0KTsKKworCXJldHVybiAwOworfQkJCQorCitzdGF0aWMgaW50IGlzaWNvbV9zZXRfc2VyaWFsX2luZm8oc3RydWN0IGlzaV9wb3J0ICogcG9ydCwKKwkJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICppbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld2luZm87CisJaW50IHJlY29uZmlnX3BvcnQ7CisKKwlpZihjb3B5X2Zyb21fdXNlcigmbmV3aW5mbywgaW5mbywgc2l6ZW9mKG5ld2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCXJlY29uZmlnX3BvcnQgPSAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9IAorCQkJIChuZXdpbmZvLmZsYWdzICYgQVNZTkNfU1BEX01BU0spKTsKKwkKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChuZXdpbmZvLmNsb3NlX2RlbGF5ICE9IHBvcnQtPmNsb3NlX2RlbGF5KSB8fAorCQkgICAgKG5ld2luZm8uY2xvc2luZ193YWl0ICE9IHBvcnQtPmNsb3Npbmdfd2FpdCkgfHwKKwkJICAgICgobmV3aW5mby5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0gCisJCSAgICAgKHBvcnQtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCisJCQlyZXR1cm4gLUVQRVJNOworCQlwb3J0LT5mbGFncyA9ICgocG9ydC0+ZmxhZ3MgJiB+IEFTWU5DX1VTUl9NQVNLKSB8CisJCQkJKG5ld2luZm8uZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCX0JCisJZWxzZSB7CisJCXBvcnQtPmNsb3NlX2RlbGF5ID0gbmV3aW5mby5jbG9zZV9kZWxheTsKKwkJcG9ydC0+Y2xvc2luZ193YWl0ID0gbmV3aW5mby5jbG9zaW5nX3dhaXQ7IAorCQlwb3J0LT5mbGFncyA9ICgocG9ydC0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwgCisJCQkJKG5ld2luZm8uZmxhZ3MgJiBBU1lOQ19GTEFHUykpOworCX0KKwlpZiAocmVjb25maWdfcG9ydCkgeworCQlpc2ljb21fY29uZmlnX3BvcnQocG9ydCk7CisJfQorCXJldHVybiAwOwkJIAorfQkJCisKK3N0YXRpYyBpbnQgaXNpY29tX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0LCAKKwkJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICppbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG91dF9pbmZvOworCQorCW1lbXNldCgmb3V0X2luZm8sIDAsIHNpemVvZihvdXRfaW5mbykpOworLyoJb3V0X2luZm8udHlwZSA9ID8gKi8KKwlvdXRfaW5mby5saW5lID0gcG9ydCAtIGlzaV9wb3J0czsKKwlvdXRfaW5mby5wb3J0ID0gcG9ydC0+Y2FyZC0+YmFzZTsKKwlvdXRfaW5mby5pcnEgPSBwb3J0LT5jYXJkLT5pcnE7CisJb3V0X2luZm8uZmxhZ3MgPSBwb3J0LT5mbGFnczsKKy8qCW91dF9pbmZvLmJhdWRfYmFzZSA9ID8gKi8KKwlvdXRfaW5mby5jbG9zZV9kZWxheSA9IHBvcnQtPmNsb3NlX2RlbGF5OworCW91dF9pbmZvLmNsb3Npbmdfd2FpdCA9IHBvcnQtPmNsb3Npbmdfd2FpdDsKKwlpZihjb3B5X3RvX3VzZXIoaW5mbywgJm91dF9pbmZvLCBzaXplb2Yob3V0X2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CQkJCQkKKworc3RhdGljIGludCBpc2ljb21faW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKSAKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCByZXR2YWw7CisKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBUQ1NCUks6CisJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQlpZiAoIWFyZykKKwkJCQlpc2ljb21fc2VuZF9icmVhayhwb3J0LCBIWi80KTsKKwkJCXJldHVybiAwOworCQkJCisJCWNhc2UgVENTQlJLUDoJCisJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCQlpc2ljb21fc2VuZF9icmVhayhwb3J0LCBhcmcgPyBhcmcgKiAoSFovMTApIDogSFovNCk7CisJCQlyZXR1cm4gMDsKKwkJCQorCQljYXNlIFRJT0NHU09GVENBUjoKKwkJCXJldHVybiBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCQkJCisJCWNhc2UgVElPQ1NTT0ZUQ0FSOgorCQkJaWYoZ2V0X3VzZXIoYXJnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkJCSgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJCShhcmcgPyBDTE9DQUwgOiAwKSk7CisJCQlyZXR1cm4gMDsJCisJCQkKKwkJY2FzZSBUSU9DR1NFUklBTDoKKwkJCXJldHVybiBpc2ljb21fZ2V0X3NlcmlhbF9pbmZvKHBvcnQsIGFyZ3ApOworCQkKKwkJY2FzZSBUSU9DU1NFUklBTDoKKwkJCXJldHVybiBpc2ljb21fc2V0X3NlcmlhbF9pbmZvKHBvcnQsIGFyZ3ApOworCQkJCQkKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CQkJCQkJCisJfQorCXJldHVybiAwOworfQorCisvKiBzZXRfdGVybWlvcyBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3NldF90ZXJtaW9zIikpCisJCXJldHVybjsKKwkKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnICYmCisJICAgIHR0eS0+dGVybWlvcy0+Y19pZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19pZmxhZykKKwkJcmV0dXJuOworCQkKKwlpc2ljb21fY29uZmlnX3BvcnQocG9ydCk7CisJCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsJCisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCWlzaWNvbV9zdGFydCh0dHkpOyAgIAorCX0gICAgCit9CisKKy8qIHRocm90dGxlIGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3Rocm90dGxlIikpCisJCXJldHVybjsKKwkKKwkvKiB0ZWxsIHRoZSBjYXJkIHRoYXQgdGhpcyBwb3J0IGNhbm5vdCBoYW5kbGUgYW55IG1vcmUgZGF0YSBmb3Igbm93ICovCisJY2FyZC0+cG9ydF9zdGF0dXMgJj0gfigxIDw8IHBvcnQtPmNoYW5uZWwpOworCW91dHcoY2FyZC0+cG9ydF9zdGF0dXMsIGNhcmQtPmJhc2UgKyAweDAyKTsKK30KKworLyogdW50aHJvdHRsZSBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCQorCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3VudGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCS8qIHRlbGwgdGhlIGNhcmQgdGhhdCB0aGlzIHBvcnQgaXMgcmVhZHkgdG8gYWNjZXB0IG1vcmUgZGF0YSAqLworCWNhcmQtPnBvcnRfc3RhdHVzIHw9ICgxIDw8IHBvcnQtPmNoYW5uZWwpOworCW91dHcoY2FyZC0+cG9ydF9zdGF0dXMsIGNhcmQtPmJhc2UgKyAweDAyKTsKK30KKworLyogc3RvcCBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9zdG9wIikpCisJCXJldHVybjsKKwkKKwkvKiB0aGlzIHRlbGxzIHRoZSB0cmFuc21pdHRlciBub3QgdG8gY29uc2lkZXIgdGhpcyBwb3J0IGZvcgorCSAgIGRhdGEgb3V0cHV0IHRvIHRoZSBjYXJkLiAqLworCXBvcnQtPnN0YXR1cyAmPSB+SVNJX1RYT0s7Cit9CisKKy8qIHN0YXJ0IGV0IGFsbCAqLworc3RhdGljIHZvaWQgaXNpY29tX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fc3RhcnQiKSkKKwkJcmV0dXJuOworCQorCS8qIHRoaXMgdGVsbHMgdGhlIHRyYW5zbWl0dGVyIHRvIGNvbnNpZGVyIHRoaXMgcG9ydCBmb3IKKwkgICBkYXRhIG91dHB1dCB0byB0aGUgY2FyZC4gKi8KKwlwb3J0LT5zdGF0dXMgfD0gSVNJX1RYT0s7Cit9CisKKy8qIGhhbmd1cCBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGRvX2lzaWNvbV9oYW5ndXAodm9pZCAqIGRhdGEpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgZGF0YTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisJaWYgKHR0eSkKKwkJdHR5X2hhbmd1cCh0dHkpOworfQorCitzdGF0aWMgdm9pZCBpc2ljb21faGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21faGFuZ3VwIikpCisJCXJldHVybjsKKwkKKwlpc2ljb21fc2h1dGRvd25fcG9ydChwb3J0KTsKKwlwb3J0LT5jb3VudCA9IDA7CisJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcG9ydC0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7Cit9CisKKy8qIGZsdXNoX2J1ZmZlciBldCBhbGwgKi8KK3N0YXRpYyB2b2lkIGlzaWNvbV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9mbHVzaF9idWZmZXIiKSkKKwkJcmV0dXJuOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9pb3JlZ2lvbih2b2lkKQoreworCWludCBjb3VudCwgZG9uZT0wOworCWZvciAoY291bnQ9MDsgY291bnQgPCBCT0FSRF9DT1VOVDsgY291bnQrKyApIHsKKwkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlKQorCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpc2lfY2FyZFtjb3VudF0uYmFzZSwxNixJU0lDT01fTkFNRSkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBJL08gUmVnaW9uIDB4JXgtMHgleCBpcyBidXN5LiBDYXJkJWQgd2lsbCBiZSBkaXNhYmxlZC5cbiIsCisJCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlLGlzaV9jYXJkW2NvdW50XS5iYXNlKzE1LGNvdW50KzEpOworCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlPTA7CisJCQkJZG9uZSsrOworCQkJfQorCX0KKwlyZXR1cm4gZG9uZTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfaW9yZWdpb24odm9pZCkKK3sKKwlpbnQgY291bnQ7CisJZm9yIChjb3VudD0wOyBjb3VudCA8IEJPQVJEX0NPVU5UOyBjb3VudCsrICkgCisJCWlmIChpc2lfY2FyZFtjb3VudF0uYmFzZSkgeworCQkJcmVsZWFzZV9yZWdpb24oaXNpX2NhcmRbY291bnRdLmJhc2UsMTYpOworI2lmZGVmIElTSUNPTV9ERUJVRwkJCQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogSS9PIFJlZ2lvbiAweCV4LTB4JXggcmVsZWFzZWQgZm9yIENhcmQlZC5cbiIsaXNpX2NhcmRbY291bnRdLmJhc2UsaXNpX2NhcmRbY291bnRdLmJhc2UrMTUsY291bnQrMSk7CisjZW5kaWYJCQkKKwkJfQorfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGlzaWNvbV9vcHMgPSB7CisJLm9wZW4JPSBpc2ljb21fb3BlbiwKKwkuY2xvc2UJPSBpc2ljb21fY2xvc2UsCisJLndyaXRlCT0gaXNpY29tX3dyaXRlLAorCS5wdXRfY2hhcgk9IGlzaWNvbV9wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMJPSBpc2ljb21fZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20JPSBpc2ljb21fd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyCT0gaXNpY29tX2NoYXJzX2luX2J1ZmZlciwKKwkuaW9jdGwJPSBpc2ljb21faW9jdGwsCisJLnNldF90ZXJtaW9zCT0gaXNpY29tX3NldF90ZXJtaW9zLAorCS50aHJvdHRsZQk9IGlzaWNvbV90aHJvdHRsZSwKKwkudW50aHJvdHRsZQk9IGlzaWNvbV91bnRocm90dGxlLAorCS5zdG9wCT0gaXNpY29tX3N0b3AsCisJLnN0YXJ0CT0gaXNpY29tX3N0YXJ0LAorCS5oYW5ndXAJPSBpc2ljb21faGFuZ3VwLAorCS5mbHVzaF9idWZmZXIJPSBpc2ljb21fZmx1c2hfYnVmZmVyLAorCS50aW9jbWdldAk9IGlzaWNvbV90aW9jbWdldCwKKwkudGlvY21zZXQJPSBpc2ljb21fdGlvY21zZXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9kcml2ZXJzKHZvaWQpCit7CisJaW50IGVycm9yOworCisJLyogdHR5IGRyaXZlciBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24gKi8KKwlpc2ljb21fbm9ybWFsID0gYWxsb2NfdHR5X2RyaXZlcihQT1JUX0NPVU5UKTsKKwlpZiAoIWlzaWNvbV9ub3JtYWwpCisJCXJldHVybiAtRU5PTUVNOworCisJaXNpY29tX25vcm1hbC0+b3duZXIJPSBUSElTX01PRFVMRTsKKwlpc2ljb21fbm9ybWFsLT5uYW1lIAk9ICJ0dHlNIjsKKwlpc2ljb21fbm9ybWFsLT5kZXZmc19uYW1lID0gImlzaWNvbS8iOworCWlzaWNvbV9ub3JtYWwtPm1ham9yCT0gSVNJQ09NX05NQUpPUjsKKwlpc2ljb21fbm9ybWFsLT5taW5vcl9zdGFydAk9IDA7CisJaXNpY29tX25vcm1hbC0+dHlwZQk9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJaXNpY29tX25vcm1hbC0+c3VidHlwZQk9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlpc2ljb21fbm9ybWFsLT5pbml0X3Rlcm1pb3MJPSB0dHlfc3RkX3Rlcm1pb3M7CisJaXNpY29tX25vcm1hbC0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcJPSAKKwkJCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfENMT0NBTDsKKwlpc2ljb21fbm9ybWFsLT5mbGFncwk9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKGlzaWNvbV9ub3JtYWwsICZpc2ljb21fb3BzKTsKKwkKKwlpZiAoKGVycm9yPXR0eV9yZWdpc3Rlcl9kcml2ZXIoaXNpY29tX25vcm1hbCkpIT0wKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IENvdWxkbid0IHJlZ2lzdGVyIHRoZSBkaWFsaW4gZHJpdmVyLCBlcnJvcj0lZFxuIiwKKwkJCWVycm9yKTsKKwkJcHV0X3R0eV9kcml2ZXIoaXNpY29tX25vcm1hbCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bnJlZ2lzdGVyX2RyaXZlcnModm9pZCkKK3sKKwlpbnQgZXJyb3IgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoaXNpY29tX25vcm1hbCk7CisJaWYgKGVycm9yKQorCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBjb3VsZG4ndCB1bnJlZ2lzdGVyIG5vcm1hbCBkcml2ZXIgZXJyb3I9JWQuXG4iLGVycm9yKTsKKwlwdXRfdHR5X2RyaXZlcihpc2ljb21fbm9ybWFsKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfaXNyKHZvaWQpCit7CisJaW50IGNvdW50LCBkb25lPTA7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCWZvciAoY291bnQ9MDsgY291bnQgPCBCT0FSRF9DT1VOVDsgY291bnQrKyApIHsKKwkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlKSB7CisJCQlpcnFmbGFncyA9IChpc2lfY2FyZFtjb3VudF0uaXNhID09IFlFUykgPyAKKwkJCQkJU0FfSU5URVJSVVBUIDogCisJCQkJCShTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSk7CisKKwkJCWlmIChyZXF1ZXN0X2lycShpc2lfY2FyZFtjb3VudF0uaXJxLCAKKwkJCQkJaXNpY29tX2ludGVycnVwdCwgCisJCQkJCWlycWZsYWdzLCAKKwkJCQkJSVNJQ09NX05BTUUsICZpc2lfY2FyZFtjb3VudF0pKSB7CisKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006IENvdWxkIG5vdCIKKwkJCQkJIiBpbnN0YWxsIGhhbmRsZXIgYXQgSXJxICVkLiIKKwkJCQkJIiBDYXJkJWQgd2lsbCBiZSBkaXNhYmxlZC5cbiIsCisJCQkJCWlzaV9jYXJkW2NvdW50XS5pcnEsIGNvdW50KzEpOworCisJCQkJcmVsZWFzZV9yZWdpb24oaXNpX2NhcmRbY291bnRdLmJhc2UsMTYpOworCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlPTA7CisJCQl9CisJCQllbHNlCisJCQkJZG9uZSsrOworCQl9CQorCX0KKwlyZXR1cm4gZG9uZTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfaXNyKHZvaWQpCit7CisJaW50IGNvdW50OworCisJZm9yIChjb3VudD0wOyBjb3VudCA8IEJPQVJEX0NPVU5UOyBjb3VudCsrICkgeworCQlpZiAoaXNpX2NhcmRbY291bnRdLmJhc2UpCisJCQlmcmVlX2lycShpc2lfY2FyZFtjb3VudF0uaXJxLCAmaXNpX2NhcmRbY291bnRdKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlzaWNvbV9pbml0KHZvaWQpCit7CisJaW50IGNhcmQsIGNoYW5uZWwsIGJhc2U7CisJc3RydWN0IGlzaV9wb3J0ICogcG9ydDsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJCisJaWYgKCF0bXBfYnVmKSB7IAorCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCSAgICAgIAlpZiAoIXBhZ2UpIHsKKyNpZmRlZiBJU0lDT01fREVCVUcJICAgICAgCQorCSAgICAgIAkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogQ291bGRuJ3QgYWxsb2NhdGUgcGFnZSBmb3IgdG1wX2J1Zi5cbiIpOworI2Vsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBOb3QgZW5vdWdoIG1lbW9yeS4uLlxuIik7CisjZW5kaWYJICAgICAgCisJICAgICAgCQlyZXR1cm4gMDsKKwkgICAgICAJfQkKKwkgICAgICAJdG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisJfQorCQorCWlmICghcmVnaXN0ZXJfaW9yZWdpb24oKSkgCisJeworCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogQWxsIHJlcXVpcmVkIEkvTyBzcGFjZSBmb3VuZCBidXN5LlxuIik7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyZWdpc3Rlcl9kcml2ZXJzKCkpIAorCXsKKwkJdW5yZWdpc3Rlcl9pb3JlZ2lvbigpOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXJlZ2lzdGVyX2lzcigpKSAKKwl7CisJCXVucmVnaXN0ZXJfZHJpdmVycygpOworCQkvKiAgaW9wb3J0cyBhbHJlYWR5IHVyZWdpc3RlcmVkIGluIHJlZ2lzdGVyX2lzciAqLworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJCXJldHVybiAwOwkJCisJfQorCQorCW1lbXNldChpc2lfcG9ydHMsIDAsIHNpemVvZihpc2lfcG9ydHMpKTsKKwlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgQk9BUkRfQ09VTlQ7IGNhcmQrKykgeworCQlwb3J0ID0gJmlzaV9wb3J0c1tjYXJkICogMTZdOworCQlpc2lfY2FyZFtjYXJkXS5wb3J0cyA9IHBvcnQ7CisJCXNwaW5fbG9ja19pbml0KCZpc2lfY2FyZFtjYXJkXS5jYXJkX2xvY2spOworCQliYXNlID0gaXNpX2NhcmRbY2FyZF0uYmFzZTsKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IDE2OyBjaGFubmVsKyssIHBvcnQrKykgeworCQkJcG9ydC0+bWFnaWMgPSBJU0lDT01fTUFHSUM7CisJCQlwb3J0LT5jYXJkID0gJmlzaV9jYXJkW2NhcmRdOworCQkJcG9ydC0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCSAJcG9ydC0+Y2xvc2VfZGVsYXkgPSA1MCAqIEhaLzEwMDsKKwkJIAlwb3J0LT5jbG9zaW5nX3dhaXQgPSAzMDAwICogSFovMTAwOworCQkgCUlOSVRfV09SSygmcG9ydC0+aGFuZ3VwX3RxLCBkb19pc2ljb21faGFuZ3VwLCBwb3J0KTsKKwkJIAlJTklUX1dPUksoJnBvcnQtPmJoX3RxdWV1ZSwgaXNpY29tX2JvdHRvbWhhbGYsIHBvcnQpOworCQkgCXBvcnQtPnN0YXR1cyA9IDA7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5vcGVuX3dhaXQpOwkgCQkJCQorCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJCQkvKiAgLiAuIC4gICovCisgCQl9CisJfSAKKwkKKwlyZXR1cm4gMTsJCit9CisKKy8qCisgKglJbnNtb2QgY2FuIHNldCBzdGF0aWMgc3ltYm9scyBzbyBrZWVwIHRoZXNlIHN0YXRpYworICovCisgCitzdGF0aWMgaW50IGlvWzRdOworc3RhdGljIGludCBpcnFbNF07CisKK01PRFVMRV9BVVRIT1IoIk11bHRpVGVjaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHRoZSBJU0kgc2VyaWVzIG9mIGNhcmRzIGJ5IE11bHRpVGVjaCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBwb3J0cyBmb3IgdGhlIGNhcmRzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJbnRlcnJ1cHRzIGZvciB0aGUgY2FyZHMiKTsKKworc3RhdGljIGludCBfX2RldmluaXQgaXNpY29tX3NldHVwKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJaW50IHJldHZhbCwgY2FyZCwgaWR4LCBjb3VudDsKKwl1bnNpZ25lZCBjaGFyIHBjaWlycTsKKwl1bnNpZ25lZCBpbnQgaW9hZGRyOworCSAgICAgICAgICAgICAgICAKKwljYXJkID0gMDsKKwlmb3IoaWR4PTA7IGlkeCA8IEJPQVJEX0NPVU5UOyBpZHgrKykgewkKKwkJaWYgKGlvW2lkeF0pIHsKKwkJCWlzaV9jYXJkW2lkeF0uYmFzZT1pb1tpZHhdOworCQkJaXNpX2NhcmRbaWR4XS5pcnE9aXJxW2lkeF07CisJCQlpc2lfY2FyZFtpZHhdLmlzYT1ZRVM7CisJCQljYXJkKys7CisJCX0KKwkJZWxzZSB7CisJCQlpc2lfY2FyZFtpZHhdLmJhc2UgPSAwOworCQkJaXNpX2NhcmRbaWR4XS5pcnEgPSAwOworCQl9CisJfQorCQorCWZvciAoaWR4PTAgO2lkeCA8IGNhcmQ7IGlkeCsrKSB7CisJCWlmICghKChpc2lfY2FyZFtpZHhdLmlycT09Mil8fChpc2lfY2FyZFtpZHhdLmlycT09Myl8fAorCQkgICAgKGlzaV9jYXJkW2lkeF0uaXJxPT00KXx8KGlzaV9jYXJkW2lkeF0uaXJxPT01KXx8CisJCSAgICAoaXNpX2NhcmRbaWR4XS5pcnE9PTcpfHwoaXNpX2NhcmRbaWR4XS5pcnE9PTEwKXx8CisJCSAgICAoaXNpX2NhcmRbaWR4XS5pcnE9PTExKXx8KGlzaV9jYXJkW2lkeF0uaXJxPT0xMil8fAorCQkgICAgKGlzaV9jYXJkW2lkeF0uaXJxPT0xNSkpKSB7CisJCQkKKwkJCWlmIChpc2lfY2FyZFtpZHhdLmJhc2UpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogSXJxICVkIHVuc3VwcG9ydGVkLiBEaXNhYmxpbmcgQ2FyZCVkLi4uXG4iLAorCQkJCQlpc2lfY2FyZFtpZHhdLmlycSwgaWR4KzEpOworCQkJCWlzaV9jYXJkW2lkeF0uYmFzZT0wOworCQkJCWNhcmQtLTsKKwkJCX0JCisJCX0KKwl9CQorCQorCWlmIChjYXJkIDwgQk9BUkRfQ09VTlQpIHsKKwkJZm9yIChpZHg9MDsgaWR4IDwgREVWSURfQ09VTlQ7IGlkeCsrKSB7CisJCQlkZXYgPSBOVUxMOworCQkJZm9yICg7Oyl7CisJCQkJaWYgKCEoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFZFTkRPUl9JRCwgaXNpY29tX3BjaV90YmxbaWR4XS5kZXZpY2UsIGRldikpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoY2FyZCA+PSBCT0FSRF9DT1VOVCkKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpKQorCQkJCQlicmVhazsKKworCQkJCS8qIGZvdW5kIGEgUENJIElTSSBjYXJkISAqLworCQkJCWlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAoZGV2LCAzKTsgLyogaS5lIGF0IG9mZnNldCAweDFjIGluIHRoZQorCQkJCQkJCQkgICAgICAgKiBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcgorCQkJCQkJCQkgICAgICAgKiBzcGFjZS4KKwkJCQkJCQkJICAgICAgICovCisJCQkJcGNpaXJxID0gZGV2LT5pcnE7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiSVNJIFBDSSBDYXJkKERldmljZSBJRCAweCV4KVxuIiwgaXNpY29tX3BjaV90YmxbaWR4XS5kZXZpY2UpOworCQkJCS8qCisJCQkJICogYWxsb3QgdGhlIGZpcnN0IGVtcHR5IHNsb3QgaW4gdGhlIGFycmF5CisJCQkJICovCQkJCQorCQkJCWZvciAoY291bnQ9MDsgY291bnQgPCBCT0FSRF9DT1VOVDsgY291bnQrKykgewkJCQkKKwkJCQkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlID09IDApIHsKKwkJCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlID0gaW9hZGRyOworCQkJCQkJaXNpX2NhcmRbY291bnRdLmlycSA9IHBjaWlycTsKKwkJCQkJCWlzaV9jYXJkW2NvdW50XS5pc2EgPSBOTzsKKwkJCQkJCWNhcmQrKzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQkJCQkKKwkJCWlmIChjYXJkID49IEJPQVJEX0NPVU5UKSBicmVhazsKKwkJfQorCX0KKwkKKwlpZiAoIShpc2lfY2FyZFswXS5iYXNlIHx8IGlzaV9jYXJkWzFdLmJhc2UgfHwgaXNpX2NhcmRbMl0uYmFzZSB8fCBpc2lfY2FyZFszXS5iYXNlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogTm8gdmFsaWQgY2FyZCBjb25maWd1cmF0aW9uLiBEcml2ZXIgY2Fubm90IGJlIGluaXRpYWxpemVkLi4uXG4iKTsgCisJCXJldHVybiAtRUlPOworCX0JCisKKwlyZXR2YWwgPSBtaXNjX3JlZ2lzdGVyKCZpc2lsb2FkZXJfZGV2aWNlKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogVW5hYmxlIHRvIHJlZ2lzdGVyIGZpcm13YXJlIGxvYWRlciBkcml2ZXIuXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJCisJaWYgKCFpc2ljb21faW5pdCgpKSB7CisJCWlmIChtaXNjX2RlcmVnaXN0ZXIoJmlzaWxvYWRlcl9kZXZpY2UpKSAKKwkJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBVbmFibGUgdG8gdW5yZWdpc3RlciBGaXJtd2FyZSBMb2FkZXIgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCQorCWluaXRfdGltZXIoJnR4KTsKKwl0eC5leHBpcmVzID0gamlmZmllcyArIDE7CisJdHguZGF0YSA9IDA7CisJdHguZnVuY3Rpb24gPSBpc2ljb21fdHg7CisJcmVfc2NoZWR1bGUgPSAxOworCWFkZF90aW1lcigmdHgpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXNpY29tX2V4aXQodm9pZCkKK3sKKwlyZV9zY2hlZHVsZSA9IDA7CisJLyogRklYTUUgKi8KKwltc2xlZXAoMTAwMCk7CisJdW5yZWdpc3Rlcl9pc3IoKTsKKwl1bnJlZ2lzdGVyX2RyaXZlcnMoKTsKKwl1bnJlZ2lzdGVyX2lvcmVnaW9uKCk7CQorCWlmKHRtcF9idWYpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKKwlpZiAobWlzY19kZXJlZ2lzdGVyKCZpc2lsb2FkZXJfZGV2aWNlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IFVuYWJsZSB0byB1bnJlZ2lzdGVyIEZpcm13YXJlIExvYWRlciBkcml2ZXJcbiIpOworfQorCittb2R1bGVfaW5pdChpc2ljb21fc2V0dXApOworbW9kdWxlX2V4aXQoaXNpY29tX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWVkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKQEAgLTAsMCArMSw1Mjc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglpc3RhbGxpb24uYyAgLS0gc3RhbGxpb24gaW50ZWxsaWdlbnQgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgIFN0YWxsaW9uIFRlY2hub2xvZ2llcworICoJQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIEdyZWcgVW5nZXJlci4KKyAqCisgKglUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgTGludXggc2VyaWFsIGRyaXZlciwgd3JpdHRlbiBieQorICoJTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFQnc28gYW5kIG90aGVycy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lzdGFsbGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIGRpZmZlcmVudCBib2FyZCB0eXBlcy4gTm90IGFsbCBvZiB0aGUgZm9sbG93aW5nIGJvYXJkIHR5cGVzCisgKglhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiBCdXQgSSB3aWxsIHVzZSB0aGUgc3RhbmRhcmQgImFzc2lnbmVkIgorICoJYm9hcmQgbnVtYmVycy4gQ3VycmVudGx5IHN1cHBvcnRlZCBib2FyZHMgYXJlIGFiYnJldmlhdGVkIGFzOgorICoJRUNQID0gRWFzeUNvbm5lY3Rpb24gOC82NCwgT05CID0gT05ib2FyZCwgQkJZID0gQnJ1bWJ5IGFuZAorICoJU1RBTCA9IFN0YWxsaW9uLgorICovCisjZGVmaW5lCUJSRF9VTktOT1dOCTAKKyNkZWZpbmUJQlJEX1NUQUxMSU9OCTEKKyNkZWZpbmUJQlJEX0JSVU1CWTQJMgorI2RlZmluZQlCUkRfT05CT0FSRDIJMworI2RlZmluZQlCUkRfT05CT0FSRAk0CisjZGVmaW5lCUJSRF9CUlVNQlk4CTUKKyNkZWZpbmUJQlJEX0JSVU1CWTE2CTYKKyNkZWZpbmUJQlJEX09OQk9BUkRFCTcKKyNkZWZpbmUJQlJEX09OQk9BUkQzMgk5CisjZGVmaW5lCUJSRF9PTkJPQVJEMl8zMgkxMAorI2RlZmluZQlCUkRfT05CT0FSRFJTCTExCisjZGVmaW5lCUJSRF9FQVNZSU8JMjAKKyNkZWZpbmUJQlJEX0VDSAkJMjEKKyNkZWZpbmUJQlJEX0VDSE1DCTIyCisjZGVmaW5lCUJSRF9FQ1AJCTIzCisjZGVmaW5lIEJSRF9FQ1BFCTI0CisjZGVmaW5lCUJSRF9FQ1BNQwkyNQorI2RlZmluZQlCUkRfRUNIUENJCTI2CisjZGVmaW5lCUJSRF9FQ0g2NFBDSQkyNworI2RlZmluZQlCUkRfRUFTWUlPUENJCTI4CisjZGVmaW5lCUJSRF9FQ1BQQ0kJMjkKKworI2RlZmluZQlCUkRfQlJVTUJZCUJSRF9CUlVNQlk0CisKKy8qCisgKglEZWZpbmUgYSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB0byBob2xkIHRoZSBib2FyZCBjb25maWd1cmF0aW9uLgorICoJTmVlZCB0byBzZXQgdGhpcyB1cCBpbiB0aGUgY29kZSAoZm9yIG5vdykgd2l0aCB0aGUgYm9hcmRzIHRoYXQgYXJlCisgKgl0byBiZSBjb25maWd1cmVkIGludG8gdGhlIHN5c3RlbS4gVGhpcyBpcyB3aGF0IG5lZWRzIHRvIGJlIG1vZGlmaWVkCisgKgl3aGVuIGFkZGluZy9yZW1vdmluZy9tb2RpZnlpbmcgYm9hcmRzLiBFYWNoIGxpbmUgZW50cnkgaW4gdGhlCisgKglzdGxpX2JyZGNvbmZbXSBhcnJheSBpcyBhIGJvYXJkLiBFYWNoIGxpbmUgY29udGFpbnMgaW8vaXJxL21lbW9yeQorICoJcmFuZ2VzIGZvciB0aGF0IGJvYXJkIChhcyB3ZWxsIGFzIHdoYXQgdHlwZSBvZiBib2FyZCBpdCBpcykuCisgKglTb21lIGV4YW1wbGVzOgorICoJCXsgQlJEX0VDUCwgMHgyYTAsIDAsIDB4Y2MwMDAsIDAsIDAgfSwKKyAqCVRoaXMgbGluZSB3aWxsIGNvbmZpZ3VyZSBhbiBFYXN5Q29ubmVjdGlvbiA4LzY0IGF0IGlvIGFkZHJlc3MgMmEwLAorICoJYW5kIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBvZiBjYzAwMC4gTXVsdGlwbGUgRWFzeUNvbm5lY3Rpb24gOC82NAorICoJYm9hcmRzIGNhbiBzaGFyZSB0aGUgc2FtZSBzaGFyZWQgbWVtb3J5IGFkZHJlc3Mgc3BhY2UuIE5vIGludGVycnVwdAorICoJaXMgcmVxdWlyZWQgZm9yIHRoaXMgYm9hcmQgdHlwZS4KKyAqCUFub3RoZXIgZXhhbXBsZToKKyAqCQl7IEJSRF9FQ1BFLCAweDUwMDAsIDAsIDB4ODAwMDAwMDAsIDAsIDAgfSwKKyAqCVRoaXMgbGluZSB3aWxsIGNvbmZpZ3VyZSBhbiBFYXN5Q29ubmVjdGlvbiA4LzY0IEVJU0EgaW4gc2xvdCA1IGFuZAorICoJc2hhcmVkIG1lbW9yeSBhZGRyZXNzIG9mIDB4ODAwMDAwMDAgKDIgR0J5dGUpLiBNdWx0aXBsZQorICoJRWFzeUNvbm5lY3Rpb24gOC82NCBFSVNBIGJvYXJkcyBjYW4gc2hhcmUgdGhlIHNhbWUgc2hhcmVkIG1lbW9yeQorICoJYWRkcmVzcyBzcGFjZS4gTm8gaW50ZXJydXB0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGJvYXJkIHR5cGUuCisgKglBbm90aGVyIGV4YW1wbGU6CisgKgkJeyBCUkRfT05CT0FSRCwgMHgyNDAsIDAsIDB4ZDAwMDAsIDAsIDAgfSwKKyAqCVRoaXMgbGluZSB3aWxsIGNvbmZpZ3VyZSBhbiBPTmJvYXJkIChJU0EgdHlwZSkgYXQgaW8gYWRkcmVzcyAyNDAsCisgKglhbmQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIG9mIGQwMDAwLiBNdWx0aXBsZSBPTmJvYXJkcyBjYW4gc2hhcmUKKyAqCXRoZSBzYW1lIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBzcGFjZS4gTm8gaW50ZXJydXB0IHJlcXVpcmVkLgorICoJQW5vdGhlciBleGFtcGxlOgorICoJCXsgQlJEX0JSVU1CWTQsIDB4MzYwLCAwLCAweGM4MDAwLCAwLCAwIH0sCisgKglUaGlzIGxpbmUgd2lsbCBjb25maWd1cmUgYSBCcnVtYnkgYm9hcmQgKGFueSBudW1iZXIgb2YgcG9ydHMhKSBhdAorICoJaW8gYWRkcmVzcyAzNjAgYW5kIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBvZiBjODAwMC4gQWxsIEJydW1ieSBib2FyZHMKKyAqCWNvbmZpZ3VyZWQgaW50byBhIHN5c3RlbSBtdXN0IGhhdmUgdGhlaXIgb3duIHNlcGFyYXRlIGlvIGFuZCBtZW1vcnkKKyAqCWFkZHJlc3Nlcy4gTm8gaW50ZXJydXB0IGlzIHJlcXVpcmVkLgorICoJQW5vdGhlciBleGFtcGxlOgorICoJCXsgQlJEX1NUQUxMSU9OLCAweDMzMCwgMCwgMHhkMDAwMCwgMCwgMCB9LAorICoJVGhpcyBsaW5lIHdpbGwgY29uZmlndXJlIGFuIG9yaWdpbmFsIFN0YWxsaW9uIGJvYXJkIGF0IGlvIGFkZHJlc3MgMzMwCisgKglhbmQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIGQwMDAwICh0aGlzIHdvdWxkIG9ubHkgYmUgdmFsaWQgZm9yIGEgIlY0LjAiCisgKglvciBSZXYuTyBTdGFsbGlvbiBib2FyZCkuIEFsbCBTdGFsbGlvbiBib2FyZHMgY29uZmlndXJlZCBpbnRvIHRoZQorICoJc3lzdGVtIG11c3QgaGF2ZSB0aGVpciBvd24gc2VwYXJhdGUgaW8gYW5kIG1lbW9yeSBhZGRyZXNzZXMuIE5vCisgKglpbnRlcnJ1cHQgaXMgcmVxdWlyZWQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAkJYnJkdHlwZTsKKwlpbnQJCWlvYWRkcjE7CisJaW50CQlpb2FkZHIyOworCXVuc2lnbmVkIGxvbmcJbWVtYWRkcjsKKwlpbnQJCWlycTsKKwlpbnQJCWlycXR5cGU7Cit9IHN0bGNvbmZfdDsKKworc3RhdGljIHN0bGNvbmZfdAlzdGxpX2JyZGNvbmZbXSA9IHsKKwkvKnsgQlJEX0VDUCwgMHgyYTAsIDAsIDB4Y2MwMDAsIDAsIDAgfSwqLworfTsKKworc3RhdGljIGludAlzdGxpX25yYnJkcyA9IHNpemVvZihzdGxpX2JyZGNvbmYpIC8gc2l6ZW9mKHN0bGNvbmZfdCk7CisKKy8qCisgKglUaGVyZSBpcyBzb21lIGV4cGVyaW1lbnRhbCBFSVNBIGJvYXJkIGRldGVjdGlvbiBjb2RlIGluIHRoaXMgZHJpdmVyLgorICoJQnkgZGVmYXVsdCBpdCBpcyBkaXNhYmxlZCwgYnV0IGZvciB0aG9zZSB0aGF0IHdhbnQgdG8gdHJ5IGl0IG91dCwKKyAqCXRoZW4gc2V0IHRoZSBkZWZpbmUgYmVsb3cgdG8gYmUgMS4KKyAqLworI2RlZmluZQlTVExJX0VJU0FQUk9CRQkwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBzb21lIGltcG9ydGFudCBkcml2ZXIgY2hhcmFjdGVyaXN0aWNzLiBEZXZpY2UgbWFqb3IgbnVtYmVycworICoJYWxsb2NhdGVkIGFzIHBlciBMaW51eCBEZXZpY2UgUmVnaXN0cnkuCisgKi8KKyNpZm5kZWYJU1RMX1NJT01FTU1BSk9SCisjZGVmaW5lCVNUTF9TSU9NRU1NQUpPUgkJMjgKKyNlbmRpZgorI2lmbmRlZglTVExfU0VSSUFMTUFKT1IKKyNkZWZpbmUJU1RMX1NFUklBTE1BSk9SCQkyNAorI2VuZGlmCisjaWZuZGVmCVNUTF9DQUxMT1VUTUFKT1IKKyNkZWZpbmUJU1RMX0NBTExPVVRNQUpPUgkyNQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSBvdXIgbG9jYWwgZHJpdmVyIGlkZW50aXR5IGZpcnN0LiBTZXQgdXAgc3R1ZmYgdG8gZGVhbCB3aXRoCisgKglhbGwgdGhlIGxvY2FsIHN0cnVjdHVyZXMgcmVxdWlyZWQgYnkgYSBzZXJpYWwgdHR5IGRyaXZlci4KKyAqLworc3RhdGljIGNoYXIJKnN0bGlfZHJ2dGl0bGUgPSAiU3RhbGxpb24gSW50ZWxsaWdlbnQgTXVsdGlwb3J0IFNlcmlhbCBEcml2ZXIiOworc3RhdGljIGNoYXIJKnN0bGlfZHJ2bmFtZSA9ICJpc3RhbGxpb24iOworc3RhdGljIGNoYXIJKnN0bGlfZHJ2dmVyc2lvbiA9ICI1LjYuMCI7CitzdGF0aWMgY2hhcgkqc3RsaV9zZXJpYWxuYW1lID0gInR0eUUiOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIJKnN0bGlfc2VyaWFsOworCisvKgorICoJV2Ugd2lsbCBuZWVkIHRvIGFsbG9jYXRlIGEgdGVtcG9yYXJ5IHdyaXRlIGJ1ZmZlciBmb3IgY2hhcnMgdGhhdAorICoJY29tZSBkaXJlY3QgZnJvbSB1c2VyIHNwYWNlLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGEgY29weSBmcm9tIHVzZXIKKyAqCXNwYWNlIG1pZ2h0IGNhdXNlIGEgcGFnZSBmYXVsdCAodHlwaWNhbGx5IG9uIGEgc3lzdGVtIHRoYXQgaXMKKyAqCXN3YXBwaW5nISkuIEFsbCBwb3J0cyB3aWxsIHNoYXJlIG9uZSBidWZmZXIgLSBzaW5jZSBpZiB0aGUgc3lzdGVtCisgKglpcyBhbHJlYWR5IHN3YXBwaW5nIGEgc2hhcmVkIGJ1ZmZlciB3b24ndCBtYWtlIHRoaW5ncyBhbnkgd29yc2UuCisgKi8KK3N0YXRpYyBjaGFyCQkJKnN0bGlfdG1wd3JpdGVidWY7CitzdGF0aWMgREVDTEFSRV9NVVRFWChzdGxpX3RtcHdyaXRlc2VtKTsKKworI2RlZmluZQlTVExJX1RYQlVGU0laRQkJNDA5NgorCisvKgorICoJVXNlIGEgZmFzdCBsb2NhbCBidWZmZXIgZm9yIGNvb2tlZCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgYSB3aG9sZQorICoJYnVuY2ggb2YgY29va2VkIGNoYXJhY3RlcnMgY29tZSBpbiBmb3IgYSBwb3J0LCAxIGF0IGEgdGltZS4gU28gd2UKKyAqCXNhdmUgdGhvc2UgdXAgaW50byBhIGxvY2FsIGJ1ZmZlciwgdGhlbiB3cml0ZSBvdXQgdGhlIHdob2xlIGxvdAorICoJd2l0aCBhIGxhcmdlIG1lbWNweS4gSnVzdCB1c2UgMSBidWZmZXIgZm9yIGFsbCBwb3J0cywgc2luY2UgaXRzCisgKgl1c2UgaXQgaXMgb25seSBuZWVkIGZvciBzaG9ydCBwZXJpb2RzIG9mIHRpbWUgYnkgZWFjaCBwb3J0LgorICovCitzdGF0aWMgY2hhcgkJCSpzdGxpX3R4Y29va2J1ZjsKK3N0YXRpYyBpbnQJCQlzdGxpX3R4Y29va3NpemU7CitzdGF0aWMgaW50CQkJc3RsaV90eGNvb2tyZWFsc2l6ZTsKK3N0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdAkqc3RsaV90eGNvb2t0dHk7CisKKy8qCisgKglEZWZpbmUgYSBsb2NhbCBkZWZhdWx0IHRlcm1pb3Mgc3RydWN0LiBBbGwgcG9ydHMgd2lsbCBiZSBjcmVhdGVkCisgKgl3aXRoIHRoaXMgdGVybWlvcyBpbml0aWFsbHkuIEJhc2ljYWxseSBhbGwgaXQgZGVmaW5lcyBpcyBhIHJhdyBwb3J0CisgKglhdCA5NjAwIGJhdWQsIDggZGF0YSBiaXRzLCBubyBwYXJpdHksIDEgc3RvcCBiaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcwkJc3RsaV9kZWZ0ZXJtaW9zID0geworCS5jX2NmbGFnCT0gKEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTCksCisJLmNfY2MJCT0gSU5JVF9DX0NDLAorfTsKKworLyoKKyAqCURlZmluZSBnbG9iYWwgc3RhdHMgc3RydWN0dXJlcy4gTm90IHVzZWQgb2Z0ZW4sIGFuZCBjYW4gYmUKKyAqCXJlLXVzZWQgZm9yIGVhY2ggc3RhdHMgY2FsbC4KKyAqLworc3RhdGljIGNvbXN0YXRzX3QJc3RsaV9jb21zdGF0czsKK3N0YXRpYyBjb21icmRfdAkJc3RsaV9icmRzdGF0czsKK3N0YXRpYyBhc3lzdGF0c190CXN0bGlfY2Rrc3RhdHM7CitzdGF0aWMgc3RsaWJyZF90CXN0bGlfZHVtbXlicmQ7CitzdGF0aWMgc3RsaXBvcnRfdAlzdGxpX2R1bW15cG9ydDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RsaWJyZF90CSpzdGxpX2JyZHNbU1RMX01BWEJSRFNdOworCitzdGF0aWMgaW50CQlzdGxpX3NoYXJlZDsKKworLyoKKyAqCVBlciBib2FyZCBzdGF0ZSBmbGFncy4gVXNlZCB3aXRoIHRoZSBzdGF0ZSBmaWVsZCBvZiB0aGUgYm9hcmQgc3RydWN0LgorICoJTm90IHJlYWxseSBtdWNoIGhlcmUuLi4gQWxsIHdlIG5lZWQgdG8gZG8gaXMga2VlcCB0cmFjayBvZiB3aGV0aGVyCisgKgl0aGUgYm9hcmQgaGFzIGJlZW4gZGV0ZWN0ZWQsIGFuZCB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgYSBzbGF2ZQorICoJb3Igbm90LgorICovCisjZGVmaW5lCUJTVF9GT1VORAkweDEKKyNkZWZpbmUJQlNUX1NUQVJURUQJMHgyCisKKy8qCisgKglEZWZpbmUgdGhlIHNldCBvZiBwb3J0IHN0YXRlIGZsYWdzLiBUaGVzZSBhcmUgbWFya2VkIGZvciBpbnRlcm5hbAorICoJc3RhdGUgcHVycG9zZXMgb25seSwgdXN1YWxseSB0byBkbyB3aXRoIHRoZSBzdGF0ZSBvZiBjb21tdW5pY2F0aW9ucworICoJd2l0aCB0aGUgc2xhdmUuIE1vc3Qgb2YgdGhlbSBuZWVkIHRvIGJlIHVwZGF0ZWQgYXRvbWljYWxseSwgc28gYWx3YXlzCisgKgl1c2UgdGhlIGJpdCBzZXR0aW5nIG9wZXJhdGlvbnMgKHVubGVzcyBwcm90ZWN0ZWQgYnkgY2xpL3N0aSkuCisgKi8KKyNkZWZpbmUJU1RfSU5JVElBTElaSU5HCTEKKyNkZWZpbmUJU1RfT1BFTklORwkyCisjZGVmaW5lCVNUX0NMT1NJTkcJMworI2RlZmluZQlTVF9DTURJTkcJNAorI2RlZmluZQlTVF9UWEJVU1kJNQorI2RlZmluZQlTVF9SWElORwk2CisjZGVmaW5lCVNUX0RPRkxVU0hSWAk3CisjZGVmaW5lCVNUX0RPRkxVU0hUWAk4CisjZGVmaW5lCVNUX0RPU0lHUwk5CisjZGVmaW5lCVNUX1JYU1RPUAkxMAorI2RlZmluZQlTVF9HRVRTSUdTCTExCisKKy8qCisgKglEZWZpbmUgYW4gYXJyYXkgb2YgYm9hcmQgbmFtZXMgYXMgcHJpbnRhYmxlIHN0cmluZ3MuIEhhbmR5IGZvcgorICoJcmVmZXJlbmNpbmcgYm9hcmRzIHdoZW4gcHJpbnRpbmcgdHJhY2UgYW5kIHN0dWZmLgorICovCitzdGF0aWMgY2hhcgkqc3RsaV9icmRuYW1lc1tdID0geworCSJVbmtub3duIiwKKwkiU3RhbGxpb24iLAorCSJCcnVtYnkiLAorCSJPTmJvYXJkLU1DIiwKKwkiT05ib2FyZCIsCisJIkJydW1ieSIsCisJIkJydW1ieSIsCisJIk9OYm9hcmQtRUkiLAorCShjaGFyICopIE5VTEwsCisJIk9OYm9hcmQiLAorCSJPTmJvYXJkLU1DIiwKKwkiT05ib2FyZC1NQyIsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCShjaGFyICopIE5VTEwsCisJKGNoYXIgKikgTlVMTCwKKwkoY2hhciAqKSBOVUxMLAorCSJFYXN5SU8iLAorCSJFQzgvMzItQVQiLAorCSJFQzgvMzItTUMiLAorCSJFQzgvNjQtQVQiLAorCSJFQzgvNjQtRUkiLAorCSJFQzgvNjQtTUMiLAorCSJFQzgvMzItUENJIiwKKwkiRUM4LzY0LVBDSSIsCisJIkVhc3lJTy1QQ0kiLAorCSJFQy9SQS1QQ0kiLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgTU9EVUxFCisvKgorICoJRGVmaW5lIHNvbWUgc3RyaW5nIGxhYmVscyBmb3IgYXJndW1lbnRzIHBhc3NlZCBmcm9tIHRoZSBtb2R1bGUKKyAqCWxvYWQgbGluZS4gVGhlc2UgYWxsb3cgZm9yIGVhc3kgYm9hcmQgZGVmaW5pdGlvbnMsIGFuZCBlYXN5CisgKgltb2RpZmljYXRpb24gb2YgdGhlIGlvLCBtZW1vcnkgYW5kIGlycSByZXNvdWNyZXMuCisgKi8KKworc3RhdGljIGNoYXIJKmJvYXJkMFs4XTsKK3N0YXRpYyBjaGFyCSpib2FyZDFbOF07CitzdGF0aWMgY2hhcgkqYm9hcmQyWzhdOworc3RhdGljIGNoYXIJKmJvYXJkM1s4XTsKKworc3RhdGljIGNoYXIJKipzdGxpX2JyZHNwW10gPSB7CisJKGNoYXIgKiopICZib2FyZDAsCisJKGNoYXIgKiopICZib2FyZDEsCisJKGNoYXIgKiopICZib2FyZDIsCisJKGNoYXIgKiopICZib2FyZDMKK307CisKKy8qCisgKglEZWZpbmUgYSBzZXQgb2YgY29tbW9uIGJvYXJkIG5hbWVzLCBhbmQgdHlwZXMuIFRoaXMgaXMgdXNlZCB0bworICoJcGFyc2UgYW55IG1vZHVsZSBhcmd1bWVudHMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc3RsaWJyZHR5cGUgeworCWNoYXIJKm5hbWU7CisJaW50CXR5cGU7Cit9IHN0bGlicmR0eXBlX3Q7CisKK3N0YXRpYyBzdGxpYnJkdHlwZV90CXN0bGlfYnJkc3RyW10gPSB7CisJeyAic3RhbGxpb24iLCBCUkRfU1RBTExJT04gfSwKKwl7ICIxIiwgQlJEX1NUQUxMSU9OIH0sCisJeyAiYnJ1bWJ5IiwgQlJEX0JSVU1CWSB9LAorCXsgImJydW1ieTQiLCBCUkRfQlJVTUJZIH0sCisJeyAiYnJ1bWJ5LzQiLCBCUkRfQlJVTUJZIH0sCisJeyAiYnJ1bWJ5LTQiLCBCUkRfQlJVTUJZIH0sCisJeyAiYnJ1bWJ5OCIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnkvOCIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnktOCIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnkxNiIsIEJSRF9CUlVNQlkgfSwKKwl7ICJicnVtYnkvMTYiLCBCUkRfQlJVTUJZIH0sCisJeyAiYnJ1bWJ5LTE2IiwgQlJEX0JSVU1CWSB9LAorCXsgIjIiLCBCUkRfQlJVTUJZIH0sCisJeyAib25ib2FyZDIiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICJvbmJvYXJkLTIiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICJvbmJvYXJkLzIiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICJvbmJvYXJkLW1jIiwgQlJEX09OQk9BUkQyIH0sCisJeyAib25ib2FyZC9tYyIsIEJSRF9PTkJPQVJEMiB9LAorCXsgIm9uYm9hcmQtbWNhIiwgQlJEX09OQk9BUkQyIH0sCisJeyAib25ib2FyZC9tY2EiLCBCUkRfT05CT0FSRDIgfSwKKwl7ICIzIiwgQlJEX09OQk9BUkQyIH0sCisJeyAib25ib2FyZCIsIEJSRF9PTkJPQVJEIH0sCisJeyAib25ib2FyZGF0IiwgQlJEX09OQk9BUkQgfSwKKwl7ICI0IiwgQlJEX09OQk9BUkQgfSwKKwl7ICJvbmJvYXJkZSIsIEJSRF9PTkJPQVJERSB9LAorCXsgIm9uYm9hcmQtZSIsIEJSRF9PTkJPQVJERSB9LAorCXsgIm9uYm9hcmQvZSIsIEJSRF9PTkJPQVJERSB9LAorCXsgIm9uYm9hcmQtZWkiLCBCUkRfT05CT0FSREUgfSwKKwl7ICJvbmJvYXJkL2VpIiwgQlJEX09OQk9BUkRFIH0sCisJeyAiNyIsIEJSRF9PTkJPQVJERSB9LAorCXsgImVjcCIsIEJSRF9FQ1AgfSwKKwl7ICJlY3BhdCIsIEJSRF9FQ1AgfSwKKwl7ICJlYzgvNjQiLCBCUkRfRUNQIH0sCisJeyAiZWM4LzY0LWF0IiwgQlJEX0VDUCB9LAorCXsgImVjOC82NC1pc2EiLCBCUkRfRUNQIH0sCisJeyAiMjMiLCBCUkRfRUNQIH0sCisJeyAiZWNwZSIsIEJSRF9FQ1BFIH0sCisJeyAiZWNwZWkiLCBCUkRfRUNQRSB9LAorCXsgImVjOC82NC1lIiwgQlJEX0VDUEUgfSwKKwl7ICJlYzgvNjQtZWkiLCBCUkRfRUNQRSB9LAorCXsgIjI0IiwgQlJEX0VDUEUgfSwKKwl7ICJlY3BtYyIsIEJSRF9FQ1BNQyB9LAorCXsgImVjOC82NC1tYyIsIEJSRF9FQ1BNQyB9LAorCXsgImVjOC82NC1tY2EiLCBCUkRfRUNQTUMgfSwKKwl7ICIyNSIsIEJSRF9FQ1BNQyB9LAorCXsgImVjcHBjaSIsIEJSRF9FQ1BQQ0kgfSwKKwl7ICJlYy9yYSIsIEJSRF9FQ1BQQ0kgfSwKKwl7ICJlYy9yYS1wYyIsIEJSRF9FQ1BQQ0kgfSwKKwl7ICJlYy9yYS1wY2kiLCBCUkRfRUNQUENJIH0sCisJeyAiMjkiLCBCUkRfRUNQUENJIH0sCit9OworCisvKgorICoJRGVmaW5lIHRoZSBtb2R1bGUgYWdydW1lbnRzLgorICovCitNT0RVTEVfQVVUSE9SKCJHcmVnIFVuZ2VyZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3RhbGxpb24gSW50ZWxsaWdlbnQgTXVsdGlwb3J0IFNlcmlhbCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitNT0RVTEVfUEFSTShib2FyZDAsICIxLTNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMCwgIkJvYXJkIDAgY29uZmlnIC0+IG5hbWVbLGlvYWRkclssbWVtYWRkcl0iKTsKK01PRFVMRV9QQVJNKGJvYXJkMSwgIjEtM3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQxLCAiQm9hcmQgMSBjb25maWcgLT4gbmFtZVssaW9hZGRyWyxtZW1hZGRyXSIpOworTU9EVUxFX1BBUk0oYm9hcmQyLCAiMS0zcyIpOworTU9EVUxFX1BBUk1fREVTQyhib2FyZDIsICJCb2FyZCAyIGNvbmZpZyAtPiBuYW1lWyxpb2FkZHJbLG1lbWFkZHJdIik7CitNT0RVTEVfUEFSTShib2FyZDMsICIxLTNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMywgIkJvYXJkIDMgY29uZmlnIC0+IG5hbWVbLGlvYWRkclssbWVtYWRkcl0iKTsKKworI2VuZGlmCisKKy8qCisgKglTZXQgdXAgYSBkZWZhdWx0IG1lbW9yeSBhZGRyZXNzIHRhYmxlIGZvciBFSVNBIGJvYXJkIHByb2JpbmcuCisgKglUaGUgZGVmYXVsdCBhZGRyZXNzZXMgYXJlIGFsbCBiZWxsb3cgMU1ieXRlLCB3aGljaCBoYXMgdG8gYmUgdGhlCisgKgljYXNlIGFueXdheS4gVGhleSBzaG91bGQgYmUgc2FmZSwgc2luY2Ugd2Ugb25seSByZWFkIHZhbHVlcyBmcm9tCisgKgl0aGVtLCBhbmQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgd2hpbGUgd2UgZG8gaXQuIElmIHRoZSBoaWdoZXIKKyAqCW1lbW9yeSBzdXBwb3J0IGlzIGNvbXBpbGVkIGluIHRoZW4gd2UgYWxzbyB0cnkgcHJvYmluZyBhcm91bmQKKyAqCXRoZSAxR2IsIDJHYiBhbmQgM0diIGFyZWFzIGFzIHdlbGwuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcJc3RsaV9laXNhbWVtcHJvYmVhZGRyc1tdID0geworCTB4YzAwMDAsICAgIDB4ZDAwMDAsICAgIDB4ZTAwMDAsICAgIDB4ZjAwMDAsCisJMHg4MDAwMDAwMCwgMHg4MDAxMDAwMCwgMHg4MDAyMDAwMCwgMHg4MDAzMDAwMCwKKwkweDQwMDAwMDAwLCAweDQwMDEwMDAwLCAweDQwMDIwMDAwLCAweDQwMDMwMDAwLAorCTB4YzAwMDAwMDAsIDB4YzAwMTAwMDAsIDB4YzAwMjAwMDAsIDB4YzAwMzAwMDAsCisJMHhmZjAwMDAwMCwgMHhmZjAxMDAwMCwgMHhmZjAyMDAwMCwgMHhmZjAzMDAwMCwKK307CisKK3N0YXRpYyBpbnQJc3RsaV9laXNhbWVtcHNpemUgPSBzaXplb2Yoc3RsaV9laXNhbWVtcHJvYmVhZGRycykgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7CitpbnQJCXN0bGlfZWlzYXByb2JlID0gU1RMSV9FSVNBUFJPQkU7CisKKy8qCisgKglEZWZpbmUgdGhlIFN0YWxsaW9uIFBDSSB2ZW5kb3IgYW5kIGRldmljZSBJRHMuCisgKi8KKyNpZmRlZiBDT05GSUdfUENJCisjaWZuZGVmCVBDSV9WRU5ET1JfSURfU1RBTExJT04KKyNkZWZpbmUJUENJX1ZFTkRPUl9JRF9TVEFMTElPTgkJMHgxMjRkCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FQ1JBCisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfRUNSQQkJMHgwMDA0CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlzdGFsbGlvbl9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1NUQUxMSU9OLCBQQ0lfREVWSUNFX0lEX0VDUkEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpc3RhbGxpb25fcGNpX3RibCk7CisKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gaW5mbyBmb3IgRUNQIGJvYXJkcy4gVGhlc2UgZGVmaW5lcyBhcHBseQorICoJdG8gdGhlIGRpcmVjdGx5IGFjY2Vzc2libGUgaW8gcG9ydHMgb2YgdGhlIEVDUC4gVGhlcmUgaXMgYSBzZXQgb2YKKyAqCWRlZmluZXMgZm9yIGVhY2ggRUNQIGJvYXJkIHR5cGUsIElTQSwgRUlTQSwgTUNBIGFuZCBQQ0kuCisgKi8KKyNkZWZpbmUJRUNQX0lPU0laRQk0CisKKyNkZWZpbmUJRUNQX01FTVNJWkUJKDEyOCAqIDEwMjQpCisjZGVmaW5lCUVDUF9QQ0lNRU1TSVpFCSgyNTYgKiAxMDI0KQorCisjZGVmaW5lCUVDUF9BVFBBR0VTSVpFCSg0ICogMTAyNCkKKyNkZWZpbmUJRUNQX01DUEFHRVNJWkUJKDQgKiAxMDI0KQorI2RlZmluZQlFQ1BfRUlQQUdFU0laRQkoNjQgKiAxMDI0KQorI2RlZmluZQlFQ1BfUENJUEFHRVNJWkUJKDY0ICogMTAyNCkKKworI2RlZmluZQlTVExfRUlTQUlECTB4OGM0ZQorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBJU0EgY2xhc3Mgb2YgRUNQIGJvYXJkLgorICovCisjZGVmaW5lCUVDUF9BVElSRUcJMAorI2RlZmluZQlFQ1BfQVRDT05GUgkxCisjZGVmaW5lCUVDUF9BVE1FTUFSCTIKKyNkZWZpbmUJRUNQX0FUTUVNUFIJMworI2RlZmluZQlFQ1BfQVRTVE9QCTB4MQorI2RlZmluZQlFQ1BfQVRJTlRFTkFCCTB4MTAKKyNkZWZpbmUJRUNQX0FURU5BQkxFCTB4MjAKKyNkZWZpbmUJRUNQX0FURElTQUJMRQkweDAwCisjZGVmaW5lCUVDUF9BVEFERFJNQVNLCTB4M2YwMDAKKyNkZWZpbmUJRUNQX0FUQUREUlNIRlQJMTIKKworLyoKKyAqCUltcG9ydGFudCBkZWZpbmVzIGZvciB0aGUgRUlTQSBjbGFzcyBvZiBFQ1AgYm9hcmQuCisgKi8KKyNkZWZpbmUJRUNQX0VJSVJFRwkwCisjZGVmaW5lCUVDUF9FSU1FTUFSTAkxCisjZGVmaW5lCUVDUF9FSUNPTkZSCTIKKyNkZWZpbmUJRUNQX0VJTUVNQVJICTMKKyNkZWZpbmUJRUNQX0VJRU5BQkxFCTB4MQorI2RlZmluZQlFQ1BfRUlESVNBQkxFCTB4MAorI2RlZmluZQlFQ1BfRUlTVE9QCTB4NAorI2RlZmluZQlFQ1BfRUlFREdFCTB4MDAKKyNkZWZpbmUJRUNQX0VJTEVWRUwJMHg4MAorI2RlZmluZQlFQ1BfRUlBRERSTUFTS0wJMHgwMGZmMDAwMAorI2RlZmluZQlFQ1BfRUlBRERSU0hGVEwJMTYKKyNkZWZpbmUJRUNQX0VJQUREUk1BU0tICTB4ZmYwMDAwMDAKKyNkZWZpbmUJRUNQX0VJQUREUlNIRlRICTI0CisjZGVmaW5lCUVDUF9FSUJSREVOQUIJMHhjODQKKworI2RlZmluZQlFQ1BfRUlTQUlECTB4NAorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBNaWNyby1jaGFubmVsIGNsYXNzIG9mIEVDUCBib2FyZC4KKyAqCShJdCBoYXMgYSBsb3QgaW4gY29tbW9uIHdpdGggdGhlIElTQSBib2FyZHMuKQorICovCisjZGVmaW5lCUVDUF9NQ0lSRUcJMAorI2RlZmluZQlFQ1BfTUNDT05GUgkxCisjZGVmaW5lCUVDUF9NQ1NUT1AJMHgyMAorI2RlZmluZQlFQ1BfTUNFTkFCTEUJMHg4MAorI2RlZmluZQlFQ1BfTUNESVNBQkxFCTB4MDAKKworLyoKKyAqCUltcG9ydGFudCBkZWZpbmVzIGZvciB0aGUgUENJIGNsYXNzIG9mIEVDUCBib2FyZC4KKyAqCShJdCBoYXMgYSBsb3QgaW4gY29tbW9uIHdpdGggdGhlIG90aGVyIEVDUCBib2FyZHMuKQorICovCisjZGVmaW5lCUVDUF9QQ0lJUkVHCTAKKyNkZWZpbmUJRUNQX1BDSUNPTkZSCTEKKyNkZWZpbmUJRUNQX1BDSVNUT1AJMHgwMQorCisvKgorICoJSGFyZHdhcmUgY29uZmlndXJhdGlvbiBpbmZvIGZvciBPTmJvYXJkIGFuZCBCcnVtYnkgYm9hcmRzLiBUaGVzZQorICoJZGVmaW5lcyBhcHBseSB0byB0aGUgZGlyZWN0bHkgYWNjZXNzaWJsZSBpbyBwb3J0cyBvZiB0aGVzZSBib2FyZHMuCisgKi8KKyNkZWZpbmUJT05CX0lPU0laRQkxNgorI2RlZmluZQlPTkJfTUVNU0laRQkoNjQgKiAxMDI0KQorI2RlZmluZQlPTkJfQVRQQUdFU0laRQkoNjQgKiAxMDI0KQorI2RlZmluZQlPTkJfTUNQQUdFU0laRQkoNjQgKiAxMDI0KQorI2RlZmluZQlPTkJfRUlNRU1TSVpFCSgxMjggKiAxMDI0KQorI2RlZmluZQlPTkJfRUlQQUdFU0laRQkoNjQgKiAxMDI0KQorCisvKgorICoJSW1wb3J0YW50IGRlZmluZXMgZm9yIHRoZSBJU0EgY2xhc3Mgb2YgT05ib2FyZCBib2FyZC4KKyAqLworI2RlZmluZQlPTkJfQVRJUkVHCTAKKyNkZWZpbmUJT05CX0FUTUVNQVIJMQorI2RlZmluZQlPTkJfQVRDT05GUgkyCisjZGVmaW5lCU9OQl9BVFNUT1AJMHg0CisjZGVmaW5lCU9OQl9BVEVOQUJMRQkweDAxCisjZGVmaW5lCU9OQl9BVERJU0FCTEUJMHgwMAorI2RlZmluZQlPTkJfQVRBRERSTUFTSwkweGZmMDAwMAorI2RlZmluZQlPTkJfQVRBRERSU0hGVAkxNgorCisjZGVmaW5lCU9OQl9NRU1FTkFCTE8JMAorI2RlZmluZQlPTkJfTUVNRU5BQkhJCTB4MDIKKworLyoKKyAqCUltcG9ydGFudCBkZWZpbmVzIGZvciB0aGUgRUlTQSBjbGFzcyBvZiBPTmJvYXJkIGJvYXJkLgorICovCisjZGVmaW5lCU9OQl9FSUlSRUcJMAorI2RlZmluZQlPTkJfRUlNRU1BUkwJMQorI2RlZmluZQlPTkJfRUlDT05GUgkyCisjZGVmaW5lCU9OQl9FSU1FTUFSSAkzCisjZGVmaW5lCU9OQl9FSUVOQUJMRQkweDEKKyNkZWZpbmUJT05CX0VJRElTQUJMRQkweDAKKyNkZWZpbmUJT05CX0VJU1RPUAkweDQKKyNkZWZpbmUJT05CX0VJRURHRQkweDAwCisjZGVmaW5lCU9OQl9FSUxFVkVMCTB4ODAKKyNkZWZpbmUJT05CX0VJQUREUk1BU0tMCTB4MDBmZjAwMDAKKyNkZWZpbmUJT05CX0VJQUREUlNIRlRMCTE2CisjZGVmaW5lCU9OQl9FSUFERFJNQVNLSAkweGZmMDAwMDAwCisjZGVmaW5lCU9OQl9FSUFERFJTSEZUSAkyNAorI2RlZmluZQlPTkJfRUlCUkRFTkFCCTB4Yzg0CisKKyNkZWZpbmUJT05CX0VJU0FJRAkweDEKKworLyoKKyAqCUltcG9ydGFudCBkZWZpbmVzIGZvciB0aGUgQnJ1bWJ5IGJvYXJkcy4gVGhleSBhcmUgcHJldHR5IHNpbXBsZSwKKyAqCXRoZXJlIGlzIG5vdCBtdWNoIHRoYXQgaXMgcHJvZ3JhbW1hYmx5IGNvbmZpZ3VyYWJsZS4KKyAqLworI2RlZmluZQlCQllfSU9TSVpFCTE2CisjZGVmaW5lCUJCWV9NRU1TSVpFCSg2NCAqIDEwMjQpCisjZGVmaW5lCUJCWV9QQUdFU0laRQkoMTYgKiAxMDI0KQorCisjZGVmaW5lCUJCWV9BVElSRUcJMAorI2RlZmluZQlCQllfQVRDT05GUgkxCisjZGVmaW5lCUJCWV9BVFNUT1AJMHg0CisKKy8qCisgKglJbXBvcnRhbnQgZGVmaW5lcyBmb3IgdGhlIFN0YWxsaW9uIGJvYXJkcy4gVGhleSBhcmUgcHJldHR5IHNpbXBsZSwKKyAqCXRoZXJlIGlzIG5vdCBtdWNoIHRoYXQgaXMgcHJvZ3JhbW1hYmx5IGNvbmZpZ3VyYWJsZS4KKyAqLworI2RlZmluZQlTVEFMX0lPU0laRQkxNgorI2RlZmluZQlTVEFMX01FTVNJWkUJKDY0ICogMTAyNCkKKyNkZWZpbmUJU1RBTF9QQUdFU0laRQkoNjQgKiAxMDI0KQorCisvKgorICoJRGVmaW5lIHRoZSBzZXQgb2Ygc3RhdHVzIHJlZ2lzdGVyIHZhbHVlcyBmb3IgRWFzeUNvbm5lY3Rpb24gcGFuZWxzLgorICoJVGhlIHNpZ25hdHVyZSB3aWxsIHJldHVybiB3aXRoIHRoZSBzdGF0dXMgdmFsdWUgZm9yIGVhY2ggcGFuZWwuIEZyb20KKyAqCXRoaXMgd2UgY2FuIGRldGVybWluZSB3aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBib2FyZCAtIGJlZm9yZSB3ZSBoYXZlCisgKglhY3R1YWxseSBkb3duIGxvYWRlZCBhbnkgY29kZSB0byBpdC4KKyAqLworI2RlZmluZQlFQ0hfUE5MU1RBVFVTCTIKKyNkZWZpbmUJRUNIX1BOTDE2UE9SVAkweDIwCisjZGVmaW5lCUVDSF9QTkxJRE1BU0sJMHgwNworI2RlZmluZQlFQ0hfUE5MWFBJRAkweDQwCisjZGVmaW5lCUVDSF9QTkxJTlRSUEVORAkweDgwCisKKy8qCisgKglEZWZpbmUgc29tZSBtYWNyb3MgdG8gZG8gdGhpbmdzIHRvIHRoZSBib2FyZC4gRXZlbiB0aG9zZSB0aGVzZSBib2FyZHMKKyAqCWFyZSBzb21ld2hhdCByZWxhdGVkIHRoZXJlIGlzIG9mdGVuIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHdheXMgb2YKKyAqCWRvaW5nIHNvbWUgb3BlcmF0aW9uIG9uIGl0IChsaWtlIGVuYWJsZSwgcGFnaW5nLCByZXNldCwgZXRjKS4gU28gZWFjaAorICoJYm9hcmQgY2xhc3MgaGFzIGEgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBkbyB0aGUgY29tbW9ubHkgcmVxdWlyZWQKKyAqCW9wZXJhdGlvbnMuIFRoZSBtYWNyb3MgYmVsb3cgYmFzaWNhbGx5IGp1c3QgY2FsbCB0aGVzZSBmdW5jdGlvbnMsCisgKglnZW5lcmFsbHkgY2hlY2tpbmcgZm9yIGEgTlVMTCBmdW5jdGlvbiAtIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGJvYXJkCisgKgluZWVkcyBub3RoaW5nIGRvbmUgdG8gaXQgdG8gYWNoaWV2ZSB0aGlzIG9wZXJhdGlvbiEKKyAqLworI2RlZmluZQlFQlJESU5JVChicmRwKQkJCQkJCVwKKwlpZiAoYnJkcC0+aW5pdCAhPSBOVUxMKQkJCQkJXAorCQkoKiBicmRwLT5pbml0KShicmRwKQorCisjZGVmaW5lCUVCUkRFTkFCTEUoYnJkcCkJCQkJCVwKKwlpZiAoYnJkcC0+ZW5hYmxlICE9IE5VTEwpCQkJCVwKKwkJKCogYnJkcC0+ZW5hYmxlKShicmRwKTsKKworI2RlZmluZQlFQlJERElTQUJMRShicmRwKQkJCQkJXAorCWlmIChicmRwLT5kaXNhYmxlICE9IE5VTEwpCQkJCVwKKwkJKCogYnJkcC0+ZGlzYWJsZSkoYnJkcCk7CisKKyNkZWZpbmUJRUJSRElOVFIoYnJkcCkJCQkJCQlcCisJaWYgKGJyZHAtPmludHIgIT0gTlVMTCkJCQkJCVwKKwkJKCogYnJkcC0+aW50cikoYnJkcCk7CisKKyNkZWZpbmUJRUJSRFJFU0VUKGJyZHApCQkJCQkJXAorCWlmIChicmRwLT5yZXNldCAhPSBOVUxMKQkJCQlcCisJCSgqIGJyZHAtPnJlc2V0KShicmRwKTsKKworI2RlZmluZQlFQlJER0VUTUVNUFRSKGJyZHAsb2Zmc2V0KQkJCQlcCisJKCogYnJkcC0+Z2V0bWVtcHRyKShicmRwLCBvZmZzZXQsIF9fTElORV9fKQorCisvKgorICoJRGVmaW5lIHRoZSBtYXhpbWFsIGJhdWQgcmF0ZSwgYW5kIHRoZSBkZWZhdWx0IGJhdWQgYmFzZSBmb3IgcG9ydHMuCisgKi8KKyNkZWZpbmUJU1RMX01BWEJBVUQJNDYwODAwCisjZGVmaW5lCVNUTF9CQVVEQkFTRQkxMTUyMDAKKyNkZWZpbmUJU1RMX0NMT1NFREVMQVkJKDUgKiBIWiAvIDEwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgbWFjcm9zIHRvIGV4dHJhY3QgYSBicmQgb3IgcG9ydCBudW1iZXIgZnJvbSBhIG1pbm9yIG51bWJlci4KKyAqLworI2RlZmluZQlNSU5PUjJCUkQobWluKQkJKCgobWluKSAmIDB4YzApID4+IDYpCisjZGVmaW5lCU1JTk9SMlBPUlQobWluKQkJKChtaW4pICYgMHgzZikKKworLyoKKyAqCURlZmluZSBhIGJhdWQgcmF0ZSB0YWJsZSB0aGF0IGNvbnZlcnRzIHRlcm1pb3MgYmF1ZCByYXRlIHNlbGVjdG9yCisgKglpbnRvIHRoZSBhY3R1YWwgYmF1ZCByYXRlIHZhbHVlLiBBbGwgYmF1ZCByYXRlIGNhbGN1bGF0aW9ucyBhcmUgYmFzZWQKKyAqCW9uIHRoZSBhY3R1YWwgYmF1ZCByYXRlIHJlcXVpcmVkLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CXN0bGlfYmF1ZHJhdGVzW10gPSB7CisJMCwgNTAsIDc1LCAxMTAsIDEzNCwgMTUwLCAyMDAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAyNDAwLCA0ODAwLAorCTk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIHNvbWUgaGFuZHkgbG9jYWwgbWFjcm9zLi4uCisgKi8KKyN1bmRlZiBNSU4KKyNkZWZpbmUJTUlOKGEsYikJKCgoYSkgPD0gKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCVRPTE9XRVIKKyNkZWZpbmUJVE9MT1dFUih4KQkoKCgoeCkgPj0gJ0EnKSAmJiAoKHgpIDw9ICdaJykpID8gKCh4KSArIDB4MjApIDogKHgpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQcm90b3R5cGUgYWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGRyaXZlciEKKyAqLworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgdm9pZAlzdGxpX2FyZ2JyZHModm9pZCk7CitzdGF0aWMgaW50CXN0bGlfcGFyc2VicmQoc3RsY29uZl90ICpjb25mcCwgY2hhciAqKmFyZ3ApOworCitzdGF0aWMgdW5zaWduZWQgbG9uZwlzdGxpX2F0b2woY2hhciAqc3RyKTsKKyNlbmRpZgorCitpbnQJCXN0bGlfaW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQJc3RsaV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkCXN0bGlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIGludAlzdGxpX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkCXN0bGlfcHV0Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkCXN0bGlfZmx1c2hjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQJc3RsaV93cml0ZXJvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50CXN0bGlfY2hhcnNpbmJ1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQJc3RsaV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQJc3RsaV9zZXR0ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGQpOworc3RhdGljIHZvaWQJc3RsaV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bGlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bGlfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bGlfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZAlzdGxpX2ZsdXNoYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQJc3RsaV9icmVha2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgc3RhdGUpOworc3RhdGljIHZvaWQJc3RsaV93YWl0dW50aWxzZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKK3N0YXRpYyB2b2lkCXN0bGlfc2VuZHhjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpOworc3RhdGljIHZvaWQJc3RsaV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50CXN0bGlfcG9ydGluZm8oc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgaW50IHBvcnRuciwgY2hhciAqcG9zKTsKKworc3RhdGljIGludAlzdGxpX2JyZGluaXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsaV9zdGFydGJyZChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHNzaXplX3QJc3RsaV9tZW1yZWFkKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApOworc3RhdGljIHNzaXplX3QJc3RsaV9tZW13cml0ZShzdHJ1Y3QgZmlsZSAqZnAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKTsKK3N0YXRpYyBpbnQJc3RsaV9tZW1pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyB2b2lkCXN0bGlfYnJkcG9sbChzdGxpYnJkX3QgKmJyZHAsIHZvbGF0aWxlIGNka2hkcl90ICpoZHJwKTsKK3N0YXRpYyB2b2lkCXN0bGlfcG9sbCh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50CXN0bGlfaG9zdGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9pbml0b3BlbihzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9yYXdvcGVuKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgd2FpdCk7CitzdGF0aWMgaW50CXN0bGlfcmF3Y2xvc2Uoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KTsKK3N0YXRpYyBpbnQJc3RsaV93YWl0Y2FycmllcihzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZAlzdGxpX2RvaGFuZ3VwKHZvaWQgKmFyZyk7CitzdGF0aWMgaW50CXN0bGlfc2V0cG9ydChzdGxpcG9ydF90ICpwb3J0cCk7CitzdGF0aWMgaW50CXN0bGlfY21kd2FpdChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKTsKK3N0YXRpYyB2b2lkCXN0bGlfc2VuZGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKTsKK3N0YXRpYyB2b2lkCXN0bGlfZG9kZWxheWNtZChzdGxpcG9ydF90ICpwb3J0cCwgdm9sYXRpbGUgY2RrY3RybF90ICpjcCk7CitzdGF0aWMgdm9pZAlzdGxpX21rYXN5cG9ydChzdGxpcG9ydF90ICpwb3J0cCwgYXN5cG9ydF90ICpwcCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKTsKK3N0YXRpYyB2b2lkCXN0bGlfbWthc3lzaWdzKGFzeXNpZ3NfdCAqc3AsIGludCBkdHIsIGludCBydHMpOworc3RhdGljIGxvbmcJc3RsaV9ta3Rpb2NtKHVuc2lnbmVkIGxvbmcgc2lndmFsdWUpOworc3RhdGljIHZvaWQJc3RsaV9yZWFkKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApOworc3RhdGljIGludAlzdGxpX2dldHNlcmlhbChzdGxpcG9ydF90ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCk7CitzdGF0aWMgaW50CXN0bGlfc2V0c2VyaWFsKHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKTsKK3N0YXRpYyBpbnQJc3RsaV9nZXRicmRzdGF0cyhjb21icmRfdCBfX3VzZXIgKmJwKTsKK3N0YXRpYyBpbnQJc3RsaV9nZXRwb3J0c3RhdHMoc3RsaXBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CitzdGF0aWMgaW50CXN0bGlfcG9ydGNtZHN0YXRzKHN0bGlwb3J0X3QgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9jbHJwb3J0c3RhdHMoc3RsaXBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CitzdGF0aWMgaW50CXN0bGlfZ2V0cG9ydHN0cnVjdChzdGxpcG9ydF90IF9fdXNlciAqYXJnKTsKK3N0YXRpYyBpbnQJc3RsaV9nZXRicmRzdHJ1Y3Qoc3RsaWJyZF90IF9fdXNlciAqYXJnKTsKK3N0YXRpYyB2b2lkCSpzdGxpX21lbWFsbG9jKGludCBsZW4pOworc3RhdGljIHN0bGlicmRfdCAqc3RsaV9hbGxvY2JyZCh2b2lkKTsKKworc3RhdGljIHZvaWQJc3RsaV9lY3Bpbml0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcGVuYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgY2hhcgkqc3RsaV9lY3BnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9lY3ByZXNldChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BpbnRyKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcGVpaW5pdChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BlaWVuYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BlaWRpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX2VjcGVpZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwZWlyZXNldChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BtY2VuYWJsZShzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BtY2Rpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX2VjcG1jZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwbWNyZXNldChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BwY2lpbml0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgY2hhcgkqc3RsaV9lY3BwY2lnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9lY3BwY2lyZXNldChzdGxpYnJkX3QgKmJyZHApOworCitzdGF0aWMgdm9pZAlzdGxpX29uYmluaXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25iZW5hYmxlKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmRpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX29uYmdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7CitzdGF0aWMgdm9pZAlzdGxpX29uYnJlc2V0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmVpbml0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmVlbmFibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25iZWRpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX29uYmVnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9vbmJlcmVzZXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfYmJ5aW5pdChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIGNoYXIJKnN0bGlfYmJ5Z2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfYmJ5cmVzZXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfc3RhbGluaXQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBjaGFyCSpzdGxpX3N0YWxnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9zdGFscmVzZXQoc3RsaWJyZF90ICpicmRwKTsKKworc3RhdGljIHN0bGlwb3J0X3QgKnN0bGlfZ2V0cG9ydChpbnQgYnJkbnIsIGludCBwYW5lbG5yLCBpbnQgcG9ydG5yKTsKKworc3RhdGljIGludAlzdGxpX2luaXRlY3Aoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsaV9pbml0b25iKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgaW50CXN0bGlfZWlzYW1lbXByb2JlKHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgaW50CXN0bGlfaW5pdHBvcnRzKHN0bGlicmRfdCAqYnJkcCk7CisKKyNpZmRlZglDT05GSUdfUENJCitzdGF0aWMgaW50CXN0bGlfaW5pdHBjaWJyZChpbnQgYnJkdHlwZSwgc3RydWN0IHBjaV9kZXYgKmRldnApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURlZmluZSB0aGUgZHJpdmVyIGluZm8gZm9yIGEgdXNlciBsZXZlbCBzaGFyZWQgbWVtb3J5IGRldmljZS4gVGhpcworICoJZGV2aWNlIHdpbGwgd29yayBzb3J0IG9mIGxpa2UgdGhlIC9kZXYva21lbSBkZXZpY2UgLSBleGNlcHQgdGhhdCBpdAorICoJd2lsbCBnaXZlIGFjY2VzcyB0byB0aGUgc2hhcmVkIG1lbW9yeSBvbiB0aGUgU3RhbGxpb24gaW50ZWxsaWdlbnQKKyAqCWJvYXJkLiBUaGlzIGlzIGFsc28gYSB2ZXJ5IHVzZWZ1bCBkZWJ1Z2dpbmcgdG9vbC4KKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMJc3RsaV9mc2lvbWVtID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBzdGxpX21lbXJlYWQsCisJLndyaXRlCQk9IHN0bGlfbWVtd3JpdGUsCisJLmlvY3RsCQk9IHN0bGlfbWVtaW9jdGwsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgYSB0aW1lcl9saXN0IGVudHJ5IGZvciBvdXIgcG9sbCByb3V0aW5lLiBUaGUgc2xhdmUgYm9hcmQKKyAqCWlzIHBvbGxlZCBldmVyeSBzbyBvZnRlbiB0byBzZWUgaWYgYW55dGhpbmcgbmVlZHMgZG9pbmcuIFRoaXMgaXMKKyAqCW11Y2ggY2hlYXBlciBvbiBob3N0IGNwdSB0aGFuIHVzaW5nIGludGVycnVwdHMuIEl0IHR1cm5zIG91dCB0bworICoJbm90IGluY3JlYXNlIGNoYXJhY3RlciBsYXRlbmN5IGJ5IG11Y2ggZWl0aGVyLi4uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzdGxpX3RpbWVybGlzdCA9IFRJTUVSX0lOSVRJQUxJWkVSKHN0bGlfcG9sbCwgMCwgMCk7CisKK3N0YXRpYyBpbnQJc3RsaV90aW1lcm9uOworCisvKgorICoJRGVmaW5lIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIHRpbWVvdXQgcm91dGluZS4KKyAqLworI2RlZmluZQlTVExJX1RJTUVPVVQJKGppZmZpZXMgKyAxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICppc3RhbGxpb25fY2xhc3M7CisKKyNpZmRlZiBNT0RVTEUKKworLyoKKyAqCUxvYWRhYmxlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBzdHVmZi4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpc3RhbGxpb25fbW9kdWxlX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImluaXRfbW9kdWxlKClcbiIpOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlzdGxpX2luaXQoKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXN0YWxsaW9uX21vZHVsZV9leGl0KHZvaWQpCit7CisJc3RsaWJyZF90CSpicmRwOworCXN0bGlwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlpLCBqOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImNsZWFudXBfbW9kdWxlKClcbiIpOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIHN0bGlfZHJ2dGl0bGUsCisJCXN0bGlfZHJ2dmVyc2lvbik7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworLyoKKyAqCUZyZWUgdXAgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMgdXNlZCBieSB0aGUgcG9ydHMuIFRoaXMgaW5jbHVkZXMKKyAqCW1lbW9yeSBhbmQgaW50ZXJydXB0cy4KKyAqLworCWlmIChzdGxpX3RpbWVyb24pIHsKKwkJc3RsaV90aW1lcm9uID0gMDsKKwkJZGVsX3RpbWVyKCZzdGxpX3RpbWVybGlzdCk7CisJfQorCisJaSA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzdGxpX3NlcmlhbCk7CisJaWYgKGkpIHsKKwkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHVuLXJlZ2lzdGVyIHR0eSBkcml2ZXIsICIKKwkJCSJlcnJubz0lZFxuIiwgLWkpOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwdXRfdHR5X2RyaXZlcihzdGxpX3NlcmlhbCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlkZXZmc19yZW1vdmUoInN0YWxpb21lbS8lZCIsIGkpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpKTsKKwl9CisJZGV2ZnNfcmVtb3ZlKCJzdGFsaW9tZW0iKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShpc3RhbGxpb25fY2xhc3MpOworCWlmICgoaSA9IHVucmVnaXN0ZXJfY2hyZGV2KFNUTF9TSU9NRU1NQUpPUiwgInN0YWxpb21lbSIpKSkKKwkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHVuLXJlZ2lzdGVyIHNlcmlhbCBtZW1vcnkgZGV2aWNlLCAiCisJCQkiZXJybm89JWRcbiIsIC1pKTsKKwlpZiAoc3RsaV90bXB3cml0ZWJ1ZiAhPSAoY2hhciAqKSBOVUxMKQorCQlrZnJlZShzdGxpX3RtcHdyaXRlYnVmKTsKKwlpZiAoc3RsaV90eGNvb2tidWYgIT0gKGNoYXIgKikgTlVMTCkKKwkJa2ZyZWUoc3RsaV90eGNvb2tidWYpOworCisJZm9yIChpID0gMDsgKGkgPCBzdGxpX25yYnJkcyk7IGkrKykgeworCQlpZiAoKGJyZHAgPSBzdGxpX2JyZHNbaV0pID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyAoaiA8IFNUTF9NQVhQT1JUUyk7IGorKykgeworCQkJcG9ydHAgPSBicmRwLT5wb3J0c1tqXTsKKwkJCWlmIChwb3J0cCAhPSAoc3RsaXBvcnRfdCAqKSBOVUxMKSB7CisJCQkJaWYgKHBvcnRwLT50dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCQkJCXR0eV9oYW5ndXAocG9ydHAtPnR0eSk7CisJCQkJa2ZyZWUocG9ydHApOworCQkJfQorCQl9CisKKwkJaW91bm1hcChicmRwLT5tZW1iYXNlKTsKKwkJaWYgKGJyZHAtPmlvc2l6ZSA+IDApCisJCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7CisJCWtmcmVlKGJyZHApOworCQlzdGxpX2JyZHNbaV0gPSAoc3RsaWJyZF90ICopIE5VTEw7CisJfQorCisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK21vZHVsZV9pbml0KGlzdGFsbGlvbl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChpc3RhbGxpb25fbW9kdWxlX2V4aXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglDaGVjayBmb3IgYW55IGFyZ3VtZW50cyBwYXNzZWQgaW4gb24gdGhlIG1vZHVsZSBsb2FkIGNvbW1hbmQgbGluZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2FyZ2JyZHModm9pZCkKK3sKKwlzdGxjb25mX3QJY29uZjsKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlucmFyZ3MsIGk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9hcmdicmRzKClcbiIpOworI2VuZGlmCisKKwlucmFyZ3MgPSBzaXplb2Yoc3RsaV9icmRzcCkgLyBzaXplb2YoY2hhciAqKik7CisKKwlmb3IgKGkgPSBzdGxpX25yYnJkczsgKGkgPCBucmFyZ3MpOyBpKyspIHsKKwkJbWVtc2V0KCZjb25mLCAwLCBzaXplb2YoY29uZikpOworCQlpZiAoc3RsaV9wYXJzZWJyZCgmY29uZiwgc3RsaV9icmRzcFtpXSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGJyZHAgPSBzdGxpX2FsbG9jYnJkKCkpID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCWNvbnRpbnVlOworCQlzdGxpX25yYnJkcyA9IGkgKyAxOworCQlicmRwLT5icmRuciA9IGk7CisJCWJyZHAtPmJyZHR5cGUgPSBjb25mLmJyZHR5cGU7CisJCWJyZHAtPmlvYmFzZSA9IGNvbmYuaW9hZGRyMTsKKwkJYnJkcC0+bWVtYWRkciA9IGNvbmYubWVtYWRkcjsKKwkJc3RsaV9icmRpbml0KGJyZHApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ29udmVydCBhbiBhc2NpaSBzdHJpbmcgbnVtYmVyIGludG8gYW4gdW5zaWduZWQgbG9uZy4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGxpX2F0b2woY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGxvbmcJdmFsOworCWludAkJYmFzZSwgYzsKKwljaGFyCQkqc3A7CisKKwl2YWwgPSAwOworCXNwID0gc3RyOworCWlmICgoKnNwID09ICcwJykgJiYgKCooc3ArMSkgPT0gJ3gnKSkgeworCQliYXNlID0gMTY7CisJCXNwICs9IDI7CisJfSBlbHNlIGlmICgqc3AgPT0gJzAnKSB7CisJCWJhc2UgPSA4OworCQlzcCsrOworCX0gZWxzZSB7CisJCWJhc2UgPSAxMDsKKwl9CisKKwlmb3IgKDsgKCpzcCAhPSAwKTsgc3ArKykgeworCQljID0gKCpzcCA+ICc5JykgPyAoVE9MT1dFUigqc3ApIC0gJ2EnICsgMTApIDogKCpzcCAtICcwJyk7CisJCWlmICgoYyA8IDApIHx8IChjID49IGJhc2UpKSB7CisJCQlwcmludGsoIlNUQUxMSU9OOiBpbnZhbGlkIGFyZ3VtZW50ICVzXG4iLCBzdHIpOworCQkJdmFsID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXZhbCA9ICh2YWwgKiBiYXNlKSArIGM7CisJfQorCXJldHVybih2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQYXJzZSB0aGUgc3VwcGxpZWQgYXJndW1lbnQgc3RyaW5nLCBpbnRvIHRoZSBib2FyZCBjb25mIHN0cnVjdC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfcGFyc2VicmQoc3RsY29uZl90ICpjb25mcCwgY2hhciAqKmFyZ3ApCit7CisJY2hhcgkqc3A7CisJaW50CW5yYnJkbmFtZXMsIGk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9wYXJzZWJyZChjb25mcD0leCxhcmdwPSV4KVxuIiwgKGludCkgY29uZnAsIChpbnQpIGFyZ3ApOworI2VuZGlmCisKKwlpZiAoKGFyZ3BbMF0gPT0gKGNoYXIgKikgTlVMTCkgfHwgKCphcmdwWzBdID09IDApKQorCQlyZXR1cm4oMCk7CisKKwlmb3IgKHNwID0gYXJncFswXSwgaSA9IDA7ICgoKnNwICE9IDApICYmIChpIDwgMjUpKTsgc3ArKywgaSsrKQorCQkqc3AgPSBUT0xPV0VSKCpzcCk7CisKKwlucmJyZG5hbWVzID0gc2l6ZW9mKHN0bGlfYnJkc3RyKSAvIHNpemVvZihzdGxpYnJkdHlwZV90KTsKKwlmb3IgKGkgPSAwOyAoaSA8IG5yYnJkbmFtZXMpOyBpKyspIHsKKwkJaWYgKHN0cmNtcChzdGxpX2JyZHN0cltpXS5uYW1lLCBhcmdwWzBdKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IG5yYnJkbmFtZXMpIHsKKwkJcHJpbnRrKCJTVEFMTElPTjogdW5rbm93biBib2FyZCBuYW1lLCAlcz9cbiIsIGFyZ3BbMF0pOworCQlyZXR1cm4oMCk7CisJfQorCisJY29uZnAtPmJyZHR5cGUgPSBzdGxpX2JyZHN0cltpXS50eXBlOworCWlmICgoYXJncFsxXSAhPSAoY2hhciAqKSBOVUxMKSAmJiAoKmFyZ3BbMV0gIT0gMCkpCisJCWNvbmZwLT5pb2FkZHIxID0gc3RsaV9hdG9sKGFyZ3BbMV0pOworCWlmICgoYXJncFsyXSAhPSAoY2hhciAqKSBOVUxMKSAmJiAoKmFyZ3BbMl0gIT0gMCkpCisJCWNvbmZwLT5tZW1hZGRyID0gc3RsaV9hdG9sKGFyZ3BbMl0pOworCXJldHVybigxKTsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUxvY2FsIGRyaXZlciBrZXJuZWwgbWFsbG9jIHJvdXRpbmUuCisgKi8KKworc3RhdGljIHZvaWQgKnN0bGlfbWVtYWxsb2MoaW50IGxlbikKK3sKKwlyZXR1cm4oKHZvaWQgKikga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0bGlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJdW5zaWduZWQgaW50CW1pbm9yZGV2OworCWludAkJYnJkbnIsIHBvcnRuciwgcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9vcGVuKHR0eT0leCxmaWxwPSV4KTogZGV2aWNlPSVzXG4iLCAoaW50KSB0dHksCisJCShpbnQpIGZpbHAsIHR0eS0+bmFtZSk7CisjZW5kaWYKKworCW1pbm9yZGV2ID0gdHR5LT5pbmRleDsKKwlicmRuciA9IE1JTk9SMkJSRChtaW5vcmRldik7CisJaWYgKGJyZG5yID49IHN0bGlfbnJicmRzKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1ticmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKChicmRwLT5zdGF0ZSAmIEJTVF9TVEFSVEVEKSA9PSAwKQorCQlyZXR1cm4oLUVOT0RFVik7CisJcG9ydG5yID0gTUlOT1IyUE9SVChtaW5vcmRldik7CisJaWYgKChwb3J0bnIgPCAwKSB8fCAocG9ydG5yID4gYnJkcC0+bnJwb3J0cykpCisJCXJldHVybigtRU5PREVWKTsKKworCXBvcnRwID0gYnJkcC0+cG9ydHNbcG9ydG5yXTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmIChwb3J0cC0+ZGV2bnIgPCAxKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKworLyoKKyAqCUNoZWNrIGlmIHRoaXMgcG9ydCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNsb3NpbmcuIElmIHNvIHRoZW4gd2FpdAorICoJdW50aWwgaXQgaXMgY2xvc2VkIHRoZW4gcmV0dXJuIGVycm9yIHN0YXR1cyBiYXNlZCBvbiBmbGFnIHNldHRpbmdzLgorICoJVGhlIHNsZWVwIGhlcmUgZG9lcyBub3QgbmVlZCBpbnRlcnJ1cHQgcHJvdGVjdGlvbiBzaW5jZSB0aGUgd2FrZXVwCisgKglmb3IgaXQgaXMgZG9uZSB3aXRoIHRoZSBzYW1lIGNvbnRleHQuCisgKi8KKwlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwb3J0cC0+Y2xvc2Vfd2FpdCk7CisJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuKC1FQUdBSU4pOworCQlyZXR1cm4oLUVSRVNUQVJUU1lTKTsKKwl9CisKKy8qCisgKglPbiB0aGUgZmlyc3Qgb3BlbiBvZiB0aGUgZGV2aWNlIHNldHVwIHRoZSBwb3J0IGhhcmR3YXJlLCBhbmQKKyAqCWluaXRpYWxpemUgdGhlIHBlciBwb3J0IGRhdGEgc3RydWN0dXJlLiBTaW5jZSBpbml0aWFsaXppbmcgdGhlIHBvcnQKKyAqCXJlcXVpcmVzIHNldmVyYWwgY29tbWFuZHMgdG8gdGhlIGJvYXJkIHdlIHdpbGwgbmVlZCB0byB3YWl0IGZvciBhbnkKKyAqCW90aGVyIG9wZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemluZyB0aGUgcG9ydC4KKyAqLworCXBvcnRwLT50dHkgPSB0dHk7CisJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnRwOworCXBvcnRwLT5yZWZjb3VudCsrOworCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9JTklUSUFMSVpJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybigtRVJFU1RBUlRTWVMpOworCisJaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgPT0gMCkgeworCQlzZXRfYml0KFNUX0lOSVRJQUxJWklORywgJnBvcnRwLT5zdGF0ZSk7CisJCWlmICgocmMgPSBzdGxpX2luaXRvcGVuKGJyZHAsIHBvcnRwKSkgPj0gMCkgeworCQkJcG9ydHAtPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOworCQl9CisJCWNsZWFyX2JpdChTVF9JTklUSUFMSVpJTkcsICZwb3J0cC0+c3RhdGUpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5yYXdfd2FpdCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4ocmMpOworCX0KKworLyoKKyAqCUNoZWNrIGlmIHRoaXMgcG9ydCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNsb3NpbmcuIElmIHNvIHRoZW4gd2FpdAorICoJdW50aWwgaXQgaXMgY2xvc2VkIHRoZW4gcmV0dXJuIGVycm9yIHN0YXR1cywgYmFzZWQgb24gZmxhZyBzZXR0aW5ncy4KKyAqCVRoZSBzbGVlcCBoZXJlIGRvZXMgbm90IG5lZWQgaW50ZXJydXB0IHByb3RlY3Rpb24gc2luY2UgdGhlIHdha2V1cAorICoJZm9yIGl0IGlzIGRvbmUgd2l0aCB0aGUgc2FtZSBjb250ZXh0LgorICovCisJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydHAtPmNsb3NlX3dhaXQpOworCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCXJldHVybigtRUFHQUlOKTsKKwkJcmV0dXJuKC1FUkVTVEFSVFNZUyk7CisJfQorCisvKgorICoJQmFzZWQgb24gdHlwZSBvZiBvcGVuIGJlaW5nIGRvbmUgY2hlY2sgaWYgaXQgY2FuIG92ZXJsYXAgd2l0aCBhbnkKKyAqCXByZXZpb3VzIG9wZW5zIHN0aWxsIGluIGVmZmVjdC4gSWYgd2UgYXJlIGEgbm9ybWFsIHNlcmlhbCBkZXZpY2UKKyAqCXRoZW4gYWxzbyB3ZSBtaWdodCBoYXZlIHRvIHdhaXQgZm9yIGNhcnJpZXIuCisgKi8KKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJaWYgKChyYyA9IHN0bGlfd2FpdGNhcnJpZXIoYnJkcCwgcG9ydHAsIGZpbHApKSAhPSAwKQorCQkJcmV0dXJuKHJjKTsKKwl9CisJcG9ydHAtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RsaWJyZF90CSpicmRwOworCXN0bGlwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9jbG9zZSh0dHk9JXgsZmlscD0leClcbiIsIChpbnQpIHR0eSwgKGludCkgZmlscCk7CisjZW5kaWYKKworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChwb3J0cC0+cmVmY291bnQgIT0gMSkpCisJCXBvcnRwLT5yZWZjb3VudCA9IDE7CisJaWYgKHBvcnRwLT5yZWZjb3VudC0tID4gMSkgeworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXBvcnRwLT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOworCisvKgorICoJTWF5IHdhbnQgdG8gd2FpdCBmb3IgZGF0YSB0byBkcmFpbiBiZWZvcmUgY2xvc2luZy4gVGhlIEJVU1kgZmxhZworICoJa2VlcHMgdHJhY2sgb2Ygd2hldGhlciB3ZSBhcmUgc3RpbGwgdHJhbnNtaXR0aW5nIG9yIG5vdC4gSXQgaXMKKyAqCXVwZGF0ZWQgYnkgbWVzc2FnZXMgZnJvbSB0aGUgc2xhdmUgLSBpbmRpY2F0aW5nIHdoZW4gYWxsIGNoYXJzCisgKglyZWFsbHkgaGF2ZSBkcmFpbmVkLgorICovCisJaWYgKHR0eSA9PSBzdGxpX3R4Y29va3R0eSkKKwkJc3RsaV9mbHVzaGNoYXJzKHR0eSk7CisJdHR5LT5jbG9zaW5nID0gMTsKKwlpZiAocG9ydHAtPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIHBvcnRwLT5jbG9zaW5nX3dhaXQpOworCisJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJc3RsaV9yYXdjbG9zZShicmRwLCBwb3J0cCwgMCwgMCk7CisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7CisJCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgMCwgMCk7CisJCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKQorCQkJc2V0X2JpdChTVF9ET1NJR1MsICZwb3J0cC0+c3RhdGUpOworCQllbHNlCisJCQlzdGxpX3NlbmRjbWQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywgJnBvcnRwLT5hc2lnLAorCQkJCXNpemVvZihhc3lzaWdzX3QpLCAwKTsKKwl9CisJY2xlYXJfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSk7CisJY2xlYXJfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSk7CisJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwlpZiAodHR5LT5sZGlzYy5mbHVzaF9idWZmZXIpCisJCSh0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcikodHR5KTsKKwlzZXRfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSk7CisJc3RsaV9mbHVzaGJ1ZmZlcih0dHkpOworCisJdHR5LT5jbG9zaW5nID0gMDsKKwlwb3J0cC0+dHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEw7CisKKwlpZiAocG9ydHAtPm9wZW53YWl0Y250KSB7CisJCWlmIChwb3J0cC0+Y2xvc2VfZGVsYXkpCisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnRwLT5jbG9zZV9kZWxheSkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5vcGVuX3dhaXQpOworCX0KKworCXBvcnRwLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+Y2xvc2Vfd2FpdCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNhcnJ5IG91dCBmaXJzdCBvcGVuIG9wZXJhdGlvbnMgb24gYSBwb3J0LiBUaGlzIGludm9sdmVzIGEgbnVtYmVyIG9mCisgKgljb21tYW5kcyB0byBiZSBzZW50IHRvIHRoZSBzbGF2ZS4gV2UgbmVlZCB0byBvcGVuIHRoZSBwb3J0LCBzZXQgdGhlCisgKglub3RpZmljYXRpb24gZXZlbnRzLCBzZXQgdGhlIGluaXRpYWwgcG9ydCBzZXR0aW5ncywgZ2V0IGFuZCBzZXQgdGhlCisgKglpbml0aWFsIHNpZ25hbCB2YWx1ZXMuIFdlIHNsZWVwIGFuZCB3YWl0IGluIGJldHdlZW4gZWFjaCBvbmUuIEJ1dAorICoJdGhpcyBzdGlsbCBhbGwgaGFwcGVucyBwcmV0dHkgcXVpY2tseS4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfaW5pdG9wZW4oc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCWFzeW5vdGlmeV90CQludDsKKwlhc3lwb3J0X3QJCWFwb3J0OworCWludAkJCXJjOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfaW5pdG9wZW4oYnJkcD0leCxwb3J0cD0leClcbiIsIChpbnQpIGJyZHAsIChpbnQpIHBvcnRwKTsKKyNlbmRpZgorCisJaWYgKChyYyA9IHN0bGlfcmF3b3BlbihicmRwLCBwb3J0cCwgMCwgMSkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKworCW1lbXNldCgmbnQsIDAsIHNpemVvZihhc3lub3RpZnlfdCkpOworCW50LmRhdGEgPSAoRFRfVFhMT1cgfCBEVF9UWEVNUFRZIHwgRFRfUlhCVVNZIHwgRFRfUlhCUkVBSyk7CisJbnQuc2lnbmFsID0gU0dfRENEOworCWlmICgocmMgPSBzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUTk9USUZZLCAmbnQsCisJICAgIHNpemVvZihhc3lub3RpZnlfdCksIDApKSA8IDApCisJCXJldHVybihyYyk7CisKKwl0dHkgPSBwb3J0cC0+dHR5OworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlzdGxpX21rYXN5cG9ydChwb3J0cCwgJmFwb3J0LCB0dHktPnRlcm1pb3MpOworCWlmICgocmMgPSBzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUUE9SVCwgJmFwb3J0LAorCSAgICBzaXplb2YoYXN5cG9ydF90KSwgMCkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKworCXNldF9iaXQoU1RfR0VUU0lHUywgJnBvcnRwLT5zdGF0ZSk7CisJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9HRVRTSUdOQUxTLCAmcG9ydHAtPmFzaWcsCisJICAgIHNpemVvZihhc3lzaWdzX3QpLCAxKSkgPCAwKQorCQlyZXR1cm4ocmMpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RfR0VUU0lHUywgJnBvcnRwLT5zdGF0ZSkpCisJCXBvcnRwLT5zaWdzID0gc3RsaV9ta3Rpb2NtKHBvcnRwLT5hc2lnLnNpZ3ZhbHVlKTsKKwlzdGxpX21rYXN5c2lncygmcG9ydHAtPmFzaWcsIDEsIDEpOworCWlmICgocmMgPSBzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywgJnBvcnRwLT5hc2lnLAorCSAgICBzaXplb2YoYXN5c2lnc190KSwgMCkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VuZCBhbiBvcGVuIG1lc3NhZ2UgdG8gdGhlIHNsYXZlLiBUaGlzIHdpbGwgc2xlZXAgd2FpdGluZyBmb3IgdGhlCisgKglhY2tub3dsZWRnZW1lbnQsIHNvIG11c3QgaGF2ZSB1c2VyIGNvbnRleHQuIFdlIG5lZWQgdG8gY28tb3JkaW5hdGUKKyAqCXdpdGggY2xvc2UgZXZlbnRzIGhlcmUsIHNpbmNlIHdlIGRvbid0IHdhbnQgb3BlbiBhbmQgY2xvc2UgZXZlbnRzCisgKgl0byBvdmVybGFwLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9yYXdvcGVuKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgd2FpdCkKK3sKKwl2b2xhdGlsZSBjZGtoZHJfdAkqaGRycDsKKwl2b2xhdGlsZSBjZGtjdHJsX3QJKmNwOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmJpdHM7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJaW50CQkJcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9yYXdvcGVuKGJyZHA9JXgscG9ydHA9JXgsYXJnPSV4LHdhaXQ9JWQpXG4iLAorCQkoaW50KSBicmRwLCAoaW50KSBwb3J0cCwgKGludCkgYXJnLCB3YWl0KTsKKyNlbmRpZgorCisvKgorICoJU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNsYXZlIHRvIG9wZW4gdGhpcyBwb3J0LgorICovCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKy8qCisgKglTbGF2ZSBpcyBhbHJlYWR5IGNsb3NpbmcgdGhpcyBwb3J0LiBUaGlzIGNhbiBoYXBwZW4gaWYgYSBoYW5ndXAKKyAqCW9jY3VycyBvbiB0aGlzIHBvcnQuIFNvIHdlIG11c3Qgd2FpdCB1bnRpbCBpdCBpcyBjb21wbGV0ZS4gVGhlCisgKglvcmRlciBvZiBvcGVucyBhbmQgY2xvc2VzIG1heSBub3QgYmUgcHJlc2VydmVkIGFjcm9zcyBzaGFyZWQKKyAqCW1lbW9yeSwgc28gd2UgbXVzdCB3YWl0IHVudGlsIGl0IGlzIGNvbXBsZXRlLgorICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9DTE9TSU5HLCAmcG9ydHAtPnN0YXRlKSk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworLyoKKyAqCUV2ZXJ5dGhpbmcgaXMgcmVhZHkgbm93LCBzbyB3cml0ZSB0aGUgb3BlbiBtZXNzYWdlIGludG8gc2hhcmVkCisgKgltZW1vcnkuIE9uY2UgdGhlIG1lc3NhZ2UgaXMgaW4gc2V0IHRoZSBzZXJ2aWNlIGJpdHMgdG8gc2F5IHRoYXQKKyAqCXRoaXMgcG9ydCB3YW50cyBzZXJ2aWNlLgorICovCisJRUJSREVOQUJMRShicmRwKTsKKwljcCA9ICYoKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpKS0+Y3RybDsKKwljcC0+b3BlbmFyZyA9IGFyZzsKKwljcC0+b3BlbiA9IDE7CisJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwliaXRzID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGhkcnApICsgYnJkcC0+c2xhdmVvZmZzZXQgKworCQlwb3J0cC0+cG9ydGlkeDsKKwkqYml0cyB8PSBwb3J0cC0+cG9ydGJpdDsKKwlFQlJERElTQUJMRShicmRwKTsKKworCWlmICh3YWl0ID09IDApIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybigwKTsKKwl9CisKKy8qCisgKglTbGF2ZSBpcyBpbiBhY3Rpb24sIHNvIG5vdyB3ZSBtdXN0IHdhaXQgZm9yIHRoZSBvcGVuIGFja25vd2xlZGdtZW50CisgKgl0byBjb21lIGJhY2suCisgKi8KKwlyYyA9IDA7CisJc2V0X2JpdChTVF9PUEVOSU5HLCAmcG9ydHAtPnN0YXRlKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocG9ydHAtPnJhd193YWl0LAorCQkJIXRlc3RfYml0KFNUX09QRU5JTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJjID0gLUVSRVNUQVJUU1lTOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKChyYyA9PSAwKSAmJiAocG9ydHAtPnJjICE9IDApKQorCQlyYyA9IC1FSU87CisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VuZCBhIGNsb3NlIG1lc3NhZ2UgdG8gdGhlIHNsYXZlLiBOb3JtYWxseSB0aGlzIHdpbGwgc2xlZXAgd2FpdGluZworICoJZm9yIHRoZSBhY2tub3dsZWRnZW1lbnQsIGJ1dCBpZiB3YWl0IHBhcmFtZXRlciBpcyAwIGl0IHdpbGwgbm90LiBJZgorICoJd2FpdCBpcyB0cnVlIHRoZW4gbXVzdCBoYXZlIHVzZXIgY29udGV4dCAodG8gc2xlZXApLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9yYXdjbG9zZShzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IHdhaXQpCit7CisJdm9sYXRpbGUgY2RraGRyX3QJKmhkcnA7CisJdm9sYXRpbGUgY2RrY3RybF90CSpjcDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpiaXRzOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCXJjOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfcmF3Y2xvc2UoYnJkcD0leCxwb3J0cD0leCxhcmc9JXgsd2FpdD0lZClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIHBvcnRwLCAoaW50KSBhcmcsIHdhaXQpOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworLyoKKyAqCVNsYXZlIGlzIGFscmVhZHkgY2xvc2luZyB0aGlzIHBvcnQuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIGhhbmd1cAorICoJb2NjdXJzIG9uIHRoaXMgcG9ydC4KKyAqLworCWlmICh3YWl0KSB7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwb3J0cC0+cmF3X3dhaXQsCisJCQkJIXRlc3RfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKwl9CisKKy8qCisgKglXcml0ZSB0aGUgY2xvc2UgY29tbWFuZCBpbnRvIHNoYXJlZCBtZW1vcnkuCisgKi8KKwlFQlJERU5BQkxFKGJyZHApOworCWNwID0gJigodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcikpLT5jdHJsOworCWNwLT5jbG9zZWFyZyA9IGFyZzsKKwljcC0+Y2xvc2UgPSAxOworCWhkcnAgPSAodm9sYXRpbGUgY2RraGRyX3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBDREtfQ0RLQUREUik7CisJYml0cyA9ICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBoZHJwKSArIGJyZHAtPnNsYXZlb2Zmc2V0ICsKKwkJcG9ydHAtPnBvcnRpZHg7CisJKmJpdHMgfD0gcG9ydHAtPnBvcnRiaXQ7CisJRUJSRERJU0FCTEUoYnJkcCk7CisKKwlzZXRfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpOworCWlmICh3YWl0ID09IDApIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybigwKTsKKwl9CisKKy8qCisgKglTbGF2ZSBpcyBpbiBhY3Rpb24sIHNvIG5vdyB3ZSBtdXN0IHdhaXQgZm9yIHRoZSBvcGVuIGFja25vd2xlZGdtZW50CisgKgl0byBjb21lIGJhY2suCisgKi8KKwlyYyA9IDA7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9DTE9TSU5HLCAmcG9ydHAtPnN0YXRlKSk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWlmICgocmMgPT0gMCkgJiYgKHBvcnRwLT5yYyAhPSAwKSkKKwkJcmMgPSAtRUlPOworCXJldHVybihyYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNlbmQgYSBjb21tYW5kIHRvIHRoZSBzbGF2ZSBhbmQgd2FpdCBmb3IgdGhlIHJlc3BvbnNlLiBUaGlzIG11c3QKKyAqCWhhdmUgdXNlciBjb250ZXh0IChpdCBzbGVlcHMpLiBUaGlzIHJvdXRpbmUgaXMgZ2VuZXJpYyBpbiB0aGF0IGl0CisgKgljYW4gc2VuZCBhbnkgdHlwZSBvZiBjb21tYW5kLiBJdHMgcHVycG9zZSBpcyB0byB3YWl0IGZvciB0aGF0IGNvbW1hbmQKKyAqCXRvIGNvbXBsZXRlIChhcyBvcHBvc2VkIHRvIGluaXRpYXRpbmcgdGhlIGNvbW1hbmQgdGhlbiByZXR1cm5pbmcpLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9jbWR3YWl0KHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2NtZHdhaXQoYnJkcD0leCxwb3J0cD0leCxjbWQ9JXgsYXJnPSV4LHNpemU9JWQsIgorCQkiY29weWJhY2s9JWQpXG4iLCAoaW50KSBicmRwLCAoaW50KSBwb3J0cCwgKGludCkgY21kLAorCQkoaW50KSBhcmcsIHNpemUsIGNvcHliYWNrKTsKKyNlbmRpZgorCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJc3RsaV9zZW5kY21kKGJyZHAsIHBvcnRwLCBjbWQsIGFyZywgc2l6ZSwgY29weWJhY2spOworCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKKwkJCSF0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKHBvcnRwLT5yYyAhPSAwKQorCQlyZXR1cm4oLUVJTyk7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZW5kIHRoZSB0ZXJtaW9zIHNldHRpbmdzIGZvciB0aGlzIHBvcnQgdG8gdGhlIHNsYXZlLiBUaGlzIHNsZWVwcworICoJd2FpdGluZyBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgLSBzbyBtdXN0IGhhdmUgdXNlciBjb250ZXh0LgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9zZXRwb3J0KHN0bGlwb3J0X3QgKnBvcnRwKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlhc3lwb3J0X3QJYXBvcnQ7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9zZXRwb3J0KHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOworI2VuZGlmCisKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmIChwb3J0cC0+dHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSAmJiAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKworCXN0bGlfbWthc3lwb3J0KHBvcnRwLCAmYXBvcnQsIHBvcnRwLT50dHktPnRlcm1pb3MpOworCXJldHVybihzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUUE9SVCwgJmFwb3J0LCBzaXplb2YoYXN5cG9ydF90KSwgMCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglQb3NzaWJseSBuZWVkIHRvIHdhaXQgZm9yIGNhcnJpZXIgKERDRCBzaWduYWwpIHRvIGNvbWUgaGlnaC4gU2F5CisgKgltYXliZSBiZWNhdXNlIGlmIHdlIGFyZSBjbG9jYWwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHdhaXQuLi4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfd2FpdGNhcnJpZXIoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCXJjLCBkb2Nsb2NhbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3dhaXRjYXJyaWVyKGJyZHA9JXgscG9ydHA9JXgsZmlscD0leClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIHBvcnRwLCAoaW50KSBmaWxwKTsKKyNlbmRpZgorCisJcmMgPSAwOworCWRvY2xvY2FsID0gMDsKKworCWlmIChwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb2Nsb2NhbCsrOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJcG9ydHAtPm9wZW53YWl0Y250Kys7CisJaWYgKCEgdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydHAtPnJlZmNvdW50LS07CisKKwlmb3IgKDs7KSB7CisJCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgMSwgMSk7CisJCWlmICgocmMgPSBzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywKKwkJICAgICZwb3J0cC0+YXNpZywgc2l6ZW9mKGFzeXNpZ3NfdCksIDApKSA8IDApCisJCQlicmVhazsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICgocG9ydHAtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpID09IDApKSB7CisJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyYyA9IC1FQlVTWTsKKwkJCWVsc2UKKwkJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpID09IDApICYmCisJCSAgICAoZG9jbG9jYWwgfHwgKHBvcnRwLT5zaWdzICYgVElPQ01fQ0QpKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnBvcnRwLT5vcGVuX3dhaXQpOworCX0KKworCWlmICghIHR0eV9odW5nX3VwX3AoZmlscCkpCisJCXBvcnRwLT5yZWZjb3VudCsrOworCXBvcnRwLT5vcGVud2FpdGNudC0tOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJV3JpdGUgcm91dGluZS4gVGFrZSB0aGUgZGF0YSBhbmQgcHV0IGl0IGluIHRoZSBzaGFyZWQgbWVtb3J5IHJpbmcKKyAqCXF1ZXVlLiBJZiBwb3J0IGlzIG5vdCBhbHJlYWR5IHNlbmRpbmcgY2hhcnMgdGhlbiBuZWVkIHRvIG1hcmsgdGhlCisgKglzZXJ2aWNlIGJpdHMgZm9yIHRoaXMgcG9ydC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJdm9sYXRpbGUgY2RrYXN5X3QJKmFwOworCXZvbGF0aWxlIGNka2hkcl90CSpoZHJwOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmJpdHM7CisJdW5zaWduZWQgY2hhcgkJKnNoYnVmLCAqY2hidWY7CisJc3RsaXBvcnRfdAkJKnBvcnRwOworCXN0bGlicmRfdAkJKmJyZHA7CisJdW5zaWduZWQgaW50CQlsZW4sIHN0bGVuLCBoZWFkLCB0YWlsLCBzaXplOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfd3JpdGUodHR5PSV4LGJ1Zj0leCxjb3VudD0lZClcbiIsCisJCShpbnQpIHR0eSwgKGludCkgYnVmLCBjb3VudCk7CisjZW5kaWYKKworCWlmICgodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSB8fAorCSAgICAoc3RsaV90bXB3cml0ZWJ1ZiA9PSAoY2hhciAqKSBOVUxMKSkKKwkJcmV0dXJuKDApOworCWlmICh0dHkgPT0gc3RsaV90eGNvb2t0dHkpCisJCXN0bGlfZmx1c2hjaGFycyh0dHkpOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybigwKTsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJY2hidWYgPSAodW5zaWduZWQgY2hhciAqKSBidWY7CisKKy8qCisgKglBbGwgZGF0YSBpcyBub3cgbG9jYWwsIHNob3ZlIGFzIG11Y2ggYXMgcG9zc2libGUgaW50byBzaGFyZWQgbWVtb3J5LgorICovCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJRUJSREVOQUJMRShicmRwKTsKKwlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwloZWFkID0gKHVuc2lnbmVkIGludCkgYXAtPnR4cS5oZWFkOworCXRhaWwgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLnRhaWw7CisJaWYgKHRhaWwgIT0gKCh1bnNpZ25lZCBpbnQpIGFwLT50eHEudGFpbCkpCisJCXRhaWwgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLnRhaWw7CisJc2l6ZSA9IHBvcnRwLT50eHNpemU7CisJaWYgKGhlYWQgPj0gdGFpbCkgeworCQlsZW4gPSBzaXplIC0gKGhlYWQgLSB0YWlsKSAtIDE7CisJCXN0bGVuID0gc2l6ZSAtIGhlYWQ7CisJfSBlbHNlIHsKKwkJbGVuID0gdGFpbCAtIGhlYWQgLSAxOworCQlzdGxlbiA9IGxlbjsKKwl9CisKKwlsZW4gPSBNSU4obGVuLCBjb3VudCk7CisJY291bnQgPSAwOworCXNoYnVmID0gKGNoYXIgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+dHhvZmZzZXQpOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc3RsZW4gPSBNSU4obGVuLCBzdGxlbik7CisJCW1lbWNweSgoc2hidWYgKyBoZWFkKSwgY2hidWYsIHN0bGVuKTsKKwkJY2hidWYgKz0gc3RsZW47CisJCWxlbiAtPSBzdGxlbjsKKwkJY291bnQgKz0gc3RsZW47CisJCWhlYWQgKz0gc3RsZW47CisJCWlmIChoZWFkID49IHNpemUpIHsKKwkJCWhlYWQgPSAwOworCQkJc3RsZW4gPSB0YWlsOworCQl9CisJfQorCisJYXAgPSAodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcik7CisJYXAtPnR4cS5oZWFkID0gaGVhZDsKKwlpZiAodGVzdF9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKSkgeworCQlpZiAoYXAtPmNoYW5nZWQuZGF0YSAmIERUX1RYRU1QVFkpCisJCQlhcC0+Y2hhbmdlZC5kYXRhICY9IH5EVF9UWEVNUFRZOworCX0KKwloZHJwID0gKHZvbGF0aWxlIGNka2hkcl90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX0NES0FERFIpOworCWJpdHMgPSAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaGRycCkgKyBicmRwLT5zbGF2ZW9mZnNldCArCisJCXBvcnRwLT5wb3J0aWR4OworCSpiaXRzIHw9IHBvcnRwLT5wb3J0Yml0OworCXNldF9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKKwlFQlJERElTQUJMRShicmRwKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKGNvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJT3V0cHV0IGEgc2luZ2xlIGNoYXJhY3Rlci4gV2UgcHV0IGl0IGludG8gYSB0ZW1wb3JhcnkgbG9jYWwgYnVmZmVyCisgKgkoZm9yIHNwZWVkKSB0aGVuIHdyaXRlIG91dCB0aGF0IGJ1ZmZlciB3aGVuIHRoZSBmbHVzaGNoYXJzIHJvdXRpbmUKKyAqCWlzIGNhbGxlZC4gVGhlcmUgaXMgYSBzYWZldHkgY2F0Y2ggaGVyZSBzbyB0aGF0IGlmIHNvbWUgb3RoZXIgcG9ydAorICoJd3JpdGVzIGNoYXJzIGJlZm9yZSB0aGUgY3VycmVudCBidWZmZXIgaGFzIGJlZW4sIHRoZW4gd2Ugd3JpdGUgdGhlbQorICoJZmlyc3QgdGhlbSBkbyB0aGUgbmV3IHBvcnRzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfcHV0Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3B1dGNoYXIodHR5PSV4LGNoPSV4KVxuIiwgKGludCkgdHR5LCAoaW50KSBjaCk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAodHR5ICE9IHN0bGlfdHhjb29rdHR5KSB7CisJCWlmIChzdGxpX3R4Y29va3R0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJCXN0bGlfZmx1c2hjaGFycyhzdGxpX3R4Y29va3R0eSk7CisJCXN0bGlfdHhjb29rdHR5ID0gdHR5OworCX0KKworCXN0bGlfdHhjb29rYnVmW3N0bGlfdHhjb29rc2l6ZSsrXSA9IGNoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUcmFuc2ZlciBjaGFyYWN0ZXJzIGZyb20gdGhlIGxvY2FsIFRYIGNvb2tpbmcgYnVmZmVyIHRvIHRoZSBib2FyZC4KKyAqCVdlIHNvcnQgb2YgaWdub3JlIHRoZSB0dHkgdGhhdCBnZXRzIHBhc3NlZCBpbiBoZXJlLiBXZSByZWx5IG9uIHRoZQorICoJaW5mbyBzdG9yZWQgd2l0aCB0aGUgVFggY29vayBidWZmZXIgdG8gdGVsbCB1cyB3aGljaCBwb3J0IHRvIGZsdXNoCisgKgl0aGUgZGF0YSBvbi4gSW4gYW55IGNhc2Ugd2UgY2xlYW4gb3V0IHRoZSBUWCBjb29rIGJ1ZmZlciwgZm9yIHJlLXVzZQorICoJYnkgc29tZW9uZSBlbHNlLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfZmx1c2hjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXZvbGF0aWxlIGNka2hkcl90CSpoZHJwOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmJpdHM7CisJdm9sYXRpbGUgY2RrYXN5X3QJKmFwOworCXN0cnVjdCB0dHlfc3RydWN0CSpjb29rdHR5OworCXN0bGlwb3J0X3QJCSpwb3J0cDsKKwlzdGxpYnJkX3QJCSpicmRwOworCXVuc2lnbmVkIGludAkJbGVuLCBzdGxlbiwgaGVhZCwgdGFpbCwgc2l6ZSwgY291bnQsIGNvb2tzaXplOworCXVuc2lnbmVkIGNoYXIJCSpidWYsICpzaGJ1ZjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2ZsdXNoY2hhcnModHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJY29va3NpemUgPSBzdGxpX3R4Y29va3NpemU7CisJY29va3R0eSA9IHN0bGlfdHhjb29rdHR5OworCXN0bGlfdHhjb29rc2l6ZSA9IDA7CisJc3RsaV90eGNvb2tyZWFsc2l6ZSA9IDA7CisJc3RsaV90eGNvb2t0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTDsKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAoY29va3R0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICh0dHkgIT0gY29va3R0eSkKKwkJdHR5ID0gY29va3R0eTsKKwlpZiAoY29va3NpemUgPT0gMCkKKwkJcmV0dXJuOworCisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybjsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUVCUkRFTkFCTEUoYnJkcCk7CisKKwlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwloZWFkID0gKHVuc2lnbmVkIGludCkgYXAtPnR4cS5oZWFkOworCXRhaWwgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLnRhaWw7CisJaWYgKHRhaWwgIT0gKCh1bnNpZ25lZCBpbnQpIGFwLT50eHEudGFpbCkpCisJCXRhaWwgPSAodW5zaWduZWQgaW50KSBhcC0+dHhxLnRhaWw7CisJc2l6ZSA9IHBvcnRwLT50eHNpemU7CisJaWYgKGhlYWQgPj0gdGFpbCkgeworCQlsZW4gPSBzaXplIC0gKGhlYWQgLSB0YWlsKSAtIDE7CisJCXN0bGVuID0gc2l6ZSAtIGhlYWQ7CisJfSBlbHNlIHsKKwkJbGVuID0gdGFpbCAtIGhlYWQgLSAxOworCQlzdGxlbiA9IGxlbjsKKwl9CisKKwlsZW4gPSBNSU4obGVuLCBjb29rc2l6ZSk7CisJY291bnQgPSAwOworCXNoYnVmID0gKGNoYXIgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+dHhvZmZzZXQpOworCWJ1ZiA9IHN0bGlfdHhjb29rYnVmOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc3RsZW4gPSBNSU4obGVuLCBzdGxlbik7CisJCW1lbWNweSgoc2hidWYgKyBoZWFkKSwgYnVmLCBzdGxlbik7CisJCWJ1ZiArPSBzdGxlbjsKKwkJbGVuIC09IHN0bGVuOworCQljb3VudCArPSBzdGxlbjsKKwkJaGVhZCArPSBzdGxlbjsKKwkJaWYgKGhlYWQgPj0gc2l6ZSkgeworCQkJaGVhZCA9IDA7CisJCQlzdGxlbiA9IHRhaWw7CisJCX0KKwl9CisKKwlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwlhcC0+dHhxLmhlYWQgPSBoZWFkOworCisJaWYgKHRlc3RfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJaWYgKGFwLT5jaGFuZ2VkLmRhdGEgJiBEVF9UWEVNUFRZKQorCQkJYXAtPmNoYW5nZWQuZGF0YSAmPSB+RFRfVFhFTVBUWTsKKwl9CisJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwliaXRzID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGhkcnApICsgYnJkcC0+c2xhdmVvZmZzZXQgKworCQlwb3J0cC0+cG9ydGlkeDsKKwkqYml0cyB8PSBwb3J0cC0+cG9ydGJpdDsKKwlzZXRfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSk7CisKKwlFQlJERElTQUJMRShicmRwKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0bGlfd3JpdGVyb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdm9sYXRpbGUgY2RrYXN5cnFfdAkqcnA7CisJc3RsaXBvcnRfdAkJKnBvcnRwOworCXN0bGlicmRfdAkJKmJyZHA7CisJdW5zaWduZWQgaW50CQloZWFkLCB0YWlsLCBsZW47CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV93cml0ZXJvb20odHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICh0dHkgPT0gc3RsaV90eGNvb2t0dHkpIHsKKwkJaWYgKHN0bGlfdHhjb29rcmVhbHNpemUgIT0gMCkgeworCQkJbGVuID0gc3RsaV90eGNvb2tyZWFsc2l6ZSAtIHN0bGlfdHhjb29rc2l6ZTsKKwkJCXJldHVybihsZW4pOworCQl9CisJfQorCisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuKDApOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUVCUkRFTkFCTEUoYnJkcCk7CisJcnAgPSAmKCh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKSktPnR4cTsKKwloZWFkID0gKHVuc2lnbmVkIGludCkgcnAtPmhlYWQ7CisJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIHJwLT50YWlsOworCWlmICh0YWlsICE9ICgodW5zaWduZWQgaW50KSBycC0+dGFpbCkpCisJCXRhaWwgPSAodW5zaWduZWQgaW50KSBycC0+dGFpbDsKKwlsZW4gPSAoaGVhZCA+PSB0YWlsKSA/IChwb3J0cC0+dHhzaXplIC0gKGhlYWQgLSB0YWlsKSkgOiAodGFpbCAtIGhlYWQpOworCWxlbi0tOworCUVCUkRESVNBQkxFKGJyZHApOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJaWYgKHR0eSA9PSBzdGxpX3R4Y29va3R0eSkgeworCQlzdGxpX3R4Y29va3JlYWxzaXplID0gbGVuOworCQlsZW4gLT0gc3RsaV90eGNvb2tzaXplOworCX0KKwlyZXR1cm4obGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgdHJhbnNtaXQgYnVmZmVyLiBOb3JtYWxseSB3ZQorICoJd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFycyBpbiB0aGUgc2hhcmVkIG1lbW9yeSByaW5nIHF1ZXVlLgorICoJV2UgbmVlZCB0byBrbHVkZ2UgYXJvdW5kIHRoZSBjYXNlIHdoZXJlIHRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBpcworICoJZW1wdHkgYnV0IG5vdCBhbGwgY2hhcmFjdGVycyBoYXZlIGRyYWluZWQgeWV0LCBmb3IgdGhpcyBjYXNlIGp1c3QKKyAqCXJldHVybiB0aGF0IHRoZXJlIGlzIDEgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIhCisgKi8KKworc3RhdGljIGludCBzdGxpX2NoYXJzaW5idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl2b2xhdGlsZSBjZGthc3lycV90CSpycDsKKwlzdGxpcG9ydF90CQkqcG9ydHA7CisJc3RsaWJyZF90CQkqYnJkcDsKKwl1bnNpZ25lZCBpbnQJCWhlYWQsIHRhaWwsIGxlbjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2NoYXJzaW5idWZmZXIodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICh0dHkgPT0gc3RsaV90eGNvb2t0dHkpCisJCXN0bGlfZmx1c2hjaGFycyh0dHkpOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybigwKTsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlFQlJERU5BQkxFKGJyZHApOworCXJwID0gJigodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcikpLT50eHE7CisJaGVhZCA9ICh1bnNpZ25lZCBpbnQpIHJwLT5oZWFkOworCXRhaWwgPSAodW5zaWduZWQgaW50KSBycC0+dGFpbDsKKwlpZiAodGFpbCAhPSAoKHVuc2lnbmVkIGludCkgcnAtPnRhaWwpKQorCQl0YWlsID0gKHVuc2lnbmVkIGludCkgcnAtPnRhaWw7CisJbGVuID0gKGhlYWQgPj0gdGFpbCkgPyAoaGVhZCAtIHRhaWwpIDogKHBvcnRwLT50eHNpemUgLSAodGFpbCAtIGhlYWQpKTsKKwlpZiAoKGxlbiA9PSAwKSAmJiB0ZXN0X2JpdChTVF9UWEJVU1ksICZwb3J0cC0+c3RhdGUpKQorCQlsZW4gPSAxOworCUVCUkRESVNBQkxFKGJyZHApOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKGxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUdlbmVyYXRlIHRoZSBzZXJpYWwgc3RydWN0IGluZm8uCisgKi8KKworc3RhdGljIGludCBzdGxpX2dldHNlcmlhbChzdGxpcG9ydF90ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdAlzaW87CisJc3RsaWJyZF90CQkqYnJkcDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX2dldHNlcmlhbChwb3J0cD0leCxzcD0leClcbiIsIChpbnQpIHBvcnRwLCAoaW50KSBzcCk7CisjZW5kaWYKKworCW1lbXNldCgmc2lvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKTsKKwlzaW8udHlwZSA9IFBPUlRfVU5LTk9XTjsKKwlzaW8ubGluZSA9IHBvcnRwLT5wb3J0bnI7CisJc2lvLmlycSA9IDA7CisJc2lvLmZsYWdzID0gcG9ydHAtPmZsYWdzOworCXNpby5iYXVkX2Jhc2UgPSBwb3J0cC0+YmF1ZF9iYXNlOworCXNpby5jbG9zZV9kZWxheSA9IHBvcnRwLT5jbG9zZV9kZWxheTsKKwlzaW8uY2xvc2luZ193YWl0ID0gcG9ydHAtPmNsb3Npbmdfd2FpdDsKKwlzaW8uY3VzdG9tX2Rpdmlzb3IgPSBwb3J0cC0+Y3VzdG9tX2Rpdmlzb3I7CisJc2lvLnhtaXRfZmlmb19zaXplID0gMDsKKwlzaW8uaHViNiA9IDA7CisKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgIT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlzaW8ucG9ydCA9IGJyZHAtPmlvYmFzZTsKKwkJCisJcmV0dXJuIGNvcHlfdG9fdXNlcihzcCwgJnNpbywgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkgPworCQkJLUVGQVVMVCA6IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNldCBwb3J0IGFjY29yZGluZyB0byB0aGUgc2VyaWFsIHN0cnVjdCBpbmZvLgorICoJQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgZG8gYW55IGF1dG8tY29uZmlndXJlIHN0dWZmLCBzbyB3ZSB3aWxsCisgKglqdXN0IHF1aWV0bHkgaWdub3JlIGFueSByZXF1ZXN0cyB0byBjaGFuZ2UgaXJxLCBldGMuCisgKi8KKworc3RhdGljIGludCBzdGxpX3NldHNlcmlhbChzdGxpcG9ydF90ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdAlzaW87CisJaW50CQkJcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9zZXRzZXJpYWwocG9ydHA9JXAsc3A9JXApXG4iLCBwb3J0cCwgc3ApOworI2VuZGlmCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNpbywgc3AsIHNpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChzaW8uYmF1ZF9iYXNlICE9IHBvcnRwLT5iYXVkX2Jhc2UpIHx8CisJCSAgICAoc2lvLmNsb3NlX2RlbGF5ICE9IHBvcnRwLT5jbG9zZV9kZWxheSkgfHwKKwkJICAgICgoc2lvLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgICAgKHBvcnRwLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJcmV0dXJuKC1FUEVSTSk7CisJfSAKKworCXBvcnRwLT5mbGFncyA9IChwb3J0cC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKwkJKHNpby5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKTsKKwlwb3J0cC0+YmF1ZF9iYXNlID0gc2lvLmJhdWRfYmFzZTsKKwlwb3J0cC0+Y2xvc2VfZGVsYXkgPSBzaW8uY2xvc2VfZGVsYXk7CisJcG9ydHAtPmNsb3Npbmdfd2FpdCA9IHNpby5jbG9zaW5nX3dhaXQ7CisJcG9ydHAtPmN1c3RvbV9kaXZpc29yID0gc2lvLmN1c3RvbV9kaXZpc29yOworCisJaWYgKChyYyA9IHN0bGlfc2V0cG9ydChwb3J0cCkpIDwgMCkKKwkJcmV0dXJuKHJjKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzdGxpX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0bGlwb3J0X3QgKnBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdGxpYnJkX3QgKmJyZHA7CisJaW50IHJjOworCisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybigtRU5PREVWKTsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm4oMCk7CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJcmV0dXJuKC1FSU8pOworCisJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9HRVRTSUdOQUxTLAorCQkJICAgICAgICZwb3J0cC0+YXNpZywgc2l6ZW9mKGFzeXNpZ3NfdCksIDEpKSA8IDApCisJCXJldHVybihyYyk7CisKKwlyZXR1cm4gc3RsaV9ta3Rpb2NtKHBvcnRwLT5hc2lnLnNpZ3ZhbHVlKTsKK30KKworc3RhdGljIGludCBzdGxpX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdGxpcG9ydF90ICpwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RsaWJyZF90ICpicmRwOworCWludCBydHMgPSAtMSwgZHRyID0gLTE7CisKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybigwKTsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4oLUVJTyk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlydHMgPSAxOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWR0ciA9IDE7CisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlydHMgPSAwOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJZHRyID0gMDsKKworCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgZHRyLCBydHMpOworCisJcmV0dXJuIHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRTSUdOQUxTLCAmcG9ydHAtPmFzaWcsCisJCQkgICAgc2l6ZW9mKGFzeXNpZ3NfdCksIDApOworfQorCitzdGF0aWMgaW50IHN0bGlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXN0bGlicmRfdAkqYnJkcDsKKwl1bnNpZ25lZCBpbnQJaXZhbDsKKwlpbnQJCXJjOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfaW9jdGwodHR5PSV4LGZpbGU9JXgsY21kPSV4LGFyZz0leClcbiIsCisJCShpbnQpIHR0eSwgKGludCkgZmlsZSwgY21kLCAoaW50KSBhcmcpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuKDApOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigwKTsKKworCWlmICgoY21kICE9IFRJT0NHU0VSSUFMKSAmJiAoY21kICE9IFRJT0NTU0VSSUFMKSAmJgorIAkgICAgKGNtZCAhPSBDT01fR0VUUE9SVFNUQVRTKSAmJiAoY21kICE9IENPTV9DTFJQT1JUU1RBVFMpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJCXJldHVybigtRUlPKTsKKwl9CisKKwlyYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCQlyYyA9IHB1dF91c2VyKCgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSA/IDEgOiAwKSwKKwkJCSh1bnNpZ25lZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU1NPRlRDQVI6CisJCWlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgX191c2VyICopIGFyZykpID09IDApCisJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkJCSh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkJKGl2YWwgPyBDTE9DQUwgOiAwKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmMgPSBzdGxpX2dldHNlcmlhbChwb3J0cCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgVElPQ1NTRVJJQUw6CisJCXJjID0gc3RsaV9zZXRzZXJpYWwocG9ydHAsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFNUTF9HRVRQRkxBRzoKKwkJcmMgPSBwdXRfdXNlcihwb3J0cC0+cGZsYWcsICh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBTVExfU0VUUEZMQUc6CisJCWlmICgocmMgPSBnZXRfdXNlcihwb3J0cC0+cGZsYWcsICh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKSkgPT0gMCkKKwkJCXN0bGlfc2V0cG9ydChwb3J0cCk7CisJCWJyZWFrOworCWNhc2UgQ09NX0dFVFBPUlRTVEFUUzoKKwkJcmMgPSBzdGxpX2dldHBvcnRzdGF0cyhwb3J0cCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgQ09NX0NMUlBPUlRTVEFUUzoKKwkJcmMgPSBzdGxpX2NscnBvcnRzdGF0cyhwb3J0cCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgVElPQ1NFUkNPTkZJRzoKKwljYXNlIFRJT0NTRVJHV0lMRDoKKwljYXNlIFRJT0NTRVJTV0lMRDoKKwljYXNlIFRJT0NTRVJHRVRMU1I6CisJY2FzZSBUSU9DU0VSR1NUUlVDVDoKKwljYXNlIFRJT0NTRVJHRVRNVUxUSToKKwljYXNlIFRJT0NTRVJTRVRNVUxUSToKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB3ZSBoYXZlIHVzZXIgY29udGV4dCBhbmQgY2FuIHNsZWVwLgorICoJTG9va3MgbGlrZSBpdCBpcyB0cnVlIGZvciB0aGUgY3VycmVudCB0dHlzIGltcGxlbWVudGF0aW9uLi4hIQorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfc2V0dGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXN0bGlicmRfdAkqYnJkcDsKKwlzdHJ1Y3QgdGVybWlvcwkqdGlvc3A7CisJYXN5cG9ydF90CWFwb3J0OworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfc2V0dGVybWlvcyh0dHk9JXgsb2xkPSV4KVxuIiwgKGludCkgdHR5LCAoaW50KSBvbGQpOworI2VuZGlmCisKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybjsKKworCXRpb3NwID0gdHR5LT50ZXJtaW9zOworCWlmICgodGlvc3AtPmNfY2ZsYWcgPT0gb2xkLT5jX2NmbGFnKSAmJgorCSAgICAodGlvc3AtPmNfaWZsYWcgPT0gb2xkLT5jX2lmbGFnKSkKKwkJcmV0dXJuOworCisJc3RsaV9ta2FzeXBvcnQocG9ydHAsICZhcG9ydCwgdGlvc3ApOworCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRQT1JULCAmYXBvcnQsIHNpemVvZihhc3lwb3J0X3QpLCAwKTsKKwlzdGxpX21rYXN5c2lncygmcG9ydHAtPmFzaWcsICgodGlvc3AtPmNfY2ZsYWcgJiBDQkFVRCkgPyAxIDogMCksIC0xKTsKKwlzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywgJnBvcnRwLT5hc2lnLAorCQlzaXplb2YoYXN5c2lnc190KSwgMCk7CisJaWYgKChvbGQtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAoKHRpb3NwLT5jX2NmbGFnICYgQ1JUU0NUUykgPT0gMCkpCisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJaWYgKCgob2xkLT5jX2NmbGFnICYgQ0xPQ0FMKSA9PSAwKSAmJiAodGlvc3AtPmNfY2ZsYWcgJiBDTE9DQUwpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5vcGVuX3dhaXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglBdHRlbXB0IHRvIGZsb3cgY29udHJvbCB3aG8gZXZlciBpcyBzZW5kaW5nIHVzIGRhdGEuIFdlIHdvbid0IHJlYWxseQorICoJZG8gYW55IGZsb3cgY29udHJvbCBhY3Rpb24gaGVyZS4gV2UgY2FuJ3QgZGlyZWN0bHksIGFuZCBldmVuIGlmIHdlCisgKgl3YW50ZWQgdG8gd2Ugd291bGQgaGF2ZSB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgc2xhdmUuIFRoZSBzbGF2ZQorICoJa25vd3MgaG93IHRvIGZsb3cgY29udHJvbCwgYW5kIHdpbGwgZG8gc28gd2hlbiBpdHMgYnVmZmVycyByZWFjaCBpdHMKKyAqCWludGVybmFsIGhpZ2ggd2F0ZXIgbWFya3MuIFNvIHdoYXQgd2Ugd2lsbCBkbyBpcyBzZXQgYSBsb2NhbCBzdGF0ZQorICoJYml0IHRoYXQgd2lsbCBzdG9wIHVzIHNlbmRpbmcgYW55IFJYIGRhdGEgdXAgZnJvbSB0aGUgcG9sbCByb3V0aW5lCisgKgkod2hpY2ggaXMgdGhlIHBsYWNlIHdoZXJlIFJYIGRhdGEgZnJvbSB0aGUgc2xhdmUgaXMgaGFuZGxlZCkuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfdGhyb3R0bGUodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2V0X2JpdChTVF9SWFNUT1AsICZwb3J0cC0+c3RhdGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglVbmZsb3cgY29udHJvbCB0aGUgZGV2aWNlIHNlbmRpbmcgdXMgZGF0YS4uLiBUaGF0IG1lYW5zIHRoYXQgYWxsCisgKgl3ZSBoYXZlIHRvIGRvIGlzIGNsZWFyIHRoZSBSWFNUT1Agc3RhdGUgYml0LiBUaGUgbmV4dCBwb2xsIGNhbGwKKyAqCXdpbGwgdGhlbiBiZSBhYmxlIHRvIHBhc3MgdGhlIFJYIGRhdGEgYmFjayB1cC4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3VudGhyb3R0bGUodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJY2xlYXJfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVN0b3AgdGhlIHRyYW5zbWl0dGVyLiBCYXNpY2FsbHkgdG8gZG8gdGhpcyB3ZSB3aWxsIGp1c3QgdHVybiBUWAorICoJaW50ZXJydXB0cyBvZmYuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RsaWJyZF90CSpicmRwOworCXN0bGlwb3J0X3QJKnBvcnRwOworCWFzeWN0cmxfdAlhY3RybDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJzdGxpX3N0b3AodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmFjdHJsLCAwLCBzaXplb2YoYXN5Y3RybF90KSk7CisJYWN0cmwudHhjdHJsID0gQ1RfU1RPUEZMT1c7CisjaWYgMAorCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9QT1JUQ1RSTCwgJmFjdHJsLCBzaXplb2YoYXN5Y3RybF90KSwgMCk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU3RhcnQgdGhlIHRyYW5zbWl0dGVyIGFnYWluLiBKdXN0IHR1cm4gVFggaW50ZXJydXB0cyBiYWNrIG9uLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlzdGxpYnJkX3QJKmJyZHA7CisJYXN5Y3RybF90CWFjdHJsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoInN0bGlfc3RhcnQodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmFjdHJsLCAwLCBzaXplb2YoYXN5Y3RybF90KSk7CisJYWN0cmwudHhjdHJsID0gQ1RfU1RBUlRGTE9XOworI2lmIDAKKwlzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfUE9SVENUUkwsICZhY3RybCwgc2l6ZW9mKGFzeWN0cmxfdCksIDApOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNjaGVkdWxlciBjYWxsZWQgaGFuZyB1cCByb3V0aW5lLiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBzY2hlZHVsZXIsCisgKglub3QgZGlyZWN0IGZyb20gdGhlIGRyaXZlciAicG9sbCIgcm91dGluZS4gV2UgY2FuJ3QgY2FsbCBpdCB0aGVyZQorICoJc2luY2UgdGhlIHJlYWwgbG9jYWwgaGFuZ3VwIGNvZGUgd2lsbCBlbmFibGUvZGlzYWJsZSB0aGUgYm9hcmQgYW5kCisgKglvdGhlciB0aGluZ3MgdGhhdCB3ZSBjYW4ndCBkbyB3aGlsZSBoYW5kbGluZyB0aGUgcG9sbC4gTXVjaCBlYXNpZXIKKyAqCXRvIGRlYWwgd2l0aCBpdCBzb21lIHRpbWUgbGF0ZXIgKGRvbid0IHJlYWxseSBjYXJlIHdoZW4sIGhhbmd1cHMKKyAqCWFyZW4ndCB0aGF0IHRpbWUgY3JpdGljYWwpLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfZG9oYW5ndXAodm9pZCAqYXJnKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9kb2hhbmd1cChwb3J0cD0leClcbiIsIChpbnQpIGFyZyk7CisjZW5kaWYKKworCS8qCisJICogRklYTUU6IFRoZXJlJ3MgYSBtb2R1bGUgcmVtb3ZhbCByYWNlIGhlcmU6IHR0eV9oYW5ndXAKKwkgKiBjYWxscyBzY2hlZHVsZV93b3JrIHdoaWNoIHdpbGwgY2FsbCBpbnRvIHRoaXMKKwkgKiBkcml2ZXIgbGF0ZXIuCisJICovCisJcG9ydHAgPSAoc3RsaXBvcnRfdCAqKSBhcmc7CisJaWYgKHBvcnRwICE9IChzdGxpcG9ydF90ICopIE5VTEwpIHsKKwkJaWYgKHBvcnRwLT50dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHsKKwkJCXR0eV9oYW5ndXAocG9ydHAtPnR0eSk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUhhbmd1cCB0aGlzIHBvcnQuIFRoaXMgaXMgcHJldHR5IG11Y2ggbGlrZSBjbG9zaW5nIHRoZSBwb3J0LCBvbmx5CisgKglhIGxpdHRsZSBtb3JlIGJydXRhbC4gTm8gd2FpdGluZyBmb3IgZGF0YSB0byBkcmFpbi4gU2h1dGRvd24gdGhlCisgKglwb3J0IGFuZCBtYXliZSBkcm9wIHNpZ25hbHMuIFRoaXMgaXMgcmF0aGVyIHRyaWNreSByZWFsbHkuIFdlIHdhbnQKKyAqCXRvIGNsb3NlIHRoZSBwb3J0IGFzIHdlbGwuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlzdGxpYnJkX3QJKmJyZHA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaGFuZ3VwKHR0eT0leClcbiIsIChpbnQpIHR0eSk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm47CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWlmICghIHRlc3RfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpKQorCQlzdGxpX3Jhd2Nsb3NlKGJyZHAsIHBvcnRwLCAwLCAwKTsKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIHsKKwkJc3RsaV9ta2FzeXNpZ3MoJnBvcnRwLT5hc2lnLCAwLCAwKTsKKwkJaWYgKHRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJCXNldF9iaXQoU1RfRE9TSUdTLCAmcG9ydHAtPnN0YXRlKTsKKwkJCXNldF9iaXQoU1RfRE9GTFVTSFRYLCAmcG9ydHAtPnN0YXRlKTsKKwkJCXNldF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCXN0bGlfc2VuZGNtZChicmRwLCBwb3J0cCwgQV9TRVRTSUdOQUxTRiwKKwkJCQkmcG9ydHAtPmFzaWcsIHNpemVvZihhc3lzaWdzX3QpLCAwKTsKKwkJfQorCX0KKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWNsZWFyX2JpdChTVF9UWEJVU1ksICZwb3J0cC0+c3RhdGUpOworCWNsZWFyX2JpdChTVF9SWFNUT1AsICZwb3J0cC0+c3RhdGUpOworCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CisJcG9ydHAtPnR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMOworCXBvcnRwLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlwb3J0cC0+cmVmY291bnQgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPm9wZW5fd2FpdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZsdXNoIGNoYXJhY3RlcnMgZnJvbSB0aGUgbG93ZXIgYnVmZmVyLiBXZSBtYXkgbm90IGhhdmUgdXNlciBjb250ZXh0CisgKglzbyB3ZSBjYW5ub3Qgc2xlZXAgd2FpdGluZyBmb3IgaXQgdG8gY29tcGxldGUuIEFsc28gd2UgbmVlZCB0byBjaGVjaworICoJaWYgdGhlcmUgaXMgY2hhcnMgZm9yIHRoaXMgcG9ydCBpbiB0aGUgVFggY29vayBidWZmZXIsIGFuZCBmbHVzaCB0aGVtCisgKglhcyB3ZWxsLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfZmx1c2hidWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlzdGxpYnJkX3QJKmJyZHA7CisJdW5zaWduZWQgbG9uZwlmdHlwZSwgZmxhZ3M7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2ZsdXNoYnVmZmVyKHR0eT0leClcbiIsIChpbnQpIHR0eSk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKwlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCQlyZXR1cm47CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJaWYgKHR0eSA9PSBzdGxpX3R4Y29va3R0eSkgeworCQlzdGxpX3R4Y29va3R0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMOworCQlzdGxpX3R4Y29va3NpemUgPSAwOworCQlzdGxpX3R4Y29va3JlYWxzaXplID0gMDsKKwl9CisJaWYgKHRlc3RfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJc2V0X2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpOworCX0gZWxzZSB7CisJCWZ0eXBlID0gRkxVU0hUWDsKKwkJaWYgKHRlc3RfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJCWZ0eXBlIHw9IEZMVVNIUlg7CisJCQljbGVhcl9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKTsKKwkJfQorCQlzdGxpX3NlbmRjbWQoYnJkcCwgcG9ydHAsIEFfRkxVU0gsICZmdHlwZSwKKwkJCXNpemVvZih1bnNpZ25lZCBsb25nKSwgMCk7CisJfQorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCWlmICgodHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJgorCSAgICB0dHktPmxkaXNjLndyaXRlX3dha2V1cCkKKwkJKHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKSh0dHkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfYnJlYWtjdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0YXRlKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlsb25nCQlhcmc7CisJLyogbG9uZyBzYXZlc3RhdGUsIHNhdmV0aW1lOyAqLworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9icmVha2N0bCh0dHk9JXgsc3RhdGU9JWQpXG4iLCAoaW50KSB0dHksIHN0YXRlKTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKy8qCisgKglEdWUgdG8gYSBidWcgaW4gdGhlIHR0eSBzZW5kX2JyZWFrKCkgY29kZSB3ZSBuZWVkIHRvIHByZXNlcnZlCisgKgl0aGUgY3VycmVudCBwcm9jZXNzIHN0YXRlIGFuZCB0aW1lb3V0Li4uCisJc2F2ZXRpbWUgPSBjdXJyZW50LT50aW1lb3V0OworCXNhdmVzdGF0ZSA9IGN1cnJlbnQtPnN0YXRlOworICovCisKKwlhcmcgPSAoc3RhdGUgPT0gLTEpID8gQlJFQUtPTiA6IEJSRUFLT0ZGOworCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9CUkVBSywgJmFyZywgc2l6ZW9mKGxvbmcpLCAwKTsKKworLyoKKyAqCisJY3VycmVudC0+dGltZW91dCA9IHNhdmV0aW1lOworCWN1cnJlbnQtPnN0YXRlID0gc2F2ZXN0YXRlOworICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV93YWl0dW50aWxzZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCXVuc2lnbmVkIGxvbmcJdGVuZDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfd2FpdHVudGlsc2VudCh0dHk9JXgsdGltZW91dD0leClcbiIsIChpbnQpIHR0eSwgdGltZW91dCk7CisjZW5kaWYKKworCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCXJldHVybjsKKworCWlmICh0aW1lb3V0ID09IDApCisJCXRpbWVvdXQgPSBIWjsKKwl0ZW5kID0gamlmZmllcyArIHRpbWVvdXQ7CisKKwl3aGlsZSAodGVzdF9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKSkgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMjApOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0ZW5kKSkKKwkJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX3NlbmR4Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCXN0bGlicmRfdAkqYnJkcDsKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwlhc3ljdHJsX3QJYWN0cmw7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3NlbmR4Y2hhcih0dHk9JXgsY2g9JXgpXG4iLCAoaW50KSB0dHksIGNoKTsKKyNlbmRpZgorCisJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJcmV0dXJuOworCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJCXJldHVybjsKKwlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmFjdHJsLCAwLCBzaXplb2YoYXN5Y3RybF90KSk7CisJaWYgKGNoID09IFNUT1BfQ0hBUih0dHkpKSB7CisJCWFjdHJsLnJ4Y3RybCA9IENUX1NUT1BGTE9XOworCX0gZWxzZSBpZiAoY2ggPT0gU1RBUlRfQ0hBUih0dHkpKSB7CisJCWFjdHJsLnJ4Y3RybCA9IENUX1NUQVJURkxPVzsKKwl9IGVsc2UgeworCQlhY3RybC50eGN0cmwgPSBDVF9TRU5EQ0hSOworCQlhY3RybC50eGltZGNoID0gY2g7CisJfQorCisJc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX1BPUlRDVFJMLCAmYWN0cmwsIHNpemVvZihhc3ljdHJsX3QpLCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCU1BWExJTkUJCTgwCisKKy8qCisgKglGb3JtYXQgaW5mbyBmb3IgYSBzcGVjaWZpZWQgcG9ydC4gVGhlIGxpbmUgaXMgZGVsaWJlcmF0ZWx5IGxpbWl0ZWQKKyAqCXRvIDgwIGNoYXJhY3RlcnMuIChJZiBpdCBpcyB0b28gbG9uZyBpdCB3aWxsIGJlIHRydW5jYXRlZCwgaWYgdG9vCisgKglzaG9ydCB0aGVuIHBhZGRlZCB3aXRoIHNwYWNlcykuCisgKi8KKworc3RhdGljIGludCBzdGxpX3BvcnRpbmZvKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIGludCBwb3J0bnIsIGNoYXIgKnBvcykKK3sKKwljaGFyCSpzcCwgKnVhcnQ7CisJaW50CXJjLCBjbnQ7CisKKwlyYyA9IHN0bGlfcG9ydGNtZHN0YXRzKHBvcnRwKTsKKworCXVhcnQgPSAiVU5LTk9XTiI7CisJaWYgKGJyZHAtPnN0YXRlICYgQlNUX1NUQVJURUQpIHsKKwkJc3dpdGNoIChzdGxpX2NvbXN0YXRzLmh3aWQpIHsKKwkJY2FzZSAwOgkJdWFydCA9ICIyNjgxIjsgYnJlYWs7CisJCWNhc2UgMToJCXVhcnQgPSAiU0MyNjE5OCI7IGJyZWFrOworCQlkZWZhdWx0Ogl1YXJ0ID0gIkNEMTQwMCI7IGJyZWFrOworCQl9CisJfQorCisJc3AgPSBwb3M7CisJc3AgKz0gc3ByaW50ZihzcCwgIiVkOiB1YXJ0OiVzICIsIHBvcnRuciwgdWFydCk7CisKKwlpZiAoKGJyZHAtPnN0YXRlICYgQlNUX1NUQVJURUQpICYmIChyYyA+PSAwKSkgeworCQlzcCArPSBzcHJpbnRmKHNwLCAidHg6JWQgcng6JWQiLCAoaW50KSBzdGxpX2NvbXN0YXRzLnR4dG90YWwsCisJCQkoaW50KSBzdGxpX2NvbXN0YXRzLnJ4dG90YWwpOworCisJCWlmIChzdGxpX2NvbXN0YXRzLnJ4ZnJhbWluZykKKwkJCXNwICs9IHNwcmludGYoc3AsICIgZmU6JWQiLAorCQkJCShpbnQpIHN0bGlfY29tc3RhdHMucnhmcmFtaW5nKTsKKwkJaWYgKHN0bGlfY29tc3RhdHMucnhwYXJpdHkpCisJCQlzcCArPSBzcHJpbnRmKHNwLCAiIHBlOiVkIiwKKwkJCQkoaW50KSBzdGxpX2NvbXN0YXRzLnJ4cGFyaXR5KTsKKwkJaWYgKHN0bGlfY29tc3RhdHMucnhicmVha3MpCisJCQlzcCArPSBzcHJpbnRmKHNwLCAiIGJyazolZCIsCisJCQkJKGludCkgc3RsaV9jb21zdGF0cy5yeGJyZWFrcyk7CisJCWlmIChzdGxpX2NvbXN0YXRzLnJ4b3ZlcnJ1bikKKwkJCXNwICs9IHNwcmludGYoc3AsICIgb2U6JWQiLAorCQkJCShpbnQpIHN0bGlfY29tc3RhdHMucnhvdmVycnVuKTsKKworCQljbnQgPSBzcHJpbnRmKHNwLCAiJXMlcyVzJXMlcyAiLAorCQkJKHN0bGlfY29tc3RhdHMuc2lnbmFscyAmIFRJT0NNX1JUUykgPyAifFJUUyIgOiAiIiwKKwkJCShzdGxpX2NvbXN0YXRzLnNpZ25hbHMgJiBUSU9DTV9DVFMpID8gInxDVFMiIDogIiIsCisJCQkoc3RsaV9jb21zdGF0cy5zaWduYWxzICYgVElPQ01fRFRSKSA/ICJ8RFRSIiA6ICIiLAorCQkJKHN0bGlfY29tc3RhdHMuc2lnbmFscyAmIFRJT0NNX0NEKSA/ICJ8RENEIiA6ICIiLAorCQkJKHN0bGlfY29tc3RhdHMuc2lnbmFscyAmIFRJT0NNX0RTUikgPyAifERTUiIgOiAiIik7CisJCSpzcCA9ICcgJzsKKwkJc3AgKz0gY250OworCX0KKworCWZvciAoY250ID0gKHNwIC0gcG9zKTsgKGNudCA8IChNQVhMSU5FIC0gMSkpOyBjbnQrKykKKwkJKnNwKysgPSAnICc7CisJaWYgKGNudCA+PSBNQVhMSU5FKQorCQlwb3NbKE1BWExJTkUgLSAyKV0gPSAnKyc7CisJcG9zWyhNQVhMSU5FIC0gMSldID0gJ1xuJzsKKworCXJldHVybihNQVhMSU5FKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUG9ydCBpbmZvLCByZWFkIGZyb20gdGhlIC9wcm9jIGZpbGUgc3lzdGVtLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9yZWFkcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJc3RsaXBvcnRfdAkqcG9ydHA7CisJaW50CQlicmRuciwgcG9ydG5yLCB0b3RhbHBvcnQ7CisJaW50CQljdXJvZmYsIG1heG9mZjsKKwljaGFyCQkqcG9zOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9yZWFkcHJvYyhwYWdlPSV4LHN0YXJ0PSV4LG9mZj0leCxjb3VudD0lZCxlb2Y9JXgsIgorCQkiZGF0YT0leFxuIiwgKGludCkgcGFnZSwgKGludCkgc3RhcnQsIChpbnQpIG9mZiwgY291bnQsCisJCShpbnQpIGVvZiwgKGludCkgZGF0YSk7CisjZW5kaWYKKworCXBvcyA9IHBhZ2U7CisJdG90YWxwb3J0ID0gMDsKKwljdXJvZmYgPSAwOworCisJaWYgKG9mZiA9PSAwKSB7CisJCXBvcyArPSBzcHJpbnRmKHBvcywgIiVzOiB2ZXJzaW9uICVzIiwgc3RsaV9kcnZ0aXRsZSwKKwkJCXN0bGlfZHJ2dmVyc2lvbik7CisJCXdoaWxlIChwb3MgPCAocGFnZSArIE1BWExJTkUgLSAxKSkKKwkJCSpwb3MrKyA9ICcgJzsKKwkJKnBvcysrID0gJ1xuJzsKKwl9CisJY3Vyb2ZmID0gIE1BWExJTkU7CisKKy8qCisgKglXZSBzY2FuIHRocm91Z2ggZm9yIGVhY2ggYm9hcmQsIHBhbmVsIGFuZCBwb3J0LiBUaGUgb2Zmc2V0IGlzCisgKgljYWxjdWxhdGVkIG9uIHRoZSBmbHksIGFuZCBpcnJlbGV2YW50IHBvcnRzIGFyZSBza2lwcGVkLgorICovCisJZm9yIChicmRuciA9IDA7IChicmRuciA8IHN0bGlfbnJicmRzKTsgYnJkbnIrKykgeworCQlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKKwkJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJY29udGludWU7CisJCWlmIChicmRwLT5zdGF0ZSA9PSAwKQorCQkJY29udGludWU7CisKKwkJbWF4b2ZmID0gY3Vyb2ZmICsgKGJyZHAtPm5ycG9ydHMgKiBNQVhMSU5FKTsKKwkJaWYgKG9mZiA+PSBtYXhvZmYpIHsKKwkJCWN1cm9mZiA9IG1heG9mZjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdG90YWxwb3J0ID0gYnJkbnIgKiBTVExfTUFYUE9SVFM7CisJCWZvciAocG9ydG5yID0gMDsgKHBvcnRuciA8IGJyZHAtPm5ycG9ydHMpOyBwb3J0bnIrKywKKwkJICAgIHRvdGFscG9ydCsrKSB7CisJCQlwb3J0cCA9IGJyZHAtPnBvcnRzW3BvcnRucl07CisJCQlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChvZmYgPj0gKGN1cm9mZiArPSBNQVhMSU5FKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICgocG9zIC0gcGFnZSArIE1BWExJTkUpID4gY291bnQpCisJCQkJZ290byBzdGxpX3JlYWRkb25lOworCQkJcG9zICs9IHN0bGlfcG9ydGluZm8oYnJkcCwgcG9ydHAsIHRvdGFscG9ydCwgcG9zKTsKKwkJfQorCX0KKworCSplb2YgPSAxOworCitzdGxpX3JlYWRkb25lOgorCSpzdGFydCA9IHBhZ2U7CisJcmV0dXJuKHBvcyAtIHBhZ2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglHZW5lcmljIHNlbmQgY29tbWFuZCByb3V0aW5lLiBUaGlzIHdpbGwgc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNsYXZlLAorICoJb2YgdGhlIHNwZWNpZmllZCB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudC4gTXVzdCBiZSB2ZXJ5CisgKgljYXJlZnVsIG9mIGRhdGEgdGhhdCB3aWxsIGJlIGNvcGllZCBvdXQgZnJvbSBzaGFyZWQgbWVtb3J5IC0KKyAqCWNvbnRhaW5pbmcgY29tbWFuZCByZXN1bHRzLiBUaGUgY29tbWFuZCBjb21wbGV0aW9uIGlzIGFsbCBkb25lIGZyb20KKyAqCWEgcG9sbCByb3V0aW5lIHRoYXQgZG9lcyBub3QgaGF2ZSB1c2VyIGNvbnRleHQuIFRoZXJlZm9yZSB5b3UgY2Fubm90CisgKgljb3B5IGJhY2sgZGlyZWN0bHkgaW50byB1c2VyIHNwYWNlLCBvciB0byB0aGUga2VybmVsIHN0YWNrIG9mIGEKKyAqCXByb2Nlc3MuIFRoaXMgcm91dGluZSBkb2VzIG5vdCBzbGVlcCwgc28gY2FuIGJlIGNhbGxlZCBmcm9tIGFueXdoZXJlLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfc2VuZGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKQoreworCXZvbGF0aWxlIGNka2hkcl90CSpoZHJwOworCXZvbGF0aWxlIGNka2N0cmxfdAkqY3A7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqYml0czsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfc2VuZGNtZChicmRwPSV4LHBvcnRwPSV4LGNtZD0leCxhcmc9JXgsc2l6ZT0lZCwiCisJCSJjb3B5YmFjaz0lZClcbiIsIChpbnQpIGJyZHAsIChpbnQpIHBvcnRwLCAoaW50KSBjbWQsCisJCShpbnQpIGFyZywgc2l6ZSwgY29weWJhY2spOworI2VuZGlmCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGNvbW1hbmQgYWxyZWFkeSBidXN5LCBjbWQ9JXghXG4iLAorCQkJCShpbnQpIGNtZCk7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJRUJSREVOQUJMRShicmRwKTsKKwljcCA9ICYoKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpKS0+Y3RybDsKKwlpZiAoc2l6ZSA+IDApIHsKKwkJbWVtY3B5KCh2b2lkICopICYoY3AtPmFyZ3NbMF0pLCBhcmcsIHNpemUpOworCQlpZiAoY29weWJhY2spIHsKKwkJCXBvcnRwLT5hcmdwID0gYXJnOworCQkJcG9ydHAtPmFyZ3NpemUgPSBzaXplOworCQl9CisJfQorCWNwLT5zdGF0dXMgPSAwOworCWNwLT5jbWQgPSBjbWQ7CisJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwliaXRzID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGhkcnApICsgYnJkcC0+c2xhdmVvZmZzZXQgKworCQlwb3J0cC0+cG9ydGlkeDsKKwkqYml0cyB8PSBwb3J0cC0+cG9ydGJpdDsKKwlzZXRfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSk7CisJRUJSRERJU0FCTEUoYnJkcCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJlYWQgZGF0YSBmcm9tIHNoYXJlZCBtZW1vcnkuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBzaGFyZWQgbWVtb3J5CisgKglpcyBlbmFibGVkIGFuZCB0aGF0IGludGVycnVwdHMgYXJlIG9mZi4gQmFzaWNhbGx5IHdlIGp1c3QgZW1wdHkgb3V0CisgKgl0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXIgaW50byB0aGUgdHR5IGJ1ZmZlci4gTXVzdCBiZSBjYXJlZnVsIHRvCisgKgloYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgZmlsbCB1cCB0aGUgdHR5IGJ1ZmZlciwgYnV0IHN0aWxsIGhhdmUKKyAqCW1vcmUgY2hhcnMgdG8gdW5sb2FkLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfcmVhZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKQoreworCXZvbGF0aWxlIGNka2FzeXJxX3QJKnJwOworCXZvbGF0aWxlIGNoYXIJCSpzaGJ1ZjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OworCXVuc2lnbmVkIGludAkJaGVhZCwgdGFpbCwgc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCWxlbiwgc3RsZW47CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3JlYWQoYnJkcD0leCxwb3J0cD0lZClcbiIsCisJCQkoaW50KSBicmRwLCAoaW50KSBwb3J0cCk7CisjZW5kaWYKKworCWlmICh0ZXN0X2JpdChTVF9SWFNUT1AsICZwb3J0cC0+c3RhdGUpKQorCQlyZXR1cm47CisJdHR5ID0gcG9ydHAtPnR0eTsKKwlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCQlyZXR1cm47CisKKwlycCA9ICYoKHZvbGF0aWxlIGNka2FzeV90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPmFkZHIpKS0+cnhxOworCWhlYWQgPSAodW5zaWduZWQgaW50KSBycC0+aGVhZDsKKwlpZiAoaGVhZCAhPSAoKHVuc2lnbmVkIGludCkgcnAtPmhlYWQpKQorCQloZWFkID0gKHVuc2lnbmVkIGludCkgcnAtPmhlYWQ7CisJdGFpbCA9ICh1bnNpZ25lZCBpbnQpIHJwLT50YWlsOworCXNpemUgPSBwb3J0cC0+cnhzaXplOworCWlmIChoZWFkID49IHRhaWwpIHsKKwkJbGVuID0gaGVhZCAtIHRhaWw7CisJCXN0bGVuID0gbGVuOworCX0gZWxzZSB7CisJCWxlbiA9IHNpemUgLSAodGFpbCAtIGhlYWQpOworCQlzdGxlbiA9IHNpemUgLSB0YWlsOworCX0KKworCWxlbiA9IE1JTihsZW4sIChUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50KSk7CisJc2hidWYgPSAodm9sYXRpbGUgY2hhciAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5yeG9mZnNldCk7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlzdGxlbiA9IE1JTihsZW4sIHN0bGVuKTsKKwkJbWVtY3B5KHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIChjaGFyICopIChzaGJ1ZiArIHRhaWwpLCBzdGxlbik7CisJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBzdGxlbik7CisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gc3RsZW47CisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gc3RsZW47CisJCXR0eS0+ZmxpcC5jb3VudCArPSBzdGxlbjsKKworCQlsZW4gLT0gc3RsZW47CisJCXRhaWwgKz0gc3RsZW47CisJCWlmICh0YWlsID49IHNpemUpIHsKKwkJCXRhaWwgPSAwOworCQkJc3RsZW4gPSBoZWFkOworCQl9CisJfQorCXJwID0gJigodm9sYXRpbGUgY2RrYXN5X3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+YWRkcikpLT5yeHE7CisJcnAtPnRhaWwgPSB0YWlsOworCisJaWYgKGhlYWQgIT0gdGFpbCkKKwkJc2V0X2JpdChTVF9SWElORywgJnBvcnRwLT5zdGF0ZSk7CisKKwl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZXQgdXAgYW5kIGNhcnJ5IG91dCBhbnkgZGVsYXllZCBjb21tYW5kcy4gVGhlcmUgaXMgb25seSBhIHNtYWxsIHNldAorICoJb2Ygc2xhdmUgY29tbWFuZHMgdGhhdCBjYW4gYmUgZG9uZSAib2ZmLWxldmVsIi4gU28gaXQgaXMgbm90IHRvbworICoJZGlmZmljdWx0IHRvIGRlYWwgd2l0aCB0aGVtIGhlcmUuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9kb2RlbGF5Y21kKHN0bGlwb3J0X3QgKnBvcnRwLCB2b2xhdGlsZSBjZGtjdHJsX3QgKmNwKQoreworCWludAljbWQ7CisKKwlpZiAodGVzdF9iaXQoU1RfRE9TSUdTLCAmcG9ydHAtPnN0YXRlKSkgeworCQlpZiAodGVzdF9iaXQoU1RfRE9GTFVTSFRYLCAmcG9ydHAtPnN0YXRlKSAmJgorCQkgICAgdGVzdF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKSkKKwkJCWNtZCA9IEFfU0VUU0lHTkFMU0Y7CisJCWVsc2UgaWYgKHRlc3RfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSkpCisJCQljbWQgPSBBX1NFVFNJR05BTFNGVFg7CisJCWVsc2UgaWYgKHRlc3RfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSkpCisJCQljbWQgPSBBX1NFVFNJR05BTFNGUlg7CisJCWVsc2UKKwkJCWNtZCA9IEFfU0VUU0lHTkFMUzsKKwkJY2xlYXJfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSk7CisJCWNsZWFyX2JpdChTVF9ET0ZMVVNIUlgsICZwb3J0cC0+c3RhdGUpOworCQljbGVhcl9iaXQoU1RfRE9TSUdTLCAmcG9ydHAtPnN0YXRlKTsKKwkJbWVtY3B5KCh2b2lkICopICYoY3AtPmFyZ3NbMF0pLCAodm9pZCAqKSAmcG9ydHAtPmFzaWcsCisJCQlzaXplb2YoYXN5c2lnc190KSk7CisJCWNwLT5zdGF0dXMgPSAwOworCQljcC0+Y21kID0gY21kOworCQlzZXRfYml0KFNUX0NNRElORywgJnBvcnRwLT5zdGF0ZSk7CisJfSBlbHNlIGlmICh0ZXN0X2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpIHx8CisJICAgIHRlc3RfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJY21kID0gKCh0ZXN0X2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpKSA/IEZMVVNIVFggOiAwKTsKKwkJY21kIHw9ICgodGVzdF9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKSkgPyBGTFVTSFJYIDogMCk7CisJCWNsZWFyX2JpdChTVF9ET0ZMVVNIVFgsICZwb3J0cC0+c3RhdGUpOworCQljbGVhcl9iaXQoU1RfRE9GTFVTSFJYLCAmcG9ydHAtPnN0YXRlKTsKKwkJbWVtY3B5KCh2b2lkICopICYoY3AtPmFyZ3NbMF0pLCAodm9pZCAqKSAmY21kLCBzaXplb2YoaW50KSk7CisJCWNwLT5zdGF0dXMgPSAwOworCQljcC0+Y21kID0gQV9GTFVTSDsKKwkJc2V0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSG9zdCBjb21tYW5kIHNlcnZpY2UgY2hlY2tpbmcuIFRoaXMgaGFuZGxlcyBjb21tYW5kcyBvciBtZXNzYWdlcworICoJY29taW5nIGZyb20gdGhlIHNsYXZlIHRvIHRoZSBob3N0LiBNdXN0IGhhdmUgYm9hcmQgc2hhcmVkIG1lbW9yeQorICoJZW5hYmxlZCBhbmQgaW50ZXJydXB0cyBvZmYgd2hlbiBjYWxsZWQuIE5vdGljZSB0aGF0IGJ5IHNlcnZpY2luZyB0aGUKKyAqCXJlYWQgZGF0YSBsYXN0IHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBzaGFyZWQgbWVtb3J5IHBvaW50ZXIKKyAqCWR1cmluZyBwcm9jZXNzaW5nICh3aGljaCBpcyBhIHNsb3cgSU8gb3BlcmF0aW9uKS4KKyAqCVJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgdGhpcyBwb3J0IGlzIHN0aWxsIGF3YWl0aW5nIGFjdGlvbnMgZnJvbQorICoJdGhlIHNsYXZlIChsaWtlIG9wZW4sIGNvbW1hbmQsIG9yIGV2ZW4gVFggZGF0YSBiZWluZyBzZW50KS4gSWYgMAorICoJdGhlbiBwb3J0IGlzIHN0aWxsIGJ1c3ksIG90aGVyd2lzZSBubyBsb25nZXIgYnVzeS4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfaG9zdGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKQoreworCXZvbGF0aWxlIGNka2FzeV90CSphcDsKKwl2b2xhdGlsZSBjZGtjdHJsX3QJKmNwOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJYXN5bm90aWZ5X3QJCW50OworCXVuc2lnbmVkIGxvbmcJCW9sZHNpZ3M7CisJaW50CQkJcmMsIGRvbmVyeDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaG9zdGNtZChicmRwPSV4LGNoYW5ucj0lZClcbiIsCisJCQkoaW50KSBicmRwLCBjaGFubnIpOworI2VuZGlmCisKKwlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwljcCA9ICZhcC0+Y3RybDsKKworLyoKKyAqCUNoZWNrIGlmIHdlIGFyZSB3YWl0aW5nIGZvciBhbiBvcGVuIGNvbXBsZXRpb24gbWVzc2FnZS4KKyAqLworCWlmICh0ZXN0X2JpdChTVF9PUEVOSU5HLCAmcG9ydHAtPnN0YXRlKSkgeworCQlyYyA9IChpbnQpIGNwLT5vcGVuYXJnOworCQlpZiAoKGNwLT5vcGVuID09IDApICYmIChyYyAhPSAwKSkgeworCQkJaWYgKHJjID4gMCkKKwkJCQlyYy0tOworCQkJY3AtPm9wZW5hcmcgPSAwOworCQkJcG9ydHAtPnJjID0gcmM7CisJCQljbGVhcl9iaXQoU1RfT1BFTklORywgJnBvcnRwLT5zdGF0ZSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5yYXdfd2FpdCk7CisJCX0KKwl9CisKKy8qCisgKglDaGVjayBpZiB3ZSBhcmUgd2FpdGluZyBmb3IgYSBjbG9zZSBjb21wbGV0aW9uIG1lc3NhZ2UuCisgKi8KKwlpZiAodGVzdF9iaXQoU1RfQ0xPU0lORywgJnBvcnRwLT5zdGF0ZSkpIHsKKwkJcmMgPSAoaW50KSBjcC0+Y2xvc2Vhcmc7CisJCWlmICgoY3AtPmNsb3NlID09IDApICYmIChyYyAhPSAwKSkgeworCQkJaWYgKHJjID4gMCkKKwkJCQlyYy0tOworCQkJY3AtPmNsb3NlYXJnID0gMDsKKwkJCXBvcnRwLT5yYyA9IHJjOworCQkJY2xlYXJfYml0KFNUX0NMT1NJTkcsICZwb3J0cC0+c3RhdGUpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+cmF3X3dhaXQpOworCQl9CisJfQorCisvKgorICoJQ2hlY2sgaWYgd2UgYXJlIHdhaXRpbmcgZm9yIGEgY29tbWFuZCBjb21wbGV0aW9uIG1lc3NhZ2UuIFdlIG1heQorICoJbmVlZCB0byBjb3B5IG91dCB0aGUgY29tbWFuZCByZXN1bHRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbW1hbmQuCisgKi8KKwlpZiAodGVzdF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKSkgeworCQlyYyA9IGNwLT5zdGF0dXM7CisJCWlmICgoY3AtPmNtZCA9PSAwKSAmJiAocmMgIT0gMCkpIHsKKwkJCWlmIChyYyA+IDApCisJCQkJcmMtLTsKKwkJCWlmIChwb3J0cC0+YXJncCAhPSAodm9pZCAqKSBOVUxMKSB7CisJCQkJbWVtY3B5KHBvcnRwLT5hcmdwLCAodm9pZCAqKSAmKGNwLT5hcmdzWzBdKSwKKwkJCQkJcG9ydHAtPmFyZ3NpemUpOworCQkJCXBvcnRwLT5hcmdwID0gKHZvaWQgKikgTlVMTDsKKwkJCX0KKwkJCWNwLT5zdGF0dXMgPSAwOworCQkJcG9ydHAtPnJjID0gcmM7CisJCQljbGVhcl9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKTsKKwkJCXN0bGlfZG9kZWxheWNtZChwb3J0cCwgY3ApOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+cmF3X3dhaXQpOworCQl9CisJfQorCisvKgorICoJQ2hlY2sgZm9yIGFueSBub3RpZmljYXRpb24gbWVzc2FnZXMgcmVhZHkuIFRoaXMgaW5jbHVkZXMgbG90cyBvZgorICoJZGlmZmVyZW50IHR5cGVzIG9mIGV2ZW50cyAtIFJYIGNoYXJzIHJlYWR5LCBSWCBicmVhayByZWNlaXZlZCwKKyAqCVRYIGRhdGEgbG93IG9yIGVtcHR5IGluIHRoZSBzbGF2ZSwgbW9kZW0gc2lnbmFscyBjaGFuZ2VkIHN0YXRlLgorICovCisJZG9uZXJ4ID0gMDsKKworCWlmIChhcC0+bm90aWZ5KSB7CisJCW50ID0gYXAtPmNoYW5nZWQ7CisJCWFwLT5ub3RpZnkgPSAwOworCQl0dHkgPSBwb3J0cC0+dHR5OworCisJCWlmIChudC5zaWduYWwgJiBTR19EQ0QpIHsKKwkJCW9sZHNpZ3MgPSBwb3J0cC0+c2lnczsKKwkJCXBvcnRwLT5zaWdzID0gc3RsaV9ta3Rpb2NtKG50LnNpZ3ZhbHVlKTsKKwkJCWNsZWFyX2JpdChTVF9HRVRTSUdTLCAmcG9ydHAtPnN0YXRlKTsKKwkJCWlmICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgJiYKKwkJCSAgICAoKG9sZHNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKKwkJCWlmICgob2xkc2lncyAmIFRJT0NNX0NEKSAmJgorCQkJICAgICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpIHsKKwkJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpIHsKKwkJCQkJaWYgKHR0eSkKKwkJCQkJCXNjaGVkdWxlX3dvcmsoJnBvcnRwLT50cWhhbmd1cCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG50LmRhdGEgJiBEVF9UWEVNUFRZKQorCQkJY2xlYXJfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSk7CisJCWlmIChudC5kYXRhICYgKERUX1RYRU1QVFkgfCBEVF9UWExPVykpIHsKKwkJCWlmICh0dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHsKKwkJCQlpZiAoKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKKwkJCQkgICAgdHR5LT5sZGlzYy53cml0ZV93YWtldXApIHsKKwkJCQkJKHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKSh0dHkpOworCQkJCQlFQlJERU5BQkxFKGJyZHApOworCQkJCX0KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJCQl9CisJCX0KKworCQlpZiAoKG50LmRhdGEgJiBEVF9SWEJSRUFLKSAmJiAocG9ydHAtPnJ4bWFya21zayAmIEJSS0lOVCkpIHsKKwkJCWlmICh0dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHsKKwkJCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCQkJCQl0dHktPmZsaXAuY291bnQrKzsKKwkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKwkJCQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCQkJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TQUspIHsKKwkJCQkJCWRvX1NBSyh0dHkpOworCQkJCQkJRUJSREVOQUJMRShicmRwKTsKKwkJCQkJfQorCQkJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChudC5kYXRhICYgRFRfUlhCVVNZKSB7CisJCQlkb25lcngrKzsKKwkJCXN0bGlfcmVhZChicmRwLCBwb3J0cCk7CisJCX0KKwl9CisKKy8qCisgKglJdCBtaWdodCBzZWVtIG9kZCB0aGF0IHdlIGFyZSBjaGVja2luZyBmb3IgbW9yZSBSWCBjaGFycyBoZXJlLgorICoJQnV0LCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdHR5IGJ1ZmZlciB3YXMgcHJldmlvdXNseQorICoJZmlsbGVkLCBidXQgd2UgaGFkIG1vcmUgY2hhcmFjdGVycyB0byBwYXNzIHVwLiBUaGUgc2xhdmUgd2lsbCBub3QKKyAqCXNlbmQgYW55IG1vcmUgUlggbm90aWZ5IG1lc3NhZ2VzIHVudGlsIHRoZSBSWCBidWZmZXIgaGFzIGJlZW4gZW1wdGllZC4KKyAqCUJ1dCBpdCB3aWxsIGxlYXZlIHRoZSBzZXJ2aWNlIGJpdHMgb24gKHNpbmNlIHRoZSBidWZmZXIgaXMgbm90IGVtcHR5KS4KKyAqCVNvIGZyb20gaGVyZSB3ZSBjYW4gdHJ5IHRvIHByb2Nlc3MgbW9yZSBSWCBjaGFycy4KKyAqLworCWlmICgoIWRvbmVyeCkgJiYgdGVzdF9iaXQoU1RfUlhJTkcsICZwb3J0cC0+c3RhdGUpKSB7CisJCWNsZWFyX2JpdChTVF9SWElORywgJnBvcnRwLT5zdGF0ZSk7CisJCXN0bGlfcmVhZChicmRwLCBwb3J0cCk7CisJfQorCisJcmV0dXJuKCh0ZXN0X2JpdChTVF9PUEVOSU5HLCAmcG9ydHAtPnN0YXRlKSB8fAorCQl0ZXN0X2JpdChTVF9DTE9TSU5HLCAmcG9ydHAtPnN0YXRlKSB8fAorCQl0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpIHx8CisJCXRlc3RfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSkgfHwKKwkJdGVzdF9iaXQoU1RfUlhJTkcsICZwb3J0cC0+c3RhdGUpKSA/IDAgOiAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2VydmljZSBhbGwgcG9ydHMgb24gYSBwYXJ0aWN1bGFyIGJvYXJkLiBBc3N1bWVzIHRoYXQgdGhlIGJvYXJkcworICoJc2hhcmVkIG1lbW9yeSBpcyBlbmFibGVkLCBhbmQgdGhhdCB0aGUgcGFnZSBwb2ludGVyIGlzIHBvaW50ZWQKKyAqCWF0IHRoZSBjZGsgaGVhZGVyIHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2JyZHBvbGwoc3RsaWJyZF90ICpicmRwLCB2b2xhdGlsZSBjZGtoZHJfdCAqaGRycCkKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKwl1bnNpZ25lZCBjaGFyCWhvc3RiaXRzWyhTVExfTUFYQ0hBTlMgLyA4KSArIDFdOworCXVuc2lnbmVkIGNoYXIJc2xhdmViaXRzWyhTVExfTUFYQ0hBTlMgLyA4KSArIDFdOworCXVuc2lnbmVkIGNoYXIJKnNsYXZlcDsKKwlpbnQJCWJpdHBvcywgYml0YXQsIGJpdHNpemU7CisJaW50IAkJY2hhbm5yLCBucmRldnMsIHNsYXZlYml0Y2hhbmdlOworCisJYml0c2l6ZSA9IGJyZHAtPmJpdHNpemU7CisJbnJkZXZzID0gYnJkcC0+bnJkZXZzOworCisvKgorICoJQ2hlY2sgaWYgc2xhdmUgd2FudHMgYW55IHNlcnZpY2UuIEJhc2ljYWxseSB3ZSB0cnkgdG8gZG8gYXMKKyAqCWxpdHRsZSB3b3JrIGFzIHBvc3NpYmxlIGhlcmUuIFRoZXJlIGFyZSAyIGxldmVscyBvZiBzZXJ2aWNlCisgKgliaXRzLiBTbyBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdlIGJhaWwgZWFybHkuIFdlIGNoZWNrCisgKgk4IHNlcnZpY2UgYml0cyBhdCBhIHRpbWUgaW4gdGhlIGlubmVyIGxvb3AsIHNvIHdlIGNhbiBieXBhc3MKKyAqCXRoZSBsb3QgaWYgbm9uZSBvZiB0aGVtIHdhbnQgc2VydmljZS4KKyAqLworCW1lbWNweSgmaG9zdGJpdHNbMF0sICgoKHVuc2lnbmVkIGNoYXIgKikgaGRycCkgKyBicmRwLT5ob3N0b2Zmc2V0KSwKKwkJYml0c2l6ZSk7CisKKwltZW1zZXQoJnNsYXZlYml0c1swXSwgMCwgYml0c2l6ZSk7CisJc2xhdmViaXRjaGFuZ2UgPSAwOworCisJZm9yIChiaXRwb3MgPSAwOyAoYml0cG9zIDwgYml0c2l6ZSk7IGJpdHBvcysrKSB7CisJCWlmIChob3N0Yml0c1tiaXRwb3NdID09IDApCisJCQljb250aW51ZTsKKwkJY2hhbm5yID0gYml0cG9zICogODsKKwkJZm9yIChiaXRhdCA9IDB4MTsgKGNoYW5uciA8IG5yZGV2cyk7IGNoYW5ucisrLCBiaXRhdCA8PD0gMSkgeworCQkJaWYgKGhvc3RiaXRzW2JpdHBvc10gJiBiaXRhdCkgeworCQkJCXBvcnRwID0gYnJkcC0+cG9ydHNbKGNoYW5uciAtIDEpXTsKKwkJCQlpZiAoc3RsaV9ob3N0Y21kKGJyZHAsIHBvcnRwKSkgeworCQkJCQlzbGF2ZWJpdGNoYW5nZSsrOworCQkJCQlzbGF2ZWJpdHNbYml0cG9zXSB8PSBiaXRhdDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKy8qCisgKglJZiBhbnkgb2YgdGhlIHBvcnRzIGFyZSBubyBsb25nZXIgYnVzeSB0aGVuIHVwZGF0ZSB0aGVtIGluIHRoZQorICoJc2xhdmUgcmVxdWVzdCBiaXRzLiBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIsIHNpbmNlIGEgaG9zdCBwb3J0CisgKglzZXJ2aWNlIG1heSBpbml0aWF0ZSBtb3JlIHNsYXZlIHJlcXVlc3RzLgorICovCisJaWYgKHNsYXZlYml0Y2hhbmdlKSB7CisJCWhkcnAgPSAodm9sYXRpbGUgY2RraGRyX3QgKikgRUJSREdFVE1FTVBUUihicmRwLCBDREtfQ0RLQUREUik7CisJCXNsYXZlcCA9ICgodW5zaWduZWQgY2hhciAqKSBoZHJwKSArIGJyZHAtPnNsYXZlb2Zmc2V0OworCQlmb3IgKGJpdHBvcyA9IDA7IChiaXRwb3MgPCBiaXRzaXplKTsgYml0cG9zKyspIHsKKwkJCWlmIChzbGF2ZWJpdHNbYml0cG9zXSkKKwkJCQlzbGF2ZXBbYml0cG9zXSAmPSB+c2xhdmViaXRzW2JpdHBvc107CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCURyaXZlciBwb2xsIHJvdXRpbmUuIFRoaXMgcm91dGluZSBwb2xscyB0aGUgYm9hcmRzIGluIHVzZSBhbmQgcGFzc2VzCisgKgltZXNzYWdlcyBiYWNrIHVwIHRvIGhvc3Qgd2hlbiBuZWNlc3NhcnkuIFRoaXMgaXMgYWN0dWFsbHkgdmVyeQorICoJQ1BVIGVmZmljaWVudCwgc2luY2Ugd2Ugd2lsbCBhbHdheXMgaGF2ZSB0aGUga2VybmVsIHBvbGwgY2xvY2ssIGl0CisgKglhZGRzIG9ubHkgYSBmZXcgY3ljbGVzIHdoZW4gaWRsZSAoc2luY2UgYm9hcmQgc2VydmljZSBjYW4gYmUKKyAqCWRldGVybWluZWQgdmVyeSBlYXNpbHkpLCBidXQgd2hlbiBsb2FkZWQgZ2VuZXJhdGVzIG5vIGludGVycnVwdHMKKyAqCSh3aXRoIHRoZWlyIGV4cGVuc2l2ZSBhc3NvY2lhdGVkIGNvbnRleHQgY2hhbmdlKS4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX3BvbGwodW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9sYXRpbGUgY2RraGRyX3QJKmhkcnA7CisJc3RsaWJyZF90CQkqYnJkcDsKKwlpbnQgCQkJYnJkbnI7CisKKwlzdGxpX3RpbWVybGlzdC5leHBpcmVzID0gU1RMSV9USU1FT1VUOworCWFkZF90aW1lcigmc3RsaV90aW1lcmxpc3QpOworCisvKgorICoJQ2hlY2sgZWFjaCBib2FyZCBhbmQgZG8gYW55IHNlcnZpY2luZyByZXF1aXJlZC4KKyAqLworCWZvciAoYnJkbnIgPSAwOyAoYnJkbnIgPCBzdGxpX25yYnJkcyk7IGJyZG5yKyspIHsKKwkJYnJkcCA9IHN0bGlfYnJkc1ticmRucl07CisJCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGJyZHAtPnN0YXRlICYgQlNUX1NUQVJURUQpID09IDApCisJCQljb250aW51ZTsKKworCQlFQlJERU5BQkxFKGJyZHApOworCQloZHJwID0gKHZvbGF0aWxlIGNka2hkcl90ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX0NES0FERFIpOworCQlpZiAoaGRycC0+aG9zdHJlcSkKKwkJCXN0bGlfYnJkcG9sbChicmRwLCBoZHJwKTsKKwkJRUJSRERJU0FCTEUoYnJkcCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUcmFuc2xhdGUgdGhlIHRlcm1pb3Mgc2V0dGluZ3MgaW50byB0aGUgcG9ydCBzZXR0aW5nIHN0cnVjdHVyZSBvZgorICoJdGhlIHNsYXZlLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfbWthc3lwb3J0KHN0bGlwb3J0X3QgKnBvcnRwLCBhc3lwb3J0X3QgKnBwLCBzdHJ1Y3QgdGVybWlvcyAqdGlvc3ApCit7CisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9ta2FzeXBvcnQocG9ydHA9JXgscHA9JXgsdGlvc3A9JWQpXG4iLAorCQkoaW50KSBwb3J0cCwgKGludCkgcHAsIChpbnQpIHRpb3NwKTsKKyNlbmRpZgorCisJbWVtc2V0KHBwLCAwLCBzaXplb2YoYXN5cG9ydF90KSk7CisKKy8qCisgKglTdGFydCBvZiBieSBzZXR0aW5nIHRoZSBiYXVkLCBjaGFyIHNpemUsIHBhcml0eSBhbmQgc3RvcCBiaXQgaW5mby4KKyAqLworCXBwLT5iYXVkb3V0ID0gdGlvc3AtPmNfY2ZsYWcgJiBDQkFVRDsKKwlpZiAocHAtPmJhdWRvdXQgJiBDQkFVREVYKSB7CisJCXBwLT5iYXVkb3V0ICY9IH5DQkFVREVYOworCQlpZiAoKHBwLT5iYXVkb3V0IDwgMSkgfHwgKHBwLT5iYXVkb3V0ID4gNCkpCisJCQl0aW9zcC0+Y19jZmxhZyAmPSB+Q0JBVURFWDsKKwkJZWxzZQorCQkJcHAtPmJhdWRvdXQgKz0gMTU7CisJfQorCXBwLT5iYXVkb3V0ID0gc3RsaV9iYXVkcmF0ZXNbcHAtPmJhdWRvdXRdOworCWlmICgodGlvc3AtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gQjM4NDAwKSB7CisJCWlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCXBwLT5iYXVkb3V0ID0gNTc2MDA7CisJCWVsc2UgaWYgKChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCXBwLT5iYXVkb3V0ID0gMTE1MjAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJCQlwcC0+YmF1ZG91dCA9IDIzMDQwMDsKKwkJZWxzZSBpZiAoKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKKwkJCXBwLT5iYXVkb3V0ID0gNDYwODAwOworCQllbHNlIGlmICgocG9ydHAtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKQorCQkJcHAtPmJhdWRvdXQgPSAocG9ydHAtPmJhdWRfYmFzZSAvIHBvcnRwLT5jdXN0b21fZGl2aXNvcik7CisJfQorCWlmIChwcC0+YmF1ZG91dCA+IFNUTF9NQVhCQVVEKQorCQlwcC0+YmF1ZG91dCA9IFNUTF9NQVhCQVVEOworCXBwLT5iYXVkaW4gPSBwcC0+YmF1ZG91dDsKKworCXN3aXRjaCAodGlvc3AtPmNfY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgorCQlwcC0+Y3NpemUgPSA1OworCQlicmVhazsKKwljYXNlIENTNjoKKwkJcHAtPmNzaXplID0gNjsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCXBwLT5jc2l6ZSA9IDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBwLT5jc2l6ZSA9IDg7CisJCWJyZWFrOworCX0KKworCWlmICh0aW9zcC0+Y19jZmxhZyAmIENTVE9QQikKKwkJcHAtPnN0b3BicyA9IFBUX1NUT1AyOworCWVsc2UKKwkJcHAtPnN0b3BicyA9IFBUX1NUT1AxOworCisJaWYgKHRpb3NwLT5jX2NmbGFnICYgUEFSRU5CKSB7CisJCWlmICh0aW9zcC0+Y19jZmxhZyAmIFBBUk9ERCkKKwkJCXBwLT5wYXJpdHkgPSBQVF9PRERQQVJJVFk7CisJCWVsc2UKKwkJCXBwLT5wYXJpdHkgPSBQVF9FVkVOUEFSSVRZOworCX0gZWxzZSB7CisJCXBwLT5wYXJpdHkgPSBQVF9OT1BBUklUWTsKKwl9CisKKy8qCisgKglTZXQgdXAgYW55IGZsb3cgY29udHJvbCBvcHRpb25zIGVuYWJsZWQuCisgKi8KKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJWE9OKSB7CisJCXBwLT5mbG93IHw9IEZfSVhPTjsKKwkJaWYgKHRpb3NwLT5jX2lmbGFnICYgSVhBTlkpCisJCQlwcC0+ZmxvdyB8PSBGX0lYQU5ZOworCX0KKwlpZiAodGlvc3AtPmNfY2ZsYWcgJiBDUlRTQ1RTKQorCQlwcC0+ZmxvdyB8PSAoRl9SVFNGTE9XIHwgRl9DVFNGTE9XKTsKKworCXBwLT5zdGFydGluID0gdGlvc3AtPmNfY2NbVlNUQVJUXTsKKwlwcC0+c3RvcGluID0gdGlvc3AtPmNfY2NbVlNUT1BdOworCXBwLT5zdGFydG91dCA9IHRpb3NwLT5jX2NjW1ZTVEFSVF07CisJcHAtPnN0b3BvdXQgPSB0aW9zcC0+Y19jY1tWU1RPUF07CisKKy8qCisgKglTZXQgdXAgdGhlIFJYIGNoYXIgbWFya2luZyBtYXNrIHdpdGggdGhvc2UgUlggZXJyb3IgdHlwZXMgd2UgbXVzdAorICoJY2F0Y2guIFdlIGNhbiBnZXQgdGhlIHNsYXZlIHRvIGhlbHAgdXMgb3V0IGEgbGl0dGxlIGhlcmUsIGl0IHdpbGwKKyAqCWlnbm9yZSBwYXJpdHkgZXJyb3JzIGFuZCBicmVha3MgZm9yIHVzLCBhbmQgbWFyayBwYXJpdHkgZXJyb3JzIGluCisgKgl0aGUgZGF0YSBzdHJlYW0uCisgKi8KKwlpZiAodGlvc3AtPmNfaWZsYWcgJiBJR05QQVIpCisJCXBwLT5pZmxhZyB8PSBGSV9JR05SWEVSUlM7CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgSUdOQlJLKQorCQlwcC0+aWZsYWcgfD0gRklfSUdOQlJFQUs7CisKKwlwb3J0cC0+cnhtYXJrbXNrID0gMDsKKwlpZiAodGlvc3AtPmNfaWZsYWcgJiAoSU5QQ0sgfCBQQVJNUkspKQorCQlwcC0+aWZsYWcgfD0gRklfMU1BUktSWEVSUlM7CisJaWYgKHRpb3NwLT5jX2lmbGFnICYgQlJLSU5UKQorCQlwb3J0cC0+cnhtYXJrbXNrIHw9IEJSS0lOVDsKKworLyoKKyAqCVNldCB1cCBjbG9jYWwgcHJvY2Vzc2luZyBhcyByZXF1aXJlZC4KKyAqLworCWlmICh0aW9zcC0+Y19jZmxhZyAmIENMT0NBTCkKKwkJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwllbHNlCisJCXBvcnRwLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworLyoKKyAqCVRyYW5zZmVyIGFueSBwZXJzaXN0ZW50IGZsYWdzIGludG8gdGhlIGFzeXBvcnQgc3RydWN0dXJlLgorICovCisJcHAtPnBmbGFnID0gKHBvcnRwLT5wZmxhZyAmIDB4ZmZmZik7CisJcHAtPnZtaW4gPSAocG9ydHAtPnBmbGFnICYgUF9SWElNSU4pID8gMSA6IDA7CisJcHAtPnZ0aW1lID0gKHBvcnRwLT5wZmxhZyAmIFBfUlhJVElNRSkgPyAxIDogMDsKKwlwcC0+Y2NbMV0gPSAocG9ydHAtPnBmbGFnICYgUF9SWFRIT0xEKSA/IDEgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglDb25zdHJ1Y3QgYSBzbGF2ZSBzaWduYWxzIHN0cnVjdHVyZSBmb3Igc2V0dGluZyB0aGUgRFRSIGFuZCBSVFMKKyAqCXNpZ25hbHMgYXMgc3BlY2lmaWVkLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfbWthc3lzaWdzKGFzeXNpZ3NfdCAqc3AsIGludCBkdHIsIGludCBydHMpCit7CisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9ta2FzeXNpZ3Moc3A9JXgsZHRyPSVkLHJ0cz0lZClcbiIsCisJCQkoaW50KSBzcCwgZHRyLCBydHMpOworI2VuZGlmCisKKwltZW1zZXQoc3AsIDAsIHNpemVvZihhc3lzaWdzX3QpKTsKKwlpZiAoZHRyID49IDApIHsKKwkJc3AtPnNpZ25hbCB8PSBTR19EVFI7CisJCXNwLT5zaWd2YWx1ZSB8PSAoKGR0ciA+IDApID8gU0dfRFRSIDogMCk7CisJfQorCWlmIChydHMgPj0gMCkgeworCQlzcC0+c2lnbmFsIHw9IFNHX1JUUzsKKwkJc3AtPnNpZ3ZhbHVlIHw9ICgocnRzID4gMCkgPyBTR19SVFMgOiAwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNvbnZlcnQgdGhlIHNpZ25hbHMgcmV0dXJuZWQgZnJvbSB0aGUgc2xhdmUgaW50byBhIGxvY2FsIFRJT0NNIHR5cGUKKyAqCXNpZ25hbHMgdmFsdWUuIFdlIGtlZXAgdGhlbSBsb2NhbGx5IGluIFRJT0NNIGZvcm1hdC4KKyAqLworCitzdGF0aWMgbG9uZyBzdGxpX21rdGlvY20odW5zaWduZWQgbG9uZyBzaWd2YWx1ZSkKK3sKKwlsb25nCXRpb2NtOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9ta3Rpb2NtKHNpZ3ZhbHVlPSV4KVxuIiwgKGludCkgc2lndmFsdWUpOworI2VuZGlmCisKKwl0aW9jbSA9IDA7CisJdGlvY20gfD0gKChzaWd2YWx1ZSAmIFNHX0RDRCkgPyBUSU9DTV9DRCA6IDApOworCXRpb2NtIHw9ICgoc2lndmFsdWUgJiBTR19DVFMpID8gVElPQ01fQ1RTIDogMCk7CisJdGlvY20gfD0gKChzaWd2YWx1ZSAmIFNHX1JJKSA/IFRJT0NNX1JJIDogMCk7CisJdGlvY20gfD0gKChzaWd2YWx1ZSAmIFNHX0RTUikgPyBUSU9DTV9EU1IgOiAwKTsKKwl0aW9jbSB8PSAoKHNpZ3ZhbHVlICYgU0dfRFRSKSA/IFRJT0NNX0RUUiA6IDApOworCXRpb2NtIHw9ICgoc2lndmFsdWUgJiBTR19SVFMpID8gVElPQ01fUlRTIDogMCk7CisJcmV0dXJuKHRpb2NtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQWxsIHBhbmVscyBhbmQgcG9ydHMgYWN0dWFsbHkgYXR0YWNoZWQgaGF2ZSBiZWVuIHdvcmtlZCBvdXQuIEFsbAorICoJd2UgbmVlZCB0byBkbyBoZXJlIGlzIHNldCB1cCB0aGUgYXBwcm9wcmlhdGUgcGVyIHBvcnQgZGF0YSBzdHJ1Y3R1cmVzLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9pbml0cG9ydHMoc3RsaWJyZF90ICpicmRwKQoreworCXN0bGlwb3J0X3QJKnBvcnRwOworCWludAkJaSwgcGFuZWxuciwgcGFuZWxwb3J0OworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9pbml0cG9ydHMoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlmb3IgKGkgPSAwLCBwYW5lbG5yID0gMCwgcGFuZWxwb3J0ID0gMDsgKGkgPCBicmRwLT5ucnBvcnRzKTsgaSsrKSB7CisJCXBvcnRwID0gKHN0bGlwb3J0X3QgKikgc3RsaV9tZW1hbGxvYyhzaXplb2Yoc3RsaXBvcnRfdCkpOworCQlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkgeworCQkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIHBvcnQgc3RydWN0dXJlXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWVtc2V0KHBvcnRwLCAwLCBzaXplb2Yoc3RsaXBvcnRfdCkpOworCQlwb3J0cC0+bWFnaWMgPSBTVExJX1BPUlRNQUdJQzsKKwkJcG9ydHAtPnBvcnRuciA9IGk7CisJCXBvcnRwLT5icmRuciA9IGJyZHAtPmJyZG5yOworCQlwb3J0cC0+cGFuZWxuciA9IHBhbmVsbnI7CisJCXBvcnRwLT5iYXVkX2Jhc2UgPSBTVExfQkFVREJBU0U7CisJCXBvcnRwLT5jbG9zZV9kZWxheSA9IFNUTF9DTE9TRURFTEFZOworCQlwb3J0cC0+Y2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKwkJSU5JVF9XT1JLKCZwb3J0cC0+dHFoYW5ndXAsIHN0bGlfZG9oYW5ndXAsIHBvcnRwKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnRwLT5jbG9zZV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPnJhd193YWl0KTsKKwkJcGFuZWxwb3J0Kys7CisJCWlmIChwYW5lbHBvcnQgPj0gYnJkcC0+cGFuZWxzW3BhbmVsbnJdKSB7CisJCQlwYW5lbHBvcnQgPSAwOworCQkJcGFuZWxucisrOworCQl9CisJCWJyZHAtPnBvcnRzW2ldID0gcG9ydHA7CisJfQorCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglBbGwgdGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgYm9hcmQgc3BlY2lmaWMgaGFyZHdhcmUgb3BlcmF0aW9ucy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcGluaXQoc3RsaWJyZF90ICpicmRwKQoreworCXVuc2lnbmVkIGxvbmcJbWVtY29uZjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwaW5pdChicmRwPSVkKVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoRUNQX0FUU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKEVDUF9BVERJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfQVRDT05GUikpOworCXVkZWxheSgxMDApOworCisJbWVtY29uZiA9IChicmRwLT5tZW1hZGRyICYgRUNQX0FUQUREUk1BU0spID4+IEVDUF9BVEFERFJTSEZUOworCW91dGIobWVtY29uZiwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVE1FTUFSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BlbmFibGUoc3RsaWJyZF90ICpicmRwKQorewkKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2VjcGVuYWJsZShicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKwlvdXRiKEVDUF9BVEVOQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3BkaXNhYmxlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoRUNQX0FURElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNoYXIgKnN0bGlfZWNwZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorewkKKwl2b2lkCQkqcHRyOworCXVuc2lnbmVkIGNoYXIJdmFsOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3BnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgpXG4iLCAoaW50KSBicmRwLAorCQkoaW50KSBvZmZzZXQpOworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID4gYnJkcC0+bWVtc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBzaGFyZWQgbWVtb3J5IHBvaW50ZXI9JXggb3V0IG9mICIKKwkJCQkicmFuZ2UgYXQgbGluZT0lZCglZCksIGJyZD0lZFxuIiwKKwkJCShpbnQpIG9mZnNldCwgbGluZSwgX19MSU5FX18sIGJyZHAtPmJyZG5yKTsKKwkJcHRyID0gTlVMTDsKKwkJdmFsID0gMDsKKwl9IGVsc2UgeworCQlwdHIgPSBicmRwLT5tZW1iYXNlICsgKG9mZnNldCAlIEVDUF9BVFBBR0VTSVpFKTsKKwkJdmFsID0gKHVuc2lnbmVkIGNoYXIpIChvZmZzZXQgLyBFQ1BfQVRQQUdFU0laRSk7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgRUNQX0FUTUVNUFIpKTsKKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcHJlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9lY3ByZXNldChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoRUNQX0FUU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKEVDUF9BVERJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfQVRDT05GUikpOworCXVkZWxheSg1MDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwaW50cihzdGxpYnJkX3QgKmJyZHApCit7CQorI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwaW50cihicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKwlvdXRiKDB4MSwgYnJkcC0+aW9iYXNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlIGZvbGxvd2luZyBzZXQgb2YgZnVuY3Rpb25zIGFjdCBvbiBFQ1AgRUlTQSBib2FyZHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BlaWluaXQoc3RsaWJyZF90ICpicmRwKQoreworCXVuc2lnbmVkIGxvbmcJbWVtY29uZjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwZWlpbml0KGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YigweDEsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlCUkRFTkFCKSk7CisJb3V0YihFQ1BfRUlTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoRUNQX0VJRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUNPTkZSKSk7CisJdWRlbGF5KDUwMCk7CisKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBFQ1BfRUlBRERSTUFTS0wpID4+IEVDUF9FSUFERFJTSEZUTDsKKwlvdXRiKG1lbWNvbmYsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlNRU1BUkwpKTsKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBFQ1BfRUlBRERSTUFTS0gpID4+IEVDUF9FSUFERFJTSEZUSDsKKwlvdXRiKG1lbWNvbmYsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlNRU1BUkgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcGVpZW5hYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfRUlFTkFCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwZWlkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9lY3BlaWdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3sJCisJdm9pZAkJKnB0cjsKKwl1bnNpZ25lZCBjaGFyCXZhbDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfZWNwZWlnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgsbGluZT0lZClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIG9mZnNldCwgbGluZSk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJKGludCkgb2Zmc2V0LCBsaW5lLCBfX0xJTkVfXywgYnJkcC0+YnJkbnIpOworCQlwdHIgPSBOVUxMOworCQl2YWwgPSAwOworCX0gZWxzZSB7CisJCXB0ciA9IGJyZHAtPm1lbWJhc2UgKyAob2Zmc2V0ICUgRUNQX0VJUEFHRVNJWkUpOworCQlpZiAob2Zmc2V0IDwgRUNQX0VJUEFHRVNJWkUpCisJCQl2YWwgPSBFQ1BfRUlFTkFCTEU7CisJCWVsc2UKKwkJCXZhbCA9IEVDUF9FSUVOQUJMRSB8IDB4NDA7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcGVpcmVzZXQoc3RsaWJyZF90ICpicmRwKQorewkKKwlvdXRiKEVDUF9FSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBFQ1BfRUlDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YihFQ1BfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwl1ZGVsYXkoNTAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlIGZvbGxvd2luZyBzZXQgb2YgZnVuY3Rpb25zIGFjdCBvbiBFQ1AgTUNBIGJvYXJkcy4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxpX2VjcG1jZW5hYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfTUNFTkFCTEUsIChicmRwLT5pb2Jhc2UgKyBFQ1BfTUNDT05GUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwbWNkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfTUNESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX01DQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9lY3BtY2dldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3sJCisJdm9pZAkJKnB0cjsKKwl1bnNpZ25lZCBjaGFyCXZhbDsKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJKGludCkgb2Zmc2V0LCBsaW5lLCBfX0xJTkVfXywgYnJkcC0+YnJkbnIpOworCQlwdHIgPSBOVUxMOworCQl2YWwgPSAwOworCX0gZWxzZSB7CisJCXB0ciA9IGJyZHAtPm1lbWJhc2UgKyAob2Zmc2V0ICUgRUNQX01DUEFHRVNJWkUpOworCQl2YWwgPSAoKHVuc2lnbmVkIGNoYXIpIChvZmZzZXQgLyBFQ1BfTUNQQUdFU0laRSkpIHwgRUNQX01DRU5BQkxFOworCX0KKwlvdXRiKHZhbCwgKGJyZHAtPmlvYmFzZSArIEVDUF9NQ0NPTkZSKSk7CisJcmV0dXJuKHB0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BtY3Jlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3sJCisJb3V0YihFQ1BfTUNTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX01DQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoRUNQX01DRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9NQ0NPTkZSKSk7CisJdWRlbGF5KDUwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgc2V0IG9mIGZ1bmN0aW9ucyBhY3Qgb24gRUNQIFBDSSBib2FyZHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9lY3BwY2lpbml0KHN0bGlicmRfdCAqYnJkcCkKK3sKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2VjcHBjaWluaXQoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKEVDUF9QQ0lTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX1BDSUNPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKDAsIChicmRwLT5pb2Jhc2UgKyBFQ1BfUENJQ09ORlIpKTsKKwl1ZGVsYXkoNTAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9lY3BwY2lnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCit7CQorCXZvaWQJCSpwdHI7CisJdW5zaWduZWQgY2hhcgl2YWw7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2VjcHBjaWdldG1lbXB0cihicmRwPSV4LG9mZnNldD0leCxsaW5lPSVkKVxuIiwKKwkJKGludCkgYnJkcCwgKGludCkgb2Zmc2V0LCBsaW5lKTsKKyNlbmRpZgorCisJaWYgKG9mZnNldCA+IGJyZHAtPm1lbXNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogc2hhcmVkIG1lbW9yeSBwb2ludGVyPSV4IG91dCBvZiAiCisJCQkJInJhbmdlIGF0IGxpbmU9JWQoJWQpLCBib2FyZD0lZFxuIiwKKwkJCQkoaW50KSBvZmZzZXQsIGxpbmUsIF9fTElORV9fLCBicmRwLT5icmRucik7CisJCXB0ciA9IE5VTEw7CisJCXZhbCA9IDA7CisJfSBlbHNlIHsKKwkJcHRyID0gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBFQ1BfUENJUEFHRVNJWkUpOworCQl2YWwgPSAob2Zmc2V0IC8gRUNQX1BDSVBBR0VTSVpFKSA8PCAxOworCX0KKwlvdXRiKHZhbCwgKGJyZHAtPmlvYmFzZSArIEVDUF9QQ0lDT05GUikpOworCXJldHVybihwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bGlfZWNwcGNpcmVzZXQoc3RsaWJyZF90ICpicmRwKQorewkKKwlvdXRiKEVDUF9QQ0lTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX1BDSUNPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKDAsIChicmRwLT5pb2Jhc2UgKyBFQ1BfUENJQ09ORlIpKTsKKwl1ZGVsYXkoNTAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhY3Qgb24gT05ib2FyZHMuCisgKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJpbml0KHN0bGlicmRfdCAqYnJkcCkKK3sKKwl1bnNpZ25lZCBsb25nCW1lbWNvbmY7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmluaXQoYnJkcD0lZClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKE9OQl9BVFNUT1AsIChicmRwLT5pb2Jhc2UgKyBPTkJfQVRDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YihPTkJfQVRESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0FUQ09ORlIpKTsKKwltZGVsYXkoMTAwMCk7CisKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBPTkJfQVRBRERSTUFTSykgPj4gT05CX0FUQUREUlNIRlQ7CisJb3V0YihtZW1jb25mLCAoYnJkcC0+aW9iYXNlICsgT05CX0FUTUVNQVIpKTsKKwlvdXRiKDB4MSwgYnJkcC0+aW9iYXNlKTsKKwltZGVsYXkoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJlbmFibGUoc3RsaWJyZF90ICpicmRwKQorewkKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmVuYWJsZShicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKwlvdXRiKChicmRwLT5lbmFidmFsIHwgT05CX0FURU5BQkxFKSwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9vbmJkaXNhYmxlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoKGJyZHAtPmVuYWJ2YWwgfCBPTkJfQVRESVNBQkxFKSwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNoYXIgKnN0bGlfb25iZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorewkKKwl2b2lkCSpwdHI7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmdldG1lbXB0cihicmRwPSV4LG9mZnNldD0leClcbiIsIChpbnQpIGJyZHAsCisJCShpbnQpIG9mZnNldCk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJCShpbnQpIG9mZnNldCwgbGluZSwgX19MSU5FX18sIGJyZHAtPmJyZG5yKTsKKwkJcHRyID0gTlVMTDsKKwl9IGVsc2UgeworCQlwdHIgPSBicmRwLT5tZW1iYXNlICsgKG9mZnNldCAlIE9OQl9BVFBBR0VTSVpFKTsKKwl9CisJcmV0dXJuKHB0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJyZXNldChzdGxpYnJkX3QgKmJyZHApCit7CQorCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9vbmJyZXNldChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoT05CX0FUU1RPUCwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKE9OQl9BVERJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBPTkJfQVRDT05GUikpOworCW1kZWxheSgxMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhY3Qgb24gT05ib2FyZCBFSVNBLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfb25iZWluaXQoc3RsaWJyZF90ICpicmRwKQoreworCXVuc2lnbmVkIGxvbmcJbWVtY29uZjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfb25iZWluaXQoYnJkcD0lZClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlvdXRiKDB4MSwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSUJSREVOQUIpKTsKKwlvdXRiKE9OQl9FSVNUT1AsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworCXVkZWxheSgxMCk7CisJb3V0YihPTkJfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwltZGVsYXkoMTAwMCk7CisKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBPTkJfRUlBRERSTUFTS0wpID4+IE9OQl9FSUFERFJTSEZUTDsKKwlvdXRiKG1lbWNvbmYsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlNRU1BUkwpKTsKKwltZW1jb25mID0gKGJyZHAtPm1lbWFkZHIgJiBPTkJfRUlBRERSTUFTS0gpID4+IE9OQl9FSUFERFJTSEZUSDsKKwlvdXRiKG1lbWNvbmYsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlNRU1BUkgpKTsKKwlvdXRiKDB4MSwgYnJkcC0+aW9iYXNlKTsKKwltZGVsYXkoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9vbmJlZW5hYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9vbmJlZW5hYmxlKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCW91dGIoT05CX0VJRU5BQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX29uYmVkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3sJCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9vbmJlZGlzYWJsZShicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKwlvdXRiKE9OQl9FSURJU0FCTEUsIChicmRwLT5pb2Jhc2UgKyBPTkJfRUlDT05GUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyICpzdGxpX29uYmVnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCit7CQorCXZvaWQJCSpwdHI7CisJdW5zaWduZWQgY2hhcgl2YWw7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX29uYmVnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgsbGluZT0lZClcbiIsCisJCShpbnQpIGJyZHAsIChpbnQpIG9mZnNldCwgbGluZSk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNoYXJlZCBtZW1vcnkgcG9pbnRlcj0leCBvdXQgb2YgIgorCQkJCSJyYW5nZSBhdCBsaW5lPSVkKCVkKSwgYnJkPSVkXG4iLAorCQkJKGludCkgb2Zmc2V0LCBsaW5lLCBfX0xJTkVfXywgYnJkcC0+YnJkbnIpOworCQlwdHIgPSBOVUxMOworCQl2YWwgPSAwOworCX0gZWxzZSB7CisJCXB0ciA9IGJyZHAtPm1lbWJhc2UgKyAob2Zmc2V0ICUgT05CX0VJUEFHRVNJWkUpOworCQlpZiAob2Zmc2V0IDwgT05CX0VJUEFHRVNJWkUpCisJCQl2YWwgPSBPTkJfRUlFTkFCTEU7CisJCWVsc2UKKwkJCXZhbCA9IE9OQl9FSUVOQUJMRSB8IDB4NDA7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX29uYmVyZXNldChzdGxpYnJkX3QgKmJyZHApCit7CQorCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9FUlIgInN0bGlfb25iZXJlc2V0KGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YihPTkJfRUlTVE9QLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoT05CX0VJRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSUNPTkZSKSk7CisJbWRlbGF5KDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjdCBvbiBCcnVtYnkgYm9hcmRzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfYmJ5aW5pdChzdGxpYnJkX3QgKmJyZHApCit7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0VSUiAic3RsaV9iYnlpbml0KGJyZHA9JWQpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YihCQllfQVRTVE9QLCAoYnJkcC0+aW9iYXNlICsgQkJZX0FUQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgKGJyZHAtPmlvYmFzZSArIEJCWV9BVENPTkZSKSk7CisJbWRlbGF5KDEwMDApOworCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOworCW1kZWxheSgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9iYnlnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCit7CQorCXZvaWQJCSpwdHI7CisJdW5zaWduZWQgY2hhcgl2YWw7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0VSUiAic3RsaV9iYnlnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgpXG4iLCAoaW50KSBicmRwLAorCQkoaW50KSBvZmZzZXQpOworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID4gYnJkcC0+bWVtc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBzaGFyZWQgbWVtb3J5IHBvaW50ZXI9JXggb3V0IG9mICIKKwkJCQkicmFuZ2UgYXQgbGluZT0lZCglZCksIGJyZD0lZFxuIiwKKwkJCQkoaW50KSBvZmZzZXQsIGxpbmUsIF9fTElORV9fLCBicmRwLT5icmRucik7CisJCXB0ciA9IE5VTEw7CisJCXZhbCA9IDA7CisJfSBlbHNlIHsKKwkJcHRyID0gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBCQllfUEFHRVNJWkUpOworCQl2YWwgPSAodW5zaWduZWQgY2hhcikgKG9mZnNldCAvIEJCWV9QQUdFU0laRSk7CisJfQorCW91dGIodmFsLCAoYnJkcC0+aW9iYXNlICsgQkJZX0FUQ09ORlIpKTsKKwlyZXR1cm4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzdGxpX2JieXJlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3sJCisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2JieXJlc2V0KGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisJb3V0YihCQllfQVRTVE9QLCAoYnJkcC0+aW9iYXNlICsgQkJZX0FUQ09ORlIpKTsKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgKGJyZHAtPmlvYmFzZSArIEJCWV9BVENPTkZSKSk7CisJbWRlbGF5KDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjdCBvbiBvcmlnaW5hbCBvbGQgU3RhbGxpb24gYm9hcmRzLgorICovCisKK3N0YXRpYyB2b2lkIHN0bGlfc3RhbGluaXQoc3RsaWJyZF90ICpicmRwKQoreworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9zdGFsaW5pdChicmRwPSVkKVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOworCW1kZWxheSgxMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqc3RsaV9zdGFsZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorewkKKwl2b2lkCSpwdHI7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX3N0YWxnZXRtZW1wdHIoYnJkcD0leCxvZmZzZXQ9JXgpXG4iLCAoaW50KSBicmRwLAorCQkoaW50KSBvZmZzZXQpOworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID4gYnJkcC0+bWVtc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBzaGFyZWQgbWVtb3J5IHBvaW50ZXI9JXggb3V0IG9mICIKKwkJCQkicmFuZ2UgYXQgbGluZT0lZCglZCksIGJyZD0lZFxuIiwKKwkJCQkoaW50KSBvZmZzZXQsIGxpbmUsIF9fTElORV9fLCBicmRwLT5icmRucik7CisJCXB0ciA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcHRyID0gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBTVEFMX1BBR0VTSVpFKTsKKwl9CisJcmV0dXJuKHB0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsaV9zdGFscmVzZXQoc3RsaWJyZF90ICpicmRwKQorewkKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nCSp2ZWNwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9zdGFscmVzZXQoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwl2ZWNwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGJyZHAtPm1lbWJhc2UgKyAweDMwKTsKKwkqdmVjcCA9IDB4ZmZmZjAwMDA7CisJb3V0YigwLCBicmRwLT5pb2Jhc2UpOworCW1kZWxheSgxMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVHJ5IHRvIGZpbmQgYW4gRUNQIGJvYXJkIGFuZCBpbml0aWFsaXplIGl0LiBUaGlzIGhhbmRsZXMgb25seSBFQ1AKKyAqCWJvYXJkIHR5cGVzLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9pbml0ZWNwKHN0bGlicmRfdCAqYnJkcCkKK3sKKwljZGtlY3BzaWdfdAlzaWc7CisJY2RrZWNwc2lnX3QJKnNpZ3NwOworCXVuc2lnbmVkIGludAlzdGF0dXMsIG54dGlkOworCWNoYXIJCSpuYW1lOworCWludAkJcGFuZWxuciwgbnJwb3J0czsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaW5pdGVjcChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCWlmICghcmVxdWVzdF9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUsICJpc3RhbGxpb24iKSkKKwkJcmV0dXJuIC1FSU87CisJCisJaWYgKChicmRwLT5pb2Jhc2UgPT0gMCkgfHwgKGJyZHAtPm1lbWFkZHIgPT0gMCkpCisJeworCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7CisJCXJldHVybigtRU5PREVWKTsKKwl9CisKKwlicmRwLT5pb3NpemUgPSBFQ1BfSU9TSVpFOworCisvKgorICoJQmFzZWQgb24gdGhlIHNwZWNpZmljIGJvYXJkIHR5cGUgc2V0dXAgdGhlIGNvbW1vbiB2YXJzIHRvIGFjY2VzcworICoJYW5kIGVuYWJsZSBzaGFyZWQgbWVtb3J5LiBTZXQgYWxsIGJvYXJkIHNwZWNpZmljIGluZm9ybWF0aW9uIG5vdworICoJYXMgd2VsbC4KKyAqLworCXN3aXRjaCAoYnJkcC0+YnJkdHlwZSkgeworCWNhc2UgQlJEX0VDUDoKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBFQ1BfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBFQ1BfQVRQQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IHN0bGlfZWNwaW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gc3RsaV9lY3BlbmFibGU7CisJCWJyZHAtPnJlZW5hYmxlID0gc3RsaV9lY3BlbmFibGU7CisJCWJyZHAtPmRpc2FibGUgPSBzdGxpX2VjcGRpc2FibGU7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfZWNwZ2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfZWNwcmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKEVDOC82NCkiOworCQlicmVhazsKKworCWNhc2UgQlJEX0VDUEU6CisJCWJyZHAtPm1lbWJhc2UgPSAodm9pZCAqKSBicmRwLT5tZW1hZGRyOworCQlicmRwLT5tZW1zaXplID0gRUNQX01FTVNJWkU7CisJCWJyZHAtPnBhZ2VzaXplID0gRUNQX0VJUEFHRVNJWkU7CisJCWJyZHAtPmluaXQgPSBzdGxpX2VjcGVpaW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gc3RsaV9lY3BlaWVuYWJsZTsKKwkJYnJkcC0+cmVlbmFibGUgPSBzdGxpX2VjcGVpZW5hYmxlOworCQlicmRwLT5kaXNhYmxlID0gc3RsaV9lY3BlaWRpc2FibGU7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfZWNwZWlnZXRtZW1wdHI7CisJCWJyZHAtPmludHIgPSBzdGxpX2VjcGludHI7CisJCWJyZHAtPnJlc2V0ID0gc3RsaV9lY3BlaXJlc2V0OworCQluYW1lID0gInNlcmlhbChFQzgvNjQtRUkpIjsKKwkJYnJlYWs7CisKKwljYXNlIEJSRF9FQ1BNQzoKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBFQ1BfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBFQ1BfTUNQQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IE5VTEw7CisJCWJyZHAtPmVuYWJsZSA9IHN0bGlfZWNwbWNlbmFibGU7CisJCWJyZHAtPnJlZW5hYmxlID0gc3RsaV9lY3BtY2VuYWJsZTsKKwkJYnJkcC0+ZGlzYWJsZSA9IHN0bGlfZWNwbWNkaXNhYmxlOworCQlicmRwLT5nZXRtZW1wdHIgPSBzdGxpX2VjcG1jZ2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfZWNwbWNyZXNldDsKKwkJbmFtZSA9ICJzZXJpYWwoRUM4LzY0LU1DQSkiOworCQlicmVhazsKKworCWNhc2UgQlJEX0VDUFBDSToKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBFQ1BfUENJTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBFQ1BfUENJUEFHRVNJWkU7CisJCWJyZHAtPmluaXQgPSBzdGxpX2VjcHBjaWluaXQ7CisJCWJyZHAtPmVuYWJsZSA9IE5VTEw7CisJCWJyZHAtPnJlZW5hYmxlID0gTlVMTDsKKwkJYnJkcC0+ZGlzYWJsZSA9IE5VTEw7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfZWNwcGNpZ2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfZWNwcGNpcmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKEVDL1JBLVBDSSkiOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJcmV0dXJuKC1FSU5WQUwpOworCX0KKworLyoKKyAqCVRoZSBwZXItYm9hcmQgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgaXMgYWxsIHNldCB1cCwgc28gbm93IGxldCdzIGdvCisgKglhbmQgZ2V0IHRoZSBib2FyZCBvcGVyYXRpb25hbC4gRmlyc3RseSBpbml0aWFsaXplIGJvYXJkIGNvbmZpZ3VyYXRpb24KKyAqCXJlZ2lzdGVycy4gU2V0IHRoZSBtZW1vcnkgbWFwcGluZyBpbmZvIHNvIHdlIGNhbiBnZXQgYXQgdGhlIGJvYXJkcworICoJc2hhcmVkIG1lbW9yeS4KKyAqLworCUVCUkRJTklUKGJyZHApOworCisJYnJkcC0+bWVtYmFzZSA9IGlvcmVtYXAoYnJkcC0+bWVtYWRkciwgYnJkcC0+bWVtc2l6ZSk7CisJaWYgKGJyZHAtPm1lbWJhc2UgPT0gKHZvaWQgKikgTlVMTCkKKwl7CisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJcmV0dXJuKC1FTk9NRU0pOworCX0KKworLyoKKyAqCU5vdyB0aGF0IGFsbCBzcGVjaWZpYyBjb2RlIGlzIHNldCB1cCwgZW5hYmxlIHRoZSBzaGFyZWQgbWVtb3J5IGFuZAorICoJbG9vayBmb3IgdGhlIGEgc2lnbmF0dXJlIGFyZWEgdGhhdCB3aWxsIHRlbGwgdXMgZXhhY3RseSB3aGF0IGJvYXJkCisgKgl0aGlzIGlzLCBhbmQgd2hhdCBpdCBpcyBjb25uZWN0ZWQgdG8gaXQuCisgKi8KKwlFQlJERU5BQkxFKGJyZHApOworCXNpZ3NwID0gKGNka2VjcHNpZ190ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX1NJR0FERFIpOworCW1lbWNweSgmc2lnLCBzaWdzcCwgc2l6ZW9mKGNka2VjcHNpZ190KSk7CisJRUJSRERJU0FCTEUoYnJkcCk7CisKKyNpZiAwCisJcHJpbnRrKCIlcyglZCk6IHNpZy0+IG1hZ2ljPSV4IHJvbT0leCBwYW5lbD0leCwleCwleCwleCwleCwleCwleCwleFxuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCAoaW50KSBzaWcubWFnaWMsIHNpZy5yb212ZXIsIHNpZy5wYW5lbGlkWzBdLAorCQkoaW50KSBzaWcucGFuZWxpZFsxXSwgKGludCkgc2lnLnBhbmVsaWRbMl0sCisJCShpbnQpIHNpZy5wYW5lbGlkWzNdLCAoaW50KSBzaWcucGFuZWxpZFs0XSwKKwkJKGludCkgc2lnLnBhbmVsaWRbNV0sIChpbnQpIHNpZy5wYW5lbGlkWzZdLAorCQkoaW50KSBzaWcucGFuZWxpZFs3XSk7CisjZW5kaWYKKworCWlmIChzaWcubWFnaWMgIT0gRUNQX01BR0lDKQorCXsKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisvKgorICoJU2NhbiB0aHJvdWdoIHRoZSBzaWduYXR1cmUgbG9va2luZyBhdCB0aGUgcGFuZWxzIGNvbm5lY3RlZCB0byB0aGUKKyAqCWJvYXJkLiBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBwb3J0cyBhcyB3ZSBnby4KKyAqLworCWZvciAocGFuZWxuciA9IDAsIG54dGlkID0gMDsgKHBhbmVsbnIgPCBTVExfTUFYUEFORUxTKTsgcGFuZWxucisrKSB7CisJCXN0YXR1cyA9IHNpZy5wYW5lbGlkW254dGlkXTsKKwkJaWYgKChzdGF0dXMgJiBFQ0hfUE5MSURNQVNLKSAhPSBueHRpZCkKKwkJCWJyZWFrOworCisJCWJyZHAtPnBhbmVsaWRzW3BhbmVsbnJdID0gc3RhdHVzOworCQlucnBvcnRzID0gKHN0YXR1cyAmIEVDSF9QTkwxNlBPUlQpID8gMTYgOiA4OworCQlpZiAoKG5ycG9ydHMgPT0gMTYpICYmICgoc3RhdHVzICYgRUNIX1BOTFhQSUQpID09IDApKQorCQkJbnh0aWQrKzsKKwkJYnJkcC0+cGFuZWxzW3BhbmVsbnJdID0gbnJwb3J0czsKKwkJYnJkcC0+bnJwb3J0cyArPSBucnBvcnRzOworCQlueHRpZCsrOworCQlicmRwLT5ucnBhbmVscysrOworCX0KKworCisJYnJkcC0+c3RhdGUgfD0gQlNUX0ZPVU5EOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVHJ5IHRvIGZpbmQgYW4gT05ib2FyZCwgQnJ1bWJ5IG9yIFN0YWxsaW9uIGJvYXJkIGFuZCBpbml0aWFsaXplIGl0LgorICoJVGhpcyBoYW5kbGVzIG9ubHkgdGhlc2UgYm9hcmQgdHlwZXMuCisgKi8KKworc3RhdGljIGludCBzdGxpX2luaXRvbmIoc3RsaWJyZF90ICpicmRwKQoreworCWNka29uYnNpZ190CXNpZzsKKwljZGtvbmJzaWdfdAkqc2lnc3A7CisJY2hhcgkJKm5hbWU7CisJaW50CQlpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9pbml0b25iKGJyZHA9JXgpXG4iLCAoaW50KSBicmRwKTsKKyNlbmRpZgorCisvKgorICoJRG8gYSBiYXNpYyBzYW5pdHkgY2hlY2sgb24gdGhlIElPIGFuZCBtZW1vcnkgYWRkcmVzc2VzLgorICovCisJaWYgKChicmRwLT5pb2Jhc2UgPT0gMCkgfHwgKGJyZHAtPm1lbWFkZHIgPT0gMCkpCisJCXJldHVybigtRU5PREVWKTsKKworCWJyZHAtPmlvc2l6ZSA9IE9OQl9JT1NJWkU7CisJCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSwgImlzdGFsbGlvbiIpKQorCQlyZXR1cm4gLUVJTzsKKworLyoKKyAqCUJhc2VkIG9uIHRoZSBzcGVjaWZpYyBib2FyZCB0eXBlIHNldHVwIHRoZSBjb21tb24gdmFycyB0byBhY2Nlc3MKKyAqCWFuZCBlbmFibGUgc2hhcmVkIG1lbW9yeS4gU2V0IGFsbCBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBub3cKKyAqCWFzIHdlbGwuCisgKi8KKwlzd2l0Y2ggKGJyZHAtPmJyZHR5cGUpIHsKKwljYXNlIEJSRF9PTkJPQVJEOgorCWNhc2UgQlJEX09OQk9BUkQzMjoKKwljYXNlIEJSRF9PTkJPQVJEMjoKKwljYXNlIEJSRF9PTkJPQVJEMl8zMjoKKwljYXNlIEJSRF9PTkJPQVJEUlM6CisJCWJyZHAtPm1lbWJhc2UgPSAodm9pZCAqKSBicmRwLT5tZW1hZGRyOworCQlicmRwLT5tZW1zaXplID0gT05CX01FTVNJWkU7CisJCWJyZHAtPnBhZ2VzaXplID0gT05CX0FUUEFHRVNJWkU7CisJCWJyZHAtPmluaXQgPSBzdGxpX29uYmluaXQ7CisJCWJyZHAtPmVuYWJsZSA9IHN0bGlfb25iZW5hYmxlOworCQlicmRwLT5yZWVuYWJsZSA9IHN0bGlfb25iZW5hYmxlOworCQlicmRwLT5kaXNhYmxlID0gc3RsaV9vbmJkaXNhYmxlOworCQlicmRwLT5nZXRtZW1wdHIgPSBzdGxpX29uYmdldG1lbXB0cjsKKwkJYnJkcC0+aW50ciA9IHN0bGlfZWNwaW50cjsKKwkJYnJkcC0+cmVzZXQgPSBzdGxpX29uYnJlc2V0OworCQlpZiAoYnJkcC0+bWVtYWRkciA+IDB4MTAwMDAwKQorCQkJYnJkcC0+ZW5hYnZhbCA9IE9OQl9NRU1FTkFCSEk7CisJCWVsc2UKKwkJCWJyZHAtPmVuYWJ2YWwgPSBPTkJfTUVNRU5BQkxPOworCQluYW1lID0gInNlcmlhbChPTkJvYXJkKSI7CisJCWJyZWFrOworCisJY2FzZSBCUkRfT05CT0FSREU6CisJCWJyZHAtPm1lbWJhc2UgPSAodm9pZCAqKSBicmRwLT5tZW1hZGRyOworCQlicmRwLT5tZW1zaXplID0gT05CX0VJTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBPTkJfRUlQQUdFU0laRTsKKwkJYnJkcC0+aW5pdCA9IHN0bGlfb25iZWluaXQ7CisJCWJyZHAtPmVuYWJsZSA9IHN0bGlfb25iZWVuYWJsZTsKKwkJYnJkcC0+cmVlbmFibGUgPSBzdGxpX29uYmVlbmFibGU7CisJCWJyZHAtPmRpc2FibGUgPSBzdGxpX29uYmVkaXNhYmxlOworCQlicmRwLT5nZXRtZW1wdHIgPSBzdGxpX29uYmVnZXRtZW1wdHI7CisJCWJyZHAtPmludHIgPSBzdGxpX2VjcGludHI7CisJCWJyZHAtPnJlc2V0ID0gc3RsaV9vbmJlcmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKE9OQm9hcmQvRSkiOworCQlicmVhazsKKworCWNhc2UgQlJEX0JSVU1CWTQ6CisJY2FzZSBCUkRfQlJVTUJZODoKKwljYXNlIEJSRF9CUlVNQlkxNjoKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbXNpemUgPSBCQllfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBCQllfUEFHRVNJWkU7CisJCWJyZHAtPmluaXQgPSBzdGxpX2JieWluaXQ7CisJCWJyZHAtPmVuYWJsZSA9IE5VTEw7CisJCWJyZHAtPnJlZW5hYmxlID0gTlVMTDsKKwkJYnJkcC0+ZGlzYWJsZSA9IE5VTEw7CisJCWJyZHAtPmdldG1lbXB0ciA9IHN0bGlfYmJ5Z2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfYmJ5cmVzZXQ7CisJCW5hbWUgPSAic2VyaWFsKEJydW1ieSkiOworCQlicmVhazsKKworCWNhc2UgQlJEX1NUQUxMSU9OOgorCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKKwkJYnJkcC0+bWVtc2l6ZSA9IFNUQUxfTUVNU0laRTsKKwkJYnJkcC0+cGFnZXNpemUgPSBTVEFMX1BBR0VTSVpFOworCQlicmRwLT5pbml0ID0gc3RsaV9zdGFsaW5pdDsKKwkJYnJkcC0+ZW5hYmxlID0gTlVMTDsKKwkJYnJkcC0+cmVlbmFibGUgPSBOVUxMOworCQlicmRwLT5kaXNhYmxlID0gTlVMTDsKKwkJYnJkcC0+Z2V0bWVtcHRyID0gc3RsaV9zdGFsZ2V0bWVtcHRyOworCQlicmRwLT5pbnRyID0gc3RsaV9lY3BpbnRyOworCQlicmRwLT5yZXNldCA9IHN0bGlfc3RhbHJlc2V0OworCQluYW1lID0gInNlcmlhbChTdGFsbGlvbikiOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJcmV0dXJuKC1FSU5WQUwpOworCX0KKworLyoKKyAqCVRoZSBwZXItYm9hcmQgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgaXMgYWxsIHNldCB1cCwgc28gbm93IGxldCdzIGdvCisgKglhbmQgZ2V0IHRoZSBib2FyZCBvcGVyYXRpb25hbC4gRmlyc3RseSBpbml0aWFsaXplIGJvYXJkIGNvbmZpZ3VyYXRpb24KKyAqCXJlZ2lzdGVycy4gU2V0IHRoZSBtZW1vcnkgbWFwcGluZyBpbmZvIHNvIHdlIGNhbiBnZXQgYXQgdGhlIGJvYXJkcworICoJc2hhcmVkIG1lbW9yeS4KKyAqLworCUVCUkRJTklUKGJyZHApOworCisJYnJkcC0+bWVtYmFzZSA9IGlvcmVtYXAoYnJkcC0+bWVtYWRkciwgYnJkcC0+bWVtc2l6ZSk7CisJaWYgKGJyZHAtPm1lbWJhc2UgPT0gKHZvaWQgKikgTlVMTCkKKwl7CisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJcmV0dXJuKC1FTk9NRU0pOworCX0KKworLyoKKyAqCU5vdyB0aGF0IGFsbCBzcGVjaWZpYyBjb2RlIGlzIHNldCB1cCwgZW5hYmxlIHRoZSBzaGFyZWQgbWVtb3J5IGFuZAorICoJbG9vayBmb3IgdGhlIGEgc2lnbmF0dXJlIGFyZWEgdGhhdCB3aWxsIHRlbGwgdXMgZXhhY3RseSB3aGF0IGJvYXJkCisgKgl0aGlzIGlzLCBhbmQgaG93IG1hbnkgcG9ydHMuCisgKi8KKwlFQlJERU5BQkxFKGJyZHApOworCXNpZ3NwID0gKGNka29uYnNpZ190ICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgQ0RLX1NJR0FERFIpOworCW1lbWNweSgmc2lnLCBzaWdzcCwgc2l6ZW9mKGNka29uYnNpZ190KSk7CisJRUJSRERJU0FCTEUoYnJkcCk7CisKKyNpZiAwCisJcHJpbnRrKCIlcyglZCk6IHNpZy0+IG1hZ2ljPSV4OiV4OiV4OiV4IHJvbXZlcj0leCBhbWFzaz0leDoleDoleFxuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCBzaWcubWFnaWMwLCBzaWcubWFnaWMxLCBzaWcubWFnaWMyLAorCQlzaWcubWFnaWMzLCBzaWcucm9tdmVyLCBzaWcuYW1hc2swLCBzaWcuYW1hc2sxLCBzaWcuYW1hc2syKTsKKyNlbmRpZgorCisJaWYgKChzaWcubWFnaWMwICE9IE9OQl9NQUdJQzApIHx8IChzaWcubWFnaWMxICE9IE9OQl9NQUdJQzEpIHx8CisJICAgIChzaWcubWFnaWMyICE9IE9OQl9NQUdJQzIpIHx8IChzaWcubWFnaWMzICE9IE9OQl9NQUdJQzMpKQorCXsKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisvKgorICoJU2NhbiB0aHJvdWdoIHRoZSBzaWduYXR1cmUgYWxpdmUgbWFzayBhbmQgY2FsY3VsYXRlIGhvdyBtYW55IHBvcnRzCisgKgl0aGVyZSBhcmUgb24gdGhpcyBib2FyZC4KKyAqLworCWJyZHAtPm5ycGFuZWxzID0gMTsKKwlpZiAoc2lnLmFtYXNrMSkgeworCQlicmRwLT5ucnBvcnRzID0gMzI7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgKGkgPCAxNik7IGkrKykgeworCQkJaWYgKCgoc2lnLmFtYXNrMCA8PCBpKSAmIDB4ODAwMCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlicmRwLT5ucnBvcnRzID0gaTsKKwl9CisJYnJkcC0+cGFuZWxzWzBdID0gYnJkcC0+bnJwb3J0czsKKworCisJYnJkcC0+c3RhdGUgfD0gQlNUX0ZPVU5EOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU3RhcnQgdXAgYSBydW5uaW5nIGJvYXJkLiBUaGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlCisgKgljb2RlIGhhcyBiZWVuIGRvd24gbG9hZGVkIHRvIHRoZSBib2FyZCBhbmQgaXMgb3BlcmF0aW9uYWwuIEl0IHdpbGwKKyAqCXJlYWQgaW4gdGhlIG1lbW9yeSBtYXAsIGFuZCBnZXQgdGhlIHNob3cgb24gdGhlIHJvYWQuLi4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfc3RhcnRicmQoc3RsaWJyZF90ICpicmRwKQoreworCXZvbGF0aWxlIGNka2hkcl90CSpoZHJwOworCXZvbGF0aWxlIGNka21lbV90CSptZW1wOworCXZvbGF0aWxlIGNka2FzeV90CSphcDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlzdGxpcG9ydF90CQkqcG9ydHA7CisJaW50CQkJcG9ydG5yLCBucmRldnMsIGksIHJjOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9zdGFydGJyZChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworCXJjID0gMDsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUVCUkRFTkFCTEUoYnJkcCk7CisJaGRycCA9ICh2b2xhdGlsZSBjZGtoZHJfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIENES19DREtBRERSKTsKKwlucmRldnMgPSBoZHJwLT5ucmRldnM7CisKKyNpZiAwCisJcHJpbnRrKCIlcyglZCk6IENESyB2ZXJzaW9uICVkLiVkLiVkIC0tPiAiCisJCSJucmRldnM9JWQgbWVtcD0leCBob3N0cD0leCBzbGF2ZXA9JXhcbiIsCisJCSBfX0ZJTEVfXywgX19MSU5FX18sIGhkcnAtPnZlcl9yZWxlYXNlLCBoZHJwLT52ZXJfbW9kaWZpY2F0aW9uLAorCQkgaGRycC0+dmVyX2ZpeCwgbnJkZXZzLCAoaW50KSBoZHJwLT5tZW1wLCAoaW50KSBoZHJwLT5ob3N0cCwKKwkJIChpbnQpIGhkcnAtPnNsYXZlcCk7CisjZW5kaWYKKworCWlmIChucmRldnMgPCAoYnJkcC0+bnJwb3J0cyArIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IHNsYXZlIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCQkiYWxsIGRldmljZXMsIGRldmljZXM9JWRcbiIsIG5yZGV2cyk7CisJCWJyZHAtPm5ycG9ydHMgPSBucmRldnMgLSAxOworCX0KKwlicmRwLT5ucmRldnMgPSBucmRldnM7CisJYnJkcC0+aG9zdG9mZnNldCA9IGhkcnAtPmhvc3RwIC0gQ0RLX0NES0FERFI7CisJYnJkcC0+c2xhdmVvZmZzZXQgPSBoZHJwLT5zbGF2ZXAgLSBDREtfQ0RLQUREUjsKKwlicmRwLT5iaXRzaXplID0gKG5yZGV2cyArIDcpIC8gODsKKwltZW1wID0gKHZvbGF0aWxlIGNka21lbV90ICopIGhkcnAtPm1lbXA7CisJaWYgKCgodW5zaWduZWQgbG9uZykgbWVtcCkgPiBicmRwLT5tZW1zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGNvcnJ1cHRlZCBzaGFyZWQgbWVtb3J5IHJlZ2lvbj9cbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gc3RsaV9kb25lc3RhcnR1cDsKKwl9CisJbWVtcCA9ICh2b2xhdGlsZSBjZGttZW1fdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsICh1bnNpZ25lZCBsb25nKSBtZW1wKTsKKwlpZiAobWVtcC0+ZHR5cGUgIT0gVFlQX0FTWU5DVFJMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IG5vIHNsYXZlIGNvbnRyb2wgZGV2aWNlIGZvdW5kXG4iKTsKKwkJZ290byBzdGxpX2RvbmVzdGFydHVwOworCX0KKwltZW1wKys7CisKKy8qCisgKglDeWNsZSB0aHJvdWdoIG1lbW9yeSBhbGxvY2F0aW9uIG9mIGVhY2ggcG9ydC4gV2UgYXJlIGd1YXJhbnRlZWQgdG8KKyAqCWhhdmUgYWxsIHBvcnRzIGluc2lkZSB0aGUgZmlyc3QgcGFnZSBvZiBzbGF2ZSB3aW5kb3csIHNvIG5vIG5lZWQgdG8KKyAqCWNoYW5nZSBwYWdlcyB3aGlsZSByZWFkaW5nIG1lbW9yeSBtYXAuCisgKi8KKwlmb3IgKGkgPSAxLCBwb3J0bnIgPSAwOyAoaSA8IG5yZGV2cyk7IGkrKywgcG9ydG5yKyssIG1lbXArKykgeworCQlpZiAobWVtcC0+ZHR5cGUgIT0gVFlQX0FTWU5DKQorCQkJYnJlYWs7CisJCXBvcnRwID0gYnJkcC0+cG9ydHNbcG9ydG5yXTsKKwkJaWYgKHBvcnRwID09IChzdGxpcG9ydF90ICopIE5VTEwpCisJCQlicmVhazsKKwkJcG9ydHAtPmRldm5yID0gaTsKKwkJcG9ydHAtPmFkZHIgPSBtZW1wLT5vZmZzZXQ7CisJCXBvcnRwLT5yZXFiaXQgPSAodW5zaWduZWQgY2hhcikgKDB4MSA8PCAoaSAqIDggLyBucmRldnMpKTsKKwkJcG9ydHAtPnBvcnRpZHggPSAodW5zaWduZWQgY2hhcikgKGkgLyA4KTsKKwkJcG9ydHAtPnBvcnRiaXQgPSAodW5zaWduZWQgY2hhcikgKDB4MSA8PCAoaSAlIDgpKTsKKwl9CisKKwloZHJwLT5zbGF2ZXJlcSA9IDB4ZmY7CisKKy8qCisgKglGb3IgZWFjaCBwb3J0IHNldHVwIGEgbG9jYWwgY29weSBvZiB0aGUgUlggYW5kIFRYIGJ1ZmZlciBvZmZzZXRzCisgKglhbmQgc2l6ZXMuIFdlIGRvIHRoaXMgc2VwYXJhdGUgZnJvbSB0aGUgYWJvdmUsIGJlY2F1c2Ugd2UgbmVlZCB0bworICoJbW92ZSB0aGUgc2hhcmVkIG1lbW9yeSBwYWdlLi4uCisgKi8KKwlmb3IgKGkgPSAxLCBwb3J0bnIgPSAwOyAoaSA8IG5yZGV2cyk7IGkrKywgcG9ydG5yKyspIHsKKwkJcG9ydHAgPSBicmRwLT5wb3J0c1twb3J0bnJdOworCQlpZiAocG9ydHAgPT0gKHN0bGlwb3J0X3QgKikgTlVMTCkKKwkJCWJyZWFrOworCQlpZiAocG9ydHAtPmFkZHIgPT0gMCkKKwkJCWJyZWFrOworCQlhcCA9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT5hZGRyKTsKKwkJaWYgKGFwICE9ICh2b2xhdGlsZSBjZGthc3lfdCAqKSBOVUxMKSB7CisJCQlwb3J0cC0+cnhzaXplID0gYXAtPnJ4cS5zaXplOworCQkJcG9ydHAtPnR4c2l6ZSA9IGFwLT50eHEuc2l6ZTsKKwkJCXBvcnRwLT5yeG9mZnNldCA9IGFwLT5yeHEub2Zmc2V0OworCQkJcG9ydHAtPnR4b2Zmc2V0ID0gYXAtPnR4cS5vZmZzZXQ7CisJCX0KKwl9CisKK3N0bGlfZG9uZXN0YXJ0dXA6CisJRUJSRERJU0FCTEUoYnJkcCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlpZiAocmMgPT0gMCkKKwkJYnJkcC0+c3RhdGUgfD0gQlNUX1NUQVJURUQ7CisKKwlpZiAoISBzdGxpX3RpbWVyb24pIHsKKwkJc3RsaV90aW1lcm9uKys7CisJCXN0bGlfdGltZXJsaXN0LmV4cGlyZXMgPSBTVExJX1RJTUVPVVQ7CisJCWFkZF90aW1lcigmc3RsaV90aW1lcmxpc3QpOworCX0KKworCXJldHVybihyYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVByb2JlIGFuZCBpbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgYm9hcmQuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc3RsaV9icmRpbml0KHN0bGlicmRfdCAqYnJkcCkKK3sKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2JyZGluaXQoYnJkcD0leClcbiIsIChpbnQpIGJyZHApOworI2VuZGlmCisKKwlzdGxpX2JyZHNbYnJkcC0+YnJkbnJdID0gYnJkcDsKKworCXN3aXRjaCAoYnJkcC0+YnJkdHlwZSkgeworCWNhc2UgQlJEX0VDUDoKKwljYXNlIEJSRF9FQ1BFOgorCWNhc2UgQlJEX0VDUE1DOgorCWNhc2UgQlJEX0VDUFBDSToKKwkJc3RsaV9pbml0ZWNwKGJyZHApOworCQlicmVhazsKKwljYXNlIEJSRF9PTkJPQVJEOgorCWNhc2UgQlJEX09OQk9BUkRFOgorCWNhc2UgQlJEX09OQk9BUkQyOgorCWNhc2UgQlJEX09OQk9BUkQzMjoKKwljYXNlIEJSRF9PTkJPQVJEMl8zMjoKKwljYXNlIEJSRF9PTkJPQVJEUlM6CisJY2FzZSBCUkRfQlJVTUJZNDoKKwljYXNlIEJSRF9CUlVNQlk4OgorCWNhc2UgQlJEX0JSVU1CWTE2OgorCWNhc2UgQlJEX1NUQUxMSU9OOgorCQlzdGxpX2luaXRvbmIoYnJkcCk7CisJCWJyZWFrOworCWNhc2UgQlJEX0VBU1lJTzoKKwljYXNlIEJSRF9FQ0g6CisJY2FzZSBCUkRfRUNITUM6CisJY2FzZSBCUkRfRUNIUENJOgorCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiAlcyBib2FyZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gIgorCQkJCSJ0aGlzIGRyaXZlclxuIiwgc3RsaV9icmRuYW1lc1ticmRwLT5icmR0eXBlXSk7CisJCXJldHVybihFTk9ERVYpOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGJvYXJkPSVkIGlzIHVua25vd24gYm9hcmQgIgorCQkJCSJ0eXBlPSVkXG4iLCBicmRwLT5icmRuciwgYnJkcC0+YnJkdHlwZSk7CisJCXJldHVybihFTk9ERVYpOworCX0KKworCWlmICgoYnJkcC0+c3RhdGUgJiBCU1RfRk9VTkQpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogJXMgYm9hcmQgbm90IGZvdW5kLCBib2FyZD0lZCAiCisJCQkJImlvPSV4IG1lbT0leFxuIiwKKwkJCXN0bGlfYnJkbmFtZXNbYnJkcC0+YnJkdHlwZV0sIGJyZHAtPmJyZG5yLAorCQkJYnJkcC0+aW9iYXNlLCAoaW50KSBicmRwLT5tZW1hZGRyKTsKKwkJcmV0dXJuKEVOT0RFVik7CisJfQorCisJc3RsaV9pbml0cG9ydHMoYnJkcCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiU1RBTExJT046ICVzIGZvdW5kLCBib2FyZD0lZCBpbz0leCBtZW09JXggIgorCQkibnJwYW5lbHM9JWQgbnJwb3J0cz0lZFxuIiwgc3RsaV9icmRuYW1lc1ticmRwLT5icmR0eXBlXSwKKwkJYnJkcC0+YnJkbnIsIGJyZHAtPmlvYmFzZSwgKGludCkgYnJkcC0+bWVtYWRkciwKKwkJYnJkcC0+bnJwYW5lbHMsIGJyZHAtPm5ycG9ydHMpOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUHJvYmUgYXJvdW5kIHRyeWluZyB0byBmaW5kIHdoZXJlIHRoZSBFSVNBIGJvYXJkcyBzaGFyZWQgbWVtb3J5CisgKgltaWdodCBiZS4gVGhpcyBpcyBhIGJpdCBpZiBoYWNrLCBidXQgaXQgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9laXNhbWVtcHJvYmUoc3RsaWJyZF90ICpicmRwKQoreworCWNka2VjcHNpZ190CWVjcHNpZywgKmVjcHNpZ3A7CisJY2Rrb25ic2lnX3QJb25ic2lnLCAqb25ic2lncDsKKwlpbnQJCWksIGZvdW5kaXQ7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2Vpc2FtZW1wcm9iZShicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7CisjZW5kaWYKKworLyoKKyAqCUZpcnN0IHVwIHdlIHJlc2V0IHRoZSBib2FyZCwgdG8gZ2V0IGl0IGludG8gYSBrbm93biBzdGF0ZS4gVGhlcmUKKyAqCWlzIG9ubHkgMiBib2FyZCB0eXBlcyBoZXJlIHdlIG5lZWQgdG8gd29ycnkgYWJvdXQuIERvbjt0IHVzZSB0aGUKKyAqCXN0YW5kYXJkIGJvYXJkIGluaXQgcm91dGluZSBoZXJlLCBpdCBwcm9ncmFtcyB1cCB0aGUgc2hhcmVkCisgKgltZW1vcnkgYWRkcmVzcywgYW5kIHdlIGRvbid0IGtub3cgaXQgeWV0Li4uCisgKi8KKwlpZiAoYnJkcC0+YnJkdHlwZSA9PSBCUkRfRUNQRSkgeworCQlvdXRiKDB4MSwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUJSREVOQUIpKTsKKwkJb3V0YihFQ1BfRUlTVE9QLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwkJdWRlbGF5KDEwKTsKKwkJb3V0YihFQ1BfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0VJQ09ORlIpKTsKKwkJdWRlbGF5KDUwMCk7CisJCXN0bGlfZWNwZWllbmFibGUoYnJkcCk7CisJfSBlbHNlIGlmIChicmRwLT5icmR0eXBlID09IEJSRF9PTkJPQVJERSkgeworCQlvdXRiKDB4MSwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSUJSREVOQUIpKTsKKwkJb3V0YihPTkJfRUlTVE9QLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwkJdWRlbGF5KDEwKTsKKwkJb3V0YihPTkJfRUlESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKKwkJbWRlbGF5KDEwMCk7CisJCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOworCQltZGVsYXkoMSk7CisJCXN0bGlfb25iZWVuYWJsZShicmRwKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorCisJZm91bmRpdCA9IDA7CisJYnJkcC0+bWVtc2l6ZSA9IEVDUF9NRU1TSVpFOworCisvKgorICoJQm9hcmQgc2hhcmVkIG1lbW9yeSBpcyBlbmFibGVkLCBzbyBub3cgd2UgaGF2ZSBhIHBva2UgYXJvdW5kIGFuZAorICoJc2VlIGlmIHdlIGNhbiBmaW5kIGl0LgorICovCisJZm9yIChpID0gMDsgKGkgPCBzdGxpX2Vpc2FtZW1wc2l6ZSk7IGkrKykgeworCQlicmRwLT5tZW1hZGRyID0gc3RsaV9laXNhbWVtcHJvYmVhZGRyc1tpXTsKKwkJYnJkcC0+bWVtYmFzZSA9ICh2b2lkICopIGJyZHAtPm1lbWFkZHI7CisJCWJyZHAtPm1lbWJhc2UgPSBpb3JlbWFwKGJyZHAtPm1lbWFkZHIsIGJyZHAtPm1lbXNpemUpOworCQlpZiAoYnJkcC0+bWVtYmFzZSA9PSAodm9pZCAqKSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX0VDUEUpIHsKKwkJCWVjcHNpZ3AgPSAoY2RrZWNwc2lnX3QgKikgc3RsaV9lY3BlaWdldG1lbXB0cihicmRwLAorCQkJCUNES19TSUdBRERSLCBfX0xJTkVfXyk7CisJCQltZW1jcHkoJmVjcHNpZywgZWNwc2lncCwgc2l6ZW9mKGNka2VjcHNpZ190KSk7CisJCQlpZiAoZWNwc2lnLm1hZ2ljID09IEVDUF9NQUdJQykKKwkJCQlmb3VuZGl0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCW9uYnNpZ3AgPSAoY2Rrb25ic2lnX3QgKikgc3RsaV9vbmJlZ2V0bWVtcHRyKGJyZHAsCisJCQkJQ0RLX1NJR0FERFIsIF9fTElORV9fKTsKKwkJCW1lbWNweSgmb25ic2lnLCBvbmJzaWdwLCBzaXplb2YoY2Rrb25ic2lnX3QpKTsKKwkJCWlmICgob25ic2lnLm1hZ2ljMCA9PSBPTkJfTUFHSUMwKSAmJgorCQkJICAgIChvbmJzaWcubWFnaWMxID09IE9OQl9NQUdJQzEpICYmCisJCQkgICAgKG9uYnNpZy5tYWdpYzIgPT0gT05CX01BR0lDMikgJiYKKwkJCSAgICAob25ic2lnLm1hZ2ljMyA9PSBPTkJfTUFHSUMzKSkKKwkJCQlmb3VuZGl0ID0gMTsKKwkJfQorCisJCWlvdW5tYXAoYnJkcC0+bWVtYmFzZSk7CisJCWlmIChmb3VuZGl0KQorCQkJYnJlYWs7CisJfQorCisvKgorICoJUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIGZvdW5kIHRoZSBzaGFyZWQgbWVtb3J5IG9yIG5vdCB3ZSBtdXN0CisgKglkaXNhYmxlIHRoZSByZWdpb24uIEFmdGVyIHRoYXQgcmV0dXJuIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAqLworCWlmIChicmRwLT5icmR0eXBlID09IEJSRF9FQ1BFKQorCQlzdGxpX2VjcGVpZGlzYWJsZShicmRwKTsKKwllbHNlCisJCXN0bGlfb25iZWRpc2FibGUoYnJkcCk7CisKKwlpZiAoISBmb3VuZGl0KSB7CisJCWJyZHAtPm1lbWFkZHIgPSAwOworCQlicmRwLT5tZW1iYXNlID0gTlVMTDsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogZmFpbGVkIHRvIHByb2JlIHNoYXJlZCBtZW1vcnkgIgorCQkJCSJyZWdpb24gZm9yICVzIGluIEVJU0Egc2xvdD0lZFxuIiwKKwkJCXN0bGlfYnJkbmFtZXNbYnJkcC0+YnJkdHlwZV0sIChicmRwLT5pb2Jhc2UgPj4gMTIpKTsKKwkJcmV0dXJuKC1FTk9ERVYpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgc3RsaV9nZXRicmRucih2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNUTF9NQVhCUkRTOyBpKyspIHsKKwkJaWYgKCFzdGxpX2JyZHNbaV0pIHsKKwkJCWlmIChpID49IHN0bGlfbnJicmRzKQorCQkJCXN0bGlfbnJicmRzID0gaSArIDE7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVByb2JlIGFyb3VuZCBhbmQgdHJ5IHRvIGZpbmQgYW55IEVJU0EgYm9hcmRzIGluIHN5c3RlbS4gVGhlIGJpZ2dlc3QKKyAqCXByb2JsZW0gaGVyZSBpcyBmaW5kaW5nIG91dCB3aGF0IG1lbW9yeSBhZGRyZXNzIGlzIGFzc29jaWF0ZWQgd2l0aAorICoJYW4gRUlTQSBib2FyZCBhZnRlciBpdCBpcyBmb3VuZC4gVGhlIHJlZ2lzdGVycyBvZiB0aGUgRUNQRSBhbmQKKyAqCU9OYm9hcmRFIGFyZSBub3QgcmVhZGFibGUgLSBzbyB3ZSBjYW4ndCByZWFkIHRoZW0gZnJvbSB0aGVyZS4gV2UKKyAqCWRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBFSVNBIENNT1MgKG9yIEVJU0EgQklPUykgc28gd2UgZG9uJ3QKKyAqCWFjdHVhbGx5IGhhdmUgYW55IHdheSB0byBmaW5kIG91dCB0aGUgcmVhbCB2YWx1ZS4gVGhlIGJlc3Qgd2UgY2FuCisgKglkbyBpcyBnbyBwcm9iaW5nIGFyb3VuZCBpbiB0aGUgdXN1YWwgcGxhY2VzIGhvcGluZyB3ZSBjYW4gZmluZCBpdC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZmluZGVpc2FicmRzKHZvaWQpCit7CisJc3RsaWJyZF90CSpicmRwOworCXVuc2lnbmVkIGludAlpb2Jhc2UsIGVpZDsKKwlpbnQJCWk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX2ZpbmRlaXNhYnJkcygpXG4iKTsKKyNlbmRpZgorCisvKgorICoJRmlyc3RseSBjaGVjayBpZiB0aGlzIGlzIGFuIEVJU0Egc3lzdGVtLiBEbyB0aGlzIGJ5IHByb2JpbmcgZm9yCisgKgl0aGUgc3lzdGVtIGJvYXJkIEVJU0EgSUQuIElmIHRoaXMgaXMgbm90IGFuIEVJU0Egc3lzdGVtIHRoZW4KKyAqCWRvbid0IGJvdGhlciBnb2luZyBhbnkgZnVydGhlciEKKyAqLworCW91dGIoMHhmZiwgMHhjODApOworCWlmIChpbmIoMHhjODApID09IDB4ZmYpCisJCXJldHVybigwKTsKKworLyoKKyAqCUxvb2tzIGxpa2UgYW4gRUlTQSBzeXN0ZW0sIHNvIGdvIHNlYXJjaGluZyBmb3IgRUlTQSBib2FyZHMuCisgKi8KKwlmb3IgKGlvYmFzZSA9IDB4MTAwMDsgKGlvYmFzZSA8PSAweGMwMDApOyBpb2Jhc2UgKz0gMHgxMDAwKSB7CisJCW91dGIoMHhmZiwgKGlvYmFzZSArIDB4YzgwKSk7CisJCWVpZCA9IGluYihpb2Jhc2UgKyAweGM4MCk7CisJCWVpZCB8PSBpbmIoaW9iYXNlICsgMHhjODEpIDw8IDg7CisJCWlmIChlaWQgIT0gU1RMX0VJU0FJRCkKKwkJCWNvbnRpbnVlOworCisvKgorICoJCVdlIGhhdmUgZm91bmQgYSBib2FyZC4gTmVlZCB0byBjaGVjayBpZiB0aGlzIGJvYXJkIHdhcworICoJCXN0YXRpY2FsbHkgY29uZmlndXJlZCBhbHJlYWR5IChqdXN0IGluIGNhc2UhKS4KKyAqLworCQlmb3IgKGkgPSAwOyAoaSA8IFNUTF9NQVhCUkRTKTsgaSsrKSB7CisJCQlicmRwID0gc3RsaV9icmRzW2ldOworCQkJaWYgKGJyZHAgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGJyZHAtPmlvYmFzZSA9PSBpb2Jhc2UpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPCBTVExfTUFYQlJEUykKKwkJCWNvbnRpbnVlOworCisvKgorICoJCVdlIGhhdmUgZm91bmQgYSBTdGFsbGlvbiBib2FyZCBhbmQgaXQgaXMgbm90IGNvbmZpZ3VyZWQgYWxyZWFkeS4KKyAqCQlBbGxvY2F0ZSBhIGJvYXJkIHN0cnVjdHVyZSBhbmQgaW5pdGlhbGl6ZSBpdC4KKyAqLworCQlpZiAoKGJyZHAgPSBzdGxpX2FsbG9jYnJkKCkpID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCXJldHVybigtRU5PTUVNKTsKKwkJaWYgKChicmRwLT5icmRuciA9IHN0bGlfZ2V0YnJkbnIoKSkgPCAwKQorCQkJcmV0dXJuKC1FTk9NRU0pOworCQllaWQgPSBpbmIoaW9iYXNlICsgMHhjODIpOworCQlpZiAoZWlkID09IEVDUF9FSVNBSUQpCisJCQlicmRwLT5icmR0eXBlID0gQlJEX0VDUEU7CisJCWVsc2UgaWYgKGVpZCA9PSBPTkJfRUlTQUlEKQorCQkJYnJkcC0+YnJkdHlwZSA9IEJSRF9PTkJPQVJERTsKKwkJZWxzZQorCQkJYnJkcC0+YnJkdHlwZSA9IEJSRF9VTktOT1dOOworCQlicmRwLT5pb2Jhc2UgPSBpb2Jhc2U7CisJCW91dGIoMHgxLCAoaW9iYXNlICsgMHhjODQpKTsKKwkJaWYgKHN0bGlfZWlzYW1lbXByb2JlKGJyZHApKQorCQkJb3V0YigwLCAoaW9iYXNlICsgMHhjODQpKTsKKwkJc3RsaV9icmRpbml0KGJyZHApOworCX0KKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmluZCB0aGUgbmV4dCBhdmFpbGFibGUgYm9hcmQgbnVtYmVyIHRoYXQgaXMgZnJlZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglDT05GSUdfUENJCisKKy8qCisgKglXZSBoYXZlIGEgU3RhbGxpb24gYm9hcmQuIEFsbG9jYXRlIGEgYm9hcmQgc3RydWN0dXJlIGFuZAorICoJaW5pdGlhbGl6ZSBpdC4gUmVhZCBpdHMgSU8gYW5kIE1FTU9SWSByZXNvdXJjZXMgZnJvbSBQQ0kKKyAqCWNvbmZpZ3VyYXRpb24gc3BhY2UuCisgKi8KKworc3RhdGljIGludCBzdGxpX2luaXRwY2licmQoaW50IGJyZHR5cGUsIHN0cnVjdCBwY2lfZGV2ICpkZXZwKQoreworCXN0bGlicmRfdAkqYnJkcDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaW5pdHBjaWJyZChicmR0eXBlPSVkLGJ1c25yPSV4LGRldm5yPSV4KVxuIiwKKwkJYnJkdHlwZSwgZGV2LT5idXMtPm51bWJlciwgZGV2LT5kZXZmbik7CisjZW5kaWYKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXZwKSkKKwkJcmV0dXJuKC1FSU8pOworCWlmICgoYnJkcCA9IHN0bGlfYWxsb2NicmQoKSkgPT0gKHN0bGlicmRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT01FTSk7CisJaWYgKChicmRwLT5icmRuciA9IHN0bGlfZ2V0YnJkbnIoKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlNUQUxMSU9OOiB0b28gbWFueSBib2FyZHMgZm91bmQsICIKKwkJCSJtYXhpbXVtIHN1cHBvcnRlZCAlZFxuIiwgU1RMX01BWEJSRFMpOworCQlyZXR1cm4oMCk7CisJfQorCWJyZHAtPmJyZHR5cGUgPSBicmR0eXBlOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMoJWQpOiBCQVJbXT0lbHgsJWx4LCVseCwlbHhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKKwkJcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDApLAorCQlwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMSksCisJCXBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAyKSwKKwkJcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDMpKTsKKyNlbmRpZgorCisvKgorICoJV2UgaGF2ZSBhbGwgcmVzb3VyY2VzIGZyb20gdGhlIGJvYXJkLCBzbyBsZXRzIHNldHVwIHRoZSBhY3R1YWwKKyAqCWJvYXJkIHN0cnVjdHVyZSBub3cuCisgKi8KKwlicmRwLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMyk7CisJYnJkcC0+bWVtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAyKTsKKwlzdGxpX2JyZGluaXQoYnJkcCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZpbmQgYWxsIFN0YWxsaW9uIFBDSSBib2FyZHMgdGhhdCBtaWdodCBiZSBpbnN0YWxsZWQuIEluaXRpYWxpemUgZWFjaAorICoJb25lIGFzIGl0IGlzIGZvdW5kLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9maW5kcGNpYnJkcyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2CSpkZXYgPSBOVUxMOworCWludAkJcmM7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3RsaV9maW5kcGNpYnJkcygpXG4iKTsKKyNlbmRpZgorCisJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TVEFMTElPTiwKKwkgICAgUENJX0RFVklDRV9JRF9FQ1JBLCBkZXYpKSkgeworCQlpZiAoKHJjID0gc3RsaV9pbml0cGNpYnJkKEJSRF9FQ1BQQ0ksIGRldikpKQorCQkJcmV0dXJuKHJjKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglBbGxvY2F0ZSBhIG5ldyBib2FyZCBzdHJ1Y3R1cmUuIEZpbGwgb3V0IHRoZSBiYXNpYyBpbmZvIGluIGl0LgorICovCisKK3N0YXRpYyBzdGxpYnJkX3QgKnN0bGlfYWxsb2NicmQodm9pZCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisKKwlicmRwID0gKHN0bGlicmRfdCAqKSBzdGxpX21lbWFsbG9jKHNpemVvZihzdGxpYnJkX3QpKTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkJIihzaXplPSVkKVxuIiwgc2l6ZW9mKHN0bGlicmRfdCkpOworCQlyZXR1cm4oKHN0bGlicmRfdCAqKSBOVUxMKTsKKwl9CisKKwltZW1zZXQoYnJkcCwgMCwgc2l6ZW9mKHN0bGlicmRfdCkpOworCWJyZHAtPm1hZ2ljID0gU1RMSV9CT0FSRE1BR0lDOworCXJldHVybihicmRwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU2NhbiB0aHJvdWdoIGFsbCB0aGUgYm9hcmRzIGluIHRoZSBjb25maWd1cmF0aW9uIGFuZCBzZWUgd2hhdCB3ZQorICoJY2FuIGZpbmQuCisgKi8KKworc3RhdGljIGludCBzdGxpX2luaXRicmRzKHZvaWQpCit7CisJc3RsaWJyZF90CSpicmRwLCAqbnh0YnJkcDsKKwlzdGxjb25mX3QJKmNvbmZwOworCWludAkJaSwgajsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfaW5pdGJyZHMoKVxuIik7CisjZW5kaWYKKworCWlmIChzdGxpX25yYnJkcyA+IFNUTF9NQVhCUkRTKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlNUQUxMSU9OOiB0b28gbWFueSBib2FyZHMgaW4gY29uZmlndXJhdGlvbiAiCisJCQkidGFibGUsIHRydW5jYXRpbmcgdG8gJWRcbiIsIFNUTF9NQVhCUkRTKTsKKwkJc3RsaV9ucmJyZHMgPSBTVExfTUFYQlJEUzsKKwl9CisKKy8qCisgKglGaXJzdGx5IHNjYW4gdGhlIGxpc3Qgb2Ygc3RhdGljIGJvYXJkcyBjb25maWd1cmVkLiBBbGxvY2F0ZQorICoJcmVzb3VyY2VzIGFuZCBpbml0aWFsaXplIHRoZSBib2FyZHMgYXMgZm91bmQuIElmIHRoaXMgaXMgYQorICoJbW9kdWxlIHRoZW4gbGV0IHRoZSBtb2R1bGUgYXJncyBvdmVycmlkZSBzdGF0aWMgY29uZmlndXJhdGlvbi4KKyAqLworCWZvciAoaSA9IDA7IChpIDwgc3RsaV9ucmJyZHMpOyBpKyspIHsKKwkJY29uZnAgPSAmc3RsaV9icmRjb25mW2ldOworI2lmZGVmIE1PRFVMRQorCQlzdGxpX3BhcnNlYnJkKGNvbmZwLCBzdGxpX2JyZHNwW2ldKTsKKyNlbmRpZgorCQlpZiAoKGJyZHAgPSBzdGxpX2FsbG9jYnJkKCkpID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCXJldHVybigtRU5PTUVNKTsKKwkJYnJkcC0+YnJkbnIgPSBpOworCQlicmRwLT5icmR0eXBlID0gY29uZnAtPmJyZHR5cGU7CisJCWJyZHAtPmlvYmFzZSA9IGNvbmZwLT5pb2FkZHIxOworCQlicmRwLT5tZW1hZGRyID0gY29uZnAtPm1lbWFkZHI7CisJCXN0bGlfYnJkaW5pdChicmRwKTsKKwl9CisKKy8qCisgKglTdGF0aWMgY29uZmlndXJhdGlvbiB0YWJsZSBkb25lLCBzbyBub3cgdXNlIGR5bmFtaWMgbWV0aG9kcyB0bworICoJc2VlIGlmIGFueSBtb3JlIGJvYXJkcyBzaG91bGQgYmUgY29uZmlndXJlZC4KKyAqLworI2lmZGVmIE1PRFVMRQorCXN0bGlfYXJnYnJkcygpOworI2VuZGlmCisJaWYgKHN0bGlfZWlzYXByb2JlKQorCQlzdGxpX2ZpbmRlaXNhYnJkcygpOworI2lmZGVmIENPTkZJR19QQ0kKKwlzdGxpX2ZpbmRwY2licmRzKCk7CisjZW5kaWYKKworLyoKKyAqCUFsbCBmb3VuZCBib2FyZHMgYXJlIGluaXRpYWxpemVkLiBOb3cgZm9yIGEgbGl0dGxlIG9wdGltaXphdGlvbiwgaWYKKyAqCW5vIGJvYXJkcyBhcmUgc2hhcmluZyB0aGUgInNoYXJlZCBtZW1vcnkiIHJlZ2lvbnMgdGhlbiB3ZSBjYW4ganVzdAorICoJbGVhdmUgdGhlbSBhbGwgZW5hYmxlZC4gVGhpcyBpcyBpbiBmYWN0IHRoZSB1c3VhbCBjYXNlLgorICovCisJc3RsaV9zaGFyZWQgPSAwOworCWlmIChzdGxpX25yYnJkcyA+IDEpIHsKKwkJZm9yIChpID0gMDsgKGkgPCBzdGxpX25yYnJkcyk7IGkrKykgeworCQkJYnJkcCA9IHN0bGlfYnJkc1tpXTsKKwkJCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoaiA9IGkgKyAxOyAoaiA8IHN0bGlfbnJicmRzKTsgaisrKSB7CisJCQkJbnh0YnJkcCA9IHN0bGlfYnJkc1tqXTsKKwkJCQlpZiAobnh0YnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgoYnJkcC0+bWVtYmFzZSA+PSBueHRicmRwLT5tZW1iYXNlKSAmJgorCQkJCSAgICAoYnJkcC0+bWVtYmFzZSA8PSAobnh0YnJkcC0+bWVtYmFzZSArCisJCQkJICAgIG54dGJyZHAtPm1lbXNpemUgLSAxKSkpIHsKKwkJCQkJc3RsaV9zaGFyZWQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKHN0bGlfc2hhcmVkID09IDApIHsKKwkJZm9yIChpID0gMDsgKGkgPCBzdGxpX25yYnJkcyk7IGkrKykgeworCQkJYnJkcCA9IHN0bGlfYnJkc1tpXTsKKwkJCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChicmRwLT5zdGF0ZSAmIEJTVF9GT1VORCkgeworCQkJCUVCUkRFTkFCTEUoYnJkcCk7CisJCQkJYnJkcC0+ZW5hYmxlID0gTlVMTDsKKwkJCQlicmRwLT5kaXNhYmxlID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQ29kZSB0byBoYW5kbGUgYW4gInN0YWxpb21lbSIgcmVhZCBvcGVyYXRpb24uIFRoaXMgZGV2aWNlIGlzIHRoZSAKKyAqCWNvbnRlbnRzIG9mIHRoZSBib2FyZCBzaGFyZWQgbWVtb3J5LiBJdCBpcyB1c2VkIGZvciBkb3duIGxvYWRpbmcKKyAqCXRoZSBzbGF2ZSBpbWFnZSAoYW5kIGRlYnVnZ2luZyA6LSkKKyAqLworCitzdGF0aWMgc3NpemVfdCBzdGxpX21lbXJlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXZvaWQJCSptZW1wdHI7CisJc3RsaWJyZF90CSpicmRwOworCWludAkJYnJkbnIsIHNpemUsIG47CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJzdGxpX21lbXJlYWQoZnA9JXgsYnVmPSV4LGNvdW50PSV4LG9mZnA9JXgpXG4iLAorCQkJKGludCkgZnAsIChpbnQpIGJ1ZiwgY291bnQsIChpbnQpIG9mZnApOworI2VuZGlmCisKKwlicmRuciA9IGltaW5vcihmcC0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmIChicmRuciA+PSBzdGxpX25yYnJkcykKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxpX2JyZHNbYnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmIChicmRwLT5zdGF0ZSA9PSAwKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKGZwLT5mX3BvcyA+PSBicmRwLT5tZW1zaXplKQorCQlyZXR1cm4oMCk7CisKKwlzaXplID0gTUlOKGNvdW50LCAoYnJkcC0+bWVtc2l6ZSAtIGZwLT5mX3BvcykpOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJRUJSREVOQUJMRShicmRwKTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJbWVtcHRyID0gKHZvaWQgKikgRUJSREdFVE1FTVBUUihicmRwLCBmcC0+Zl9wb3MpOworCQluID0gTUlOKHNpemUsIChicmRwLT5wYWdlc2l6ZSAtICgoKHVuc2lnbmVkIGxvbmcpIGZwLT5mX3BvcykgJSBicmRwLT5wYWdlc2l6ZSkpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIG1lbXB0ciwgbikpIHsKKwkJCWNvdW50ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZwLT5mX3BvcyArPSBuOworCQlidWYgKz0gbjsKKwkJc2l6ZSAtPSBuOworCX0KK291dDoKKwlFQlJERElTQUJMRShicmRwKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybihjb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUNvZGUgdG8gaGFuZGxlIGFuICJzdGFsaW9tZW0iIHdyaXRlIG9wZXJhdGlvbi4gVGhpcyBkZXZpY2UgaXMgdGhlIAorICoJY29udGVudHMgb2YgdGhlIGJvYXJkIHNoYXJlZCBtZW1vcnkuIEl0IGlzIHVzZWQgZm9yIGRvd24gbG9hZGluZworICoJdGhlIHNsYXZlIGltYWdlIChhbmQgZGVidWdnaW5nIDotKQorICovCisKK3N0YXRpYyBzc2l6ZV90IHN0bGlfbWVtd3JpdGUoc3RydWN0IGZpbGUgKmZwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXZvaWQJCSptZW1wdHI7CisJc3RsaWJyZF90CSpicmRwOworCWNoYXIJCV9fdXNlciAqY2hidWY7CisJaW50CQlicmRuciwgc2l6ZSwgbjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN0bGlfbWVtd3JpdGUoZnA9JXgsYnVmPSV4LGNvdW50PSV4LG9mZnA9JXgpXG4iLAorCQkJKGludCkgZnAsIChpbnQpIGJ1ZiwgY291bnQsIChpbnQpIG9mZnApOworI2VuZGlmCisKKwlicmRuciA9IGltaW5vcihmcC0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmIChicmRuciA+PSBzdGxpX25yYnJkcykKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxpX2JyZHNbYnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCWlmIChicmRwLT5zdGF0ZSA9PSAwKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKGZwLT5mX3BvcyA+PSBicmRwLT5tZW1zaXplKQorCQlyZXR1cm4oMCk7CisKKwljaGJ1ZiA9IChjaGFyIF9fdXNlciAqKSBidWY7CisJc2l6ZSA9IE1JTihjb3VudCwgKGJyZHAtPm1lbXNpemUgLSBmcC0+Zl9wb3MpKTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCUVCUkRFTkFCTEUoYnJkcCk7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCW1lbXB0ciA9ICh2b2lkICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgZnAtPmZfcG9zKTsKKwkJbiA9IE1JTihzaXplLCAoYnJkcC0+cGFnZXNpemUgLSAoKCh1bnNpZ25lZCBsb25nKSBmcC0+Zl9wb3MpICUgYnJkcC0+cGFnZXNpemUpKSk7CisJCWlmIChjb3B5X2Zyb21fdXNlcihtZW1wdHIsIGNoYnVmLCBuKSkgeworCQkJY291bnQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJZnAtPmZfcG9zICs9IG47CisJCWNoYnVmICs9IG47CisJCXNpemUgLT0gbjsKKwl9CitvdXQ6CisJRUJSRERJU0FCTEUoYnJkcCk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4oY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIGJvYXJkIHN0YXRzIHN0cnVjdHVyZSB0byB1c2VyIGFwcC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZ2V0YnJkc3RhdHMoY29tYnJkX3QgX191c2VyICpicCkKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxpX2JyZHN0YXRzLCBicCwgc2l6ZW9mKGNvbWJyZF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzdGxpX2JyZHN0YXRzLmJyZCA+PSBTVExfTUFYQlJEUykKKwkJcmV0dXJuKC1FTk9ERVYpOworCWJyZHAgPSBzdGxpX2JyZHNbc3RsaV9icmRzdGF0cy5icmRdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJbWVtc2V0KCZzdGxpX2JyZHN0YXRzLCAwLCBzaXplb2YoY29tYnJkX3QpKTsKKwlzdGxpX2JyZHN0YXRzLmJyZCA9IGJyZHAtPmJyZG5yOworCXN0bGlfYnJkc3RhdHMudHlwZSA9IGJyZHAtPmJyZHR5cGU7CisJc3RsaV9icmRzdGF0cy5od2lkID0gMDsKKwlzdGxpX2JyZHN0YXRzLnN0YXRlID0gYnJkcC0+c3RhdGU7CisJc3RsaV9icmRzdGF0cy5pb2FkZHIgPSBicmRwLT5pb2Jhc2U7CisJc3RsaV9icmRzdGF0cy5tZW1hZGRyID0gYnJkcC0+bWVtYWRkcjsKKwlzdGxpX2JyZHN0YXRzLm5ycGFuZWxzID0gYnJkcC0+bnJwYW5lbHM7CisJc3RsaV9icmRzdGF0cy5ucnBvcnRzID0gYnJkcC0+bnJwb3J0czsKKwlmb3IgKGkgPSAwOyAoaSA8IGJyZHAtPm5ycGFuZWxzKTsgaSsrKSB7CisJCXN0bGlfYnJkc3RhdHMucGFuZWxzW2ldLnBhbmVsID0gaTsKKwkJc3RsaV9icmRzdGF0cy5wYW5lbHNbaV0uaHdpZCA9IGJyZHAtPnBhbmVsaWRzW2ldOworCQlzdGxpX2JyZHN0YXRzLnBhbmVsc1tpXS5ucnBvcnRzID0gYnJkcC0+cGFuZWxzW2ldOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoYnAsICZzdGxpX2JyZHN0YXRzLCBzaXplb2YoY29tYnJkX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXNvbHZlIHRoZSByZWZlcmVuY2VkIHBvcnQgbnVtYmVyIGludG8gYSBwb3J0IHN0cnVjdCBwb2ludGVyLgorICovCisKK3N0YXRpYyBzdGxpcG9ydF90ICpzdGxpX2dldHBvcnQoaW50IGJyZG5yLCBpbnQgcGFuZWxuciwgaW50IHBvcnRucikKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlpOworCisJaWYgKChicmRuciA8IDApIHx8IChicmRuciA+PSBTVExfTUFYQlJEUykpCisJCXJldHVybigoc3RsaXBvcnRfdCAqKSBOVUxMKTsKKwlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKKwlpZiAoYnJkcCA9PSAoc3RsaWJyZF90ICopIE5VTEwpCisJCXJldHVybigoc3RsaXBvcnRfdCAqKSBOVUxMKTsKKwlmb3IgKGkgPSAwOyAoaSA8IHBhbmVsbnIpOyBpKyspCisJCXBvcnRuciArPSBicmRwLT5wYW5lbHNbaV07CisJaWYgKChwb3J0bnIgPCAwKSB8fCAocG9ydG5yID49IGJyZHAtPm5ycG9ydHMpKQorCQlyZXR1cm4oKHN0bGlwb3J0X3QgKikgTlVMTCk7CisJcmV0dXJuKGJyZHAtPnBvcnRzW3BvcnRucl0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIHBvcnQgc3RhdHMgc3RydWN0dXJlIHRvIHVzZXIgYXBwLiBBIE5VTEwgcG9ydCBzdHJ1Y3QKKyAqCXBvaW50ZXIgcGFzc2VkIGluIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBmaW5kIG91dCBmcm9tIHRoZSBhcHAKKyAqCXdoYXQgcG9ydCB0byBnZXQgc3RhdHMgZm9yICh1c2VkIHRocm91Z2ggYm9hcmQgY29udHJvbCBkZXZpY2UpLgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9wb3J0Y21kc3RhdHMoc3RsaXBvcnRfdCAqcG9ydHApCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdGxpYnJkX3QJKmJyZHA7CisJaW50CQlyYzsKKworCW1lbXNldCgmc3RsaV9jb21zdGF0cywgMCwgc2l6ZW9mKGNvbXN0YXRzX3QpKTsKKworCWlmIChwb3J0cCA9PSAoc3RsaXBvcnRfdCAqKSBOVUxMKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmIChicmRwID09IChzdGxpYnJkX3QgKikgTlVMTCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJaWYgKGJyZHAtPnN0YXRlICYgQlNUX1NUQVJURUQpIHsKKwkJaWYgKChyYyA9IHN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9HRVRTVEFUUywKKwkJICAgICZzdGxpX2Nka3N0YXRzLCBzaXplb2YoYXN5c3RhdHNfdCksIDEpKSA8IDApCisJCQlyZXR1cm4ocmMpOworCX0gZWxzZSB7CisJCW1lbXNldCgmc3RsaV9jZGtzdGF0cywgMCwgc2l6ZW9mKGFzeXN0YXRzX3QpKTsKKwl9CisKKwlzdGxpX2NvbXN0YXRzLmJyZCA9IHBvcnRwLT5icmRucjsKKwlzdGxpX2NvbXN0YXRzLnBhbmVsID0gcG9ydHAtPnBhbmVsbnI7CisJc3RsaV9jb21zdGF0cy5wb3J0ID0gcG9ydHAtPnBvcnRucjsKKwlzdGxpX2NvbXN0YXRzLnN0YXRlID0gcG9ydHAtPnN0YXRlOworCXN0bGlfY29tc3RhdHMuZmxhZ3MgPSBwb3J0cC0+ZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlpZiAocG9ydHAtPnR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgeworCQlpZiAocG9ydHAtPnR0eS0+ZHJpdmVyX2RhdGEgPT0gcG9ydHApIHsKKwkJCXN0bGlfY29tc3RhdHMudHR5c3RhdGUgPSBwb3J0cC0+dHR5LT5mbGFnczsKKwkJCXN0bGlfY29tc3RhdHMucnhidWZmZXJlZCA9IHBvcnRwLT50dHktPmZsaXAuY291bnQ7CisJCQlpZiAocG9ydHAtPnR0eS0+dGVybWlvcyAhPSAoc3RydWN0IHRlcm1pb3MgKikgTlVMTCkgeworCQkJCXN0bGlfY29tc3RhdHMuY2ZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkJCQlzdGxpX2NvbXN0YXRzLmlmbGFncyA9IHBvcnRwLT50dHktPnRlcm1pb3MtPmNfaWZsYWc7CisJCQkJc3RsaV9jb21zdGF0cy5vZmxhZ3MgPSBwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX29mbGFnOworCQkJCXN0bGlfY29tc3RhdHMubGZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19sZmxhZzsKKwkJCX0KKwkJfQorCX0KKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXN0bGlfY29tc3RhdHMudHh0b3RhbCA9IHN0bGlfY2Rrc3RhdHMudHhjaGFyczsKKwlzdGxpX2NvbXN0YXRzLnJ4dG90YWwgPSBzdGxpX2Nka3N0YXRzLnJ4Y2hhcnMgKyBzdGxpX2Nka3N0YXRzLnJpbmdvdmVyOworCXN0bGlfY29tc3RhdHMudHhidWZmZXJlZCA9IHN0bGlfY2Rrc3RhdHMudHhyaW5ncTsKKwlzdGxpX2NvbXN0YXRzLnJ4YnVmZmVyZWQgKz0gc3RsaV9jZGtzdGF0cy5yeHJpbmdxOworCXN0bGlfY29tc3RhdHMucnhvdmVycnVuID0gc3RsaV9jZGtzdGF0cy5vdmVycnVuczsKKwlzdGxpX2NvbXN0YXRzLnJ4cGFyaXR5ID0gc3RsaV9jZGtzdGF0cy5wYXJpdHk7CisJc3RsaV9jb21zdGF0cy5yeGZyYW1pbmcgPSBzdGxpX2Nka3N0YXRzLmZyYW1pbmc7CisJc3RsaV9jb21zdGF0cy5yeGxvc3QgPSBzdGxpX2Nka3N0YXRzLnJpbmdvdmVyOworCXN0bGlfY29tc3RhdHMucnhicmVha3MgPSBzdGxpX2Nka3N0YXRzLnJ4YnJlYWtzOworCXN0bGlfY29tc3RhdHMudHhicmVha3MgPSBzdGxpX2Nka3N0YXRzLnR4YnJlYWtzOworCXN0bGlfY29tc3RhdHMudHh4b24gPSBzdGxpX2Nka3N0YXRzLnR4c3RhcnQ7CisJc3RsaV9jb21zdGF0cy50eHhvZmYgPSBzdGxpX2Nka3N0YXRzLnR4c3RvcDsKKwlzdGxpX2NvbXN0YXRzLnJ4eG9uID0gc3RsaV9jZGtzdGF0cy5yeHN0YXJ0OworCXN0bGlfY29tc3RhdHMucnh4b2ZmID0gc3RsaV9jZGtzdGF0cy5yeHN0b3A7CisJc3RsaV9jb21zdGF0cy5yeHJ0c29mZiA9IHN0bGlfY2Rrc3RhdHMucnRzY250IC8gMjsKKwlzdGxpX2NvbXN0YXRzLnJ4cnRzb24gPSBzdGxpX2Nka3N0YXRzLnJ0c2NudCAtIHN0bGlfY29tc3RhdHMucnhydHNvZmY7CisJc3RsaV9jb21zdGF0cy5tb2RlbSA9IHN0bGlfY2Rrc3RhdHMuZGNkY250OworCXN0bGlfY29tc3RhdHMuaHdpZCA9IHN0bGlfY2Rrc3RhdHMuaHdpZDsKKwlzdGxpX2NvbXN0YXRzLnNpZ25hbHMgPSBzdGxpX21rdGlvY20oc3RsaV9jZGtzdGF0cy5zaWduYWxzKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJUmV0dXJuIHRoZSBwb3J0IHN0YXRzIHN0cnVjdHVyZSB0byB1c2VyIGFwcC4gQSBOVUxMIHBvcnQgc3RydWN0CisgKglwb2ludGVyIHBhc3NlZCBpbiBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZmluZCBvdXQgZnJvbSB0aGUgYXBwCisgKgl3aGF0IHBvcnQgdG8gZ2V0IHN0YXRzIGZvciAodXNlZCB0aHJvdWdoIGJvYXJkIGNvbnRyb2wgZGV2aWNlKS4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZ2V0cG9ydHN0YXRzKHN0bGlwb3J0X3QgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCit7CisJc3RsaWJyZF90CSpicmRwOworCWludAkJcmM7CisKKwlpZiAoIXBvcnRwKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsaV9jb21zdGF0cywgY3AsIHNpemVvZihjb21zdGF0c190KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcG9ydHAgPSBzdGxpX2dldHBvcnQoc3RsaV9jb21zdGF0cy5icmQsIHN0bGlfY29tc3RhdHMucGFuZWwsCisJCQlzdGxpX2NvbXN0YXRzLnBvcnQpOworCQlpZiAoIXBvcnRwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmICghYnJkcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKHJjID0gc3RsaV9wb3J0Y21kc3RhdHMocG9ydHApKSA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBjb3B5X3RvX3VzZXIoY3AsICZzdGxpX2NvbXN0YXRzLCBzaXplb2YoY29tc3RhdHNfdCkpID8KKwkJCS1FRkFVTFQgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglDbGVhciB0aGUgcG9ydCBzdGF0cyBzdHJ1Y3R1cmUuIFdlIGFsc28gcmV0dXJuIGl0IHplcm9lZCBvdXQuLi4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfY2xycG9ydHN0YXRzKHN0bGlwb3J0X3QgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCit7CisJc3RsaWJyZF90CSpicmRwOworCWludAkJcmM7CisKKwlpZiAoIXBvcnRwKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsaV9jb21zdGF0cywgY3AsIHNpemVvZihjb21zdGF0c190KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcG9ydHAgPSBzdGxpX2dldHBvcnQoc3RsaV9jb21zdGF0cy5icmQsIHN0bGlfY29tc3RhdHMucGFuZWwsCisJCQlzdGxpX2NvbXN0YXRzLnBvcnQpOworCQlpZiAoIXBvcnRwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOworCWlmICghYnJkcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYnJkcC0+c3RhdGUgJiBCU1RfU1RBUlRFRCkgeworCQlpZiAoKHJjID0gc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX0NMRUFSU1RBVFMsIE5VTEwsIDAsIDApKSA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJbWVtc2V0KCZzdGxpX2NvbXN0YXRzLCAwLCBzaXplb2YoY29tc3RhdHNfdCkpOworCXN0bGlfY29tc3RhdHMuYnJkID0gcG9ydHAtPmJyZG5yOworCXN0bGlfY29tc3RhdHMucGFuZWwgPSBwb3J0cC0+cGFuZWxucjsKKwlzdGxpX2NvbXN0YXRzLnBvcnQgPSBwb3J0cC0+cG9ydG5yOworCisJaWYgKGNvcHlfdG9fdXNlcihjcCwgJnN0bGlfY29tc3RhdHMsIHNpemVvZihjb21zdGF0c190KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglSZXR1cm4gdGhlIGVudGlyZSBkcml2ZXIgcG9ydHMgc3RydWN0dXJlIHRvIGEgdXNlciBhcHAuCisgKi8KKworc3RhdGljIGludCBzdGxpX2dldHBvcnRzdHJ1Y3Qoc3RsaXBvcnRfdCBfX3VzZXIgKmFyZykKK3sKKwlzdGxpcG9ydF90CSpwb3J0cDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsaV9kdW1teXBvcnQsIGFyZywgc2l6ZW9mKHN0bGlwb3J0X3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcG9ydHAgPSBzdGxpX2dldHBvcnQoc3RsaV9kdW1teXBvcnQuYnJkbnIsIHN0bGlfZHVtbXlwb3J0LnBhbmVsbnIsCisJCSBzdGxpX2R1bW15cG9ydC5wb3J0bnIpOworCWlmICghcG9ydHApCisJCXJldHVybiAtRU5PREVWOworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBwb3J0cCwgc2l6ZW9mKHN0bGlwb3J0X3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVJldHVybiB0aGUgZW50aXJlIGRyaXZlciBib2FyZCBzdHJ1Y3R1cmUgdG8gYSB1c2VyIGFwcC4KKyAqLworCitzdGF0aWMgaW50IHN0bGlfZ2V0YnJkc3RydWN0KHN0bGlicmRfdCBfX3VzZXIgKmFyZykKK3sKKwlzdGxpYnJkX3QJKmJyZHA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0bGlfZHVtbXlicmQsIGFyZywgc2l6ZW9mKHN0bGlicmRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKHN0bGlfZHVtbXlicmQuYnJkbnIgPCAwKSB8fCAoc3RsaV9kdW1teWJyZC5icmRuciA+PSBTVExfTUFYQlJEUykpCisJCXJldHVybiAtRU5PREVWOworCWJyZHAgPSBzdGxpX2JyZHNbc3RsaV9kdW1teWJyZC5icmRucl07CisJaWYgKCFicmRwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoY29weV90b191c2VyKGFyZywgYnJkcCwgc2l6ZW9mKHN0bGlicmRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJVGhlICJzdGFsaW9tZW0iIGRldmljZSBpcyBhbHNvIHJlcXVpcmVkIHRvIGRvIHNvbWUgc3BlY2lhbCBvcGVyYXRpb25zIG9uCisgKgl0aGUgYm9hcmQuIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBzZW5kIGFuIGludGVycnVwdCB0byB0aGUgYm9hcmQsCisgKglyZXNldCBpdCwgYW5kIHN0YXJ0L3N0b3AgaXQuCisgKi8KKworc3RhdGljIGludCBzdGxpX21lbWlvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RsaWJyZF90CSpicmRwOworCWludAkJYnJkbnIsIHJjLCBkb25lOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAic3RsaV9tZW1pb2N0bChpcD0leCxmcD0leCxjbWQ9JXgsYXJnPSV4KVxuIiwKKwkJCShpbnQpIGlwLCAoaW50KSBmcCwgY21kLCAoaW50KSBhcmcpOworI2VuZGlmCisKKy8qCisgKglGaXJzdCB1cCBoYW5kbGUgdGhlIGJvYXJkIGluZGVwZW5kZW50IGlvY3Rscy4KKyAqLworCWRvbmUgPSAwOworCXJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDT01fR0VUUE9SVFNUQVRTOgorCQlyYyA9IHN0bGlfZ2V0cG9ydHN0YXRzKE5VTEwsIGFyZ3ApOworCQlkb25lKys7CisJCWJyZWFrOworCWNhc2UgQ09NX0NMUlBPUlRTVEFUUzoKKwkJcmMgPSBzdGxpX2NscnBvcnRzdGF0cyhOVUxMLCBhcmdwKTsKKwkJZG9uZSsrOworCQlicmVhazsKKwljYXNlIENPTV9HRVRCUkRTVEFUUzoKKwkJcmMgPSBzdGxpX2dldGJyZHN0YXRzKGFyZ3ApOworCQlkb25lKys7CisJCWJyZWFrOworCWNhc2UgQ09NX1JFQURQT1JUOgorCQlyYyA9IHN0bGlfZ2V0cG9ydHN0cnVjdChhcmdwKTsKKwkJZG9uZSsrOworCQlicmVhazsKKwljYXNlIENPTV9SRUFEQk9BUkQ6CisJCXJjID0gc3RsaV9nZXRicmRzdHJ1Y3QoYXJncCk7CisJCWRvbmUrKzsKKwkJYnJlYWs7CisJfQorCisJaWYgKGRvbmUpCisJCXJldHVybihyYyk7CisKKy8qCisgKglOb3cgaGFuZGxlIHRoZSBib2FyZCBzcGVjaWZpYyBpb2N0bHMuIFRoZXNlIGFsbCBkZXBlbmQgb24gdGhlCisgKgltaW5vciBudW1iZXIgb2YgdGhlIGRldmljZSB0aGV5IHdlcmUgY2FsbGVkIGZyb20uCisgKi8KKwlicmRuciA9IGltaW5vcihpcCk7CisJaWYgKGJyZG5yID49IFNUTF9NQVhCUkRTKQorCQlyZXR1cm4oLUVOT0RFVik7CisJYnJkcCA9IHN0bGlfYnJkc1ticmRucl07CisJaWYgKCFicmRwKQorCQlyZXR1cm4oLUVOT0RFVik7CisJaWYgKGJyZHAtPnN0YXRlID09IDApCisJCXJldHVybigtRU5PREVWKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTVExfQklOVFI6CisJCUVCUkRJTlRSKGJyZHApOworCQlicmVhazsKKwljYXNlIFNUTF9CU1RBUlQ6CisJCXJjID0gc3RsaV9zdGFydGJyZChicmRwKTsKKwkJYnJlYWs7CisJY2FzZSBTVExfQlNUT1A6CisJCWJyZHAtPnN0YXRlICY9IH5CU1RfU1RBUlRFRDsKKwkJYnJlYWs7CisJY2FzZSBTVExfQlJFU0VUOgorCQlicmRwLT5zdGF0ZSAmPSB+QlNUX1NUQVJURUQ7CisJCUVCUkRSRVNFVChicmRwKTsKKwkJaWYgKHN0bGlfc2hhcmVkID09IDApIHsKKwkJCWlmIChicmRwLT5yZWVuYWJsZSAhPSBOVUxMKQorCQkJCSgqIGJyZHAtPnJlZW5hYmxlKShicmRwKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuKHJjKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzdGxpX29wcyA9IHsKKwkub3BlbiA9IHN0bGlfb3BlbiwKKwkuY2xvc2UgPSBzdGxpX2Nsb3NlLAorCS53cml0ZSA9IHN0bGlfd3JpdGUsCisJLnB1dF9jaGFyID0gc3RsaV9wdXRjaGFyLAorCS5mbHVzaF9jaGFycyA9IHN0bGlfZmx1c2hjaGFycywKKwkud3JpdGVfcm9vbSA9IHN0bGlfd3JpdGVyb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBzdGxpX2NoYXJzaW5idWZmZXIsCisJLmlvY3RsID0gc3RsaV9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MgPSBzdGxpX3NldHRlcm1pb3MsCisJLnRocm90dGxlID0gc3RsaV90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHN0bGlfdW50aHJvdHRsZSwKKwkuc3RvcCA9IHN0bGlfc3RvcCwKKwkuc3RhcnQgPSBzdGxpX3N0YXJ0LAorCS5oYW5ndXAgPSBzdGxpX2hhbmd1cCwKKwkuZmx1c2hfYnVmZmVyID0gc3RsaV9mbHVzaGJ1ZmZlciwKKwkuYnJlYWtfY3RsID0gc3RsaV9icmVha2N0bCwKKwkud2FpdF91bnRpbF9zZW50ID0gc3RsaV93YWl0dW50aWxzZW50LAorCS5zZW5kX3hjaGFyID0gc3RsaV9zZW5keGNoYXIsCisJLnJlYWRfcHJvYyA9IHN0bGlfcmVhZHByb2MsCisJLnRpb2NtZ2V0ID0gc3RsaV90aW9jbWdldCwKKwkudGlvY21zZXQgPSBzdGxpX3Rpb2Ntc2V0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgX19pbml0IHN0bGlfaW5pdCh2b2lkKQoreworCWludCBpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiB2ZXJzaW9uICVzXG4iLCBzdGxpX2RydnRpdGxlLCBzdGxpX2RydnZlcnNpb24pOworCisJc3RsaV9pbml0YnJkcygpOworCisJc3RsaV9zZXJpYWwgPSBhbGxvY190dHlfZHJpdmVyKFNUTF9NQVhCUkRTICogU1RMX01BWFBPUlRTKTsKKwlpZiAoIXN0bGlfc2VyaWFsKQorCQlyZXR1cm4gLUVOT01FTTsKKworLyoKKyAqCUFsbG9jYXRlIGEgdGVtcG9yYXJ5IHdyaXRlIGJ1ZmZlci4KKyAqLworCXN0bGlfdG1wd3JpdGVidWYgPSAoY2hhciAqKSBzdGxpX21lbWFsbG9jKFNUTElfVFhCVUZTSVpFKTsKKwlpZiAoc3RsaV90bXB3cml0ZWJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCQkiKHNpemU9JWQpXG4iLCBTVExJX1RYQlVGU0laRSk7CisJc3RsaV90eGNvb2tidWYgPSBzdGxpX21lbWFsbG9jKFNUTElfVFhCVUZTSVpFKTsKKwlpZiAoc3RsaV90eGNvb2tidWYgPT0gKGNoYXIgKikgTlVMTCkKKwkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkJIihzaXplPSVkKVxuIiwgU1RMSV9UWEJVRlNJWkUpOworCisvKgorICoJU2V0IHVwIGEgY2hhcmFjdGVyIGRyaXZlciBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uLiBXZSBuZWVkIHRoaXMKKyAqCXRvIGRvd24gbG9hZCB0aGUgc2xhdmUgY29kZSBpbWFnZS4gQWxzbyBpdCBpcyBhIHVzZWZ1bCBkZWJ1Z2dpbmcgdG9vbC4KKyAqLworCWlmIChyZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIiwgJnN0bGlfZnNpb21lbSkpCisJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGZhaWxlZCB0byByZWdpc3RlciBzZXJpYWwgbWVtb3J5ICIKKwkJCQkiZGV2aWNlXG4iKTsKKworCWRldmZzX21rX2Rpcigic3RhbGlvbWVtIik7CisJaXN0YWxsaW9uX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInN0YWxpb21lbSIpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZGV2ZnNfbWtfY2RldihNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLAorCQkJICAgICAgIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCSAgICAgICAic3RhbGlvbWVtLyVkIiwgaSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGlzdGFsbGlvbl9jbGFzcywgTUtERVYoU1RMX1NJT01FTU1BSk9SLCBpKSwgCisJCQkJTlVMTCwgInN0YWxpb21lbSVkIiwgaSk7CisJfQorCisvKgorICoJU2V0IHVwIHRoZSB0dHkgZHJpdmVyIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgdXMgYXMgYSBkcml2ZXIuCisgKi8KKwlzdGxpX3NlcmlhbC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdGxpX3NlcmlhbC0+ZHJpdmVyX25hbWUgPSBzdGxpX2Rydm5hbWU7CisJc3RsaV9zZXJpYWwtPm5hbWUgPSBzdGxpX3NlcmlhbG5hbWU7CisJc3RsaV9zZXJpYWwtPm1ham9yID0gU1RMX1NFUklBTE1BSk9SOworCXN0bGlfc2VyaWFsLT5taW5vcl9zdGFydCA9IDA7CisJc3RsaV9zZXJpYWwtPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXN0bGlfc2VyaWFsLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXN0bGlfc2VyaWFsLT5pbml0X3Rlcm1pb3MgPSBzdGxpX2RlZnRlcm1pb3M7CisJc3RsaV9zZXJpYWwtPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoc3RsaV9zZXJpYWwsICZzdGxpX29wcyk7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihzdGxpX3NlcmlhbCkpIHsKKwkJcHV0X3R0eV9kcml2ZXIoc3RsaV9zZXJpYWwpOworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBmYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2l0ZV9ncGlvLmMgYi9kcml2ZXJzL2NoYXIvaXRlX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWVkNmFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2l0ZV9ncGlvLmMKQEAgLTAsMCArMSw0MTkgQEAKKy8qCisgKiBGSUxFIE5BTUUgaXRlX2dwaW8uYworICoKKyAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgorICogIEFQSSBmb3IgSVRFIEdQSU8gZGV2aWNlLgorICogIERyaXZlciBmb3IgSVRFIEdQSU8gZGV2aWNlLgorICoKKyAqICBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqICAgICAgICAgIEhhaS1QYW8gRmFuIDxoYWlwYW9AbXZpc3RhLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQlMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CisjaW5jbHVkZSA8YXNtL2l0ODE3Mi9pdDgxNzJfaW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pdGVfZ3Bpby5oPgorCisjZGVmaW5lIGl0ZV9ncGlvX2Jhc2UgMHgxNDAxMzgwMAorCisjZGVmaW5lCUlURV9HUEFEUgkoKih2b2xhdGlsZSBfX3U4ICopKDB4MTQwMTM4MDAgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUEJEUgkoKih2b2xhdGlsZSBfX3U4ICopKDB4MTQwMTM4MDggKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUENEUgkoKih2b2xhdGlsZSBfX3U4ICopKDB4MTQwMTM4MTAgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUEFDUgkoKih2b2xhdGlsZSBfX3UxNiAqKSgweDE0MDEzODAyICsgS1NFRzEpKQorI2RlZmluZQlJVEVfR1BCQ1IJKCoodm9sYXRpbGUgX191MTYgKikoMHgxNDAxMzgwYSArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQ0NSCSgqKHZvbGF0aWxlIF9fdTE2ICopKDB4MTQwMTM4MTIgKyBLU0VHMSkpCisjZGVmaW5lIElURV9HUEFJQ1IJKCoodm9sYXRpbGUgX191MTYgKikoMHgxNDAxMzgwNCArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQklDUgkoKih2b2xhdGlsZSBfX3UxNiAqKSgweDE0MDEzODBjICsgS1NFRzEpKQorI2RlZmluZQlJVEVfR1BDSUNSCSgqKHZvbGF0aWxlIF9fdTE2ICopKDB4MTQwMTM4MTQgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HUEFJU1IJKCoodm9sYXRpbGUgX191OCAqKSgweDE0MDEzODA2ICsgS1NFRzEpKQorI2RlZmluZQlJVEVfR1BCSVNSCSgqKHZvbGF0aWxlIF9fdTggKikoMHgxNDAxMzgwZSArIEtTRUcxKSkKKyNkZWZpbmUJSVRFX0dQQ0lTUgkoKih2b2xhdGlsZSBfX3U4ICopKDB4MTQwMTM4MTYgKyBLU0VHMSkpCisjZGVmaW5lCUlURV9HQ1IJCSgqKHZvbGF0aWxlIF9fdTggKikoMHgxNDAxMzgxOCArIEtTRUcxKSkKKworI2RlZmluZSBNQVhfR1BJT19MSU5FCQkyMQorc3RhdGljIGludCBpdGVfZ3Bpb19pcnE9SVQ4MTcyX0dQSU9fSVJROworCitzdGF0aWMgbG9uZyBpdGVfaXJxX2NvdW50ZXJbTUFYX0dQSU9fTElORV07Cit3YWl0X3F1ZXVlX2hlYWRfdCBpdGVfZ3Bpb193YWl0W01BWF9HUElPX0xJTkVdOworc3RhdGljIGludCBpdGVfZ3Bpb19pcnFfcGVuZGluZ1tNQVhfR1BJT19MSU5FXTsKKworc3RhdGljIGludCBpdGVfZ3Bpb19kZWJ1Zz0wOworI2RlZmluZSBERUIoeCkgIGlmIChpdGVfZ3Bpb19kZWJ1Zz49MSkgeAorCitpbnQgaXRlX2dwaW9faW4oX191MzIgZGV2aWNlLCBfX3UzMiBtYXNrLCB2b2xhdGlsZSBfX3UzMiAqZGF0YSkKK3sKKwlERUIocHJpbnRrKCJpdGVfZ3Bpb19pbiBtYXNrPTB4JXhcbiIsbWFzaykpOyAKKworCXN3aXRjaCAoZGV2aWNlKSB7CisJY2FzZSBJVEVfR1BJT19QT1JUQToKKwkJSVRFX0dQQUNSID0gKF9fdTE2KW1hc2s7CS8qIDB4ZmZmZiAqLworCQkqZGF0YSA9IElURV9HUEFEUjsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQjoKKwkJSVRFX0dQQkNSID0gKF9fdTE2KW1hc2s7CS8qIDB4ZmZmZiAqLworCQkqZGF0YSA9IElURV9HUEJEUjsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQzoKKwkJSVRFX0dQQ0NSID0gKF9fdTE2KW1hc2s7CS8qIDB4MDNmZiAqLworCQkqZGF0YSA9IElURV9HUENEUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IGl0ZV9ncGlvX291dChfX3UzMiBkZXZpY2UsIF9fdTMyIG1hc2ssIF9fdTMyIGRhdGEpCit7CisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIElURV9HUElPX1BPUlRBOgorCQlJVEVfR1BBQ1IgPSAoX191MTYpbWFzazsJLyogMHg1NTU1ICovCisJCUlURV9HUEFEUiA9IChfX3U4KWRhdGE7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEI6CisJCUlURV9HUEJDUiA9IChfX3UxNiltYXNrOwkvKiAweDU1NTUgKi8KKwkJSVRFX0dQQkRSID0gKF9fdTgpZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBJVEVfR1BJT19QT1JUQzoKKwkJSVRFX0dQQ0NSID0gKF9fdTE2KW1hc2s7CS8qIDB4MDE1NSAqLworCQlJVEVfR1BDRFIgPSAoX191OClkYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGl0ZV9ncGlvX2ludF9jdHJsKF9fdTMyIGRldmljZSwgX191MzIgbWFzaywgX191MzIgZGF0YSkKK3sKKwlzd2l0Y2ggKGRldmljZSkgeworCWNhc2UgSVRFX0dQSU9fUE9SVEE6CisJCUlURV9HUEFJQ1IgPSAoSVRFX0dQQUlDUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEI6CisJCUlURV9HUEJJQ1IgPSAoSVRFX0dQQklDUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEM6CisJCUlURV9HUENJQ1IgPSAoSVRFX0dQQ0lDUiAmIH5tYXNrKSB8IChkYXRhICYgbWFzayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaXRlX2dwaW9faW5fc3RhdHVzKF9fdTMyIGRldmljZSwgX191MzIgbWFzaywgdm9sYXRpbGUgX191MzIgKmRhdGEpCit7CisJaW50IHJldD0tMTsKKworCWlmICgoTUFYX0dQSU9fTElORSA+ICpkYXRhKSAmJiAoKmRhdGEgPj0gMCkpIAorCQlyZXQ9aXRlX2dwaW9faXJxX3BlbmRpbmdbKmRhdGFdOworIAorCURFQihwcmludGsoIml0ZV9ncGlvX2luX3N0YXR1cyAlZCByZXQ9JWRcbiIsKmRhdGEsIHJldCkpOworCisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIElURV9HUElPX1BPUlRBOgorCQkqZGF0YSA9IElURV9HUEFJU1IgJiBtYXNrOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRCOgorCQkqZGF0YSA9IElURV9HUEJJU1IgJiBtYXNrOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRDOgorCQkqZGF0YSA9IElURV9HUENJU1IgJiBtYXNrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaXRlX2dwaW9fb3V0X3N0YXR1cyhfX3UzMiBkZXZpY2UsIF9fdTMyIG1hc2ssIF9fdTMyIGRhdGEpCit7CisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIElURV9HUElPX1BPUlRBOgorCQlJVEVfR1BBSVNSID0gKElURV9HUEFJU1IgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRCOgorCQlJVEVfR1BCSVNSID0gKElURV9HUEJJU1IgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRDOgorCQlJVEVfR1BDSVNSID0gKElURV9HUENJU1IgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGl0ZV9ncGlvX2dlbl9jdHJsKF9fdTMyIGRldmljZSwgX191MzIgbWFzaywgX191MzIgZGF0YSkKK3sKKwlJVEVfR0NSID0gKElURV9HQ1IgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpdGVfZ3Bpb19pbnRfd2FpdCAoX191MzIgZGV2aWNlLCBfX3UzMiBtYXNrLCBfX3UzMiBkYXRhKQoreworCWludCBpLGxpbmU9MCwgcmV0PTA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAoZGV2aWNlKSB7CisJY2FzZSBJVEVfR1BJT19QT1JUQToKKwkJbGluZSA9IGRhdGEgJiBtYXNrOworCQlicmVhazsKKwljYXNlIElURV9HUElPX1BPUlRCOgorCQlsaW5lID0gKGRhdGEgJiBtYXNrKSA8PDg7CisJCWJyZWFrOworCWNhc2UgSVRFX0dQSU9fUE9SVEM6CisJCWxpbmUgPSAoZGF0YSAmIG1hc2spIDw8MTY7CisJCWJyZWFrOworCX0KKwlmb3IgKGk9TUFYX0dQSU9fTElORS0xOyBpID49IDA7IGktLSkgeworCQlpZiAoIChsaW5lKSAmICgxIDw8IGkpKQorCQkJYnJlYWs7CisJfQorCisJREVCKHByaW50aygid2FpdCBkZXZpY2U9MHglZCBtYXNrPTB4JXggZGF0YT0weCV4IGluZGV4ICVkXG4iLCAKKwkJZGV2aWNlLCBtYXNrLCBkYXRhLCBpKSk7CisKKwlpZiAobGluZSAmIH4oMTw8aSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGl0ZV9ncGlvX2lycV9wZW5kaW5nW2ldPT0xKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNhdmVfZmxhZ3MgKGZsYWdzKTsKKwljbGkoKTsKKwlpdGVfZ3Bpb19pcnFfcGVuZGluZ1tpXSA9IDE7CisJcmV0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZpdGVfZ3Bpb193YWl0W2ldLCAzKkhaKTsKKwlyZXN0b3JlX2ZsYWdzIChmbGFncyk7CisJaXRlX2dwaW9faXJxX3BlbmRpbmdbaV0gPSAwOworCisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChpdGVfZ3Bpb19pbik7CitFWFBPUlRfU1lNQk9MKGl0ZV9ncGlvX291dCk7CitFWFBPUlRfU1lNQk9MKGl0ZV9ncGlvX2ludF9jdHJsKTsKK0VYUE9SVF9TWU1CT0woaXRlX2dwaW9faW5fc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0woaXRlX2dwaW9fb3V0X3N0YXR1cyk7CitFWFBPUlRfU1lNQk9MKGl0ZV9ncGlvX2dlbl9jdHJsKTsKK0VYUE9SVF9TWU1CT0woaXRlX2dwaW9faW50X3dhaXQpOworCitzdGF0aWMgaW50IGl0ZV9ncGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpdGVfZ3Bpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXRlX2dwaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RhdGljIHN0cnVjdCBpdGVfZ3Bpb19pb2N0bF9kYXRhIGlvY3RsX2RhdGE7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlvY3RsX2RhdGEsIChzdHJ1Y3QgaXRlX2dwaW9faW9jdGxfZGF0YSAqKWFyZywKKwkJCXNpemVvZihpb2N0bF9kYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgoaW9jdGxfZGF0YS5kZXZpY2UgPCBJVEVfR1BJT19QT1JUQSkgfHwKKwkJCShpb2N0bF9kYXRhLmRldmljZSA+IElURV9HUElPX1BPUlRDKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2goY21kKSB7CisJCWNhc2UgSVRFX0dQSU9fSU46CisJCQlpZiAoaXRlX2dwaW9faW4oaW9jdGxfZGF0YS5kZXZpY2UsIGlvY3RsX2RhdGEubWFzaywKKwkJCQkJICAgJmlvY3RsX2RhdGEuZGF0YSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBpdGVfZ3Bpb19pb2N0bF9kYXRhICopYXJnLAorCQkJCQkgJmlvY3RsX2RhdGEsIHNpemVvZihpb2N0bF9kYXRhKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQljYXNlIElURV9HUElPX09VVDoKKwkJCXJldHVybiBpdGVfZ3Bpb19vdXQoaW9jdGxfZGF0YS5kZXZpY2UsCisJCQkJCWlvY3RsX2RhdGEubWFzaywgaW9jdGxfZGF0YS5kYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVRFX0dQSU9fSU5UX0NUUkw6CisJCQlyZXR1cm4gaXRlX2dwaW9faW50X2N0cmwoaW9jdGxfZGF0YS5kZXZpY2UsCisJCQkJCWlvY3RsX2RhdGEubWFzaywgaW9jdGxfZGF0YS5kYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVRFX0dQSU9fSU5fU1RBVFVTOgorCQkJaWYgKGl0ZV9ncGlvX2luX3N0YXR1cyhpb2N0bF9kYXRhLmRldmljZSwgaW9jdGxfZGF0YS5tYXNrLAorCQkJCQkmaW9jdGxfZGF0YS5kYXRhKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBpdGVfZ3Bpb19pb2N0bF9kYXRhICopYXJnLAorCQkJCQkmaW9jdGxfZGF0YSwgc2l6ZW9mKGlvY3RsX2RhdGEpKSkgCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQljYXNlIElURV9HUElPX09VVF9TVEFUVVM6CisJCQlyZXR1cm4gaXRlX2dwaW9fb3V0X3N0YXR1cyhpb2N0bF9kYXRhLmRldmljZSwKKwkJCQkJaW9jdGxfZGF0YS5tYXNrLCBpb2N0bF9kYXRhLmRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJVEVfR1BJT19HRU5fQ1RSTDoKKwkJCXJldHVybiBpdGVfZ3Bpb19nZW5fY3RybChpb2N0bF9kYXRhLmRldmljZSwKKwkJCQkJaW9jdGxfZGF0YS5tYXNrLCBpb2N0bF9kYXRhLmRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJVEVfR1BJT19JTlRfV0FJVDoKKwkJCXJldHVybiBpdGVfZ3Bpb19pbnRfd2FpdChpb2N0bF9kYXRhLmRldmljZSwKKwkJCQkJaW9jdGxfZGF0YS5tYXNrLCBpb2N0bF9kYXRhLmRhdGEpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXRlX2dwaW9faXJxX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsCisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGksbGluZTsKKworCWxpbmUgPSBJVEVfR1BDSVNSICYgMHgxZjsKKwlmb3IgKGk9NDsgaSA+PTA7IGktLSkgeworCQlpZiAoIGxpbmUgJiAoMSA8PCBpKSkgeyAKKwkJCSsraXRlX2lycV9jb3VudGVyW2krMTZdOworCQkJaXRlX2dwaW9faXJxX3BlbmRpbmdbaSsxNl0gPSAyOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpdGVfZ3Bpb193YWl0W2krMTZdKTsKKworREVCKHByaW50aygiaW50ZXJydXB0IDB4JXggJWRcbiIsICZpdGVfZ3Bpb193YWl0W2krMTZdLCBpKzE2KSk7CisKKwkJCUlURV9HUENJU1IgPSBJVEVfR1BDSVNSICYgKDE8PGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCWxpbmUgPSBJVEVfR1BCSVNSOworCWZvciAoaT03OyBpID49IDA7IGktLSkgeworCQlpZiAoIGxpbmUgJiAoMSA8PCBpKSkgeworCQkJKytpdGVfaXJxX2NvdW50ZXJbaSs4XTsKKwkJCWl0ZV9ncGlvX2lycV9wZW5kaW5nW2krOF0gPSAyOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpdGVfZ3Bpb193YWl0W2krOF0pOworCitERUIocHJpbnRrKCJpbnRlcnJ1cHQgMHgleCAlZFxuIixJVEVfR1BCSVNSLCBpKzgpKTsKKworCQkJSVRFX0dQQklTUiA9IElURV9HUEJJU1IgJiAoMTw8aSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGluZSA9IElURV9HUEFJU1I7CisJZm9yIChpPTc7IGkgPj0gMDsgaS0tKSB7CisJCWlmICggbGluZSAmICgxIDw8IGkpKSB7CisJCQkrK2l0ZV9pcnFfY291bnRlcltpXTsKKwkJCWl0ZV9ncGlvX2lycV9wZW5kaW5nW2ldID0gMjsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaXRlX2dwaW9fd2FpdFtpXSk7CisKK0RFQihwcmludGsoImludGVycnVwdCAweCV4ICVkXG4iLElURV9HUEFJU1IsIGkpKTsKKworCQkJSVRFX0dQQUlTUiA9IElURV9HUEFJU1IgJiAoMTw8aSk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGl0ZV9ncGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBpdGVfZ3Bpb19pb2N0bCwKKwkub3BlbgkJPSBpdGVfZ3Bpb19vcGVuLAorCS5yZWxlYXNlCT0gaXRlX2dwaW9fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpdGVfZ3Bpb19taXNjZGV2ID0geworCU1JU0NfRFlOQU1JQ19NSU5PUiwKKwkiaXRlX2dwaW8iLAorCSZpdGVfZ3Bpb19mb3BzCit9OworCitpbnQgX19pbml0IGl0ZV9ncGlvX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChtaXNjX3JlZ2lzdGVyKCZpdGVfZ3Bpb19taXNjZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGl0ZV9ncGlvX2Jhc2UsIDB4MWMsICJJVEUgR1BJTyIpKQorCXsKKwkJbWlzY19kZXJlZ2lzdGVyKCZpdGVfZ3Bpb19taXNjZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogaW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKyAgICAgICAgSVRFX0dQQUNSID0gMHhmZmZmOworICAgICAgICBJVEVfR1BCQ1IgPSAweGZmZmY7CisgICAgICAgIElURV9HUENDUiA9IDB4ZmZmZjsKKyAgICAgICAgSVRFX0dQQUlDUiA9IDB4MDBmZjsKKyAgICAgICAgSVRFX0dQQklDUiA9IDB4MDBmZjsKKyAgICAgICAgSVRFX0dQQ0lDUiA9IDB4MDBmZjsKKyAgICAgICAgSVRFX0dDUiA9IDA7CisJCisJZm9yIChpID0gMDsgaSA8IE1BWF9HUElPX0xJTkU7IGkrKykgeworCQlpdGVfZ3Bpb19pcnFfcGVuZGluZ1tpXT0wOwkKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaXRlX2dwaW9fd2FpdFtpXSk7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGl0ZV9ncGlvX2lycSwgaXRlX2dwaW9faXJxX2hhbmRsZXIsIFNBX1NISVJRLCAiZ3BpbyIsIDApIDwgMCkgeworCQltaXNjX2RlcmVnaXN0ZXIoJml0ZV9ncGlvX21pc2NkZXYpOworCQlyZWxlYXNlX3JlZ2lvbihpdGVfZ3Bpb19iYXNlLCAweDFjKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKCJHUElPIGF0IDB4JXggKGlycSA9ICVkKVxuIiwgaXRlX2dwaW9fYmFzZSwgaXRlX2dwaW9faXJxKTsKKworCXJldHVybiAwOworfQkKKworc3RhdGljIHZvaWQgX19leGl0IGl0ZV9ncGlvX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJml0ZV9ncGlvX21pc2NkZXYpOworfQorCittb2R1bGVfaW5pdChpdGVfZ3Bpb19pbml0KTsKK21vZHVsZV9leGl0KGl0ZV9ncGlvX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYyBiL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTUxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwpAQCAtMCwwICsxLDEyNTQgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYworICoKKyAqIFdyaXR0ZW4gZm9yIGxpbnV4IGJ5IEpvaGFuIE15cmVlbiBhcyBhIHRyYW5zbGF0aW9uIGZyb20KKyAqIHRoZSBhc3NlbWJseSB2ZXJzaW9uIGJ5IExpbnVzICh3aXRoIGRpYWNyaXRpY2FscyBhZGRlZCkKKyAqCisgKiBTb21lIGFkZGl0aW9uYWwgZmVhdHVyZXMgYWRkZWQgYnkgQ2hyaXN0b3BoIE5pZW1hbm4gKENoTiksIE1hcmNoIDE5OTMKKyAqCisgKiBMb2FkYWJsZSBrZXltYXBzIGJ5IFJpc3RvIEthbmtrdW5lbiwgTWF5IDE5OTMKKyAqCisgKiBEaWFjcml0aWNhbHMgcmVkb25lICYgb3RoZXIgc21hbGwgY2hhbmdlcywgYWViQGN3aS5ubCwgSnVuZSAxOTkzCisgKiBBZGRlZCBkZWNyL2luY3JfY29uc29sZSwgZHluYW1pYyBrZXltYXBzLCBVbmljb2RlIHN1cHBvcnQsCisgKiBkeW5hbWljIGZ1bmN0aW9uL3N0cmluZyBrZXlzLCBsZWQgc2V0dGluZywgIFNlcHQgMTk5NAorICogYFN0aWNreScgbW9kaWZpZXIga2V5cywgOTUxMDA2LgorICoKKyAqIDExLTExLTk2OiBTQUsgc2hvdWxkIG5vdyB3b3JrIGluIHRoZSByYXcgbW9kZSAoTWFydGluIE1hcmVzKQorICogCisgKiBNb2RpZmllZCB0byBwcm92aWRlICdnZW5lcmljJyBrZXlib2FyZCBzdXBwb3J0IGJ5IEhhbWlzaCBNYWNkb25hbGQKKyAqIE1lcmdlIHdpdGggdGhlIG02OGsga2V5Ym9hcmQgZHJpdmVyIGFuZCBzcGxpdC1vZmYgb2YgdGhlIFBDIGxvdy1sZXZlbAorICogcGFydHMgYnkgR2VlcnQgVXl0dGVyaG9ldmVuLCBNYXkgMTk5NworICoKKyAqIDI3LTA1LTk3OiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgTWFnaWMgU3lzUnEgS2V5IChNYXJ0aW4gTWFyZXMpCisgKiAzMC0wNy05ODogRGVhZCBrZXlzIHJlZG9uZSwgYWViQGN3aS5ubC4KKyAqIDIxLTA4LTAyOiBDb252ZXJ0ZWQgdG8gaW5wdXQgQVBJLCBtYWpvciBjbGVhbnVwLiAoVm9qdGVjaCBQYXZsaWspCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rYmRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9kaWFjci5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKK3N0YXRpYyB2b2lkIGtiZF9kaXNjb25uZWN0KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSk7CitleHRlcm4gdm9pZCBjdHJsX2FsdF9kZWwodm9pZCk7CisKKy8qCisgKiBFeHBvcnRlZCBmdW5jdGlvbnMvdmFyaWFibGVzCisgKi8KKworI2RlZmluZSBLQkRfREVGTU9ERSAoKDEgPDwgVkNfUkVQRUFUKSB8ICgxIDw8IFZDX01FVEEpKQorCisvKgorICogU29tZSBsYXB0b3BzIHRha2UgdGhlIDc4OXVpb2prbG0sLiBrZXlzIGFzIG51bWJlciBwYWQgd2hlbiBOdW1Mb2NrIGlzIG9uLgorICogVGhpcyBzZWVtcyBhIGdvb2QgcmVhc29uIHRvIHN0YXJ0IHdpdGggTnVtTG9jayBvZmYuIE9uIEhJTCBrZXlib2FyZHMKKyAqIG9mIFBBUklTQyBtYWNoaW5lcyBob3dldmVyIHRoZXJlIGlzIG5vIE51bUxvY2sga2V5IGFuZCBldmVyeW9uZSBleHBlY3RzIHRoZSBrZXlwYWQgCisgKiB0byBiZSB1c2VkIGZvciBudW1iZXJzLgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQVJJU0MpICYmIChkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9ISUwpIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0hJTF9PTEQpKQorI2RlZmluZSBLQkRfREVGTEVEUyAoMSA8PCBWQ19OVU1MT0NLKQorI2Vsc2UKKyNkZWZpbmUgS0JEX0RFRkxFRFMgMAorI2VuZGlmCisKKyNkZWZpbmUgS0JEX0RFRkxPQ0sgMAorCit2b2lkIGNvbXB1dGVfc2hpZnRzdGF0ZSh2b2lkKTsKKworLyoKKyAqIEhhbmRsZXIgVGFibGVzLgorICovCisKKyNkZWZpbmUgS19IQU5ETEVSU1wKKwlrX3NlbGYsCQlrX2ZuLAkJa19zcGVjLAkJa19wYWQsXAorCWtfZGVhZCwJCWtfY29ucywJCWtfY3VyLAkJa19zaGlmdCxcCisJa19tZXRhLAkJa19hc2NpaSwJa19sb2NrLAkJa19sb3dlcmNhc2UsXAorCWtfc2xvY2ssCWtfZGVhZDIsCWtfaWdub3JlLAlrX2lnbm9yZQorCit0eXBlZGVmIHZvaWQgKGtfaGFuZGxlcl9mbikoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCAKKwkJCSAgICBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBrX2hhbmRsZXJfZm4gS19IQU5ETEVSUzsKK3N0YXRpYyBrX2hhbmRsZXJfZm4gKmtfaGFuZGxlclsxNl0gPSB7IEtfSEFORExFUlMgfTsKKworI2RlZmluZSBGTl9IQU5ETEVSU1wKKwlmbl9udWxsLCAJZm5fZW50ZXIsCWZuX3Nob3dfcHRyZWdzLAlmbl9zaG93X21lbSxcCisJZm5fc2hvd19zdGF0ZSwJZm5fc2VuZF9pbnRyLCAJZm5fbGFzdGNvbnMsIAlmbl9jYXBzX3RvZ2dsZSxcCisJZm5fbnVtLAkJZm5faG9sZCwgCWZuX3Njcm9sbF9mb3J3LAlmbl9zY3JvbGxfYmFjayxcCisJZm5fYm9vdF9pdCwgCWZuX2NhcHNfb24sIAlmbl9jb21wb3NlLAlmbl9TQUssXAorCWZuX2RlY19jb25zb2xlLCBmbl9pbmNfY29uc29sZSwgZm5fc3Bhd25fY29uLCAJZm5fYmFyZV9udW0KKwordHlwZWRlZiB2b2lkIChmbl9oYW5kbGVyX2ZuKShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBmbl9oYW5kbGVyX2ZuIEZOX0hBTkRMRVJTOworc3RhdGljIGZuX2hhbmRsZXJfZm4gKmZuX2hhbmRsZXJbXSA9IHsgRk5fSEFORExFUlMgfTsKKworLyoKKyAqIFZhcmlhYmxlcyBleHBvcnRlZCBmb3IgdnRfaW9jdGwuYworICovCisKKy8qIG1heGltdW0gdmFsdWVzIGVhY2gga2V5X2hhbmRsZXIgY2FuIGhhbmRsZSAqLworY29uc3QgaW50IG1heF92YWxzW10gPSB7CisJMjU1LCBBUlJBWV9TSVpFKGZ1bmNfdGFibGUpIC0gMSwgQVJSQVlfU0laRShmbl9oYW5kbGVyKSAtIDEsIE5SX1BBRCAtIDEsCisJTlJfREVBRCAtIDEsIDI1NSwgMywgTlJfU0hJRlQgLSAxLCAyNTUsIE5SX0FTQ0lJIC0gMSwgTlJfTE9DSyAtIDEsCisJMjU1LCBOUl9MT0NLIC0gMSwgMjU1Cit9OworCitjb25zdCBpbnQgTlJfVFlQRVMgPSBBUlJBWV9TSVpFKG1heF92YWxzKTsKKworc3RydWN0IGtiZF9zdHJ1Y3Qga2JkX3RhYmxlW01BWF9OUl9DT05TT0xFU107CitzdGF0aWMgc3RydWN0IGtiZF9zdHJ1Y3QgKmtiZCA9IGtiZF90YWJsZTsKK3N0YXRpYyBzdHJ1Y3Qga2JkX3N0cnVjdCBrYmQwOworCitpbnQgc3Bhd25waWQsIHNwYXduc2lnOworCisvKgorICogVmFyaWFibGVzIGV4cG9ydGVkIGZvciB2dC5jCisgKi8KKworaW50IHNoaWZ0X3N0YXRlID0gMDsKKworLyoKKyAqIEludGVybmFsIERhdGEuCisgKi8KKworc3RhdGljIHN0cnVjdCBpbnB1dF9oYW5kbGVyIGtiZF9oYW5kbGVyOworc3RhdGljIHVuc2lnbmVkIGxvbmcga2V5X2Rvd25bTkJJVFMoS0VZX01BWCldOwkJLyoga2V5Ym9hcmQga2V5IGJpdG1hcCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hpZnRfZG93bltOUl9TSElGVF07CQkvKiBzaGlmdCBzdGF0ZSBjb3VudGVycy4uICovCitzdGF0aWMgaW50IGRlYWRfa2V5X25leHQ7CitzdGF0aWMgaW50IG5wYWRjaCA9IC0xOwkJCQkJLyogLTEgb3IgbnVtYmVyIGFzc2VtYmxlZCBvbiBwYWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRpYWNyOworc3RhdGljIGNoYXIgcmVwOwkJCQkJLyogZmxhZyB0ZWxsaW5nIGNoYXJhY3RlciByZXBlYXQgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVkc3RhdGUgPSAweGZmOwkJCS8qIHVuZGVmaW5lZCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVkaW9jdGw7CisKK3N0YXRpYyBzdHJ1Y3QgbGVkcHRyIHsKKwl1bnNpZ25lZCBpbnQgKmFkZHI7CisJdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWduZWQgY2hhciB2YWxpZDoxOworfSBsZWRwdHJzWzNdOworCisvKiBTaW1wbGUgdHJhbnNsYXRpb24gdGFibGUgZm9yIHRoZSBTeXNScSBrZXlzICovCisKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKK3Vuc2lnbmVkIGNoYXIga2JkX3N5c3JxX3hsYXRlW0tFWV9NQVggKyAxXSA9CisgICAgICAgICJcMDAwXDAzMzEyMzQ1Njc4OTAtPVwxNzdcdCIgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgLSAweDBmICovCisgICAgICAgICJxd2VydHl1aW9wW11cclwwMDBhcyIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTAgLSAweDFmICovCisgICAgICAgICJkZmdoamtsOydgXDAwMFxcenhjdiIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MjAgLSAweDJmICovCisgICAgICAgICJibm0sLi9cMDAwKlwwMDAgXDAwMFwyMDFcMjAyXDIwM1wyMDRcMjA1IiAgICAgIC8qIDB4MzAgLSAweDNmICovCisgICAgICAgICJcMjA2XDIwN1wyMTBcMjExXDIxMlwwMDBcMDAwNzg5LTQ1NisxIiAgICAgICAgIC8qIDB4NDAgLSAweDRmICovCisgICAgICAgICIyMzBcMTc3XDAwMFwwMDBcMjEzXDIxNFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiIC8qIDB4NTAgLSAweDVmICovCisgICAgICAgICJcclwwMDAvIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NjAgLSAweDZmICovCitzdGF0aWMgaW50IHN5c3JxX2Rvd247CisjZW5kaWYKK3N0YXRpYyBpbnQgc3lzcnFfYWx0OworCisvKgorICogVHJhbnNsYXRpb24gb2Ygc2NhbmNvZGVzIHRvIGtleWNvZGVzLiBXZSBzZXQgdGhlbSBvbiBvbmx5IHRoZSBmaXJzdCBhdHRhY2hlZAorICoga2V5Ym9hcmQgLSBmb3IgcGVyLWtleWJvYXJkIHNldHRpbmcsIC9kZXYvaW5wdXQvZXZlbnQgaXMgbW9yZSB1c2VmdWwuCisgKi8KK2ludCBnZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaChub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwkJc3RydWN0IGlucHV0X2hhbmRsZSAqIGhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOworCQlpZiAoaGFuZGxlLT5kZXYtPmtleWNvZGVzaXplKSB7IAorCQkJZGV2ID0gaGFuZGxlLT5kZXY7IAorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc2NhbmNvZGUgPj0gZGV2LT5rZXljb2RlbWF4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBJTlBVVF9LRVlDT0RFKGRldiwgc2NhbmNvZGUpOworfQorCitpbnQgc2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHVuc2lnbmVkIGludCBrZXljb2RlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IE5VTEw7CisJdW5zaWduZWQgaW50IGksIG9sZGtleTsKKworCWxpc3RfZm9yX2VhY2gobm9kZSwma2JkX2hhbmRsZXIuaF9saXN0KSB7CisJCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOworCQlpZiAoaGFuZGxlLT5kZXYtPmtleWNvZGVzaXplKSB7IAorCQkJZGV2ID0gaGFuZGxlLT5kZXY7IAorCQkJYnJlYWs7IAorCQl9CisJfQorCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHNjYW5jb2RlID49IGRldi0+a2V5Y29kZW1heCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtleWNvZGUgPiBLRVlfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa2V5Y29kZSA8IDAgfHwga2V5Y29kZSA+IEtFWV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJb2xka2V5ID0gU0VUX0lOUFVUX0tFWUNPREUoZGV2LCBzY2FuY29kZSwga2V5Y29kZSk7CisKKwljbGVhcl9iaXQob2xka2V5LCBkZXYtPmtleWJpdCk7CisJc2V0X2JpdChrZXljb2RlLCBkZXYtPmtleWJpdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5rZXljb2RlbWF4OyBpKyspCisJCWlmIChJTlBVVF9LRVlDT0RFKGRldixpKSA9PSBvbGRrZXkpCisJCQlzZXRfYml0KG9sZGtleSwgZGV2LT5rZXliaXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYWtpbmcgYmVlcHMgYW5kIGJlbGxzLiAKKyAqLworc3RhdGljIHZvaWQga2Rfbm9zb3VuZCh1bnNpZ25lZCBsb25nIGlnbm9yZWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqIG5vZGU7CisKKwlsaXN0X2Zvcl9lYWNoKG5vZGUsJmtiZF9oYW5kbGVyLmhfbGlzdCkgeworCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKKwkJaWYgKHRlc3RfYml0KEVWX1NORCwgaGFuZGxlLT5kZXYtPmV2Yml0KSkgeworCQkJaWYgKHRlc3RfYml0KFNORF9UT05FLCBoYW5kbGUtPmRldi0+c25kYml0KSkKKwkJCQlpbnB1dF9ldmVudChoYW5kbGUtPmRldiwgRVZfU05ELCBTTkRfVE9ORSwgMCk7CisJCQlpZiAodGVzdF9iaXQoU05EX0JFTEwsIGhhbmRsZS0+ZGV2LT5zbmRiaXQpKQorCQkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9TTkQsIFNORF9CRUxMLCAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGtkX21rc291bmRfdGltZXIgPQorCQlUSU1FUl9JTklUSUFMSVpFUihrZF9ub3NvdW5kLCAwLCAwKTsKKwordm9pZCBrZF9ta3NvdW5kKHVuc2lnbmVkIGludCBoeiwgdW5zaWduZWQgaW50IHRpY2tzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCisJZGVsX3RpbWVyKCZrZF9ta3NvdW5kX3RpbWVyKTsKKworCWlmIChoeikgeworCQlsaXN0X2Zvcl9lYWNoX3ByZXYobm9kZSwma2JkX2hhbmRsZXIuaF9saXN0KSB7CisJCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKKwkJCWlmICh0ZXN0X2JpdChFVl9TTkQsIGhhbmRsZS0+ZGV2LT5ldmJpdCkpIHsKKwkJCQlpZiAodGVzdF9iaXQoU05EX1RPTkUsIGhhbmRsZS0+ZGV2LT5zbmRiaXQpKSB7CisJCQkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9TTkQsIFNORF9UT05FLCBoeik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAodGVzdF9iaXQoU05EX0JFTEwsIGhhbmRsZS0+ZGV2LT5zbmRiaXQpKSB7CisJCQkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9TTkQsIFNORF9CRUxMLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICh0aWNrcykKKwkJCW1vZF90aW1lcigma2RfbWtzb3VuZF90aW1lciwgamlmZmllcyArIHRpY2tzKTsKKwl9IGVsc2UKKwkJa2Rfbm9zb3VuZCgwKTsKK30KKworLyoKKyAqIFNldHRpbmcgdGhlIGtleWJvYXJkIHJhdGUuCisgKi8KKworaW50IGtiZF9yYXRlKHN0cnVjdCBrYmRfcmVwZWF0ICpyZXApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKKwl1bnNpZ25lZCBpbnQgZCA9IDA7CisJdW5zaWduZWQgaW50IHAgPSAwOworCisJbGlzdF9mb3JfZWFjaChub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwkJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7CisJCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGhhbmRsZS0+ZGV2OworCisJCWlmICh0ZXN0X2JpdChFVl9SRVAsIGRldi0+ZXZiaXQpKSB7CisJCQlpZiAocmVwLT5kZWxheSA+IDApCisJCQkJaW5wdXRfZXZlbnQoZGV2LCBFVl9SRVAsIFJFUF9ERUxBWSwgcmVwLT5kZWxheSk7CisJCQlpZiAocmVwLT5wZXJpb2QgPiAwKQorCQkJCWlucHV0X2V2ZW50KGRldiwgRVZfUkVQLCBSRVBfUEVSSU9ELCByZXAtPnBlcmlvZCk7CisJCQlkID0gZGV2LT5yZXBbUkVQX0RFTEFZXTsKKwkJCXAgPSBkZXYtPnJlcFtSRVBfUEVSSU9EXTsKKwkJfQorCX0KKwlyZXAtPmRlbGF5ICA9IGQ7CisJcmVwLT5wZXJpb2QgPSBwOworCXJldHVybiAwOworfQorCisvKgorICogSGVscGVyIEZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgcHV0X3F1ZXVlKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IGNoKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB2Yy0+dmNfdHR5OworCisJaWYgKHR0eSkgeworCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCAwKTsKKwkJY29uX3NjaGVkdWxlX2ZsaXAodHR5KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHB1dHNfcXVldWUoc3RydWN0IHZjX2RhdGEgKnZjLCBjaGFyICpjcCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdmMtPnZjX3R0eTsKKworCWlmICghdHR5KQorCQlyZXR1cm47CisKKwl3aGlsZSAoKmNwKSB7CisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgKmNwLCAwKTsKKwkJY3ArKzsKKwl9CisJY29uX3NjaGVkdWxlX2ZsaXAodHR5KTsKK30KKworc3RhdGljIHZvaWQgYXBwbGtleShzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBrZXksIGNoYXIgbW9kZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbXSA9IHsgMHgxYiwgJ08nLCAweDAwLCAweDAwIH07CisKKwlidWZbMV0gPSAobW9kZSA/ICdPJyA6ICdbJyk7CisJYnVmWzJdID0ga2V5OworCXB1dHNfcXVldWUodmMsIGJ1Zik7Cit9CisKKy8qCisgKiBNYW55IG90aGVyIHJvdXRpbmVzIGRvIHB1dF9xdWV1ZSwgYnV0IEkgdGhpbmsgZWl0aGVyCisgKiB0aGV5IHByb2R1Y2UgQVNDSUksIG9yIHRoZXkgcHJvZHVjZSBzb21lIHVzZXItYXNzaWduZWQKKyAqIHN0cmluZywgYW5kIGluIGJvdGggY2FzZXMgd2UgbWlnaHQgYXNzdW1lIHRoYXQgaXQgaXMKKyAqIGluIHV0Zi04IGFscmVhZHkuIFVURi04IGlzIGRlZmluZWQgZm9yIHdvcmRzIG9mIHVwIHRvIDMxIGJpdHMsCisgKiBidXQgd2UgbmVlZCBvbmx5IDE2IGJpdHMgaGVyZQorICovCitzdGF0aWMgdm9pZCB0b191dGY4KHN0cnVjdCB2Y19kYXRhICp2YywgdXNob3J0IGMpCit7CisJaWYgKGMgPCAweDgwKQorCQkvKiAgMCoqKioqKiogKi8KKwkJcHV0X3F1ZXVlKHZjLCBjKTsKKyAgICAJZWxzZSBpZiAoYyA8IDB4ODAwKSB7CisJCS8qIDExMCoqKioqIDEwKioqKioqICovCisJCXB1dF9xdWV1ZSh2YywgMHhjMCB8IChjID4+IDYpKTsgCisJCXB1dF9xdWV1ZSh2YywgMHg4MCB8IChjICYgMHgzZikpOworICAgIAl9IGVsc2UgeworCQkvKiAxMTEwKioqKiAxMCoqKioqKiAxMCoqKioqKiAqLworCQlwdXRfcXVldWUodmMsIDB4ZTAgfCAoYyA+PiAxMikpOworCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSk7CisJCXB1dF9xdWV1ZSh2YywgMHg4MCB8IChjICYgMHgzZikpOworICAgIAl9Cit9CisKKy8qIAorICogQ2FsbGVkIGFmdGVyIHJldHVybmluZyBmcm9tIFJBVyBtb2RlIG9yIHdoZW4gY2hhbmdpbmcgY29uc29sZXMgLSByZWNvbXB1dGUKKyAqIHNoaWZ0X2Rvd25bXSBhbmQgc2hpZnRfc3RhdGUgZnJvbSBrZXlfZG93bltdIG1heWJlIGNhbGxlZCB3aGVuIGtleW1hcCBpcworICogdW5kZWZpbmVkLCBzbyB0aGF0IHNoaWZ0a2V5IHJlbGVhc2UgaXMgc2VlbgorICovCit2b2lkIGNvbXB1dGVfc2hpZnRzdGF0ZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBqLCBrLCBzeW0sIHZhbDsKKworCXNoaWZ0X3N0YXRlID0gMDsKKwltZW1zZXQoc2hpZnRfZG93biwgMCwgc2l6ZW9mKHNoaWZ0X2Rvd24pKTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShrZXlfZG93bik7IGkrKykgeworCisJCWlmICgha2V5X2Rvd25baV0pCisJCQljb250aW51ZTsKKworCQlrID0gaSAqIEJJVFNfUEVSX0xPTkc7CisKKwkJZm9yIChqID0gMDsgaiA8IEJJVFNfUEVSX0xPTkc7IGorKywgaysrKSB7CisKKwkJCWlmICghdGVzdF9iaXQoaywga2V5X2Rvd24pKQorCQkJCWNvbnRpbnVlOworCisJCQlzeW0gPSBVKGtleV9tYXBzWzBdW2tdKTsKKwkJCWlmIChLVFlQKHN5bSkgIT0gS1RfU0hJRlQgJiYgS1RZUChzeW0pICE9IEtUX1NMT0NLKQorCQkJCWNvbnRpbnVlOworCisJCQl2YWwgPSBLVkFMKHN5bSk7CisJCQlpZiAodmFsID09IEtWQUwoS19DQVBTU0hJRlQpKQorCQkJCXZhbCA9IEtWQUwoS19TSElGVCk7CisKKwkJCXNoaWZ0X2Rvd25bdmFsXSsrOworCQkJc2hpZnRfc3RhdGUgfD0gKDEgPDwgdmFsKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFdlIGhhdmUgYSBjb21iaW5pbmcgY2hhcmFjdGVyIERJQUNSIGhlcmUsIGZvbGxvd2VkIGJ5IHRoZSBjaGFyYWN0ZXIgQ0guCisgKiBJZiB0aGUgY29tYmluYXRpb24gb2NjdXJzIGluIHRoZSB0YWJsZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgorICogT3RoZXJ3aXNlLCBpZiBDSCBpcyBhIHNwYWNlIG9yIGVxdWFscyBESUFDUiwgcmV0dXJuIERJQUNSLgorICogT3RoZXJ3aXNlLCBjb25jbHVkZSB0aGF0IERJQUNSIHdhcyBub3QgY29tYmluaW5nIGFmdGVyIGFsbCwKKyAqIHF1ZXVlIGl0IGFuZCByZXR1cm4gQ0guCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhhbmRsZV9kaWFjcihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJaW50IGQgPSBkaWFjcjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWRpYWNyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBhY2NlbnRfdGFibGVfc2l6ZTsgaSsrKSB7CisJCWlmIChhY2NlbnRfdGFibGVbaV0uZGlhY3IgPT0gZCAmJiBhY2NlbnRfdGFibGVbaV0uYmFzZSA9PSBjaCkKKwkJCXJldHVybiBhY2NlbnRfdGFibGVbaV0ucmVzdWx0OworCX0KKworCWlmIChjaCA9PSAnICcgfHwgY2ggPT0gZCkKKwkJcmV0dXJuIGQ7CisKKwlwdXRfcXVldWUodmMsIGQpOworCXJldHVybiBjaDsKK30KKworLyoKKyAqIFNwZWNpYWwgZnVuY3Rpb24gaGFuZGxlcnMKKyAqLworc3RhdGljIHZvaWQgZm5fZW50ZXIoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoZGlhY3IpIHsKKwkJcHV0X3F1ZXVlKHZjLCBkaWFjcik7CisJCWRpYWNyID0gMDsKKwl9CisJcHV0X3F1ZXVlKHZjLCAxMyk7CisJaWYgKHZjX2tiZF9tb2RlKGtiZCwgVkNfQ1JMRikpCisJCXB1dF9xdWV1ZSh2YywgMTApOworfQorCitzdGF0aWMgdm9pZCBmbl9jYXBzX3RvZ2dsZShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZXApCisJCXJldHVybjsKKwljaGdfdmNfa2JkX2xlZChrYmQsIFZDX0NBUFNMT0NLKTsKK30KKworc3RhdGljIHZvaWQgZm5fY2Fwc19vbihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZXApCisJCXJldHVybjsKKwlzZXRfdmNfa2JkX2xlZChrYmQsIFZDX0NBUFNMT0NLKTsKK30KKworc3RhdGljIHZvaWQgZm5fc2hvd19wdHJlZ3Moc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocmVncykKKwkJc2hvd19yZWdzKHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBmbl9ob2xkKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHZjLT52Y190dHk7CisKKwlpZiAocmVwIHx8ICF0dHkpCisJCXJldHVybjsKKworCS8qCisJICogTm90ZTogU0NST0xMT0NLIHdpbGwgYmUgc2V0IChjbGVhcmVkKSBieSBzdG9wX3R0eSAoc3RhcnRfdHR5KTsKKwkgKiB0aGVzZSByb3V0aW5lcyBhcmUgYWxzbyBhY3RpdmF0ZWQgYnkgXlMvXlEuCisJICogKEFuZCBTQ1JPTExPQ0sgY2FuIGFsc28gYmUgc2V0IGJ5IHRoZSBpb2N0bCBLRFNLQkxFRC4pCisJICovCisJaWYgKHR0eS0+c3RvcHBlZCkKKwkJc3RhcnRfdHR5KHR0eSk7CisJZWxzZQorCQlzdG9wX3R0eSh0dHkpOworfQorCitzdGF0aWMgdm9pZCBmbl9udW0oc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAodmNfa2JkX21vZGUoa2JkLFZDX0FQUExJQykpCisJCWFwcGxrZXkodmMsICdQJywgMSk7CisJZWxzZQorCQlmbl9iYXJlX251bSh2YywgcmVncyk7Cit9CisKKy8qCisgKiBCaW5kIHRoaXMgdG8gU2hpZnQtTnVtTG9jayBpZiB5b3Ugd29yayBpbiBhcHBsaWNhdGlvbiBrZXlwYWQgbW9kZQorICogYnV0IHdhbnQgdG8gYmUgYWJsZSB0byBjaGFuZ2UgdGhlIE51bUxvY2sgZmxhZy4KKyAqIEJpbmQgdGhpcyB0byBOdW1Mb2NrIGlmIHlvdSBwcmVmZXIgdGhhdCB0aGUgTnVtTG9jayBrZXkgYWx3YXlzCisgKiBjaGFuZ2VzIHRoZSBOdW1Mb2NrIGZsYWcuCisgKi8KK3N0YXRpYyB2b2lkIGZuX2JhcmVfbnVtKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKCFyZXApCisJCWNoZ192Y19rYmRfbGVkKGtiZCwgVkNfTlVNTE9DSyk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX2xhc3Rjb25zKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogc3dpdGNoIHRvIHRoZSBsYXN0IHVzZWQgY29uc29sZSwgQ2hOICovCisJc2V0X2NvbnNvbGUobGFzdF9jb25zb2xlKTsKK30KKworc3RhdGljIHZvaWQgZm5fZGVjX2NvbnNvbGUoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSwgY3VyID0gZmdfY29uc29sZTsKKworCS8qIEN1cnJlbnRseSBzd2l0Y2hpbmc/ICBRdWV1ZSB0aGlzIG5leHQgc3dpdGNoIHJlbGF0aXZlIHRvIHRoYXQuICovCisJaWYgKHdhbnRfY29uc29sZSAhPSAtMSkKKwkJY3VyID0gd2FudF9jb25zb2xlOworCisJZm9yIChpID0gY3VyLTE7IGkgIT0gY3VyOyBpLS0pIHsKKwkJaWYgKGkgPT0gLTEpCisJCQlpID0gTUFYX05SX0NPTlNPTEVTLTE7CisJCWlmICh2Y19jb25zX2FsbG9jYXRlZChpKSkKKwkJCWJyZWFrOworCX0KKwlzZXRfY29uc29sZShpKTsKK30KKworc3RhdGljIHZvaWQgZm5faW5jX2NvbnNvbGUoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSwgY3VyID0gZmdfY29uc29sZTsKKworCS8qIEN1cnJlbnRseSBzd2l0Y2hpbmc/ICBRdWV1ZSB0aGlzIG5leHQgc3dpdGNoIHJlbGF0aXZlIHRvIHRoYXQuICovCisJaWYgKHdhbnRfY29uc29sZSAhPSAtMSkKKwkJY3VyID0gd2FudF9jb25zb2xlOworCisJZm9yIChpID0gY3VyKzE7IGkgIT0gY3VyOyBpKyspIHsKKwkJaWYgKGkgPT0gTUFYX05SX0NPTlNPTEVTKQorCQkJaSA9IDA7CisJCWlmICh2Y19jb25zX2FsbG9jYXRlZChpKSkKKwkJCWJyZWFrOworCX0KKwlzZXRfY29uc29sZShpKTsKK30KKworc3RhdGljIHZvaWQgZm5fc2VuZF9pbnRyKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHZjLT52Y190dHk7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX0JSRUFLKTsKKwljb25fc2NoZWR1bGVfZmxpcCh0dHkpOworfQorCitzdGF0aWMgdm9pZCBmbl9zY3JvbGxfZm9ydyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNjcm9sbGZyb250KHZjLCAwKTsKK30KKworc3RhdGljIHZvaWQgZm5fc2Nyb2xsX2JhY2soc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzY3JvbGxiYWNrKHZjLCAwKTsKK30KKworc3RhdGljIHZvaWQgZm5fc2hvd19tZW0oc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaG93X21lbSgpOworfQorCitzdGF0aWMgdm9pZCBmbl9zaG93X3N0YXRlKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2hvd19zdGF0ZSgpOworfQorCitzdGF0aWMgdm9pZCBmbl9ib290X2l0KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY3RybF9hbHRfZGVsKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX2NvbXBvc2Uoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlkZWFkX2tleV9uZXh0ID0gMTsKK30KKworc3RhdGljIHZvaWQgZm5fc3Bhd25fY29uKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgICAgIGlmIChzcGF3bnBpZCkKKwkgICBpZihraWxsX3Byb2Moc3Bhd25waWQsIHNwYXduc2lnLCAxKSkKKwkgICAgIHNwYXducGlkID0gMDsKK30KKworc3RhdGljIHZvaWQgZm5fU0FLKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHZjLT52Y190dHk7CisKKwkvKgorCSAqIFNBSyBzaG91bGQgYWxzbyB3b3JrIGluIGFsbCByYXcgbW9kZXMgYW5kIHJlc2V0CisJICogdGhlbSBwcm9wZXJseS4KKwkgKi8KKwlpZiAodHR5KQorCQlkb19TQUsodHR5KTsKKwlyZXNldF92Yyh2Yyk7Cit9CisKK3N0YXRpYyB2b2lkIGZuX251bGwoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljb21wdXRlX3NoaWZ0c3RhdGUoKTsKK30KKworLyoKKyAqIFNwZWNpYWwga2V5IGhhbmRsZXJzCisgKi8KK3N0YXRpYyB2b2lkIGtfaWdub3JlKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKK30KKworc3RhdGljIHZvaWQga19zcGVjKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAodXBfZmxhZykKKwkJcmV0dXJuOworCWlmICh2YWx1ZSA+PSBBUlJBWV9TSVpFKGZuX2hhbmRsZXIpKQorCQlyZXR1cm47CisJaWYgKChrYmQtPmtiZG1vZGUgPT0gVkNfUkFXIHx8IAorCSAgICAga2JkLT5rYmRtb2RlID09IFZDX01FRElVTVJBVykgJiYgCisJICAgICB2YWx1ZSAhPSBLVkFMKEtfU0FLKSkKKwkJcmV0dXJuOwkJLyogU0FLIGlzIGFsbG93ZWQgZXZlbiBpbiByYXcgbW9kZSAqLworCWZuX2hhbmRsZXJbdmFsdWVdKHZjLCByZWdzKTsKK30KKworc3RhdGljIHZvaWQga19sb3dlcmNhc2Uoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ayhLRVJOX0VSUiAia2V5Ym9hcmQuYzoga19sb3dlcmNhc2Ugd2FzIGNhbGxlZCAtIGltcG9zc2libGVcbiIpOworfQorCitzdGF0aWMgdm9pZCBrX3NlbGYoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICh1cF9mbGFnKQorCQlyZXR1cm47CQkvKiBubyBhY3Rpb24sIGlmIHRoaXMgaXMgYSBrZXkgcmVsZWFzZSAqLworCisJaWYgKGRpYWNyKQorCQl2YWx1ZSA9IGhhbmRsZV9kaWFjcih2YywgdmFsdWUpOworCisJaWYgKGRlYWRfa2V5X25leHQpIHsKKwkJZGVhZF9rZXlfbmV4dCA9IDA7CisJCWRpYWNyID0gdmFsdWU7CisJCXJldHVybjsKKwl9CisJcHV0X3F1ZXVlKHZjLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBIYW5kbGUgZGVhZCBrZXkuIE5vdGUgdGhhdCB3ZSBub3cgbWF5IGhhdmUgc2V2ZXJhbAorICogZGVhZCBrZXlzIG1vZGlmeWluZyB0aGUgc2FtZSBjaGFyYWN0ZXIuIFZlcnkgdXNlZnVsCisgKiBmb3IgVmlldG5hbWVzZS4KKyAqLworc3RhdGljIHZvaWQga19kZWFkMihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVwX2ZsYWcpCisJCXJldHVybjsKKwlkaWFjciA9IChkaWFjciA/IGhhbmRsZV9kaWFjcih2YywgdmFsdWUpIDogdmFsdWUpOworfQorCisvKgorICogT2Jzb2xldGUgLSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seQorICovCitzdGF0aWMgdm9pZCBrX2RlYWQoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJldF9kaWFjcltOUl9ERUFEXSA9IHsnYCcsICdcJycsICdeJywgJ34nLCAnIicsICcsJyB9OworCXZhbHVlID0gcmV0X2RpYWNyW3ZhbHVlXTsKKwlrX2RlYWQyKHZjLCB2YWx1ZSwgdXBfZmxhZywgcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGtfY29ucyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVwX2ZsYWcpCisJCXJldHVybjsKKwlzZXRfY29uc29sZSh2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGtfZm4oc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIHY7CisKKwlpZiAodXBfZmxhZykKKwkJcmV0dXJuOworCXYgPSB2YWx1ZTsKKwlpZiAodiA8IEFSUkFZX1NJWkUoZnVuY190YWJsZSkpIHsKKwkJaWYgKGZ1bmNfdGFibGVbdmFsdWVdKQorCQkJcHV0c19xdWV1ZSh2YywgZnVuY190YWJsZVt2YWx1ZV0pOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgImtfZm4gY2FsbGVkIHdpdGggdmFsdWU9JWRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQga19jdXIoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjdXJfY2hhcnMgPSAiQkRDQSI7CisKKwlpZiAodXBfZmxhZykKKwkJcmV0dXJuOworCWFwcGxrZXkodmMsIGN1cl9jaGFyc1t2YWx1ZV0sIHZjX2tiZF9tb2RlKGtiZCwgVkNfQ0tNT0RFKSk7Cit9CisKK3N0YXRpYyB2b2lkIGtfcGFkKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqcGFkX2NoYXJzID0gIjAxMjM0NTY3ODkrLSovXDAxNSwuPygpIyI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmFwcF9tYXAgPSAicHFyc3R1dnd4eWxTUlFNbm5tUFFTIjsKKworCWlmICh1cF9mbGFnKQorCQlyZXR1cm47CQkvKiBubyBhY3Rpb24sIGlmIHRoaXMgaXMgYSBrZXkgcmVsZWFzZSAqLworCisJLyoga2x1ZGdlLi4uIHNoaWZ0IGZvcmNlcyBjdXJzb3IvbnVtYmVyIGtleXMgKi8KKwlpZiAodmNfa2JkX21vZGUoa2JkLCBWQ19BUFBMSUMpICYmICFzaGlmdF9kb3duW0tHX1NISUZUXSkgeworCQlhcHBsa2V5KHZjLCBhcHBfbWFwW3ZhbHVlXSwgMSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXZjX2tiZF9sZWQoa2JkLCBWQ19OVU1MT0NLKSkKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBLVkFMKEtfUENPTU1BKToKKwkJCWNhc2UgS1ZBTChLX1BET1QpOgorCQkJCWtfZm4odmMsIEtWQUwoS19SRU1PVkUpLCAwLCByZWdzKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEtWQUwoS19QMCk6CisJCQkJa19mbih2YywgS1ZBTChLX0lOU0VSVCksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1AxKToKKwkJCQlrX2ZuKHZjLCBLVkFMKEtfU0VMRUNUKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDIpOgorCQkJCWtfY3VyKHZjLCBLVkFMKEtfRE9XTiksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1AzKToKKwkJCQlrX2ZuKHZjLCBLVkFMKEtfUEdETiksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1A0KToKKwkJCQlrX2N1cih2YywgS1ZBTChLX0xFRlQpLCAwLCByZWdzKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEtWQUwoS19QNik6CisJCQkJa19jdXIodmMsIEtWQUwoS19SSUdIVCksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1A3KToKKwkJCQlrX2ZuKHZjLCBLVkFMKEtfRklORCksIDAsIHJlZ3MpOworCQkJCXJldHVybjsKKwkJCWNhc2UgS1ZBTChLX1A4KToKKwkJCQlrX2N1cih2YywgS1ZBTChLX1VQKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDkpOgorCQkJCWtfZm4odmMsIEtWQUwoS19QR1VQKSwgMCwgcmVncyk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBLVkFMKEtfUDUpOgorCQkJCWFwcGxrZXkodmMsICdHJywgdmNfa2JkX21vZGUoa2JkLCBWQ19BUFBMSUMpKTsKKwkJCQlyZXR1cm47CisJCX0KKworCXB1dF9xdWV1ZSh2YywgcGFkX2NoYXJzW3ZhbHVlXSk7CisJaWYgKHZhbHVlID09IEtWQUwoS19QRU5URVIpICYmIHZjX2tiZF9tb2RlKGtiZCwgVkNfQ1JMRikpCisJCXB1dF9xdWV1ZSh2YywgMTApOworfQorCitzdGF0aWMgdm9pZCBrX3NoaWZ0KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgb2xkX3N0YXRlID0gc2hpZnRfc3RhdGU7CisKKwlpZiAocmVwKQorCQlyZXR1cm47CisJLyoKKwkgKiBNaW1pYyB0eXBld3JpdGVyOgorCSAqIGEgQ2Fwc1NoaWZ0IGtleSBhY3RzIGxpa2UgU2hpZnQgYnV0IHVuZG9lcyBDYXBzTG9jaworCSAqLworCWlmICh2YWx1ZSA9PSBLVkFMKEtfQ0FQU1NISUZUKSkgeworCQl2YWx1ZSA9IEtWQUwoS19TSElGVCk7CisJCWlmICghdXBfZmxhZykKKwkJCWNscl92Y19rYmRfbGVkKGtiZCwgVkNfQ0FQU0xPQ0spOworCX0KKworCWlmICh1cF9mbGFnKSB7CisJCS8qCisJCSAqIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHR3byBzaGlmdCBvciBjb250cm9sCisJCSAqIGtleXMgYXJlIGRlcHJlc3NlZCBzaW11bHRhbmVvdXNseQorCQkgKi8KKwkJaWYgKHNoaWZ0X2Rvd25bdmFsdWVdKQorCQkJc2hpZnRfZG93blt2YWx1ZV0tLTsKKwl9IGVsc2UKKwkJc2hpZnRfZG93blt2YWx1ZV0rKzsKKworCWlmIChzaGlmdF9kb3duW3ZhbHVlXSkKKwkJc2hpZnRfc3RhdGUgfD0gKDEgPDwgdmFsdWUpOworCWVsc2UKKwkJc2hpZnRfc3RhdGUgJj0gfigxIDw8IHZhbHVlKTsKKworCS8qIGtsdWRnZSAqLworCWlmICh1cF9mbGFnICYmIHNoaWZ0X3N0YXRlICE9IG9sZF9zdGF0ZSAmJiBucGFkY2ggIT0gLTEpIHsKKwkJaWYgKGtiZC0+a2JkbW9kZSA9PSBWQ19VTklDT0RFKQorCQkJdG9fdXRmOCh2YywgbnBhZGNoICYgMHhmZmZmKTsKKwkJZWxzZQorCQkJcHV0X3F1ZXVlKHZjLCBucGFkY2ggJiAweGZmKTsKKwkJbnBhZGNoID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBrX21ldGEoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICh1cF9mbGFnKQorCQlyZXR1cm47CisKKwlpZiAodmNfa2JkX21vZGUoa2JkLCBWQ19NRVRBKSkgeworCQlwdXRfcXVldWUodmMsICdcMDMzJyk7CisJCXB1dF9xdWV1ZSh2YywgdmFsdWUpOworCX0gZWxzZQorCQlwdXRfcXVldWUodmMsIHZhbHVlIHwgMHg4MCk7Cit9CisKK3N0YXRpYyB2b2lkIGtfYXNjaWkoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBiYXNlOworCisJaWYgKHVwX2ZsYWcpCisJCXJldHVybjsKKworCWlmICh2YWx1ZSA8IDEwKSB7CisJCS8qIGRlY2ltYWwgaW5wdXQgb2YgY29kZSwgd2hpbGUgQWx0IGRlcHJlc3NlZCAqLworCQliYXNlID0gMTA7CisJfSBlbHNlIHsKKwkJLyogaGV4YWRlY2ltYWwgaW5wdXQgb2YgY29kZSwgd2hpbGUgQWx0R3IgZGVwcmVzc2VkICovCisJCXZhbHVlIC09IDEwOworCQliYXNlID0gMTY7CisJfQorCisJaWYgKG5wYWRjaCA9PSAtMSkKKwkJbnBhZGNoID0gdmFsdWU7CisJZWxzZQorCQlucGFkY2ggPSBucGFkY2ggKiBiYXNlICsgdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGtfbG9jayhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIGNoYXIgdXBfZmxhZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVwX2ZsYWcgfHwgcmVwKQorCQlyZXR1cm47CisJY2hnX3ZjX2tiZF9sb2NrKGtiZCwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBrX3Nsb2NrKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrX3NoaWZ0KHZjLCB2YWx1ZSwgdXBfZmxhZywgcmVncyk7CisJaWYgKHVwX2ZsYWcgfHwgcmVwKQorCQlyZXR1cm47CisJY2hnX3ZjX2tiZF9zbG9jayhrYmQsIHZhbHVlKTsKKwkvKiB0cnkgdG8gbWFrZSBBbHQsIG9vcHMsIEFsdEdyIGFuZCBzdWNoIHdvcmsgKi8KKwlpZiAoIWtleV9tYXBzW2tiZC0+bG9ja3N0YXRlIF4ga2JkLT5zbG9ja3N0YXRlXSkgeworCQlrYmQtPnNsb2Nrc3RhdGUgPSAwOworCQljaGdfdmNfa2JkX3Nsb2NrKGtiZCwgdmFsdWUpOworCX0KK30KKworLyoKKyAqIFRoZSBsZWRzIGRpc3BsYXkgZWl0aGVyIChpKSB0aGUgc3RhdHVzIG9mIE51bUxvY2ssIENhcHNMb2NrLCBTY3JvbGxMb2NrLAorICogb3IgKGlpKSB3aGF0ZXZlciBwYXR0ZXJuIG9mIGxpZ2h0cyBwZW9wbGUgd2FudCB0byBzaG93IHVzaW5nIEtEU0VUTEVELAorICogb3IgKGlpaSkgc3BlY2lmaWVkIGJpdHMgb2Ygc3BlY2lmaWVkIHdvcmRzIGluIGtlcm5lbCBtZW1vcnkuCisgKi8KK3Vuc2lnbmVkIGNoYXIgZ2V0bGVkc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gbGVkc3RhdGU7Cit9CisKK3ZvaWQgc2V0bGVkc3RhdGUoc3RydWN0IGtiZF9zdHJ1Y3QgKmtiZCwgdW5zaWduZWQgaW50IGxlZCkKK3sKKwlpZiAoIShsZWQgJiB+NykpIHsKKwkJbGVkaW9jdGwgPSBsZWQ7CisJCWtiZC0+bGVkbW9kZSA9IExFRF9TSE9XX0lPQ1RMOworCX0gZWxzZQorCQlrYmQtPmxlZG1vZGUgPSBMRURfU0hPV19GTEFHUzsKKwlzZXRfbGVkcygpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0bGVkcyh2b2lkKQoreworCXN0cnVjdCBrYmRfc3RydWN0ICprYmQgPSBrYmRfdGFibGUgKyBmZ19jb25zb2xlOworCXVuc2lnbmVkIGNoYXIgbGVkczsKKwlpbnQgaTsKKworCWlmIChrYmQtPmxlZG1vZGUgPT0gTEVEX1NIT1dfSU9DVEwpCisJCXJldHVybiBsZWRpb2N0bDsKKworCWxlZHMgPSBrYmQtPmxlZGZsYWdzdGF0ZTsKKworCWlmIChrYmQtPmxlZG1vZGUgPT0gTEVEX1NIT1dfTUVNKSB7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlpZiAobGVkcHRyc1tpXS52YWxpZCkgeworCQkJCWlmICgqbGVkcHRyc1tpXS5hZGRyICYgbGVkcHRyc1tpXS5tYXNrKQorCQkJCQlsZWRzIHw9ICgxIDw8IGkpOworCQkJCWVsc2UKKwkJCQkJbGVkcyAmPSB+KDEgPDwgaSk7CisJCQl9CisJfQorCXJldHVybiBsZWRzOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIHRoZSBib3R0b20gaGFsZiBvZiB0aGUga2V5Ym9hcmQgaW50ZXJydXB0CisgKiByb3V0aW5lLCBhbmQgcnVucyB3aXRoIGFsbCBpbnRlcnJ1cHRzIGVuYWJsZWQuIEl0IGRvZXMKKyAqIGNvbnNvbGUgY2hhbmdpbmcsIGxlZCBzZXR0aW5nIGFuZCBjb3B5X3RvX2Nvb2tlZCwgd2hpY2ggY2FuCisgKiB0YWtlIGEgcmVhc29uYWJseSBsb25nIHRpbWUuCisgKgorICogQXNpZGUgZnJvbSB0aW1pbmcgKHdoaWNoIGlzbid0IHJlYWxseSB0aGF0IGltcG9ydGFudCBmb3IKKyAqIGtleWJvYXJkIGludGVycnVwdHMgYXMgdGhleSBoYXBwZW4gb2Z0ZW4pLCB1c2luZyB0aGUgc29mdHdhcmUKKyAqIGludGVycnVwdCByb3V0aW5lcyBmb3IgdGhpcyB0aGluZyBhbGxvd3MgdXMgdG8gZWFzaWx5IG1hc2sKKyAqIHRoaXMgd2hlbiB3ZSBkb24ndCB3YW50IGFueSBvZiB0aGUgYWJvdmUgdG8gaGFwcGVuLgorICogVGhpcyBhbGxvd3MgZm9yIGVhc3kgYW5kIGVmZmljaWVudCByYWNlLWNvbmRpdGlvbiBwcmV2ZW50aW9uCisgKiBmb3Iga2JkX3JlZnJlc2hfbGVkcyA9PiBpbnB1dF9ldmVudChkZXYsIEVWX0xFRCwgLi4uKSA9PiAuLi4KKyAqLworCitzdGF0aWMgdm9pZCBrYmRfYmgodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogbm9kZTsKKwl1bnNpZ25lZCBjaGFyIGxlZHMgPSBnZXRsZWRzKCk7CisKKwlpZiAobGVkcyAhPSBsZWRzdGF0ZSkgeworCQlsaXN0X2Zvcl9lYWNoKG5vZGUsJmtiZF9oYW5kbGVyLmhfbGlzdCkgeworCQkJc3RydWN0IGlucHV0X2hhbmRsZSAqIGhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOworCQkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX0xFRCwgTEVEX1NDUk9MTEwsICEhKGxlZHMgJiAweDAxKSk7CisJCQlpbnB1dF9ldmVudChoYW5kbGUtPmRldiwgRVZfTEVELCBMRURfTlVNTCwgICAgISEobGVkcyAmIDB4MDIpKTsKKwkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9MRUQsIExFRF9DQVBTTCwgICAhIShsZWRzICYgMHgwNCkpOworCQkJaW5wdXRfc3luYyhoYW5kbGUtPmRldik7CisJCX0KKwl9CisKKwlsZWRzdGF0ZSA9IGxlZHM7Cit9CisKK0RFQ0xBUkVfVEFTS0xFVF9ESVNBQkxFRChrZXlib2FyZF90YXNrbGV0LCBrYmRfYmgsIDApOworCisvKgorICogVGhpcyBhbGxvd3MgYSBuZXdseSBwbHVnZ2VkIGtleWJvYXJkIHRvIHBpY2sgdGhlIExFRCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQga2JkX3JlZnJlc2hfbGVkcyhzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCit7CisJdW5zaWduZWQgY2hhciBsZWRzID0gbGVkc3RhdGU7CisKKwl0YXNrbGV0X2Rpc2FibGUoJmtleWJvYXJkX3Rhc2tsZXQpOworCWlmIChsZWRzICE9IDB4ZmYpIHsKKwkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX0xFRCwgTEVEX1NDUk9MTEwsICEhKGxlZHMgJiAweDAxKSk7CisJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9MRUQsIExFRF9OVU1MLCAgICAhIShsZWRzICYgMHgwMikpOworCQlpbnB1dF9ldmVudChoYW5kbGUtPmRldiwgRVZfTEVELCBMRURfQ0FQU0wsICAgISEobGVkcyAmIDB4MDQpKTsKKwkJaW5wdXRfc3luYyhoYW5kbGUtPmRldik7CisJfQorCXRhc2tsZXRfZW5hYmxlKCZrZXlib2FyZF90YXNrbGV0KTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkgfHwgZGVmaW5lZChDT05GSUdfQUxQSEEpIHx8XAorICAgIGRlZmluZWQoQ09ORklHX01JUFMpIHx8IGRlZmluZWQoQ09ORklHX1BQQykgfHwgZGVmaW5lZChDT05GSUdfU1BBUkMzMikgfHxcCisgICAgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkgfHwgZGVmaW5lZChDT05GSUdfUEFSSVNDKSB8fCBkZWZpbmVkKENPTkZJR19TVVBFUkgpIHx8XAorICAgIChkZWZpbmVkKENPTkZJR19BUk0pICYmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0FUS0JEKSAmJiAhZGVmaW5lZChDT05GSUdfQVJDSF9SUEMpKQorCisjZGVmaW5lIEhXX1JBVyhkZXYpICh0ZXN0X2JpdChFVl9NU0MsIGRldi0+ZXZiaXQpICYmIHRlc3RfYml0KE1TQ19SQVcsIGRldi0+bXNjYml0KSAmJlwKKwkJCSgoZGV2KS0+aWQuYnVzdHlwZSA9PSBCVVNfSTgwNDIpICYmICgoZGV2KS0+aWQudmVuZG9yID09IDB4MDAwMSkgJiYgKChkZXYpLT5pZC5wcm9kdWN0ID09IDB4MDAwMSkpCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB4ODZfa2V5Y29kZXNbMjU2XSA9CisJeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorCSAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKwkgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisJIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLAorCSA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwKKwkgODAsIDgxLCA4MiwgODMsIDg0LDExOCwgODYsIDg3LCA4OCwxMTUsMTIwLDExOSwxMjEsMTEyLDEyMywgOTIsCisJMjg0LDI4NSwzMDksMjk4LDMxMiwgOTEsMzI3LDMyOCwzMjksMzMxLDMzMywzMzUsMzM2LDMzNywzMzgsMzM5LAorCTM2NywyODgsMzAyLDMwNCwzNTAsIDg5LDMzNCwzMjYsMjY3LDEyNiwyNjgsMjY5LDEyNSwzNDcsMzQ4LDM0OSwKKwkzNjAsMjYxLDI2MiwyNjMsMjY4LDM3NiwxMDAsMTAxLDMyMSwzMTYsMzczLDI4NiwyODksMTAyLDM1MSwzNTUsCisJMTAzLDEwNCwxMDUsMjc1LDI4NywyNzksMzA2LDEwNiwyNzQsMTA3LDI5NCwzNjQsMzU4LDM2MywzNjIsMzYxLAorCTI5MSwxMDgsMzgxLDI4MSwyOTAsMjcyLDI5MiwzMDUsMjgwLCA5OSwxMTIsMjU3LDI1OCwzNTksMTEzLDExNCwKKwkyNjQsMTE3LDI3MSwzNzQsMzc5LDI2NSwyNjYsIDkzLCA5NCwgOTUsIDg1LDI1OSwzNzUsMjYwLCA5MCwxMTYsCisJMzc3LDEwOSwxMTEsMjc3LDI3OCwyODIsMjgzLDI5NSwyOTYsMjk3LDI5OSwzMDAsMzAxLDI5MywzMDMsMzA3LAorCTMwOCwzMTAsMzEzLDMxNCwzMTUsMzE3LDMxOCwzMTksMzIwLDM1NywzMjIsMzIzLDMyNCwzMjUsMjc2LDMzMCwKKwkzMzIsMzQwLDM2NSwzNDIsMzQzLDM0NCwzNDUsMzQ2LDM1NiwyNzAsMzQxLDM2OCwzNjksMzcwLDM3MSwzNzIgfTsKKworI2lmZGVmIENPTkZJR19NQUNfRU1VTU9VU0VCVE4KK2V4dGVybiBpbnQgbWFjX2hpZF9tb3VzZV9lbXVsYXRlX2J1dHRvbnMoaW50LCBpbnQsIGludCk7CisjZW5kaWYgLyogQ09ORklHX01BQ19FTVVNT1VTRUJUTiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1BBUkMzMikgfHwgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkKK3N0YXRpYyBpbnQgc3BhcmNfbDFfYV9zdGF0ZSA9IDA7CitleHRlcm4gdm9pZCBzdW5fZG9fYnJlYWsodm9pZCk7CisjZW5kaWYKKworc3RhdGljIGludCBlbXVsYXRlX3JhdyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGludCBrZXljb2RlLCAKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgdXBfZmxhZykKK3sKKwlpZiAoa2V5Y29kZSA+IDI1NSB8fCAheDg2X2tleWNvZGVzW2tleWNvZGVdKQorCQlyZXR1cm4gLTE7IAorCisJc3dpdGNoIChrZXljb2RlKSB7CisJCWNhc2UgS0VZX1BBVVNFOgorCQkJcHV0X3F1ZXVlKHZjLCAweGUxKTsKKwkJCXB1dF9xdWV1ZSh2YywgMHgxZCB8IHVwX2ZsYWcpOworCQkJcHV0X3F1ZXVlKHZjLCAweDQ1IHwgdXBfZmxhZyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBLRVlfSEFOR1VFTDoKKwkJCWlmICghdXBfZmxhZykgcHV0X3F1ZXVlKHZjLCAweGYxKTsKKwkJCXJldHVybiAwOworCQljYXNlIEtFWV9IQU5KQToKKwkJCWlmICghdXBfZmxhZykgcHV0X3F1ZXVlKHZjLCAweGYyKTsKKwkJCXJldHVybiAwOworCX0gCisKKwlpZiAoa2V5Y29kZSA9PSBLRVlfU1lTUlEgJiYgc3lzcnFfYWx0KSB7CisJCXB1dF9xdWV1ZSh2YywgMHg1NCB8IHVwX2ZsYWcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoeDg2X2tleWNvZGVzW2tleWNvZGVdICYgMHgxMDApCisJCXB1dF9xdWV1ZSh2YywgMHhlMCk7CisKKwlwdXRfcXVldWUodmMsICh4ODZfa2V5Y29kZXNba2V5Y29kZV0gJiAweDdmKSB8IHVwX2ZsYWcpOworCisJaWYgKGtleWNvZGUgPT0gS0VZX1NZU1JRKSB7CisJCXB1dF9xdWV1ZSh2YywgMHhlMCk7CisJCXB1dF9xdWV1ZSh2YywgMHgzNyB8IHVwX2ZsYWcpOworCX0KKworCXJldHVybiAwOworfQorCisjZWxzZQorCisjZGVmaW5lIEhXX1JBVyhkZXYpCTAKKworI3dhcm5pbmcgIkNhbm5vdCBnZW5lcmF0ZSByYXdtb2RlIGtleWJvYXJkIGZvciB5b3VyIGFyY2hpdGVjdHVyZSB5ZXQuIgorCitzdGF0aWMgaW50IGVtdWxhdGVfcmF3KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IGtleWNvZGUsIHVuc2lnbmVkIGNoYXIgdXBfZmxhZykKK3sKKwlpZiAoa2V5Y29kZSA+IDEyNykKKwkJcmV0dXJuIC0xOworCisJcHV0X3F1ZXVlKHZjLCBrZXljb2RlIHwgdXBfZmxhZyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQga2JkX3Jhd2NvZGUodW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwlrYmQgPSBrYmRfdGFibGUgKyBmZ19jb25zb2xlOworCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfUkFXKQorCQlwdXRfcXVldWUodmMsIGRhdGEpOworfQorCit2b2lkIGtiZF9rZXljb2RlKHVuc2lnbmVkIGludCBrZXljb2RlLCBpbnQgZG93biwgaW50IGh3X3Jhdywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOworCXVuc2lnbmVkIHNob3J0IGtleXN5bSwgKmtleV9tYXA7CisJdW5zaWduZWQgY2hhciB0eXBlLCByYXdfbW9kZTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBzaGlmdF9maW5hbDsKKworCXR0eSA9IHZjLT52Y190dHk7CisKKwlpZiAodHR5ICYmICghdHR5LT5kcml2ZXJfZGF0YSkpIHsKKwkJLyogTm8gZHJpdmVyIGRhdGE/IFN0cmFuZ2UuIE9rYXkgd2UgZml4IGl0IHRoZW4uICovCisJCXR0eS0+ZHJpdmVyX2RhdGEgPSB2YzsKKwl9CisKKwlrYmQgPSBrYmRfdGFibGUgKyBmZ19jb25zb2xlOworCisJaWYgKGtleWNvZGUgPT0gS0VZX0xFRlRBTFQgfHwga2V5Y29kZSA9PSBLRVlfUklHSFRBTFQpCisJCXN5c3JxX2FsdCA9IGRvd247CisjaWYgZGVmaW5lZChDT05GSUdfU1BBUkMzMikgfHwgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkKKwlpZiAoa2V5Y29kZSA9PSBLRVlfU1RPUCkKKwkJc3BhcmNfbDFfYV9zdGF0ZSA9IGRvd247CisjZW5kaWYKKworCXJlcCA9IChkb3duID09IDIpOworCisjaWZkZWYgQ09ORklHX01BQ19FTVVNT1VTRUJUTgorCWlmIChtYWNfaGlkX21vdXNlX2VtdWxhdGVfYnV0dG9ucygxLCBrZXljb2RlLCBkb3duKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIENPTkZJR19NQUNfRU1VTU9VU0VCVE4gKi8KKworCWlmICgocmF3X21vZGUgPSAoa2JkLT5rYmRtb2RlID09IFZDX1JBVykpICYmICFod19yYXcpCisJCWlmIChlbXVsYXRlX3Jhdyh2Yywga2V5Y29kZSwgIWRvd24gPDwgNykpCisJCQlpZiAoa2V5Y29kZSA8IEJUTl9NSVNDKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImtleWJvYXJkLmM6IGNhbid0IGVtdWxhdGUgcmF3bW9kZSBmb3Iga2V5Y29kZSAlZFxuIiwga2V5Y29kZSk7CisKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEJICAgICAgIC8qIEhhbmRsZSB0aGUgU3lzUnEgSGFjayAqLworCWlmIChrZXljb2RlID09IEtFWV9TWVNSUSAmJiAoc3lzcnFfZG93biB8fCAoZG93biA9PSAxICYmIHN5c3JxX2FsdCkpKSB7CisJCXN5c3JxX2Rvd24gPSBkb3duOworCQlyZXR1cm47CisJfQorCWlmIChzeXNycV9kb3duICYmIGRvd24gJiYgIXJlcCkgeworCQloYW5kbGVfc3lzcnEoa2JkX3N5c3JxX3hsYXRlW2tleWNvZGVdLCByZWdzLCB0dHkpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BBUkMzMikgfHwgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkKKwlpZiAoa2V5Y29kZSA9PSBLRVlfQSAmJiBzcGFyY19sMV9hX3N0YXRlKSB7CisJCXNwYXJjX2wxX2Ffc3RhdGUgPSAwOworCQlzdW5fZG9fYnJlYWsoKTsKKwl9CisjZW5kaWYKKworCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfTUVESVVNUkFXKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgZXh0ZW5kZWQgbWVkaXVtIHJhdyBtb2RlLCB3aXRoIGtleXMgYWJvdmUgMTI3CisJCSAqIGVuY29kZWQgYXMgMCwgaGlnaCA3IGJpdHMsIGxvdyA3IGJpdHMsIHdpdGggdGhlIDAgYmVhcmluZworCQkgKiB0aGUgJ3VwJyBmbGFnIGlmIG5lZWRlZC4gMCBpcyByZXNlcnZlZCwgc28gdGhpcyBzaG91bGRuJ3QKKwkJICogaW50ZXJmZXJlIHdpdGggYW55dGhpbmcgZWxzZS4gVGhlIHR3byBieXRlcyBhZnRlciAwIHdpbGwKKwkJICogYWx3YXlzIGhhdmUgdGhlIHVwIGZsYWcgc2V0IG5vdCB0byBpbnRlcmZlcmUgd2l0aCBvbGRlcgorCQkgKiBhcHBsaWNhdGlvbnMuIFRoaXMgYWxsb3dzIGZvciAxNjM4NCBkaWZmZXJlbnQga2V5Y29kZXMsCisJCSAqIHdoaWNoIHNob3VsZCBiZSBlbm91Z2guCisJCSAqLworCQlpZiAoa2V5Y29kZSA8IDEyOCkgeworCQkJcHV0X3F1ZXVlKHZjLCBrZXljb2RlIHwgKCFkb3duIDw8IDcpKTsKKwkJfSBlbHNlIHsKKwkJCXB1dF9xdWV1ZSh2YywgIWRvd24gPDwgNyk7CisJCQlwdXRfcXVldWUodmMsIChrZXljb2RlID4+IDcpIHwgMHg4MCk7CisJCQlwdXRfcXVldWUodmMsIGtleWNvZGUgfCAweDgwKTsKKwkJfQorCQlyYXdfbW9kZSA9IDE7CisJfQorCisJaWYgKGRvd24pCisJCXNldF9iaXQoa2V5Y29kZSwga2V5X2Rvd24pOworCWVsc2UKKwkJY2xlYXJfYml0KGtleWNvZGUsIGtleV9kb3duKTsKKworCWlmIChyZXAgJiYgKCF2Y19rYmRfbW9kZShrYmQsIFZDX1JFUEVBVCkgfHwgKHR0eSAmJiAKKwkJKCFMX0VDSE8odHR5KSAmJiB0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkpKSkpIHsKKwkJLyoKKwkJICogRG9uJ3QgcmVwZWF0IGEga2V5IGlmIHRoZSBpbnB1dCBidWZmZXJzIGFyZSBub3QgZW1wdHkgYW5kIHRoZQorCQkgKiBjaGFyYWN0ZXJzIGdldCBhcmVuJ3QgZWNob2VkIGxvY2FsbHkuIFRoaXMgbWFrZXMga2V5IHJlcGVhdCAKKwkJICogdXNhYmxlIHdpdGggc2xvdyBhcHBsaWNhdGlvbnMgYW5kIHVuZGVyIGhlYXZ5IGxvYWRzLgorCQkgKi8KKwkJcmV0dXJuOworCX0KKworCXNoaWZ0X2ZpbmFsID0gKHNoaWZ0X3N0YXRlIHwga2JkLT5zbG9ja3N0YXRlKSBeIGtiZC0+bG9ja3N0YXRlOworCWtleV9tYXAgPSBrZXlfbWFwc1tzaGlmdF9maW5hbF07CisKKwlpZiAoIWtleV9tYXApIHsKKwkJY29tcHV0ZV9zaGlmdHN0YXRlKCk7CisJCWtiZC0+c2xvY2tzdGF0ZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoa2V5Y29kZSA+IE5SX0tFWVMpCisJCXJldHVybjsKKworCWtleXN5bSA9IGtleV9tYXBba2V5Y29kZV07CisJdHlwZSA9IEtUWVAoa2V5c3ltKTsKKworCWlmICh0eXBlIDwgMHhmMCkgeworCQlpZiAoZG93biAmJiAhcmF3X21vZGUpIHRvX3V0ZjgodmMsIGtleXN5bSk7CisJCXJldHVybjsKKwl9CisKKwl0eXBlIC09IDB4ZjA7CisKKwlpZiAocmF3X21vZGUgJiYgdHlwZSAhPSBLVF9TUEVDICYmIHR5cGUgIT0gS1RfU0hJRlQpCisJCXJldHVybjsKKworCWlmICh0eXBlID09IEtUX0xFVFRFUikgeworCQl0eXBlID0gS1RfTEFUSU47CisJCWlmICh2Y19rYmRfbGVkKGtiZCwgVkNfQ0FQU0xPQ0spKSB7CisJCQlrZXlfbWFwID0ga2V5X21hcHNbc2hpZnRfZmluYWwgXiAoMSA8PCBLR19TSElGVCldOworCQkJaWYgKGtleV9tYXApCisJCQkJa2V5c3ltID0ga2V5X21hcFtrZXljb2RlXTsKKwkJfQorCX0KKworCSgqa19oYW5kbGVyW3R5cGVdKSh2Yywga2V5c3ltICYgMHhmZiwgIWRvd24sIHJlZ3MpOworCisJaWYgKHR5cGUgIT0gS1RfU0xPQ0spCisJCWtiZC0+c2xvY2tzdGF0ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGtiZF9ldmVudChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUsIHVuc2lnbmVkIGludCBldmVudF90eXBlLCAKKwkJICAgICAgdW5zaWduZWQgaW50IGV2ZW50X2NvZGUsIGludCB2YWx1ZSkKK3sKKwlpZiAoZXZlbnRfdHlwZSA9PSBFVl9NU0MgJiYgZXZlbnRfY29kZSA9PSBNU0NfUkFXICYmIEhXX1JBVyhoYW5kbGUtPmRldikpCisJCWtiZF9yYXdjb2RlKHZhbHVlKTsKKwlpZiAoZXZlbnRfdHlwZSA9PSBFVl9LRVkpCisJCWtiZF9rZXljb2RlKGV2ZW50X2NvZGUsIHZhbHVlLCBIV19SQVcoaGFuZGxlLT5kZXYpLCBoYW5kbGUtPmRldi0+cmVncyk7CisJdGFza2xldF9zY2hlZHVsZSgma2V5Ym9hcmRfdGFza2xldCk7CisJZG9fcG9rZV9ibGFua2VkX2NvbnNvbGUgPSAxOworCXNjaGVkdWxlX2NvbnNvbGVfY2FsbGJhY2soKTsKK30KKworc3RhdGljIGNoYXIga2JkX25hbWVbXSA9ICJrYmQiOworCisvKgorICogV2hlbiBhIGtleWJvYXJkIChvciBvdGhlciBpbnB1dCBkZXZpY2UpIGlzIGZvdW5kLCB0aGUga2JkX2Nvbm5lY3QKKyAqIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhlIGZ1bmN0aW9uIHRoZW4gbG9va3MgYXQgdGhlIGRldmljZSwgYW5kIGlmIGl0CisgKiBsaWtlcyBpdCwgaXQgY2FuIG9wZW4gaXQgYW5kIGdldCBldmVudHMgZnJvbSBpdC4gSW4gdGhpcyAoa2JkX2Nvbm5lY3QpCisgKiBmdW5jdGlvbiwgd2Ugc2hvdWxkIGRlY2lkZSB3aGljaCBWVCB0byBiaW5kIHRoYXQga2V5Ym9hcmQgdG8gaW5pdGlhbGx5LgorICovCitzdGF0aWMgc3RydWN0IGlucHV0X2hhbmRsZSAqa2JkX2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIsIAorCQkJCQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCisJCQkJCXN0cnVjdCBpbnB1dF9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IEtFWV9SRVNFUlZFRDsgaSA8IEJUTl9NSVNDOyBpKyspCisJCWlmICh0ZXN0X2JpdChpLCBkZXYtPmtleWJpdCkpIGJyZWFrOworCisJaWYgKChpID09IEJUTl9NSVNDKSAmJiAhdGVzdF9iaXQoRVZfU05ELCBkZXYtPmV2Yml0KSkgCisJCXJldHVybiBOVUxMOworCisJaWYgKCEoaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlucHV0X2hhbmRsZSksIEdGUF9LRVJORUwpKSkgCisJCXJldHVybiBOVUxMOworCW1lbXNldChoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3QgaW5wdXRfaGFuZGxlKSk7CisKKwloYW5kbGUtPmRldiA9IGRldjsKKwloYW5kbGUtPmhhbmRsZXIgPSBoYW5kbGVyOworCWhhbmRsZS0+bmFtZSA9IGtiZF9uYW1lOworCisJaW5wdXRfb3Blbl9kZXZpY2UoaGFuZGxlKTsKKwlrYmRfcmVmcmVzaF9sZWRzKGhhbmRsZSk7CisKKwlyZXR1cm4gaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBrYmRfZGlzY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCit7CisJaW5wdXRfY2xvc2VfZGV2aWNlKGhhbmRsZSk7CisJa2ZyZWUoaGFuZGxlKTsKK30KKworc3RhdGljIHN0cnVjdCBpbnB1dF9kZXZpY2VfaWQga2JkX2lkc1tdID0geworCXsKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRVZCSVQsCisgICAgICAgICAgICAgICAgLmV2Yml0ID0geyBCSVQoRVZfS0VZKSB9LAorICAgICAgICB9LAorCQorCXsKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRVZCSVQsCisgICAgICAgICAgICAgICAgLmV2Yml0ID0geyBCSVQoRVZfU05EKSB9LAorICAgICAgICB9LAkKKworCXsgfSwgICAgLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaW5wdXQsIGtiZF9pZHMpOworCitzdGF0aWMgc3RydWN0IGlucHV0X2hhbmRsZXIga2JkX2hhbmRsZXIgPSB7CisJLmV2ZW50CQk9IGtiZF9ldmVudCwKKwkuY29ubmVjdAk9IGtiZF9jb25uZWN0LAorCS5kaXNjb25uZWN0CT0ga2JkX2Rpc2Nvbm5lY3QsCisJLm5hbWUJCT0gImtiZCIsCisJLmlkX3RhYmxlCT0ga2JkX2lkcywKK307CisKK2ludCBfX2luaXQga2JkX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworICAgICAgICBrYmQwLmxlZGZsYWdzdGF0ZSA9IGtiZDAuZGVmYXVsdF9sZWRmbGFnc3RhdGUgPSBLQkRfREVGTEVEUzsKKyAgICAgICAga2JkMC5sZWRtb2RlID0gTEVEX1NIT1dfRkxBR1M7CisgICAgICAgIGtiZDAubG9ja3N0YXRlID0gS0JEX0RFRkxPQ0s7CisgICAgICAgIGtiZDAuc2xvY2tzdGF0ZSA9IDA7CisgICAgICAgIGtiZDAubW9kZWZsYWdzID0gS0JEX0RFRk1PREU7CisgICAgICAgIGtiZDAua2JkbW9kZSA9IFZDX1hMQVRFOworCisgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgTUFYX05SX0NPTlNPTEVTIDsgaSsrKQorICAgICAgICAgICAgICAgIGtiZF90YWJsZVtpXSA9IGtiZDA7CisKKwlpbnB1dF9yZWdpc3Rlcl9oYW5kbGVyKCZrYmRfaGFuZGxlcik7CisKKwl0YXNrbGV0X2VuYWJsZSgma2V5Ym9hcmRfdGFza2xldCk7CisJdGFza2xldF9zY2hlZHVsZSgma2V5Ym9hcmRfdGFza2xldCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9sY2QuYyBiL2RyaXZlcnMvY2hhci9sY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAxYTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2xjZC5jCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogTENELCBMRUQgYW5kIEJ1dHRvbiBpbnRlcmZhY2UgZm9yIENvYmFsdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBieSBBbmRyZXcgQm9zZQorICoKKyAqIExpbnV4IGtlcm5lbCB2ZXJzaW9uIGhpc3Rvcnk6CisgKiAgICAgICBNYXJjaCAyMDAxOiBQb3J0ZWQgZnJvbSAyLjAuMzQgIGJ5IExpYW0gRGF2aWVzCisgKgorICovCisKKyNkZWZpbmUgUlRDX0lPX0VYVEVOVAkweDEwCS8qT25seSByZWFsbHkgdHdvIHBvcnRzLCBidXQuLi4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibGNkLmgiCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobGNkX2xvY2spOworCitzdGF0aWMgaW50IGxjZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGNkX3ByZXNlbnQgPSAxOworCisvKiB1c2VkIGluIGFyY2gvbWlwcy9jb2JhbHQvcmVzZXQuYyAqLworaW50IGxlZF9zdGF0ZSA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19UVUxJUCkgJiYgMAorCisjZGVmaW5lIE1BWF9JTlRFUkZBQ0VTCTgKK3N0YXRpYyBsaW5rY2hlY2tfZnVuY190IGxpbmtjaGVja19jYWxsYmFja3NbTUFYX0lOVEVSRkFDRVNdOworc3RhdGljIHZvaWQgKmxpbmtjaGVja19jb29raWVzW01BWF9JTlRFUkZBQ0VTXTsKKworaW50IGxjZF9yZWdpc3Rlcl9saW5rY2hlY2tfZnVuYyhpbnQgaWZhY2VfbnVtLCB2b2lkICpmdW5jLCB2b2lkICpjb29raWUpCit7CisJaWYgKGlmYWNlX251bSA8IDAgfHwKKwkgICAgaWZhY2VfbnVtID49IE1BWF9JTlRFUkZBQ0VTIHx8CisJICAgIGxpbmtjaGVja19jYWxsYmFja3NbaWZhY2VfbnVtXSAhPSBOVUxMKQorCQlyZXR1cm4gLTE7CisJbGlua2NoZWNrX2NhbGxiYWNrc1tpZmFjZV9udW1dID0gKGxpbmtjaGVja19mdW5jX3QpIGZ1bmM7CisJbGlua2NoZWNrX2Nvb2tpZXNbaWZhY2VfbnVtXSA9IGNvb2tpZTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGxjZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbGNkX2Rpc3BsYXkgYnV0dG9uX2Rpc3BsYXk7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIExDRF9PbjoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgwRik7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfT2ZmOgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDA4KTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9SZXNldDoKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDNGKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDNGKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDNGKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDNGKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDAxKTsKKwkJdWRlbGF5KDE1MCk7CisJCUxDRFdyaXRlSW5zdCgweDA2KTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9DbGVhcjoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgwMSk7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfQ3Vyc29yX0xlZnQ6CisJCXVkZWxheSgxNTApOworCQlCdXN5Q2hlY2soKTsKKwkJTENEV3JpdGVJbnN0KDB4MTApOworCQlicmVhazsKKworCWNhc2UgTENEX0N1cnNvcl9SaWdodDoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgxNCk7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfQ3Vyc29yX09mZjoKKwkJdWRlbGF5KDE1MCk7CisJCUJ1c3lDaGVjaygpOworCQlMQ0RXcml0ZUluc3QoMHgwQyk7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfQ3Vyc29yX09uOgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDBGKTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9CbGlua19PZmY6CisJCXVkZWxheSgxNTApOworCQlCdXN5Q2hlY2soKTsKKwkJTENEV3JpdGVJbnN0KDB4MEUpOworCQlicmVhazsKKworCWNhc2UgTENEX0dldF9DdXJzb3JfUG9zOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCQkJZGlzcGxheS5jdXJzb3JfYWRkcmVzcyA9IChMQ0RSZWFkSW5zdCk7CisJCQlkaXNwbGF5LmN1cnNvcl9hZGRyZXNzID0KKwkJCSAgICAoZGlzcGxheS5jdXJzb3JfYWRkcmVzcyAmIDB4MDdGKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCSAgICAoKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsICZkaXNwbGF5LAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCQl9CisKKworCWNhc2UgTENEX1NldF9DdXJzb3JfUG9zOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmRpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWEgPSAoZGlzcGxheS5jdXJzb3JfYWRkcmVzcyB8IGtMQ0RfQWRkcik7CisKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlMQ0RXcml0ZUluc3QoYSk7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIExDRF9HZXRfQ3Vyc29yOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCQkJZGlzcGxheS5jaGFyYWN0ZXIgPSBMQ0RSZWFkRGF0YTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJICAgICgoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywgJmRpc3BsYXksCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlMQ0RXcml0ZUluc3QoMHgxMCk7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIExDRF9TZXRfQ3Vyc29yOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmRpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlMQ0RXcml0ZURhdGEoZGlzcGxheS5jaGFyYWN0ZXIpOworCQkJdWRlbGF5KDE1MCk7CisJCQlCdXN5Q2hlY2soKTsKKwkJCUxDRFdyaXRlSW5zdCgweDEwKTsKKworCQkJYnJlYWs7CisJCX0KKworCisJY2FzZSBMQ0RfRGlzcF9MZWZ0OgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDE4KTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9EaXNwX1JpZ2h0OgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDFDKTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9Ib21lOgorCQl1ZGVsYXkoMTUwKTsKKwkJQnVzeUNoZWNrKCk7CisJCUxDRFdyaXRlSW5zdCgweDAyKTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9Xcml0ZTp7CisJCQlzdHJ1Y3QgbGNkX2Rpc3BsYXkgZGlzcGxheTsKKwkJCXVuc2lnbmVkIGludCBpbmRleDsKKworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmRpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXVkZWxheSgxNTApOworCQkJQnVzeUNoZWNrKCk7CisJCQlMQ0RXcml0ZUluc3QoMHg4MCk7CisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAoZGlzcGxheS5zaXplMSk7IGluZGV4KyspIHsKKwkJCQl1ZGVsYXkoMTUwKTsKKwkJCQlCdXN5Q2hlY2soKTsKKwkJCQlMQ0RXcml0ZURhdGEoZGlzcGxheS5saW5lMVtpbmRleF0pOworCQkJCUJ1c3lDaGVjaygpOworCQkJfQorCisJCQl1ZGVsYXkoMTUwKTsKKwkJCUJ1c3lDaGVjaygpOworCQkJTENEV3JpdGVJbnN0KDB4QzApOworCQkJdWRlbGF5KDE1MCk7CisJCQlCdXN5Q2hlY2soKTsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IChkaXNwbGF5LnNpemUyKTsgaW5kZXgrKykgeworCQkJCXVkZWxheSgxNTApOworCQkJCUJ1c3lDaGVjaygpOworCQkJCUxDRFdyaXRlRGF0YShkaXNwbGF5LmxpbmUyW2luZGV4XSk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIExDRF9SZWFkOnsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBkaXNwbGF5OworCisJCQlCdXN5Q2hlY2soKTsKKwkJCWZvciAoYWRkcmVzcyA9IGtERF9SMDA7IGFkZHJlc3MgPD0ga0REX1IwMTsKKwkJCSAgICAgYWRkcmVzcysrKSB7CisJCQkJYSA9IChhZGRyZXNzIHwga0xDRF9BZGRyKTsKKworCQkJCXVkZWxheSgxNTApOworCQkJCUJ1c3lDaGVjaygpOworCQkJCUxDRFdyaXRlSW5zdChhKTsKKwkJCQl1ZGVsYXkoMTUwKTsKKwkJCQlCdXN5Q2hlY2soKTsKKwkJCQlkaXNwbGF5LmxpbmUxW2FkZHJlc3NdID0gTENEUmVhZERhdGE7CisJCQl9CisKKwkJCWRpc3BsYXkubGluZTFbMHgyN10gPSAnXDAnOworCisJCQlmb3IgKGFkZHJlc3MgPSBrRERfUjEwOyBhZGRyZXNzIDw9IGtERF9SMTE7CisJCQkgICAgIGFkZHJlc3MrKykgeworCQkJCWEgPSAoYWRkcmVzcyB8IGtMQ0RfQWRkcik7CisKKwkJCQl1ZGVsYXkoMTUwKTsKKwkJCQlCdXN5Q2hlY2soKTsKKwkJCQlMQ0RXcml0ZUluc3QoYSk7CisKKwkJCQl1ZGVsYXkoMTUwKTsKKwkJCQlCdXN5Q2hlY2soKTsKKwkJCQlkaXNwbGF5LmxpbmUyW2FkZHJlc3MgLSAweDQwXSA9CisJCQkJICAgIExDRFJlYWREYXRhOworCQkJfQorCisJCQlkaXNwbGF5LmxpbmUyWzB4MjddID0gJ1wwJzsKKworCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJICAgICgoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywgJmRpc3BsYXksCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKy8vICBzZXQgYWxsIEdQSU8gbGVkcyB0byBsZWRfZGlzcGxheS5sZWRzCisKKwljYXNlIExFRF9TZXQ6eworCQkJc3RydWN0IGxjZF9kaXNwbGF5IGxlZF9kaXNwbGF5OworCisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmbGVkX2Rpc3BsYXksIChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWxlZF9zdGF0ZSA9IGxlZF9kaXNwbGF5LmxlZHM7CisJCQlMRURTZXQobGVkX3N0YXRlKTsKKworCQkJYnJlYWs7CisJCX0KKworCisvLyAgc2V0IG9ubHkgYml0IGxlZF9kaXNwbGF5LmxlZHMKKworCWNhc2UgTEVEX0JpdF9TZXQ6eworCQkJdW5zaWduZWQgaW50IGk7CisJCQlpbnQgYml0ID0gMTsKKwkJCXN0cnVjdCBsY2RfZGlzcGxheSBsZWRfZGlzcGxheTsKKworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmxlZF9kaXNwbGF5LCAoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsY2RfZGlzcGxheSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlmb3IgKGkgPSAwOyBpIDwgKGludCkgbGVkX2Rpc3BsYXkubGVkczsgaSsrKSB7CisJCQkJYml0ID0gMiAqIGJpdDsKKwkJCX0KKworCQkJbGVkX3N0YXRlID0gbGVkX3N0YXRlIHwgYml0OworCQkJTEVEU2V0KGxlZF9zdGF0ZSk7CisJCQlicmVhazsKKwkJfQorCisvLyAgY2xlYXIgb25seSBiaXQgbGVkX2Rpc3BsYXkubGVkcworCisJY2FzZSBMRURfQml0X0NsZWFyOnsKKwkJCXVuc2lnbmVkIGludCBpOworCQkJaW50IGJpdCA9IDE7CisJCQlzdHJ1Y3QgbGNkX2Rpc3BsYXkgbGVkX2Rpc3BsYXk7CisKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkgICAgKCZsZWRfZGlzcGxheSwgKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJZm9yIChpID0gMDsgaSA8IChpbnQpIGxlZF9kaXNwbGF5LmxlZHM7IGkrKykgeworCQkJCWJpdCA9IDIgKiBiaXQ7CisJCQl9CisKKwkJCWxlZF9zdGF0ZSA9IGxlZF9zdGF0ZSAmIH5iaXQ7CisJCQlMRURTZXQobGVkX3N0YXRlKTsKKwkJCWJyZWFrOworCQl9CisKKworCWNhc2UgQlVUVE9OX1JlYWQ6eworCQkJYnV0dG9uX2Rpc3BsYXkuYnV0dG9ucyA9IEdQSVJlYWQ7CisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnLCAmYnV0dG9uX2Rpc3BsYXksCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIExJTktfQ2hlY2s6eworCQkJYnV0dG9uX2Rpc3BsYXkuYnV0dG9ucyA9CisJCQkgICAgKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoMHhCMDEwMDA2MCkpOworCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJICAgICgoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywgJmJ1dHRvbl9kaXNwbGF5LAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxjZF9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBMSU5LX0NoZWNrXzI6eworCQkJaW50IGlmYWNlX251bTsKKworCQkJLyogcGFuZWwtdXRpbHMgc2hvdWxkIHBhc3MgaW4gdGhlIGRlc2lyZWQgaW50ZXJmYWNlIHN0YXR1cyBpcyB3YW50ZWQgZm9yCisJCQkgKiBpbiAiYnV0dG9ucyIgb2YgdGhlIHN0cnVjdHVyZS4gIFdlIHdpbGwgc2V0IHRoaXMgdG8gbm9uLXplcm8gaWYgdGhlCisJCQkgKiBsaW5rIGlzIGluIGZhY3QgdXAgZm9yIHRoZSByZXF1ZXN0ZWQgaW50ZXJmYWNlLiAgLS1EYXZlTQorCQkJICovCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmJ1dHRvbl9kaXNwbGF5LCAoc3RydWN0IGxjZF9kaXNwbGF5ICopIGFyZywKKwkJCSAgICAgc2l6ZW9mKGJ1dHRvbl9kaXNwbGF5KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZmFjZV9udW0gPSBidXR0b25fZGlzcGxheS5idXR0b25zOworI2lmIGRlZmluZWQoQ09ORklHX1RVTElQKSAmJiAwCisJCQlpZiAoaWZhY2VfbnVtID49IDAgJiYKKwkJCSAgICBpZmFjZV9udW0gPCBNQVhfSU5URVJGQUNFUyAmJgorCQkJICAgIGxpbmtjaGVja19jYWxsYmFja3NbaWZhY2VfbnVtXSAhPSBOVUxMKSB7CisJCQkJYnV0dG9uX2Rpc3BsYXkuYnV0dG9ucyA9CisJCQkJICAgIGxpbmtjaGVja19jYWxsYmFja3NbaWZhY2VfbnVtXQorCQkJCSAgICAobGlua2NoZWNrX2Nvb2tpZXNbaWZhY2VfbnVtXSk7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCWJ1dHRvbl9kaXNwbGF5LmJ1dHRvbnMgPSAwOworCisJCQlpZiAoX19jb3B5X3RvX3VzZXIKKwkJCSAgICAoKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsICZidXR0b25fZGlzcGxheSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsY2RfZGlzcGxheSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworLy8gIEVyYXNlIHRoZSBmbGFzaAorCisJY2FzZSBGTEFTSF9FcmFzZTp7CisKKwkJCWludCBjdHIgPSAwOworCisJCQlpZiAoICFjYXBhYmxlKENBUF9TWVNfQURNSU4pICkgcmV0dXJuIC1FUEVSTTsKKworCQkJcHJfaW5mbyhMQ0QgIkVyYXNpbmcgRmxhc2hcbiIpOworCisJCQkvLyBDaGlwIEVyYXNlIFNlcXVlbmNlCisJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjEsIGtGbGFzaF9EYXRhMSk7CisJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjIsIGtGbGFzaF9EYXRhMik7CisJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjEsIGtGbGFzaF9FcmFzZTMpOworCQkJV1JJVEVfRkxBU0goa0ZsYXNoX0FkZHIxLCBrRmxhc2hfRGF0YTEpOworCQkJV1JJVEVfRkxBU0goa0ZsYXNoX0FkZHIyLCBrRmxhc2hfRGF0YTIpOworCQkJV1JJVEVfRkxBU0goa0ZsYXNoX0FkZHIxLCBrRmxhc2hfRXJhc2U2KTsKKworCQkJd2hpbGUgKCghZHFwb2xsKDB4MDAwMDAwMDAsIDB4RkYpKQorCQkJICAgICAgICYmICghdGltZW91dCgweDAwMDAwMDAwKSkpIHsKKwkJCQljdHIrKzsKKwkJCX0KKworCQkJaWYgKFJFQURfRkxBU0goMHgwN0ZGRjApID09IDB4RkYpIHsKKwkJCQlwcl9pbmZvKExDRCAiRXJhc2UgU3VjY2Vzc2Z1bFxuIik7CisJCQl9IGVsc2UgaWYgKHRpbWVvdXQpIHsKKwkJCQlwcl9pbmZvKExDRCAiRXJhc2UgVGltZWQgT3V0XG4iKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworLy8gYnVybiB0aGUgZmxhc2gKKworCWNhc2UgRkxBU0hfQnVybjp7CisKKwkJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgYnVybl9hZGRyOworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCXVuc2lnbmVkIGludCBpLCBpbmRleDsKKwkJCXVuc2lnbmVkIGNoYXIgKnJvbTsKKworCisJCQlzdHJ1Y3QgbGNkX2Rpc3BsYXkgZGlzcGxheTsKKworCQkJaWYgKCAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSApIHJldHVybiAtRVBFUk07CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmZGlzcGxheSwgKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJvbSA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MoKDEyOCksIEdGUF9BVE9NSUMpOworCQkJaWYgKHJvbSA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIExDRCAia21hbGxvYygpIGZhaWxlZCBpbiAlc1xuIiwKKwkJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisKKwkJCXByX2luZm8oTENEICJTdGFydGluZyBGbGFzaCBidXJuXG4iKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBGTEFTSF9TSVpFOyBpID0gaSArIDEyOCkgeworCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJICAgIChyb20sIGRpc3BsYXkuUm9tSW1hZ2UgKyBpLCAxMjgpKSB7CisJCQkJCWtmcmVlKHJvbSk7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlidXJuX2FkZHIgPSBrRmxhc2hCYXNlICsgaTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbGNkX2xvY2ssIGZsYWdzKTsKKwkJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAoMTI4KTsgaW5kZXgrKykgeworCisJCQkJCVdSSVRFX0ZMQVNIKGtGbGFzaF9BZGRyMSwKKwkJCQkJCSAgICBrRmxhc2hfRGF0YTEpOworCQkJCQlXUklURV9GTEFTSChrRmxhc2hfQWRkcjIsCisJCQkJCQkgICAga0ZsYXNoX0RhdGEyKTsKKwkJCQkJV1JJVEVfRkxBU0goa0ZsYXNoX0FkZHIxLAorCQkJCQkJICAgIGtGbGFzaF9Qcm9nKTsKKwkJCQkJKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKWJ1cm5fYWRkcikgPQorCQkJCQkgICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKSByb21baW5kZXhdOworCisJCQkJCXdoaWxlICgoIWRxcG9sbCAoYnVybl9hZGRyLAorCQkJCQkJKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIpCisJCQkJCQlyb21baW5kZXhdKSkgJiYKKwkJCQkJCSghdGltZW91dChidXJuX2FkZHIpKSkgeyB9CisJCQkJCWJ1cm5fYWRkcisrOworCQkJCX0KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsY2RfbG9jaywgZmxhZ3MpOworCQkJCWlmICgqICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKQorCQkJCQkoYnVybl9hZGRyIC0gMSkpID09CisJCQkJCSh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKQorCQkJCQlyb21baW5kZXggLSAxXSkgeworCQkJCX0gZWxzZSBpZiAodGltZW91dCkgeworCQkJCQlwcl9pbmZvKExDRCAiRmxhc2ggYnVybiB0aW1lZCBvdXRcbiIpOworCQkJCX0KKworCisJCQl9CisJCQlrZnJlZShyb20pOworCisJCQlwcl9pbmZvKExDRCAiRmxhc2ggc3VjY2Vzc2Z1bGx5IGJ1cm5lZFxuIik7CisKKwkJCWJyZWFrOworCQl9CisKKy8vICByZWFkIHRoZSBmbGFzaCBhbGwgYXQgb25jZQorCisJY2FzZSBGTEFTSF9SZWFkOnsKKworCQkJdW5zaWduZWQgY2hhciAqdXNlcl9ieXRlczsKKwkJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcmVhZF9hZGRyOworCQkJdW5zaWduZWQgaW50IGk7CisKKwkJCXVzZXJfYnl0ZXMgPQorCQkJICAgICYoKChzdHJ1Y3QgbGNkX2Rpc3BsYXkgKikgYXJnKS0+Um9tSW1hZ2VbMF0pOworCisJCQlpZiAoIWFjY2Vzc19vaworCQkJICAgIChWRVJJRllfV1JJVEUsIHVzZXJfYnl0ZXMsIEZMQVNIX1NJWkUpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlwcl9pbmZvKExDRCAiUmVhZGluZyBGbGFzaCIpOworCQkJZm9yIChpID0gMDsgaSA8IEZMQVNIX1NJWkU7IGkrKykgeworCQkJCXVuc2lnbmVkIGNoYXIgdG1wX2J5dGU7CisJCQkJcmVhZF9hZGRyID0ga0ZsYXNoQmFzZSArIGk7CisJCQkJdG1wX2J5dGUgPQorCQkJCSAgICAqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopCisJCQkJICAgICAgcmVhZF9hZGRyKTsKKwkJCQlpZiAoX19wdXRfdXNlcih0bXBfYnl0ZSwgJnVzZXJfYnl0ZXNbaV0pKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGxjZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghbGNkX3ByZXNlbnQpCisJCXJldHVybiAtRU5YSU87CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyogT25seSBSRVNFVCBvciBORVhUIGNvdW50cyBhcyBidXR0b24gcHJlc3NlZCAqLworCitzdGF0aWMgaW5saW5lIGludCBidXR0b25fcHJlc3NlZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYnV0dG9ucyA9IEdQSVJlYWQ7CisKKwlpZiAoKGJ1dHRvbnMgPT0gQlVUVE9OX05leHQpIHx8IChidXR0b25zID09IEJVVFRPTl9OZXh0X0IpCisJICAgIHx8IChidXR0b25zID09IEJVVFRPTl9SZXNldF9CKSkKKwkJcmV0dXJuIGJ1dHRvbnM7CisJcmV0dXJuIDA7Cit9CisKKy8qIExFRCBkYWVtb24gc2l0cyBvbiB0aGlzIGFuZCB3ZSB3YWtlIGhpbSB1cCBvbmNlIGEga2V5IGlzIHByZXNzZWQuICovCisKK3N0YXRpYyBpbnQgbGNkX3dhaXRlcnMgPSAwOworCitzdGF0aWMgbG9uZyBsY2RfcmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJbG9uZyBidXR0b25zX25vdzsKKworCWlmIChsY2Rfd2FpdGVycyA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbGNkX3dhaXRlcnMrKzsKKwl3aGlsZSAoKChidXR0b25zX25vdyA9IChsb25nKSBidXR0b25fcHJlc3NlZCgpKSA9PSAwKSAmJgorCSAgICAgICAhKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSkgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMDAwKTsKKwl9CisJbGNkX3dhaXRlcnMtLTsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gYnV0dG9uc19ub3c7Cit9CisKKy8qCisgKglUaGUgdmFyaW91cyBmaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydC4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsY2RfZm9wcyA9IHsKKwkucmVhZCA9IGxjZF9yZWFkLAorCS5pb2N0bCA9IGxjZF9pb2N0bCwKKwkub3BlbiA9IGxjZF9vcGVuLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGxjZF9kZXYgPSB7CisJTUlTQ19EWU5BTUlDX01JTk9SLAorCSJsY2QiLAorCSZsY2RfZm9wcworfTsKKworc3RhdGljIGludCBsY2RfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKworCXByX2luZm8oIiVzXG4iLCBMQ0RfRFJJVkVSKTsKKwltaXNjX3JlZ2lzdGVyKCZsY2RfZGV2KTsKKworCS8qIENoZWNrIHJlZ2lvbj8gTmFhYWghIEp1c3Qgc25hcmYgaXQgdXAuICovCisvKglyZXF1ZXN0X3JlZ2lvbihSVENfUE9SVCgwKSwgUlRDX0lPX0VYVEVOVCwgImxjZCIpOyovCisKKwl1ZGVsYXkoMTUwKTsKKwlkYXRhID0gTENEUmVhZERhdGE7CisJaWYgKChkYXRhICYgMHgwMDAwMDBGRikgPT0gKDB4MDApKSB7CisJCWxjZF9wcmVzZW50ID0gMDsKKwkJcHJfaW5mbyhMQ0QgIkxDRCBOb3QgUHJlc2VudFxuIik7CisJfSBlbHNlIHsKKwkJbGNkX3ByZXNlbnQgPSAxOworCQlXUklURV9HQUwoa0dhbF9EZXZCYW5rMlBSZWcsIGtHYWxfRGV2QmFuazJDZmcpOworCQlXUklURV9HQUwoa0dhbF9EZXZCYW5rM1BSZWcsIGtHYWxfRGV2QmFuazNDZmcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGNkX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmxjZF9kZXYpOworfQorCisvLworLy8gRnVuY3Rpb246IGRxcG9sbAorLy8KKy8vIERlc2NyaXB0aW9uOiAgUG9sbHMgdGhlIGRhdGEgbGluZXMgdG8gc2VlIGlmIHRoZSBmbGFzaCBpcyBidXN5CisvLworLy8gSW46IGFkZHJlc3MsIGJ5dGUgZGF0YQorLy8KKy8vIE91dDogMCA9IGJ1c3ksIDEgPSB3cml0ZSBvciBlcmFzZSBjb21wbGV0ZQorLy8KKy8vCisKK3N0YXRpYyBpbnQgZHFwb2xsKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZHE3OworCisJZHE3ID0gZGF0YSAmIDB4ODA7CisKKwlyZXR1cm4gKChSRUFEX0ZMQVNIKGFkZHJlc3MpICYgMHg4MCkgPT0gZHE3KTsKK30KKworLy8KKy8vIEZ1bmN0aW9uOiB0aW1lb3V0CisvLworLy8gRGVzY3JpcHRpb246IENoZWNrcyB0byBzZWUgaWYgZXJhc2Ugb3Igd3JpdGUgaGFzIHRpbWVkIG91dAorLy8gICAgICAgICAgICAgIEJ5IHBvbGxpbmcgZHE1CisvLworLy8gSW46IGFkZHJlc3MKKy8vCisvLworLy8gT3V0OiAwID0gbm90IHRpbWVkIG91dCwgMSA9IHRpbWVkIG91dAorCitzdGF0aWMgaW50IHRpbWVvdXQodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXJldHVybiAoUkVBRF9GTEFTSChhZGRyZXNzKSAmIDB4MjApID09IDB4MjA7Cit9CisKK21vZHVsZV9pbml0KGxjZF9pbml0KTsKK21vZHVsZV9leGl0KGxjZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcmV3IEJvc2UiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9sY2QuaCBiL2RyaXZlcnMvY2hhci9sY2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzhhOTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2xjZC5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogTEVELCBMQ0QgYW5kIEJ1dHRvbiBwYW5lbCBkcml2ZXIgZm9yIENvYmFsdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBieSBBbmRyZXcgQm9zZQorICoKKyAqIExpbnV4IGtlcm5lbCB2ZXJzaW9uIGhpc3Rvcnk6CisgKiAgICAgICBNYXJjaCAyMDAxOiBQb3J0ZWQgZnJvbSAyLjAuMzQgIGJ5IExpYW0gRGF2aWVzCisgKgorICovCisKKy8vIGZ1bmN0aW9uIGhlYWRlcnMKKworc3RhdGljIGludCBkcXBvbGwodm9sYXRpbGUgdW5zaWduZWQgbG9uZywgdm9sYXRpbGUgdW5zaWduZWQgY2hhciApOworc3RhdGljIGludCB0aW1lb3V0KHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcpOworCisjZGVmaW5lIExDRF9DSEFSU19QRVJfTElORSA0MAorI2RlZmluZSBGTEFTSF9TSVpFIDUyNDI4OAorI2RlZmluZSBNQVhfSURMRV9USU1FIDEyMAorCitzdHJ1Y3QgbGNkX2Rpc3BsYXkgeworICAgICAgICB1bnNpZ25lZCBsb25nIGJ1dHRvbnM7CisgICAgICAgIGludCBzaXplMTsKKyAgICAgICAgaW50IHNpemUyOworICAgICAgICB1bnNpZ25lZCBjaGFyIGxpbmUxW0xDRF9DSEFSU19QRVJfTElORV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgbGluZTJbTENEX0NIQVJTX1BFUl9MSU5FXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjdXJzb3JfYWRkcmVzczsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjaGFyYWN0ZXI7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgbGVkczsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqUm9tSW1hZ2U7Cit9OworCisKKworI2RlZmluZSBMQ0RfRFJJVkVSCSJDb2JhbHQgTENEIERyaXZlciB2Mi4xMCIKKworI2RlZmluZSBMQ0QJCSJsY2Q6ICIKKworI2RlZmluZSBrTENEX0lSCQkweDBGMDAwMDAwCisjZGVmaW5lIGtMQ0RfRFIJCTB4MEYwMDAwMTAKKyNkZWZpbmUga0dQSQkJMHgwRDAwMDAwMAorI2RlZmluZSBrTEVECQkweDBDMDAwMDAwCisKKyNkZWZpbmUga0REX1IwMCAgICAgICAgIDB4MDAKKyNkZWZpbmUga0REX1IwMSAgICAgICAgIDB4MjcKKyNkZWZpbmUga0REX1IxMCAgICAgICAgIDB4NDAKKyNkZWZpbmUga0REX1IxMSAgICAgICAgIDB4NjcKKworI2RlZmluZSBrTENEX0FkZHIgICAgICAgMHgwMDAwMDA4MAorCisjZGVmaW5lIExDRFRpbWVvdXRWYWx1ZQkweGZmZgorCisKKy8vIEZsYXNoIGRlZmluaXRpb25zIEFNRCAyOUYwNDAKKyNkZWZpbmUga0ZsYXNoQmFzZQkweDBGQzAwMDAwCisKKyNkZWZpbmUga0ZsYXNoX0FkZHIxICAgIDB4NTU1NQorI2RlZmluZSBrRmxhc2hfQWRkcjIgICAgMHgyQUFBCisjZGVmaW5lIGtGbGFzaF9EYXRhMSAgICAweEFBCisjZGVmaW5lIGtGbGFzaF9EYXRhMiAgICAweDU1CisjZGVmaW5lIGtGbGFzaF9Qcm9nICAgICAweEEwCisjZGVmaW5lIGtGbGFzaF9FcmFzZTMgICAweDgwCisjZGVmaW5lIGtGbGFzaF9FcmFzZTYgICAweDEwCisjZGVmaW5lIGtGbGFzaF9SZWFkICAgICAweEYwCisKKyNkZWZpbmUga0ZsYXNoX0lEICAgICAgIDB4OTAKKyNkZWZpbmUga0ZsYXNoX1ZlbkFkZHIgIDB4MDAKKyNkZWZpbmUga0ZsYXNoX0RldkFkZHIgIDB4MDEKKyNkZWZpbmUga0ZsYXNoX1ZlbklEICAgIDB4MDEKKyNkZWZpbmUga0ZsYXNoX0RldklEICAgIDB4QTQgICAgLy8gMjlGMDQwCisvLyNkZWZpbmUga0ZsYXNoX0RldklEICAweEFEICAgIC8vIDI5RjAxNgorCisKKy8vIE1hY3JvcworCisjZGVmaW5lIExDRFdyaXRlRGF0YSh4KQlvdXRsKCh4IDw8IDI0KSwga0xDRF9EUikKKyNkZWZpbmUgTENEV3JpdGVJbnN0KHgpCW91dGwoKHggPDwgMjQpLCBrTENEX0lSKQorCisjZGVmaW5lIExDRFJlYWREYXRhCShpbmwoa0xDRF9EUikgPj4gMjQpCisjZGVmaW5lIExDRFJlYWRJbnN0CShpbmwoa0xDRF9JUikgPj4gMjQpCisKKyNkZWZpbmUgR1BJUmVhZAkJKGlubChrR1BJKSA+PiAyNCkKKworI2RlZmluZSBMRURTZXQoeCkJb3V0YigoY2hhcil4LCBrTEVEKQorCisjZGVmaW5lIFdSSVRFX0dBTCh4LHkpCW91dGwoeSwgMHgwNDAwMDAwMCB8ICh4KSkKKyNkZWZpbmUgQnVzeUNoZWNrKCkJd2hpbGUgKChMQ0RSZWFkSW5zdCAmIDB4ODApID09IDB4ODApCisKKyNkZWZpbmUgV1JJVEVfRkxBU0goeCx5KSBvdXRiKChjaGFyKXksIGtGbGFzaEJhc2UgfCAoeCkpCisjZGVmaW5lIFJFQURfRkxBU0goeCkJKGluYihrRmxhc2hCYXNlIHwgKHgpKSkKKworCisKKy8qCisgKiBGdW5jdGlvbiBjb21tYW5kIGNvZGVzIGZvciBpb19jdGwuCisgKi8KKyNkZWZpbmUgTENEX09uCQkJMQorI2RlZmluZSBMQ0RfT2ZmCQkJMgorI2RlZmluZSBMQ0RfQ2xlYXIJCTMKKyNkZWZpbmUgTENEX1Jlc2V0CQk0CisjZGVmaW5lIExDRF9DdXJzb3JfTGVmdAkJNQorI2RlZmluZSBMQ0RfQ3Vyc29yX1JpZ2h0CTYKKyNkZWZpbmUgTENEX0Rpc3BfTGVmdAkJNworI2RlZmluZSBMQ0RfRGlzcF9SaWdodAkJOAorI2RlZmluZSBMQ0RfR2V0X0N1cnNvcgkJOQorI2RlZmluZSBMQ0RfU2V0X0N1cnNvcgkJMTAKKyNkZWZpbmUgTENEX0hvbWUJCTExCisjZGVmaW5lIExDRF9SZWFkCQkxMgorI2RlZmluZSBMQ0RfV3JpdGUJCTEzCisjZGVmaW5lIExDRF9DdXJzb3JfT2ZmCQkxNAorI2RlZmluZSBMQ0RfQ3Vyc29yX09uCQkxNQorI2RlZmluZSBMQ0RfR2V0X0N1cnNvcl9Qb3MJMTYKKyNkZWZpbmUgTENEX1NldF9DdXJzb3JfUG9zCTE3CisjZGVmaW5lIExDRF9CbGlua19PZmYgICAgICAgICAgIDE4CisKKyNkZWZpbmUgTEVEX1NldAkJCTQwCisjZGVmaW5lIExFRF9CaXRfU2V0CQk0MQorI2RlZmluZSBMRURfQml0X0NsZWFyCQk0MgorCisKKy8vICBCdXR0b24gZGVmcworI2RlZmluZSBCVVRUT05fUmVhZCAgICAgICAgICAgICA1MAorCisvLyAgRmxhc2ggY29tbWFuZCBjb2RlcworI2RlZmluZSBGTEFTSF9FcmFzZQkJNjAKKyNkZWZpbmUgRkxBU0hfQnVybgkJNjEKKyNkZWZpbmUgRkxBU0hfUmVhZAkJNjIKKworCisvLyBFdGhlcm5ldCBMSU5LIGNoZWNrIGhhY2thcm9vCisjZGVmaW5lIExJTktfQ2hlY2sgICAgICAgICAgICAgIDkwCisjZGVmaW5lIExJTktfQ2hlY2tfMgkJOTEKKworLy8gIEJ1dHRvbiBwYXR0ZXJucyAgX0IgLSBzaW5nbGUgbGF5ZXIgbGNkIGJvYXJkcworCisjZGVmaW5lIEJVVFRPTl9OT05FICAgICAgICAgICAgICAgMHgzRgorI2RlZmluZSBCVVRUT05fTk9ORV9CICAgICAgICAgICAgIDB4RkUKKworI2RlZmluZSBCVVRUT05fTGVmdCAgICAgICAgICAgICAgIDB4M0IKKyNkZWZpbmUgQlVUVE9OX0xlZnRfQiAgICAgICAgICAgICAweEZBCisKKyNkZWZpbmUgQlVUVE9OX1JpZ2h0ICAgICAgICAgICAgICAweDM3CisjZGVmaW5lIEJVVFRPTl9SaWdodF9CICAgICAgICAgICAgMHhERQorCisjZGVmaW5lIEJVVFRPTl9VcCAgICAgICAgICAgICAgICAgMHgyRgorI2RlZmluZSBCVVRUT05fVXBfQiAgICAgICAgICAgICAgIDB4RjYKKworI2RlZmluZSBCVVRUT05fRG93biAgICAgICAgICAgICAgIDB4MUYKKyNkZWZpbmUgQlVUVE9OX0Rvd25fQiAgICAgICAgICAgICAweEVFCisKKyNkZWZpbmUgQlVUVE9OX05leHQgICAgICAgICAgICAgICAweDNECisjZGVmaW5lIEJVVFRPTl9OZXh0X0IgICAgICAgICAgICAgMHg3RQorCisjZGVmaW5lIEJVVFRPTl9FbnRlciAgICAgICAgICAgICAgMHgzRQorI2RlZmluZSBCVVRUT05fRW50ZXJfQiAgICAgICAgICAgIDB4QkUKKworI2RlZmluZSBCVVRUT05fUmVzZXRfQiAgICAgICAgICAgIDB4RkMKKworCisvLyBkZWJvdW5jZSBjb25zdGFudHMKKworI2RlZmluZSBCVVRUT05fU0VOU0UgICAgICAgICAgICAxNjAwMDAKKyNkZWZpbmUgQlVUVE9OX0RFQk9VTkNFCQk1MDAwCisKKworLy8gIEdhbGlsZW8gcmVnaXN0ZXIgc3R1ZmYKKworI2RlZmluZSBrR2FsX0RldkJhbmsyQ2ZnICAgICAgICAweDE0NjZEQjMzCisjZGVmaW5lIGtHYWxfRGV2QmFuazJQUmVnICAgICAgIDB4NDY0CisjZGVmaW5lIGtHYWxfRGV2QmFuazNDZmcgICAgICAgIDB4MTQ2RkRGRkIKKyNkZWZpbmUga0dhbF9EZXZCYW5rM1BSZWcgICAgICAgMHg0NjgKKworLy8gTmV0d29yaworCisjZGVmaW5lIGtJUEFERFIJCQkxCisjZGVmaW5lIGtORVRNQVNLCQkyCisjZGVmaW5lIGtHQVRFV0FZCQkzCisjZGVmaW5lIGtETlMJCQk0CisKKyNkZWZpbmUga0NsYXNzQQkJCTUKKyNkZWZpbmUga0NsYXNzQgkJCTYKKyNkZWZpbmUga0NsYXNzQwkJCTcKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2xwLmMgYi9kcml2ZXJzL2NoYXIvbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGVlOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2xwLmMKQEAgLTAsMCArMSw5OTUgQEAKKy8qCisgKiBHZW5lcmljIHBhcmFsbGVsIHByaW50ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyIGJ5IEppbSBXZWlnYW5kIGFuZCBMaW51cyBUb3J2YWxkcworICogQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMgYnkgTWljaGFlbCBLLiBKb2huc29uCisgKiAtIFRoYW5rcyBtdWNoIHRvIEd1bnRlciBXaW5kYXUgZm9yIHBvaW50aW5nIG91dCB0byBtZSB3aGVyZSB0aGUgZXJyb3IKKyAqICAgY2hlY2tpbmcgb3VnaHQgdG8gYmUuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgTmlnZWwgR2FtYmxlIChhZGRlZCBpbnRlcnJ1cHQgY29kZSkKKyAqIENvcHlyaWdodCAoQykgMTk5NCBieSBBbGFuIENveCAoTW9kdWxhcmlzZWQgaXQpCisgKiBMUENBUkVGVUwsIExQQUJPUlQsIExQR0VUU1RBVFVTIGFkZGVkIGJ5IENocmlzIE1ldGNhbGYsIG1ldGNhbGZAbGNzLm1pdC5lZHUKKyAqIFN0YXRpc3RpY3MgYW5kIHN1cHBvcnQgZm9yIHNsb3cgcHJpbnRlcnMgYnkgUm9iIEphbnNzZW4sIHJvYkBrbm93YXJlLm5sCisgKiAibHA9IiBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBhZGRlZCBieSBHcmFudCBHdWVudGhlciwgZ3JhbnRAdG9ycXVlLm5ldAorICogbHBfcmVhZCAoU3RhdHVzIHJlYWRiYWNrKSBzdXBwb3J0IGFkZGVkIGJ5IENhcnN0ZW4gR3Jvc3MsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcnN0ZW5Ac29sLndvaG5oZWltLnVuaS11bG0uZGUKKyAqIFN1cHBvcnQgZm9yIHBhcnBvcnQgYnkgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogUGFycG9ydCBzaGFyaW5nIGhhY2tpbmcgYnkgQW5kcmVhIEFyY2FuZ2VsaQorICogRml4ZWQga2VybmVsXyh0by9mcm9tKV91c2VyIG1lbW9yeSBjb3B5IHRvIGNoZWNrIGZvciBlcnJvcnMKKyAqIAkJCQlieSBSaWNjYXJkbyBGYWNjaGV0dGkgPGZpemJhbkB0aW4uaXQ+CisgKiAyMi1KQU4tMTk5OCAgQWRkZWQgc3VwcG9ydCBmb3IgZGV2ZnMgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICogUmVkZXNpZ25lZCBpbnRlcnJ1cHQgaGFuZGxpbmcgZm9yIGhhbmRsZSBwcmludGVycyB3aXRoIGJ1Z2d5IGhhbmRzaGFrZQorICoJCQkJYnkgQW5kcmVhIEFyY2FuZ2VsaSwgMTEgTWF5IDE5OTgKKyAqIEZ1bGwgZWZmaWNpZW50IGhhbmRsaW5nIG9mIHByaW50ZXIgd2l0aCBidWdneSBpcnEgaGFuZHNoYWtlIChub3cgSSBoYXZlCisgKiB1bmRlcnN0b29kIHRoZSBtZWFuaW5nIG9mIHRoZSBzdHJhbmdlIGhhbmRzaGFrZSkuIFRoaXMgaXMgZG9uZSBzZW5kaW5nIG5ldworICogY2hhcmFjdGVycyBpZiB0aGUgaW50ZXJydXB0IGlzIGp1c3QgaGFwcGVuZWQsIGV2ZW4gaWYgdGhlIHByaW50ZXIgc2F5IHRvCisgKiBiZSBzdGlsbCBCVVNZLiBUaGlzIGlzIG5lZWRlZCBhdCBsZWFzdCB3aXRoIEVwc29uIFN0eWx1cyBDb2xvci4gVG8gZW5hYmxlCisgKiB0aGUgbmV3IFRSVVNUX0lSUSBtb2RlIHJlYWQgdGhlIGBMUCBPUFRJTUlaQVRJT04nIHNlY3Rpb24gYmVsb3cuLi4KKyAqIEZpeGVkIHRoZSBpcnEgb24gdGhlIHJpc2luZyBlZGdlIG9mIHRoZSBzdHJvYmUgY2FzZS4KKyAqIE9ic29sZXRlZCB0aGUgQ0FSRUZVTCBmbGFnIHNpbmNlIGEgcHJpbnRlciB0aGF0IGRvZXNuJyB0IHdvcmsgd2l0aAorICogQ0FSRUZVTCB3aWxsIGJsb2NrIGEgYml0IGFmdGVyIGluIGxwX2NoZWNrX3N0YXR1cygpLgorICoJCQkJQW5kcmVhIEFyY2FuZ2VsaSwgMTUgT2N0IDE5OTgKKyAqIE9ic29sZXRlZCBhbmQgcmVtb3ZlZCBhbGwgdGhlIGxvd2xldmVsIHN0dWZmIGltcGxlbWVudGVkIGluIHRoZSBsYXN0CisgKiBtb250aCB0byB1c2UgdGhlIElFRUUxMjg0IGZ1bmN0aW9ucyAodGhhdCBoYW5kbGUgdGhlIF9uZXdfIGNvbXBhdGliaWx0eQorICogbW9kZSBmaW5lKS4KKyAqLworCisvKiBUaGlzIGRyaXZlciBzaG91bGQsIGluIHRoZW9yeSwgd29yayB3aXRoIGFueSBwYXJhbGxlbCBwb3J0IHRoYXQgaGFzIGFuCisgKiBhcHByb3ByaWF0ZSBsb3ctbGV2ZWwgZHJpdmVyOyBhbGwgSS9PIGlzIGRvbmUgdGhyb3VnaCB0aGUgcGFycG9ydAorICogYWJzdHJhY3Rpb24gbGF5ZXIuCisgKgorICogSWYgdGhpcyBkcml2ZXIgaXMgYnVpbHQgaW50byB0aGUga2VybmVsLCB5b3UgY2FuIGNvbmZpZ3VyZSBpdCB1c2luZyB0aGUKKyAqIGtlcm5lbCBjb21tYW5kLWxpbmUuICBGb3IgZXhhbXBsZToKKyAqCisgKglscD1wYXJwb3J0MSxub25lLHBhcnBvcnQyCShiaW5kIGxwMCB0byBwYXJwb3J0MSwgZGlzYWJsZSBscDEgYW5kCisgKgkJCQkJIGJpbmQgbHAyIHRvIHBhcnBvcnQyKQorICoKKyAqCWxwPWF1dG8JCQkJKGFzc2lnbiBscCBkZXZpY2VzIHRvIGFsbCBwb3J0cyB0aGF0CisgKgkJCQkgICAgICAgICBoYXZlIHByaW50ZXJzIGF0dGFjaGVkLCBhcyBkZXRlcm1pbmVkCisgKgkJCQkJIGJ5IHRoZSBJRUVFLTEyODQgYXV0b3Byb2JlKQorICogCisgKglscD1yZXNldAkJCShyZXNldCB0aGUgcHJpbnRlciBkdXJpbmcgCisgKgkJCQkJIGluaXRpYWxpc2F0aW9uKQorICoKKyAqCWxwPW9mZgkJCQkoZGlzYWJsZSB0aGUgcHJpbnRlciBkcml2ZXIgZW50aXJlbHkpCisgKgorICogSWYgdGhlIGRyaXZlciBpcyBsb2FkZWQgYXMgYSBtb2R1bGUsIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUKKyAqIHVzaW5nIG1vZHVsZSBwYXJhbWV0ZXJzLiAgVGhlIGVxdWl2YWxlbnQgb2YgdGhlIGFib3ZlIGNvbW1hbmRzIHdvdWxkIGJlOgorICoKKyAqCSMgaW5zbW9kIGxwLm8gcGFycG9ydD0xLG5vbmUsMgorICoKKyAqCSMgaW5zbW9kIGxwLm8gcGFycG9ydD1hdXRvCisgKgorICoJIyBpbnNtb2QgbHAubyByZXNldD0xCisgKi8KKworLyogQ09NUEFUSUJJTElUWSBXSVRIIE9MRCBLRVJORUxTCisgKgorICogVW5kZXIgTGludXggMi4wIGFuZCBwcmV2aW91cyB2ZXJzaW9ucywgbHAgZGV2aWNlcyB3ZXJlIGJvdW5kIHRvIHBvcnRzIGF0CisgKiBwYXJ0aWN1bGFyIEkvTyBhZGRyZXNzZXMsIGFzIGZvbGxvd3M6CisgKgorICoJbHAwCQkweDNiYworICoJbHAxCQkweDM3OAorICoJbHAyCQkweDI3OAorICoKKyAqIFRoZSBuZXcgZHJpdmVyLCBieSBkZWZhdWx0LCBiaW5kcyBscCBkZXZpY2VzIHRvIHBhcnBvcnQgZGV2aWNlcyBhcyBpdAorICogZmluZHMgdGhlbS4gIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3Ugb25seSBoYXZlIG9uZSBwb3J0LCBpdCB3aWxsIGJlIGJvdW5kCisgKiB0byBscDAgcmVnYXJkbGVzcyBvZiBpdHMgSS9PIGFkZHJlc3MuICBJZiB5b3UgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciwgeW91CisgKiBjYW4gZm9yY2UgaXQgdXNpbmcgdGhlIHBhcmFtZXRlcnMgZGVzY3JpYmVkIGFib3ZlLgorICovCisKKy8qCisgKiBUaGUgbmV3IGludGVycnVwdCBoYW5kbGluZyBjb2RlIHRha2UgY2FyZSBvZiB0aGUgYnVnZ3kgaGFuZHNoYWtlCisgKiBvZiBzb21lIEhQIGFuZCBFcHNvbiBwcmludGVyOgorICogX19fCisgKiBBQ0sgICAgX19fX19fX19fX19fX19fICAgIF9fX19fX19fX19fCisgKiAgICAgICAgICAgICAgICAgICAgICAgfF9ffAorICogX19fXworICogQlVTWSAgIF9fX19fX19fXyAgICAgICAgICAgICAgX19fX19fXworICogICAgICAgICAgICAgICAgIHxfX19fX19fX19fX198CisgKgorICogSSBkaXNjb3ZlcmVkIHRoaXMgdXNpbmcgdGhlIHByaW50ZXIgc2Nhbm5lciB0aGF0IHlvdSBjYW4gZmluZCBhdDoKKyAqCisgKglmdHA6Ly9lLW1pbmQuY29tL3B1Yi9saW51eC9wc2Nhbi8KKyAqCisgKgkJCQkJMTEgTWF5IDk4LCBBbmRyZWEgQXJjYW5nZWxpCisgKgorICogTXkgcHJpbnRlciBzY2FubmVyIHJ1biBvbiBhbiBFcHNvbiBTdHlsdXMgQ29sb3Igc2hvdyB0aGF0IHN1Y2ggcHJpbnRlcgorICogZ2VuZXJhdGVzIHRoZSBpcnEgb24gdGhlIF9yaXNpbmdfIGVkZ2Ugb2YgdGhlIFNUUk9CRS4gTm93IGxwIGhhbmRsZQorICogdGhpcyBjYXNlIGZpbmUgdG9vLgorICoKKyAqCQkJCQkxNSBPY3QgMTk5OCwgQW5kcmVhIEFyY2FuZ2VsaQorICoKKyAqIFRoZSBzbyBjYWxsZWQgYGJ1Z2d5JyBoYW5kc2hha2UgaXMgcmVhbGx5IHRoZSB3ZWxsIGRvY3VtZW50ZWQKKyAqIGNvbXBhdGliaWxpdHkgbW9kZSBJRUVFMTI4NCBoYW5kc2hha2UuIFRoZXkgY2hhbmdlZCB0aGUgd2VsbCBrbm93bgorICogQ2VudHJvbmljcyBoYW5kc2hha2UgYWNraW5nIGluIHRoZSBtaWRkbGUgb2YgYnVzeSBleHBlY3RpbmcgdG8gbm90CisgKiBicmVhayBkcml2ZXJzIG9yIGxlZ2FjeSBhcHBsaWNhdGlvbiwgd2hpbGUgdGhleSBicm9rZW4gbGludXggbHAKKyAqIHVudGlsIEkgZml4ZWQgaXQgcmV2ZXJzZSBlbmdpbmVlcmluZyB0aGUgcHJvdG9jb2wgYnkgaGFuZCBzb21lCisgKiBtb250aCBhZ28uLi4KKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCBEZWMgMTk5OCwgQW5kcmVhIEFyY2FuZ2VsaQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBUaW0gV2F1Z2ggKGFkZGVkIExQU0VUVElNRU9VVCBpb2N0bCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI3VuZGVmIExQX1NUQVRTCisjaW5jbHVkZSA8bGludXgvbHAuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyogaWYgeW91IGhhdmUgbW9yZSB0aGFuIDggcHJpbnRlcnMsIHJlbWVtYmVyIHRvIGluY3JlYXNlIExQX05PICovCisjZGVmaW5lIExQX05PIDgKKworLyogUk9VTkRfVVAgbWFjcm8gZnJvbSBmcy9zZWxlY3QuYyAqLworI2RlZmluZSBST1VORF9VUCh4LHkpICgoKHgpKyh5KS0xKS8oeSkpCisKK3N0YXRpYyBzdHJ1Y3QgbHBfc3RydWN0IGxwX3RhYmxlW0xQX05PXTsKKworc3RhdGljIHVuc2lnbmVkIGludCBscF9jb3VudCA9IDA7CitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqbHBfY2xhc3M7CisKKyNpZmRlZiBDT05GSUdfTFBfQ09OU09MRQorc3RhdGljIHN0cnVjdCBwYXJwb3J0ICpjb25zb2xlX3JlZ2lzdGVyZWQ7IC8vIGluaXRpYWxseSBOVUxMCisjZW5kaWYgLyogQ09ORklHX0xQX0NPTlNPTEUgKi8KKworI3VuZGVmIExQX0RFQlVHCisKKy8qIEJpdHMgdXNlZCB0byBtYW5hZ2UgY2xhaW1pbmcgdGhlIHBhcnBvcnQgZGV2aWNlICovCisjZGVmaW5lIExQX1BSRUVNUFRfUkVRVUVTVCAxCisjZGVmaW5lIExQX1BBUlBPUlRfQ0xBSU1FRCAyCisKKy8qIC0tLSBsb3ctbGV2ZWwgcG9ydCBhY2Nlc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSByX2R0cih4KQkocGFycG9ydF9yZWFkX2RhdGEobHBfdGFibGVbKHgpXS5kZXYtPnBvcnQpKQorI2RlZmluZSByX3N0cih4KQkocGFycG9ydF9yZWFkX3N0YXR1cyhscF90YWJsZVsoeCldLmRldi0+cG9ydCkpCisjZGVmaW5lIHdfY3RyKHgseSkJZG8geyBwYXJwb3J0X3dyaXRlX2NvbnRyb2wobHBfdGFibGVbKHgpXS5kZXYtPnBvcnQsICh5KSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHdfZHRyKHgseSkJZG8geyBwYXJwb3J0X3dyaXRlX2RhdGEobHBfdGFibGVbKHgpXS5kZXYtPnBvcnQsICh5KSk7IH0gd2hpbGUgKDApCisKKy8qIENsYWltIHRoZSBwYXJwb3J0IG9yIGJsb2NrIHRyeWluZyB1bmxlc3Mgd2UndmUgYWxyZWFkeSBjbGFpbWVkIGl0ICovCitzdGF0aWMgdm9pZCBscF9jbGFpbV9wYXJwb3J0X29yX2Jsb2NrKHN0cnVjdCBscF9zdHJ1Y3QgKnRoaXNfbHApCit7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KExQX1BBUlBPUlRfQ0xBSU1FRCwgJnRoaXNfbHAtPmJpdHMpKSB7CisJCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sgKHRoaXNfbHAtPmRldik7CisJfQorfQorCisvKiBDbGFpbSB0aGUgcGFycG9ydCBvciBibG9jayB0cnlpbmcgdW5sZXNzIHdlJ3ZlIGFscmVhZHkgY2xhaW1lZCBpdCAqLworc3RhdGljIHZvaWQgbHBfcmVsZWFzZV9wYXJwb3J0KHN0cnVjdCBscF9zdHJ1Y3QgKnRoaXNfbHApCit7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChMUF9QQVJQT1JUX0NMQUlNRUQsICZ0aGlzX2xwLT5iaXRzKSkgeworCQlwYXJwb3J0X3JlbGVhc2UgKHRoaXNfbHAtPmRldik7CisJfQorfQorCisKKworc3RhdGljIGludCBscF9wcmVlbXB0KHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgbHBfc3RydWN0ICp0aGlzX2xwID0gKHN0cnVjdCBscF9zdHJ1Y3QgKiloYW5kbGU7CisJc2V0X2JpdChMUF9QUkVFTVBUX1JFUVVFU1QsICZ0aGlzX2xwLT5iaXRzKTsKKwlyZXR1cm4gKDEpOworfQorCisKKy8qIAorICogVHJ5IHRvIG5lZ290aWF0ZSB0byBhIG5ldyBtb2RlOyBpZiB1bnN1Y2Nlc3NmdWwgbmVnb3RpYXRlIHRvCisgKiBjb21wYXRpYmlsaXR5IG1vZGUuICBSZXR1cm4gdGhlIG1vZGUgd2UgZW5kZWQgdXAgaW4uCisgKi8KK3N0YXRpYyBpbnQgbHBfbmVnb3RpYXRlKHN0cnVjdCBwYXJwb3J0ICogcG9ydCwgaW50IG1vZGUpCit7CisJaWYgKHBhcnBvcnRfbmVnb3RpYXRlIChwb3J0LCBtb2RlKSAhPSAwKSB7CisJCW1vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKwkJcGFycG9ydF9uZWdvdGlhdGUgKHBvcnQsIG1vZGUpOworCX0KKworCXJldHVybiAobW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgbHBfcmVzZXQoaW50IG1pbm9yKQoreworCWludCByZXR2YWw7CisJbHBfY2xhaW1fcGFycG9ydF9vcl9ibG9jayAoJmxwX3RhYmxlW21pbm9yXSk7CisJd19jdHIobWlub3IsIExQX1BTRUxFQ1ApOworCXVkZWxheSAoTFBfREVMQVkpOworCXdfY3RyKG1pbm9yLCBMUF9QU0VMRUNQIHwgTFBfUElOSVRQKTsKKwlyZXR2YWwgPSByX3N0cihtaW5vcik7CisJbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBscF9lcnJvciAoaW50IG1pbm9yKQoreworCURFRklORV9XQUlUKHdhaXQpOworCWludCBwb2xsaW5nOworCisJaWYgKExQX0YobWlub3IpICYgTFBfQUJPUlQpCisJCXJldHVybjsKKworCXBvbGxpbmcgPSBscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LT5pcnEgPT0gUEFSUE9SVF9JUlFfTk9ORTsKKwlpZiAocG9sbGluZykgbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKwlwcmVwYXJlX3RvX3dhaXQoJmxwX3RhYmxlW21pbm9yXS53YWl0cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChMUF9USU1FT1VUX1BPTExFRCk7CisJZmluaXNoX3dhaXQoJmxwX3RhYmxlW21pbm9yXS53YWl0cSwgJndhaXQpOworCWlmIChwb2xsaW5nKSBscF9jbGFpbV9wYXJwb3J0X29yX2Jsb2NrICgmbHBfdGFibGVbbWlub3JdKTsKKwllbHNlIHBhcnBvcnRfeWllbGRfYmxvY2tpbmcgKGxwX3RhYmxlW21pbm9yXS5kZXYpOworfQorCitzdGF0aWMgaW50IGxwX2NoZWNrX3N0YXR1cyhpbnQgbWlub3IpCit7CisJaW50IGVycm9yID0gMDsKKwl1bnNpZ25lZCBpbnQgbGFzdCA9IGxwX3RhYmxlW21pbm9yXS5sYXN0X2Vycm9yOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gcl9zdHIobWlub3IpOworCWlmICgoc3RhdHVzICYgTFBfUEVSUk9SUCkgJiYgIShMUF9GKG1pbm9yKSAmIExQX0NBUkVGVUwpKQorCQkvKiBObyBlcnJvci4gKi8KKwkJbGFzdCA9IDA7CisJZWxzZSBpZiAoKHN0YXR1cyAmIExQX1BPVVRQQSkpIHsKKwkJaWYgKGxhc3QgIT0gTFBfUE9VVFBBKSB7CisJCQlsYXN0ID0gTFBfUE9VVFBBOworCQkJcHJpbnRrKEtFUk5fSU5GTyAibHAlZCBvdXQgb2YgcGFwZXJcbiIsIG1pbm9yKTsKKwkJfQorCQllcnJvciA9IC1FTk9TUEM7CisJfSBlbHNlIGlmICghKHN0YXR1cyAmIExQX1BTRUxFQ0QpKSB7CisJCWlmIChsYXN0ICE9IExQX1BTRUxFQ0QpIHsKKwkJCWxhc3QgPSBMUF9QU0VMRUNEOworCQkJcHJpbnRrKEtFUk5fSU5GTyAibHAlZCBvZmYtbGluZVxuIiwgbWlub3IpOworCQl9CisJCWVycm9yID0gLUVJTzsKKwl9IGVsc2UgaWYgKCEoc3RhdHVzICYgTFBfUEVSUk9SUCkpIHsKKwkJaWYgKGxhc3QgIT0gTFBfUEVSUk9SUCkgeworCQkJbGFzdCA9IExQX1BFUlJPUlA7CisJCQlwcmludGsoS0VSTl9JTkZPICJscCVkIG9uIGZpcmVcbiIsIG1pbm9yKTsKKwkJfQorCQllcnJvciA9IC1FSU87CisJfSBlbHNlIHsKKwkJbGFzdCA9IDA7IC8qIENvbWUgaGVyZSBpZiBMUF9DQVJFRlVMIGlzIHNldCBhbmQgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzIGFyZSByZXBvcnRlZC4gKi8KKwl9CisKKwlscF90YWJsZVttaW5vcl0ubGFzdF9lcnJvciA9IGxhc3Q7CisKKwlpZiAobGFzdCAhPSAwKQorCQlscF9lcnJvcihtaW5vcik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbHBfd2FpdF9yZWFkeShpbnQgbWlub3IsIGludCBub25ibG9jaykKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJLyogSWYgd2UncmUgbm90IGluIGNvbXBhdGliaWxpdHkgbW9kZSwgd2UncmUgcmVhZHkgbm93ISAqLworCWlmIChscF90YWJsZVttaW5vcl0uY3VycmVudF9tb2RlICE9IElFRUUxMjg0X01PREVfQ09NUEFUKSB7CisJICByZXR1cm4gKDApOworCX0KKworCWRvIHsKKwkJZXJyb3IgPSBscF9jaGVja19zdGF0dXMgKG1pbm9yKTsKKwkJaWYgKGVycm9yICYmIChub25ibG9jayB8fCAoTFBfRihtaW5vcikgJiBMUF9BQk9SVCkpKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKKwkJCWVycm9yID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3NpemVfdCBscF93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHBhcnBvcnQgKnBvcnQgPSBscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0OworCWNoYXIgKmtidWYgPSBscF90YWJsZVttaW5vcl0ubHBfYnVmZmVyOworCXNzaXplX3QgcmV0diA9IDA7CisJc3NpemVfdCB3cml0dGVuOworCXNpemVfdCBjb3B5X3NpemUgPSBjb3VudDsKKwlpbnQgbm9uYmxvY2sgPSAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCQkJKExQX0YobWlub3IpICYgTFBfQUJPUlQpKTsKKworI2lmZGVmIExQX1NUQVRTCisJaWYgKGppZmZpZXMtbHBfdGFibGVbbWlub3JdLmxhc3RjYWxsID4gTFBfVElNRShtaW5vcikpCisJCWxwX3RhYmxlW21pbm9yXS5ydW5jaGFycyA9IDA7CisKKwlscF90YWJsZVttaW5vcl0ubGFzdGNhbGwgPSBqaWZmaWVzOworI2VuZGlmCisKKwkvKiBOZWVkIHRvIGNvcHkgdGhlIGRhdGEgZnJvbSB1c2VyLXNwYWNlLiAqLworCWlmIChjb3B5X3NpemUgPiBMUF9CVUZGRVJfU0laRSkKKwkJY29weV9zaXplID0gTFBfQlVGRkVSX1NJWkU7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmbHBfdGFibGVbbWlub3JdLnBvcnRfbXV0ZXgpKQorCQlyZXR1cm4gLUVJTlRSOworCisJaWYgKGNvcHlfZnJvbV91c2VyIChrYnVmLCBidWYsIGNvcHlfc2l6ZSkpIHsKKwkJcmV0diA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKyAJLyogQ2xhaW0gUGFycG9ydCBvciBzbGVlcCB1bnRpbCBpdCBiZWNvbWVzIGF2YWlsYWJsZQorIAkgKi8KKwlscF9jbGFpbV9wYXJwb3J0X29yX2Jsb2NrICgmbHBfdGFibGVbbWlub3JdKTsKKwkvKiBHbyB0byB0aGUgcHJvcGVyIG1vZGUuICovCisJbHBfdGFibGVbbWlub3JdLmN1cnJlbnRfbW9kZSA9IGxwX25lZ290aWF0ZSAocG9ydCwgCisJCQkJCQkgICAgIGxwX3RhYmxlW21pbm9yXS5iZXN0X21vZGUpOworCisJcGFycG9ydF9zZXRfdGltZW91dCAobHBfdGFibGVbbWlub3JdLmRldiwKKwkJCSAgICAgKG5vbmJsb2NrID8gUEFSUE9SVF9JTkFDVElWSVRZX09fTk9OQkxPQ0sKKwkJCSAgICAgIDogbHBfdGFibGVbbWlub3JdLnRpbWVvdXQpKTsKKworCWlmICgocmV0diA9IGxwX3dhaXRfcmVhZHkgKG1pbm9yLCBub25ibG9jaykpID09IDApCisJZG8geworCQkvKiBXcml0ZSB0aGUgZGF0YS4gKi8KKwkJd3JpdHRlbiA9IHBhcnBvcnRfd3JpdGUgKHBvcnQsIGtidWYsIGNvcHlfc2l6ZSk7CisJCWlmICh3cml0dGVuID4gMCkgeworCQkJY29weV9zaXplIC09IHdyaXR0ZW47CisJCQljb3VudCAtPSB3cml0dGVuOworCQkJYnVmICArPSB3cml0dGVuOworCQkJcmV0diArPSB3cml0dGVuOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJaWYgKHJldHYgPT0gMCkKKwkJCQlyZXR2ID0gLUVJTlRSOworCisJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3B5X3NpemUgPiAwKSB7CisJCQkvKiBpbmNvbXBsZXRlIHdyaXRlIC0+IGNoZWNrIGVycm9yICEgKi8KKwkJCWludCBlcnJvcjsKKworCQkJcGFycG9ydF9uZWdvdGlhdGUgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQsIAorCQkJCQkgICBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJCQlscF90YWJsZVttaW5vcl0uY3VycmVudF9tb2RlID0gSUVFRTEyODRfTU9ERV9DT01QQVQ7CisKKwkJCWVycm9yID0gbHBfd2FpdF9yZWFkeSAobWlub3IsIG5vbmJsb2NrKTsKKworCQkJaWYgKGVycm9yKSB7CisJCQkJaWYgKHJldHYgPT0gMCkKKwkJCQkJcmV0diA9IGVycm9yOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChub25ibG9jaykgeworCQkJCWlmIChyZXR2ID09IDApCisJCQkJCXJldHYgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwYXJwb3J0X3lpZWxkX2Jsb2NraW5nIChscF90YWJsZVttaW5vcl0uZGV2KTsKKwkJCWxwX3RhYmxlW21pbm9yXS5jdXJyZW50X21vZGUgCisJCQkgID0gbHBfbmVnb3RpYXRlIChwb3J0LCAKKwkJCQkJICBscF90YWJsZVttaW5vcl0uYmVzdF9tb2RlKTsKKworCQl9IGVsc2UgaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJc2NoZWR1bGUgKCk7CisKKwkJaWYgKGNvdW50KSB7CisJCQljb3B5X3NpemUgPSBjb3VudDsKKwkJCWlmIChjb3B5X3NpemUgPiBMUF9CVUZGRVJfU0laRSkKKwkJCQljb3B5X3NpemUgPSBMUF9CVUZGRVJfU0laRTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZiwgY29weV9zaXplKSkgeworCQkJCWlmIChyZXR2ID09IDApCisJCQkJCXJldHYgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQl9CQorCX0gd2hpbGUgKGNvdW50ID4gMCk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KExQX1BSRUVNUFRfUkVRVUVTVCwgCisJCQkgICAgICAgJmxwX3RhYmxlW21pbm9yXS5iaXRzKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJscCVkIHJlbGVhc2luZyBwYXJwb3J0XG4iLCBtaW5vcik7CisJCXBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LCAKKwkJCQkgICBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJCWxwX3RhYmxlW21pbm9yXS5jdXJyZW50X21vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKwkJbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKwl9CitvdXRfdW5sb2NrOgorCXVwICgmbHBfdGFibGVbbWlub3JdLnBvcnRfbXV0ZXgpOworCisgCXJldHVybiByZXR2OworfQorCisjaWZkZWYgQ09ORklHX1BBUlBPUlRfMTI4NAorCisvKiBTdGF0dXMgcmVhZGJhY2sgY29uZm9ybWluZyB0byBpZWVlMTI4NCAqLworc3RhdGljIHNzaXplX3QgbHBfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAorCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJdW5zaWduZWQgaW50IG1pbm9yPWltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHBhcnBvcnQgKnBvcnQgPSBscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0OworCXNzaXplX3QgcmV0dmFsID0gMDsKKwljaGFyICprYnVmID0gbHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlcjsKKwlpbnQgbm9uYmxvY2sgPSAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCQkJKExQX0YobWlub3IpICYgTFBfQUJPUlQpKTsKKworCWlmIChjb3VudCA+IExQX0JVRkZFUl9TSVpFKQorCQljb3VudCA9IExQX0JVRkZFUl9TSVpFOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmxwX3RhYmxlW21pbm9yXS5wb3J0X211dGV4KSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCisJcGFycG9ydF9zZXRfdGltZW91dCAobHBfdGFibGVbbWlub3JdLmRldiwKKwkJCSAgICAgKG5vbmJsb2NrID8gUEFSUE9SVF9JTkFDVElWSVRZX09fTk9OQkxPQ0sKKwkJCSAgICAgIDogbHBfdGFibGVbbWlub3JdLnRpbWVvdXQpKTsKKworCXBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LCBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJaWYgKHBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LAorCQkJICAgICAgIElFRUUxMjg0X01PREVfTklCQkxFKSkgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAocmV0dmFsID09IDApIHsKKwkJcmV0dmFsID0gcGFycG9ydF9yZWFkIChwb3J0LCBrYnVmLCBjb3VudCk7CisKKwkJaWYgKHJldHZhbCA+IDApCisJCQlicmVhazsKKworCQlpZiAobm9uYmxvY2spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdhaXQgZm9yIGRhdGEuICovCisKKwkJaWYgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQtPmlycSA9PSBQQVJQT1JUX0lSUV9OT05FKSB7CisJCQlwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwKKwkJCQkJICAgSUVFRTEyODRfTU9ERV9DT01QQVQpOworCQkJbHBfZXJyb3IgKG1pbm9yKTsKKwkJCWlmIChwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwKKwkJCQkJICAgICAgIElFRUUxMjg0X01PREVfTklCQkxFKSkgeworCQkJCXJldHZhbCA9IC1FSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmVwYXJlX3RvX3dhaXQoJmxwX3RhYmxlW21pbm9yXS53YWl0cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KExQX1RJTUVPVVRfUE9MTEVEKTsKKwkJCWZpbmlzaF93YWl0KCZscF90YWJsZVttaW5vcl0ud2FpdHEsICZ3YWl0KTsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJY29uZF9yZXNjaGVkICgpOworCX0KKwlwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwgSUVFRTEyODRfTU9ERV9DT01QQVQpOworIG91dDoKKwlscF9yZWxlYXNlX3BhcnBvcnQgKCZscF90YWJsZVttaW5vcl0pOworCisJaWYgKHJldHZhbCA+IDAgJiYgY29weV90b191c2VyIChidWYsIGtidWYsIHJldHZhbCkpCisJCXJldHZhbCA9IC1FRkFVTFQ7CisKKwl1cCAoJmxwX3RhYmxlW21pbm9yXS5wb3J0X211dGV4KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBJRUVFIDEyODQgc3VwcG9ydCAqLworCitzdGF0aWMgaW50IGxwX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCisJaWYgKG1pbm9yID49IExQX05PKQorCQlyZXR1cm4gLUVOWElPOworCWlmICgoTFBfRihtaW5vcikgJiBMUF9FWElTVCkgPT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChMUF9CVVNZX0JJVF9QT1MsICZMUF9GKG1pbm9yKSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBJZiBBQk9SVE9QRU4gaXMgc2V0IGFuZCB0aGUgcHJpbnRlciBpcyBvZmZsaW5lIG9yIG91dCBvZiBwYXBlciwKKwkgICB3ZSBtYXkgc3RpbGwgd2FudCB0byBvcGVuIGl0IHRvIHBlcmZvcm0gaW9jdGwoKXMuICBUaGVyZWZvcmUgd2UKKwkgICBoYXZlIGNvbW1hbmRlZXJlZCBPX05PTkJMT0NLLCBldmVuIHRob3VnaCBpdCBpcyBiZWluZyB1c2VkIGluCisJICAgYSBub24tc3RhbmRhcmQgbWFubmVyLiAgVGhpcyBpcyBzdHJpY3RseSBhIExpbnV4IGhhY2ssIGFuZAorCSAgIHNob3VsZCBtb3N0IGxpa2VseSBvbmx5IGV2ZXIgYmUgdXNlZCBieSB0aGUgdHVuZWxwIGFwcGxpY2F0aW9uLiAqLworCWlmICgoTFBfRihtaW5vcikgJiBMUF9BQk9SVE9QRU4pICYmICEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CisJCWludCBzdGF0dXM7CisJCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCQlzdGF0dXMgPSByX3N0cihtaW5vcik7CisJCWxwX3JlbGVhc2VfcGFycG9ydCAoJmxwX3RhYmxlW21pbm9yXSk7CisJCWlmIChzdGF0dXMgJiBMUF9QT1VUUEEpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImxwJWQgb3V0IG9mIHBhcGVyXG4iLCBtaW5vcik7CisJCQlMUF9GKG1pbm9yKSAmPSB+TFBfQlVTWTsKKwkJCXJldHVybiAtRU5PU1BDOworCQl9IGVsc2UgaWYgKCEoc3RhdHVzICYgTFBfUFNFTEVDRCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImxwJWQgb2ZmLWxpbmVcbiIsIG1pbm9yKTsKKwkJCUxQX0YobWlub3IpICY9IH5MUF9CVVNZOworCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSBpZiAoIShzdGF0dXMgJiBMUF9QRVJST1JQKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJscCVkIHByaW50ZXIgZXJyb3JcbiIsIG1pbm9yKTsKKwkJCUxQX0YobWlub3IpICY9IH5MUF9CVVNZOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJbHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlciA9IChjaGFyICopIGttYWxsb2MoTFBfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghbHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlcikgeworCQlMUF9GKG1pbm9yKSAmPSB+TFBfQlVTWTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIERldGVybWluZSBpZiB0aGUgcGVyaXBoZXJhbCBzdXBwb3J0cyBFQ1AgbW9kZSAqLworCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCWlmICggKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQtPm1vZGVzICYgUEFSUE9SVF9NT0RFX0VDUCkgJiYKKyAgICAgICAgICAgICAhcGFycG9ydF9uZWdvdGlhdGUgKGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTEyODRfTU9ERV9FQ1ApKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJscCVkOiBFQ1AgbW9kZVxuIiwgbWlub3IpOworCQlscF90YWJsZVttaW5vcl0uYmVzdF9tb2RlID0gSUVFRTEyODRfTU9ERV9FQ1A7CisJfSBlbHNlIHsKKwkJbHBfdGFibGVbbWlub3JdLmJlc3RfbW9kZSA9IElFRUUxMjg0X01PREVfQ09NUEFUOworCX0KKwkvKiBMZWF2ZSBwZXJpcGhlcmFsIGluIGNvbXBhdGliaWxpdHkgbW9kZSAqLworCXBhcnBvcnRfbmVnb3RpYXRlIChscF90YWJsZVttaW5vcl0uZGV2LT5wb3J0LCBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisJbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKwlscF90YWJsZVttaW5vcl0uY3VycmVudF9tb2RlID0gSUVFRTEyODRfTU9ERV9DT01QQVQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwlscF9jbGFpbV9wYXJwb3J0X29yX2Jsb2NrICgmbHBfdGFibGVbbWlub3JdKTsKKwlwYXJwb3J0X25lZ290aWF0ZSAobHBfdGFibGVbbWlub3JdLmRldi0+cG9ydCwgSUVFRTEyODRfTU9ERV9DT01QQVQpOworCWxwX3RhYmxlW21pbm9yXS5jdXJyZW50X21vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKwlscF9yZWxlYXNlX3BhcnBvcnQgKCZscF90YWJsZVttaW5vcl0pOworCWtmcmVlKGxwX3RhYmxlW21pbm9yXS5scF9idWZmZXIpOworCWxwX3RhYmxlW21pbm9yXS5scF9idWZmZXIgPSBOVUxMOworCUxQX0YobWlub3IpICY9IH5MUF9CVVNZOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpbnQgc3RhdHVzOworCWludCByZXR2YWwgPSAwOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisjaWZkZWYgTFBfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAibHAlZCBpb2N0bCwgY21kOiAweCV4LCBhcmc6IDB4JWx4XG4iLCBtaW5vciwgY21kLCBhcmcpOworI2VuZGlmCisJaWYgKG1pbm9yID49IExQX05PKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoKExQX0YobWlub3IpICYgTFBfRVhJU1QpID09IDApCisJCXJldHVybiAtRU5PREVWOworCXN3aXRjaCAoIGNtZCApIHsKKwkJc3RydWN0IHRpbWV2YWwgcGFyX3RpbWVvdXQ7CisJCWxvbmcgdG9famlmZmllczsKKworCQljYXNlIExQVElNRToKKwkJCUxQX1RJTUUobWlub3IpID0gYXJnICogSFovMTAwOworCQkJYnJlYWs7CisJCWNhc2UgTFBDSEFSOgorCQkJTFBfQ0hBUihtaW5vcikgPSBhcmc7CisJCQlicmVhazsKKwkJY2FzZSBMUEFCT1JUOgorCQkJaWYgKGFyZykKKwkJCQlMUF9GKG1pbm9yKSB8PSBMUF9BQk9SVDsKKwkJCWVsc2UKKwkJCQlMUF9GKG1pbm9yKSAmPSB+TFBfQUJPUlQ7CisJCQlicmVhazsKKwkJY2FzZSBMUEFCT1JUT1BFTjoKKwkJCWlmIChhcmcpCisJCQkJTFBfRihtaW5vcikgfD0gTFBfQUJPUlRPUEVOOworCQkJZWxzZQorCQkJCUxQX0YobWlub3IpICY9IH5MUF9BQk9SVE9QRU47CisJCQlicmVhazsKKwkJY2FzZSBMUENBUkVGVUw6CisJCQlpZiAoYXJnKQorCQkJCUxQX0YobWlub3IpIHw9IExQX0NBUkVGVUw7CisJCQllbHNlCisJCQkJTFBfRihtaW5vcikgJj0gfkxQX0NBUkVGVUw7CisJCQlicmVhazsKKwkJY2FzZSBMUFdBSVQ6CisJCQlMUF9XQUlUKG1pbm9yKSA9IGFyZzsKKwkJCWJyZWFrOworCQljYXNlIExQU0VUSVJROiAKKwkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgTFBHRVRJUlE6CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZMUF9JUlEobWlub3IpLAorCQkJCQlzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBMUEdFVFNUQVRVUzoKKwkJCWxwX2NsYWltX3BhcnBvcnRfb3JfYmxvY2sgKCZscF90YWJsZVttaW5vcl0pOworCQkJc3RhdHVzID0gcl9zdHIobWlub3IpOworCQkJbHBfcmVsZWFzZV9wYXJwb3J0ICgmbHBfdGFibGVbbWlub3JdKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmc3RhdHVzLCBzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBMUFJFU0VUOgorCQkJbHBfcmVzZXQobWlub3IpOworCQkJYnJlYWs7CisjaWZkZWYgTFBfU1RBVFMKKwkJY2FzZSBMUEdFVFNUQVRTOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmTFBfU1RBVChtaW5vciksCisJCQkJCXNpemVvZihzdHJ1Y3QgbHBfc3RhdHMpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCW1lbXNldCgmTFBfU1RBVChtaW5vciksIDAsCisJCQkJCQlzaXplb2Yoc3RydWN0IGxwX3N0YXRzKSk7CisJCQlicmVhazsKKyNlbmRpZgorIAkJY2FzZSBMUEdFVEZMQUdTOgorIAkJCXN0YXR1cyA9IExQX0YobWlub3IpOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmc3RhdHVzLCBzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQljYXNlIExQU0VUVElNRU9VVDoKKwkJCWlmIChjb3B5X2Zyb21fdXNlciAoJnBhcl90aW1lb3V0LCBhcmdwLAorCQkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgdGltZXZhbCkpKSB7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQkvKiBDb252ZXJ0IHRvIGppZmZpZXMsIHBsYWNlIGluIGxwX3RhYmxlICovCisJCQlpZiAoKHBhcl90aW1lb3V0LnR2X3NlYyA8IDApIHx8CisJCQkgICAgKHBhcl90aW1lb3V0LnR2X3VzZWMgPCAwKSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJdG9famlmZmllcyA9IFJPVU5EX1VQKHBhcl90aW1lb3V0LnR2X3VzZWMsIDEwMDAwMDAvSFopOworCQkJdG9famlmZmllcyArPSBwYXJfdGltZW91dC50dl9zZWMgKiAobG9uZykgSFo7CisJCQlpZiAodG9famlmZmllcyA8PSAwKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlscF90YWJsZVttaW5vcl0udGltZW91dCA9IHRvX2ppZmZpZXM7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dmFsID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHBfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLndyaXRlCQk9IGxwX3dyaXRlLAorCS5pb2N0bAkJPSBscF9pb2N0bCwKKwkub3BlbgkJPSBscF9vcGVuLAorCS5yZWxlYXNlCT0gbHBfcmVsZWFzZSwKKyNpZmRlZiBDT05GSUdfUEFSUE9SVF8xMjg0CisJLnJlYWQJCT0gbHBfcmVhZCwKKyNlbmRpZgorfTsKKworLyogLS0tIHN1cHBvcnQgZm9yIGNvbnNvbGUgb24gdGhlIGxpbmUgcHJpbnRlciAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0xQX0NPTlNPTEUKKworI2RlZmluZSBDT05TT0xFX0xQIDAKKworLyogSWYgdGhlIHByaW50ZXIgaXMgb3V0IG9mIHBhcGVyLCB3ZSBjYW4gZWl0aGVyIGxvc2UgdGhlIG1lc3NhZ2VzIG9yCisgKiBzdGFsbCB1bnRpbCB0aGUgcHJpbnRlciBpcyBoYXBweSBhZ2Fpbi4gIERlZmluZSBDT05TT0xFX0xQX1NUUklDVAorICogbm9uLXplcm8gdG8gZ2V0IHRoZSBsYXR0ZXIgYmVoYXZpb3VyLiAqLworI2RlZmluZSBDT05TT0xFX0xQX1NUUklDVCAxCisKKy8qIFRoZSBjb25zb2xlIG11c3QgYmUgbG9ja2VkIHdoZW4gd2UgZ2V0IGhlcmUuICovCisKK3N0YXRpYyB2b2lkIGxwX2NvbnNvbGVfd3JpdGUgKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywKKwkJCSAgICAgIHVuc2lnbmVkIGNvdW50KQoreworCXN0cnVjdCBwYXJkZXZpY2UgKmRldiA9IGxwX3RhYmxlW0NPTlNPTEVfTFBdLmRldjsKKwlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IGRldi0+cG9ydDsKKwlzc2l6ZV90IHdyaXR0ZW47CisKKwlpZiAocGFycG9ydF9jbGFpbSAoZGV2KSkKKwkJLyogTm90aGluZyB3ZSBjYW4gZG8uICovCisJCXJldHVybjsKKworCXBhcnBvcnRfc2V0X3RpbWVvdXQgKGRldiwgMCk7CisKKwkvKiBHbyB0byBjb21wYXRpYmlsaXR5IG1vZGUuICovCisJcGFycG9ydF9uZWdvdGlhdGUgKHBvcnQsIElFRUUxMjg0X01PREVfQ09NUEFUKTsKKworCWRvIHsKKwkJLyogV3JpdGUgdGhlIGRhdGEsIGNvbnZlcnRpbmcgTEYtPkNSTEYgYXMgd2UgZ28uICovCisJCXNzaXplX3QgY2Fud3JpdGUgPSBjb3VudDsKKwkJY2hhciAqbGYgPSBtZW1jaHIgKHMsICdcbicsIGNvdW50KTsKKwkJaWYgKGxmKQorCQkJY2Fud3JpdGUgPSBsZiAtIHM7CisKKwkJaWYgKGNhbndyaXRlID4gMCkgeworCQkJd3JpdHRlbiA9IHBhcnBvcnRfd3JpdGUgKHBvcnQsIHMsIGNhbndyaXRlKTsKKworCQkJaWYgKHdyaXR0ZW4gPD0gMCkKKwkJCQljb250aW51ZTsKKworCQkJcyArPSB3cml0dGVuOworCQkJY291bnQgLT0gd3JpdHRlbjsKKwkJCWNhbndyaXRlIC09IHdyaXR0ZW47CisJCX0KKworCQlpZiAobGYgJiYgY2Fud3JpdGUgPD0gMCkgeworCQkJY29uc3QgY2hhciAqY3JsZiA9ICJcclxuIjsKKwkJCWludCBpID0gMjsKKworCQkJLyogRG9kZ2UgdGhlIG9yaWdpbmFsICdcbicsIGFuZCBwdXQgJ1xyXG4nIGluc3RlYWQuICovCisJCQlzKys7CisJCQljb3VudC0tOworCQkJZG8geworCQkJCXdyaXR0ZW4gPSBwYXJwb3J0X3dyaXRlIChwb3J0LCBjcmxmLCBpKTsKKwkJCQlpZiAod3JpdHRlbiA+IDApCisJCQkJCWkgLT0gd3JpdHRlbiwgY3JsZiArPSB3cml0dGVuOworCQkJfSB3aGlsZSAoaSA+IDAgJiYgKENPTlNPTEVfTFBfU1RSSUNUIHx8IHdyaXR0ZW4gPiAwKSk7CisJCX0KKwl9IHdoaWxlIChjb3VudCA+IDAgJiYgKENPTlNPTEVfTFBfU1RSSUNUIHx8IHdyaXR0ZW4gPiAwKSk7CisKKwlwYXJwb3J0X3JlbGVhc2UgKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBscGNvbnMgPSB7CisJLm5hbWUJCT0gImxwIiwKKwkud3JpdGUJCT0gbHBfY29uc29sZV93cml0ZSwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorfTsKKworI2VuZGlmIC8qIGNvbnNvbGUgb24gbGluZSBwcmludGVyICovCisKKy8qIC0tLSBpbml0aWFsaXNhdGlvbiBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBwYXJwb3J0X25yW0xQX05PXSA9IHsgWzAgLi4uIExQX05PLTFdID0gTFBfUEFSUE9SVF9VTlNQRUMgfTsKK3N0YXRpYyBjaGFyICpwYXJwb3J0W0xQX05PXSA9IHsgTlVMTCwgIH07CitzdGF0aWMgaW50IHJlc2V0ID0gMDsKKworbW9kdWxlX3BhcmFtX2FycmF5KHBhcnBvcnQsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShyZXNldCwgYm9vbCwgMCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBscF9zZXR1cCAoY2hhciAqc3RyKQoreworCXN0YXRpYyBpbnQgcGFycG9ydF9wdHI7IC8vIGluaXRpYWxseSB6ZXJvCisJaW50IHg7CisKKwlpZiAoZ2V0X29wdGlvbiAoJnN0ciwgJngpKSB7CisJCWlmICh4ID09IDApIHsKKwkJCS8qIGRpc2FibGUgZHJpdmVyIG9uICJscD0iIG9yICJscD0wIiAqLworCQkJcGFycG9ydF9uclswXSA9IExQX1BBUlBPUlRfT0ZGOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FybmluZzogJ2xwPTB4JXgnIGlzIGRlcHJlY2F0ZWQsIGlnbm9yZWRcbiIsIHgpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgInBhcnBvcnQiLCA3KSkgeworCQlpbnQgbiA9IHNpbXBsZV9zdHJ0b3VsKHN0cis3LCBOVUxMLCAxMCk7CisJCWlmIChwYXJwb3J0X3B0ciA8IExQX05PKQorCQkJcGFycG9ydF9ucltwYXJwb3J0X3B0cisrXSA9IG47CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gImxwOiB0b28gbWFueSBwb3J0cywgJXMgaWdub3JlZC5cbiIsCisJCQkgICAgICAgc3RyKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYXV0byIpKSB7CisJCXBhcnBvcnRfbnJbMF0gPSBMUF9QQVJQT1JUX0FVVE87CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vbmUiKSkgeworCQlwYXJwb3J0X25yW3BhcnBvcnRfcHRyKytdID0gTFBfUEFSUE9SVF9OT05FOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJyZXNldCIpKSB7CisJCXJlc2V0ID0gMTsKKwl9CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBscF9yZWdpc3RlcihpbnQgbnIsIHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWxwX3RhYmxlW25yXS5kZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwb3J0LCAibHAiLCAKKwkJCQkJCSAgIGxwX3ByZWVtcHQsIE5VTEwsIE5VTEwsIDAsCisJCQkJCQkgICAodm9pZCAqKSAmbHBfdGFibGVbbnJdKTsKKwlpZiAobHBfdGFibGVbbnJdLmRldiA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKwlscF90YWJsZVtucl0uZmxhZ3MgfD0gTFBfRVhJU1Q7CisKKwlpZiAocmVzZXQpCisJCWxwX3Jlc2V0KG5yKTsKKworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGxwX2NsYXNzLCBNS0RFVihMUF9NQUpPUiwgbnIpLCBOVUxMLAorCQkJCSJscCVkIiwgbnIpOworCWRldmZzX21rX2NkZXYoTUtERVYoTFBfTUFKT1IsIG5yKSwgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkJInByaW50ZXJzLyVkIiwgbnIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibHAlZDogdXNpbmcgJXMgKCVzKS5cbiIsIG5yLCBwb3J0LT5uYW1lLCAKKwkgICAgICAgKHBvcnQtPmlycSA9PSBQQVJQT1JUX0lSUV9OT05FKT8icG9sbGluZyI6ImludGVycnVwdC1kcml2ZW4iKTsKKworI2lmZGVmIENPTkZJR19MUF9DT05TT0xFCisJaWYgKCFucikgeworCQlpZiAocG9ydC0+bW9kZXMgJiBQQVJQT1JUX01PREVfU0FGRUlOSU5UKSB7CisJCQlyZWdpc3Rlcl9jb25zb2xlICgmbHBjb25zKTsKKwkJCWNvbnNvbGVfcmVnaXN0ZXJlZCA9IHBvcnQ7CisJCQlwcmludGsgKEtFUk5fSU5GTyAibHAlZDogY29uc29sZSByZWFkeVxuIiwgQ09OU09MRV9MUCk7CisJCX0gZWxzZQorCQkJcHJpbnRrIChLRVJOX0VSUiAibHAlZDogY2Fubm90IHJ1biBjb25zb2xlIG9uICVzXG4iLAorCQkJCUNPTlNPTEVfTFAsIHBvcnQtPm5hbWUpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxwX2F0dGFjaCAoc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlzd2l0Y2ggKHBhcnBvcnRfbnJbMF0pCisJeworCWNhc2UgTFBfUEFSUE9SVF9VTlNQRUM6CisJY2FzZSBMUF9QQVJQT1JUX0FVVE86CisJCWlmIChwYXJwb3J0X25yWzBdID09IExQX1BBUlBPUlRfQVVUTyAmJgorCQkgICAgcG9ydC0+cHJvYmVfaW5mb1swXS5jbGFzcyAhPSBQQVJQT1JUX0NMQVNTX1BSSU5URVIpCisJCQlyZXR1cm47CisJCWlmIChscF9jb3VudCA9PSBMUF9OTykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAibHA6IGlnbm9yaW5nIHBhcmFsbGVsIHBvcnQgKG1heC4gJWQpXG4iLExQX05PKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWxwX3JlZ2lzdGVyKGxwX2NvdW50LCBwb3J0KSkKKwkJCWxwX2NvdW50Kys7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZm9yIChpID0gMDsgaSA8IExQX05POyBpKyspIHsKKwkJCWlmIChwb3J0LT5udW1iZXIgPT0gcGFycG9ydF9ucltpXSkgeworCQkJCWlmICghbHBfcmVnaXN0ZXIoaSwgcG9ydCkpCisJCQkJCWxwX2NvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBscF9kZXRhY2ggKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCS8qIFdyaXRlIHRoaXMgc29tZSBkYXkuICovCisjaWZkZWYgQ09ORklHX0xQX0NPTlNPTEUKKwlpZiAoY29uc29sZV9yZWdpc3RlcmVkID09IHBvcnQpIHsKKwkJdW5yZWdpc3Rlcl9jb25zb2xlICgmbHBjb25zKTsKKwkJY29uc29sZV9yZWdpc3RlcmVkID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX0xQX0NPTlNPTEUgKi8KK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBscF9kcml2ZXIgPSB7CisJLm5hbWUgPSAibHAiLAorCS5hdHRhY2ggPSBscF9hdHRhY2gsCisJLmRldGFjaCA9IGxwX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxwX2luaXQgKHZvaWQpCit7CisJaW50IGksIGVyciA9IDA7CisKKwlpZiAocGFycG9ydF9uclswXSA9PSBMUF9QQVJQT1JUX09GRikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTFBfTk87IGkrKykgeworCQlscF90YWJsZVtpXS5kZXYgPSBOVUxMOworCQlscF90YWJsZVtpXS5mbGFncyA9IDA7CisJCWxwX3RhYmxlW2ldLmNoYXJzID0gTFBfSU5JVF9DSEFSOworCQlscF90YWJsZVtpXS50aW1lID0gTFBfSU5JVF9USU1FOworCQlscF90YWJsZVtpXS53YWl0ID0gTFBfSU5JVF9XQUlUOworCQlscF90YWJsZVtpXS5scF9idWZmZXIgPSBOVUxMOworI2lmZGVmIExQX1NUQVRTCisJCWxwX3RhYmxlW2ldLmxhc3RjYWxsID0gMDsKKwkJbHBfdGFibGVbaV0ucnVuY2hhcnMgPSAwOworCQltZW1zZXQgKCZscF90YWJsZVtpXS5zdGF0cywgMCwgc2l6ZW9mIChzdHJ1Y3QgbHBfc3RhdHMpKTsKKyNlbmRpZgorCQlscF90YWJsZVtpXS5sYXN0X2Vycm9yID0gMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCAoJmxwX3RhYmxlW2ldLndhaXRxKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCAoJmxwX3RhYmxlW2ldLmRhdGFxKTsKKwkJaW5pdF9NVVRFWCAoJmxwX3RhYmxlW2ldLnBvcnRfbXV0ZXgpOworCQlscF90YWJsZVtpXS50aW1lb3V0ID0gMTAgKiBIWjsKKwl9CisKKwlpZiAocmVnaXN0ZXJfY2hyZGV2IChMUF9NQUpPUiwgImxwIiwgJmxwX2ZvcHMpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgImxwOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkXG4iLCBMUF9NQUpPUik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldmZzX21rX2RpcigicHJpbnRlcnMiKTsKKwlscF9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJwcmludGVyIik7CisJaWYgKElTX0VSUihscF9jbGFzcykpIHsKKwkJZXJyID0gUFRSX0VSUihscF9jbGFzcyk7CisJCWdvdG8gb3V0X2RldmZzOworCX0KKworCWlmIChwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlciAoJmxwX2RyaXZlcikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAibHA6IHVuYWJsZSB0byByZWdpc3RlciB3aXRoIHBhcnBvcnRcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dF9jbGFzczsKKwl9CisKKwlpZiAoIWxwX2NvdW50KSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJscDogZHJpdmVyIGxvYWRlZCBidXQgbm8gZGV2aWNlcyBmb3VuZFxuIik7CisjaWZuZGVmIENPTkZJR19QQVJQT1JUXzEyODQKKwkJaWYgKHBhcnBvcnRfbnJbMF0gPT0gTFBfUEFSUE9SVF9BVVRPKQorCQkJcHJpbnRrIChLRVJOX0lORk8gImxwOiAoaXMgSUVFRSAxMjg0IHN1cHBvcnQgZW5hYmxlZD8pXG4iKTsKKyNlbmRpZgorCX0KKworCXJldHVybiAwOworCitvdXRfY2xhc3M6CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kobHBfY2xhc3MpOworb3V0X2RldmZzOgorCWRldmZzX3JlbW92ZSgicHJpbnRlcnMiKTsKKwl1bnJlZ2lzdGVyX2NocmRldihMUF9NQUpPUiwgImxwIik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgbHBfaW5pdF9tb2R1bGUgKHZvaWQpCit7CisJaWYgKHBhcnBvcnRbMF0pIHsKKwkJLyogVGhlIHVzZXIgZ2F2ZSBzb21lIHBhcmFtZXRlcnMuICBMZXQncyBzZWUgd2hhdCB0aGV5IHdlcmUuICAqLworCQlpZiAoIXN0cm5jbXAocGFycG9ydFswXSwgImF1dG8iLCA0KSkKKwkJCXBhcnBvcnRfbnJbMF0gPSBMUF9QQVJQT1JUX0FVVE87CisJCWVsc2UgeworCQkJaW50IG47CisJCQlmb3IgKG4gPSAwOyBuIDwgTFBfTk8gJiYgcGFycG9ydFtuXTsgbisrKSB7CisJCQkJaWYgKCFzdHJuY21wKHBhcnBvcnRbbl0sICJub25lIiwgNCkpCisJCQkJCXBhcnBvcnRfbnJbbl0gPSBMUF9QQVJQT1JUX05PTkU7CisJCQkJZWxzZSB7CisJCQkJCWNoYXIgKmVwOworCQkJCQl1bnNpZ25lZCBsb25nIHIgPSBzaW1wbGVfc3RydG91bChwYXJwb3J0W25dLCAmZXAsIDApOworCQkJCQlpZiAoZXAgIT0gcGFycG9ydFtuXSkgCisJCQkJCQlwYXJwb3J0X25yW25dID0gcjsKKwkJCQkJZWxzZSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgImxwOiBiYWQgcG9ydCBzcGVjaWZpZXIgYCVzJ1xuIiwgcGFycG9ydFtuXSk7CisJCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBscF9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGxwX2NsZWFudXBfbW9kdWxlICh2b2lkKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyICgmbHBfZHJpdmVyKTsKKworI2lmZGVmIENPTkZJR19MUF9DT05TT0xFCisJdW5yZWdpc3Rlcl9jb25zb2xlICgmbHBjb25zKTsKKyNlbmRpZgorCisJdW5yZWdpc3Rlcl9jaHJkZXYoTFBfTUFKT1IsICJscCIpOworCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgTFBfTk87IG9mZnNldCsrKSB7CisJCWlmIChscF90YWJsZVtvZmZzZXRdLmRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UobHBfdGFibGVbb2Zmc2V0XS5kZXYpOworCQlkZXZmc19yZW1vdmUoInByaW50ZXJzLyVkIiwgb2Zmc2V0KTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoTFBfTUFKT1IsIG9mZnNldCkpOworCX0KKwlkZXZmc19yZW1vdmUoInByaW50ZXJzIik7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kobHBfY2xhc3MpOworfQorCitfX3NldHVwKCJscD0iLCBscF9zZXR1cCk7Cittb2R1bGVfaW5pdChscF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChscF9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BTElBU19DSEFSREVWX01BSk9SKExQX01BSk9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDdjYjNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC0wLDAgKzEsODgwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvY2hhci9tZW0uYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEFkZGVkIGRldmZzIHN1cHBvcnQuIAorICogICAgSmFuLTExLTE5OTgsIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PgorICogIFNoYXJlZCAvZGV2L3plcm8gbW1hcGluZyBzdXBwb3J0LCBGZWIgMjAwMCwgS2Fub2ogU2FyY2FyIDxrYW5vakBzZ2kuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmF3Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiBDT05GSUdfSUE2NAorIyBpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUzM5MF9UQVBFKSAmJiBkZWZpbmVkKENPTkZJR19TMzkwX1RBUEVfQ0hBUikKK2V4dGVybiB2b2lkIHRhcGVjaGFyX2luaXQodm9pZCk7CisjZW5kaWYKKworLyoKKyAqIEFyY2hpdGVjdHVyZXMgdmFyeSBpbiBob3cgdGhleSBoYW5kbGUgY2FjaGluZyBmb3IgYWRkcmVzc2VzCisgKiBvdXRzaWRlIG9mIG1haW4gbWVtb3J5LgorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgdW5jYWNoZWRfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwkvKgorCSAqIE9uIHRoZSBQUHJvIGFuZCBzdWNjZXNzb3JzLCB0aGUgTVRSUnMgYXJlIHVzZWQgdG8gc2V0CisJICogbWVtb3J5IHR5cGVzIGZvciBwaHlzaWNhbCBhZGRyZXNzZXMgb3V0c2lkZSBtYWluIG1lbW9yeSwKKwkgKiBzbyBibGluZGx5IHNldHRpbmcgUENEIG9yIFBXVCBvbiB0aG9zZSBwYWdlcyBpcyB3cm9uZy4KKwkgKiBGb3IgUGVudGl1bXMgYW5kIGVhcmxpZXIsIHRoZSBzdXJyb3VuZCBsb2dpYyBzaG91bGQgZGlzYWJsZQorCSAqIGNhY2hpbmcgZm9yIHRoZSBoaWdoIGFkZHJlc3NlcyB0aHJvdWdoIHRoZSBLRU4gcGluLCBidXQKKwkgKiB3ZSBtYWludGFpbiB0aGUgdHJhZGl0aW9uIG9mIHBhcmFub2lhIGluIHRoaXMgY29kZS4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykKKwkJcmV0dXJuIDE7CisgCXJldHVybiAhKCB0ZXN0X2JpdChYODZfRkVBVFVSRV9NVFJSLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KSB8fAorCQkgIHRlc3RfYml0KFg4Nl9GRUFUVVJFX0s2X01UUlIsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpIHx8CisJCSAgdGVzdF9iaXQoWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KSB8fAorCQkgIHRlc3RfYml0KFg4Nl9GRUFUVVJFX0NFTlRBVVJfTUNSLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KSApCisJICAmJiBhZGRyID49IF9fcGEoaGlnaF9tZW1vcnkpOworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCS8qIAorCSAqIFRoaXMgaXMgYnJva2VuIGJlY2F1c2UgaXQgY2FuIGdlbmVyYXRlIG1lbW9yeSB0eXBlIGFsaWFzZXMsCisJICogd2hpY2ggY2FuIGNhdXNlIGNhY2hlIGNvcnJ1cHRpb25zCisJICogQnV0IGl0IGlzIG9ubHkgYXZhaWxhYmxlIGZvciByb290IGFuZCB3ZSBoYXZlIHRvIGJlIGJ1Zy10by1idWcKKwkgKiBjb21wYXRpYmxlIHdpdGggaTM4Ni4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykKKwkJcmV0dXJuIDE7CisJLyogc2FtZSBiZWhhdmlvdXIgYXMgaTM4Ni4gUEFUIGFsd2F5cyBzZXQgdG8gY2FjaGVkIGFuZCBNVFJScyBjb250cm9sIHRoZQorCSAgIGNhY2hpbmcgYmVoYXZpb3VyLiAKKwkgICBIb3BlZnVsbHkgYSBmdWxsIFBBVCBpbXBsZW1lbnRhdGlvbiB3aWxsIGZpeCB0aGF0IHNvb24uICovCSAgIAorCXJldHVybiAwOworI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKKwkvKgorCSAqIE9uIGlhNjQsIHdlIGlnbm9yZSBPX1NZTkMgYmVjYXVzZSB3ZSBjYW5ub3QgdG9sZXJhdGUgbWVtb3J5IGF0dHJpYnV0ZSBhbGlhc2VzLgorCSAqLworCXJldHVybiAhKGVmaV9tZW1fYXR0cmlidXRlcyhhZGRyKSAmIEVGSV9NRU1PUllfV0IpOworI2Vsc2UKKwkvKgorCSAqIEFjY2Vzc2luZyBtZW1vcnkgYWJvdmUgdGhlIHRvcCB0aGUga2VybmVsIGtub3dzIGFib3V0IG9yIHRocm91Z2ggYSBmaWxlIHBvaW50ZXIKKwkgKiB0aGF0IHdhcyBtYXJrZWQgT19TWU5DIHdpbGwgYmUgZG9uZSBub24tY2FjaGVkLgorCSAqLworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gYWRkciA+PSBfX3BhKGhpZ2hfbWVtb3J5KTsKKyNlbmRpZgorfQorCisjaWZuZGVmIEFSQ0hfSEFTX1ZBTElEX1BIWVNfQUREUl9SQU5HRQorc3RhdGljIGlubGluZSBpbnQgdmFsaWRfcGh5c19hZGRyX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90ICpjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGVuZF9tZW07CisKKwllbmRfbWVtID0gX19wYShoaWdoX21lbW9yeSk7CisJaWYgKGFkZHIgPj0gZW5kX21lbSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKmNvdW50ID4gZW5kX21lbSAtIGFkZHIpCisJCSpjb3VudCA9IGVuZF9tZW0gLSBhZGRyOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZnVuY2lvbiByZWFkcyB0aGUgKnBoeXNpY2FsKiBtZW1vcnkuIFRoZSBmX3BvcyBwb2ludHMgZGlyZWN0bHkgdG8gdGhlIAorICogbWVtb3J5IGxvY2F0aW9uLiAKKyAqLworc3RhdGljIHNzaXplX3QgcmVhZF9tZW0oc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCXNzaXplX3QgcmVhZCwgc3o7CisJY2hhciAqcHRyOworCisJaWYgKCF2YWxpZF9waHlzX2FkZHJfcmFuZ2UocCwgJmNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmVhZCA9IDA7CisjaWZkZWYgX19BUkNIX0hBU19OT19QQUdFX1pFUk9fTUFQUEVECisJLyogd2UgZG9uJ3QgaGF2ZSBwYWdlIDAgbWFwcGVkIG9uIHNwYXJjIGFuZCBtNjhrLi4gKi8KKwlpZiAocCA8IFBBR0VfU0laRSkgeworCQlzeiA9IFBBR0VfU0laRSAtIHA7CisJCWlmIChzeiA+IGNvdW50KSAKKwkJCXN6ID0gY291bnQ7IAorCQlpZiAoc3ogPiAwKSB7CisJCQlpZiAoY2xlYXJfdXNlcihidWYsIHN6KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJ1ZiArPSBzejsgCisJCQlwICs9IHN6OyAKKwkJCWNvdW50IC09IHN6OyAKKwkJCXJlYWQgKz0gc3o7IAorCQl9CisJfQorI2VuZGlmCisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8qCisJCSAqIEhhbmRsZSBmaXJzdCBwYWdlIGluIGNhc2UgaXQncyBub3QgYWxpZ25lZAorCQkgKi8KKwkJaWYgKC1wICYgKFBBR0VfU0laRSAtIDEpKQorCQkJc3ogPSAtcCAmIChQQUdFX1NJWkUgLSAxKTsKKwkJZWxzZQorCQkJc3ogPSBQQUdFX1NJWkU7CisKKwkJc3ogPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBzeiwgY291bnQpOworCisJCS8qCisJCSAqIE9uIGlhNjQgaWYgYSBwYWdlIGhhcyBiZWVuIG1hcHBlZCBzb21ld2hlcmUgYXMKKwkJICogdW5jYWNoZWQsIHRoZW4gaXQgbXVzdCBhbHNvIGJlIGFjY2Vzc2VkIHVuY2FjaGVkCisJCSAqIGJ5IHRoZSBrZXJuZWwgb3IgZGF0YSBjb3JydXB0aW9uIG1heSBvY2N1cgorCQkgKi8KKwkJcHRyID0geGxhdGVfZGV2X21lbV9wdHIocCk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHB0ciwgc3opKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJ1ZiArPSBzejsKKwkJcCArPSBzejsKKwkJY291bnQgLT0gc3o7CisJCXJlYWQgKz0gc3o7CisJfQorCisJKnBwb3MgKz0gcmVhZDsKKwlyZXR1cm4gcmVhZDsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfbWVtKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCXNzaXplX3Qgd3JpdHRlbiwgc3o7CisJdW5zaWduZWQgbG9uZyBjb3BpZWQ7CisJdm9pZCAqcHRyOworCisJaWYgKCF2YWxpZF9waHlzX2FkZHJfcmFuZ2UocCwgJmNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl3cml0dGVuID0gMDsKKworI2lmZGVmIF9fQVJDSF9IQVNfTk9fUEFHRV9aRVJPX01BUFBFRAorCS8qIHdlIGRvbid0IGhhdmUgcGFnZSAwIG1hcHBlZCBvbiBzcGFyYyBhbmQgbTY4ay4uICovCisJaWYgKHAgPCBQQUdFX1NJWkUpIHsKKwkJdW5zaWduZWQgbG9uZyBzeiA9IFBBR0VfU0laRSAtIHA7CisJCWlmIChzeiA+IGNvdW50KQorCQkJc3ogPSBjb3VudDsKKwkJLyogSG1tLiBEbyBzb21ldGhpbmc/ICovCisJCWJ1ZiArPSBzejsKKwkJcCArPSBzejsKKwkJY291bnQgLT0gc3o7CisJCXdyaXR0ZW4gKz0gc3o7CisJfQorI2VuZGlmCisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8qCisJCSAqIEhhbmRsZSBmaXJzdCBwYWdlIGluIGNhc2UgaXQncyBub3QgYWxpZ25lZAorCQkgKi8KKwkJaWYgKC1wICYgKFBBR0VfU0laRSAtIDEpKQorCQkJc3ogPSAtcCAmIChQQUdFX1NJWkUgLSAxKTsKKwkJZWxzZQorCQkJc3ogPSBQQUdFX1NJWkU7CisKKwkJc3ogPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBzeiwgY291bnQpOworCisJCS8qCisJCSAqIE9uIGlhNjQgaWYgYSBwYWdlIGhhcyBiZWVuIG1hcHBlZCBzb21ld2hlcmUgYXMKKwkJICogdW5jYWNoZWQsIHRoZW4gaXQgbXVzdCBhbHNvIGJlIGFjY2Vzc2VkIHVuY2FjaGVkCisJCSAqIGJ5IHRoZSBrZXJuZWwgb3IgZGF0YSBjb3JydXB0aW9uIG1heSBvY2N1cgorCQkgKi8KKwkJcHRyID0geGxhdGVfZGV2X21lbV9wdHIocCk7CisKKwkJY29waWVkID0gY29weV9mcm9tX3VzZXIocHRyLCBidWYsIHN6KTsKKwkJaWYgKGNvcGllZCkgeworCQkJc3NpemVfdCByZXQ7CisKKwkJCXJldCA9IHdyaXR0ZW4gKyAoc3ogLSBjb3BpZWQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnVmICs9IHN6OworCQlwICs9IHN6OworCQljb3VudCAtPSBzejsKKwkJd3JpdHRlbiArPSBzejsKKwl9CisKKwkqcHBvcyArPSB3cml0dGVuOworCXJldHVybiB3cml0dGVuOworfQorCitzdGF0aWMgaW50IG1tYXBfbWVtKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworI2lmIGRlZmluZWQoX19IQVZFX1BIWVNfTUVNX0FDQ0VTU19QUk9UKQorCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCisJdm1hLT52bV9wYWdlX3Byb3QgPSBwaHlzX21lbV9hY2Nlc3NfcHJvdChmaWxlLCBvZmZzZXQsCisJCQkJCQkgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJCQkJIHZtYS0+dm1fcGFnZV9wcm90KTsKKyNlbGlmIGRlZmluZWQocGdwcm90X25vbmNhY2hlZCkKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlpbnQgdW5jYWNoZWQ7CisKKwl1bmNhY2hlZCA9IHVuY2FjaGVkX2FjY2VzcyhmaWxlLCBvZmZzZXQpOworCWlmICh1bmNhY2hlZCkKKwkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKyNlbmRpZgorCisJLyogUmVtYXAtcGZuLXJhbmdlIHdpbGwgbWFyayB0aGUgcmFuZ2UgVk1fSU8gYW5kIFZNX1JFU0VSVkVEICovCisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsCisJCQkgICAgdm1hLT52bV9zdGFydCwKKwkJCSAgICB2bWEtPnZtX3Bnb2ZmLAorCQkJICAgIHZtYS0+dm1fZW5kLXZtYS0+dm1fc3RhcnQsCisJCQkgICAgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbWFwX2ttZW0oc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisJLyoKKwkgKiBSRUQtUEVOOiBvbiBzb21lIGFyY2hpdGVjdHVyZXMgdGhlcmUgaXMgbW9yZSBtYXBwZWQgbWVtb3J5CisJICogdGhhbiBhdmFpbGFibGUgaW4gbWVtX21hcCB3aGljaCBwZm5fdmFsaWQgY2hlY2tzCisJICogZm9yLiBQZXJoYXBzIHNob3VsZCBhZGQgYSBuZXcgbWFjcm8gaGVyZS4KKwkgKgorCSAqIFJFRC1QRU46IHZtYWxsb2MgaXMgbm90IHN1cHBvcnRlZCByaWdodCBub3cuCisJICovCisJaWYgKCFwZm5fdmFsaWQodm1hLT52bV9wZ29mZikpCisJCXJldHVybiAtRUlPOworCXZhbCA9ICh1NjQpdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCXZtYS0+dm1fcGdvZmYgPSBfX3BhKHZhbCkgPj4gUEFHRV9TSElGVDsKKwlyZXR1cm4gbW1hcF9tZW0oZmlsZSwgdm1hKTsKK30KKworZXh0ZXJuIGxvbmcgdnJlYWQoY2hhciAqYnVmLCBjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK2V4dGVybiBsb25nIHZ3cml0ZShjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOworCisvKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgKnZpcnR1YWwqIG1lbW9yeSBhcyBzZWVuIGJ5IHRoZSBrZXJuZWwuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHJlYWRfa21lbShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwgCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7CisJc3NpemVfdCBsb3dfY291bnQsIHJlYWQsIHN6OworCWNoYXIgKiBrYnVmOyAvKiBrLWFkZHIgYmVjYXVzZSB2cmVhZCgpIHRha2VzIHZtbGlzdF9sb2NrIHJ3bG9jayAqLworCisJcmVhZCA9IDA7CisJaWYgKHAgPCAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkpIHsKKwkJbG93X2NvdW50ID0gY291bnQ7CisJCWlmIChjb3VudCA+ICh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSAtIHApCisJCQlsb3dfY291bnQgPSAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgLSBwOworCisjaWZkZWYgX19BUkNIX0hBU19OT19QQUdFX1pFUk9fTUFQUEVECisJCS8qIHdlIGRvbid0IGhhdmUgcGFnZSAwIG1hcHBlZCBvbiBzcGFyYyBhbmQgbTY4ay4uICovCisJCWlmIChwIDwgUEFHRV9TSVpFICYmIGxvd19jb3VudCA+IDApIHsKKwkJCXNpemVfdCB0bXAgPSBQQUdFX1NJWkUgLSBwOworCQkJaWYgKHRtcCA+IGxvd19jb3VudCkgdG1wID0gbG93X2NvdW50OworCQkJaWYgKGNsZWFyX3VzZXIoYnVmLCB0bXApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnVmICs9IHRtcDsKKwkJCXAgKz0gdG1wOworCQkJcmVhZCArPSB0bXA7CisJCQlsb3dfY291bnQgLT0gdG1wOworCQkJY291bnQgLT0gdG1wOworCQl9CisjZW5kaWYKKwkJd2hpbGUgKGxvd19jb3VudCA+IDApIHsKKwkJCS8qCisJCQkgKiBIYW5kbGUgZmlyc3QgcGFnZSBpbiBjYXNlIGl0J3Mgbm90IGFsaWduZWQKKwkJCSAqLworCQkJaWYgKC1wICYgKFBBR0VfU0laRSAtIDEpKQorCQkJCXN6ID0gLXAgJiAoUEFHRV9TSVpFIC0gMSk7CisJCQllbHNlCisJCQkJc3ogPSBQQUdFX1NJWkU7CisKKwkJCXN6ID0gbWluX3QodW5zaWduZWQgbG9uZywgc3osIGxvd19jb3VudCk7CisKKwkJCS8qCisJCQkgKiBPbiBpYTY0IGlmIGEgcGFnZSBoYXMgYmVlbiBtYXBwZWQgc29tZXdoZXJlIGFzCisJCQkgKiB1bmNhY2hlZCwgdGhlbiBpdCBtdXN0IGFsc28gYmUgYWNjZXNzZWQgdW5jYWNoZWQKKwkJCSAqIGJ5IHRoZSBrZXJuZWwgb3IgZGF0YSBjb3JydXB0aW9uIG1heSBvY2N1cgorCQkJICovCisJCQlrYnVmID0geGxhdGVfZGV2X2ttZW1fcHRyKChjaGFyICopcCk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBrYnVmLCBzeikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlidWYgKz0gc3o7CisJCQlwICs9IHN6OworCQkJcmVhZCArPSBzejsKKwkJCWxvd19jb3VudCAtPSBzejsKKwkJCWNvdW50IC09IHN6OworCQl9CisJfQorCisJaWYgKGNvdW50ID4gMCkgeworCQlrYnVmID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICgha2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQlpbnQgbGVuID0gY291bnQ7CisKKwkJCWlmIChsZW4gPiBQQUdFX1NJWkUpCisJCQkJbGVuID0gUEFHRV9TSVpFOworCQkJbGVuID0gdnJlYWQoa2J1ZiwgKGNoYXIgKilwLCBsZW4pOworCQkJaWYgKCFsZW4pCisJCQkJYnJlYWs7CisJCQlpZiAoY29weV90b191c2VyKGJ1Ziwga2J1ZiwgbGVuKSkgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYnVmKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWNvdW50IC09IGxlbjsKKwkJCWJ1ZiArPSBsZW47CisJCQlyZWFkICs9IGxlbjsKKwkJCXAgKz0gbGVuOworCQl9CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYnVmKTsKKwl9CisgCSpwcG9zID0gcDsKKyAJcmV0dXJuIHJlYWQ7Cit9CisKKworc3RhdGljIGlubGluZSBzc2l6ZV90Citkb193cml0ZV9rbWVtKHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgcmVhbHAsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXNzaXplX3Qgd3JpdHRlbiwgc3o7CisJdW5zaWduZWQgbG9uZyBjb3BpZWQ7CisKKwl3cml0dGVuID0gMDsKKyNpZmRlZiBfX0FSQ0hfSEFTX05PX1BBR0VfWkVST19NQVBQRUQKKwkvKiB3ZSBkb24ndCBoYXZlIHBhZ2UgMCBtYXBwZWQgb24gc3BhcmMgYW5kIG02OGsuLiAqLworCWlmIChyZWFscCA8IFBBR0VfU0laRSkgeworCQl1bnNpZ25lZCBsb25nIHN6ID0gUEFHRV9TSVpFIC0gcmVhbHA7CisJCWlmIChzeiA+IGNvdW50KQorCQkJc3ogPSBjb3VudDsKKwkJLyogSG1tLiBEbyBzb21ldGhpbmc/ICovCisJCWJ1ZiArPSBzejsKKwkJcCArPSBzejsKKwkJcmVhbHAgKz0gc3o7CisJCWNvdW50IC09IHN6OworCQl3cml0dGVuICs9IHN6OworCX0KKyNlbmRpZgorCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQljaGFyICpwdHI7CisJCS8qCisJCSAqIEhhbmRsZSBmaXJzdCBwYWdlIGluIGNhc2UgaXQncyBub3QgYWxpZ25lZAorCQkgKi8KKwkJaWYgKC1yZWFscCAmIChQQUdFX1NJWkUgLSAxKSkKKwkJCXN6ID0gLXJlYWxwICYgKFBBR0VfU0laRSAtIDEpOworCQllbHNlCisJCQlzeiA9IFBBR0VfU0laRTsKKworCQlzeiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHN6LCBjb3VudCk7CisKKwkJLyoKKwkJICogT24gaWE2NCBpZiBhIHBhZ2UgaGFzIGJlZW4gbWFwcGVkIHNvbWV3aGVyZSBhcworCQkgKiB1bmNhY2hlZCwgdGhlbiBpdCBtdXN0IGFsc28gYmUgYWNjZXNzZWQgdW5jYWNoZWQKKwkJICogYnkgdGhlIGtlcm5lbCBvciBkYXRhIGNvcnJ1cHRpb24gbWF5IG9jY3VyCisJCSAqLworCQlwdHIgPSB4bGF0ZV9kZXZfa21lbV9wdHIocCk7CisKKwkJY29waWVkID0gY29weV9mcm9tX3VzZXIocHRyLCBidWYsIHN6KTsKKwkJaWYgKGNvcGllZCkgeworCQkJc3NpemVfdCByZXQ7CisKKwkJCXJldCA9IHdyaXR0ZW4gKyAoc3ogLSBjb3BpZWQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnVmICs9IHN6OworCQlwICs9IHN6OworCQlyZWFscCArPSBzejsKKwkJY291bnQgLT0gc3o7CisJCXdyaXR0ZW4gKz0gc3o7CisJfQorCisJKnBwb3MgKz0gd3JpdHRlbjsKKwlyZXR1cm4gd3JpdHRlbjsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgdG8gdGhlICp2aXJ0dWFsKiBtZW1vcnkgYXMgc2VlbiBieSB0aGUga2VybmVsLgorICovCitzdGF0aWMgc3NpemVfdCB3cml0ZV9rbWVtKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBsb25nIHAgPSAqcHBvczsKKwlzc2l6ZV90IHdyb3RlID0gMDsKKwlzc2l6ZV90IHZpcnRyID0gMDsKKwlzc2l6ZV90IHdyaXR0ZW47CisJY2hhciAqIGtidWY7IC8qIGstYWRkciBiZWNhdXNlIHZ3cml0ZSgpIHRha2VzIHZtbGlzdF9sb2NrIHJ3bG9jayAqLworCisJaWYgKHAgPCAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkpIHsKKworCQl3cm90ZSA9IGNvdW50OworCQlpZiAoY291bnQgPiAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgLSBwKQorCQkJd3JvdGUgPSAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgLSBwOworCisJCXdyaXR0ZW4gPSBkb193cml0ZV9rbWVtKCh2b2lkKilwLCBwLCBidWYsIHdyb3RlLCBwcG9zKTsKKwkJaWYgKHdyaXR0ZW4gIT0gd3JvdGUpCisJCQlyZXR1cm4gd3JpdHRlbjsKKwkJd3JvdGUgPSB3cml0dGVuOworCQlwICs9IHdyb3RlOworCQlidWYgKz0gd3JvdGU7CisJCWNvdW50IC09IHdyb3RlOworCX0KKworCWlmIChjb3VudCA+IDApIHsKKwkJa2J1ZiA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIWtidWYpCisJCQlyZXR1cm4gd3JvdGUgPyB3cm90ZSA6IC1FTk9NRU07CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCWludCBsZW4gPSBjb3VudDsKKworCQkJaWYgKGxlbiA+IFBBR0VfU0laRSkKKwkJCQlsZW4gPSBQQUdFX1NJWkU7CisJCQlpZiAobGVuKSB7CisJCQkJd3JpdHRlbiA9IGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZiwgbGVuKTsKKwkJCQlpZiAod3JpdHRlbikgeworCQkJCQlzc2l6ZV90IHJldDsKKworCQkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpa2J1Zik7CisJCQkJCXJldCA9IHdyb3RlICsgdmlydHIgKyAobGVuIC0gd3JpdHRlbik7CisJCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOworCQkJCX0KKwkJCX0KKwkJCWxlbiA9IHZ3cml0ZShrYnVmLCAoY2hhciAqKXAsIGxlbik7CisJCQljb3VudCAtPSBsZW47CisJCQlidWYgKz0gbGVuOworCQkJdmlydHIgKz0gbGVuOworCQkJcCArPSBsZW47CisJCX0KKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWtidWYpOworCX0KKworIAkqcHBvcyA9IHA7CisgCXJldHVybiB2aXJ0ciArIHdyb3RlOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykKK3N0YXRpYyBzc2l6ZV90IHJlYWRfcG9ydChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgaSA9ICpwcG9zOworCWNoYXIgX191c2VyICp0bXAgPSBidWY7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsgCisJd2hpbGUgKGNvdW50LS0gPiAwICYmIGkgPCA2NTUzNikgeworCQlpZiAoX19wdXRfdXNlcihpbmIoaSksdG1wKSA8IDApIAorCQkJcmV0dXJuIC1FRkFVTFQ7ICAKKwkJaSsrOworCQl0bXArKzsKKwl9CisJKnBwb3MgPSBpOworCXJldHVybiB0bXAtYnVmOworfQorCitzdGF0aWMgc3NpemVfdCB3cml0ZV9wb3J0KHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgaSA9ICpwcG9zOworCWNvbnN0IGNoYXIgX191c2VyICogdG1wID0gYnVmOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsYnVmLGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJd2hpbGUgKGNvdW50LS0gPiAwICYmIGkgPCA2NTUzNikgeworCQljaGFyIGM7CisJCWlmIChfX2dldF91c2VyKGMsIHRtcCkpIAorCQkJcmV0dXJuIC1FRkFVTFQ7IAorCQlvdXRiKGMsaSk7CisJCWkrKzsKKwkJdG1wKys7CisJfQorCSpwcG9zID0gaTsKKwlyZXR1cm4gdG1wLWJ1ZjsKK30KKyNlbmRpZgorCitzdGF0aWMgc3NpemVfdCByZWFkX251bGwoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfbnVsbChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTU1VCisvKgorICogRm9yIGZ1biwgd2UgYXJlIHVzaW5nIHRoZSBNTVUgZm9yIHRoaXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHJlYWRfemVyb19wYWdlYWxpZ25lZChjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOworCXVuc2lnbmVkIGxvbmcgYWRkcj0odW5zaWduZWQgbG9uZylidWY7CisKKwltbSA9IGN1cnJlbnQtPm1tOworCS8qIE9vcHMsIHRoaXMgd2FzIGZvcmdvdHRlbiBiZWZvcmUuIC1iZW4gKi8KKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwkvKiBGb3IgcHJpdmF0ZSBtYXBwaW5ncywganVzdCBtYXAgaW4gemVybyBwYWdlcy4gKi8KKwlmb3IgKHZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyKTsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKKwkJdW5zaWduZWQgbG9uZyBjb3VudDsKKworCQlpZiAodm1hLT52bV9zdGFydCA+IGFkZHIgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgPT0gMCkKKwkJCWdvdG8gb3V0X3VwOworCQlpZiAodm1hLT52bV9mbGFncyAmIChWTV9TSEFSRUQgfCBWTV9IVUdFVExCKSkKKwkJCWJyZWFrOworCQljb3VudCA9IHZtYS0+dm1fZW5kIC0gYWRkcjsKKwkJaWYgKGNvdW50ID4gc2l6ZSkKKwkJCWNvdW50ID0gc2l6ZTsKKworCQl6YXBfcGFnZV9yYW5nZSh2bWEsIGFkZHIsIGNvdW50LCBOVUxMKTsKKyAgICAgICAgCXplcm9tYXBfcGFnZV9yYW5nZSh2bWEsIGFkZHIsIGNvdW50LCBQQUdFX0NPUFkpOworCisJCXNpemUgLT0gY291bnQ7CisJCWJ1ZiArPSBjb3VudDsKKwkJYWRkciArPSBjb3VudDsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCWdvdG8gb3V0X3VwOworCX0KKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCisJLyogVGhlIHNoYXJlZCBjYXNlIGlzIGhhcmQuIExldCdzIGRvIHRoZSBjb252ZW50aW9uYWwgemVyb2luZy4gKi8gCisJZG8geworCQl1bnNpZ25lZCBsb25nIHVud3JpdHRlbiA9IGNsZWFyX3VzZXIoYnVmLCBQQUdFX1NJWkUpOworCQlpZiAodW53cml0dGVuKQorCQkJcmV0dXJuIHNpemUgKyB1bndyaXR0ZW4gLSBQQUdFX1NJWkU7CisJCWNvbmRfcmVzY2hlZCgpOworCQlidWYgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9IHdoaWxlIChzaXplKTsKKworCXJldHVybiBzaXplOworb3V0X3VwOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfemVybyhzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCAKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBsb25nIGxlZnQsIHVud3JpdHRlbiwgd3JpdHRlbiA9IDA7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbGVmdCA9IGNvdW50OworCisJLyogZG8gd2Ugd2FudCB0byBiZSBjbGV2ZXI/IEFyYml0cmFyeSBjdXQtb2ZmICovCisJaWYgKGNvdW50ID49IFBBR0VfU0laRSo0KSB7CisJCXVuc2lnbmVkIGxvbmcgcGFydGlhbDsKKworCQkvKiBIb3cgbXVjaCBsZWZ0IG9mIHRoZSBwYWdlPyAqLworCQlwYXJ0aWFsID0gKFBBR0VfU0laRS0xKSAmIC0odW5zaWduZWQgbG9uZykgYnVmOworCQl1bndyaXR0ZW4gPSBjbGVhcl91c2VyKGJ1ZiwgcGFydGlhbCk7CisJCXdyaXR0ZW4gPSBwYXJ0aWFsIC0gdW53cml0dGVuOworCQlpZiAodW53cml0dGVuKQorCQkJZ290byBvdXQ7CisJCWxlZnQgLT0gcGFydGlhbDsKKwkJYnVmICs9IHBhcnRpYWw7CisJCXVud3JpdHRlbiA9IHJlYWRfemVyb19wYWdlYWxpZ25lZChidWYsIGxlZnQgJiBQQUdFX01BU0spOworCQl3cml0dGVuICs9IChsZWZ0ICYgUEFHRV9NQVNLKSAtIHVud3JpdHRlbjsKKwkJaWYgKHVud3JpdHRlbikKKwkJCWdvdG8gb3V0OworCQlidWYgKz0gbGVmdCAmIFBBR0VfTUFTSzsKKwkJbGVmdCAmPSB+UEFHRV9NQVNLOworCX0KKwl1bndyaXR0ZW4gPSBjbGVhcl91c2VyKGJ1ZiwgbGVmdCk7CisJd3JpdHRlbiArPSBsZWZ0IC0gdW53cml0dGVuOworb3V0OgorCXJldHVybiB3cml0dGVuID8gd3JpdHRlbiA6IC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgbW1hcF96ZXJvKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKQorCQlyZXR1cm4gc2htZW1femVyb19zZXR1cCh2bWEpOworCWlmICh6ZXJvbWFwX3BhZ2VfcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJcmV0dXJuIC1FQUdBSU47CisJcmV0dXJuIDA7Cit9CisjZWxzZSAvKiBDT05GSUdfTU1VICovCitzdGF0aWMgc3NpemVfdCByZWFkX3plcm8oc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyICogYnVmLCAKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzaXplX3QgdG9kbyA9IGNvdW50OworCisJd2hpbGUgKHRvZG8pIHsKKwkJc2l6ZV90IGNodW5rID0gdG9kbzsKKworCQlpZiAoY2h1bmsgPiA0MDk2KQorCQkJY2h1bmsgPSA0MDk2OwkvKiBKdXN0IGZvciBsYXRlbmN5IHJlYXNvbnMgKi8KKwkJaWYgKGNsZWFyX3VzZXIoYnVmLCBjaHVuaykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnVmICs9IGNodW5rOworCQl0b2RvIC09IGNodW5rOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IG1tYXBfemVybyhzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZiAvKiBDT05GSUdfTU1VICovCisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2Z1bGwoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKKy8qCisgKiBTcGVjaWFsIGxzZWVrKCkgZnVuY3Rpb24gZm9yIC9kZXYvbnVsbCBhbmQgL2Rldi96ZXJvLiAgTW9zdCBub3RhYmx5LCB5b3UKKyAqIGNhbiBmb3BlbigpIGJvdGggZGV2aWNlcyB3aXRoICJhIiBub3cuICBUaGlzIHdhcyBwcmV2aW91c2x5IGltcG9zc2libGUuCisgKiAtLSBTUkIuCisgKi8KKworc3RhdGljIGxvZmZfdCBudWxsX2xzZWVrKHN0cnVjdCBmaWxlICogZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJcmV0dXJuIGZpbGUtPmZfcG9zID0gMDsKK30KKworLyoKKyAqIFRoZSBtZW1vcnkgZGV2aWNlcyB1c2UgdGhlIGZ1bGwgMzIvNjQgYml0cyBvZiB0aGUgb2Zmc2V0LCBhbmQgc28gd2UgY2Fubm90CisgKiBjaGVjayBhZ2FpbnN0IG5lZ2F0aXZlIGFkZHJlc3NlczogdGhleSBhcmUgb2suIFRoZSByZXR1cm4gdmFsdWUgaXMgd2VpcmQsCisgKiB0aG91Z2gsIGluIHRoYXQgY2FzZSAoMCkuCisgKgorICogYWxzbyBub3RlIHRoYXQgc2Vla2luZyByZWxhdGl2ZSB0byB0aGUgImVuZCBvZiBmaWxlIiBpc24ndCBzdXBwb3J0ZWQ6CisgKiBpdCBoYXMgbm8gbWVhbmluZywgc28gaXQgcmV0dXJucyAtRUlOVkFMLgorICovCitzdGF0aWMgbG9mZl90IG1lbW9yeV9sc2VlayhzdHJ1Y3QgZmlsZSAqIGZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKQoreworCWxvZmZfdCByZXQ7CisKKwlkb3duKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCXN3aXRjaCAob3JpZykgeworCQljYXNlIDA6CisJCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJCXJldCA9IGZpbGUtPmZfcG9zOworCQkJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWZpbGUtPmZfcG9zICs9IG9mZnNldDsKKwkJCXJldCA9IGZpbGUtPmZfcG9zOworCQkJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCX0KKwl1cCgmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wZW5fcG9ydChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXJldHVybiBjYXBhYmxlKENBUF9TWVNfUkFXSU8pID8gMCA6IC1FUEVSTTsKK30KKworI2RlZmluZSB6ZXJvX2xzZWVrCW51bGxfbHNlZWsKKyNkZWZpbmUgZnVsbF9sc2VlayAgICAgIG51bGxfbHNlZWsKKyNkZWZpbmUgd3JpdGVfemVybwl3cml0ZV9udWxsCisjZGVmaW5lIHJlYWRfZnVsbCAgICAgICByZWFkX3plcm8KKyNkZWZpbmUgb3Blbl9tZW0Jb3Blbl9wb3J0CisjZGVmaW5lIG9wZW5fa21lbQlvcGVuX21lbQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZW1fZm9wcyA9IHsKKwkubGxzZWVrCQk9IG1lbW9yeV9sc2VlaywKKwkucmVhZAkJPSByZWFkX21lbSwKKwkud3JpdGUJCT0gd3JpdGVfbWVtLAorCS5tbWFwCQk9IG1tYXBfbWVtLAorCS5vcGVuCQk9IG9wZW5fbWVtLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga21lbV9mb3BzID0geworCS5sbHNlZWsJCT0gbWVtb3J5X2xzZWVrLAorCS5yZWFkCQk9IHJlYWRfa21lbSwKKwkud3JpdGUJCT0gd3JpdGVfa21lbSwKKwkubW1hcAkJPSBtbWFwX2ttZW0sCisJLm9wZW4JCT0gb3Blbl9rbWVtLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbnVsbF9mb3BzID0geworCS5sbHNlZWsJCT0gbnVsbF9sc2VlaywKKwkucmVhZAkJPSByZWFkX251bGwsCisJLndyaXRlCQk9IHdyaXRlX251bGwsCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBvcnRfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG1lbW9yeV9sc2VlaywKKwkucmVhZAkJPSByZWFkX3BvcnQsCisJLndyaXRlCQk9IHdyaXRlX3BvcnQsCisJLm9wZW4JCT0gb3Blbl9wb3J0LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6ZXJvX2ZvcHMgPSB7CisJLmxsc2VlawkJPSB6ZXJvX2xzZWVrLAorCS5yZWFkCQk9IHJlYWRfemVybywKKwkud3JpdGUJCT0gd3JpdGVfemVybywKKwkubW1hcAkJPSBtbWFwX3plcm8sCit9OworCitzdGF0aWMgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gemVyb19iZGkgPSB7CisJLmNhcGFiaWxpdGllcwk9IEJESV9DQVBfTUFQX0NPUFksCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdWxsX2ZvcHMgPSB7CisJLmxsc2VlawkJPSBmdWxsX2xzZWVrLAorCS5yZWFkCQk9IHJlYWRfZnVsbCwKKwkud3JpdGUJCT0gd3JpdGVfZnVsbCwKK307CisKK3N0YXRpYyBzc2l6ZV90IGttc2dfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqdG1wOworCWludCByZXQ7CisKKwl0bXAgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSAtRUZBVUxUOworCWlmICghY29weV9mcm9tX3VzZXIodG1wLCBidWYsIGNvdW50KSkgeworCQl0bXBbY291bnRdID0gMDsKKwkJcmV0ID0gcHJpbnRrKCIlcyIsIHRtcCk7CisJfQorCWtmcmVlKHRtcCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga21zZ19mb3BzID0geworCS53cml0ZSA9CWttc2dfd3JpdGUsCit9OworCitzdGF0aWMgaW50IG1lbW9yeV9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3dpdGNoIChpbWlub3IoaW5vZGUpKSB7CisJCWNhc2UgMToKKwkJCWZpbHAtPmZfb3AgPSAmbWVtX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZmlscC0+Zl9vcCA9ICZrbWVtX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJZmlscC0+Zl9vcCA9ICZudWxsX2ZvcHM7CisJCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19JU0EpIHx8ICFkZWZpbmVkKF9fbWM2ODAwMF9fKQorCQljYXNlIDQ6CisJCQlmaWxwLT5mX29wID0gJnBvcnRfZm9wczsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgNToKKwkJCWZpbHAtPmZfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZ6ZXJvX2JkaTsKKwkJCWZpbHAtPmZfb3AgPSAmemVyb19mb3BzOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWZpbHAtPmZfb3AgPSAmZnVsbF9mb3BzOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWZpbHAtPmZfb3AgPSAmcmFuZG9tX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJZmlscC0+Zl9vcCA9ICZ1cmFuZG9tX2ZvcHM7CisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCWZpbHAtPmZfb3AgPSAma21zZ19mb3BzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5vcGVuKQorCQlyZXR1cm4gZmlscC0+Zl9vcC0+b3Blbihpbm9kZSxmaWxwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVtb3J5X2ZvcHMgPSB7CisJLm9wZW4JCT0gbWVtb3J5X29wZW4sCS8qIGp1c3QgYSBzZWxlY3RvciBmb3IgdGhlIHJlYWwgb3BlbiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdW5zaWduZWQgaW50CQltaW5vcjsKKwljaGFyCQkJKm5hbWU7CisJdW1vZGVfdAkJCW1vZGU7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkqZm9wczsKK30gZGV2bGlzdFtdID0geyAvKiBsaXN0IG9mIG1pbm9yIGRldmljZXMgKi8KKwl7MSwgIm1lbSIsICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAsICZtZW1fZm9wc30sCisJezIsICJrbWVtIiwgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQLCAma21lbV9mb3BzfSwKKwl7MywgIm51bGwiLCAgICBTX0lSVUdPIHwgU19JV1VHTywgICAgICAgICAgICZudWxsX2ZvcHN9LAorI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgfHwgIWRlZmluZWQoX19tYzY4MDAwX18pCisJezQsICJwb3J0IiwgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQLCAmcG9ydF9mb3BzfSwKKyNlbmRpZgorCXs1LCAiemVybyIsICAgIFNfSVJVR08gfCBTX0lXVUdPLCAgICAgICAgICAgJnplcm9fZm9wc30sCisJezcsICJmdWxsIiwgICAgU19JUlVHTyB8IFNfSVdVR08sICAgICAgICAgICAmZnVsbF9mb3BzfSwKKwl7OCwgInJhbmRvbSIsICBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICZyYW5kb21fZm9wc30sCisJezksICJ1cmFuZG9tIiwgU19JUlVHTyB8IFNfSVdVU1IsICAgICAgICAgICAmdXJhbmRvbV9mb3BzfSwKKwl7MTEsImttc2ciLCAgICBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICZrbXNnX2ZvcHN9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKm1lbV9jbGFzczsKKworc3RhdGljIGludCBfX2luaXQgY2hyX2Rldl9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KE1FTV9NQUpPUiwibWVtIiwmbWVtb3J5X2ZvcHMpKQorCQlwcmludGsoInVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIG1lbW9yeSBkZXZzXG4iLCBNRU1fTUFKT1IpOworCisJbWVtX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgIm1lbSIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldmxpc3QpOyBpKyspIHsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQobWVtX2NsYXNzLAorCQkJCQlNS0RFVihNRU1fTUFKT1IsIGRldmxpc3RbaV0ubWlub3IpLAorCQkJCQlOVUxMLCBkZXZsaXN0W2ldLm5hbWUpOworCQlkZXZmc19ta19jZGV2KE1LREVWKE1FTV9NQUpPUiwgZGV2bGlzdFtpXS5taW5vciksCisJCQkJU19JRkNIUiB8IGRldmxpc3RbaV0ubW9kZSwgZGV2bGlzdFtpXS5uYW1lKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK2ZzX2luaXRjYWxsKGNocl9kZXZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWlzYy5jIGIvZHJpdmVycy9jaGFyL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTM3NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL21pc2MuYwpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvY2hhci9taXNjLmMKKyAqCisgKiBHZW5lcmljIG1pc2Mgb3BlbiByb3V0aW5lIGJ5IEpvaGFuIE15cmVlbgorICoKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSBMaW51cworICoKKyAqIFRlZW11IFJhbnRhbmVuJ3MgTWljcm9zb2Z0IEJ1c21vdXNlIHN1cHBvcnQgYW5kIERlcnJpY2sgQ29sZSdzCisgKiAgIGNoYW5nZXMgaW5jb3Jwb3JhdGVkIGludG8gMC45N3BsNAorICogICBieSBQZXRlciBDZXJ2YXNpbyAocGV0ZSVxMTA2Zm0udXVjcEB3dXBvc3Qud3VzdGwuZWR1KSAoMDhTRVA5MikKKyAqICAgU2VlIGJ1c21vdXNlLmMgZm9yIHBhcnRpY3VsYXJzLgorICoKKyAqIE1hZGUgdGhpbmdzIGEgbG90IG1vZGUgbW9kdWxhciAtIGVhc3kgdG8gY29tcGlsZSBpbiBqdXN0IG9uZSBvciB0d28KKyAqIG9mIHRoZSBtaXNjIGRyaXZlcnMsIGFzIHRoZXkgYXJlIG5vdyBjb21wbGV0ZWx5IGluZGVwZW5kZW50LiBMaW51cy4KKyAqCisgKiBTdXBwb3J0IGZvciBsb2FkYWJsZSBtb2R1bGVzLiA4LVNlcC05NSBQaGlsaXAgQmx1bmRlbGwgPHBqYjI3QGNhbS5hYy51az4KKyAqCisgKiBGaXhlZCBhIGZhaWxpbmcgc3ltYm9sIHJlZ2lzdGVyIHRvIGZyZWUgdGhlIGRldmljZSByZWdpc3RyYXRpb24KKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiAyMS1KYW4tOTYKKyAqCisgKiBEeW5hbWljIG1pbm9ycyBhbmQgL3Byb2MvbWljZSBieSBBbGVzc2FuZHJvIFJ1YmluaS4gMjYtTWFyLTk2CisgKgorICogUmVuYW1lZCB0byBtaXNjIGFuZCBtaXNjZGV2aWNlIHRvIGJlIG1vcmUgYWNjdXJhdGUuIEFsYW4gQ294IDI2LU1hci05NgorICoKKyAqIEhhbmRsaW5nIG9mIG1vdXNlIG1pbm9yIG51bWJlcnMgZm9yIGtlcm5lbGQ6CisgKiAgSWRlYSBieSBKYWNxdWVzIEdlbGluYXMgPGphY2tAc29sdWNvcnAucWMuY2E+LAorICogIGFkYXB0ZWQgYnkgQmpvcm4gRWt3YWxsIDxiajBybkBibG94LnNlPgorICogIGNvcnJlY3RlZCBieSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoKKyAqIENoYW5nZXMgZm9yIGttb2QgKGZyb20ga2VybmVsZCk6CisgKglDeXJ1cyBEdXJnaW4gPGNpZGVyQHNwZWFrZWFzeS5vcmc+CisgKgorICogQWRkZWQgZGV2ZnMgc3VwcG9ydC4gUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+ICAxMC1KYW4tMTk5OAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisKKy8qCisgKiBIZWFkIGVudHJ5IGZvciB0aGUgZG91Ymx5IGxpbmtlZCBtaXNjZGV2aWNlIGxpc3QKKyAqLworc3RhdGljIExJU1RfSEVBRChtaXNjX2xpc3QpOworc3RhdGljIERFQ0xBUkVfTVVURVgobWlzY19zZW0pOworCisvKgorICogQXNzaWduZWQgbnVtYmVycywgdXNlZCBmb3IgZHluYW1pYyBtaW5vcnMKKyAqLworI2RlZmluZSBEWU5BTUlDX01JTk9SUyA2NCAvKiBsaWtlIGR5bmFtaWMgbWFqb3JzICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBtaXNjX21pbm9yc1tEWU5BTUlDX01JTk9SUyAvIDhdOworCitleHRlcm4gaW50IHJ0Y19EUDg1NzBBX2luaXQodm9pZCk7CitleHRlcm4gaW50IHJ0Y19NSzQ4VDA4X2luaXQodm9pZCk7CitleHRlcm4gaW50IHBtdV9kZXZpY2VfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdG9zaF9pbml0KHZvaWQpOworZXh0ZXJuIGludCBpOGtfaW5pdCh2b2lkKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCAqbWlzY19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBtaXNjZGV2aWNlICpwOworCWxvZmZfdCBvZmYgPSAwOworCisJZG93bigmbWlzY19zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJm1pc2NfbGlzdCwgbGlzdCkgeworCQlpZiAoKnBvcyA9PSBvZmYrKykgCisJCQlyZXR1cm4gcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICptaXNjX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuID0gKChzdHJ1Y3QgbWlzY2RldmljZSAqKXYpLT5saXN0Lm5leHQ7CisKKwkrKypwb3M7CisKKwlyZXR1cm4gKG4gIT0gJm1pc2NfbGlzdCkgPyBsaXN0X2VudHJ5KG4sIHN0cnVjdCBtaXNjZGV2aWNlLCBsaXN0KQorCQkgOiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBtaXNjX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXVwKCZtaXNjX3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgbWlzY19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwljb25zdCBzdHJ1Y3QgbWlzY2RldmljZSAqcCA9IHY7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiUzaSAlc1xuIiwgcC0+bWlub3IsIHAtPm5hbWUgPyBwLT5uYW1lIDogIiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbWlzY19zZXFfb3BzID0geworCS5zdGFydCA9IG1pc2Nfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IG1pc2Nfc2VxX25leHQsCisJLnN0b3AgID0gbWlzY19zZXFfc3RvcCwKKwkuc2hvdyAgPSBtaXNjX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBtaXNjX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmbWlzY19zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWlzY19wcm9jX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gbWlzY19zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgbWlzY19vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgbWlzY2RldmljZSAqYzsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wcywgKm5ld19mb3BzID0gTlVMTDsKKwkKKwlkb3duKCZtaXNjX3NlbSk7CisJCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmbWlzY19saXN0LCBsaXN0KSB7CisJCWlmIChjLT5taW5vciA9PSBtaW5vcikgeworCQkJbmV3X2ZvcHMgPSBmb3BzX2dldChjLT5mb3BzKTsJCQorCQkJYnJlYWs7CisJCX0KKwl9CisJCQorCWlmICghbmV3X2ZvcHMpIHsKKwkJdXAoJm1pc2Nfc2VtKTsKKwkJcmVxdWVzdF9tb2R1bGUoImNoYXItbWFqb3ItJWQtJWQiLCBNSVNDX01BSk9SLCBtaW5vcik7CisJCWRvd24oJm1pc2Nfc2VtKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZtaXNjX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChjLT5taW5vciA9PSBtaW5vcikgeworCQkJCW5ld19mb3BzID0gZm9wc19nZXQoYy0+Zm9wcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFuZXdfZm9wcykKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwllcnIgPSAwOworCW9sZF9mb3BzID0gZmlsZS0+Zl9vcDsKKwlmaWxlLT5mX29wID0gbmV3X2ZvcHM7CisJaWYgKGZpbGUtPmZfb3AtPm9wZW4pIHsKKwkJZXJyPWZpbGUtPmZfb3AtPm9wZW4oaW5vZGUsZmlsZSk7CisJCWlmIChlcnIpIHsKKwkJCWZvcHNfcHV0KGZpbGUtPmZfb3ApOworCQkJZmlsZS0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKKwkJfQorCX0KKwlmb3BzX3B1dChvbGRfZm9wcyk7CitmYWlsOgorCXVwKCZtaXNjX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworLyogCisgKiBUT0RPIGZvciAyLjc6CisgKiAgLSBhZGQgYSBzdHJ1Y3QgY2xhc3NfZGV2aWNlIHRvIHN0cnVjdCBtaXNjZGV2aWNlIGFuZCBtYWtlIGFsbCB1c2FnZXMgb2YKKyAqICAgIHRoZW0gZHluYW1pYy4KKyAqLworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKm1pc2NfY2xhc3M7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pc2NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gbWlzY19vcGVuLAorfTsKKworCisvKioKKyAqCW1pc2NfcmVnaXN0ZXIJLQlyZWdpc3RlciBhIG1pc2NlbGxhbmVvdXMgZGV2aWNlCisgKglAbWlzYzogZGV2aWNlIHN0cnVjdHVyZQorICoJCisgKglSZWdpc3RlciBhIG1pc2NlbGxhbmVvdXMgZGV2aWNlIHdpdGggdGhlIGtlcm5lbC4gSWYgdGhlIG1pbm9yCisgKgludW1iZXIgaXMgc2V0IHRvICVNSVNDX0RZTkFNSUNfTUlOT1IgYSBtaW5vciBudW1iZXIgaXMgYXNzaWduZWQKKyAqCWFuZCBwbGFjZWQgaW4gdGhlIG1pbm9yIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUuIEZvciBvdGhlciBjYXNlcworICoJdGhlIG1pbm9yIG51bWJlciByZXF1ZXN0ZWQgaXMgdXNlZC4KKyAqCisgKglUaGUgc3RydWN0dXJlIHBhc3NlZCBpcyBsaW5rZWQgaW50byB0aGUga2VybmVsIGFuZCBtYXkgbm90IGJlCisgKglkZXN0cm95ZWQgdW50aWwgaXQgaGFzIGJlZW4gdW5yZWdpc3RlcmVkLgorICoKKyAqCUEgemVybyBpcyByZXR1cm5lZCBvbiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgZm9yCisgKglmYWlsdXJlLgorICovCisgCitpbnQgbWlzY19yZWdpc3RlcihzdHJ1Y3QgbWlzY2RldmljZSAqIG1pc2MpCit7CisJc3RydWN0IG1pc2NkZXZpY2UgKmM7CisJZGV2X3QgZGV2OworCWludCBlcnI7CisKKwlkb3duKCZtaXNjX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmbWlzY19saXN0LCBsaXN0KSB7CisJCWlmIChjLT5taW5vciA9PSBtaXNjLT5taW5vcikgeworCQkJdXAoJm1pc2Nfc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlpZiAobWlzYy0+bWlub3IgPT0gTUlTQ19EWU5BTUlDX01JTk9SKSB7CisJCWludCBpID0gRFlOQU1JQ19NSU5PUlM7CisJCXdoaWxlICgtLWkgPj0gMCkKKwkJCWlmICggKG1pc2NfbWlub3JzW2k+PjNdICYgKDEgPDwgKGkmNykpKSA9PSAwKQorCQkJCWJyZWFrOworCQlpZiAoaTwwKSB7CisJCQl1cCgmbWlzY19zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQltaXNjLT5taW5vciA9IGk7CisJfQorCisJaWYgKG1pc2MtPm1pbm9yIDwgRFlOQU1JQ19NSU5PUlMpCisJCW1pc2NfbWlub3JzW21pc2MtPm1pbm9yID4+IDNdIHw9IDEgPDwgKG1pc2MtPm1pbm9yICYgNyk7CisJaWYgKG1pc2MtPmRldmZzX25hbWVbMF0gPT0gJ1wwJykgeworCQlzbnByaW50ZihtaXNjLT5kZXZmc19uYW1lLCBzaXplb2YobWlzYy0+ZGV2ZnNfbmFtZSksCisJCQkJIm1pc2MvJXMiLCBtaXNjLT5uYW1lKTsKKwl9CisJZGV2ID0gTUtERVYoTUlTQ19NQUpPUiwgbWlzYy0+bWlub3IpOworCisJbWlzYy0+Y2xhc3MgPSBjbGFzc19zaW1wbGVfZGV2aWNlX2FkZChtaXNjX2NsYXNzLCBkZXYsCisJCQkJCSAgICAgIG1pc2MtPmRldiwgbWlzYy0+bmFtZSk7CisJaWYgKElTX0VSUihtaXNjLT5jbGFzcykpIHsKKwkJZXJyID0gUFRSX0VSUihtaXNjLT5jbGFzcyk7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGRldmZzX21rX2NkZXYoZGV2LCBTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUnxTX0lSR1JQLCAKKwkJCSAgICBtaXNjLT5kZXZmc19uYW1lKTsKKwlpZiAoZXJyKSB7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKGRldik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQWRkIGl0IHRvIHRoZSBmcm9udCwgc28gdGhhdCBsYXRlciBkZXZpY2VzIGNhbiAib3ZlcnJpZGUiCisJICogZWFybGllciBkZWZhdWx0cworCSAqLworCWxpc3RfYWRkKCZtaXNjLT5saXN0LCAmbWlzY19saXN0KTsKKyBvdXQ6CisJdXAoJm1pc2Nfc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqCW1pc2NfZGVyZWdpc3RlciAtIHVucmVnaXN0ZXIgYSBtaXNjZWxsYW5lb3VzIGRldmljZQorICoJQG1pc2M6IGRldmljZSB0byB1bnJlZ2lzdGVyCisgKgorICoJVW5yZWdpc3RlciBhIG1pc2NlbGxhbmVvdXMgZGV2aWNlIHRoYXQgd2FzIHByZXZpb3VzbHkKKyAqCXN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIHdpdGggbWlzY19yZWdpc3RlcigpLiBTdWNjZXNzCisgKglpcyBpbmRpY2F0ZWQgYnkgYSB6ZXJvIHJldHVybiwgYSBuZWdhdGl2ZSBlcnJubyBjb2RlCisgKglpbmRpY2F0ZXMgYW4gZXJyb3IuCisgKi8KKworaW50IG1pc2NfZGVyZWdpc3RlcihzdHJ1Y3QgbWlzY2RldmljZSAqIG1pc2MpCit7CisJaW50IGkgPSBtaXNjLT5taW5vcjsKKworCWlmIChsaXN0X2VtcHR5KCZtaXNjLT5saXN0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZtaXNjX3NlbSk7CisJbGlzdF9kZWwoJm1pc2MtPmxpc3QpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKE1JU0NfTUFKT1IsIG1pc2MtPm1pbm9yKSk7CisJZGV2ZnNfcmVtb3ZlKG1pc2MtPmRldmZzX25hbWUpOworCWlmIChpIDwgRFlOQU1JQ19NSU5PUlMgJiYgaT4wKSB7CisJCW1pc2NfbWlub3JzW2k+PjNdICY9IH4oMSA8PCAobWlzYy0+bWlub3IgJiA3KSk7CisJfQorCXVwKCZtaXNjX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wobWlzY19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKG1pc2NfZGVyZWdpc3Rlcik7CisKK3N0YXRpYyBpbnQgX19pbml0IG1pc2NfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisKKwllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgibWlzYyIsIDAsIE5VTEwpOworCWlmIChlbnQpCisJCWVudC0+cHJvY19mb3BzID0gJm1pc2NfcHJvY19mb3BzOworI2VuZGlmCisJbWlzY19jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJtaXNjIik7CisJaWYgKElTX0VSUihtaXNjX2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIobWlzY19jbGFzcyk7CisjaWZkZWYgQ09ORklHX01WTUUxNngKKwlydGNfTUs0OFQwOF9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlZNRTYwMDAKKwlydGNfRFA4NTcwQV9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworCXBtdV9kZXZpY2VfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RPU0hJQkEKKwl0b3NoX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JOEsKKwlpOGtfaW5pdCgpOworI2VuZGlmCisJaWYgKHJlZ2lzdGVyX2NocmRldihNSVNDX01BSk9SLCJtaXNjIiwmbWlzY19mb3BzKSkgeworCQlwcmludGsoInVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIG1pc2MgZGV2aWNlc1xuIiwKKwkJICAgICAgIE1JU0NfTUFKT1IpOworCQljbGFzc19zaW1wbGVfZGVzdHJveShtaXNjX2NsYXNzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKG1pc2NfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW10aW1lci5jIGIvZHJpdmVycy9jaGFyL21tdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVkZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL21tdGltZXIuYwpAQCAtMCwwICsxLDcyNSBAQAorLyoKKyAqIEludGVsIE11bHRpbWVkaWEgVGltZXIgZGV2aWNlIGltcGxlbWVudGF0aW9uIGZvciBTR0kgU04gcGxhdGZvcm1zLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBkcml2ZXIgZXhwb3J0cyBhbiBBUEkgdGhhdCBzaG91bGQgYmUgc3VwcG9ydGFibGUgYnkgYW55IEhQRVQgb3IgSUEtUEMKKyAqIG11bHRpbWVkaWEgdGltZXIuICBUaGUgY29kZSBiZWxvdyBpcyBjdXJyZW50bHkgc3BlY2lmaWMgdG8gdGhlIFNHSSBBbHRpeAorICogU0h1YiBSVEMsIGhvd2V2ZXIuCisgKgorICogMTEvMDEvMDEgLSBqYmFybmVzIC0gaW5pdGlhbCByZXZpc2lvbgorICogOS8xMC8wNCAtIENocmlzdG9waCBMYW1ldGVyIC0gcmVtb3ZlIGludGVycnVwdCBzdXBwb3J0IGZvciBrZXJuZWwgaW5jbHVzaW9uCisgKiAxMC8xLzA0IC0gQ2hyaXN0b3BoIExhbWV0ZXIgLSBwcm92aWRlIHBvc2l4IGNsb2NrIENMT0NLX1NHSV9DWUNMRQorICogMTAvMTMvMDQgLSBDaHJpc3RvcGggTGFtZXRlciwgRGltaXRyaSBTaXZhbmljaCAtIHByb3ZpZGUgdGltZXIgaW50ZXJydXB0CisgKgkJc3VwcG9ydCB2aWEgdGhlIHBvc2l4IHRpbWVyIGludGVyZmFjZQorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4LXRpbWVycy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vaW50ci5oPgorI2luY2x1ZGUgPGFzbS9zbi9zaHViX21tci5oPgorI2luY2x1ZGUgPGFzbS9zbi9ub2RlcGRhLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NodWJpby5oPgorCitNT0RVTEVfQVVUSE9SKCJKZXNzZSBCYXJuZXMgPGpiYXJuZXNAc2dpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0dJIEFsdGl4IFJUQyBUaW1lciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBuYW1lIG9mIHRoZSBkZXZpY2UsIHVzdWFsbHkgaW4gL2RldiAqLworI2RlZmluZSBNTVRJTUVSX05BTUUgIm1tdGltZXIiCisjZGVmaW5lIE1NVElNRVJfREVTQyAiU0dJIEFsdGl4IFJUQyBUaW1lciIKKyNkZWZpbmUgTU1USU1FUl9WRVJTSU9OICIyLjAiCisKKyNkZWZpbmUgUlRDX0JJVFMgNTUgLyogNTUgYml0cyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQ7CisKKyNkZWZpbmUgUlRDX0NPVU5URVJfQUREUiAgICAgICAgKChsb25nICopTE9DQUxfTU1SX0FERFIoU0hfUlRDKSkKKworI2RlZmluZSBydGNfdGltZSgpICAgICAgICAgICAgICAoKlJUQ19DT1VOVEVSX0FERFIpCisKK3N0YXRpYyBpbnQgbW10aW1lcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IG1tdGltZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCisvKgorICogUGVyaW9kIGluIGZlbXRvc2Vjb25kcyAoMTBeLTE1IHMpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1tdGltZXJfZmVtdG9wZXJpb2QgPSAwOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtbXRpbWVyX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm1tYXAgPQkJbW10aW1lcl9tbWFwLAorCS5pb2N0bCA9CW1tdGltZXJfaW9jdGwsCit9OworCisvKgorICogV2Ugb25seSBoYXZlIGNvbXBhcmlzb24gcmVnaXN0ZXJzIFJUQzEtNCBjdXJyZW50bHkgYXZhaWxhYmxlIHBlcgorICogbm9kZS4gIFJUQzAgaXMgdXNlZCBieSBTQUwuCisgKi8KKyNkZWZpbmUgTlVNX0NPTVBBUkFUT1JTIDMKKy8qIENoZWNrIGZvciBhbiBSVEMgaW50ZXJydXB0IHBlbmRpbmcgKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1tdGltZXJfaW50X3BlbmRpbmcoaW50IGNvbXBhcmF0b3IpCit7CisJaWYgKEhVQl9MKCh1bnNpZ25lZCBsb25nICopTE9DQUxfTU1SX0FERFIoU0hfRVZFTlRfT0NDVVJSRUQpKSAmCisJCQlTSF9FVkVOVF9PQ0NVUlJFRF9SVEMxX0lOVF9NQVNLIDw8IGNvbXBhcmF0b3IpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisvKiBDbGVhciB0aGUgUlRDIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworc3RhdGljIHZvaWQgaW5saW5lIG1tdGltZXJfY2xyX2ludF9wZW5kaW5nKGludCBjb21wYXJhdG9yKQoreworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9FVkVOVF9PQ0NVUlJFRF9BTElBUyksCisJCVNIX0VWRU5UX09DQ1VSUkVEX1JUQzFfSU5UX01BU0sgPDwgY29tcGFyYXRvcik7Cit9CisKKy8qIFNldHVwIHRpbWVyIG9uIGNvbXBhcmF0b3IgUlRDMSAqLworc3RhdGljIHZvaWQgaW5saW5lIG1tdGltZXJfc2V0dXBfaW50XzAodTY0IGV4cGlyZXMpCit7CisJdTY0IHZhbDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0ICovCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzFfSU5UX0VOQUJMRSksIDBVTCk7CisKKwkvKiBJbml0aWFsaXplIGNvbXBhcmF0b3IgdmFsdWUgKi8KKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfSU5UX0NNUEIpLCAtMUwpOworCisJLyogQ2xlYXIgcGVuZGluZyBiaXQgKi8KKwltbXRpbWVyX2Nscl9pbnRfcGVuZGluZygwKTsKKworCXZhbCA9ICgodTY0KVNHSV9NTVRJTUVSX1ZFQ1RPUiA8PCBTSF9SVEMxX0lOVF9DT05GSUdfSURYX1NIRlQpIHwKKwkJKCh1NjQpY3B1X3BoeXNpY2FsX2lkKHNtcF9wcm9jZXNzb3JfaWQoKSkgPDwKKwkJCVNIX1JUQzFfSU5UX0NPTkZJR19QSURfU0hGVCk7CisKKwkvKiBTZXQgY29uZmlndXJhdGlvbiAqLworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMxX0lOVF9DT05GSUcpLCB2YWwpOworCisJLyogRW5hYmxlIFJUQyBpbnRlcnJ1cHRzICovCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzFfSU5UX0VOQUJMRSksIDFVTCk7CisKKwkvKiBJbml0aWFsaXplIGNvbXBhcmF0b3IgdmFsdWUgKi8KKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfSU5UX0NNUEIpLCBleHBpcmVzKTsKKworCit9CisKKy8qIFNldHVwIHRpbWVyIG9uIGNvbXBhcmF0b3IgUlRDMiAqLworc3RhdGljIHZvaWQgaW5saW5lIG1tdGltZXJfc2V0dXBfaW50XzEodTY0IGV4cGlyZXMpCit7CisJdTY0IHZhbDsKKworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMyX0lOVF9FTkFCTEUpLCAwVUwpOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX0lOVF9DTVBDKSwgLTFMKTsKKworCW1tdGltZXJfY2xyX2ludF9wZW5kaW5nKDEpOworCisJdmFsID0gKCh1NjQpU0dJX01NVElNRVJfVkVDVE9SIDw8IFNIX1JUQzJfSU5UX0NPTkZJR19JRFhfU0hGVCkgfAorCQkoKHU2NCljcHVfcGh5c2ljYWxfaWQoc21wX3Byb2Nlc3Nvcl9pZCgpKSA8PAorCQkJU0hfUlRDMl9JTlRfQ09ORklHX1BJRF9TSEZUKTsKKworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMyX0lOVF9DT05GSUcpLCB2YWwpOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzJfSU5UX0VOQUJMRSksIDFVTCk7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfSU5UX0NNUEMpLCBleHBpcmVzKTsKK30KKworLyogU2V0dXAgdGltZXIgb24gY29tcGFyYXRvciBSVEMzICovCitzdGF0aWMgdm9pZCBpbmxpbmUgbW10aW1lcl9zZXR1cF9pbnRfMih1NjQgZXhwaXJlcykKK3sKKwl1NjQgdmFsOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzNfSU5UX0VOQUJMRSksIDBVTCk7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfSU5UX0NNUEQpLCAtMUwpOworCisJbW10aW1lcl9jbHJfaW50X3BlbmRpbmcoMik7CisKKwl2YWwgPSAoKHU2NClTR0lfTU1USU1FUl9WRUNUT1IgPDwgU0hfUlRDM19JTlRfQ09ORklHX0lEWF9TSEZUKSB8CisJCSgodTY0KWNwdV9waHlzaWNhbF9pZChzbXBfcHJvY2Vzc29yX2lkKCkpIDw8CisJCQlTSF9SVEMzX0lOVF9DT05GSUdfUElEX1NIRlQpOworCisJSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzNfSU5UX0NPTkZJRyksIHZhbCk7CisKKwlIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDM19JTlRfRU5BQkxFKSwgMVVMKTsKKworCUhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9JTlRfQ01QRCksIGV4cGlyZXMpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgYW5kIHByZWVtcHRpb24gb2ZmCisgKiBpbiBvcmRlciB0byBpbnN1cmUgdGhhdCB0aGUgc2V0dXAgc3VjY2VlZHMgaW4gYSBkZXRlcm1pbmlzdGljIHRpbWUgZnJhbWUuCisgKiBJdCB3aWxsIGNoZWNrIGlmIHRoZSBpbnRlcnJ1cHQgc2V0dXAgc3VjY2VlZGVkLgorICovCitzdGF0aWMgaW50IGlubGluZSBtbXRpbWVyX3NldHVwKGludCBjb21wYXJhdG9yLCB1bnNpZ25lZCBsb25nIGV4cGlyZXMpCit7CisKKwlzd2l0Y2ggKGNvbXBhcmF0b3IpIHsKKwljYXNlIDA6CisJCW1tdGltZXJfc2V0dXBfaW50XzAoZXhwaXJlcyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbW10aW1lcl9zZXR1cF9pbnRfMShleHBpcmVzKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltbXRpbWVyX3NldHVwX2ludF8yKGV4cGlyZXMpOworCQlicmVhazsKKwl9CisJLyogV2UgbWlnaHQndmUgbWlzc2VkIG91ciBleHBpcmF0aW9uIHRpbWUgKi8KKwlpZiAocnRjX3RpbWUoKSA8IGV4cGlyZXMpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBJZiBhbiBpbnRlcnJ1cHQgaXMgYWxyZWFkeSBwZW5kaW5nIHRoZW4gaXRzIG9rYXkKKwkgKiBpZiBub3QgdGhlbiB3ZSBmYWlsZWQKKwkgKi8KKwlyZXR1cm4gbW10aW1lcl9pbnRfcGVuZGluZyhjb21wYXJhdG9yKTsKK30KKworc3RhdGljIGludCBpbmxpbmUgbW10aW1lcl9kaXNhYmxlX2ludChsb25nIG5hc2lkLCBpbnQgY29tcGFyYXRvcikKK3sKKwlzd2l0Y2ggKGNvbXBhcmF0b3IpIHsKKwljYXNlIDA6CisJCW5hc2lkID09IC0xID8gSFVCX1MoKHU2NCAqKUxPQ0FMX01NUl9BRERSKFNIX1JUQzFfSU5UX0VOQUJMRSksCisJCQkwVUwpIDogUkVNT1RFX0hVQl9TKG5hc2lkLCBTSF9SVEMxX0lOVF9FTkFCTEUsIDBVTCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbmFzaWQgPT0gLTEgPyBIVUJfUygodTY0ICopTE9DQUxfTU1SX0FERFIoU0hfUlRDMl9JTlRfRU5BQkxFKSwKKwkJCTBVTCkgOiBSRU1PVEVfSFVCX1MobmFzaWQsIFNIX1JUQzJfSU5UX0VOQUJMRSwgMFVMKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQluYXNpZCA9PSAtMSA/IEhVQl9TKCh1NjQgKilMT0NBTF9NTVJfQUREUihTSF9SVEMzX0lOVF9FTkFCTEUpLAorCQkJMFVMKSA6IFJFTU9URV9IVUJfUyhuYXNpZCwgU0hfUlRDM19JTlRfRU5BQkxFLCAwVUwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVElNRVJfT0ZGIDB4YmFkY2FiTEwKKworLyogVGhlcmUgaXMgb25lIG9mIHRoZXNlIGZvciBlYWNoIGNvbXBhcmF0b3IgKi8KK3R5cGVkZWYgc3RydWN0IG1tdGltZXIgeworCXNwaW5sb2NrX3QgbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IGtfaXRpbWVyICp0aW1lcjsKKwlpbnQgaTsKKwlpbnQgY3B1OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OworfSBtbXRpbWVyX3Q7CisKKy8qCisgKiBUb3RhbCBudW1iZXIgb2YgY29tcGFyYXRvcnMgaXMgY29tcGFyYXRvcnMvbm9kZSAqIE1BWCBub2Rlcy9ydW5uaW5nIGtlcm5lbAorICovCitzdGF0aWMgbW10aW1lcl90IHRpbWVyc1tOVU1fQ09NUEFSQVRPUlMqTUFYX0NPTVBBQ1RfTk9ERVNdOworCisvKioKKyAqIG1tdGltZXJfaW9jdGwgLSBpb2N0bCBpbnRlcmZhY2UgZm9yIC9kZXYvbW10aW1lcgorICogQGlub2RlOiBpbm9kZSBvZiB0aGUgZGV2aWNlCisgKiBAZmlsZTogZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKyAqIEBjbWQ6IGNvbW1hbmQgdG8gZXhlY3V0ZQorICogQGFyZzogb3B0aW9uYWwgYXJndW1lbnQgdG8gY29tbWFuZAorICoKKyAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kIHNwZWNpZmllZCBieSBAY21kLiAgUmV0dXJucyAwIGZvciBzdWNjZXNzLCA8IDAgZm9yCisgKiBmYWlsdXJlLgorICoKKyAqIFZhbGlkIGNvbW1hbmRzOgorICoKKyAqICVNTVRJTUVSX0dFVE9GRlNFVCAtIFNob3VsZCByZXR1cm4gdGhlIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0CisgKiBvZiB0aGUgcGFnZSB3aGVyZSB0aGUgcmVnaXN0ZXJzIGFyZSBtYXBwZWQpIGZvciB0aGUgY291bnRlciBpbiBxdWVzdGlvbi4KKyAqCisgKiAlTU1USU1FUl9HRVRSRVMgLSBSZXR1cm5zIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9jayBpbiBmZW10byAoMTBeLTE1KQorICogc2Vjb25kcworICoKKyAqICVNTVRJTUVSX0dFVEZSRVEgLSBDb3BpZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY2xvY2sgaW4gSHogdG8gdGhlIGFkZHJlc3MKKyAqIHNwZWNpZmllZCBieSBAYXJnCisgKgorICogJU1NVElNRVJfR0VUQklUUyAtIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjbG9jaydzIGNvdW50ZXIKKyAqCisgKiAlTU1USU1FUl9NTUFQQVZBSUwgLSBSZXR1cm5zIDEgaWYgdGhlIHJlZ2lzdGVycyBjYW4gYmUgbW1hcCdkIGludG8gdXNlcnNwYWNlCisgKgorICogJU1NVElNRVJfR0VUQ09VTlRFUiAtIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIGNvdW50ZXIgYW5kIHBsYWNlcyBpdAorICogaW4gdGhlIGFkZHJlc3Mgc3BlY2lmaWVkIGJ5IEBhcmcuCisgKi8KK3N0YXRpYyBpbnQgbW10aW1lcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNTVRJTUVSX0dFVE9GRlNFVDoJLyogb2Zmc2V0IG9mIHRoZSBjb3VudGVyICovCisJCS8qCisJCSAqIFNOIFJUQyByZWdpc3RlcnMgYXJlIG9uIHRoZWlyIG93biA2NGsgcGFnZQorCQkgKi8KKwkJaWYoUEFHRV9TSVpFIDw9ICgxIDw8IDE2KSkKKwkJCXJldCA9ICgoKGxvbmcpUlRDX0NPVU5URVJfQUREUikgJiAoUEFHRV9TSVpFLTEpKSAvIDg7CisJCWVsc2UKKwkJCXJldCA9IC1FTk9TWVM7CisJCWJyZWFrOworCisJY2FzZSBNTVRJTUVSX0dFVFJFUzogLyogcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2sgaW4gMTBeLTE1IHMgKi8KKwkJaWYoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZywKKwkJCQkmbW10aW1lcl9mZW10b3BlcmlvZCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgTU1USU1FUl9HRVRGUkVROiAvKiBmcmVxdWVuY3kgaW4gSHogKi8KKwkJaWYoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZywKKwkJCQkmc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kLAorCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIE1NVElNRVJfR0VUQklUUzogLyogbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNsb2NrICovCisJCXJldCA9IFJUQ19CSVRTOworCQlicmVhazsKKworCWNhc2UgTU1USU1FUl9NTUFQQVZBSUw6IC8qIGNhbiB3ZSBtbWFwIHRoZSBjbG9jayBpbnRvIHVzZXJzcGFjZT8gKi8KKwkJcmV0ID0gKFBBR0VfU0laRSA8PSAoMSA8PCAxNikpID8gMSA6IDA7CisJCWJyZWFrOworCisJY2FzZSBNTVRJTUVSX0dFVENPVU5URVI6CisJCWlmKGNvcHlfdG9fdXNlcigodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcsCisJCQkJUlRDX0NPVU5URVJfQUREUiwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG1tdGltZXJfbW1hcCAtIG1hcHMgdGhlIGNsb2NrJ3MgcmVnaXN0ZXJzIGludG8gdXNlcnNwYWNlCisgKiBAZmlsZTogZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKyAqIEB2bWE6IFZNQSB0byBtYXAgdGhlIHJlZ2lzdGVycyBpbnRvCisgKgorICogQ2FsbHMgcmVtYXBfcGZuX3JhbmdlKCkgdG8gbWFwIHRoZSBjbG9jaydzIHJlZ2lzdGVycyBpbnRvCisgKiB0aGUgY2FsbGluZyBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLgorICovCitzdGF0aWMgaW50IG1tdGltZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgbG9uZyBtbXRpbWVyX2FkZHI7CisKKwlpZiAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0ICE9IFBBR0VfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKFBBR0VfU0laRSA+ICgxIDw8IDE2KSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX1NITSB8IFZNX0xPQ0tFRCApOworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwltbXRpbWVyX2FkZHIgPSBfX3BhKFJUQ19DT1VOVEVSX0FERFIpOworCW1tdGltZXJfYWRkciAmPSB+KFBBR0VfU0laRSAtIDEpOworCW1tdGltZXJfYWRkciAmPSAweGZmZmZmZmZmZmZmZmZmZlVMOworCisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG1tdGltZXJfYWRkciA+PiBQQUdFX1NISUZULAorCQkJCQlQQUdFX1NJWkUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlwcmludGsoS0VSTl9FUlIgInJlbWFwX3Bmbl9yYW5nZSBmYWlsZWQgaW4gbW10aW1lci5jXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtbXRpbWVyX21pc2NkZXYgPSB7CisJU0dJX01NVElNRVIsCisJTU1USU1FUl9OQU1FLAorCSZtbXRpbWVyX2ZvcHMKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgc2dpX2Nsb2NrX29mZnNldDsKK3N0YXRpYyBpbnQgc2dpX2Nsb2NrX3BlcmlvZDsKKworLyoKKyAqIFBvc2l4IFRpbWVyIEludGVyZmFjZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgc2dpX2Nsb2NrX29mZnNldDsKK3N0YXRpYyBpbnQgc2dpX2Nsb2NrX3BlcmlvZDsKKworc3RhdGljIGludCBzZ2lfY2xvY2tfZ2V0KGNsb2NraWRfdCBjbG9ja2lkLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQoreworCXU2NCBuc2VjOworCisJbnNlYyA9IHJ0Y190aW1lKCkgKiBzZ2lfY2xvY2tfcGVyaW9kCisJCQkrIHNnaV9jbG9ja19vZmZzZXQudHZfbnNlYzsKKwl0cC0+dHZfc2VjID0gZGl2X2xvbmdfbG9uZ19yZW0obnNlYywgTlNFQ19QRVJfU0VDLCAmdHAtPnR2X25zZWMpCisJCQkrIHNnaV9jbG9ja19vZmZzZXQudHZfc2VjOworCXJldHVybiAwOworfTsKKworc3RhdGljIGludCBzZ2lfY2xvY2tfc2V0KGNsb2NraWRfdCBjbG9ja2lkLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQoreworCisJdTY0IG5zZWM7CisJdTY0IHJlbTsKKworCW5zZWMgPSBydGNfdGltZSgpICogc2dpX2Nsb2NrX3BlcmlvZDsKKworCXNnaV9jbG9ja19vZmZzZXQudHZfc2VjID0gdHAtPnR2X3NlYyAtIGRpdl9sb25nX2xvbmdfcmVtKG5zZWMsIE5TRUNfUEVSX1NFQywgJnJlbSk7CisKKwlpZiAocmVtIDw9IHRwLT50dl9uc2VjKQorCQlzZ2lfY2xvY2tfb2Zmc2V0LnR2X25zZWMgPSB0cC0+dHZfc2VjIC0gcmVtOworCWVsc2UgeworCQlzZ2lfY2xvY2tfb2Zmc2V0LnR2X25zZWMgPSB0cC0+dHZfc2VjICsgTlNFQ19QRVJfU0VDIC0gcmVtOworCQlzZ2lfY2xvY2tfb2Zmc2V0LnR2X3NlYy0tOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNjaGVkdWxlIHRoZSBuZXh0IHBlcmlvZGljIGludGVycnVwdC4gVGhpcyBmdW5jdGlvbiB3aWxsIGF0dGVtcHQKKyAqIHRvIHNjaGVkdWxlIGEgcGVyaW9kaWMgaW50ZXJydXB0IGxhdGVyIGlmIG5lY2Vzc2FyeS4gSWYgdGhlIHNjaGVkdWxpbmcKKyAqIG9mIGFuIGludGVycnVwdCBmYWlscyB0aGVuIHRoZSB0aW1lIHRvIHNraXAgaXMgbGVuZ3RoZW5lZAorICogZXhwb25lbnRpYWxseSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgbmV4dCBpbnRlcnJ1cHQKKyAqIGNhbiBiZSBwcm9wZXJseSBzY2hlZHVsZWQuLgorICovCitzdGF0aWMgaW50IGlubGluZSByZXNjaGVkdWxlX3BlcmlvZGljX3RpbWVyKG1tdGltZXJfdCAqeCkKK3sKKwlpbnQgbjsKKwlzdHJ1Y3Qga19pdGltZXIgKnQgPSB4LT50aW1lcjsKKworCXQtPml0Lm1tdGltZXIuY2xvY2sgPSB4LT5pOworCXQtPml0X292ZXJydW4tLTsKKworCW4gPSAwOworCWRvIHsKKworCQl0LT5pdC5tbXRpbWVyLmV4cGlyZXMgKz0gdC0+aXQubW10aW1lci5pbmNyIDw8IG47CisJCXQtPml0X292ZXJydW4gKz0gMSA8PCBuOworCQluKys7CisJCWlmIChuID4gMjApCisJCQlyZXR1cm4gMTsKKworCX0gd2hpbGUgKCFtbXRpbWVyX3NldHVwKHgtPmksIHQtPml0Lm1tdGltZXIuZXhwaXJlcykpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbW10aW1lcl9pbnRlcnJ1cHQgLSB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGlycTogaXJxIHJlY2VpdmVkCisgKiBAZGV2X2lkOiBkZXZpY2UgdGhlIGlycSBjYW1lIGZyb20KKyAqIEByZWdzOiByZWdpc3RlciBzdGF0ZSB1cG9uIHJlY2VpcHQgb2YgdGhlIGludGVycnVwdAorICoKKyAqIENhbGxlZCB3aGVuIG9uZSBvZiB0aGUgY29tYXJhdG9ycyBtYXRjaGVzIHRoZSBjb3VudGVyLCBUaGlzCisgKiByb3V0aW5lIHdpbGwgc2VuZCBzaWduYWxzIHRvIHByb2Nlc3NlcyB0aGF0IGhhdmUgcmVxdWVzdGVkCisgKiB0aGVtLgorICoKKyAqIFRoaXMgaW50ZXJydXB0IGlzIHJ1biBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dAorICogYnkgdGhlIFNIVUIuIEl0IGlzIHRoZXJlZm9yZSBzYWZlIHRvIGxvY2FsbHkgYWNjZXNzIFNIdWIKKyAqIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGlycXJldHVybl90CittbXRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCW1tdGltZXJfdCAqYmFzZSA9IHRpbWVycyArIGNwdWlkX3RvX2Nub2RlaWQoc21wX3Byb2Nlc3Nvcl9pZCgpKSAqCisJCQkJCQlOVU1fQ09NUEFSQVRPUlM7CisJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gMDsKKwlpbnQgcmVzdWx0ID0gSVJRX05PTkU7CisKKwkvKgorCSAqIERvIHRoaXMgb25jZSBmb3IgZWFjaCBjb21wYXJpc29uIHJlZ2lzdGVyCisJICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DT01QQVJBVE9SUzsgaSsrKSB7CisJCS8qIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZ2V0IHJldXNlZCBiZWZvcmUgdGFza2xldF9zY2hlZCAqLworCQlzcGluX2xvY2soJmJhc2VbaV0ubG9jayk7CisJCWlmIChiYXNlW2ldLmNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJCWlmIChiYXNlW2ldLnRpbWVyKQorCQkJCWV4cGlyZXMgPSBiYXNlW2ldLnRpbWVyLT5pdC5tbXRpbWVyLmV4cGlyZXM7CisJCQkvKiBleHBpcmVzIHRlc3Qgd29uJ3Qgd29yayB3aXRoIHNoYXJlZCBpcnFzICovCisJCQlpZiAoKG1tdGltZXJfaW50X3BlbmRpbmcoaSkgPiAwKSB8fAorCQkJCShleHBpcmVzICYmIChleHBpcmVzIDwgcnRjX3RpbWUoKSkpKSB7CisJCQkJbW10aW1lcl9jbHJfaW50X3BlbmRpbmcoaSk7CisJCQkJdGFza2xldF9zY2hlZHVsZSgmYmFzZVtpXS50YXNrbGV0KTsKKwkJCQlyZXN1bHQgPSBJUlFfSEFORExFRDsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9jaygmYmFzZVtpXS5sb2NrKTsKKwkJZXhwaXJlcyA9IDA7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgbW10aW1lcl90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkgeworCW1tdGltZXJfdCAqeCA9IChtbXRpbWVyX3QgKilkYXRhOworCXN0cnVjdCBrX2l0aW1lciAqdCA9IHgtPnRpbWVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBTZW5kIHNpZ25hbCBhbmQgZGVhbCB3aXRoIHBlcmlvZGljIHNpZ25hbHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdC0+aXRfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmeC0+bG9jayk7CisJLyogSWYgdGltZXIgd2FzIGRlbGV0ZWQgYmV0d2VlbiBpbnRlcnJ1cHQgYW5kIGhlcmUsIGxlYXZlICovCisJaWYgKHQgIT0geC0+dGltZXIpCisJCWdvdG8gb3V0OworCXQtPml0X292ZXJydW4gPSAwOworCisJaWYgKHRhc2tsaXN0X2xvY2sud3JpdGVfbG9jayB8fCBwb3NpeF90aW1lcl9ldmVudCh0LCAwKSAhPSAwKSB7CisKKwkJLy8gcHJpbnRrKEtFUk5fV0FSTklORyAibW10aW1lcjogY2Fubm90IGRlbGl2ZXIgc2lnbmFsLlxuIik7CisKKwkJdC0+aXRfb3ZlcnJ1bisrOworCX0KKwlpZih0LT5pdC5tbXRpbWVyLmluY3IpIHsKKwkJLyogUGVyaW9kaWMgdGltZXIgKi8KKwkJaWYgKHJlc2NoZWR1bGVfcGVyaW9kaWNfdGltZXIoeCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1tdGltZXI6IHVuYWJsZSB0byByZXNjaGVkdWxlXG4iKTsKKwkJCXgtPnRpbWVyID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEVuc3VyZSB3ZSBkb24ndCBmYWxzZSB0cmlnZ2VyIGluIG1tdGltZXJfaW50ZXJydXB0ICovCisJCXQtPml0Lm1tdGltZXIuZXhwaXJlcyA9IDA7CisJfQorCXQtPml0X292ZXJydW5fbGFzdCA9IHQtPml0X292ZXJydW47CitvdXQ6CisJc3Bpbl91bmxvY2soJngtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPml0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzZ2lfdGltZXJfY3JlYXRlKHN0cnVjdCBrX2l0aW1lciAqdGltZXIpCit7CisJLyogSW5zdXJlIHRoYXQgYSBuZXdseSBjcmVhdGVkIHRpbWVyIGlzIG9mZiAqLworCXRpbWVyLT5pdC5tbXRpbWVyLmNsb2NrID0gVElNRVJfT0ZGOworCXJldHVybiAwOworfQorCisvKiBUaGlzIGRvZXMgbm90IHJlYWxseSBkZWxldGUgYSB0aW1lci4gSXQganVzdCBpbnN1cmVzCisgKiB0aGF0IHRoZSB0aW1lciBpcyBub3QgYWN0aXZlCisgKgorICogQXNzdW1wdGlvbjogaXRfbG9jayBpcyBhbHJlYWR5IGhlbGQgd2l0aCBpcnEncyBkaXNhYmxlZAorICovCitzdGF0aWMgaW50IHNnaV90aW1lcl9kZWwoc3RydWN0IGtfaXRpbWVyICp0aW1yKQoreworCWludCBpID0gdGltci0+aXQubW10aW1lci5jbG9jazsKKwljbm9kZWlkX3Qgbm9kZWlkID0gdGltci0+aXQubW10aW1lci5ub2RlOworCW1tdGltZXJfdCAqdCA9IHRpbWVycyArIG5vZGVpZCAqIE5VTV9DT01QQVJBVE9SUyAraTsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJaWYgKGkgIT0gVElNRVJfT0ZGKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0LT5sb2NrLCBpcnFmbGFncyk7CisJCW1tdGltZXJfZGlzYWJsZV9pbnQoY25vZGVpZF90b19uYXNpZChub2RlaWQpLGkpOworCQl0LT50aW1lciA9IE5VTEw7CisJCXRpbXItPml0Lm1tdGltZXIuY2xvY2sgPSBUSU1FUl9PRkY7CisJCXRpbXItPml0Lm1tdGltZXIuZXhwaXJlcyA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPmxvY2ssIGlycWZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgdGltZXNwZWNfdG9fbnMoeCkgKCh4KS50dl9uc2VjICsgKHgpLnR2X3NlYyAqIE5TRUNfUEVSX1NFQykKKyNkZWZpbmUgbnNfdG9fdGltZXNwZWModHMsIG5zZWMpICh0cykudHZfc2VjID0gZGl2X2xvbmdfbG9uZ19yZW0obnNlYywgTlNFQ19QRVJfU0VDLCAmKHRzKS50dl9uc2VjKQorCisvKiBBc3N1bXB0aW9uOiBpdF9sb2NrIGlzIGFscmVhZHkgaGVsZCB3aXRoIGlycSdzIGRpc2FibGVkICovCitzdGF0aWMgdm9pZCBzZ2lfdGltZXJfZ2V0KHN0cnVjdCBrX2l0aW1lciAqdGltciwgc3RydWN0IGl0aW1lcnNwZWMgKmN1cl9zZXR0aW5nKQoreworCisJaWYgKHRpbXItPml0Lm1tdGltZXIuY2xvY2sgPT0gVElNRVJfT0ZGKSB7CisJCWN1cl9zZXR0aW5nLT5pdF9pbnRlcnZhbC50dl9uc2VjID0gMDsKKwkJY3VyX3NldHRpbmctPml0X2ludGVydmFsLnR2X3NlYyA9IDA7CisJCWN1cl9zZXR0aW5nLT5pdF92YWx1ZS50dl9uc2VjID0gMDsKKwkJY3VyX3NldHRpbmctPml0X3ZhbHVlLnR2X3NlYyA9MDsKKwkJcmV0dXJuOworCX0KKworCW5zX3RvX3RpbWVzcGVjKGN1cl9zZXR0aW5nLT5pdF9pbnRlcnZhbCwgdGltci0+aXQubW10aW1lci5pbmNyICogc2dpX2Nsb2NrX3BlcmlvZCk7CisJbnNfdG9fdGltZXNwZWMoY3VyX3NldHRpbmctPml0X3ZhbHVlLCAodGltci0+aXQubW10aW1lci5leHBpcmVzIC0gcnRjX3RpbWUoKSkqIHNnaV9jbG9ja19wZXJpb2QpOworCXJldHVybjsKK30KKworCitzdGF0aWMgaW50IHNnaV90aW1lcl9zZXQoc3RydWN0IGtfaXRpbWVyICp0aW1yLCBpbnQgZmxhZ3MsCisJc3RydWN0IGl0aW1lcnNwZWMgKiBuZXdfc2V0dGluZywKKwlzdHJ1Y3QgaXRpbWVyc3BlYyAqIG9sZF9zZXR0aW5nKQoreworCisJaW50IGk7CisJdW5zaWduZWQgbG9uZyB3aGVuLCBwZXJpb2QsIGlycWZsYWdzOworCWludCBlcnIgPSAwOworCWNub2RlaWRfdCBub2RlaWQ7CisJbW10aW1lcl90ICpiYXNlOworCisJaWYgKG9sZF9zZXR0aW5nKQorCQlzZ2lfdGltZXJfZ2V0KHRpbXIsIG9sZF9zZXR0aW5nKTsKKworCXNnaV90aW1lcl9kZWwodGltcik7CisJd2hlbiA9IHRpbWVzcGVjX3RvX25zKG5ld19zZXR0aW5nLT5pdF92YWx1ZSk7CisJcGVyaW9kID0gdGltZXNwZWNfdG9fbnMobmV3X3NldHRpbmctPml0X2ludGVydmFsKTsKKworCWlmICh3aGVuID09IDApCisJCS8qIENsZWFyIHRpbWVyICovCisJCXJldHVybiAwOworCisJaWYgKGZsYWdzICYgVElNRVJfQUJTVElNRSkgeworCQlzdHJ1Y3QgdGltZXNwZWMgbjsKKwkJdW5zaWduZWQgbG9uZyBub3c7CisKKwkJZ2V0bnN0aW1lb2ZkYXkoJm4pOworCQlub3cgPSB0aW1lc3BlY190b19ucyhuKTsKKwkJaWYgKHdoZW4gPiBub3cpCisJCQl3aGVuIC09IG5vdzsKKwkJZWxzZQorCQkJLyogRmlyZSB0aGUgdGltZXIgaW1tZWRpYXRlbHkgKi8KKwkJCXdoZW4gPSAwOworCX0KKworCS8qCisJICogQ29udmVydCB0byBzZ2kgY2xvY2sgcGVyaW9kLiBOZWVkIHRvIGtlZXAgcnRjX3RpbWUoKSBhcyBuZWFyIGFzIHBvc3NpYmxlCisJICogdG8gZ2V0bnN0aW1lb2ZkYXkoKSBpbiBvcmRlciB0byBiZSBhcyBmYWl0aGZ1bCBhcyBwb3NzaWJsZSB0byB0aGUgdGltZQorCSAqIHNwZWNpZmllZC4KKwkgKi8KKwl3aGVuID0gKHdoZW4gKyBzZ2lfY2xvY2tfcGVyaW9kIC0gMSkgLyBzZ2lfY2xvY2tfcGVyaW9kICsgcnRjX3RpbWUoKTsKKwlwZXJpb2QgPSAocGVyaW9kICsgc2dpX2Nsb2NrX3BlcmlvZCAtIDEpICAvIHNnaV9jbG9ja19wZXJpb2Q7CisKKwkvKgorCSAqIFdlIGFyZSBhbGxvY2F0aW5nIGEgbG9jYWwgU0h1YiBjb21wYXJhdG9yLiBJZiB3ZSB3b3VsZCBiZSBtb3ZlZCB0byBhbm90aGVyCisJICogY3B1IHRoZW4gYW5vdGhlciBTSHViIG1heSBiZSBsb2NhbCB0byB1cy4gUHJvaGliaXQgdGhhdCBieSBzd2l0Y2hpbmcgb2ZmCisJICogcHJlZW1wdGlvbi4KKwkgKi8KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCW5vZGVpZCA9ICBjcHVpZF90b19jbm9kZWlkKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJYmFzZSA9IHRpbWVycyArIG5vZGVpZCAqIE5VTV9DT01QQVJBVE9SUzsKK3JldHJ5OgorCS8qIERvbid0IHVzZSBhbiBhbGxvY2F0ZWQgdGltZXIsIG9yIGEgZGVsZXRlZCBvbmUgdGhhdCdzIHBlbmRpbmcgKi8KKwlmb3IoaSA9IDA7IGk8IE5VTV9DT01QQVJBVE9SUzsgaSsrKSB7CisJCWlmICghYmFzZVtpXS50aW1lciAmJiAhYmFzZVtpXS50YXNrbGV0LnN0YXRlKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IE5VTV9DT01QQVJBVE9SUykgeworCQlwcmVlbXB0X2VuYWJsZSgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZiYXNlW2ldLmxvY2ssIGlycWZsYWdzKTsKKworCWlmIChiYXNlW2ldLnRpbWVyIHx8IGJhc2VbaV0udGFza2xldC5zdGF0ZSAhPSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2VbaV0ubG9jaywgaXJxZmxhZ3MpOworCQlnb3RvIHJldHJ5OworCX0KKwliYXNlW2ldLnRpbWVyID0gdGltcjsKKwliYXNlW2ldLmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXRpbXItPml0Lm1tdGltZXIuY2xvY2sgPSBpOworCXRpbXItPml0Lm1tdGltZXIubm9kZSA9IG5vZGVpZDsKKwl0aW1yLT5pdC5tbXRpbWVyLmluY3IgPSBwZXJpb2Q7CisJdGltci0+aXQubW10aW1lci5leHBpcmVzID0gd2hlbjsKKworCWlmIChwZXJpb2QgPT0gMCkgeworCQlpZiAoIW1tdGltZXJfc2V0dXAoaSwgd2hlbikpIHsKKwkJCW1tdGltZXJfZGlzYWJsZV9pbnQoLTEsIGkpOworCQkJcG9zaXhfdGltZXJfZXZlbnQodGltciwgMCk7CisJCQl0aW1yLT5pdC5tbXRpbWVyLmV4cGlyZXMgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJdGltci0+aXQubW10aW1lci5leHBpcmVzIC09IHBlcmlvZDsKKwkJaWYgKHJlc2NoZWR1bGVfcGVyaW9kaWNfdGltZXIoYmFzZStpKSkKKwkJCWVyciA9IC1FSU5WQUw7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZVtpXS5sb2NrLCBpcnFmbGFncyk7CisKKwlwcmVlbXB0X2VuYWJsZSgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBrX2Nsb2NrIHNnaV9jbG9jayA9IHsKKwkucmVzID0gMCwKKwkuY2xvY2tfc2V0ID0gc2dpX2Nsb2NrX3NldCwKKwkuY2xvY2tfZ2V0ID0gc2dpX2Nsb2NrX2dldCwKKwkudGltZXJfY3JlYXRlID0gc2dpX3RpbWVyX2NyZWF0ZSwKKwkubnNsZWVwID0gZG9fcG9zaXhfY2xvY2tfbm9uYW5vc2xlZXAsCisJLnRpbWVyX3NldCA9IHNnaV90aW1lcl9zZXQsCisJLnRpbWVyX2RlbCA9IHNnaV90aW1lcl9kZWwsCisJLnRpbWVyX2dldCA9IHNnaV90aW1lcl9nZXQKK307CisKKy8qKgorICogbW10aW1lcl9pbml0IC0gZGV2aWNlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAqCisgKiBEb2VzIGluaXRpYWwgc2V0dXAgZm9yIHRoZSBtbXRpbWVyIGRldmljZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgbW10aW1lcl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWlmICghaWE2NF9wbGF0Zm9ybV9pcygic24yIikpCisJCXJldHVybiAtMTsKKworCS8qCisJICogU2FuaXR5IGNoZWNrIHRoZSBjeWNsZXMvc2VjIHZhcmlhYmxlCisJICovCisJaWYgKHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCA8IDEwMDAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZGV0ZXJtaW5lIGNsb2NrIGZyZXF1ZW5jeVxuIiwKKwkJICAgICAgIE1NVElNRVJfTkFNRSk7CisJCXJldHVybiAtMTsKKwl9CisKKwltbXRpbWVyX2ZlbXRvcGVyaW9kID0gKCh1bnNpZ25lZCBsb25nKTFFMTUgKyBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQgLworCQkJICAgICAgIDIpIC8gc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kOworCisJZm9yIChpPTA7IGk8IE5VTV9DT01QQVJBVE9SUypNQVhfQ09NUEFDVF9OT0RFUzsgaSsrKSB7CisJCXNwaW5fbG9ja19pbml0KCZ0aW1lcnNbaV0ubG9jayk7CisJCXRpbWVyc1tpXS50aW1lciA9IE5VTEw7CisJCXRpbWVyc1tpXS5jcHUgPSAwOworCQl0aW1lcnNbaV0uaSA9IGkgJSBOVU1fQ09NUEFSQVRPUlM7CisJCXRhc2tsZXRfaW5pdCgmdGltZXJzW2ldLnRhc2tsZXQsIG1tdGltZXJfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpICh0aW1lcnMraSkpOworCX0KKworCWlmIChyZXF1ZXN0X2lycShTR0lfTU1USU1FUl9WRUNUT1IsIG1tdGltZXJfaW50ZXJydXB0LCBTQV9QRVJDUFVfSVJRLCBNTVRJTUVSX05BTUUsIE5VTEwpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0LiIsCisJCQlNTVRJTUVSX05BTUUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RyY3B5KG1tdGltZXJfbWlzY2Rldi5kZXZmc19uYW1lLCBNTVRJTUVSX05BTUUpOworCWlmIChtaXNjX3JlZ2lzdGVyKCZtbXRpbWVyX21pc2NkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2VcbiIsCisJCSAgICAgICBNTVRJTUVSX05BTUUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2dpX2Nsb2NrX3BlcmlvZCA9IHNnaV9jbG9jay5yZXMgPSBOU0VDX1BFUl9TRUMgLyBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQ7CisJcmVnaXN0ZXJfcG9zaXhfY2xvY2soQ0xPQ0tfU0dJX0NZQ0xFLCAmc2dpX2Nsb2NrKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiB2JXMsICVsZCBNSHpcbiIsIE1NVElNRVJfREVTQywgTU1USU1FUl9WRVJTSU9OLAorCSAgICAgICBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQvKHVuc2lnbmVkIGxvbmcpMUU2KTsKKworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChtbXRpbWVyX2luaXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW94YS5jIGIvZHJpdmVycy9jaGFyL21veGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzI0ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL21veGEuYwpAQCAtMCwwICsxLDMyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgICAgICAgICAgbW94YS5jICAtLSBNT1hBIEludGVsbGlvIGZhbWlseSBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAwICBNb3hhIFRlY2hub2xvZ2llcyAoc3VwcG9ydEBtb3hhLmNvbS50dykuCisgKgorICogICAgICBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgTGludXggc2VyaWFsIGRyaXZlciwgd3JpdHRlbiBieQorICogICAgICBMaW51cyBUb3J2YWxkcywgVGhlb2RvcmUgVCdzbyBhbmQgb3RoZXJzLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogICAgTU9YQSBJbnRlbGxpbyBTZXJpZXMgRHJpdmVyCisgKiAgICAgIGZvciAgICAgICAgICAgICA6IExJTlVYCisgKiAgICAgIGRhdGUgICAgICAgICAgICA6IDE5OTkvMS83CisgKiAgICAgIHZlcnNpb24gICAgICAgICA6IDUuMQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUJCU1PWEFfVkVSU0lPTgkJIjUuMWsiCisKKyNkZWZpbmUgTU9YQU1BSk9SICAgICAgIDE3MgorI2RlZmluZSBNT1hBQ1VNQUpPUiAgICAgMTczCisKKyNkZWZpbmUgcHV0X3RvX3VzZXIoYXJnMSwgYXJnMikgcHV0X3VzZXIoYXJnMSwgKHVuc2lnbmVkIGxvbmcgKilhcmcyKQorI2RlZmluZSBnZXRfZnJvbV91c2VyKGFyZzEsIGFyZzIpIGdldF91c2VyKGFyZzEsICh1bnNpZ25lZCBpbnQgKilhcmcyKQorCisjZGVmaW5lIE1BWF9CT0FSRFMgCQk0CS8qIERvbid0IGNoYW5nZSB0aGlzIHZhbHVlICovCisjZGVmaW5lIE1BWF9QT1JUU19QRVJfQk9BUkQJMzIJLyogRG9uJ3QgY2hhbmdlIHRoaXMgdmFsdWUgKi8KKyNkZWZpbmUgTUFYX1BPUlRTIAkJMTI4CS8qIERvbid0IGNoYW5nZSB0aGlzIHZhbHVlICovCisKKy8qCisgKiAgICBEZWZpbmUgdGhlIE1veGEgUENJIHZlbmRvciBhbmQgZGV2aWNlIElEcy4KKyAqLworI2RlZmluZSBNT1hBX0JVU19UWVBFX0lTQQkJMAorI2RlZmluZSBNT1hBX0JVU19UWVBFX1BDSQkJMQorCisjaWZuZGVmCVBDSV9WRU5ET1JfSURfTU9YQQorI2RlZmluZQlQQ0lfVkVORE9SX0lEX01PWEEJMHgxMzkzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DUDIwNEoKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DUDIwNEoJMHgyMDQwCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DMjE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQzIxOAkweDIxODAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0MzMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DMzIwCTB4MzIwMAorI2VuZGlmCisKK2VudW0geworCU1PWEFfQk9BUkRfQzIxOF9QQ0kgPSAxLAorCU1PWEFfQk9BUkRfQzIxOF9JU0EsCisJTU9YQV9CT0FSRF9DMzIwX1BDSSwKKwlNT1hBX0JPQVJEX0MzMjBfSVNBLAorCU1PWEFfQk9BUkRfQ1AyMDRKLAorfTsKKworc3RhdGljIGNoYXIgKm1veGFfYnJkbmFtZVtdID0KK3sKKwkiQzIxOCBUdXJibyBQQ0kgc2VyaWVzIiwKKwkiQzIxOCBUdXJibyBJU0Egc2VyaWVzIiwKKwkiQzMyMCBUdXJibyBQQ0kgc2VyaWVzIiwKKwkiQzMyMCBUdXJibyBJU0Egc2VyaWVzIiwKKwkiQ1AtMjA0SiBzZXJpZXMiLAorfTsKKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtb3hhX3BjaWJyZHNbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9DMjE4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAKKwkgIDAsIDAsIE1PWEFfQk9BUkRfQzIxOF9QQ0kgfSwKKwl7IFBDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9DMzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAKKwkgIDAsIDAsIE1PWEFfQk9BUkRfQzMyMF9QQ0kgfSwKKwl7IFBDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9DUDIwNEosIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIAorCSAgMCwgMCwgTU9YQV9CT0FSRF9DUDIwNEogfSwKKwl7IDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtb3hhX3BjaWJyZHMpOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX21veGFfaXNhX2JvYXJkX2NvbmYgeworCWludCBib2FyZFR5cGU7CisJaW50IG51bVBvcnRzOworCXVuc2lnbmVkIGxvbmcgYmFzZUFkZHI7Cit9IG1veGFfaXNhX2JvYXJkX2NvbmY7CisKK3N0YXRpYyBtb3hhX2lzYV9ib2FyZF9jb25mIG1veGFfaXNhX2JvYXJkc1tdID0KK3sKKy8qICAgICAgIHtNT1hBX0JPQVJEX0MyMThfSVNBLDgsMHhEQzAwMH0sICovCit9OworCit0eXBlZGVmIHN0cnVjdCBfbW94YV9wY2lfZGV2aW5mbyB7CisJdXNob3J0IGJ1c051bTsKKwl1c2hvcnQgZGV2TnVtOworfSBtb3hhX3BjaV9kZXZpbmZvOworCit0eXBlZGVmIHN0cnVjdCBfbW94YV9ib2FyZF9jb25mIHsKKwlpbnQgYm9hcmRUeXBlOworCWludCBudW1Qb3J0czsKKwl1bnNpZ25lZCBsb25nIGJhc2VBZGRyOworCWludCBidXNUeXBlOworCW1veGFfcGNpX2RldmluZm8gcGNpSW5mbzsKK30gbW94YV9ib2FyZF9jb25mOworCitzdGF0aWMgbW94YV9ib2FyZF9jb25mIG1veGFfYm9hcmRzW01BWF9CT0FSRFNdOworc3RhdGljIHZvaWQgX19pb21lbSAqbW94YUJhc2VBZGRyW01BWF9CT0FSRFNdOworCitzdHJ1Y3QgbW94YV9zdHIgeworCWludCB0eXBlOworCWludCBwb3J0OworCWludCBjbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBzaG9ydCBjbG9zaW5nX3dhaXQ7CisJaW50IGNvdW50OworCWludCBibG9ja2VkX29wZW47CisJbG9uZyBldmVudDsgLyogbG9uZyByZXEnZCBmb3Igc2V0X2JpdCAtLVJSICovCisJaW50IGFzeW5jZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBjZmxhZzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgY2xvc2Vfd2FpdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHF1ZXVlOworfTsKKworc3RydWN0IG14c2VyX21zdGF0dXMgeworCXRjZmxhZ190IGNmbGFnOworCWludCBjdHM7CisJaW50IGRzcjsKKwlpbnQgcmk7CisJaW50IGRjZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfbXN0YXR1cyBHTVN0YXR1c1tNQVhfUE9SVFNdOworCisvKiBzdGF0dXNmbGFncyAqLworI2RlZmluZSBUWFNUT1BQRUQJMHgxCisjZGVmaW5lIExPV1dBSVQgCTB4MgorI2RlZmluZSBFTVBUWVdBSVQJMHg0CisjZGVmaW5lIFRIUk9UVExFCTB4OAorCisvKiBldmVudCAqLworI2RlZmluZSBNT1hBX0VWRU5UX0hBTkdVUAkxCisKKyNkZWZpbmUgU0VSSUFMX0RPX1JFU1RBUlQKKworCisjZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTAkxCisKKyNkZWZpbmUgV0FLRVVQX0NIQVJTCQkyNTYKKworI2RlZmluZSBQT1JUTk8oeCkJCSgoeCktPmluZGV4KQorCitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworc3RhdGljIGludCB0dHltYWpvciA9IE1PWEFNQUpPUjsKKy8qIFZhcmlhYmxlcyBmb3IgaW5zbW9kICovCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IGJhc2VhZGRyW10gCT0gCXswLCAwLCAwLCAwfTsKK3N0YXRpYyBpbnQgdHlwZVtdCT0JezAsIDAsIDAsIDB9Oworc3RhdGljIGludCBudW1wb3J0c1tdIAk9CXswLCAwLCAwLCAwfTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJXaWxsaWFtIENoZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTU9YQSBJbnRlbGxpbyBGYW1pbHkgTXVsdGlwb3J0IEJvYXJkIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpZmRlZiBNT0RVTEUKK21vZHVsZV9wYXJhbV9hcnJheSh0eXBlLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGJhc2VhZGRyLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG51bXBvcnRzLCBpbnQsIE5VTEwsIDApOworI2VuZGlmCittb2R1bGVfcGFyYW0odHR5bWFqb3IsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odmVyYm9zZSwgYm9vbCwgMDY0NCk7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqbW94YURyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgbW94YV9zdHIgbW94YUNoYW5uZWxzW01BWF9QT1JUU107CitzdGF0aWMgdW5zaWduZWQgY2hhciAqbW94YVhtaXRCdWZmOworc3RhdGljIGludCBtb3hhVGltZXJfb247CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbW94YVRpbWVyOworc3RhdGljIGludCBtb3hhRW1wdHlUaW1lcl9vbltNQVhfUE9SVFNdOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IG1veGFFbXB0eVRpbWVyW01BWF9QT1JUU107CitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBtb3hhQnVmZlNlbTsKKworLyoKKyAqIHN0YXRpYyBmdW5jdGlvbnM6CisgKi8KK3N0YXRpYyB2b2lkIGRvX21veGFfc29mdGludCh2b2lkICopOworc3RhdGljIGludCBtb3hhX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBtb3hhX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBtb3hhX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgbW94YV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbW94YV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IG1veGFfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbW94YV9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG1veGFfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgaW50IG1veGFfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIG1veGFfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBtb3hhX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBtb3hhX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCB0ZXJtaW9zICopOworc3RhdGljIHZvaWQgbW94YV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbW94YV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG1veGFfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIGludCBtb3hhX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgbW94YV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpOworc3RhdGljIHZvaWQgbW94YV9wb2xsKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2V0X3R0eV9wYXJhbShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgYmxvY2tfdGlsbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLAorCQkJICAgIHN0cnVjdCBtb3hhX3N0ciAqKTsKK3N0YXRpYyB2b2lkIHNldHVwX2VtcHR5X2V2ZW50KHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgY2hlY2tfeG1pdF9lbXB0eSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHNodXRfZG93bihzdHJ1Y3QgbW94YV9zdHIgKik7CitzdGF0aWMgdm9pZCByZWNlaXZlX2RhdGEoc3RydWN0IG1veGFfc3RyICopOworLyoKKyAqIG1veGEgYm9hcmQgaW50ZXJmYWNlIGZ1bmN0aW9uczoKKyAqLworc3RhdGljIHZvaWQgTW94YURyaXZlckluaXQodm9pZCk7CitzdGF0aWMgaW50IE1veGFEcml2ZXJJb2N0bCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcsIGludCk7CitzdGF0aWMgaW50IE1veGFEcml2ZXJQb2xsKHZvaWQpOworc3RhdGljIGludCBNb3hhUG9ydHNPZkNhcmQoaW50KTsKK3N0YXRpYyBpbnQgTW94YVBvcnRJc1ZhbGlkKGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydEVuYWJsZShpbnQpOworc3RhdGljIHZvaWQgTW94YVBvcnREaXNhYmxlKGludCk7CitzdGF0aWMgbG9uZyBNb3hhUG9ydEdldE1heEJhdWQoaW50KTsKK3N0YXRpYyBsb25nIE1veGFQb3J0U2V0QmF1ZChpbnQsIGxvbmcpOworc3RhdGljIGludCBNb3hhUG9ydFNldFRlcm1pbyhpbnQsIHN0cnVjdCB0ZXJtaW9zICopOworc3RhdGljIGludCBNb3hhUG9ydEdldExpbmVPdXQoaW50LCBpbnQgKiwgaW50ICopOworc3RhdGljIHZvaWQgTW94YVBvcnRMaW5lQ3RybChpbnQsIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIE1veGFQb3J0Rmxvd0N0cmwoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0TGluZVN0YXR1cyhpbnQpOworc3RhdGljIGludCBNb3hhUG9ydERDRENoYW5nZShpbnQpOworc3RhdGljIGludCBNb3hhUG9ydERDRE9OKGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydEZsdXNoRGF0YShpbnQsIGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0V3JpdGVEYXRhKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBNb3hhUG9ydFJlYWREYXRhKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBNb3hhUG9ydFR4UXVldWUoaW50KTsKK3N0YXRpYyBpbnQgTW94YVBvcnRSeFF1ZXVlKGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0VHhGcmVlKGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydFR4RGlzYWJsZShpbnQpOworc3RhdGljIHZvaWQgTW94YVBvcnRUeEVuYWJsZShpbnQpOworc3RhdGljIGludCBNb3hhUG9ydFJlc2V0QnJrQ250KGludCk7CitzdGF0aWMgdm9pZCBNb3hhUG9ydFNlbmRCcmVhayhpbnQsIGludCk7CitzdGF0aWMgaW50IG1veGFfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBtb3hhX3N0ciAqLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKik7CitzdGF0aWMgaW50IG1veGFfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBtb3hhX3N0ciAqLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKik7CitzdGF0aWMgdm9pZCBNb3hhU2V0RmlmbyhpbnQgcG9ydCwgaW50IGVuYWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgbW94YV9vcHMgPSB7CisJLm9wZW4gPSBtb3hhX29wZW4sCisJLmNsb3NlID0gbW94YV9jbG9zZSwKKwkud3JpdGUgPSBtb3hhX3dyaXRlLAorCS53cml0ZV9yb29tID0gbW94YV93cml0ZV9yb29tLAorCS5mbHVzaF9idWZmZXIgPSBtb3hhX2ZsdXNoX2J1ZmZlciwKKwkuY2hhcnNfaW5fYnVmZmVyID0gbW94YV9jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2NoYXJzID0gbW94YV9mbHVzaF9jaGFycywKKwkucHV0X2NoYXIgPSBtb3hhX3B1dF9jaGFyLAorCS5pb2N0bCA9IG1veGFfaW9jdGwsCisJLnRocm90dGxlID0gbW94YV90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IG1veGFfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MgPSBtb3hhX3NldF90ZXJtaW9zLAorCS5zdG9wID0gbW94YV9zdG9wLAorCS5zdGFydCA9IG1veGFfc3RhcnQsCisJLmhhbmd1cCA9IG1veGFfaGFuZ3VwLAorCS50aW9jbWdldCA9IG1veGFfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gbW94YV90aW9jbXNldCwKK307CisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IG1veGFfZ2V0X1BDSV9jb25mKHN0cnVjdCBwY2lfZGV2ICpwLCBpbnQgYm9hcmRfdHlwZSwgbW94YV9ib2FyZF9jb25mICogYm9hcmQpCit7CisJYm9hcmQtPmJhc2VBZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwLCAyKTsKKwlib2FyZC0+Ym9hcmRUeXBlID0gYm9hcmRfdHlwZTsKKwlzd2l0Y2ggKGJvYXJkX3R5cGUpIHsKKwljYXNlIE1PWEFfQk9BUkRfQzIxOF9JU0E6CisJY2FzZSBNT1hBX0JPQVJEX0MyMThfUENJOgorCQlib2FyZC0+bnVtUG9ydHMgPSA4OworCQlicmVhazsKKworCWNhc2UgTU9YQV9CT0FSRF9DUDIwNEo6CisJCWJvYXJkLT5udW1Qb3J0cyA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJvYXJkLT5udW1Qb3J0cyA9IDA7CisJCWJyZWFrOworCX0KKwlib2FyZC0+YnVzVHlwZSA9IE1PWEFfQlVTX1RZUEVfUENJOworCWJvYXJkLT5wY2lJbmZvLmJ1c051bSA9IHAtPmJ1cy0+bnVtYmVyOworCWJvYXJkLT5wY2lJbmZvLmRldk51bSA9IHAtPmRldmZuID4+IDM7CisKKwlyZXR1cm4gKDApOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworc3RhdGljIGludCBfX2luaXQgbW94YV9pbml0KHZvaWQpCit7CisJaW50IGksIG51bUJvYXJkczsKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCisJcHJpbnRrKEtFUk5fSU5GTyAiTU9YQSBJbnRlbGxpbyBmYW1pbHkgZHJpdmVyIHZlcnNpb24gJXNcbiIsIE1PWEFfVkVSU0lPTik7CisJbW94YURyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX1BPUlRTICsgMSk7CisJaWYgKCFtb3hhRHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRfTVVURVgoJm1veGFCdWZmU2VtKTsKKwltb3hhRHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCW1veGFEcml2ZXItPm5hbWUgPSAidHR5YSI7CisJbW94YURyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ0dHMvYSI7CisJbW94YURyaXZlci0+bWFqb3IgPSB0dHltYWpvcjsKKwltb3hhRHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJbW94YURyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJbW94YURyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJbW94YURyaXZlci0+aW5pdF90ZXJtaW9zLmNfaWZsYWcgPSAwOworCW1veGFEcml2ZXItPmluaXRfdGVybWlvcy5jX29mbGFnID0gMDsKKwltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBDTE9DQUwgfCBIVVBDTDsKKwltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MuY19sZmxhZyA9IDA7CisJbW94YURyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhtb3hhRHJpdmVyLCAmbW94YV9vcHMpOworCisJbW94YVhtaXRCdWZmID0gTlVMTDsKKworCWZvciAoaSA9IDAsIGNoID0gbW94YUNoYW5uZWxzOyBpIDwgTUFYX1BPUlRTOyBpKyssIGNoKyspIHsKKwkJY2gtPnR5cGUgPSBQT1JUXzE2NTUwQTsKKwkJY2gtPnBvcnQgPSBpOworCQlJTklUX1dPUksoJmNoLT50cXVldWUsIGRvX21veGFfc29mdGludCwgY2gpOworCQljaC0+dHR5ID0gTlVMTDsKKwkJY2gtPmNsb3NlX2RlbGF5ID0gNSAqIEhaIC8gMTA7CisJCWNoLT5jbG9zaW5nX3dhaXQgPSAzMCAqIEhaOworCQljaC0+Y291bnQgPSAwOworCQljaC0+YmxvY2tlZF9vcGVuID0gMDsKKwkJY2gtPmNmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IENMT0NBTCB8IEhVUENMOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNsb3NlX3dhaXQpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkRTOyBpKyspIHsKKwkJbW94YV9ib2FyZHNbaV0uYm9hcmRUeXBlID0gMDsKKwkJbW94YV9ib2FyZHNbaV0ubnVtUG9ydHMgPSAwOworCQltb3hhX2JvYXJkc1tpXS5iYXNlQWRkciA9IDA7CisJCW1veGFfYm9hcmRzW2ldLmJ1c1R5cGUgPSAwOworCQltb3hhX2JvYXJkc1tpXS5wY2lJbmZvLmJ1c051bSA9IDA7CisJCW1veGFfYm9hcmRzW2ldLnBjaUluZm8uZGV2TnVtID0gMDsKKwl9CisJTW94YURyaXZlckluaXQoKTsKKwlwcmludGsoIlR0eSBkZXZpY2VzIG1ham9yIG51bWJlciA9ICVkXG4iLCB0dHltYWpvcik7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihtb3hhRHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGluc3RhbGwgTU9YQSBTbWFydGlvIGZhbWlseSBkcml2ZXIgIVxuIik7CisJCXB1dF90dHlfZHJpdmVyKG1veGFEcml2ZXIpOworCQlyZXR1cm4gLTE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfUE9SVFM7IGkrKykgeworCQlpbml0X3RpbWVyKCZtb3hhRW1wdHlUaW1lcltpXSk7CisJCW1veGFFbXB0eVRpbWVyW2ldLmZ1bmN0aW9uID0gY2hlY2tfeG1pdF9lbXB0eTsKKwkJbW94YUVtcHR5VGltZXJbaV0uZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmIG1veGFDaGFubmVsc1tpXTsKKwkJbW94YUVtcHR5VGltZXJfb25baV0gPSAwOworCX0KKworCWluaXRfdGltZXIoJm1veGFUaW1lcik7CisJbW94YVRpbWVyLmZ1bmN0aW9uID0gbW94YV9wb2xsOworCW1veGFUaW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDUwKTsKKwltb3hhVGltZXJfb24gPSAxOworCWFkZF90aW1lcigmbW94YVRpbWVyKTsKKworCS8qIEZpbmQgdGhlIGJvYXJkcyBkZWZpbmVkIGluIHNvdXJjZSBjb2RlICovCisJbnVtQm9hcmRzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEUzsgaSsrKSB7CisJCWlmICgobW94YV9pc2FfYm9hcmRzW2ldLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MyMThfSVNBKSB8fAorCQkgKG1veGFfaXNhX2JvYXJkc1tpXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX0lTQSkpIHsKKwkJCW1veGFfYm9hcmRzW251bUJvYXJkc10uYm9hcmRUeXBlID0gbW94YV9pc2FfYm9hcmRzW2ldLmJvYXJkVHlwZTsKKwkJCWlmIChtb3hhX2lzYV9ib2FyZHNbaV0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzIxOF9JU0EpCisJCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5udW1Qb3J0cyA9IDg7CisJCQllbHNlCisJCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5udW1Qb3J0cyA9IG1veGFfaXNhX2JvYXJkc1tpXS5udW1Qb3J0czsKKwkJCW1veGFfYm9hcmRzW251bUJvYXJkc10uYnVzVHlwZSA9IE1PWEFfQlVTX1RZUEVfSVNBOworCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5iYXNlQWRkciA9IG1veGFfaXNhX2JvYXJkc1tpXS5iYXNlQWRkcjsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50aygiQm9hcmQgJTJkOiAlcyBib2FyZChiYXNlQWRkcj0lbHgpXG4iLAorCQkJCSAgICAgICBudW1Cb2FyZHMgKyAxLAorCQkJCSAgICAgICBtb3hhX2JyZG5hbWVbbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5ib2FyZFR5cGUgLSAxXSwKKwkJCQkgICAgICAgbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5iYXNlQWRkcik7CisJCQludW1Cb2FyZHMrKzsKKwkJfQorCX0KKwkvKiBGaW5kIHRoZSBib2FyZHMgZGVmaW5lZCBmb3JtIG1vZHVsZSBhcmdzLiAqLworI2lmZGVmIE1PRFVMRQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkRTOyBpKyspIHsKKwkJaWYgKCh0eXBlW2ldID09IE1PWEFfQk9BUkRfQzIxOF9JU0EpIHx8CisJCSAgICAodHlwZVtpXSA9PSBNT1hBX0JPQVJEX0MzMjBfSVNBKSkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJcHJpbnRrKCJCb2FyZCAlMmQ6ICVzIGJvYXJkKGJhc2VBZGRyPSVseClcbiIsCisJCQkJICAgICAgIG51bUJvYXJkcyArIDEsCisJCQkJICAgICAgIG1veGFfYnJkbmFtZVt0eXBlW2ldIC0gMV0sCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBiYXNlYWRkcltpXSk7CisJCQlpZiAobnVtQm9hcmRzID49IE1BWF9CT0FSRFMpIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJpbnRrKCJNb3JlIHRoYW4gJWQgTU9YQSBJbnRlbGxpbyBmYW1pbHkgYm9hcmRzIGZvdW5kLiBCb2FyZCBpcyBpZ25vcmVkLiIsIE1BWF9CT0FSRFMpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbW94YV9ib2FyZHNbbnVtQm9hcmRzXS5ib2FyZFR5cGUgPSB0eXBlW2ldOworCQkJaWYgKG1veGFfaXNhX2JvYXJkc1tpXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMjE4X0lTQSkKKwkJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLm51bVBvcnRzID0gODsKKwkJCWVsc2UKKwkJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLm51bVBvcnRzID0gbnVtcG9ydHNbaV07CisJCQltb3hhX2JvYXJkc1tudW1Cb2FyZHNdLmJ1c1R5cGUgPSBNT1hBX0JVU19UWVBFX0lTQTsKKwkJCW1veGFfYm9hcmRzW251bUJvYXJkc10uYmFzZUFkZHIgPSBiYXNlYWRkcltpXTsKKwkJCW51bUJvYXJkcysrOworCQl9CisJfQorI2VuZGlmCisJLyogRmluZCBQQ0kgYm9hcmRzIGhlcmUgKi8KKyNpZmRlZiBDT05GSUdfUENJCisJeworCQlzdHJ1Y3QgcGNpX2RldiAqcCA9IE5VTEw7CisJCWludCBuID0gKHNpemVvZihtb3hhX3BjaWJyZHMpIC8gc2l6ZW9mKG1veGFfcGNpYnJkc1swXSkpIC0gMTsKKwkJaSA9IDA7CisJCXdoaWxlIChpIDwgbikgeworCQkJd2hpbGUgKChwID0gcGNpX2ZpbmRfZGV2aWNlKG1veGFfcGNpYnJkc1tpXS52ZW5kb3IsIG1veGFfcGNpYnJkc1tpXS5kZXZpY2UsIHApKSE9TlVMTCkKKwkJCXsKKwkJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocCkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChudW1Cb2FyZHMgPj0gTUFYX0JPQVJEUykgeworCQkJCQlpZiAodmVyYm9zZSkKKwkJCQkJCXByaW50aygiTW9yZSB0aGFuICVkIE1PWEEgSW50ZWxsaW8gZmFtaWx5IGJvYXJkcyBmb3VuZC4gQm9hcmQgaXMgaWdub3JlZC4iLCBNQVhfQk9BUkRTKTsKKwkJCQl9IGVsc2UgeworCQkJCQltb3hhX2dldF9QQ0lfY29uZihwLCBtb3hhX3BjaWJyZHNbaV0uZHJpdmVyX2RhdGEsCisJCQkJCQkmbW94YV9ib2FyZHNbbnVtQm9hcmRzXSk7CisJCQkJCW51bUJvYXJkcysrOworCQkJCX0KKwkJCX0KKwkJCWkrKzsKKwkJfQorCX0KKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBudW1Cb2FyZHM7IGkrKykgeworCQltb3hhQmFzZUFkZHJbaV0gPSBpb3JlbWFwKCh1bnNpZ25lZCBsb25nKSBtb3hhX2JvYXJkc1tpXS5iYXNlQWRkciwgMHg0MDAwKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbW94YV9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKCJVbmxvYWRpbmcgbW9kdWxlIG1veGEgLi4uXG4iKTsKKworCWlmIChtb3hhVGltZXJfb24pCisJCWRlbF90aW1lcigmbW94YVRpbWVyKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUE9SVFM7IGkrKykKKwkJaWYgKG1veGFFbXB0eVRpbWVyX29uW2ldKQorCQkJZGVsX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltpXSk7CisKKwlpZiAodHR5X3VucmVnaXN0ZXJfZHJpdmVyKG1veGFEcml2ZXIpKQorCQlwcmludGsoIkNvdWxkbid0IHVucmVnaXN0ZXIgTU9YQSBJbnRlbGxpbyBmYW1pbHkgc2VyaWFsIGRyaXZlclxuIik7CisJcHV0X3R0eV9kcml2ZXIobW94YURyaXZlcik7CisJaWYgKHZlcmJvc2UpCisJCXByaW50aygiRG9uZVxuIik7Cit9CisKK21vZHVsZV9pbml0KG1veGFfaW5pdCk7Cittb2R1bGVfZXhpdChtb3hhX2V4aXQpOworCitzdGF0aWMgdm9pZCBkb19tb3hhX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgcHJpdmF0ZV87CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCWlmIChjaCAmJiAodHR5ID0gY2gtPnR0eSkpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNT1hBX0VWRU5UX0hBTkdVUCwgJmNoLT5ldmVudCkpIHsKKwkJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAtIEFLUE0gKi8KKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7CisJCQljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBtb3hhX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKwlpbnQgcG9ydDsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKworCXBvcnQgPSBQT1JUTk8odHR5KTsKKwlpZiAocG9ydCA9PSBNQVhfUE9SVFMpIHsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKCFNb3hhUG9ydElzVmFsaWQocG9ydCkpIHsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCWRvd24oJm1veGFCdWZmU2VtKTsKKwlpZiAoIW1veGFYbWl0QnVmZikgeworCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXBhZ2UpIHsKKwkJCXVwKCZtb3hhQnVmZlNlbSk7CisJCQlyZXR1cm4gKC1FTk9NRU0pOworCQl9CisJCS8qIFRoaXMgdGVzdCBpcyBndWFyZGVkIGJ5IHRoZSBCdWZmU2VtIHNvIG5vIGxvbmdlciBuZWVkZWQKKwkJICAgZGVsZXRlIG1lIGluIDIuNSAqLworCQlpZiAobW94YVhtaXRCdWZmKQorCQkJZnJlZV9wYWdlKHBhZ2UpOworCQllbHNlCisJCQltb3hhWG1pdEJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCX0KKwl1cCgmbW94YUJ1ZmZTZW0pOworCisJY2ggPSAmbW94YUNoYW5uZWxzW3BvcnRdOworCWNoLT5jb3VudCsrOworCXR0eS0+ZHJpdmVyX2RhdGEgPSBjaDsKKwljaC0+dHR5ID0gdHR5OworCWlmICghKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCWNoLT5zdGF0dXNmbGFncyA9IDA7CisJCXNldF90dHlfcGFyYW0odHR5KTsKKwkJTW94YVBvcnRMaW5lQ3RybChjaC0+cG9ydCwgMSwgMSk7CisJCU1veGFQb3J0RW5hYmxlKGNoLT5wb3J0KTsKKwkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJfQorCXJldHZhbCA9IGJsb2NrX3RpbGxfcmVhZHkodHR5LCBmaWxwLCBjaCk7CisKKwltb3hhX3VudGhyb3R0bGUodHR5KTsKKworCWlmIChjaC0+dHlwZSA9PSBQT1JUXzE2NTUwQSkgeworCQlNb3hhU2V0RmlmbyhjaC0+cG9ydCwgMSk7CisJfSBlbHNlIHsKKwkJTW94YVNldEZpZm8oY2gtPnBvcnQsIDApOworCX0KKworCXJldHVybiAocmV0dmFsKTsKK30KKworc3RhdGljIHZvaWQgbW94YV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCWludCBwb3J0OworCisJcG9ydCA9IFBPUlROTyh0dHkpOworCWlmIChwb3J0ID09IE1BWF9QT1JUUykgeworCQlyZXR1cm47CisJfQorCWlmICghTW94YVBvcnRJc1ZhbGlkKHBvcnQpKSB7CisjaWZkZWYgU0VSSUFMX0RFQlVHX0NMT1NFCisJCXByaW50aygiSW52YWxpZCBwb3J0bm8gaW4gbW94YV9jbG9zZVxuIik7CisjZW5kaWYKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJaWYgKHR0eS0+ZHJpdmVyX2RhdGEgPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCXJldHVybjsKKwl9CisJY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGNoLT5jb3VudCAhPSAxKSkgeworCQlwcmludGsoIm1veGFfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiY2gtPmNvdW50IGlzICVkXG4iLCBjaC0+Y291bnQpOworCQljaC0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1jaC0+Y291bnQgPCAwKSB7CisJCXByaW50aygibW94YV9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50LCBkZXZpY2U9JXNcbiIsCisJCSAgICAgICB0dHktPm5hbWUpOworCQljaC0+Y291bnQgPSAwOworCX0KKwlpZiAoY2gtPmNvdW50KSB7CisJCXJldHVybjsKKwl9CisJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKworCWNoLT5jZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlzZXR1cF9lbXB0eV9ldmVudCh0dHkpOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMzAgKiBIWik7CS8qIDMwIHNlY29uZHMgdGltZW91dCAqLworCQltb3hhRW1wdHlUaW1lcl9vbltjaC0+cG9ydF0gPSAwOworCQlkZWxfdGltZXIoJm1veGFFbXB0eVRpbWVyW2NoLT5wb3J0XSk7CisJfQorCXNodXRfZG93bihjaCk7CisJTW94YVBvcnRGbHVzaERhdGEocG9ydCwgMik7CisKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCQkJCisJdHR5LT5jbG9zaW5nID0gMDsKKwljaC0+ZXZlbnQgPSAwOworCWNoLT50dHkgPSBOVUxMOworCWlmIChjaC0+YmxvY2tlZF9vcGVuKSB7CisJCWlmIChjaC0+Y2xvc2VfZGVsYXkpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2gtPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKKwl9CisJY2gtPmFzeW5jZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFIHwgQVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2xvc2Vfd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoOworCWludCBsZW4sIHBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChjaCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCXBvcnQgPSBjaC0+cG9ydDsKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlsZW4gPSBNb3hhUG9ydFdyaXRlRGF0YShwb3J0LCAodW5zaWduZWQgY2hhciAqKSBidWYsIGNvdW50KTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlpZiAoICEoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgJiYKKwkgICAgICgobGVuICE9IGNvdW50KSB8fCAoTW94YVBvcnRUeEZyZWUocG9ydCkgPD0gMTAwKSkgKQorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwljaC0+c3RhdHVzZmxhZ3MgfD0gTE9XV0FJVDsKKwlyZXR1cm4gKGxlbik7Cit9CisKK3N0YXRpYyBpbnQgbW94YV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKworCWlmICh0dHktPnN0b3BwZWQpCisJCXJldHVybiAoMCk7CisJY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKGNoID09IE5VTEwpCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChNb3hhUG9ydFR4RnJlZShjaC0+cG9ydCkpOworfQorCitzdGF0aWMgdm9pZCBtb3hhX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCU1veGFQb3J0Rmx1c2hEYXRhKGNoLT5wb3J0LCAxKTsKKwl0dHlfd2FrZXVwKHR0eSk7Cit9CisKK3N0YXRpYyBpbnQgbW94YV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQgY2hhcnM7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCS8qCisJICogU2lnaC4uLkkgaGF2ZSB0byBjaGVjayBpZiBkcml2ZXJfZGF0YSBpcyBOVUxMIGhlcmUsIGJlY2F1c2UKKwkgKiBpZiBhbiBvcGVuKCkgZmFpbHMsIHRoZSBUVFkgc3Vic3lzdGVtIGV2ZW50dWFsbHkgY2FsbHMKKwkgKiB0dHlfd2FpdF91bnRpbF9zZW50KCksIHdoaWNoIGNhbGxzIHRoZSBkcml2ZXIncyBjaGFyc19pbl9idWZmZXIoKQorCSAqIHJvdXRpbmUuICBBbmQgc2luY2UgdGhlIG9wZW4oKSBmYWlsZWQsIHdlIHJldHVybiAwIGhlcmUuICBUREoKKwkgKi8KKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwljaGFycyA9IE1veGFQb3J0VHhRdWV1ZShjaC0+cG9ydCk7CisJaWYgKGNoYXJzKSB7CisJCS8qCisJCSAqIE1ha2UgaXQgcG9zc2libGUgdG8gd2FrZXVwIGFueXRoaW5nIHdhaXRpbmcgZm9yIG91dHB1dAorCQkgKiBpbiB0dHlfaW9jdGwuYywgZXRjLgorCQkgKi8KKwkJaWYgKCEoY2gtPnN0YXR1c2ZsYWdzICYgRU1QVFlXQUlUKSkKKwkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSk7CisJfQorCXJldHVybiAoY2hhcnMpOworfQorCitzdGF0aWMgdm9pZCBtb3hhX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJLyoKKwkgKiBEb24ndCB0aGluayBJIG5lZWQgdGhpcywgYmVjYXVzZSB0aGlzIGlzIGNhbGxlZCB0byBlbXB0eSB0aGUgVFgKKwkgKiBidWZmZXIgZm9yIHRoZSAxNjQ1MCwgMTY1NTAsIGV0Yy4KKwkgKi8KK30KKworc3RhdGljIHZvaWQgbW94YV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGMpCit7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKwlpbnQgcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKGNoID09IE5VTEwpCisJCXJldHVybjsKKwlwb3J0ID0gY2gtPnBvcnQ7CisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJbW94YVhtaXRCdWZmWzBdID0gYzsKKwlNb3hhUG9ydFdyaXRlRGF0YShwb3J0LCBtb3hhWG1pdEJ1ZmYsIDEpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlpZiAoICEoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgJiYgKE1veGFQb3J0VHhGcmVlKHBvcnQpIDw9IDEwMCkgKQorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJY2gtPnN0YXR1c2ZsYWdzIHw9IExPV1dBSVQ7Cit9CisKK3N0YXRpYyBpbnQgbW94YV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCBwb3J0OworCWludCBmbGFnID0gMCwgZHRyLCBydHM7CisKKwlwb3J0ID0gUE9SVE5PKHR0eSk7CisJaWYgKChwb3J0ICE9IE1BWF9QT1JUUykgJiYgKCFjaCkpCisJCXJldHVybiAoLUVJTlZBTCk7CisKKwlNb3hhUG9ydEdldExpbmVPdXQoY2gtPnBvcnQsICZkdHIsICZydHMpOworCWlmIChkdHIpCisJCWZsYWcgfD0gVElPQ01fRFRSOworCWlmIChydHMpCisJCWZsYWcgfD0gVElPQ01fUlRTOworCWR0ciA9IE1veGFQb3J0TGluZVN0YXR1cyhjaC0+cG9ydCk7CisJaWYgKGR0ciAmIDEpCisJCWZsYWcgfD0gVElPQ01fQ1RTOworCWlmIChkdHIgJiAyKQorCQlmbGFnIHw9IFRJT0NNX0RTUjsKKwlpZiAoZHRyICYgNCkKKwkJZmxhZyB8PSBUSU9DTV9DRDsKKwlyZXR1cm4gZmxhZzsKK30KKworc3RhdGljIGludCBtb3hhX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCBwb3J0OworCWludCBkdHIsIHJ0czsKKworCXBvcnQgPSBQT1JUTk8odHR5KTsKKwlpZiAoKHBvcnQgIT0gTUFYX1BPUlRTKSAmJiAoIWNoKSkKKwkJcmV0dXJuICgtRUlOVkFMKTsKKworCU1veGFQb3J0R2V0TGluZU91dChjaC0+cG9ydCwgJmR0ciwgJnJ0cyk7CisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJcnRzID0gMTsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlkdHIgPSAxOworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJcnRzID0gMDsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWR0ciA9IDA7CisJTW94YVBvcnRMaW5lQ3RybChjaC0+cG9ydCwgZHRyLCBydHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1veGFfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJcmVnaXN0ZXIgaW50IHBvcnQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IHJldHZhbDsKKworCXBvcnQgPSBQT1JUTk8odHR5KTsKKwlpZiAoKHBvcnQgIT0gTUFYX1BPUlRTKSAmJiAoIWNoKSkKKwkJcmV0dXJuICgtRUlOVkFMKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUQ1NCUks6CQkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIChyZXR2YWwpOworCQlzZXR1cF9lbXB0eV9ldmVudCh0dHkpOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCWlmICghYXJnKQorCQkJTW94YVBvcnRTZW5kQnJlYWsoY2gtPnBvcnQsIDApOworCQlyZXR1cm4gKDApOworCWNhc2UgVENTQlJLUDoJCS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIChyZXR2YWwpOworCQlzZXR1cF9lbXB0eV9ldmVudCh0dHkpOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCU1veGFQb3J0U2VuZEJyZWFrKGNoLT5wb3J0LCBhcmcpOworCQlyZXR1cm4gKDApOworCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCQlyZXR1cm4gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCk7CisJY2FzZSBUSU9DU1NPRlRDQVI6CisJCWlmKGdldF91c2VyKHJldHZhbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWFyZyA9IHJldHZhbDsKKwkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkJCSAoYXJnID8gQ0xPQ0FMIDogMCkpOworCQlpZiAoQ19DTE9DQUwodHR5KSkKKwkJCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKKwkJZWxzZQorCQkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJCXJldHVybiAoMCk7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmV0dXJuIG1veGFfZ2V0X3NlcmlhbF9pbmZvKGNoLCBhcmdwKTsKKworCWNhc2UgVElPQ1NTRVJJQUw6CisJCXJldHVybiBtb3hhX3NldF9zZXJpYWxfaW5mbyhjaCwgYXJncCk7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gTW94YURyaXZlcklvY3RsKGNtZCwgYXJnLCBwb3J0KTsKKwl9CisJcmV0dXJuIChyZXR2YWwpOworfQorCitzdGF0aWMgdm9pZCBtb3hhX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWNoLT5zdGF0dXNmbGFncyB8PSBUSFJPVFRMRTsKK30KKworc3RhdGljIHZvaWQgbW94YV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWNoLT5zdGF0dXNmbGFncyAmPSB+VEhST1RUTEU7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSAgICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCXNldF90dHlfcGFyYW0odHR5KTsKKwlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgJiYKKwkgICAgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoY2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCU1veGFQb3J0VHhEaXNhYmxlKGNoLT5wb3J0KTsKKwljaC0+c3RhdHVzZmxhZ3MgfD0gVFhTVE9QUEVEOworfQorCisKK3N0YXRpYyB2b2lkIG1veGFfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKGNoID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICghKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkpCisJCXJldHVybjsKKworCU1veGFQb3J0VHhFbmFibGUoY2gtPnBvcnQpOworCWNoLT5zdGF0dXNmbGFncyAmPSB+VFhTVE9QUEVEOworfQorCitzdGF0aWMgdm9pZCBtb3hhX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBtb3hhX3N0ciAqY2ggPSAoc3RydWN0IG1veGFfc3RyICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwltb3hhX2ZsdXNoX2J1ZmZlcih0dHkpOworCXNodXRfZG93bihjaCk7CisJY2gtPmV2ZW50ID0gMDsKKwljaC0+Y291bnQgPSAwOworCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCWNoLT50dHkgPSBOVUxMOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1veGFfcG9sbCh1bnNpZ25lZCBsb25nIGlnbm9yZWQpCit7CisJcmVnaXN0ZXIgaW50IGNhcmQ7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHA7CisJaW50IGksIHBvcnRzOworCisJbW94YVRpbWVyX29uID0gMDsKKwlkZWxfdGltZXIoJm1veGFUaW1lcik7CisKKwlpZiAoTW94YURyaXZlclBvbGwoKSA8IDApIHsKKwkJbW94YVRpbWVyLmZ1bmN0aW9uID0gbW94YV9wb2xsOworCQltb3hhVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyA1MCk7CisJCW1veGFUaW1lcl9vbiA9IDE7CisJCWFkZF90aW1lcigmbW94YVRpbWVyKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgTUFYX0JPQVJEUzsgY2FyZCsrKSB7CisJCWlmICgocG9ydHMgPSBNb3hhUG9ydHNPZkNhcmQoY2FyZCkpIDw9IDApCisJCQljb250aW51ZTsKKwkJY2ggPSAmbW94YUNoYW5uZWxzW2NhcmQgKiBNQVhfUE9SVFNfUEVSX0JPQVJEXTsKKwkJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyssIGNoKyspIHsKKwkJCWlmICgoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghKGNoLT5zdGF0dXNmbGFncyAmIFRIUk9UVExFKSAmJgorCQkJICAgIChNb3hhUG9ydFJ4UXVldWUoY2gtPnBvcnQpID4gMCkpCisJCQkJcmVjZWl2ZV9kYXRhKGNoKTsKKwkJCWlmICgodHAgPSBjaC0+dHR5KSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpIHsKKwkJCQlpZiAoTW94YVBvcnRUeFF1ZXVlKGNoLT5wb3J0KSA8PSBXQUtFVVBfQ0hBUlMpIHsKKwkJCQkJaWYgKCF0cC0+c3RvcHBlZCkgeworCQkJCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5MT1dXQUlUOworCQkJCQkJdHR5X3dha2V1cCh0cCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIUlfSUdOQlJLKHRwKSAmJiAoTW94YVBvcnRSZXNldEJya0NudChjaC0+cG9ydCkgPiAwKSkgeworCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHRwLCAwLCBUVFlfQlJFQUspOworCQkJCXR0eV9zY2hlZHVsZV9mbGlwKHRwKTsKKwkJCX0KKwkJCWlmIChNb3hhUG9ydERDRENoYW5nZShjaC0+cG9ydCkpIHsKKwkJCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgeworCQkJCQlpZiAoTW94YVBvcnREQ0RPTihjaC0+cG9ydCkpCisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5vcGVuX3dhaXQpOworCQkJCQllbHNlIHsKKwkJCQkJCXNldF9iaXQoTU9YQV9FVkVOVF9IQU5HVVAsICZjaC0+ZXZlbnQpOworCQkJCQkJc2NoZWR1bGVfd29yaygmY2gtPnRxdWV1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwltb3hhVGltZXIuZnVuY3Rpb24gPSBtb3hhX3BvbGw7CisJbW94YVRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gNTApOworCW1veGFUaW1lcl9vbiA9IDE7CisJYWRkX3RpbWVyKCZtb3hhVGltZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzZXRfdHR5X3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmVnaXN0ZXIgc3RydWN0IHRlcm1pb3MgKnRzOworCXN0cnVjdCBtb3hhX3N0ciAqY2g7CisJaW50IHJ0cywgY3RzLCB0eGZsb3csIHJ4ZmxvdywgeGFueTsKKworCWNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOworCXRzID0gdHR5LT50ZXJtaW9zOworCWlmICh0cy0+Y19jZmxhZyAmIENMT0NBTCkKKwkJY2gtPmFzeW5jZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCWVsc2UKKwkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJcnRzID0gY3RzID0gdHhmbG93ID0gcnhmbG93ID0geGFueSA9IDA7CisJaWYgKHRzLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJcnRzID0gY3RzID0gMTsKKwlpZiAodHMtPmNfaWZsYWcgJiBJWE9OKQorCQl0eGZsb3cgPSAxOworCWlmICh0cy0+Y19pZmxhZyAmIElYT0ZGKQorCQlyeGZsb3cgPSAxOworCWlmICh0cy0+Y19pZmxhZyAmIElYQU5ZKQorCQl4YW55ID0gMTsKKwlNb3hhUG9ydEZsb3dDdHJsKGNoLT5wb3J0LCBydHMsIGN0cywgdHhmbG93LCByeGZsb3csIHhhbnkpOworCU1veGFQb3J0U2V0VGVybWlvKGNoLT5wb3J0LCB0cyk7Cit9CisKK3N0YXRpYyBpbnQgYmxvY2tfdGlsbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICBzdHJ1Y3QgbW94YV9zdHIgKmNoKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCWludCBkb19jbG9jYWwgPSBDX0NMT0NBTCh0dHkpOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCisJICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCisJICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKKwkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmNoLT5jbG9zZV93YWl0KTsKKyNpZmRlZiBTRVJJQUxfRE9fUkVTVEFSVAorCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJcmV0dXJuICgtRUFHQUlOKTsKKwkJZWxzZQorCQkJcmV0dXJuICgtRVJFU1RBUlRTWVMpOworI2Vsc2UKKwkJcmV0dXJuICgtRUFHQUlOKTsKKyNlbmRpZgorCX0KKwkvKgorCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udAorCSAqIGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAoMCk7CisJfQorCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUgZnJlZQorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmNoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jazogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAorCSAgICAgICBjaC0+bGluZSwgY2gtPmNvdW50KTsKKyNlbmRpZgorCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJY2gtPmNvdW50LS07CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJY2gtPmJsb2NrZWRfb3BlbisrOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCSAgICAhKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisjaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKKwkJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisjZWxzZQorCQkJcmV0dmFsID0gLUVBR0FJTjsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJiAoZG9fY2xvY2FsIHx8CisJCQkJCQlNb3hhUG9ydERDRE9OKGNoLT5wb3J0KSkpCisJCQlicmVhazsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmNoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCWNoLT5jb3VudCsrOworCWNoLT5ibG9ja2VkX29wZW4tLTsKKyNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgorCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCisJICAgICAgIGNoLT5saW5lLCBjaC0+Y291bnQpOworI2VuZGlmCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIChyZXR2YWwpOworCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZW1wdHlfZXZlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisJY2gtPnN0YXR1c2ZsYWdzIHw9IEVNUFRZV0FJVDsKKwltb3hhRW1wdHlUaW1lcl9vbltjaC0+cG9ydF0gPSAwOworCWRlbF90aW1lcigmbW94YUVtcHR5VGltZXJbY2gtPnBvcnRdKTsKKwltb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0uZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwltb3hhRW1wdHlUaW1lcl9vbltjaC0+cG9ydF0gPSAxOworCWFkZF90aW1lcigmbW94YUVtcHR5VGltZXJbY2gtPnBvcnRdKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfeG1pdF9lbXB0eSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG1veGFfc3RyICpjaDsKKworCWNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSBkYXRhOworCW1veGFFbXB0eVRpbWVyX29uW2NoLT5wb3J0XSA9IDA7CisJZGVsX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0pOworCWlmIChjaC0+dHR5ICYmIChjaC0+c3RhdHVzZmxhZ3MgJiBFTVBUWVdBSVQpKSB7CisJCWlmIChNb3hhUG9ydFR4UXVldWUoY2gtPnBvcnQpID09IDApIHsKKwkJCWNoLT5zdGF0dXNmbGFncyAmPSB+RU1QVFlXQUlUOworCQkJdHR5X3dha2V1cChjaC0+dHR5KTsKKwkJCXJldHVybjsKKwkJfQorCQltb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0uZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJbW94YUVtcHR5VGltZXJfb25bY2gtPnBvcnRdID0gMTsKKwkJYWRkX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0pOworCX0gZWxzZQorCQljaC0+c3RhdHVzZmxhZ3MgJj0gfkVNUFRZV0FJVDsKK30KKworc3RhdGljIHZvaWQgc2h1dF9kb3duKHN0cnVjdCBtb3hhX3N0ciAqY2gpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnRwOworCisJaWYgKCEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybjsKKworCXRwID0gY2gtPnR0eTsKKworCU1veGFQb3J0RGlzYWJsZShjaC0+cG9ydCk7CisKKwkvKgorCSAqIElmIHdlJ3JlIGEgbW9kZW0gY29udHJvbCBkZXZpY2UgYW5kIEhVUENMIGlzIG9uLCBkcm9wIFJUUyAmIERUUi4KKwkgKi8KKwlpZiAodHAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkKKwkJTW94YVBvcnRMaW5lQ3RybChjaC0+cG9ydCwgMCwgMCk7CisKKwljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlY2VpdmVfZGF0YShzdHJ1Y3QgbW94YV9zdHIgKmNoKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0cDsKKwlzdHJ1Y3QgdGVybWlvcyAqdHM7CisJaW50IGksIGNvdW50LCByYywgc3BhY2U7CisJdW5zaWduZWQgY2hhciAqY2hhcnB0ciwgKmZsYWdwdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRzID0gTlVMTDsKKwl0cCA9IGNoLT50dHk7CisJaWYgKHRwKQorCQl0cyA9IHRwLT50ZXJtaW9zOworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCWlmICggIXRwIHx8ICF0cyB8fCAhKHRzLT5jX2NmbGFnICYgQ1JFQUQpICkgeworCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWlmICghdHAgfHwgIXRzKSB7CisJCU1veGFQb3J0Rmx1c2hEYXRhKGNoLT5wb3J0LCAwKTsKKwkJcmV0dXJuOworCX0KKwlzcGFjZSA9IFRUWV9GTElQQlVGX1NJWkUgLSB0cC0+ZmxpcC5jb3VudDsKKwlpZiAoc3BhY2UgPD0gMCkKKwkJcmV0dXJuOworCWNoYXJwdHIgPSB0cC0+ZmxpcC5jaGFyX2J1Zl9wdHI7CisJZmxhZ3B0ciA9IHRwLT5mbGlwLmZsYWdfYnVmX3B0cjsKKwlyYyA9IHRwLT5mbGlwLmNvdW50OworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWNvdW50ID0gTW94YVBvcnRSZWFkRGF0YShjaC0+cG9ydCwgY2hhcnB0ciwgc3BhY2UpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkqZmxhZ3B0cisrID0gMDsKKwljaGFycHRyICs9IGNvdW50OworCXJjICs9IGNvdW50OworCXRwLT5mbGlwLmNvdW50ID0gcmM7CisJdHAtPmZsaXAuY2hhcl9idWZfcHRyID0gY2hhcnB0cjsKKwl0cC0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBmbGFncHRyOworCXR0eV9zY2hlZHVsZV9mbGlwKGNoLT50dHkpOworfQorCisjZGVmaW5lIE1hZ2ljX2NvZGUJMHg0MDQKKworLyoKKyAqICAgIFN5c3RlbSBDb25maWd1cmF0aW9uCisgKi8KKy8qCisgKiAgICBmb3IgQzIxOCBCSU9TIGluaXRpYWxpemF0aW9uCisgKi8KKyNkZWZpbmUgQzIxOF9Db25mQmFzZQkweDgwMAorI2RlZmluZSBDMjE4X3N0YXR1cwkoQzIxOF9Db25mQmFzZSArIDApCS8qIEJJT1MgcnVubmluZyBzdGF0dXMgICAgKi8KKyNkZWZpbmUgQzIxOF9kaWFnCShDMjE4X0NvbmZCYXNlICsgMikJLyogZGlhZ25vc3RpYyBzdGF0dXMgICAgICAqLworI2RlZmluZSBDMjE4X2tleQkoQzIxOF9Db25mQmFzZSArIDQpCS8qIFdPUkQgKDB4MjE4IGZvciBDMjE4KSAqLworI2RlZmluZSBDMjE4RExvYWRfbGVuCShDMjE4X0NvbmZCYXNlICsgNikJLyogV09SRCAgICAgICAgICAgKi8KKyNkZWZpbmUgQzIxOGNoZWNrX3N1bQkoQzIxOF9Db25mQmFzZSArIDgpCS8qIEJZVEUgICAgICAgICAgICovCisjZGVmaW5lIEMyMThjaGtzdW1fb2sJKEMyMThfQ29uZkJhc2UgKyAweDBhKQkvKiBCWVRFICgxOm9rKSAgICAgICAgICAgICovCisjZGVmaW5lIEMyMThfVGVzdFJ4CShDMjE4X0NvbmZCYXNlICsgMHgxMCkJLyogOCBieXRlcyBmb3IgOCBwb3J0cyAgICAqLworI2RlZmluZSBDMjE4X1Rlc3RUeAkoQzIxOF9Db25mQmFzZSArIDB4MTgpCS8qIDggYnl0ZXMgZm9yIDggcG9ydHMgICAgKi8KKyNkZWZpbmUgQzIxOF9SWGVycgkoQzIxOF9Db25mQmFzZSArIDB4MjApCS8qIDggYnl0ZXMgZm9yIDggcG9ydHMgICAgKi8KKyNkZWZpbmUgQzIxOF9FcnJGbGFnCShDMjE4X0NvbmZCYXNlICsgMHgyOCkJLyogOCBieXRlcyBmb3IgOCBwb3J0cyAgICAqLworCisjZGVmaW5lIEMyMThfTG9hZEJ1ZgkweDBGMDAKKyNkZWZpbmUgQzIxOF9LZXlDb2RlCTB4MjE4CisjZGVmaW5lIENQMjA0Sl9LZXlDb2RlCTB4MjA0CisKKy8qCisgKiAgICBmb3IgQzMyMCBCSU9TIGluaXRpYWxpemF0aW9uCisgKi8KKyNkZWZpbmUgQzMyMF9Db25mQmFzZQkweDgwMAorI2RlZmluZSBDMzIwX0xvYWRCdWYJMHgwZjAwCisjZGVmaW5lIFNUU19pbml0CTB4MDUJLyogZm9yIEMzMjBfc3RhdHVzICAgICAgICAqLworCisjZGVmaW5lIEMzMjBfc3RhdHVzCUMzMjBfQ29uZkJhc2UgKyAwCS8qIEJJT1MgcnVubmluZyBzdGF0dXMgICAgKi8KKyNkZWZpbmUgQzMyMF9kaWFnCUMzMjBfQ29uZkJhc2UgKyAyCS8qIGRpYWdub3N0aWMgc3RhdHVzICAgICAgKi8KKyNkZWZpbmUgQzMyMF9rZXkJQzMyMF9Db25mQmFzZSArIDQJLyogV09SRCAoMDMyMEggZm9yIEMzMjApICovCisjZGVmaW5lIEMzMjBETG9hZF9sZW4JQzMyMF9Db25mQmFzZSArIDYJLyogV09SRCAgICAgICAgICAgKi8KKyNkZWZpbmUgQzMyMGNoZWNrX3N1bQlDMzIwX0NvbmZCYXNlICsgOAkvKiBXT1JEICAgICAgICAgICAqLworI2RlZmluZSBDMzIwY2hrc3VtX29rCUMzMjBfQ29uZkJhc2UgKyAweDBhCS8qIFdPUkQgKDE6b2spICAgICAgICAgICAgKi8KKyNkZWZpbmUgQzMyMGJhcGlfbGVuCUMzMjBfQ29uZkJhc2UgKyAweDBjCS8qIFdPUkQgICAgICAgICAgICovCisjZGVmaW5lIEMzMjBVQVJUX25vCUMzMjBfQ29uZkJhc2UgKyAweDBlCS8qIFdPUkQgICAgICAgICAgICovCisKKyNkZWZpbmUgQzMyMF9LZXlDb2RlCTB4MzIwCisKKyNkZWZpbmUgRml4UGFnZV9hZGRyCTB4MDAwMAkvKiBzdGFydGluZyBhZGRyIG9mIHN0YXRpYyBwYWdlICAqLworI2RlZmluZSBEeW5QYWdlX2FkZHIJMHgyMDAwCS8qIHN0YXJ0aW5nIGFkZHIgb2YgZHluYW1pYyBwYWdlICovCisjZGVmaW5lIEMyMThfc3RhcnQJMHgzMDAwCS8qIHN0YXJ0aW5nIGFkZHIgb2YgQzIxOCBCSU9TIHByZyAqLworI2RlZmluZSBDb250cm9sX3JlZwkweDFmZjAJLyogc2VsZWN0IHBhZ2UgYW5kIHJlc2V0IGNvbnRyb2wgKi8KKyNkZWZpbmUgSFdfcmVzZXQJMHg4MAorCisvKgorICogICAgRnVuY3Rpb24gQ29kZXMKKyAqLworI2RlZmluZSBGQ19DYXJkUmVzZXQJMHg4MAorI2RlZmluZSBGQ19DaGFubmVsUmVzZXQgMQkvKiBDMzIwIGZpcm13YXJlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRkNfRW5hYmxlQ0gJMgorI2RlZmluZSBGQ19EaXNhYmxlQ0gJMworI2RlZmluZSBGQ19TZXRQYXJhbQk0CisjZGVmaW5lIEZDX1NldE1vZGUJNQorI2RlZmluZSBGQ19TZXRSYXRlCTYKKyNkZWZpbmUgRkNfTGluZUNvbnRyb2wJNworI2RlZmluZSBGQ19MaW5lU3RhdHVzCTgKKyNkZWZpbmUgRkNfWG1pdENvbnRyb2wJOQorI2RlZmluZSBGQ19GbHVzaFF1ZXVlCTEwCisjZGVmaW5lIEZDX1NlbmRCcmVhawkxMQorI2RlZmluZSBGQ19TdG9wQnJlYWsJMTIKKyNkZWZpbmUgRkNfTG9vcGJhY2tPTgkxMworI2RlZmluZSBGQ19Mb29wYmFja09GRgkxNAorI2RlZmluZSBGQ19DbHJJcnFUYWJsZQkxNQorI2RlZmluZSBGQ19TZW5kWG9uCTE2CisjZGVmaW5lIEZDX1NldFRlcm1JcnEJMTcJLyogQzMyMCBmaXJtd2FyZSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEZDX1NldENudElycQkxOAkvKiBDMzIwIGZpcm13YXJlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRkNfU2V0QnJlYWtJcnEJMTkKKyNkZWZpbmUgRkNfU2V0TGluZUlycQkyMAorI2RlZmluZSBGQ19TZXRGbG93Q3RsCTIxCisjZGVmaW5lIEZDX0dlbklycQkyMgorI2RlZmluZSBGQ19JbkNEMTgwCTIzCisjZGVmaW5lIEZDX091dENEMTgwCTI0CisjZGVmaW5lIEZDX0luVUFSVHJlZwkyMworI2RlZmluZSBGQ19PdXRVQVJUcmVnCTI0CisjZGVmaW5lIEZDX1NldFhvblhvZmYJMjUKKyNkZWZpbmUgRkNfT3V0Q0QxODBDQ1IJMjYKKyNkZWZpbmUgRkNfRXh0SVF1ZXVlCTI3CisjZGVmaW5lIEZDX0V4dE9RdWV1ZQkyOAorI2RlZmluZSBGQ19DbHJMaW5lSXJxCTI5CisjZGVmaW5lIEZDX0hXRmxvd0N0bAkzMAorI2RlZmluZSBGQ19HZXRDbG9ja1JhdGUgMzUKKyNkZWZpbmUgRkNfU2V0QmF1ZAkzNgorI2RlZmluZSBGQ19TZXREYXRhTW9kZSAgNDEKKyNkZWZpbmUgRkNfR2V0Q0NTUiAgICAgIDQzCisjZGVmaW5lIEZDX0dldERhdGFFcnJvciA0NQorI2RlZmluZSBGQ19SeENvbnRyb2wJNTAKKyNkZWZpbmUgRkNfSW1tU2VuZAk1MQorI2RlZmluZSBGQ19TZXRYb25TdGF0ZQk1MgorI2RlZmluZSBGQ19TZXRYb2ZmU3RhdGUJNTMKKyNkZWZpbmUgRkNfU2V0UnhGSUZPVHJpZyA1NAorI2RlZmluZSBGQ19TZXRUeEZJRk9DbnQgNTUKKyNkZWZpbmUgRkNfVW5peFJhdGUJNTYKKyNkZWZpbmUgRkNfVW5peFJlc2V0VGltZXIgNTcKKworI2RlZmluZQlSeEZJRk9UcmlnMQkwCisjZGVmaW5lCVJ4RklGT1RyaWc0CTEKKyNkZWZpbmUJUnhGSUZPVHJpZzgJMgorI2RlZmluZQlSeEZJRk9UcmlnMTQJMworCisvKgorICogICAgRHVhbC1Qb3J0ZWQgUkFNCisgKi8KKyNkZWZpbmUgRFJBTV9nbG9iYWwJMAorI2RlZmluZSBJTlRfZGF0YQkoRFJBTV9nbG9iYWwgKyAwKQorI2RlZmluZSBDb25maWdfYmFzZQkoRFJBTV9nbG9iYWwgKyAweDEwOCkKKworI2RlZmluZSBJUlFpbmRleAkoSU5UX2RhdGEgKyAwKQorI2RlZmluZSBJUlFwZW5kaW5nCShJTlRfZGF0YSArIDQpCisjZGVmaW5lIElSUXRhYmxlCShJTlRfZGF0YSArIDgpCisKKy8qCisgKiAgICBJbnRlcnJ1cHQgU3RhdHVzCisgKi8KKyNkZWZpbmUgSW50clJ4CQkweDAxCS8qIHJlY2VpdmVyIGRhdGEgTy5LLiAgICAgICAgICAgICAqLworI2RlZmluZSBJbnRyVHgJCTB4MDIJLyogdHJhbnNtaXQgYnVmZmVyIGVtcHR5ICAqLworI2RlZmluZSBJbnRyRnVuYwkweDA0CS8qIGZ1bmN0aW9uIGNvbXBsZXRlICAgICAgICAgICAgICAqLworI2RlZmluZSBJbnRyQnJlYWsJMHgwOAkvKiByZWNlaXZlZCBicmVhayAgICAgICAgICovCisjZGVmaW5lIEludHJMaW5lCTB4MTAJLyogbGluZSBzdGF0dXMgY2hhbmdlCisJCQkJICAgZm9yIHRyYW5zbWl0dGVyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEludHJJbnRyCTB4MjAJLyogcmVjZWl2ZWQgSU5UUiBjb2RlICAgICAgICAgICAgICovCisjZGVmaW5lIEludHJRdWl0CTB4NDAJLyogcmVjZWl2ZWQgUVVJVCBjb2RlICAgICAgICAgICAgICovCisjZGVmaW5lIEludHJFT0YgCTB4ODAJLyogcmVjZWl2ZWQgRU9GIGNvZGUgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgSW50clJ4VHJpZ2dlciAJMHgxMDAJLyogcnggZGF0YSBjb3VudCByZWFjaCB0aWdnZXIgdmFsdWUgKi8KKyNkZWZpbmUgSW50clR4VHJpZ2dlciAJMHgyMDAJLyogdHggZGF0YSBjb3VudCBiZWxvdyB0cmlnZ2VyIHZhbHVlICovCisKKyNkZWZpbmUgTWFnaWNfbm8JKENvbmZpZ19iYXNlICsgMCkKKyNkZWZpbmUgQ2FyZF9tb2RlbF9ubwkoQ29uZmlnX2Jhc2UgKyAyKQorI2RlZmluZSBUb3RhbF9wb3J0cwkoQ29uZmlnX2Jhc2UgKyA0KQorI2RlZmluZSBNb2R1bGVfY250CShDb25maWdfYmFzZSArIDgpCisjZGVmaW5lIE1vZHVsZV9ubwkoQ29uZmlnX2Jhc2UgKyAxMCkKKyNkZWZpbmUgVGltZXJfMTBtcwkoQ29uZmlnX2Jhc2UgKyAxNCkKKyNkZWZpbmUgRGlzYWJsZV9JUlEJKENvbmZpZ19iYXNlICsgMjApCisjZGVmaW5lIFRNUzMyMF9QT1JUMQkoQ29uZmlnX2Jhc2UgKyAyMikKKyNkZWZpbmUgVE1TMzIwX1BPUlQyCShDb25maWdfYmFzZSArIDI0KQorI2RlZmluZSBUTVMzMjBfQ0xPQ0sJKENvbmZpZ19iYXNlICsgMjYpCisKKy8qCisgKiAgICBEQVRBIEJVRkZFUiBpbiBEUkFNCisgKi8KKyNkZWZpbmUgRXh0ZXJuX3RhYmxlCTB4NDAwCS8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgZXh0ZXJuYWwgdGFibGUKKwkJCQkgICAoMjQgd29yZHMgKiAgICA2NCkgdG90YWwgM0sgYnl0ZXMKKwkJCQkgICAoMjQgd29yZHMgKiAxMjgpIHRvdGFsIDZLIGJ5dGVzICovCisjZGVmaW5lIEV4dGVybl9zaXplCTB4NjAJLyogOTYgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJYcnB0cgkJMHgwMAkvKiByZWFkIHBvaW50ZXIgZm9yIFJYIGJ1ZmZlciAgICAgKi8KKyNkZWZpbmUgUlh3cHRyCQkweDAyCS8qIHdyaXRlIHBvaW50ZXIgZm9yIFJYIGJ1ZmZlciAgICAqLworI2RlZmluZSBUWHJwdHIJCTB4MDQJLyogcmVhZCBwb2ludGVyIGZvciBUWCBidWZmZXIgICAgICovCisjZGVmaW5lIFRYd3B0cgkJMHgwNgkvKiB3cml0ZSBwb2ludGVyIGZvciBUWCBidWZmZXIgICAgKi8KKyNkZWZpbmUgSG9zdFN0YXQJMHgwOAkvKiBJUlEgZmxhZyBhbmQgZ2VuZXJhbCBmbGFnICAgICAgKi8KKyNkZWZpbmUgRmxhZ1N0YXQJMHgwQQorI2RlZmluZSBGbG93Q29udHJvbAkweDBDCS8qIEI3IEI2IEI1IEI0IEIzIEIyIEIxIEIwICAgICAgICAgICAgICAqLworCQkJCQkvKiAgeCAgeCAgeCAgeCAgfCAgfCAgfCAgfCAgICAgICAgICAgICovCisJCQkJCS8qICAgICAgICAgICAgICB8ICB8ICB8ICArIENUUyBmbG93ICAgKi8KKwkJCQkJLyogICAgICAgICAgICAgIHwgIHwgICstLS0gUlRTIGZsb3cgICAqLworCQkJCQkvKiAgICAgICAgICAgICAgfCAgKy0tLS0tLSBUWCBYb24vWG9mZiAqLworCQkJCQkvKiAgICAgICAgICAgICAgKy0tLS0tLS0tLSBSWCBYb24vWG9mZiAqLworI2RlZmluZSBCcmVha19jbnQJMHgwRQkvKiByZWNlaXZlZCBicmVhayBjb3VudCAgICovCisjZGVmaW5lIENEMTgwVFhpcnEJMHgxMAkvKiBpZiBub24tMDogZW5hYmxlIFRYIGlycSAgICAgICAgKi8KKyNkZWZpbmUgUlhfbWFzayAJMHgxMgorI2RlZmluZSBUWF9tYXNrIAkweDE0CisjZGVmaW5lIE9mc19yeGIgCTB4MTYKKyNkZWZpbmUgT2ZzX3R4YiAJMHgxOAorI2RlZmluZSBQYWdlX3J4YgkweDFBCisjZGVmaW5lIFBhZ2VfdHhiCTB4MUMKKyNkZWZpbmUgRW5kUGFnZV9yeGIJMHgxRQorI2RlZmluZSBFbmRQYWdlX3R4YgkweDIwCisjZGVmaW5lIERhdGFfZXJyb3IJMHgyMgorI2RlZmluZSBSeFRyaWdnZXIJMHgyOAorI2RlZmluZSBUeFRyaWdnZXIJMHgyYQorCisjZGVmaW5lIHJSWHdwdHIgCTB4MzQKKyNkZWZpbmUgTG93X3dhdGVyCTB4MzYKKworI2RlZmluZSBGdW5jQ29kZQkweDQwCisjZGVmaW5lIEZ1bmNBcmcgCTB4NDIKKyNkZWZpbmUgRnVuY0FyZzEJMHg0NAorCisjZGVmaW5lIEMyMThyeF9zaXplCTB4MjAwMAkvKiA4SyBieXRlcyAqLworI2RlZmluZSBDMjE4dHhfc2l6ZQkweDgwMDAJLyogMzJLIGJ5dGVzICovCisKKyNkZWZpbmUgQzIxOHJ4X21hc2sJKEMyMThyeF9zaXplIC0gMSkKKyNkZWZpbmUgQzIxOHR4X21hc2sJKEMyMTh0eF9zaXplIC0gMSkKKworI2RlZmluZSBDMzIwcDhyeF9zaXplCTB4MjAwMAorI2RlZmluZSBDMzIwcDh0eF9zaXplCTB4ODAwMAorI2RlZmluZSBDMzIwcDhyeF9tYXNrCShDMzIwcDhyeF9zaXplIC0gMSkKKyNkZWZpbmUgQzMyMHA4dHhfbWFzawkoQzMyMHA4dHhfc2l6ZSAtIDEpCisKKyNkZWZpbmUgQzMyMHAxNnJ4X3NpemUJMHgyMDAwCisjZGVmaW5lIEMzMjBwMTZ0eF9zaXplCTB4NDAwMAorI2RlZmluZSBDMzIwcDE2cnhfbWFzawkoQzMyMHAxNnJ4X3NpemUgLSAxKQorI2RlZmluZSBDMzIwcDE2dHhfbWFzawkoQzMyMHAxNnR4X3NpemUgLSAxKQorCisjZGVmaW5lIEMzMjBwMjRyeF9zaXplCTB4MjAwMAorI2RlZmluZSBDMzIwcDI0dHhfc2l6ZQkweDIwMDAKKyNkZWZpbmUgQzMyMHAyNHJ4X21hc2sJKEMzMjBwMjRyeF9zaXplIC0gMSkKKyNkZWZpbmUgQzMyMHAyNHR4X21hc2sJKEMzMjBwMjR0eF9zaXplIC0gMSkKKworI2RlZmluZSBDMzIwcDMycnhfc2l6ZQkweDEwMDAKKyNkZWZpbmUgQzMyMHAzMnR4X3NpemUJMHgxMDAwCisjZGVmaW5lIEMzMjBwMzJyeF9tYXNrCShDMzIwcDMycnhfc2l6ZSAtIDEpCisjZGVmaW5lIEMzMjBwMzJ0eF9tYXNrCShDMzIwcDMydHhfc2l6ZSAtIDEpCisKKyNkZWZpbmUgUGFnZV9zaXplCTB4MjAwMAorI2RlZmluZSBQYWdlX21hc2sJKFBhZ2Vfc2l6ZSAtIDEpCisjZGVmaW5lIEMyMThyeF9zcGFnZQkzCisjZGVmaW5lIEMyMTh0eF9zcGFnZQk0CisjZGVmaW5lIEMyMThyeF9wYWdlbm8JMQorI2RlZmluZSBDMjE4dHhfcGFnZW5vCTQKKyNkZWZpbmUgQzIxOGJ1Zl9wYWdlbm8JNQorCisjZGVmaW5lIEMzMjBwOHJ4X3NwYWdlCTMKKyNkZWZpbmUgQzMyMHA4dHhfc3BhZ2UJNAorI2RlZmluZSBDMzIwcDhyeF9wZ25vCTEKKyNkZWZpbmUgQzMyMHA4dHhfcGdubwk0CisjZGVmaW5lIEMzMjBwOGJ1Zl9wZ25vCTUKKworI2RlZmluZSBDMzIwcDE2cnhfc3BhZ2UgMworI2RlZmluZSBDMzIwcDE2dHhfc3BhZ2UgNAorI2RlZmluZSBDMzIwcDE2cnhfcGdubwkxCisjZGVmaW5lIEMzMjBwMTZ0eF9wZ25vCTIKKyNkZWZpbmUgQzMyMHAxNmJ1Zl9wZ25vIDMKKworI2RlZmluZSBDMzIwcDI0cnhfc3BhZ2UgMworI2RlZmluZSBDMzIwcDI0dHhfc3BhZ2UgNAorI2RlZmluZSBDMzIwcDI0cnhfcGdubwkxCisjZGVmaW5lIEMzMjBwMjR0eF9wZ25vCTEKKyNkZWZpbmUgQzMyMHAyNGJ1Zl9wZ25vIDIKKworI2RlZmluZSBDMzIwcDMycnhfc3BhZ2UgMworI2RlZmluZSBDMzIwcDMydHhfb2ZzCUMzMjBwMzJyeF9zaXplCisjZGVmaW5lIEMzMjBwMzJ0eF9zcGFnZSAzCisjZGVmaW5lIEMzMjBwMzJidWZfcGdubyAxCisKKy8qCisgKiAgICBIb3N0IFN0YXR1cworICovCisjZGVmaW5lIFdha2V1cFJ4CTB4MDEKKyNkZWZpbmUgV2FrZXVwVHgJMHgwMgorI2RlZmluZSBXYWtldXBCcmVhawkweDA4CisjZGVmaW5lIFdha2V1cExpbmUJMHgxMAorI2RlZmluZSBXYWtldXBJbnRyCTB4MjAKKyNkZWZpbmUgV2FrZXVwUXVpdAkweDQwCisjZGVmaW5lIFdha2V1cEVPRgkweDgwCS8qIHVzZWQgaW4gVlRJTUUgY29udHJvbCAqLworI2RlZmluZSBXYWtldXBSeFRyaWdnZXIJMHgxMDAKKyNkZWZpbmUgV2FrZXVwVHhUcmlnZ2VyCTB4MjAwCisvKgorICogICAgRmxhZyBzdGF0dXMKKyAqLworI2RlZmluZSBSeF9vdmVyCQkweDAxCisjZGVmaW5lIFhvZmZfc3RhdGUJMHgwMgorI2RlZmluZSBUeF9mbG93T2ZmCTB4MDQKKyNkZWZpbmUgVHhfZW5hYmxlCTB4MDgKKyNkZWZpbmUgQ1RTX3N0YXRlCTB4MTAKKyNkZWZpbmUgRFNSX3N0YXRlCTB4MjAKKyNkZWZpbmUgRENEX3N0YXRlCTB4ODAKKy8qCisgKiAgICBGbG93Q29udHJvbAorICovCisjZGVmaW5lIENUU19GbG93Q3RsCTEKKyNkZWZpbmUgUlRTX0Zsb3dDdGwJMgorI2RlZmluZSBUeF9GbG93Q3RsCTQKKyNkZWZpbmUgUnhfRmxvd0N0bAk4CisjZGVmaW5lIElYTV9JWEFOWQkweDEwCisKKyNkZWZpbmUgTG93V2F0ZXIJMTI4CisKKyNkZWZpbmUgRFRSX09OCQkxCisjZGVmaW5lIFJUU19PTgkJMgorI2RlZmluZSBDVFNfT04JCTEKKyNkZWZpbmUgRFNSX09OCQkyCisjZGVmaW5lIERDRF9PTgkJOAorCisvKiBtb2RlIGRlZmluaXRpb24gKi8KKyNkZWZpbmUJTVhfQ1M4CQkweDAzCisjZGVmaW5lCU1YX0NTNwkJMHgwMgorI2RlZmluZQlNWF9DUzYJCTB4MDEKKyNkZWZpbmUJTVhfQ1M1CQkweDAwCisKKyNkZWZpbmUJTVhfU1RPUDEJMHgwMAorI2RlZmluZQlNWF9TVE9QMTUJMHgwNAorI2RlZmluZQlNWF9TVE9QMgkweDA4CisKKyNkZWZpbmUJTVhfUEFSTk9ORQkweDAwCisjZGVmaW5lCU1YX1BBUkVWRU4JMHg0MAorI2RlZmluZQlNWF9QQVJPREQJMHhDMAorCisvKgorICogICAgUXVlcnkKKyAqLworI2RlZmluZSBRdWVyeVBvcnQJTUFYX1BPUlRTCisKKworCitzdHJ1Y3QgbW9uX3N0ciB7CisJaW50IHRpY2s7CisJaW50IHJ4Y250W01BWF9QT1JUU107CisJaW50IHR4Y250W01BWF9QT1JUU107Cit9OwordHlwZWRlZiBzdHJ1Y3QgbW9uX3N0ciBtb25fc3Q7CisKKyNkZWZpbmUgCURDRF9jaGFuZ2VkCTB4MDEKKyNkZWZpbmUgCURDRF9vbGRzdGF0ZQkweDgwCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1veGFCdWZmWzEwMjQwXTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1veGFJbnROZHhbTUFYX0JPQVJEU107CitzdGF0aWMgdm9pZCBfX2lvbWVtICptb3hhSW50UGVuZFtNQVhfQk9BUkRTXTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1veGFJbnRUYWJsZVtNQVhfQk9BUkRTXTsKK3N0YXRpYyBjaGFyIG1veGFDaGtQb3J0W01BWF9QT1JUU107CitzdGF0aWMgY2hhciBtb3hhTGluZUN0cmxbTUFYX1BPUlRTXTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1veGFUYWJsZUFkZHJbTUFYX1BPUlRTXTsKK3N0YXRpYyBsb25nIG1veGFDdXJCYXVkW01BWF9QT1JUU107CitzdGF0aWMgY2hhciBtb3hhRENEU3RhdGVbTUFYX1BPUlRTXTsKK3N0YXRpYyBjaGFyIG1veGFMb3dDaGtGbGFnW01BWF9QT1JUU107CitzdGF0aWMgaW50IG1veGFMb3dXYXRlckNoazsKK3N0YXRpYyBpbnQgbW94YUNhcmQ7CitzdGF0aWMgbW9uX3N0IG1veGFMb2c7CitzdGF0aWMgaW50IG1veGFGdW5jVG91dDsKK3N0YXRpYyB1c2hvcnQgbW94YUJyZWFrQ250W01BWF9QT1JUU107CisKK3N0YXRpYyB2b2lkIG1veGFkZWxheShpbnQpOworc3RhdGljIHZvaWQgbW94YWZ1bmModm9pZCBfX2lvbWVtICosIGludCwgdXNob3J0KTsKK3N0YXRpYyB2b2lkIHdhaXRfZmluaXNoKHZvaWQgX19pb21lbSAqKTsKK3N0YXRpYyB2b2lkIGxvd193YXRlcl9jaGVjayh2b2lkIF9faW9tZW0gKik7CitzdGF0aWMgaW50IG1veGFsb2FkYmlvcyhpbnQsIHVuc2lnbmVkIGNoYXIgX191c2VyICosIGludCk7CitzdGF0aWMgaW50IG1veGFmaW5kY2FyZChpbnQpOworc3RhdGljIGludCBtb3hhbG9hZDMyMGIoaW50LCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqLCBpbnQpOworc3RhdGljIGludCBtb3hhbG9hZGNvZGUoaW50LCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqLCBpbnQpOworc3RhdGljIGludCBtb3hhbG9hZGMyMTgoaW50LCB2b2lkIF9faW9tZW0gKiwgaW50KTsKK3N0YXRpYyBpbnQgbW94YWxvYWRjMzIwKGludCwgdm9pZCBfX2lvbWVtICosIGludCwgaW50ICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCURyaXZlciBsZXZlbCBmdW5jdGlvbnM6IAkJCQkJICAgICAqCisgKgkxLiBNb3hhRHJpdmVySW5pdCh2b2lkKTsJCQkJCSAgICAgKgorICoJMi4gTW94YURyaXZlcklvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgcG9ydCk7ICAgKgorICoJMy4gTW94YURyaXZlclBvbGwodm9pZCk7CQkJCQkgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTW94YURyaXZlckluaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCW1veGFGdW5jVG91dCA9IEhaIC8gMjsJLyogNTAwIG1pbmktc2Vjb25kcyAqLworCW1veGFDYXJkID0gMDsKKwltb3hhTG9nLnRpY2sgPSAwOworCW1veGFMb3dXYXRlckNoayA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUUzsgaSsrKSB7CisJCW1veGFDaGtQb3J0W2ldID0gMDsKKwkJbW94YUxvd0Noa0ZsYWdbaV0gPSAwOworCQltb3hhTGluZUN0cmxbaV0gPSAwOworCQltb3hhTG9nLnJ4Y250W2ldID0gMDsKKwkJbW94YUxvZy50eGNudFtpXSA9IDA7CisJfQorfQorCisjZGVmaW5lCU1PWEEJCTB4NDAwCisjZGVmaW5lIE1PWEFfR0VUX0lRVUVVRSAJKE1PWEEgKyAxKQkvKiBnZXQgaW5wdXQgYnVmZmVyZWQgY291bnQgKi8KKyNkZWZpbmUgTU9YQV9HRVRfT1FVRVVFIAkoTU9YQSArIDIpCS8qIGdldCBvdXRwdXQgYnVmZmVyZWQgY291bnQgKi8KKyNkZWZpbmUgTU9YQV9JTklUX0RSSVZFUgkoTU9YQSArIDYpCS8qIG1veGFDYXJkPTAgKi8KKyNkZWZpbmUgTU9YQV9MT0FEX0JJT1MJCShNT1hBICsgOSkJLyogZG93bmxvYWQgQklPUyAqLworI2RlZmluZSBNT1hBX0ZJTkRfQk9BUkQJCShNT1hBICsgMTApCS8qIENoZWNrIGlmIE1PWEEgY2FyZCBleGlzdD8gKi8KKyNkZWZpbmUgTU9YQV9MT0FEX0MzMjBCCQkoTU9YQSArIDExKQkvKiBkb3dubG9hZCAzMjBCIGZpcm13YXJlICovCisjZGVmaW5lIE1PWEFfTE9BRF9DT0RFCQkoTU9YQSArIDEyKQkvKiBkb3dubG9hZCBmaXJtd2FyZSAqLworI2RlZmluZSBNT1hBX0dFVERBVEFDT1VOVCAgICAgICAoTU9YQSArIDIzKQorI2RlZmluZSBNT1hBX0dFVF9JT1FVRVVFCShNT1hBICsgMjcpCisjZGVmaW5lIE1PWEFfRkxVU0hfUVVFVUUJKE1PWEEgKyAyOCkKKyNkZWZpbmUgTU9YQV9HRVRfQ09ORgkJKE1PWEEgKyAzNSkJLyogY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNT1hBX0dFVF9NQUpPUiAgICAgICAgICAoTU9YQSArIDYzKQorI2RlZmluZSBNT1hBX0dFVF9DVU1BSk9SICAgICAgICAoTU9YQSArIDY0KQorI2RlZmluZSBNT1hBX0dFVE1TVEFUVVMgICAgICAgICAoTU9YQSArIDY1KQorCisKK3N0cnVjdCBtb3hhcV9zdHIgeworCWludCBpbnE7CisJaW50IG91dHE7Cit9OworCitzdHJ1Y3QgZGxfc3RyIHsKKwljaGFyIF9fdXNlciAqYnVmOworCWludCBsZW47CisJaW50IGNhcmRubzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbW94YXFfc3RyIHRlbXBfcXVldWVbTUFYX1BPUlRTXTsKK3N0YXRpYyBzdHJ1Y3QgZGxfc3RyIGRsdG1wOworCit2b2lkIE1veGFQb3J0Rmx1c2hEYXRhKGludCBwb3J0LCBpbnQgbW9kZSkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaWYgKChtb2RlIDwgMCkgfHwgKG1vZGUgPiAyKSkKKwkJcmV0dXJuOworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX0ZsdXNoUXVldWUsIG1vZGUpOworCWlmIChtb2RlICE9IDEpIHsKKwkJbW94YUxvd0Noa0ZsYWdbcG9ydF0gPSAwOworCQlsb3dfd2F0ZXJfY2hlY2sob2ZzQWRkcik7CisJfQorfQorCitpbnQgTW94YURyaXZlcklvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgc3RhdHVzOworCWludCBNb3hhUG9ydFR4UXVldWUoaW50KSwgTW94YVBvcnRSeFF1ZXVlKGludCk7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAocG9ydCA9PSBRdWVyeVBvcnQpIHsKKwkJaWYgKChjbWQgIT0gTU9YQV9HRVRfQ09ORikgJiYgKGNtZCAhPSBNT1hBX0lOSVRfRFJJVkVSKSAmJgorCQkgICAgKGNtZCAhPSBNT1hBX0xPQURfQklPUykgJiYgKGNtZCAhPSBNT1hBX0ZJTkRfQk9BUkQpICYmIChjbWQgIT0gTU9YQV9MT0FEX0MzMjBCKSAmJgorCQkgKGNtZCAhPSBNT1hBX0xPQURfQ09ERSkgJiYgKGNtZCAhPSBNT1hBX0dFVERBVEFDT1VOVCkgJiYKKwkJICAoY21kICE9IE1PWEFfR0VUX0lPUVVFVUUpICYmIChjbWQgIT0gTU9YQV9HRVRfTUFKT1IpICYmCisJCSAgICAoY21kICE9IE1PWEFfR0VUX0NVTUFKT1IpICYmIChjbWQgIT0gTU9YQV9HRVRNU1RBVFVTKSkKKwkJCXJldHVybiAoLUVJTlZBTCk7CisJfQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNT1hBX0dFVF9DT05GOgorCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJm1veGFfYm9hcmRzLCBNQVhfQk9BUkRTICogc2l6ZW9mKG1veGFfYm9hcmRfY29uZikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAoMCk7CisJY2FzZSBNT1hBX0lOSVRfRFJJVkVSOgorCQlpZiAoKGludCkgYXJnID09IDB4NDA0KQorCQkJTW94YURyaXZlckluaXQoKTsKKwkJcmV0dXJuICgwKTsKKwljYXNlIE1PWEFfR0VUREFUQUNPVU5UOgorCQltb3hhTG9nLnRpY2sgPSBqaWZmaWVzOworCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJm1veGFMb2csIHNpemVvZihtb25fc3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gKDApOworCWNhc2UgTU9YQV9GTFVTSF9RVUVVRToKKwkJTW94YVBvcnRGbHVzaERhdGEocG9ydCwgYXJnKTsKKwkJcmV0dXJuICgwKTsKKwljYXNlIE1PWEFfR0VUX0lPUVVFVUU6CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfUE9SVFM7IGkrKykgeworCQkJaWYgKG1veGFDaGtQb3J0W2ldKSB7CisJCQkJdGVtcF9xdWV1ZVtpXS5pbnEgPSBNb3hhUG9ydFJ4UXVldWUoaSk7CisJCQkJdGVtcF9xdWV1ZVtpXS5vdXRxID0gTW94YVBvcnRUeFF1ZXVlKGkpOworCQkJfQorCQl9CisJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCB0ZW1wX3F1ZXVlLCBzaXplb2Yoc3RydWN0IG1veGFxX3N0cikgKiBNQVhfUE9SVFMpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAoMCk7CisJY2FzZSBNT1hBX0dFVF9PUVVFVUU6CisJCWkgPSBNb3hhUG9ydFR4UXVldWUocG9ydCk7CisJCXJldHVybiBwdXRfdXNlcihpLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKKwljYXNlIE1PWEFfR0VUX0lRVUVVRToKKwkJaSA9IE1veGFQb3J0UnhRdWV1ZShwb3J0KTsKKwkJcmV0dXJuIHB1dF91c2VyKGksICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCWNhc2UgTU9YQV9HRVRfTUFKT1I6CisJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmdHR5bWFqb3IsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIE1PWEFfR0VUX0NVTUFKT1I6CisJCWkgPSAwOworCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJmksIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIE1PWEFfR0VUTVNUQVRVUzoKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUUzsgaSsrKSB7CisJCQlHTVN0YXR1c1tpXS5yaSA9IDA7CisJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOworCQkJR01TdGF0dXNbaV0uZHNyID0gMDsKKwkJCUdNU3RhdHVzW2ldLmN0cyA9IDA7CisJCQlpZiAoIW1veGFDaGtQb3J0W2ldKSB7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IE1veGFQb3J0TGluZVN0YXR1cyhtb3hhQ2hhbm5lbHNbaV0ucG9ydCk7CisJCQkJaWYgKHN0YXR1cyAmIDEpCisJCQkJCUdNU3RhdHVzW2ldLmN0cyA9IDE7CisJCQkJaWYgKHN0YXR1cyAmIDIpCisJCQkJCUdNU3RhdHVzW2ldLmRzciA9IDE7CisJCQkJaWYgKHN0YXR1cyAmIDQpCisJCQkJCUdNU3RhdHVzW2ldLmRjZCA9IDE7CisJCQl9CisKKwkJCWlmICghbW94YUNoYW5uZWxzW2ldLnR0eSB8fCAhbW94YUNoYW5uZWxzW2ldLnR0eS0+dGVybWlvcykKKwkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9IG1veGFDaGFubmVsc1tpXS5jZmxhZzsKKwkJCWVsc2UKKwkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9IG1veGFDaGFubmVsc1tpXS50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJCX0KKwkJaWYoY29weV90b191c2VyKGFyZ3AsIEdNU3RhdHVzLCBzaXplb2Yoc3RydWN0IG14c2VyX21zdGF0dXMpICogTUFYX1BPUlRTKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKC1FTk9JT0NUTENNRCk7CisJY2FzZSBNT1hBX0xPQURfQklPUzoKKwljYXNlIE1PWEFfRklORF9CT0FSRDoKKwljYXNlIE1PWEFfTE9BRF9DMzIwQjoKKwljYXNlIE1PWEFfTE9BRF9DT0RFOgorCQlicmVhazsKKwl9CisKKwlpZihjb3B5X2Zyb21fdXNlcigmZGx0bXAsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgZGxfc3RyKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmKGRsdG1wLmNhcmRubyA8IDAgfHwgZGx0bXAuY2FyZG5vID49IE1BWF9CT0FSRFMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoKGNtZCkKKwl7CisJY2FzZSBNT1hBX0xPQURfQklPUzoKKwkJaSA9IG1veGFsb2FkYmlvcyhkbHRtcC5jYXJkbm8sIGRsdG1wLmJ1ZiwgZGx0bXAubGVuKTsKKwkJcmV0dXJuIChpKTsKKwljYXNlIE1PWEFfRklORF9CT0FSRDoKKwkJcmV0dXJuIG1veGFmaW5kY2FyZChkbHRtcC5jYXJkbm8pOworCWNhc2UgTU9YQV9MT0FEX0MzMjBCOgorCQltb3hhbG9hZDMyMGIoZGx0bXAuY2FyZG5vLCBkbHRtcC5idWYsIGRsdG1wLmxlbik7CisJZGVmYXVsdDogLyogdG8ga2VlcCBnY2MgaGFwcHkgKi8KKwkJcmV0dXJuICgwKTsKKwljYXNlIE1PWEFfTE9BRF9DT0RFOgorCQlpID0gbW94YWxvYWRjb2RlKGRsdG1wLmNhcmRubywgZGx0bXAuYnVmLCBkbHRtcC5sZW4pOworCQlpZiAoaSA9PSAtMSkKKwkJCXJldHVybiAoLUVGQVVMVCk7CisJCXJldHVybiAoaSk7CisKKwl9Cit9CisKK2ludCBNb3hhRHJpdmVyUG9sbCh2b2lkKQoreworCXJlZ2lzdGVyIHVzaG9ydCB0ZW1wOworCXJlZ2lzdGVyIGludCBjYXJkOworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwl2b2lkIF9faW9tZW0gKmlwOworCWludCBwb3J0LCBwLCBwb3J0czsKKworCWlmIChtb3hhQ2FyZCA9PSAwKQorCQlyZXR1cm4gKC0xKTsKKwlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgTUFYX0JPQVJEUzsgY2FyZCsrKSB7CisJCWlmICgocG9ydHMgPSBtb3hhX2JvYXJkc1tjYXJkXS5udW1Qb3J0cykgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAocmVhZGIobW94YUludFBlbmRbY2FyZF0pID09IDB4ZmYpIHsKKwkJCWlwID0gbW94YUludFRhYmxlW2NhcmRdICsgcmVhZGIobW94YUludE5keFtjYXJkXSk7CisJCQlwID0gY2FyZCAqIE1BWF9QT1JUU19QRVJfQk9BUkQ7CisJCQlwb3J0cyA8PD0gMTsKKwkJCWZvciAocG9ydCA9IDA7IHBvcnQgPCBwb3J0czsgcG9ydCArPSAyLCBwKyspIHsKKwkJCQlpZiAoKHRlbXAgPSByZWFkdyhpcCArIHBvcnQpKSAhPSAwKSB7CisJCQkJCXdyaXRldygwLCBpcCArIHBvcnQpOworCQkJCQlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwXTsKKwkJCQkJaWYgKHRlbXAgJiBJbnRyVHgpCisJCQkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIEhvc3RTdGF0KSAmIH5XYWtldXBUeCwgb2ZzQWRkciArIEhvc3RTdGF0KTsKKwkJCQkJaWYgKHRlbXAgJiBJbnRyQnJlYWspIHsKKwkJCQkJCW1veGFCcmVha0NudFtwXSsrOworCQkJCQl9CisJCQkJCWlmICh0ZW1wICYgSW50ckxpbmUpIHsKKwkJCQkJCWlmIChyZWFkYihvZnNBZGRyICsgRmxhZ1N0YXQpICYgRENEX3N0YXRlKSB7CisJCQkJCQkJaWYgKChtb3hhRENEU3RhdGVbcF0gJiBEQ0Rfb2xkc3RhdGUpID09IDApCisJCQkJCQkJCW1veGFEQ0RTdGF0ZVtwXSA9IChEQ0Rfb2xkc3RhdGUgfAorCQkJCQkJCQkJCSAgIERDRF9jaGFuZ2VkKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKG1veGFEQ0RTdGF0ZVtwXSAmIERDRF9vbGRzdGF0ZSkKKwkJCQkJCQkJbW94YURDRFN0YXRlW3BdID0gRENEX2NoYW5nZWQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQl3cml0ZWIoMCwgbW94YUludFBlbmRbY2FyZF0pOworCQl9CisJCWlmIChtb3hhTG93V2F0ZXJDaGspIHsKKwkJCXAgPSBjYXJkICogTUFYX1BPUlRTX1BFUl9CT0FSRDsKKwkJCWZvciAocG9ydCA9IDA7IHBvcnQgPCBwb3J0czsgcG9ydCsrLCBwKyspIHsKKwkJCQlpZiAobW94YUxvd0Noa0ZsYWdbcF0pIHsKKwkJCQkJbW94YUxvd0Noa0ZsYWdbcF0gPSAwOworCQkJCQlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwXTsKKwkJCQkJbG93X3dhdGVyX2NoZWNrKG9mc0FkZHIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwltb3hhTG93V2F0ZXJDaGsgPSAwOworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJQ2FyZCBsZXZlbCBmdW5jdGlvbjoJCQkJCQkgICAgICoKKyAqCTEuIE1veGFQb3J0c09mQ2FyZChpbnQgY2FyZG5vKTsgCQkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IE1veGFQb3J0c09mQ2FyZChpbnQgY2FyZG5vKQoreworCisJaWYgKG1veGFfYm9hcmRzW2NhcmRub10uYm9hcmRUeXBlID09IDApCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChtb3hhX2JvYXJkc1tjYXJkbm9dLm51bVBvcnRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglQb3J0IGxldmVsIGZ1bmN0aW9uczoJCQkJCQkgICAgICoKKyAqCTEuICBNb3hhUG9ydElzVmFsaWQoaW50IHBvcnQpOwkJCQkJICAgICAqCisgKgkyLiAgTW94YVBvcnRFbmFibGUoaW50IHBvcnQpOwkJCQkJICAgICAqCisgKgkzLiAgTW94YVBvcnREaXNhYmxlKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJNC4gIE1veGFQb3J0R2V0TWF4QmF1ZChpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJNS4gIE1veGFQb3J0R2V0Q3VyQmF1ZChpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJNi4gIE1veGFQb3J0U2V0QmF1ZChpbnQgcG9ydCwgbG9uZyBiYXVkKTsJCQkgICAgICoKKyAqCTcuICBNb3hhUG9ydFNldE1vZGUoaW50IHBvcnQsIGludCBkYXRhYml0LCBpbnQgc3RvcGJpdCwgaW50IHBhcml0eSk7ICoKKyAqCTguICBNb3hhUG9ydFNldFRlcm1pbyhpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqdGVybWlvKTsgCSAgICAgKgorICoJOS4gIE1veGFQb3J0R2V0TGluZU91dChpbnQgcG9ydCwgaW50ICpkdHJTdGF0ZSwgaW50ICpydHNTdGF0ZSk7ICAgICAgKgorICoJMTAuIE1veGFQb3J0TGluZUN0cmwoaW50IHBvcnQsIGludCBkdHJTdGF0ZSwgaW50IHJ0c1N0YXRlKTsJICAgICAqCisgKgkxMS4gTW94YVBvcnRGbG93Q3RybChpbnQgcG9ydCwgaW50IHJ0cywgaW50IGN0cywgaW50IHJ4LCBpbnQgdHgsaW50IHhhbnkpOyAgICAqCisgKgkxMi4gTW94YVBvcnRMaW5lU3RhdHVzKGludCBwb3J0KTsJCQkJICAgICAqCisgKgkxMy4gTW94YVBvcnREQ0RDaGFuZ2UoaW50IHBvcnQpOwkJCQkgICAgICoKKyAqCTE0LiBNb3hhUG9ydERDRE9OKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJMTUuIE1veGFQb3J0Rmx1c2hEYXRhKGludCBwb3J0LCBpbnQgbW9kZSk7CSAgICAgICAgICAgICAgICAgICAgICoKKyAqCTE2LiBNb3hhUG9ydFdyaXRlRGF0YShpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciwgaW50IGxlbmd0aCk7ICoKKyAqCTE3LiBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgbGVuZ3RoKTsgICoKKyAqCTE4LiBNb3hhUG9ydFR4QnVmU2l6ZShpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJMTkuIE1veGFQb3J0UnhCdWZTaXplKGludCBwb3J0KTsJCQkJICAgICAqCisgKgkyMC4gTW94YVBvcnRUeFF1ZXVlKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJMjEuIE1veGFQb3J0VHhGcmVlKGludCBwb3J0KTsJCQkJCSAgICAgKgorICoJMjIuIE1veGFQb3J0UnhRdWV1ZShpbnQgcG9ydCk7CQkJCQkgICAgICoKKyAqCTIzLiBNb3hhUG9ydFJ4RnJlZShpbnQgcG9ydCk7CQkJCQkgICAgICoKKyAqCTI0LiBNb3hhUG9ydFR4RGlzYWJsZShpbnQgcG9ydCk7CQkJCSAgICAgKgorICoJMjUuIE1veGFQb3J0VHhFbmFibGUoaW50IHBvcnQpOyAJCQkJICAgICAqCisgKgkyNi4gTW94YVBvcnRHZXRCcmtDbnQoaW50IHBvcnQpOwkJCQkgICAgICoKKyAqCTI3LiBNb3hhUG9ydFJlc2V0QnJrQ250KGludCBwb3J0KTsJCQkJICAgICAqCisgKgkyOC4gTW94YVBvcnRTZXRYb25Yb2ZmKGludCBwb3J0LCBpbnQgeG9uVmFsdWUsIGludCB4b2ZmVmFsdWUpOwkgICAgICoKKyAqCTI5LiBNb3hhUG9ydElzVHhIb2xkKGludCBwb3J0KTsgCQkJCSAgICAgKgorICoJMzAuIE1veGFQb3J0U2VuZEJyZWFrKGludCBwb3J0LCBpbnQgdGlja3MpOwkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICAgIE1veGEgUG9ydCBOdW1iZXIgRGVzY3JpcHRpb246CisgKgorICogICAgICBNT1hBIHNlcmlhbCBkcml2ZXIgc3VwcG9ydHMgdXAgdG8gNCBNT1hBLUMyMTgvQzMyMCBib2FyZHMuIEFuZCwKKyAqICAgICAgdGhlIHBvcnQgbnVtYmVyIHVzaW5nIGluIE1PWEEgZHJpdmVyIGZ1bmN0aW9ucyB3aWxsIGJlIDAgdG8gMzEgZm9yCisgKiAgICAgIGZpcnN0IE1PWEEgYm9hcmQsIDMyIHRvIDYzIGZvciBzZWNvbmQsIDY0IHRvIDk1IGZvciB0aGlyZCBhbmQgOTYKKyAqICAgICAgdG8gMTI3IGZvciBmb3VydGguIEZvciBleGFtcGxlLCBpZiB5b3Ugc2V0dXAgdGhyZWUgTU9YQSBib2FyZHMsCisgKiAgICAgIGZpcnN0IGJvYXJkIGlzIEMyMTgsIHNlY29uZCBib2FyZCBpcyBDMzIwLTE2IGFuZCB0aGlyZCBib2FyZCBpcworICogICAgICBDMzIwLTMyLiBUaGUgcG9ydCBudW1iZXIgb2YgZmlyc3QgYm9hcmQgKEMyMTggLSA4IHBvcnRzKSBpcyBmcm9tCisgKiAgICAgIDAgdG8gNy4gVGhlIHBvcnQgbnVtYmVyIG9mIHNlY29uZCBib2FyZCAoQzMyMCAtIDE2IHBvcnRzKSBpcyBmb3JtCisgKiAgICAgIDMyIHRvIDQ3LiBUaGUgcG9ydCBudW1iZXIgb2YgdGhpcmQgYm9hcmQgKEMzMjAgLSAzMiBwb3J0cykgaXMgZnJvbQorICogICAgICA2NCB0byA5NS4gQW5kIHRob3NlIHBvcnQgbnVtYmVycyBmb3JtIDggdG8gMzEsIDQ4IHRvIDYzIGFuZCA5NiB0bworICogICAgICAxMjcgd2lsbCBiZSBpbnZhbGlkLgorICoKKyAqCisgKiAgICAgIE1veGEgRnVuY3Rpb25zIERlc2NyaXB0aW9uOgorICoKKyAqICAgICAgRnVuY3Rpb24gMTogICAgIERyaXZlciBpbml0aWFsaXphdGlvbiByb3V0aW5lLCB0aGlzIHJvdXRpbmUgbXVzdCBiZQorICogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIHdoZW4gaW5pdGlhbGl6ZWQgZHJpdmVyLgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YURyaXZlckluaXQoKTsKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyOiAgICAgTW94YSBkcml2ZXIgcHJpdmF0ZSBJT0NUTCBjb21tYW5kIHByb2Nlc3NpbmcuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhRHJpdmVySW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCBwb3J0KTsKKyAqCisgKiAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCAgIDogSU9DVEwgY29tbWFuZAorICogICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnICA6IElPQ1RMIGFyZ3VtZW50CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgKE9LKQorICogICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTAorICogICAgICAgICAgICAgICAgICAgICAgLUVOT0lPQ1RMQ01ECisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMzogICAgIE1veGEgZHJpdmVyIHBvbGxpbmcgcHJvY2VzcyByb3V0aW5lLgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YURyaXZlclBvbGwodm9pZCk7CisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA7IHBvbGxpbmcgTy5LLgorICogICAgICAgICAgICAgICAgICAgICAgLTEgICAgICA6IG5vIGFueSBNb3hhIGNhcmQuICAgICAgICAgICAgIAorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDQ6ICAgICBHZXQgdGhlIHBvcnRzIG9mIHRoaXMgY2FyZC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0c09mQ2FyZChpbnQgY2FyZG5vKTsKKyAqCisgKiAgICAgICAgICAgaW50IGNhcmRubyAgICAgICAgIDogY2FyZCBudW1iZXIgKDAgLSAzKQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgICAgICAgOiB0aGlzIGNhcmQgaXMgaW52YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgOC8xNi8yNC8zMgorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDU6ICAgICBDaGVjayB0aGlzIHBvcnQgaXMgdmFsaWQgb3IgaW52YWxpZAorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRJc1ZhbGlkKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNywgcmVmIHBvcnQgZGVzY3JpcHRpb24pCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA6IHRoaXMgcG9ydCBpcyBpbnZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIDogdGhpcyBwb3J0IGlzIHZhbGlkCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gNjogICAgIEVuYWJsZSB0aGlzIHBvcnQgdG8gc3RhcnQgVHgvUnggZGF0YS4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0RW5hYmxlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKgorICogICAgICBGdW5jdGlvbiA3OiAgICAgRGlzYWJsZSB0aGlzIHBvcnQKKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0RGlzYWJsZShpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gODogICAgIEdldCB0aGUgbWF4aW11biBhdmFpbGFibGUgYmF1ZCByYXRlIG9mIHRoaXMgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBsb25nIE1veGFQb3J0R2V0TWF4QmF1ZChpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA6IHRoaXMgcG9ydCBpcyBpbnZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgICAzODQwMC81NzYwMC8xMTUyMDAgYnBzCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gOTogICAgIEdldCB0aGUgY3VycmVudCBiYXVkIHJhdGUgb2YgdGhpcyBwb3J0LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGxvbmcgTW94YVBvcnRHZXRDdXJCYXVkKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDogdGhpcyBwb3J0IGlzIGludmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgIDUwIC0gMTE1MjAwIGJwcworICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDEwOiAgICBTZXR0aW5nIGJhdWQgcmF0ZSBvZiB0aGlzIHBvcnQuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgbG9uZyBNb3hhUG9ydFNldEJhdWQoaW50IHBvcnQsIGxvbmcgYmF1ZCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgbG9uZyBiYXVkICAgICAgICAgIDogYmF1ZCByYXRlICg1MCAtIDExNTIwMCkKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDogdGhpcyBwb3J0IGlzIGludmFsaWQgb3IgYmF1ZCA8IDUwCisgKiAgICAgICAgICAgICAgICAgICAgICA1MCAtIDExNTIwMCA6IHRoZSByZWFsIGJhdWQgcmF0ZSBzZXQgdG8gdGhlIHBvcnQsIGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcmd1bWVudCBiYXVkIGlzIGxhcmdlIHRoYW4gbWF4aW11bgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgYmF1ZCByYXRlLCB0aGUgcmVhbCBzZXR0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdWQgcmF0ZSB3aWxsIGJlIHRoZSBtYXhpbXVuIGJhdWQgcmF0ZS4KKyAqCisgKgorICogICAgICBGdW5jdGlvbiAxMTogICAgU2V0dGluZyB0aGUgZGF0YS1iaXRzL3N0b3AtYml0cy9wYXJpdHkgb2YgdGhpcyBwb3J0CisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFNldE1vZGUoaW50IHBvcnQsIGludCBkYXRhYml0cywgaW50IHN0b3BiaXRzLCBpbnQgcGFyaXR5KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgZGF0YWJpdHMgICAgICAgOiBkYXRhIGJpdHMgKDgvNy82LzUpCisgKiAgICAgICAgICAgaW50IHN0b3BiaXRzICAgICAgIDogc3RvcCBiaXRzICgyLzEvMCwgMCBzaG93IDEuNSBzdG9wIGJpdHMpCisgaW50IHBhcml0eSAgICAgOiBwYXJpdHkgKDA6Tm9uZSwxOk9kZCwyOkV2ZW4sMzpNYXJrLDQ6U3BhY2UpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgLTEgICAgICA6IGludmFsaWQgcGFyYW1ldGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAwICAgICAgIDogc2V0dGluZyBPLksuCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTI6ICAgIENvbmZpZ3VyZSB0aGUgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0U2V0VGVybWlvKGludCBwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqIHRlcm1pbyA6IHRlcm1pbyBzdHJ1Y3R1cmUgcG9pbnRlcgorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIC0xICAgICAgOiB0aGlzIHBvcnQgaXMgaW52YWxpZCBvciB0ZXJtaW8gPT0gTlVMTAorICogICAgICAgICAgICAgICAgICAgICAgMCAgICAgICA6IHNldHRpbmcgTy5LLgorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDEzOiAgICBHZXQgdGhlIERUUi9SVFMgc3RhdGUgb2YgdGhpcyBwb3J0LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRHZXRMaW5lT3V0KGludCBwb3J0LCBpbnQgKmR0clN0YXRlLCBpbnQgKnJ0c1N0YXRlKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgKiBkdHJTdGF0ZSAgICAgOiBwb2ludGVyIHRvIElOVCB0byByZWNlaXZlIHRoZSBjdXJyZW50IERUUgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLiAoaWYgTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHRvIHRoaXMgYWRkcmVzcykKKyAqICAgICAgICAgICBpbnQgKiBydHNTdGF0ZSAgICAgOiBwb2ludGVyIHRvIElOVCB0byByZWNlaXZlIHRoZSBjdXJyZW50IFJUUworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLiAoaWYgTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHRvIHRoaXMgYWRkcmVzcykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAtMSAgICAgIDogdGhpcyBwb3J0IGlzIGludmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgOiBPLksuCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTQ6ICAgIFNldHRpbmcgdGhlIERUUi9SVFMgb3V0cHV0IHN0YXRlIG9mIHRoaXMgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0TGluZUN0cmwoaW50IHBvcnQsIGludCBkdHJTdGF0ZSwgaW50IHJ0c1N0YXRlKTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgZHRyU3RhdGUgICAgICAgOiBEVFIgb3V0cHV0IHN0YXRlICgwOiBvZmYsIDE6IG9uKQorICogICAgICAgICAgIGludCBydHNTdGF0ZSAgICAgICA6IFJUUyBvdXRwdXQgc3RhdGUgKDA6IG9mZiwgMTogb24pCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTU6ICAgIFNldHRpbmcgdGhlIGZsb3cgY29udHJvbCBvZiB0aGlzIHBvcnQuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgdm9pZCBNb3hhUG9ydEZsb3dDdHJsKGludCBwb3J0LCBpbnQgcnRzRmxvdywgaW50IGN0c0Zsb3csIGludCByeEZsb3csCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHhGbG93LGludCB4YW55KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqICAgICAgICAgICBpbnQgcnRzRmxvdyAgICAgICAgOiBIL1cgUlRTIGZsb3cgY29udHJvbCAoMDogbm8sIDE6IHllcykKKyAqICAgICAgICAgICBpbnQgY3RzRmxvdyAgICAgICAgOiBIL1cgQ1RTIGZsb3cgY29udHJvbCAoMDogbm8sIDE6IHllcykKKyAqICAgICAgICAgICBpbnQgcnhGbG93ICAgICAgICAgOiBTL1cgUnggWE9OL1hPRkYgZmxvdyBjb250cm9sICgwOiBubywgMTogeWVzKQorICogICAgICAgICAgIGludCB0eEZsb3cgICAgICAgICA6IFMvVyBUeCBYT04vWE9GRiBmbG93IGNvbnRyb2wgKDA6IG5vLCAxOiB5ZXMpCisgKiAgICAgICAgICAgaW50IHhhbnkgICAgICAgICAgIDogUy9XIFhBTlkgZmxvdyBjb250cm9sICgwOiBubywgMTogeWVzKQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDE2OiAgICBHZXQgdGhzIGxpbmUgc3RhdHVzIG9mIHRoaXMgcG9ydAorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRMaW5lU3RhdHVzKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICBCaXQgMCAtIENUUyBzdGF0ZSAoMDogb2ZmLCAxOiBvbikKKyAqICAgICAgICAgICAgICAgICAgICAgIEJpdCAxIC0gRFNSIHN0YXRlICgwOiBvZmYsIDE6IG9uKQorICogICAgICAgICAgICAgICAgICAgICAgQml0IDIgLSBEQ0Qgc3RhdGUgKDA6IG9mZiwgMTogb24pCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMTc6ICAgIENoZWNrIHRoZSBEQ0Qgc3RhdGUgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgcmVhZAorICogICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBmdW5jdGlvbi4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0RENEQ2hhbmdlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwICAgICAgIDogbm8gY2hhbmdlZAorICogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICA6IERDRCBoYXMgY2hhbmdlZAorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDE4OiAgICBDaGVjayB0aHMgY3VycmVudCBEQ0Qgc3RhdGUgaXMgT04gb3Igbm90LgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnREQ0RPTihpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgMCAgICAgICA6IERDRCBvZmYKKyAqICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgOiBEQ0Qgb24KKyAqCisgKgorICogICAgICBGdW5jdGlvbiAxOTogICAgRmx1c2ggdGhlIFJ4L1R4IGJ1ZmZlciBkYXRhIG9mIHRoaXMgcG9ydC4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0Rmx1c2hEYXRhKGludCBwb3J0LCBpbnQgbW9kZSk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgaW50IG1vZGUgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAwICAgICAgIDogZmx1c2ggdGhlIFJ4IGJ1ZmZlciAKKyAqICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgOiBmbHVzaCB0aGUgVHggYnVmZmVyIAorICogICAgICAgICAgICAgICAgICAgICAgMiAgICAgICA6IGZsdXNoIHRoZSBSeCBhbmQgVHggYnVmZmVyIAorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDIwOiAgICBXcml0ZSBkYXRhLgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRXcml0ZURhdGEoaW50IHBvcnQsIHVuc2lnbmVkIGNoYXIgKiBidWZmZXIsIGludCBsZW5ndGgpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICogICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiBidWZmZXIgICAgIDogcG9pbnRlciB0byB3cml0ZSBkYXRhIGJ1ZmZlci4KKyAqICAgICAgICAgICBpbnQgbGVuZ3RoICAgICAgICAgOiB3cml0ZSBkYXRhIGxlbmd0aAorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgLSBsZW5ndGggICAgICA6IHJlYWwgd3JpdGUgZGF0YSBsZW5ndGgKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyMTogICAgUmVhZCBkYXRhLgorICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRSZWFkRGF0YShpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciwgaW50IGxlbmd0aCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciAgICAgOiBwb2ludGVyIHRvIHJlYWQgZGF0YSBidWZmZXIuCisgKiAgICAgICAgICAgaW50IGxlbmd0aCAgICAgICAgIDogcmVhZCBkYXRhIGJ1ZmZlciBsZW5ndGgKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwIC0gbGVuZ3RoICAgICAgOiByZWFsIHJlYWQgZGF0YSBsZW5ndGgKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyMjogICAgR2V0IHRoZSBUeCBidWZmZXIgc2l6ZSBvZiB0aGlzIHBvcnQKKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0VHhCdWZTaXplKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogVHggYnVmZmVyIHNpemUKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyMzogICAgR2V0IHRoZSBSeCBidWZmZXIgc2l6ZSBvZiB0aGlzIHBvcnQKKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0UnhCdWZTaXplKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogUnggYnVmZmVyIHNpemUKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyNDogICAgR2V0IHRoZSBUeCBidWZmZXIgY3VycmVudCBxdWV1ZWQgZGF0YSBieXRlcworICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRUeFF1ZXVlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogVHggYnVmZmVyIGN1cnJlbnQgcXVldWVkIGRhdGEgYnl0ZXMKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyNTogICAgR2V0IHRoZSBUeCBidWZmZXIgY3VycmVudCBmcmVlIHNwYWNlCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFR4RnJlZShpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgLi4gICAgICA6IFR4IGJ1ZmZlciBjdXJyZW50IGZyZWUgc3BhY2UKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyNjogICAgR2V0IHRoZSBSeCBidWZmZXIgY3VycmVudCBxdWV1ZWQgZGF0YSBieXRlcworICogICAgICBTeW50YXg6CisgKiAgICAgIGludCAgTW94YVBvcnRSeFF1ZXVlKGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAuLiAgICAgIDogUnggYnVmZmVyIGN1cnJlbnQgcXVldWVkIGRhdGEgYnl0ZXMKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyNzogICAgR2V0IHRoZSBSeCBidWZmZXIgY3VycmVudCBmcmVlIHNwYWNlCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgaW50ICBNb3hhUG9ydFJ4RnJlZShpbnQgcG9ydCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKgorICogICAgICAgICAgIHJldHVybjogICAgLi4gICAgICA6IFJ4IGJ1ZmZlciBjdXJyZW50IGZyZWUgc3BhY2UKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAyODogICAgRGlzYWJsZSBwb3J0IGRhdGEgdHJhbnNtaXNzaW9uLgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YVBvcnRUeERpc2FibGUoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDI5OiAgICBFbmFibGUgcG9ydCBkYXRhIHRyYW5zbWlzc2lvbi4KKyAqICAgICAgU3ludGF4OgorICogICAgICB2b2lkIE1veGFQb3J0VHhFbmFibGUoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIDMwOiAgICBHZXQgdGhlIHJlY2VpdmVkIEJSRUFLIHNpZ25hbCBjb3VudC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0R2V0QnJrQ250KGludCBwb3J0KTsKKyAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKKyAqCisgKiAgICAgICAgICAgcmV0dXJuOiAgICAwIC0gLi4gIDogQlJFQUsgc2lnbmFsIGNvdW50CisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMzE6ICAgIEdldCB0aGUgcmVjZWl2ZWQgQlJFQUsgc2lnbmFsIGNvdW50IGFuZCByZXNldCBpdC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0UmVzZXRCcmtDbnQoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgLSAuLiAgOiBCUkVBSyBzaWduYWwgY291bnQKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAzMjogICAgU2V0IHRoZSBTL1cgZmxvdyBjb250cm9sIG5ldyBYT04vWE9GRiB2YWx1ZSwgZGVmYXVsdAorICogICAgICAgICAgICAgICAgICAgICAgWE9OIGlzIDB4MTEgJiBYT0ZGIGlzIDB4MTMuCisgKiAgICAgIFN5bnRheDoKKyAqICAgICAgdm9pZCBNb3hhUG9ydFNldFhvblhvZmYoaW50IHBvcnQsIGludCB4b25WYWx1ZSwgaW50IHhvZmZWYWx1ZSk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgaW50IHhvblZhbHVlICAgICAgIDogbmV3IFhPTiB2YWx1ZSAoMCAtIDI1NSkKKyAqICAgICAgICAgICBpbnQgeG9mZlZhbHVlICAgICAgOiBuZXcgWE9GRiB2YWx1ZSAoMCAtIDI1NSkKKyAqCisgKgorICogICAgICBGdW5jdGlvbiAzMzogICAgQ2hlY2sgdGhpcyBwb3J0J3MgdHJhbnNtaXNzaW9uIGlzIGhvbGQgYnkgcmVtb3RlIHNpdGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIGZsb3cgY29udHJvbC4KKyAqICAgICAgU3ludGF4OgorICogICAgICBpbnQgIE1veGFQb3J0SXNUeEhvbGQoaW50IHBvcnQpOworICogICAgICAgICAgIGludCBwb3J0ICAgICAgICAgICA6IHBvcnQgbnVtYmVyICgwIC0gMTI3KQorICoKKyAqICAgICAgICAgICByZXR1cm46ICAgIDAgICAgICAgOiBub3JtYWwKKyAqICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgOiBob2xkIGJ5IHJlbW90ZSBzaXRlCisgKgorICoKKyAqICAgICAgRnVuY3Rpb24gMzQ6ICAgIFNlbmQgb3V0IGEgQlJFQUsgc2lnbmFsLgorICogICAgICBTeW50YXg6CisgKiAgICAgIHZvaWQgTW94YVBvcnRTZW5kQnJlYWsoaW50IHBvcnQsIGludCBtczEwMCk7CisgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCisgKiAgICAgICAgICAgaW50IG1zMTAwICAgICAgICAgIDogYnJlYWsgc2lnbmFsIHRpbWUgaW50ZXJ2YWwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogMTAwIG1pbmktc2Vjb25kLiBpZiBtczEwMCA9PSAwLCBpdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZCBvdXQgYSBhYm91dCAyNTAgbXMgQlJFQUsgc2lnbmFsLgorICoKKyAqLworaW50IE1veGFQb3J0SXNWYWxpZChpbnQgcG9ydCkKK3sKKworCWlmIChtb3hhQ2FyZCA9PSAwKQorCQlyZXR1cm4gKDApOworCWlmIChtb3hhQ2hrUG9ydFtwb3J0XSA9PSAwKQorCQlyZXR1cm4gKDApOworCXJldHVybiAoMSk7Cit9CisKK3ZvaWQgTW94YVBvcnRFbmFibGUoaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCWludCBNb3hhUG9ydExpbmVTdGF0dXMoaW50KTsKKwlzaG9ydCBsb3d3YXRlciA9IDUxMjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXdyaXRldyhsb3d3YXRlciwgb2ZzQWRkciArIExvd193YXRlcik7CisJbW94YUJyZWFrQ250W3BvcnRdID0gMDsKKwlpZiAoKG1veGFfYm9hcmRzW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX0lTQSkgfHwKKwkgICAgKG1veGFfYm9hcmRzW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXS5ib2FyZFR5cGUgPT0gTU9YQV9CT0FSRF9DMzIwX1BDSSkpIHsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0QnJlYWtJcnEsIDApOworCX0gZWxzZSB7CisJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgSG9zdFN0YXQpIHwgV2FrZXVwQnJlYWssIG9mc0FkZHIgKyBIb3N0U3RhdCk7CisJfQorCisJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0TGluZUlycSwgTWFnaWNfY29kZSk7CisJbW94YWZ1bmMob2ZzQWRkciwgRkNfRmx1c2hRdWV1ZSwgMik7CisKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19FbmFibGVDSCwgTWFnaWNfY29kZSk7CisJTW94YVBvcnRMaW5lU3RhdHVzKHBvcnQpOworfQorCit2b2lkIE1veGFQb3J0RGlzYWJsZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCisJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0Rmxvd0N0bCwgMCk7CS8qIGRpc2FibGUgZmxvdyBjb250cm9sICovCisJbW94YWZ1bmMob2ZzQWRkciwgRkNfQ2xyTGluZUlycSwgTWFnaWNfY29kZSk7CisJd3JpdGV3KDAsIG9mc0FkZHIgKyBIb3N0U3RhdCk7CisJbW94YWZ1bmMob2ZzQWRkciwgRkNfRGlzYWJsZUNILCBNYWdpY19jb2RlKTsKK30KKworbG9uZyBNb3hhUG9ydEdldE1heEJhdWQoaW50IHBvcnQpCit7CisJaWYgKChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9JU0EpIHx8CisJICAgIChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9QQ0kpKQorCQlyZXR1cm4gKDQ2MDgwMEwpOworCWVsc2UKKwkJcmV0dXJuICg5MjE2MDBMKTsKK30KKworCitsb25nIE1veGFQb3J0U2V0QmF1ZChpbnQgcG9ydCwgbG9uZyBiYXVkKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlsb25nIG1heCwgY2xvY2s7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmICgoYmF1ZCA8IDUwTCkgfHwgKChtYXggPSBNb3hhUG9ydEdldE1heEJhdWQocG9ydCkpID09IDApKQorCQlyZXR1cm4gKDApOworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCWlmIChiYXVkID4gbWF4KQorCQliYXVkID0gbWF4OworCWlmIChtYXggPT0gMzg0MDBMKQorCQljbG9jayA9IDYxNDQwMEw7CS8qIGZvciA5LjgzMDQgTWh6IDogbWF4LiAzODQwMCBicHMgKi8KKwllbHNlIGlmIChtYXggPT0gNTc2MDBMKQorCQljbG9jayA9IDY5MTIwMEw7CS8qIGZvciAxMS4wNTkyIE1oeiA6IG1heC4gNTc2MDAgYnBzICovCisJZWxzZQorCQljbG9jayA9IDkyMTYwMEw7CS8qIGZvciAxNC43NDU2IE1oeiA6IG1heC4gMTE1MjAwIGJwcyAqLworCXZhbCA9IGNsb2NrIC8gYmF1ZDsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRCYXVkLCB2YWwpOworCWJhdWQgPSBjbG9jayAvIHZhbDsKKwltb3hhQ3VyQmF1ZFtwb3J0XSA9IGJhdWQ7CisJcmV0dXJuIChiYXVkKTsKK30KKworaW50IE1veGFQb3J0U2V0VGVybWlvKGludCBwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwl0Y2ZsYWdfdCBjZmxhZzsKKwlsb25nIGJhdWQ7CisJdGNmbGFnX3QgbW9kZSA9IDA7CisKKwlpZiAobW94YUNoa1BvcnRbcG9ydF0gPT0gMCB8fCB0ZXJtaW8gPT0gMCkKKwkJcmV0dXJuICgtMSk7CisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJY2ZsYWcgPSB0ZXJtaW8tPmNfY2ZsYWc7CS8qIHRlcm1pby0+Y19jZmxhZyAqLworCisJbW9kZSA9IHRlcm1pby0+Y19jZmxhZyAmIENTSVpFOworCWlmIChtb2RlID09IENTNSkKKwkJbW9kZSA9IE1YX0NTNTsKKwllbHNlIGlmIChtb2RlID09IENTNikKKwkJbW9kZSA9IE1YX0NTNjsKKwllbHNlIGlmIChtb2RlID09IENTNykKKwkJbW9kZSA9IE1YX0NTNzsKKwllbHNlIGlmIChtb2RlID09IENTOCkKKwkJbW9kZSA9IE1YX0NTODsKKworCWlmICh0ZXJtaW8tPmNfY2ZsYWcgJiBDU1RPUEIpIHsKKwkJaWYgKG1vZGUgPT0gTVhfQ1M1KQorCQkJbW9kZSB8PSBNWF9TVE9QMTU7CisJCWVsc2UKKwkJCW1vZGUgfD0gTVhfU1RPUDI7CisJfSBlbHNlCisJCW1vZGUgfD0gTVhfU1RPUDE7CisKKwlpZiAodGVybWlvLT5jX2NmbGFnICYgUEFSRU5CKSB7CisJCWlmICh0ZXJtaW8tPmNfY2ZsYWcgJiBQQVJPREQpCisJCQltb2RlIHw9IE1YX1BBUk9ERDsKKwkJZWxzZQorCQkJbW9kZSB8PSBNWF9QQVJFVkVOOworCX0gZWxzZQorCQltb2RlIHw9IE1YX1BBUk5PTkU7CisKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXREYXRhTW9kZSwgKHVzaG9ydCkgbW9kZSk7CisKKwljZmxhZyAmPSAoQ0JBVUQgfCBDQkFVREVYKTsKKyNpZm5kZWYgQjkyMTYwMAorI2RlZmluZQlCOTIxNjAwCShCNDYwODAwKzEpCisjZW5kaWYKKwlzd2l0Y2ggKGNmbGFnKSB7CisJY2FzZSBCOTIxNjAwOgorCQliYXVkID0gOTIxNjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCNDYwODAwOgorCQliYXVkID0gNDYwODAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMjMwNDAwOgorCQliYXVkID0gMjMwNDAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMTE1MjAwOgorCQliYXVkID0gMTE1MjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCNTc2MDA6CisJCWJhdWQgPSA1NzYwMEw7CisJCWJyZWFrOworCWNhc2UgQjM4NDAwOgorCQliYXVkID0gMzg0MDBMOworCQlicmVhazsKKwljYXNlIEIxOTIwMDoKKwkJYmF1ZCA9IDE5MjAwTDsKKwkJYnJlYWs7CisJY2FzZSBCOTYwMDoKKwkJYmF1ZCA9IDk2MDBMOworCQlicmVhazsKKwljYXNlIEI0ODAwOgorCQliYXVkID0gNDgwMEw7CisJCWJyZWFrOworCWNhc2UgQjI0MDA6CisJCWJhdWQgPSAyNDAwTDsKKwkJYnJlYWs7CisJY2FzZSBCMTgwMDoKKwkJYmF1ZCA9IDE4MDBMOworCQlicmVhazsKKwljYXNlIEIxMjAwOgorCQliYXVkID0gMTIwMEw7CisJCWJyZWFrOworCWNhc2UgQjYwMDoKKwkJYmF1ZCA9IDYwMEw7CisJCWJyZWFrOworCWNhc2UgQjMwMDoKKwkJYmF1ZCA9IDMwMEw7CisJCWJyZWFrOworCWNhc2UgQjIwMDoKKwkJYmF1ZCA9IDIwMEw7CisJCWJyZWFrOworCWNhc2UgQjE1MDoKKwkJYmF1ZCA9IDE1MEw7CisJCWJyZWFrOworCWNhc2UgQjEzNDoKKwkJYmF1ZCA9IDEzNEw7CisJCWJyZWFrOworCWNhc2UgQjExMDoKKwkJYmF1ZCA9IDExMEw7CisJCWJyZWFrOworCWNhc2UgQjc1OgorCQliYXVkID0gNzVMOworCQlicmVhazsKKwljYXNlIEI1MDoKKwkJYmF1ZCA9IDUwTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmF1ZCA9IDA7CisJfQorCWlmICgobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfSVNBKSB8fAorCSAgICAobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfUENJKSkgeworCQlpZiAoYmF1ZCA9PSA5MjE2MDBMKQorCQkJcmV0dXJuICgtMSk7CisJfQorCU1veGFQb3J0U2V0QmF1ZChwb3J0LCBiYXVkKTsKKworCWlmICh0ZXJtaW8tPmNfaWZsYWcgJiAoSVhPTiB8IElYT0ZGIHwgSVhBTlkpKSB7CisJCXdyaXRlYih0ZXJtaW8tPmNfY2NbVlNUQVJUXSwgb2ZzQWRkciArIEZ1bmNBcmcpOworCQl3cml0ZWIodGVybWlvLT5jX2NjW1ZTVE9QXSwgb2ZzQWRkciArIEZ1bmNBcmcxKTsKKwkJd3JpdGViKEZDX1NldFhvblhvZmYsIG9mc0FkZHIgKyBGdW5jQ29kZSk7CisJCXdhaXRfZmluaXNoKG9mc0FkZHIpOworCisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludCBNb3hhUG9ydEdldExpbmVPdXQoaW50IHBvcnQsIGludCAqZHRyU3RhdGUsIGludCAqcnRzU3RhdGUpCit7CisKKwlpZiAoIU1veGFQb3J0SXNWYWxpZChwb3J0KSkKKwkJcmV0dXJuICgtMSk7CisJaWYgKGR0clN0YXRlKSB7CisJCWlmIChtb3hhTGluZUN0cmxbcG9ydF0gJiBEVFJfT04pCisJCQkqZHRyU3RhdGUgPSAxOworCQllbHNlCisJCQkqZHRyU3RhdGUgPSAwOworCX0KKwlpZiAocnRzU3RhdGUpIHsKKwkJaWYgKG1veGFMaW5lQ3RybFtwb3J0XSAmIFJUU19PTikKKwkJCSpydHNTdGF0ZSA9IDE7CisJCWVsc2UKKwkJCSpydHNTdGF0ZSA9IDA7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3ZvaWQgTW94YVBvcnRMaW5lQ3RybChpbnQgcG9ydCwgaW50IGR0ciwgaW50IHJ0cykKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IG1vZGU7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwltb2RlID0gMDsKKwlpZiAoZHRyKQorCQltb2RlIHw9IERUUl9PTjsKKwlpZiAocnRzKQorCQltb2RlIHw9IFJUU19PTjsKKwltb3hhTGluZUN0cmxbcG9ydF0gPSBtb2RlOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX0xpbmVDb250cm9sLCBtb2RlKTsKK30KKwordm9pZCBNb3hhUG9ydEZsb3dDdHJsKGludCBwb3J0LCBpbnQgcnRzLCBpbnQgY3RzLCBpbnQgdHhmbG93LCBpbnQgcnhmbG93LCBpbnQgdHhhbnkpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCWludCBtb2RlOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJbW9kZSA9IDA7CisJaWYgKHJ0cykKKwkJbW9kZSB8PSBSVFNfRmxvd0N0bDsKKwlpZiAoY3RzKQorCQltb2RlIHw9IENUU19GbG93Q3RsOworCWlmICh0eGZsb3cpCisJCW1vZGUgfD0gVHhfRmxvd0N0bDsKKwlpZiAocnhmbG93KQorCQltb2RlIHw9IFJ4X0Zsb3dDdGw7CisJaWYgKHR4YW55KQorCQltb2RlIHw9IElYTV9JWEFOWTsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRGbG93Q3RsLCBtb2RlKTsKK30KKworaW50IE1veGFQb3J0TGluZVN0YXR1cyhpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IHZhbDsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCWlmICgobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfSVNBKSB8fAorCSAgICAobW94YV9ib2FyZHNbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0MzMjBfUENJKSkgeworCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19MaW5lU3RhdHVzLCAwKTsKKwkJdmFsID0gcmVhZHcob2ZzQWRkciArIEZ1bmNBcmcpOworCX0gZWxzZSB7CisJCXZhbCA9IHJlYWR3KG9mc0FkZHIgKyBGbGFnU3RhdCkgPj4gNDsKKwl9CisJdmFsICY9IDB4MEI7CisJaWYgKHZhbCAmIDgpIHsKKwkJdmFsIHw9IDQ7CisJCWlmICgobW94YURDRFN0YXRlW3BvcnRdICYgRENEX29sZHN0YXRlKSA9PSAwKQorCQkJbW94YURDRFN0YXRlW3BvcnRdID0gKERDRF9vbGRzdGF0ZSB8IERDRF9jaGFuZ2VkKTsKKwl9IGVsc2UgeworCQlpZiAobW94YURDRFN0YXRlW3BvcnRdICYgRENEX29sZHN0YXRlKQorCQkJbW94YURDRFN0YXRlW3BvcnRdID0gRENEX2NoYW5nZWQ7CisJfQorCXZhbCAmPSA3OworCXJldHVybiAodmFsKTsKK30KKworaW50IE1veGFQb3J0RENEQ2hhbmdlKGludCBwb3J0KQoreworCWludCBuOworCisJaWYgKG1veGFDaGtQb3J0W3BvcnRdID09IDApCisJCXJldHVybiAoMCk7CisJbiA9IG1veGFEQ0RTdGF0ZVtwb3J0XTsKKwltb3hhRENEU3RhdGVbcG9ydF0gJj0gfkRDRF9jaGFuZ2VkOworCW4gJj0gRENEX2NoYW5nZWQ7CisJcmV0dXJuIChuKTsKK30KKworaW50IE1veGFQb3J0RENET04oaW50IHBvcnQpCit7CisJaW50IG47CisKKwlpZiAobW94YUNoa1BvcnRbcG9ydF0gPT0gMCkKKwkJcmV0dXJuICgwKTsKKwlpZiAobW94YURDRFN0YXRlW3BvcnRdICYgRENEX29sZHN0YXRlKQorCQluID0gMTsKKwllbHNlCisJCW4gPSAwOworCXJldHVybiAobik7Cit9CisKKworLyoKKyAgIGludCBNb3hhRHVtcE1lbShpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciwgaW50IGxlbikKKyAgIHsKKyAgIGludCAgICAgICAgICBpOworICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBiYXNlQWRkcixvZnNBZGRyLG9mczsKKworICAgYmFzZUFkZHIgPSBtb3hhQmFzZUFkZHJbcG9ydCAvIE1BWF9QT1JUU19QRVJfQk9BUkRdOworICAgb2ZzID0gYmFzZUFkZHIgKyBEeW5QYWdlX2FkZHIgKyBwYWdlb2ZzOworICAgaWYgKGxlbiA+IDB4MjAwMEwpCisgICBsZW4gPSAweDIwMDBMOworICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgYnVmZmVyW2ldID0gcmVhZGIob2ZzK2kpOworICAgfQorICovCisKKworaW50IE1veGFQb3J0V3JpdGVEYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBjLCB0b3RhbCwgaTsKKwl1c2hvcnQgdGFpbDsKKwlpbnQgY250OworCXVzaG9ydCBoZWFkLCB0eF9tYXNrLCBzcGFnZSwgZXBhZ2U7CisJdXNob3J0IHBhZ2VubywgcGFnZW9mcywgYnVmaGVhZDsKKwl2b2lkIF9faW9tZW0gKmJhc2VBZGRyLCAqb2ZzQWRkciwgKm9mczsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCWJhc2VBZGRyID0gbW94YUJhc2VBZGRyW3BvcnQgLyBNQVhfUE9SVFNfUEVSX0JPQVJEXTsKKwl0eF9tYXNrID0gcmVhZHcob2ZzQWRkciArIFRYX21hc2spOworCXNwYWdlID0gcmVhZHcob2ZzQWRkciArIFBhZ2VfdHhiKTsKKwllcGFnZSA9IHJlYWR3KG9mc0FkZHIgKyBFbmRQYWdlX3R4Yik7CisJdGFpbCA9IHJlYWR3KG9mc0FkZHIgKyBUWHdwdHIpOworCWhlYWQgPSByZWFkdyhvZnNBZGRyICsgVFhycHRyKTsKKwljID0gKGhlYWQgPiB0YWlsKSA/IChoZWFkIC0gdGFpbCAtIDEpCisJICAgIDogKGhlYWQgLSB0YWlsICsgdHhfbWFzayk7CisJaWYgKGMgPiBsZW4pCisJCWMgPSBsZW47CisJbW94YUxvZy50eGNudFtwb3J0XSArPSBjOworCXRvdGFsID0gYzsKKwlpZiAoc3BhZ2UgPT0gZXBhZ2UpIHsKKwkJYnVmaGVhZCA9IHJlYWR3KG9mc0FkZHIgKyBPZnNfdHhiKTsKKwkJd3JpdGV3KHNwYWdlLCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsKKwkJd2hpbGUgKGMgPiAwKSB7CisJCQlpZiAoaGVhZCA+IHRhaWwpCisJCQkJbGVuID0gaGVhZCAtIHRhaWwgLSAxOworCQkJZWxzZQorCQkJCWxlbiA9IHR4X21hc2sgKyAxIC0gdGFpbDsKKwkJCWxlbiA9IChjID4gbGVuKSA/IGxlbiA6IGM7CisJCQlvZnMgPSBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIGJ1ZmhlYWQgKyB0YWlsOworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCXdyaXRlYigqYnVmZmVyKyssIG9mcyArIGkpOworCQkJdGFpbCA9ICh0YWlsICsgbGVuKSAmIHR4X21hc2s7CisJCQljIC09IGxlbjsKKwkJfQorCQl3cml0ZXcodGFpbCwgb2ZzQWRkciArIFRYd3B0cik7CisJfSBlbHNlIHsKKwkJbGVuID0gYzsKKwkJcGFnZW5vID0gc3BhZ2UgKyAodGFpbCA+PiAxMyk7CisJCXBhZ2VvZnMgPSB0YWlsICYgUGFnZV9tYXNrOworCQlkbyB7CisJCQljbnQgPSBQYWdlX3NpemUgLSBwYWdlb2ZzOworCQkJaWYgKGNudCA+IGMpCisJCQkJY250ID0gYzsKKwkJCWMgLT0gY250OworCQkJd3JpdGViKHBhZ2VubywgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CisJCQlvZnMgPSBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIHBhZ2VvZnM7CisJCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCQkJd3JpdGViKCpidWZmZXIrKywgb2ZzICsgaSk7CisJCQlpZiAoYyA9PSAwKSB7CisJCQkJd3JpdGV3KCh0YWlsICsgbGVuKSAmIHR4X21hc2ssIG9mc0FkZHIgKyBUWHdwdHIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCsrcGFnZW5vID09IGVwYWdlKQorCQkJCXBhZ2VubyA9IHNwYWdlOworCQkJcGFnZW9mcyA9IDA7CisJCX0gd2hpbGUgKDEpOworCX0KKwl3cml0ZWIoMSwgb2ZzQWRkciArIENEMTgwVFhpcnEpOwkvKiBzdGFydCB0byBzZW5kICovCisJcmV0dXJuICh0b3RhbCk7Cit9CisKK2ludCBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgc3BhY2UpCit7CisJcmVnaXN0ZXIgdXNob3J0IGhlYWQsIHBhZ2VvZnM7CisJaW50IGksIGNvdW50LCBjbnQsIGxlbiwgdG90YWwsIHJlbWFpbjsKKwl1c2hvcnQgdGFpbCwgcnhfbWFzaywgc3BhZ2UsIGVwYWdlOworCXVzaG9ydCBwYWdlbm8sIGJ1ZmhlYWQ7CisJdm9pZCBfX2lvbWVtICpiYXNlQWRkciwgKm9mc0FkZHIsICpvZnM7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwliYXNlQWRkciA9IG1veGFCYXNlQWRkcltwb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF07CisJaGVhZCA9IHJlYWR3KG9mc0FkZHIgKyBSWHJwdHIpOworCXRhaWwgPSByZWFkdyhvZnNBZGRyICsgUlh3cHRyKTsKKwlyeF9tYXNrID0gcmVhZHcob2ZzQWRkciArIFJYX21hc2spOworCXNwYWdlID0gcmVhZHcob2ZzQWRkciArIFBhZ2VfcnhiKTsKKwllcGFnZSA9IHJlYWR3KG9mc0FkZHIgKyBFbmRQYWdlX3J4Yik7CisJY291bnQgPSAodGFpbCA+PSBoZWFkKSA/ICh0YWlsIC0gaGVhZCkKKwkgICAgOiAodGFpbCAtIGhlYWQgKyByeF9tYXNrICsgMSk7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAoMCk7CisKKwl0b3RhbCA9IChzcGFjZSA+IGNvdW50KSA/IGNvdW50IDogc3BhY2U7CisJcmVtYWluID0gY291bnQgLSB0b3RhbDsKKwltb3hhTG9nLnJ4Y250W3BvcnRdICs9IHRvdGFsOworCWNvdW50ID0gdG90YWw7CisJaWYgKHNwYWdlID09IGVwYWdlKSB7CisJCWJ1ZmhlYWQgPSByZWFkdyhvZnNBZGRyICsgT2ZzX3J4Yik7CisJCXdyaXRldyhzcGFnZSwgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCWlmICh0YWlsID49IGhlYWQpCisJCQkJbGVuID0gdGFpbCAtIGhlYWQ7CisJCQllbHNlCisJCQkJbGVuID0gcnhfbWFzayArIDEgLSBoZWFkOworCQkJbGVuID0gKGNvdW50ID4gbGVuKSA/IGxlbiA6IGNvdW50OworCQkJb2ZzID0gYmFzZUFkZHIgKyBEeW5QYWdlX2FkZHIgKyBidWZoZWFkICsgaGVhZDsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCQkqYnVmZmVyKysgPSByZWFkYihvZnMgKyBpKTsKKwkJCWhlYWQgPSAoaGVhZCArIGxlbikgJiByeF9tYXNrOworCQkJY291bnQgLT0gbGVuOworCQl9CisJCXdyaXRldyhoZWFkLCBvZnNBZGRyICsgUlhycHRyKTsKKwl9IGVsc2UgeworCQlsZW4gPSBjb3VudDsKKwkJcGFnZW5vID0gc3BhZ2UgKyAoaGVhZCA+PiAxMyk7CisJCXBhZ2VvZnMgPSBoZWFkICYgUGFnZV9tYXNrOworCQlkbyB7CisJCQljbnQgPSBQYWdlX3NpemUgLSBwYWdlb2ZzOworCQkJaWYgKGNudCA+IGNvdW50KQorCQkJCWNudCA9IGNvdW50OworCQkJY291bnQgLT0gY250OworCQkJd3JpdGV3KHBhZ2VubywgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CisJCQlvZnMgPSBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIHBhZ2VvZnM7CisJCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCQkJKmJ1ZmZlcisrID0gcmVhZGIob2ZzICsgaSk7CisJCQlpZiAoY291bnQgPT0gMCkgeworCQkJCXdyaXRldygoaGVhZCArIGxlbikgJiByeF9tYXNrLCBvZnNBZGRyICsgUlhycHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgrK3BhZ2VubyA9PSBlcGFnZSkKKwkJCQlwYWdlbm8gPSBzcGFnZTsKKwkJCXBhZ2VvZnMgPSAwOworCQl9IHdoaWxlICgxKTsKKwl9CisJaWYgKChyZWFkYihvZnNBZGRyICsgRmxhZ1N0YXQpICYgWG9mZl9zdGF0ZSkgJiYgKHJlbWFpbiA8IExvd1dhdGVyKSkgeworCQltb3hhTG93V2F0ZXJDaGsgPSAxOworCQltb3hhTG93Q2hrRmxhZ1twb3J0XSA9IDE7CisJfQorCXJldHVybiAodG90YWwpOworfQorCisKK2ludCBNb3hhUG9ydFR4UXVldWUoaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCXVzaG9ydCBycHRyLCB3cHRyLCBtYXNrOworCWludCBsZW47CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlycHRyID0gcmVhZHcob2ZzQWRkciArIFRYcnB0cik7CisJd3B0ciA9IHJlYWR3KG9mc0FkZHIgKyBUWHdwdHIpOworCW1hc2sgPSByZWFkdyhvZnNBZGRyICsgVFhfbWFzayk7CisJbGVuID0gKHdwdHIgLSBycHRyKSAmIG1hc2s7CisJcmV0dXJuIChsZW4pOworfQorCitpbnQgTW94YVBvcnRUeEZyZWUoaW50IHBvcnQpCit7CisJdm9pZCBfX2lvbWVtICpvZnNBZGRyOworCXVzaG9ydCBycHRyLCB3cHRyLCBtYXNrOworCWludCBsZW47CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlycHRyID0gcmVhZHcob2ZzQWRkciArIFRYcnB0cik7CisJd3B0ciA9IHJlYWR3KG9mc0FkZHIgKyBUWHdwdHIpOworCW1hc2sgPSByZWFkdyhvZnNBZGRyICsgVFhfbWFzayk7CisJbGVuID0gbWFzayAtICgod3B0ciAtIHJwdHIpICYgbWFzayk7CisJcmV0dXJuIChsZW4pOworfQorCitpbnQgTW94YVBvcnRSeFF1ZXVlKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwl1c2hvcnQgcnB0ciwgd3B0ciwgbWFzazsKKwlpbnQgbGVuOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJcnB0ciA9IHJlYWR3KG9mc0FkZHIgKyBSWHJwdHIpOworCXdwdHIgPSByZWFkdyhvZnNBZGRyICsgUlh3cHRyKTsKKwltYXNrID0gcmVhZHcob2ZzQWRkciArIFJYX21hc2spOworCWxlbiA9ICh3cHRyIC0gcnB0cikgJiBtYXNrOworCXJldHVybiAobGVuKTsKK30KKworCit2b2lkIE1veGFQb3J0VHhEaXNhYmxlKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldFhvZmZTdGF0ZSwgTWFnaWNfY29kZSk7Cit9CisKK3ZvaWQgTW94YVBvcnRUeEVuYWJsZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRYb25TdGF0ZSwgTWFnaWNfY29kZSk7Cit9CisKKworaW50IE1veGFQb3J0UmVzZXRCcmtDbnQoaW50IHBvcnQpCit7CisJdXNob3J0IGNudDsKKwljbnQgPSBtb3hhQnJlYWtDbnRbcG9ydF07CisJbW94YUJyZWFrQ250W3BvcnRdID0gMDsKKwlyZXR1cm4gKGNudCk7Cit9CisKKwordm9pZCBNb3hhUG9ydFNlbmRCcmVhayhpbnQgcG9ydCwgaW50IG1zMTAwKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCWlmIChtczEwMCkgeworCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZW5kQnJlYWssIE1hZ2ljX2NvZGUpOworCQltb3hhZGVsYXkobXMxMDAgKiAoSFogLyAxMCkpOworCX0gZWxzZSB7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NlbmRCcmVhaywgTWFnaWNfY29kZSk7CisJCW1veGFkZWxheShIWiAvIDQpOwkvKiAyNTAgbXMgKi8KKwl9CisJbW94YWZ1bmMob2ZzQWRkciwgRkNfU3RvcEJyZWFrLCBNYWdpY19jb2RlKTsKK30KKworc3RhdGljIGludCBtb3hhX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbW94YV9zdHIgKmluZm8sCisJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLnR5cGUgPSBpbmZvLT50eXBlOworCXRtcC5saW5lID0gaW5mby0+cG9ydDsKKwl0bXAucG9ydCA9IDA7CisJdG1wLmlycSA9IDA7CisJdG1wLmZsYWdzID0gaW5mby0+YXN5bmNmbGFnczsKKwl0bXAuYmF1ZF9iYXNlID0gOTIxNjAwOworCXRtcC5jbG9zZV9kZWxheSA9IGluZm8tPmNsb3NlX2RlbGF5OworCXRtcC5jbG9zaW5nX3dhaXQgPSBpbmZvLT5jbG9zaW5nX3dhaXQ7CisJdG1wLmN1c3RvbV9kaXZpc29yID0gMDsKKwl0bXAuaHViNiA9IDA7CisJaWYoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gKDApOworfQorCisKK3N0YXRpYyBpbnQgbW94YV9zZXRfc2VyaWFsX2luZm8oc3RydWN0IG1veGFfc3RyICppbmZvLAorCQkJCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3X2luZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKKworCWlmKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLCBuZXdfaW5mbywgc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKG5ld19zZXJpYWwuaXJxICE9IDApIHx8CisJICAgIChuZXdfc2VyaWFsLnBvcnQgIT0gMCkgfHwKKy8vICAgICAgICAgICAobmV3X3NlcmlhbC50eXBlICE9IGluZm8tPnR5cGUpIHx8CisJICAgIChuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yICE9IDApIHx8CisJICAgIChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSA5MjE2MDApKQorCQlyZXR1cm4gKC1FUEVSTSk7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKCgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAoaW5mby0+YXN5bmNmbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJcmV0dXJuICgtRVBFUk0pOworCX0gZWxzZSB7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaIC8gMTAwOworCX0KKworCW5ld19zZXJpYWwuZmxhZ3MgPSAobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19GTEFHUyk7CisJbmV3X3NlcmlhbC5mbGFncyB8PSAoaW5mby0+YXN5bmNmbGFncyAmIEFTWU5DX0ZMQUdTKTsKKworCWlmIChuZXdfc2VyaWFsLnR5cGUgPT0gUE9SVF8xNjU1MEEpIHsKKwkJTW94YVNldEZpZm8oaW5mby0+cG9ydCwgMSk7CisJfSBlbHNlIHsKKwkJTW94YVNldEZpZm8oaW5mby0+cG9ydCwgMCk7CisJfQorCisJaW5mby0+dHlwZSA9IG5ld19zZXJpYWwudHlwZTsKKwlyZXR1cm4gKDApOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglTdGF0aWMgbG9jYWwgZnVuY3Rpb25zOiAJCQkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG1veGFkZWxheSAtIGRlbGF5cyBhIHNwZWNpZmllZCBudW1iZXIgdGlja3MKKyAqLworc3RhdGljIHZvaWQgbW94YWRlbGF5KGludCB0aWNrKQoreworCXVuc2lnbmVkIGxvbmcgc3QsIGV0OworCisJc3QgPSBqaWZmaWVzOworCWV0ID0gc3QgKyB0aWNrOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBldCkpOworfQorCitzdGF0aWMgdm9pZCBtb3hhZnVuYyh2b2lkIF9faW9tZW0gKm9mc0FkZHIsIGludCBjbWQsIHVzaG9ydCBhcmcpCit7CisKKwl3cml0ZXcoYXJnLCBvZnNBZGRyICsgRnVuY0FyZyk7CisJd3JpdGV3KGNtZCwgb2ZzQWRkciArIEZ1bmNDb2RlKTsKKwl3YWl0X2ZpbmlzaChvZnNBZGRyKTsKK30KKworc3RhdGljIHZvaWQgd2FpdF9maW5pc2godm9pZCBfX2lvbWVtICpvZnNBZGRyKQoreworCXVuc2lnbmVkIGxvbmcgaSwgajsKKworCWkgPSBqaWZmaWVzOworCXdoaWxlIChyZWFkdyhvZnNBZGRyICsgRnVuY0NvZGUpICE9IDApIHsKKwkJaiA9IGppZmZpZXM7CisJCWlmICgoaiAtIGkpID4gbW94YUZ1bmNUb3V0KSB7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvd193YXRlcl9jaGVjayh2b2lkIF9faW9tZW0gKm9mc0FkZHIpCit7CisJaW50IGxlbjsKKwl1c2hvcnQgcnB0ciwgd3B0ciwgbWFzazsKKworCWlmIChyZWFkYihvZnNBZGRyICsgRmxhZ1N0YXQpICYgWG9mZl9zdGF0ZSkgeworCQlycHRyID0gcmVhZHcob2ZzQWRkciArIFJYcnB0cik7CisJCXdwdHIgPSByZWFkdyhvZnNBZGRyICsgUlh3cHRyKTsKKwkJbWFzayA9IHJlYWR3KG9mc0FkZHIgKyBSWF9tYXNrKTsKKwkJbGVuID0gKHdwdHIgLSBycHRyKSAmIG1hc2s7CisJCWlmIChsZW4gPD0gTG93X3dhdGVyKQorCQkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2VuZFhvbiwgMCk7CisJfQorfQorCitzdGF0aWMgaW50IG1veGFsb2FkYmlvcyhpbnQgY2FyZG5vLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqdG1wLCBpbnQgbGVuKQoreworCXZvaWQgX19pb21lbSAqYmFzZUFkZHI7CisJaW50IGk7CisKKwlpZihjb3B5X2Zyb21fdXNlcihtb3hhQnVmZiwgdG1wLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwliYXNlQWRkciA9IG1veGFCYXNlQWRkcltjYXJkbm9dOworCXdyaXRlYihIV19yZXNldCwgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CS8qIHJlc2V0ICovCisJbW94YWRlbGF5KDEpOwkJLyogZGVsYXkgMTAgbXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDA5NjsgaSsrKQorCQl3cml0ZWIoMCwgYmFzZUFkZHIgKyBpKTsJLyogY2xlYXIgZml4IHBhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXdyaXRlYihtb3hhQnVmZltpXSwgYmFzZUFkZHIgKyBpKTsJLyogZG93bmxvYWQgQklPUyAqLworCXdyaXRlYigwLCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsJLyogcmVzdGFydCAqLworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YWZpbmRjYXJkKGludCBjYXJkbm8pCit7CisJdm9pZCBfX2lvbWVtICpiYXNlQWRkcjsKKwl1c2hvcnQgdG1wOworCisJYmFzZUFkZHIgPSBtb3hhQmFzZUFkZHJbY2FyZG5vXTsKKwlzd2l0Y2ggKG1veGFfYm9hcmRzW2NhcmRub10uYm9hcmRUeXBlKSB7CisJY2FzZSBNT1hBX0JPQVJEX0MyMThfSVNBOgorCWNhc2UgTU9YQV9CT0FSRF9DMjE4X1BDSToKKwkJaWYgKCh0bXAgPSByZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSkgIT0gQzIxOF9LZXlDb2RlKSB7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE1PWEFfQk9BUkRfQ1AyMDRKOgorCQlpZiAoKHRtcCA9IHJlYWR3KGJhc2VBZGRyICsgQzIxOF9rZXkpKSAhPSBDUDIwNEpfS2V5Q29kZSkgeworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKCh0bXAgPSByZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSkgIT0gQzMyMF9LZXlDb2RlKSB7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAoKHRtcCA9IHJlYWR3KGJhc2VBZGRyICsgQzMyMF9zdGF0dXMpKSAhPSBTVFNfaW5pdCkgeworCQkJcmV0dXJuICgtMik7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBtb3hhbG9hZDMyMGIoaW50IGNhcmRubywgdW5zaWduZWQgY2hhciBfX3VzZXIgKnRtcCwgaW50IGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2VBZGRyOworCWludCBpOworCisJaWYobGVuID4gc2l6ZW9mKG1veGFCdWZmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYoY29weV9mcm9tX3VzZXIobW94YUJ1ZmYsIHRtcCwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYmFzZUFkZHIgPSBtb3hhQmFzZUFkZHJbY2FyZG5vXTsKKwl3cml0ZXcobGVuIC0gNzE2OCAtIDIsIGJhc2VBZGRyICsgQzMyMGJhcGlfbGVuKTsKKwl3cml0ZWIoMSwgYmFzZUFkZHIgKyBDb250cm9sX3JlZyk7CS8qIFNlbGVjdCBQYWdlIDEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNzE2ODsgaSsrKQorCQl3cml0ZWIobW94YUJ1ZmZbaV0sIGJhc2VBZGRyICsgRHluUGFnZV9hZGRyICsgaSk7CisJd3JpdGViKDIsIGJhc2VBZGRyICsgQ29udHJvbF9yZWcpOwkvKiBTZWxlY3QgUGFnZSAyICovCisJZm9yIChpID0gMDsgaSA8IChsZW4gLSA3MTY4KTsgaSsrKQorCQl3cml0ZWIobW94YUJ1ZmZbaSArIDcxNjhdLCBiYXNlQWRkciArIER5blBhZ2VfYWRkciArIGkpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YWxvYWRjb2RlKGludCBjYXJkbm8sIHVuc2lnbmVkIGNoYXIgX191c2VyICp0bXAsIGludCBsZW4pCit7CisJdm9pZCBfX2lvbWVtICpiYXNlQWRkciwgKm9mc0FkZHI7CisJaW50IHJldHZhbCwgcG9ydCwgaTsKKworCWlmKGNvcHlfZnJvbV91c2VyKG1veGFCdWZmLCB0bXAsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWJhc2VBZGRyID0gbW94YUJhc2VBZGRyW2NhcmRub107CisJc3dpdGNoIChtb3hhX2JvYXJkc1tjYXJkbm9dLmJvYXJkVHlwZSkgeworCWNhc2UgTU9YQV9CT0FSRF9DMjE4X0lTQToKKwljYXNlIE1PWEFfQk9BUkRfQzIxOF9QQ0k6CisJY2FzZSBNT1hBX0JPQVJEX0NQMjA0SjoKKwkJcmV0dmFsID0gbW94YWxvYWRjMjE4KGNhcmRubywgYmFzZUFkZHIsIGxlbik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gKHJldHZhbCk7CisJCXBvcnQgPSBjYXJkbm8gKiBNQVhfUE9SVFNfUEVSX0JPQVJEOworCQlmb3IgKGkgPSAwOyBpIDwgbW94YV9ib2FyZHNbY2FyZG5vXS5udW1Qb3J0czsgaSsrLCBwb3J0KyspIHsKKwkJCW1veGFDaGtQb3J0W3BvcnRdID0gMTsKKwkJCW1veGFDdXJCYXVkW3BvcnRdID0gOTYwMEw7CisJCQltb3hhRENEU3RhdGVbcG9ydF0gPSAwOworCQkJbW94YVRhYmxlQWRkcltwb3J0XSA9IGJhc2VBZGRyICsgRXh0ZXJuX3RhYmxlICsgRXh0ZXJuX3NpemUgKiBpOworCQkJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJCQl3cml0ZXcoQzIxOHJ4X21hc2ssIG9mc0FkZHIgKyBSWF9tYXNrKTsKKwkJCXdyaXRldyhDMjE4dHhfbWFzaywgb2ZzQWRkciArIFRYX21hc2spOworCQkJd3JpdGV3KEMyMThyeF9zcGFnZSArIGkgKiBDMjE4YnVmX3BhZ2Vubywgb2ZzQWRkciArIFBhZ2VfcnhiKTsKKwkJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgUGFnZV9yeGIpICsgQzIxOHJ4X3BhZ2Vubywgb2ZzQWRkciArIEVuZFBhZ2VfcnhiKTsKKworCQkJd3JpdGV3KEMyMTh0eF9zcGFnZSArIGkgKiBDMjE4YnVmX3BhZ2Vubywgb2ZzQWRkciArIFBhZ2VfdHhiKTsKKwkJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgUGFnZV90eGIpICsgQzIxOHR4X3BhZ2Vubywgb2ZzQWRkciArIEVuZFBhZ2VfdHhiKTsKKworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IG1veGFsb2FkYzMyMChjYXJkbm8sIGJhc2VBZGRyLCBsZW4sCisJCQkJICAgICAgJm1veGFfYm9hcmRzW2NhcmRub10ubnVtUG9ydHMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIChyZXR2YWwpOworCQlwb3J0ID0gY2FyZG5vICogTUFYX1BPUlRTX1BFUl9CT0FSRDsKKwkJZm9yIChpID0gMDsgaSA8IG1veGFfYm9hcmRzW2NhcmRub10ubnVtUG9ydHM7IGkrKywgcG9ydCsrKSB7CisJCQltb3hhQ2hrUG9ydFtwb3J0XSA9IDE7CisJCQltb3hhQ3VyQmF1ZFtwb3J0XSA9IDk2MDBMOworCQkJbW94YURDRFN0YXRlW3BvcnRdID0gMDsKKwkJCW1veGFUYWJsZUFkZHJbcG9ydF0gPSBiYXNlQWRkciArIEV4dGVybl90YWJsZSArIEV4dGVybl9zaXplICogaTsKKwkJCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCQkJaWYgKG1veGFfYm9hcmRzW2NhcmRub10ubnVtUG9ydHMgPT0gOCkgeworCQkJCXdyaXRldyhDMzIwcDhyeF9tYXNrLCBvZnNBZGRyICsgUlhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwOHR4X21hc2ssIG9mc0FkZHIgKyBUWF9tYXNrKTsKKwkJCQl3cml0ZXcoQzMyMHA4cnhfc3BhZ2UgKyBpICogQzMyMHA4YnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3J4Yik7CisJCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3J4YikgKyBDMzIwcDhyeF9wZ25vLCBvZnNBZGRyICsgRW5kUGFnZV9yeGIpOworCQkJCXdyaXRldyhDMzIwcDh0eF9zcGFnZSArIGkgKiBDMzIwcDhidWZfcGdubywgb2ZzQWRkciArIFBhZ2VfdHhiKTsKKwkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIFBhZ2VfdHhiKSArIEMzMjBwOHR4X3Bnbm8sIG9mc0FkZHIgKyBFbmRQYWdlX3R4Yik7CisKKwkJCX0gZWxzZSBpZiAobW94YV9ib2FyZHNbY2FyZG5vXS5udW1Qb3J0cyA9PSAxNikgeworCQkJCXdyaXRldyhDMzIwcDE2cnhfbWFzaywgb2ZzQWRkciArIFJYX21hc2spOworCQkJCXdyaXRldyhDMzIwcDE2dHhfbWFzaywgb2ZzQWRkciArIFRYX21hc2spOworCQkJCXdyaXRldyhDMzIwcDE2cnhfc3BhZ2UgKyBpICogQzMyMHAxNmJ1Zl9wZ25vLCBvZnNBZGRyICsgUGFnZV9yeGIpOworCQkJCXdyaXRldyhyZWFkdyhvZnNBZGRyICsgUGFnZV9yeGIpICsgQzMyMHAxNnJ4X3Bnbm8sIG9mc0FkZHIgKyBFbmRQYWdlX3J4Yik7CisJCQkJd3JpdGV3KEMzMjBwMTZ0eF9zcGFnZSArIGkgKiBDMzIwcDE2YnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3R4Yik7CisJCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3R4YikgKyBDMzIwcDE2dHhfcGdubywgb2ZzQWRkciArIEVuZFBhZ2VfdHhiKTsKKworCQkJfSBlbHNlIGlmIChtb3hhX2JvYXJkc1tjYXJkbm9dLm51bVBvcnRzID09IDI0KSB7CisJCQkJd3JpdGV3KEMzMjBwMjRyeF9tYXNrLCBvZnNBZGRyICsgUlhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwMjR0eF9tYXNrLCBvZnNBZGRyICsgVFhfbWFzayk7CisJCQkJd3JpdGV3KEMzMjBwMjRyeF9zcGFnZSArIGkgKiBDMzIwcDI0YnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3J4Yik7CisJCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3J4YikgKyBDMzIwcDI0cnhfcGdubywgb2ZzQWRkciArIEVuZFBhZ2VfcnhiKTsKKwkJCQl3cml0ZXcoQzMyMHAyNHR4X3NwYWdlICsgaSAqIEMzMjBwMjRidWZfcGdubywgb2ZzQWRkciArIFBhZ2VfdHhiKTsKKwkJCQl3cml0ZXcocmVhZHcob2ZzQWRkciArIFBhZ2VfdHhiKSwgb2ZzQWRkciArIEVuZFBhZ2VfdHhiKTsKKwkJCX0gZWxzZSBpZiAobW94YV9ib2FyZHNbY2FyZG5vXS5udW1Qb3J0cyA9PSAzMikgeworCQkJCXdyaXRldyhDMzIwcDMycnhfbWFzaywgb2ZzQWRkciArIFJYX21hc2spOworCQkJCXdyaXRldyhDMzIwcDMydHhfbWFzaywgb2ZzQWRkciArIFRYX21hc2spOworCQkJCXdyaXRldyhDMzIwcDMydHhfb2ZzLCBvZnNBZGRyICsgT2ZzX3R4Yik7CisJCQkJd3JpdGV3KEMzMjBwMzJyeF9zcGFnZSArIGkgKiBDMzIwcDMyYnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3J4Yik7CisJCQkJd3JpdGV3KHJlYWRiKG9mc0FkZHIgKyBQYWdlX3J4YiksIG9mc0FkZHIgKyBFbmRQYWdlX3J4Yik7CisJCQkJd3JpdGV3KEMzMjBwMzJ0eF9zcGFnZSArIGkgKiBDMzIwcDMyYnVmX3Bnbm8sIG9mc0FkZHIgKyBQYWdlX3R4Yik7CisJCQkJd3JpdGV3KHJlYWR3KG9mc0FkZHIgKyBQYWdlX3R4YiksIG9mc0FkZHIgKyBFbmRQYWdlX3R4Yik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YWxvYWRjMjE4KGludCBjYXJkbm8sIHZvaWQgX19pb21lbSAqYmFzZUFkZHIsIGludCBsZW4pCit7CisJY2hhciByZXRyeTsKKwlpbnQgaSwgaiwgbGVuMSwgbGVuMjsKKwl1c2hvcnQgdXN1bSwgKnB0ciwga2V5Y29kZTsKKworCWlmIChtb3hhX2JvYXJkc1tjYXJkbm9dLmJvYXJkVHlwZSA9PSBNT1hBX0JPQVJEX0NQMjA0SikKKwkJa2V5Y29kZSA9IENQMjA0Sl9LZXlDb2RlOworCWVsc2UKKwkJa2V5Y29kZSA9IEMyMThfS2V5Q29kZTsKKwl1c3VtID0gMDsKKwlsZW4xID0gbGVuID4+IDE7CisJcHRyID0gKHVzaG9ydCAqKSBtb3hhQnVmZjsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuMTsgaSsrKQorCQl1c3VtICs9ICoocHRyICsgaSk7CisJcmV0cnkgPSAwOworCWRvIHsKKwkJbGVuMSA9IGxlbiA+PiAxOworCQlqID0gMDsKKwkJd2hpbGUgKGxlbjEpIHsKKwkJCWxlbjIgPSAobGVuMSA+IDIwNDgpID8gMjA0OCA6IGxlbjE7CisJCQlsZW4xIC09IGxlbjI7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuMiA8PCAxOyBpKyspCisJCQkJd3JpdGViKG1veGFCdWZmW2kgKyBqXSwgYmFzZUFkZHIgKyBDMjE4X0xvYWRCdWYgKyBpKTsKKwkJCWogKz0gaTsKKworCQkJd3JpdGV3KGxlbjIsIGJhc2VBZGRyICsgQzIxOERMb2FkX2xlbik7CisJCQl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMjE4X2tleSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMjE4X2tleSkgPT0ga2V5Y29kZSkKKwkJCQkJYnJlYWs7CisJCQkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCQkJfQorCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzIxOF9rZXkpICE9IGtleWNvZGUpIHsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJfQorCQl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMjE4RExvYWRfbGVuKTsKKwkJd3JpdGV3KHVzdW0sIGJhc2VBZGRyICsgQzIxOGNoZWNrX3N1bSk7CisJCXdyaXRldygwLCBiYXNlQWRkciArIEMyMThfa2V5KTsKKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMjE4X2tleSkgPT0ga2V5Y29kZSkKKwkJCQlicmVhazsKKwkJCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwkJfQorCQlyZXRyeSsrOworCX0gd2hpbGUgKChyZWFkYihiYXNlQWRkciArIEMyMThjaGtzdW1fb2spICE9IDEpICYmIChyZXRyeSA8IDMpKTsKKwlpZiAocmVhZGIoYmFzZUFkZHIgKyBDMjE4Y2hrc3VtX29rKSAhPSAxKSB7CisJCXJldHVybiAoLTEpOworCX0KKwl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMjE4X2tleSk7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQorCQkJYnJlYWs7CisJCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwl9CisJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCXdyaXRldygxLCBiYXNlQWRkciArIERpc2FibGVfSVJRKTsKKwl3cml0ZXcoMCwgYmFzZUFkZHIgKyBNYWdpY19ubyk7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQorCQkJYnJlYWs7CisJCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwl9CisJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCW1veGFDYXJkID0gMTsKKwltb3hhSW50TmR4W2NhcmRub10gPSBiYXNlQWRkciArIElSUWluZGV4OworCW1veGFJbnRQZW5kW2NhcmRub10gPSBiYXNlQWRkciArIElSUXBlbmRpbmc7CisJbW94YUludFRhYmxlW2NhcmRub10gPSBiYXNlQWRkciArIElSUXRhYmxlOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbW94YWxvYWRjMzIwKGludCBjYXJkbm8sIHZvaWQgX19pb21lbSAqYmFzZUFkZHIsIGludCBsZW4sIGludCAqbnVtUG9ydHMpCit7CisJdXNob3J0IHVzdW07CisJaW50IGksIGosIHdsZW4sIGxlbjIsIHJldHJ5OworCXVzaG9ydCAqdXB0cjsKKworCXVzdW0gPSAwOworCXdsZW4gPSBsZW4gPj4gMTsKKwl1cHRyID0gKHVzaG9ydCAqKSBtb3hhQnVmZjsKKwlmb3IgKGkgPSAwOyBpIDwgd2xlbjsgaSsrKQorCQl1c3VtICs9IHVwdHJbaV07CisJcmV0cnkgPSAwOworCWogPSAwOworCWRvIHsKKwkJd2hpbGUgKHdsZW4pIHsKKwkJCWlmICh3bGVuID4gMjA0OCkKKwkJCQlsZW4yID0gMjA0ODsKKwkJCWVsc2UKKwkJCQlsZW4yID0gd2xlbjsKKwkJCXdsZW4gLT0gbGVuMjsKKwkJCWxlbjIgPDw9IDE7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuMjsgaSsrKQorCQkJCXdyaXRlYihtb3hhQnVmZltqICsgaV0sIGJhc2VBZGRyICsgQzMyMF9Mb2FkQnVmICsgaSk7CisJCQlsZW4yID4+PSAxOworCQkJaiArPSBpOworCQkJd3JpdGV3KGxlbjIsIGJhc2VBZGRyICsgQzMyMERMb2FkX2xlbik7CisJCQl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMzIwX2tleSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSA9PSBDMzIwX0tleUNvZGUpCisJCQkJCWJyZWFrOworCQkJCW1veGFkZWxheSgxKTsKKwkJCX0KKwkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSAhPSBDMzIwX0tleUNvZGUpCisJCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJd3JpdGV3KDAsIGJhc2VBZGRyICsgQzMyMERMb2FkX2xlbik7CisJCXdyaXRldyh1c3VtLCBiYXNlQWRkciArIEMzMjBjaGVja19zdW0pOworCQl3cml0ZXcoMCwgYmFzZUFkZHIgKyBDMzIwX2tleSk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMzIwX2tleSkgPT0gQzMyMF9LZXlDb2RlKQorCQkJCWJyZWFrOworCQkJbW94YWRlbGF5KDEpOworCQl9CisJCXJldHJ5Kys7CisJfSB3aGlsZSAoKHJlYWRiKGJhc2VBZGRyICsgQzMyMGNoa3N1bV9vaykgIT0gMSkgJiYgKHJldHJ5IDwgMykpOworCWlmIChyZWFkYihiYXNlQWRkciArIEMzMjBjaGtzdW1fb2spICE9IDEpCisJCXJldHVybiAoLTEpOworCXdyaXRldygwLCBiYXNlQWRkciArIEMzMjBfa2V5KTsKKwlmb3IgKGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKKwkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCisJCQlicmVhazsKKwkJbW94YWRlbGF5KDEpOworCX0KKwlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkKKwkJcmV0dXJuICgtMTAwKTsKKworCWlmIChtb3hhX2JvYXJkc1tjYXJkbm9dLmJ1c1R5cGUgPT0gTU9YQV9CVVNfVFlQRV9QQ0kpIHsJCS8qIEFTSUMgYm9hcmQgKi8KKwkJd3JpdGV3KDB4MzgwMCwgYmFzZUFkZHIgKyBUTVMzMjBfUE9SVDEpOworCQl3cml0ZXcoMHgzOTAwLCBiYXNlQWRkciArIFRNUzMyMF9QT1JUMik7CisJCXdyaXRldygyODQ5OSwgYmFzZUFkZHIgKyBUTVMzMjBfQ0xPQ0spOworCX0gZWxzZSB7CisJCXdyaXRldygweDMyMDAsIGJhc2VBZGRyICsgVE1TMzIwX1BPUlQxKTsKKwkJd3JpdGV3KDB4MzQwMCwgYmFzZUFkZHIgKyBUTVMzMjBfUE9SVDIpOworCQl3cml0ZXcoMTk5OTksIGJhc2VBZGRyICsgVE1TMzIwX0NMT0NLKTsKKwl9CisJd3JpdGV3KDEsIGJhc2VBZGRyICsgRGlzYWJsZV9JUlEpOworCXdyaXRldygwLCBiYXNlQWRkciArIE1hZ2ljX25vKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKwkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCisJCQlicmVhazsKKwkJbW94YWRlbGF5KDEpOworCX0KKwlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkKKwkJcmV0dXJuICgtMTAyKTsKKworCWogPSByZWFkdyhiYXNlQWRkciArIE1vZHVsZV9jbnQpOworCWlmIChqIDw9IDApCisJCXJldHVybiAoLTEwMSk7CisJKm51bVBvcnRzID0gaiAqIDg7CisJd3JpdGV3KGosIGJhc2VBZGRyICsgTW9kdWxlX25vKTsKKwl3cml0ZXcoMCwgYmFzZUFkZHIgKyBNYWdpY19ubyk7CisJZm9yIChpID0gMDsgaSA8IDYwMDsgaSsrKSB7CisJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQorCQkJYnJlYWs7CisJCW1veGFkZWxheSgxKTsKKwl9CisJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpCisJCXJldHVybiAoLTEwMik7CisJbW94YUNhcmQgPSAxOworCW1veGFJbnROZHhbY2FyZG5vXSA9IGJhc2VBZGRyICsgSVJRaW5kZXg7CisJbW94YUludFBlbmRbY2FyZG5vXSA9IGJhc2VBZGRyICsgSVJRcGVuZGluZzsKKwltb3hhSW50VGFibGVbY2FyZG5vXSA9IGJhc2VBZGRyICsgSVJRdGFibGU7CisJcmV0dXJuICgwKTsKK30KKworI2lmIDAKK2xvbmcgTW94YVBvcnRHZXRDdXJCYXVkKGludCBwb3J0KQoreworCisJaWYgKG1veGFDaGtQb3J0W3BvcnRdID09IDApCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChtb3hhQ3VyQmF1ZFtwb3J0XSk7Cit9CisjZW5kaWYgIC8qICAwICAqLworCitzdGF0aWMgdm9pZCBNb3hhU2V0RmlmbyhpbnQgcG9ydCwgaW50IGVuYWJsZSkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCisJaWYgKCFlbmFibGUpIHsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0UnhGSUZPVHJpZywgMCk7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldFR4RklGT0NudCwgMSk7CisJfSBlbHNlIHsKKwkJbW94YWZ1bmMob2ZzQWRkciwgRkNfU2V0UnhGSUZPVHJpZywgMyk7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NldFR4RklGT0NudCwgMTYpOworCX0KK30KKworI2lmIDAKK2ludCBNb3hhUG9ydFNldE1vZGUoaW50IHBvcnQsIGludCBkYXRhYml0cywgaW50IHN0b3BiaXRzLCBpbnQgcGFyaXR5KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlpbnQgdmFsOworCisJdmFsID0gMDsKKwlzd2l0Y2ggKGRhdGFiaXRzKSB7CisJY2FzZSA1OgorCQl2YWwgfD0gMDsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQl2YWwgfD0gMTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl2YWwgfD0gMjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl2YWwgfD0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgtMSk7CisJfQorCXN3aXRjaCAoc3RvcGJpdHMpIHsKKwljYXNlIDA6CisJCXZhbCB8PSAwOworCQlicmVhazsJCS8qIHN0b3AgYml0cyAxLjUgKi8KKwljYXNlIDE6CisJCXZhbCB8PSAwOworCQlicmVhazsKKwljYXNlIDI6CisJCXZhbCB8PSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKC0xKTsKKwl9CisJc3dpdGNoIChwYXJpdHkpIHsKKwljYXNlIDA6CisJCXZhbCB8PSAweDAwOworCQlicmVhazsJCS8qIE5vbmUgICovCisJY2FzZSAxOgorCQl2YWwgfD0gMHgwODsKKwkJYnJlYWs7CQkvKiBPZGQgICAqLworCWNhc2UgMjoKKwkJdmFsIHw9IDB4MTg7CisJCWJyZWFrOwkJLyogRXZlbiAgKi8KKwljYXNlIDM6CisJCXZhbCB8PSAweDI4OworCQlicmVhazsJCS8qIE1hcmsgICovCisJY2FzZSA0OgorCQl2YWwgfD0gMHgzODsKKwkJYnJlYWs7CQkvKiBTcGFjZSAqLworCWRlZmF1bHQ6CisJCXJldHVybiAoLTEpOworCX0KKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZXRNb2RlLCB2YWwpOworCXJldHVybiAoMCk7Cit9CisKK2ludCBNb3hhUG9ydFR4QnVmU2l6ZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IHNpemU7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlzaXplID0gcmVhZHcob2ZzQWRkciArIFRYX21hc2spOworCXJldHVybiAoc2l6ZSk7Cit9CisKK2ludCBNb3hhUG9ydFJ4QnVmU2l6ZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJaW50IHNpemU7CisKKwlvZnNBZGRyID0gbW94YVRhYmxlQWRkcltwb3J0XTsKKwlzaXplID0gcmVhZHcob2ZzQWRkciArIFJYX21hc2spOworCXJldHVybiAoc2l6ZSk7Cit9CisKK2ludCBNb3hhUG9ydFJ4RnJlZShpbnQgcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm9mc0FkZHI7CisJdXNob3J0IHJwdHIsIHdwdHIsIG1hc2s7CisJaW50IGxlbjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXJwdHIgPSByZWFkdyhvZnNBZGRyICsgUlhycHRyKTsKKwl3cHRyID0gcmVhZHcob2ZzQWRkciArIFJYd3B0cik7CisJbWFzayA9IHJlYWR3KG9mc0FkZHIgKyBSWF9tYXNrKTsKKwlsZW4gPSBtYXNrIC0gKCh3cHRyIC0gcnB0cikgJiBtYXNrKTsKKwlyZXR1cm4gKGxlbik7Cit9CitpbnQgTW94YVBvcnRHZXRCcmtDbnQoaW50IHBvcnQpCit7CisJcmV0dXJuIChtb3hhQnJlYWtDbnRbcG9ydF0pOworfQorCit2b2lkIE1veGFQb3J0U2V0WG9uWG9mZihpbnQgcG9ydCwgaW50IHhvblZhbHVlLCBpbnQgeG9mZlZhbHVlKQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKworCW9mc0FkZHIgPSBtb3hhVGFibGVBZGRyW3BvcnRdOworCXdyaXRldyh4b25WYWx1ZSwgb2ZzQWRkciArIEZ1bmNBcmcpOworCXdyaXRldyh4b2ZmVmFsdWUsIG9mc0FkZHIgKyBGdW5jQXJnMSk7CisJd3JpdGV3KEZDX1NldFhvblhvZmYsIG9mc0FkZHIgKyBGdW5jQ29kZSk7CisJd2FpdF9maW5pc2gob2ZzQWRkcik7Cit9CisKK2ludCBNb3hhUG9ydElzVHhIb2xkKGludCBwb3J0KQoreworCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKKwlpbnQgdmFsOworCisJb2ZzQWRkciA9IG1veGFUYWJsZUFkZHJbcG9ydF07CisJaWYgKChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9JU0EpIHx8CisJICAgIChtb3hhX2JvYXJkc1twb3J0IC8gTUFYX1BPUlRTX1BFUl9CT0FSRF0uYm9hcmRUeXBlID09IE1PWEFfQk9BUkRfQzMyMF9QQ0kpKSB7CisJCW1veGFmdW5jKG9mc0FkZHIsIEZDX0dldENDU1IsIDApOworCQl2YWwgPSByZWFkdyhvZnNBZGRyICsgRnVuY0FyZyk7CisJCWlmICh2YWwgJiAweDA0KQorCQkJcmV0dXJuICgxKTsKKwl9IGVsc2UgeworCQlpZiAocmVhZHcob2ZzQWRkciArIEZsYWdTdGF0KSAmIFR4X2Zsb3dPZmYpCisJCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDBmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuYwpAQCAtMCwwICsxLDcyNyBAQAorLyoKKyoKKyogMzc4MGkuYyAtLSBoZWxwZXIgcm91dGluZXMgZm9yIHRoZSAzNzgwaSBEU1AKKyoKKyoKKyogV3JpdHRlbiBCeTogTWlrZSBTdWxsaXZhbiBJQk0gQ29ycG9yYXRpb24KKyoKKyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBOTyBXQVJSQU5UWQorKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisqIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisqCisqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisqIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqCisqCisqIDEwLzIzLzIwMDAgLSBBbHBoYSBSZWxlYXNlCisqCUZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlICJzbWFwaS5oIgorI2luY2x1ZGUgIm13YXZlZGQuaCIKKyNpbmNsdWRlICIzNzgwaS5oIgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRzcF9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZsYWdzOworCisKK3N0YXRpYyB2b2lkIFBhY2VNc2FBY2Nlc3ModW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8pCit7CisJY29uZF9yZXNjaGVkKCk7CisJdWRlbGF5KDEwMCk7CisJY29uZF9yZXNjaGVkKCk7Cit9CisKK3Vuc2lnbmVkIHNob3J0IGRzcDM3ODBJX1JlYWRNc2FDZmcodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxNc2FBZGRyKQoreworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX1JlYWRNc2FDZmcgZW50cnkgdXNEc3BCYXNlSU8gJXggdWxNc2FBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHVsTXNhQWRkcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRyTG93LCAodW5zaWduZWQgc2hvcnQpIHVsTXNhQWRkcik7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckhpZ2gsICh1bnNpZ25lZCBzaG9ydCkgKHVsTXNhQWRkciA+PiAxNikpOworCXZhbCA9IEluV29yZERzcChEU1BfTXNhRGF0YURTSVNIaWdoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MElfUmVhZE1zYUNmZyBleGl0IHZhbCAleFxuIiwgdmFsKTsKKworCXJldHVybiB2YWw7Cit9CisKK3ZvaWQgZHNwMzc4MElfV3JpdGVNc2FDZmcodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxNc2FBZGRyLCB1bnNpZ25lZCBzaG9ydCB1c1ZhbHVlKQoreworCisJUFJJTlRLXzQoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfV3JpdGVNc2FDZmcgZW50cnkgdXNEc3BCYXNlSU8gJXggdWxNc2FBZGRyICVseCB1c1ZhbHVlICV4XG4iLAorCQl1c0RzcEJhc2VJTywgdWxNc2FBZGRyLCB1c1ZhbHVlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxNc2FBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxNc2FBZGRyID4+IDE2KSk7CisJT3V0V29yZERzcChEU1BfTXNhRGF0YURTSVNIaWdoLCB1c1ZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIGRzcDM3ODBJX1dyaXRlR2VuQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB1bnNpZ25lZCB1SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdWNWYWx1ZSkKK3sKKwlEU1BfSVNBX1NMQVZFX0NPTlRST0wgclNsYXZlQ29udHJvbDsKKwlEU1BfSVNBX1NMQVZFX0NPTlRST0wgclNsYXZlQ29udHJvbF9TYXZlOworCisKKwlQUklOVEtfNChUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9Xcml0ZUdlbkNmZyBlbnRyeSB1c0RzcEJhc2VJTyAleCB1SW5kZXggJXggdWNWYWx1ZSAleFxuIiwKKwkJdXNEc3BCYXNlSU8sIHVJbmRleCwgdWNWYWx1ZSk7CisKKwlNS0JZVEUoclNsYXZlQ29udHJvbCkgPSBJbkJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCk7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9Xcml0ZUdlbkNmZyByU2xhdmVDb250cm9sICV4XG4iLAorCQlNS0JZVEUoclNsYXZlQ29udHJvbCkpOworCisJclNsYXZlQ29udHJvbF9TYXZlID0gclNsYXZlQ29udHJvbDsKKwlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBUUlVFOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfV3JpdGVHZW5DZmcgZW50cnkgclNsYXZlQ29udHJvbCtDb25maWdNb2RlICV4XG4iLAorCQlNS0JZVEUoclNsYXZlQ29udHJvbCkpOworCisJT3V0Qnl0ZURzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS0JZVEUoclNsYXZlQ29udHJvbCkpOworCU91dEJ5dGVEc3AoRFNQX0NvbmZpZ0FkZHJlc3MsICh1bnNpZ25lZCBjaGFyKSB1SW5kZXgpOworCU91dEJ5dGVEc3AoRFNQX0NvbmZpZ0RhdGEsIHVjVmFsdWUpOworCU91dEJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtCWVRFKHJTbGF2ZUNvbnRyb2xfU2F2ZSkpOworCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfV3JpdGVHZW5DZmcgZXhpdFxuIik7CisKKworfQorCit1bnNpZ25lZCBjaGFyIGRzcDM3ODBJX1JlYWRHZW5DZmcodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdUluZGV4KQoreworCURTUF9JU0FfU0xBVkVfQ09OVFJPTCByU2xhdmVDb250cm9sOworCURTUF9JU0FfU0xBVkVfQ09OVFJPTCByU2xhdmVDb250cm9sX1NhdmU7CisJdW5zaWduZWQgY2hhciB1Y1ZhbHVlOworCisKKwlQUklOVEtfMyhUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9SZWFkR2VuQ2ZnIGVudHJ5IHVzRHNwQmFzZUlPICV4IHVJbmRleCAleFxuIiwKKwkJdXNEc3BCYXNlSU8sIHVJbmRleCk7CisKKwlNS0JZVEUoclNsYXZlQ29udHJvbCkgPSBJbkJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCk7CisJclNsYXZlQ29udHJvbF9TYXZlID0gclNsYXZlQ29udHJvbDsKKwlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBUUlVFOworCU91dEJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtCWVRFKHJTbGF2ZUNvbnRyb2wpKTsKKwlPdXRCeXRlRHNwKERTUF9Db25maWdBZGRyZXNzLCAodW5zaWduZWQgY2hhcikgdUluZGV4KTsKKwl1Y1ZhbHVlID0gSW5CeXRlRHNwKERTUF9Db25maWdEYXRhKTsKKwlPdXRCeXRlRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LQllURShyU2xhdmVDb250cm9sX1NhdmUpKTsKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX1JlYWRHZW5DZmcgZXhpdCB1Y1ZhbHVlICV4XG4iLCB1Y1ZhbHVlKTsKKworCisJcmV0dXJuIHVjVmFsdWU7Cit9CisKK2ludCBkc3AzNzgwSV9FbmFibGVEU1AoRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqIHBTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnBJcnFNYXAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpwRG1hTWFwKQoreworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKKwlpbnQgaTsKKwlEU1BfVUFSVF9DRkdfMSByVWFydENmZzE7CisJRFNQX1VBUlRfQ0ZHXzIgclVhcnRDZmcyOworCURTUF9IQlJJREdFX0NGR18xIHJIQnJpZGdlQ2ZnMTsKKwlEU1BfSEJSSURHRV9DRkdfMiBySEJyaWRnZUNmZzI7CisJRFNQX0JVU01BU1RFUl9DRkdfMSByQnVzbWFzdGVyQ2ZnMTsKKwlEU1BfQlVTTUFTVEVSX0NGR18yIHJCdXNtYXN0ZXJDZmcyOworCURTUF9JU0FfUFJPVF9DRkcgcklzYVByb3RDZmc7CisJRFNQX1BPV0VSX01HTVRfQ0ZHIHJQb3dlck1nbXRDZmc7CisJRFNQX0hCVVNfVElNRVJfQ0ZHIHJIQnVzVGltZXJDZmc7CisJRFNQX0xCVVNfVElNRU9VVF9ESVNBQkxFIHJMQnVzVGltZW91dERpc2FibGU7CisJRFNQX0NISVBfUkVTRVQgckNoaXBSZXNldDsKKwlEU1BfQ0xPQ0tfQ09OVFJPTF8xIHJDbG9ja0NvbnRyb2wxOworCURTUF9DTE9DS19DT05UUk9MXzIgckNsb2NrQ29udHJvbDI7CisJRFNQX0lTQV9TTEFWRV9DT05UUk9MIHJTbGF2ZUNvbnRyb2w7CisJRFNQX0hCUklER0VfQ09OVFJPTCBySEJyaWRnZUNvbnRyb2w7CisJdW5zaWduZWQgc2hvcnQgQ2hpcElEID0gMDsKKwl1bnNpZ25lZCBzaG9ydCB0dmFsOworCisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9FbmFibGVEU1AgZW50cnkgcFNldHRpbmdzLT5iRFNQRW5hYmxlZCAleFxuIiwKKwkJcFNldHRpbmdzLT5iRFNQRW5hYmxlZCk7CisKKworCWlmICghcFNldHRpbmdzLT5iRFNQRW5hYmxlZCkgeworCQlQUklOVEtfRVJST1IoIEtFUk5fRVJSICIzNzgwaTo6ZHNwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogRFNQIG5vdCBlbmFibGVkLiBBYm9ydGluZy5cbiIgKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9FbmFibGVEU1AgZW50cnkgcFNldHRpbmdzLT5iTW9kZW1FbmFibGVkICV4XG4iLAorCQlwU2V0dGluZ3MtPmJNb2RlbUVuYWJsZWQpOworCisJaWYgKHBTZXR0aW5ncy0+Yk1vZGVtRW5hYmxlZCkgeworCQlyVWFydENmZzEuUmVzZXJ2ZWQgPSByVWFydENmZzIuUmVzZXJ2ZWQgPSAwOworCQlyVWFydENmZzEuSXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iVWFydElycUFjdGl2ZUxvdzsKKwkJclVhcnRDZmcxLklycVB1bHNlID0gcFNldHRpbmdzLT5iVWFydElycVB1bHNlOworCQlyVWFydENmZzEuSXJxID0KKwkJCSh1bnNpZ25lZCBjaGFyKSBwSXJxTWFwW3BTZXR0aW5ncy0+dXNVYXJ0SXJxXTsKKwkJc3dpdGNoIChwU2V0dGluZ3MtPnVzVWFydEJhc2VJTykgeworCQljYXNlIDB4MDNGODoKKwkJCXJVYXJ0Q2ZnMS5CYXNlSU8gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMkY4OgorCQkJclVhcnRDZmcxLkJhc2VJTyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweDAzRTg6CisJCQlyVWFydENmZzEuQmFzZUlPID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDJFODoKKwkJCXJVYXJ0Q2ZnMS5CYXNlSU8gPSAzOworCQkJYnJlYWs7CisJCX0KKwkJclVhcnRDZmcyLkVuYWJsZSA9IFRSVUU7CisJfQorCisJckhCcmlkZ2VDZmcxLlJlc2VydmVkID0gckhCcmlkZ2VDZmcyLlJlc2VydmVkID0gMDsKKwlySEJyaWRnZUNmZzEuSXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iRHNwSXJxQWN0aXZlTG93OworCXJIQnJpZGdlQ2ZnMS5JcnFQdWxzZSA9IHBTZXR0aW5ncy0+YkRzcElycVB1bHNlOworCXJIQnJpZGdlQ2ZnMS5JcnEgPSAodW5zaWduZWQgY2hhcikgcElycU1hcFtwU2V0dGluZ3MtPnVzRHNwSXJxXTsKKwlySEJyaWRnZUNmZzEuQWNjZXNzTW9kZSA9IDE7CisJckhCcmlkZ2VDZmcyLkVuYWJsZSA9IFRSVUU7CisKKworCXJCdXNtYXN0ZXJDZmcyLlJlc2VydmVkID0gMDsKKwlyQnVzbWFzdGVyQ2ZnMS5EbWEgPSAodW5zaWduZWQgY2hhcikgcERtYU1hcFtwU2V0dGluZ3MtPnVzRHNwRG1hXTsKKwlyQnVzbWFzdGVyQ2ZnMS5OdW1UcmFuc2ZlcnMgPQorCQkodW5zaWduZWQgY2hhcikgcFNldHRpbmdzLT51c051bVRyYW5zZmVyczsKKwlyQnVzbWFzdGVyQ2ZnMS5SZVJlcXVlc3QgPSAodW5zaWduZWQgY2hhcikgcFNldHRpbmdzLT51c1JlUmVxdWVzdDsKKwlyQnVzbWFzdGVyQ2ZnMS5NRU1DUzE2ID0gcFNldHRpbmdzLT5iRW5hYmxlTUVNQ1MxNjsKKwlyQnVzbWFzdGVyQ2ZnMi5Jc2FNZW1DbWRXaWR0aCA9CisJCSh1bnNpZ25lZCBjaGFyKSBwU2V0dGluZ3MtPnVzSXNhTWVtQ21kV2lkdGg7CisKKworCXJJc2FQcm90Q2ZnLlJlc2VydmVkID0gMDsKKwlySXNhUHJvdENmZy5HYXRlSU9DSFJEWSA9IHBTZXR0aW5ncy0+YkdhdGVJT0NIUkRZOworCisJclBvd2VyTWdtdENmZy5SZXNlcnZlZCA9IDA7CisJclBvd2VyTWdtdENmZy5FbmFibGUgPSBwU2V0dGluZ3MtPmJFbmFibGVQd3JNZ210OworCisJckhCdXNUaW1lckNmZy5Mb2FkVmFsdWUgPQorCQkodW5zaWduZWQgY2hhcikgcFNldHRpbmdzLT51c0hCdXNUaW1lckxvYWRWYWx1ZTsKKworCXJMQnVzVGltZW91dERpc2FibGUuUmVzZXJ2ZWQgPSAwOworCXJMQnVzVGltZW91dERpc2FibGUuRGlzYWJsZVRpbWVvdXQgPQorCQlwU2V0dGluZ3MtPmJEaXNhYmxlTEJ1c1RpbWVvdXQ7CisKKwlNS1dPUkQockNoaXBSZXNldCkgPSB+cFNldHRpbmdzLT51c0NoaXBsZXRFbmFibGU7CisKKwlyQ2xvY2tDb250cm9sMS5SZXNlcnZlZDEgPSByQ2xvY2tDb250cm9sMS5SZXNlcnZlZDIgPSAwOworCXJDbG9ja0NvbnRyb2wxLk5fRGl2aXNvciA9IHBTZXR0aW5ncy0+dXNOX0Rpdmlzb3I7CisJckNsb2NrQ29udHJvbDEuTV9NdWx0aXBsaWVyID0gcFNldHRpbmdzLT51c01fTXVsdGlwbGllcjsKKworCXJDbG9ja0NvbnRyb2wyLlJlc2VydmVkID0gMDsKKwlyQ2xvY2tDb250cm9sMi5QbGxCeXBhc3MgPSBwU2V0dGluZ3MtPmJQbGxCeXBhc3M7CisKKwkvKiBJc3N1ZSBhIHNvZnQgcmVzZXQgdG8gdGhlIGNoaXAgKi8KKwkvKiBOb3RlOiBTaW5jZSB3ZSBtYXkgYmUgY29taW5nIGluIHdpdGggMzc4MGkgY2xvY2tzIHN1c3BlbmRlZCwgd2UgbXVzdCBrZWVwCisJKiBzb2Z0LXJlc2V0IGFjdGl2ZSBmb3IgMTBtcy4KKwkqLworCXJTbGF2ZUNvbnRyb2wuQ2xvY2tDb250cm9sID0gMDsKKwlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IFRSVUU7CisJclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gRkFMU0U7CisJclNsYXZlQ29udHJvbC5SZXNlcnZlZCA9IDA7CisKKwlQUklOVEtfNChUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9FbmFibGVEU1AgdXNEc3BCYXNlSU8gJXggaW5kZXggJXggdGFkZHIgJXhcbiIsCisJCXVzRHNwQmFzZUlPLCBEU1BfSXNhU2xhdmVDb250cm9sLAorCQl1c0RzcEJhc2VJTyArIERTUF9Jc2FTbGF2ZUNvbnRyb2wpOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfRW5hYmxlRFNQIHJTbGF2ZUNvbnRybCAleFxuIiwKKwkJTUtXT1JEKHJTbGF2ZUNvbnRyb2wpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtXT1JEKHJTbGF2ZUNvbnRyb2wpKTsKKwlNS1dPUkQodHZhbCkgPSBJbldvcmREc3AoRFNQX0lzYVNsYXZlQ29udHJvbCk7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwaV9FbmFibGVEU1AgclNsYXZlQ29udHJvbCAyICV4XG4iLCB0dmFsKTsKKworCisJZm9yIChpID0gMDsgaSA8IDExOyBpKyspCisJCXVkZWxheSgyMDAwKTsKKworCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gRkFMU0U7CisJT3V0V29yZERzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS1dPUkQoclNsYXZlQ29udHJvbCkpOworCisJTUtXT1JEKHR2YWwpID0gSW5Xb3JkRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wpOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MGlfRW5hYmxlRFNQIHJTbGF2ZUNvbnRyb2wgMyAleFxuIiwgdHZhbCk7CisKKworCS8qIFByb2dyYW0gb3VyIGdlbmVyYWwgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwlXcml0ZUdlbkNmZyhEU1BfSEJyaWRnZUNmZzFJbmRleCwgTUtCWVRFKHJIQnJpZGdlQ2ZnMSkpOworCVdyaXRlR2VuQ2ZnKERTUF9IQnJpZGdlQ2ZnMkluZGV4LCBNS0JZVEUockhCcmlkZ2VDZmcyKSk7CisJV3JpdGVHZW5DZmcoRFNQX0J1c01hc3RlckNmZzFJbmRleCwgTUtCWVRFKHJCdXNtYXN0ZXJDZmcxKSk7CisJV3JpdGVHZW5DZmcoRFNQX0J1c01hc3RlckNmZzJJbmRleCwgTUtCWVRFKHJCdXNtYXN0ZXJDZmcyKSk7CisJV3JpdGVHZW5DZmcoRFNQX0lzYVByb3RDZmdJbmRleCwgTUtCWVRFKHJJc2FQcm90Q2ZnKSk7CisJV3JpdGVHZW5DZmcoRFNQX1Bvd2VyTWdDZmdJbmRleCwgTUtCWVRFKHJQb3dlck1nbXRDZmcpKTsKKwlXcml0ZUdlbkNmZyhEU1BfSEJ1c1RpbWVyQ2ZnSW5kZXgsIE1LQllURShySEJ1c1RpbWVyQ2ZnKSk7CisKKwlpZiAocFNldHRpbmdzLT5iTW9kZW1FbmFibGVkKSB7CisJCVdyaXRlR2VuQ2ZnKERTUF9VYXJ0Q2ZnMUluZGV4LCBNS0JZVEUoclVhcnRDZmcxKSk7CisJCVdyaXRlR2VuQ2ZnKERTUF9VYXJ0Q2ZnMkluZGV4LCBNS0JZVEUoclVhcnRDZmcyKSk7CisJfQorCisKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gRkFMU0U7CisJckhCcmlkZ2VDb250cm9sLk1lbUF1dG9JbmMgPSBUUlVFOworCXJIQnJpZGdlQ29udHJvbC5Jb0F1dG9JbmMgPSBGQUxTRTsKKwlySEJyaWRnZUNvbnRyb2wuRGlhZ25vc3RpY01vZGUgPSBGQUxTRTsKKworCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBpX0VuYWJsZURTUCBEU1BfSEJyaWRnZUNvbnRyb2wgJXggckhCcmlkZ2VDb250cm9sICV4XG4iLAorCQlEU1BfSEJyaWRnZUNvbnRyb2wsIE1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKKworCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlXcml0ZU1zYUNmZyhEU1BfTEJ1c1RpbWVvdXREaXNhYmxlLCBNS1dPUkQockxCdXNUaW1lb3V0RGlzYWJsZSkpOworCVdyaXRlTXNhQ2ZnKERTUF9DbG9ja0NvbnRyb2xfMSwgTUtXT1JEKHJDbG9ja0NvbnRyb2wxKSk7CisJV3JpdGVNc2FDZmcoRFNQX0Nsb2NrQ29udHJvbF8yLCBNS1dPUkQockNsb2NrQ29udHJvbDIpKTsKKwlXcml0ZU1zYUNmZyhEU1BfQ2hpcFJlc2V0LCBNS1dPUkQockNoaXBSZXNldCkpOworCisJQ2hpcElEID0gUmVhZE1zYUNmZyhEU1BfQ2hpcElEKTsKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX0VuYWJsZURTUCBleGl0aW5nIGJSQz1UUlVFLCBDaGlwSUQgJXhcbiIsCisJCUNoaXBJRCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRzcDM3ODBJX0Rpc2FibGVEU1AoRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqIHBTZXR0aW5ncykKK3sKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTyA9IHBTZXR0aW5ncy0+dXNEc3BCYXNlSU87CisJRFNQX0lTQV9TTEFWRV9DT05UUk9MIHJTbGF2ZUNvbnRyb2w7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX0Rpc2FibGVEU1AgZW50cnlcbiIpOworCisJclNsYXZlQ29udHJvbC5DbG9ja0NvbnRyb2wgPSAwOworCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gVFJVRTsKKwlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBGQUxTRTsKKwlyU2xhdmVDb250cm9sLlJlc2VydmVkID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlPdXRXb3JkRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LV09SRChyU2xhdmVDb250cm9sKSk7CisKKwl1ZGVsYXkoNSk7CisKKwlyU2xhdmVDb250cm9sLkNsb2NrQ29udHJvbCA9IDE7CisJT3V0V29yZERzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS1dPUkQoclNsYXZlQ29udHJvbCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwl1ZGVsYXkoNSk7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX0Rpc2FibGVEU1AgZXhpdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRzcDM3ODBJX1Jlc2V0KERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKiBwU2V0dGluZ3MpCit7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOworCURTUF9CT09UX0RPTUFJTiByQm9vdERvbWFpbjsKKwlEU1BfSEJSSURHRV9DT05UUk9MIHJIQnJpZGdlQ29udHJvbDsKKworCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUmVzZXQgZW50cnlcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJLyogTWFzayBEU1AgdG8gUEMgaW50ZXJydXB0ICovCisJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkgPSBJbldvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sKTsKKworCVBSSU5US18yKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1Jlc2V0IHJIQnJpZGdlQ29udHJvbCAleFxuIiwKKwkJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOworCisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IEZBTFNFOworCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFJlc2V0IHRoZSBjb3JlIHZpYSB0aGUgYm9vdCBkb21haW4gcmVnaXN0ZXIgKi8KKwlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBUUlVFOworCXJCb290RG9tYWluLkhhbHQgPSBUUlVFOworCXJCb290RG9tYWluLk5NSSA9IFRSVUU7CisJckJvb3REb21haW4uUmVzZXJ2ZWQgPSAwOworCisJUFJJTlRLXzIoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUmVzZXQgckJvb3REb21haW4gJXhcbiIsCisJCU1LV09SRChyQm9vdERvbWFpbikpOworCisJV3JpdGVNc2FDZmcoRFNQX01zcEJvb3REb21haW4sIE1LV09SRChyQm9vdERvbWFpbikpOworCisJLyogUmVzZXQgYWxsIHRoZSBjaGlwbGV0cyBhbmQgdGhlbiByZWFjdGl2YXRlIHRoZW0gKi8KKwlXcml0ZU1zYUNmZyhEU1BfQ2hpcFJlc2V0LCAweEZGRkYpOworCXVkZWxheSg1KTsKKwlXcml0ZU1zYUNmZyhEU1BfQ2hpcFJlc2V0LAorCQkJKHVuc2lnbmVkIHNob3J0KSAofnBTZXR0aW5ncy0+dXNDaGlwbGV0RW5hYmxlKSk7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1Jlc2V0IGV4aXQgYlJDPTBcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGRzcDM3ODBJX1J1bihEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICogcFNldHRpbmdzKQoreworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKKwlEU1BfQk9PVF9ET01BSU4gckJvb3REb21haW47CisJRFNQX0hCUklER0VfQ09OVFJPTCBySEJyaWRnZUNvbnRyb2w7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1J1biBlbnRyeVxuIik7CisKKworCS8qIFRyYW5zaXRpb24gdGhlIGNvcmUgdG8gYSBydW5uaW5nIHN0YXRlICovCisJckJvb3REb21haW4uUmVzZXRDb3JlID0gVFJVRTsKKwlyQm9vdERvbWFpbi5IYWx0ID0gRkFMU0U7CisJckJvb3REb21haW4uTk1JID0gVFJVRTsKKwlyQm9vdERvbWFpbi5SZXNlcnZlZCA9IDA7CisJV3JpdGVNc2FDZmcoRFNQX01zcEJvb3REb21haW4sIE1LV09SRChyQm9vdERvbWFpbikpOworCisJdWRlbGF5KDUpOworCisJckJvb3REb21haW4uUmVzZXRDb3JlID0gRkFMU0U7CisJV3JpdGVNc2FDZmcoRFNQX01zcEJvb3REb21haW4sIE1LV09SRChyQm9vdERvbWFpbikpOworCXVkZWxheSg1KTsKKworCXJCb290RG9tYWluLk5NSSA9IEZBTFNFOworCVdyaXRlTXNhQ2ZnKERTUF9Nc3BCb290RG9tYWluLCBNS1dPUkQockJvb3REb21haW4pKTsKKwl1ZGVsYXkoNSk7CisKKwkvKiBFbmFibGUgRFNQIHRvIFBDIGludGVycnVwdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU1LV09SRChySEJyaWRnZUNvbnRyb2wpID0gSW5Xb3JkRHNwKERTUF9IQnJpZGdlQ29udHJvbCk7CisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IFRSVUU7CisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwaV9SdW4gckhCcmlkZ2VDb250cm9sICV4XG4iLAorCQlNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisKKwlPdXRXb3JkRHNwKERTUF9IQnJpZGdlQ29udHJvbCwgTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1J1biBleGl0IGJSQz1UUlVFXG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBkc3AzNzgwSV9SZWFkRFN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKQoreworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gcHZCdWZmZXI7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisKKwlQUklOVEtfNShUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9SZWFkRFN0b3JlIGVudHJ5IHVzRHNwQmFzZUlPICV4LCBwdXNCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0J1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisKKwkvKiBTZXQgdGhlIGluaXRpYWwgTVNBIGFkZHJlc3MuIE5vIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgbWFkZSB0byBkYXRhIHN0b3JlIGFkZHJlc3NlcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxEU1BBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxEU1BBZGRyID4+IDE2KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFRyYW5zZmVyIHRoZSBtZW1vcnkgYmxvY2sgKi8KKwl3aGlsZSAodUNvdW50LS0gIT0gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkJdmFsID0gSW5Xb3JkRHNwKERTUF9Nc2FEYXRhRFNJU0hpZ2gpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCQlpZihwdXRfdXNlcih2YWwsIHB1c0J1ZmZlcisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkRFN0b3JlIHVDb3VudCAleCB2YWwgJXhcbiIsCisJCQl1Q291bnQsIHZhbCk7CisKKwkJUGFjZU1zYUFjY2Vzcyh1c0RzcEJhc2VJTyk7CisJfQorCisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwKKwkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkRFN0b3JlIGV4aXQgYlJDPVRSVUVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkc3AzNzgwSV9SZWFkQW5kQ2xlYXJEU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpwdkJ1ZmZlciwgdW5zaWduZWQgdUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVsRFNQQWRkcikKK3sKKwl1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKnB1c0J1ZmZlciA9IHB2QnVmZmVyOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCisJUFJJTlRLXzUoVFJBQ0VfMzc4MEksCisJCSIzNzgwaTo6ZHNwMzc4MElfUmVhZEFuZERTdG9yZSBlbnRyeSB1c0RzcEJhc2VJTyAleCwgcHVzQnVmZmVyICVwLCB1Q291bnQgJXgsIHVsRFNQQWRkciAlbHhcbiIsCisJCXVzRHNwQmFzZUlPLCBwdXNCdWZmZXIsIHVDb3VudCwgdWxEU1BBZGRyKTsKKworCisJLyogU2V0IHRoZSBpbml0aWFsIE1TQSBhZGRyZXNzLiBObyBhZGp1c3RtZW50cyBuZWVkIHRvIGJlIG1hZGUgdG8gZGF0YSBzdG9yZSBhZGRyZXNzZXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRyTG93LCAodW5zaWduZWQgc2hvcnQpIHVsRFNQQWRkcik7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckhpZ2gsICh1bnNpZ25lZCBzaG9ydCkgKHVsRFNQQWRkciA+PiAxNikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwkvKiBUcmFuc2ZlciB0aGUgbWVtb3J5IGJsb2NrICovCisJd2hpbGUgKHVDb3VudC0tICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJCXZhbCA9IEluV29yZERzcChEU1BfUmVhZEFuZENsZWFyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkJaWYocHV0X3VzZXIodmFsLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlQUklOVEtfMyhUUkFDRV8zNzgwSSwKKwkJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZEFuZENsZWFuRFN0b3JlIHVDb3VudCAleCB2YWwgJXhcbiIsCisJCQl1Q291bnQsIHZhbCk7CisKKwkJUGFjZU1zYUFjY2Vzcyh1c0RzcEJhc2VJTyk7CisJfQorCisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwKKwkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkQW5kQ2xlYXJEU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgZHNwMzc4MElfV3JpdGVEU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sIHZvaWQgX191c2VyICpwdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKQoreworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gcHZCdWZmZXI7CisKKworCVBSSU5US181KFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBEX1dyaXRlRFN0b3JlIGVudHJ5IHVzRHNwQmFzZUlPICV4LCBwdXNCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0J1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisKKwkvKiBTZXQgdGhlIGluaXRpYWwgTVNBIGFkZHJlc3MuIE5vIGFkanVzdG1lbnRzIG5lZWQgdG8gYmUgbWFkZSB0byBkYXRhIHN0b3JlIGFkZHJlc3NlcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxEU1BBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxEU1BBZGRyID4+IDE2KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFRyYW5zZmVyIHRoZSBtZW1vcnkgYmxvY2sgKi8KKwl3aGlsZSAodUNvdW50LS0gIT0gMCkgeworCQl1bnNpZ25lZCBzaG9ydCB2YWw7CisJCWlmKGdldF91c2VyKHZhbCwgcHVzQnVmZmVyKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCQlPdXRXb3JkRHNwKERTUF9Nc2FEYXRhRFNJU0hpZ2gsIHZhbCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwkJUFJJTlRLXzMoVFJBQ0VfMzc4MEksCisJCQkiMzc4MEk6OmRzcDM3ODBJX1dyaXRlRFN0b3JlIHVDb3VudCAleCB2YWwgJXhcbiIsCisJCQl1Q291bnQsIHZhbCk7CisKKwkJUGFjZU1zYUFjY2Vzcyh1c0RzcEJhc2VJTyk7CisJfQorCisKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwKKwkJIjM3ODBJOjpkc3AzNzgwRF9Xcml0ZURTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBkc3AzNzgwSV9SZWFkSVN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKQoreworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gcHZCdWZmZXI7CisKKwlQUklOVEtfNShUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9SZWFkSVN0b3JlIGVudHJ5IHVzRHNwQmFzZUlPICV4LCBwdXNCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0J1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisJLyoKKwkqIFNldCB0aGUgaW5pdGlhbCBNU0EgYWRkcmVzcy4gVG8gY29udmVydCBmcm9tIGFuIGluc3RydWN0aW9uIHN0b3JlCisJKiBhZGRyZXNzIHRvIGFuIE1TQSBhZGRyZXNzCisJKiBzaGlmdCB0aGUgYWRkcmVzcyB0d28gYml0cyB0byB0aGUgbGVmdCBhbmQgc2V0IGJpdCAyMgorCSovCisJdWxEU1BBZGRyID0gKHVsRFNQQWRkciA8PCAyKSB8ICgxIDw8IDIyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRyTG93LCAodW5zaWduZWQgc2hvcnQpIHVsRFNQQWRkcik7CisJT3V0V29yZERzcChEU1BfTXNhQWRkckhpZ2gsICh1bnNpZ25lZCBzaG9ydCkgKHVsRFNQQWRkciA+PiAxNikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CisKKwkvKiBUcmFuc2ZlciB0aGUgbWVtb3J5IGJsb2NrICovCisJd2hpbGUgKHVDb3VudC0tICE9IDApIHsKKwkJdW5zaWduZWQgc2hvcnQgdmFsX2xvLCB2YWxfaGk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCQl2YWxfbG8gPSBJbldvcmREc3AoRFNQX01zYURhdGFJU0xvdyk7CisJCXZhbF9oaSA9IEluV29yZERzcChEU1BfTXNhRGF0YURTSVNIaWdoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkJaWYocHV0X3VzZXIodmFsX2xvLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYocHV0X3VzZXIodmFsX2hpLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlQUklOVEtfNChUUkFDRV8zNzgwSSwKKwkJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZElTdG9yZSB1Q291bnQgJXggdmFsX2xvICV4IHZhbF9oaSAleFxuIiwKKwkJCXVDb3VudCwgdmFsX2xvLCB2YWxfaGkpOworCisJCVBhY2VNc2FBY2Nlc3ModXNEc3BCYXNlSU8pOworCisJfQorCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksCisJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZElTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBkc3AzNzgwSV9Xcml0ZUlTdG9yZSh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgX191c2VyICpwdXNCdWZmZXIgPSBwdkJ1ZmZlcjsKKworCVBSSU5US181KFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX1dyaXRlSVN0b3JlIGVudHJ5IHVzRHNwQmFzZUlPICV4LCBwdXNCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJdXNEc3BCYXNlSU8sIHB1c0J1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCisKKwkvKgorCSogU2V0IHRoZSBpbml0aWFsIE1TQSBhZGRyZXNzLiBUbyBjb252ZXJ0IGZyb20gYW4gaW5zdHJ1Y3Rpb24gc3RvcmUKKwkqIGFkZHJlc3MgdG8gYW4gTVNBIGFkZHJlc3MKKwkqIHNoaWZ0IHRoZSBhZGRyZXNzIHR3byBiaXRzIHRvIHRoZSBsZWZ0IGFuZCBzZXQgYml0IDIyCisJKi8KKwl1bERTUEFkZHIgPSAodWxEU1BBZGRyIDw8IDIpIHwgKDEgPDwgMjIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU91dFdvcmREc3AoRFNQX01zYUFkZHJMb3csICh1bnNpZ25lZCBzaG9ydCkgdWxEU1BBZGRyKTsKKwlPdXRXb3JkRHNwKERTUF9Nc2FBZGRySGlnaCwgKHVuc2lnbmVkIHNob3J0KSAodWxEU1BBZGRyID4+IDE2KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKKworCS8qIFRyYW5zZmVyIHRoZSBtZW1vcnkgYmxvY2sgKi8KKwl3aGlsZSAodUNvdW50LS0gIT0gMCkgeworCQl1bnNpZ25lZCBzaG9ydCB2YWxfbG8sIHZhbF9oaTsKKwkJaWYoZ2V0X3VzZXIodmFsX2xvLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYoZ2V0X3VzZXIodmFsX2hpLCBwdXNCdWZmZXIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CisJCU91dFdvcmREc3AoRFNQX01zYURhdGFJU0xvdywgdmFsX2xvKTsKKwkJT3V0V29yZERzcChEU1BfTXNhRGF0YURTSVNIaWdoLCB2YWxfaGkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisJCVBSSU5US180KFRSQUNFXzM3ODBJLAorCQkJIjM3ODBJOjpkc3AzNzgwSV9Xcml0ZUlTdG9yZSB1Q291bnQgJXggdmFsX2xvICV4IHZhbF9oaSAleFxuIiwKKwkJCXVDb3VudCwgdmFsX2xvLCB2YWxfaGkpOworCisJCVBhY2VNc2FBY2Nlc3ModXNEc3BCYXNlSU8pOworCisJfQorCisJUFJJTlRLXzEoVFJBQ0VfMzc4MEksCisJCSIzNzgwSTo6ZHNwMzc4MElfV3JpdGVJU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgZHNwMzc4MElfR2V0SVBDU291cmNlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcHVzSVBDU291cmNlKQoreworCURTUF9IQlJJREdFX0NPTlRST0wgckhCcmlkZ2VDb250cm9sOworCXVuc2lnbmVkIHNob3J0IHRlbXA7CisKKworCVBSSU5US18zKFRSQUNFXzM3ODBJLAorCQkiMzc4MGk6OmRzcDM3ODBJX0dldElQQ1NvdXJjZSBlbnRyeSB1c0RzcEJhc2VJTyAleCBwdXNJUENTb3VyY2UgJXBcbiIsCisJCXVzRHNwQmFzZUlPLCBwdXNJUENTb3VyY2UpOworCisJLyoKKwkqIERpc2FibGUgRFNQIHRvIFBDIGludGVycnVwdHMsIHJlYWQgdGhlIGludGVycnVwdCByZWdpc3RlciwKKwkqIGNsZWFyIHRoZSBwZW5kaW5nIElQQyBiaXRzLCBhbmQgcmVlbmFibGUgRFNQIHRvIFBDIGludGVycnVwdHMKKwkqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOworCU1LV09SRChySEJyaWRnZUNvbnRyb2wpID0gSW5Xb3JkRHNwKERTUF9IQnJpZGdlQ29udHJvbCk7CisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IEZBTFNFOworCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CisKKwkqcHVzSVBDU291cmNlID0gSW5Xb3JkRHNwKERTUF9JbnRlcnJ1cHQpOworCXRlbXAgPSAodW5zaWduZWQgc2hvcnQpIH4oKnB1c0lQQ1NvdXJjZSk7CisKKwlQUklOVEtfMyhUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9HZXRJUENTb3VyY2UsIHVzSVBDU291cmNlICV4IH4gJXhcbiIsCisJCSpwdXNJUENTb3VyY2UsIHRlbXApOworCisJT3V0V29yZERzcChEU1BfSW50ZXJydXB0LCAodW5zaWduZWQgc2hvcnQpIH4oKnB1c0lQQ1NvdXJjZSkpOworCisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IFRSVUU7CisJT3V0V29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wsIE1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOworCisKKwlQUklOVEtfMihUUkFDRV8zNzgwSSwKKwkJIjM3ODBpOjpkc3AzNzgwSV9HZXRJUENTb3VyY2UgZXhpdCB1c0lQQ1NvdXJjZSAleFxuIiwKKwkJKnB1c0lQQ1NvdXJjZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5oIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3ZDAyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5oCkBAIC0wLDAgKzEsMzYyIEBACisvKgorKgorKiAzNzgwaS5oIC0tIGRlY2xhcmF0aW9ucyBmb3IgMzc4MGkuYworKgorKgorKiBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuIElCTSBDb3Jwb3JhdGlvbgorKgorKiBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIENvcnBvcmF0aW9uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIE5PIFdBUlJBTlRZCisqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisqIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyoKKyogRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKyogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisqIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisqIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyoKKyoKKyogMTAvMjMvMjAwMCAtIEFscGhhIFJlbGVhc2UKKyoJRmlyc3QgcmVsZWFzZSB0byB0aGUgcHVibGljCisqLworCisjaWZuZGVmIF9MSU5VWF8zNzgwSV9ICisjZGVmaW5lIF9MSU5VWF8zNzgwSV9ICisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogRFNQIEkvTyBwb3J0IG9mZnNldHMgYW5kIGRlZmluaXRpb25zICovCisjZGVmaW5lIERTUF9Jc2FTbGF2ZUNvbnRyb2wgICAgICAgIDB4MDAwMAkvKiBJU0Egc2xhdmUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBEU1BfSXNhU2xhdmVTdGF0dXMgICAgICAgICAweDAwMDEJLyogSVNBIHNsYXZlIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBEU1BfQ29uZmlnQWRkcmVzcyAgICAgICAgICAweDAwMDIJLyogR2VuZXJhbCBjb25maWcgYWRkcmVzcyByZWdpc3RlciAqLworI2RlZmluZSBEU1BfQ29uZmlnRGF0YSAgICAgICAgICAgICAweDAwMDMJLyogR2VuZXJhbCBjb25maWcgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBEU1BfSEJyaWRnZUNvbnRyb2wgICAgICAgICAweDAwMDIJLyogSEJyaWRnZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9Nc2FBZGRyTG93ICAgICAgICAgICAgIDB4MDAwNAkvKiBNU1AgU3lzdGVtIEFkZHJlc3MsIGxvdyB3b3JkICovCisjZGVmaW5lIERTUF9Nc2FBZGRySGlnaCAgICAgICAgICAgIDB4MDAwNgkvKiBNU1AgU3lzdGVtIEFkZHJlc3MsIGhpZ2ggd29yZCAqLworI2RlZmluZSBEU1BfTXNhRGF0YURTSVNIaWdoICAgICAgICAweDAwMDgJLyogTVNBIGRhdGEgcmVnaXN0ZXI6IGQtc3RvcmUgd29yZCBvciBoaWdoIGJ5dGUgb2YgaS1zdG9yZSAqLworI2RlZmluZSBEU1BfTXNhRGF0YUlTTG93ICAgICAgICAgICAweDAwMEEJLyogTVNBIGRhdGEgcmVnaXN0ZXI6IGxvdyB3b3JkIG9mIGktc3RvcmUgKi8KKyNkZWZpbmUgRFNQX1JlYWRBbmRDbGVhciAgICAgICAgICAgMHgwMDBDCS8qIE1TQSByZWFkIGFuZCBjbGVhciBkYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9JbnRlcnJ1cHQgICAgICAgICAgICAgIDB4MDAwRQkvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgKElQQyBzb3VyY2UpICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIENsb2NrQ29udHJvbDoxOwkvKiBSVzogQ2xvY2sgY29udHJvbDogMD1ub3JtYWwsIDE9c3RvcCAzNzgwaSBjbG9ja3MgKi8KKwl1bnNpZ25lZCBjaGFyIFNvZnRSZXNldDoxOwkvKiBSVzogU29mdCByZXNldCAwPW5vcm1hbCwgMT1zb2Z0IHJlc2V0IGFjdGl2ZSAqLworCXVuc2lnbmVkIGNoYXIgQ29uZmlnTW9kZToxOwkvKiBSVzogQ29uZmlndXJhdGlvbiBtb2RlLCAwPW5vcm1hbCwgMT1jb25maWcgbW9kZSAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NTsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0lTQV9TTEFWRV9DT05UUk9MOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGVEc3BJbnQ6MTsJLyogUlc6IEVuYWJsZSBEU1AgdG8gWDg2IElTQSBpbnRlcnJ1cHQgMD1tYXNrIGl0LCAxPWVuYWJsZSBpdCAqLworCXVuc2lnbmVkIHNob3J0IE1lbUF1dG9JbmM6MTsJLyogUlc6IE1lbW9yeSBhZGRyZXNzIGF1dG8gaW5jcmVtZW50LCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisJdW5zaWduZWQgc2hvcnQgSW9BdXRvSW5jOjE7CS8qIFJXOiBJL08gYWRkcmVzcyBhdXRvIGluY3JlbWVudCwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLworCXVuc2lnbmVkIHNob3J0IERpYWdub3N0aWNNb2RlOjE7CS8qIFJXOiBEaXNnbm9zdGljIG1vZGUgMD1ucm9tYWwsIDE9ZGlhZ25vc3RpYyBtb2RlICovCisJdW5zaWduZWQgc2hvcnQgSXNhUGFjaW5nVGltZXI6MTI7CS8qIFI6IElTQSBhY2Nlc3MgcGFjaW5nIHRpbWVyOiBjb3VudCBvZiBjb3JlIGN5Y2xlcyBzdG9sZW4gKi8KK30gRFNQX0hCUklER0VfQ09OVFJPTDsKKworCisvKiBEU1AgcmVnaXN0ZXIgaW5kZXhlcyB1c2VkIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYWRkcmVzcyAoaW5kZXgpIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9VYXJ0Q2ZnMUluZGV4ICAgICAgICAgIDB4MDAwMwkvKiBVQVJUIGNvbmZpZyByZWdpc3RlciAxICovCisjZGVmaW5lIERTUF9VYXJ0Q2ZnMkluZGV4ICAgICAgICAgIDB4MDAwNAkvKiBVQVJUIGNvbmZpZyByZWdpc3RlciAyICovCisjZGVmaW5lIERTUF9IQnJpZGdlQ2ZnMUluZGV4ICAgICAgIDB4MDAwNwkvKiBIQnJpZGdlIGNvbmZpZyByZWdpc3RlciAxICovCisjZGVmaW5lIERTUF9IQnJpZGdlQ2ZnMkluZGV4ICAgICAgIDB4MDAwOAkvKiBIQnJpZGdlIGNvbmZpZyByZWdpc3RlciAyICovCisjZGVmaW5lIERTUF9CdXNNYXN0ZXJDZmcxSW5kZXggICAgIDB4MDAwOQkvKiBJU0EgYnVzIG1hc3RlciBjb25maWcgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBEU1BfQnVzTWFzdGVyQ2ZnMkluZGV4ICAgICAweDAwMEEJLyogSVNBIGJ1cyBtYXN0ZXIgY29uZmlnIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRFNQX0lzYVByb3RDZmdJbmRleCAgICAgICAgMHgwMDBGCS8qIElTQSBwcm90b2NvbCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIERTUF9Qb3dlck1nQ2ZnSW5kZXggICAgICAgIDB4MDAxMAkvKiBMb3cgcG9zZXIgc3VzcGVuZC9yZXN1bWUgZW5hYmxlICovCisjZGVmaW5lIERTUF9IQnVzVGltZXJDZmdJbmRleCAgICAgIDB4MDAxMQkvKiBIQlVTIHRpbWVyIGxvYWQgdmFsdWUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgSXJxQWN0aXZlTG93OjE7CS8qIFJXOiBJUlEgYWN0aXZlIGhpZ2ggb3IgbG93OiAwPWhpZ2gsIDE9bG93ICovCisJdW5zaWduZWQgY2hhciBJcnFQdWxzZToxOwkvKiBSVzogSVJRIHB1bHNlIG9yIGxldmVsOiAwPWxldmVsLCAxPXB1bHNlICAqLworCXVuc2lnbmVkIGNoYXIgSXJxOjM7CS8qIFJXOiBJUlEgc2VsZWN0aW9uICovCisJdW5zaWduZWQgY2hhciBCYXNlSU86MjsJLyogUlc6IEJhc2UgSS9PIHNlbGVjdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6MTsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX1VBUlRfQ0ZHXzE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIEVuYWJsZToxOwkvKiBSVzogRW5hYmxlIEkvTyBhbmQgSVJROiAwPUZBTFNFLCAxPVRSVUUgKi8KKwl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjc7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9VQVJUX0NGR18yOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBJcnFBY3RpdmVMb3c6MTsJLyogUlc6IElSUSBhY3RpdmUgaGlnaD0wIG9yIGxvdz0xICovCisJdW5zaWduZWQgY2hhciBJcnFQdWxzZToxOwkvKiBSVzogSVJRIHB1bHNlPTEgb3IgbGV2ZWw9MCAqLworCXVuc2lnbmVkIGNoYXIgSXJxOjM7CS8qIFJXOiBJUlEgc2VsZWN0aW9uICovCisJdW5zaWduZWQgY2hhciBBY2Nlc3NNb2RlOjE7CS8qIFJXOiAxNi1iaXQgcmVnaXN0ZXIgYWNjZXNzIG1ldGhvZCAwPWJ5dGUsIDE9d29yZCAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6MjsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0hCUklER0VfQ0ZHXzE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIEVuYWJsZToxOwkvKiBSVzogZW5hYmxlIEkvTyBhbmQgSVJROiAwPUZBTFNFLCAxPVRSVUUgKi8KKwl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjc7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9IQlJJREdFX0NGR18yOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIERtYTozOwkvKiBSVzogRE1BIGNoYW5uZWwgc2VsZWN0aW9uICovCisJdW5zaWduZWQgY2hhciBOdW1UcmFuc2ZlcnM6MjsJLyogUlc6IE1heGltdW0gIyBvZiB0cmFuc2ZlcnMgb25jZSBiZWluZyBncmFudGVkIHRoZSBJU0EgYnVzICovCisJdW5zaWduZWQgY2hhciBSZVJlcXVlc3Q6MjsJLyogUlc6IE1pbnVtdW0gZGVsYXkgYmV0d2VlbiByZWxlYXNpbmcgdGhlIElTQSBidXMgYW5kIHJlcXVlc3RpbmcgaXQgYWdhaW4gKi8KKwl1bnNpZ25lZCBjaGFyIE1FTUNTMTY6MTsJLyogUlc6IElTQSBzaWduYWwgTUVNQ1MxNjogMD1kaXNhYmxlZCwgMT1lbmFibGVkICovCit9IERTUF9CVVNNQVNURVJfQ0ZHXzE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIElzYU1lbUNtZFdpZHRoOjI7CS8qIFJXOiBJU0EgbWVtb3J5IGNvbW1hbmQgd2lkdGggKi8KKwl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjY7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9CVVNNQVNURVJfQ0ZHXzI7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgR2F0ZUlPQ0hSRFk6MTsJLyogUlc6IEVuYWJsZSBJT0NIUkRZIGdhdGluZzogMD1GQUxTRSwgMT1UUlVFICovCisJdW5zaWduZWQgY2hhciBSZXNlcnZlZDo3OwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfSVNBX1BST1RfQ0ZHOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IEVuYWJsZSBsb3cgcG93ZXIgc3VzcGVuZC9yZXN1bWUgMD1GQUxTRSwgMT1UUlVFICovCisJdW5zaWduZWQgY2hhciBSZXNlcnZlZDo3OwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfUE9XRVJfTUdNVF9DRkc7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIExvYWRWYWx1ZTo4OwkvKiBSVzogSEJVUyB0aW1lciBsb2FkIHZhbHVlICovCit9IERTUF9IQlVTX1RJTUVSX0NGRzsKKworCisKKy8qIERTUCByZWdpc3RlcnMgdGhhdCBleGlzdCBpbiBNU0EgSS9PIHNwYWNlICovCisjZGVmaW5lIERTUF9DaGlwSUQgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgRFNQX01zcEJvb3REb21haW4gICAgICAgICAgMHg4MDAwMDU4MAorI2RlZmluZSBEU1BfTEJ1c1RpbWVvdXREaXNhYmxlICAgICAweDgwMDAwNTgwCisjZGVmaW5lIERTUF9DbG9ja0NvbnRyb2xfMSAgICAgICAgIDB4ODAwMDA1OEEKKyNkZWZpbmUgRFNQX0Nsb2NrQ29udHJvbF8yICAgICAgICAgMHg4MDAwMDU4QworI2RlZmluZSBEU1BfQ2hpcFJlc2V0ICAgICAgICAgICAgICAweDgwMDAwNTg4CisjZGVmaW5lIERTUF9HcGlvTW9kZUNvbnRyb2xfMTVfOCAgIDB4ODAwMDAwODIKKyNkZWZpbmUgRFNQX0dwaW9Ecml2ZXJFbmFibGVfMTVfOCAgMHg4MDAwMDA3NgorI2RlZmluZSBEU1BfR3Bpb091dHB1dERhdGFfMTVfOCAgICAweDgwMDAwMDcyCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBOTUk6MTsJLyogUlc6IG5vbiBtYXNrYWJsZSBpbnRlcnJ1cHQgKi8KKwl1bnNpZ25lZCBzaG9ydCBIYWx0OjE7CS8qIFJXOiBIYWx0IE1TUCBjbG9jayAqLworCXVuc2lnbmVkIHNob3J0IFJlc2V0Q29yZToxOwkvKiBSVzogUmVzZXQgTVNQIGNvcmUgaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgUmVzZXJ2ZWQ6MTM7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9CT09UX0RPTUFJTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IERpc2FibGVUaW1lb3V0OjE7CS8qIFJXOiBEaXNhYmxlIExCdXMgdGltZW91dCAqLworCXVuc2lnbmVkIHNob3J0IFJlc2VydmVkOjE1OwkvKiAwOiBSZXNlcnZlZCAqLworfSBEU1BfTEJVU19USU1FT1VUX0RJU0FCTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBNZW1vcnk6MTsJLyogUlc6IFJlc2V0IG1lbW9yeSBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBTZXJpYWxQb3J0MToxOwkvKiBSVzogUmVzZXQgc2VyaWFsIHBvcnQgMSBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBTZXJpYWxQb3J0MjoxOwkvKiBSVzogUmVzZXQgc2VyaWFsIHBvcnQgMiBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBTZXJpYWxQb3J0MzoxOwkvKiBSVzogUmVzZXQgc2VyaWFsIHBvcnQgMyBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBHcGlvOjE7CS8qIFJXOiBSZXNldCBHUElPIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IERtYToxOwkvKiBSVzogUmVzZXQgRE1BIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IFNvdW5kQmxhc3RlcjoxOwkvKiBSVzogUmVzZXQgc291bmRibGFzdGVyIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IFVhcnQ6MTsJLyogUlc6IFJlc2V0IFVBUlQgaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgTWlkaToxOwkvKiBSVzogUmVzZXQgTUlESSBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBJc2FNYXN0ZXI6MTsJLyogUlc6IFJlc2V0IElTQSBtYXN0ZXIgaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgUmVzZXJ2ZWQ6NjsJLyogMDogUmVzZXJ2ZWQgKi8KK30gRFNQX0NISVBfUkVTRVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBOX0Rpdmlzb3I6NjsJLyogUlc6IChOKSBQTEwgb3V0cHV0IGNsb2NrIGRpdmlzb3IgKi8KKwl1bnNpZ25lZCBzaG9ydCBSZXNlcnZlZDE6MjsJLyogMDogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBzaG9ydCBNX011bHRpcGxpZXI6NjsJLyogUlc6IChNKSBQTEwgZmVlZGJhY2sgY2xvY2sgbXVsdGlwbGllciAqLworCXVuc2lnbmVkIHNob3J0IFJlc2VydmVkMjoyOwkvKiAwOiByZXNlcnZlZCAqLworfSBEU1BfQ0xPQ0tfQ09OVFJPTF8xOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgUGxsQnlwYXNzOjE7CS8qIFJXOiBQTEwgQnlwYXNzICovCisJdW5zaWduZWQgc2hvcnQgUmVzZXJ2ZWQ6MTU7CS8qIDA6IFJlc2VydmVkICovCit9IERTUF9DTE9DS19DT05UUk9MXzI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDg6MTsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDk6MTsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDEwOjE7CisJdW5zaWduZWQgc2hvcnQgTGF0Y2gxMToxOworCXVuc2lnbmVkIHNob3J0IExhdGNoMTI6MTsKKwl1bnNpZ25lZCBzaG9ydCBMYXRjaDEzOjE7CisJdW5zaWduZWQgc2hvcnQgTGF0Y2gxNDoxOworCXVuc2lnbmVkIHNob3J0IExhdGNoMTU6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrODoxOworCXVuc2lnbmVkIHNob3J0IE1hc2s5OjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazEwOjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazExOjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazEyOjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazEzOjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazE0OjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazE1OjE7Cit9IERTUF9HUElPX09VVFBVVF9EQVRBXzE1Xzg7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGU4OjE7CisJdW5zaWduZWQgc2hvcnQgRW5hYmxlOToxOworCXVuc2lnbmVkIHNob3J0IEVuYWJsZTEwOjE7CisJdW5zaWduZWQgc2hvcnQgRW5hYmxlMTE6MTsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGUxMjoxOworCXVuc2lnbmVkIHNob3J0IEVuYWJsZTEzOjE7CisJdW5zaWduZWQgc2hvcnQgRW5hYmxlMTQ6MTsKKwl1bnNpZ25lZCBzaG9ydCBFbmFibGUxNToxOworCXVuc2lnbmVkIHNob3J0IE1hc2s4OjE7CisJdW5zaWduZWQgc2hvcnQgTWFzazk6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTA6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTE6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTI6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTM6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTQ6MTsKKwl1bnNpZ25lZCBzaG9ydCBNYXNrMTU6MTsKK30gRFNQX0dQSU9fRFJJVkVSX0VOQUJMRV8xNV84OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGU4OjI7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGU5OjI7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGUxMDoyOworCXVuc2lnbmVkIHNob3J0IEdwaW9Nb2RlMTE6MjsKKwl1bnNpZ25lZCBzaG9ydCBHcGlvTW9kZTEyOjI7CisJdW5zaWduZWQgc2hvcnQgR3Bpb01vZGUxMzoyOworCXVuc2lnbmVkIHNob3J0IEdwaW9Nb2RlMTQ6MjsKKwl1bnNpZ25lZCBzaG9ydCBHcGlvTW9kZTE1OjI7Cit9IERTUF9HUElPX01PREVfMTVfODsKKworLyogQ29tcG9uZW50IG1hc2tzIHRoYXQgYXJlIGRlZmluZWQgaW4gZHNwbWdyLmggKi8KKyNkZWZpbmUgTVdfQURDX01BU0sgICAgMHgwMDAxCisjZGVmaW5lIE1XX0FJQzJfTUFTSyAgIDB4MDAwNgorI2RlZmluZSBNV19NSURJX01BU0sgICAweDAwMDgKKyNkZWZpbmUgTVdfQ0REQUNfTUFTSyAgMHg4MDAxCisjZGVmaW5lIE1XX0FJQzFfTUFTSyAgIDB4RTAwNgorI2RlZmluZSBNV19VQVJUX01BU0sgICAweEUwMEEKKyNkZWZpbmUgTVdfQUNJX01BU0sgICAgMHhFMDBCCisKKy8qCisqIERlZmluaXRpb24gb2YgMzc4MGkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuICBVbmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwKKyogdGhlc2UgdmFsdWVzIGFyZSBwcm92aWRlZCBhcyBpbnB1dCB0byB0aGUgMzc4MGkgc3VwcG9ydCBsYXllci4gIEF0IHByZXNlbnQsCisqIHRoZSBvbmx5IHZhbHVlcyBtYWludGFpbmVkIGJ5IHRoZSAzNzgwaSBzdXBwb3J0IGxheWVyIGFyZSB0aGUgc2F2ZWQgVUFSVAorKiByZWdpc3RlcnMuCisqLwordHlwZWRlZiBzdHJ1Y3QgX0RTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgeworCisJLyogTG9jYXRpb24gb2YgYmFzZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJdW5zaWduZWQgc2hvcnQgdXNCYXNlQ29uZmlnSU87CisKKwkvKiBFbmFibGVzIGZvciB2YXJpb3VzIERTUCBjb21wb25lbnRzICovCisJaW50IGJEU1BFbmFibGVkOworCWludCBiTW9kZW1FbmFibGVkOworCWludCBiSW50ZXJydXB0Q2xhaW1lZDsKKworCS8qIElSUSwgRE1BLCBhbmQgQmFzZSBJL08gYWRkcmVzc2VzIGZvciB2YXJpb3VzIERTUCBjb21wb25lbnRzICovCisJdW5zaWduZWQgc2hvcnQgdXNEc3BJcnE7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BEbWE7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU87CisJdW5zaWduZWQgc2hvcnQgdXNVYXJ0SXJxOworCXVuc2lnbmVkIHNob3J0IHVzVWFydEJhc2VJTzsKKworCS8qIElSUSBtb2RlcyBmb3IgdmFyaW91cyBEU1AgY29tcG9uZW50cyAqLworCWludCBiRHNwSXJxQWN0aXZlTG93OworCWludCBiVWFydElycUFjdGl2ZUxvdzsKKwlpbnQgYkRzcElycVB1bHNlOworCWludCBiVWFydElycVB1bHNlOworCisJLyogQ2FyZCBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCB1SXBzOworCXVuc2lnbmVkIHVEU3RvcmVTaXplOworCXVuc2lnbmVkIHVJU3RvcmVTaXplOworCXVuc2lnbmVkIHVEbWFCYW5kd2lkdGg7CisKKwkvKiBBZGFwdGVyIHNwZWNpZmljIDM3ODBpIHNldHRpbmdzICovCisJdW5zaWduZWQgc2hvcnQgdXNOdW1UcmFuc2ZlcnM7CisJdW5zaWduZWQgc2hvcnQgdXNSZVJlcXVlc3Q7CisJaW50IGJFbmFibGVNRU1DUzE2OworCXVuc2lnbmVkIHNob3J0IHVzSXNhTWVtQ21kV2lkdGg7CisJaW50IGJHYXRlSU9DSFJEWTsKKwlpbnQgYkVuYWJsZVB3ck1nbXQ7CisJdW5zaWduZWQgc2hvcnQgdXNIQnVzVGltZXJMb2FkVmFsdWU7CisJaW50IGJEaXNhYmxlTEJ1c1RpbWVvdXQ7CisJdW5zaWduZWQgc2hvcnQgdXNOX0Rpdmlzb3I7CisJdW5zaWduZWQgc2hvcnQgdXNNX011bHRpcGxpZXI7CisJaW50IGJQbGxCeXBhc3M7CisJdW5zaWduZWQgc2hvcnQgdXNDaGlwbGV0RW5hYmxlOwkvKiBVc2VkIHdpdGggdGhlIGNoaXAgcmVzZXQgcmVnaXN0ZXIgdG8gZW5hYmxlIHNwZWNpZmljIGNoaXBsZXRzICovCisKKwkvKiBTYXZlZCBVQVJUIHJlZ2lzdGVycy4gVGhlc2UgYXJlIG1haW50YWluZWQgYnkgdGhlIDM3ODBpIHN1cHBvcnQgbGF5ZXIuICovCisJaW50IGJVYXJ0U2F2ZWQ7CQkvKiBUcnVlIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzYXZlIG9mIHRoZSBVQVJUIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGNoYXIgdWNJRVI7CS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHVjRkNSOwkvKiBGSUZPIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHVjTENSOwkvKiBMaW5lIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHVjTUNSOwkvKiBNb2RlbSBjb250cm9sIHJlZ2lzdGVyICovCisJdW5zaWduZWQgY2hhciB1Y1NDUjsJLyogU2NyYXRjaCByZWdpc3RlciAqLworCXVuc2lnbmVkIGNoYXIgdWNETEw7CS8qIERpdmlzb3IgbGF0Y2gsIGxvdyBieXRlICovCisJdW5zaWduZWQgY2hhciB1Y0RMTTsJLyogRGl2aXNvciBsYXRjaCwgaGlnaCBieXRlICovCit9IERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1M7CisKKworLyogMzc4MGkgc3VwcG9ydCBmdW5jdGlvbnMgKi8KK2ludCBkc3AzNzgwSV9FbmFibGVEU1AoRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqIHBTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnBJcnFNYXAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpwRG1hTWFwKTsKK2ludCBkc3AzNzgwSV9EaXNhYmxlRFNQKERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKiBwU2V0dGluZ3MpOworaW50IGRzcDM3ODBJX1Jlc2V0KERTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKiBwU2V0dGluZ3MpOworaW50IGRzcDM3ODBJX1J1bihEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICogcFNldHRpbmdzKTsKK2ludCBkc3AzNzgwSV9SZWFkRFN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKK2ludCBkc3AzNzgwSV9SZWFkQW5kQ2xlYXJEU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpwdkJ1ZmZlciwgdW5zaWduZWQgdUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVsRFNQQWRkcik7CitpbnQgZHNwMzc4MElfV3JpdGVEU3RvcmUodW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8sIHZvaWQgX191c2VyICpwdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKK2ludCBkc3AzNzgwSV9SZWFkSVN0b3JlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB2b2lkIF9fdXNlciAqcHZCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1Q291bnQsIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKK2ludCBkc3AzNzgwSV9Xcml0ZUlTdG9yZSh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVDb3VudCwgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpOwordW5zaWduZWQgc2hvcnQgZHNwMzc4MElfUmVhZE1zYUNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bE1zYUFkZHIpOwordm9pZCBkc3AzNzgwSV9Xcml0ZU1zYUNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bE1zYUFkZHIsIHVuc2lnbmVkIHNob3J0IHVzVmFsdWUpOwordm9pZCBkc3AzNzgwSV9Xcml0ZUdlbkNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywgdW5zaWduZWQgdUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHVjVmFsdWUpOwordW5zaWduZWQgY2hhciBkc3AzNzgwSV9SZWFkR2VuQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVJbmRleCk7CitpbnQgZHNwMzc4MElfR2V0SVBDU291cmNlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcHVzSVBDU291cmNlKTsKKworLyogSS9PIHBvcnQgYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSBNS1dPUkQodmFyKSAoKigodW5zaWduZWQgc2hvcnQgKikoJnZhcikpKQorI2RlZmluZSBNS0JZVEUodmFyKSAoKigodW5zaWduZWQgY2hhciAqKSgmdmFyKSkpCisKKyNkZWZpbmUgV3JpdGVNc2FDZmcoYWRkcix2YWx1ZSkgZHNwMzc4MElfV3JpdGVNc2FDZmcodXNEc3BCYXNlSU8sYWRkcix2YWx1ZSkKKyNkZWZpbmUgUmVhZE1zYUNmZyhhZGRyKSBkc3AzNzgwSV9SZWFkTXNhQ2ZnKHVzRHNwQmFzZUlPLGFkZHIpCisjZGVmaW5lIFdyaXRlR2VuQ2ZnKGluZGV4LHZhbHVlKSBkc3AzNzgwSV9Xcml0ZUdlbkNmZyh1c0RzcEJhc2VJTyxpbmRleCx2YWx1ZSkKKyNkZWZpbmUgUmVhZEdlbkNmZyhpbmRleCkgZHNwMzc4MElfUmVhZEdlbkNmZyh1c0RzcEJhc2VJTyxpbmRleCkKKworI2RlZmluZSBJbldvcmREc3AoaW5kZXgpICAgICAgICAgIGludyh1c0RzcEJhc2VJTytpbmRleCkKKyNkZWZpbmUgSW5CeXRlRHNwKGluZGV4KSAgICAgICAgICBpbmIodXNEc3BCYXNlSU8raW5kZXgpCisjZGVmaW5lIE91dFdvcmREc3AoaW5kZXgsdmFsdWUpICAgb3V0dyh2YWx1ZSx1c0RzcEJhc2VJTytpbmRleCkKKyNkZWZpbmUgT3V0Qnl0ZURzcChpbmRleCx2YWx1ZSkgICBvdXRiKHZhbHVlLHVzRHNwQmFzZUlPK2luZGV4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9td2F2ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTRjOWUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFDUCBNb2RlbSAoTXdhdmUpLgorIworIyBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm8uIDxwYXVsc2NoQHVzLmlibS5jb20+CisjCisKK29iai0kKENPTkZJR19NV0FWRSkgKz0gbXdhdmUubworCittd2F2ZS1vYmpzIDo9IG13YXZlZGQubyBzbWFwaS5vIHRwMzc4MGkubyAzNzgwaS5vCisKKyMgVG8gaGF2ZSB0aGUgbXdhdmUgZHJpdmVyIGRpc2FibGUgb3RoZXIgdWFydHMgaWYgbmVjZXNzYXJ5CisjIEVYVFJBX0NGTEFHUyArPSAtRE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisKKyMgVG8gY29tcGlsZSBpbiBsb3RzICh+MjAgS2lCKSBvZiBydW4tdGltZSBlbmFibGFibGUgcHJpbnRrKClzIGZvciBkZWJ1Z2dpbmc6CitFWFRSQV9DRkxBR1MgKz0gLURNV19UUkFDRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL1JFQURNRSBiL2RyaXZlcnMvY2hhci9td2F2ZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmOGQxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9SRUFETUUKQEAgLTAsMCArMSw1MCBAQAorTW9kdWxlIG9wdGlvbnMKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSBtd2F2ZSBtb2R1bGUgdGFrZXMgdGhlIGZvbGxvd2luZyBvcHRpb25zLiAgTm90ZSB0aGF0IHRoZXNlIG9wdGlvbnMKK2FyZSBub3Qgc2F2ZWQgYnkgdGhlIEJJT1MgYW5kIHNvIGRvIG5vdCBwZXJzaXN0IGFmdGVyIHVubG9hZCBhbmQgcmVsb2FkLgorCisgIG13YXZlX2RlYnVnPXZhbHVlLCB3aGVyZSB2YWx1ZSBpcyBiaXR3aXNlIE9SIG9mIHRyYWNlIGZsYWdzOgorCTB4MDAwMSBtd2F2ZWRkIGFwaSB0cmFjaW5nCisJMHgwMDAyIHNtYXBpIGFwaSB0cmFjaW5nCisJMHgwMDA0IDM3ODBpIHRyYWNpbmcKKwkweDAwMDggdHAzNzgwaSB0cmFjaW5nCisKKyAgICAgICAgVHJhY2luZyBvbmx5IG9jY3VycyBpZiB0aGUgZHJpdmVyIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGggdGhlCisgICAgICAgIE1XX1RSQUNFIG1hY3JvICNkZWZpbmVkICAoaS5lLiBsZXQgRVhUUkFfQ0ZMQUdTICs9IC1ETVdfVFJBQ0UKKyAgICAgICAgaW4gdGhlIE1ha2VmaWxlKS4KKworICBtd2F2ZV8zNzgwaV9pcnE9NS83LzEwLzExLzE1CisJSWYgdGhlIGRzcCBpcnEgaGFzIG5vdCBiZWVuIHNldHVwIGFuZCBzdG9yZWQgaW4gYmlvcyBieSB0aGUgCisJdGhpbmtwYWQgY29uZmlndXJhdGlvbiB1dGlsaXR5IHRoZW4gdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHRoZQorCWlycSB1c2VkIGJ5IHRoZSBkc3AgdG8gYmUgY29uZmlndXJlZC4KKworICBtd2F2ZV8zNzgwaV9pbz0weDEzMC8weDM1MC8weDAwNzAvMHhEQjAKKwlJZiB0aGUgZHNwIGlvIHJhbmdlIGhhcyBub3QgYmVlbiBzZXR1cCBhbmQgc3RvcmVkIGluIGJpb3MgYnkgdGhlIAorCXRoaW5rcGFkIGNvbmZpZ3VyYXRpb24gdXRpbGl0eSB0aGVuIHRoaXMgcGFyYW1ldGVyIGFsbG93cyB0aGUKKwlpbyByYW5nZSB1c2VkIGJ5IHRoZSBkc3AgdG8gYmUgY29uZmlndXJlZC4KKworICBtd2F2ZV91YXJ0X2lycT0zLzQKKwlJZiB0aGUgbXdhdmUncyB1YXJ0IGlycSBoYXMgbm90IGJlZW4gc2V0dXAgYW5kIHN0b3JlZCBpbiBiaW9zIGJ5IHRoZSAKKwl0aGlua3BhZCBjb25maWd1cmF0aW9uIHV0aWxpdHkgdGhlbiB0aGlzIHBhcmFtZXRlciBhbGxvd3MgdGhlCisJaXJxIHVzZWQgYnkgdGhlIG13YXZlIHVhcnQgdG8gYmUgY29uZmlndXJlZC4KKworICBtd2F2ZV91YXJ0X2lvPTB4M2Y4LzB4MmY4LzB4M0U4LzB4MkU4CisJSWYgdGhlIHVhcnQgaW8gcmFuZ2UgaGFzIG5vdCBiZWVuIHNldHVwIGFuZCBzdG9yZWQgaW4gYmlvcyBieSB0aGUgCisJdGhpbmtwYWQgY29uZmlndXJhdGlvbiB1dGlsaXR5IHRoZW4gdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHRoZQorCWlvIHJhbmdlIHVzZWQgYnkgdGhlIG13YXZlIHVhcnQgdG8gYmUgY29uZmlndXJlZC4KKworRXhhbXBsZSB0byBlbmFibGUgdGhlIDM3ODBpIERTUCB1c2luZyB0dHlTMSByZXNvdXJjZXM6CisJCisgIGluc21vZCBtd2F2ZSBtd2F2ZV8zNzgwaV9pcnE9MTAgbXdhdmVfMzc4MGlfaW89MHgwMTMwIG13YXZlX3VhcnRfaXJxPTMgbXdhdmVfdWFydF9pbz0weDJmOAorCitBY2Nlc3NpbmcgdGhlIGRyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IG11c3QgYWxzbyBjcmVhdGUgYSBub2RlIGZvciB0aGUgZHJpdmVyLiAgV2l0aG91dCBkZXZmczoKKyAgbWtkaXIgLXAgL2Rldi9tb2RlbXMKKyAgbWtub2QgLS1tb2RlPTY2MCAvZGV2L21vZGVtcy9td2F2ZSBjIDEwIDIxOQorV2l0aCBkZXZmczoKKyAgbWtkaXIgLXAgL2Rldi9tb2RlbXMKKyAgbG4gLXMgLi4vbWlzYy9td2F2ZSAvZGV2L21vZGVtcy9td2F2ZQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzc2MjVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwpAQCAtMCwwICsxLDY3NCBAQAorLyoKKyoKKyogbXdhdmVkZC5jIC0tIG13YXZlIGRldmljZSBkcml2ZXIKKyoKKyoKKyogV3JpdHRlbiBCeTogTWlrZSBTdWxsaXZhbiBJQk0gQ29ycG9yYXRpb24KKyoKKyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBOTyBXQVJSQU5UWQorKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyogQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisqIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyogdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisqCisqIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisqIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqCisqCisqIDEwLzIzLzIwMDAgLSBBbHBoYSBSZWxlYXNlCisqCUZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInNtYXBpLmgiCisjaW5jbHVkZSAibXdhdmVkZC5oIgorI2luY2x1ZGUgIjM3ODBpLmgiCisjaW5jbHVkZSAidHAzNzgwaS5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIjM3ODBpIEFkdmFuY2VkIENvbW11bmljYXRpb25zIFByb2Nlc3NvciAoTXdhdmUpIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWlrZSBTdWxsaXZhbiBhbmQgUGF1bCBTY2hyb2VkZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyogVGhlc2UgcGFyYW1ldGVycyBzdXBwb3J0IHRoZSBzZXR0aW5nIG9mIE1XYXZlIHJlc291cmNlcy4gTm90ZSB0aGF0IG5vCisqIGNoZWNrcyBhcmUgbWFkZSBhZ2FpbnN0IG90aGVyIGRldmljZXMgKGllLiBzdXBlcmlvKSBmb3IgY29uZmxpY3RzLgorKiBXZSdsbCBkZXBlbmQgb24gdXNlcnMgdXNpbmcgdGhlIHRwY3RsIHV0aWxpdHkgdG8gZG8gdGhhdCBmb3Igbm93CisqLworaW50IG13YXZlX2RlYnVnID0gMDsKK2ludCBtd2F2ZV8zNzgwaV9pcnEgPSAwOworaW50IG13YXZlXzM3ODBpX2lvID0gMDsKK2ludCBtd2F2ZV91YXJ0X2lycSA9IDA7CitpbnQgbXdhdmVfdWFydF9pbyA9IDA7Cittb2R1bGVfcGFyYW0obXdhdmVfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXdhdmVfMzc4MGlfaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG13YXZlXzM3ODBpX2lvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG13YXZlX3VhcnRfaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG13YXZlX3VhcnRfaW8sIGludCwgMCk7CisKK3N0YXRpYyBpbnQgbXdhdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IG13YXZlX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgbXdhdmVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpb2NtZCwgdW5zaWduZWQgbG9uZyBpb2FyZyk7CisKK01XQVZFX0RFVklDRV9EQVRBIG13YXZlX3NfbWRkOworCitzdGF0aWMgaW50IG13YXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IHJldHZhbCA9IDA7CisKKwlQUklOVEtfMyhUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX29wZW4sIGVudHJ5IGlub2RlICVwIGZpbGUgJXBcbiIsCisJCSBpbm9kZSwgZmlsZSk7CisJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9vcGVuLCBleGl0IHJldHVybiByZXR2YWwgJXhcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IG13YXZlX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCByZXR2YWwgPSAwOworCisJUFJJTlRLXzMoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9jbG9zZSwgZW50cnkgaW5vZGUgJXAgZmlsZSAlcFxuIiwKKwkJIGlub2RlLCAgZmlsZSk7CisKKwlQUklOVEtfMihUUkFDRV9NV0FWRSwgIm13YXZlZGQ6Om13YXZlX2Nsb3NlLCBleGl0IHJldHZhbCAleFxuIiwKKwkJcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgbXdhdmVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpb2NtZCwgdW5zaWduZWQgbG9uZyBpb2FyZykKK3sKKwl1bnNpZ25lZCBpbnQgcmV0dmFsID0gMDsKKwlwTVdBVkVfREVWSUNFX0RBVEEgcERydkRhdGEgPSAmbXdhdmVfc19tZGQ7CisJdm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKWlvYXJnOworCisJUFJJTlRLXzUoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgZW50cnkgaW5vZGUgJXAgZmlsZSAlcCBjbWQgJXggYXJnICV4XG4iLAorCQkgaW5vZGUsICBmaWxlLCBpb2NtZCwgKGludCkgaW9hcmcpOworCisJc3dpdGNoIChpb2NtZCkgeworCisJCWNhc2UgSU9DVExfTVdfUkVTRVQ6CisJCQlQUklOVEtfMShUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwsIElPQ1RMX01XX1JFU0VUIgorCQkJCSIgY2FsbGluZyB0cDM3ODBJX1Jlc2V0RFNQXG4iKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVzZXREU1AoJnBEcnZEYXRhLT5yQkREYXRhKTsKKwkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgSU9DVExfTVdfUkVTRVQiCisJCQkJIiByZXR2YWwgJXggZnJvbSB0cDM3ODBJX1Jlc2V0RFNQXG4iLAorCQkJCXJldHZhbCk7CisJCQlicmVhazsKKwkKKwkJY2FzZSBJT0NUTF9NV19SVU46CisJCQlQUklOVEtfMShUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwsIElPQ1RMX01XX1JVTiIKKwkJCQkiIGNhbGxpbmcgdHAzNzgwSV9TdGFydERTUFxuIik7CisJCQlyZXR2YWwgPSB0cDM3ODBJX1N0YXJ0RFNQKCZwRHJ2RGF0YS0+ckJERGF0YSk7CisJCQlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwsIElPQ1RMX01XX1JVTiIKKwkJCQkiIHJldHZhbCAleCBmcm9tIHRwMzc4MElfU3RhcnREU1BcbiIsCisJCQkJcmV0dmFsKTsKKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX0RTUF9BQklMSVRJRVM6IHsKKwkJCU1XX0FCSUxJVElFUyByQWJpbGl0aWVzOworCQorCQkJUFJJTlRLXzEoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsLCIKKwkJCQkiIElPQ1RMX01XX0RTUF9BQklMSVRJRVMgY2FsbGluZyIKKwkJCQkiIHRwMzc4MElfUXVlcnlBYmlsaXRpZXNcbiIpOworCQkJcmV0dmFsID0gdHAzNzgwSV9RdWVyeUFiaWxpdGllcygmcERydkRhdGEtPnJCRERhdGEsCisJCQkJCSZyQWJpbGl0aWVzKTsKKwkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgSU9DVExfTVdfRFNQX0FCSUxJVElFUyIKKwkJCQkiIHJldHZhbCAleCBmcm9tIHRwMzc4MElfUXVlcnlBYmlsaXRpZXNcbiIsCisJCQkJcmV0dmFsKTsKKwkJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJCWlmKCBjb3B5X3RvX3VzZXIoYXJnLCAmckFiaWxpdGllcywKKwkJCQkJCQlzaXplb2YoTVdfQUJJTElUSUVTKSkgKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCwgSU9DVExfTVdfRFNQX0FCSUxJVElFUyIKKwkJCQkiIGV4aXQgcmV0dmFsICV4XG4iLAorCQkJCXJldHZhbCk7CisJCX0KKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX1JFQURfREFUQToKKwkJY2FzZSBJT0NUTF9NV19SRUFEQ0xFQVJfREFUQTogeworCQkJTVdfUkVBRFdSSVRFIHJSZWFkRGF0YTsKKwkJCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gTlVMTDsKKwkKKwkJCWlmKCBjb3B5X2Zyb21fdXNlcigmclJlYWREYXRhLCBhcmcsCisJCQkJCQlzaXplb2YoTVdfUkVBRFdSSVRFKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHVzQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoclJlYWREYXRhLnBCdWYpOworCQorCQkJUFJJTlRLXzQoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsIElPQ1RMX01XX1JFQURfREFUQSwiCisJCQkJIiBzaXplICVseCwgaW9hcmcgJWx4IHB1c0J1ZmZlciAlcFxuIiwKKwkJCQlyUmVhZERhdGEudWxEYXRhTGVuZ3RoLCBpb2FyZywgcHVzQnVmZmVyKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVhZFdyaXRlRHNwRFN0b3JlKCZwRHJ2RGF0YS0+ckJERGF0YSwKKwkJCQkJaW9jbWQsCisJCQkJCXB1c0J1ZmZlciwKKwkJCQkJclJlYWREYXRhLnVsRGF0YUxlbmd0aCwKKwkJCQkJclJlYWREYXRhLnVzRHNwQWRkcmVzcyk7CisJCX0KKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX1JFQURfSU5TVDogeworCQkJTVdfUkVBRFdSSVRFIHJSZWFkRGF0YTsKKwkJCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gTlVMTDsKKwkKKwkJCWlmKCBjb3B5X2Zyb21fdXNlcigmclJlYWREYXRhLCBhcmcsCisJCQkJCQlzaXplb2YoTVdfUkVBRFdSSVRFKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHVzQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoclJlYWREYXRhLnBCdWYpOworCQorCQkJUFJJTlRLXzQoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsIElPQ1RMX01XX1JFQURfSU5TVCwiCisJCQkJIiBzaXplICVseCwgaW9hcmcgJWx4IHB1c0J1ZmZlciAlcFxuIiwKKwkJCQlyUmVhZERhdGEudWxEYXRhTGVuZ3RoIC8gMiwgaW9hcmcsCisJCQkJcHVzQnVmZmVyKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVhZFdyaXRlRHNwRFN0b3JlKCZwRHJ2RGF0YS0+ckJERGF0YSwKKwkJCQlpb2NtZCwgcHVzQnVmZmVyLAorCQkJCXJSZWFkRGF0YS51bERhdGFMZW5ndGggLyAyLAorCQkJCXJSZWFkRGF0YS51c0RzcEFkZHJlc3MpOworCQl9CisJCQlicmVhazsKKwkKKwkJY2FzZSBJT0NUTF9NV19XUklURV9EQVRBOiB7CisJCQlNV19SRUFEV1JJVEUgcldyaXRlRGF0YTsKKwkJCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqcHVzQnVmZmVyID0gTlVMTDsKKwkKKwkJCWlmKCBjb3B5X2Zyb21fdXNlcigmcldyaXRlRGF0YSwgYXJnLAorCQkJCQkJc2l6ZW9mKE1XX1JFQURXUklURSkpICkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB1c0J1ZmZlciA9ICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKHJXcml0ZURhdGEucEJ1Zik7CisJCisJCQlQUklOVEtfNChUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfV1JJVEVfREFUQSwiCisJCQkJIiBzaXplICVseCwgaW9hcmcgJWx4IHB1c0J1ZmZlciAlcFxuIiwKKwkJCQlyV3JpdGVEYXRhLnVsRGF0YUxlbmd0aCwgaW9hcmcsCisJCQkJcHVzQnVmZmVyKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVhZFdyaXRlRHNwRFN0b3JlKCZwRHJ2RGF0YS0+ckJERGF0YSwKKwkJCQkJaW9jbWQsIHB1c0J1ZmZlciwKKwkJCQkJcldyaXRlRGF0YS51bERhdGFMZW5ndGgsCisJCQkJCXJXcml0ZURhdGEudXNEc3BBZGRyZXNzKTsKKwkJfQorCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfV1JJVEVfSU5TVDogeworCQkJTVdfUkVBRFdSSVRFIHJXcml0ZURhdGE7CisJCQl1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKnB1c0J1ZmZlciA9IE5VTEw7CisJCisJCQlpZiggY29weV9mcm9tX3VzZXIoJnJXcml0ZURhdGEsIGFyZywKKwkJCQkJCXNpemVvZihNV19SRUFEV1JJVEUpKSApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdXNCdWZmZXIgPSAodW5zaWduZWQgc2hvcnQgX191c2VyICopKHJXcml0ZURhdGEucEJ1Zik7CisJCisJCQlQUklOVEtfNChUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfV1JJVEVfSU5TVCwiCisJCQkJIiBzaXplICVseCwgaW9hcmcgJWx4IHB1c0J1ZmZlciAlcFxuIiwKKwkJCQlyV3JpdGVEYXRhLnVsRGF0YUxlbmd0aCwgaW9hcmcsCisJCQkJcHVzQnVmZmVyKTsKKwkJCXJldHZhbCA9IHRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlKCZwRHJ2RGF0YS0+ckJERGF0YSwKKwkJCQkJaW9jbWQsIHB1c0J1ZmZlciwKKwkJCQkJcldyaXRlRGF0YS51bERhdGFMZW5ndGgsCisJCQkJCXJXcml0ZURhdGEudXNEc3BBZGRyZXNzKTsKKwkJfQorCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfUkVHSVNURVJfSVBDOiB7CisJCQl1bnNpZ25lZCBpbnQgaXBjbnVtID0gKHVuc2lnbmVkIGludCkgaW9hcmc7CisJCisJCQlQUklOVEtfMyhUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfUkVHSVNURVJfSVBDIgorCQkJCSIgaXBjbnVtICV4IGVudHJ5IHVzSW50Q291bnQgJXhcbiIsCisJCQkJaXBjbnVtLAorCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCk7CisJCisJCQlpZiAoaXBjbnVtID4gQVJSQVlfU0laRShwRHJ2RGF0YS0+SVBDcykpIHsKKwkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bDoiCisJCQkJCQkiIElPQ1RMX01XX1JFR0lTVEVSX0lQQzoiCisJCQkJCQkiIEVycm9yOiBJbnZhbGlkIGlwY251bSAleFxuIiwKKwkJCQkJCWlwY251bSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPSBGQUxTRTsKKwkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9IFRSVUU7CisJCisJCQlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfUkVHSVNURVJfSVBDIgorCQkJCSIgaXBjbnVtICV4IGV4aXRcbiIsCisJCQkJaXBjbnVtKTsKKwkJfQorCQkJYnJlYWs7CisJCisJCWNhc2UgSU9DVExfTVdfR0VUX0lQQzogeworCQkJdW5zaWduZWQgaW50IGlwY251bSA9ICh1bnNpZ25lZCBpbnQpIGlvYXJnOworCQorCQkJUFJJTlRLXzMoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsIElPQ1RMX01XX0dFVF9JUEMiCisJCQkJIiBpcGNudW0gJXgsIHVzSW50Q291bnQgJXhcbiIsCisJCQkJaXBjbnVtLAorCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCk7CisJCQlpZiAoaXBjbnVtID4gQVJSQVlfU0laRShwRHJ2RGF0YS0+SVBDcykpIHsKKwkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bDoiCisJCQkJCQkiIElPQ1RMX01XX0dFVF9JUEM6IEVycm9yOiIKKwkJCQkJCSIgSW52YWxpZCBpcGNudW0gJXhcbiIsIGlwY251bSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCisJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID09IFRSVUUpIHsKKwkJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwsIHRocmVhZCBmb3IiCisJCQkJCSIgaXBjICV4IGdvaW5nIHRvIHNsZWVwXG4iLAorCQkJCQlpcGNudW0pOworCQkJCWFkZF93YWl0X3F1ZXVlKCZwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmlwY193YWl0X3F1ZXVlLCAmd2FpdCk7CisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gVFJVRTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCS8qIGNoZWNrIHdoZXRoZXIgYW4gZXZlbnQgd2FzIHNpZ25hbGxlZCBieSAqLworCQkJCS8qIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aGlsZSB3ZSB3ZXJlIGdvbmUgKi8KKwkJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50ID09IDEpIHsJLyogZmlyc3QgaW50IGhhcyBvY2N1cnJlZCAocmFjZSBjb25kaXRpb24pICovCisJCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCA9IDI7CS8qIGZpcnN0IGludCBoYXMgYmVlbiBoYW5kbGVkICovCisJCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsIgorCQkJCQkJIiBJT0NUTF9NV19HRVRfSVBDIGlwY251bSAleCIKKwkJCQkJCSIgaGFuZGxpbmcgZmlyc3QgaW50XG4iLAorCQkJCQkJaXBjbnVtKTsKKwkJCQl9IGVsc2UgewkvKiBlaXRoZXIgMXN0IGludCBoYXMgbm90IHlldCBvY2N1cnJlZCwgb3Igd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIGZpcnN0IGludCAqLworCQkJCQlzY2hlZHVsZSgpOworCQkJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50ID09IDEpIHsKKwkJCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCA9IDI7CisJCQkJCX0KKwkJCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCQkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwiCisJCQkJCQkiIElPQ1RMX01XX0dFVF9JUEMgaXBjbnVtICV4IgorCQkJCQkJIiB3b2tlIHVwIGFuZCByZXR1cm5pbmcgdG8iCisJCQkJCQkiIGFwcGxpY2F0aW9uXG4iLAorCQkJCQkJaXBjbnVtKTsKKwkJCQl9CisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gRkFMU0U7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBEcnZEYXRhLT5JUENzW2lwY251bV0uaXBjX3dhaXRfcXVldWUsICZ3YWl0KTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfR0VUX0lQQywiCisJCQkJCSIgcmV0dXJuaW5nIHRocmVhZCBmb3IgaXBjICV4IgorCQkJCQkiIHByb2Nlc3NpbmdcbiIsCisJCQkJCWlwY251bSk7CisJCQl9CisJCX0KKwkJCWJyZWFrOworCQorCQljYXNlIElPQ1RMX01XX1VOUkVHSVNURVJfSVBDOiB7CisJCQl1bnNpZ25lZCBpbnQgaXBjbnVtID0gKHVuc2lnbmVkIGludCkgaW9hcmc7CisJCisJCQlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfVU5SRUdJU1RFUl9JUEMiCisJCQkJIiBpcGNudW0gJXhcbiIsCisJCQkJaXBjbnVtKTsKKwkJCWlmIChpcGNudW0gPiBBUlJBWV9TSVpFKHBEcnZEYXRhLT5JUENzKSkgeworCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsOiIKKwkJCQkJCSIgSU9DVExfTVdfVU5SRUdJU1RFUl9JUEM6IgorCQkJCQkJIiBFcnJvcjogSW52YWxpZCBpcGNudW0gJXhcbiIsCisJCQkJCQlpcGNudW0pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKHBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9PSBUUlVFKSB7CisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID0gRkFMU0U7CisJCQkJaWYgKHBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9PSBUUlVFKSB7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcERydkRhdGEtPklQQ3NbaXBjbnVtXS5pcGNfd2FpdF9xdWV1ZSk7CisJCQkJfQorCQkJfQorCQl9CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAibXdhdmVkZDo6bXdhdmVfaW9jdGw6IgorCQkJCQkiIEVycm9yOiBVbnJlY29nbml6ZWQgaW9jbWQgJXhcbiIsCisJCQkJCWlvY21kKTsKKwkJCXJldHVybiAtRU5PVFRZOworCQkJYnJlYWs7CisJfSAvKiBzd2l0Y2ggKi8KKworCVBSSU5US18yKFRSQUNFX01XQVZFLCAibXdhdmVkZDo6bXdhdmVfaW9jdGwsIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgc3NpemVfdCBtd2F2ZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqIHBwb3MpCit7CisJUFJJTlRLXzUoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9yZWFkIGVudHJ5IGZpbGUgJXAsIGJ1ZiAlcCwgY291bnQgJXp4IHBwb3MgJXBcbiIsCisJCWZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworc3RhdGljIHNzaXplX3QgbXdhdmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJUFJJTlRLXzUoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV93cml0ZSBlbnRyeSBmaWxlICVwLCBidWYgJXAsIgorCQkiIGNvdW50ICV6eCBwcG9zICVwXG4iLAorCQlmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfc2VyaWFsX3BvcnRhbmRpcnEodW5zaWduZWQgaW50IHBvcnQsIGludCBpcnEpCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2VyaWFsOworCisJc3dpdGNoICggcG9ydCApIHsKKwkJY2FzZSAweDNmODoKKwkJY2FzZSAweDJmODoKKwkJY2FzZSAweDNlODoKKwkJY2FzZSAweDJlODoKKwkJCS8qIE9LICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkibXdhdmVkZDo6cmVnaXN0ZXJfc2VyaWFsX3BvcnRhbmRpcnE6IgorCQkJCQkiIEVycm9yOiBJbGxlZ2FsIHBvcnQgJXhcbiIsIHBvcnQgKTsKKwkJCXJldHVybiAtMTsKKwl9IC8qIHN3aXRjaCAqLworCS8qIHBvcnQgaXMgb2theSAqLworCisJc3dpdGNoICggaXJxICkgeworCQljYXNlIDM6CisJCWNhc2UgNDoKKwkJY2FzZSA1OgorCQljYXNlIDc6CisJCQkvKiBPSyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJIm13YXZlZGQ6OnJlZ2lzdGVyX3NlcmlhbF9wb3J0YW5kaXJxOiIKKwkJCQkJIiBFcnJvcjogSWxsZWdhbCBpcnEgJXhcbiIsIGlycSApOworCQkJcmV0dXJuIC0xOworCX0gLyogc3dpdGNoICovCisJLyogaXJxIGlzIG9rYXkgKi8KKworCW1lbXNldCgmc2VyaWFsLCAwLCBzaXplb2Yoc2VyaWFsKSk7CisJc2VyaWFsLnBvcnQgPSBwb3J0OworCXNlcmlhbC5pcnEgPSBpcnE7CisJc2VyaWFsLmZsYWdzID0gQVNZTkNfU0hBUkVfSVJROworCisJcmV0dXJuIHJlZ2lzdGVyX3NlcmlhbCgmc2VyaWFsKTsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtd2F2ZV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBtd2F2ZV9yZWFkLAorCS53cml0ZQkJPSBtd2F2ZV93cml0ZSwKKwkuaW9jdGwJCT0gbXdhdmVfaW9jdGwsCisJLm9wZW4JCT0gbXdhdmVfb3BlbiwKKwkucmVsZWFzZQk9IG13YXZlX2Nsb3NlCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtd2F2ZV9taXNjX2RldiA9IHsgTVdBVkVfTUlOT1IsICJtd2F2ZSIsICZtd2F2ZV9mb3BzIH07CisKKyNpZiAwIC8qIHRvdGFsbHkgYjBya2VkICovCisvKgorICogc3lzZnMgc3VwcG9ydCA8cGF1bHNjaEB1cy5pYm0uY29tPgorICovCisKK3N0cnVjdCBkZXZpY2UgbXdhdmVfZGV2aWNlOworCisvKiBQcmV2ZW50IGNvZGUgcmVkdW5kYW5jeSwgY3JlYXRlIGEgbWFjcm8gZm9yIG13YXZlX3Nob3dfKiBmdW5jdGlvbnMuICovCisjZGVmaW5lIG13YXZlX3Nob3dfZnVuY3Rpb24oYXR0cl9uYW1lLCBmb3JtYXRfc3RyaW5nLCBmaWVsZCkJCVwKK3N0YXRpYyBzc2l6ZV90IG13YXZlX3Nob3dfIyNhdHRyX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0JCQkJXAorCQkmbXdhdmVfc19tZGQuckJERGF0YS5yRHNwU2V0dGluZ3M7CQkJXAorICAgICAgICByZXR1cm4gc3ByaW50ZihidWYsIGZvcm1hdF9zdHJpbmcsIHBTZXR0aW5ncy0+ZmllbGQpOwkJXAorfQorCisvKiBBbGwgb2Ygb3VyIGF0dHJpYnV0ZXMgYXJlIHJlYWQgYXR0cmlidXRlcy4gKi8KKyNkZWZpbmUgbXdhdmVfZGV2X3JkX2F0dHIoYXR0cl9uYW1lLCBmb3JtYXRfc3RyaW5nLCBmaWVsZCkJCVwKKwltd2F2ZV9zaG93X2Z1bmN0aW9uKGF0dHJfbmFtZSwgZm9ybWF0X3N0cmluZywgZmllbGQpCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoYXR0cl9uYW1lLCBTX0lSVUdPLCBtd2F2ZV9zaG93XyMjYXR0cl9uYW1lLCBOVUxMKQorCittd2F2ZV9kZXZfcmRfYXR0ciAoMzc4MGlfZG1hLCAiJWlcbiIsIHVzRHNwRG1hKTsKK213YXZlX2Rldl9yZF9hdHRyICgzNzgwaV9pcnEsICIlaVxuIiwgdXNEc3BJcnEpOworbXdhdmVfZGV2X3JkX2F0dHIgKDM3ODBpX2lvLCAiJSMuNHhcbiIsIHVzRHNwQmFzZUlPKTsKK213YXZlX2Rldl9yZF9hdHRyICh1YXJ0X2lycSwgIiVpXG4iLCB1c1VhcnRJcnEpOworbXdhdmVfZGV2X3JkX2F0dHIgKHVhcnRfaW8sICIlIy40eFxuIiwgdXNVYXJ0QmFzZUlPKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICogY29uc3QgbXdhdmVfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyXzM3ODBpX2RtYSwKKwkmZGV2X2F0dHJfMzc4MGlfaXJxLAorCSZkZXZfYXR0cl8zNzgwaV9pbywKKwkmZGV2X2F0dHJfdWFydF9pcnEsCisJJmRldl9hdHRyX3VhcnRfaW8sCit9OworI2VuZGlmCisKKy8qCisqIG13YXZlX2luaXQgaXMgY2FsbGVkIG9uIG1vZHVsZSBsb2FkCisqCisqIG13YXZlX2V4aXQgaXMgY2FsbGVkIG9uIG1vZHVsZSB1bmxvYWQKKyogbXdhdmVfZXhpdCBpcyBhbHNvIHVzZWQgdG8gY2xlYW4gdXAgYWZ0ZXIgYW4gYWJvcnRlZCBtd2F2ZV9pbml0CisqLworc3RhdGljIHZvaWQgbXdhdmVfZXhpdCh2b2lkKQoreworCXBNV0FWRV9ERVZJQ0VfREFUQSBwRHJ2RGF0YSA9ICZtd2F2ZV9zX21kZDsKKworCVBSSU5US18xKFRSQUNFX01XQVZFLCAibXdhdmVkZDo6bXdhdmVfZXhpdCBlbnRyeVxuIik7CisKKyNpZiAwCisJZm9yIChpID0gMDsgaSA8IHBEcnZEYXRhLT5ucl9yZWdpc3RlcmVkX2F0dHJzOyBpKyspCisJCWRldmljZV9yZW1vdmVfZmlsZSgmbXdhdmVfZGV2aWNlLCBtd2F2ZV9kZXZfYXR0cnNbaV0pOworCXBEcnZEYXRhLT5ucl9yZWdpc3RlcmVkX2F0dHJzID0gMDsKKworCWlmIChwRHJ2RGF0YS0+ZGV2aWNlX3JlZ2lzdGVyZWQpIHsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJm13YXZlX2RldmljZSk7CisJCXBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCA9IEZBTFNFOworCX0KKyNlbmRpZgorCisJaWYgKCBwRHJ2RGF0YS0+c0xpbmUgPj0gMCApIHsKKwkJdW5yZWdpc3Rlcl9zZXJpYWwocERydkRhdGEtPnNMaW5lKTsKKwl9CisJaWYgKHBEcnZEYXRhLT5iTXdhdmVEZXZSZWdpc3RlcmVkKSB7CisJCW1pc2NfZGVyZWdpc3RlcigmbXdhdmVfbWlzY19kZXYpOworCX0KKwlpZiAocERydkRhdGEtPmJEU1BFbmFibGVkKSB7CisJCXRwMzc4MElfRGlzYWJsZURTUCgmcERydkRhdGEtPnJCRERhdGEpOworCX0KKwlpZiAocERydkRhdGEtPmJSZXNvdXJjZXNDbGFpbWVkKSB7CisJCXRwMzc4MElfUmVsZWFzZVJlc291cmNlcygmcERydkRhdGEtPnJCRERhdGEpOworCX0KKwlpZiAocERydkRhdGEtPmJCREluaXRpYWxpemVkKSB7CisJCXRwMzc4MElfQ2xlYW51cCgmcERydkRhdGEtPnJCRERhdGEpOworCX0KKworCVBSSU5US18xKFRSQUNFX01XQVZFLCAibXdhdmVkZDo6bXdhdmVfZXhpdCBleGl0XG4iKTsKK30KKworbW9kdWxlX2V4aXQobXdhdmVfZXhpdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IG13YXZlX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0dmFsID0gMDsKKwlwTVdBVkVfREVWSUNFX0RBVEEgcERydkRhdGEgPSAmbXdhdmVfc19tZGQ7CisKKwlQUklOVEtfMShUUkFDRV9NV0FWRSwgIm13YXZlZGQ6Om13YXZlX2luaXQgZW50cnlcbiIpOworCisJbWVtc2V0KCZtd2F2ZV9zX21kZCwgMCwgc2l6ZW9mKE1XQVZFX0RFVklDRV9EQVRBKSk7CisKKwlwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+YkRTUFJlc2V0ID0gRkFMU0U7CisJcERydkRhdGEtPmJNd2F2ZURldlJlZ2lzdGVyZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+c0xpbmUgPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBEcnZEYXRhLT5JUENzKTsgaSsrKSB7CisJCXBEcnZEYXRhLT5JUENzW2ldLmJJc0VuYWJsZWQgPSBGQUxTRTsKKwkJcERydkRhdGEtPklQQ3NbaV0uYklzSGVyZSA9IEZBTFNFOworCQlwRHJ2RGF0YS0+SVBDc1tpXS51c0ludENvdW50ID0gMDsJLyogbm8gaW50cyByZWNlaXZlZCB5ZXQgKi8KKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcERydkRhdGEtPklQQ3NbaV0uaXBjX3dhaXRfcXVldWUpOworCX0KKworCXJldHZhbCA9IHRwMzc4MElfSW5pdGlhbGl6ZUJvYXJkRGF0YSgmcERydkRhdGEtPnJCRERhdGEpOworCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkibXdhdmVkZDo6bXdhdmVfaW5pdCwgcmV0dXJuIGZyb20gdHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhIgorCQkiIHJldHZhbCAleFxuIiwKKwkJcmV0dmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCSJtd2F2ZWRkOjptd2F2ZV9pbml0OiBFcnJvcjoiCisJCQkJIiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBib2FyZCBkYXRhXG4iKTsKKwkJZ290byBjbGVhbnVwX2Vycm9yOworCX0KKwlwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQgPSBUUlVFOworCisJcmV0dmFsID0gdHAzNzgwSV9DYWxjUmVzb3VyY2VzKCZwRHJ2RGF0YS0+ckJERGF0YSk7CisJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCisJCSJtd2F2ZWRkOjptd2F2ZV9pbml0LCByZXR1cm4gZnJvbSB0cDM3ODBJX0NhbGNSZXNvdXJjZXMiCisJCSIgcmV0dmFsICV4XG4iLAorCQlyZXR2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJIm13YXZlZGQ6bXdhdmVfaW5pdDogRXJyb3I6IgorCQkJCSIgRmFpbGVkIHRvIGNhbGN1bGF0ZSByZXNvdXJjZXNcbiIpOworCQlnb3RvIGNsZWFudXBfZXJyb3I7CisJfQorCisJcmV0dmFsID0gdHAzNzgwSV9DbGFpbVJlc291cmNlcygmcERydkRhdGEtPnJCRERhdGEpOworCVBSSU5US18yKFRSQUNFX01XQVZFLAorCQkibXdhdmVkZDo6bXdhdmVfaW5pdCwgcmV0dXJuIGZyb20gdHAzNzgwSV9DbGFpbVJlc291cmNlcyIKKwkJIiByZXR2YWwgJXhcbiIsCisJCXJldHZhbCk7CisJaWYgKHJldHZhbCkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkibXdhdmVkZDptd2F2ZV9pbml0OiBFcnJvcjoiCisJCQkJIiBGYWlsZWQgdG8gY2xhaW0gcmVzb3VyY2VzXG4iKTsKKwkJZ290byBjbGVhbnVwX2Vycm9yOworCX0KKwlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBUUlVFOworCisJcmV0dmFsID0gdHAzNzgwSV9FbmFibGVEU1AoJnBEcnZEYXRhLT5yQkREYXRhKTsKKwlQUklOVEtfMihUUkFDRV9NV0FWRSwKKwkJIm13YXZlZGQ6Om13YXZlX2luaXQsIHJldHVybiBmcm9tIHRwMzc4MElfRW5hYmxlRFNQIgorCQkiIHJldHZhbCAleFxuIiwKKwkJcmV0dmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCSJtd2F2ZWRkOm13YXZlX2luaXQ6IEVycm9yOiIKKwkJCQkiIEZhaWxlZCB0byBlbmFibGUgRFNQXG4iKTsKKwkJZ290byBjbGVhbnVwX2Vycm9yOworCX0KKwlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSBUUlVFOworCisJaWYgKG1pc2NfcmVnaXN0ZXIoJm13YXZlX21pc2NfZGV2KSA8IDApIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJIm13YXZlZGQ6bXdhdmVfaW5pdDogRXJyb3I6IgorCQkJCSIgRmFpbGVkIHRvIHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwkJZ290byBjbGVhbnVwX2Vycm9yOworCX0KKwlwRHJ2RGF0YS0+Yk13YXZlRGV2UmVnaXN0ZXJlZCA9IFRSVUU7CisKKwlwRHJ2RGF0YS0+c0xpbmUgPSByZWdpc3Rlcl9zZXJpYWxfcG9ydGFuZGlycSgKKwkJcERydkRhdGEtPnJCRERhdGEuckRzcFNldHRpbmdzLnVzVWFydEJhc2VJTywKKwkJcERydkRhdGEtPnJCRERhdGEuckRzcFNldHRpbmdzLnVzVWFydElycQorCSk7CisJaWYgKHBEcnZEYXRhLT5zTGluZSA8IDApIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJIm13YXZlZGQ6bXdhdmVfaW5pdDogRXJyb3I6IgorCQkJCSIgRmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXJcbiIpOworCQlnb3RvIGNsZWFudXBfZXJyb3I7CisJfQorCS8qIHVhcnQgaXMgcmVnaXN0ZXJlZCAqLworCisjaWYgMAorCS8qIHN5c2ZzICovCisJbWVtc2V0KCZtd2F2ZV9kZXZpY2UsIDAsIHNpemVvZiAoc3RydWN0IGRldmljZSkpOworCXNucHJpbnRmKG13YXZlX2RldmljZS5idXNfaWQsIEJVU19JRF9TSVpFLCAibXdhdmUiKTsKKworCWlmIChkZXZpY2VfcmVnaXN0ZXIoJm13YXZlX2RldmljZSkpCisJCWdvdG8gY2xlYW51cF9lcnJvcjsKKwlwRHJ2RGF0YS0+ZGV2aWNlX3JlZ2lzdGVyZWQgPSBUUlVFOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG13YXZlX2Rldl9hdHRycyk7IGkrKykgeworCQlpZihkZXZpY2VfY3JlYXRlX2ZpbGUoJm13YXZlX2RldmljZSwgbXdhdmVfZGV2X2F0dHJzW2ldKSkgeworCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCisJCQkJCSJtd2F2ZWRkOm13YXZlX2luaXQ6IEVycm9yOiIKKwkJCQkJIiBGYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGUgJXNcbiIsCisJCQkJCW13YXZlX2Rldl9hdHRyc1tpXS0+YXR0ci5uYW1lKTsKKwkJCWdvdG8gY2xlYW51cF9lcnJvcjsKKwkJfQorCQlwRHJ2RGF0YS0+bnJfcmVnaXN0ZXJlZF9hdHRycysrOworCX0KKyNlbmRpZgorCisJLyogU1VDQ0VTUyEgKi8KKwlyZXR1cm4gMDsKKworY2xlYW51cF9lcnJvcjoKKwlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCSJtd2F2ZWRkOjptd2F2ZV9pbml0OiBFcnJvcjoiCisJCQkiIEZhaWxlZCB0byBpbml0aWFsaXplXG4iKTsKKwltd2F2ZV9leGl0KCk7IC8qIGNsZWFuIHVwICovCisKKwlyZXR1cm4gLUVJTzsKK30KKworbW9kdWxlX2luaXQobXdhdmVfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmggYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2E2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorKgorKiBtd2F2ZWRkLmggLS0gZGVjbGFyYXRpb25zIGZvciBtd2F2ZSBkZXZpY2UgZHJpdmVyCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpZm5kZWYgX0xJTlVYX01XQVZFRERfSAorI2RlZmluZSBfTElOVVhfTVdBVkVERF9ICisjaW5jbHVkZSAiMzc4MGkuaCIKKyNpbmNsdWRlICJ0cDM3ODBpLmgiCisjaW5jbHVkZSAic21hcGkuaCIKKyNpbmNsdWRlICJtd2F2ZXB1Yi5oIgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKK2V4dGVybiBpbnQgbXdhdmVfZGVidWc7CitleHRlcm4gaW50IG13YXZlXzM3ODBpX2lycTsKK2V4dGVybiBpbnQgbXdhdmVfMzc4MGlfaW87CitleHRlcm4gaW50IG13YXZlX3VhcnRfaXJxOworZXh0ZXJuIGludCBtd2F2ZV91YXJ0X2lvOworCisjZGVmaW5lIFBSSU5US19FUlJPUiBwcmludGsKKyNkZWZpbmUgS0VSTl9FUlJfTVdBVkUgS0VSTl9FUlIgIm13YXZlOiAiCisKKyNkZWZpbmUgVFJBQ0VfTVdBVkUgICAgIDB4MDAwMQorI2RlZmluZSBUUkFDRV9TTUFQSSAgICAgMHgwMDAyCisjZGVmaW5lIFRSQUNFXzM3ODBJICAgICAweDAwMDQKKyNkZWZpbmUgVFJBQ0VfVFAzNzgwSSAgIDB4MDAwOAorCisjaWZkZWYgTVdfVFJBQ0UKKyNkZWZpbmUgUFJJTlRLXzEoZixzKSAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZiAmIChtd2F2ZV9kZWJ1ZykpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFBSSU5US18yKGYscyx2MSkgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGYgJiAobXdhdmVfZGVidWcpKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50ayhzLHYxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBQUklOVEtfMyhmLHMsdjEsdjIpICAgICAgICAgICAgICAgICBcCisgIGlmIChmICYgKG13YXZlX2RlYnVnKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsocyx2MSx2Mik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgUFJJTlRLXzQoZixzLHYxLHYyLHYzKSAgICAgICAgICAgICAgXAorICBpZiAoZiAmIChtd2F2ZV9kZWJ1ZykpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKHMsdjEsdjIsdjMpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFBSSU5US181KGYscyx2MSx2Mix2Myx2NCkgICAgICAgICAgIFwKKyAgaWYgKGYgJiAobXdhdmVfZGVidWcpKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50ayhzLHYxLHYyLHYzLHY0KTsgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBQUklOVEtfNihmLHMsdjEsdjIsdjMsdjQsdjUpICAgICAgICBcCisgIGlmIChmICYgKG13YXZlX2RlYnVnKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsocyx2MSx2Mix2Myx2NCx2NSk7ICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgUFJJTlRLXzcoZixzLHYxLHYyLHYzLHY0LHY1LHY2KSAgICAgXAorICBpZiAoZiAmIChtd2F2ZV9kZWJ1ZykpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKHMsdjEsdjIsdjMsdjQsdjUsdjYpOyAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFBSSU5US184KGYscyx2MSx2Mix2Myx2NCx2NSx2Nix2NykgIFwKKyAgaWYgKGYgJiAobXdhdmVfZGVidWcpKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50ayhzLHYxLHYyLHYzLHY0LHY1LHY2LHY3KTsgICAgICAgICBcCisgIH0KKworI2Vsc2UKKyNkZWZpbmUgUFJJTlRLXzEoZixzKQorI2RlZmluZSBQUklOVEtfMihmLHMsdjEpCisjZGVmaW5lIFBSSU5US18zKGYscyx2MSx2MikKKyNkZWZpbmUgUFJJTlRLXzQoZixzLHYxLHYyLHYzKQorI2RlZmluZSBQUklOVEtfNShmLHMsdjEsdjIsdjMsdjQpCisjZGVmaW5lIFBSSU5US182KGYscyx2MSx2Mix2Myx2NCx2NSkKKyNkZWZpbmUgUFJJTlRLXzcoZixzLHYxLHYyLHYzLHY0LHY1LHY2KQorI2RlZmluZSBQUklOVEtfOChmLHMsdjEsdjIsdjMsdjQsdjUsdjYsdjcpCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBfTVdBVkVfSVBDIHsKKwl1bnNpZ25lZCBzaG9ydCB1c0ludENvdW50OwkvKiAwPW5vbmUsIDE9Zmlyc3QsIDI9Z3JlYXRlciB0aGFuIDFzdCAqLworCUJPT0xFQU4gYklzRW5hYmxlZDsKKwlCT09MRUFOIGJJc0hlcmU7CisJLyogZW50cnkgc3BpbiBsb2NrICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgaXBjX3dhaXRfcXVldWU7Cit9IE1XQVZFX0lQQzsKKwordHlwZWRlZiBzdHJ1Y3QgX01XQVZFX0RFVklDRV9EQVRBIHsKKwlUSElOS1BBRF9CRF9EQVRBIHJCRERhdGE7CS8qIGJvYXJkIGRyaXZlcidzIGRhdGEgYXJlYSAqLworCXVuc2lnbmVkIGxvbmcgdWxJUENTb3VyY2VfSVNSOwkvKiBJUEMgc291cmNlIGJpdHMgZm9yIHJlY2VudGx5IHByb2Nlc3NlZCBpbnRyLCBzZXQgZHVyaW5nIElTUiBwcm9jZXNzaW5nICovCisJdW5zaWduZWQgbG9uZyB1bElQQ1NvdXJjZV9EUEM7CS8qIElQQyBzb3VyY2UgYml0cyBmb3IgcmVjZW50bHkgcHJvY2Vzc2VkIGludHIsIHNldCBkdXJpbmcgRFBDIHByb2Nlc3NpbmcgKi8KKwlCT09MRUFOIGJCREluaXRpYWxpemVkOworCUJPT0xFQU4gYlJlc291cmNlc0NsYWltZWQ7CisJQk9PTEVBTiBiRFNQRW5hYmxlZDsKKwlCT09MRUFOIGJEU1BSZXNldDsKKwlNV0FWRV9JUEMgSVBDc1sxNl07CisJQk9PTEVBTiBiTXdhdmVEZXZSZWdpc3RlcmVkOworCXNob3J0IHNMaW5lOworCWludCBucl9yZWdpc3RlcmVkX2F0dHJzOworCWludCBkZXZpY2VfcmVnaXN0ZXJlZDsKKworfSBNV0FWRV9ERVZJQ0VfREFUQSwgKnBNV0FWRV9ERVZJQ0VfREFUQTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVwdWIuaCBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZXB1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjlkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVwdWIuaApAQCAtMCwwICsxLDg5IEBACisvKgorKgorKiBtd2F2ZXB1Yi5oIC0tIFBVQkxJQyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBtd2F2ZSBkcml2ZXIKKyogICAgICAgICAgICAgICBhbmQgYXBwbGljYXRpb25zIHVzaW5nIGl0CisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpZm5kZWYgX0xJTlVYX01XQVZFUFVCX0gKKyNkZWZpbmUgX0xJTlVYX01XQVZFUFVCX0gKKworI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKworCit0eXBlZGVmIHN0cnVjdCBfTVdfQUJJTElUSUVTIHsKKwl1bnNpZ25lZCBsb25nIGluc3RyX3Blcl9zZWM7CisJdW5zaWduZWQgbG9uZyBkYXRhX3NpemU7CisJdW5zaWduZWQgbG9uZyBpbnN0X3NpemU7CisJdW5zaWduZWQgbG9uZyBidXNfZG1hX2J3OworCXVuc2lnbmVkIHNob3J0IHVhcnRfZW5hYmxlOworCXNob3J0IGNvbXBvbmVudF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGNvbXBvbmVudF9saXN0WzddOworCWNoYXIgbXdhdmVfb3NfbmFtZVsxNl07CisJY2hhciBiaW9zX3Rhc2tfbmFtZVsxNl07Cit9IE1XX0FCSUxJVElFUywgKnBNV19BQklMSVRJRVM7CisKKwordHlwZWRlZiBzdHJ1Y3QgX01XX1JFQURXUklURSB7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BBZGRyZXNzOwkvKiBUaGUgZHNwIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nIHVsRGF0YUxlbmd0aDsJLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgb3IgdXNlciBidWZmZXIgKi8KKwl2b2lkICpwQnVmOwkJLyogSW5wdXQ6dmFyaWFibGUgc2l6ZWQgYnVmZmVyICovCit9IE1XX1JFQURXUklURSwgKnBNV19SRUFEV1JJVEU7CisKKyNkZWZpbmUgSU9DVExfTVdfUkVTRVQgICAgICAgICAgIF9JTyhNV0FWRV9NSU5PUiwxKQorI2RlZmluZSBJT0NUTF9NV19SVU4gICAgICAgICAgICAgX0lPKE1XQVZFX01JTk9SLDIpCisjZGVmaW5lIElPQ1RMX01XX0RTUF9BQklMSVRJRVMgICBfSU9SKE1XQVZFX01JTk9SLDMsTVdfQUJJTElUSUVTKQorI2RlZmluZSBJT0NUTF9NV19SRUFEX0RBVEEgICAgICAgX0lPUihNV0FWRV9NSU5PUiw0LE1XX1JFQURXUklURSkKKyNkZWZpbmUgSU9DVExfTVdfUkVBRENMRUFSX0RBVEEgIF9JT1IoTVdBVkVfTUlOT1IsNSxNV19SRUFEV1JJVEUpCisjZGVmaW5lIElPQ1RMX01XX1JFQURfSU5TVCAgICAgICBfSU9SKE1XQVZFX01JTk9SLDYsTVdfUkVBRFdSSVRFKQorI2RlZmluZSBJT0NUTF9NV19XUklURV9EQVRBICAgICAgX0lPVyhNV0FWRV9NSU5PUiw3LE1XX1JFQURXUklURSkKKyNkZWZpbmUgSU9DVExfTVdfV1JJVEVfSU5TVCAgICAgIF9JT1coTVdBVkVfTUlOT1IsOCxNV19SRUFEV1JJVEUpCisjZGVmaW5lIElPQ1RMX01XX1JFR0lTVEVSX0lQQyAgICBfSU9XKE1XQVZFX01JTk9SLDksaW50KQorI2RlZmluZSBJT0NUTF9NV19VTlJFR0lTVEVSX0lQQyAgX0lPVyhNV0FWRV9NSU5PUiwxMCxpbnQpCisjZGVmaW5lIElPQ1RMX01XX0dFVF9JUEMgICAgICAgICBfSU9XKE1XQVZFX01JTk9SLDExLGludCkKKyNkZWZpbmUgSU9DVExfTVdfVFJBQ0UgICAgICAgICAgIF9JT1IoTVdBVkVfTUlOT1IsMTIsTVdfUkVBRFdSSVRFKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmMgYi9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTg3ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmMKQEAgLTAsMCArMSw1NzAgQEAKKy8qCisqCisqIHNtYXBpLmMgLS0gU01BUEkgaW50ZXJmYWNlIHJvdXRpbmVzCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgkvKiBDTU9TIGRlZmluZXMgKi8KKyNpbmNsdWRlICJzbWFwaS5oIgorI2luY2x1ZGUgIm13YXZlZGQuaCIKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdfdXNTbWFwaVBvcnQgPSAwOworCisKK3N0YXRpYyBpbnQgc21hcGlfcmVxdWVzdCh1bnNpZ25lZCBzaG9ydCBpbkJYLCB1bnNpZ25lZCBzaG9ydCBpbkNYLAorCQkJIHVuc2lnbmVkIHNob3J0IGluREksIHVuc2lnbmVkIHNob3J0IGluU0ksCisJCQkgdW5zaWduZWQgc2hvcnQgKm91dEFYLCB1bnNpZ25lZCBzaG9ydCAqb3V0QlgsCisJCQkgdW5zaWduZWQgc2hvcnQgKm91dENYLCB1bnNpZ25lZCBzaG9ydCAqb3V0RFgsCisJCQkgdW5zaWduZWQgc2hvcnQgKm91dERJLCB1bnNpZ25lZCBzaG9ydCAqb3V0U0kpCit7CisJdW5zaWduZWQgc2hvcnQgbXlvdXRBWCA9IDIsICpwbXlvdXRBWCA9ICZteW91dEFYOworCXVuc2lnbmVkIHNob3J0IG15b3V0QlggPSAzLCAqcG15b3V0QlggPSAmbXlvdXRCWDsKKwl1bnNpZ25lZCBzaG9ydCBteW91dENYID0gNCwgKnBteW91dENYID0gJm15b3V0Q1g7CisJdW5zaWduZWQgc2hvcnQgbXlvdXREWCA9IDUsICpwbXlvdXREWCA9ICZteW91dERYOworCXVuc2lnbmVkIHNob3J0IG15b3V0REkgPSA2LCAqcG15b3V0REkgPSAmbXlvdXRESTsKKwl1bnNpZ25lZCBzaG9ydCBteW91dFNJID0gNywgKnBteW91dFNJID0gJm15b3V0U0k7CisJdW5zaWduZWQgc2hvcnQgdXNTbWFwaU9LID0gLUVJTywgKnB1c1NtYXBpT0sgPSAmdXNTbWFwaU9LOworCXVuc2lnbmVkIGludCBpbkJYQ1ggPSAoaW5CWCA8PCAxNikgfCBpbkNYOworCXVuc2lnbmVkIGludCBpbkRJU0kgPSAoaW5ESSA8PCAxNikgfCBpblNJOworCWludCByZXR2YWwgPSAwOworCisJUFJJTlRLXzUoVFJBQ0VfU01BUEksICJpbkJYICV4IGluQ1ggJXggaW5ESSAleCBpblNJICV4XG4iLAorCQlpbkJYLCBpbkNYLCBpbkRJLCBpblNJKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICAkMHg1MzgwLCUlYXhcblx0IgorCQkJICAgICJtb3ZsICAlNywlJWVieFxuXHQiCisJCQkgICAgInNocmwgICQxNiwgJSVlYnhcblx0IgorCQkJICAgICJtb3Z3ICAlNywlJWN4XG5cdCIKKwkJCSAgICAibW92bCAgJTgsJSVlZGlcblx0IgorCQkJICAgICJzaHJsICAkMTYsJSVlZGlcblx0IgorCQkJICAgICJtb3Z3ICAlOCwlJXNpXG5cdCIKKwkJCSAgICAibW92dyAgJTksJSVkeFxuXHQiCisJCQkgICAgIm91dCAgICUlYWwsJSVkeFxuXHQiCisJCQkgICAgIm91dCAgICUlYWwsJDB4NEZcblx0IgorCQkJICAgICJjbXBiICAkMHg1MywlJWFoXG5cdCIKKwkJCSAgICAiamUgICAgMmZcblx0IgorCQkJICAgICIxOlxuXHQiCisJCQkgICAgIm9yYiAgICUlYWgsJSVhaFxuXHQiCisJCQkgICAgImpueiAgIDJmXG5cdCIKKwkJCSAgICAibW92dyAgJSVheCwlMFxuXHQiCisJCQkgICAgIm1vdncgICUlYngsJTFcblx0IgorCQkJICAgICJtb3Z3ICAlJWN4LCUyXG5cdCIKKwkJCSAgICAibW92dyAgJSVkeCwlM1xuXHQiCisJCQkgICAgIm1vdncgICUlZGksJTRcblx0IgorCQkJICAgICJtb3Z3ICAlJXNpLCU1XG5cdCIKKwkJCSAgICAibW92dyAgJDEsJTZcblx0IgorCQkJICAgICIyOlxuXHQiOiI9bSIoKih1bnNpZ25lZCBzaG9ydCAqKSBwbXlvdXRBWCksCisJCQkgICAgIj1tIigqKHVuc2lnbmVkIHNob3J0ICopIHBteW91dEJYKSwKKwkJCSAgICAiPW0iKCoodW5zaWduZWQgc2hvcnQgKikgcG15b3V0Q1gpLAorCQkJICAgICI9bSIoKih1bnNpZ25lZCBzaG9ydCAqKSBwbXlvdXREWCksCisJCQkgICAgIj1tIigqKHVuc2lnbmVkIHNob3J0ICopIHBteW91dERJKSwKKwkJCSAgICAiPW0iKCoodW5zaWduZWQgc2hvcnQgKikgcG15b3V0U0kpLAorCQkJICAgICI9bSIoKih1bnNpZ25lZCBzaG9ydCAqKSBwdXNTbWFwaU9LKQorCQkJICAgIDoibSIoaW5CWENYKSwgIm0iKGluRElTSSksICJtIihnX3VzU21hcGlQb3J0KQorCQkJICAgIDoiJWVheCIsICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZWRpIiwKKwkJCSAgICAiJWVzaSIpOworCisJUFJJTlRLXzgoVFJBQ0VfU01BUEksCisJCSJteW91dEFYICV4IG15b3V0QlggJXggbXlvdXRDWCAleCBteW91dERYICV4IG15b3V0REkgJXggbXlvdXRTSSAleCB1c1NtYXBpT0sgJXhcbiIsCisJCW15b3V0QVgsIG15b3V0QlgsIG15b3V0Q1gsIG15b3V0RFgsIG15b3V0REksIG15b3V0U0ksCisJCXVzU21hcGlPSyk7CisJKm91dEFYID0gbXlvdXRBWDsKKwkqb3V0QlggPSBteW91dEJYOworCSpvdXRDWCA9IG15b3V0Q1g7CisJKm91dERYID0gbXlvdXREWDsKKwkqb3V0REkgPSBteW91dERJOworCSpvdXRTSSA9IG15b3V0U0k7CisKKwlyZXR2YWwgPSAodXNTbWFwaU9LID09IDEpID8gMCA6IC1FSU87CisJUFJJTlRLXzIoVFJBQ0VfU01BUEksICJzbWFwaTo6c21hcGlfcmVxdWVzdCBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK2ludCBzbWFwaV9xdWVyeV9EU1BfY2ZnKFNNQVBJX0RTUF9TRVRUSU5HUyAqIHBTZXR0aW5ncykKK3sKKwlpbnQgYlJDID0gLUVJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c0FYLCB1c0JYLCB1c0NYLCB1c0RYLCB1c0RJLCB1c1NJOworCXVuc2lnbmVkIHNob3J0IGF1c0RzcEJhc2VzW10gPSB7IDB4MDAzMCwgMHg0RTMwLCAweDhFMzAsIDB4Q0UzMCwgMHgwMTMwLCAweDAzNTAsIDB4MDA3MCwgMHgwREIwIH07CisJdW5zaWduZWQgc2hvcnQgYXVzVWFydEJhc2VzW10gPSB7IDB4MDNGOCwgMHgwMkY4LCAweDAzRTgsIDB4MDJFOCB9OworCXVuc2lnbmVkIHNob3J0IG51bURzcEJhc2VzID0gODsKKwl1bnNpZ25lZCBzaG9ydCBudW1VYXJ0QmFzZXMgPSA0OworCisJUFJJTlRLXzEoVFJBQ0VfU01BUEksICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZyBlbnRyeVxuIik7CisKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTgwMiwgMHgwMDAwLCAwLCAwLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwlpZiAoYlJDKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3F1ZXJ5X0RTUF9jZmc6IEVycm9yOiBDb3VsZCBub3QgZ2V0IERTUCBTZXR0aW5ncy4gQWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIGJSQzsKKwl9CisKKwlQUklOVEtfMShUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnLCBzbWFwaV9yZXF1ZXN0IE9LXG4iKTsKKworCXBTZXR0aW5ncy0+YkRTUFByZXNlbnQgPSAoKHVzQlggJiAweDAxMDApICE9IDApOworCXBTZXR0aW5ncy0+YkRTUEVuYWJsZWQgPSAoKHVzQ1ggJiAweDAwMDEpICE9IDApOworCXBTZXR0aW5ncy0+dXNEc3BJUlEgPSB1c1NJICYgMHgwMEZGOworCXBTZXR0aW5ncy0+dXNEc3BETUEgPSAodXNTSSAmIDB4RkYwMCkgPj4gODsKKwlpZiAoKHVzREkgJiAweDAwRkYpIDwgbnVtRHNwQmFzZXMpIHsKKwkJcFNldHRpbmdzLT51c0RzcEJhc2VJTyA9IGF1c0RzcEJhc2VzW3VzREkgJiAweDAwRkZdOworCX0gZWxzZSB7CisJCXBTZXR0aW5ncy0+dXNEc3BCYXNlSU8gPSAwOworCX0KKwlQUklOVEtfNihUUkFDRV9TTUFQSSwKKwkJInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnIGdldCBEU1AgU2V0dGluZ3MgYkRTUFByZXNlbnQgJXggYkRTUEVuYWJsZWQgJXggdXNEc3BJUlEgJXggdXNEc3BETUEgJXggdXNEc3BCYXNlSU8gJXhcbiIsCisJCXBTZXR0aW5ncy0+YkRTUFByZXNlbnQsIHBTZXR0aW5ncy0+YkRTUEVuYWJsZWQsCisJCXBTZXR0aW5ncy0+dXNEc3BJUlEsIHBTZXR0aW5ncy0+dXNEc3BETUEsCisJCXBTZXR0aW5ncy0+dXNEc3BCYXNlSU8pOworCisJLyogY2hlY2sgZm9yIGlsbGVnYWwgdmFsdWVzICovCisJaWYgKCBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPID09IDAgKSAKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogV29ycnk6IERTUCBiYXNlIEkvTyBhZGRyZXNzIGlzIDBcbiIpOworCWlmICggcFNldHRpbmdzLT51c0RzcElSUSA9PSAwICkKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogV29ycnk6IERTUCBJUlEgbGluZSBpcyAwXG4iKTsKKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODA0LCAweDAwMDAsIDAsIDAsCisJICAgCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIHsKKwkJUFJJTlRLX0VSUk9SKCJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogRXJyb3I6IENvdWxkIG5vdCBnZXQgRFNQIG1vZGVtIHNldHRpbmdzLiBBYm9ydGluZy5cbiIpOworCQlyZXR1cm4gYlJDOworCX0gCisKKwlQUklOVEtfMShUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnLCBzbWFwaV9yZXF1ZXN0IE9LXG4iKTsKKworCXBTZXR0aW5ncy0+Yk1vZGVtRW5hYmxlZCA9ICgodXNDWCAmIDB4MDAwMSkgIT0gMCk7CisJcFNldHRpbmdzLT51c1VhcnRJUlEgPSB1c1NJICYgMHgwMDBGOworCWlmICgoKHVzU0kgJiAweEZGMDApID4+IDgpIDwgbnVtVWFydEJhc2VzKSB7CisJCXBTZXR0aW5ncy0+dXNVYXJ0QmFzZUlPID0gYXVzVWFydEJhc2VzWyh1c1NJICYgMHhGRjAwKSA+PiA4XTsKKwl9IGVsc2UgeworCQlwU2V0dGluZ3MtPnVzVWFydEJhc2VJTyA9IDA7CisJfQorCisJUFJJTlRLXzQoVFJBQ0VfU01BUEksCisJCSJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZyBnZXQgRFNQIG1vZGVtIHNldHRpbmdzIGJNb2RlbUVuYWJsZWQgJXggdXNVYXJ0SVJRICV4IHVzVWFydEJhc2VJTyAleFxuIiwKKwkJcFNldHRpbmdzLT5iTW9kZW1FbmFibGVkLAorCQlwU2V0dGluZ3MtPnVzVWFydElSUSwKKwkJcFNldHRpbmdzLT51c1VhcnRCYXNlSU8pOworCisJLyogY2hlY2sgZm9yIGlsbGVnYWwgdmFsdWVzICovCisJaWYgKCBwU2V0dGluZ3MtPnVzVWFydEJhc2VJTyA9PSAwICkgCisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3F1ZXJ5X0RTUF9jZmc6IFdvcnJ5OiBVQVJUIGJhc2UgSS9PIGFkZHJlc3MgaXMgMFxuIik7CisJaWYgKCBwU2V0dGluZ3MtPnVzVWFydElSUSA9PSAwICkKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfcXVlcnlfRFNQX2NmZzogV29ycnk6IFVBUlQgSVJRIGxpbmUgaXMgMFxuIik7CisKKwlQUklOVEtfMihUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9xdWVyeV9EU1BfY2ZnIGV4aXQgYlJDICV4XG4iLCBiUkMpOworCisJcmV0dXJuIGJSQzsKK30KKworCitpbnQgc21hcGlfc2V0X0RTUF9jZmcodm9pZCkKK3sKKwlpbnQgYlJDID0gLUVJTzsKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCB1c0FYLCB1c0JYLCB1c0NYLCB1c0RYLCB1c0RJLCB1c1NJOworCXVuc2lnbmVkIHNob3J0IGF1c0RzcEJhc2VzW10gPSB7IDB4MDAzMCwgMHg0RTMwLCAweDhFMzAsIDB4Q0UzMCwgMHgwMTMwLCAweDAzNTAsIDB4MDA3MCwgMHgwREIwIH07CisJdW5zaWduZWQgc2hvcnQgYXVzVWFydEJhc2VzW10gPSB7IDB4MDNGOCwgMHgwMkY4LCAweDAzRTgsIDB4MDJFOCB9OworCXVuc2lnbmVkIHNob3J0IGF1c0RzcElycXNbXSA9IHsgNSwgNywgMTAsIDExLCAxNSB9OworCXVuc2lnbmVkIHNob3J0IGF1c1VhcnRJcnFzW10gPSB7IDMsIDQgfTsKKworCXVuc2lnbmVkIHNob3J0IG51bURzcEJhc2VzID0gODsKKwl1bnNpZ25lZCBzaG9ydCBudW1VYXJ0QmFzZXMgPSA0OworCXVuc2lnbmVkIHNob3J0IG51bURzcElycXMgPSA1OworCXVuc2lnbmVkIHNob3J0IG51bVVhcnRJcnFzID0gMjsKKwl1bnNpZ25lZCBzaG9ydCBkc3Bpb19pbmRleCA9IDAsIHVhcnRpb19pbmRleCA9IDA7CisKKwlQUklOVEtfNShUUkFDRV9TTUFQSSwKKwkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZyBlbnRyeSBtd2F2ZV8zNzgwaV9pcnEgJXggbXdhdmVfMzc4MGlfaW8gJXggbXdhdmVfdWFydF9pcnEgJXggbXdhdmVfdWFydF9pbyAleFxuIiwKKwkJbXdhdmVfMzc4MGlfaXJxLCBtd2F2ZV8zNzgwaV9pbywgbXdhdmVfdWFydF9pcnEsIG13YXZlX3VhcnRfaW8pOworCisJaWYgKG13YXZlXzM3ODBpX2lvKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1Ec3BCYXNlczsgaSsrKSB7CisJCQlpZiAobXdhdmVfMzc4MGlfaW8gPT0gYXVzRHNwQmFzZXNbaV0pCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gbnVtRHNwQmFzZXMpIHsKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBFcnJvcjogSW52YWxpZCBtd2F2ZV8zNzgwaV9pbyBhZGRyZXNzICV4LiBBYm9ydGluZy5cbiIsIG13YXZlXzM3ODBpX2lvKTsKKwkJCXJldHVybiBiUkM7CisJCX0KKwkJZHNwaW9faW5kZXggPSBpOworCX0KKworCWlmIChtd2F2ZV8zNzgwaV9pcnEpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bURzcElycXM7IGkrKykgeworCQkJaWYgKG13YXZlXzM3ODBpX2lycSA9PSBhdXNEc3BJcnFzW2ldKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IG51bURzcElycXMpIHsKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBFcnJvcjogSW52YWxpZCBtd2F2ZV8zNzgwaV9pcnEgJXguIEFib3J0aW5nLlxuIiwgbXdhdmVfMzc4MGlfaXJxKTsKKwkJCXJldHVybiBiUkM7CisJCX0KKwl9CisKKwlpZiAobXdhdmVfdWFydF9pbykgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtVWFydEJhc2VzOyBpKyspIHsKKwkJCWlmIChtd2F2ZV91YXJ0X2lvID09IGF1c1VhcnRCYXNlc1tpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBudW1VYXJ0QmFzZXMpIHsKKwkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBFcnJvcjogSW52YWxpZCBtd2F2ZV91YXJ0X2lvIGFkZHJlc3MgJXguIEFib3J0aW5nLlxuIiwgbXdhdmVfdWFydF9pbyk7CisJCQlyZXR1cm4gYlJDOworCQl9CisJCXVhcnRpb19pbmRleCA9IGk7CisJfQorCisKKwlpZiAobXdhdmVfdWFydF9pcnEpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bVVhcnRJcnFzOyBpKyspIHsKKwkJCWlmIChtd2F2ZV91YXJ0X2lycSA9PSBhdXNVYXJ0SXJxc1tpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBudW1VYXJ0SXJxcykgeworCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IEVycm9yOiBJbnZhbGlkIG13YXZlX3VhcnRfaXJxICV4LiBBYm9ydGluZy5cbiIsIG13YXZlX3VhcnRfaXJxKTsKKwkJCXJldHVybiBiUkM7CisJCX0KKwl9CisKKwlpZiAobXdhdmVfdWFydF9pcnEgfHwgbXdhdmVfdWFydF9pbykgeworCisJCS8qIENoZWNrIHNlcmlhbCBwb3J0IEEgKi8KKwkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE0MDIsIDB4MDAwMCwgMCwgMCwKKwkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJLyogYlJDID09IDAgKi8KKwkJaWYgKHVzQlggJiAweDAxMDApIHsJLyogc2VyaWFsIHBvcnQgQSBpcyBwcmVzZW50ICovCisJCQlpZiAodXNDWCAmIDEpIHsJLyogc2VyaWFsIHBvcnQgaXMgZW5hYmxlZCAqLworCQkJCWlmICgodXNTSSAmIDB4RkYpID09IG13YXZlX3VhcnRfaXJxKSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogU2VyaWFsIHBvcnQgQSBpcnEgJXggY29uZmxpY3RzIHdpdGggbXdhdmVfdWFydF9pcnEgJXhcbiIsIHVzU0kgJiAweEZGLCBtd2F2ZV91YXJ0X2lycSk7CisjZWxzZQorCQkJCQlQUklOVEtfMyhUUkFDRV9TTUFQSSwKKwkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IFNlcmlhbCBwb3J0IEEgaXJxICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlX3VhcnRfaXJxICV4XG4iLCB1c1NJICYgMHhGRiwgbXdhdmVfdWFydF9pcnEpOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJUFJJTlRLXzEoVFJBQ0VfU01BUEksCisJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIERpc2FibGluZyBjb25mbGljdGluZyBzZXJpYWwgcG9ydFxuIik7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDAzLCAweDAxMDAsIDAsIHVzU0ksCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDAyLCAweDAwMDAsIDAsIDAsCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCQlnb3RvIGV4aXRfY29uZmxpY3Q7CisjZW5kaWYKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKHVzU0kgPj4gOCkgPT0gdWFydGlvX2luZGV4KSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBTZXJpYWwgcG9ydCBBIGJhc2UgSS9PIGFkZHJlc3MgJXggY29uZmxpY3RzIHdpdGggbXdhdmUgdWFydCBJL08gJXhcbiIsIGF1c1VhcnRCYXNlc1t1c1NJID4+IDhdLCBhdXNVYXJ0QmFzZXNbdWFydGlvX2luZGV4XSk7CisjZWxzZQorCQkJCQkJUFJJTlRLXzMoVFJBQ0VfU01BUEksCisJCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogU2VyaWFsIHBvcnQgQSBiYXNlIEkvTyBhZGRyZXNzICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlIHVhcnQgSS9PICV4XG4iLCBhdXNVYXJ0QmFzZXNbdXNTSSA+PiA4XSwgYXVzVWFydEJhc2VzW3VhcnRpb19pbmRleF0pOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJCVBSSU5US18xKFRSQUNFX1NNQVBJLAorCQkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmcgRGlzYWJsaW5nIGNvbmZsaWN0aW5nIHNlcmlhbCBwb3J0IEFcbiIpOworCQkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCAoMHgxNDAzLCAweDAxMDAsIDAsIHVzU0ksCisJCQkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QgKDB4MTQwMiwgMHgwMDAwLCAwLCAwLAorCQkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCQkJZ290byBleGl0X2NvbmZsaWN0OworI2VuZGlmCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBDaGVjayBzZXJpYWwgcG9ydCBCICovCisJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDA0LCAweDAwMDAsIDAsIDAsCisJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCS8qIGJSQyA9PSAwICovCisJCWlmICh1c0JYICYgMHgwMTAwKSB7CS8qIHNlcmlhbCBwb3J0IEIgaXMgcHJlc2VudCAqLworCQkJaWYgKHVzQ1ggJiAxKSB7CS8qIHNlcmlhbCBwb3J0IGlzIGVuYWJsZWQgKi8KKwkJCQlpZiAoKHVzU0kgJiAweEZGKSA9PSBtd2F2ZV91YXJ0X2lycSkgeworI2lmbmRlZiBNV0FWRV9GVVRaX1dJVEhfT1RIRVJfREVWSUNFUworCQkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IFNlcmlhbCBwb3J0IEIgaXJxICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlX3VhcnRfaXJxICV4XG4iLCB1c1NJICYgMHhGRiwgbXdhdmVfdWFydF9pcnEpOworI2Vsc2UKKwkJCQkJUFJJTlRLXzMoVFJBQ0VfU01BUEksCisJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBTZXJpYWwgcG9ydCBCIGlycSAleCBjb25mbGljdHMgd2l0aCBtd2F2ZV91YXJ0X2lycSAleFxuIiwgdXNTSSAmIDB4RkYsIG13YXZlX3VhcnRfaXJxKTsKKyNlbmRpZgorI2lmZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCVBSSU5US18xKFRSQUNFX1NNQVBJLAorCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZyBEaXNhYmxpbmcgY29uZmxpY3Rpbmcgc2VyaWFsIHBvcnQgQlxuIik7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDA1LCAweDAxMDAsIDAsIHVzU0ksCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNDA0LCAweDAwMDAsIDAsIDAsCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCQlnb3RvIGV4aXRfY29uZmxpY3Q7CisjZW5kaWYKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKHVzU0kgPj4gOCkgPT0gdWFydGlvX2luZGV4KSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKKwkJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBTZXJpYWwgcG9ydCBCIGJhc2UgSS9PIGFkZHJlc3MgJXggY29uZmxpY3RzIHdpdGggbXdhdmUgdWFydCBJL08gJXhcbiIsIGF1c1VhcnRCYXNlc1t1c1NJID4+IDhdLCBhdXNVYXJ0QmFzZXNbdWFydGlvX2luZGV4XSk7CisjZWxzZQorCQkJCQkJUFJJTlRLXzMoVFJBQ0VfU01BUEksCisJCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogU2VyaWFsIHBvcnQgQiBiYXNlIEkvTyBhZGRyZXNzICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlIHVhcnQgSS9PICV4XG4iLCBhdXNVYXJ0QmFzZXNbdXNTSSA+PiA4XSwgYXVzVWFydEJhc2VzW3VhcnRpb19pbmRleF0pOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJCVBSSU5US18xIChUUkFDRV9TTUFQSSwKKwkJCQkJCSAgICAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIERpc2FibGluZyBjb25mbGljdGluZyBzZXJpYWwgcG9ydCBCXG4iKTsKKwkJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QgKDB4MTQwNSwgMHgwMTAwLCAwLCB1c1NJLAorCQkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCQliUkMgPSBzbWFwaV9yZXF1ZXN0ICgweDE0MDQsIDB4MDAwMCwgMCwgMCwKKwkJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworI2Vsc2UKKwkJCQkJCWdvdG8gZXhpdF9jb25mbGljdDsKKyNlbmRpZgorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgSVIgcG9ydCAqLworCQliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTcwMCwgMHgwMDAwLCAwLCAwLAorCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTcwNCwgMHgwMDAwLCAwLCAwLAorCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQkvKiBiUkMgPT0gMCAqLworCQlpZiAoKHVzQ1ggJiAweGZmKSAhPSAweGZmKSB7IC8qIElSIHBvcnQgbm90IGRpc2FibGVkICovCisJCQlpZiAoKHVzQ1ggJiAweGZmKSA9PSBtd2F2ZV91YXJ0X2lycSkgeworI2lmbmRlZiBNV0FWRV9GVVRaX1dJVEhfT1RIRVJfREVWSUNFUworCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnOiBJUiBwb3J0IGlycSAleCBjb25mbGljdHMgd2l0aCBtd2F2ZV91YXJ0X2lycSAleFxuIiwgdXNDWCAmIDB4ZmYsIG13YXZlX3VhcnRfaXJxKTsKKyNlbHNlCisJCQkJUFJJTlRLXzMoVFJBQ0VfU01BUEksCisJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IElSIHBvcnQgaXJxICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlX3VhcnRfaXJxICV4XG4iLCB1c0NYICYgMHhmZiwgbXdhdmVfdWFydF9pcnEpOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQlQUklOVEtfMShUUkFDRV9TTUFQSSwKKwkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZyBEaXNhYmxpbmcgY29uZmxpY3RpbmcgSVIgcG9ydFxuIik7CisJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDEsIDB4MDEwMCwgMCwgMCwKKwkJCQkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDAsIDAsIDAsIDAsCisJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzA1LCAweDAxZmYsIDAsIHVzU0ksCisJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzA0LCAweDAwMDAsIDAsIDAsCisJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworI2Vsc2UKKwkJCQlnb3RvIGV4aXRfY29uZmxpY3Q7CisjZW5kaWYKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCh1c1NJICYgMHhmZikgPT0gdWFydGlvX2luZGV4KSB7CisjaWZuZGVmIE1XQVZFX0ZVVFpfV0lUSF9PVEhFUl9ERVZJQ0VTCisJCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQorCQkJCQkJInNtYXBpOjpzbWFwaV9zZXRfRFNQX2NmZzogSVIgcG9ydCBiYXNlIEkvTyBhZGRyZXNzICV4IGNvbmZsaWN0cyB3aXRoIG13YXZlIHVhcnQgSS9PICV4XG4iLCBhdXNVYXJ0QmFzZXNbdXNTSSAmIDB4ZmZdLCBhdXNVYXJ0QmFzZXNbdWFydGlvX2luZGV4XSk7CisjZWxzZQorCQkJCQlQUklOVEtfMyhUUkFDRV9TTUFQSSwKKwkJCQkJCSJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmc6IElSIHBvcnQgYmFzZSBJL08gYWRkcmVzcyAleCBjb25mbGljdHMgd2l0aCBtd2F2ZSB1YXJ0IEkvTyAleFxuIiwgYXVzVWFydEJhc2VzW3VzU0kgJiAweGZmXSwgYXVzVWFydEJhc2VzW3VhcnRpb19pbmRleF0pOworI2VuZGlmCisjaWZkZWYgTVdBVkVfRlVUWl9XSVRIX09USEVSX0RFVklDRVMKKwkJCQkJUFJJTlRLXzEoVFJBQ0VfU01BUEksCisJCQkJCQkic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIERpc2FibGluZyBjb25mbGljdGluZyBJUiBwb3J0XG4iKTsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDEsIDB4MDEwMCwgMCwgMCwKKwkJCQkJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCQkJCQlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKwkJCQkJYlJDID0gc21hcGlfcmVxdWVzdCgweDE3MDAsIDAsIDAsIDAsCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzA1LCAweDAxZmYsIDAsIHVzU0ksCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisJCQkJCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxNzA0LCAweDAwMDAsIDAsIDAsCisJCQkJCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwkJCQkJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisjZWxzZQorCQkJCQlnb3RvIGV4aXRfY29uZmxpY3Q7CisjZW5kaWYKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTgwMiwgMHgwMDAwLCAwLCAwLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKworCWlmIChtd2F2ZV8zNzgwaV9pbykgeworCQl1c0RJID0gZHNwaW9faW5kZXg7CisJfQorCWlmIChtd2F2ZV8zNzgwaV9pcnEpIHsKKwkJdXNTSSA9ICh1c1NJICYgMHhmZjAwKSB8IG13YXZlXzM3ODBpX2lycTsKKwl9CisKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTgwMywgMHgwMTAxLCB1c0RJLCB1c1NJLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODA0LCAweDAwMDAsIDAsIDAsCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCisJaWYgKG13YXZlX3VhcnRfaW8pIHsKKwkJdXNTSSA9ICh1c1NJICYgMHgwMGZmKSB8ICh1YXJ0aW9faW5kZXggPDwgOCk7CisJfQorCWlmIChtd2F2ZV91YXJ0X2lycSkgeworCQl1c1NJID0gKHVzU0kgJiAweGZmMDApIHwgbXdhdmVfdWFydF9pcnE7CisJfQorCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHgxODA1LCAweDAxMDEsIDAsIHVzU0ksCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCWlmIChiUkMpIGdvdG8gZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOworCisJYlJDID0gc21hcGlfcmVxdWVzdCgweDE4MDIsIDB4MDAwMCwgMCwgMCwKKwkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisJaWYgKGJSQykgZ290byBleGl0X3NtYXBpX3JlcXVlc3RfZXJyb3I7CisKKwliUkMgPSBzbWFwaV9yZXF1ZXN0KDB4MTgwNCwgMHgwMDAwLCAwLCAwLAorCQkmdXNBWCwgJnVzQlgsICZ1c0NYLCAmdXNEWCwgJnVzREksICZ1c1NJKTsKKwlpZiAoYlJDKSBnb3RvIGV4aXRfc21hcGlfcmVxdWVzdF9lcnJvcjsKKworLyogbm9ybWFsIGV4aXQ6ICovCisJUFJJTlRLXzEoVFJBQ0VfU01BUEksICJzbWFwaTo6c21hcGlfc2V0X0RTUF9jZmcgZXhpdFxuIik7CisJcmV0dXJuIDA7CisKK2V4aXRfY29uZmxpY3Q6CisJLyogTWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIHByaW50ZWQgKi8KKwlyZXR1cm4gLUVJTzsKKworZXhpdF9zbWFwaV9yZXF1ZXN0X2Vycm9yOgorCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAic21hcGk6OnNtYXBpX3NldF9EU1BfY2ZnIGV4aXQgb24gc21hcGlfcmVxdWVzdCBlcnJvciBiUkMgJXhcbiIsIGJSQyk7CisJcmV0dXJuIGJSQzsKK30KKworCitpbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShCT09MRUFOIGJPbikKK3sKKwlpbnQgYlJDID0gLUVJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c0FYLCB1c0JYLCB1c0NYLCB1c0RYLCB1c0RJLCB1c1NJOworCXVuc2lnbmVkIHNob3J0IHVzUG93ZXJGdW5jdGlvbjsKKworCVBSSU5US18yKFRSQUNFX1NNQVBJLCAic21hcGk6OnNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUgZW50cnkgYk9uICV4XG4iLCBiT24pOworCisJdXNQb3dlckZ1bmN0aW9uID0gKGJPbikgPyAxIDogMDsKKworCWJSQyA9IHNtYXBpX3JlcXVlc3QoMHg0OTAxLCAweDAwMDAsIDAsIHVzUG93ZXJGdW5jdGlvbiwKKwkJJnVzQVgsICZ1c0JYLCAmdXNDWCwgJnVzRFgsICZ1c0RJLCAmdXNTSSk7CisKKwlQUklOVEtfMihUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlIGV4aXQgYlJDICV4XG4iLCBiUkMpOworCisJcmV0dXJuIGJSQzsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgU21hcGlRdWVyeVN5c3RlbUlEKHZvaWQpCit7CisJaW50IGJSQyA9IC1FSU87CisJdW5zaWduZWQgc2hvcnQgdXNBWCA9IDB4ZmZmZiwgdXNCWCA9IDB4ZmZmZiwgdXNDWCA9IDB4ZmZmZiwKKwkJdXNEWCA9IDB4ZmZmZiwgdXNESSA9IDB4ZmZmZiwgdXNTSSA9IDB4ZmZmZjsKKworCXByaW50aygic21hcGk6OlNtYXBpUVVlcnlTeXN0ZW1JRCBlbnRyeVxuIik7CisJYlJDID0gc21hcGlfcmVxdWVzdCgweDAwMDAsIDAsIDAsIDAsCisJCSZ1c0FYLCAmdXNCWCwgJnVzQ1gsICZ1c0RYLCAmdXNESSwgJnVzU0kpOworCisJaWYgKGJSQyA9PSAwKSB7CisJCXByaW50aygiQVg9JXgsIEJYPSV4LCBDWD0leCwgRFg9JXgsIERJPSV4LCBTST0leFxuIiwKKwkJCXVzQVgsIHVzQlgsIHVzQ1gsIHVzRFgsIHVzREksIHVzU0kpOworCX0gZWxzZSB7CisJCXByaW50aygic21hcGk6OlNtYXBpUXVlcnlTeXN0ZW1JRCBzbWFwaV9yZXF1ZXN0IGVycm9yXG4iKTsKKwl9CisKKwlyZXR1cm4gYlJDOworfQorI2VuZGlmICAvKiAgMCAgKi8KKworaW50IHNtYXBpX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsID0gLUVJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c1NtYXBpSUQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlQUklOVEtfMShUUkFDRV9TTUFQSSwgInNtYXBpOjpzbWFwaV9pbml0IGVudHJ5XG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCXVzU21hcGlJRCA9IENNT1NfUkVBRCgweDdDKTsKKwl1c1NtYXBpSUQgfD0gKENNT1NfUkVBRCgweDdEKSA8PCA4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCVBSSU5US18yKFRSQUNFX1NNQVBJLCAic21hcGk6OnNtYXBpX2luaXQgdXNTbWFwaUlEICV4XG4iLCB1c1NtYXBpSUQpOworCisJaWYgKHVzU21hcGlJRCA9PSAweDUzNDkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJCWdfdXNTbWFwaVBvcnQgPSBDTU9TX1JFQUQoMHg3RSk7CisJCWdfdXNTbWFwaVBvcnQgfD0gKENNT1NfUkVBRCgweDdGKSA8PCA4KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGdfdXNTbWFwaVBvcnQgPT0gMCkgeworCQkJUFJJTlRLX0VSUk9SKCJzbWFwaTo6c21hcGlfaW5pdCwgRVJST1IgdW5hYmxlIHRvIHJlYWQgZnJvbSBTTUFQSSBwb3J0XG4iKTsKKwkJfSBlbHNlIHsKKwkJCVBSSU5US18yKFRSQUNFX1NNQVBJLAorCQkJCSJzbWFwaTo6c21hcGlfaW5pdCwgZXhpdCBUUlVFIGdfdXNTbWFwaVBvcnQgJXhcbiIsCisJCQkJZ191c1NtYXBpUG9ydCk7CisJCQlyZXR2YWwgPSAwOworCQkJLy9TbWFwaVF1ZXJ5U3lzdGVtSUQoKTsKKwkJfQorCX0gZWxzZSB7CisJCVBSSU5US19FUlJPUigic21hcGk6OnNtYXBpX2luaXQsIEVSUk9SIGludmFsaWQgdXNTbWFwaUlEXG4iKTsKKwkJcmV0dmFsID0gLUVOWElPOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuaCBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YjJlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuaApAQCAtMCwwICsxLDgwIEBACisvKgorKgorKiBzbWFwaS5oIC0tIGRlY2xhcmF0aW9ucyBmb3IgU01BUEkgaW50ZXJmYWNlIHJvdXRpbmVzCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpZm5kZWYgX0xJTlVYX1NNQVBJX0gKKyNkZWZpbmUgX0xJTlVYX1NNQVBJX0gKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBCT09MRUFOIGludAorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGJEU1BQcmVzZW50OworCWludCBiRFNQRW5hYmxlZDsKKwlpbnQgYk1vZGVtRW5hYmxlZDsKKwlpbnQgYk1JRElFbmFibGVkOworCWludCBiU2Jsc3RFbmFibGVkOworCXVuc2lnbmVkIHNob3J0IHVzRHNwSVJROworCXVuc2lnbmVkIHNob3J0IHVzRHNwRE1BOworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPOworCXVuc2lnbmVkIHNob3J0IHVzVWFydElSUTsKKwl1bnNpZ25lZCBzaG9ydCB1c1VhcnRCYXNlSU87CisJdW5zaWduZWQgc2hvcnQgdXNNaWRpSVJROworCXVuc2lnbmVkIHNob3J0IHVzTWlkaUJhc2VJTzsKKwl1bnNpZ25lZCBzaG9ydCB1c1NuZGJsc3RJUlE7CisJdW5zaWduZWQgc2hvcnQgdXNTbmRibHN0RE1BOworCXVuc2lnbmVkIHNob3J0IHVzU25kYmxzdEJhc2VJTzsKK30gU01BUElfRFNQX1NFVFRJTkdTOworCitpbnQgc21hcGlfaW5pdCh2b2lkKTsKK2ludCBzbWFwaV9xdWVyeV9EU1BfY2ZnKFNNQVBJX0RTUF9TRVRUSU5HUyAqIHBTZXR0aW5ncyk7CitpbnQgc21hcGlfc2V0X0RTUF9jZmcodm9pZCk7CitpbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShCT09MRUFOIGJPbik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jIGIvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY1MGNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYwpAQCAtMCwwICsxLDU5MiBAQAorLyoKKyoKKyogdHAzNzgwaS5jIC0tIGJvYXJkIGRyaXZlciBmb3IgMzc4MGkgb24gVGhpbmtQYWRzCisqCisqCisqIFdyaXR0ZW4gQnk6IE1pa2UgU3VsbGl2YW4gSUJNIENvcnBvcmF0aW9uCisqCisqIENvcHlyaWdodCAoQykgMTk5OSBJQk0gQ29ycG9yYXRpb24KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogTk8gV0FSUkFOVFkKKyogVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisqIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyogc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyogZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisqIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisqIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorKgorKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyogREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyogVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisqIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKgorKgorKiAxMC8yMy8yMDAwIC0gQWxwaGEgUmVsZWFzZQorKglGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAic21hcGkuaCIKKyNpbmNsdWRlICJtd2F2ZWRkLmgiCisjaW5jbHVkZSAidHAzNzgwaS5oIgorI2luY2x1ZGUgIjM3ODBpLmgiCisjaW5jbHVkZSAibXdhdmVwdWIuaCIKKworZXh0ZXJuIE1XQVZFX0RFVklDRV9EQVRBIG13YXZlX3NfbWRkOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc19hdXNUaGlua3BhZElycVRvRmllbGRbMTZdID0KKwl7IDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4RkZGRiwgMHgwMDA0LAorCTB4RkZGRiwgMHhGRkZGLCAweDAwMDUsIDB4MDAwNiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDA3IH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc19hdXNUaGlua3BhZERtYVRvRmllbGRbOF0gPQorCXsgMHgwMDAxLCAweDAwMDIsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAzLCAweDAwMDQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzX251bUlycXMgPSAxNiwgc19udW1EbWFzID0gODsKKworCitzdGF0aWMgdm9pZCBFbmFibGVTUkFNKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOworCURTUF9HUElPX09VVFBVVF9EQVRBXzE1XzggckdwaW9PdXRwdXREYXRhOworCURTUF9HUElPX0RSSVZFUl9FTkFCTEVfMTVfOCByR3Bpb0RyaXZlckVuYWJsZTsKKwlEU1BfR1BJT19NT0RFXzE1XzggckdwaW9Nb2RlOworCisJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OkVuYWJsZVNSQU0sIGVudHJ5XG4iKTsKKworCU1LV09SRChyR3Bpb01vZGUpID0gUmVhZE1zYUNmZyhEU1BfR3Bpb01vZGVDb250cm9sXzE1XzgpOworCXJHcGlvTW9kZS5HcGlvTW9kZTEwID0gMDsKKwlXcml0ZU1zYUNmZyhEU1BfR3Bpb01vZGVDb250cm9sXzE1XzgsIE1LV09SRChyR3Bpb01vZGUpKTsKKworCU1LV09SRChyR3Bpb0RyaXZlckVuYWJsZSkgPSAwOworCXJHcGlvRHJpdmVyRW5hYmxlLkVuYWJsZTEwID0gVFJVRTsKKwlyR3Bpb0RyaXZlckVuYWJsZS5NYXNrMTAgPSBUUlVFOworCVdyaXRlTXNhQ2ZnKERTUF9HcGlvRHJpdmVyRW5hYmxlXzE1XzgsIE1LV09SRChyR3Bpb0RyaXZlckVuYWJsZSkpOworCisJTUtXT1JEKHJHcGlvT3V0cHV0RGF0YSkgPSAwOworCXJHcGlvT3V0cHV0RGF0YS5MYXRjaDEwID0gMDsKKwlyR3Bpb091dHB1dERhdGEuTWFzazEwID0gVFJVRTsKKwlXcml0ZU1zYUNmZyhEU1BfR3Bpb091dHB1dERhdGFfMTVfOCwgTUtXT1JEKHJHcGlvT3V0cHV0RGF0YSkpOworCisJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OkVuYWJsZVNSQU0gZXhpdFxuIik7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IFVhcnRJbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlQUklOVEtfMyhUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6VWFydEludGVycnVwdCBlbnRyeSBpcnEgJXggZGV2X2lkICVwXG4iLCBpcnEsIGRldl9pZCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgRHNwSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcE1XQVZFX0RFVklDRV9EQVRBIHBEcnZEYXRhID0gJm13YXZlX3NfbWRkOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwRHJ2RGF0YS0+ckJERGF0YS5yRHNwU2V0dGluZ3M7CisJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOworCXVuc2lnbmVkIHNob3J0IHVzSVBDU291cmNlID0gMCwgdXNJc29sYXRpb25NYXNrLCB1c1BDTnVtOworCisJUFJJTlRLXzMoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OkRzcEludGVycnVwdCBlbnRyeSBpcnEgJXggZGV2X2lkICVwXG4iLCBpcnEsIGRldl9pZCk7CisKKwlpZiAoZHNwMzc4MElfR2V0SVBDU291cmNlKHVzRHNwQmFzZUlPLCAmdXNJUENTb3VyY2UpID09IDApIHsKKwkJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQsIHJldHVybiBmcm9tIGRzcDM3ODBpX0dldElQQ1NvdXJjZSwgdXNJUENTb3VyY2UgJXhcbiIsCisJCQl1c0lQQ1NvdXJjZSk7CisJCXVzSXNvbGF0aW9uTWFzayA9IDE7CisJCWZvciAodXNQQ051bSA9IDE7IHVzUENOdW0gPD0gMTY7IHVzUENOdW0rKykgeworCQkJaWYgKHVzSVBDU291cmNlICYgdXNJc29sYXRpb25NYXNrKSB7CisJCQkJdXNJUENTb3VyY2UgJj0gfnVzSXNvbGF0aW9uTWFzazsKKwkJCQlQUklOVEtfMyhUUkFDRV9UUDM3ODBJLAorCQkJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0IHVzUENOdW0gJXggdXNJUENTb3VyY2UgJXhcbiIsCisJCQkJCXVzUENOdW0sIHVzSVBDU291cmNlKTsKKwkJCQlpZiAocERydkRhdGEtPklQQ3NbdXNQQ051bSAtIDFdLnVzSW50Q291bnQgPT0gMCkgeworCQkJCQlwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0udXNJbnRDb3VudCA9IDE7CisJCQkJfQorCQkJCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCQkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQgdXNJbnRDb3VudCAleFxuIiwKKwkJCQkJcERydkRhdGEtPklQQ3NbdXNQQ051bSAtIDFdLnVzSW50Q291bnQpOworCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0uYklzRW5hYmxlZCA9PSBUUlVFKSB7CisJCQkJCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCQkJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0LCB3YWtpbmcgdXAgdXNQQ051bSAleFxuIiwKKwkJCQkJCXVzUENOdW0gLSAxKTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0uaXBjX3dhaXRfcXVldWUpOworCQkJCX0gZWxzZSB7CisJCQkJCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCQkJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0LCBubyBvbmUgd2FpdGluZyBmb3IgSVBDICV4XG4iLAorCQkJCQkJdXNQQ051bSAtIDEpOworCQkJCX0KKwkJCX0KKwkJCWlmICh1c0lQQ1NvdXJjZSA9PSAwKQorCQkJCWJyZWFrOworCQkJLyogdHJ5IG5leHQgSVBDICovCisJCQl1c0lzb2xhdGlvbk1hc2sgPSB1c0lzb2xhdGlvbk1hc2sgPDwgMTsKKwkJfQorCX0gZWxzZSB7CisJCVBSSU5US18xKFRSQUNFX1RQMzc4MEksCisJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0LCByZXR1cm4gZmFsc2UgZnJvbSBkc3AzNzgwaV9HZXRJUENTb3VyY2VcbiIpOworCX0KKwlQUklOVEtfMShUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6RHNwSW50ZXJydXB0IGV4aXRcbiIpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitpbnQgdHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCWludCByZXR2YWwgPSAwOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0luaXRpYWxpemVCb2FyZERhdGEgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlwQkREYXRhLT5iRFNQRW5hYmxlZCA9IEZBTFNFOworCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKworCXJldHZhbCA9IHNtYXBpX2luaXQoKTsKKwlpZiAocmV0dmFsKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhOiBFcnJvcjogU01BUEkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIG1hY2hpbmVcbiIpOworCX0gZWxzZSB7CisJCWlmIChtd2F2ZV8zNzgwaV9pcnEgfHwgbXdhdmVfMzc4MGlfaW8gfHwgbXdhdmVfdWFydF9pcnEgfHwgbXdhdmVfdWFydF9pbykgeworCQkJcmV0dmFsID0gc21hcGlfc2V0X0RTUF9jZmcoKTsKKwkJfQorCX0KKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0luaXRpYWxpemVCb2FyZERhdGEgZXhpdCByZXR2YWwgJXhcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgdHAzNzgwSV9DbGVhbnVwKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCWludCByZXR2YWwgPSAwOworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfQ2xlYW51cCBlbnRyeSBhbmQgZXhpdCBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB0cDM3ODBJX0NhbGNSZXNvdXJjZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJU01BUElfRFNQX1NFVFRJTkdTIHJTbWFwaUluZm87CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjp0cDM3ODBJX0NhbGNSZXNvdXJjZXMgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlpZiAoc21hcGlfcXVlcnlfRFNQX2NmZygmclNtYXBpSW5mbykpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0NhbGNSZXNvdXJjZXM6IEVycm9yOiBDb3VsZCBub3QgcXVlcnkgRFNQIGNvbmZpZy4gQWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKAorCQkoIHJTbWFwaUluZm8udXNEc3BJUlEgPT0gMCApCisJCXx8ICggclNtYXBpSW5mby51c0RzcEJhc2VJTyA9PSAgMCApCisJCXx8ICggclNtYXBpSW5mby51c1VhcnRJUlEgPT0gIDAgKQorCQl8fCAoIHJTbWFwaUluZm8udXNVYXJ0QmFzZUlPID09ICAwICkKKwkpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0NhbGNSZXNvdXJjZXM6IEVycm9yOiBJbGxlZ2FsIHJlc291cmNlIHNldHRpbmcuIEFib3J0aW5nLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXBTZXR0aW5ncy0+YkRTUEVuYWJsZWQgPSAoclNtYXBpSW5mby5iRFNQRW5hYmxlZCAmJiByU21hcGlJbmZvLmJEU1BQcmVzZW50KTsKKwlwU2V0dGluZ3MtPmJNb2RlbUVuYWJsZWQgPSByU21hcGlJbmZvLmJNb2RlbUVuYWJsZWQ7CisJcFNldHRpbmdzLT51c0RzcElycSA9IHJTbWFwaUluZm8udXNEc3BJUlE7CisJcFNldHRpbmdzLT51c0RzcERtYSA9IHJTbWFwaUluZm8udXNEc3BETUE7CisJcFNldHRpbmdzLT51c0RzcEJhc2VJTyA9IHJTbWFwaUluZm8udXNEc3BCYXNlSU87CisJcFNldHRpbmdzLT51c1VhcnRJcnEgPSByU21hcGlJbmZvLnVzVWFydElSUTsKKwlwU2V0dGluZ3MtPnVzVWFydEJhc2VJTyA9IHJTbWFwaUluZm8udXNVYXJ0QmFzZUlPOworCisJcFNldHRpbmdzLT51RFN0b3JlU2l6ZSA9IFRQX0FCSUxJVElFU19EQVRBX1NJWkU7CisJcFNldHRpbmdzLT51SVN0b3JlU2l6ZSA9IFRQX0FCSUxJVElFU19JTlNUX1NJWkU7CisJcFNldHRpbmdzLT51SXBzID0gVFBfQUJJTElUSUVTX0lOVFNfUEVSX1NFQzsKKworCWlmIChwU2V0dGluZ3MtPmJEU1BFbmFibGVkICYmIHBTZXR0aW5ncy0+Yk1vZGVtRW5hYmxlZCAmJiBwU2V0dGluZ3MtPnVzRHNwSXJxID09IHBTZXR0aW5ncy0+dXNVYXJ0SXJxKSB7CisJCXBCRERhdGEtPmJTaGFyZURzcElycSA9IHBCRERhdGEtPmJTaGFyZVVhcnRJcnEgPSAxOworCX0gZWxzZSB7CisJCXBCRERhdGEtPmJTaGFyZURzcElycSA9IHBCRERhdGEtPmJTaGFyZVVhcnRJcnEgPSAwOworCX0KKworCVBSSU5US18xKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0NhbGNSZXNvdXJjZXMgZXhpdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgdHAzNzgwSV9DbGFpbVJlc291cmNlcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkKKwlzdHJ1Y3QgcmVzb3VyY2UgKnByZXM7CisjZW5kaWYKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjp0cDM3ODBJX0NsYWltUmVzb3VyY2VzIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKQorCXByZXMgPSByZXF1ZXN0X3JlZ2lvbihwU2V0dGluZ3MtPnVzRHNwQmFzZUlPLCAxNiwgIm13YXZlXzM3ODBpIik7CisJaWYgKCBwcmVzID09IE5VTEwgKSByZXR2YWwgPSAtRUlPOworI2Vsc2UKKwlyZXR2YWwgPSBjaGVja19yZWdpb24ocFNldHRpbmdzLT51c0RzcEJhc2VJTywgMTYpOworCWlmICghcmV0dmFsKSByZXF1ZXN0X3JlZ2lvbihwU2V0dGluZ3MtPnVzRHNwQmFzZUlPLCAxNiwgIm13YXZlXzM3ODBpIik7CisjZW5kaWYKKwlpZiAocmV0dmFsKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9DbGFpbVJlc291cmNlczogRXJyb3I6IENvdWxkIG5vdCBjbGFpbSBJL08gcmVnaW9uIHN0YXJ0aW5nIGF0ICV4XG4iLCBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPKTsKKwkJcmV0dmFsID0gLUVJTzsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9DbGFpbVJlc291cmNlcyBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB0cDM3ODBJX1JlbGVhc2VSZXNvdXJjZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCisJCSJ0cDM3ODBpOjp0cDM3ODBJX1JlbGVhc2VSZXNvdXJjZXMgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlyZWxlYXNlX3JlZ2lvbihwU2V0dGluZ3MtPnVzRHNwQmFzZUlPICYgKH4zKSwgMTYpOworCisJaWYgKHBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQpIHsKKwkJZnJlZV9pcnEocFNldHRpbmdzLT51c0RzcElycSwgTlVMTCk7CisJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9SZWxlYXNlUmVzb3VyY2VzIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCisKK2ludCB0cDM3ODBJX0VuYWJsZURTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKK3sKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCUJPT0xFQU4gYkRTUFBvd2VyZWRVcCA9IEZBTFNFLCBiRFNQRW5hYmxlZCA9IEZBTFNFLCBiSW50ZXJydXB0QWxsb2NhdGVkID0gRkFMU0U7CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1AgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CisKKwlpZiAocEJERGF0YS0+YkRTUEVuYWJsZWQpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IERTUCBhbHJlYWR5IGVuYWJsZWQhXG4iKTsKKwkJZ290byBleGl0X2NsZWFudXA7CisJfQorCisJaWYgKCFwU2V0dGluZ3MtPmJEU1BFbmFibGVkKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IHBTZXR0aW5ncy0+YkRTUEVuYWJsZWQgbm90IHNldFxuIik7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0KKworCWlmICgKKwkJKHBTZXR0aW5ncy0+dXNEc3BJcnEgPj0gc19udW1JcnFzKQorCQl8fCAocFNldHRpbmdzLT51c0RzcERtYSA+PSBzX251bURtYXMpCisJCXx8IChzX2F1c1RoaW5rcGFkSXJxVG9GaWVsZFtwU2V0dGluZ3MtPnVzRHNwSXJxXSA9PSAweEZGRkYpCisJCXx8IChzX2F1c1RoaW5rcGFkRG1hVG9GaWVsZFtwU2V0dGluZ3MtPnVzRHNwRG1hXSA9PSAweEZGRkYpCisJKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBpbnZhbGlkIGlycSAleFxuIiwgcFNldHRpbmdzLT51c0RzcElycSk7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0KKworCWlmICgKKwkJKChwU2V0dGluZ3MtPnVzRHNwQmFzZUlPICYgMHhGMDBGKSAhPSAwKQorCQl8fCAocFNldHRpbmdzLT51c0RzcEJhc2VJTyAmIDB4MEZGMCkgPT0gMAorCSkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogSW52YWxpZCBEU1AgYmFzZSBJL08gYWRkcmVzcyAleFxuIiwgcFNldHRpbmdzLT51c0RzcEJhc2VJTyk7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0KKworCWlmIChwU2V0dGluZ3MtPmJNb2RlbUVuYWJsZWQpIHsKKwkJaWYgKAorCQkJcFNldHRpbmdzLT51c1VhcnRJcnEgPj0gc19udW1JcnFzCisJCQl8fCBzX2F1c1RoaW5rcGFkSXJxVG9GaWVsZFtwU2V0dGluZ3MtPnVzVWFydElycV0gPT0gMHhGRkZGCisJCSkgeworCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IEludmFsaWQgVUFSVCBJUlEgJXhcbiIsIHBTZXR0aW5ncy0+dXNVYXJ0SXJxKTsKKwkJCWdvdG8gZXhpdF9jbGVhbnVwOworCQl9CisJCXN3aXRjaCAocFNldHRpbmdzLT51c1VhcnRCYXNlSU8pIHsKKwkJCWNhc2UgMHgwM0Y4OgorCQkJY2FzZSAweDAyRjg6CisJCQljYXNlIDB4MDNFODoKKwkJCWNhc2UgMHgwMkU4OgorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCVBSSU5US19FUlJPUigidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBJbnZhbGlkIFVBUlQgYmFzZSBJL08gYWRkcmVzcyAleFxuIiwgcFNldHRpbmdzLT51c1VhcnRCYXNlSU8pOworCQkJCWdvdG8gZXhpdF9jbGVhbnVwOworCQl9CisJfQorCisJcFNldHRpbmdzLT5iRHNwSXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iRHNwSXJxUHVsc2UgPSBUUlVFOworCXBTZXR0aW5ncy0+YlVhcnRJcnFBY3RpdmVMb3cgPSBwU2V0dGluZ3MtPmJVYXJ0SXJxUHVsc2UgPSBUUlVFOworCisJaWYgKHBCRERhdGEtPmJTaGFyZURzcElycSkgeworCQlwU2V0dGluZ3MtPmJEc3BJcnFBY3RpdmVMb3cgPSBGQUxTRTsKKwl9CisJaWYgKHBCRERhdGEtPmJTaGFyZVVhcnRJcnEpIHsKKwkJcFNldHRpbmdzLT5iVWFydElycUFjdGl2ZUxvdyA9IEZBTFNFOworCX0KKworCXBTZXR0aW5ncy0+dXNOdW1UcmFuc2ZlcnMgPSBUUF9DRkdfTnVtVHJhbnNmZXJzOworCXBTZXR0aW5ncy0+dXNSZVJlcXVlc3QgPSBUUF9DRkdfUmVyZXF1ZXN0VGltZXI7CisJcFNldHRpbmdzLT5iRW5hYmxlTUVNQ1MxNiA9IFRQX0NGR19NRU1DUzE2OworCXBTZXR0aW5ncy0+dXNJc2FNZW1DbWRXaWR0aCA9IFRQX0NGR19Jc2FNZW1DbWRXaWR0aDsKKwlwU2V0dGluZ3MtPmJHYXRlSU9DSFJEWSA9IFRQX0NGR19HYXRlSU9DSFJEWTsKKwlwU2V0dGluZ3MtPmJFbmFibGVQd3JNZ210ID0gVFBfQ0ZHX0VuYWJsZVB3ck1nbXQ7CisJcFNldHRpbmdzLT51c0hCdXNUaW1lckxvYWRWYWx1ZSA9IFRQX0NGR19IQnVzVGltZXJWYWx1ZTsKKwlwU2V0dGluZ3MtPmJEaXNhYmxlTEJ1c1RpbWVvdXQgPSBUUF9DRkdfRGlzYWJsZUxCdXNUaW1lb3V0OworCXBTZXR0aW5ncy0+dXNOX0Rpdmlzb3IgPSBUUF9DRkdfTl9EaXZpc29yOworCXBTZXR0aW5ncy0+dXNNX011bHRpcGxpZXIgPSBUUF9DRkdfTV9NdWx0aXBsaWVyOworCXBTZXR0aW5ncy0+YlBsbEJ5cGFzcyA9IFRQX0NGR19QbGxCeXBhc3M7CisJcFNldHRpbmdzLT51c0NoaXBsZXRFbmFibGUgPSBUUF9DRkdfQ2hpcGxldEVuYWJsZTsKKworCWlmIChyZXF1ZXN0X2lycShwU2V0dGluZ3MtPnVzVWFydElycSwgJlVhcnRJbnRlcnJ1cHQsIDAsICJtd2F2ZV91YXJ0IiwgTlVMTCkpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IENvdWxkIG5vdCBnZXQgVUFSVCBJUlEgJXhcbiIsIHBTZXR0aW5ncy0+dXNVYXJ0SXJxKTsKKwkJZ290byBleGl0X2NsZWFudXA7CisJfSBlbHNlIHsJCS8qIG5vIGNvbmZsaWN0IGp1c3QgcmVsZWFzZSAqLworCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzVWFydElycSwgTlVMTCk7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKHBTZXR0aW5ncy0+dXNEc3BJcnEsICZEc3BJbnRlcnJ1cHQsIDAsICJtd2F2ZV8zNzgwaSIsIE5VTEwpKSB7CisJCVBSSU5US19FUlJPUigidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBDb3VsZCBub3QgZ2V0IDM3ODBpIElSUSAleFxuIiwgcFNldHRpbmdzLT51c0RzcElycSk7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0gZWxzZSB7CisJCVBSSU5US18zKFRSQUNFX1RQMzc4MEksCisJCQkidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1AsIGdvdCBpbnRlcnJ1cHQgJXggYlNoYXJlRHNwSXJxICV4XG4iLAorCQkJcFNldHRpbmdzLT51c0RzcElycSwgcEJERGF0YS0+YlNoYXJlRHNwSXJxKTsKKwkJYkludGVycnVwdEFsbG9jYXRlZCA9IFRSVUU7CisJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBUUlVFOworCX0KKworCXNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoRkFMU0UpOworCWlmIChzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKFRSVUUpKSB7CisJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKFRSVUUpIGZhaWxlZFxuIik7CisJCWdvdG8gZXhpdF9jbGVhbnVwOworCX0gZWxzZSB7CisJCWJEU1BQb3dlcmVkVXAgPSBUUlVFOworCX0KKworCWlmIChkc3AzNzgwSV9FbmFibGVEU1AocFNldHRpbmdzLCBzX2F1c1RoaW5rcGFkSXJxVG9GaWVsZCwgc19hdXNUaGlua3BhZERtYVRvRmllbGQpKSB7CisJCVBSSU5US19FUlJPUigidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBkc3A3ODgwSV9FbmFibGVEU1AoKSBmYWlsZWRcbiIpOworCQlnb3RvIGV4aXRfY2xlYW51cDsKKwl9IGVsc2UgeworCQliRFNQRW5hYmxlZCA9IFRSVUU7CisJfQorCisJRW5hYmxlU1JBTShwQkREYXRhKTsKKworCXBCRERhdGEtPmJEU1BFbmFibGVkID0gVFJVRTsKKworCVBSSU5US18xKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUCBleGl0XG4iKTsKKworCXJldHVybiAwOworCitleGl0X2NsZWFudXA6CisJUFJJTlRLX0VSUk9SKCJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogQ2xlYW5pbmcgdXBcbiIpOworCWlmIChiRFNQRW5hYmxlZCkKKwkJZHNwMzc4MElfRGlzYWJsZURTUChwU2V0dGluZ3MpOworCWlmIChiRFNQUG93ZXJlZFVwKQorCQlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEZBTFNFKTsKKwlpZiAoYkludGVycnVwdEFsbG9jYXRlZCkgeworCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzRHNwSXJxLCBOVUxMKTsKKwkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IEZBTFNFOworCX0KKwlyZXR1cm4gLUVJTzsKK30KKworCitpbnQgdHAzNzgwSV9EaXNhYmxlRFNQKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQoreworCWludCByZXR2YWwgPSAwOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9EaXNhYmxlRFNQIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOworCisJaWYgKHBCRERhdGEtPmJEU1BFbmFibGVkKSB7CisJCWRzcDM3ODBJX0Rpc2FibGVEU1AoJnBCRERhdGEtPnJEc3BTZXR0aW5ncyk7CisJCWlmIChwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkKSB7CisJCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzRHNwSXJxLCBOVUxMKTsKKwkJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKwkJfQorCQlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEZBTFNFKTsKKwkJcEJERGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9EaXNhYmxlRFNQIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQgdHAzNzgwSV9SZXNldERTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfUmVzZXREU1AgZW50cnkgcEJERGF0YSAlcFxuIiwKKwkJcEJERGF0YSk7CisKKwlpZiAoZHNwMzc4MElfUmVzZXQocFNldHRpbmdzKSA9PSAwKSB7CisJCUVuYWJsZVNSQU0ocEJERGF0YSk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gLUVJTzsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9SZXNldERTUCBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworaW50IHRwMzc4MElfU3RhcnREU1AoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX1N0YXJ0RFNQIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOworCisJaWYgKGRzcDM3ODBJX1J1bihwU2V0dGluZ3MpID09IDApIHsKKwkJLy8gQEJVRyBAVEJEIEVuYWJsZVNSQU0ocEJERGF0YSk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gLUVJTzsKKwl9CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9TdGFydERTUCBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworaW50IHRwMzc4MElfUXVlcnlBYmlsaXRpZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEsIE1XX0FCSUxJVElFUyAqIHBBYmlsaXRpZXMpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlQUklOVEtfMihUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9RdWVyeUFiaWxpdGllcyBlbnRyeSBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKKworCS8qIGZpbGwgb3V0IHN0YW5kYXJkIGNvbnN0YW50IGZpZWxkcyAqLworCXBBYmlsaXRpZXMtPmluc3RyX3Blcl9zZWMgPSBwQkREYXRhLT5yRHNwU2V0dGluZ3MudUlwczsKKwlwQWJpbGl0aWVzLT5kYXRhX3NpemUgPSBwQkREYXRhLT5yRHNwU2V0dGluZ3MudURTdG9yZVNpemU7CisJcEFiaWxpdGllcy0+aW5zdF9zaXplID0gcEJERGF0YS0+ckRzcFNldHRpbmdzLnVJU3RvcmVTaXplOworCXBBYmlsaXRpZXMtPmJ1c19kbWFfYncgPSBwQkREYXRhLT5yRHNwU2V0dGluZ3MudURtYUJhbmR3aWR0aDsKKworCS8qIGZpbGwgb3V0IGR5bmFtaWNhbGx5IGRldGVybWluZWQgZmllbGRzICovCisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2xpc3RbMF0gPSAweDAwMDEwMDAwIHwgTVdfQURDX01BU0s7CisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2xpc3RbMV0gPSAweDAwMDEwMDAwIHwgTVdfQUNJX01BU0s7CisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2xpc3RbMl0gPSAweDAwMDEwMDAwIHwgTVdfQUlDMV9NQVNLOworCXBBYmlsaXRpZXMtPmNvbXBvbmVudF9saXN0WzNdID0gMHgwMDAxMDAwMCB8IE1XX0FJQzJfTUFTSzsKKwlwQWJpbGl0aWVzLT5jb21wb25lbnRfbGlzdFs0XSA9IDB4MDAwMTAwMDAgfCBNV19DRERBQ19NQVNLOworCXBBYmlsaXRpZXMtPmNvbXBvbmVudF9saXN0WzVdID0gMHgwMDAxMDAwMCB8IE1XX01JRElfTUFTSzsKKwlwQWJpbGl0aWVzLT5jb21wb25lbnRfbGlzdFs2XSA9IDB4MDAwMTAwMDAgfCBNV19VQVJUX01BU0s7CisJcEFiaWxpdGllcy0+Y29tcG9uZW50X2NvdW50ID0gNzsKKworCS8qIEZpbGwgb3V0IE13YXZlIE9TIGFuZCBCSU9TIHRhc2sgbmFtZXMgKi8KKworCW1lbWNweShwQWJpbGl0aWVzLT5td2F2ZV9vc19uYW1lLCBUUF9BQklMSVRJRVNfTVdBVkVPU19OQU1FLAorCQlzaXplb2YoVFBfQUJJTElUSUVTX01XQVZFT1NfTkFNRSkpOworCW1lbWNweShwQWJpbGl0aWVzLT5iaW9zX3Rhc2tfbmFtZSwgVFBfQUJJTElUSUVTX0JJT1NUQVNLX05BTUUsCisJCXNpemVvZihUUF9BQklMSVRJRVNfQklPU1RBU0tfTkFNRSkpOworCisJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfUXVlcnlBYmlsaXRpZXMgZXhpdCByZXR2YWw9U1VDQ0VTU0ZVTFxuIik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgdHAzNzgwSV9SZWFkV3JpdGVEc3BEU3RvcmUoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEsIHVuc2lnbmVkIGludCB1T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpwdkJ1ZmZlciwgdW5zaWduZWQgaW50IHVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVsRFNQQWRkcikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOworCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKKwlCT09MRUFOIGJSQyA9IDA7CisKKwlQUklOVEtfNihUUkFDRV9UUDM3ODBJLAorCQkidHAzNzgwaTo6dHAzNzgwSV9SZWFkV3JpdGVEc3BEU3RvcmUgZW50cnkgcEJERGF0YSAlcCwgdU9wY29kZSAleCwgcHZCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKKwkJcEJERGF0YSwgdU9wY29kZSwgcHZCdWZmZXIsIHVDb3VudCwgdWxEU1BBZGRyKTsKKworCWlmIChwQkREYXRhLT5iRFNQRW5hYmxlZCkgeworCQlzd2l0Y2ggKHVPcGNvZGUpIHsKKwkJY2FzZSBJT0NUTF9NV19SRUFEX0RBVEE6CisJCQliUkMgPSBkc3AzNzgwSV9SZWFkRFN0b3JlKHVzRHNwQmFzZUlPLCBwdkJ1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJT0NUTF9NV19SRUFEQ0xFQVJfREFUQToKKwkJCWJSQyA9IGRzcDM3ODBJX1JlYWRBbmRDbGVhckRTdG9yZSh1c0RzcEJhc2VJTywgcHZCdWZmZXIsIHVDb3VudCwgdWxEU1BBZGRyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU9DVExfTVdfV1JJVEVfREFUQToKKwkJCWJSQyA9IGRzcDM3ODBJX1dyaXRlRFN0b3JlKHVzRHNwQmFzZUlPLCBwdkJ1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR2YWwgPSAoYlJDKSA/IC1FSU8gOiAwOworCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX1JlYWRXcml0ZURzcERTdG9yZSBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworaW50IHRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhLCB1bnNpZ25lZCBpbnQgdU9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqcHZCdWZmZXIsIHVuc2lnbmVkIGludCB1Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bERTUEFkZHIpCit7CisJaW50IHJldHZhbCA9IDA7CisJRFNQXzM3ODBJX0NPTkZJR19TRVRUSU5HUyAqcFNldHRpbmdzID0gJnBCRERhdGEtPnJEc3BTZXR0aW5nczsKKwl1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTyA9IHBTZXR0aW5ncy0+dXNEc3BCYXNlSU87CisJQk9PTEVBTiBiUkMgPSAwOworCisJUFJJTlRLXzYoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlIGVudHJ5IHBCRERhdGEgJXAsIHVPcGNvZGUgJXgsIHB2QnVmZmVyICVwLCB1Q291bnQgJXgsIHVsRFNQQWRkciAlbHhcbiIsCisJCXBCRERhdGEsIHVPcGNvZGUsIHB2QnVmZmVyLCB1Q291bnQsIHVsRFNQQWRkcik7CisKKwlpZiAocEJERGF0YS0+YkRTUEVuYWJsZWQpIHsKKwkJc3dpdGNoICh1T3Bjb2RlKSB7CisJCWNhc2UgSU9DVExfTVdfUkVBRF9JTlNUOgorCQkJYlJDID0gZHNwMzc4MElfUmVhZElTdG9yZSh1c0RzcEJhc2VJTywgcHZCdWZmZXIsIHVDb3VudCwgdWxEU1BBZGRyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU9DVExfTVdfV1JJVEVfSU5TVDoKKwkJCWJSQyA9IGRzcDM3ODBJX1dyaXRlSVN0b3JlKHVzRHNwQmFzZUlPLCBwdkJ1ZmZlciwgdUNvdW50LCB1bERTUEFkZHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR2YWwgPSAoYlJDKSA/IC1FSU8gOiAwOworCisJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKKwkJInRwMzc4MGk6OnRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlIGV4aXQgcmV0dmFsICV4XG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuaCBiL2RyaXZlcnMvY2hhci9td2F2ZS90cDM3ODBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2ODViNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS90cDM3ODBpLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisqCisqIHRwMzc4MGkuaCAtLSBkZWNsYXJhdGlvbnMgZm9yIHRwMzc4MGkuYworKgorKgorKiBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuIElCTSBDb3Jwb3JhdGlvbgorKgorKiBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIENvcnBvcmF0aW9uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIE5PIFdBUlJBTlRZCisqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisqIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyoKKyogRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKyogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisqIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisqIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyoKKyoKKyogMTAvMjMvMjAwMCAtIEFscGhhIFJlbGVhc2UKKyoJRmlyc3QgcmVsZWFzZSB0byB0aGUgcHVibGljCisqLworCisjaWZuZGVmIF9MSU5VWF9UUDM3ODBJX0gKKyNkZWZpbmUgX0xJTlVYX1RQMzc4MElfSAorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAibXdhdmVwdWIuaCIKKworCisvKiBEU1AgYWJpbGl0aWVzIGNvbnN0YW50cyBmb3IgMzc4MGkgYmFzZWQgVGhpbmtwYWRzICovCisjZGVmaW5lIFRQX0FCSUxJVElFU19JTlRTX1BFUl9TRUMgICAgICAgMzkxNjA4MDAKKyNkZWZpbmUgVFBfQUJJTElUSUVTX0RBVEFfU0laRSAgICAgICAgICAzMjc2OAorI2RlZmluZSBUUF9BQklMSVRJRVNfSU5TVF9TSVpFICAgICAgICAgIDMyNzY4CisjZGVmaW5lIFRQX0FCSUxJVElFU19NV0FWRU9TX05BTUUgICAgICAgIm13YXZlb3MwNzAwLmRzcCIKKyNkZWZpbmUgVFBfQUJJTElUSUVTX0JJT1NUQVNLX05BTUUgICAgICAibXdiaW83MDEuZHNwIgorCisKKy8qIERTUCBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgMzc4MGkgYmFzZWQgVGhpbmtwYWRzICovCisjZGVmaW5lIFRQX0NGR19OdW1UcmFuc2ZlcnMgICAgIDMJLyogMTYgdHJhbnNmZXJzICovCisjZGVmaW5lIFRQX0NGR19SZXJlcXVlc3RUaW1lciAgIDEJLyogMiB1c2VjICovCisjZGVmaW5lIFRQX0NGR19NRU1DUzE2ICAgICAgICAgIDAJLyogRGlzYWJsZWQsIDE2LWJpdCBtZW1vcnkgYXNzdW1lZCAqLworI2RlZmluZSBUUF9DRkdfSXNhTWVtQ21kV2lkdGggICAzCS8qIDI5NSBuc2VjICgxNi1iaXQpICovCisjZGVmaW5lIFRQX0NGR19HYXRlSU9DSFJEWSAgICAgIDAJLyogTm8gSU9DSFJEWSBnYXRpbmcgKi8KKyNkZWZpbmUgVFBfQ0ZHX0VuYWJsZVB3ck1nbXQgICAgMQkvKiBFbmFibGUgbG93IHBvc2VyIHN1c3BlbmQvcmVzdW1lICovCisjZGVmaW5lIFRQX0NGR19IQnVzVGltZXJWYWx1ZSAyNTUJLyogSEJ1cyB0aW1lciBsb2FkIHZhbHVlICovCisjZGVmaW5lIFRQX0NGR19EaXNhYmxlTEJ1c1RpbWVvdXQgMAkvKiBFbmFibGUgTEJ1cyB0aW1lb3V0ICovCisjZGVmaW5lIFRQX0NGR19OX0Rpdmlzb3IgICAgICAgMzIJLyogQ2xvY2sgPSAzOS4xNjA4IE1oeiAqLworI2RlZmluZSBUUF9DRkdfTV9NdWx0aXBsaWVyICAgIDM3CS8qICIgKi8KKyNkZWZpbmUgVFBfQ0ZHX1BsbEJ5cGFzcyAgICAgICAgMAkvKiBkb24ndCBieXBhc3MgKi8KKyNkZWZpbmUgVFBfQ0ZHX0NoaXBsZXRFbmFibGUgMHhGRkZGCS8qIEVuYWJsZSBhbGwgY2hpcGxldHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBiRFNQRW5hYmxlZDsKKwlpbnQgYlNoYXJlRHNwSXJxOworCWludCBiU2hhcmVVYXJ0SXJxOworCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgckRzcFNldHRpbmdzOworfSBUSElOS1BBRF9CRF9EQVRBOworCitpbnQgdHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKTsKK2ludCB0cDM3ODBJX0NhbGNSZXNvdXJjZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpOworaW50IHRwMzc4MElfQ2xhaW1SZXNvdXJjZXMoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpOworaW50IHRwMzc4MElfUmVsZWFzZVJlc291cmNlcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9FbmFibGVEU1AoVEhJTktQQURfQkRfREFUQSAqIHBCRERhdGEpOworaW50IHRwMzc4MElfRGlzYWJsZURTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9SZXNldERTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9TdGFydERTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSk7CitpbnQgdHAzNzgwSV9RdWVyeUFiaWxpdGllcyhUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSwgTVdfQUJJTElUSUVTICogcEFiaWxpdGllcyk7CitpbnQgdHAzNzgwSV9DbGVhbnVwKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKTsKK2ludCB0cDM3ODBJX1JlYWRXcml0ZURzcERTdG9yZShUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSwgdW5zaWduZWQgaW50IHVPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLCB1bnNpZ25lZCBpbnQgdUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKK2ludCB0cDM3ODBJX1JlYWRXcml0ZURzcElTdG9yZShUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSwgdW5zaWduZWQgaW50IHVPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKnB2QnVmZmVyLCB1bnNpZ25lZCBpbnQgdUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEU1BBZGRyKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlci5jIGIvZHJpdmVycy9jaGFyL214c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyNDUwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9teHNlci5jCkBAIC0wLDAgKzEsMzE3MCBAQAorLyoKKyAqICAgICAgICAgIG14c2VyLmMgIC0tIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgTW94YSBUZWNobm9sb2dpZXMgKHN1cHBvcnRAbW94YS5jb20udHcpLgorICoKKyAqICAgICAgVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlIExpbnV4IHNlcmlhbCBkcml2ZXIsIHdyaXR0ZW4gYnkKKyAqICAgICAgTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFQnc28gYW5kIG90aGVycy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKglPcmlnaW5hbCByZWxlYXNlCTEwLzI2LzAwCisgKgorICoJMDIvMDYvMDEJU3VwcG9ydCBNT1hBIEluZHVzdGlvIGZhbWlseSBib2FyZHMuCisgKgkwMi8wNi8wMQlTdXBwb3J0IFRJT0NHSUNPVU5ULgorICoJMDIvMDYvMDEJRml4IHRoZSBwcm9ibGVtIGZvciBjb25uZWN0aW5nIHRvIHNlcmlhbCBtb3VzZS4KKyAqCTAyLzA2LzAxCUZpeCB0aGUgcHJvYmxlbSBmb3IgSC9XIGZsb3cgY29udHJvbC4KKyAqCTAyLzA2LzAxCUZpeCB0aGUgY29tcGxpbmcgd2FybmluZyB3aGVuIENPTkZJR19QQ0kKKyAqCQkJZG9uJ3QgYmUgZGVmaW5lZC4KKyAqCisgKglGZWQgdGhyb3VnaCBhIGNsZWFudXAsIGluZGVudCBhbmQgcmVtb3ZlIG9mIG5vbiAyLjYgY29kZSBieSBBbGFuIENveAorICoJPGFsYW5AcmVkaGF0LmNvbT4uIFRoZSBvcmlnaW5hbCAxLjggY29kZSBpcyBhdmFpbGFibGUgb24gd3d3Lm1veGEuY29tLgorICoJLSBGaXhlZCB4ODZfNjQgY2xlYW5uZXNzCisgKgktIEZpeGVkIHNsZWVwIHdpdGggc3BpbmxvY2sgaGVsZCBpbiBteHNlcl9zZW5kX2JyZWFrCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAibXhzZXIuaCIKKworI2RlZmluZQlNWFNFUl9WRVJTSU9OCSIxLjgiCisjZGVmaW5lCU1YU0VSTUFKT1IJIDE3NAorI2RlZmluZQlNWFNFUkNVTUFKT1IJIDE3NQorCisjZGVmaW5lCU1YU0VSX0VWRU5UX1RYTE9XCSAxCisjZGVmaW5lCU1YU0VSX0VWRU5UX0hBTkdVUAkgMgorCisjZGVmaW5lIE1YU0VSX0JPQVJEUwkJNAkvKiBNYXguIGJvYXJkcyAqLworI2RlZmluZSBNWFNFUl9QT1JUUwkJMzIJLyogTWF4LiBwb3J0cyAqLworI2RlZmluZSBNWFNFUl9QT1JUU19QRVJfQk9BUkQJOAkvKiBNYXguIHBvcnRzIHBlciBib2FyZCAqLworI2RlZmluZSBNWFNFUl9JU1JfUEFTU19MSU1JVAkyNTYKKworI2RlZmluZQlNWFNFUl9FUlJfSU9BRERSCS0xCisjZGVmaW5lCU1YU0VSX0VSUl9JUlEJCS0yCisjZGVmaW5lCU1YU0VSX0VSUl9JUlFfQ09ORkxJVAktMworI2RlZmluZQlNWFNFUl9FUlJfVkVDVE9SCS00CisKKyNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMCTEKKyNkZWZpbmUgU0VSSUFMX1RZUEVfQ0FMTE9VVAkyCisKKyNkZWZpbmUgV0FLRVVQX0NIQVJTCQkyNTYKKworI2RlZmluZSBVQVJUX01DUl9BRkUJCTB4MjAKKyNkZWZpbmUgVUFSVF9MU1JfU1BFQ0lBTAkweDFFCisKKyNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpCShpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0t8SVhPTnxJWE9GRikpCisKKyNkZWZpbmUgSVJRX1QoaW5mbykgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NIQVJFX0lSUSkgPyBTQV9TSElSUSA6IFNBX0lOVEVSUlVQVCkKKworI2RlZmluZSBDMTY4X0FTSUNfSUQgICAgMQorI2RlZmluZSBDMTA0X0FTSUNfSUQgICAgMgorI2RlZmluZSBDMTAyX0FTSUNfSUQJMHhCCisjZGVmaW5lIENJMTMyX0FTSUNfSUQJNAorI2RlZmluZSBDSTEzNF9BU0lDX0lECTMKKyNkZWZpbmUgQ0kxMDRKX0FTSUNfSUQgIDUKKworZW51bSB7CisJTVhTRVJfQk9BUkRfQzE2OF9JU0EgPSAxLAorCU1YU0VSX0JPQVJEX0MxMDRfSVNBLAorCU1YU0VSX0JPQVJEX0NJMTA0SiwKKwlNWFNFUl9CT0FSRF9DMTY4X1BDSSwKKwlNWFNFUl9CT0FSRF9DMTA0X1BDSSwKKwlNWFNFUl9CT0FSRF9DMTAyX0lTQSwKKwlNWFNFUl9CT0FSRF9DSTEzMiwKKwlNWFNFUl9CT0FSRF9DSTEzNCwKKwlNWFNFUl9CT0FSRF9DUDEzMiwKKwlNWFNFUl9CT0FSRF9DUDExNCwKKwlNWFNFUl9CT0FSRF9DVDExNCwKKwlNWFNFUl9CT0FSRF9DUDEwMiwKKwlNWFNFUl9CT0FSRF9DUDEwNFUsCisJTVhTRVJfQk9BUkRfQ1AxNjhVLAorCU1YU0VSX0JPQVJEX0NQMTMyVSwKKwlNWFNFUl9CT0FSRF9DUDEzNFUsCisJTVhTRVJfQk9BUkRfQ1AxMDRKVSwKKwlNWFNFUl9CT0FSRF9SQzcwMDAsCisJTVhTRVJfQk9BUkRfQ1AxMThVLAorCU1YU0VSX0JPQVJEX0NQMTAyVUwsCisJTVhTRVJfQk9BUkRfQ1AxMDJVLAorfTsKKworc3RhdGljIGNoYXIgKm14c2VyX2JyZG5hbWVbXSA9IHsKKwkiQzE2OCBzZXJpZXMiLAorCSJDMTA0IHNlcmllcyIsCisJIkNJLTEwNEogc2VyaWVzIiwKKwkiQzE2OEgvUENJIHNlcmllcyIsCisJIkMxMDRIL1BDSSBzZXJpZXMiLAorCSJDMTAyIHNlcmllcyIsCisJIkNJLTEzMiBzZXJpZXMiLAorCSJDSS0xMzQgc2VyaWVzIiwKKwkiQ1AtMTMyIHNlcmllcyIsCisJIkNQLTExNCBzZXJpZXMiLAorCSJDVC0xMTQgc2VyaWVzIiwKKwkiQ1AtMTAyIHNlcmllcyIsCisJIkNQLTEwNFUgc2VyaWVzIiwKKwkiQ1AtMTY4VSBzZXJpZXMiLAorCSJDUC0xMzJVIHNlcmllcyIsCisJIkNQLTEzNFUgc2VyaWVzIiwKKwkiQ1AtMTA0SlUgc2VyaWVzIiwKKwkiTW94YSBVQzcwMDAgU2VyaWFsIiwKKwkiQ1AtMTE4VSBzZXJpZXMiLAorCSJDUC0xMDJVTCBzZXJpZXMiLAorCSJDUC0xMDJVIHNlcmllcyIsCit9OworCitzdGF0aWMgaW50IG14c2VyX251bXBvcnRzW10gPSB7CisJOCwJCQkvLyBDMTY4LUlTQQorCTQsCQkJLy8gQzEwNC1JU0EKKwk0LAkJCS8vIENJMTA0SgorCTgsCQkJLy8gQzE2OC1QQ0kKKwk0LAkJCS8vIEMxMDQtUENJCisJMiwJCQkvLyBDMTAyLUlTQQorCTIsCQkJLy8gQ0kxMzIKKwk0LAkJCS8vIENJMTM0CisJMiwJCQkvLyBDUDEzMgorCTQsCQkJLy8gQ1AxMTQKKwk0LAkJCS8vIENUMTE0CisJMiwJCQkvLyBDUDEwMgorCTQsCQkJLy8gQ1AxMDRVCisJOCwJCQkvLyBDUDE2OFUKKwkyLAkJCS8vIENQMTMyVQorCTQsCQkJLy8gQ1AxMzRVCisJNCwJCQkvLyBDUDEwNEpVCisJOCwJCQkvLyBSQzcwMDAKKwk4LAkJCS8vIENQMTE4VSAKKwkyLAkJCS8vIENQMTAyVUwgCisJMiwJCQkvLyBDUDEwMlUKK307CisKKyNkZWZpbmUgVUFSVF9UWVBFX05VTQkyCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgR21veGFfdWFydF9pZFtVQVJUX1RZUEVfTlVNXSA9IHsKKwlNT1hBX01VU1RfTVUxNTBfSFdJRCwKKwlNT1hBX01VU1RfTVU4NjBfSFdJRAorfTsKKworLy8gVGhpcyBpcyBvbmx5IGZvciBQQ0kKKyNkZWZpbmUgVUFSVF9JTkZPX05VTQkzCitzdHJ1Y3QgbXhwY2l1YXJ0X2luZm8geworCWludCB0eXBlOworCWludCB0eF9maWZvOworCWludCByeF9maWZvOworCWludCB4bWl0X2ZpZm9fc2l6ZTsKKwlpbnQgcnhfaGlnaF93YXRlcjsKKwlpbnQgcnhfdHJpZ2dlcjsKKwlpbnQgcnhfbG93X3dhdGVyOworCWxvbmcgbWF4X2JhdWQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cGNpdWFydF9pbmZvIEdwY2lfdWFydF9pbmZvW1VBUlRfSU5GT19OVU1dID0geworCXtNT1hBX09USEVSX1VBUlQsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMSwgOTIxNjAwTH0sCisJe01PWEFfTVVTVF9NVTE1MF9IV0lELCA2NCwgNjQsIDY0LCA0OCwgNDgsIDE2LCAyMzA0MDBMfSwKKwl7TU9YQV9NVVNUX01VODYwX0hXSUQsIDEyOCwgMTI4LCAxMjgsIDk2LCA5NiwgMzIsIDkyMTYwMEx9Cit9OworCisKKyNpZmRlZiBDT05GSUdfUENJCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBteHNlcl9wY2licmRzW10gPSB7CisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0MxNjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0MxNjhfUENJfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQzEwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQzEwNF9QQ0l9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMzJ9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDExNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMTR9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DVDExNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1QxMTR9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDJ9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwNFUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0NQMTA0VX0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTY4VSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxNjhVfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMzJVLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEzMlV9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzNFUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0NQMTM0VX0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTA0SlUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0NQMTA0SlV9LAorCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9SQzcwMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX1JDNzAwMH0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTE4VSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMThVfSwKKwl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDJVTCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDJVTH0sCisJe1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTAyVSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDJVfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBteHNlcl9wY2licmRzKTsKKworCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX21veGFfcGNpX2luZm8geworCXVuc2lnbmVkIHNob3J0IGJ1c051bTsKKwl1bnNpZ25lZCBzaG9ydCBkZXZOdW07CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA2LTIzLTIwMDMKK30gbW94YV9wY2lfaW5mbzsKKworc3RhdGljIGludCBpb2FkZHJbTVhTRVJfQk9BUkRTXSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIGludCB0dHltYWpvciA9IE1YU0VSTUFKT1I7CitzdGF0aWMgaW50IGNhbGxvdXRtYWpvciA9IE1YU0VSQ1VNQUpPUjsKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CisKKy8qIFZhcmlhYmxlcyBmb3IgaW5zbW9kICovCisKK01PRFVMRV9BVVRIT1IoIkNhc3BlciBZYW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1PWEEgU21hcnRpby9JbmR1c3RpbyBGYW1pbHkgTXVsdGlwb3J0IEJvYXJkIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9QQVJNKGlvYWRkciwgIjEtNGkiKTsKK01PRFVMRV9QQVJNKHR0eW1ham9yLCAiaSIpOworTU9EVUxFX1BBUk0oY2FsbG91dG1ham9yLCAiaSIpOworTU9EVUxFX1BBUk0odmVyYm9zZSwgImkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IG14c2VyX2xvZyB7CisJaW50IHRpY2s7CisJdW5zaWduZWQgbG9uZyByeGNudFtNWFNFUl9QT1JUU107CisJdW5zaWduZWQgbG9uZyB0eGNudFtNWFNFUl9QT1JUU107Cit9OworCisKK3N0cnVjdCBteHNlcl9tb24geworCXVuc2lnbmVkIGxvbmcgcnhjbnQ7CisJdW5zaWduZWQgbG9uZyB0eGNudDsKKwl1bnNpZ25lZCBsb25nIHVwX3J4Y250OworCXVuc2lnbmVkIGxvbmcgdXBfdHhjbnQ7CisJaW50IG1vZGVtX3N0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGhvbGRfcmVhc29uOworfTsKKworc3RydWN0IG14c2VyX21vbl9leHQgeworCXVuc2lnbmVkIGxvbmcgcnhfY250WzMyXTsKKwl1bnNpZ25lZCBsb25nIHR4X2NudFszMl07CisJdW5zaWduZWQgbG9uZyB1cF9yeGNudFszMl07CisJdW5zaWduZWQgbG9uZyB1cF90eGNudFszMl07CisJaW50IG1vZGVtX3N0YXR1c1szMl07CisKKwlsb25nIGJhdWRyYXRlWzMyXTsKKwlpbnQgZGF0YWJpdHNbMzJdOworCWludCBzdG9wYml0c1szMl07CisJaW50IHBhcml0eVszMl07CisJaW50IGZsb3djdHJsWzMyXTsKKwlpbnQgZmlmb1szMl07CisJaW50IGlmdHlwZVszMl07Cit9Oworc3RydWN0IG14c2VyX2h3Y29uZiB7CisJaW50IGJvYXJkX3R5cGU7CisJaW50IHBvcnRzOworCWludCBpcnE7CisJaW50IHZlY3RvcjsKKwlpbnQgdmVjdG9yX21hc2s7CisJaW50IHVhcnRfdHlwZTsKKwlpbnQgaW9hZGRyW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CisJaW50IGJhdWRfYmFzZVtNWFNFUl9QT1JUU19QRVJfQk9BUkRdOworCW1veGFfcGNpX2luZm8gcGNpSW5mbzsKKwlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisJaW50IE1heENhblNldEJhdWRSYXRlW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIKKwlpbnQgb3Btb2RlX2lvYWRkcltNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0Cit9OworCitzdHJ1Y3QgbXhzZXJfc3RydWN0IHsKKwlpbnQgcG9ydDsKKwlpbnQgYmFzZTsJCS8qIHBvcnQgYmFzZSBhZGRyZXNzICovCisJaW50IGlycTsJCS8qIHBvcnQgdXNpbmcgaXJxIG5vLiAqLworCWludCB2ZWN0b3I7CQkvKiBwb3J0IGlycSB2ZWN0b3IgKi8KKwlpbnQgdmVjdG9ybWFzazsJCS8qIHBvcnQgdmVjdG9yIG1hc2sgKi8KKwlpbnQgcnhfaGlnaF93YXRlcjsKKwlpbnQgcnhfdHJpZ2dlcjsJCS8qIFJ4IGZpZm8gdHJpZ2dlciBsZXZlbCAqLworCWludCByeF9sb3dfd2F0ZXI7CisJaW50IGJhdWRfYmFzZTsJCS8qIG1heC4gc3BlZWQgKi8KKwlpbnQgZmxhZ3M7CQkvKiBkZWZpbmVkIGluIHR0eS5oICovCisJaW50IHR5cGU7CQkvKiBVQVJUIHR5cGUgKi8KKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCByZWFkX3N0YXR1c19tYXNrOworCWludCBpZ25vcmVfc3RhdHVzX21hc2s7CisJaW50IHhtaXRfZmlmb19zaXplOworCWludCBjdXN0b21fZGl2aXNvcjsKKwlpbnQgeF9jaGFyOwkJLyogeG9uL3hvZmYgY2hhcmFjdGVyICovCisJaW50IGNsb3NlX2RlbGF5OworCXVuc2lnbmVkIHNob3J0IGNsb3Npbmdfd2FpdDsKKwlpbnQgSUVSOwkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworCWludCBNQ1I7CQkvKiBNb2RlbSBjb250cm9sIHJlZ2lzdGVyICovCisJdW5zaWduZWQgbG9uZyBldmVudDsKKwlpbnQgY291bnQ7CQkvKiAjIG9mIGZkIG9uIGRldmljZSAqLworCWludCBibG9ja2VkX29wZW47CS8qICMgb2YgYmxvY2tlZCBvcGVucyAqLworCWxvbmcgc2Vzc2lvbjsJCS8qIFNlc3Npb24gb2Ygb3BlbmluZyBwcm9jZXNzICovCisJbG9uZyBwZ3JwOwkJLyogcGdycCBvZiBvcGVuaW5nIHByb2Nlc3MgKi8KKwl1bnNpZ25lZCBjaGFyICp4bWl0X2J1ZjsKKwlpbnQgeG1pdF9oZWFkOworCWludCB4bWl0X3RhaWw7CisJaW50IHhtaXRfY250OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0cXVldWU7CisJc3RydWN0IHRlcm1pb3Mgbm9ybWFsX3Rlcm1pb3M7CisJc3RydWN0IHRlcm1pb3MgY2FsbG91dF90ZXJtaW9zOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBjbG9zZV93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OworCXN0cnVjdCBhc3luY19pY291bnQgaWNvdW50OwkvKiBrZXJuZWwgY291bnRlcnMgZm9yIHRoZSA0IGlucHV0IGludGVycnVwdHMgKi8KKwlpbnQgdGltZW91dDsKKwlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCisJaW50IE1heENhblNldEJhdWRSYXRlOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyCisJaW50IG9wbW9kZV9pb2FkZHI7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKKwl1bnNpZ25lZCBjaGFyIHN0b3Bfcng7CisJdW5zaWduZWQgY2hhciBsZGlzY19zdG9wX3J4OworCWxvbmcgcmVhbGJhdWQ7CisJc3RydWN0IG14c2VyX21vbiBtb25fZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGVycl9zaGFkb3c7CisJc3BpbmxvY2tfdCBzbG9jazsKK307CisKKworc3RydWN0IG14c2VyX21zdGF0dXMgeworCXRjZmxhZ190IGNmbGFnOworCWludCBjdHM7CisJaW50IGRzcjsKKwlpbnQgcmk7CisJaW50IGRjZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfbXN0YXR1cyBHTVN0YXR1c1tNWFNFUl9QT1JUU107CisKK3N0YXRpYyBpbnQgbXhzZXJCb2FyZENBUFtNWFNFUl9CT0FSRFNdID0geworCTAsIDAsIDAsIDAKKwkgICAgLyogIDB4MTgwLCAweDI4MCwgMHgyMDAsIDB4MzIwICAgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqbXh2YXJfc2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfc3RydWN0IG14dmFyX3RhYmxlW01YU0VSX1BPUlRTXTsKK3N0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdCAqbXh2YXJfdHR5W01YU0VSX1BPUlRTICsgMV07CitzdGF0aWMgc3RydWN0IHRlcm1pb3MgKm14dmFyX3Rlcm1pb3NbTVhTRVJfUE9SVFMgKyAxXTsKK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyAqbXh2YXJfdGVybWlvc19sb2NrZWRbTVhTRVJfUE9SVFMgKyAxXTsKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfbG9nIG14dmFyX2xvZzsKK3N0YXRpYyBpbnQgbXh2YXJfZGlhZ2ZsYWc7CitzdGF0aWMgdW5zaWduZWQgY2hhciBteHNlcl9tc3JbTVhTRVJfUE9SVFMgKyAxXTsKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfbW9uX2V4dCBtb25fZGF0YV9leHQ7CitzdGF0aWMgaW50IG14c2VyX3NldF9iYXVkX21ldGhvZFtNWFNFUl9QT1JUUyArIDFdOworc3RhdGljIHNwaW5sb2NrX3QgZ21fbG9jazsKKworLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBmaWd1cmUgb3V0IHRoZSBkaXZpc29yIHNwZWVkcyBhbmQgdGhlIHRpbWVvdXRzCisgKi8KKworc3RhdGljIHN0cnVjdCBteHNlcl9od2NvbmYgbXhzZXJjZmdbTVhTRVJfQk9BUkRTXTsKKworLyoKKyAqIHN0YXRpYyBmdW5jdGlvbnM6CisgKi8KKworc3RhdGljIHZvaWQgbXhzZXJfZ2V0Y2ZnKGludCBib2FyZCwgc3RydWN0IG14c2VyX2h3Y29uZiAqaHdjb25mKTsKK3N0YXRpYyBpbnQgbXhzZXJfaW5pdCh2b2lkKTsKKworLy9zdGF0aWMgdm9pZCAgIG14c2VyX3BvbGwodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IG14c2VyX2dldF9JU0FfY29uZihpbnQsIHN0cnVjdCBteHNlcl9od2NvbmYgKik7CitzdGF0aWMgaW50IG14c2VyX2dldF9QQ0lfY29uZihpbnQsIGludCwgaW50LCBzdHJ1Y3QgbXhzZXJfaHdjb25mICopOworc3RhdGljIHZvaWQgbXhzZXJfZG9fc29mdGludCh2b2lkICopOworc3RhdGljIGludCBteHNlcl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIHZvaWQgbXhzZXJfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IG14c2VyX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgbXhzZXJfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgbXhzZXJfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgbXhzZXJfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBteHNlcl9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyBpbnQgbXhzZXJfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwgdWludCwgdWxvbmcpOworc3RhdGljIGludCBteHNlcl9pb2N0bF9zcGVjaWFsKHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CitzdGF0aWMgdm9pZCBteHNlcl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBteHNlcl9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdGVybWlvcyAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBteHNlcl9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3JzX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICosIGludCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbXhzZXJfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3JlY2VpdmVfY2hhcnMoc3RydWN0IG14c2VyX3N0cnVjdCAqLCBpbnQgKik7CitzdGF0aWMgdm9pZCBteHNlcl90cmFuc21pdF9jaGFycyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICopOworc3RhdGljIHZvaWQgbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgbXhzZXJfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosIHN0cnVjdCBteHNlcl9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IG14c2VyX3N0YXJ0dXAoc3RydWN0IG14c2VyX3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3NodXRkb3duKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IG14c2VyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyk7CitzdGF0aWMgaW50IG14c2VyX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKTsKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopOworc3RhdGljIGludCBteHNlcl9nZXRfbHNyX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqLCB1bnNpZ25lZCBpbnQgX191c2VyICopOworc3RhdGljIHZvaWQgbXhzZXJfc2VuZF9icmVhayhzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIGludCk7CitzdGF0aWMgaW50IG14c2VyX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBteHNlcl90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitzdGF0aWMgaW50IG14c2VyX3NldF9iYXVkKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIGxvbmcgbmV3c3BkKTsKK3N0YXRpYyB2b2lkIG14c2VyX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7CisKK3N0YXRpYyB2b2lkIG14c2VyX3N0YXJ0cngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBteHNlcl9zdG9wcngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKKworc3RhdGljIGludCBDaGVja0lzTW94YU11c3QoaW50IGlvKQoreworCXU4IG9sZG1jciwgaHdpZDsKKwlpbnQgaTsKKworCW91dGIoMCwgaW8gKyBVQVJUX0xDUik7CisJRElTQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShpbyk7CisJb2xkbWNyID0gaW5iKGlvICsgVUFSVF9NQ1IpOworCW91dGIoMCwgaW8gKyBVQVJUX01DUik7CisJU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGlvLCAweDExKTsKKwlpZiAoKGh3aWQgPSBpbmIoaW8gKyBVQVJUX01DUikpICE9IDApIHsKKwkJb3V0YihvbGRtY3IsIGlvICsgVUFSVF9NQ1IpOworCQlyZXR1cm4gKE1PWEFfT1RIRVJfVUFSVCk7CisJfQorCisJR0VUX01PWEFfTVVTVF9IQVJEV0FSRV9JRChpbywgJmh3aWQpOworCWZvciAoaSA9IDA7IGkgPCBVQVJUX1RZUEVfTlVNOyBpKyspIHsKKwkJaWYgKGh3aWQgPT0gR21veGFfdWFydF9pZFtpXSkKKwkJCXJldHVybiAoaW50KSBod2lkOworCX0KKwlyZXR1cm4gTU9YQV9PVEhFUl9VQVJUOworfQorCisvLyBhYm92ZSBpcyBtb2RpZmllZCBieSBWaWN0b3IgWXUuIDA4LTE1LTIwMDIKKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBteHNlcl9vcHMgPSB7CisJLm9wZW4gPSBteHNlcl9vcGVuLAorCS5jbG9zZSA9IG14c2VyX2Nsb3NlLAorCS53cml0ZSA9IG14c2VyX3dyaXRlLAorCS5wdXRfY2hhciA9IG14c2VyX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IG14c2VyX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gbXhzZXJfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gbXhzZXJfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBteHNlcl9mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gbXhzZXJfaW9jdGwsCisJLnRocm90dGxlID0gbXhzZXJfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBteHNlcl91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IG14c2VyX3NldF90ZXJtaW9zLAorCS5zdG9wID0gbXhzZXJfc3RvcCwKKwkuc3RhcnQgPSBteHNlcl9zdGFydCwKKwkuaGFuZ3VwID0gbXhzZXJfaGFuZ3VwLAorCS50aW9jbWdldCA9IG14c2VyX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IG14c2VyX3Rpb2Ntc2V0LAorfTsKKworLyoKKyAqIFRoZSBNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gc2VyaWFsIGRyaXZlciBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSEKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBteHNlcl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkxvYWRpbmcgbW9kdWxlIG14c2VyIC4uLlxuIik7CisJcmV0ID0gbXhzZXJfaW5pdCgpOworCWlmICh2ZXJib3NlKQorCQlwcmludGsoS0VSTl9ERUJVRyAiRG9uZS5cbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBteHNlcl9tb2R1bGVfZXhpdCh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCisJaWYgKHZlcmJvc2UpCisJCXByaW50ayhLRVJOX0RFQlVHICJVbmxvYWRpbmcgbW9kdWxlIG14c2VyIC4uLlxuIik7CisKKwlpZiAoKGVyciB8PSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIobXh2YXJfc2RyaXZlcikpKQorCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IHVucmVnaXN0ZXIgTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBzZXJpYWwgZHJpdmVyXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgeworCQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCQlpZiAobXhzZXJjZmdbaV0uYm9hcmRfdHlwZSA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQllbHNlIHsKKwkJCXBkZXYgPSBteHNlcmNmZ1tpXS5wY2lJbmZvLnBkZXY7CisJCQlmcmVlX2lycShteHNlcmNmZ1tpXS5pcnEsICZteHZhcl90YWJsZVtpICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEXSk7CisJCQlpZiAocGRldiAhPSBOVUxMKSB7CS8vUENJCisJCQkJcmVsZWFzZV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKKwkJCQlyZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMykpOworCQkJfSBlbHNlIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihteHNlcmNmZ1tpXS5pb2FkZHJbMF0sIDggKiBteHNlcmNmZ1tpXS5wb3J0cyk7CisJCQkJcmVsZWFzZV9yZWdpb24obXhzZXJjZmdbaV0udmVjdG9yLCAxKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkRvbmUuXG4iKTsKKworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3R4cnhfZmlmbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQoreworCWludCBpOworCisJaWYgKChpbmZvLT50eXBlID09IFBPUlRfMTY0NTApIHx8IChpbmZvLT50eXBlID09IFBPUlRfODI1MCkpIHsKKwkJaW5mby0+cnhfdHJpZ2dlciA9IDE7CisJCWluZm8tPnJ4X2hpZ2hfd2F0ZXIgPSAxOworCQlpbmZvLT5yeF9sb3dfd2F0ZXIgPSAxOworCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDE7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IFVBUlRfSU5GT19OVU07IGkrKykgeworCQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9PSBHcGNpX3VhcnRfaW5mb1tpXS50eXBlKSB7CisJCQkJaW5mby0+cnhfdHJpZ2dlciA9IEdwY2lfdWFydF9pbmZvW2ldLnJ4X3RyaWdnZXI7CisJCQkJaW5mby0+cnhfbG93X3dhdGVyID0gR3BjaV91YXJ0X2luZm9baV0ucnhfbG93X3dhdGVyOworCQkJCWluZm8tPnJ4X2hpZ2hfd2F0ZXIgPSBHcGNpX3VhcnRfaW5mb1tpXS5yeF9oaWdoX3dhdGVyOworCQkJCWluZm8tPnhtaXRfZmlmb19zaXplID0gR3BjaV91YXJ0X2luZm9baV0ueG1pdF9maWZvX3NpemU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfaW5pdGJyZChpbnQgYm9hcmQsIHN0cnVjdCBteHNlcl9od2NvbmYgKmh3Y29uZikKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvOworCWludCByZXR2YWw7CisJaW50IGksIG47CisKKwluID0gYm9hcmQgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7CisJaW5mbyA9ICZteHZhcl90YWJsZVtuXTsKKwkvKmlmICh2ZXJib3NlKSAqLyAgeworCQlwcmludGsoS0VSTl9ERUJVRyAiICAgICAgICB0dHlNJWQgLSB0dHlNJWQgIiwgbiwgbiArIGh3Y29uZi0+cG9ydHMgLSAxKTsKKwkJcHJpbnRrKCIgbWF4LiBiYXVkIHJhdGUgPSAlZCBicHMuXG4iLCBod2NvbmYtPk1heENhblNldEJhdWRSYXRlWzBdKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrLCBuKyssIGluZm8rKykgeworCQlpbmZvLT5wb3J0ID0gbjsKKwkJaW5mby0+YmFzZSA9IGh3Y29uZi0+aW9hZGRyW2ldOworCQlpbmZvLT5pcnEgPSBod2NvbmYtPmlycTsKKwkJaW5mby0+dmVjdG9yID0gaHdjb25mLT52ZWN0b3I7CisJCWluZm8tPnZlY3Rvcm1hc2sgPSBod2NvbmYtPnZlY3Rvcl9tYXNrOworCQlpbmZvLT5vcG1vZGVfaW9hZGRyID0gaHdjb25mLT5vcG1vZGVfaW9hZGRyW2ldOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisJCWluZm8tPnN0b3BfcnggPSAwOworCQlpbmZvLT5sZGlzY19zdG9wX3J4ID0gMDsKKworCQlpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgPSBod2NvbmYtPklzTW94YU11c3RDaGlwRmxhZzsKKwkJLy9FbmhhbmNlIG1vZGUgZW5hYmxlZCBoZXJlCisJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgIT0gTU9YQV9PVEhFUl9VQVJUKSB7CisJCQlFTkFCTEVfTU9YQV9NVVNUX0VOQ0hBTkNFX01PREUoaW5mby0+YmFzZSk7CisJCX0KKworCQlpbmZvLT5mbGFncyA9IEFTWU5DX1NIQVJFX0lSUTsKKwkJaW5mby0+dHlwZSA9IGh3Y29uZi0+dWFydF90eXBlOworCQlpbmZvLT5iYXVkX2Jhc2UgPSBod2NvbmYtPmJhdWRfYmFzZVtpXTsKKworCQlpbmZvLT5NYXhDYW5TZXRCYXVkUmF0ZSA9IGh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV07CisKKwkJcHJvY2Vzc190eHJ4X2ZpZm8oaW5mbyk7CisKKworCQlpbmZvLT5jdXN0b21fZGl2aXNvciA9IGh3Y29uZi0+YmF1ZF9iYXNlW2ldICogMTY7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gNSAqIEhaIC8gMTA7CisJCWluZm8tPmNsb3Npbmdfd2FpdCA9IDMwICogSFo7CisJCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBteHNlcl9kb19zb2Z0aW50LCBpbmZvKTsKKwkJaW5mby0+bm9ybWFsX3Rlcm1pb3MgPSBteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3M7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJCW1lbXNldCgmaW5mby0+bW9uX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbW9uKSk7CisJCWluZm8tPmVycl9zaGFkb3cgPSAwOworCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+c2xvY2spOworCX0KKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBJUlEgaWYgbmVjZXNzYXJ5CisJICovCisKKworCS8qIGJlZm9yZSBzZXQgSU5UIElTUiwgZGlzYWJsZSBhbGwgaW50ICovCisJZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykgeworCQlvdXRiKGluYihod2NvbmYtPmlvYWRkcltpXSArIFVBUlRfSUVSKSAmIDB4ZjAsIGh3Y29uZi0+aW9hZGRyW2ldICsgVUFSVF9JRVIpOworCX0KKworCW4gPSBib2FyZCAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsKKwlpbmZvID0gJm14dmFyX3RhYmxlW25dOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoaHdjb25mLT5pcnEsIG14c2VyX2ludGVycnVwdCwgSVJRX1QoaW5mbyksICJteHNlciIsIGluZm8pOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCb2FyZCAlZDogJXMiLCBib2FyZCwgbXhzZXJfYnJkbmFtZVtod2NvbmYtPmJvYXJkX3R5cGUgLSAxXSk7CisJCXByaW50aygiICBSZXF1ZXN0IGlycSBmYWlsLElSUSAoJWQpIG1heSBiZSBjb25mbGl0IHdpdGggYW5vdGhlciBkZXZpY2UuXG4iLCBpbmZvLT5pcnEpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBteHNlcl9nZXRjZmcoaW50IGJvYXJkLCBzdHJ1Y3QgbXhzZXJfaHdjb25mICpod2NvbmYpCit7CisJbXhzZXJjZmdbYm9hcmRdID0gKmh3Y29uZjsKK30KKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbnQgbXhzZXJfZ2V0X1BDSV9jb25mKGludCBidXNudW0sIGludCBkZXZudW0sIGludCBib2FyZF90eXBlLCBzdHJ1Y3QgbXhzZXJfaHdjb25mICpod2NvbmYpCit7CisJaW50IGksIGo7CisvLyAgICAgIHVuc2lnbmVkIGludCAgICB2YWw7CisJdW5zaWduZWQgaW50IGlvYWRkcmVzczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGh3Y29uZi0+cGNpSW5mby5wZGV2OworCisJLy9pbyBhZGRyZXNzCisJaHdjb25mLT5ib2FyZF90eXBlID0gYm9hcmRfdHlwZTsKKwlod2NvbmYtPnBvcnRzID0gbXhzZXJfbnVtcG9ydHNbYm9hcmRfdHlwZSAtIDFdOworCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwlyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMiksICJteHNlcihJTykiKTsKKworCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyspIHsKKwkJaHdjb25mLT5pb2FkZHJbaV0gPSBpb2FkZHJlc3MgKyA4ICogaTsKKwl9CisKKwkvL3ZlY3RvcgorCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwlyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMyksICJteHNlcih2ZWN0b3IpIik7CisJaHdjb25mLT52ZWN0b3IgPSBpb2FkZHJlc3M7CisKKwkvL2lycQorCWh3Y29uZi0+aXJxID0gaHdjb25mLT5wY2lJbmZvLnBkZXYtPmlycTsKKworCWh3Y29uZi0+SXNNb3hhTXVzdENoaXBGbGFnID0gQ2hlY2tJc01veGFNdXN0KGh3Y29uZi0+aW9hZGRyWzBdKTsKKwlod2NvbmYtPnVhcnRfdHlwZSA9IFBPUlRfMTY1NTBBOworCWh3Y29uZi0+dmVjdG9yX21hc2sgPSAwOworCisKKwlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBVQVJUX0lORk9fTlVNOyBqKyspIHsKKwkJCWlmIChHcGNpX3VhcnRfaW5mb1tqXS50eXBlID09IGh3Y29uZi0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQkJaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVtpXSA9IEdwY2lfdWFydF9pbmZvW2pdLm1heF9iYXVkOworCisJCQkJLy9leGNlcHRpb24uLi4uQ1AtMTAyCisJCQkJaWYgKGJvYXJkX3R5cGUgPT0gTVhTRVJfQk9BUkRfQ1AxMDIpCisJCQkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSA5MjE2MDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcgPT0gTU9YQV9NVVNUX01VODYwX0hXSUQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykgeworCQkJaWYgKGkgPCA0KQorCQkJCWh3Y29uZi0+b3Btb2RlX2lvYWRkcltpXSA9IGlvYWRkcmVzcyArIDQ7CisJCQllbHNlCisJCQkJaHdjb25mLT5vcG1vZGVfaW9hZGRyW2ldID0gaW9hZGRyZXNzICsgMHgwYzsKKwkJfQorCQlvdXRiKDAsIGlvYWRkcmVzcyArIDQpOwkvLyBkZWZhdWx0IHNldCB0byBSUzIzMiBtb2RlCisJCW91dGIoMCwgaW9hZGRyZXNzICsgMHgwYyk7CS8vZGVmYXVsdCBzZXQgdG8gUlMyMzIgbW9kZQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyspIHsKKwkJaHdjb25mLT52ZWN0b3JfbWFzayB8PSAoMSA8PCBpKTsKKwkJaHdjb25mLT5iYXVkX2Jhc2VbaV0gPSA5MjE2MDA7CisJfQorCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBteHNlcl9pbml0KHZvaWQpCit7CisJaW50IGksIG0sIHJldHZhbCwgYiwgbjsKKwlpbnQgcmV0MTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50IGluZGV4OworCXVuc2lnbmVkIGNoYXIgYnVzbnVtLCBkZXZudW07CisJc3RydWN0IG14c2VyX2h3Y29uZiBod2NvbmY7CisKKwlteHZhcl9zZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNWFNFUl9QT1JUUyArIDEpOworCWlmICghbXh2YXJfc2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJc3Bpbl9sb2NrX2luaXQoJmdtX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSB7CisJCW14c2VyY2ZnW2ldLmJvYXJkX3R5cGUgPSAtMTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGRyaXZlciB2ZXJzaW9uICVzXG4iLCBNWFNFUl9WRVJTSU9OKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisJbWVtc2V0KG14dmFyX3Nkcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlcikpOworCW14dmFyX3Nkcml2ZXItPm1hZ2ljID0gVFRZX0RSSVZFUl9NQUdJQzsKKwlteHZhcl9zZHJpdmVyLT5uYW1lID0gInR0eU0iOworCW14dmFyX3Nkcml2ZXItPm1ham9yID0gdHR5bWFqb3I7CisJbXh2YXJfc2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCW14dmFyX3Nkcml2ZXItPm51bSA9IE1YU0VSX1BPUlRTICsgMTsKKwlteHZhcl9zZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlteHZhcl9zZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlteHZhcl9zZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJdHR5X3NldF9vcGVyYXRpb25zKG14dmFyX3Nkcml2ZXIsICZteHNlcl9vcHMpOworCW14dmFyX3Nkcml2ZXItPnR0eXMgPSBteHZhcl90dHk7CisJbXh2YXJfc2RyaXZlci0+dGVybWlvcyA9IG14dmFyX3Rlcm1pb3M7CisJbXh2YXJfc2RyaXZlci0+dGVybWlvc19sb2NrZWQgPSBteHZhcl90ZXJtaW9zX2xvY2tlZDsKKworCW14dmFyX3Nkcml2ZXItPm9wZW4gPSBteHNlcl9vcGVuOworCW14dmFyX3Nkcml2ZXItPmNsb3NlID0gbXhzZXJfY2xvc2U7CisJbXh2YXJfc2RyaXZlci0+d3JpdGUgPSBteHNlcl93cml0ZTsKKwlteHZhcl9zZHJpdmVyLT5wdXRfY2hhciA9IG14c2VyX3B1dF9jaGFyOworCW14dmFyX3Nkcml2ZXItPmZsdXNoX2NoYXJzID0gbXhzZXJfZmx1c2hfY2hhcnM7CisJbXh2YXJfc2RyaXZlci0+d3JpdGVfcm9vbSA9IG14c2VyX3dyaXRlX3Jvb207CisJbXh2YXJfc2RyaXZlci0+Y2hhcnNfaW5fYnVmZmVyID0gbXhzZXJfY2hhcnNfaW5fYnVmZmVyOworCW14dmFyX3Nkcml2ZXItPmZsdXNoX2J1ZmZlciA9IG14c2VyX2ZsdXNoX2J1ZmZlcjsKKwlteHZhcl9zZHJpdmVyLT5pb2N0bCA9IG14c2VyX2lvY3RsOworCW14dmFyX3Nkcml2ZXItPnRocm90dGxlID0gbXhzZXJfdGhyb3R0bGU7CisJbXh2YXJfc2RyaXZlci0+dW50aHJvdHRsZSA9IG14c2VyX3VudGhyb3R0bGU7CisJbXh2YXJfc2RyaXZlci0+c2V0X3Rlcm1pb3MgPSBteHNlcl9zZXRfdGVybWlvczsKKwlteHZhcl9zZHJpdmVyLT5zdG9wID0gbXhzZXJfc3RvcDsKKwlteHZhcl9zZHJpdmVyLT5zdGFydCA9IG14c2VyX3N0YXJ0OworCW14dmFyX3Nkcml2ZXItPmhhbmd1cCA9IG14c2VyX2hhbmd1cDsKKwlteHZhcl9zZHJpdmVyLT5icmVha19jdGwgPSBteHNlcl9yc19icmVhazsKKwlteHZhcl9zZHJpdmVyLT53YWl0X3VudGlsX3NlbnQgPSBteHNlcl93YWl0X3VudGlsX3NlbnQ7CisKKwlteHZhcl9kaWFnZmxhZyA9IDA7CisJbWVtc2V0KG14dmFyX3RhYmxlLCAwLCBNWFNFUl9QT1JUUyAqIHNpemVvZihzdHJ1Y3QgbXhzZXJfc3RydWN0KSk7CisJbWVtc2V0KCZteHZhcl9sb2csIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbG9nKSk7CisKKwltZW1zZXQoJm14c2VyX21zciwgMCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogKE1YU0VSX1BPUlRTICsgMSkpOworCW1lbXNldCgmbW9uX2RhdGFfZXh0LCAwLCBzaXplb2Yoc3RydWN0IG14c2VyX21vbl9leHQpKTsKKwltZW1zZXQoJm14c2VyX3NldF9iYXVkX21ldGhvZCwgMCwgc2l6ZW9mKGludCkgKiAoTVhTRVJfUE9SVFMgKyAxKSk7CisJbWVtc2V0KCZod2NvbmYsIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfaHdjb25mKSk7CisKKwltID0gMDsKKwkvKiBTdGFydCBmaW5kaW5nIElTQSBib2FyZHMgaGVyZSAqLworCWZvciAoYiA9IDA7IGIgPCBNWFNFUl9CT0FSRFMgJiYgbSA8IE1YU0VSX0JPQVJEUzsgYisrKSB7CisJCWludCBjYXA7CisJCWlmICghKGNhcCA9IG14c2VyQm9hcmRDQVBbYl0pKQorCQkJY29udGludWU7CisKKwkJcmV0dmFsID0gbXhzZXJfZ2V0X0lTQV9jb25mKGNhcCwgJmh3Y29uZik7CisKKwkJaWYgKHJldHZhbCAhPSAwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQ0FQPTB4JXgpXG4iLCBteHNlcl9icmRuYW1lW2h3Y29uZi5ib2FyZF90eXBlIC0gMV0sIGlvYWRkcltiXSk7CisKKwkJaWYgKHJldHZhbCA8PSAwKSB7CisJCQlpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlEpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlFfQ09ORkxJVCkKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3Rvcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lPQUREUikKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgSS9PIGFkZHJlc3MsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWh3Y29uZi5wY2lJbmZvLmJ1c051bSA9IDA7CisJCWh3Y29uZi5wY2lJbmZvLmRldk51bSA9IDA7CisJCWh3Y29uZi5wY2lJbmZvLnBkZXYgPSBOVUxMOworCisJCW14c2VyX2dldGNmZyhtLCAmaHdjb25mKTsKKwkJLy9pbml0IG14c2VyY2ZnIGZpcnN0LCBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KKwkJLy9teHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuCisJCWlmIChteHNlcl9pbml0YnJkKG0sICZod2NvbmYpIDwgMCkKKwkJCWNvbnRpbnVlOworCisKKwkJbSsrOworCX0KKworCS8qIFN0YXJ0IGZpbmRpbmcgSVNBIGJvYXJkcyBmcm9tIG1vZHVsZSBhcmcgKi8KKwlmb3IgKGIgPSAwOyBiIDwgTVhTRVJfQk9BUkRTICYmIG0gPCBNWFNFUl9CT0FSRFM7IGIrKykgeworCQlpbnQgY2FwOworCQlpZiAoIShjYXAgPSBpb2FkZHJbYl0pKQorCQkJY29udGludWU7CisKKwkJcmV0dmFsID0gbXhzZXJfZ2V0X0lTQV9jb25mKGNhcCwgJmh3Y29uZik7CisKKwkJaWYgKHJldHZhbCAhPSAwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQ0FQPTB4JXgpXG4iLCBteHNlcl9icmRuYW1lW2h3Y29uZi5ib2FyZF90eXBlIC0gMV0sIGlvYWRkcltiXSk7CisKKwkJaWYgKHJldHZhbCA8PSAwKSB7CisJCQlpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlEpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlFfQ09ORkxJVCkKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3Rvcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lPQUREUikKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgSS9PIGFkZHJlc3MsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWh3Y29uZi5wY2lJbmZvLmJ1c051bSA9IDA7CisJCWh3Y29uZi5wY2lJbmZvLmRldk51bSA9IDA7CisJCWh3Y29uZi5wY2lJbmZvLnBkZXYgPSBOVUxMOworCisJCW14c2VyX2dldGNmZyhtLCAmaHdjb25mKTsKKwkJLy9pbml0IG14c2VyY2ZnIGZpcnN0LCBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KKwkJLy9teHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuCisJCWlmIChteHNlcl9pbml0YnJkKG0sICZod2NvbmYpIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCW0rKzsKKwl9CisKKwkvKiBzdGFydCBmaW5kaW5nIFBDSSBib2FyZCBoZXJlICovCisjaWZkZWYgQ09ORklHX1BDSQorCW4gPSAoc2l6ZW9mKG14c2VyX3BjaWJyZHMpIC8gc2l6ZW9mKG14c2VyX3BjaWJyZHNbMF0pKSAtIDE7CisJaW5kZXggPSAwOworCWIgPSAwOworCXdoaWxlIChiIDwgbikgeworCQlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKG14c2VyX3BjaWJyZHNbYl0udmVuZG9yLCBteHNlcl9wY2licmRzW2JdLmRldmljZSwgcGRldik7CisJCQlpZiAocGRldiA9PSBOVUxMKSB7CisJCQliKys7CisJCQljb250aW51ZTsKKwkJfQorCQlod2NvbmYucGNpSW5mby5idXNOdW0gPSBidXNudW0gPSBwZGV2LT5idXMtPm51bWJlcjsKKwkJaHdjb25mLnBjaUluZm8uZGV2TnVtID0gZGV2bnVtID0gUENJX1NMT1QocGRldi0+ZGV2Zm4pIDw8IDM7CisJCWh3Y29uZi5wY2lJbmZvLnBkZXYgPSBwZGV2OworCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkKEJ1c05vPSVkLERldk5vPSVkKVxuIiwgbXhzZXJfYnJkbmFtZVsoaW50KSAobXhzZXJfcGNpYnJkc1tiXS5kcml2ZXJfZGF0YSkgLSAxXSwgYnVzbnVtLCBkZXZudW0gPj4gMyk7CisJCWluZGV4Kys7CisJCWlmIChtID49IE1YU0VSX0JPQVJEUykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJUb28gbWFueSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBib2FyZHMgZmluZCAobWF4aW11bSAlZCksYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIsIE1YU0VSX0JPQVJEUyk7CisJCX0gZWxzZSB7CisJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIk1veGEgU21hcnRJL08gUENJIGVuYWJsZSBmYWlsICFcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0dmFsID0gbXhzZXJfZ2V0X1BDSV9jb25mKGJ1c251bSwgZGV2bnVtLCAoaW50KSBteHNlcl9wY2licmRzW2JdLmRyaXZlcl9kYXRhLCAmaHdjb25mKTsKKwkJCWlmIChyZXR2YWwgPCAwKSB7CisJCQkJaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlFfQ09ORkxJVCkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfVkVDVE9SKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3Rvcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JT0FERFIpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJL08gYWRkcmVzcyxib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlteHNlcl9nZXRjZmcobSwgJmh3Y29uZik7CisJCQkvL2luaXQgbXhzZXJjZmcgZmlyc3QsIG9yIG14c2VyY2ZnIGRhdGEgaXMgbm90IGNvcnJlY3Qgb24gSVNSLgorCQkJLy9teHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuCisJCQlpZiAobXhzZXJfaW5pdGJyZChtLCAmaHdjb25mKSA8IDApCisJCQkJY29udGludWU7CisJCQltKys7CisJCX0KKwl9CisjZW5kaWYKKworCXJldDEgPSAwOworCWlmICghKHJldDEgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKG14dmFyX3Nkcml2ZXIpKSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBpbnN0YWxsIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgZHJpdmVyICFcbiIpOworCisKKwlpZiAocmV0MSkgeworCQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspIHsKKwkJCWlmIChteHNlcmNmZ1tpXS5ib2FyZF90eXBlID09IC0xKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZSB7CisJCQkJZnJlZV9pcnEobXhzZXJjZmdbaV0uaXJxLCAmbXh2YXJfdGFibGVbaSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRF0pOworCQkJCS8vdG9kbzogcmVsZWFzZSBpbywgdmVjdG9yCisJCQl9CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX2RvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwl0dHkgPSBpbmZvLT50dHk7CisKKwlpZiAodHR5KSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTVhTRVJfRVZFTlRfVFhMT1csICZpbmZvLT5ldmVudCkpCisJCQl0dHlfd2FrZXVwKHR0eSk7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTVhTRVJfRVZFTlRfSEFOR1VQLCAmaW5mby0+ZXZlbnQpKQorCQkJdHR5X2hhbmd1cCh0dHkpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbXhzZXJfZ2V0X21zcihpbnQgYmFzZWFkZHIsIGludCBtb2RlLCBpbnQgcG9ydCwgc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisKKwlzdGF0dXMgPSBpbmIoYmFzZWFkZHIgKyBVQVJUX01TUik7CisKKwlteHNlcl9tc3JbcG9ydF0gJj0gMHgwRjsKKwlteHNlcl9tc3JbcG9ydF0gfD0gc3RhdHVzOworCXN0YXR1cyA9IG14c2VyX21zcltwb3J0XTsKKwlpZiAobW9kZSkKKwkJbXhzZXJfbXNyW3BvcnRdID0gMDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGEgc2VyaWFsIHBvcnQgaXMgb3BlbmVkLiAgSXQKKyAqIGVuYWJsZXMgaW50ZXJydXB0cyBmb3IgYSBzZXJpYWwgcG9ydCwgbGlua2luZyBpbiBpdHMgYXN5bmMgc3RydWN0dXJlIGludG8KKyAqIHRoZSBJUlEgY2hhaW4uICAgSXQgYWxzbyBwZXJmb3JtcyB0aGUgc2VyaWFsLXNwZWNpZmljCisgKiBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHR0eSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgbXhzZXJfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvOworCWludCByZXR2YWwsIGxpbmU7CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlpZiAobGluZSA9PSBNWFNFUl9QT1JUUykKKwkJcmV0dXJuIDA7CisJaWYgKGxpbmUgPCAwIHx8IGxpbmUgPiBNWFNFUl9QT1JUUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaW5mbyA9IG14dmFyX3RhYmxlICsgbGluZTsKKwlpZiAoIWluZm8tPmJhc2UpCisJCXJldHVybiAoLUVOT0RFVik7CisKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisJLyoKKwkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAorCSAqLworCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAoaW5mbyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIChyZXR2YWwpOworCisJcmV0dmFsID0gbXhzZXJfYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIChyZXR2YWwpOworCisJaW5mby0+Y291bnQrKzsKKworCWlmICgoaW5mby0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmZsYWdzICYgQVNZTkNfU1BMSVRfVEVSTUlPUykpIHsKKwkJaWYgKHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFNFUklBTF9UWVBFX05PUk1BTCkKKwkJCSp0dHktPnRlcm1pb3MgPSBpbmZvLT5ub3JtYWxfdGVybWlvczsKKwkJZWxzZQorCQkJKnR0eS0+dGVybWlvcyA9IGluZm8tPmNhbGxvdXRfdGVybWlvczsKKwkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOworCX0KKworCWluZm8tPnNlc3Npb24gPSBjdXJyZW50LT5zaWduYWwtPnNlc3Npb247CisJaW5mby0+cGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKworCS8vc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsKKwkvL214c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCisvKiB1bm1hcmsgaGVyZSBmb3IgdmVyeSBoaWdoIGJhdWQgcmF0ZSAoZXguIDkyMTYwMCBicHMpIHVzZWQKKyovCisJdHR5LT5sb3dfbGF0ZW5jeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHNlcmlhbCBwb3J0IGdldHMgY2xvc2VkLiAgRmlyc3QsIHdlCisgKiB3YWl0IGZvciB0aGUgbGFzdCByZW1haW5pbmcgZGF0YSB0byBiZSBzZW50LiAgVGhlbiwgd2UgdW5saW5rIGl0cworICogYXN5bmMgc3RydWN0dXJlIGZyb20gdGhlIGludGVycnVwdCBjaGFpbiBpZiBuZWNlc3NhcnksIGFuZCB3ZSBmcmVlCisgKiB0aGF0IElSUSBpZiBub3RoaW5nIGlzIGxlZnQgaW4gdGhlIGNoYWluLgorICovCitzdGF0aWMgdm9pZCBteHNlcl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCisJCXJldHVybjsKKwlpZiAoIWluZm8pCisJCUJVRygpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoaW5mby0+Y291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBJbmZvLT5jb3VudCBzaG91bGQgYWx3YXlzCisJCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KKwkJICogb25lLCB3ZSd2ZSBnb3QgcmVhbCBwcm9ibGVtcywgc2luY2UgaXQgbWVhbnMgdGhlCisJCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJteHNlcl9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIgImluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7CisJCWluZm8tPmNvdW50ID0gMTsKKwl9CisJaWYgKC0taW5mby0+Y291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibXhzZXJfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgdHR5cyVkOiAlZFxuIiwgaW5mby0+cG9ydCwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDA7CisJfQorCWlmIChpbmZvLT5jb3VudCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIFNhdmUgdGhlIHRlcm1pb3Mgc3RydWN0dXJlLCBzaW5jZSB0aGlzIHBvcnQgbWF5IGhhdmUKKwkgKiBzZXBhcmF0ZSB0ZXJtaW9zIGZvciBjYWxsb3V0IGFuZCBkaWFsaW4uCisJICovCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfTk9STUFMX0FDVElWRSkKKwkJaW5mby0+bm9ybWFsX3Rlcm1pb3MgPSAqdHR5LT50ZXJtaW9zOworCS8qCisJICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkKKwkgKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKKwkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQorCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCisJICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9STFNJOworCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCisJCWluZm8tPklFUiAmPSB+TU9YQV9NVVNUX1JFQ1ZfSVNSOworLyogYnkgV2lsbGlhbQorCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgJj0gflVBUlRfTFNSX0RSOworKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJLyoKKwkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKKwkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5CisJCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCisJCSAqLworCQl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCQl3aGlsZSAoIShpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCg1KTsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJfQorCW14c2VyX3NodXRkb3duKGluZm8pOworCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJCisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGxkKSB7CisJCWlmKGxkLT5mbHVzaF9idWZmZXIpCisJCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorCQkKKwl0dHktPmNsb3NpbmcgPSAwOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT50dHkgPSBOVUxMOworCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChpbmZvLT5jbG9zZV9kZWxheSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0KKworCWluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0NMT1NJTkcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisKK30KKworc3RhdGljIGludCBteHNlcl93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQgYywgdG90YWwgPSAwOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYpCisJCXJldHVybiAoMCk7CisKKwl3aGlsZSAoMSkgeworCQljID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDEsIFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2hlYWQpKTsKKwkJaWYgKGMgPD0gMCkKKwkJCWJyZWFrOworCisJCW1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCWluZm8tPnhtaXRfaGVhZCA9IChpbmZvLT54bWl0X2hlYWQgKyBjKSAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCWluZm8tPnhtaXRfY250ICs9IGM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwkJYnVmICs9IGM7CisJCWNvdW50IC09IGM7CisJCXRvdGFsICs9IGM7CisKKwl9CisKKwlpZiAoaW5mby0+eG1pdF9jbnQgJiYgIXR0eS0+c3RvcHBlZCAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CisJCWlmICghdHR5LT5od19zdG9wcGVkIHx8IChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KKwlyZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKKwkJcmV0dXJuOworCisJaWYgKGluZm8tPnhtaXRfY250ID49IFNFUklBTF9YTUlUX1NJWkUgLSAxKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X2hlYWQrK10gPSBjaDsKKwlpbmZvLT54bWl0X2hlYWQgJj0gU0VSSUFMX1hNSVRfU0laRSAtIDE7CisJaW5mby0+eG1pdF9jbnQrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWlmICghdHR5LT5zdG9wcGVkICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKKwkJaWYgKCF0dHktPmh3X3N0b3BwZWQgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8IGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgIWluZm8tPnhtaXRfYnVmIHx8ICh0dHktPmh3X3N0b3BwZWQgJiYgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG14c2VyX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIGluZm8tPnhtaXRfY250OworfQorCitzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwljaGFyIGZjcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisKKwkvKiBiZWxvdyBhZGRlZCBieSBzaGluaGF5ICovCisJZmNyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJb3V0YigoZmNyIHwgVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCW91dGIoZmNyLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkvKiBhYm92ZSBhZGRlZCBieSBzaGluaGF5ICovCisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJaWYgKCh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmIHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKQorCQkodHR5LT5sZGlzYy53cml0ZV93YWtldXApICh0dHkpOworfQorCitzdGF0aWMgaW50IG14c2VyX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXYsIGNub3c7CS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCisJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICpwX2N1c2VyOworCXVuc2lnbmVkIGxvbmcgdGVtcGw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmICh0dHktPmluZGV4ID09IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gKG14c2VyX2lvY3RsX3NwZWNpYWwoY21kLCBhcmdwKSk7CisKKwkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNAorCWlmIChjbWQgPT0gTU9YQV9TRVRfT1BfTU9ERSB8fCBjbWQgPT0gTU9YQV9HRVRfT1BfTU9ERSkgeworCQlpbnQgb3Btb2RlLCBwOworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBNb2RlTWFza1tdID0geyAweGZjLCAweGYzLCAweGNmLCAweDNmIH07CisJCWludCBzaGlmdGJpdDsKKwkJdW5zaWduZWQgY2hhciB2YWwsIG1hc2s7CisKKwkJcCA9IGluZm8tPnBvcnQgJSA0OworCQlpZiAoY21kID09IE1PWEFfU0VUX09QX01PREUpIHsKKwkJCWlmIChnZXRfdXNlcihvcG1vZGUsIChpbnQgX191c2VyICopIGFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKG9wbW9kZSAhPSBSUzIzMl9NT0RFICYmIG9wbW9kZSAhPSBSUzQ4NV8yV0lSRV9NT0RFICYmIG9wbW9kZSAhPSBSUzQyMl9NT0RFICYmIG9wbW9kZSAhPSBSUzQ4NV80V0lSRV9NT0RFKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJbWFzayA9IE1vZGVNYXNrW3BdOworCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCXZhbCA9IGluYihpbmZvLT5vcG1vZGVfaW9hZGRyKTsKKwkJCXZhbCAmPSBtYXNrOworCQkJdmFsIHw9IChvcG1vZGUgPDwgc2hpZnRiaXQpOworCQkJb3V0Yih2YWwsIGluZm8tPm9wbW9kZV9pb2FkZHIpOworCQl9IGVsc2UgeworCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCW9wbW9kZSA9IGluYihpbmZvLT5vcG1vZGVfaW9hZGRyKSA+PiBzaGlmdGJpdDsKKwkJCW9wbW9kZSAmPSBPUF9NT0RFX01BU0s7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZvcG1vZGUsIHNpemVvZihpbnQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNAorCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ01JV0FJVCkgJiYgKGNtZCAhPSBUSU9DR0lDT1VOVCkpIHsKKwkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQkJcmV0dXJuICgtRUlPKTsKKwl9CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRDU0JSSzoJCS8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gKHJldHZhbCk7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJaWYgKCFhcmcpCisJCQlteHNlcl9zZW5kX2JyZWFrKGluZm8sIEhaIC8gNCk7CS8qIDEvNCBzZWNvbmQgKi8KKwkJcmV0dXJuICgwKTsKKwljYXNlIFRDU0JSS1A6CQkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCisJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiAocmV0dmFsKTsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQlteHNlcl9zZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyAqIChIWiAvIDEwKSA6IEhaIC8gNCk7CisJCXJldHVybiAoMCk7CisJY2FzZSBUSU9DR1NPRlRDQVI6CisJCXJldHVybiBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKKwljYXNlIFRJT0NTU09GVENBUjoKKwkJaWYgKGdldF91c2VyKHRlbXBsLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYXJnID0gdGVtcGw7CisJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9ICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfCAoYXJnID8gQ0xPQ0FMIDogMCkpOworCQlyZXR1cm4gKDApOworCWNhc2UgVElPQ0dTRVJJQUw6CisJCXJldHVybiBteHNlcl9nZXRfc2VyaWFsX2luZm8oaW5mbywgYXJncCk7CisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmV0dXJuIG14c2VyX3NldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKwljYXNlIFRJT0NTRVJHRVRMU1I6CS8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLworCQlyZXR1cm4gbXhzZXJfZ2V0X2xzcl9pbmZvKGluZm8sIGFyZ3ApOworCQkvKgorCQkgKiBXYWl0IGZvciBhbnkgb2YgdGhlIDQgbW9kZW0gaW5wdXRzIChEQ0QsUkksRFNSLENUUykgdG8gY2hhbmdlCisJCSAqIC0gbWFzayBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdAorCQkgKiAgICh1c2UgfCdlZCBUSU9DTV9STkcvRFNSL0NEL0NUUyBmb3IgbWFza2luZykKKwkJICogQ2FsbGVyIHNob3VsZCB1c2UgVElPQ0dJQ09VTlQgdG8gc2VlIHdoaWNoIG9uZSBpdCB3YXMKKwkJICovCisJY2FzZSBUSU9DTUlXQUlUOnsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQkJaW50IHJldDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQkJY3ByZXYgPSBpbmZvLT5pY291bnQ7CS8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJCQlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQsICZ3YWl0KTsKKwkJCXdoaWxlICgxKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCQkJY25vdyA9IGluZm8tPmljb3VudDsJLyogYXRvbWljIGNvcHkgKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fCAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8ICgoYXJnICYgVElPQ01fQ0QpICYmIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fCAoKGFyZyAmIFRJT0NNX0NUUykgJiYgKGNub3cuY3RzICE9IGNwcmV2LmN0cykpKSB7CisJCQkJCXJldCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNwcmV2ID0gY25vdzsKKwkJCX0KKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPmRlbHRhX21zcl93YWl0LCAmd2FpdCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBOT1RSRUFDSEVEICovCisJCS8qCisJCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQorCQkgKiBSZXR1cm46IHdyaXRlIGNvdW50ZXJzIHRvIHRoZSB1c2VyIHBhc3NlZCBjb3VudGVyIHN0cnVjdAorCQkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKKwkJICogICAgIFJJIHdoZXJlIG9ubHkgMC0+MSBpcyBjb3VudGVkLgorCQkgKi8KKwljYXNlIFRJT0NHSUNPVU5UOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJY25vdyA9IGluZm8tPmljb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcF9jdXNlciA9IGFyZ3A7CisJCS8qIG1vZGlmaWVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KKwkJaWYgKHB1dF91c2VyKGNub3cuZnJhbWUsICZwX2N1c2VyLT5mcmFtZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKGNub3cuYnJrLCAmcF9jdXNlci0+YnJrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5vdmVycnVuLCAmcF9jdXNlci0+b3ZlcnJ1bikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKGNub3cuYnVmX292ZXJydW4sICZwX2N1c2VyLT5idWZfb3ZlcnJ1bikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKGNub3cucGFyaXR5LCAmcF9jdXNlci0+cGFyaXR5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5yeCwgJnBfY3VzZXItPnJ4KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy50eCwgJnBfY3VzZXItPnR4KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwdXRfdXNlcihjbm93LmN0cywgJnBfY3VzZXItPmN0cyk7CisJCXB1dF91c2VyKGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKTsKKwkJcHV0X3VzZXIoY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOworCQlwdXRfdXNlcihjbm93LmRjZCwgJnBfY3VzZXItPmRjZCk7CisKKy8qICovCisJCXJldHVybiAwOworCWNhc2UgTU9YQV9IaWdoU3BlZWRPbjoKKwkJcmV0dXJuIHB1dF91c2VyKGluZm8tPmJhdWRfYmFzZSAhPSAxMTUyMDAgPyAxIDogMCwgKGludCBfX3VzZXIgKikgYXJncCk7CisKKwljYXNlIE1PWEFfU0RTX1JTVElDT1VOVEVSOnsKKwkJCWluZm8tPm1vbl9kYXRhLnJ4Y250ID0gMDsKKwkJCWluZm8tPm1vbl9kYXRhLnR4Y250ID0gMDsKKwkJCXJldHVybiAwOworCQl9CisvLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorCWNhc2UgTU9YQV9BU1BQX1NFVEJBVUQ6eworCQkJbG9uZyBiYXVkOworCQkJaWYgKGdldF91c2VyKGJhdWQsIChsb25nIF9fdXNlciAqKSBhcmdwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCW14c2VyX3NldF9iYXVkKGluZm8sIGJhdWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIE1PWEFfQVNQUF9HRVRCQVVEOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLT5yZWFsYmF1ZCwgc2l6ZW9mKGxvbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCisJY2FzZSBNT1hBX0FTUFBfT1FVRVVFOnsKKwkJCWludCBsZW4sIGxzcjsKKworCQkJbGVuID0gbXhzZXJfY2hhcnNfaW5fYnVmZmVyKHR0eSk7CisKKwkJCWxzciA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVDsKKworCQkJbGVuICs9IChsc3IgPyAwIDogMSk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmxlbiwgc2l6ZW9mKGludCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgTU9YQV9BU1BQX01PTjp7CisJCQlpbnQgbWNyLCBzdGF0dXM7CisvLyAgICAgIGluZm8tPm1vbl9kYXRhLnNlcl9wYXJhbSA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCQkJc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAxLCBpbmZvLT5wb3J0LCBpbmZvKTsKKwkJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCisJCQltY3IgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwkJCWlmIChtY3IgJiBNT1hBX01VU1RfTUNSX1hPTl9GTEFHKQorCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9YT0ZGSE9MRDsKKwkJCWVsc2UKKwkJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9YT0ZGSE9MRDsKKworCQkJaWYgKG1jciAmIE1PWEFfTVVTVF9NQ1JfVFhfWE9OKQorCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9YT0ZGWEVOVDsKKwkJCWVsc2UKKwkJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9YT0ZGWEVOVDsKKworCQkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkKKwkJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9DVFNIT0xEOworCQkJZWxzZQorCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9DVFNIT0xEOworCisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPm1vbl9kYXRhLCBzaXplb2Yoc3RydWN0IG14c2VyX21vbikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXR1cm4gMDsKKworCQl9CisKKwljYXNlIE1PWEFfQVNQUF9MU1RBVFVTOnsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPmVycl9zaGFkb3csIHNpemVvZih1bnNpZ25lZCBjaGFyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWluZm8tPmVycl9zaGFkb3cgPSAwOworCQkJcmV0dXJuIDA7CisKKwkJfQorCWNhc2UgTU9YQV9TRVRfQkFVRF9NRVRIT0Q6eworCQkJaW50IG1ldGhvZDsKKwkJCWlmIChnZXRfdXNlcihtZXRob2QsIChpbnQgX191c2VyICopIGFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJbXhzZXJfc2V0X2JhdWRfbWV0aG9kW2luZm8tPnBvcnRdID0gbWV0aG9kOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbWV0aG9kLCBzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldHVybiAwOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgQ01TUEFSCisjZGVmaW5lCUNNU1BBUiAwMTAwMDAwMDAwMDAKKyNlbmRpZgorCitzdGF0aWMgaW50IG14c2VyX2lvY3RsX3NwZWNpYWwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJaW50IGksIHJlc3VsdCwgc3RhdHVzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE1PWEFfR0VUX0NPTkY6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbXhzZXJjZmcsIHNpemVvZihzdHJ1Y3QgbXhzZXJfaHdjb25mKSAqIDQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgTU9YQV9HRVRfTUFKT1I6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnR0eW1ham9yLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE1PWEFfR0VUX0NVTUFKT1I6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNhbGxvdXRtYWpvciwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBNT1hBX0NIS1BPUlRFTkFCTEU6CisJCXJlc3VsdCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9QT1JUUzsgaSsrKSB7CisJCQlpZiAobXh2YXJfdGFibGVbaV0uYmFzZSkKKwkJCQlyZXN1bHQgfD0gKDEgPDwgaSk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApOworCWNhc2UgTU9YQV9HRVREQVRBQ09VTlQ6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm14dmFyX2xvZywgc2l6ZW9mKG14dmFyX2xvZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAoMCk7CisJY2FzZSBNT1hBX0dFVE1TVEFUVVM6CisJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9QT1JUUzsgaSsrKSB7CisJCQlHTVN0YXR1c1tpXS5yaSA9IDA7CisJCQlpZiAoIW14dmFyX3RhYmxlW2ldLmJhc2UpIHsKKwkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOworCQkJCUdNU3RhdHVzW2ldLmRzciA9IDA7CisJCQkJR01TdGF0dXNbaV0uY3RzID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFteHZhcl90YWJsZVtpXS50dHkgfHwgIW14dmFyX3RhYmxlW2ldLnR0eS0+dGVybWlvcykKKwkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9IG14dmFyX3RhYmxlW2ldLm5vcm1hbF90ZXJtaW9zLmNfY2ZsYWc7CisJCQllbHNlCisJCQkJR01TdGF0dXNbaV0uY2ZsYWcgPSBteHZhcl90YWJsZVtpXS50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwkJCXN0YXR1cyA9IGluYihteHZhcl90YWJsZVtpXS5iYXNlICsgVUFSVF9NU1IpOworCQkJaWYgKHN0YXR1cyAmIDB4ODAgLypVQVJUX01TUl9EQ0QgKi8gKQorCQkJCUdNU3RhdHVzW2ldLmRjZCA9IDE7CisJCQllbHNlCisJCQkJR01TdGF0dXNbaV0uZGNkID0gMDsKKworCQkJaWYgKHN0YXR1cyAmIDB4MjAgLypVQVJUX01TUl9EU1IgKi8gKQorCQkJCUdNU3RhdHVzW2ldLmRzciA9IDE7CisJCQllbHNlCisJCQkJR01TdGF0dXNbaV0uZHNyID0gMDsKKworCisJCQlpZiAoc3RhdHVzICYgMHgxMCAvKlVBUlRfTVNSX0NUUyAqLyApCisJCQkJR01TdGF0dXNbaV0uY3RzID0gMTsKKwkJCWVsc2UKKwkJCQlHTVN0YXR1c1tpXS5jdHMgPSAwOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgR01TdGF0dXMsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbXN0YXR1cykgKiBNWFNFUl9QT1JUUykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBNT1hBX0FTUFBfTU9OX0VYVDp7CisJCQlpbnQgc3RhdHVzOworCQkJaW50IG9wbW9kZSwgcDsKKwkJCWludCBzaGlmdGJpdDsKKwkJCXVuc2lnbmVkIGNmbGFnLCBpZmxhZzsKKworCQkJZm9yIChpID0gMDsgaSA8IE1YU0VSX1BPUlRTOyBpKyspIHsKKworCQkJCWlmICghbXh2YXJfdGFibGVbaV0uYmFzZSkKKwkJCQkJY29udGludWU7CisKKwkJCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKG14dmFyX3RhYmxlW2ldLmJhc2UsIDAsIGksICYobXh2YXJfdGFibGVbaV0pKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cygmbXh2YXJfdGFibGVbaV0sIHN0YXR1cyk7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCisJCQkJCW14dmFyX3RhYmxlW2ldLmljb3VudC5ybmcrKzsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKKwkJCQkJbXh2YXJfdGFibGVbaV0uaWNvdW50LmRzcisrOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQorCQkJCQlteHZhcl90YWJsZVtpXS5pY291bnQuZGNkKys7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCisJCQkJCW14dmFyX3RhYmxlW2ldLmljb3VudC5jdHMrKzsKKworCQkJCW14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLm1vZGVtX3N0YXR1cyA9IHN0YXR1czsKKwkJCQltb25fZGF0YV9leHQucnhfY250W2ldID0gbXh2YXJfdGFibGVbaV0ubW9uX2RhdGEucnhjbnQ7CisJCQkJbW9uX2RhdGFfZXh0LnR4X2NudFtpXSA9IG14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLnR4Y250OworCQkJCW1vbl9kYXRhX2V4dC51cF9yeGNudFtpXSA9IG14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLnVwX3J4Y250OworCQkJCW1vbl9kYXRhX2V4dC51cF90eGNudFtpXSA9IG14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLnVwX3R4Y250OworCQkJCW1vbl9kYXRhX2V4dC5tb2RlbV9zdGF0dXNbaV0gPSBteHZhcl90YWJsZVtpXS5tb25fZGF0YS5tb2RlbV9zdGF0dXM7CisJCQkJbW9uX2RhdGFfZXh0LmJhdWRyYXRlW2ldID0gbXh2YXJfdGFibGVbaV0ucmVhbGJhdWQ7CisKKwkJCQlpZiAoIW14dmFyX3RhYmxlW2ldLnR0eSB8fCAhbXh2YXJfdGFibGVbaV0udHR5LT50ZXJtaW9zKSB7CisJCQkJCWNmbGFnID0gbXh2YXJfdGFibGVbaV0ubm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKKwkJCQkJaWZsYWcgPSBteHZhcl90YWJsZVtpXS5ub3JtYWxfdGVybWlvcy5jX2lmbGFnOworCQkJCX0gZWxzZSB7CisJCQkJCWNmbGFnID0gbXh2YXJfdGFibGVbaV0udHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCQkJCQlpZmxhZyA9IG14dmFyX3RhYmxlW2ldLnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKwkJCQl9CisKKwkJCQltb25fZGF0YV9leHQuZGF0YWJpdHNbaV0gPSBjZmxhZyAmIENTSVpFOworCisJCQkJbW9uX2RhdGFfZXh0LnN0b3BiaXRzW2ldID0gY2ZsYWcgJiBDU1RPUEI7CisKKwkJCQltb25fZGF0YV9leHQucGFyaXR5W2ldID0gY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKTsKKworCQkJCW1vbl9kYXRhX2V4dC5mbG93Y3RybFtpXSA9IDB4MDA7CisKKwkJCQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQorCQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gfD0gMHgwMzsKKworCQkJCWlmIChpZmxhZyAmIChJWE9OIHwgSVhPRkYpKQorCQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gfD0gMHgwQzsKKworCQkJCWlmIChteHZhcl90YWJsZVtpXS50eXBlID09IFBPUlRfMTY1NTBBKQorCQkJCQltb25fZGF0YV9leHQuZmlmb1tpXSA9IDE7CisJCQkJZWxzZQorCQkJCQltb25fZGF0YV9leHQuZmlmb1tpXSA9IDA7CisKKwkJCQlwID0gaSAlIDQ7CisJCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCQlvcG1vZGUgPSBpbmIobXh2YXJfdGFibGVbaV0ub3Btb2RlX2lvYWRkcikgPj4gc2hpZnRiaXQ7CisJCQkJb3Btb2RlICY9IE9QX01PREVfTUFTSzsKKworCQkJCW1vbl9kYXRhX2V4dC5pZnR5cGVbaV0gPSBvcG1vZGU7CisKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm1vbl9kYXRhX2V4dCwgc2l6ZW9mKHN0cnVjdCBteHNlcl9tb25fZXh0KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldHVybiAwOworCisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBteHNlcl9zdG9wcngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWluZm8tPmxkaXNjX3N0b3BfcnggPSAxOworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKworCQkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJaW5mby0+SUVSICY9IH5NT1hBX01VU1RfUkVDVl9JU1I7CisJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCQkJaW5mby0+eF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7CisJCQkvLyAgICAgIG91dGIoaW5mby0+SUVSLCAwKTsgLy8gbWFzayBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCW91dGIoMCwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CS8qIGZvcmNlIFR4IGludGVycnVwdCAqLworCQl9CQkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJfQorCisJaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOworCQlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwkJLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3N0YXJ0cngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbmZvLT5sZGlzY19zdG9wX3J4ID0gMDsKKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCWlmIChpbmZvLT54X2NoYXIpCisJCQlpbmZvLT54X2NoYXIgPSAwOworCQllbHNlIHsKKwkJCS8vTVhfTE9DSygmaW5mby0+c2xvY2spOworCisJCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJCWluZm8tPklFUiB8PSBNT1hBX01VU1RfUkVDVl9JU1I7CisJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQl9IGVsc2UgeworCQkJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCQkJCWluZm8tPnhfY2hhciA9IFNUQVJUX0NIQVIodHR5KTsKKwkJCQkvLyAgICAgICAgICBvdXRiKGluZm8tPklFUiwgMCk7IC8vIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkJb3V0YigwLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CS8qIGZvcmNlIFR4IGludGVycnVwdCAqLworCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJfQkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCQl9CisJfQorCisJaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9SVFM7CisJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCX0KK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHVwcGVyLWxheWVyIHR0eSBsYXllciB0byBzaWduYWwgdGhhdAorICogaW5jb21pbmcgY2hhcmFjdGVycyBzaG91bGQgYmUgdGhyb3R0bGVkLgorICovCitzdGF0aWMgdm9pZCBteHNlcl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCS8vc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJbXhzZXJfc3RvcHJ4KHR0eSk7CisJLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCS8vc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJbXhzZXJfc3RhcnRyeCh0dHkpOworCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpIHx8IChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpICE9IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpIHsKKworCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOworCisJCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQkJbXhzZXJfc3RhcnQodHR5KTsKKwkJfQorCX0KKworLyogSGFuZGxlIHN3IHN0b3BwZWQgKi8KKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2lmbGFnICYgSVhPTikgJiYgISh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9OKSkgeworCQl0dHktPnN0b3BwZWQgPSAwOworCisJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQkJRElTQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJfQorCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisKKwkJbXhzZXJfc3RhcnQodHR5KTsKKwl9Cit9CisKKy8qCisgKiBteHNlcl9zdG9wKCkgYW5kIG14c2VyX3N0YXJ0KCkKKyAqCisgKiBUaGlzIHJvdXRpbmVzIGFyZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgb3IgcmVzZXR0aW5nIHR0eS0+c3RvcHBlZC4KKyAqIFRoZXkgZW5hYmxlIG9yIGRpc2FibGUgdHJhbnNtaXR0ZXIgaW50ZXJydXB0cywgYXMgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgdm9pZCBteHNlcl9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSB7CisJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT54bWl0X2NudCAmJiBpbmZvLT54bWl0X2J1ZiAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CisJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIG14c2VyX3dhaXRfdW50aWxfc2VudCgpIC0tLSB3YWl0IHVudGlsIHRoZSB0cmFuc21pdHRlciBpcyBlbXB0eQorICovCitzdGF0aWMgdm9pZCBteHNlcl93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKKwlpbnQgbHNyOworCisJaWYgKGluZm8tPnR5cGUgPT0gUE9SVF9VTktOT1dOKQorCQlyZXR1cm47CisKKwlpZiAoaW5mby0+eG1pdF9maWZvX3NpemUgPT0gMCkKKwkJcmV0dXJuOwkJLyogSnVzdCBpbiBjYXNlLi4uLiAqLworCisJb3JpZ19qaWZmaWVzID0gamlmZmllczsKKwkvKgorCSAqIFNldCB0aGUgY2hlY2sgaW50ZXJ2YWwgdG8gYmUgMS81IG9mIHRoZSBlc3RpbWF0ZWQgdGltZSB0bworCSAqIHNlbmQgYSBzaW5nbGUgY2hhcmFjdGVyLCBhbmQgbWFrZSBpdCBhdCBsZWFzdCAxLiAgVGhlIGNoZWNrCisJICogaW50ZXJ2YWwgc2hvdWxkIGFsc28gYmUgbGVzcyB0aGFuIHRoZSB0aW1lb3V0LgorCSAqCisJICogTm90ZTogd2UgaGF2ZSB0byB1c2UgcHJldHR5IHRpZ2h0IHRpbWluZ3MgaGVyZSB0byBzYXRpc2Z5CisJICogdGhlIE5JU1QtUENUUy4KKwkgKi8KKwljaGFyX3RpbWUgPSAoaW5mby0+dGltZW91dCAtIEhaIC8gNTApIC8gaW5mby0+eG1pdF9maWZvX3NpemU7CisJY2hhcl90aW1lID0gY2hhcl90aW1lIC8gNTsKKwlpZiAoY2hhcl90aW1lID09IDApCisJCWNoYXJfdGltZSA9IDE7CisJaWYgKHRpbWVvdXQgJiYgdGltZW91dCA8IGNoYXJfdGltZSkKKwkJY2hhcl90aW1lID0gdGltZW91dDsKKwkvKgorCSAqIElmIHRoZSB0cmFuc21pdHRlciBoYXNuJ3QgY2xlYXJlZCBpbiB0d2ljZSB0aGUgYXBwcm94aW1hdGUKKwkgKiBhbW91bnQgb2YgdGltZSB0byBzZW5kIHRoZSBlbnRpcmUgRklGTywgaXQgcHJvYmFibHkgd29uJ3QKKwkgKiBldmVyIGNsZWFyLiAgVGhpcyBhc3N1bWVzIHRoZSBVQVJUIGlzbid0IGRvaW5nIGZsb3cKKwkgKiBjb250cm9sLCB3aGljaCBpcyBjdXJyZW50bHkgdGhlIGNhc2UuICBIZW5jZSwgaWYgaXQgZXZlcgorCSAqIHRha2VzIGxvbmdlciB0aGFuIGluZm8tPnRpbWVvdXQsIHRoaXMgaXMgcHJvYmFibHkgZHVlIHRvIGEKKwkgKiBVQVJUIGJ1ZyBvZiBzb21lIGtpbmQuICBTbywgd2UgY2xhbXAgdGhlIHRpbWVvdXQgcGFyYW1ldGVyIGF0CisJICogMippbmZvLT50aW1lb3V0LgorCSAqLworCWlmICghdGltZW91dCB8fCB0aW1lb3V0ID4gMiAqIGluZm8tPnRpbWVvdXQpCisJCXRpbWVvdXQgPSAyICogaW5mby0+dGltZW91dDsKKyNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCisJcHJpbnRrKEtFUk5fREVCVUcgIkluIHJzX3dhaXRfdW50aWxfc2VudCglZCkgY2hlY2s9JWx1Li4uIiwgdGltZW91dCwgY2hhcl90aW1lKTsKKwlwcmludGsoImppZmY9JWx1Li4uIiwgamlmZmllcyk7CisjZW5kaWYKKwl3aGlsZSAoISgobHNyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikpICYgVUFSVF9MU1JfVEVNVCkpIHsKKyNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCisJCXByaW50aygibHNyID0gJWQgKGppZmY9JWx1KS4uLiIsIGxzciwgamlmZmllcyk7CisjZW5kaWYKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjaGFyX3RpbWUpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCWJyZWFrOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisjaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAorCXByaW50aygibHNyID0gJWQgKGppZmY9JWx1KS4uLmRvbmVcbiIsIGxzciwgamlmZmllcyk7CisjZW5kaWYKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KKyAqLwordm9pZCBteHNlcl9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCW14c2VyX2ZsdXNoX2J1ZmZlcih0dHkpOworCW14c2VyX3NodXRkb3duKGluZm8pOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT5jb3VudCA9IDA7CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKworLy8gYWRkZWQgYnkgSmFtZXMgMDMtMTItMjAwNC4KKy8qCisgKiBteHNlcl9yc19icmVhaygpIC0tLSByb3V0aW5lIHdoaWNoIHR1cm5zIHRoZSBicmVhayBoYW5kbGluZyBvbiBvciBvZmYKKyAqLworc3RhdGljIHZvaWQgbXhzZXJfcnNfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgfCBVQVJUX0xDUl9TQkMsIGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CisJZWxzZQorCQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCisvLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzZXJpYWwgZHJpdmVyJ3MgZ2VuZXJpYyBpbnRlcnJ1cHQgcm91dGluZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbXhzZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHN0YXR1cywgaWlyLCBpOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm87CisJc3RydWN0IG14c2VyX3N0cnVjdCAqcG9ydDsKKwlpbnQgbWF4LCBpcnFiaXRzLCBiaXRzLCBtc3I7CisJaW50IHBhc3NfY291bnRlciA9IDA7CisJaW50IGhhbmRsZWQgPSBJUlFfTk9ORTsKKworCXBvcnQgPSBOVUxMOworCS8vc3Bpbl9sb2NrKCZnbV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgeworCQlpZiAoZGV2X2lkID09ICYobXh2YXJfdGFibGVbaSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRF0pKSB7CisJCQlwb3J0ID0gZGV2X2lkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBNWFNFUl9CT0FSRFMpIHsKKwkJZ290byBpcnFfc3RvcDsKKwl9CisJaWYgKHBvcnQgPT0gMCkgeworCQlnb3RvIGlycV9zdG9wOworCX0KKwltYXggPSBteHNlcl9udW1wb3J0c1tteHNlcmNmZ1tpXS5ib2FyZF90eXBlIC0gMV07CisJd2hpbGUgKDEpIHsKKwkJaXJxYml0cyA9IGluYihwb3J0LT52ZWN0b3IpICYgcG9ydC0+dmVjdG9ybWFzazsKKwkJaWYgKGlycWJpdHMgPT0gcG9ydC0+dmVjdG9ybWFzaykgeworCQkJYnJlYWs7CisJCX0KKworCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisJCWZvciAoaSA9IDAsIGJpdHMgPSAxOyBpIDwgbWF4OyBpKyssIGlycWJpdHMgfD0gYml0cywgYml0cyA8PD0gMSkgeworCQkJaWYgKGlycWJpdHMgPT0gcG9ydC0+dmVjdG9ybWFzaykgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGJpdHMgJiBpcnFiaXRzKQorCQkJCWNvbnRpbnVlOworCQkJaW5mbyA9IHBvcnQgKyBpOworCisJCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJaWlyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUik7CisJCQlpZiAoaWlyICYgVUFSVF9JSVJfTk9fSU5UKQorCQkJCWNvbnRpbnVlOworCQkJaWlyICY9IE1PWEFfTVVTVF9JSVJfTUFTSzsKKwkJCWlmICghaW5mby0+dHR5KSB7CisJCQkJc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUik7CisJCQkJb3V0YigweDI3LCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCQkJCWluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJLyoKKwkJCSAgIGlmICggaW5mby0+dHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRS80ICl7CisJCQkgICBpbmZvLT5JRVIgfD0gTU9YQV9NVVNUX1JFQ1ZfSVNSOworCQkJICAgb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQkgICB9CisJCQkgKi8KKworCisJCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJICAgaWYgKCAhaW5mby0+dHR5IHx8CisJCQkgICAoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUikgJiBVQVJUX0lJUl9OT19JTlQpICkKKwkJCSAgIGNvbnRpbnVlOworCQkJICovCisJCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkJICAgc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOworCQkJICovCisKKwkJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQlzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKworCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1BFKSB7CisJCQkJaW5mby0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9QQVJJVFk7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRkUpIHsKKwkJCQlpbmZvLT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX0ZSQU1JTkc7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfT0UpIHsKKwkJCQlpbmZvLT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX0hXX09WRVJSVU47CisJCQl9CisJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfQkkpCisJCQkJaW5mby0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9CUkVBSzsKKworCQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJCS8qCisJCQkJICAgaWYgKCAoc3RhdHVzICYgMHgwMikgJiYgIShzdGF0dXMgJiAweDAxKSApIHsKKwkJCQkgICBvdXRiKGluZm8tPmJhc2UrVUFSVF9GQ1IsICAweDIzKTsKKwkJCQkgICBjb250aW51ZTsKKwkJCQkgICB9CisJCQkJICovCisJCQkJaWYgKGlpciA9PSBNT1hBX01VU1RfSUlSX0dEQSB8fCBpaXIgPT0gTU9YQV9NVVNUX0lJUl9SREEgfHwgaWlyID09IE1PWEFfTVVTVF9JSVJfUlRPIHx8IGlpciA9PSBNT1hBX01VU1RfSUlSX0xTUikKKwkJCQkJbXhzZXJfcmVjZWl2ZV9jaGFycyhpbmZvLCAmc3RhdHVzKTsKKworCQkJfSBlbHNlIHsKKwkJCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisKKwkJCQlzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRFIpCisJCQkJCW14c2VyX3JlY2VpdmVfY2hhcnMoaW5mbywgJnN0YXR1cyk7CisJCQl9CisJCQltc3IgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTVNSKTsKKwkJCWlmIChtc3IgJiBVQVJUX01TUl9BTllfREVMVEEpIHsKKwkJCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgbXNyKTsKKwkJCX0KKwkJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyCisJCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCQkJaWYgKChpaXIgPT0gMHgwMikgJiYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpKSB7CisJCQkJCW14c2VyX3RyYW5zbWl0X2NoYXJzKGluZm8pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpIHsKKy8qIDgtMi05OSBieSBXaWxsaWFtCisJCQkgICAgaWYgKCBpbmZvLT54X2NoYXIgfHwgKGluZm8tPnhtaXRfY250ID4gMCkgKQorKi8KKwkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnMoaW5mbyk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChwYXNzX2NvdW50ZXIrKyA+IE1YU0VSX0lTUl9QQVNTX0xJTUlUKSB7CisJCQlicmVhazsJLyogUHJldmVudCBpbmZpbml0ZSBsb29wcyAqLworCQl9CisJfQorCisgICAgICBpcnFfc3RvcDoKKwkvL3NwaW5fdW5sb2NrKCZnbV9sb2NrKTsKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBpbnQgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCXVuc2lnbmVkIGNoYXIgY2gsIGdkbDsKKwlpbnQgaWdub3JlZCA9IDA7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgY2hhciAqY3A7CisJY2hhciAqZnA7CisJaW50IGNvdW50OworCWludCByZWN2X3Jvb207CisJaW50IG1heCA9IDI1NjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlyZWN2X3Jvb20gPSB0dHktPmxkaXNjLnJlY2VpdmVfcm9vbSh0dHkpOworCWlmICgocmVjdl9yb29tID09IDApICYmICghaW5mby0+bGRpc2Nfc3RvcF9yeCkpIHsKKwkJLy9teHNlcl90aHJvdHRsZSh0dHkpOworCQlteHNlcl9zdG9wcngodHR5KTsKKwkJLy9yZXR1cm47CisJfQorCisJY3AgPSB0dHktPmZsaXAuY2hhcl9idWY7CisJZnAgPSB0dHktPmZsaXAuZmxhZ19idWY7CisJY291bnQgPSAwOworCisJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnICE9IE1PWEFfT1RIRVJfVUFSVCkgeworCisJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfU1BFQ0lBTCkgeworCQkJZ290byBpbnRyX29sZDsKKwkJfQorCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDItMTEtMjAwNAorCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID09IE1PWEFfTVVTVF9NVTg2MF9IV0lEICYmICgqc3RhdHVzICYgTU9YQV9NVVNUX0xTUl9SRVJSKSkKKwkJCWdvdG8gaW50cl9vbGQ7CisJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDAyLTE0LTIwMDQKKwkJaWYgKCpzdGF0dXMgJiBNT1hBX01VU1RfTFNSX1JFUlIpCisJCQlnb3RvIGludHJfb2xkOworCisJCWdkbCA9IGluYihpbmZvLT5iYXNlICsgTU9YQV9NVVNUX0dETF9SRUdJU1RFUik7CisKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9PSBNT1hBX01VU1RfTVUxNTBfSFdJRCkJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDItMTEtMjAwNAorCQkJZ2RsICY9IE1PWEFfTVVTVF9HRExfTUFTSzsKKwkJaWYgKGdkbCA+PSByZWN2X3Jvb20pIHsKKwkJCWlmICghaW5mby0+bGRpc2Nfc3RvcF9yeCkgeworCQkJCS8vbXhzZXJfdGhyb3R0bGUodHR5KTsKKwkJCQlteHNlcl9zdG9wcngodHR5KTsKKwkJCX0KKwkJCS8vcmV0dXJuOworCQl9CisJCXdoaWxlIChnZGwtLSkgeworCQkJY2ggPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfUlgpOworCQkJY291bnQrKzsKKwkJCSpjcCsrID0gY2g7CisJCQkqZnArKyA9IDA7CisJCQljbnQrKzsKKwkJCS8qCisJCQkgICBpZigoY291bnQ+PUhJX1dBVEVSKSAmJiAoaW5mby0+c3RvcF9yeD09MCkpeworCQkJICAgbXhzZXJfc3RvcHJ4KHR0eSk7CisJCQkgICBpbmZvLT5zdG9wX3J4PTE7CisJCQkgICBicmVhazsKKwkJCSAgIH0gKi8KKwkJfQorCQlnb3RvIGVuZF9pbnRyOworCX0KK2ludHJfb2xkOgorCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCWRvIHsKKwkJaWYgKG1heC0tIDwgMCkKKwkJCWJyZWFrOworCQkvKgorCQkgICBpZigoY291bnQ+PUhJX1dBVEVSKSAmJiAoaW5mby0+c3RvcF9yeD09MCkpeworCQkgICBteHNlcl9zdG9wcngodHR5KTsKKwkJICAgaW5mby0+c3RvcF9yeD0xOworCQkgICBicmVhazsKKwkJICAgfQorCQkgKi8KKworCQljaCA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9SWCk7CisJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgJiYgKCpzdGF0dXMgJiBVQVJUX0xTUl9PRSkgLyomJiAhKCpzdGF0dXMmVUFSVF9MU1JfRFIpICovICkKKwkJCW91dGIoMHgyMywgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwkJKnN0YXR1cyAmPSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOworCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCWlmICgqc3RhdHVzICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKSB7CisJCQlpZiAoKytpZ25vcmVkID4gMTAwKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJY291bnQrKzsKKwkJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfU1BFQ0lBTCkgeworCQkJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfQkkpIHsKKwkJCQkJKmZwKysgPSBUVFlfQlJFQUs7CisvKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCisJCQkJCWluZm8tPmljb3VudC5icmsrKzsKKworLyogKi8KKwkJCQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfU0FLKQorCQkJCQkJZG9fU0FLKHR0eSk7CisJCQkJfSBlbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfUEUpIHsKKwkJCQkJKmZwKysgPSBUVFlfUEFSSVRZOworLyogYWRkZWQgYnkgY2FzcGVyIDEvMTEvMjAwMCAqLworCQkJCQlpbmZvLT5pY291bnQucGFyaXR5Kys7CisvKiAqLworCQkJCX0gZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX0ZFKSB7CisJCQkJCSpmcCsrID0gVFRZX0ZSQU1FOworLyogYWRkZWQgYnkgY2FzcGVyIDEvMTEvMjAwMCAqLworCQkJCQlpbmZvLT5pY291bnQuZnJhbWUrKzsKKy8qICovCisJCQkJfSBlbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfT0UpIHsKKwkJCQkJKmZwKysgPSBUVFlfT1ZFUlJVTjsKKy8qIGFkZGVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KKwkJCQkJaW5mby0+aWNvdW50Lm92ZXJydW4rKzsKKy8qICovCisJCQkJfSBlbHNlCisJCQkJCSpmcCsrID0gMDsKKwkJCX0gZWxzZQorCQkJCSpmcCsrID0gMDsKKwkJCSpjcCsrID0gY2g7CisJCQljbnQrKzsKKwkJCWlmIChjbnQgPj0gcmVjdl9yb29tKSB7CisJCQkJaWYgKCFpbmZvLT5sZGlzY19zdG9wX3J4KSB7CisJCQkJCS8vbXhzZXJfdGhyb3R0bGUodHR5KTsKKwkJCQkJbXhzZXJfc3RvcHJ4KHR0eSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCX0KKworCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQorCQkJYnJlYWs7CisJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkgKnN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpICYgaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKwkJICovCisJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCSpzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKwkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCX0gd2hpbGUgKCpzdGF0dXMgJiBVQVJUX0xTUl9EUik7CisKKyAgICAgIGVuZF9pbnRyOgkJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCisJbXh2YXJfbG9nLnJ4Y250W2luZm8tPnBvcnRdICs9IGNudDsKKwlpbmZvLT5tb25fZGF0YS5yeGNudCArPSBjbnQ7CisJaW5mby0+bW9uX2RhdGEudXBfcnhjbnQgKz0gY250OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfdHJhbnNtaXRfY2hhcnMoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbykKK3sKKwlpbnQgY291bnQsIGNudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+eF9jaGFyKSB7CisJCW91dGIoaW5mby0+eF9jaGFyLCBpbmZvLT5iYXNlICsgVUFSVF9UWCk7CisJCWluZm8tPnhfY2hhciA9IDA7CisJCW14dmFyX2xvZy50eGNudFtpbmZvLT5wb3J0XSsrOworCQlpbmZvLT5tb25fZGF0YS50eGNudCsrOworCQlpbmZvLT5tb25fZGF0YS51cF90eGNudCsrOworCisvKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCisJCWluZm8tPmljb3VudC50eCsrOworLyogKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmZvLT54bWl0X2J1ZiA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKGluZm8tPnhtaXRfY250IDw9IDApIHx8IGluZm8tPnR0eS0+c3RvcHBlZCB8fCAoaW5mby0+dHR5LT5od19zdG9wcGVkICYmIChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpKSB7CisJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwljbnQgPSBpbmZvLT54bWl0X2NudDsKKwljb3VudCA9IGluZm8tPnhtaXRfZmlmb19zaXplOworCWRvIHsKKwkJb3V0YihpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWwrK10sIGluZm8tPmJhc2UgKyBVQVJUX1RYKTsKKwkJaW5mby0+eG1pdF90YWlsID0gaW5mby0+eG1pdF90YWlsICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJaWYgKC0taW5mby0+eG1pdF9jbnQgPD0gMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKKwlteHZhcl9sb2cudHhjbnRbaW5mby0+cG9ydF0gKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKKworLy8gYWRkZWQgYnkgSmFtZXMgMDMtMTItMjAwNC4KKwlpbmZvLT5tb25fZGF0YS50eGNudCArPSAoY250IC0gaW5mby0+eG1pdF9jbnQpOworCWluZm8tPm1vbl9kYXRhLnVwX3R4Y250ICs9IChjbnQgLSBpbmZvLT54bWl0X2NudCk7CisvLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorCisvKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCisJaW5mby0+aWNvdW50LnR4ICs9IChjbnQgLSBpbmZvLT54bWl0X2NudCk7CisvKiAqLworCisJaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7CisJCXNldF9iaXQoTVhTRVJfRVZFTlRfVFhMT1csICZpbmZvLT5ldmVudCk7CisJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZSk7CisJfQorCWlmIChpbmZvLT54bWl0X2NudCA8PSAwKSB7CisJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBpbnQgc3RhdHVzKQoreworCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCisJCWluZm8tPmljb3VudC5ybmcrKzsKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKKwkJaW5mby0+aWNvdW50LmRzcisrOworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQorCQlpbmZvLT5pY291bnQuZGNkKys7CisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCisJCWluZm8tPmljb3VudC5jdHMrKzsKKwlpbmZvLT5tb25fZGF0YS5tb2RlbV9zdGF0dXMgPSBzdGF0dXM7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisKKworCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgJiYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpKSB7CisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZSk7CisJfQorCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ1RTX0ZMT1cpIHsKKwkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgeworCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDA7CisKKwkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQkJfQorCQkJCXNldF9iaXQoTVhTRVJfRVZFTlRfVFhMT1csICZpbmZvLT5ldmVudCk7CisJCQkJc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIShzdGF0dXMgJiBVQVJUX01TUl9DVFMpKSB7CisJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBteHNlcl9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IHJldHZhbDsKKwlpbnQgZG9fY2xvY2FsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAorCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KKwkgKi8KKwlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fCAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiBteHNlcl9jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlpbmZvLT5jb3VudC0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJaW5mby0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX01DUikgfCBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmIChkb19jbG9jYWwgfHwgKGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpICYgVUFSVF9NU1JfRENEKSkpCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCWluZm8tPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIChyZXR2YWwpOworCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBteHNlcl9zdGFydHVwKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8pCit7CisKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gKC1FTk9NRU0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlmcmVlX3BhZ2UocGFnZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKCFpbmZvLT5iYXNlIHx8ICFpbmZvLT50eXBlKSB7CisJCWlmIChpbmZvLT50dHkpCisJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQlmcmVlX3BhZ2UocGFnZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChpbmZvLT54bWl0X2J1ZikKKwkJZnJlZV9wYWdlKHBhZ2UpOworCWVsc2UKKwkJaW5mby0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCisJLyoKKwkgKiBDbGVhciB0aGUgRklGTyBidWZmZXJzIGFuZCBkaXNhYmxlIHRoZW0KKwkgKiAodGhleSB3aWxsIGJlIHJlZW5hYmxlZCBpbiBteHNlcl9jaGFuZ2Vfc3BlZWQoKSkKKwkgKi8KKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQorCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwllbHNlCisJCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCB0aGVyZSdzIG5vIHdheSB0aGUgTFNSIGNvdWxkIHN0aWxsIGJlIDB4RkY7CisJICogaWYgaXQgaXMsIHRoZW4gYmFpbCBvdXQsIGJlY2F1c2UgdGhlcmUncyBsaWtlbHkgbm8gVUFSVAorCSAqIGhlcmUuCisJICovCisJaWYgKGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpID09IDB4ZmYpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJCWlmIChpbmZvLT50dHkpCisJCQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwkJCXJldHVybiAoMCk7CisJCX0gZWxzZQorCQkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisKKwkvKgorCSAqIENsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzLgorCSAqLworCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX1JYKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUik7CisJKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCisJLyoKKwkgKiBOb3csIGluaXRpYWxpemUgdGhlIFVBUlQKKwkgKi8KKwlvdXRiKFVBUlRfTENSX1dMRU44LCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOwkvKiByZXNldCBETEFCICovCisJaW5mby0+TUNSID0gVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTOworCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgaW50ZXJydXB0cworCSAqLworCWluZm8tPklFUiA9IFVBUlRfSUVSX01TSSB8IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisvLyAgICAgIGluZm8tPklFUiA9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisKKwkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgorCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCisJCWluZm8tPklFUiB8PSBNT1hBX01VU1RfSUVSX0VHREFJOworCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKworCS8qCisJICogQW5kIGNsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGFnYWluIGZvciBsdWNrLgorCSAqLworCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX1JYKTsKKwkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUik7CisJKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCisJaWYgKGluZm8tPnR0eSkKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKworCS8qCisJICogYW5kIHNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0CisJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CisKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBtYXliZSBkaXNhYmxlZCwgYW5kCisgKiBEVFIgaXMgZHJvcHBlZCBpZiB0aGUgaGFuZ3VwIG9uIGNsb3NlIHRlcm1pbyBmbGFnIGlzIG9uLgorICovCitzdGF0aWMgdm9pZCBteHNlcl9zaHV0ZG93bihzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIGNsZWFyIGRlbHRhX21zcl93YWl0IHF1ZXVlIHRvIGF2b2lkIG1lbSBsZWFrczogd2UgbWF5IGZyZWUgdGhlIGlycQorCSAqIGhlcmUgc28gdGhlIHF1ZXVlIG1pZ2h0IG5ldmVyIGJlIHdha2VuIHVwCisJICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkvKgorCSAqIEZyZWUgdGhlIElSUSwgaWYgbmVjZXNzYXJ5CisJICovCisJaWYgKGluZm8tPnhtaXRfYnVmKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5mby0+eG1pdF9idWYpOworCQlpbmZvLT54bWl0X2J1ZiA9IE5VTEw7CisJfQorCisJaW5mby0+SUVSID0gMDsKKwlvdXRiKDB4MDAsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKQorCQlpbmZvLT5NQ1IgJj0gfihVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOworCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCisJLyogY2xlYXIgUngvVHggRklGTydzICovCisJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQorCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwllbHNlCisJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCisJLyogcmVhZCBkYXRhIHBvcnQgdG8gcmVzZXQgdGhpbmdzICovCisJKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9SWCk7CisKKwlpZiAoaW5mby0+dHR5KQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCisJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTIzLTIwMDIKKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJCVNFVF9NT1hBX01VU1RfTk9fU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCX0KKwkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0yMy0yMDAyCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIFVBUlQgZGl2aXNvciByZWdpc3RlcnMgdG8gbWF0Y2gKKyAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgorICovCitzdGF0aWMgaW50IG14c2VyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJdW5zaWduZWQgY2ZsYWcsIGN2YWwsIGZjcjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwlsb25nIGJhdWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuIHJldDsKKwljZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwlpZiAoIShpbmZvLT5iYXNlKSkKKwkJcmV0dXJuIHJldDsKKworCisjaWZuZGVmIEI5MjE2MDAKKyNkZWZpbmUgQjkyMTYwMCAoQjQ2MDgwMCArMSkKKyNlbmRpZgorCWlmIChteHNlcl9zZXRfYmF1ZF9tZXRob2RbaW5mby0+cG9ydF0gPT0gMCkgeworCQlzd2l0Y2ggKGNmbGFnICYgKENCQVVEIHwgQ0JBVURFWCkpIHsKKwkJY2FzZSBCOTIxNjAwOgorCQkJYmF1ZCA9IDkyMTYwMDsKKwkJCWJyZWFrOworCQljYXNlIEI0NjA4MDA6CisJCQliYXVkID0gNDYwODAwOworCQkJYnJlYWs7CisJCWNhc2UgQjIzMDQwMDoKKwkJCWJhdWQgPSAyMzA0MDA7CisJCQlicmVhazsKKwkJY2FzZSBCMTE1MjAwOgorCQkJYmF1ZCA9IDExNTIwMDsKKwkJCWJyZWFrOworCQljYXNlIEI1NzYwMDoKKwkJCWJhdWQgPSA1NzYwMDsKKwkJCWJyZWFrOworCQljYXNlIEIzODQwMDoKKwkJCWJhdWQgPSAzODQwMDsKKwkJCWJyZWFrOworCQljYXNlIEIxOTIwMDoKKwkJCWJhdWQgPSAxOTIwMDsKKwkJCWJyZWFrOworCQljYXNlIEI5NjAwOgorCQkJYmF1ZCA9IDk2MDA7CisJCQlicmVhazsKKwkJY2FzZSBCNDgwMDoKKwkJCWJhdWQgPSA0ODAwOworCQkJYnJlYWs7CisJCWNhc2UgQjI0MDA6CisJCQliYXVkID0gMjQwMDsKKwkJCWJyZWFrOworCQljYXNlIEIxODAwOgorCQkJYmF1ZCA9IDE4MDA7CisJCQlicmVhazsKKwkJY2FzZSBCMTIwMDoKKwkJCWJhdWQgPSAxMjAwOworCQkJYnJlYWs7CisJCWNhc2UgQjYwMDoKKwkJCWJhdWQgPSA2MDA7CisJCQlicmVhazsKKwkJY2FzZSBCMzAwOgorCQkJYmF1ZCA9IDMwMDsKKwkJCWJyZWFrOworCQljYXNlIEIyMDA6CisJCQliYXVkID0gMjAwOworCQkJYnJlYWs7CisJCWNhc2UgQjE1MDoKKwkJCWJhdWQgPSAxNTA7CisJCQlicmVhazsKKwkJY2FzZSBCMTM0OgorCQkJYmF1ZCA9IDEzNDsKKwkJCWJyZWFrOworCQljYXNlIEIxMTA6CisJCQliYXVkID0gMTEwOworCQkJYnJlYWs7CisJCWNhc2UgQjc1OgorCQkJYmF1ZCA9IDc1OworCQkJYnJlYWs7CisJCWNhc2UgQjUwOgorCQkJYmF1ZCA9IDUwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYXVkID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW14c2VyX3NldF9iYXVkKGluZm8sIGJhdWQpOworCX0KKworCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCWN2YWwgPSAweDAwOworCQlicmVhazsKKwljYXNlIENTNjoKKwkJY3ZhbCA9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgQ1M3OgorCQljdmFsID0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSBDUzg6CisJCWN2YWwgPSAweDAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljdmFsID0gMHgwMDsKKwkJYnJlYWs7CQkvKiB0b28ga2VlcCBHQ0Mgc2h1dC4uLiAqLworCX0KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpCisJCWN2YWwgfD0gMHgwNDsKKwlpZiAoY2ZsYWcgJiBQQVJFTkIpCisJCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOworCWlmICghKGNmbGFnICYgUEFST0REKSkgeworCQljdmFsIHw9IFVBUlRfTENSX0VQQVI7CisJfQorCWlmIChjZmxhZyAmIENNU1BBUikKKwkJY3ZhbCB8PSBVQVJUX0xDUl9TUEFSOworCisJaWYgKChpbmZvLT50eXBlID09IFBPUlRfODI1MCkgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF8xNjQ1MCkpIHsKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk87CisJCQlmY3IgfD0gTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEU7CisJCQlTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbyk7CisJCX0gZWxzZQorCQkJZmNyID0gMDsKKwl9IGVsc2UgeworCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKKwkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQkJZmNyIHw9IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFOworCQkJU0VUX01PWEFfTVVTVF9GSUZPX1ZBTFVFKGluZm8pOworCQl9IGVsc2UgeworCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgorCisJCQlzd2l0Y2ggKGluZm8tPnJ4X3RyaWdnZXIpIHsKKwkJCWNhc2UgMToKKwkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfODsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9NU0k7CisJaW5mby0+TUNSICY9IH5VQVJUX01DUl9BRkU7CisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsKKwkJaWYgKChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0FGRTsKKwkJCS8vc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsKKy8qCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCXN0YXR1cyA9IGluYihiYXNlYWRkciArIFVBUlRfTVNSKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsqLworCQkJLy9teHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCS8vc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsKKworCQkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJCQlzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTVNSKTsKKwkJCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgeworCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJCQkJfQorCQkJCQlzZXRfYml0KE1YU0VSX0VWRU5UX1RYTE9XLCAmaW5mby0+ZXZlbnQpOworCQkJCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICghKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykpIHsKKwkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKKwkJCQkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOworCX0KKwlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwlpZiAoY2ZsYWcgJiBDTE9DQUwpIHsKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCX0gZWxzZSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOworCX0KKwlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKworCS8qCisJICogU2V0IHVwIHBhcml0eSBjaGVjayBmbGFnCisJICovCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX0RSOworCWlmIChJX0lOUENLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9QRTsKKwlpZiAoSV9CUktJTlQoaW5mby0+dHR5KSB8fCBJX1BBUk1SSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCisJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKKworCWlmIChJX0lHTkJSSyhpbmZvLT50dHkpKSB7CisJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKKwkJLyoKKwkJICogSWYgd2UncmUgaWdub3JlIHBhcml0eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywgaWdub3JlCisJCSAqIG92ZXJydW5zIHRvby4gIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkgeworCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfUEUgfCBVQVJUX0xTUl9GRTsKKwkJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOworCQl9CisJfQorCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGluZm8tPmJhc2UsIFNUQVJUX0NIQVIoaW5mby0+dHR5KSk7CisJCVNFVF9NT1hBX01VU1RfWE9GRjFfVkFMVUUoaW5mby0+YmFzZSwgU1RPUF9DSEFSKGluZm8tPnR0eSkpOworCQlpZiAoSV9JWE9OKGluZm8tPnR0eSkpIHsKKwkJCUVOQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQl9IGVsc2UgeworCQkJRElTQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQl9CisJCWlmIChJX0lYT0ZGKGluZm8tPnR0eSkpIHsKKwkJCUVOQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQl9IGVsc2UgeworCQkJRElTQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQl9CisJCS8qCisJCSAgIGlmICggSV9JWEFOWShpbmZvLT50dHkpICkgeworCQkgICBpbmZvLT5NQ1IgfD0gTU9YQV9NVVNUX01DUl9YT05fQU5ZOworCQkgICBFTkFCTEVfTU9YQV9NVVNUX1hPTl9BTllfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOworCQkgICB9IGVsc2UgeworCQkgICBpbmZvLT5NQ1IgJj0gfk1PWEFfTVVTVF9NQ1JfWE9OX0FOWTsKKwkJICAgRElTQUJMRV9NT1hBX01VU1RfWE9OX0FOWV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7CisJCSAgIH0KKwkJICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJfQorCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKworCisJb3V0YihmY3IsIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CS8qIHNldCBmY3IgKi8KKwlvdXRiKGN2YWwsIGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X2JhdWQoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgbG9uZyBuZXdzcGQpCit7CisJaW50IHF1b3QgPSAwOworCXVuc2lnbmVkIGNoYXIgY3ZhbDsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuIHJldDsKKworCWlmICghKGluZm8tPmJhc2UpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5ld3NwZCA+IGluZm8tPk1heENhblNldEJhdWRSYXRlKQorCQlyZXR1cm4gMDsKKworCWluZm8tPnJlYWxiYXVkID0gbmV3c3BkOworCWlmIChuZXdzcGQgPT0gMTM0KSB7CisJCXF1b3QgPSAoMiAqIGluZm8tPmJhdWRfYmFzZSAvIDI2OSk7CisJfSBlbHNlIGlmIChuZXdzcGQpIHsKKwkJcXVvdCA9IGluZm8tPmJhdWRfYmFzZSAvIG5ld3NwZDsKKworCQlpZiAocXVvdCA9PSAwKQorCQkJcXVvdCA9IDE7CisKKwl9IGVsc2UgeworCQlxdW90ID0gMDsKKwl9CisKKwlpbmZvLT50aW1lb3V0ID0gKChpbmZvLT54bWl0X2ZpZm9fc2l6ZSAqIEhaICogMTAgKiBxdW90KSAvIGluZm8tPmJhdWRfYmFzZSk7CisJaW5mby0+dGltZW91dCArPSBIWiAvIDUwOwkvKiBBZGQgLjAyIHNlY29uZHMgb2Ygc2xvcCAqLworCisJaWYgKHF1b3QpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9EVFI7CisJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX0RUUjsKKwkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiByZXQ7CisJfQorCisJY3ZhbCA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOworCisJb3V0YihjdmFsIHwgVUFSVF9MQ1JfRExBQiwgaW5mby0+YmFzZSArIFVBUlRfTENSKTsJLyogc2V0IERMQUIgKi8KKworCW91dGIocXVvdCAmIDB4ZmYsIGluZm8tPmJhc2UgKyBVQVJUX0RMTCk7CS8qIExTIG9mIGRpdmlzb3IgKi8KKwlvdXRiKHF1b3QgPj4gOCwgaW5mby0+YmFzZSArIFVBUlRfRExNKTsJLyogTVMgb2YgZGl2aXNvciAqLworCW91dGIoY3ZhbCwgaW5mby0+YmFzZSArIFVBUlRfTENSKTsJLyogcmVzZXQgRExBQiAqLworCisKKwlyZXR1cm4gcmV0OworfQorCisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZnJpZW5kcyBvZiBteHNlcl9pb2N0bCgpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBteHNlcl9nZXRfc2VyaWFsX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKworCWlmICghcmV0aW5mbykKKwkJcmV0dXJuICgtRUZBVUxUKTsKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCXRtcC50eXBlID0gaW5mby0+dHlwZTsKKwl0bXAubGluZSA9IGluZm8tPnBvcnQ7CisJdG1wLnBvcnQgPSBpbmZvLT5iYXNlOworCXRtcC5pcnEgPSBpbmZvLT5pcnE7CisJdG1wLmZsYWdzID0gaW5mby0+ZmxhZ3M7CisJdG1wLmJhdWRfYmFzZSA9IGluZm8tPmJhdWRfYmFzZTsKKwl0bXAuY2xvc2VfZGVsYXkgPSBpbmZvLT5jbG9zZV9kZWxheTsKKwl0bXAuY2xvc2luZ193YWl0ID0gaW5mby0+Y2xvc2luZ193YWl0OworCXRtcC5jdXN0b21fZGl2aXNvciA9IGluZm8tPmN1c3RvbV9kaXZpc29yOworCXRtcC5odWI2ID0gMDsKKwlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IG14c2VyX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19pbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CisJdW5zaWduZWQgaW50IGZsYWdzOworCWludCByZXR2YWwgPSAwOworCisJaWYgKCFuZXdfaW5mbyB8fCAhaW5mby0+YmFzZSkKKwkJcmV0dXJuICgtRUZBVUxUKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld19pbmZvLCBzaXplb2YobmV3X3NlcmlhbCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgobmV3X3NlcmlhbC5pcnEgIT0gaW5mby0+aXJxKSB8fCAobmV3X3NlcmlhbC5wb3J0ICE9IGluZm8tPmJhc2UpIHx8IChuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yICE9IGluZm8tPmN1c3RvbV9kaXZpc29yKSB8fCAobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSkKKwkJcmV0dXJuICgtRVBFUk0pOworCisJZmxhZ3MgPSBpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSB8fCAobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwgKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPSAoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJCXJldHVybiAoLUVQRVJNKTsKKwkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8IChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCisJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KKwkJICovCisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfCAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaIC8gMTAwOworCQlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisJCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAwOwkvLyhpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOworCX0KKworCS8qIGFkZGVkIGJ5IGNhc3BlciwgMy8xNy8yMDAwLCBmb3IgbW91c2UgKi8KKwlpbmZvLT50eXBlID0gbmV3X3NlcmlhbC50eXBlOworCisJcHJvY2Vzc190eHJ4X2ZpZm8oaW5mbyk7CisKKwkvKiAqLworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWlmIChmbGFncyAhPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHsKKwkJCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBOVUxMKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAoaW5mbyk7CisJfQorCXJldHVybiAocmV0dmFsKTsKK30KKworLyoKKyAqIG14c2VyX2dldF9sc3JfaW5mbyAtIGdldCBsaW5lIHN0YXR1cyByZWdpc3RlciBpbmZvCisgKgorICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCgpIHRvIGdldCBpbmZvIHdoZW4gdGhlIFVBUlQgcGh5c2ljYWxseQorICoJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKKyAqCSAgICByZWxlYXNlIHRoZSBidXMgYWZ0ZXIgdHJhbnNtaXR0aW5nLiBUaGlzIG11c3QgYmUgZG9uZSB3aGVuCisgKgkgICAgdGhlIHRyYW5zbWl0IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5LCBub3QgYmUgZG9uZSB3aGVuIHRoZQorICoJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKKyAqCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4KKyAqLworc3RhdGljIGludCBteHNlcl9nZXRfbHNyX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSAoKHN0YXR1cyAmIFVBUlRfTFNSX1RFTVQpID8gVElPQ1NFUl9URU1UIDogMCk7CisJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHNlbmRzIGEgYnJlYWsgY2hhcmFjdGVyIG91dCB0aGUgc2VyaWFsIHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX3NlbmRfYnJlYWsoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgaW50IGR1cmF0aW9uKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWluZm8tPmJhc2UpCisJCXJldHVybjsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgfCBVQVJUX0xDUl9TQkMsIGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlzY2hlZHVsZV90aW1lb3V0KGR1cmF0aW9uKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG14c2VyX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGNoYXIgY29udHJvbCwgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWlmICh0dHktPmluZGV4ID09IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gKC1FTk9JT0NUTENNRCk7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4gKC1FSU8pOworCisJY29udHJvbCA9IGluZm8tPk1DUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9BTllfREVMVEEpCisJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuICgoY29udHJvbCAmIFVBUlRfTUNSX1JUUykgPyBUSU9DTV9SVFMgOiAwKSB8CisJICAgICgoY29udHJvbCAmIFVBUlRfTUNSX0RUUikgPyBUSU9DTV9EVFIgOiAwKSB8ICgoc3RhdHVzICYgVUFSVF9NU1JfRENEKSA/IFRJT0NNX0NBUiA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9SSSkgPyBUSU9DTV9STkcgOiAwKSB8ICgoc3RhdHVzICYgVUFSVF9NU1JfRFNSKSA/IFRJT0NNX0RTUiA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlpZiAodHR5LT5pbmRleCA9PSBNWFNFUl9QT1JUUykKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybiAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9EVFI7CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9EVFI7CisKKwlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbXhzZXJfcmVhZF9yZWdpc3RlcihpbnQsIHVuc2lnbmVkIHNob3J0ICopOworc3RhdGljIGludCBteHNlcl9wcm9ncmFtX21vZGUoaW50KTsKK3N0YXRpYyB2b2lkIG14c2VyX25vcm1hbF9tb2RlKGludCk7CisKK3N0YXRpYyBpbnQgbXhzZXJfZ2V0X0lTQV9jb25mKGludCBjYXAsIHN0cnVjdCBteHNlcl9od2NvbmYgKmh3Y29uZikKK3sKKwlpbnQgaWQsIGksIGJpdHM7CisJdW5zaWduZWQgc2hvcnQgcmVnc1sxNl0sIGlycTsKKwl1bnNpZ25lZCBjaGFyIHNjcmF0Y2gsIHNjcmF0Y2gyOworCisJaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcgPSBNT1hBX09USEVSX1VBUlQ7CisKKwlpZCA9IG14c2VyX3JlYWRfcmVnaXN0ZXIoY2FwLCByZWdzKTsKKwlpZiAoaWQgPT0gQzE2OF9BU0lDX0lEKSB7CisJCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0MxNjhfSVNBOworCQlod2NvbmYtPnBvcnRzID0gODsKKwl9IGVsc2UgaWYgKGlkID09IEMxMDRfQVNJQ19JRCkgeworCQlod2NvbmYtPmJvYXJkX3R5cGUgPSBNWFNFUl9CT0FSRF9DMTA0X0lTQTsKKwkJaHdjb25mLT5wb3J0cyA9IDQ7CisJfSBlbHNlIGlmIChpZCA9PSBDMTAyX0FTSUNfSUQpIHsKKwkJaHdjb25mLT5ib2FyZF90eXBlID0gTVhTRVJfQk9BUkRfQzEwMl9JU0E7CisJCWh3Y29uZi0+cG9ydHMgPSAyOworCX0gZWxzZSBpZiAoaWQgPT0gQ0kxMzJfQVNJQ19JRCkgeworCQlod2NvbmYtPmJvYXJkX3R5cGUgPSBNWFNFUl9CT0FSRF9DSTEzMjsKKwkJaHdjb25mLT5wb3J0cyA9IDI7CisJfSBlbHNlIGlmIChpZCA9PSBDSTEzNF9BU0lDX0lEKSB7CisJCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0NJMTM0OworCQlod2NvbmYtPnBvcnRzID0gNDsKKwl9IGVsc2UgaWYgKGlkID09IENJMTA0Sl9BU0lDX0lEKSB7CisJCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0NJMTA0SjsKKwkJaHdjb25mLT5wb3J0cyA9IDQ7CisJfSBlbHNlCisJCXJldHVybiAoMCk7CisKKwlpcnEgPSAwOworCWlmIChod2NvbmYtPnBvcnRzID09IDIpIHsKKwkJaXJxID0gcmVnc1s5XSAmIDB4RjAwMDsKKwkJaXJxID0gaXJxIHwgKGlycSA+PiA0KTsKKwkJaWYgKGlycSAhPSAocmVnc1s5XSAmIDB4RkYwMCkpCisJCQlyZXR1cm4gKE1YU0VSX0VSUl9JUlFfQ09ORkxJVCk7CisJfSBlbHNlIGlmIChod2NvbmYtPnBvcnRzID09IDQpIHsKKwkJaXJxID0gcmVnc1s5XSAmIDB4RjAwMDsKKwkJaXJxID0gaXJxIHwgKGlycSA+PiA0KTsKKwkJaXJxID0gaXJxIHwgKGlycSA+PiA4KTsKKwkJaWYgKGlycSAhPSByZWdzWzldKQorCQkJcmV0dXJuIChNWFNFUl9FUlJfSVJRX0NPTkZMSVQpOworCX0gZWxzZSBpZiAoaHdjb25mLT5wb3J0cyA9PSA4KSB7CisJCWlycSA9IHJlZ3NbOV0gJiAweEYwMDA7CisJCWlycSA9IGlycSB8IChpcnEgPj4gNCk7CisJCWlycSA9IGlycSB8IChpcnEgPj4gOCk7CisJCWlmICgoaXJxICE9IHJlZ3NbOV0pIHx8IChpcnEgIT0gcmVnc1sxMF0pKQorCQkJcmV0dXJuIChNWFNFUl9FUlJfSVJRX0NPTkZMSVQpOworCX0KKworCWlmICghaXJxKSB7CisJCXJldHVybiAoTVhTRVJfRVJSX0lSUSk7CisJfQorCWh3Y29uZi0+aXJxID0gKChpbnQpIChpcnEgJiAweEYwMDApID4+IDEyKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlod2NvbmYtPmlvYWRkcltpXSA9IChpbnQpIHJlZ3NbaSArIDFdICYgMHhGRkY4OworCWlmICgocmVnc1sxMl0gJiAweDgwKSA9PSAwKSB7CisJCXJldHVybiAoTVhTRVJfRVJSX1ZFQ1RPUik7CisJfQorCWh3Y29uZi0+dmVjdG9yID0gKGludCkgcmVnc1sxMV07CS8qIGludGVycnVwdCB2ZWN0b3IgKi8KKwlpZiAoaWQgPT0gMSkKKwkJaHdjb25mLT52ZWN0b3JfbWFzayA9IDB4MDBGRjsKKwllbHNlCisJCWh3Y29uZi0+dmVjdG9yX21hc2sgPSAweDAwMEY7CisJZm9yIChpID0gNywgYml0cyA9IDB4MDEwMDsgaSA+PSAwOyBpLS0sIGJpdHMgPDw9IDEpIHsKKwkJaWYgKHJlZ3NbMTJdICYgYml0cykgeworCQkJaHdjb25mLT5iYXVkX2Jhc2VbaV0gPSA5MjE2MDA7CisJCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gOTIxNjAwOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyCisJCX0gZWxzZSB7CisJCQlod2NvbmYtPmJhdWRfYmFzZVtpXSA9IDExNTIwMDsKKwkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSAxMTUyMDA7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIKKwkJfQorCX0KKwlzY3JhdGNoMiA9IGluYihjYXAgKyBVQVJUX0xDUikgJiAoflVBUlRfTENSX0RMQUIpOworCW91dGIoc2NyYXRjaDIgfCBVQVJUX0xDUl9ETEFCLCBjYXAgKyBVQVJUX0xDUik7CisJb3V0YigwLCBjYXAgKyBVQVJUX0VGUik7CS8qIEVGUiBpcyB0aGUgc2FtZSBhcyBGQ1IgKi8KKwlvdXRiKHNjcmF0Y2gyLCBjYXAgKyBVQVJUX0xDUik7CisJb3V0YihVQVJUX0ZDUl9FTkFCTEVfRklGTywgY2FwICsgVUFSVF9GQ1IpOworCXNjcmF0Y2ggPSBpbmIoY2FwICsgVUFSVF9JSVIpOworCisJaWYgKHNjcmF0Y2ggJiAweEMwKQorCQlod2NvbmYtPnVhcnRfdHlwZSA9IFBPUlRfMTY1NTBBOworCWVsc2UKKwkJaHdjb25mLT51YXJ0X3R5cGUgPSBQT1JUXzE2NDUwOworCWlmIChpZCA9PSAxKQorCQlod2NvbmYtPnBvcnRzID0gODsKKwllbHNlCisJCWh3Y29uZi0+cG9ydHMgPSA0OworCXJlcXVlc3RfcmVnaW9uKGh3Y29uZi0+aW9hZGRyWzBdLCA4ICogaHdjb25mLT5wb3J0cywgIm14c2VyKElPKSIpOworCXJlcXVlc3RfcmVnaW9uKGh3Y29uZi0+dmVjdG9yLCAxLCAibXhzZXIodmVjdG9yKSIpOworCXJldHVybiAoaHdjb25mLT5wb3J0cyk7Cit9CisKKyNkZWZpbmUgQ0hJUF9TSyAJMHgwMQkvKiBTZXJpYWwgRGF0YSBDbG9jayAgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9ETyAJMHgwMgkvKiBTZXJpYWwgRGF0YSBPdXRwdXQgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9DUyAJMHgwNAkvKiBTZXJpYWwgQ2hpcCBTZWxlY3QgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9ESSAJMHgwOAkvKiBTZXJpYWwgRGF0YSBJbnB1dCAgaW4gRXByb20gKi8KKyNkZWZpbmUgRU5fQ0NNRCAJMHgwMDAJLyogQ2hpcCdzIGNvbW1hbmQgcmVnaXN0ZXIgICAgICovCisjZGVmaW5lIEVOMF9SU0FSTE8JMHgwMDgJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDAgICovCisjZGVmaW5lIEVOMF9SU0FSSEkJMHgwMDkJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDEgICovCisjZGVmaW5lIEVOMF9SQ05UTE8JMHgwMEEJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCisjZGVmaW5lIEVOMF9SQ05USEkJMHgwMEIJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCisjZGVmaW5lIEVOMF9EQ0ZHCTB4MDBFCS8qIERhdGEgY29uZmlndXJhdGlvbiByZWcgV1IgICAqLworI2RlZmluZSBFTjBfUE9SVAkweDAxMAkvKiBSY3YgbWlzc2VkIGZyYW1lIGVycm9yIGNvdW50ZXIgUkQgKi8KKyNkZWZpbmUgRU5DX1BBR0UwCTB4MDAwCS8qIFNlbGVjdCBwYWdlIDAgb2YgY2hpcCByZWdpc3RlcnMgICAqLworI2RlZmluZSBFTkNfUEFHRTMJMHgwQzAJLyogU2VsZWN0IHBhZ2UgMyBvZiBjaGlwIHJlZ2lzdGVycyAgICovCitzdGF0aWMgaW50IG14c2VyX3JlYWRfcmVnaXN0ZXIoaW50IHBvcnQsIHVuc2lnbmVkIHNob3J0ICpyZWdzKQoreworCWludCBpLCBrLCB2YWx1ZSwgaWQ7CisJdW5zaWduZWQgaW50IGo7CisKKwlpZCA9IG14c2VyX3Byb2dyYW1fbW9kZShwb3J0KTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gKGlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykgeworCQlrID0gKGkgJiAweDNGKSB8IDB4MTgwOworCQlmb3IgKGogPSAweDEwMDsgaiA+IDA7IGogPj49IDEpIHsKKwkJCW91dGIoQ0hJUF9DUywgcG9ydCk7CisJCQlpZiAoayAmIGopIHsKKwkJCQlvdXRiKENISVBfQ1MgfCBDSElQX0RPLCBwb3J0KTsKKwkJCQlvdXRiKENISVBfQ1MgfCBDSElQX0RPIHwgQ0hJUF9TSywgcG9ydCk7CS8qIEE/IGJpdCBvZiByZWFkICovCisJCQl9IGVsc2UgeworCQkJCW91dGIoQ0hJUF9DUywgcG9ydCk7CisJCQkJb3V0YihDSElQX0NTIHwgQ0hJUF9TSywgcG9ydCk7CS8qIEE/IGJpdCBvZiByZWFkICovCisJCQl9CisJCX0KKwkJKHZvaWQpIGluYihwb3J0KTsKKwkJdmFsdWUgPSAwOworCQlmb3IgKGsgPSAwLCBqID0gMHg4MDAwOyBrIDwgMTY7IGsrKywgaiA+Pj0gMSkgeworCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKKwkJCW91dGIoQ0hJUF9DUyB8IENISVBfU0ssIHBvcnQpOworCQkJaWYgKGluYihwb3J0KSAmIENISVBfREkpCisJCQkJdmFsdWUgfD0gajsKKwkJfQorCQlyZWdzW2ldID0gdmFsdWU7CisJCW91dGIoMCwgcG9ydCk7CisJfQorCW14c2VyX25vcm1hbF9tb2RlKHBvcnQpOworCXJldHVybiAoaWQpOworfQorCitzdGF0aWMgaW50IG14c2VyX3Byb2dyYW1fbW9kZShpbnQgcG9ydCkKK3sKKwlpbnQgaWQsIGksIGosIG47CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrKCZnbV9sb2NrKTsKKwlvdXRiKDAsIHBvcnQpOworCW91dGIoMCwgcG9ydCk7CisJb3V0YigwLCBwb3J0KTsKKwkodm9pZCkgaW5iKHBvcnQpOworCSh2b2lkKSBpbmIocG9ydCk7CisJb3V0YigwLCBwb3J0KTsKKwkodm9pZCkgaW5iKHBvcnQpOworCS8vcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2soJmdtX2xvY2spOworCisJaWQgPSBpbmIocG9ydCArIDEpICYgMHgxRjsKKwlpZiAoKGlkICE9IEMxNjhfQVNJQ19JRCkgJiYgKGlkICE9IEMxMDRfQVNJQ19JRCkgJiYgKGlkICE9IEMxMDJfQVNJQ19JRCkgJiYgKGlkICE9IENJMTMyX0FTSUNfSUQpICYmIChpZCAhPSBDSTEzNF9BU0lDX0lEKSAmJiAoaWQgIT0gQ0kxMDRKX0FTSUNfSUQpKQorCQlyZXR1cm4gKC0xKTsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDQ7IGkrKykgeworCQluID0gaW5iKHBvcnQgKyAyKTsKKwkJaWYgKG4gPT0gJ00nKSB7CisJCQlqID0gMTsKKwkJfSBlbHNlIGlmICgoaiA9PSAxKSAmJiAobiA9PSAxKSkgeworCQkJaiA9IDI7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlqID0gMDsKKwl9CisJaWYgKGogIT0gMikKKwkJaWQgPSAtMjsKKwlyZXR1cm4gKGlkKTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfbm9ybWFsX21vZGUoaW50IHBvcnQpCit7CisJaW50IGksIG47CisKKwlvdXRiKDB4QTUsIHBvcnQgKyAxKTsKKwlvdXRiKDB4ODAsIHBvcnQgKyAzKTsKKwlvdXRiKDEyLCBwb3J0ICsgMCk7CS8qIDk2MDAgYnBzICovCisJb3V0YigwLCBwb3J0ICsgMSk7CisJb3V0YigweDAzLCBwb3J0ICsgMyk7CS8qIDggZGF0YSBiaXRzICovCisJb3V0YigweDEzLCBwb3J0ICsgNCk7CS8qIGxvb3AgYmFjayBtb2RlICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJbiA9IGluYihwb3J0ICsgNSk7CisJCWlmICgobiAmIDB4NjEpID09IDB4NjApCisJCQlicmVhazsKKwkJaWYgKChuICYgMSkgPT0gMSkKKwkJCSh2b2lkKSBpbmIocG9ydCk7CisJfQorCW91dGIoMHgwMCwgcG9ydCArIDQpOworfQorCittb2R1bGVfaW5pdChteHNlcl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChteHNlcl9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXIuaCBiL2RyaXZlcnMvY2hhci9teHNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmQwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXhzZXIuaApAQCAtMCwwICsxLDQ1MCBAQAorI2lmbmRlZiBfTVhTRVJfSAorI2RlZmluZSBfTVhTRVJfSAorCisvKgorICoJU2VtaS1wdWJsaWMgY29udHJvbCBpbnRlcmZhY2VzCisgKi8KKyAKKy8qCisgKglNT1hBIGlvY3RscworICovCisKKyNkZWZpbmUgTU9YQQkJCTB4NDAwCisjZGVmaW5lIE1PWEFfR0VUREFUQUNPVU5UCShNT1hBICsgMjMpCisjZGVmaW5lCU1PWEFfR0VUX0NPTkYJCShNT1hBICsgMzUpCisjZGVmaW5lIE1PWEFfRElBR05PU0UJCShNT1hBICsgNTApCisjZGVmaW5lIE1PWEFfQ0hLUE9SVEVOQUJMRQkoTU9YQSArIDYwKQorI2RlZmluZSBNT1hBX0hpZ2hTcGVlZE9uCShNT1hBICsgNjEpCisjZGVmaW5lIE1PWEFfR0VUX01BSk9SCQkoTU9YQSArIDYzKQorI2RlZmluZSBNT1hBX0dFVF9DVU1BSk9SCShNT1hBICsgNjQpCisjZGVmaW5lIE1PWEFfR0VUTVNUQVRVUwkJKE1PWEEgKyA2NSkKKyNkZWZpbmUgTU9YQV9TRVRfT1BfTU9ERQkoTU9YQSArIDY2KQorI2RlZmluZSBNT1hBX0dFVF9PUF9NT0RFCShNT1hBICsgNjcpCisKKyNkZWZpbmUgUlMyMzJfTU9ERQkJMAorI2RlZmluZSBSUzQ4NV8yV0lSRV9NT0RFCTEKKyNkZWZpbmUgUlM0MjJfTU9ERQkJMgorI2RlZmluZSBSUzQ4NV80V0lSRV9NT0RFCTMKKyNkZWZpbmUgT1BfTU9ERV9NQVNLCQkzCisvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisKKyNkZWZpbmUgVFRZX1RIUkVTSE9MRF9USFJPVFRMRSAgMTI4CisKKyNkZWZpbmUgTE9fV0FURVIJIAkoVFRZX0ZMSVBCVUZfU0laRSkKKyNkZWZpbmUgSElfV0FURVIJCShUVFlfRkxJUEJVRl9TSVpFKjIqMy80KQorCisvLyBhZGRlZCBieSBKYW1lcy4gMDMtMTEtMjAwNC4KKyNkZWZpbmUgTU9YQV9TRFNfR0VUSUNPVU5URVIgIAkoTU9YQSArIDY4KQorI2RlZmluZSBNT1hBX1NEU19SU1RJQ09VTlRFUiAgCShNT1hBICsgNjkpCisvLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorCisjZGVmaW5lIE1PWEFfQVNQUF9PUVVFVUUgIAkoTU9YQSArIDcwKQorI2RlZmluZSBNT1hBX0FTUFBfU0VUQkFVRCAJKE1PWEEgKyA3MSkKKyNkZWZpbmUgTU9YQV9BU1BQX0dFVEJBVUQgCShNT1hBICsgNzIpCisjZGVmaW5lIE1PWEFfQVNQUF9NT04gICAgIAkoTU9YQSArIDczKQorI2RlZmluZSBNT1hBX0FTUFBfTFNUQVRVUyAJKE1PWEEgKyA3NCkKKyNkZWZpbmUgTU9YQV9BU1BQX01PTl9FWFQgCShNT1hBICsgNzUpCisjZGVmaW5lIE1PWEFfU0VUX0JBVURfTUVUSE9ECShNT1hBICsgNzYpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTlBQSV9OT1RJRllfUEFSSVRZCTB4MDEKKyNkZWZpbmUgTlBQSV9OT1RJRllfRlJBTUlORwkweDAyCisjZGVmaW5lIE5QUElfTk9USUZZX0hXX09WRVJSVU4JMHgwNAorI2RlZmluZSBOUFBJX05PVElGWV9TV19PVkVSUlVOCTB4MDgKKyNkZWZpbmUgTlBQSV9OT1RJRllfQlJFQUsJMHgxMAorCisjZGVmaW5lIE5QUElfTk9USUZZX0NUU0hPTEQgICAgICAgICAweDAxCS8vIFR4IGhvbGQgYnkgQ1RTIGxvdworI2RlZmluZSBOUFBJX05PVElGWV9EU1JIT0xEICAgICAgICAgMHgwMgkvLyBUeCBob2xkIGJ5IERTUiBsb3cKKyNkZWZpbmUgTlBQSV9OT1RJRllfWE9GRkhPTEQgICAgICAgIDB4MDgJLy8gVHggaG9sZCBieSBYb2ZmIHJlY2VpdmVkCisjZGVmaW5lIE5QUElfTk9USUZZX1hPRkZYRU5UICAgICAgICAweDEwCS8vIFhvZmYgU2VudAorCisvL0NoZWNrSXNNb3hhTXVzdCByZXR1cm4gdmFsdWUKKyNkZWZpbmUgTU9YQV9PVEhFUl9VQVJUCQkJMHgwMAorI2RlZmluZSBNT1hBX01VU1RfTVUxNTBfSFdJRAkJMHgwMQorI2RlZmluZSBNT1hBX01VU1RfTVU4NjBfSFdJRAkJMHgwMgorCisvLyBmb2xsb3cganVzdCBmb3IgTW94YSBNdXN0IGNoaXAgZGVmaW5lLgorLy8KKy8vIHdoZW4gTENSIHJlZ2lzdGVyIChvZmZzZXQgMHgwMykgd3JpdGUgZm9sbG93aW5nIHZhbHVlLAorLy8gdGhlIE11c3QgY2hpcCB3aWxsIGVudGVyIGVuY2hhbmNlIG1vZGUuIEFuZCB3cml0ZSB2YWx1ZQorLy8gb24gRUZSIChvZmZzZXQgMHgwMikgYml0IDYsNyB0byBjaGFuZ2UgYmFuay4KKyNkZWZpbmUgTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFCTB4QkYKKworLy8gd2hlbiBlbmhhbmNlIG1vZGUgZW5hYmxlLCBhY2Nlc3Mgb24gZ2VuZXJhbCBiYW5rIHJlZ2lzdGVyCisjZGVmaW5lIE1PWEFfTVVTVF9HRExfUkVHSVNURVIJCTB4MDcKKyNkZWZpbmUgTU9YQV9NVVNUX0dETF9NQVNLCQkweDdGCisjZGVmaW5lIE1PWEFfTVVTVF9HRExfSEFTX0JBRF9EQVRBCTB4ODAKKworI2RlZmluZSBNT1hBX01VU1RfTFNSX1JFUlIJCTB4ODAJLy8gZXJyb3IgaW4gcmVjZWl2ZSBGSUZPCisvLyBlbmNoYW5jZSByZWdpc3RlciBiYW5rIHNlbGVjdCBhbmQgZW5jaGFuY2UgbW9kZSBzZXR0aW5nIHJlZ2lzdGVyCisvLyB3aGVuIExDUiByZWdpc3RlciBlcXVhbCB0byAweEJGCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfUkVHSVNURVIJCTB4MDIKKy8vIGVuY2hhbmNlIG1vZGUgZW5hYmxlCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEUJMHgxMAorLy8gZW5jaGFuY2UgcmVpc3RlciBiYW5rIHNldCAwLCAxLCAyCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzAJCTB4MDAKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LMQkJMHg0MAorI2RlZmluZSBNT1hBX01VU1RfRUZSX0JBTksyCQkweDgwCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzMJCTB4QzAKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LX01BU0sJCTB4QzAKKworLy8gc2V0IFhPTjEgdmFsdWUgcmVnaXN0ZXIsIHdoZW4gTENSPTB4QkYgYW5kIGNoYW5nZSB0byBiYW5rMAorI2RlZmluZSBNT1hBX01VU1RfWE9OMV9SRUdJU1RFUgkJMHgwNAorCisvLyBzZXQgWE9OMiB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT04yX1JFR0lTVEVSCQkweDA1CisKKy8vIHNldCBYT0ZGMSB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT0ZGMV9SRUdJU1RFUgkweDA2CisKKy8vIHNldCBYT0ZGMiB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT0ZGMl9SRUdJU1RFUgkweDA3CisKKyNkZWZpbmUgTU9YQV9NVVNUX1JCUlRMX1JFR0lTVEVSCTB4MDQKKyNkZWZpbmUgTU9YQV9NVVNUX1JCUlRIX1JFR0lTVEVSCTB4MDUKKyNkZWZpbmUgTU9YQV9NVVNUX1JCUlRJX1JFR0lTVEVSCTB4MDYKKyNkZWZpbmUgTU9YQV9NVVNUX1RIUlRMX1JFR0lTVEVSCTB4MDcKKyNkZWZpbmUgTU9YQV9NVVNUX0VOVU1fUkVHSVNURVIJCTB4MDQKKyNkZWZpbmUgTU9YQV9NVVNUX0hXSURfUkVHSVNURVIJCTB4MDUKKyNkZWZpbmUgTU9YQV9NVVNUX0VDUl9SRUdJU1RFUgkJMHgwNgorI2RlZmluZSBNT1hBX01VU1RfQ1NSX1JFR0lTVEVSCQkweDA3CisKKy8vIGdvb2QgZGF0YSBtb2RlIGVuYWJsZQorI2RlZmluZSBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRQkweDIwCisvLyBvbmx5IGdvb2QgZGF0YSBwdXQgaW50byBSeEZJRk8KKyNkZWZpbmUgTU9YQV9NVVNUX0ZDUl9HREFfT05MWV9FTkFCTEUJMHgxMAorCisvLyBlbmFibGUgQ1RTIGludGVycnVwdAorI2RlZmluZSBNT1hBX01VU1RfSUVSX0VDVFNJCQkweDgwCisvLyBlYW5ibGUgUlRTIGludGVycnVwdAorI2RlZmluZSBNT1hBX01VU1RfSUVSX0VSVFNJCQkweDQwCisvLyBlbmFibGUgWG9uL1hvZmYgaW50ZXJydXB0CisjZGVmaW5lIE1PWEFfTVVTVF9JRVJfWElOVAkJMHgyMAorLy8gZW5hYmxlIEdEQSBpbnRlcnJ1cHQKKyNkZWZpbmUgTU9YQV9NVVNUX0lFUl9FR0RBSQkJMHgxMAorCisjZGVmaW5lIE1PWEFfTVVTVF9SRUNWX0lTUgkJKFVBUlRfSUVSX1JESSB8IE1PWEFfTVVTVF9JRVJfRUdEQUkpCisKKy8vIEdEQSBpbnRlcnJ1cHQgcGVuZGluZworI2RlZmluZSBNT1hBX01VU1RfSUlSX0dEQQkJMHgxQworI2RlZmluZSBNT1hBX01VU1RfSUlSX1JEQQkJMHgwNAorI2RlZmluZSBNT1hBX01VU1RfSUlSX1JUTwkJMHgwQworI2RlZmluZSBNT1hBX01VU1RfSUlSX0xTUgkJMHgwNgorCisvLyByZWNpZXZlZCBYb24vWG9mZiBvciBzcGVjaWNhbCBpbnRlcnJ1cHQgcGVuZGluZworI2RlZmluZSBNT1hBX01VU1RfSUlSX1hTQwkJMHgxMAorCisvLyBSVFMvQ1RTIGNoYW5nZSBzdGF0ZSBpbnRlcnJ1cHQgcGVuZGluZworI2RlZmluZSBNT1hBX01VU1RfSUlSX1JUU0NUUwkJMHgyMAorI2RlZmluZSBNT1hBX01VU1RfSUlSX01BU0sJCTB4M0UKKworI2RlZmluZSBNT1hBX01VU1RfTUNSX1hPTl9GTEFHCQkweDQwCisjZGVmaW5lIE1PWEFfTVVTVF9NQ1JfWE9OX0FOWQkJMHg4MAorI2RlZmluZSBNT1hBX01VU1RfTUNSX1RYX1hPTgkJMHgwOAorCisKKy8vIHNvZnR3YXJlIGZsb3cgY29udHJvbCBvbiBjaGlwIG1hc2sgdmFsdWUKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9NQVNLCQkweDBGCisvLyBzZW5kIFhvbjEvWG9mZjEKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWDEJCTB4MDgKKy8vIHNlbmQgWG9uMi9Yb2ZmMgorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1RYMgkJMHgwNAorLy8gc2VuZCBYb24xLFhvbjIvWG9mZjEsWG9mZjIKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWDEyCQkweDBDCisvLyBkb24ndCBzZW5kIFhvbi9Yb2ZmCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFhfTk8JCTB4MDAKKy8vIFR4IHNvZnR3YXJlIGZsb3cgY29udHJvbCBtYXNrCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFhfTUFTSwkweDBDCisvLyBkb24ndCByZWNlaXZlIFhvbi9Yb2ZmCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlhfTk8JCTB4MDAKKy8vIHJlY2VpdmUgWG9uMS9Yb2ZmMQorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYMQkJMHgwMgorLy8gcmVjZWl2ZSBYb24yL1hvZmYyCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlgyCQkweDAxCisvLyByZWNlaXZlIFhvbjEsWG9uMi9Yb2ZmMSxYb2ZmMgorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYMTIJCTB4MDMKKy8vIFJ4IHNvZnR3YXJlIGZsb3cgY29udHJvbCBtYXNrCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlhfTUFTSwkweDAzCisKKy8vI2RlZmluZSBNT1hBX01VU1RfTUlOX1hPRkZMSU1JVCAgICAgICAgICAgICAgIDY2CisvLyNkZWZpbmUgTU9YQV9NVVNUX01JTl9YT05MSU1JVCAgICAgICAgICAgICAgICAyMAorLy8jZGVmaW5lIElEMV9SWF9UUklHICAgICAgICAgICAgICAgICAgIDEyMAorCisKKyNkZWZpbmUgQ0hFQ0tfTU9YQV9NVVNUX1hPRkZMSU1JVChpbmZvKSB7IAlcCisJaWYgKCAoaW5mbyktPklzTW94YU11c3RDaGlwRmxhZyAmJiAJXAorCSAoaW5mbyktPkhhbmRGbG93LlhvZmZMaW1pdCA8IE1PWEFfTVVTVF9NSU5fWE9GRkxJTUlUICkgewlcCisJCShpbmZvKS0+SGFuZEZsb3cuWG9mZkxpbWl0ID0gTU9YQV9NVVNUX01JTl9YT0ZGTElNSVQ7CVwKKwkJKGluZm8pLT5IYW5kRmxvdy5Yb25MaW1pdCA9IE1PWEFfTVVTVF9NSU5fWE9OTElNSVQ7CVwKKwl9CVwKK30KKworI2RlZmluZSBFTkFCTEVfTU9YQV9NVVNUX0VOQ0hBTkNFX01PREUoYmFzZWlvKSB7IFwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0VGUkJfRU5BQkxFOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9FTkNIQU5DRV9NT0RFKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEU7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIFNFVF9NT1hBX01VU1RfWE9OMV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9OMV9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX1hPTjJfVkFMVUUoYmFzZWlvLCBWYWx1ZSkgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMDsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YigodTgpKFZhbHVlKSwgKGJhc2VpbykrTU9YQV9NVVNUX1hPTjJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT0ZGMV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9GRjFfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT0ZGMl9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9GRjJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9SQlJUTF9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfUkJSVExfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9SQlJUSF9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfUkJSVEhfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9SQlJUSV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfUkJSVElfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9USFJUTF9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfVEhSVExfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKy8vI2RlZmluZSBNT1hBX01VU1RfUkJSTF9WQUxVRSAgNAorI2RlZmluZSBTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGluZm8pLT5iYXNlK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoaW5mbyktPmJhc2UrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGluZm8pLT5iYXNlK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMTsJXAorCW91dGIoX19lZnIsIChpbmZvKS0+YmFzZStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KSgoaW5mbyktPnJ4X2hpZ2hfd2F0ZXIpLCAoaW5mbyktPmJhc2UrTU9YQV9NVVNUX1JCUlRIX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KSgoaW5mbyktPnJ4X3RyaWdnZXIpLCAoaW5mbyktPmJhc2UrTU9YQV9NVVNUX1JCUlRJX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KSgoaW5mbyktPnJ4X2xvd193YXRlciksIChpbmZvKS0+YmFzZStNT1hBX01VU1RfUkJSVExfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGluZm8pLT5iYXNlK1VBUlRfTENSKTsJXAorfQorCisKKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX0VOVU1fVkFMVUUoYmFzZWlvLCBWYWx1ZSkgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMjsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YigodTgpKFZhbHVlKSwgKGJhc2VpbykrTU9YQV9NVVNUX0VOVU1fUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgR0VUX01PWEFfTVVTVF9IQVJEV0FSRV9JRChiYXNlaW8sIHBJZCkgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMjsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJKnBJZCA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfSFdJRF9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX05PX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX01BU0s7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIFNFVF9NT1hBX01VU1RfSlVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9TRl9UWDE7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfVFhfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfU0ZfVFgxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9UWF9NQVNLOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX0pVU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfU0ZfUlgxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBFTkFCTEVfTU9YQV9NVVNUX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX1JYX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX1NGX1JYMTsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgRElTQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfUlhfTUFTSzsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9UWF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9NQVNLOwlcCisJX19lZnIgfD0gKE1PWEFfTVVTVF9FRlJfU0ZfUlgxfE1PWEFfTVVTVF9FRlJfU0ZfVFgxKTsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9YT05fQU5ZX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbWNyOwlcCisJX19vbGRtY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9NQ1IpOwlcCisJX19vbGRtY3IgfD0gTU9YQV9NVVNUX01DUl9YT05fQU5ZOwlcCisJb3V0YihfX29sZG1jciwgKGJhc2VpbykrVUFSVF9NQ1IpOwlcCit9CisKKyNkZWZpbmUgRElTQUJMRV9NT1hBX01VU1RfWE9OX0FOWV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZG1jcjsJXAorCV9fb2xkbWNyID0gaW5iKChiYXNlaW8pK1VBUlRfTUNSKTsJXAorCV9fb2xkbWNyICY9IH5NT1hBX01VU1RfTUNSX1hPTl9BTlk7CVwKKwlvdXRiKF9fb2xkbWNyLCAoYmFzZWlvKStVQVJUX01DUik7CVwKK30KKworI2RlZmluZSBSRUFEX01PWEFfTVVTVF9HREwoYmFzZWlvKQlpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0dETF9SRUdJU1RFUikKKworCisjaWZuZGVmIElOSVRfV09SSworI2RlZmluZSBJTklUX1dPUksoX3dvcmssIF9mdW5jLCBfZGF0YSl7CVwKKwlfZGF0YS0+dHF1ZXVlLnJvdXRpbmUgPSBfZnVuYztcCisJX2RhdGEtPnRxdWV1ZS5kYXRhID0gX2RhdGE7XAorCX0KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX2hkbGMuYyBiL2RyaXZlcnMvY2hhci9uX2hkbGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2RiZmYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL25faGRsYy5jCkBAIC0wLDAgKzEsOTc4IEBACisvKiBnZW5lcmljIEhETEMgbGluZSBkaXNjaXBsaW5lIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYnkgUGF1bCBGdWxnaHVtIHBhdWxrZkBtaWNyb2dhdGUuY29tCisgKiBmb3IgTWljcm9nYXRlIENvcnBvcmF0aW9uCisgKgorICogTWljcm9nYXRlIGFuZCBTeW5jTGluayBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICoKKyAqIEFkYXB0ZWQgZnJvbSBwcHAuYywgd3JpdHRlbiBieSBNaWNoYWVsIENhbGxhaGFuIDxjYWxsYWhhbkBtYXRocy5veC5hYy51az4sCisgKglBbCBMb25neWVhciA8bG9uZ3llYXJAbmV0Y29tLmNvbT4sCisgKglQYXVsIE1hY2tlcnJhcyA8UGF1bC5NYWNrZXJyYXNAY3MuYW51LmVkdS5hdT4KKyAqCisgKiBPcmlnaW5hbCByZWxlYXNlIDAxLzExLzk5CisgKiAkSWQ6IG5faGRsYy5jLHYgNC44IDIwMDMvMDUvMDYgMjE6MTg6NTEgcGF1bGtmIEV4cCAkCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKQorICoKKyAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIHR0eSBsaW5lIGRpc2NpcGxpbmUgTl9IRExDIGZvciB1c2Ugd2l0aAorICogdHR5IGRldmljZSBkcml2ZXJzIHRoYXQgc3VwcG9ydCBiaXQtc3luY2hyb25vdXMgSERMQyBjb21tdW5pY2F0aW9ucy4KKyAqCisgKiBBbGwgSERMQyBkYXRhIGlzIGZyYW1lIG9yaWVudGVkIHdoaWNoIG1lYW5zOgorICoKKyAqIDEuIHR0eSB3cml0ZSBjYWxscyByZXByZXNlbnQgb25lIGNvbXBsZXRlIHRyYW5zbWl0IGZyYW1lIG9mIGRhdGEKKyAqICAgIFRoZSBkZXZpY2UgZHJpdmVyIHNob3VsZCBhY2NlcHQgdGhlIGNvbXBsZXRlIGZyYW1lIG9yIG5vbmUgb2YgCisgKiAgICB0aGUgZnJhbWUgKGJ1c3kpIGluIHRoZSB3cml0ZSBtZXRob2QuIEVhY2ggd3JpdGUgY2FsbCBzaG91bGQgaGF2ZQorICogICAgYSBieXRlIGNvdW50IGluIHRoZSByYW5nZSBvZiAyLTY1NTM1IGJ5dGVzICgyIGlzIG1pbiBIRExDIGZyYW1lCisgKiAgICB3aXRoIDEgYWRkciBieXRlIGFuZCAxIGN0cmwgYnl0ZSkuIFRoZSBtYXggYnl0ZSBjb3VudCBvZiA2NTUzNQorICogICAgc2hvdWxkIGluY2x1ZGUgYW55IGNyYyBieXRlcyByZXF1aXJlZC4gRm9yIGV4YW1wbGUsIHdoZW4gdXNpbmcKKyAqICAgIENDSVRUIENSQzMyLCA0IGNyYyBieXRlcyBhcmUgcmVxdWlyZWQsIHNvIHRoZSBtYXhpbXVtIHNpemUgZnJhbWUKKyAqICAgIHRoZSBhcHBsaWNhdGlvbiBtYXkgdHJhbnNtaXQgaXMgbGltaXRlZCB0byA2NTUzMSBieXRlcy4gRm9yIENDSVRUCisgKiAgICBDUkMxNiwgdGhlIG1heGltdW0gYXBwbGljYXRpb24gZnJhbWUgc2l6ZSB3b3VsZCBiZSA2NTUzMy4KKyAqCisgKgorICogMi4gcmVjZWl2ZSBjYWxsYmFja3MgZnJvbSB0aGUgZGV2aWNlIGRyaXZlciByZXByZXNlbnRzCisgKiAgICBvbmUgcmVjZWl2ZWQgZnJhbWUuIFRoZSBkZXZpY2UgZHJpdmVyIHNob3VsZCBieXBhc3MKKyAqICAgIHRoZSB0dHkgZmxpcCBidWZmZXIgYW5kIGNhbGwgdGhlIGxpbmUgZGlzY2lwbGluZSByZWNlaXZlCisgKiAgICBjYWxsYmFjayBkaXJlY3RseSB0byBhdm9pZCBmcmFnbWVudGluZyBvciBjb25jYXRlbmF0aW5nCisgKiAgICBtdWx0aXBsZSBmcmFtZXMgaW50byBhIHNpbmdsZSByZWNlaXZlIGNhbGxiYWNrLgorICoKKyAqICAgIFRoZSBIRExDIGxpbmUgZGlzY2lwbGluZSBxdWV1ZXMgdGhlIHJlY2VpdmUgZnJhbWVzIGluIHNlcGFyYXRlCisgKiAgICBidWZmZXJzIHNvIGNvbXBsZXRlIHJlY2VpdmUgZnJhbWVzIGNhbiBiZSByZXR1cm5lZCBieSB0aGUKKyAqICAgIHR0eSByZWFkIGNhbGxzLgorICoKKyAqIDMuIHR0eSByZWFkIGNhbGxzIHJldHVybnMgYW4gZW50aXJlIGZyYW1lIG9mIGRhdGEgb3Igbm90aGluZy4KKyAqICAgIAorICogNC4gYWxsIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBpcyBjb25zaWRlcmVkIHJhdy4gTm8gcHJvY2Vzc2luZworICogICAgb3IgdHJhbnNsYXRpb24gaXMgcGVyZm9ybWVkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUsIHJlZ2FyZGxlc3MKKyAqICAgIG9mIHRoZSB0dHkgZmxhZ3MKKyAqCisgKiA1LiBXaGVuIGxpbmUgZGlzY2lwbGluZSBpcyBxdWVyaWVkIGZvciB0aGUgYW1vdW50IG9mIHJlY2VpdmUKKyAqICAgIGRhdGEgYXZhaWxhYmxlIChGSU9DKSwgMCBpcyByZXR1cm5lZCBpZiBubyBkYXRhIGF2YWlsYWJsZSwKKyAqICAgIG90aGVyd2lzZSB0aGUgY291bnQgb2YgdGhlIG5leHQgYXZhaWxhYmxlIGZyYW1lIGlzIHJldHVybmVkLgorICogICAgKGluc3RlYWQgb2YgdGhlIHN1bSBvZiBhbGwgcmVjZWl2ZWQgZnJhbWUgY291bnRzKS4KKyAqCisgKiBUaGVzZSBjb252ZW50aW9ucyBhbGxvdyB0aGUgc3RhbmRhcmQgdHR5IHByb2dyYW1taW5nIGludGVyZmFjZQorICogdG8gYmUgdXNlZCBmb3Igc3luY2hyb25vdXMgSERMQyBhcHBsaWNhdGlvbnMgd2hlbiB1c2VkIHdpdGgKKyAqIHRoaXMgbGluZSBkaXNjaXBsaW5lIChvciBhbm90aGVyIGxpbmUgZGlzY2lwbGluZSB0aGF0IGlzIGZyYW1lCisgKiBvcmllbnRlZCBzdWNoIGFzIE5fUFBQKS4KKyAqCisgKiBUaGUgU3luY0xpbmsgZHJpdmVyIChzeW5jbGluay5jKSBpbXBsZW1lbnRzIGJvdGggYXN5bmNocm9ub3VzCisgKiAodXNpbmcgc3RhbmRhcmQgbGluZSBkaXNjaXBsaW5lIE5fVFRZKSBhbmQgc3luY2hyb25vdXMgSERMQworICogKHVzaW5nIE5fSERMQykgY29tbXVuaWNhdGlvbnMsIHdpdGggdGhlIGxhdHRlciB1c2luZyB0aGUgYWJvdmUKKyAqIGNvbnZlbnRpb25zLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYyBhbmQgZG9lcyBub3QgbWFpbnRhaW4KKyAqIGFueSBzdGF0aXN0aWNzLiBUaGUgbWFpbiBwb2ludCBpcyB0byBlbmZvcmNlIHRoZSByYXcgZGF0YQorICogYW5kIGZyYW1lIG9yaWVudGF0aW9uIG9mIEhETEMgY29tbXVuaWNhdGlvbnMuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNkZWZpbmUgSERMQ19NQUdJQyAweDIzOWUKKyNkZWZpbmUgSERMQ19WRVJTSU9OICIkUmV2aXNpb246IDQuOCAkIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorCisjdW5kZWYgVkVSU0lPTgorI2RlZmluZSBWRVJTSU9OKG1ham9yLG1pbm9yLHBhdGNoKSAoKCgoKG1ham9yKTw8OCkrKG1pbm9yKSk8PDgpKyhwYXRjaCkpCisKKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiB1c2VkIGluIG5ldyB0dHkgZHJpdmVycyAqLworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgkvKiB1c2VkIGluIG5ldyB0dHkgZHJpdmVycyAqLworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKgorICogQnVmZmVycyBmb3IgaW5kaXZpZHVhbCBIRExDIGZyYW1lcworICovCisjZGVmaW5lIE1BWF9IRExDX0ZSQU1FX1NJWkUgNjU1MzUgCisjZGVmaW5lIERFRkFVTFRfUlhfQlVGX0NPVU5UIDEwCisjZGVmaW5lIE1BWF9SWF9CVUZfQ09VTlQgNjAKKyNkZWZpbmUgREVGQVVMVF9UWF9CVUZfQ09VTlQgMQorCitzdHJ1Y3Qgbl9oZGxjX2J1ZiB7CisJc3RydWN0IG5faGRsY19idWYgKmxpbms7CisJaW50CQkgIGNvdW50OworCWNoYXIJCSAgYnVmWzFdOworfTsKKworI2RlZmluZQlOX0hETENfQlVGX1NJWkUJKHNpemVvZihzdHJ1Y3Qgbl9oZGxjX2J1ZikgKyBtYXhmcmFtZSkKKworc3RydWN0IG5faGRsY19idWZfbGlzdCB7CisJc3RydWN0IG5faGRsY19idWYgKmhlYWQ7CisJc3RydWN0IG5faGRsY19idWYgKnRhaWw7CisJaW50CQkgIGNvdW50OworCXNwaW5sb2NrX3QJICBzcGlubG9jazsKK307CisKKy8qKgorICogc3RydWN0IG5faGRsYyAtIHBlciBkZXZpY2UgaW5zdGFuY2UgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBtYWdpYyAtIG1hZ2ljIHZhbHVlIGZvciBzdHJ1Y3R1cmUKKyAqIEBmbGFncyAtIG1pc2NlbGxhbmVvdXMgY29udHJvbCBmbGFncworICogQHR0eSAtIHB0ciB0byBUVFkgc3RydWN0dXJlCisgKiBAYmFja3VwX3R0eSAtIFRUWSB0byB1c2UgaWYgdHR5IGdldHMgY2xvc2VkCisgKiBAdGJ1c3kgLSByZWVudHJhbmN5IGZsYWcgZm9yIHR4IHdha2V1cCBjb2RlCisgKiBAd29rZV91cCAtIEZJWE1FOiBkZXNjcmliZSB0aGlzIGZpZWxkCisgKiBAdGJ1ZiAtIGN1cnJlbnRseSB0cmFuc21pdHRpbmcgdHggYnVmZmVyCisgKiBAdHhfYnVmX2xpc3QgLSBsaXN0IG9mIHBlbmRpbmcgdHJhbnNtaXQgZnJhbWUgYnVmZmVycworICogQHJ4X2J1Zl9saXN0IC0gbGlzdCBvZiByZWNlaXZlZCBmcmFtZSBidWZmZXJzCisgKiBAdHhfZnJlZV9idWZfbGlzdCAtIGxpc3QgdW51c2VkIHRyYW5zbWl0IGZyYW1lIGJ1ZmZlcnMKKyAqIEByeF9mcmVlX2J1Zl9saXN0IC0gbGlzdCB1bnVzZWQgcmVjZWl2ZWQgZnJhbWUgYnVmZmVycworICovCitzdHJ1Y3Qgbl9oZGxjIHsKKwlpbnQJCQltYWdpYzsKKwlfX3UzMgkJCWZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKmJhY2t1cF90dHk7CisJaW50CQkJdGJ1c3k7CisJaW50CQkJd29rZV91cDsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZgkqdGJ1ZjsKKwlzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0CXR4X2J1Zl9saXN0OworCXN0cnVjdCBuX2hkbGNfYnVmX2xpc3QJcnhfYnVmX2xpc3Q7CisJc3RydWN0IG5faGRsY19idWZfbGlzdAl0eF9mcmVlX2J1Zl9saXN0OworCXN0cnVjdCBuX2hkbGNfYnVmX2xpc3QJcnhfZnJlZV9idWZfbGlzdDsKK307CisKKy8qCisgKiBIRExDIGJ1ZmZlciBsaXN0IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgbl9oZGxjX2J1Zl9saXN0X2luaXQoc3RydWN0IG5faGRsY19idWZfbGlzdCAqbGlzdCk7CitzdGF0aWMgdm9pZCBuX2hkbGNfYnVmX3B1dChzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0ICpsaXN0LAorCQkJICAgc3RydWN0IG5faGRsY19idWYgKmJ1Zik7CitzdGF0aWMgc3RydWN0IG5faGRsY19idWYgKm5faGRsY19idWZfZ2V0KHN0cnVjdCBuX2hkbGNfYnVmX2xpc3QgKmxpc3QpOworCisvKiBMb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHN0cnVjdCBuX2hkbGMgKm5faGRsY19hbGxvYyAodm9pZCk7CisKKy8qIGRlYnVnIGxldmVsIGNhbiBiZSBzZXQgYnkgaW5zbW9kIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KKyNkZWZpbmUgREVCVUdfTEVWRUxfSU5GTwkxCitzdGF0aWMgaW50IGRlYnVnbGV2ZWw7CisKKy8qIG1heCBmcmFtZSBzaXplIGZvciBtZW1vcnkgYWxsb2NhdGlvbnMgKi8KK3N0YXRpYyBpbnQgbWF4ZnJhbWUgPSA0MDk2OworCisvKiBUVFkgY2FsbGJhY2tzICovCisKK3N0YXRpYyBzc2l6ZV90IG5faGRsY190dHlfcmVhZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIF9fdTggX191c2VyICpidWYsIHNpemVfdCBucik7CitzdGF0aWMgc3NpemVfdCBuX2hkbGNfdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IG5yKTsKK3N0YXRpYyBpbnQgbl9oZGxjX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdW5zaWduZWQgaW50IG5faGRsY190dHlfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgcG9sbF90YWJsZSAqd2FpdCk7CitzdGF0aWMgaW50IG5faGRsY190dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIG5faGRsY190dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50IG5faGRsY190dHlfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIG5faGRsY190dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCBfX3U4ICpjcCwKKwkJCSAgICAgICBjaGFyICpmcCwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIG5faGRsY190dHlfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworCisjZGVmaW5lIGJzZXQocCxiKQkoKHApWyhiKSA+PiA1XSB8PSAoMSA8PCAoKGIpICYgMHgxZikpKQorCisjZGVmaW5lIHR0eTJuX2hkbGModHR5KQkoKHN0cnVjdCBuX2hkbGMgKikgKCh0dHkpLT5kaXNjX2RhdGEpKQorI2RlZmluZSBuX2hkbGMydHR5KG5faGRsYykJKChuX2hkbGMpLT50dHkpCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjIG5faGRsY19sZGlzYyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm1hZ2ljCQk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZQkJPSAiaGRsYyIsCisJLm9wZW4JCT0gbl9oZGxjX3R0eV9vcGVuLAorCS5jbG9zZQkJPSBuX2hkbGNfdHR5X2Nsb3NlLAorCS5yZWFkCQk9IG5faGRsY190dHlfcmVhZCwKKwkud3JpdGUJCT0gbl9oZGxjX3R0eV93cml0ZSwKKwkuaW9jdGwJCT0gbl9oZGxjX3R0eV9pb2N0bCwKKwkucG9sbAkJPSBuX2hkbGNfdHR5X3BvbGwsCisJLnJlY2VpdmVfYnVmCT0gbl9oZGxjX3R0eV9yZWNlaXZlLAorCS5yZWNlaXZlX3Jvb20JPSBuX2hkbGNfdHR5X3Jvb20sCisJLndyaXRlX3dha2V1cAk9IG5faGRsY190dHlfd2FrZXVwLAorfTsKKworLyoqCisgKiBuX2hkbGNfcmVsZWFzZSAtIHJlbGVhc2UgYW4gbl9oZGxjIHBlciBkZXZpY2UgbGluZSBkaXNjaXBsaW5lIGluZm8gc3RydWN0dXJlCisgKiBAbl9oZGxjIC0gcGVyIGRldmljZSBsaW5lIGRpc2NpcGxpbmUgaW5mbyBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgbl9oZGxjX3JlbGVhc2Uoc3RydWN0IG5faGRsYyAqbl9oZGxjKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBuX2hkbGMydHR5IChuX2hkbGMpOworCXN0cnVjdCBuX2hkbGNfYnVmICpidWY7CisJCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3JlbGVhc2UoKSBjYWxsZWRcbiIsX19GSUxFX18sX19MSU5FX18pOworCQkKKwkvKiBFbnN1cmUgdGhhdCB0aGUgbl9oZGxjZCBwcm9jZXNzIGlzIG5vdCBoYW5naW5nIG9uIHNlbGVjdCgpL3BvbGwoKSAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnR0eS0+cmVhZF93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZ0dHktPndyaXRlX3dhaXQpOworCisJaWYgKHR0eSAhPSBOVUxMICYmIHR0eS0+ZGlzY19kYXRhID09IG5faGRsYykKKwkJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOwkvKiBCcmVhayB0aGUgdHR5LT5uX2hkbGMgbGluayAqLworCisJLyogUmVsZWFzZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXJzICovCisJZm9yKDs7KSB7CisJCWJ1ZiA9IG5faGRsY19idWZfZ2V0KCZuX2hkbGMtPnJ4X2ZyZWVfYnVmX2xpc3QpOworCQlpZiAoYnVmKSB7CisJCQlrZnJlZShidWYpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwlmb3IoOzspIHsKKwkJYnVmID0gbl9oZGxjX2J1Zl9nZXQoJm5faGRsYy0+dHhfZnJlZV9idWZfbGlzdCk7CisJCWlmIChidWYpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCWZvcig7OykgeworCQlidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT5yeF9idWZfbGlzdCk7CisJCWlmIChidWYpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCWZvcig7OykgeworCQlidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT50eF9idWZfbGlzdCk7CisJCWlmIChidWYpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCWlmIChuX2hkbGMtPnRidWYpCisJCWtmcmVlKG5faGRsYy0+dGJ1Zik7CisJa2ZyZWUobl9oZGxjKTsKKwkKK30JLyogZW5kIG9mIG5faGRsY19yZWxlYXNlKCkgKi8KKworLyoqCisgKiBuX2hkbGNfdHR5X2Nsb3NlIC0gbGluZSBkaXNjaXBsaW5lIGNsb3NlCisgKiBAdHR5IC0gcG9pbnRlciB0byB0dHkgaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKiBDYWxsZWQgd2hlbiB0aGUgbGluZSBkaXNjaXBsaW5lIGlzIGNoYW5nZWQgdG8gc29tZXRoaW5nCisgKiBlbHNlLCB0aGUgdHR5IGlzIGNsb3NlZCwgb3IgdGhlIHR0eSBkZXRlY3RzIGEgaGFuZ3VwLgorICovCitzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG5faGRsYyAqbl9oZGxjID0gdHR5Mm5faGRsYyAodHR5KTsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfY2xvc2UoKSBjYWxsZWRcbiIsX19GSUxFX18sX19MSU5FX18pOworCQkKKwlpZiAobl9oZGxjICE9IE5VTEwpIHsKKwkJaWYgKG5faGRsYy0+bWFnaWMgIT0gSERMQ19NQUdJQykgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcibl9oZGxjOiB0cnlpbmcgdG8gY2xvc2UgdW5vcGVuZWQgdHR5IVxuIik7CisJCQlyZXR1cm47CisJCX0KKyNpZiBkZWZpbmVkKFRUWV9OT19XUklURV9TUExJVCkKKwkJY2xlYXJfYml0KFRUWV9OT19XUklURV9TUExJVCwmdHR5LT5mbGFncyk7CisjZW5kaWYKKwkJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCQlpZiAodHR5ID09IG5faGRsYy0+YmFja3VwX3R0eSkKKwkJCW5faGRsYy0+YmFja3VwX3R0eSA9IE5VTEw7CisJCWlmICh0dHkgIT0gbl9oZGxjLT50dHkpCisJCQlyZXR1cm47CisJCWlmIChuX2hkbGMtPmJhY2t1cF90dHkpIHsKKwkJCW5faGRsYy0+dHR5ID0gbl9oZGxjLT5iYWNrdXBfdHR5OworCQl9IGVsc2UgeworCQkJbl9oZGxjX3JlbGVhc2UgKG5faGRsYyk7CisJCX0KKwl9CisJCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9jbG9zZSgpIHN1Y2Nlc3NcbiIsX19GSUxFX18sX19MSU5FX18pOworCQkKK30JLyogZW5kIG9mIG5faGRsY190dHlfY2xvc2UoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfb3BlbiAtIGNhbGxlZCB3aGVuIGxpbmUgZGlzY2lwbGluZSBjaGFuZ2VkIHRvIG5faGRsYworICogQHR0eSAtIHBvaW50ZXIgdG8gdHR5IGluZm8gc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgbl9oZGxjX3R0eV9vcGVuIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CisKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfdHR5X29wZW4oKSBjYWxsZWQgKGRldmljZT0lcylcbiIsCisJCV9fRklMRV9fLF9fTElORV9fLAorCQl0dHktPm5hbWUpOworCQkKKwkvKiBUaGVyZSBzaG91bGQgbm90IGJlIGFuIGV4aXN0aW5nIHRhYmxlIGZvciB0aGlzIHNsb3QuICovCisJaWYgKG5faGRsYykgeworCQlwcmludGsgKEtFUk5fRVJSIm5faGRsY190dHlfb3Blbjp0dHkgYWxyZWFkeSBhc3NvY2lhdGVkIVxuIiApOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisJCisJbl9oZGxjID0gbl9oZGxjX2FsbG9jKCk7CisJaWYgKCFuX2hkbGMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAibl9oZGxjX2FsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5GSUxFOworCX0KKwkJCisJdHR5LT5kaXNjX2RhdGEgPSBuX2hkbGM7CisJbl9oZGxjLT50dHkgICAgPSB0dHk7CisJCisjaWYgZGVmaW5lZChUVFlfTk9fV1JJVEVfU1BMSVQpCisJLyogY2hhbmdlIHR0eV9pbyB3cml0ZSgpIHRvIG5vdCBzcGxpdCBsYXJnZSB3cml0ZXMgaW50byA4SyBjaHVua3MgKi8KKwlzZXRfYml0KFRUWV9OT19XUklURV9TUExJVCwmdHR5LT5mbGFncyk7CisjZW5kaWYKKwkKKwkvKiBGbHVzaCBhbnkgcGVuZGluZyBjaGFyYWN0ZXJzIGluIHRoZSBkcml2ZXIgYW5kIGRpc2NpcGxpbmUuICovCisJCisJaWYgKHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKQorCQl0dHktPmxkaXNjLmZsdXNoX2J1ZmZlciAodHR5KTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyICh0dHkpOworCQkKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfdHR5X29wZW4oKSBzdWNjZXNzXG4iLF9fRklMRV9fLF9fTElORV9fKTsKKwkJCisJcmV0dXJuIDA7CisJCit9CS8qIGVuZCBvZiBuX3R0eV9oZGxjX29wZW4oKSAqLworCisvKioKKyAqIG5faGRsY19zZW5kX2ZyYW1lcyAtIHNlbmQgZnJhbWVzIG9uIHBlbmRpbmcgc2VuZCBidWZmZXIgbGlzdAorICogQG5faGRsYyAtIHBvaW50ZXIgdG8gbGRpc2MgaW5zdGFuY2UgZGF0YQorICogQHR0eSAtIHBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqCisgKiBTZW5kIGZyYW1lcyBvbiBwZW5kaW5nIHNlbmQgYnVmZmVyIGxpc3QgdW50aWwgdGhlIGRyaXZlciBkb2VzIG5vdCBhY2NlcHQgYQorICogZnJhbWUgKGJ1c3kpIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFkZGluZyBhIGZyYW1lIHRvIHRoZSBzZW5kIGJ1ZmZlcgorICogbGlzdCBhbmQgYnkgdGhlIHR0eSB3YWtldXAgY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIG5faGRsY19zZW5kX2ZyYW1lcyhzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmVnaXN0ZXIgaW50IGFjdHVhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuX2hkbGNfYnVmICp0YnVmOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3NlbmRfZnJhbWVzKCkgY2FsbGVkXG4iLF9fRklMRV9fLF9fTElORV9fKTsKKyBjaGVja19hZ2FpbjoKKwkJCisgCXNwaW5fbG9ja19pcnFzYXZlKCZuX2hkbGMtPnR4X2J1Zl9saXN0LnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKG5faGRsYy0+dGJ1c3kpIHsKKwkJbl9oZGxjLT53b2tlX3VwID0gMTsKKyAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5faGRsYy0+dHhfYnVmX2xpc3Quc3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwluX2hkbGMtPnRidXN5ID0gMTsKKwluX2hkbGMtPndva2VfdXAgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5faGRsYy0+dHhfYnVmX2xpc3Quc3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIGdldCBjdXJyZW50IHRyYW5zbWl0IGJ1ZmZlciBvciBnZXQgbmV3IHRyYW5zbWl0ICovCisJLyogYnVmZmVyIGZyb20gbGlzdCBvZiBwZW5kaW5nIHRyYW5zbWl0IGJ1ZmZlcnMgKi8KKwkJCisJdGJ1ZiA9IG5faGRsYy0+dGJ1ZjsKKwlpZiAoIXRidWYpCisJCXRidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT50eF9idWZfbGlzdCk7CisJCQorCXdoaWxlICh0YnVmKSB7CisJCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQkJcHJpbnRrKCIlcyglZClzZW5kaW5nIGZyYW1lICVwLCBjb3VudD0lZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyx0YnVmLHRidWYtPmNvdW50KTsKKwkJCQorCQkvKiBTZW5kIHRoZSBuZXh0IGJsb2NrIG9mIGRhdGEgdG8gZGV2aWNlICovCisJCXR0eS0+ZmxhZ3MgfD0gKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJCWFjdHVhbCA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHRidWYtPmJ1ZiwgdGJ1Zi0+Y291bnQpOworCQkgICAgCisJCS8qIGlmIHRyYW5zbWl0IGVycm9yLCB0aHJvdyBmcmFtZSBhd2F5IGJ5ICovCisJCS8qIHByZXRlbmRpbmcgaXQgd2FzIGFjY2VwdGVkIGJ5IGRyaXZlciAqLworCQlpZiAoYWN0dWFsIDwgMCkKKwkJCWFjdHVhbCA9IHRidWYtPmNvdW50OworCQkKKwkJaWYgKGFjdHVhbCA9PSB0YnVmLT5jb3VudCkgeworCQkJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCQkJcHJpbnRrKCIlcyglZClmcmFtZSAlcCBjb21wbGV0ZWRcbiIsCisJCQkJCV9fRklMRV9fLF9fTElORV9fLHRidWYpOworCQkJCQkKKwkJCS8qIGZyZWUgY3VycmVudCB0cmFuc21pdCBidWZmZXIgKi8KKwkJCW5faGRsY19idWZfcHV0KCZuX2hkbGMtPnR4X2ZyZWVfYnVmX2xpc3QsIHRidWYpOworCQkJCisJCQkvKiB0aGlzIHR4IGJ1ZmZlciBpcyBkb25lICovCisJCQluX2hkbGMtPnRidWYgPSBOVUxMOworCQkJCisJCQkvKiB3YWl0IHVwIHNsZWVwaW5nIHdyaXRlcnMgKi8KKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwkKKwkJCS8qIGdldCBuZXh0IHBlbmRpbmcgdHJhbnNtaXQgYnVmZmVyICovCisJCQl0YnVmID0gbl9oZGxjX2J1Zl9nZXQoJm5faGRsYy0+dHhfYnVmX2xpc3QpOworCQl9IGVsc2UgeworCQkJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCQkJcHJpbnRrKCIlcyglZClmcmFtZSAlcCBwZW5kaW5nXG4iLAorCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXyx0YnVmKTsKKwkJCQkJCisJCQkvKiBidWZmZXIgbm90IGFjY2VwdGVkIGJ5IGRyaXZlciAqLworCQkJLyogc2V0IHRoaXMgYnVmZmVyIGFzIHBlbmRpbmcgYnVmZmVyICovCisJCQluX2hkbGMtPnRidWYgPSB0YnVmOworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJaWYgKCF0YnVmKQorCQl0dHktPmZsYWdzICAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJCisJLyogQ2xlYXIgdGhlIHJlLWVudHJ5IGZsYWcgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbl9oZGxjLT50eF9idWZfbGlzdC5zcGlubG9jaywgZmxhZ3MpOworCW5faGRsYy0+dGJ1c3kgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5faGRsYy0+dHhfYnVmX2xpc3Quc3BpbmxvY2ssIGZsYWdzKTsgCisJCisgICAgICAgIGlmIChuX2hkbGMtPndva2VfdXApCisJICBnb3RvIGNoZWNrX2FnYWluOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3NlbmRfZnJhbWVzKCkgZXhpdFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCQorfQkvKiBlbmQgb2Ygbl9oZGxjX3NlbmRfZnJhbWVzKCkgKi8KKworLyoqCisgKiBuX2hkbGNfdHR5X3dha2V1cCAtIENhbGxiYWNrIGZvciB0cmFuc21pdCB3YWtldXAKKyAqIEB0dHkJLSBwb2ludGVyIHRvIGFzc29jaWF0ZWQgdHR5IGluc3RhbmNlIGRhdGEKKyAqCisgKiBDYWxsZWQgd2hlbiBsb3cgbGV2ZWwgZGV2aWNlIGRyaXZlciBjYW4gYWNjZXB0IG1vcmUgc2VuZCBkYXRhLgorICovCitzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGModHR5KTsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfd2FrZXVwKCkgY2FsbGVkXG4iLF9fRklMRV9fLF9fTElORV9fKTsKKwkJCisJaWYgKCFuX2hkbGMpCisJCXJldHVybjsKKworCWlmICh0dHkgIT0gbl9oZGxjLT50dHkpIHsKKwkJdHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJCXJldHVybjsKKwl9CisKKwluX2hkbGNfc2VuZF9mcmFtZXMgKG5faGRsYywgdHR5KTsKKwkJCit9CS8qIGVuZCBvZiBuX2hkbGNfdHR5X3dha2V1cCgpICovCisKKy8qKgorICogbl9oZGxjX3R0eV9yb29tIC0gUmV0dXJuIHRoZSBhbW91bnQgb2Ygc3BhY2UgbGVmdCBpbiB0aGUgcmVjZWl2ZXIncyBidWZmZXIKKyAqIEB0dHkJLSBwb2ludGVyIHRvIGFzc29jaWF0ZWQgdHR5IGluc3RhbmNlIGRhdGEKKyAqCisgKiBDYWxsYmFjayBmdW5jdGlvbiBmcm9tIHR0eSBkcml2ZXIuIFJldHVybiB0aGUgYW1vdW50IG9mIHNwYWNlIGxlZnQgaW4gdGhlCisgKiByZWNlaXZlcidzIGJ1ZmZlciB0byBkZWNpZGUgaWYgcmVtb3RlIHRyYW5zbWl0dGVyIGlzIHRvIGJlIHRocm90dGxlZC4KKyAqLworc3RhdGljIGludCBuX2hkbGNfdHR5X3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJcHJpbnRrKCIlcyglZCluX2hkbGNfdHR5X3Jvb20oKSBjYWxsZWRcbiIsX19GSUxFX18sX19MSU5FX18pOworCS8qIGFsd2F5cyByZXR1cm4gYSBsYXJnZXIgbnVtYmVyIHRvIHByZXZlbnQgKi8KKwkvKiB0aHJvdHRsaW5nIG9mIHJlbW90ZSB0cmFuc21pdHRlci4gKi8KKwlyZXR1cm4gNjU1MzY7Cit9CS8qIGVuZCBvZiBuX2hkbGNfdHR5X3Jvb3QoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfcmVjZWl2ZSAtIENhbGxlZCBieSB0dHkgZHJpdmVyIHdoZW4gcmVjZWl2ZSBkYXRhIGlzIGF2YWlsYWJsZQorICogQHR0eQktIHBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqIEBkYXRhIC0gcG9pbnRlciB0byByZWNlaXZlZCBkYXRhCisgKiBAZmxhZ3MgLSBwb2ludGVyIHRvIGZsYWdzIGZvciBkYXRhCisgKiBAY291bnQgLSBjb3VudCBvZiByZWNlaXZlZCBkYXRhIGluIGJ5dGVzCisgKgorICogQ2FsbGVkIGJ5IHR0eSBsb3cgbGV2ZWwgZHJpdmVyIHdoZW4gcmVjZWl2ZSBkYXRhIGlzIGF2YWlsYWJsZS4gRGF0YSBpcworICogaW50ZXJwcmV0ZWQgYXMgb25lIEhETEMgZnJhbWUuCisgKi8KK3N0YXRpYyB2b2lkIG5faGRsY190dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCBfX3U4ICpkYXRhLAorCQkJICAgICAgIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpCit7CisJcmVnaXN0ZXIgc3RydWN0IG5faGRsYyAqbl9oZGxjID0gdHR5Mm5faGRsYyAodHR5KTsKKwlyZWdpc3RlciBzdHJ1Y3Qgbl9oZGxjX2J1ZiAqYnVmOworCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9yZWNlaXZlKCkgY2FsbGVkIGNvdW50PSVkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sIGNvdW50KTsKKwkJCisJLyogVGhpcyBjYW4gaGFwcGVuIGlmIHN0dWZmIGNvbWVzIGluIG9uIHRoZSBiYWNrdXAgdHR5ICovCisJaWYgKG5faGRsYyA9PSAwIHx8IHR0eSAhPSBuX2hkbGMtPnR0eSkKKwkJcmV0dXJuOworCQkKKwkvKiB2ZXJpZnkgbGluZSBpcyB1c2luZyBIRExDIGRpc2NpcGxpbmUgKi8KKwlpZiAobl9oZGxjLT5tYWdpYyAhPSBIRExDX01BR0lDKSB7CisJCXByaW50aygiJXMoJWQpIGxpbmUgbm90IHVzaW5nIEhETEMgZGlzY2lwbGluZVxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIGNvdW50Pm1heGZyYW1lICkgeworCQlpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJCXByaW50aygiJXMoJWQpIHJ4IGNvdW50Pm1heGZyYW1lc2l6ZSwgZGF0YSBkaXNjYXJkZWRcbiIsCisJCQkgICAgICAgX19GSUxFX18sX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCisJLyogZ2V0IGEgZnJlZSBIRExDIGJ1ZmZlciAqLwkKKwlidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT5yeF9mcmVlX2J1Zl9saXN0KTsKKwlpZiAoIWJ1ZikgeworCQkvKiBubyBidWZmZXJzIGluIGZyZWUgbGlzdCwgYXR0ZW1wdCB0byBhbGxvY2F0ZSBhbm90aGVyIHJ4IGJ1ZmZlciAqLworCQkvKiB1bmxlc3MgdGhlIG1heGltdW0gY291bnQgaGFzIGJlZW4gcmVhY2hlZCAqLworCQlpZiAobl9oZGxjLT5yeF9idWZfbGlzdC5jb3VudCA8IE1BWF9SWF9CVUZfQ09VTlQpCisJCQlidWYgPSBrbWFsbG9jKE5fSERMQ19CVUZfU0laRSwgR0ZQX0FUT01JQyk7CisJfQorCQorCWlmICghYnVmKSB7CisJCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQkJcHJpbnRrKCIlcyglZCkgbm8gbW9yZSByeCBidWZmZXJzLCBkYXRhIGRpc2NhcmRlZFxuIiwKKwkJCSAgICAgICBfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisJCQorCS8qIGNvcHkgcmVjZWl2ZWQgZGF0YSB0byBIRExDIGJ1ZmZlciAqLworCW1lbWNweShidWYtPmJ1ZixkYXRhLGNvdW50KTsKKwlidWYtPmNvdW50PWNvdW50OworCisJLyogYWRkIEhETEMgYnVmZmVyIHRvIGxpc3Qgb2YgcmVjZWl2ZWQgZnJhbWVzICovCisJbl9oZGxjX2J1Zl9wdXQoJm5faGRsYy0+cnhfYnVmX2xpc3QsIGJ1Zik7CisJCisJLyogd2FrZSB1cCBhbnkgYmxvY2tlZCByZWFkcyBhbmQgcGVyZm9ybSBhc3luYyBzaWduYWxsaW5nICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmdHR5LT5yZWFkX3dhaXQpOworCWlmIChuX2hkbGMtPnR0eS0+ZmFzeW5jICE9IE5VTEwpCisJCWtpbGxfZmFzeW5jICgmbl9oZGxjLT50dHktPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOworCit9CS8qIGVuZCBvZiBuX2hkbGNfdHR5X3JlY2VpdmUoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfcmVhZCAtIENhbGxlZCB0byByZXRyZWl2ZSBvbmUgZnJhbWUgb2YgZGF0YSAoaWYgYXZhaWxhYmxlKQorICogQHR0eSAtIHBvaW50ZXIgdG8gdHR5IGluc3RhbmNlIGRhdGEKKyAqIEBmaWxlIC0gcG9pbnRlciB0byBvcGVuIGZpbGUgb2JqZWN0CisgKiBAYnVmIC0gcG9pbnRlciB0byByZXR1cm5lZCBkYXRhIGJ1ZmZlcgorICogQG5yIC0gc2l6ZSBvZiByZXR1cm5lZCBkYXRhIGJ1ZmZlcgorICogCQorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJldHVybmVkIG9yIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IG5faGRsY190dHlfcmVhZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIF9fdTggX191c2VyICpidWYsIHNpemVfdCBucikKK3sKKwlzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMgPSB0dHkybl9oZGxjKHR0eSk7CisJaW50IHJldDsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqcmJ1ZjsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfcmVhZCgpIGNhbGxlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCQorCS8qIFZhbGlkYXRlIHRoZSBwb2ludGVycyAqLworCWlmICghbl9oZGxjKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHZlcmlmeSB1c2VyIGFjY2VzcyB0byBidWZmZXIgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgbnIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCVkKSBuX2hkbGNfdHR5X3JlYWQoKSBjYW4ndCB2ZXJpZnkgdXNlciAiCisJCSJidWZmZXJcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWZvciAoOzspIHsKKwkJaWYgKHRlc3RfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmZsYWdzKSkKKwkJCXJldHVybiAtRUlPOworCisJCW5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CisJCWlmICghbl9oZGxjIHx8IG5faGRsYy0+bWFnaWMgIT0gSERMQ19NQUdJQyB8fAorCQkJIHR0eSAhPSBuX2hkbGMtPnR0eSkKKwkJCXJldHVybiAwOworCisJCXJidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT5yeF9idWZfbGlzdCk7CisJCWlmIChyYnVmKQorCQkJYnJlYWs7CisJCQkKKwkJLyogbm8gZGF0YSAqLworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCQorCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uICgmdHR5LT5yZWFkX3dhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KKwkJCisJaWYgKHJidWYtPmNvdW50ID4gbnIpCisJCS8qIGZyYW1lIHRvbyBsYXJnZSBmb3IgY2FsbGVyJ3MgYnVmZmVyIChkaXNjYXJkIGZyYW1lKSAqLworCQlyZXQgPSAtRU9WRVJGTE9XOworCWVsc2UgeworCQkvKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBjYWxsZXIncyBidWZmZXIgKi8KKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHJidWYtPmJ1ZiwgcmJ1Zi0+Y291bnQpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJcmV0ID0gcmJ1Zi0+Y291bnQ7CisJfQorCQorCS8qIHJldHVybiBIRExDIGJ1ZmZlciB0byBmcmVlIGxpc3QgdW5sZXNzIHRoZSBmcmVlIGxpc3QgKi8KKwkvKiBjb3VudCBoYXMgZXhjZWVkZWQgdGhlIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoIGNhc2UgdGhlICovCisJLyogYnVmZmVyIGlzIGZyZWVkIGJhY2sgdG8gdGhlIE9TIHRvIGNvbnNlcnZlIG1lbW9yeSAqLworCWlmIChuX2hkbGMtPnJ4X2ZyZWVfYnVmX2xpc3QuY291bnQgPiBERUZBVUxUX1JYX0JVRl9DT1VOVCkKKwkJa2ZyZWUocmJ1Zik7CisJZWxzZQkKKwkJbl9oZGxjX2J1Zl9wdXQoJm5faGRsYy0+cnhfZnJlZV9idWZfbGlzdCxyYnVmKTsKKwkKKwlyZXR1cm4gcmV0OworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV9yZWFkKCkgKi8KKworLyoqCisgKiBuX2hkbGNfdHR5X3dyaXRlIC0gd3JpdGUgYSBzaW5nbGUgZnJhbWUgb2YgZGF0YSB0byBkZXZpY2UKKyAqIEB0dHkJLSBwb2ludGVyIHRvIGFzc29jaWF0ZWQgdHR5IGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBAZmlsZSAtIHBvaW50ZXIgdG8gZmlsZSBvYmplY3QgZGF0YQorICogQGRhdGEgLSBwb2ludGVyIHRvIHRyYW5zbWl0IGRhdGEgKG9uZSBmcmFtZSkKKyAqIEBjb3VudCAtIHNpemUgb2YgdHJhbnNtaXQgZnJhbWUgaW4gYnl0ZXMKKyAqIAkJCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAob3IgZXJyb3IgY29kZSkuCisgKi8KK3N0YXRpYyBzc2l6ZV90IG5faGRsY190dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IHR0eTJuX2hkbGMgKHR0eSk7CisJaW50IGVycm9yID0gMDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqdGJ1ZjsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfd3JpdGUoKSBjYWxsZWQgY291bnQ9JVpkXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sY291bnQpOworCQkKKwkvKiBWZXJpZnkgcG9pbnRlcnMgKi8KKwlpZiAoIW5faGRsYykKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobl9oZGxjLT5tYWdpYyAhPSBIRExDX01BR0lDKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHZlcmlmeSBmcmFtZSBzaXplICovCisJaWYgKGNvdW50ID4gbWF4ZnJhbWUgKSB7CisJCWlmIChkZWJ1Z2xldmVsICYgREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkJIm5faGRsY190dHlfd3JpdGU6IHRydW5jYXRpbmcgdXNlciBwYWNrZXQgIgorCQkJCSJmcm9tICVsdSB0byAlZFxuIiwgKHVuc2lnbmVkIGxvbmcpIGNvdW50LAorCQkJCW1heGZyYW1lICk7CisJCWNvdW50ID0gbWF4ZnJhbWU7CisJfQorCQorCWFkZF93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQorCS8qIEFsbG9jYXRlIHRyYW5zbWl0IGJ1ZmZlciAqLworCS8qIHNsZWVwIHVudGlsIHRyYW5zbWl0IGJ1ZmZlciBhdmFpbGFibGUgKi8JCQorCXdoaWxlICghKHRidWYgPSBuX2hkbGNfYnVmX2dldCgmbl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0KSkpIHsKKwkJc2NoZWR1bGUoKTsKKwkJCQorCQluX2hkbGMgPSB0dHkybl9oZGxjICh0dHkpOworCQlpZiAoIW5faGRsYyB8fCBuX2hkbGMtPm1hZ2ljICE9IEhETENfTUFHSUMgfHwgCisJCSAgICB0dHkgIT0gbl9oZGxjLT50dHkpIHsKKwkJCXByaW50aygibl9oZGxjX3R0eV93cml0ZTogJXAgaW52YWxpZCBhZnRlciB3YWl0IVxuIiwgbl9oZGxjKTsKKwkJCWVycm9yID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCQkKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQllcnJvciA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CisKKwlpZiAoIWVycm9yKSB7CQkKKwkJLyogUmV0cmlldmUgdGhlIHVzZXIncyBidWZmZXIgKi8KKwkJbWVtY3B5KHRidWYtPmJ1ZiwgZGF0YSwgY291bnQpOworCisJCS8qIFNlbmQgdGhlIGRhdGEgKi8KKwkJdGJ1Zi0+Y291bnQgPSBlcnJvciA9IGNvdW50OworCQluX2hkbGNfYnVmX3B1dCgmbl9oZGxjLT50eF9idWZfbGlzdCx0YnVmKTsKKwkJbl9oZGxjX3NlbmRfZnJhbWVzKG5faGRsYyx0dHkpOworCX0KKworCXJldHVybiBlcnJvcjsKKwkKK30JLyogZW5kIG9mIG5faGRsY190dHlfd3JpdGUoKSAqLworCisvKioKKyAqIG5faGRsY190dHlfaW9jdGwgLSBwcm9jZXNzIElPQ1RMIHN5c3RlbSBjYWxsIGZvciB0aGUgdHR5IGRldmljZS4KKyAqIEB0dHkgLSBwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCisgKiBAZmlsZSAtIHBvaW50ZXIgdG8gb3BlbiBmaWxlIG9iamVjdCBmb3IgZGV2aWNlCisgKiBAY21kIC0gSU9DVEwgY29tbWFuZCBjb2RlCisgKiBAYXJnIC0gYXJndW1lbnQgZm9yIElPQ1RMIGNhbGwgKGNtZCBkZXBlbmRlbnQpCisgKgorICogUmV0dXJucyBjb21tYW5kIGRlcGVuZGVudCByZXN1bHQuCisgKi8KK3N0YXRpYyBpbnQgbl9oZGxjX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMgPSB0dHkybl9oZGxjICh0dHkpOworCWludCBlcnJvciA9IDA7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCisJCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9pb2N0bCgpIGNhbGxlZCAlZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGNtZCk7CisJCQorCS8qIFZlcmlmeSB0aGUgc3RhdHVzIG9mIHRoZSBkZXZpY2UgKi8KKwlpZiAoIW5faGRsYyB8fCBuX2hkbGMtPm1hZ2ljICE9IEhETENfTUFHSUMpCisJCXJldHVybiAtRUJBREY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRklPTlJFQUQ6CisJCS8qIHJlcG9ydCBjb3VudCBvZiByZWFkIGRhdGEgYXZhaWxhYmxlICovCisJCS8qIGluIG5leHQgYXZhaWxhYmxlIGZyYW1lIChpZiBhbnkpICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuX2hkbGMtPnJ4X2J1Zl9saXN0LnNwaW5sb2NrLGZsYWdzKTsKKwkJaWYgKG5faGRsYy0+cnhfYnVmX2xpc3QuaGVhZCkKKwkJCWNvdW50ID0gbl9oZGxjLT5yeF9idWZfbGlzdC5oZWFkLT5jb3VudDsKKwkJZWxzZQorCQkJY291bnQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuX2hkbGMtPnJ4X2J1Zl9saXN0LnNwaW5sb2NrLGZsYWdzKTsKKwkJZXJyb3IgPSBwdXRfdXNlcihjb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgVElPQ09VVFE6CisJCS8qIGdldCB0aGUgcGVuZGluZyB0eCBieXRlIGNvdW50IGluIHRoZSBkcml2ZXIgKi8KKwkJY291bnQgPSB0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyID8KKwkJCQl0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgOiAwOworCQkvKiBhZGQgc2l6ZSBvZiBuZXh0IG91dHB1dCBmcmFtZSBpbiBxdWV1ZSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbl9oZGxjLT50eF9idWZfbGlzdC5zcGlubG9jayxmbGFncyk7CisJCWlmIChuX2hkbGMtPnR4X2J1Zl9saXN0LmhlYWQpCisJCQljb3VudCArPSBuX2hkbGMtPnR4X2J1Zl9saXN0LmhlYWQtPmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuX2hkbGMtPnR4X2J1Zl9saXN0LnNwaW5sb2NrLGZsYWdzKTsKKwkJZXJyb3IgPSBwdXRfdXNlcihjb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVycm9yID0gbl90dHlfaW9jdGwgKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycm9yOworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV9pb2N0bCgpICovCisKKy8qKgorICogbl9oZGxjX3R0eV9wb2xsIC0gVFRZIGNhbGxiYWNrIGZvciBwb2xsIHN5c3RlbSBjYWxsCisgKiBAdHR5IC0gcG9pbnRlciB0byB0dHkgaW5zdGFuY2UgZGF0YQorICogQGZpbHAgLSBwb2ludGVyIHRvIG9wZW4gZmlsZSBvYmplY3QgZm9yIGRldmljZQorICogQHBvbGxfdGFibGUgLSB3YWl0IHF1ZXVlIGZvciBvcGVyYXRpb25zCisgKiAKKyAqIERldGVybWluZSB3aGljaCBvcGVyYXRpb25zIChyZWFkL3dyaXRlKSB3aWxsIG5vdCBibG9jayBhbmQgcmV0dXJuIGluZm8KKyAqIHRvIGNhbGxlci4KKyAqIFJldHVybnMgYSBiaXQgbWFzayBjb250YWluaW5nIGluZm8gb24gd2hpY2ggb3BzIHdpbGwgbm90IGJsb2NrLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5faGRsY190dHlfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgICAgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3Qgbl9oZGxjICpuX2hkbGMgPSB0dHkybl9oZGxjICh0dHkpOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCWlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQlwcmludGsoIiVzKCVkKW5faGRsY190dHlfcG9sbCgpIGNhbGxlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCQorCWlmIChuX2hkbGMgJiYgbl9oZGxjLT5tYWdpYyA9PSBIRExDX01BR0lDICYmIHR0eSA9PSBuX2hkbGMtPnR0eSkgeworCQkvKiBxdWV1ZSBjdXJyZW50IHByb2Nlc3MgaW50byBhbnkgd2FpdCBxdWV1ZSB0aGF0ICovCisJCS8qIG1heSBhd2FrZW4gaW4gdGhlIGZ1dHVyZSAocmVhZCBhbmQgd3JpdGUpICovCisKKwkJcG9sbF93YWl0KGZpbHAsICZ0dHktPnJlYWRfd2FpdCwgd2FpdCk7CisJCXBvbGxfd2FpdChmaWxwLCAmdHR5LT53cml0ZV93YWl0LCB3YWl0KTsKKworCQkvKiBzZXQgYml0cyBmb3Igb3BlcmF0aW9ucyB0aGF0IHdvbid0IGJsb2NrICovCisJCWlmKG5faGRsYy0+cnhfYnVmX2xpc3QuaGVhZCkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsJLyogcmVhZGFibGUgKi8KKwkJaWYgKHRlc3RfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmZsYWdzKSkKKwkJCW1hc2sgfD0gUE9MTEhVUDsKKwkJaWYodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJCW1hc2sgfD0gUE9MTEhVUDsKKwkJaWYobl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0LmhlYWQpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwkvKiB3cml0YWJsZSAqLworCX0KKwlyZXR1cm4gbWFzazsKK30JLyogZW5kIG9mIG5faGRsY190dHlfcG9sbCgpICovCisKKy8qKgorICogbl9oZGxjX2FsbG9jIC0gYWxsb2NhdGUgYW4gbl9oZGxjIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gbmV3bHkgY3JlYXRlZCBzdHJ1Y3R1cmUgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlICVOVUxMCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgbl9oZGxjICpuX2hkbGNfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3Qgbl9oZGxjX2J1ZiAqYnVmOworCWludCBpOworCXN0cnVjdCBuX2hkbGMgKm5faGRsYyA9IGttYWxsb2Moc2l6ZW9mKCpuX2hkbGMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbl9oZGxjKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChuX2hkbGMsIDAsIHNpemVvZigqbl9oZGxjKSk7CisKKwluX2hkbGNfYnVmX2xpc3RfaW5pdCgmbl9oZGxjLT5yeF9mcmVlX2J1Zl9saXN0KTsKKwluX2hkbGNfYnVmX2xpc3RfaW5pdCgmbl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0KTsKKwluX2hkbGNfYnVmX2xpc3RfaW5pdCgmbl9oZGxjLT5yeF9idWZfbGlzdCk7CisJbl9oZGxjX2J1Zl9saXN0X2luaXQoJm5faGRsYy0+dHhfYnVmX2xpc3QpOworCQorCS8qIGFsbG9jYXRlIGZyZWUgcnggYnVmZmVyIGxpc3QgKi8KKwlmb3IoaT0wO2k8REVGQVVMVF9SWF9CVUZfQ09VTlQ7aSsrKSB7CisJCWJ1ZiA9IGttYWxsb2MoTl9IRExDX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZikKKwkJCW5faGRsY19idWZfcHV0KCZuX2hkbGMtPnJ4X2ZyZWVfYnVmX2xpc3QsYnVmKTsKKwkJZWxzZSBpZiAoZGVidWdsZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQkKKwkJCXByaW50aygiJXMoJWQpbl9oZGxjX2FsbG9jKCksIGthbGxvYygpIGZhaWxlZCBmb3IgcnggYnVmZmVyICVkXG4iLF9fRklMRV9fLF9fTElORV9fLCBpKTsKKwl9CisJCisJLyogYWxsb2NhdGUgZnJlZSB0eCBidWZmZXIgbGlzdCAqLworCWZvcihpPTA7aTxERUZBVUxUX1RYX0JVRl9DT1VOVDtpKyspIHsKKwkJYnVmID0ga21hbGxvYyhOX0hETENfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoYnVmKQorCQkJbl9oZGxjX2J1Zl9wdXQoJm5faGRsYy0+dHhfZnJlZV9idWZfbGlzdCxidWYpOworCQllbHNlIGlmIChkZWJ1Z2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCQorCQkJcHJpbnRrKCIlcyglZCluX2hkbGNfYWxsb2MoKSwga2FsbG9jKCkgZmFpbGVkIGZvciB0eCBidWZmZXIgJWRcbiIsX19GSUxFX18sX19MSU5FX18sIGkpOworCX0KKwkKKwkvKiBJbml0aWFsaXplIHRoZSBjb250cm9sIGJsb2NrICovCisJbl9oZGxjLT5tYWdpYyAgPSBIRExDX01BR0lDOworCW5faGRsYy0+ZmxhZ3MgID0gMDsKKwkKKwlyZXR1cm4gbl9oZGxjOworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX2FsbG9jKCkgKi8KKworLyoqCisgKiBuX2hkbGNfYnVmX2xpc3RfaW5pdCAtIGluaXRpYWxpemUgc3BlY2lmaWVkIEhETEMgYnVmZmVyIGxpc3QKKyAqIEBsaXN0IC0gcG9pbnRlciB0byBidWZmZXIgbGlzdAorICovCitzdGF0aWMgdm9pZCBuX2hkbGNfYnVmX2xpc3RfaW5pdChzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0ICpsaXN0KQoreworCW1lbXNldChsaXN0LCAwLCBzaXplb2YoKmxpc3QpKTsKKwlzcGluX2xvY2tfaW5pdCgmbGlzdC0+c3BpbmxvY2spOworfQkvKiBlbmQgb2Ygbl9oZGxjX2J1Zl9saXN0X2luaXQoKSAqLworCisvKioKKyAqIG5faGRsY19idWZfcHV0IC0gYWRkIHNwZWNpZmllZCBIRExDIGJ1ZmZlciB0byB0YWlsIG9mIHNwZWNpZmllZCBsaXN0CisgKiBAbGlzdCAtIHBvaW50ZXIgdG8gYnVmZmVyIGxpc3QKKyAqIEBidWYJLSBwb2ludGVyIHRvIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBuX2hkbGNfYnVmX3B1dChzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0ICpsaXN0LAorCQkJICAgc3RydWN0IG5faGRsY19idWYgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5zcGlubG9jayxmbGFncyk7CisJCisJYnVmLT5saW5rPU5VTEw7CisJaWYobGlzdC0+dGFpbCkKKwkJbGlzdC0+dGFpbC0+bGluayA9IGJ1ZjsKKwllbHNlCisJCWxpc3QtPmhlYWQgPSBidWY7CisJbGlzdC0+dGFpbCA9IGJ1ZjsKKwkobGlzdC0+Y291bnQpKys7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdC0+c3BpbmxvY2ssZmxhZ3MpOworCQorfQkvKiBlbmQgb2Ygbl9oZGxjX2J1Zl9wdXQoKSAqLworCisvKioKKyAqIG5faGRsY19idWZfZ2V0IC0gcmVtb3ZlIGFuZCByZXR1cm4gYW4gSERMQyBidWZmZXIgZnJvbSBsaXN0CisgKiBAbGlzdCAtIHBvaW50ZXIgdG8gSERMQyBidWZmZXIgbGlzdAorICogCisgKiBSZW1vdmUgYW5kIHJldHVybiBhbiBIRExDIGJ1ZmZlciBmcm9tIHRoZSBoZWFkIG9mIHRoZSBzcGVjaWZpZWQgSERMQyBidWZmZXIKKyAqIGxpc3QuCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBIRExDIGJ1ZmZlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSAlTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCBuX2hkbGNfYnVmKiBuX2hkbGNfYnVmX2dldChzdHJ1Y3Qgbl9oZGxjX2J1Zl9saXN0ICpsaXN0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5faGRsY19idWYgKmJ1ZjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdC0+c3BpbmxvY2ssZmxhZ3MpOworCQorCWJ1ZiA9IGxpc3QtPmhlYWQ7CisJaWYgKGJ1ZikgeworCQlsaXN0LT5oZWFkID0gYnVmLT5saW5rOworCQkobGlzdC0+Y291bnQpLS07CisJfQorCWlmICghbGlzdC0+aGVhZCkKKwkJbGlzdC0+dGFpbCA9IE5VTEw7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdC0+c3BpbmxvY2ssZmxhZ3MpOworCXJldHVybiBidWY7CisJCit9CS8qIGVuZCBvZiBuX2hkbGNfYnVmX2dldCgpICovCisKK3N0YXRpYyBjaGFyIGhkbGNfYmFubmVyW10gX19pbml0ZGF0YSA9CisJS0VSTl9JTkZPICJIRExDIGxpbmUgZGlzY2lwbGluZTogdmVyc2lvbiAiIEhETENfVkVSU0lPTgorCSIsIG1heGZyYW1lPSV1XG4iOworc3RhdGljIGNoYXIgaGRsY19yZWdpc3Rlcl9va1tdIF9faW5pdGRhdGEgPQorCUtFUk5fSU5GTyAiTl9IRExDIGxpbmUgZGlzY2lwbGluZSByZWdpc3RlcmVkLlxuIjsKK3N0YXRpYyBjaGFyIGhkbGNfcmVnaXN0ZXJfZmFpbFtdIF9faW5pdGRhdGEgPQorCUtFUk5fRVJSICJlcnJvciByZWdpc3RlcmluZyBsaW5lIGRpc2NpcGxpbmU6ICVkXG4iOworc3RhdGljIGNoYXIgaGRsY19pbml0X2ZhaWxbXSBfX2luaXRkYXRhID0KKwlLRVJOX0lORk8gIk5fSERMQzogaW5pdCBmYWlsdXJlICVkXG4iOworCitzdGF0aWMgaW50IF9faW5pdCBuX2hkbGNfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwkvKiByYW5nZSBjaGVjayBtYXhmcmFtZSBhcmcgKi8KKwlpZiAobWF4ZnJhbWUgPCA0MDk2KQorCQltYXhmcmFtZSA9IDQwOTY7CisJZWxzZSBpZiAobWF4ZnJhbWUgPiA2NTUzNSkKKwkJbWF4ZnJhbWUgPSA2NTUzNTsKKworCXByaW50ayhoZGxjX2Jhbm5lciwgbWF4ZnJhbWUpOworCisJc3RhdHVzID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fSERMQywgJm5faGRsY19sZGlzYyk7CisJaWYgKCFzdGF0dXMpCisJCXByaW50ayhoZGxjX3JlZ2lzdGVyX29rKTsKKwllbHNlCisJCXByaW50ayhoZGxjX3JlZ2lzdGVyX2ZhaWwsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzKQorCQlwcmludGsoaGRsY19pbml0X2ZhaWwsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKKwkKK30JLyogZW5kIG9mIGluaXRfbW9kdWxlKCkgKi8KKworc3RhdGljIGNoYXIgaGRsY191bnJlZ2lzdGVyX29rW10gX19leGl0ZGF0YSA9CisJS0VSTl9JTkZPICJOX0hETEM6IGxpbmUgZGlzY2lwbGluZSB1bnJlZ2lzdGVyZWRcbiI7CitzdGF0aWMgY2hhciBoZGxjX3VucmVnaXN0ZXJfZmFpbFtdIF9fZXhpdGRhdGEgPQorCUtFUk5fRVJSICJOX0hETEM6IGNhbid0IHVucmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiI7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuX2hkbGNfZXhpdCh2b2lkKQoreworCS8qIFJlbGVhc2UgdHR5IHJlZ2lzdHJhdGlvbiBvZiBsaW5lIGRpc2NpcGxpbmUgKi8KKwlpbnQgc3RhdHVzID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fSERMQywgTlVMTCk7CisKKwlpZiAoc3RhdHVzKQorCQlwcmludGsoaGRsY191bnJlZ2lzdGVyX2ZhaWwsIHN0YXR1cyk7CisJZWxzZQorCQlwcmludGsoaGRsY191bnJlZ2lzdGVyX29rKTsKK30KKworbW9kdWxlX2luaXQobl9oZGxjX2luaXQpOworbW9kdWxlX2V4aXQobl9oZGxjX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIEZ1bGdodW0gcGF1bGtmQG1pY3JvZ2F0ZS5jb20iKTsKK21vZHVsZV9wYXJhbShkZWJ1Z2xldmVsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heGZyYW1lLCBpbnQsIDApOworTU9EVUxFX0FMSUFTX0xESVNDKE5fSERMQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODgzMDczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwpAQCAtMCwwICsxLDE0MTYgQEAKKy8qIHIzOTY0IGxpbmVkaXNjaXBsaW5lIGZvciBsaW51eAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgYnkgCisgKiBQaGlsaXBzIEF1dG9tYXRpb24gUHJvamVjdHMKKyAqIEthc3NlbCAoR2VybWFueSkKKyAqIGh0dHA6Ly93d3cucGFwLXBoaWxpcHMuZGUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEF1dGhvcjoKKyAqIEwuIEhhYWcKKyAqCisgKiAkTG9nOiBuX3IzOTY0LmMsdiAkCisgKiBSZXZpc2lvbiAxLjEwICAyMDAxLzAzLzE4IDEzOjAyOjI0ICBkd213MgorICogRml4IHRpbWVyIHVzYWdlLCB1c2Ugc3BpbmxvY2tzIHByb3Blcmx5LgorICoKKyAqIFJldmlzaW9uIDEuOSAgMjAwMS8wMy8xOCAxMjo1MjoxNCAgZHdtdzIKKyAqIE1lcmdlIGNoYW5nZXMgaW4gMi40LjIKKyAqCisgKiBSZXZpc2lvbiAxLjggIDIwMDAvMDMvMjMgMTQ6MTQ6NTQgIGR3bXcyCisgKiBGaXggcmFjZSBpbiBzbGVlcGluZyBpbiByMzk2NF9yZWFkKCkKKyAqCisgKiBSZXZpc2lvbiAxLjcgIDE5OTkvMjgvMDggMTE6NDE6NTAgIGR3bXcyCisgKiBQb3J0IHRvIDIuMyBrZXJuZWwKKyAqCisgKiBSZXZpc2lvbiAxLjYgIDE5OTgvMDkvMzAgMDA6NDA6NDAgIGR3bXcyCisgKiBGaXhlZCBjb21waWxhdGlvbiBvbiAyLjAueCBrZXJuZWxzCisgKiBVcGRhdGVkIHRvIG5ld2x5IHJlZ2lzdGVyZWQgdHR5LWxkaXNjIG51bWJlciA5CisgKgorICogUmV2aXNpb24gMS41ICAxOTk4LzA5LzA0IDIxOjU3OjM2ICBkd213MgorICogU2lnbmFsIGhhbmRsaW5nIGJ1ZyBmaXhlcywgcG9ydCB0byAyLjEueC4KKyAqCisgKiBSZXZpc2lvbiAxLjQgIDE5OTgvMDQvMDIgMjA6MjY6NTkgIGxoYWFnCisgKiBzZWxlY3QsIGJsb2NraW5nLCAuLi4KKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTgvMDIvMTIgMTg6NTg6NDMgIHJvb3QKKyAqIGZpeGVkIHNvbWUgbWVtb3J5IGxlYWtzCisgKiBjYWxjdWxhdGlvbiBvZiBjaGVja3N1bSBjaGFyYWN0ZXJzCisgKgorICogUmV2aXNpb24gMS4yICAxOTk4LzAyLzA3IDEzOjAzOjM0ICByb290CisgKiBpb2N0bCByZWFkX3RlbGVncmFtCisgKgorICogUmV2aXNpb24gMS4xICAxOTk4LzAyLzA2IDE5OjIxOjAzICByb290CisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gICAvKiB1c2VkIGluIG5ldyB0dHkgZHJpdmVycyAqLworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPiAgIC8qIHVzZWQgaW4gbmV3IHR0eSBkcml2ZXJzICovCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uX3IzOTY0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8vI2RlZmluZSBERUJVR19RVUVVRQorCisvKiBMb2cgc3VjY2Vzc2Z1bCBoYW5kc2hha2UgYW5kIHByb3RvY29sIG9wZXJhdGlvbnMgICovCisvLyNkZWZpbmUgREVCVUdfUFJPVE9fUworCisvKiBMb2cgaGFuZHNoYWtlIGFuZCBwcm90b2NvbCBlcnJvcnM6ICovCisvLyNkZWZpbmUgREVCVUdfUFJPVE9fRQorCisvKiBMb2cgTGluZWRpc2NpcGxpbmUgb3BlcmF0aW9ucyAob3BlbiwgY2xvc2UsIHJlYWQsIHdyaXRlLi4uKTogKi8KKy8vI2RlZmluZSBERUJVR19MRElTQworCisvKiBMb2cgbW9kdWxlIGFuZCBtZW1vcnkgb3BlcmF0aW9ucyAoaW5pdCwgY2xlYW51cDsga21hbGxvYywga2ZyZWUpOiAqLworLy8jZGVmaW5lIERFQlVHX01PRFVMCisKKy8qIE1hY3JvIGhlbHBlcnMgZm9yIGRlYnVnIG91dHB1dDogKi8KKyNkZWZpbmUgVFJBQ0UoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoInIzOTY0OiAiIGZvcm1hdCAiXG4iICwgIyMgYXJncyk7CisKKyNpZmRlZiBERUJVR19NT0RVTAorI2RlZmluZSBUUkFDRV9NKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKCJyMzk2NDogIiBmb3JtYXQgIlxuIiAsICMjIGFyZ3MpOworI2Vsc2UKKyNkZWZpbmUgVFJBQ0VfTShmbXQsIGFyZy4uLikgLyoqLworI2VuZGlmCisKKyNpZmRlZiBERUJVR19QUk9UT19TCisjZGVmaW5lIFRSQUNFX1BTKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKCJyMzk2NDogIiBmb3JtYXQgIlxuIiAsICMjIGFyZ3MpOworI2Vsc2UKKyNkZWZpbmUgVFJBQ0VfUFMoZm10LCBhcmcuLi4pIC8qKi8KKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUFJPVE9fRQorI2RlZmluZSBUUkFDRV9QRShmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygicjM5NjQ6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmdzKTsKKyNlbHNlCisjZGVmaW5lIFRSQUNFX1BFKGZtdCwgYXJnLi4uKSAvKiovCisjZW5kaWYKKworI2lmZGVmIERFQlVHX0xESVNDCisjZGVmaW5lIFRSQUNFX0woZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoInIzOTY0OiAiIGZvcm1hdCAiXG4iICwgIyMgYXJncyk7CisjZWxzZQorI2RlZmluZSBUUkFDRV9MKGZtdCwgYXJnLi4uKSAvKiovCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1FVRVVFCisjZGVmaW5lIFRSQUNFX1EoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoInIzOTY0OiAiIGZvcm1hdCAiXG4iICwgIyMgYXJncyk7CisjZWxzZQorI2RlZmluZSBUUkFDRV9RKGZtdCwgYXJnLi4uKSAvKiovCisjZW5kaWYKKworc3RhdGljIHZvaWQgYWRkX3R4X3F1ZXVlKHN0cnVjdCByMzk2NF9pbmZvICosIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKik7CitzdGF0aWMgdm9pZCByZW1vdmVfZnJvbV90eF9xdWV1ZShzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIGludCBlcnJvcl9jb2RlKTsKK3N0YXRpYyB2b2lkIHB1dF9jaGFyKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgdW5zaWduZWQgY2hhciBjaCk7CitzdGF0aWMgdm9pZCB0cmlnZ2VyX3RyYW5zbWl0KHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbyk7CitzdGF0aWMgdm9pZCByZXRyeV90cmFuc21pdChzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8pOworc3RhdGljIHZvaWQgdHJhbnNtaXRfYmxvY2soc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKTsKK3N0YXRpYyB2b2lkIHJlY2VpdmVfY2hhcihzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIGNvbnN0IHVuc2lnbmVkIGNoYXIgYyk7CitzdGF0aWMgdm9pZCByZWNlaXZlX2Vycm9yKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgY29uc3QgY2hhciBmbGFnKTsKK3N0YXRpYyB2b2lkIG9uX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwcml2KTsKK3N0YXRpYyBpbnQgZW5hYmxlX3NpZ25hbHMoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBwaWRfdCBwaWQsIGludCBhcmcpOworc3RhdGljIGludCByZWFkX3RlbGVncmFtKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgcGlkX3QgcGlkLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmKTsKK3N0YXRpYyB2b2lkIGFkZF9tc2coc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50LCBpbnQgbXNnX2lkLCBpbnQgYXJnLAorICAgICAgICAgICAgIGludCBlcnJvcl9jb2RlLCBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwQmxvY2spOworc3RhdGljIHN0cnVjdCByMzk2NF9tZXNzYWdlKiByZW1vdmVfbXNnKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgCisgICAgICAgICAgICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50KTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9jbGllbnRfYmxvY2soc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQpOworCitzdGF0aWMgaW50ICByMzk2NF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgcjM5NjRfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgc3NpemVfdCByMzk2NF9yZWFkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5yKTsKK3N0YXRpYyBzc2l6ZV90IHIzOTY0X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1Ziwgc2l6ZV90IG5yKTsKK3N0YXRpYyBpbnQgcjM5NjRfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcjM5NjRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpOworc3RhdGljIHVuc2lnbmVkIGludCByMzk2NF9wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAgKndhaXQpOworc3RhdGljIHZvaWQgcjM5NjRfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmcCwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgIHIzOTY0X3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2MgdHR5X2xkaXNjX05fUjM5NjQgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5tYWdpYwk9IFRUWV9MRElTQ19NQUdJQywgCisJLm5hbWUJPSAiUjM5NjQiLAorCS5vcGVuCT0gcjM5NjRfb3BlbiwKKwkuY2xvc2UJPSByMzk2NF9jbG9zZSwKKwkucmVhZAk9IHIzOTY0X3JlYWQsCisJLndyaXRlCT0gcjM5NjRfd3JpdGUsCisJLmlvY3RsCT0gcjM5NjRfaW9jdGwsCisJLnNldF90ZXJtaW9zID0gcjM5NjRfc2V0X3Rlcm1pb3MsCisJLnBvbGwJPSByMzk2NF9wb2xsLCAgICAgICAgICAgIAorCS5yZWNlaXZlX2J1ZiA9IHIzOTY0X3JlY2VpdmVfYnVmLAorCS5yZWNlaXZlX3Jvb20gPSByMzk2NF9yZWNlaXZlX3Jvb20sCit9OworCisKKworc3RhdGljIHZvaWQgZHVtcF9ibG9jayhjb25zdCB1bnNpZ25lZCBjaGFyICpibG9jaywgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgIHVuc2lnbmVkIGludCBpLGo7CisgICBjaGFyIGxpbmVidWZbMTYqMysxXTsKKyAgIAorICAgZm9yKGk9MDtpPGxlbmd0aDtpKz0xNikKKyAgIHsKKyAgICAgIGZvcihqPTA7KGo8MTYpICYmIChqK2k8bGVuZ3RoKTtqKyspCisgICAgICB7CisgICAgICAgICBzcHJpbnRmKGxpbmVidWYrMypqLCIlMDJ4ICIsYmxvY2tbaStqXSk7CisgICAgICB9CisgICAgICBsaW5lYnVmWzMqal09J1wwJzsKKyAgICAgIFRSQUNFX1BTKCIlcyIsbGluZWJ1Zik7CisgICB9Cit9CisKKyAgICAgICAgIAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEcml2ZXIgaW5pdGlhbGlzYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgc3VwcG9ydCByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCByMzk2NF9leGl0KHZvaWQpCit7CisgICBpbnQgc3RhdHVzOworICAgCisgICBUUkFDRV9NICgiY2xlYW51cF9tb2R1bGUoKSIpOworCisgICBzdGF0dXM9dHR5X3JlZ2lzdGVyX2xkaXNjKE5fUjM5NjQsIE5VTEwpOworICAgCisgICBpZihzdGF0dXMhPTApCisgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInIzOTY0OiBlcnJvciB1bnJlZ2lzdGVyaW5nIGxpbmVkaXNjaXBsaW5lOiAlZFxuIiwgc3RhdHVzKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIFRSQUNFX0woImxpbmVkaXNjaXBsaW5lIHN1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyZWQiKTsKKyAgIH0KKyAgIAorfQorCitzdGF0aWMgaW50IF9faW5pdCByMzk2NF9pbml0KHZvaWQpCit7CisgICBpbnQgc3RhdHVzOworICAgCisgICBwcmludGsgKCJyMzk2NDogUGhpbGlwcyByMzk2NCBEcml2ZXIgJFJldmlzaW9uOiAxLjEwICRcbiIpOworCisgICAvKgorICAgICogUmVnaXN0ZXIgdGhlIHR0eSBsaW5lIGRpc2NpcGxpbmUKKyAgICAqLworICAgCisgICBzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MgKE5fUjM5NjQsICZ0dHlfbGRpc2NfTl9SMzk2NCk7CisgICBpZiAoc3RhdHVzID09IDApCisgICAgIHsKKyAgICAgICBUUkFDRV9MKCJsaW5lIGRpc2NpcGxpbmUgJWQgcmVnaXN0ZXJlZCIsIE5fUjM5NjQpOworICAgICAgIFRSQUNFX0woImZsYWdzPSV4IG51bT0leCIsIHR0eV9sZGlzY19OX1IzOTY0LmZsYWdzLCAKKyAgICAgICAgICAgICAgIHR0eV9sZGlzY19OX1IzOTY0Lm51bSk7CisgICAgICAgVFJBQ0VfTCgib3Blbj0leCIsIChpbnQpdHR5X2xkaXNjX05fUjM5NjQub3Blbik7CisgICAgICAgVFJBQ0VfTCgidHR5X2xkaXNjX05fUjM5NjQgPSAleCIsIChpbnQpJnR0eV9sZGlzY19OX1IzOTY0KTsKKyAgICAgfQorICAgZWxzZQorICAgICB7CisgICAgICAgcHJpbnRrIChLRVJOX0VSUiAicjM5NjQ6IGVycm9yIHJlZ2lzdGVyaW5nIGxpbmUgZGlzY2lwbGluZTogJWRcbiIsIHN0YXR1cyk7CisgICAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisKK21vZHVsZV9pbml0KHIzOTY0X2luaXQpOworbW9kdWxlX2V4aXQocjM5NjRfZXhpdCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb3RvY29sIGltcGxlbWVudGF0aW9uIHJvdXRpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYWRkX3R4X3F1ZXVlKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEhlYWRlcikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAKKyAgIHNwaW5fbG9ja19pcnFzYXZlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICBwSGVhZGVyLT5uZXh0ID0gTlVMTDsKKworICAgaWYocEluZm8tPnR4X2xhc3QgPT0gTlVMTCkKKyAgIHsKKyAgICAgIHBJbmZvLT50eF9maXJzdCA9IHBJbmZvLT50eF9sYXN0ID0gcEhlYWRlcjsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHBJbmZvLT50eF9sYXN0LT5uZXh0ID0gcEhlYWRlcjsKKyAgICAgIHBJbmZvLT50eF9sYXN0ID0gcEhlYWRlcjsKKyAgIH0KKyAgIAorICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgVFJBQ0VfUSgiYWRkX3R4X3F1ZXVlICV4LCBsZW5ndGggJWQsIHR4X2ZpcnN0ID0gJXgiLCAKKyAgICAgICAgICAoaW50KXBIZWFkZXIsIHBIZWFkZXItPmxlbmd0aCwgKGludClwSW5mby0+dHhfZmlyc3QgKTsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2Zyb21fdHhfcXVldWUoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBpbnQgZXJyb3JfY29kZSkKK3sKKyAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBIZWFkZXI7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIERFQlVHX1FVRVVFCisgICBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwRHVtcDsKKyNlbmRpZgorICAgCisgICBwSGVhZGVyID0gcEluZm8tPnR4X2ZpcnN0OworCisgICBpZihwSGVhZGVyPT1OVUxMKQorICAgICAgcmV0dXJuOworCisjaWZkZWYgREVCVUdfUVVFVUUKKyAgIHByaW50aygicjM5NjQ6IHJlbW92ZV9mcm9tX3R4X3F1ZXVlOiAleCwgbGVuZ3RoICVkIC0gIiwKKyAgICAgICAgICAoaW50KXBIZWFkZXIsIChpbnQpcEhlYWRlci0+bGVuZ3RoICk7CisgICBmb3IocER1bXA9cEhlYWRlcjtwRHVtcDtwRHVtcD1wRHVtcC0+bmV4dCkKKwkgcHJpbnRrKCIleCAiLCAoaW50KXBEdW1wKTsKKyAgIHByaW50aygiXG4iKTsKKyNlbmRpZgorCisKKyAgIGlmKHBIZWFkZXItPm93bmVyKQorICAgeworICAgICAgaWYoZXJyb3JfY29kZSkKKyAgICAgIHsKKyAgICAgICAgICBhZGRfbXNnKHBIZWFkZXItPm93bmVyLCBSMzk2NF9NU0dfQUNLLCAwLCAKKyAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUsIE5VTEwpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIGFkZF9tc2cocEhlYWRlci0+b3duZXIsIFIzOTY0X01TR19BQ0ssIHBIZWFkZXItPmxlbmd0aCwgCisgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnBJbmZvLT5yZWFkX3dhaXQpOworICAgfQorCisgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgcEluZm8tPnR4X2ZpcnN0ID0gcEhlYWRlci0+bmV4dDsKKyAgIGlmKHBJbmZvLT50eF9maXJzdD09TlVMTCkKKyAgIHsKKyAgICAgIHBJbmZvLT50eF9sYXN0ID0gTlVMTDsKKyAgIH0KKworICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAga2ZyZWUocEhlYWRlcik7CisgICBUUkFDRV9NKCJyZW1vdmVfZnJvbV90eF9xdWV1ZSAtIGtmcmVlICV4IiwoaW50KXBIZWFkZXIpOworCisgICBUUkFDRV9RKCJyZW1vdmVfZnJvbV90eF9xdWV1ZTogdHhfZmlyc3QgPSAleCwgdHhfbGFzdCA9ICV4IiwKKyAgICAgICAgICAoaW50KXBJbmZvLT50eF9maXJzdCwgKGludClwSW5mby0+dHhfbGFzdCApOworfQorCitzdGF0aWMgdm9pZCBhZGRfcnhfcXVldWUoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpwSGVhZGVyKQoreworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIAorICAgc3Bpbl9sb2NrX2lycXNhdmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisKKyAgIHBIZWFkZXItPm5leHQgPSBOVUxMOworCisgICBpZihwSW5mby0+cnhfbGFzdCA9PSBOVUxMKQorICAgeworICAgICAgcEluZm8tPnJ4X2ZpcnN0ID0gcEluZm8tPnJ4X2xhc3QgPSBwSGVhZGVyOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcEluZm8tPnJ4X2xhc3QtPm5leHQgPSBwSGVhZGVyOworICAgICAgcEluZm8tPnJ4X2xhc3QgPSBwSGVhZGVyOworICAgfQorICAgcEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZSsrOworICAgCisgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCisgICBUUkFDRV9RKCJhZGRfcnhfcXVldWU6ICV4LCBsZW5ndGggPSAlZCwgcnhfZmlyc3QgPSAleCwgY291bnQgPSAlZCIsCisgICAgICAgICAgKGludClwSGVhZGVyLCBwSGVhZGVyLT5sZW5ndGgsCisgICAgICAgICAgKGludClwSW5mby0+cnhfZmlyc3QsIHBJbmZvLT5ibG9ja3NfaW5fcnhfcXVldWUpOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZnJvbV9yeF9xdWV1ZShzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sCisgICAgICAgICAgICAgICAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBIZWFkZXIpCit7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEZpbmQ7CisgICAKKyAgIGlmKHBIZWFkZXI9PU5VTEwpCisgICAgICByZXR1cm47CisKKyAgIFRSQUNFX1EoInJlbW92ZV9mcm9tX3J4X3F1ZXVlOiByeF9maXJzdCA9ICV4LCByeF9sYXN0ID0gJXgsIGNvdW50ID0gJWQiLAorICAgICAgICAgIChpbnQpcEluZm8tPnJ4X2ZpcnN0LCAoaW50KXBJbmZvLT5yeF9sYXN0LCBwSW5mby0+YmxvY2tzX2luX3J4X3F1ZXVlICk7CisgICBUUkFDRV9RKCJyZW1vdmVfZnJvbV9yeF9xdWV1ZTogJXgsIGxlbmd0aCAlZCIsCisgICAgICAgICAgKGludClwSGVhZGVyLCAoaW50KXBIZWFkZXItPmxlbmd0aCApOworCisgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgaWYocEluZm8tPnJ4X2ZpcnN0ID09IHBIZWFkZXIpCisgICB7CisgICAgICAvKiBSZW1vdmUgdGhlIGZpcnN0IGJsb2NrIGluIHRoZSBsaW5rZWQgbGlzdDogKi8KKyAgICAgIHBJbmZvLT5yeF9maXJzdCA9IHBIZWFkZXItPm5leHQ7CisgICAgICAKKyAgICAgIGlmKHBJbmZvLT5yeF9maXJzdD09TlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBJbmZvLT5yeF9sYXN0ID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIHBJbmZvLT5ibG9ja3NfaW5fcnhfcXVldWUtLTsKKyAgIH0KKyAgIGVsc2UgCisgICB7CisgICAgICAvKiBGaW5kIGJsb2NrIHRvIHJlbW92ZTogKi8KKyAgICAgIGZvcihwRmluZD1wSW5mby0+cnhfZmlyc3Q7IHBGaW5kOyBwRmluZD1wRmluZC0+bmV4dCkKKyAgICAgIHsKKyAgICAgICAgIGlmKHBGaW5kLT5uZXh0ID09IHBIZWFkZXIpIAorICAgICAgICAgeworICAgICAgICAgICAgLyogR290IGl0LiAqLworICAgICAgICAgICAgcEZpbmQtPm5leHQgPSBwSGVhZGVyLT5uZXh0OworICAgICAgICAgICAgcEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZS0tOworICAgICAgICAgICAgaWYocEZpbmQtPm5leHQ9PU5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBPaCwgcmVtb3ZlZCB0aGUgbGFzdCBvbmUhICovCisgICAgICAgICAgICAgICBwSW5mby0+cnhfbGFzdCA9IHBGaW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisKKyAgIGtmcmVlKHBIZWFkZXIpOworICAgVFJBQ0VfTSgicmVtb3ZlX2Zyb21fcnhfcXVldWUgLSBrZnJlZSAleCIsKGludClwSGVhZGVyKTsKKworICAgVFJBQ0VfUSgicmVtb3ZlX2Zyb21fcnhfcXVldWU6IHJ4X2ZpcnN0ID0gJXgsIHJ4X2xhc3QgPSAleCwgY291bnQgPSAlZCIsCisgICAgICAgICAgKGludClwSW5mby0+cnhfZmlyc3QsIChpbnQpcEluZm8tPnJ4X2xhc3QsIHBJbmZvLT5ibG9ja3NfaW5fcnhfcXVldWUgKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2NoYXIoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCB1bnNpZ25lZCBjaGFyIGNoKQoreworICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBJbmZvLT50dHk7CisKKyAgIGlmKHR0eT09TlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYodHR5LT5kcml2ZXItPnB1dF9jaGFyKQorICAgeworICAgICAgdHR5LT5kcml2ZXItPnB1dF9jaGFyKHR0eSwgY2gpOworICAgfQorICAgcEluZm8tPmJjYyBePSBjaDsKK30KKworc3RhdGljIHZvaWQgZmx1c2goc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKQoreworICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBJbmZvLT50dHk7CisKKyAgIGlmKHR0eT09TlVMTCkKKyAgICAgIHJldHVybjsKKworICAgaWYodHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKQorICAgeworICAgICAgdHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKHR0eSk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfdHJhbnNtaXQoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKQoreworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIAorCisgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgaWYoKHBJbmZvLT5zdGF0ZSA9PSBSMzk2NF9JRExFKSAmJiAocEluZm8tPnR4X2ZpcnN0IT1OVUxMKSkKKyAgIHsKKyAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X1RYX1JFUVVFU1Q7CisgICAgICBwSW5mby0+blJldHJ5PTA7CisgICAgICBwSW5mby0+ZmxhZ3MgJj0gflIzOTY0X0VSUk9SOworICAgICAgbW9kX3RpbWVyKCZwSW5mby0+dG1yLCBqaWZmaWVzICsgUjM5NjRfVE9fUVZaKTsKKworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKworICAgICAgVFJBQ0VfUFMoInRyaWdnZXJfdHJhbnNtaXQgLSBzZW50IFNUWCIpOworCisgICAgICBwdXRfY2hhcihwSW5mbywgU1RYKTsKKyAgICAgIGZsdXNoKHBJbmZvKTsKKworICAgICAgcEluZm8tPmJjYyA9IDA7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworICAgfQorfQorCitzdGF0aWMgdm9pZCByZXRyeV90cmFuc21pdChzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8pCit7CisgICBpZihwSW5mby0+blJldHJ5PFIzOTY0X01BWF9SRVRSSUVTKQorICAgeworICAgICAgVFJBQ0VfUEUoInRyYW5zbWlzc2lvbiBmYWlsZWQuIFJldHJ5ICMlZCIsIAorICAgICAgICAgICAgIHBJbmZvLT5uUmV0cnkpOworICAgICAgcEluZm8tPmJjYyA9IDA7CisgICAgICBwdXRfY2hhcihwSW5mbywgU1RYKTsKKyAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X1RYX1JFUVVFU1Q7CisgICAgICBwSW5mby0+blJldHJ5Kys7CisgICAgICBtb2RfdGltZXIoJnBJbmZvLT50bXIsIGppZmZpZXMgKyBSMzk2NF9UT19RVlopOworICAgfQorICAgZWxzZQorICAgeworICAgICAgVFJBQ0VfUEUoInRyYW5zbWlzc2lvbiBmYWlsZWQgYWZ0ZXIgJWQgcmV0cmllcyIsIAorICAgICAgICAgICAgIFIzOTY0X01BWF9SRVRSSUVTKTsKKworICAgICAgcmVtb3ZlX2Zyb21fdHhfcXVldWUocEluZm8sIFIzOTY0X1RYX0ZBSUwpOworICAgICAgCisgICAgICBwdXRfY2hhcihwSW5mbywgTkFLKTsKKyAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X0lETEU7CisKKyAgICAgIHRyaWdnZXJfdHJhbnNtaXQocEluZm8pOworICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRyYW5zbWl0X2Jsb2NrKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbykKK3sKKyAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwSW5mby0+dHR5OworICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEJsb2NrID0gcEluZm8tPnR4X2ZpcnN0OworICAgaW50IHJvb209MDsKKworICAgaWYoKHR0eT09TlVMTCkgfHwgKHBCbG9jaz09TlVMTCkpCisgICB7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIGlmKHR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKQorICAgICAgcm9vbT10dHktPmRyaXZlci0+d3JpdGVfcm9vbSh0dHkpOworCisgICBUUkFDRV9QUygidHJhbnNtaXRfYmxvY2sgJXgsIHJvb20gJWQsIGxlbmd0aCAlZCIsIAorICAgICAgICAgIChpbnQpcEJsb2NrLCByb29tLCBwQmxvY2stPmxlbmd0aCk7CisgICAKKyAgIHdoaWxlKHBJbmZvLT50eF9wb3NpdGlvbiA8IHBCbG9jay0+bGVuZ3RoKQorICAgeworICAgICAgaWYocm9vbTwyKQorICAgICAgICAgYnJlYWs7CisgCisgICAgICBpZihwQmxvY2stPmRhdGFbcEluZm8tPnR4X3Bvc2l0aW9uXT09RExFKQorICAgICAgeworICAgICAgICAgLyogc2VuZCBhZGRpdGlvbmFsIERMRSBjaGFyOiAqLworICAgICAgICAgcHV0X2NoYXIocEluZm8sIERMRSk7CisgICAgICB9CisgICAgICBwdXRfY2hhcihwSW5mbywgcEJsb2NrLT5kYXRhW3BJbmZvLT50eF9wb3NpdGlvbisrXSk7CisgICAgICAKKyAgICAgIHJvb20tLTsKKyAgIH0KKworICAgaWYoKHBJbmZvLT50eF9wb3NpdGlvbiA9PSBwQmxvY2stPmxlbmd0aCkgJiYgKHJvb20+PTMpKQorICAgeworICAgICAgcHV0X2NoYXIocEluZm8sIERMRSk7CisgICAgICBwdXRfY2hhcihwSW5mbywgRVRYKTsKKyAgICAgIGlmKHBJbmZvLT5mbGFncyAmIFIzOTY0X0JDQykKKyAgICAgIHsKKyAgICAgICAgIHB1dF9jaGFyKHBJbmZvLCBwSW5mby0+YmNjKTsKKyAgICAgIH0KKyAgICAgIHBJbmZvLT5zdGF0ZSA9IFIzOTY0X1dBSVRfRk9SX1RYX0FDSzsKKyAgICAgIG1vZF90aW1lcigmcEluZm8tPnRtciwgamlmZmllcyArIFIzOTY0X1RPX1FWWik7CisgICB9CisgICBmbHVzaChwSW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX3JlY2VpdmVfYmxvY2soc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvKQoreworICAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudDsKKyAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBCbG9jazsKKyAgIAorICAgbGVuZ3RoPXBJbmZvLT5yeF9wb3NpdGlvbjsKKworICAgLyogY29tcGFyZSBieXRlIGNoZWNrc3VtIGNoYXJhY3RlcnM6ICovCisgICBpZihwSW5mby0+ZmxhZ3MgJiBSMzk2NF9CQ0MpCisgICB7CisgICAgICBpZihwSW5mby0+YmNjIT1wSW5mby0+bGFzdF9yeCkKKyAgICAgIHsKKyAgICAgICAgIFRSQUNFX1BFKCJjaGVja3N1bSBlcnJvciAtIGdvdCAleCBidXQgZXhwZWN0ZWQgJXgiLAorICAgICAgICAgICAgICAgIHBJbmZvLT5sYXN0X3J4LCBwSW5mby0+YmNjKTsKKyAgICAgICAgIHBJbmZvLT5mbGFncyB8PSBSMzk2NF9DSEVDS1NVTTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogY2hlY2sgZm9yIGVycm9ycyAocGFyaXR5LCBvdmVycnVuLC4uLik6ICovCisgICBpZihwSW5mby0+ZmxhZ3MgJiBSMzk2NF9FUlJPUikKKyAgIHsKKyAgICAgIFRSQUNFX1BFKCJvbl9yZWNlaXZlX2Jsb2NrIC0gdHJhbnNtaXNzaW9uIGZhaWxlZCBlcnJvciAleCIsCisgICAgICAgICAgICAgcEluZm8tPmZsYWdzICYgUjM5NjRfRVJST1IpOworICAgICAgCisgICAgICBwdXRfY2hhcihwSW5mbywgTkFLKTsKKyAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgIGlmKHBJbmZvLT5uUmV0cnk8UjM5NjRfTUFYX1JFVFJJRVMpCisgICAgICB7CisgICAgICAgICBwSW5mby0+c3RhdGU9UjM5NjRfV0FJVF9GT1JfUlhfUkVQRUFUOworICAgICAgICAgcEluZm8tPm5SZXRyeSsrOworCSBtb2RfdGltZXIoJnBJbmZvLT50bXIsIGppZmZpZXMgKyBSMzk2NF9UT19SWF9QQU5JQyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBUUkFDRV9QRSgib25fcmVjZWl2ZV9ibG9jayAtIGZhaWxlZCBhZnRlciBtYXggcmV0cmllcyIpOworICAgICAgICAgcEluZm8tPnN0YXRlPVIzOTY0X0lETEU7CisgICAgICB9CisgICAgICByZXR1cm47CisgICB9CisKKyAgIAorICAgLyogcmVjZWl2ZWQgYmxvY2s7IHN1Ym1pdCBETEU6ICovCisgICBwdXRfY2hhcihwSW5mbywgRExFKTsKKyAgIGZsdXNoKHBJbmZvKTsKKyAgIGRlbF90aW1lcl9zeW5jKCZwSW5mby0+dG1yKTsKKyAgIFRSQUNFX1BTKCIgcnggc3VjY2VzczogZ290ICVkIGNoYXJzIiwgbGVuZ3RoKTsKKworICAgLyogcHJlcGFyZSBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyOiAqLworICAgcEJsb2NrID0ga21hbGxvYyhsZW5ndGgrc2l6ZW9mKHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIpLCBHRlBfS0VSTkVMKTsKKyAgIFRSQUNFX00oIm9uX3JlY2VpdmVfYmxvY2sgLSBrbWFsbG9jICV4IiwoaW50KXBCbG9jayk7CisKKyAgIGlmKHBCbG9jaz09TlVMTCkKKyAgICAgIHJldHVybjsKKworICAgcEJsb2NrLT5sZW5ndGggPSBsZW5ndGg7CisgICBwQmxvY2stPmRhdGEgICA9ICgodW5zaWduZWQgY2hhciopcEJsb2NrKStzaXplb2Yoc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlcik7CisgICBwQmxvY2stPmxvY2tzICA9IDA7CisgICBwQmxvY2stPm5leHQgICA9IE5VTEw7CisgICBwQmxvY2stPm93bmVyICA9IE5VTEw7CisKKyAgIG1lbWNweShwQmxvY2stPmRhdGEsIHBJbmZvLT5yeF9idWYsIGxlbmd0aCk7CisKKyAgIC8qIHF1ZXVlIGJsb2NrIGludG8gcnhfcXVldWU6ICovCisgICBhZGRfcnhfcXVldWUocEluZm8sIHBCbG9jayk7CisKKyAgIC8qIG5vdGlmeSBhdHRhY2hlZCBjbGllbnQgcHJvY2Vzc2VzOiAqLworICAgZm9yKHBDbGllbnQ9cEluZm8tPmZpcnN0Q2xpZW50OyBwQ2xpZW50OyBwQ2xpZW50PXBDbGllbnQtPm5leHQpCisgICB7CisgICAgICBpZihwQ2xpZW50LT5zaWdfZmxhZ3MgJiBSMzk2NF9TSUdfREFUQSkKKyAgICAgIHsKKyAgICAgICAgIGFkZF9tc2cocENsaWVudCwgUjM5NjRfTVNHX0RBVEEsIGxlbmd0aCwgUjM5NjRfT0ssIHBCbG9jayk7CisgICAgICB9CisgICB9CisgICB3YWtlX3VwX2ludGVycnVwdGlibGUgKCZwSW5mby0+cmVhZF93YWl0KTsKKyAgIAorICAgcEluZm8tPnN0YXRlID0gUjM5NjRfSURMRTsKKworICAgdHJpZ2dlcl90cmFuc21pdChwSW5mbyk7Cit9CisKKworc3RhdGljIHZvaWQgcmVjZWl2ZV9jaGFyKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgY29uc3QgdW5zaWduZWQgY2hhciBjKQoreworICAgc3dpdGNoKHBJbmZvLT5zdGF0ZSkKKyAgIHsKKyAgICAgIGNhc2UgUjM5NjRfVFhfUkVRVUVTVDoKKyAgICAgICAgIGlmKGM9PURMRSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFX1BTKCJUWF9SRVFVRVNUIC0gZ290IERMRSIpOworCisgICAgICAgICAgICBwSW5mby0+c3RhdGUgPSBSMzk2NF9UUkFOU01JVFRJTkc7CisgICAgICAgICAgICBwSW5mby0+dHhfcG9zaXRpb24gPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICB0cmFuc21pdF9ibG9jayhwSW5mbyk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmKGM9PVNUWCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJbmZvLT5uUmV0cnk9PTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUUkFDRV9QRSgiVFhfUkVRVUVTVCAtIGluaXQgY29uZmxpY3QiKTsKKyAgICAgICAgICAgICAgIGlmKHBJbmZvLT5wcmlvcml0eSA9PSBSMzk2NF9TTEFWRSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gc3RhcnRfcmVjZWl2aW5nOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUUkFDRV9QRSgiVFhfUkVRVUVTVCAtIHNlY29uZGFyeSBpbml0IGNvbmZsaWN0IT8iCisgICAgICAgICAgICAgICAgICAgICAgICAiIFN3aXRjaGluZyB0byBTTEFWRSBtb2RlIGZvciBuZXh0IHJ4LiIpOworICAgICAgICAgICAgICAgZ290byBzdGFydF9yZWNlaXZpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBUUkFDRV9QRSgiVFhfUkVRVUVTVCAtIGNoYXIgIT0gRExFOiAleCIsIGMpOworICAgICAgICAgICAgcmV0cnlfdHJhbnNtaXQocEluZm8pOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFIzOTY0X1RSQU5TTUlUVElORzoKKyAgICAgICAgIGlmKGM9PU5BSykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFX1BFKCJUUkFOU01JVFRJTkcgLSBnb3QgTkFLIik7CisgICAgICAgICAgICByZXRyeV90cmFuc21pdChwSW5mbyk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBUUkFDRV9QRSgiVFJBTlNNSVRUSU5HIC0gZ290IGludmFsaWQgY2hhciIpOworIAorICAgICAgICAgICAgcEluZm8tPnN0YXRlID0gUjM5NjRfV0FJVF9aVlpfQkVGT1JFX1RYX1JFVFJZOworCSAgICBtb2RfdGltZXIoJnBJbmZvLT50bXIsIGppZmZpZXMgKyBSMzk2NF9UT19aVlopOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFIzOTY0X1dBSVRfRk9SX1RYX0FDSzoKKyAgICAgICAgIGlmKGM9PURMRSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFX1BTKCJXQUlUX0ZPUl9UWF9BQ0sgLSBnb3QgRExFIik7CisgICAgICAgICAgICByZW1vdmVfZnJvbV90eF9xdWV1ZShwSW5mbywgUjM5NjRfT0spOworICAgICAgICAgICAgCisgICAgICAgICAgICBwSW5mby0+c3RhdGUgPSBSMzk2NF9JRExFOworICAgICAgICAgICAgdHJpZ2dlcl90cmFuc21pdChwSW5mbyk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICByZXRyeV90cmFuc21pdChwSW5mbyk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfUlhfUkVQRUFUOgorICAgICAgICAgLyogRkFMTFRST1VHSCAqLworICAgICAgY2FzZSBSMzk2NF9JRExFOgorICAgICAgICAgaWYoYz09U1RYKQorICAgICAgICAgeworICAgICAgICAgICAgLyogUHJldmVudCByeF9xdWV1ZSBmcm9tIG92ZXJmbG93OiAqLworICAgICAgICAgICAgaWYocEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZSA+PSBSMzk2NF9NQVhfQkxPQ0tTX0lOX1JYX1FVRVVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVFJBQ0VfUEUoIklETEUgLSBnb3QgU1RYIGJ1dCBubyBzcGFjZSBpbiByeF9xdWV1ZSEiKTsKKyAgICAgICAgICAgICAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9XQUlUX0ZPUl9SWF9CVUY7CisJICAgICAgIG1vZF90aW1lcigmcEluZm8tPnRtciwgUjM5NjRfVE9fTk9fQlVGKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorc3RhcnRfcmVjZWl2aW5nOgorICAgICAgICAgICAgLyogT2ssIHN0YXJ0IHJlY2VpdmluZzogKi8KKyAgICAgICAgICAgIFRSQUNFX1BTKCJJRExFIC0gZ290IFNUWCIpOworICAgICAgICAgICAgcEluZm8tPnJ4X3Bvc2l0aW9uID0gMDsKKyAgICAgICAgICAgIHBJbmZvLT5sYXN0X3J4ID0gMDsKKyAgICAgICAgICAgIHBJbmZvLT5mbGFncyAmPSB+UjM5NjRfRVJST1I7CisgICAgICAgICAgICBwSW5mby0+c3RhdGU9UjM5NjRfUkVDRUlWSU5HOworCSAgICBtb2RfdGltZXIoJnBJbmZvLT50bXIsIFIzOTY0X1RPX1pWWik7CisJICAgIHBJbmZvLT5uUmV0cnkgPSAwOworICAgICAgICAgICAgcHV0X2NoYXIocEluZm8sIERMRSk7CisgICAgICAgICAgICBmbHVzaChwSW5mbyk7CisgICAgICAgICAgICBwSW5mby0+YmNjID0gMDsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9SRUNFSVZJTkc6CisgICAgICAgICBpZihwSW5mby0+cnhfcG9zaXRpb24gPCBSWF9CVUZfU0laRSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHBJbmZvLT5iY2MgXj0gYzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoYz09RExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYocEluZm8tPmxhc3Rfcng9PURMRSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBJbmZvLT5sYXN0X3J4ID0gMDsKKyAgICAgICAgICAgICAgICAgIGdvdG8gY2hhcl90b19idWY7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBwSW5mby0+bGFzdF9yeCA9IERMRTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgaWYoKGM9PUVUWCkgJiYgKHBJbmZvLT5sYXN0X3J4PT1ETEUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYocEluZm8tPmZsYWdzICYgUjM5NjRfQkNDKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcEluZm8tPnN0YXRlID0gUjM5NjRfV0FJVF9GT1JfQkNDOworCQkgIG1vZF90aW1lcigmcEluZm8tPnRtciwgUjM5NjRfVE9fWlZaKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBvbl9yZWNlaXZlX2Jsb2NrKHBJbmZvKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBJbmZvLT5sYXN0X3J4ID0gYzsKK2NoYXJfdG9fYnVmOgorICAgICAgICAgICAgICAgcEluZm8tPnJ4X2J1ZltwSW5mby0+cnhfcG9zaXRpb24rK10gPSBjOworCSAgICAgICBtb2RfdGltZXIoJnBJbmZvLT50bXIsIFIzOTY0X1RPX1pWWik7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgIC8qIGVsc2U6IG92ZXJmbG93LW1zZz8gQlVGX1NJWkU+TVRVOyBzaG91bGQgbm90IGhhcHBlbj8gKi8gCisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfQkNDOgorICAgICAgICAgcEluZm8tPmxhc3RfcnggPSBjOworICAgICAgICAgb25fcmVjZWl2ZV9ibG9jayhwSW5mbyk7CisgICAgICAgICBicmVhazsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgcmVjZWl2ZV9lcnJvcihzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIGNvbnN0IGNoYXIgZmxhZykKK3sKKyAgICBzd2l0Y2ggKGZsYWcpIAorICAgIHsKKyAgICBjYXNlIFRUWV9OT1JNQUw6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFRZX0JSRUFLOgorICAgICAgICBUUkFDRV9QRSgicmVjZWl2ZWQgYnJlYWsiKQorICAgICAgICBwSW5mby0+ZmxhZ3MgfD0gUjM5NjRfQlJFQUs7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFRZX1BBUklUWToKKyAgICAgICAgVFJBQ0VfUEUoInBhcml0eSBlcnJvciIpCisgICAgICAgIHBJbmZvLT5mbGFncyB8PSBSMzk2NF9QQVJJVFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFRZX0ZSQU1FOgorICAgICAgICBUUkFDRV9QRSgiZnJhbWUgZXJyb3IiKQorICAgICAgICBwSW5mby0+ZmxhZ3MgfD0gUjM5NjRfRlJBTUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFRZX09WRVJSVU46CisgICAgICAgIFRSQUNFX1BFKCJmcmFtZSBvdmVycnVuIikKKyAgICAgICAgcEluZm8tPmZsYWdzIHw9IFIzOTY0X09WRVJSVU47CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFRSQUNFX1BFKCJyZWNlaXZlX2Vycm9yIC0gdW5rbm93biBmbGFnICVkIiwgZmxhZyk7CisgICAgICAgIHBJbmZvLT5mbGFncyB8PSBSMzk2NF9VTktOT1dOOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9uX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwcml2KQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvID0gKHZvaWQgKilwcml2OworCisgICBzd2l0Y2gocEluZm8tPnN0YXRlKQorICAgeworICAgICAgY2FzZSBSMzk2NF9UWF9SRVFVRVNUOgorICAgICAgICAgVFJBQ0VfUEUoIlRYX1JFUVVFU1QgLSB0aW1lb3V0Iik7CisgICAgICAgICByZXRyeV90cmFuc21pdChwSW5mbyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9aVlpfQkVGT1JFX1RYX1JFVFJZOgorICAgICAgICAgcHV0X2NoYXIocEluZm8sIE5BSyk7CisgICAgICAgICBmbHVzaChwSW5mbyk7CisgICAgICAgICByZXRyeV90cmFuc21pdChwSW5mbyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfVFhfQUNLOgorICAgICAgICAgVFJBQ0VfUEUoIldBSVRfRk9SX1RYX0FDSyAtIHRpbWVvdXQiKTsKKyAgICAgICAgIHJldHJ5X3RyYW5zbWl0KHBJbmZvKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9XQUlUX0ZPUl9SWF9CVUY6CisgICAgICAgICBUUkFDRV9QRSgiV0FJVF9GT1JfUlhfQlVGIC0gdGltZW91dCIpOworICAgICAgICAgcHV0X2NoYXIocEluZm8sIE5BSyk7CisgICAgICAgICBmbHVzaChwSW5mbyk7CisgICAgICAgICBwSW5mby0+c3RhdGU9UjM5NjRfSURMRTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSMzk2NF9SRUNFSVZJTkc6CisgICAgICAgICBUUkFDRV9QRSgiUkVDRUlWSU5HIC0gdGltZW91dCBhZnRlciAlZCBjaGFycyIsIAorICAgICAgICAgICAgICAgICAgcEluZm8tPnJ4X3Bvc2l0aW9uKTsKKyAgICAgICAgIHB1dF9jaGFyKHBJbmZvLCBOQUspOworICAgICAgICAgZmx1c2gocEluZm8pOworICAgICAgICAgcEluZm8tPnN0YXRlPVIzOTY0X0lETEU7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUjM5NjRfV0FJVF9GT1JfUlhfUkVQRUFUOgorICAgICAgICAgVFJBQ0VfUEUoIldBSVRfRk9SX1JYX1JFUEVBVCAtIHRpbWVvdXQiKTsKKyAgICAgICAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9JRExFOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFIzOTY0X1dBSVRfRk9SX0JDQzoKKyAgICAgICAgIFRSQUNFX1BFKCJXQUlUX0ZPUl9CQ0MgLSB0aW1lb3V0Iik7CisgICAgICAgICBwdXRfY2hhcihwSW5mbywgTkFLKTsKKyAgICAgICAgIGZsdXNoKHBJbmZvKTsKKyAgICAgICAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9JRExFOworICAgICAgICAgYnJlYWs7CisgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKmZpbmRDbGllbnQoCisgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgcGlkX3QgcGlkKQoreworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OworICAgCisgICBmb3IocENsaWVudD1wSW5mby0+Zmlyc3RDbGllbnQ7IHBDbGllbnQ7IHBDbGllbnQ9cENsaWVudC0+bmV4dCkKKyAgIHsKKyAgICAgIGlmKHBDbGllbnQtPnBpZCA9PSBwaWQpCisgICAgICB7CisgICAgICAgICByZXR1cm4gcENsaWVudDsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGVuYWJsZV9zaWduYWxzKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgcGlkX3QgcGlkLCBpbnQgYXJnKQoreworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICoqcHBDbGllbnQ7CisgICBzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcE1zZzsKKyAgIAorICAgaWYoKGFyZyAmIFIzOTY0X1NJR19BTEwpPT0wKQorICAgeworICAgICAgLyogUmVtb3ZlIGNsaWVudCBmcm9tIGNsaWVudCBsaXN0ICovCisgICAgICBmb3IocHBDbGllbnQ9JnBJbmZvLT5maXJzdENsaWVudDsgKnBwQ2xpZW50OyBwcENsaWVudD0mKCpwcENsaWVudCktPm5leHQpCisgICAgICB7CisgICAgICAgICBwQ2xpZW50ID0gKnBwQ2xpZW50OworICAgICAgICAgCisgICAgICAgICBpZihwQ2xpZW50LT5waWQgPT0gcGlkKQorICAgICAgICAgeworICAgICAgICAgICAgVFJBQ0VfUFMoInJlbW92aW5nIGNsaWVudCAlZCBmcm9tIGNsaWVudCBsaXN0IiwgcGlkKTsKKyAgICAgICAgICAgICpwcENsaWVudCA9IHBDbGllbnQtPm5leHQ7CisgICAgICAgICAgICB3aGlsZShwQ2xpZW50LT5tc2dfY291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwTXNnPXJlbW92ZV9tc2cocEluZm8sIHBDbGllbnQpOworICAgICAgICAgICAgICAgaWYocE1zZykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGtmcmVlKHBNc2cpOworICAgICAgICAgICAgICAgICAgVFJBQ0VfTSgiZW5hYmxlX3NpZ25hbHMgLSBtc2cga2ZyZWUgJXgiLChpbnQpcE1zZyk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwQ2xpZW50KTsKKyAgICAgICAgICAgIFRSQUNFX00oImVuYWJsZV9zaWduYWxzIC0ga2ZyZWUgJXgiLChpbnQpcENsaWVudCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAtRUlOVkFMOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLCBwaWQpOworICAgICAgaWYocENsaWVudCkKKyAgICAgIHsKKyAgICAgICAgIC8qIHVwZGF0ZSBzaWduYWwgb3B0aW9ucyAqLworICAgICAgICAgcENsaWVudC0+c2lnX2ZsYWdzPWFyZzsKKyAgICAgIH0gCisgICAgICBlbHNlIAorICAgICAgeworICAgICAgICAgLyogYWRkIGNsaWVudCB0byBjbGllbnQgbGlzdCAqLworICAgICAgICAgcENsaWVudD1rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8pLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgIFRSQUNFX00oImVuYWJsZV9zaWduYWxzIC0ga21hbGxvYyAleCIsKGludClwQ2xpZW50KTsKKyAgICAgICAgIGlmKHBDbGllbnQ9PU5VTEwpCisgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgICAgICAgVFJBQ0VfUFMoImFkZCBjbGllbnQgJWQgdG8gY2xpZW50IGxpc3QiLCBwaWQpOworCSBzcGluX2xvY2tfaW5pdCgmcENsaWVudC0+bG9jayk7CisgICAgICAgICBwQ2xpZW50LT5zaWdfZmxhZ3M9YXJnOworICAgICAgICAgcENsaWVudC0+cGlkID0gcGlkOworICAgICAgICAgcENsaWVudC0+bmV4dD1wSW5mby0+Zmlyc3RDbGllbnQ7CisgICAgICAgICBwQ2xpZW50LT5maXJzdF9tc2cgPSBOVUxMOworICAgICAgICAgcENsaWVudC0+bGFzdF9tc2cgPSBOVUxMOworICAgICAgICAgcENsaWVudC0+bmV4dF9ibG9ja190b19yZWFkID0gTlVMTDsKKyAgICAgICAgIHBDbGllbnQtPm1zZ19jb3VudCA9IDA7CisgICAgICAgICBwSW5mby0+Zmlyc3RDbGllbnQ9cENsaWVudDsKKyAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90ZWxlZ3JhbShzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIHBpZF90IHBpZCwgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1ZikKK3sKKyAgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CisgICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqYmxvY2s7CisKKyAgICBpZighYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLHBpZCk7CisgICAgaWYocENsaWVudD09TlVMTCkKKyAgICB7CisgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIAorICAgIGJsb2NrPXBDbGllbnQtPm5leHRfYmxvY2tfdG9fcmVhZDsKKyAgICBpZighYmxvY2spCisgICAgeworICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKGNvcHlfdG9fdXNlciAoYnVmLCBibG9jay0+ZGF0YSwgYmxvY2stPmxlbmd0aCkpCisJcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICByZW1vdmVfY2xpZW50X2Jsb2NrKHBJbmZvLCBwQ2xpZW50KTsKKyAgICAgICByZXR1cm4gYmxvY2stPmxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgYWRkX21zZyhzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQsIGludCBtc2dfaWQsIGludCBhcmcsCisgICAgICAgICAgICAgaW50IGVycm9yX2NvZGUsIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBCbG9jaykKK3sKKyAgIHN0cnVjdCByMzk2NF9tZXNzYWdlICpwTXNnOworICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIAorICAgaWYocENsaWVudC0+bXNnX2NvdW50PFIzOTY0X01BWF9NU0dfQ09VTlQtMSkKKyAgIHsKK3F1ZXVlX3RoZV9tZXNzYWdlOgorCisgICAgICBwTXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHIzOTY0X21lc3NhZ2UpLCBHRlBfS0VSTkVMKTsKKyAgICAgIFRSQUNFX00oImFkZF9tc2cgLSBrbWFsbG9jICV4IiwoaW50KXBNc2cpOworICAgICAgaWYocE1zZz09TlVMTCkgeworICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcENsaWVudC0+bG9jaywgZmxhZ3MpOworCisgICAgICBwTXNnLT5tc2dfaWQgPSBtc2dfaWQ7CisgICAgICBwTXNnLT5hcmcgICAgPSBhcmc7CisgICAgICBwTXNnLT5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKKyAgICAgIHBNc2ctPmJsb2NrICA9IHBCbG9jazsKKyAgICAgIHBNc2ctPm5leHQgICA9IE5VTEw7CisgICAgICAKKyAgICAgIGlmKHBDbGllbnQtPmxhc3RfbXNnPT1OVUxMKQorICAgICAgeworICAgICAgICAgcENsaWVudC0+Zmlyc3RfbXNnPXBDbGllbnQtPmxhc3RfbXNnPXBNc2c7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBwQ2xpZW50LT5sYXN0X21zZy0+bmV4dCA9IHBNc2c7CisgICAgICAgICBwQ2xpZW50LT5sYXN0X21zZz1wTXNnOworICAgICAgfQorCisgICAgICBwQ2xpZW50LT5tc2dfY291bnQrKzsKKworICAgICAgaWYocEJsb2NrIT1OVUxMKQorICAgICAgeworICAgICAgICAgcEJsb2NrLT5sb2NrcysrOworICAgICAgfQorICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcENsaWVudC0+bG9jaywgZmxhZ3MpOworICAgfQorICAgZWxzZQorICAgeworICAgICAgaWYoKHBDbGllbnQtPmxhc3RfbXNnLT5tc2dfaWQgPT0gUjM5NjRfTVNHX0FDSykKKwkJICYmIChwQ2xpZW50LT5sYXN0X21zZy0+ZXJyb3JfY29kZT09UjM5NjRfT1ZFUkZMT1cpKQorICAgICAgeworICAgICAgICAgcENsaWVudC0+bGFzdF9tc2ctPmFyZysrOworCQkgVFJBQ0VfUEUoImFkZF9tc2cgLSBpbmMgcHJldiBPVkVSRkxPVy1tc2ciKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIG1zZ19pZCA9IFIzOTY0X01TR19BQ0s7CisgICAgICAgICBhcmcgPSAwOworCQkgZXJyb3JfY29kZSA9IFIzOTY0X09WRVJGTE9XOworICAgICAgICAgcEJsb2NrID0gTlVMTDsKKwkJIFRSQUNFX1BFKCJhZGRfbXNnIC0gcXVldWUgT1ZFUkZMT1ctbXNnIik7CisgICAgICAgICBnb3RvIHF1ZXVlX3RoZV9tZXNzYWdlOworICAgICAgfQorICAgfQorICAgLyogU2VuZCBTSUdJTyBzaWduYWwgdG8gY2xpZW50IHByb2Nlc3M6ICovCisgICBpZihwQ2xpZW50LT5zaWdfZmxhZ3MgJiBSMzk2NF9VU0VfU0lHSU8pCisgICB7CisgICAgICBraWxsX3Byb2MocENsaWVudC0+cGlkLCBTSUdJTywgMSk7CisgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcmVtb3ZlX21zZyhzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudCkKK3sKKyAgIHN0cnVjdCByMzk2NF9tZXNzYWdlICpwTXNnPU5VTEw7CisgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICBpZihwQ2xpZW50LT5maXJzdF9tc2cpCisgICB7CisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcENsaWVudC0+bG9jaywgZmxhZ3MpOworCisgICAgICBwTXNnID0gcENsaWVudC0+Zmlyc3RfbXNnOworICAgICAgcENsaWVudC0+Zmlyc3RfbXNnID0gcE1zZy0+bmV4dDsKKyAgICAgIGlmKHBDbGllbnQtPmZpcnN0X21zZz09TlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHBDbGllbnQtPmxhc3RfbXNnID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgcENsaWVudC0+bXNnX2NvdW50LS07CisgICAgICBpZihwTXNnLT5ibG9jaykKKyAgICAgIHsKKyAgICAgICAgcmVtb3ZlX2NsaWVudF9ibG9jayhwSW5mbywgcENsaWVudCk7CisgICAgICAgIHBDbGllbnQtPm5leHRfYmxvY2tfdG9fcmVhZCA9IHBNc2ctPmJsb2NrOworICAgICAgfQorICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcENsaWVudC0+bG9jaywgZmxhZ3MpOworICAgfQorICAgcmV0dXJuIHBNc2c7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9jbGllbnRfYmxvY2soc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQpCit7CisgICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqYmxvY2s7CisKKyAgICBUUkFDRV9QUygicmVtb3ZlX2NsaWVudF9ibG9jayBQSUQgJWQiLCBwQ2xpZW50LT5waWQpOworCisgICAgYmxvY2s9cENsaWVudC0+bmV4dF9ibG9ja190b19yZWFkOworICAgIGlmKGJsb2NrKQorICAgIHsKKyAgICAgICAgYmxvY2stPmxvY2tzLS07CisgICAgICAgIGlmKGJsb2NrLT5sb2Nrcz09MCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVtb3ZlX2Zyb21fcnhfcXVldWUocEluZm8sIGJsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwQ2xpZW50LT5uZXh0X2Jsb2NrX3RvX3JlYWQgPSBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW5lIGRpc2NpcGxpbmUgcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHIzOTY0X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbzsKKyAgIAorICAgVFJBQ0VfTCgib3BlbiIpOworICAgVFJBQ0VfTCgidHR5PSV4LCBQSUQ9JWQsIGRpc2NfZGF0YT0leCIsIAorICAgICAgICAgIChpbnQpdHR5LCBjdXJyZW50LT5waWQsIChpbnQpdHR5LT5kaXNjX2RhdGEpOworICAgCisgICBwSW5mbz1rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcjM5NjRfaW5mbyksIEdGUF9LRVJORUwpOyAKKyAgIFRSQUNFX00oInIzOTY0X29wZW4gLSBpbmZvIGttYWxsb2MgJXgiLChpbnQpcEluZm8pOworCisgICBpZighcEluZm8pCisgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInIzOTY0OiBmYWlsZWQgdG8gYWxsb2MgaW5mbyBzdHJ1Y3R1cmVcbiIpOworICAgICAgcmV0dXJuIC1FTk9NRU07CisgICB9CisKKyAgIHBJbmZvLT5yeF9idWYgPSBrbWFsbG9jKFJYX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKyAgIFRSQUNFX00oInIzOTY0X29wZW4gLSByeF9idWYga21hbGxvYyAleCIsKGludClwSW5mby0+cnhfYnVmKTsKKworICAgaWYoIXBJbmZvLT5yeF9idWYpCisgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInIzOTY0OiBmYWlsZWQgdG8gYWxsb2MgcmVjZWl2ZSBidWZmZXJcbiIpOworICAgICAga2ZyZWUocEluZm8pOworICAgICAgVFJBQ0VfTSgicjM5NjRfb3BlbiAtIGluZm8ga2ZyZWUgJXgiLChpbnQpcEluZm8pOworICAgICAgcmV0dXJuIC1FTk9NRU07CisgICB9CisgICAKKyAgIHBJbmZvLT50eF9idWYgPSBrbWFsbG9jKFRYX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKyAgIFRSQUNFX00oInIzOTY0X29wZW4gLSB0eF9idWYga21hbGxvYyAleCIsKGludClwSW5mby0+dHhfYnVmKTsKKworICAgaWYoIXBJbmZvLT50eF9idWYpCisgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInIzOTY0OiBmYWlsZWQgdG8gYWxsb2MgdHJhbnNtaXQgYnVmZmVyXG4iKTsKKyAgICAgIGtmcmVlKHBJbmZvLT5yeF9idWYpOworICAgICAgVFJBQ0VfTSgicjM5NjRfb3BlbiAtIHJ4X2J1ZiBrZnJlZSAleCIsKGludClwSW5mby0+cnhfYnVmKTsKKyAgICAgIGtmcmVlKHBJbmZvKTsKKyAgICAgIFRSQUNFX00oInIzOTY0X29wZW4gLSBpbmZvIGtmcmVlICV4IiwoaW50KXBJbmZvKTsKKyAgICAgIHJldHVybiAtRU5PTUVNOworICAgfQorCisgICBzcGluX2xvY2tfaW5pdCgmcEluZm8tPmxvY2spOworICAgcEluZm8tPnR0eSA9IHR0eTsKKyAgIGluaXRfd2FpdHF1ZXVlX2hlYWQgKCZwSW5mby0+cmVhZF93YWl0KTsKKyAgIHBJbmZvLT5wcmlvcml0eSA9IFIzOTY0X01BU1RFUjsKKyAgIHBJbmZvLT5yeF9maXJzdCA9IHBJbmZvLT5yeF9sYXN0ID0gTlVMTDsKKyAgIHBJbmZvLT50eF9maXJzdCA9IHBJbmZvLT50eF9sYXN0ID0gTlVMTDsKKyAgIHBJbmZvLT5yeF9wb3NpdGlvbiA9IDA7CisgICBwSW5mby0+dHhfcG9zaXRpb24gPSAwOworICAgcEluZm8tPmxhc3RfcnggPSAwOworICAgcEluZm8tPmJsb2Nrc19pbl9yeF9xdWV1ZSA9IDA7CisgICBwSW5mby0+Zmlyc3RDbGllbnQ9TlVMTDsKKyAgIHBJbmZvLT5zdGF0ZT1SMzk2NF9JRExFOworICAgcEluZm8tPmZsYWdzID0gUjM5NjRfREVCVUc7CisgICBwSW5mby0+blJldHJ5ID0gMDsKKyAgIAorICAgdHR5LT5kaXNjX2RhdGEgPSBwSW5mbzsKKworICAgaW5pdF90aW1lcigmcEluZm8tPnRtcik7CisgICBwSW5mby0+dG1yLmRhdGEgPSAodW5zaWduZWQgbG9uZylwSW5mbzsKKyAgIHBJbmZvLT50bXIuZnVuY3Rpb24gPSBvbl90aW1lb3V0OworCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcjM5NjRfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbz0oc3RydWN0IHIzOTY0X2luZm8qKXR0eS0+ZGlzY19kYXRhOworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50LCAqcE5leHQ7CisgICBzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcE1zZzsKKyAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBIZWFkZXIsICpwTmV4dEhlYWRlcjsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgIFRSQUNFX0woImNsb3NlIik7CisKKyAgICAvKgorICAgICAqIE1ha2Ugc3VyZSB0aGF0IG91ciB0YXNrIHF1ZXVlIGlzbid0IGFjdGl2YXRlZC4gIElmIGl0CisgICAgICogaXMsIHRha2UgaXQgb3V0IG9mIHRoZSBsaW5rZWQgbGlzdC4KKyAgICAgKi8KKyAgICBkZWxfdGltZXJfc3luYygmcEluZm8tPnRtcik7CisKKyAgIC8qIFJlbW92ZSBjbGllbnQtc3RydWN0cyBhbmQgbWVzc2FnZSBxdWV1ZXM6ICovCisgICAgcENsaWVudD1wSW5mby0+Zmlyc3RDbGllbnQ7CisgICAgd2hpbGUocENsaWVudCkKKyAgICB7CisgICAgICAgcE5leHQ9cENsaWVudC0+bmV4dDsKKyAgICAgICB3aGlsZShwQ2xpZW50LT5tc2dfY291bnQpCisgICAgICAgeworICAgICAgICAgIHBNc2c9cmVtb3ZlX21zZyhwSW5mbywgcENsaWVudCk7CisgICAgICAgICAgaWYocE1zZykKKyAgICAgICAgICB7CisgICAgICAgICAgICAga2ZyZWUocE1zZyk7CisgICAgICAgICAgICAgVFJBQ0VfTSgicjM5NjRfY2xvc2UgLSBtc2cga2ZyZWUgJXgiLChpbnQpcE1zZyk7CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBrZnJlZShwQ2xpZW50KTsKKyAgICAgICBUUkFDRV9NKCJyMzk2NF9jbG9zZSAtIGNsaWVudCBrZnJlZSAleCIsKGludClwQ2xpZW50KTsKKyAgICAgICBwQ2xpZW50PXBOZXh0OworICAgIH0KKyAgICAvKiBSZW1vdmUgam9icyBmcm9tIHR4X3F1ZXVlOiAqLworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcEluZm8tPmxvY2ssIGZsYWdzKTsKKwlwSGVhZGVyPXBJbmZvLT50eF9maXJzdDsKKwlwSW5mby0+dHhfZmlyc3Q9cEluZm8tPnR4X2xhc3Q9TlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworCQorICAgIHdoaWxlKHBIZWFkZXIpCisJeworCSAgIHBOZXh0SGVhZGVyPXBIZWFkZXItPm5leHQ7CisJICAga2ZyZWUocEhlYWRlcik7CisJICAgcEhlYWRlcj1wTmV4dEhlYWRlcjsKKwl9CisKKyAgICAvKiBGcmVlIGJ1ZmZlcnM6ICovCisgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwSW5mby0+cmVhZF93YWl0KTsKKyAgICBrZnJlZShwSW5mby0+cnhfYnVmKTsKKyAgICBUUkFDRV9NKCJyMzk2NF9jbG9zZSAtIHJ4X2J1ZiBrZnJlZSAleCIsKGludClwSW5mby0+cnhfYnVmKTsKKyAgICBrZnJlZShwSW5mby0+dHhfYnVmKTsKKyAgICBUUkFDRV9NKCJyMzk2NF9jbG9zZSAtIHR4X2J1ZiBrZnJlZSAleCIsKGludClwSW5mby0+dHhfYnVmKTsKKyAgICBrZnJlZShwSW5mbyk7CisgICAgVFJBQ0VfTSgicjM5NjRfY2xvc2UgLSBpbmZvIGtmcmVlICV4IiwoaW50KXBJbmZvKTsKK30KKworc3RhdGljIHNzaXplX3QgcjM5NjRfcmVhZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5yKQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvPShzdHJ1Y3QgcjM5NjRfaW5mbyopdHR5LT5kaXNjX2RhdGE7CisgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CisgICBzdHJ1Y3QgcjM5NjRfbWVzc2FnZSAqcE1zZzsKKyAgIHN0cnVjdCByMzk2NF9jbGllbnRfbWVzc2FnZSB0aGVNc2c7CisgICBERUNMQVJFX1dBSVRRVUVVRSAod2FpdCwgY3VycmVudCk7CisgICAKKyAgIGludCBwaWQgPSBjdXJyZW50LT5waWQ7CisgICBpbnQgY291bnQ7CisgICAKKyAgIFRSQUNFX0woInJlYWQoKSIpOworIAorICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLCBwaWQpOworICAgaWYocENsaWVudCkKKyAgIHsKKyAgICAgIHBNc2cgPSByZW1vdmVfbXNnKHBJbmZvLCBwQ2xpZW50KTsKKyAgICAgIGlmKHBNc2c9PU5VTEwpCisgICAgICB7CisJCSAvKiBubyBtZXNzYWdlcyBhdmFpbGFibGUuICovCisgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCSB7CisgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKwkJIH0KKyAgICAgICAgIC8qIGJsb2NrIHVudGlsIHRoZXJlIGlzIGEgbWVzc2FnZTogKi8KKyAgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZwSW5mby0+cmVhZF93YWl0LCAmd2FpdCk7CityZXBlYXQ6CisgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKyAgICAgICAgIHBNc2cgPSByZW1vdmVfbXNnKHBJbmZvLCBwQ2xpZW50KTsKKwkgaWYgKCFwTXNnICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJIHsKKyAgICAgICAgICAgIHNjaGVkdWxlKCk7CisgICAgICAgICAgICBnb3RvIHJlcGVhdDsKKyAgICAgICAgIH0KKyAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnBJbmZvLT5yZWFkX3dhaXQsICZ3YWl0KTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogSWYgd2Ugc3RpbGwgaGF2ZW4ndCBnb3QgYSBtZXNzYWdlLCB3ZSBtdXN0IGhhdmUgYmVlbiBzaWduYWxsZWQgKi8KKworICAgICAgaWYgKCFwTXNnKSByZXR1cm4gLUVJTlRSOworCisgICAgICAvKiBkZWxpdmVyIG1zZyB0byBjbGllbnQgcHJvY2VzczogKi8KKyAgICAgIHRoZU1zZy5tc2dfaWQgPSBwTXNnLT5tc2dfaWQ7CisgICAgICB0aGVNc2cuYXJnICAgID0gcE1zZy0+YXJnOworICAgICAgdGhlTXNnLmVycm9yX2NvZGUgPSBwTXNnLT5lcnJvcl9jb2RlOworICAgICAgY291bnQgPSBzaXplb2Yoc3RydWN0IHIzOTY0X2NsaWVudF9tZXNzYWdlKTsKKworICAgICAga2ZyZWUocE1zZyk7CisgICAgICBUUkFDRV9NKCJyMzk2NF9yZWFkIC0gbXNnIGtmcmVlICV4IiwoaW50KXBNc2cpOworCisgICAgICBpZiAoY29weV90b191c2VyKGJ1ZiwmdGhlTXNnLCBjb3VudCkpCisJcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgIFRSQUNFX1BTKCJyZWFkIC0gcmV0dXJuICVkIiwgY291bnQpOworICAgICAgcmV0dXJuIGNvdW50OworICAgfQorICAgcmV0dXJuIC1FUEVSTTsKK30KKworc3RhdGljIHNzaXplX3QgcjM5NjRfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKyAgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbz0oc3RydWN0IHIzOTY0X2luZm8qKXR0eS0+ZGlzY19kYXRhOworICAgc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciAqcEhlYWRlcjsKKyAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudDsKKyAgIHVuc2lnbmVkIGNoYXIgKm5ld19kYXRhOworICAgaW50IHBpZDsKKyAgIAorICAgVFJBQ0VfTCgid3JpdGUgcmVxdWVzdCwgJWQgY2hhcmFjdGVycyIsIGNvdW50KTsKKy8qIAorICogVmVyaWZ5IHRoZSBwb2ludGVycyAKKyAqLworCisgICBpZighcEluZm8pCisgICAgICByZXR1cm4gLUVJTzsKKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3Qgd2lzaCB0byBzZW5kIHRvbyBtdWNoLgorICovCisgICBpZiAoY291bnQgPiBSMzk2NF9NVFUpIAorICAgeworICAgICAgaWYgKHBJbmZvLT5mbGFncyAmIFIzOTY0X0RFQlVHKQorICAgICAgeworICAgICAgICAgVFJBQ0VfTCAoS0VSTl9XQVJOSU5HCisgICAgICAgICAgICAgICAgICJyMzk2NF93cml0ZTogdHJ1bmNhdGluZyB1c2VyIHBhY2tldCAiCisgICAgICAgICAgICAgICAgICJmcm9tICV1IHRvIG10dSAlZCIsIGNvdW50LCBSMzk2NF9NVFUpOworICAgICAgfQorICAgICAgY291bnQgPSBSMzk2NF9NVFU7CisgICB9CisvKgorICogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBkYXRhIGFuZCBjb3B5IGl0IGZyb20gdGhlIGJ1ZmZlciB3aXRoIGhlYWRlciBwcmVwZW5kZWQKKyAqLworICAgbmV3X2RhdGEgPSBrbWFsbG9jIChjb3VudCtzaXplb2Yoc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlciksIEdGUF9LRVJORUwpOworICAgVFJBQ0VfTSgicjM5NjRfd3JpdGUgLSBrbWFsbG9jICV4IiwoaW50KW5ld19kYXRhKTsKKyAgIGlmIChuZXdfZGF0YSA9PSBOVUxMKSB7CisgICAgICBpZiAocEluZm8tPmZsYWdzICYgUjM5NjRfREVCVUcpCisgICAgICB7CisgICAgICAgICBwcmludGsgKEtFUk5fRVJSCisgICAgICAgICAgICAgICAicjM5NjRfd3JpdGU6IG5vIG1lbW9yeVxuIik7CisgICAgICB9CisgICAgICByZXR1cm4gLUVOT1NQQzsKKyAgIH0KKyAgIAorICAgcEhlYWRlciA9IChzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICopbmV3X2RhdGE7CisgICBwSGVhZGVyLT5kYXRhID0gbmV3X2RhdGEgKyBzaXplb2Yoc3RydWN0IHIzOTY0X2Jsb2NrX2hlYWRlcik7CisgICBwSGVhZGVyLT5sZW5ndGggPSBjb3VudDsKKyAgIHBIZWFkZXItPmxvY2tzID0gMDsKKyAgIHBIZWFkZXItPm93bmVyID0gTlVMTDsKKyAgIAorICAgcGlkPWN1cnJlbnQtPnBpZDsKKyAgIAorICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLCBwaWQpOworICAgaWYocENsaWVudCkKKyAgIHsKKyAgICAgIHBIZWFkZXItPm93bmVyID0gcENsaWVudDsKKyAgIH0KKworICAgbWVtY3B5KHBIZWFkZXItPmRhdGEsIGRhdGEsIGNvdW50KTsgLyogV2UgYWxyZWFkeSB2ZXJpZmllZCB0aGlzICovCisKKyAgIGlmKHBJbmZvLT5mbGFncyAmIFIzOTY0X0RFQlVHKQorICAgeworICAgICAgZHVtcF9ibG9jayhwSGVhZGVyLT5kYXRhLCBjb3VudCk7CisgICB9CisKKy8qCisgKiBBZGQgYnVmZmVyIHRvIHRyYW5zbWl0LXF1ZXVlOgorICovCisgICBhZGRfdHhfcXVldWUocEluZm8sIHBIZWFkZXIpOworICAgdHJpZ2dlcl90cmFuc21pdChwSW5mbyk7CisgICAKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHIzOTY0X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgIHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbz0oc3RydWN0IHIzOTY0X2luZm8qKXR0eS0+ZGlzY19kYXRhOworICAgaWYocEluZm89PU5VTEwpCisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgIHN3aXRjaChjbWQpCisgICB7CisgICAgICBjYXNlIFIzOTY0X0VOQUJMRV9TSUdOQUxTOgorICAgICAgICAgcmV0dXJuIGVuYWJsZV9zaWduYWxzKHBJbmZvLCBjdXJyZW50LT5waWQsIGFyZyk7CisgICAgICBjYXNlIFIzOTY0X1NFVFBSSU9SSVRZOgorICAgICAgICAgaWYoYXJnPFIzOTY0X01BU1RFUiB8fCBhcmc+UjM5NjRfU0xBVkUpCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgIHBJbmZvLT5wcmlvcml0eSA9IGFyZyAmIDB4ZmY7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIGNhc2UgUjM5NjRfVVNFX0JDQzoKKyAgICAgICAgICAgICBpZihhcmcpCisgICAgICAgICAgICBwSW5mby0+ZmxhZ3MgfD0gUjM5NjRfQkNDOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgcEluZm8tPmZsYWdzICY9IH5SMzk2NF9CQ0M7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIGNhc2UgUjM5NjRfUkVBRF9URUxFR1JBTToKKyAgICAgICAgIHJldHVybiByZWFkX3RlbGVncmFtKHBJbmZvLCBjdXJyZW50LT5waWQsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKWFyZyk7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIC1FTk9JT0NUTENNRDsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgcjM5NjRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpCit7CisgICBUUkFDRV9MKCJzZXRfdGVybWlvcyIpOworfQorCisvKiBDYWxsZWQgd2l0aG91dCB0aGUga2VybmVsIGxvY2sgaGVsZCAtIGZpbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcjM5NjRfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisgICBzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm89KHN0cnVjdCByMzk2NF9pbmZvKil0dHktPmRpc2NfZGF0YTsKKyAgIGludCBwaWQ9Y3VycmVudC0+cGlkOworICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OworICAgc3RydWN0IHIzOTY0X21lc3NhZ2UgKnBNc2c9TlVMTDsKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICBpbnQgcmVzdWx0ID0gUE9MTE9VVDsKKworICAgVFJBQ0VfTCgiUE9MTCIpOworCisgICBwQ2xpZW50PWZpbmRDbGllbnQocEluZm8scGlkKTsKKyAgIGlmKHBDbGllbnQpCisgICAgIHsKKyAgICAgICBwb2xsX3dhaXQoZmlsZSwgJnBJbmZvLT5yZWFkX3dhaXQsIHdhaXQpOworICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwSW5mby0+bG9jaywgZmxhZ3MpOworICAgICAgIHBNc2c9cENsaWVudC0+Zmlyc3RfbXNnOworICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBJbmZvLT5sb2NrLCBmbGFncyk7CisgICAgICAgaWYocE1zZykKKwkgICByZXN1bHQgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKyAgICAgfQorICAgZWxzZQorICAgICB7CisgICAgICAgcmVzdWx0ID0gLUVJTlZBTDsKKyAgICAgfQorICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgcjM5NjRfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmcCwgaW50IGNvdW50KQoreworICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvPShzdHJ1Y3QgcjM5NjRfaW5mbyopdHR5LT5kaXNjX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgICBjaGFyICpmLCBmbGFncyA9IDA7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9Y291bnQsIHAgPSBjcCwgZiA9IGZwOyBpOyBpLS0sIHArKykgeworICAgICAgICBpZiAoZikKKyAgICAgICAgICAgIGZsYWdzID0gKmYrKzsKKyAgICAgICAgaWYoZmxhZ3M9PVRUWV9OT1JNQUwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlY2VpdmVfY2hhcihwSW5mbywgKnApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVjZWl2ZV9lcnJvcihwSW5mbywgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KK30KKworc3RhdGljIGludCByMzk2NF9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKyAgIFRSQUNFX0woInJlY2VpdmVfcm9vbSIpOworICAgcmV0dXJuIC0xOworfQorCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX1IzOTY0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3R0eS5jIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiYTVhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCkBAIC0wLDAgKzEsMTU2MiBAQAorLyoKKyAqIG5fdHR5LmMgLS0tIGltcGxlbWVudHMgdGhlIE5fVFRZIGxpbmUgZGlzY2lwbGluZS4KKyAqIAorICogVGhpcyBjb2RlIHVzZWQgdG8gYmUgaW4gdHR5X2lvLmMsIGJ1dCB0aGluZ3MgYXJlIGdldHRpbmcgaGFpcnkKKyAqIGVub3VnaCB0aGF0IGl0IG1hZGUgc2Vuc2UgdG8gc3BsaXQgdGhpbmdzIG9mZi4gIChUaGUgTl9UVFkKKyAqIHByb2Nlc3NpbmcgaGFzIGNoYW5nZWQgc28gbXVjaCB0aGF0IGl0J3MgaGFyZGx5IHJlY29nbml6YWJsZSwKKyAqIGFueXdheS4uLikKKyAqCisgKiBOb3RlIHRoYXQgdGhlIG9wZW4gcm91dGluZSBmb3IgTl9UVFkgaXMgZ3VhcmFudGVlZCBuZXZlciB0byByZXR1cm4KKyAqIGFuIGVycm9yLiAgVGhpcyBpcyBiZWNhdXNlIExpbnV4IHdpbGwgZmFsbCBiYWNrIHRvIHNldHRpbmcgYSBsaW5lCisgKiB0byBOX1RUWSBpZiBpdCBjYW4gbm90IHN3aXRjaCB0byBhbnkgb3RoZXIgbGluZSBkaXNjaXBsaW5lLiAgCisgKgorICogV3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCBDb3B5cmlnaHQgMTk5NC4KKyAqIAorICogVGhpcyBmaWxlIGFsc28gY29udGFpbnMgY29kZSBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMsCisgKiBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5MywgYW5kIGJ5IEp1bGlhbiBDb3dsZXksIENvcHlyaWdodCAxOTk0LgorICogCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKgorICogUmVkdWNlZCBtZW1vcnkgdXNhZ2UgZm9yIG9sZGVyIEFSTSBzeXN0ZW1zICAtIFJ1c3NlbGwgS2luZy4KKyAqCisgKiAyMDAwLzAxLzIwICAgRml4ZWQgU01QIGxvY2tpbmcgb24gcHV0X3R0eV9xdWV1ZSB1c2luZyBiaXRzIG9mIAorICoJCXRoZSBwYXRjaCBieSBBbmRyZXcgSi4gS3JvbGwgPGFnNzg0QGZyZWVuZXQuYnVmZmFsby5lZHU+CisgKgkJd2hvIGFjdHVhbGx5IGZpbmFsbHkgcHJvdmVkIHRoZXJlIHJlYWxseSB3YXMgYSByYWNlLgorICoKKyAqIDIwMDIvMDMvMTggICBJbXBsZW1lbnRlZCBuX3R0eV93YWtldXAgdG8gc2VuZCBTSUdJTyBQT0xMX09VVHMgdG8KKyAqCQl3YWl0aW5nIHdyaXRpbmcgcHJvY2Vzc2VzLVNhcGFuIEJoYXRpYSA8c2FwYW5AY29yZXdhcnMub3JnPi4KKyAqCQlBbHNvIGZpeGVkIGEgYnVnIGluIEJMT0NLSU5HIG1vZGUgd2hlcmUgd3JpdGVfY2hhbiByZXR1cm5zCisgKgkJRUFHQUlOCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4geG1pdCBidWZmZXIgYmVmb3JlIHNlbGVjdCBoYXMgd2UgaGF2ZSByb29tICovCisjZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKKworLyoKKyAqIFRoaXMgZGVmaW5lcyB0aGUgbG93LSBhbmQgaGlnaC13YXRlcm1hcmtzIGZvciB0aHJvdHRsaW5nIGFuZAorICogdW50aHJvdHRsaW5nIHRoZSBUVFkgZHJpdmVyLiAgVGhlc2Ugd2F0ZXJtYXJrcyBhcmUgdXNlZCBmb3IKKyAqIGNvbnRyb2xsaW5nIHRoZSBzcGFjZSBpbiB0aGUgcmVhZCBidWZmZXIuCisgKi8KKyNkZWZpbmUgVFRZX1RIUkVTSE9MRF9USFJPVFRMRQkJMTI4IC8qIG5vdyBiYXNlZCBvbiByZW1haW5pbmcgcm9vbSAqLworI2RlZmluZSBUVFlfVEhSRVNIT0xEX1VOVEhST1RUTEUgCTEyOAorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKmFsbG9jX2J1Zih2b2lkKQoreworCWludCBwcmlvID0gaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTDsKKworCWlmIChQQUdFX1NJWkUgIT0gTl9UVFlfQlVGX1NJWkUpCisJCXJldHVybiBrbWFsbG9jKE5fVFRZX0JVRl9TSVpFLCBwcmlvKTsKKwllbHNlCisJCXJldHVybiAodW5zaWduZWQgY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShwcmlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYnVmKHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlpZiAoUEFHRV9TSVpFICE9IE5fVFRZX0JVRl9TSVpFKQorCQlrZnJlZShidWYpOworCWVsc2UKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3R0eV9xdWV1ZV9ub2xvY2sodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICh0dHktPnJlYWRfY250IDwgTl9UVFlfQlVGX1NJWkUpIHsKKwkJdHR5LT5yZWFkX2J1Zlt0dHktPnJlYWRfaGVhZF0gPSBjOworCQl0dHktPnJlYWRfaGVhZCA9ICh0dHktPnJlYWRfaGVhZCArIDEpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQl0dHktPnJlYWRfY250Kys7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3R0eV9xdWV1ZSh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKgorCSAqCVRoZSBwcm9ibGVtIG9mIHN0b21waW5nIG9uIHRoZSBidWZmZXJzIGVuZHMgaGVyZS4KKwkgKglXaHkgZGlkbid0IGFueW9uZSBzZWUgdGhpcyBvbmUgY29taW5nPyAtLUFKSworCSovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJcHV0X3R0eV9xdWV1ZV9ub2xvY2soYywgdHR5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqCWNoZWNrX3VudGhyb3R0bGUJLQlhbGxvdyBuZXcgcmVjZWl2ZSBkYXRhCisgKglAdHR5OyB0dHkgZGV2aWNlCisgKgorICoJQ2hlY2sgd2hldGhlciB0byBjYWxsIHRoZSBkcml2ZXIudW50aHJvdHRsZSBmdW5jdGlvbi4KKyAqCVdlIHRlc3QgdGhlIFRUWV9USFJPVFRMRUQgYml0IGZpcnN0IHNvIHRoYXQgaXQgYWx3YXlzCisgKglpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgc3RhdGUuIFRoZSBkZWNpc2lvbiBhYm91dCB3aGV0aGVyCisgKglpdCBpcyB3b3J0aCBhbGxvd2luZyBtb3JlIGlucHV0IGhhcyBiZWVuIHRha2VuIGJ5IHRoZSBjYWxsZXIuCisgKglDYW4gc2xlZXAsIG1heSBiZSBjYWxsZWQgdW5kZXIgdGhlIGF0b21pY19yZWFkIHNlbWFwaG9yZSBidXQKKyAqCXRoaXMgaXMgbm90IGd1YXJhbnRlZWQuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGNoZWNrX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJaWYgKHR0eS0+Y291bnQgJiYKKwkgICAgdGVzdF9hbmRfY2xlYXJfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSAmJiAKKwkgICAgdHR5LT5kcml2ZXItPnVudGhyb3R0bGUpCisJCXR0eS0+ZHJpdmVyLT51bnRocm90dGxlKHR0eSk7Cit9CisKKy8qKgorICoJcmVzZXRfYnVmZmVyX2ZsYWdzCS0JcmVzZXQgYnVmZmVyIHN0YXRlCisgKglAdHR5OiB0ZXJtaW5hbCB0byByZXNldAorICoKKyAqCVJlc2V0IHRoZSByZWFkIGJ1ZmZlciBjb3VudGVycywgY2xlYXIgdGhlIGZsYWdzLCAKKyAqCWFuZCBtYWtlIHN1cmUgdGhlIGRyaXZlciBpcyB1bnRocm90dGxlZC4gQ2FsbGVkCisgKglmcm9tIG5fdHR5X29wZW4oKSBhbmQgbl90dHlfZmx1c2hfYnVmZmVyKCkuCisgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X2J1ZmZlcl9mbGFncyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwl0dHktPnJlYWRfaGVhZCA9IHR0eS0+cmVhZF90YWlsID0gdHR5LT5yZWFkX2NudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwl0dHktPmNhbm9uX2hlYWQgPSB0dHktPmNhbm9uX2RhdGEgPSB0dHktPmVyYXNpbmcgPSAwOworCW1lbXNldCgmdHR5LT5yZWFkX2ZsYWdzLCAwLCBzaXplb2YgdHR5LT5yZWFkX2ZsYWdzKTsKKwljaGVja191bnRocm90dGxlKHR0eSk7Cit9CisKKy8qKgorICoJbl90dHlfZmx1c2hfYnVmZmVyCS0JY2xlYW4gaW5wdXQgcXVldWUKKyAqCUB0dHk6CXRlcm1pbmFsIGRldmljZQorICoKKyAqCUZsdXNoIHRoZSBpbnB1dCBidWZmZXIuIENhbGxlZCB3aGVuIHRoZSBsaW5lIGRpc2NpcGxpbmUgaXMKKyAqCWJlaW5nIGNsb3NlZCwgd2hlbiB0aGUgdHR5IGxheWVyIHdhbnRzIHRoZSBidWZmZXIgZmx1c2hlZCAoZWcKKyAqCWF0IGhhbmd1cCkgb3Igd2hlbiB0aGUgTl9UVFkgbGluZSBkaXNjaXBsaW5lIGludGVybmFsbHkgaGFzIHRvCisgKgljbGVhbiB0aGUgcGVuZGluZyBxdWV1ZSAoZm9yIGV4YW1wbGUgc29tZSBzaWduYWxzKS4KKyAqCisgKglGSVhNRTogdHR5LT5jdHJsX3N0YXR1cyBpcyBub3Qgc3BpbmxvY2tlZCBhbmQgcmVsaWVzIG9uCisgKglsb2NrX2tlcm5lbCgpIHN0aWxsLgorICovCisgCitzdGF0aWMgdm9pZCBuX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJLyogY2xlYXIgZXZlcnl0aGluZyBhbmQgdW50aHJvdHRsZSB0aGUgZHJpdmVyICovCisJcmVzZXRfYnVmZmVyX2ZsYWdzKHR0eSk7CisJCisJaWYgKCF0dHktPmxpbmspCisJCXJldHVybjsKKworCWlmICh0dHktPmxpbmstPnBhY2tldCkgeworCQl0dHktPmN0cmxfc3RhdHVzIHw9IFRJT0NQS1RfRkxVU0hSRUFEOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+bGluay0+cmVhZF93YWl0KTsKKwl9Cit9CisKKy8qKgorICoJbl90dHlfY2hhcnNfaW5fYnVmZmVyCS0JcmVwb3J0IGF2YWlsYWJsZSBieXRlcworICoJQHR0eTogdHR5IGRldmljZQorICoKKyAqCVJlcG9ydCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnVmZmVyZWQgdG8gYmUgZGVsaXZlcmVkIHRvIHVzZXIKKyAqCWF0IHRoaXMgaW5zdGFudCBpbiB0aW1lLiAKKyAqLworIAorc3RhdGljIHNzaXplX3Qgbl90dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzc2l6ZV90IG4gPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJaWYgKCF0dHktPmljYW5vbikgeworCQluID0gdHR5LT5yZWFkX2NudDsKKwl9IGVsc2UgaWYgKHR0eS0+Y2Fub25fZGF0YSkgeworCQluID0gKHR0eS0+Y2Fub25faGVhZCA+IHR0eS0+cmVhZF90YWlsKSA/CisJCQl0dHktPmNhbm9uX2hlYWQgLSB0dHktPnJlYWRfdGFpbCA6CisJCQl0dHktPmNhbm9uX2hlYWQgKyAoTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfdGFpbCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIG47Cit9CisKKy8qKgorICoJaXNfdXRmOF9jb250aW51YXRpb24JLQl1dGY4IG11bHRpYnl0ZSBjaGVjaworICoJQGM6IGJ5dGUgdG8gY2hlY2sKKyAqCisgKglSZXR1cm5zIHRydWUgaWYgdGhlIHV0ZjggY2hhcmFjdGVyICdjJyBpcyBhIG11bHRpYnl0ZSBjb250aW51YXRpb24KKyAqCWNoYXJhY3Rlci4gV2UgdXNlIHRoaXMgdG8gY29ycmVjdGx5IGNvbXB1dGUgdGhlIG9uIHNjcmVlbiBzaXplCisgKglvZiB0aGUgY2hhcmFjdGVyIHdoZW4gcHJpbnRpbmcKKyAqLworIAorc3RhdGljIGlubGluZSBpbnQgaXNfdXRmOF9jb250aW51YXRpb24odW5zaWduZWQgY2hhciBjKQoreworCXJldHVybiAoYyAmIDB4YzApID09IDB4ODA7Cit9CisKKy8qKgorICoJaXNfY29udGludWF0aW9uCQktCW11bHRpYnl0ZSBjaGVjaworICoJQGM6IGJ5dGUgdG8gY2hlY2sKKyAqCisgKglSZXR1cm5zIHRydWUgaWYgdGhlIHV0ZjggY2hhcmFjdGVyICdjJyBpcyBhIG11bHRpYnl0ZSBjb250aW51YXRpb24KKyAqCWNoYXJhY3RlciBhbmQgdGhlIHRlcm1pbmFsIGlzIGluIHVuaWNvZGUgbW9kZS4KKyAqLworIAorc3RhdGljIGlubGluZSBpbnQgaXNfY29udGludWF0aW9uKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gSV9JVVRGOCh0dHkpICYmIGlzX3V0ZjhfY29udGludWF0aW9uKGMpOworfQorCisvKioKKyAqCW9wb3N0CQkJLQlvdXRwdXQgcG9zdCBwcm9jZXNzb3IKKyAqCUBjOiBjaGFyYWN0ZXIgKG9yIHBhcnRpYWwgdW5pY29kZSBzeW1ib2wpCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCisgKglQZXJmb3JtIE9QT1NUIHByb2Nlc3NpbmcuICBSZXR1cm5zIC0xIHdoZW4gdGhlIG91dHB1dCBkZXZpY2UgaXMKKyAqCWZ1bGwgYW5kIHRoZSBjaGFyYWN0ZXIgbXVzdCBiZSByZXRyaWVkLiBOb3RlIHRoYXQgTGludXggY3VycmVudGx5CisgKglpZ25vcmVzIFRBQkRMWSwgQ1JETFksIFZURExZLCBGRkRMWSBhbmQgTkxETFkuIFRoZXkgc2ltcGx5IGFyZW4ndAorICoJcmVsZXZhbnQgaW4gdGhlIHdvcmxkIHRvZGF5LiBJZiB5b3UgZXZlciBuZWVkIHRoZW0sIGFkZCB0aGVtIGhlcmUuCisgKgorICoJQ2FsbGVkIGZyb20gYm90aCB0aGUgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgc2lkZXMgYW5kIGNhbiBiZSBjYWxsZWQKKyAqCXJlLWVudHJhbnRseS4gUmVsaWVzIG9uIGxvY2tfa2VybmVsKCkgc3RpbGwuCisgKi8KKyAKK3N0YXRpYyBpbnQgb3Bvc3QodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludAlzcGFjZSwgc3BhY2VzOworCisJc3BhY2UgPSB0dHktPmRyaXZlci0+d3JpdGVfcm9vbSh0dHkpOworCWlmICghc3BhY2UpCisJCXJldHVybiAtMTsKKworCWlmIChPX09QT1NUKHR0eSkpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1xuJzoKKwkJCWlmIChPX09OTFJFVCh0dHkpKQorCQkJCXR0eS0+Y29sdW1uID0gMDsKKwkJCWlmIChPX09OTENSKHR0eSkpIHsKKwkJCQlpZiAoc3BhY2UgPCAyKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJdHR5LT5kcml2ZXItPnB1dF9jaGFyKHR0eSwgJ1xyJyk7CisJCQkJdHR5LT5jb2x1bW4gPSAwOworCQkJfQorCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbjsKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCQlpZiAoT19PTk9DUih0dHkpICYmIHR0eS0+Y29sdW1uID09IDApCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoT19PQ1JOTCh0dHkpKSB7CisJCQkJYyA9ICdcbic7CisJCQkJaWYgKE9fT05MUkVUKHR0eSkpCisJCQkJCXR0eS0+Y2Fub25fY29sdW1uID0gdHR5LT5jb2x1bW4gPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJc3BhY2VzID0gOCAtICh0dHktPmNvbHVtbiAmIDcpOworCQkJaWYgKE9fVEFCRExZKHR0eSkgPT0gWFRBQlMpIHsKKwkJCQlpZiAoc3BhY2UgPCBzcGFjZXMpCisJCQkJCXJldHVybiAtMTsKKwkJCQl0dHktPmNvbHVtbiArPSBzcGFjZXM7CisJCQkJdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgIiAgICAgICAgIiwgc3BhY2VzKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXR0eS0+Y29sdW1uICs9IHNwYWNlczsKKwkJCWJyZWFrOworCQljYXNlICdcYic6CisJCQlpZiAodHR5LT5jb2x1bW4gPiAwKQorCQkJCXR0eS0+Y29sdW1uLS07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChPX09MQ1VDKHR0eSkpCisJCQkJYyA9IHRvdXBwZXIoYyk7CisJCQlpZiAoIWlzY250cmwoYykgJiYgIWlzX2NvbnRpbnVhdGlvbihjLCB0dHkpKQorCQkJCXR0eS0+Y29sdW1uKys7CisJCQlicmVhazsKKwkJfQorCX0KKwl0dHktPmRyaXZlci0+cHV0X2NoYXIodHR5LCBjKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglvcG9zdF9ibG9jawkJLQlibG9jayBwb3N0cHJvY2VzcworICoJQHR0eTogdGVybWluYWwgZGV2aWNlCisgKglAaW5idWY6IHVzZXIgYnVmZmVyCisgKglAbnI6IG51bWJlciBvZiBieXRlcworICoKKyAqCVRoaXMgcGF0aCBpcyB1c2VkIHRvIHNwZWVkIHVwIGJsb2NrIGNvbnNvbGUgd3JpdGVzLCBhbW9uZyBvdGhlcgorICoJdGhpbmdzIHdoZW4gcHJvY2Vzc2luZyBibG9ja3Mgb2Ygb3V0cHV0IGRhdGEuIEl0IGhhbmRsZXMgb25seQorICoJdGhlIHNpbXBsZSBjYXNlcyBub3JtYWxseSBmb3VuZCBhbmQgaGVscHMgdG8gZ2VuZXJhdGUgYmxvY2tzIG9mCisgKglzeW1ib2xzIGZvciB0aGUgY29uc29sZSBkcml2ZXIgYW5kIHRodXMgaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqCisgKglDYWxsZWQgZnJvbSB3cml0ZV9jaGFuIHVuZGVyIHRoZSB0dHkgbGF5ZXIgd3JpdGUgbG9jay4KKyAqLworIAorc3RhdGljIHNzaXplX3Qgb3Bvc3RfYmxvY2soc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCB1bnNpZ25lZCBpbnQgbnIpCit7CisJaW50CXNwYWNlOworCWludCAJaTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjcDsKKworCXNwYWNlID0gdHR5LT5kcml2ZXItPndyaXRlX3Jvb20odHR5KTsKKwlpZiAoIXNwYWNlKQorCQlyZXR1cm4gMDsKKwlpZiAobnIgPiBzcGFjZSkKKwkJbnIgPSBzcGFjZTsKKworCWZvciAoaSA9IDAsIGNwID0gYnVmOyBpIDwgbnI7IGkrKywgY3ArKykgeworCQlzd2l0Y2ggKCpjcCkgeworCQljYXNlICdcbic6CisJCQlpZiAoT19PTkxSRVQodHR5KSkKKwkJCQl0dHktPmNvbHVtbiA9IDA7CisJCQlpZiAoT19PTkxDUih0dHkpKQorCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbjsKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCQlpZiAoT19PTk9DUih0dHkpICYmIHR0eS0+Y29sdW1uID09IDApCisJCQkJZ290byBicmVha19vdXQ7CisJCQlpZiAoT19PQ1JOTCh0dHkpKQorCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJZ290byBicmVha19vdXQ7CisJCWNhc2UgJ1xiJzoKKwkJCWlmICh0dHktPmNvbHVtbiA+IDApCisJCQkJdHR5LT5jb2x1bW4tLTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKE9fT0xDVUModHR5KSkKKwkJCQlnb3RvIGJyZWFrX291dDsKKwkJCWlmICghaXNjbnRybCgqY3ApKQorCQkJCXR0eS0+Y29sdW1uKys7CisJCQlicmVhazsKKwkJfQorCX0KK2JyZWFrX291dDoKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnModHR5KTsKKwlpID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYnVmLCBpKTsJCisJcmV0dXJuIGk7Cit9CisKKworLyoqCisgKglwdXRfY2hhcgktCXdyaXRlIGNoYXJhY3RlciB0byBkcml2ZXIKKyAqCUBjOiBjaGFyYWN0ZXIgKG9yIHBhcnQgb2YgdW5pY29kZSBzeW1ib2wpCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCisgKglRdWV1ZSBhIGJ5dGUgdG8gdGhlIGRyaXZlciBsYXllciBmb3Igb3V0cHV0CisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfY2hhcih1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdHR5LT5kcml2ZXItPnB1dF9jaGFyKHR0eSwgYyk7Cit9CisKKy8qKgorICoJZWNob19jaGFyCS0JZWNobyBjaGFyYWN0ZXJzCisgKglAYzogdW5pY29kZSBieXRlIHRvIGVjaG8KKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoKKyAqCUVjaG8gdXNlciBpbnB1dCBiYWNrIG9udG8gdGhlIHNjcmVlbi4gVGhpcyBtdXN0IGJlIGNhbGxlZCBvbmx5IHdoZW4gCisgKglMX0VDSE8odHR5KSBpcyB0cnVlLiBDYWxsZWQgZnJvbSB0aGUgZHJpdmVyIHJlY2VpdmVfYnVmIHBhdGguCisgKi8KKworc3RhdGljIHZvaWQgZWNob19jaGFyKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoTF9FQ0hPQ1RMKHR0eSkgJiYgaXNjbnRybChjKSAmJiBjICE9ICdcdCcpIHsKKwkJcHV0X2NoYXIoJ14nLCB0dHkpOworCQlwdXRfY2hhcihjIF4gMDEwMCwgdHR5KTsKKwkJdHR5LT5jb2x1bW4gKz0gMjsKKwl9IGVsc2UKKwkJb3Bvc3QoYywgdHR5KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbmlzaF9lcmFzaW5nKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKHR0eS0+ZXJhc2luZykgeworCQlwdXRfY2hhcignLycsIHR0eSk7CisJCXR0eS0+Y29sdW1uKys7CisJCXR0eS0+ZXJhc2luZyA9IDA7CisJfQorfQorCisvKioKKyAqCWVyYXNlcgkJLQloYW5kbGUgZXJhc2UgZnVuY3Rpb24KKyAqCUBjOiBjaGFyYWN0ZXIgaW5wdXQKKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoKKyAqCVBlcmZvcm0gZXJhc2UgYW5kIG5lY2Nlc3Nhcnkgb3V0cHV0IHdoZW4gYW4gZXJhc2UgY2hhcmFjdGVyIGlzCisgKglwcmVzZW50IGluIHRoZSBzdHJlYW0gZnJvbSB0aGUgZHJpdmVyIGxheWVyLiBIYW5kbGVzIHRoZSBjb21wbGV4aXRpZXMKKyAqCW9mIFVURi04IG11bHRpYnl0ZSBzeW1ib2xzLgorICovCisgCitzdGF0aWMgdm9pZCBlcmFzZXIodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWVudW0geyBFUkFTRSwgV0VSQVNFLCBLSUxMIH0ga2lsbF90eXBlOworCWludCBoZWFkLCBzZWVuX2FsbnVtcywgY250OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodHR5LT5yZWFkX2hlYWQgPT0gdHR5LT5jYW5vbl9oZWFkKSB7CisJCS8qIG9wb3N0KCdcYScsIHR0eSk7ICovCQkvKiB3aGF0IGRvIHlvdSB0aGluaz8gKi8KKwkJcmV0dXJuOworCX0KKwlpZiAoYyA9PSBFUkFTRV9DSEFSKHR0eSkpCisJCWtpbGxfdHlwZSA9IEVSQVNFOworCWVsc2UgaWYgKGMgPT0gV0VSQVNFX0NIQVIodHR5KSkKKwkJa2lsbF90eXBlID0gV0VSQVNFOworCWVsc2UgeworCQlpZiAoIUxfRUNITyh0dHkpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCXR0eS0+cmVhZF9jbnQgLT0gKCh0dHktPnJlYWRfaGVhZCAtIHR0eS0+Y2Fub25faGVhZCkgJgorCQkJCQkgIChOX1RUWV9CVUZfU0laRSAtIDEpKTsKKwkJCXR0eS0+cmVhZF9oZWFkID0gdHR5LT5jYW5vbl9oZWFkOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIUxfRUNIT0sodHR5KSB8fCAhTF9FQ0hPS0UodHR5KSB8fCAhTF9FQ0hPRSh0dHkpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCXR0eS0+cmVhZF9jbnQgLT0gKCh0dHktPnJlYWRfaGVhZCAtIHR0eS0+Y2Fub25faGVhZCkgJgorCQkJCQkgIChOX1RUWV9CVUZfU0laRSAtIDEpKTsKKwkJCXR0eS0+cmVhZF9oZWFkID0gdHR5LT5jYW5vbl9oZWFkOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCWZpbmlzaF9lcmFzaW5nKHR0eSk7CisJCQllY2hvX2NoYXIoS0lMTF9DSEFSKHR0eSksIHR0eSk7CisJCQkvKiBBZGQgYSBuZXdsaW5lIGlmIEVDSE9LIGlzIG9uIGFuZCBFQ0hPS0UgaXMgb2ZmLiAqLworCQkJaWYgKExfRUNIT0sodHR5KSkKKwkJCQlvcG9zdCgnXG4nLCB0dHkpOworCQkJcmV0dXJuOworCQl9CisJCWtpbGxfdHlwZSA9IEtJTEw7CisJfQorCisJc2Vlbl9hbG51bXMgPSAwOworCXdoaWxlICh0dHktPnJlYWRfaGVhZCAhPSB0dHktPmNhbm9uX2hlYWQpIHsKKwkJaGVhZCA9IHR0eS0+cmVhZF9oZWFkOworCisJCS8qIGVyYXNlIGEgc2luZ2xlIHBvc3NpYmx5IG11bHRpYnl0ZSBjaGFyYWN0ZXIgKi8KKwkJZG8geworCQkJaGVhZCA9IChoZWFkIC0gMSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJCQljID0gdHR5LT5yZWFkX2J1ZltoZWFkXTsKKwkJfSB3aGlsZSAoaXNfY29udGludWF0aW9uKGMsIHR0eSkgJiYgaGVhZCAhPSB0dHktPmNhbm9uX2hlYWQpOworCisJCS8qIGRvIG5vdCBwYXJ0aWFsbHkgZXJhc2UgKi8KKwkJaWYgKGlzX2NvbnRpbnVhdGlvbihjLCB0dHkpKQorCQkJYnJlYWs7CisKKwkJaWYgKGtpbGxfdHlwZSA9PSBXRVJBU0UpIHsKKwkJCS8qIEVxdWl2YWxlbnQgdG8gQlNEJ3MgQUxUV0VSQVNFLiAqLworCQkJaWYgKGlzYWxudW0oYykgfHwgYyA9PSAnXycpCisJCQkJc2Vlbl9hbG51bXMrKzsKKwkJCWVsc2UgaWYgKHNlZW5fYWxudW1zKQorCQkJCWJyZWFrOworCQl9CisJCWNudCA9ICh0dHktPnJlYWRfaGVhZCAtIGhlYWQpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJdHR5LT5yZWFkX2hlYWQgPSBoZWFkOworCQl0dHktPnJlYWRfY250IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJaWYgKExfRUNITyh0dHkpKSB7CisJCQlpZiAoTF9FQ0hPUFJUKHR0eSkpIHsKKwkJCQlpZiAoIXR0eS0+ZXJhc2luZykgeworCQkJCQlwdXRfY2hhcignXFwnLCB0dHkpOworCQkJCQl0dHktPmNvbHVtbisrOworCQkJCQl0dHktPmVyYXNpbmcgPSAxOworCQkJCX0KKwkJCQkvKiBpZiBjbnQgPiAxLCBvdXRwdXQgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciAqLworCQkJCWVjaG9fY2hhcihjLCB0dHkpOworCQkJCXdoaWxlICgtLWNudCA+IDApIHsKKwkJCQkJaGVhZCA9IChoZWFkKzEpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQkJCQlwdXRfY2hhcih0dHktPnJlYWRfYnVmW2hlYWRdLCB0dHkpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoa2lsbF90eXBlID09IEVSQVNFICYmICFMX0VDSE9FKHR0eSkpIHsKKwkJCQllY2hvX2NoYXIoRVJBU0VfQ0hBUih0dHkpLCB0dHkpOworCQkJfSBlbHNlIGlmIChjID09ICdcdCcpIHsKKwkJCQl1bnNpZ25lZCBpbnQgY29sID0gdHR5LT5jYW5vbl9jb2x1bW47CisJCQkJdW5zaWduZWQgbG9uZyB0YWlsID0gdHR5LT5jYW5vbl9oZWFkOworCisJCQkJLyogRmluZCB0aGUgY29sdW1uIG9mIHRoZSBsYXN0IGNoYXIuICovCisJCQkJd2hpbGUgKHRhaWwgIT0gdHR5LT5yZWFkX2hlYWQpIHsKKwkJCQkJYyA9IHR0eS0+cmVhZF9idWZbdGFpbF07CisJCQkJCWlmIChjID09ICdcdCcpCisJCQkJCQljb2wgPSAoY29sIHwgNykgKyAxOworCQkJCQllbHNlIGlmIChpc2NudHJsKGMpKSB7CisJCQkJCQlpZiAoTF9FQ0hPQ1RMKHR0eSkpCisJCQkJCQkJY29sICs9IDI7CisJCQkJCX0gZWxzZSBpZiAoIWlzX2NvbnRpbnVhdGlvbihjLCB0dHkpKQorCQkJCQkJY29sKys7CisJCQkJCXRhaWwgPSAodGFpbCsxKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKKwkJCQl9CisKKwkJCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQkJaWYgKHR0eS0+Y29sdW1uID4gMHg4MDAwMDAwMCkKKwkJCQkJdHR5LT5jb2x1bW4gPSAwOyAKKworCQkJCS8qIE5vdyBiYWNrdXAgdG8gdGhhdCBjb2x1bW4uICovCisJCQkJd2hpbGUgKHR0eS0+Y29sdW1uID4gY29sKSB7CisJCQkJCS8qIENhbid0IHVzZSBvcG9zdCBoZXJlLiAqLworCQkJCQlwdXRfY2hhcignXGInLCB0dHkpOworCQkJCQlpZiAodHR5LT5jb2x1bW4gPiAwKQorCQkJCQkJdHR5LT5jb2x1bW4tLTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChpc2NudHJsKGMpICYmIExfRUNIT0NUTCh0dHkpKSB7CisJCQkJCXB1dF9jaGFyKCdcYicsIHR0eSk7CisJCQkJCXB1dF9jaGFyKCcgJywgdHR5KTsKKwkJCQkJcHV0X2NoYXIoJ1xiJywgdHR5KTsKKwkJCQkJaWYgKHR0eS0+Y29sdW1uID4gMCkKKwkJCQkJCXR0eS0+Y29sdW1uLS07CisJCQkJfQorCQkJCWlmICghaXNjbnRybChjKSB8fCBMX0VDSE9DVEwodHR5KSkgeworCQkJCQlwdXRfY2hhcignXGInLCB0dHkpOworCQkJCQlwdXRfY2hhcignICcsIHR0eSk7CisJCQkJCXB1dF9jaGFyKCdcYicsIHR0eSk7CisJCQkJCWlmICh0dHktPmNvbHVtbiA+IDApCisJCQkJCQl0dHktPmNvbHVtbi0tOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoa2lsbF90eXBlID09IEVSQVNFKQorCQkJYnJlYWs7CisJfQorCWlmICh0dHktPnJlYWRfaGVhZCA9PSB0dHktPmNhbm9uX2hlYWQpCisJCWZpbmlzaF9lcmFzaW5nKHR0eSk7Cit9CisKKy8qKgorICoJaXNpZwkJLQloYW5kbGUgdGhlIElTSUcgb3B0aW8KKyAqCUBzaWc6IHNpZ25hbAorICoJQHR0eTogdGVybWluYWwKKyAqCUBmbHVzaDogZm9yY2UgZmx1c2gKKyAqCisgKglDYWxsZWQgd2hlbiBhIHNpZ25hbCBpcyBiZWluZyBzZW50IGR1ZSB0byB0ZXJtaW5hbCBpbnB1dC4gVGhpcworICoJbWF5IGNhdXMgdGVybWluYWwgZmx1c2hpbmcgdG8gdGFrZSBwbGFjZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1pb3MKKyAqCXNldHRpbmdzIGFuZCBjaGFyYWN0ZXIgdXNlZC4gQ2FsbGVkIGZyb20gdGhlIGRyaXZlciByZWNlaXZlX2J1ZgorICoJcGF0aCBzbyBzZXJpYWxpemVkLgorICovCisgCitzdGF0aWMgaW5saW5lIHZvaWQgaXNpZyhpbnQgc2lnLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgZmx1c2gpCit7CisJaWYgKHR0eS0+cGdycCA+IDApCisJCWtpbGxfcGcodHR5LT5wZ3JwLCBzaWcsIDEpOworCWlmIChmbHVzaCB8fCAhTF9OT0ZMU0godHR5KSkgeworCQluX3R0eV9mbHVzaF9idWZmZXIodHR5KTsKKwkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJfQorfQorCisvKioKKyAqCW5fdHR5X3JlY2VpdmVfYnJlYWsJLQloYW5kbGUgYnJlYWsKKyAqCUB0dHk6IHRlcm1pbmFsCisgKgorICoJQW4gUlMyMzIgYnJlYWsgZXZlbnQgaGFzIGJlZW4gaGl0IGluIHRoZSBpbmNvbWluZyBiaXRzdHJlYW0uIFRoaXMKKyAqCWNhbiBjYXVzZSBhIHZhcmlldHkgb2YgZXZlbnRzIGRlcGVuZGluZyB1cG9uIHRoZSB0ZXJtaW9zIHNldHRpbmdzLgorICoKKyAqCUNhbGxlZCBmcm9tIHRoZSByZWNlaXZlX2J1ZiBwYXRoIHNvIHNpbmdsZSB0aHJlYWRlZC4KKyAqLworIAorc3RhdGljIGlubGluZSB2b2lkIG5fdHR5X3JlY2VpdmVfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoSV9JR05CUksodHR5KSkKKwkJcmV0dXJuOworCWlmIChJX0JSS0lOVCh0dHkpKSB7CisJCWlzaWcoU0lHSU5ULCB0dHksIDEpOworCQlyZXR1cm47CisJfQorCWlmIChJX1BBUk1SSyh0dHkpKSB7CisJCXB1dF90dHlfcXVldWUoJ1wzNzcnLCB0dHkpOworCQlwdXRfdHR5X3F1ZXVlKCdcMCcsIHR0eSk7CisJfQorCXB1dF90dHlfcXVldWUoJ1wwJywgdHR5KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKK30KKworLyoqCisgKgluX3R0eV9yZWNlaXZlX292ZXJydW4JLQloYW5kbGUgb3ZlcnJ1biByZXBvcnRpbmcKKyAqCUB0dHk6IHRlcm1pbmFsCisgKgorICoJRGF0YSBhcnJpdmVkIGZhc3RlciB0aGFuIHdlIGNvdWxkIHByb2Nlc3MgaXQuIFdoaWxlIHRoZSB0dHkKKyAqCWRyaXZlciBoYXMgZmxhZ2dlZCB0aGlzIHRoZSBiaXRzIHRoYXQgd2VyZSBtaXNzZWQgYXJlIGdvbmUKKyAqCWZvcmV2ZXIuCisgKgorICoJQ2FsbGVkIGZyb20gdGhlIHJlY2VpdmVfYnVmIHBhdGggc28gc2luZ2xlIHRocmVhZGVkLiBEb2VzIG5vdAorICoJbmVlZCBsb2NraW5nIGFzIG51bV9vdmVycnVuIGFuZCBvdmVycnVuX3RpbWUgYXJlIGZ1bmN0aW9uCisgKglwcml2YXRlLgorICovCisgCitzdGF0aWMgaW5saW5lIHZvaWQgbl90dHlfcmVjZWl2ZV9vdmVycnVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJY2hhciBidWZbNjRdOworCisJdHR5LT5udW1fb3ZlcnJ1bisrOworCWlmICh0aW1lX2JlZm9yZSh0dHktPm92ZXJydW5fdGltZSwgamlmZmllcyAtIEhaKSB8fAorCQkJdGltZV9hZnRlcih0dHktPm92ZXJydW5fdGltZSwgamlmZmllcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVkIGlucHV0IG92ZXJydW4ocylcbiIsCisJCQl0dHlfbmFtZSh0dHksIGJ1ZiksCisJCQl0dHktPm51bV9vdmVycnVuKTsKKwkJdHR5LT5vdmVycnVuX3RpbWUgPSBqaWZmaWVzOworCQl0dHktPm51bV9vdmVycnVuID0gMDsKKwl9Cit9CisKKy8qKgorICoJbl90dHlfcmVjZWl2ZV9wYXJpdHlfZXJyb3IJLQllcnJvciBub3RpZmllcgorICoJQHR0eTogdGVybWluYWwgZGV2aWNlCisgKglAYzogY2hhcmFjdGVyCisgKgorICoJUHJvY2VzcyBhIHBhcml0eSBlcnJvciBhbmQgcXVldWUgdGhlIHJpZ2h0IGRhdGEgdG8gaW5kaWNhdGUKKyAqCXRoZSBlcnJvciBjYXNlIGlmIG5lY2Nlc3NhcnkuIExvY2tpbmcgYXMgcGVyIG5fdHR5X3JlY2VpdmVfYnVmLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbl90dHlfcmVjZWl2ZV9wYXJpdHlfZXJyb3Ioc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQkJICAgICAgdW5zaWduZWQgY2hhciBjKQoreworCWlmIChJX0lHTlBBUih0dHkpKSB7CisJCXJldHVybjsKKwl9CisJaWYgKElfUEFSTVJLKHR0eSkpIHsKKwkJcHV0X3R0eV9xdWV1ZSgnXDM3NycsIHR0eSk7CisJCXB1dF90dHlfcXVldWUoJ1wwJywgdHR5KTsKKwkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCX0gZWxzZQlpZiAoSV9JTlBDSyh0dHkpKQorCQlwdXRfdHR5X3F1ZXVlKCdcMCcsIHR0eSk7CisJZWxzZQorCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJbl90dHlfcmVjZWl2ZV9jaGFyCS0JcGVyZm9ybSBwcm9jZXNzaW5nCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCUBjOiBjaGFyYWN0ZXIKKyAqCisgKglQcm9jZXNzIGFuIGluZGl2aWR1YWwgY2hhcmFjdGVyIG9mIGlucHV0IHJlY2VpdmVkIGZyb20gdGhlIGRyaXZlci4KKyAqCVRoaXMgaXMgc2VyaWFsaXplZCB3aXRoIHJlc3BlY3QgdG8gaXRzZWxmIGJ5IHRoZSBydWxlcyBmb3IgdGhlIAorICoJZHJpdmVyIGFib3ZlLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuX3R0eV9yZWNlaXZlX2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodHR5LT5yYXcpIHsKKwkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCQlyZXR1cm47CisJfQorCQorCWlmICh0dHktPnN0b3BwZWQgJiYgIXR0eS0+Zmxvd19zdG9wcGVkICYmCisJICAgIElfSVhPTih0dHkpICYmIElfSVhBTlkodHR5KSkgeworCQlzdGFydF90dHkodHR5KTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoSV9JU1RSSVAodHR5KSkKKwkJYyAmPSAweDdmOworCWlmIChJX0lVQ0xDKHR0eSkgJiYgTF9JRVhURU4odHR5KSkKKwkJYz10b2xvd2VyKGMpOworCisJaWYgKHR0eS0+Y2xvc2luZykgeworCQlpZiAoSV9JWE9OKHR0eSkpIHsKKwkJCWlmIChjID09IFNUQVJUX0NIQVIodHR5KSkKKwkJCQlzdGFydF90dHkodHR5KTsKKwkJCWVsc2UgaWYgKGMgPT0gU1RPUF9DSEFSKHR0eSkpCisJCQkJc3RvcF90dHkodHR5KTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHdhcyBMTkVYVCwgb3Igd2Uga25vdyB0aGF0IHRoaXMKKwkgKiBjaGFyYWN0ZXIgaXMgbm90IG9uZSBvZiB0aGUgY2hhcmFjdGVycyB0aGF0IHdlJ2xsIGhhdmUgdG8KKwkgKiBoYW5kbGUgc3BlY2lhbGx5LCBkbyBzaG9ydGN1dCBwcm9jZXNzaW5nIHRvIHNwZWVkIHRoaW5ncworCSAqIHVwLgorCSAqLworCWlmICghdGVzdF9iaXQoYywgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKSB8fCB0dHktPmxuZXh0KSB7CisJCWZpbmlzaF9lcmFzaW5nKHR0eSk7CisJCXR0eS0+bG5leHQgPSAwOworCQlpZiAoTF9FQ0hPKHR0eSkpIHsKKwkJCWlmICh0dHktPnJlYWRfY250ID49IE5fVFRZX0JVRl9TSVpFLTEpIHsKKwkJCQlwdXRfY2hhcignXGEnLCB0dHkpOyAvKiBiZWVwIGlmIG5vIHNwYWNlICovCisJCQkJcmV0dXJuOworCQkJfQorCQkJLyogUmVjb3JkIHRoZSBjb2x1bW4gb2YgZmlyc3QgY2Fub24gY2hhci4gKi8KKwkJCWlmICh0dHktPmNhbm9uX2hlYWQgPT0gdHR5LT5yZWFkX2hlYWQpCisJCQkJdHR5LT5jYW5vbl9jb2x1bW4gPSB0dHktPmNvbHVtbjsKKwkJCWVjaG9fY2hhcihjLCB0dHkpOworCQl9CisJCWlmIChJX1BBUk1SSyh0dHkpICYmIGMgPT0gKHVuc2lnbmVkIGNoYXIpICdcMzc3JykKKwkJCXB1dF90dHlfcXVldWUoYywgdHR5KTsKKwkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCQlyZXR1cm47CisJfQorCQkKKwlpZiAoYyA9PSAnXHInKSB7CisJCWlmIChJX0lHTkNSKHR0eSkpCisJCQlyZXR1cm47CisJCWlmIChJX0lDUk5MKHR0eSkpCisJCQljID0gJ1xuJzsKKwl9IGVsc2UgaWYgKGMgPT0gJ1xuJyAmJiBJX0lOTENSKHR0eSkpCisJCWMgPSAnXHInOworCWlmIChJX0lYT04odHR5KSkgeworCQlpZiAoYyA9PSBTVEFSVF9DSEFSKHR0eSkpIHsKKwkJCXN0YXJ0X3R0eSh0dHkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChjID09IFNUT1BfQ0hBUih0dHkpKSB7CisJCQlzdG9wX3R0eSh0dHkpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChMX0lTSUcodHR5KSkgeworCQlpbnQgc2lnbmFsOworCQlzaWduYWwgPSBTSUdJTlQ7CisJCWlmIChjID09IElOVFJfQ0hBUih0dHkpKQorCQkJZ290byBzZW5kX3NpZ25hbDsKKwkJc2lnbmFsID0gU0lHUVVJVDsKKwkJaWYgKGMgPT0gUVVJVF9DSEFSKHR0eSkpCisJCQlnb3RvIHNlbmRfc2lnbmFsOworCQlzaWduYWwgPSBTSUdUU1RQOworCQlpZiAoYyA9PSBTVVNQX0NIQVIodHR5KSkgeworc2VuZF9zaWduYWw6CisJCQlpc2lnKHNpZ25hbCwgdHR5LCAwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAodHR5LT5pY2Fub24pIHsKKwkJaWYgKGMgPT0gRVJBU0VfQ0hBUih0dHkpIHx8IGMgPT0gS0lMTF9DSEFSKHR0eSkgfHwKKwkJICAgIChjID09IFdFUkFTRV9DSEFSKHR0eSkgJiYgTF9JRVhURU4odHR5KSkpIHsKKwkJCWVyYXNlcihjLCB0dHkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChjID09IExORVhUX0NIQVIodHR5KSAmJiBMX0lFWFRFTih0dHkpKSB7CisJCQl0dHktPmxuZXh0ID0gMTsKKwkJCWlmIChMX0VDSE8odHR5KSkgeworCQkJCWZpbmlzaF9lcmFzaW5nKHR0eSk7CisJCQkJaWYgKExfRUNIT0NUTCh0dHkpKSB7CisJCQkJCXB1dF9jaGFyKCdeJywgdHR5KTsKKwkJCQkJcHV0X2NoYXIoJ1xiJywgdHR5KTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGMgPT0gUkVQUklOVF9DSEFSKHR0eSkgJiYgTF9FQ0hPKHR0eSkgJiYKKwkJICAgIExfSUVYVEVOKHR0eSkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgdGFpbCA9IHR0eS0+Y2Fub25faGVhZDsKKworCQkJZmluaXNoX2VyYXNpbmcodHR5KTsKKwkJCWVjaG9fY2hhcihjLCB0dHkpOworCQkJb3Bvc3QoJ1xuJywgdHR5KTsKKwkJCXdoaWxlICh0YWlsICE9IHR0eS0+cmVhZF9oZWFkKSB7CisJCQkJZWNob19jaGFyKHR0eS0+cmVhZF9idWZbdGFpbF0sIHR0eSk7CisJCQkJdGFpbCA9ICh0YWlsKzEpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCWlmIChjID09ICdcbicpIHsKKwkJCWlmIChMX0VDSE8odHR5KSB8fCBMX0VDSE9OTCh0dHkpKSB7CisJCQkJaWYgKHR0eS0+cmVhZF9jbnQgPj0gTl9UVFlfQlVGX1NJWkUtMSkgeworCQkJCQlwdXRfY2hhcignXGEnLCB0dHkpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCW9wb3N0KCdcbicsIHR0eSk7CisJCQl9CisJCQlnb3RvIGhhbmRsZV9uZXdsaW5lOworCQl9CisJCWlmIChjID09IEVPRl9DSEFSKHR0eSkpIHsKKwkJICAgICAgICBpZiAodHR5LT5jYW5vbl9oZWFkICE9IHR0eS0+cmVhZF9oZWFkKQorCQkJICAgICAgICBzZXRfYml0KFRUWV9QVVNILCAmdHR5LT5mbGFncyk7CisJCQljID0gX19ESVNBQkxFRF9DSEFSOworCQkJZ290byBoYW5kbGVfbmV3bGluZTsKKwkJfQorCQlpZiAoKGMgPT0gRU9MX0NIQVIodHR5KSkgfHwKKwkJICAgIChjID09IEVPTDJfQ0hBUih0dHkpICYmIExfSUVYVEVOKHR0eSkpKSB7CisJCQkvKgorCQkJICogWFhYIGFyZSBFT0xfQ0hBUiBhbmQgRU9MMl9DSEFSIGVjaG9lZD8hPworCQkJICovCisJCQlpZiAoTF9FQ0hPKHR0eSkpIHsKKwkJCQlpZiAodHR5LT5yZWFkX2NudCA+PSBOX1RUWV9CVUZfU0laRS0xKSB7CisJCQkJCXB1dF9jaGFyKCdcYScsIHR0eSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJLyogUmVjb3JkIHRoZSBjb2x1bW4gb2YgZmlyc3QgY2Fub24gY2hhci4gKi8KKwkJCQlpZiAodHR5LT5jYW5vbl9oZWFkID09IHR0eS0+cmVhZF9oZWFkKQorCQkJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uOworCQkJCWVjaG9fY2hhcihjLCB0dHkpOworCQkJfQorCQkJLyoKKwkJCSAqIFhYWCBkb2VzIFBBUk1SSyBkb3VibGluZyBoYXBwZW4gZm9yCisJCQkgKiBFT0xfQ0hBUiBhbmQgRU9MMl9DSEFSPworCQkJICovCisJCQlpZiAoSV9QQVJNUksodHR5KSAmJiBjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpCisJCQkJcHV0X3R0eV9xdWV1ZShjLCB0dHkpOworCisJCWhhbmRsZV9uZXdsaW5lOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJCQlzZXRfYml0KHR0eS0+cmVhZF9oZWFkLCB0dHktPnJlYWRfZmxhZ3MpOworCQkJcHV0X3R0eV9xdWV1ZV9ub2xvY2soYywgdHR5KTsKKwkJCXR0eS0+Y2Fub25faGVhZCA9IHR0eS0+cmVhZF9oZWFkOworCQkJdHR5LT5jYW5vbl9kYXRhKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQkJa2lsbF9mYXN5bmMoJnR0eS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT5yZWFkX3dhaXQpKQorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5yZWFkX3dhaXQpOworCQkJcmV0dXJuOworCQl9CisJfQorCQorCWZpbmlzaF9lcmFzaW5nKHR0eSk7CisJaWYgKExfRUNITyh0dHkpKSB7CisJCWlmICh0dHktPnJlYWRfY250ID49IE5fVFRZX0JVRl9TSVpFLTEpIHsKKwkJCXB1dF9jaGFyKCdcYScsIHR0eSk7IC8qIGJlZXAgaWYgbm8gc3BhY2UgKi8KKwkJCXJldHVybjsKKwkJfQorCQlpZiAoYyA9PSAnXG4nKQorCQkJb3Bvc3QoJ1xuJywgdHR5KTsKKwkJZWxzZSB7CisJCQkvKiBSZWNvcmQgdGhlIGNvbHVtbiBvZiBmaXJzdCBjYW5vbiBjaGFyLiAqLworCQkJaWYgKHR0eS0+Y2Fub25faGVhZCA9PSB0dHktPnJlYWRfaGVhZCkKKwkJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uOworCQkJZWNob19jaGFyKGMsIHR0eSk7CisJCX0KKwl9CisKKwlpZiAoSV9QQVJNUksodHR5KSAmJiBjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpCisJCXB1dF90dHlfcXVldWUoYywgdHR5KTsKKworCXB1dF90dHlfcXVldWUoYywgdHR5KTsKK30JCisKKy8qKgorICoJbl90dHlfcmVjZWl2ZV9yb29tCS0JcmVjZWl2ZSBzcGFjZQorICoJQHR0eTogdGVybWluYWwKKyAqCisgKglDYWxsZWQgYnkgdGhlIGRyaXZlciB0byBmaW5kIG91dCBob3cgbXVjaCBkYXRhIGl0IGlzCisgKglwZXJtaXR0ZWQgdG8gZmVlZCB0byB0aGUgbGluZSBkaXNjaXBsaW5lIHdpdGhvdXQgYW55IGJlaW5nIGxvc3QKKyAqCWFuZCB0aHVzIHRvIG1hbmFnZSBmbG93IGNvbnRyb2wuIE5vdCBzZXJpYWxpemVkLiBBbnN3ZXJzIGZvciB0aGUKKyAqCSJpbnN0YW50Ii4KKyAqLworIAorc3RhdGljIGludCBuX3R0eV9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQJbGVmdCA9IE5fVFRZX0JVRl9TSVpFIC0gdHR5LT5yZWFkX2NudCAtIDE7CisKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBpbnB1dCBjYW5vbmljYWxpemF0aW9uLCBhbmQgdGhlcmUgYXJlIG5vCisJICogcGVuZGluZyBuZXdsaW5lcywgbGV0IGNoYXJhY3RlcnMgdGhyb3VnaCB3aXRob3V0IGxpbWl0LCBzbworCSAqIHRoYXQgZXJhc2UgY2hhcmFjdGVycyB3aWxsIGJlIGhhbmRsZWQuICBPdGhlciBleGNlc3MKKwkgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgYmVlcGVkLgorCSAqLworCWlmICh0dHktPmljYW5vbiAmJiAhdHR5LT5jYW5vbl9kYXRhKQorCQlyZXR1cm4gTl9UVFlfQlVGX1NJWkU7CisKKwlpZiAobGVmdCA+IDApCisJCXJldHVybiBsZWZ0OworCXJldHVybiAwOworfQorCisvKioKKyAqCW5fdHR5X3dyaXRlX3dha2V1cAktCWFzeW5jaHJvbm91cyBJL08gbm90aWZpZXIKKyAqCUB0dHk6IHR0eSBkZXZpY2UKKyAqCisgKglSZXF1aXJlZCBmb3IgdGhlIHB0eXMsIHNlcmlhbCBkcml2ZXIgZXRjLiBzaW5jZSBwcm9jZXNzZXMKKyAqCXRoYXQgYXR0YWNoIHRoZW1zZWx2ZXMgdG8gdGhlIG1hc3RlciBhbmQgcmVseSBvbiBBU1lOQworICoJSU8gbXVzdCBiZSB3b2tlbiB1cAorICovCisKK3N0YXRpYyB2b2lkIG5fdHR5X3dyaXRlX3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICh0dHktPmZhc3luYykKKwl7CisgCQlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKKwkJa2lsbF9mYXN5bmMoJnR0eS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9PVVQpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICoJbl90dHlfcmVjZWl2ZV9idWYJLQlkYXRhIHJlY2VpdmUKKyAqCUB0dHk6IHRlcm1pbmFsIGRldmljZQorICoJQGNwOiBidWZmZXIKKyAqCUBmcDogZmxhZyBidWZmZXIKKyAqCUBjb3VudDogY2hhcmFjdGVycworICoKKyAqCUNhbGxlZCBieSB0aGUgdGVybWluYWwgZHJpdmVyIHdoZW4gYSBibG9jayBvZiBjaGFyYWN0ZXJzIGhhcworICoJYmVlbiByZWNlaXZlZC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmcm9tIHNvZnQgY29udGV4dHMKKyAqCW5vdCBmcm9tIGludGVycnVwdCBjb250ZXh0LiBUaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcKKyAqCWNhbGxzIG9uZSBhdCBhIHRpbWUgYW5kIGluIG9yZGVyIChvciB1c2luZyBmbHVzaF90b19sZGlzYykKKyAqLworIAorc3RhdGljIHZvaWQgbl90dHlfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCQkgICAgICBjaGFyICpmcCwgaW50IGNvdW50KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJY2hhciAqZiwgZmxhZ3MgPSBUVFlfTk9STUFMOworCWludAlpOworCWNoYXIJYnVmWzY0XTsKKwl1bnNpZ25lZCBsb25nIGNwdWZsYWdzOworCisJaWYgKCF0dHktPnJlYWRfYnVmKQorCQlyZXR1cm47CisKKwlpZiAodHR5LT5yZWFsX3JhdykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGNwdWZsYWdzKTsKKwkJaSA9IG1pbihOX1RUWV9CVUZfU0laRSAtIHR0eS0+cmVhZF9jbnQsCisJCQlOX1RUWV9CVUZfU0laRSAtIHR0eS0+cmVhZF9oZWFkKTsKKwkJaSA9IG1pbihjb3VudCwgaSk7CisJCW1lbWNweSh0dHktPnJlYWRfYnVmICsgdHR5LT5yZWFkX2hlYWQsIGNwLCBpKTsKKwkJdHR5LT5yZWFkX2hlYWQgPSAodHR5LT5yZWFkX2hlYWQgKyBpKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKKwkJdHR5LT5yZWFkX2NudCArPSBpOworCQljcCArPSBpOworCQljb3VudCAtPSBpOworCisJCWkgPSBtaW4oTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfY250LAorCQkJTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfaGVhZCk7CisJCWkgPSBtaW4oY291bnQsIGkpOworCQltZW1jcHkodHR5LT5yZWFkX2J1ZiArIHR0eS0+cmVhZF9oZWFkLCBjcCwgaSk7CisJCXR0eS0+cmVhZF9oZWFkID0gKHR0eS0+cmVhZF9oZWFkICsgaSkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJCXR0eS0+cmVhZF9jbnQgKz0gaTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGNwdWZsYWdzKTsKKwl9IGVsc2UgeworCQlmb3IgKGk9Y291bnQsIHAgPSBjcCwgZiA9IGZwOyBpOyBpLS0sIHArKykgeworCQkJaWYgKGYpCisJCQkJZmxhZ3MgPSAqZisrOworCQkJc3dpdGNoIChmbGFncykgeworCQkJY2FzZSBUVFlfTk9STUFMOgorCQkJCW5fdHR5X3JlY2VpdmVfY2hhcih0dHksICpwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVFRZX0JSRUFLOgorCQkJCW5fdHR5X3JlY2VpdmVfYnJlYWsodHR5KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVFRZX1BBUklUWToKKwkJCWNhc2UgVFRZX0ZSQU1FOgorCQkJCW5fdHR5X3JlY2VpdmVfcGFyaXR5X2Vycm9yKHR0eSwgKnApOworCQkJCWJyZWFrOworCQkJY2FzZSBUVFlfT1ZFUlJVTjoKKwkJCQluX3R0eV9yZWNlaXZlX292ZXJydW4odHR5KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKCIlczogdW5rbm93biBmbGFnICVkXG4iLAorCQkJCSAgICAgICB0dHlfbmFtZSh0dHksIGJ1ZiksIGZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKQorCQkJdHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKHR0eSk7CisJfQorCisJaWYgKCF0dHktPmljYW5vbiAmJiAodHR5LT5yZWFkX2NudCA+PSB0dHktPm1pbmltdW1fdG9fd2FrZSkpIHsKKwkJa2lsbF9mYXN5bmMoJnR0eS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPnJlYWRfd2FpdCkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSByZW1haW5pbmcgcm9vbSBmb3IgdGhlIGlucHV0IGNhbm9uaWNhbGl6YXRpb24KKwkgKiBtb2RlLiAgV2UgZG9uJ3Qgd2FudCB0byB0aHJvdHRsZSB0aGUgZHJpdmVyIGlmIHdlJ3JlIGluCisJICogY2Fub25pY2FsIG1vZGUgYW5kIGRvbid0IGhhdmUgYSBuZXdsaW5lIHlldCEKKwkgKi8KKwlpZiAobl90dHlfcmVjZWl2ZV9yb29tKHR0eSkgPCBUVFlfVEhSRVNIT0xEX1RIUk9UVExFKSB7CisJCS8qIGNoZWNrIFRUWV9USFJPVFRMRUQgZmlyc3Qgc28gaXQgaW5kaWNhdGVzIG91ciBzdGF0ZSAqLworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpICYmCisJCSAgICB0dHktPmRyaXZlci0+dGhyb3R0bGUpCisJCQl0dHktPmRyaXZlci0+dGhyb3R0bGUodHR5KTsKKwl9Cit9CisKK2ludCBpc19pZ25vcmVkKGludCBzaWcpCit7CisJcmV0dXJuIChzaWdpc21lbWJlcigmY3VycmVudC0+YmxvY2tlZCwgc2lnKSB8fAorCSAgICAgICAgY3VycmVudC0+c2lnaGFuZC0+YWN0aW9uW3NpZy0xXS5zYS5zYV9oYW5kbGVyID09IFNJR19JR04pOworfQorCisvKioKKyAqCW5fdHR5X3NldF90ZXJtaW9zCS0JdGVybWlvcyBkYXRhIGNoYW5nZWQKKyAqCUB0dHk6IHRlcm1pbmFsCisgKglAb2xkOiBwcmV2aW91cyBkYXRhCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB0dHkgbGF5ZXIgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRlcm1pb3MgZmxhZ3Mgc28KKyAqCXRoYXQgdGhlIGxpbmUgZGlzY2lwbGluZSBjYW4gcGxhbiBhaGVhZC4gVGhpcyBmdW5jdGlvbiBjYW5ub3Qgc2xlZXAKKyAqCWFuZCBpcyBwcm90ZWN0ZWQgZnJvbSByZS1lbnRyeSBieSB0aGUgdHR5IGxheWVyLiBUaGUgdXNlciBpcyAKKyAqCWd1YXJhbnRlZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJlIHJlLWVudGVyZWQgb3IgaW4gcHJvZ3Jlc3MKKyAqCXdoZW4gdGhlIGxkaXNjIGlzIGNsb3NlZC4KKyAqLworIAorc3RhdGljIHZvaWQgbl90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpCit7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKwkKKwl0dHktPmljYW5vbiA9IChMX0lDQU5PTih0dHkpICE9IDApOworCWlmICh0ZXN0X2JpdChUVFlfSFdfQ09PS19JTiwgJnR0eS0+ZmxhZ3MpKSB7CisJCXR0eS0+cmF3ID0gMTsKKwkJdHR5LT5yZWFsX3JhdyA9IDE7CisJCXJldHVybjsKKwl9CisJaWYgKElfSVNUUklQKHR0eSkgfHwgSV9JVUNMQyh0dHkpIHx8IElfSUdOQ1IodHR5KSB8fAorCSAgICBJX0lDUk5MKHR0eSkgfHwgSV9JTkxDUih0dHkpIHx8IExfSUNBTk9OKHR0eSkgfHwKKwkgICAgSV9JWE9OKHR0eSkgfHwgTF9JU0lHKHR0eSkgfHwgTF9FQ0hPKHR0eSkgfHwKKwkgICAgSV9QQVJNUksodHR5KSkgeworCQltZW1zZXQodHR5LT5wcm9jZXNzX2NoYXJfbWFwLCAwLCAyNTYvOCk7CisKKwkJaWYgKElfSUdOQ1IodHR5KSB8fCBJX0lDUk5MKHR0eSkpCisJCQlzZXRfYml0KCdccicsIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCWlmIChJX0lOTENSKHR0eSkpCisJCQlzZXRfYml0KCdcbicsIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisKKwkJaWYgKExfSUNBTk9OKHR0eSkpIHsKKwkJCXNldF9iaXQoRVJBU0VfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJc2V0X2JpdChLSUxMX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCXNldF9iaXQoRU9GX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCXNldF9iaXQoJ1xuJywgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCXNldF9iaXQoRU9MX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCWlmIChMX0lFWFRFTih0dHkpKSB7CisJCQkJc2V0X2JpdChXRVJBU0VfQ0hBUih0dHkpLAorCQkJCQl0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJCXNldF9iaXQoTE5FWFRfQ0hBUih0dHkpLAorCQkJCQl0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJCXNldF9iaXQoRU9MMl9DSEFSKHR0eSksCisJCQkJCXR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCQkJaWYgKExfRUNITyh0dHkpKQorCQkJCQlzZXRfYml0KFJFUFJJTlRfQ0hBUih0dHkpLAorCQkJCQkJdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJCX0KKwkJfQorCQlpZiAoSV9JWE9OKHR0eSkpIHsKKwkJCXNldF9iaXQoU1RBUlRfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJc2V0X2JpdChTVE9QX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJfQorCQlpZiAoTF9JU0lHKHR0eSkpIHsKKwkJCXNldF9iaXQoSU5UUl9DSEFSKHR0eSksIHR0eS0+cHJvY2Vzc19jaGFyX21hcCk7CisJCQlzZXRfYml0KFFVSVRfQ0hBUih0dHkpLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQkJc2V0X2JpdChTVVNQX0NIQVIodHR5KSwgdHR5LT5wcm9jZXNzX2NoYXJfbWFwKTsKKwkJfQorCQljbGVhcl9iaXQoX19ESVNBQkxFRF9DSEFSLCB0dHktPnByb2Nlc3NfY2hhcl9tYXApOworCQl0dHktPnJhdyA9IDA7CisJCXR0eS0+cmVhbF9yYXcgPSAwOworCX0gZWxzZSB7CisJCXR0eS0+cmF3ID0gMTsKKwkJaWYgKChJX0lHTkJSSyh0dHkpIHx8ICghSV9CUktJTlQodHR5KSAmJiAhSV9QQVJNUksodHR5KSkpICYmCisJCSAgICAoSV9JR05QQVIodHR5KSB8fCAhSV9JTlBDSyh0dHkpKSAmJgorCQkgICAgKHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfUkVBTF9SQVcpKQorCQkJdHR5LT5yZWFsX3JhdyA9IDE7CisJCWVsc2UKKwkJCXR0eS0+cmVhbF9yYXcgPSAwOworCX0KK30KKworLyoqCisgKgluX3R0eV9jbG9zZQkJLQljbG9zZSB0aGUgbGRpc2MgZm9yIHRoaXMgdHR5CisgKglAdHR5OiBkZXZpY2UKKyAqCisgKglDYWxsZWQgZnJvbSB0aGUgdGVybWluYWwgbGF5ZXIgd2hlbiB0aGlzIGxpbmUgZGlzY2lwbGluZSBpcyAKKyAqCWJlaW5nIHNodXQgZG93biwgZWl0aGVyIGJlY2F1c2Ugb2YgYSBjbG9zZSBvciBiZWNzdXNlIG9mIGEgCisgKglkaXNjaXBsaW5lIGNoYW5nZS4gVGhlIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNhbGxlZCB3aGlsZSBvdGhlcgorICoJbGRpc2MgbWV0aG9kcyBhcmUgaW4gcHJvZ3Jlc3MuCisgKi8KKyAKK3N0YXRpYyB2b2lkIG5fdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJbl90dHlfZmx1c2hfYnVmZmVyKHR0eSk7CisJaWYgKHR0eS0+cmVhZF9idWYpIHsKKwkJZnJlZV9idWYodHR5LT5yZWFkX2J1Zik7CisJCXR0eS0+cmVhZF9idWYgPSBOVUxMOworCX0KK30KKworLyoqCisgKgluX3R0eV9vcGVuCQktCW9wZW4gYW4gbGRpc2MKKyAqCUB0dHk6IHRlcm1pbmFsIHRvIG9wZW4KKyAqCisgKglDYWxsZWQgd2hlbiB0aGlzIGxpbmUgZGlzY2lwbGluZSBpcyBiZWluZyBhdHRhY2hlZCB0byB0aGUgCisgKgl0ZXJtaW5hbCBkZXZpY2UuIENhbiBzbGVlcC4gQ2FsbGVkIHNlcmlhbGl6ZWQgc28gdGhhdCBubworICoJb3RoZXIgZXZlbnRzIHdpbGwgb2NjdXIgaW4gcGFyYWxsZWwuIE5vIGZ1cnRoZXIgb3BlbiB3aWxsIG9jY3VyCisgKgl1bnRpbCBhIGNsb3NlLgorICovCisKK3N0YXRpYyBpbnQgbl90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICghdHR5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoaXMgb25lIGlzIHVnbHkuIEN1cnJlbnRseSBhIG1hbGxvYyBmYWlsdXJlIGhlcmUgY2FuIHBhbmljICovCisJaWYgKCF0dHktPnJlYWRfYnVmKSB7CisJCXR0eS0+cmVhZF9idWYgPSBhbGxvY19idWYoKTsKKwkJaWYgKCF0dHktPnJlYWRfYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCh0dHktPnJlYWRfYnVmLCAwLCBOX1RUWV9CVUZfU0laRSk7CisJcmVzZXRfYnVmZmVyX2ZsYWdzKHR0eSk7CisJdHR5LT5jb2x1bW4gPSAwOworCW5fdHR5X3NldF90ZXJtaW9zKHR0eSwgTlVMTCk7CisJdHR5LT5taW5pbXVtX3RvX3dha2UgPSAxOworCXR0eS0+Y2xvc2luZyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlucHV0X2F2YWlsYWJsZV9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBhbXQpCit7CisJaWYgKHR0eS0+aWNhbm9uKSB7CisJCWlmICh0dHktPmNhbm9uX2RhdGEpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKHR0eS0+cmVhZF9jbnQgPj0gKGFtdCA/IGFtdCA6IDEpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIAljb3B5X2Zyb21fcmVhZF9idWYJLQljb3B5IHJlYWQgZGF0YSBkaXJlY3RseQorICoJQHR0eTogdGVybWluYWwgZGV2aWNlCisgKglAYjogdXNlciBkYXRhCisgKglAbnI6IHNpemUgb2YgZGF0YQorICoKKyAqCUhlbHBlciBmdW5jdGlvbiB0byBzcGVlZCB1cCByZWFkX2NoYW4uICBJdCBpcyBvbmx5IGNhbGxlZCB3aGVuCisgKglJQ0FOT04gaXMgb2ZmOyBpdCBjb3BpZXMgY2hhcmFjdGVycyBzdHJhaWdodCBmcm9tIHRoZSB0dHkgcXVldWUgdG8KKyAqCXVzZXIgc3BhY2UgZGlyZWN0bHkuICBJdCBjYW4gYmUgcHJvZml0YWJseSBjYWxsZWQgdHdpY2U7IG9uY2UgdG8KKyAqCWRyYWluIHRoZSBzcGFjZSBmcm9tIHRoZSB0YWlsIHBvaW50ZXIgdG8gdGhlIChwaHlzaWNhbCkgZW5kIG9mIHRoZQorICoJYnVmZmVyLCBhbmQgb25jZSB0byBkcmFpbiB0aGUgc3BhY2UgZnJvbSB0aGUgKHBoeXNpY2FsKSBiZWdpbm5pbmcgb2YKKyAqCXRoZSBidWZmZXIgdG8gaGVhZCBwb2ludGVyLgorICoKKyAqCUNhbGxlZCB1bmRlciB0aGUgdHR5LT5hdG9taWNfcmVhZCBzZW0gYW5kIHdpdGggVFRZX0RPTlRfRkxJUCBzZXQKKyAqCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgaW50IGNvcHlfZnJvbV9yZWFkX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICoqYiwKKwkJCQkgICAgICBzaXplX3QgKm5yKQorCit7CisJaW50IHJldHZhbDsKKwlzaXplX3QgbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmV0dmFsID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKKwluID0gbWluKHR0eS0+cmVhZF9jbnQsIE5fVFRZX0JVRl9TSVpFIC0gdHR5LT5yZWFkX3RhaWwpOworCW4gPSBtaW4oKm5yLCBuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCWlmIChuKSB7CisJCW1iKCk7CisJCXJldHZhbCA9IGNvcHlfdG9fdXNlcigqYiwgJnR0eS0+cmVhZF9idWZbdHR5LT5yZWFkX3RhaWxdLCBuKTsKKwkJbiAtPSByZXR2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQl0dHktPnJlYWRfdGFpbCA9ICh0dHktPnJlYWRfdGFpbCArIG4pICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCQl0dHktPnJlYWRfY250IC09IG47CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJCSpiICs9IG47CisJCSpuciAtPSBuOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitleHRlcm4gc3NpemVfdCByZWRpcmVjdGVkX3R0eV93cml0ZShzdHJ1Y3QgZmlsZSAqLGNvbnN0IGNoYXIgKixzaXplX3QsbG9mZl90ICopOworCisvKioKKyAqCWpvYl9jb250cm9sCQktCWNoZWNrIGpvYiBjb250cm9sCisgKglAdHR5OiB0dHkKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZQorICoKKyAqCVBlcmZvcm0gam9iIGNvbnRyb2wgbWFuYWdlbWVudCBjaGVja3Mgb24gdGhpcyBmaWxlL3R0eSBkZXNjcmlwdG9yCisgKglhbmQgaWYgYXBwcm9wcmlhdGUgc2VuZCBhbnkgbmVlZGVkIHNpZ25hbHMgYW5kIHJldHVybiBhIG5lZ2F0aXZlIAorICoJZXJyb3IgY29kZSBpZiBhY3Rpb24gc2hvdWxkIGJlIHRha2VuLgorICovCisgCitzdGF0aWMgaW50IGpvYl9jb250cm9sKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIEpvYiBjb250cm9sIGNoZWNrIC0tIG11c3QgYmUgZG9uZSBhdCBzdGFydCBhbmQgYWZ0ZXIKKwkgICBldmVyeSBzbGVlcCAoUE9TSVguMSA3LjEuMS40KS4gKi8KKwkvKiBOT1RFOiBub3QgeWV0IGRvbmUgYWZ0ZXIgZXZlcnkgc2xlZXAgcGVuZGluZyBhIHRob3JvdWdoCisJICAgY2hlY2sgb2YgdGhlIGxvZ2ljIG9mIHRoaXMgY2hhbmdlLiAtLSBqbGMgKi8KKwkvKiBkb24ndCBzdG9wIG9uIC9kZXYvY29uc29sZSAqLworCWlmIChmaWxlLT5mX29wLT53cml0ZSAhPSByZWRpcmVjdGVkX3R0eV93cml0ZSAmJgorCSAgICBjdXJyZW50LT5zaWduYWwtPnR0eSA9PSB0dHkpIHsKKwkJaWYgKHR0eS0+cGdycCA8PSAwKQorCQkJcHJpbnRrKCJyZWFkX2NoYW46IHR0eS0+cGdycCA8PSAwIVxuIik7CisJCWVsc2UgaWYgKHByb2Nlc3NfZ3JvdXAoY3VycmVudCkgIT0gdHR5LT5wZ3JwKSB7CisJCQlpZiAoaXNfaWdub3JlZChTSUdUVElOKSB8fAorCQkJICAgIGlzX29ycGhhbmVkX3BncnAocHJvY2Vzc19ncm91cChjdXJyZW50KSkpCisJCQkJcmV0dXJuIC1FSU87CisJCQlraWxsX3BnKHByb2Nlc3NfZ3JvdXAoY3VycmVudCksIFNJR1RUSU4sIDEpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyAKKworLyoqCisgKglyZWFkX2NoYW4JCS0JcmVhZCBmdW5jdGlvbiBmb3IgdHR5CisgKglAdHR5OiB0dHkgZGV2aWNlCisgKglAZmlsZTogZmlsZSBvYmplY3QKKyAqCUBidWY6IHVzZXJzcGFjZSBidWZmZXIgcG9pbnRlcgorICoJQG5yOiBzaXplIG9mIEkvTworICoKKyAqCVBlcmZvcm0gcmVhZHMgZm9yIHRoZSBsaW5lIGRpc2NpcGxpbmUuIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgdGhlCisgKglsaW5lIGRpc2NpcGxpbmUgd2lsbCBub3QgYmUgY2xvc2VkIHVuZGVyIHVzIGJ1dCB3ZSBtYXkgZ2V0IG11bHRpcGxlCisgKglwYXJhbGxlbCByZWFkZXJzIGFuZCBtdXN0IGhhbmRsZSB0aGlzIG91cnNlbHZlcy4gV2UgbWF5IGFsc28gZ2V0CisgKglhIGhhbmd1cC4gQWx3YXlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQsIG1heSBzbGVlcC4KKyAqCisgKglUaGlzIGNvZGUgbXVzdCBiZSBzdXJlIG5ldmVyIHRvIHNsZWVwIHRocm91Z2ggYSBoYW5ndXAuCisgKi8KKyAKK3N0YXRpYyBzc2l6ZV90IHJlYWRfY2hhbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbnIpCit7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmIgPSBidWY7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IGM7CisJaW50IG1pbmltdW0sIHRpbWU7CisJc3NpemVfdCByZXR2YWwgPSAwOworCXNzaXplX3Qgc2l6ZTsKKwlsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworZG9faXRfYWdhaW46CisKKwlpZiAoIXR0eS0+cmVhZF9idWYpIHsKKwkJcHJpbnRrKCJuX3R0eV9yZWFkX2NoYW46IGNhbGxlZCB3aXRoIHJlYWRfYnVmID09IE5VTEw/IT9cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljID0gam9iX2NvbnRyb2wodHR5LCBmaWxlKTsKKwlpZihjIDwgMCkKKwkJcmV0dXJuIGM7CisJCisJbWluaW11bSA9IHRpbWUgPSAwOworCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwlpZiAoIXR0eS0+aWNhbm9uKSB7CisJCXRpbWUgPSAoSFogLyAxMCkgKiBUSU1FX0NIQVIodHR5KTsKKwkJbWluaW11bSA9IE1JTl9DSEFSKHR0eSk7CisJCWlmIChtaW5pbXVtKSB7CisJCQlpZiAodGltZSkKKwkJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IDE7CisJCQllbHNlIGlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT5yZWFkX3dhaXQpIHx8CisJCQkJICh0dHktPm1pbmltdW1fdG9fd2FrZSA+IG1pbmltdW0pKQorCQkJCXR0eS0+bWluaW11bV90b193YWtlID0gbWluaW11bTsKKwkJfSBlbHNlIHsKKwkJCXRpbWVvdXQgPSAwOworCQkJaWYgKHRpbWUpIHsKKwkJCQl0aW1lb3V0ID0gdGltZTsKKwkJCQl0aW1lID0gMDsKKwkJCX0KKwkJCXR0eS0+bWluaW11bV90b193YWtlID0gbWluaW11bSA9IDE7CisJCX0KKwl9CisKKwkvKgorCSAqCUludGVybmFsIHNlcmlhbGl6YXRpb24gb2YgcmVhZHMuCisJICovCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWlmIChkb3duX3RyeWxvY2soJnR0eS0+YXRvbWljX3JlYWQpKQorCQkJcmV0dXJuIC1FQUdBSU47CisJfQorCWVsc2UgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0dHktPmF0b21pY19yZWFkKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJYWRkX3dhaXRfcXVldWUoJnR0eS0+cmVhZF93YWl0LCAmd2FpdCk7CisJc2V0X2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7CisJd2hpbGUgKG5yKSB7CisJCS8qIEZpcnN0IHRlc3QgZm9yIHN0YXR1cyBjaGFuZ2UuICovCisJCWlmICh0dHktPnBhY2tldCAmJiB0dHktPmxpbmstPmN0cmxfc3RhdHVzKSB7CisJCQl1bnNpZ25lZCBjaGFyIGNzOworCQkJaWYgKGIgIT0gYnVmKQorCQkJCWJyZWFrOworCQkJY3MgPSB0dHktPmxpbmstPmN0cmxfc3RhdHVzOworCQkJdHR5LT5saW5rLT5jdHJsX3N0YXR1cyA9IDA7CisJCQlpZiAocHV0X3VzZXIoY3MsIGIrKykpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWItLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5yLS07CisJCQlicmVhazsKKwkJfQorCQkvKiBUaGlzIHN0YXRlbWVudCBtdXN0IGJlIGZpcnN0IGJlZm9yZSBjaGVja2luZyBmb3IgaW5wdXQKKwkJICAgc28gdGhhdCBhbnkgaW50ZXJydXB0IHdpbGwgc2V0IHRoZSBzdGF0ZSBiYWNrIHRvCisJCSAgIFRBU0tfUlVOTklORy4gKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCisJCWlmICgoKG1pbmltdW0gLSAoYiAtIGJ1ZikpIDwgdHR5LT5taW5pbXVtX3RvX3dha2UpICYmCisJCSAgICAoKG1pbmltdW0gLSAoYiAtIGJ1ZikpID49IDEpKQorCQkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSAobWluaW11bSAtIChiIC0gYnVmKSk7CisJCQorCQlpZiAoIWlucHV0X2F2YWlsYWJsZV9wKHR0eSwgMCkpIHsKKwkJCWlmICh0ZXN0X2JpdChUVFlfT1RIRVJfQ0xPU0VELCAmdHR5LT5mbGFncykpIHsKKwkJCQlyZXR2YWwgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHR0eV9odW5nX3VwX3AoZmlsZSkpCisJCQkJYnJlYWs7CisJCQlpZiAoIXRpbWVvdXQpCisJCQkJYnJlYWs7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKwkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJc2V0X2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkJLyogRGVhbCB3aXRoIHBhY2tldCBtb2RlLiAqLworCQlpZiAodHR5LT5wYWNrZXQgJiYgYiA9PSBidWYpIHsKKwkJCWlmIChwdXRfdXNlcihUSU9DUEtUX0RBVEEsIGIrKykpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWItLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5yLS07CisJCX0KKworCQlpZiAodHR5LT5pY2Fub24pIHsKKwkJCS8qIE4uQi4gYXZvaWQgb3ZlcnJ1biBpZiBuciA9PSAwICovCisJCQl3aGlsZSAobnIgJiYgdHR5LT5yZWFkX2NudCkgeworIAkJCQlpbnQgZW9sOworCisJCQkJZW9sID0gdGVzdF9hbmRfY2xlYXJfYml0KHR0eS0+cmVhZF90YWlsLAorCQkJCQkJdHR5LT5yZWFkX2ZsYWdzKTsKKwkJCQljID0gdHR5LT5yZWFkX2J1Zlt0dHktPnJlYWRfdGFpbF07CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJCQkJdHR5LT5yZWFkX3RhaWwgPSAoKHR0eS0+cmVhZF90YWlsKzEpICYKKwkJCQkJCSAgKE5fVFRZX0JVRl9TSVpFLTEpKTsKKwkJCQl0dHktPnJlYWRfY250LS07CisJCQkJaWYgKGVvbCkgeworCQkJCQkvKiB0aGlzIHRlc3Qgc2hvdWxkIGJlIHJlZHVuZGFudDoKKwkJCQkJICogd2Ugc2hvdWxkbid0IGJlIHJlYWRpbmcgZGF0YSBpZgorCQkJCQkgKiBjYW5vbl9kYXRhIGlzIDAKKwkJCQkJICovCisJCQkJCWlmICgtLXR0eS0+Y2Fub25fZGF0YSA8IDApCisJCQkJCQl0dHktPmNhbm9uX2RhdGEgPSAwOworCQkJCX0KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCisJCQkJaWYgKCFlb2wgfHwgKGMgIT0gX19ESVNBQkxFRF9DSEFSKSkgeworCQkJCQlpZiAocHV0X3VzZXIoYywgYisrKSkgeworCQkJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCQkJCWItLTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCW5yLS07CisJCQkJfQorCQkJCWlmIChlb2wpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHJldHZhbCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWludCB1bmNvcGllZDsKKwkJCXVuY29waWVkID0gY29weV9mcm9tX3JlYWRfYnVmKHR0eSwgJmIsICZucik7CisJCQl1bmNvcGllZCArPSBjb3B5X2Zyb21fcmVhZF9idWYodHR5LCAmYiwgJm5yKTsKKwkJCWlmICh1bmNvcGllZCkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBJZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIHJlYWQgYnVmZmVyIG5vdywgbGV0IHRoZQorCQkgKiBsb3ctbGV2ZWwgZHJpdmVyIGtub3cuIFdlIHVzZSBuX3R0eV9jaGFyc19pbl9idWZmZXIoKSB0bworCQkgKiBjaGVjayB0aGUgYnVmZmVyLCBhcyBpdCBub3cga25vd3MgYWJvdXQgY2Fub25pY2FsIG1vZGUuCisJCSAqIE90aGVyd2lzZSwgaWYgdGhlIGRyaXZlciBpcyB0aHJvdHRsZWQgYW5kIHRoZSBsaW5lIGlzCisJCSAqIGxvbmdlciB0aGFuIFRUWV9USFJFU0hPTERfVU5USFJPVFRMRSBpbiBjYW5vbmljYWwgbW9kZSwKKwkJICogd2Ugd29uJ3QgZ2V0IGFueSBtb3JlIGNoYXJhY3RlcnMuCisJCSAqLworCQlpZiAobl90dHlfY2hhcnNfaW5fYnVmZmVyKHR0eSkgPD0gVFRZX1RIUkVTSE9MRF9VTlRIUk9UVExFKQorCQkJY2hlY2tfdW50aHJvdHRsZSh0dHkpOworCisJCWlmIChiIC0gYnVmID49IG1pbmltdW0pCisJCQlicmVhazsKKwkJaWYgKHRpbWUpCisJCQl0aW1lb3V0ID0gdGltZTsKKwl9CisJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKwl1cCgmdHR5LT5hdG9taWNfcmVhZCk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnR0eS0+cmVhZF93YWl0LCAmd2FpdCk7CisKKwlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJnR0eS0+cmVhZF93YWl0KSkKKwkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSBtaW5pbXVtOworCisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXNpemUgPSBiIC0gYnVmOworCWlmIChzaXplKSB7CisJCXJldHZhbCA9IHNpemU7CisJCWlmIChucikKKwkgICAgICAgCQljbGVhcl9iaXQoVFRZX1BVU0gsICZ0dHktPmZsYWdzKTsKKwl9IGVsc2UgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfUFVTSCwgJnR0eS0+ZmxhZ3MpKQorCQkgZ290byBkb19pdF9hZ2FpbjsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJd3JpdGVfY2hhbgkJLQl3cml0ZSBmdW5jdGlvbiBmb3IgdHR5CisgKglAdHR5OiB0dHkgZGV2aWNlCisgKglAZmlsZTogZmlsZSBvYmplY3QKKyAqCUBidWY6IHVzZXJzcGFjZSBidWZmZXIgcG9pbnRlcgorICoJQG5yOiBzaXplIG9mIEkvTworICoKKyAqCVdyaXRlIGZ1bmN0aW9uIG9mIHRoZSB0ZXJtaW5hbCBkZXZpY2UuIFRoaXMgaXMgc2VyaWFsaXplZCB3aXRoCisgKglyZXNwZWN0IHRvIG90aGVyIHdyaXRlIGNhbGxlcnMgYnV0IG5vdCB0byB0ZXJtaW9zIGNoYW5nZXMsIHJlYWRzCisgKglhbmQgb3RoZXIgc3VjaCBldmVudHMuIFdlIG11c3QgYmUgY2FyZWZ1bCB3aXRoIE5fVFRZIGFzIHRoZSByZWNlaXZlCisgKgljb2RlIHdpbGwgZWNobyBjaGFyYWN0ZXJzLCB0aHVzIGNhbGxpbmcgZHJpdmVyIHdyaXRlIG1ldGhvZHMuCisgKgorICoJVGhpcyBjb2RlIG11c3QgYmUgc3VyZSBuZXZlciB0byBzbGVlcCB0aHJvdWdoIGEgaGFuZ3VwLgorICovCisgCitzdGF0aWMgc3NpemVfdCB3cml0ZV9jaGFuKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWYsIHNpemVfdCBucikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpiID0gYnVmOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCBjOworCXNzaXplX3QgcmV0dmFsID0gMDsKKworCS8qIEpvYiBjb250cm9sIGNoZWNrIC0tIG11c3QgYmUgZG9uZSBhdCBzdGFydCAoUE9TSVguMSA3LjEuMS40KS4gKi8KKwlpZiAoTF9UT1NUT1AodHR5KSAmJiBmaWxlLT5mX29wLT53cml0ZSAhPSByZWRpcmVjdGVkX3R0eV93cml0ZSkgeworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWFkZF93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKKwl3aGlsZSAoMSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbGUpIHx8ICh0dHktPmxpbmsgJiYgIXR0eS0+bGluay0+Y291bnQpKSB7CisJCQlyZXR2YWwgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKE9fT1BPU1QodHR5KSAmJiAhKHRlc3RfYml0KFRUWV9IV19DT09LX09VVCwgJnR0eS0+ZmxhZ3MpKSkgeworCQkJd2hpbGUgKG5yID4gMCkgeworCQkJCXNzaXplX3QgbnVtID0gb3Bvc3RfYmxvY2sodHR5LCBiLCBucik7CisJCQkJaWYgKG51bSA8IDApIHsKKwkJCQkJaWYgKG51bSA9PSAtRUFHQUlOKQorCQkJCQkJYnJlYWs7CisJCQkJCXJldHZhbCA9IG51bTsKKwkJCQkJZ290byBicmVha19vdXQ7CisJCQkJfQorCQkJCWIgKz0gbnVtOworCQkJCW5yIC09IG51bTsKKwkJCQlpZiAobnIgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJYyA9ICpiOworCQkJCWlmIChvcG9zdChjLCB0dHkpIDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJYisrOyBuci0tOworCQkJfQorCQkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9jaGFycykKKwkJCQl0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnModHR5KTsKKwkJfSBlbHNlIHsKKwkJCWMgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBiLCBucik7CisJCQlpZiAoYyA8IDApIHsKKwkJCQlyZXR2YWwgPSBjOworCQkJCWdvdG8gYnJlYWtfb3V0OworCQkJfQorCQkJYiArPSBjOworCQkJbnIgLT0gYzsKKwkJfQorCQlpZiAoIW5yKQorCQkJYnJlYWs7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorYnJlYWtfb3V0OgorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CisJcmV0dXJuIChiIC0gYnVmKSA/IGIgLSBidWYgOiByZXR2YWw7Cit9CisKKy8qKgorICoJbm9ybWFsX3BvbGwJCS0JcG9sbCBtZXRob2QgZm9yIE5fVFRZCisgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGFjY2Vzc2luZyBpdAorICoJQHdhaXQ6IHBvbGwgdGFibGUKKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgbGluZSBkaXNjaXBsaW5lIGlzIGFza2VkIHRvIHBvbGwoKSBmb3IgZGF0YSBvcgorICoJZm9yIHNwZWNpYWwgZXZlbnRzLiBUaGlzIGNvZGUgaXMgbm90IHNlcmlhbGl6ZWQgd2l0aCByZXNwZWN0IHRvCisgKglvdGhlciBldmVudHMgc2F2ZSBvcGVuL2Nsb3NlLgorICoKKyAqCVRoaXMgY29kZSBtdXN0IGJlIHN1cmUgbmV2ZXIgdG8gc2xlZXAgdGhyb3VnaCBhIGhhbmd1cC4KKyAqCUNhbGxlZCB3aXRob3V0IHRoZSBrZXJuZWwgbG9jayBoZWxkIC0gZmluZQorICoKKyAqCUZJWE1FOiBpZiBzb21lb25lIGNoYW5nZXMgdGhlIFZNSU4gb3IgZGlzY2lwbGluZSBzZXR0aW5ncyBmb3IgdGhlCisgKgl0ZXJtaW5hbCB3aGlsZSBhbm90aGVyIHByb2Nlc3MgaXMgaW4gcG9sbCgpIHRoZSBwb2xsIGRvZXMgbm90CisgKglyZWNvbXB1dGUgdGhlIG5ldyBsaW1pdHMuIFBvc3NpYmx5IHNldF90ZXJtaW9zIHNob3VsZCBpc3N1ZQorICoJYSByZWFkIHdha2V1cCB0byBmaXggdGhpcyBidWcuCisgKi8KKyAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX3BvbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnR0eS0+cmVhZF93YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJnR0eS0+d3JpdGVfd2FpdCwgd2FpdCk7CisJaWYgKGlucHV0X2F2YWlsYWJsZV9wKHR0eSwgVElNRV9DSEFSKHR0eSkgPyAwIDogTUlOX0NIQVIodHR5KSkpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAodHR5LT5wYWNrZXQgJiYgdHR5LT5saW5rLT5jdHJsX3N0YXR1cykKKwkJbWFzayB8PSBQT0xMUFJJIHwgUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAodGVzdF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpKQorCQltYXNrIHw9IFBPTExIVVA7CisJaWYgKHR0eV9odW5nX3VwX3AoZmlsZSkpCisJCW1hc2sgfD0gUE9MTEhVUDsKKwlpZiAoIShtYXNrICYgKFBPTExIVVAgfCBQT0xMSU4gfCBQT0xMUkROT1JNKSkpIHsKKwkJaWYgKE1JTl9DSEFSKHR0eSkgJiYgIVRJTUVfQ0hBUih0dHkpKQorCQkJdHR5LT5taW5pbXVtX3RvX3dha2UgPSBNSU5fQ0hBUih0dHkpOworCQllbHNlCisJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IDE7CisJfQorCWlmICh0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgPCBXQUtFVVBfQ0hBUlMgJiYKKwkJCXR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKHR0eSkgPiAwKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCXJldHVybiBtYXNrOworfQorCitzdHJ1Y3QgdHR5X2xkaXNjIHR0eV9sZGlzY19OX1RUWSA9IHsKKwlUVFlfTERJU0NfTUFHSUMsCS8qIG1hZ2ljICovCisJIm5fdHR5IiwJCS8qIG5hbWUgKi8KKwkwLAkJCS8qIG51bSAqLworCTAsCQkJLyogZmxhZ3MgKi8KKwluX3R0eV9vcGVuLAkJLyogb3BlbiAqLworCW5fdHR5X2Nsb3NlLAkJLyogY2xvc2UgKi8KKwluX3R0eV9mbHVzaF9idWZmZXIsCS8qIGZsdXNoX2J1ZmZlciAqLworCW5fdHR5X2NoYXJzX2luX2J1ZmZlciwJLyogY2hhcnNfaW5fYnVmZmVyICovCisJcmVhZF9jaGFuLAkJLyogcmVhZCAqLworCXdyaXRlX2NoYW4sCQkvKiB3cml0ZSAqLworCW5fdHR5X2lvY3RsLAkJLyogaW9jdGwgKi8KKwluX3R0eV9zZXRfdGVybWlvcywJLyogc2V0X3Rlcm1pb3MgKi8KKwlub3JtYWxfcG9sbCwJCS8qIHBvbGwgKi8KKwlOVUxMLAkJCS8qIGhhbmd1cCAqLworCW5fdHR5X3JlY2VpdmVfYnVmLAkvKiByZWNlaXZlX2J1ZiAqLworCW5fdHR5X3JlY2VpdmVfcm9vbSwJLyogcmVjZWl2ZV9yb29tICovCisJbl90dHlfd3JpdGVfd2FrZXVwCS8qIHdyaXRlX3dha2V1cCAqLworfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL252cmFtLmMgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjNhM2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL252cmFtLmMKQEAgLTAsMCArMSw5MjYgQEAKKy8qCisgKiBDTU9TL05WLVJBTSBkcml2ZXIgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJvbWFuIEhvZGVrIDxSb21hbi5Ib2Rla0BpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKyAqIGlkZWEgYnkgYW5kIHdpdGggaGVscCBmcm9tIFJpY2hhcmQgSmVsaW5layA8cmpAc3VzZS5kZT4KKyAqIFBvcnRpb25zIGNvcHlyaWdodCAoYykgMjAwMSwyMDAyIFN1biBNaWNyb3N5c3RlbXMgKHRob2NraW5Ac3VuLmNvbSkKKyAqCisgKiBUaGlzIGRyaXZlciBhbGxvd3MgeW91IHRvIGFjY2VzcyB0aGUgY29udGVudHMgb2YgdGhlIG5vbi12b2xhdGlsZSBtZW1vcnkgaW4KKyAqIHRoZSBtYzE0NjgxOHJ0Yy5oIHJlYWwtdGltZSBjbG9jay4gVGhpcyBjaGlwIGlzIGJ1aWx0IGludG8gYWxsIFBDcyBhbmQgaW50bworICogbWFueSBBdGFyaSBtYWNoaW5lcy4gSW4gdGhlIGZvcm1lciBpdCdzIGNhbGxlZCAiQ01PUy1SQU0iLCBpbiB0aGUgbGF0dGVyCisgKiAiTlZSQU0iIChOViBzdGFuZHMgZm9yIG5vbi12b2xhdGlsZSkuCisgKgorICogVGhlIGRhdGEgYXJlIHN1cHBsaWVkIGFzIGEgKHNlZWthYmxlKSBjaGFyYWN0ZXIgZGV2aWNlLCAvZGV2L252cmFtLiBUaGUKKyAqIHNpemUgb2YgdGhpcyBmaWxlIGlzIGRlcGVuZGVudCBvbiB0aGUgY29udHJvbGxlci4gIFRoZSB1c3VhbCBzaXplIGlzIDExNCwKKyAqIHRoZSBudW1iZXIgb2YgZnJlZWx5IGF2YWlsYWJsZSBieXRlcyBpbiB0aGUgbWVtb3J5IChpLmUuLCBub3QgdXNlZCBieSB0aGUKKyAqIFJUQyBpdHNlbGYpLgorICoKKyAqIENoZWNrc3VtcyBvdmVyIHRoZSBOVlJBTSBjb250ZW50cyBhcmUgbWFuYWdlZCBieSB0aGlzIGRyaXZlci4gSW4gY2FzZSBvZiBhCisgKiBiYWQgY2hlY2tzdW0sIHJlYWRzIGFuZCB3cml0ZXMgcmV0dXJuIC1FSU8uIFRoZSBjaGVja3N1bSBjYW4gYmUgaW5pdGlhbGl6ZWQKKyAqIHRvIGEgc2FuZSBzdGF0ZSBlaXRoZXIgYnkgaW9jdGwoTlZSQU1fSU5JVCkgKGNsZWFyIHdob2xlIE5WUkFNKSBvcgorICogaW9jdGwoTlZSQU1fU0VUQ0tTKSAoZG9lc24ndCBjaGFuZ2UgY29udGVudHMsIGp1c3QgbWFrZXMgY2hlY2tzdW0gdmFsaWQKKyAqIGFnYWluOyB1c2Ugd2l0aCBjYXJlISkKKyAqCisgKiBUaGlzIGZpbGUgYWxzbyBwcm92aWRlcyBzb21lIGZ1bmN0aW9ucyBmb3Igb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbCB0aGF0CisgKiB3YW50IHRvIGFjY2VzcyB0aGUgTlZSQU06IG52cmFtX3tyZWFkLHdyaXRlLGNoZWNrX2NoZWNrc3VtLHNldF9jaGVja3N1bX0uCisgKiBPYnZpb3VzbHkgdGhpcyBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoaXMgZHJpdmVyIGlzIGFsd2F5cyBjb25maWd1cmVkIGludG8KKyAqIHRoZSBrZXJuZWwgYW5kIGlzIG5vdCBhIG1vZHVsZS4gU2luY2UgdGhlIGZ1bmN0aW9ucyBhcmUgdXNlZCBieSBzb21lIEF0YXJpCisgKiBkcml2ZXJzLCB0aGlzIGlzIHRoZSBjYXNlIG9uIHRoZSBBdGFyaS4KKyAqCisgKgorICogCTEuMQlDZXNhciBCYXJyb3M6IFNNUCBsb2NraW5nIGZpeGVzCisgKiAJCWFkZGVkIGNoYW5nZWxvZworICogCTEuMglFcmlrIEdpbGxpbmc6IENvYmFsdCBOZXR3b3JrcyBzdXBwb3J0CisgKiAJCVRpbSBIb2NraW46IGdlbmVyYWwgY2xlYW51cCwgQ29iYWx0IHN1cHBvcnQKKyAqLworCisjZGVmaW5lIE5WUkFNX1ZFUlNJT04JIjEuMiIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgorCisjZGVmaW5lIFBDCQkxCisjZGVmaW5lIEFUQVJJCQkyCisjZGVmaW5lIENPQkFMVAkJMworCisvKiBzZWxlY3QgbWFjaGluZSBjb25maWd1cmF0aW9uICovCisjaWYgZGVmaW5lZChDT05GSUdfQVRBUkkpCisjICBkZWZpbmUgTUFDSCBBVEFSSQorI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fYXJtX18pICAvKiBhbmQgb3RoZXJzPz8gKi8KKyNkZWZpbmUgTUFDSCBQQworIyAgaWYgZGVmaW5lZChDT05GSUdfQ09CQUxUKQorIyAgICBpbmNsdWRlIDxsaW51eC9jb2JhbHQtbnZyYW0uaD4KKyMgICAgZGVmaW5lIE1BQ0ggQ09CQUxUCisjICBlbHNlCisjICAgIGRlZmluZSBNQUNIIFBDCisjICBlbmRpZgorI2Vsc2UKKyMgIGVycm9yIENhbm5vdCBidWlsZCBudnJhbSBkcml2ZXIgZm9yIHRoaXMgbWFjaGluZSBjb25maWd1cmF0aW9uLgorI2VuZGlmCisKKyNpZiBNQUNIID09IFBDCisKKy8qIFJUQyBpbiBhIFBDICovCisjZGVmaW5lIENIRUNLX0RSSVZFUl9JTklUKCkJMQorCisvKiBPbiBQQ3MsIHRoZSBjaGVja3N1bSBpcyBidWlsdCBvbmx5IG92ZXIgYnl0ZXMgMi4uMzEgKi8KKyNkZWZpbmUgUENfQ0tTX1JBTkdFX1NUQVJUCTIKKyNkZWZpbmUgUENfQ0tTX1JBTkdFX0VORAkzMQorI2RlZmluZSBQQ19DS1NfTE9DCQkzMgorI2RlZmluZSBOVlJBTV9CWVRFUwkJKDEyOC1OVlJBTV9GSVJTVF9CWVRFKQorCisjZGVmaW5lIG1hY2hfY2hlY2tfY2hlY2tzdW0JcGNfY2hlY2tfY2hlY2tzdW0KKyNkZWZpbmUgbWFjaF9zZXRfY2hlY2tzdW0JcGNfc2V0X2NoZWNrc3VtCisjZGVmaW5lIG1hY2hfcHJvY19pbmZvcwkJcGNfcHJvY19pbmZvcworCisjZW5kaWYKKworI2lmIE1BQ0ggPT0gQ09CQUxUCisKKyNkZWZpbmUgQ0hFQ0tfRFJJVkVSX0lOSVQoKSAgICAgMQorCisjZGVmaW5lIE5WUkFNX0JZVEVTCQkoMTI4LU5WUkFNX0ZJUlNUX0JZVEUpCisKKyNkZWZpbmUgbWFjaF9jaGVja19jaGVja3N1bQljb2JhbHRfY2hlY2tfY2hlY2tzdW0KKyNkZWZpbmUgbWFjaF9zZXRfY2hlY2tzdW0JY29iYWx0X3NldF9jaGVja3N1bQorI2RlZmluZSBtYWNoX3Byb2NfaW5mb3MJCWNvYmFsdF9wcm9jX2luZm9zCisKKyNlbmRpZgorCisjaWYgTUFDSCA9PSBBVEFSSQorCisvKiBTcGVjaWFsIHBhcmFtZXRlcnMgZm9yIFJUQyBpbiBBdGFyaSBtYWNoaW5lcyAqLworI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgorI2RlZmluZSBSVENfUE9SVCh4KQkJKFRUX1JUQ19CQVMgKyAyKih4KSkKKyNkZWZpbmUgQ0hFQ0tfRFJJVkVSX0lOSVQoKQkoTUFDSF9JU19BVEFSSSAmJiBBVEFSSUhXX1BSRVNFTlQoVFRfQ0xLKSkKKworI2RlZmluZSBOVlJBTV9CWVRFUwkJNTAKKworLyogT24gQXRhcmlzLCB0aGUgY2hlY2tzdW0gaXMgb3ZlciBhbGwgYnl0ZXMgZXhjZXB0IHRoZSBjaGVja3N1bSBieXRlcworICogdGhlbXNlbHZlczsgdGhlc2UgYXJlIGF0IHRoZSB2ZXJ5IGVuZCAqLworI2RlZmluZSBBVEFSSV9DS1NfUkFOR0VfU1RBUlQJMAorI2RlZmluZSBBVEFSSV9DS1NfUkFOR0VfRU5ECTQ3CisjZGVmaW5lIEFUQVJJX0NLU19MT0MJCTQ4CisKKyNkZWZpbmUgbWFjaF9jaGVja19jaGVja3N1bQlhdGFyaV9jaGVja19jaGVja3N1bQorI2RlZmluZSBtYWNoX3NldF9jaGVja3N1bQlhdGFyaV9zZXRfY2hlY2tzdW0KKyNkZWZpbmUgbWFjaF9wcm9jX2luZm9zCQlhdGFyaV9wcm9jX2luZm9zCisKKyNlbmRpZgorCisvKiBOb3RlIHRoYXQgKmFsbCogY2FsbHMgdG8gQ01PU19SRUFEIGFuZCBDTU9TX1dSSVRFIG11c3QgYmUgZG9uZSB3aXRoCisgKiBydGNfbG9jayBoZWxkLiBEdWUgdG8gdGhlIGluZGV4LXBvcnQvZGF0YS1wb3J0IGRlc2lnbiBvZiB0aGUgUlRDLCB3ZQorICogZG9uJ3Qgd2FudCB0d28gZGlmZmVyZW50IHRoaW5ncyB0cnlpbmcgdG8gZ2V0IHRvIGl0IGF0IG9uY2UuIChlLmcuIHRoZQorICogcGVyaW9kaWMgMTEgbWluIHN5bmMgZnJvbSB0aW1lLmMgdnMuIHRoaXMgZHJpdmVyLikKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG52cmFtX3N0YXRlX2xvY2spOworc3RhdGljIGludCBudnJhbV9vcGVuX2NudDsJLyogI3RpbWVzIG9wZW5lZCAqLworc3RhdGljIGludCBudnJhbV9vcGVuX21vZGU7CS8qIHNwZWNpYWwgb3BlbiBtb2RlcyAqLworI2RlZmluZSBOVlJBTV9XUklURQkJMSAvKiBvcGVuZWQgZm9yIHdyaXRpbmcgKGV4Y2x1c2l2ZSkgKi8KKyNkZWZpbmUgTlZSQU1fRVhDTAkJMiAvKiBvcGVuZWQgd2l0aCBPX0VYQ0wgKi8KKworc3RhdGljIGludCBtYWNoX2NoZWNrX2NoZWNrc3VtKHZvaWQpOworc3RhdGljIHZvaWQgbWFjaF9zZXRfY2hlY2tzdW0odm9pZCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludCBtYWNoX3Byb2NfaW5mb3ModW5zaWduZWQgY2hhciAqY29udGVudHMsIGNoYXIgKmJ1ZmZlciwgaW50ICpsZW4sCisgICAgb2ZmX3QgKmJlZ2luLCBvZmZfdCBvZmZzZXQsIGludCBzaXplKTsKKyNlbmRpZgorCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBiZSBjYWxsZWQgaW50ZXJuYWxseSBvciBieSBvdGhlciBwYXJ0cyBvZgorICogdGhlIGtlcm5lbC4gSXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSBjb3JyZWN0IGNoZWNrc3VtIGJlZm9yZSByZWFkaW5nCisgKiBvciBhZnRlciB3cml0aW5nIChuZWVkcyB0byBiZSBkb25lIG9ubHkgb25jZSkuCisgKgorICogSXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFsbCBhY2Nlc3MgYnl0ZXMgb2YgZ2VuZXJhbAorICogcHVycG9zZSBtZW1vcnkgaW4gdGhlIE5WUkFNIC0gdGhhdCBpcyB0byBzYXksIHRoZXkgYWxsIGFkZCB0aGUKKyAqIE5WUkFNX0ZJUlNUX0JZVEUgb2Zmc2V0LiAgUGFzcyB0aGVtIG9mZnNldHMgaW50byBOVlJBTSBhcyBpZiB5b3UgZGlkIG5vdCAKKyAqIGtub3cgYWJvdXQgdGhlIFJUQyBjcnVmdC4KKyAqLworCit1bnNpZ25lZCBjaGFyCitfX252cmFtX3JlYWRfYnl0ZShpbnQgaSkKK3sKKwlyZXR1cm4gQ01PU19SRUFEKE5WUkFNX0ZJUlNUX0JZVEUgKyBpKTsKK30KKwordW5zaWduZWQgY2hhcgorbnZyYW1fcmVhZF9ieXRlKGludCBpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJYyA9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGM7Cit9CisKKy8qIFRoaXMgcmFjZXMgbmljZWx5IHdpdGggdHJ5aW5nIHRvIHJlYWQgd2l0aCBjaGVja3N1bSBjaGVja2luZyAobnZyYW1fcmVhZCkgKi8KK3ZvaWQKK19fbnZyYW1fd3JpdGVfYnl0ZSh1bnNpZ25lZCBjaGFyIGMsIGludCBpKQoreworCUNNT1NfV1JJVEUoYywgTlZSQU1fRklSU1RfQllURSArIGkpOworfQorCit2b2lkCitudnJhbV93cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgYywgaW50IGkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCV9fbnZyYW1fd3JpdGVfYnl0ZShjLCBpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworfQorCitpbnQKK19fbnZyYW1fY2hlY2tfY2hlY2tzdW0odm9pZCkKK3sKKwlyZXR1cm4gbWFjaF9jaGVja19jaGVja3N1bSgpOworfQorCitpbnQKK252cmFtX2NoZWNrX2NoZWNrc3VtKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwlydiA9IF9fbnZyYW1fY2hlY2tfY2hlY2tzdW0oKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCXJldHVybiBydjsKK30KKwordm9pZAorX19udnJhbV9zZXRfY2hlY2tzdW0odm9pZCkKK3sKKwltYWNoX3NldF9jaGVja3N1bSgpOworfQorCit2b2lkCitudnJhbV9zZXRfY2hlY2tzdW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJX19udnJhbV9zZXRfY2hlY2tzdW0oKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhlIGFyZSB0aGUgZmlsZSBvcGVyYXRpb24gZnVuY3Rpb24gZm9yIHVzZXIgYWNjZXNzIHRvIC9kZXYvbnZyYW0KKyAqLworCitzdGF0aWMgbG9mZl90IG52cmFtX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSxsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luICkKK3sKKwlsb2NrX2tlcm5lbCgpOworCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSAwOgorCQkvKiBub3RoaW5nIHRvIGRvICovCisJCWJyZWFrOworCWNhc2UgMToKKwkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDI6CisJCW9mZnNldCArPSBOVlJBTV9CWVRFUzsKKwkJYnJlYWs7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gKG9mZnNldCA+PSAwKSA/IChmaWxlLT5mX3BvcyA9IG9mZnNldCkgOiAtRUlOVkFMOworfQorCitzdGF0aWMgc3NpemVfdAorbnZyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgY2hhciBjb250ZW50c1tOVlJBTV9CWVRFU107CisJdW5zaWduZWQgaSA9ICpwcG9zOworCXVuc2lnbmVkIGNoYXIgKnRtcDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmICghX19udnJhbV9jaGVja19jaGVja3N1bSgpKQorCQlnb3RvIGNoZWNrc3VtX2VycjsKKworCWZvciAodG1wID0gY29udGVudHM7IGNvdW50LS0gPiAwICYmIGkgPCBOVlJBTV9CWVRFUzsgKytpLCArK3RtcCkKKwkJKnRtcCA9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgY29udGVudHMsIHRtcCAtIGNvbnRlbnRzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkqcHBvcyA9IGk7CisKKwlyZXR1cm4gdG1wIC0gY29udGVudHM7CisKKyAgICAgIGNoZWNrc3VtX2VycjoKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHNzaXplX3QKK252cmFtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBjaGFyIGNvbnRlbnRzW05WUkFNX0JZVEVTXTsKKwl1bnNpZ25lZCBpID0gKnBwb3M7CisJdW5zaWduZWQgY2hhciAqdG1wOworCWludCBsZW47CisKKwlsZW4gPSAoTlZSQU1fQllURVMgLSBpKSA8IGNvdW50ID8gKE5WUkFNX0JZVEVTIC0gaSkgOiBjb3VudDsKKwlpZiAoY29weV9mcm9tX3VzZXIoY29udGVudHMsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAoIV9fbnZyYW1fY2hlY2tfY2hlY2tzdW0oKSkKKwkJZ290byBjaGVja3N1bV9lcnI7CisKKwlmb3IgKHRtcCA9IGNvbnRlbnRzOyBjb3VudC0tID4gMCAmJiBpIDwgTlZSQU1fQllURVM7ICsraSwgKyt0bXApCisJCV9fbnZyYW1fd3JpdGVfYnl0ZSgqdG1wLCBpKTsKKworCV9fbnZyYW1fc2V0X2NoZWNrc3VtKCk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCSpwcG9zID0gaTsKKworCXJldHVybiB0bXAgLSBjb250ZW50czsKKworICAgICAgY2hlY2tzdW1fZXJyOgorCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50CitudnJhbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIE5WUkFNX0lOSVQ6CisJCS8qIGluaXRpYWxpemUgTlZSQU0gY29udGVudHMgYW5kIGNoZWNrc3VtICovCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlZSQU1fQllURVM7ICsraSkKKwkJCV9fbnZyYW1fd3JpdGVfYnl0ZSgwLCBpKTsKKwkJX19udnJhbV9zZXRfY2hlY2tzdW0oKTsKKworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE5WUkFNX1NFVENLUzoKKwkJLyoganVzdCBzZXQgY2hlY2tzdW0sIGNvbnRlbnRzIHVuY2hhbmdlZCAobWF5YmUgdXNlZnVsIGFmdGVyIAorCQkgKiBjaGVja3N1bSBnYXJiYWdlZCBzb21laG93Li4uKSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJCV9fbnZyYW1fc2V0X2NoZWNrc3VtKCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworc3RhdGljIGludAorbnZyYW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2soJm52cmFtX3N0YXRlX2xvY2spOworCisJaWYgKChudnJhbV9vcGVuX2NudCAmJiAoZmlsZS0+Zl9mbGFncyAmIE9fRVhDTCkpIHx8CisJICAgIChudnJhbV9vcGVuX21vZGUgJiBOVlJBTV9FWENMKSB8fAorCSAgICAoKGZpbGUtPmZfbW9kZSAmIDIpICYmIChudnJhbV9vcGVuX21vZGUgJiBOVlJBTV9XUklURSkpKSB7CisJCXNwaW5fdW5sb2NrKCZudnJhbV9zdGF0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fRVhDTCkKKwkJbnZyYW1fb3Blbl9tb2RlIHw9IE5WUkFNX0VYQ0w7CisJaWYgKGZpbGUtPmZfbW9kZSAmIDIpCisJCW52cmFtX29wZW5fbW9kZSB8PSBOVlJBTV9XUklURTsKKwludnJhbV9vcGVuX2NudCsrOworCisJc3Bpbl91bmxvY2soJm52cmFtX3N0YXRlX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252cmFtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3Bpbl9sb2NrKCZudnJhbV9zdGF0ZV9sb2NrKTsKKworCW52cmFtX29wZW5fY250LS07CisKKwkvKiBpZiBvbmx5IG9uZSBpbnN0YW5jZSBpcyBvcGVuLCBjbGVhciB0aGUgRVhDTCBiaXQgKi8KKwlpZiAobnZyYW1fb3Blbl9tb2RlICYgTlZSQU1fRVhDTCkKKwkJbnZyYW1fb3Blbl9tb2RlICY9IH5OVlJBTV9FWENMOworCWlmIChmaWxlLT5mX21vZGUgJiAyKQorCQludnJhbV9vcGVuX21vZGUgJj0gfk5WUkFNX1dSSVRFOworCisJc3Bpbl91bmxvY2soJm52cmFtX3N0YXRlX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQKK252cmFtX3JlYWRfcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorICAgIGludCBzaXplLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisKK3N0YXRpYyBpbnQKK252cmFtX3JlYWRfcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorICAgIGludCBzaXplLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNvbnRlbnRzW05WUkFNX0JZVEVTXTsKKwlpbnQgaSwgbGVuID0gMDsKKwlvZmZfdCBiZWdpbiA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE5WUkFNX0JZVEVTOyArK2kpCisJCWNvbnRlbnRzW2ldID0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwkqZW9mID0gbWFjaF9wcm9jX2luZm9zKGNvbnRlbnRzLCBidWZmZXIsICZsZW4sICZiZWdpbiwgb2Zmc2V0LCBzaXplKTsKKworCWlmIChvZmZzZXQgPj0gYmVnaW4gKyBsZW4pCisJCXJldHVybiAwOworCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CisJcmV0dXJuIChzaXplIDwgYmVnaW4gKyBsZW4gLSBvZmZzZXQpID8gc2l6ZSA6IGJlZ2luICsgbGVuIC0gb2Zmc2V0OworCit9CisKKy8qIFRoaXMgbWFjcm8gZnJlZXMgdGhlIG1hY2hpbmUgc3BlY2lmaWMgZnVuY3Rpb24gZnJvbSBib3VuZHMgY2hlY2tpbmcgYW5kCisgKiB0aGlzIGxpa2UgdGhhdC4uLiAqLworI2RlZmluZSBQUklOVF9QUk9DKGZtdCxhcmdzLi4uKQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQkqbGVuICs9IHNwcmludGYoYnVmZmVyKypsZW4sIGZtdCwgIyNhcmdzKTsJXAorCQlpZiAoKmJlZ2luICsgKmxlbiA+IG9mZnNldCArIHNpemUpCQlcCisJCQlyZXR1cm4gMDsJCQkJXAorCQlpZiAoKmJlZ2luICsgKmxlbiA8IG9mZnNldCkgewkJCVwKKwkJCSpiZWdpbiArPSAqbGVuOwkJCQlcCisJCQkqbGVuID0gMDsJCQkJXAorCQl9CQkJCQkJXAorCX0gd2hpbGUoMCkKKworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG52cmFtX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbnZyYW1fbGxzZWVrLAorCS5yZWFkCQk9IG52cmFtX3JlYWQsCisJLndyaXRlCQk9IG52cmFtX3dyaXRlLAorCS5pb2N0bAkJPSBudnJhbV9pb2N0bCwKKwkub3BlbgkJPSBudnJhbV9vcGVuLAorCS5yZWxlYXNlCT0gbnZyYW1fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBudnJhbV9kZXYgPSB7CisJTlZSQU1fTUlOT1IsCisJIm52cmFtIiwKKwkmbnZyYW1fZm9wcworfTsKKworc3RhdGljIGludCBfX2luaXQKK252cmFtX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogRmlyc3QgdGVzdCB3aGV0aGVyIHRoZSBkcml2ZXIgc2hvdWxkIGluaXQgYXQgYWxsICovCisJaWYgKCFDSEVDS19EUklWRVJfSU5JVCgpKQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmbnZyYW1fZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAibnZyYW06IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCisJCSAgICBOVlJBTV9NSU5PUik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlci9udnJhbSIsIDAsIE5VTEwsIG52cmFtX3JlYWRfcHJvYywKKwkJTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJudnJhbTogY2FuJ3QgY3JlYXRlIC9wcm9jL2RyaXZlci9udnJhbVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0bWlzYzsKKwl9CisJcmV0ID0gMDsKKwlwcmludGsoS0VSTl9JTkZPICJOb24tdm9sYXRpbGUgbWVtb3J5IGRyaXZlciB2IiBOVlJBTV9WRVJTSU9OICJcbiIpOworICAgICAgb3V0OgorCXJldHVybiByZXQ7CisgICAgICBvdXRtaXNjOgorCW1pc2NfZGVyZWdpc3RlcigmbnZyYW1fZGV2KTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitudnJhbV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvbnZyYW0iLCBOVUxMKTsKKwltaXNjX2RlcmVnaXN0ZXIoJm52cmFtX2Rldik7Cit9CisKK21vZHVsZV9pbml0KG52cmFtX2luaXQpOworbW9kdWxlX2V4aXQobnZyYW1fY2xlYW51cF9tb2R1bGUpOworCisvKgorICogTWFjaGluZSBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworCisjaWYgTUFDSCA9PSBQQworCitzdGF0aWMgaW50CitwY19jaGVja19jaGVja3N1bSh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CisJdW5zaWduZWQgc2hvcnQgZXhwZWN0OworCisJZm9yIChpID0gUENfQ0tTX1JBTkdFX1NUQVJUOyBpIDw9IFBDX0NLU19SQU5HRV9FTkQ7ICsraSkKKwkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCWV4cGVjdCA9IF9fbnZyYW1fcmVhZF9ieXRlKFBDX0NLU19MT0MpPDw4IHwKKwkgICAgX19udnJhbV9yZWFkX2J5dGUoUENfQ0tTX0xPQysxKTsKKwlyZXR1cm4gKChzdW0gJiAweGZmZmYpID09IGV4cGVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitwY19zZXRfY2hlY2tzdW0odm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOworCisJZm9yIChpID0gUENfQ0tTX1JBTkdFX1NUQVJUOyBpIDw9IFBDX0NLU19SQU5HRV9FTkQ7ICsraSkKKwkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0gPj4gOCwgUENfQ0tTX0xPQyk7CisJX19udnJhbV93cml0ZV9ieXRlKHN1bSAmIDB4ZmYsIFBDX0NLU19MT0MgKyAxKTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBjaGFyICpmbG9wcHlfdHlwZXNbXSA9IHsKKwkibm9uZSIsICI1LjI1JycgMzYwayIsICI1LjI1JycgMS4yTSIsICIzLjUnJyA3MjBrIiwgIjMuNScnIDEuNDRNIiwKKwkiMy41JycgMi44OE0iLCAiMy41JycgMi44OE0iCit9OworCitzdGF0aWMgY2hhciAqZ2Z4X3R5cGVzW10gPSB7CisJIkVHQSwgVkdBLCAuLi4gKHdpdGggQklPUykiLAorCSJDR0EgKDQwIGNvbHMpIiwKKwkiQ0dBICg4MCBjb2xzKSIsCisJIm1vbm9jaHJvbWUiLAorfTsKKworc3RhdGljIGludAorcGNfcHJvY19pbmZvcyh1bnNpZ25lZCBjaGFyICpudnJhbSwgY2hhciAqYnVmZmVyLCBpbnQgKmxlbiwKKyAgICBvZmZfdCAqYmVnaW4sIG9mZl90IG9mZnNldCwgaW50IHNpemUpCit7CisJaW50IGNoZWNrc3VtOworCWludCB0eXBlOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWNoZWNrc3VtID0gX19udnJhbV9jaGVja19jaGVja3N1bSgpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJUFJJTlRfUFJPQygiQ2hlY2tzdW0gc3RhdHVzOiAlc3ZhbGlkXG4iLCBjaGVja3N1bSA/ICIiIDogIm5vdCAiKTsKKworCVBSSU5UX1BST0MoIiMgZmxvcHBpZXMgICAgIDogJWRcbiIsCisJICAgIChudnJhbVs2XSAmIDEpID8gKG52cmFtWzZdID4+IDYpICsgMSA6IDApOworCVBSSU5UX1BST0MoIkZsb3BweSAwIHR5cGUgIDogIik7CisJdHlwZSA9IG52cmFtWzJdID4+IDQ7CisJaWYgKHR5cGUgPCBzaXplb2YgKGZsb3BweV90eXBlcykgLyBzaXplb2YgKCpmbG9wcHlfdHlwZXMpKQorCQlQUklOVF9QUk9DKCIlc1xuIiwgZmxvcHB5X3R5cGVzW3R5cGVdKTsKKwllbHNlCisJCVBSSU5UX1BST0MoIiVkICh1bmtub3duKVxuIiwgdHlwZSk7CisJUFJJTlRfUFJPQygiRmxvcHB5IDEgdHlwZSAgOiAiKTsKKwl0eXBlID0gbnZyYW1bMl0gJiAweDBmOworCWlmICh0eXBlIDwgc2l6ZW9mIChmbG9wcHlfdHlwZXMpIC8gc2l6ZW9mICgqZmxvcHB5X3R5cGVzKSkKKwkJUFJJTlRfUFJPQygiJXNcbiIsIGZsb3BweV90eXBlc1t0eXBlXSk7CisJZWxzZQorCQlQUklOVF9QUk9DKCIlZCAodW5rbm93bilcbiIsIHR5cGUpOworCisJUFJJTlRfUFJPQygiSEQgMCB0eXBlICAgICAgOiAiKTsKKwl0eXBlID0gbnZyYW1bNF0gPj4gNDsKKwlpZiAodHlwZSkKKwkJUFJJTlRfUFJPQygiJTAyeFxuIiwgdHlwZSA9PSAweDBmID8gbnZyYW1bMTFdIDogdHlwZSk7CisJZWxzZQorCQlQUklOVF9QUk9DKCJub25lXG4iKTsKKworCVBSSU5UX1BST0MoIkhEIDEgdHlwZSAgICAgIDogIik7CisJdHlwZSA9IG52cmFtWzRdICYgMHgwZjsKKwlpZiAodHlwZSkKKwkJUFJJTlRfUFJPQygiJTAyeFxuIiwgdHlwZSA9PSAweDBmID8gbnZyYW1bMTJdIDogdHlwZSk7CisJZWxzZQorCQlQUklOVF9QUk9DKCJub25lXG4iKTsKKworCVBSSU5UX1BST0MoIkhEIHR5cGUgNDggZGF0YTogJWQvJWQvJWQgQy9IL1MsIHByZWNvbXAgJWQsIGx6ICVkXG4iLAorCSAgICBudnJhbVsxOF0gfCAobnZyYW1bMTldIDw8IDgpLAorCSAgICBudnJhbVsyMF0sIG52cmFtWzI1XSwKKwkgICAgbnZyYW1bMjFdIHwgKG52cmFtWzIyXSA8PCA4KSwgbnZyYW1bMjNdIHwgKG52cmFtWzI0XSA8PCA4KSk7CisJUFJJTlRfUFJPQygiSEQgdHlwZSA0OSBkYXRhOiAlZC8lZC8lZCBDL0gvUywgcHJlY29tcCAlZCwgbHogJWRcbiIsCisJICAgIG52cmFtWzM5XSB8IChudnJhbVs0MF0gPDwgOCksCisJICAgIG52cmFtWzQxXSwgbnZyYW1bNDZdLAorCSAgICBudnJhbVs0Ml0gfCAobnZyYW1bNDNdIDw8IDgpLCBudnJhbVs0NF0gfCAobnZyYW1bNDVdIDw8IDgpKTsKKworCVBSSU5UX1BST0MoIkRPUyBiYXNlIG1lbW9yeTogJWQga0JcbiIsIG52cmFtWzddIHwgKG52cmFtWzhdIDw8IDgpKTsKKwlQUklOVF9QUk9DKCJFeHRlbmRlZCBtZW1vcnk6ICVkIGtCIChjb25maWd1cmVkKSwgJWQga0IgKHRlc3RlZClcbiIsCisJICAgIG52cmFtWzldIHwgKG52cmFtWzEwXSA8PCA4KSwgbnZyYW1bMzRdIHwgKG52cmFtWzM1XSA8PCA4KSk7CisKKwlQUklOVF9QUk9DKCJHZnggYWRhcHRlciAgICA6ICVzXG4iLCBnZnhfdHlwZXNbKG52cmFtWzZdID4+IDQpICYgM10pOworCisJUFJJTlRfUFJPQygiRlBVICAgICAgICAgICAgOiAlc2luc3RhbGxlZFxuIiwKKwkgICAgKG52cmFtWzZdICYgMikgPyAiIiA6ICJub3QgIik7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTUFDSCA9PSBQQyAqLworCisjaWYgTUFDSCA9PSBDT0JBTFQKKworLyogdGhlIGNvYmFsdCBDTU9TIGhhcyBhIHdpZGVyIHJhbmdlIG9mIGl0cyBjaGVja3N1bSAqLworc3RhdGljIGludCBjb2JhbHRfY2hlY2tfY2hlY2tzdW0odm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOworCXVuc2lnbmVkIHNob3J0IGV4cGVjdDsKKworCWZvciAoaSA9IENPQlRfQ01PU19DS1NfU1RBUlQ7IGkgPD0gQ09CVF9DTU9TX0NLU19FTkQ7ICsraSkgeworCQlpZiAoKGkgPT0gQ09CVF9DTU9TX0NIRUNLU1VNKSB8fCAoaSA9PSAoQ09CVF9DTU9TX0NIRUNLU1VNKzEpKSkKKwkJCWNvbnRpbnVlOworCisJCXN1bSArPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKKwl9CisJZXhwZWN0ID0gX19udnJhbV9yZWFkX2J5dGUoQ09CVF9DTU9TX0NIRUNLU1VNKSA8PCA4IHwKKwkgICAgX19udnJhbV9yZWFkX2J5dGUoQ09CVF9DTU9TX0NIRUNLU1VNKzEpOworCXJldHVybiAoKHN1bSAmIDB4ZmZmZikgPT0gZXhwZWN0KTsKK30KKworc3RhdGljIHZvaWQgY29iYWx0X3NldF9jaGVja3N1bSh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CisKKwlmb3IgKGkgPSBDT0JUX0NNT1NfQ0tTX1NUQVJUOyBpIDw9IENPQlRfQ01PU19DS1NfRU5EOyArK2kpIHsKKwkJaWYgKChpID09IENPQlRfQ01PU19DSEVDS1NVTSkgfHwgKGkgPT0gKENPQlRfQ01PU19DSEVDS1NVTSsxKSkpCisJCQljb250aW51ZTsKKworCQlzdW0gKz0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisJfQorCisJX19udnJhbV93cml0ZV9ieXRlKHN1bSA+PiA4LCBDT0JUX0NNT1NfQ0hFQ0tTVU0pOworCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0gJiAweGZmLCBDT0JUX0NNT1NfQ0hFQ0tTVU0rMSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgaW50IGNvYmFsdF9wcm9jX2luZm9zKHVuc2lnbmVkIGNoYXIgKm52cmFtLCBjaGFyICpidWZmZXIsIGludCAqbGVuLAorCW9mZl90ICpiZWdpbiwgb2ZmX3Qgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgY2hlY2tzdW07CisJdW5zaWduZWQgaW50IGZsYWdzOworCWNoYXIgc2VybnVtWzE0XTsKKwljaGFyICprZXkgPSAiY05vRWJUYVdsT3RSISI7CisJdW5zaWduZWQgY2hhciBidG9fY3N1bTsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwljaGVja3N1bSA9IF9fbnZyYW1fY2hlY2tfY2hlY2tzdW0oKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCVBSSU5UX1BST0MoIkNoZWNrc3VtIHN0YXR1czogJXN2YWxpZFxuIiwgY2hlY2tzdW0gPyAiIiA6ICJub3QgIik7CisKKwlmbGFncyA9IG52cmFtW0NPQlRfQ01PU19GTEFHX0JZVEVfMF0gPDwgOCAKKwkgICAgfCBudnJhbVtDT0JUX0NNT1NfRkxBR19CWVRFXzFdOworCisJUFJJTlRfUFJPQygiQ29uc29sZTogJXNcbiIsCisJCWZsYWdzICYgQ09CVF9DTU9TX0NPTlNPTEVfRkxBRyA/ICAib24iOiAib2ZmIik7CisKKwlQUklOVF9QUk9DKCJGaXJtd2FyZSBEZWJ1ZyBNZXNzYWdlczogJXNcbiIsCisJCWZsYWdzICYgQ09CVF9DTU9TX0RFQlVHX0ZMQUcgPyAib24iOiAib2ZmIik7CisKKwlQUklOVF9QUk9DKCJBdXRvIFByb21wdDogJXNcbiIsCisJCWZsYWdzICYgQ09CVF9DTU9TX0FVVE9fUFJPTVBUX0ZMQUcgPyAib24iOiAib2ZmIik7CisKKwlQUklOVF9QUk9DKCJTaHV0ZG93biBTdGF0dXM6ICVzXG4iLAorCQlmbGFncyAmIENPQlRfQ01PU19DTEVBTl9CT09UX0ZMQUcgPyAiY2xlYW4iOiAiZGlydHkiKTsKKworCVBSSU5UX1BST0MoIkhhcmR3YXJlIFByb2JlOiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfSFdfTk9QUk9CRV9GTEFHID8gInBhcnRpYWwiOiAiZnVsbCIpOworCisJUFJJTlRfUFJPQygiU3lzdGVtIEZhdWx0OiAlc2RldGVjdGVkXG4iLAorCQlmbGFncyAmIENPQlRfQ01PU19TWVNGQVVMVF9GTEFHID8gIiI6ICJub3QgIik7CisKKwlQUklOVF9QUk9DKCJQYW5pYyBvbiBPT1BTOiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfT09QU1BBTklDX0ZMQUcgPyAieWVzIjogIm5vIik7CisKKwlQUklOVF9QUk9DKCJEZWxheWVkIENhY2hlIEluaXRpYWxpemF0aW9uOiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfREVMQVlfQ0FDSEVfRkxBRyA/ICJ5ZXMiOiAibm8iKTsKKworCVBSSU5UX1BST0MoIlNob3cgTG9nbyBhdCBCb290OiAlc1xuIiwKKwkJZmxhZ3MgJiBDT0JUX0NNT1NfTk9MT0dPX0ZMQUcgPyAibm8iOiAieWVzIik7CisKKwlQUklOVF9QUk9DKCJCb290IE1ldGhvZDogIik7CisJc3dpdGNoIChudnJhbVtDT0JUX0NNT1NfQk9PVF9NRVRIT0RdKSB7CisJY2FzZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfRElTSzoKKwkJUFJJTlRfUFJPQygiZGlza1xuIik7CisJCWJyZWFrOworCisJY2FzZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfUk9NOgorCQlQUklOVF9QUk9DKCJyb21cbiIpOworCQlicmVhazsKKworCWNhc2UgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX05FVDoKKwkJUFJJTlRfUFJPQygibmV0XG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQUklOVF9QUk9DKCJ1bmtub3duXG4iKTsKKwkJYnJlYWs7CisJfQorCisJUFJJTlRfUFJPQygiUHJpbWFyeSBCb290IERldmljZTogJWQ6JWRcbiIsCisJCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjBfTUFKXSwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMF9NSU5dICk7CisJUFJJTlRfUFJPQygiU2Vjb25kYXJ5IEJvb3QgRGV2aWNlOiAlZDolZFxuIiwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMV9NQUpdLAorCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYxX01JTl0gKTsKKwlQUklOVF9QUk9DKCJUZXJ0aWFyeSBCb290IERldmljZTogJWQ6JWRcbiIsCisJCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjJfTUFKXSwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMl9NSU5dICk7CisKKwlQUklOVF9QUk9DKCJVcHRpbWU6ICVkXG4iLAorCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzBdIDw8IDI0IHwKKwkJbnZyYW1bQ09CVF9DTU9TX1VQVElNRV8xXSA8PCAxNiB8CisJCW52cmFtW0NPQlRfQ01PU19VUFRJTUVfMl0gPDwgOCAgfAorCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzNdKTsKKworCVBSSU5UX1BST0MoIkJvb3QgQ291bnQ6ICVkXG4iLAorCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzBdIDw8IDI0IHwKKwkJbnZyYW1bQ09CVF9DTU9TX0JPT1RDT1VOVF8xXSA8PCAxNiB8CisJCW52cmFtW0NPQlRfQ01PU19CT09UQ09VTlRfMl0gPDwgOCAgfAorCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzNdKTsKKworCS8qIDEzIGJ5dGVzIG9mIHNlcmlhbCBudW0gKi8KKwlmb3IgKGk9MCA7IGk8MTMgOyBpKyspIHsKKwkJc2VybnVtW2ldID0gbnZyYW1bQ09CVF9DTU9TX1NZU19TRVJOVU1fMCArIGldOworCX0KKwlzZXJudW1bMTNdID0gJ1wwJzsKKworCWNoZWNrc3VtID0gMDsKKwlmb3IgKGk9MCA7IGk8MTMgOyBpKyspIHsKKwkJY2hlY2tzdW0gKz0gc2VybnVtW2ldIF4ga2V5W2ldOworCX0KKwljaGVja3N1bSA9ICgoY2hlY2tzdW0gJiAweDdmKSBeICgweGQ2KSkgJiAweGZmOworCisJUFJJTlRfUFJPQygiU2VyaWFsIE51bWJlcjogJXMiLCBzZXJudW0pOworCWlmIChjaGVja3N1bSAhPSBudnJhbVtDT0JUX0NNT1NfU1lTX1NFUk5VTV9DU1VNXSkgeworCQlQUklOVF9QUk9DKCIgKGludmFsaWQgY2hlY2tzdW0pIik7CisJfQorCVBSSU5UX1BST0MoIlxuIik7CisKKwlQUklOVF9QUk9DKCJSb20gUmV2aXNvbjogJWQuJWQuJWRcbiIsIG52cmFtW0NPQlRfQ01PU19ST01fUkVWX01BSl0sCisJCW52cmFtW0NPQlRfQ01PU19ST01fUkVWX01JTl0sIG52cmFtW0NPQlRfQ01PU19ST01fUkVWX1JFVl0pOworCisJUFJJTlRfUFJPQygiQlRPIFNlcnZlcjogJWQuJWQuJWQuJWQiLCBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzBdLAorCQludnJhbVtDT0JUX0NNT1NfQlRPX0lQXzFdLCBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzJdLAorCQludnJhbVtDT0JUX0NNT1NfQlRPX0lQXzNdKTsKKwlidG9fY3N1bSA9IG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMF0gKyBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzFdCisJCSsgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8yXSArIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfM107CisJaWYgKGJ0b19jc3VtICE9IG52cmFtW0NPQlRfQ01PU19CVE9fSVBfQ1NVTV0pIHsKKwkJUFJJTlRfUFJPQygiIChpbnZhbGlkIGNoZWNrc3VtKSIpOworCX0KKwlQUklOVF9QUk9DKCJcbiIpOworCisJaWYgKGZsYWdzICYgQ09CVF9DTU9TX1ZFUlNJT05fRkxBRworCSAmJiBudnJhbVtDT0JUX0NNT1NfVkVSU0lPTl0gPj0gQ09CVF9DTU9TX1ZFUl9CVE9DT0RFKSB7CisJCVBSSU5UX1BST0MoIkJUTyBDb2RlOiAweCV4XG4iLAorCQkJbnZyYW1bQ09CVF9DTU9TX0JUT19DT0RFXzBdIDw8IDI0IHwKKwkJCW52cmFtW0NPQlRfQ01PU19CVE9fQ09ERV8xXSA8PCAxNiB8CisJCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfMl0gPDwgOCB8CisJCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfM10pOworCX0KKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKyNlbmRpZiAvKiBNQUNIID09IENPQkFMVCAqLworCisjaWYgTUFDSCA9PSBBVEFSSQorCitzdGF0aWMgaW50CithdGFyaV9jaGVja19jaGVja3N1bSh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgc3VtID0gMDsKKworCWZvciAoaSA9IEFUQVJJX0NLU19SQU5HRV9TVEFSVDsgaSA8PSBBVEFSSV9DS1NfUkFOR0VfRU5EOyArK2kpCisJCXN1bSArPSBfX252cmFtX3JlYWRfYnl0ZShpKTsKKwlyZXR1cm4gKF9fbnZyYW1fcmVhZF9ieXRlKEFUQVJJX0NLU19MT0MpID09ICh+c3VtICYgMHhmZikgJiYKKwkgICAgX19udnJhbV9yZWFkX2J5dGUoQVRBUklfQ0tTX0xPQyArIDEpID09IChzdW0gJiAweGZmKSk7Cit9CisKK3N0YXRpYyB2b2lkCithdGFyaV9zZXRfY2hlY2tzdW0odm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHN1bSA9IDA7CisKKwlmb3IgKGkgPSBBVEFSSV9DS1NfUkFOR0VfU1RBUlQ7IGkgPD0gQVRBUklfQ0tTX1JBTkdFX0VORDsgKytpKQorCQlzdW0gKz0gX19udnJhbV9yZWFkX2J5dGUoaSk7CisJX19udnJhbV93cml0ZV9ieXRlKH5zdW0sIEFUQVJJX0NLU19MT0MpOworCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0sIEFUQVJJX0NLU19MT0MgKyAxKTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgdmFsOworCWNoYXIgKm5hbWU7Cit9IGJvb3RfcHJlZnNbXSA9IHsKKwl7IDB4ODAsICJUT1MiIH0sCisJeyAweDQwLCAiQVNWIiB9LAorCXsgMHgyMCwgIk5ldEJTRCAoPykiIH0sCisJeyAweDEwLCAiTGludXgiIH0sCisJeyAweDAwLCAidW5zcGVjaWZpZWQiIH0KK307CisKK3N0YXRpYyBjaGFyICpsYW5ndWFnZXNbXSA9IHsKKwkiRW5nbGlzaCAoVVMpIiwKKwkiR2VybWFuIiwKKwkiRnJlbmNoIiwKKwkiRW5nbGlzaCAoVUspIiwKKwkiU3BhbmlzaCIsCisJIkl0YWxpYW4iLAorCSI2ICh1bmRlZmluZWQpIiwKKwkiU3dpc3MgKEZyZW5jaCkiLAorCSJTd2lzcyAoR2VybWFuKSIKK307CisKK3N0YXRpYyBjaGFyICpkYXRlZm9ybWF0W10gPSB7CisJIk1NJWNERCVjWVkiLAorCSJERCVjTU0lY1lZIiwKKwkiWVklY01NJWNERCIsCisJIllZJWNERCVjTU0iLAorCSI0ICh1bmRlZmluZWQpIiwKKwkiNSAodW5kZWZpbmVkKSIsCisJIjYgKHVuZGVmaW5lZCkiLAorCSI3ICh1bmRlZmluZWQpIgorfTsKKworc3RhdGljIGNoYXIgKmNvbG9yc1tdID0geworCSIyIiwgIjQiLCAiMTYiLCAiMjU2IiwgIjY1NTM2IiwgIj8/IiwgIj8/IiwgIj8/IgorfTsKKworI2RlZmluZSBmaWVsZHNpemUoYSkJKHNpemVvZihhKS9zaXplb2YoKmEpKQorCitzdGF0aWMgaW50CithdGFyaV9wcm9jX2luZm9zKHVuc2lnbmVkIGNoYXIgKm52cmFtLCBjaGFyICpidWZmZXIsIGludCAqbGVuLAorICAgIG9mZl90ICpiZWdpbiwgb2ZmX3Qgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlpbnQgY2hlY2tzdW0gPSBudnJhbV9jaGVja19jaGVja3N1bSgpOworCWludCBpOworCXVuc2lnbmVkIHZtb2RlOworCisJUFJJTlRfUFJPQygiQ2hlY2tzdW0gc3RhdHVzICA6ICVzdmFsaWRcbiIsIGNoZWNrc3VtID8gIiIgOiAibm90ICIpOworCisJUFJJTlRfUFJPQygiQm9vdCBwcmVmZXJlbmNlICA6ICIpOworCWZvciAoaSA9IGZpZWxkc2l6ZShib290X3ByZWZzKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisJCWlmIChudnJhbVsxXSA9PSBib290X3ByZWZzW2ldLnZhbCkgeworCQkJUFJJTlRfUFJPQygiJXNcbiIsIGJvb3RfcHJlZnNbaV0ubmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA8IDApCisJCVBSSU5UX1BST0MoIjB4JTAyeCAodW5kZWZpbmVkKVxuIiwgbnZyYW1bMV0pOworCisJUFJJTlRfUFJPQygiU0NTSSBhcmJpdHJhdGlvbiA6ICVzXG4iLAorCSAgICAobnZyYW1bMTZdICYgMHg4MCkgPyAib24iIDogIm9mZiIpOworCVBSSU5UX1BST0MoIlNDU0kgaG9zdCBJRCAgICAgOiAiKTsKKwlpZiAobnZyYW1bMTZdICYgMHg4MCkKKwkJUFJJTlRfUFJPQygiJWRcbiIsIG52cmFtWzE2XSAmIDcpOworCWVsc2UKKwkJUFJJTlRfUFJPQygibi9hXG4iKTsKKworCS8qIHRoZSBmb2xsb3dpbmcgZW50cmllcyBhcmUgZGVmaW5lZCBvbmx5IGZvciB0aGUgRmFsY29uICovCisJaWYgKChhdGFyaV9tY2hfY29va2llID4+IDE2KSAhPSBBVEFSSV9NQ0hfRkFMQ09OKQorCQlyZXR1cm4gMTsKKworCVBSSU5UX1BST0MoIk9TIGxhbmd1YWdlICAgICAgOiAiKTsKKwlpZiAobnZyYW1bNl0gPCBmaWVsZHNpemUobGFuZ3VhZ2VzKSkKKwkJUFJJTlRfUFJPQygiJXNcbiIsIGxhbmd1YWdlc1tudnJhbVs2XV0pOworCWVsc2UKKwkJUFJJTlRfUFJPQygiJXUgKHVuZGVmaW5lZClcbiIsIG52cmFtWzZdKTsKKwlQUklOVF9QUk9DKCJLZXlib2FyZCBsYW5ndWFnZTogIik7CisJaWYgKG52cmFtWzddIDwgZmllbGRzaXplKGxhbmd1YWdlcykpCisJCVBSSU5UX1BST0MoIiVzXG4iLCBsYW5ndWFnZXNbbnZyYW1bN11dKTsKKwllbHNlCisJCVBSSU5UX1BST0MoIiV1ICh1bmRlZmluZWQpXG4iLCBudnJhbVs3XSk7CisJUFJJTlRfUFJPQygiRGF0ZSBmb3JtYXQgICAgICA6ICIpOworCVBSSU5UX1BST0MoZGF0ZWZvcm1hdFtudnJhbVs4XSAmIDddLAorCSAgICBudnJhbVs5XSA/IG52cmFtWzldIDogJy8nLCBudnJhbVs5XSA/IG52cmFtWzldIDogJy8nKTsKKwlQUklOVF9QUk9DKCIsICVkaCBjbG9ja1xuIiwgbnZyYW1bOF0gJiAxNiA/IDI0IDogMTIpOworCVBSSU5UX1BST0MoIkJvb3QgZGVsYXkgICAgICAgOiAiKTsKKwlpZiAobnZyYW1bMTBdID09IDApCisJCVBSSU5UX1BST0MoImRlZmF1bHQiKTsKKwllbHNlCisJCVBSSU5UX1BST0MoIiVkcyVzXG4iLCBudnJhbVsxMF0sCisJCSAgICBudnJhbVsxMF0gPCA4ID8gIiwgbm8gbWVtb3J5IHRlc3QiIDogIiIpOworCisJdm1vZGUgPSAobnZyYW1bMTRdIDw8IDgpIHx8IG52cmFtWzE1XTsKKwlQUklOVF9QUk9DKCJWaWRlbyBtb2RlICAgICAgIDogJXMgY29sb3JzLCAlZCBjb2x1bW5zLCAlcyAlcyBtb25pdG9yXG4iLAorCSAgICBjb2xvcnNbdm1vZGUgJiA3XSwKKwkgICAgdm1vZGUgJiA4ID8gODAgOiA0MCwKKwkgICAgdm1vZGUgJiAxNiA/ICJWR0EiIDogIlRWIiwgdm1vZGUgJiAzMiA/ICJQQUwiIDogIk5UU0MiKTsKKwlQUklOVF9QUk9DKCIgICAgICAgICAgICAgICAgICAgJXNvdmVyc2NhbiwgY29tcGF0LiBtb2RlICVzJXNcbiIsCisJICAgIHZtb2RlICYgNjQgPyAiIiA6ICJubyAiLAorCSAgICB2bW9kZSAmIDEyOCA/ICJvbiIgOiAib2ZmIiwKKwkgICAgdm1vZGUgJiAyNTYgPworCSAgICAodm1vZGUgJiAxNiA/ICIsIGxpbmUgZG91YmxpbmciIDogIiwgaGFsZiBzY3JlZW4iKSA6ICIiKTsKKworCXJldHVybiAxOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBNQUNIID09IEFUQVJJICovCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChfX252cmFtX3JlYWRfYnl0ZSk7CitFWFBPUlRfU1lNQk9MKG52cmFtX3JlYWRfYnl0ZSk7CitFWFBPUlRfU1lNQk9MKF9fbnZyYW1fd3JpdGVfYnl0ZSk7CitFWFBPUlRfU1lNQk9MKG52cmFtX3dyaXRlX2J5dGUpOworRVhQT1JUX1NZTUJPTChfX252cmFtX2NoZWNrX2NoZWNrc3VtKTsKK0VYUE9SVF9TWU1CT0wobnZyYW1fY2hlY2tfY2hlY2tzdW0pOworRVhQT1JUX1NZTUJPTChfX252cmFtX3NldF9jaGVja3N1bSk7CitFWFBPUlRfU1lNQk9MKG52cmFtX3NldF9jaGVja3N1bSk7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihOVlJBTV9NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbndidXR0b24uYyBiL2RyaXZlcnMvY2hhci9ud2J1dHRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODNiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbndidXR0b24uYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIAlOZXRXaW5kZXIgQnV0dG9uIERyaXZlci0KKyAqCUNvcHlyaWdodCAoQykgQWxleCBIb2xkZW4gPGFsZXhAbGludXhoYWNrZXIub3JnPiAxOTk4LCAxOTk5LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNkZWZpbmUgX19OV0JVVFRPTl9DCQkvKiBUZWxsIHRoZSBoZWFkZXIgZmlsZSB3aG8gd2UgYXJlICovCisjaW5jbHVkZSAibndidXR0b24uaCIKKworc3RhdGljIGludCBidXR0b25fcHJlc3NfY291bnQ7CQkvKiBUaGUgY291bnQgb2YgYnV0dG9uIHByZXNzZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBidXR0b25fdGltZXI7CS8qIFRpbWVzIGZvciB0aGUgZW5kIG9mIGEgc2VxdWVuY2UgKi8gCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYnV0dG9uX3dhaXRfcXVldWUpOyAvKiBVc2VkIGZvciBibG9ja2luZyByZWFkICovCitzdGF0aWMgY2hhciBidXR0b25fb3V0cHV0X2J1ZmZlclszMl07CS8qIFN0b3JlcyBkYXRhIHRvIHdyaXRlIG91dCBvZiBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgYmNvdW50OwkJCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciAqLworc3RhdGljIGludCBiZGVsYXkgPSBCVVRUT05fREVMQVk7CS8qIFRoZSBkZWxheSwgaW4gamlmZmllcyAqLworc3RhdGljIHN0cnVjdCBidXR0b25fY2FsbGJhY2sgYnV0dG9uX2NhbGxiYWNrX2xpc3RbMzJdOyAvKiBUaGUgY2FsbGJhY2sgbGlzdCAqLworc3RhdGljIGludCBjYWxsYmFja19jb3VudDsJCS8qIFRoZSBudW1iZXIgb2YgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgKi8KK3N0YXRpYyBpbnQgcmVib290X2NvdW50ID0gTlVNX1BSRVNTRVNfUkVCT09UOyAvKiBOdW1iZXIgb2YgcHJlc3NlcyB0byByZWJvb3QgKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG90aGVyIGRyaXZlcnMgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbgorICogdG8gYmUgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIG51bWJlciBvZiBidXR0b24gcHJlc3NlcyBvY2N1cnMuCisgKiBUaGUgY2FsbGJhY2sgbGlzdCBpcyBhIHN0YXRpYyBhcnJheSBvZiAzMiBlbnRyaWVzIChJIHNvbWVob3cgZG91YnQgbWFueQorICogcGVvcGxlIGFyZSBldmVyIGdvaW5nIHRvIHdhbnQgdG8gcmVnaXN0ZXIgbW9yZSB0aGFuIDMyIGRpZmZlcmVudCBhY3Rpb25zCisgKiB0byBiZSBwZXJmb3JtZWQgYnkgdGhlIGtlcm5lbCBvbiBkaWZmZXJlbnQgbnVtYmVycyBvZiBidXR0b24gcHJlc3NlcyA7KS4KKyAqIEhvd2V2ZXIsIGlmIGFuIGF0dGVtcHQgdG8gcmVnaXN0ZXIgYSAzM3JkIGVudHJ5IChwZXJoYXBzIGEgc3R1Y2sgbG9vcAorICogc29tZXdoZXJlIHJlZ2lzdGVyaW5nIHRoZSBzYW1lIGVudHJ5IG92ZXIgYW5kIG92ZXI/KSBpdCB3aWxsIGZhaWwgdG8KKyAqIGRvIHNvIGFuZCByZXR1cm4gLUVOT01FTS4gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHJlZ2lzdGVyIGEgbnVsbCBwb2ludGVyLAorICogaXQgd2lsbCBmYWlsIHRvIGRvIHNvIGFuZCByZXR1cm4gLUVJTlZBTC4KKyAqIEJlY2F1c2UgY2FsbGJhY2tzIGNhbiBiZSB1bnJlZ2lzdGVyZWQgYXQgcmFuZG9tIHRoZSBsaXN0IGNhbiBiZWNvbWUKKyAqIGZyYWdtZW50ZWQsIHNvIHdlIG5lZWQgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCB0aGUgZmlyc3QKKyAqIGZyZWUgZW50cnkuCisgKgorICogRklYTUU6IEhhcyBhbnlvbmUgc3BvdHRlZCBhbnkgbG9ja2luZyBmdW5jdGlvbnMgaW50IGhpcyBjb2RlIHJlY2VudGx5ID8/CisgKi8KKworaW50IGJ1dHRvbl9hZGRfY2FsbGJhY2sgKHZvaWQgKCpjYWxsYmFjaykgKHZvaWQpLCBpbnQgY291bnQpCit7CisJaW50IGxwID0gMDsKKwlpZiAoY2FsbGJhY2tfY291bnQgPT0gMzIpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICghY2FsbGJhY2spIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNhbGxiYWNrX2NvdW50Kys7CisJZm9yICg7IChidXR0b25fY2FsbGJhY2tfbGlzdCBbbHBdLmNhbGxiYWNrKTsgbHArKyk7CisJYnV0dG9uX2NhbGxiYWNrX2xpc3QgW2xwXS5jYWxsYmFjayA9IGNhbGxiYWNrOworCWJ1dHRvbl9jYWxsYmFja19saXN0IFtscF0uY291bnQgPSBjb3VudDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG90aGVyIGRyaXZlcnMgdG8gZGVyZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorICogSWYgeW91IGF0dGVtcHQgdG8gdW5yZWdpc3RlciBhIGNhbGxiYWNrIHdoaWNoIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGZhaWwKKyAqIHdpdGggLUVJTlZBTC4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBlbnRyeSB3aXRoIHRoZSBzYW1lIGFkZHJlc3MsCisgKiBiZWNhdXNlIGl0IHNlYXJjaGVzIHRoZSBsaXN0IGZyb20gZW5kIHRvIGJlZ2lubmluZywgaXQgd2lsbCB1bnJlZ2lzdGVyIHRoZQorICogbGFzdCBvbmUgdG8gYmUgcmVnaXN0ZXJlZCBmaXJzdCAoRklMTy0gRmlyc3QgSW4gTGFzdCBPdXQpLgorICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IG5lY2Nlc3NhcmlseSB0cnVlIGlmIHRoZSBlbnRyaWVzIGFyZSBub3Qgc3VibWl0dGVkCisgKiBhdCB0aGUgc2FtZSB0aW1lLCBiZWNhdXNlIGFub3RoZXIgZHJpdmVyIGNvdWxkIGhhdmUgdW5yZWdpc3RlcmVkIGEgY2FsbGJhY2sKKyAqIGJldHdlZW4gdGhlIHN1Ym1pc3Npb25zIGNyZWF0aW5nIGEgZ2FwIGVhcmxpZXIgaW4gdGhlIGxpc3QsIHdoaWNoIHdvdWxkCisgKiBiZSBmaWxsZWQgZmlyc3QgYXQgc3VibWlzc2lvbiB0aW1lLgorICovCisKK2ludCBidXR0b25fZGVsX2NhbGxiYWNrICh2b2lkICgqY2FsbGJhY2spICh2b2lkKSkKK3sKKwlpbnQgbHAgPSAzMTsKKwlpZiAoIWNhbGxiYWNrKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3aGlsZSAobHAgPj0gMCkgeworCQlpZiAoKGJ1dHRvbl9jYWxsYmFja19saXN0IFtscF0uY2FsbGJhY2spID09IGNhbGxiYWNrKSB7CisJCQlidXR0b25fY2FsbGJhY2tfbGlzdCBbbHBdLmNhbGxiYWNrID0gTlVMTDsKKwkJCWJ1dHRvbl9jYWxsYmFja19saXN0IFtscF0uY291bnQgPSAwOworCQkJY2FsbGJhY2tfY291bnQtLTsKKwkJCXJldHVybiAwOworCQl9OworCQlscC0tOworCX07CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBidXR0b25fc2VxdWVuY2VfZmluaXNoZWQgdG8gc2VhcmNoIHRocm91Z2ggdGhlCisgKiBsaXN0IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucywgYW5kIGNhbGwgYW55IG9mIHRoZW0gd2hvc2UgY291bnQgYXJndW1lbnQKKyAqIG1hdGNoZXMgdGhlIGN1cnJlbnQgY291bnQgb2YgYnV0dG9uIHByZXNzZXMuIEl0IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUgbGlzdCBhbmQgd29ya3MgdXAgdG8gdGhlIGVuZC4gSXQgd2lsbCByZWZ1c2UgdG8gZm9sbG93IGEgbnVsbAorICogcG9pbnRlciAod2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbiBhbnl3YXkpLgorICovCisKK3N0YXRpYyB2b2lkIGJ1dHRvbl9jb25zdW1lX2NhbGxiYWNrcyAoaW50IGJwY291bnQpCit7CisJaW50IGxwID0gMDsKKwlmb3IgKDsgbHAgPD0gMzE7IGxwKyspIHsKKwkJaWYgKChidXR0b25fY2FsbGJhY2tfbGlzdCBbbHBdLmNvdW50KSA9PSBicGNvdW50KSB7CisJCQlpZiAoYnV0dG9uX2NhbGxiYWNrX2xpc3QgW2xwXS5jYWxsYmFjaykgeworCQkJCWJ1dHRvbl9jYWxsYmFja19saXN0W2xwXS5jYWxsYmFjaygpOworCQkJfQorCQl9CisJfQorfQorCisvKiAKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGJ1dHRvbl90aW1lciB0aW1lcyBvdXQuCisgKiBpZS4gV2hlbiB5b3UgZG9uJ3QgcHJlc3MgdGhlIGJ1dHRvbiBmb3IgYmRlbGF5IGppZmZpZXMsIHRoaXMgaXMgdGFrZW4gdG8KKyAqIG1lYW4geW91IGhhdmUgZW5kZWQgdGhlIHNlcXVlbmNlIG9mIGtleSBwcmVzc2VzLCBhbmQgdGhpcyBmdW5jdGlvbiBpcworICogY2FsbGVkIHRvIHdpbmQgdGhpbmdzIHVwICh3cml0ZSB0aGUgcHJlc3NfY291bnQgb3V0IHRvIC9kZXYvYnV0dG9uLCBjYWxsCisgKiBhbnkgbWF0Y2hpbmcgcmVnaXN0ZXJlZCBmdW5jdGlvbiBjYWxsYmFja3MsIGluaXRpYXRlIHJlYm9vdCwgZXRjLikuCisgKi8KKworc3RhdGljIHZvaWQgYnV0dG9uX3NlcXVlbmNlX2ZpbmlzaGVkICh1bnNpZ25lZCBsb25nIHBhcmFtZXRlcnMpCit7CisjaWZkZWYgQ09ORklHX05XQlVUVE9OX1JFQk9PVAkJLyogUmVib290IHVzaW5nIGJ1dHRvbiBpcyBlbmFibGVkICovCisJaWYgKGJ1dHRvbl9wcmVzc19jb3VudCA9PSByZWJvb3RfY291bnQpIHsKKwkJa2lsbF9wcm9jICgxLCBTSUdJTlQsIDEpOwkvKiBBc2sgaW5pdCB0byByZWJvb3QgdXMgKi8KKwl9CisjZW5kaWYgLyogQ09ORklHX05XQlVUVE9OX1JFQk9PVCAqLworCWJ1dHRvbl9jb25zdW1lX2NhbGxiYWNrcyAoYnV0dG9uX3ByZXNzX2NvdW50KTsKKwliY291bnQgPSBzcHJpbnRmIChidXR0b25fb3V0cHV0X2J1ZmZlciwgIiVkXG4iLCBidXR0b25fcHJlc3NfY291bnQpOworCWJ1dHRvbl9wcmVzc19jb3VudCA9IDA7CQkvKiBSZXNldCB0aGUgYnV0dG9uIHByZXNzIGNvdW50ZXIgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZidXR0b25fd2FpdF9xdWV1ZSk7Cit9CisKKy8qIAorICogIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiB0aGUgb3JhbmdlIGJ1dHRvbiBpcyBwcmVzc2VkIChHUElPIDEwIG9mIHRoZQorICogIFN1cGVySU8gY2hpcCwgd2hpY2ggbWFwcyB0byBsb2dpY2FsIElSUSAyNikuIElmIHRoZSBwcmVzc19jb3VudCBpcyAwLAorICogIHRoaXMgaXMgdGhlIGZpcnN0IHByZXNzLCBzbyBpdCBzdGFydHMgYSB0aW1lciBhbmQgaW5jcmVtZW50cyB0aGUgY291bnRlci4KKyAqICBJZiBpdCBpcyBoaWdoZXIgdGhhbiAwLCBpdCBkZWxldGVzIHRoZSBvbGQgdGltZXIsIHN0YXJ0cyBhIG5ldyBvbmUsIGFuZAorICogIGluY3JlbWVudHMgdGhlIGNvdW50ZXIuCisgKi8gCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBidXR0b25faGFuZGxlciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoYnV0dG9uX3ByZXNzX2NvdW50KSB7CisJCWRlbF90aW1lciAoJmJ1dHRvbl90aW1lcik7CisJfQorCWJ1dHRvbl9wcmVzc19jb3VudCsrOworCWluaXRfdGltZXIgKCZidXR0b25fdGltZXIpOworCWJ1dHRvbl90aW1lci5mdW5jdGlvbiA9IGJ1dHRvbl9zZXF1ZW5jZV9maW5pc2hlZDsKKwlidXR0b25fdGltZXIuZXhwaXJlcyA9IChqaWZmaWVzICsgYmRlbGF5KTsKKwlhZGRfdGltZXIgKCZidXR0b25fdGltZXIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHVzZXIgc3BhY2UgcHJvZ3JhbSBhdHRlbXB0cyB0byByZWFkCisgKiAvZGV2L253YnV0dG9uLiBJdCBwdXRzIHRoZSBkZXZpY2UgdG8gc2xlZXAgb24gdGhlIHdhaXQgcXVldWUgdW50aWwKKyAqIGJ1dHRvbl9zZXF1ZW5jZV9maW5pc2hlZCB3cml0ZXMgc29tZSBkYXRhIHRvIHRoZSBidWZmZXIgYW5kIGZsdXNoZXMKKyAqIHRoZSBxdWV1ZSwgYXQgd2hpY2ggcG9pbnQgaXQgd3JpdGVzIHRoZSBkYXRhIG91dCB0byB0aGUgZGV2aWNlIGFuZAorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaXQgaGFzIHdyaXR0ZW4uIFRoaXMgZnVuY3Rpb24gaXMKKyAqIHJlZW50cmFudCwgc28gdGhhdCBtYW55IHByb2Nlc3NlcyBjYW4gYmUgYXR0ZW1wdGluZyB0byByZWFkIGZyb20gdGhlCisgKiBkZXZpY2UgYXQgYW55IG9uZSB0aW1lLgorICovCisKK3N0YXRpYyBpbnQgYnV0dG9uX3JlYWQgKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbiAoJmJ1dHRvbl93YWl0X3F1ZXVlKTsKKwlyZXR1cm4gKGNvcHlfdG9fdXNlciAoYnVmZmVyLCAmYnV0dG9uX291dHB1dF9idWZmZXIsIGJjb3VudCkpCisJCSA/IC1FRkFVTFQgOiBiY291bnQ7Cit9CisKKy8qIAorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGZpbGUgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUsIHdoaWNoIHNwZWNpZmllcyB3aGF0CisgKiBjYWxsYmFja3MgZnVuY3Rpb25zIHRoZSBrZXJuZWwgc2hvdWxkIGNhbGwgd2hlbiBhIHVzZXIgbW9kZSBwcm9jZXNzCisgKiBhdHRlbXB0cyB0byBwZXJmb3JtIHRoZXNlIG9wZXJhdGlvbnMgb24gdGhlIGRldmljZS4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidXR0b25fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gYnV0dG9uX3JlYWQsCit9OworCisvKiAKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBtaXNjIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIHNwZWNpZmllcyB0aGUgbWlub3IKKyAqIGRldmljZSBudW1iZXIgKDE1OCBpbiB0aGlzIGNhc2UpLCB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIChmb3IgL3Byb2MvbWlzYyksCisgKiBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGFib3ZlIGZpbGUgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUuCisgKi8KKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGJ1dHRvbl9taXNjX2RldmljZSA9IHsKKwlCVVRUT05fTUlOT1IsCisJIm53YnV0dG9uIiwKKwkmYnV0dG9uX2ZvcHMsCit9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5pdGlhbGlzZSB0aGUgZHJpdmVyLCBlaXRoZXIgZnJvbSBtaXNjLmMgYXQKKyAqIGJvb3R1cCBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwgb3IgZnJvbSBpbml0X21vZHVsZQorICogYmVsb3cgYXQgbW9kdWxlIGluc2VydCB0aW1lLiBJdCBhdHRlbXB0cyB0byByZWdpc3RlciB0aGUgZGV2aWNlIG5vZGUKKyAqIGFuZCB0aGUgSVJRIGFuZCBmYWlscyB3aXRoIGEgd2FybmluZyBtZXNzYWdlIGlmIGVpdGhlciBmYWlscywgdGhvdWdoCisgKiBuZWl0aGVyIGV2ZXIgc2hvdWxkIGJlY2F1c2UgdGhlIGRldmljZSBudW1iZXIgYW5kIElSUSBhcmUgdW5pcXVlIHRvCisgKiB0aGlzIGRyaXZlci4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBud2J1dHRvbl9pbml0KHZvaWQpCit7CisJaWYgKCFtYWNoaW5lX2lzX25ldHdpbmRlcigpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaW50ayAoS0VSTl9JTkZPICJOZXRXaW5kZXIgQnV0dG9uIERyaXZlciBWZXJzaW9uICVzIChDKSBBbGV4IEhvbGRlbiAiCisJCQkiPGFsZXhAbGludXhoYWNrZXIub3JnPiAxOTk4LlxuIiwgVkVSU0lPTik7CisKKwlpZiAobWlzY19yZWdpc3RlciAoJmJ1dHRvbl9taXNjX2RldmljZSkpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm53YnV0dG9uOiBDb3VsZG4ndCByZWdpc3RlciBkZXZpY2UgMTAsICIKKwkJCQkiJWQuXG4iLCBCVVRUT05fTUlOT1IpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChyZXF1ZXN0X2lycSAoSVJRX05FVFdJTkRFUl9CVVRUT04sIGJ1dHRvbl9oYW5kbGVyLCBTQV9JTlRFUlJVUFQsCisJCQkibndidXR0b24iLCBOVUxMKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAibndidXR0b246IElSUSAlZCBpcyBub3QgZnJlZS5cbiIsCisJCQkJSVJRX05FVFdJTkRFUl9CVVRUT04pOworCQltaXNjX2RlcmVnaXN0ZXIgKCZidXR0b25fbWlzY19kZXZpY2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBud2J1dHRvbl9leGl0ICh2b2lkKSAKK3sKKwlmcmVlX2lycSAoSVJRX05FVFdJTkRFUl9CVVRUT04sIE5VTEwpOworCW1pc2NfZGVyZWdpc3RlciAoJmJ1dHRvbl9taXNjX2RldmljZSk7Cit9CisKKworTU9EVUxFX0FVVEhPUigiQWxleCBIb2xkZW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQobndidXR0b25faW5pdCk7Cittb2R1bGVfZXhpdChud2J1dHRvbl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ud2J1dHRvbi5oIGIvZHJpdmVycy9jaGFyL253YnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiN2I5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9ud2J1dHRvbi5oCkBAIC0wLDAgKzEsNDAgQEAKKyNpZm5kZWYgX19OV0JVVFRPTl9ICisjZGVmaW5lIF9fTldCVVRUT05fSAorCisvKgorICogCU5ldFdpbmRlciBCdXR0b24gRHJpdmVyLQorICoJQ29weXJpZ2h0IChDKSBBbGV4IEhvbGRlbiA8YWxleEBsaW51eGhhY2tlci5vcmc+IDE5OTgsIDE5OTkuCisgKi8KKworI2lmZGVmIF9fTldCVVRUT05fQwkvKiBBY3R1YWxseSBjb21waWxpbmcgdGhlIGRyaXZlciBpdHNlbGYgKi8KKworLyogVmFyaW91cyBkZWZpbmVzOiAqLworCisjZGVmaW5lIE5VTV9QUkVTU0VTX1JFQk9PVCAyCS8qIEhvdyBtYW55IHByZXNzZXMgdG8gYWN0aXZhdGUgc2h1dGRvd24gKi8KKyNkZWZpbmUgQlVUVE9OX0RFTEFZIDMwIAkvKiBIb3cgbWFueSBqaWZmaWVzIGZvciBzZXF1ZW5jZSB0byBlbmQgKi8KKyNkZWZpbmUgVkVSU0lPTiAiMC4zIgkJLyogRHJpdmVyIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIEJVVFRPTl9NSU5PUiAxNTgJLyogTWFqb3IgMTAsIE1pbm9yIDE1OCwgL2Rldi9ud2J1dHRvbiAqLworCisvKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnM6ICovCisKK3N0cnVjdCBidXR0b25fY2FsbGJhY2sgeworCXZvaWQgKCpjYWxsYmFjaykgKHZvaWQpOworCWludCBjb3VudDsKK307CisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXM6ICovCisKK3N0YXRpYyB2b2lkIGJ1dHRvbl9zZXF1ZW5jZV9maW5pc2hlZCAodW5zaWduZWQgbG9uZyBwYXJhbWV0ZXJzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBidXR0b25faGFuZGxlciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitpbnQgYnV0dG9uX2luaXQgKHZvaWQpOworaW50IGJ1dHRvbl9hZGRfY2FsbGJhY2sgKHZvaWQgKCpjYWxsYmFjaykgKHZvaWQpLCBpbnQgY291bnQpOworaW50IGJ1dHRvbl9kZWxfY2FsbGJhY2sgKHZvaWQgKCpjYWxsYmFjaykgKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGJ1dHRvbl9jb25zdW1lX2NhbGxiYWNrcyAoaW50IGJwY291bnQpOworCisjZWxzZSAvKiBOb3QgY29tcGlsaW5nIHRoZSBkcml2ZXIgaXRzZWxmICovCisKK2V4dGVybiBpbnQgYnV0dG9uX2FkZF9jYWxsYmFjayAodm9pZCAoKmNhbGxiYWNrKSAodm9pZCksIGludCBjb3VudCk7CitleHRlcm4gaW50IGJ1dHRvbl9kZWxfY2FsbGJhY2sgKHZvaWQgKCpjYWxsYmFjaykgKHZvaWQpKTsKKworI2VuZGlmIC8qIF9fTldCVVRUT05fQyAqLworI2VuZGlmIC8qIF9fTldCVVRUT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL253Zmxhc2guYyBiL2RyaXZlcnMvY2hhci9ud2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0MWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9ud2ZsYXNoLmMKQEAgLTAsMCArMSw3MDIgQEAKKy8qCisgKiBGbGFzaCBtZW1vcnkgaW50ZXJmYWNlIHJldi41IGRyaXZlciBmb3IgdGhlIEludGVsCisgKiBGbGFzaCBjaGlwcyB1c2VkIG9uIHRoZSBOZXRXaW5kZXIuCisgKgorICogMjAvMDgvMjAwMAlSTUsJdXNlIF9faW9yZW1hcCB0byBtYXAgZmxhc2ggaW50byB2aXJ0dWFsIG1lbW9yeQorICoJCQltYWtlIGEgZmV3IG1vcmUgcGxhY2VzIHVzZSAidm9sYXRpbGUiCisgKiAyMi8wNS8yMDAxCVJNSwktIExvY2sgcmVhZCBhZ2FpbnN0IHdyaXRlCisgKgkJCS0gbWVyZ2UgcHJpbnRrIGxldmVsIGNoYW5nZXMgKHdpdGggbW9kcykgZnJvbSBBbGFuIENveC4KKyAqCQkJLSB1c2UgKnBwb3MgYXMgdGhlIGZpbGUgcG9zaXRpb24sIG5vdCBmaWxlLT5mX3Bvcy4KKyAqCQkJLSBmaXggY2hlY2sgZm9yIG91dCBvZiByYW5nZSBwb3MgYW5kIHIvdyBzaXplCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCB3ZSBhcmUgdGFtcGVyaW5nIHdpdGggdGhlIG9ubHkgZmxhc2ggY2hpcCBpbiB0aGUKKyAqIG1hY2hpbmUsIHdoaWNoIGNvbnRhaW5zIHRoZSBib290dXAgY29kZS4gIFdlIHRoZXJlZm9yZSBoYXZlIHRoZQorICogcG93ZXIgdG8gY29udmVydCB0aGVzZSBtYWNoaW5lcyBpbnRvIGRvb3JzdG9wcy4uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGFzbS9ud2ZsYXNoLmg+CisKKyNkZWZpbmUJTldGTEFTSF9WRVJTSU9OICI2LjQiCisKK3N0YXRpYyB2b2lkIGtpY2tfb3Blbih2b2lkKTsKK3N0YXRpYyBpbnQgZ2V0X2ZsYXNoX2lkKHZvaWQpOworc3RhdGljIGludCBlcmFzZV9ibG9jayhpbnQgbkJsb2NrKTsKK3N0YXRpYyBpbnQgd3JpdGVfYmxvY2sodW5zaWduZWQgbG9uZyBwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpOworCisjZGVmaW5lIEtGTEFTSF9TSVpFCTEwMjQqMTAyNAkvLzEgTWVnCisjZGVmaW5lIEtGTEFTSF9TSVpFNAk0KjEwMjQqMTAyNAkvLzQgTWVnCisjZGVmaW5lIEtGTEFTSF9JRAkweDg5QTYJCS8vSW50ZWwgZmxhc2gKKyNkZWZpbmUgS0ZMQVNIX0lENAkweEIwRDQJCS8vSW50ZWwgZmxhc2ggNE1lZworCitzdGF0aWMgaW50IGZsYXNoZGVidWc7CQkvL2lmIHNldCAtIHdlIHdpbGwgZGlzcGxheSBwcm9ncmVzcyBtc2dzCisKK3N0YXRpYyBpbnQgZ2JXcml0ZUVuYWJsZTsKK3N0YXRpYyBpbnQgZ2JXcml0ZUJhc2U2NEVuYWJsZTsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpGTEFTSF9CQVNFOworc3RhdGljIGludCBnYkZsYXNoU2l6ZSA9IEtGTEFTSF9TSVpFOworc3RhdGljIERFQ0xBUkVfTVVURVgobndmbGFzaF9zZW0pOworCitleHRlcm4gc3BpbmxvY2tfdCBncGlvX2xvY2s7CisKK3N0YXRpYyBpbnQgZ2V0X2ZsYXNoX2lkKHZvaWQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGMxLCBjMjsKKworCS8qCisJICogdHJ5IHRvIGdldCBmbGFzaCBjaGlwIElECisJICovCisJa2lja19vcGVuKCk7CisJYzIgPSBpbmIoMHg4MCk7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4OTA7CisJdWRlbGF5KDE1KTsKKwljMSA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBGTEFTSF9CQVNFOworCWMyID0gaW5iKDB4ODApOworCisJLyoKKwkgKiBvbiA0IE1lZyBmbGFzaCB0aGUgc2Vjb25kIGJ5dGUgaXMgYWN0dWFsbHkgYXQgb2Zmc2V0IDIuLi4KKwkgKi8KKwlpZiAoYzEgPT0gMHhCMCkKKwkJYzIgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAyKTsKKwllbHNlCisJCWMyID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMSk7CisKKwljMiArPSAoYzEgPDwgOCk7CisKKwkvKgorCSAqIHNldCBpdCBiYWNrIHRvIHJlYWQgbW9kZQorCSAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCkgPSAweEZGOworCisJaWYgKGMyID09IEtGTEFTSF9JRDQpCisJCWdiRmxhc2hTaXplID0gS0ZMQVNIX1NJWkU0OworCisJcmV0dXJuIGMyOworfQorCitzdGF0aWMgaW50IGZsYXNoX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGVwLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDTURfV1JJVEVfRElTQUJMRToKKwkJZ2JXcml0ZUJhc2U2NEVuYWJsZSA9IDA7CisJCWdiV3JpdGVFbmFibGUgPSAwOworCQlicmVhazsKKworCWNhc2UgQ01EX1dSSVRFX0VOQUJMRToKKwkJZ2JXcml0ZUVuYWJsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBDTURfV1JJVEVfQkFTRTY0S19FTkFCTEU6CisJCWdiV3JpdGVCYXNlNjRFbmFibGUgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWdiV3JpdGVCYXNlNjRFbmFibGUgPSAwOworCQlnYldyaXRlRW5hYmxlID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBmbGFzaF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCXVuc2lnbmVkIGludCBjb3VudCA9IHNpemU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZmxhc2hkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgImZsYXNoX3JlYWQ6IGZsYXNoX3JlYWQ6IG9mZnNldD0weCVsWCwgIgorCQkgICAgICAgImJ1ZmZlcj0lcCwgY291bnQ9MHglWC5cbiIsIHAsIGJ1ZiwgY291bnQpOworCisJaWYgKGNvdW50KQorCQlyZXQgPSAtRU5YSU87CisKKwlpZiAocCA8IGdiRmxhc2hTaXplKSB7CisJCWlmIChjb3VudCA+IGdiRmxhc2hTaXplIC0gcCkKKwkJCWNvdW50ID0gZ2JGbGFzaFNpemUgLSBwOworCisJCS8qCisJCSAqIFdlIG5vdyBsb2NrIGFnYWluc3QgcmVhZHMgYW5kIHdyaXRlcy4gLS1ybWsKKwkJICovCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJm53Zmxhc2hfc2VtKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJcmV0ID0gY29weV90b191c2VyKGJ1ZiwgKHZvaWQgKikoRkxBU0hfQkFTRSArIHApLCBjb3VudCk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gY291bnQ7CisJCQkqcHBvcyArPSBjb3VudDsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRUZBVUxUOworCQl1cCgmbndmbGFzaF9zZW0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBmbGFzaF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKiBwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCXVuc2lnbmVkIGludCBjb3VudCA9IHNpemU7CisJaW50IHdyaXR0ZW47CisJaW50IG5CbG9jaywgdGVtcCwgcmM7CisJaW50IGksIGo7CisKKwlpZiAoZmxhc2hkZWJ1ZykKKwkJcHJpbnRrKCJmbGFzaF93cml0ZTogb2Zmc2V0PTB4JWxYLCBidWZmZXI9MHglcCwgY291bnQ9MHglWC5cbiIsCisJCSAgICAgICBwLCBidWYsIGNvdW50KTsKKworCWlmICghZ2JXcml0ZUVuYWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocCA8IDY0ICogMTAyNCAmJiAoIWdiV3JpdGVCYXNlNjRFbmFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogY2hlY2sgZm9yIG91dCBvZiByYW5nZSBwb3Mgb3IgY291bnQKKwkgKi8KKwlpZiAocCA+PSBnYkZsYXNoU2l6ZSkKKwkJcmV0dXJuIGNvdW50ID8gLUVOWElPIDogMDsKKworCWlmIChjb3VudCA+IGdiRmxhc2hTaXplIC0gcCkKKwkJY291bnQgPSBnYkZsYXNoU2l6ZSAtIHA7CisJCQkKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBXZSBub3cgbG9jayBhZ2FpbnN0IHJlYWRzIGFuZCB3cml0ZXMuIC0tcm1rCisJICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbndmbGFzaF9zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJd3JpdHRlbiA9IDA7CisKKwlsZWRzX2V2ZW50KGxlZF9jbGFpbSk7CisJbGVkc19ldmVudChsZWRfZ3JlZW5fb24pOworCisJbkJsb2NrID0gKGludCkgcCA+PiAxNjsJLy9ibG9jayAjIG9mIDY0SyBieXRlcworCisJLyoKKwkgKiAjIG9mIDY0SyBibG9ja3MgdG8gZXJhc2UgYW5kIHdyaXRlCisJICovCisJdGVtcCA9ICgoaW50KSAocCArIGNvdW50KSA+PiAxNikgLSBuQmxvY2sgKyAxOworCisJLyoKKwkgKiB3cml0ZSBlbmRzIGF0IGV4YWN0bHkgNjRrIGJvdW5kYXJ5PworCSAqLworCWlmICgoKGludCkgKHAgKyBjb3VudCkgJiAweEZGRkYpID09IDApCisJCXRlbXAgLT0gMTsKKworCWlmIChmbGFzaGRlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZmxhc2hfd3JpdGU6IHdyaXRpbmcgJWQgYmxvY2socykgIgorCQkJInN0YXJ0aW5nIGF0ICVkLlxuIiwgdGVtcCwgbkJsb2NrKTsKKworCWZvciAoOyB0ZW1wOyB0ZW1wLS0sIG5CbG9jaysrKSB7CisJCWlmIChmbGFzaGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImZsYXNoX3dyaXRlOiBlcmFzaW5nIGJsb2NrICVkLlxuIiwgbkJsb2NrKTsKKworCQkvKgorCQkgKiBmaXJzdCB3ZSBoYXZlIHRvIGVyYXNlIHRoZSBibG9jayhzKSwgd2hlcmUgd2Ugd2lsbCB3cml0ZS4uLgorCQkgKi8KKwkJaSA9IDA7CisJCWogPSAwOworCSAgUmV0cnlCbG9jazoKKwkJZG8geworCQkJcmMgPSBlcmFzZV9ibG9jayhuQmxvY2spOworCQkJaSsrOworCQl9IHdoaWxlIChyYyAmJiBpIDwgMTApOworCisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJmbGFzaF93cml0ZTogZXJhc2UgZXJyb3IgJXhcbiIsIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmbGFzaGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImZsYXNoX3dyaXRlOiB3cml0aW5nIG9mZnNldCAlbFgsICIKKwkJCSAgICAgICAiZnJvbSBidWYgJXAsIGJ5dGVzIGxlZnQgJVguXG4iLCBwLCBidWYsCisJCQkgICAgICAgY291bnQgLSB3cml0dGVuKTsKKworCQkvKgorCQkgKiB3cml0ZV9ibG9jayB3aWxsIGxpbWl0IHdyaXRlIHRvIHNwYWNlIGxlZnQgaW4gdGhpcyBibG9jaworCQkgKi8KKwkJcmMgPSB3cml0ZV9ibG9jayhwLCBidWYsIGNvdW50IC0gd3JpdHRlbik7CisJCWorKzsKKworCQkvKgorCQkgKiBpZiBzb21laG93IHdyaXRlIHZlcmlmeSBmYWlsZWQ/IENhbid0IGhhcHBlbj8/CisJCSAqLworCQlpZiAoIXJjKSB7CisJCQkvKgorCQkJICogcmV0cnkgdXAgdG8gMTAgdGltZXMKKwkJCSAqLworCQkJaWYgKGogPCAxMCkKKwkJCQlnb3RvIFJldHJ5QmxvY2s7CisJCQllbHNlCisJCQkJLyoKKwkJCQkgKiBlbHNlIHF1aXQgd2l0aCBlcnJvci4uLgorCQkJCSAqLworCQkJCXJjID0gLTE7CisKKwkJfQorCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImZsYXNoX3dyaXRlOiB3cml0ZSBlcnJvciAlWFxuIiwgcmMpOworCQkJYnJlYWs7CisJCX0KKwkJcCArPSByYzsKKwkJYnVmICs9IHJjOworCQl3cml0dGVuICs9IHJjOworCQkqcHBvcyArPSByYzsKKworCQlpZiAoZmxhc2hkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICJmbGFzaF93cml0ZTogd3JpdHRlbiAweCVYIGJ5dGVzIE9LLlxuIiwgd3JpdHRlbik7CisJfQorCisJLyoKKwkgKiByZXN0b3JlIHJlZyBvbiBleGl0CisJICovCisJbGVkc19ldmVudChsZWRfcmVsZWFzZSk7CisKKwl1cCgmbndmbGFzaF9zZW0pOworCisJcmV0dXJuIHdyaXR0ZW47Cit9CisKKworLyoKKyAqIFRoZSBtZW1vcnkgZGV2aWNlcyB1c2UgdGhlIGZ1bGwgMzIvNjQgYml0cyBvZiB0aGUgb2Zmc2V0LCBhbmQgc28gd2UgY2Fubm90CisgKiBjaGVjayBhZ2FpbnN0IG5lZ2F0aXZlIGFkZHJlc3NlczogdGhleSBhcmUgb2suIFRoZSByZXR1cm4gdmFsdWUgaXMgd2VpcmQsCisgKiB0aG91Z2gsIGluIHRoYXQgY2FzZSAoMCkuCisgKgorICogYWxzbyBub3RlIHRoYXQgc2Vla2luZyByZWxhdGl2ZSB0byB0aGUgImVuZCBvZiBmaWxlIiBpc24ndCBzdXBwb3J0ZWQ6CisgKiBpdCBoYXMgbm8gbWVhbmluZywgc28gaXQgcmV0dXJucyAtRUlOVkFMLgorICovCitzdGF0aWMgbG9mZl90IGZsYXNoX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJbG9mZl90IHJldDsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZsYXNoZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICJmbGFzaF9sbHNlZWs6IG9mZnNldD0weCVYLCBvcmlnPTB4JVguXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludCkgb2Zmc2V0LCBvcmlnKTsKKworCXN3aXRjaCAob3JpZykgeworCWNhc2UgMDoKKwkJaWYgKG9mZnNldCA8IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgodW5zaWduZWQgaW50KSBvZmZzZXQgPiBnYkZsYXNoU2l6ZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJZmlsZS0+Zl9wb3MgPSAodW5zaWduZWQgaW50KSBvZmZzZXQ7CisJCXJldCA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDE6CisJCWlmICgoZmlsZS0+Zl9wb3MgKyBvZmZzZXQpID4gZ2JGbGFzaFNpemUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGZpbGUtPmZfcG9zICsgb2Zmc2V0KSA8IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJCXJldCA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogYXNzdW1lIHRoYXQgbWFpbiBXcml0ZSByb3V0aW5lIGRpZCB0aGUgcGFyYW1ldGVyIGNoZWNraW5nLi4uCisgKiBzbyBqdXN0IGdvIGFoZWFkIGFuZCBlcmFzZSwgd2hhdCByZXF1ZXN0ZWQhCisgKi8KKworc3RhdGljIGludCBlcmFzZV9ibG9jayhpbnQgbkJsb2NrKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjMTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwV3JpdGVQdHI7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCB0ZW1wLCB0ZW1wMTsKKworCS8qCisJICogb3JhbmdlIExFRCA9PSBlcmFzZQorCSAqLworCWxlZHNfZXZlbnQobGVkX2FtYmVyX29uKTsKKworCS8qCisJICogcmVzZXQgZm9vdGJyaWRnZSB0byB0aGUgY29ycmVjdCBvZmZzZXQgMCAoLi4uMC4uMykKKwkgKi8KKwkqQ1NSX1JPTVdSSVRFUkVHID0gMDsKKworCS8qCisJICogZHVtbXkgUk9NIHJlYWQKKwkgKi8KKwljMSA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCk7CisKKwlraWNrX29wZW4oKTsKKwkvKgorCSAqIHJlc2V0IHN0YXR1cyBpZiBvbGQgZXJyb3JzCisJICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4NTA7CisKKwkvKgorCSAqIGVyYXNlIGEgYmxvY2suLi4KKwkgKiBhaW0gYXQgdGhlIG1pZGRsZSBvZiBhIGN1cnJlbnQgYmxvY2suLi4KKwkgKi8KKwlwV3JpdGVQdHIgPSAodW5zaWduZWQgY2hhciAqKSAoKHVuc2lnbmVkIGludCkgKEZMQVNIX0JBU0UgKyAweDgwMDAgKyAobkJsb2NrIDw8IDE2KSkpOworCS8qCisJICogZHVtbXkgcmVhZAorCSAqLworCWMxID0gKnBXcml0ZVB0cjsKKworCWtpY2tfb3BlbigpOworCS8qCisJICogZXJhc2UKKwkgKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgcFdyaXRlUHRyID0gMHgyMDsKKworCS8qCisJICogY29uZmlybQorCSAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBwV3JpdGVQdHIgPSAweEQwOworCisJLyoKKwkgKiB3YWl0IDEwIG1zCisJICovCisJbXNsZWVwKDEwKTsKKworCS8qCisJICogd2FpdCB3aGlsZSBlcmFzaW5nIGluIHByb2Nlc3MgKHVwIHRvIDEwIHNlYykKKwkgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIDEwICogSFo7CisJYzEgPSAwOworCXdoaWxlICghKGMxICYgMHg4MCkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJbXNsZWVwKDEwKTsKKwkJLyoKKwkJICogcmVhZCBhbnkgYWRkcmVzcworCQkgKi8KKwkJYzEgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKHBXcml0ZVB0cik7CisJCS8vICAgICAgICAgICAgICBwcmludGsoIkZsYXNoX2VyYXNlOiBzdGF0dXM9JVguXG4iLGMxKTsKKwl9CisKKwkvKgorCSAqIHNldCBmbGFzaCBmb3Igbm9ybWFsIHJlYWQgYWNjZXNzCisJICovCisJa2lja19vcGVuKCk7CisvLyAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopKEZMQVNIX0JBU0UrMHg4MDAwKSA9IDB4RkY7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIHBXcml0ZVB0ciA9IDB4RkY7CS8vYmFjayB0byBub3JtYWwgb3BlcmF0aW9uCisKKwkvKgorCSAqIGNoZWNrIGlmIGVyYXNlIGVycm9ycyB3ZXJlIHJlcG9ydGVkCisJICovCisJaWYgKGMxICYgMHgyMCkgeworCQlwcmludGsoS0VSTl9FUlIgImZsYXNoX2VyYXNlOiBlcnIgYXQgJXBcbiIsIHBXcml0ZVB0cik7CisKKwkJLyoKKwkJICogcmVzZXQgZXJyb3IKKwkJICovCisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCkgPSAweDUwOworCQlyZXR1cm4gLTI7CisJfQorCisJLyoKKwkgKiBqdXN0IHRvIG1ha2Ugc3VyZSAtIHZlcmlmeSBpZiBlcmFzZWQgT0suLi4KKwkgKi8KKwltc2xlZXAoMTApOworCisJcFdyaXRlUHRyID0gKHVuc2lnbmVkIGNoYXIgKikgKCh1bnNpZ25lZCBpbnQpIChGTEFTSF9CQVNFICsgKG5CbG9jayA8PCAxNikpKTsKKworCWZvciAodGVtcCA9IDA7IHRlbXAgPCAxNiAqIDEwMjQ7IHRlbXArKywgcFdyaXRlUHRyICs9IDQpIHsKKwkJaWYgKCh0ZW1wMSA9ICoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIHBXcml0ZVB0cikgIT0gMHhGRkZGRkZGRikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJmbGFzaF9lcmFzZTogdmVyaWZ5IGVyciBhdCAlcCA9ICVYXG4iLAorCQkJICAgICAgIHBXcml0ZVB0ciwgdGVtcDEpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIHdyaXRlX2Jsb2NrIHdpbGwgbGltaXQgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIHNwYWNlIGluIHRoaXMgYmxvY2sKKyAqLworc3RhdGljIGludCB3cml0ZV9ibG9jayh1bnNpZ25lZCBsb25nIHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgYzE7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGMyOworCXVuc2lnbmVkIGNoYXIgKnBXcml0ZVB0cjsKKwl1bnNpZ25lZCBpbnQgdUFkZHJlc3M7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0MTsKKworCS8qCisJICogcmVkIExFRCA9PSB3cml0ZQorCSAqLworCWxlZHNfZXZlbnQobGVkX2FtYmVyX29mZik7CisJbGVkc19ldmVudChsZWRfcmVkX29uKTsKKworCXBXcml0ZVB0ciA9ICh1bnNpZ25lZCBjaGFyICopICgodW5zaWduZWQgaW50KSAoRkxBU0hfQkFTRSArIHApKTsKKworCS8qCisJICogY2hlY2sgaWYgd3JpdGUgd2lsbCBlbmQgaW4gdGhpcyBibG9jay4uLi4KKwkgKi8KKwlvZmZzZXQgPSBwICYgMHhGRkZGOworCisJaWYgKG9mZnNldCArIGNvdW50ID4gMHgxMDAwMCkKKwkJY291bnQgPSAweDEwMDAwIC0gb2Zmc2V0OworCisJLyoKKwkgKiB3YWl0IHVwIHRvIDMwIHNlYyBmb3IgdGhpcyBibG9jaworCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgMzAgKiBIWjsKKworCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY291bnQ7IG9mZnNldCsrLCBwV3JpdGVQdHIrKykgeworCQl1QWRkcmVzcyA9ICh1bnNpZ25lZCBpbnQpIHBXcml0ZVB0cjsKKwkJdUFkZHJlc3MgJj0gMHhGRkZGRkZGQzsKKwkJaWYgKF9fZ2V0X3VzZXIoYzIsIGJ1ZiArIG9mZnNldCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCSAgV3JpdGVSZXRyeToKKwkgIAkvKgorCSAgCSAqIGR1bW15IHJlYWQKKwkgIAkgKi8KKwkJYzEgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAweDgwMDApOworCisJCS8qCisJCSAqIGtpY2sgb3BlbiB0aGUgd3JpdGUgZ2F0ZQorCQkgKi8KKwkJa2lja19vcGVuKCk7CisKKwkJLyoKKwkJICogcHJvZ3JhbSBmb290YnJpZGdlIHRvIHRoZSBjb3JyZWN0IG9mZnNldC4uLjAuLjMKKwkJICovCisJCSpDU1JfUk9NV1JJVEVSRUcgPSAodW5zaWduZWQgaW50KSBwV3JpdGVQdHIgJiAzOworCisJCS8qCisJCSAqIHdyaXRlIGNtZAorCQkgKi8KKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopICh1QWRkcmVzcykgPSAweDQwOworCisJCS8qCisJCSAqIGRhdGEgdG8gd3JpdGUKKwkJICovCisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAodUFkZHJlc3MpID0gYzI7CisKKwkJLyoKKwkJICogZ2V0IHN0YXR1cworCQkgKi8KKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHgxMDAwMCkgPSAweDcwOworCisJCWMxID0gMDsKKworCQkvKgorCQkgKiB3YWl0IHVwIHRvIDEgc2VjIGZvciB0aGlzIGJ5dGUKKwkJICovCisJCXRpbWVvdXQxID0gamlmZmllcyArIDEgKiBIWjsKKworCQkvKgorCQkgKiB3aGlsZSBub3QgcmVhZHkuLi4KKwkJICovCisJCXdoaWxlICghKGMxICYgMHg4MCkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dDEpKQorCQkJYzEgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEZMQVNIX0JBU0UgKyAweDgwMDApOworCisJCS8qCisJCSAqIGlmIHRpbWVvdXQgZ2V0dGluZyBzdGF0dXMKKwkJICovCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQxKSkgeworCQkJa2lja19vcGVuKCk7CisJCQkvKgorCQkJICogcmVzZXQgZXJyCisJCQkgKi8KKwkJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRkxBU0hfQkFTRSArIDB4ODAwMCkgPSAweDUwOworCisJCQlnb3RvIFdyaXRlUmV0cnk7CisJCX0KKwkJLyoKKwkJICogc3dpdGNoIG9uIHJlYWQgYWNjZXNzLCBhcyBhIGRlZmF1bHQgZmxhc2ggb3BlcmF0aW9uIG1vZGUKKwkJICovCisJCWtpY2tfb3BlbigpOworCQkvKgorCQkgKiByZWFkIGFjY2VzcworCQkgKi8KKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4RkY7CisKKwkJLyoKKwkJICogaWYgaGFyZHdhcmUgcmVwb3J0cyBhbiBlcnJvciB3cml0aW5nLCBhbmQgbm90IHRpbWVvdXQgLSAKKwkJICogcmVzZXQgdGhlIGNoaXAgYW5kIHJldHJ5CisJCSAqLworCQlpZiAoYzEgJiAweDEwKSB7CisJCQlraWNrX29wZW4oKTsKKwkJCS8qCisJCQkgKiByZXNldCBlcnIKKwkJCSAqLworCQkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChGTEFTSF9CQVNFICsgMHg4MDAwKSA9IDB4NTA7CisKKwkJCS8qCisJCQkgKiBiZWZvcmUgdGltZW91dD8KKwkJCSAqLworCQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJaWYgKGZsYXNoZGVidWcpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJ3cml0ZV9ibG9jazogUmV0cnlpbmcgd3JpdGUgYXQgMHglWCluIiwKKwkJCQkJICAgICAgIHBXcml0ZVB0ciAtIEZMQVNIX0JBU0UpOworCisJCQkJLyoKKwkJCQkgKiBubyBMRUQgPT0gd2FpdGluZworCQkJCSAqLworCQkJCWxlZHNfZXZlbnQobGVkX2FtYmVyX29mZik7CisJCQkJLyoKKwkJCQkgKiB3YWl0IGNvdXBsZSBtcworCQkJCSAqLworCQkJCW1zbGVlcCgxMCk7CisJCQkJLyoKKwkJCQkgKiByZWQgTEVEID09IHdyaXRlCisJCQkJICovCisJCQkJbGVkc19ldmVudChsZWRfcmVkX29uKTsKKworCQkJCWdvdG8gV3JpdGVSZXRyeTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ3cml0ZV9ibG9jazogdGltZW91dCBhdCAweCVYXG4iLAorCQkJCSAgICAgICBwV3JpdGVQdHIgLSBGTEFTSF9CQVNFKTsKKwkJCQkvKgorCQkJCSAqIHJldHVybiBlcnJvciAtMgorCQkJCSAqLworCQkJCXJldHVybiAtMjsKKworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBncmVlbiBMRUQgPT0gcmVhZC92ZXJpZnkKKwkgKi8KKwlsZWRzX2V2ZW50KGxlZF9hbWJlcl9vZmYpOworCWxlZHNfZXZlbnQobGVkX2dyZWVuX29uKTsKKworCW1zbGVlcCgxMCk7CisKKwlwV3JpdGVQdHIgPSAodW5zaWduZWQgY2hhciAqKSAoKHVuc2lnbmVkIGludCkgKEZMQVNIX0JBU0UgKyBwKSk7CisKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGNvdW50OyBvZmZzZXQrKykgeworCQljaGFyIGMsIGMxOworCQlpZiAoX19nZXRfdXNlcihjLCBidWYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJ1ZisrOworCQlpZiAoKGMxID0gKnBXcml0ZVB0cisrKSAhPSBjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIndyaXRlX2Jsb2NrOiB2ZXJpZnkgZXJyb3IgYXQgMHglWCAoJTAyWCE9JTAyWClcbiIsCisJCQkgICAgICAgcFdyaXRlUHRyIC0gRkxBU0hfQkFTRSwgYzEsIGMpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHZvaWQga2lja19vcGVuKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogd2Ugd2FudCB0byB3cml0ZSBhIGJpdCBwYXR0ZXJuIFhYWDEgdG8gWGlsaW54IHRvIGVuYWJsZQorCSAqIHRoZSB3cml0ZSBnYXRlLCB3aGljaCB3aWxsIGJlIG9wZW4gZm9yIGFib3V0IHRoZSBuZXh0IDJtcy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJY3BsZF9tb2RpZnkoMSwgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIGxldCB0aGUgSVNBIGJ1cyB0byBjYXRjaCBvbi4uLgorCSAqLworCXVkZWxheSgyNSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZsYXNoX2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IGZsYXNoX2xsc2VlaywKKwkucmVhZAkJPSBmbGFzaF9yZWFkLAorCS53cml0ZQkJPSBmbGFzaF93cml0ZSwKKwkuaW9jdGwJCT0gZmxhc2hfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZmxhc2hfbWlzY2RldiA9Cit7CisJRkxBU0hfTUlOT1IsCisJIm53Zmxhc2giLAorCSZmbGFzaF9mb3BzCit9OworCitzdGF0aWMgaW50IF9faW5pdCBud2ZsYXNoX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpKSB7CisJCWludCBpZDsKKworCQlGTEFTSF9CQVNFID0gaW9yZW1hcChEQzIxMjg1X0ZMQVNILCBLRkxBU0hfU0laRTQpOworCQlpZiAoIUZMQVNIX0JBU0UpCisJCQlnb3RvIG91dDsKKworCQlpZCA9IGdldF9mbGFzaF9pZCgpOworCQlpZiAoKGlkICE9IEtGTEFTSF9JRCkgJiYgKGlkICE9IEtGTEFTSF9JRDQpKSB7CisJCQlyZXQgPSAtRU5YSU87CisJCQlpb3VubWFwKCh2b2lkICopRkxBU0hfQkFTRSk7CisJCQlwcmludGsoIkZsYXNoOiBpbmNvcnJlY3QgSUQgMHglMDRYLlxuIiwgaWQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlwcmludGsoIkZsYXNoIFJPTSBkcml2ZXIgdi4lcywgZmxhc2ggZGV2aWNlIElEIDB4JTA0WCwgc2l6ZSAlZCBNYi5cbiIsCisJCSAgICAgICBOV0ZMQVNIX1ZFUlNJT04sIGlkLCBnYkZsYXNoU2l6ZSAvICgxMDI0ICogMTAyNCkpOworCisJCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmZsYXNoX21pc2NkZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJaW91bm1hcCgodm9pZCAqKUZMQVNIX0JBU0UpOworCQl9CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBud2ZsYXNoX2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmZsYXNoX21pc2NkZXYpOworCWlvdW5tYXAoKHZvaWQgKilGTEFTSF9CQVNFKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oZmxhc2hkZWJ1ZywgYm9vbCwgMDY0NCk7CisKK21vZHVsZV9pbml0KG53Zmxhc2hfaW5pdCk7Cittb2R1bGVfZXhpdChud2ZsYXNoX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmJmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL0tjb25maWcKQEAgLTAsMCArMSwyMiBAQAorIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIlBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIEhPVFBMVUcgJiYgUENNQ0lBIT1uCisKK2NvbmZpZyBTWU5DTElOS19DUworCXRyaXN0YXRlICJTeW5jTGluayBQQyBDYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ01DSUEKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFN5bmNMaW5rIFBDIENhcmQgc2VyaWFsIGFkYXB0ZXIsIHJ1bm5pbmcKKwkgIGFzeW5jaHJvbm91cyBhbmQgSERMQyBjb21tdW5pY2F0aW9ucyB1cCB0byA1MTJLYnBzLiBUaGUgcG9ydCBpcworCSAgc2VsZWN0YWJsZSBmb3IgUlMtMjMyLCBWLjM1LCBSUy00NDksIFJTLTUzMCwgYW5kIFguMjEKKworCSAgVGhpcyBkcml2ZXIgbWF5IGJlIGJ1aWx0IGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzeW5jbGlua21wLiAgSWYgeW91IHdhbnQgdG8gZG8gdGhhdCwgc2F5IE0KKwkgIGhlcmUuCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9wY21jaWEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIGRyaXZlcnMvY2hhci9wY21jaWEvTWFrZWZpbGUKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBQQ01DSUEgY2hhciBkZXZpY2UgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX1NZTkNMSU5LX0NTKSArPSBzeW5jbGlua19jcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4ZDg2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwpAQCAtMCwwICsxLDQ2MTEgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKKyAqCisgKiAkSWQ6IHN5bmNsaW5rX2NzLmMsdiA0LjI2IDIwMDQvMDgvMTEgMTk6MzA6MDIgcGF1bGtmIEV4cCAkCisgKgorICogRGV2aWNlIGRyaXZlciBmb3IgTWljcm9nYXRlIFN5bmNMaW5rIFBDIENhcmQKKyAqIG11bHRpcHJvdG9jb2wgc2VyaWFsIGFkYXB0ZXIuCisgKgorICogd3JpdHRlbiBieSBQYXVsIEZ1bGdodW0gZm9yIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICogcGF1bGtmQG1pY3JvZ2F0ZS5jb20KKyAqCisgKiBNaWNyb2dhdGUgYW5kIFN5bmNMaW5rIGFyZSB0cmFkZW1hcmtzIG9mIE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZSBWRVJTSU9OKHZlcixyZWwsc2VxKSAoKCh2ZXIpPDwxNikgfCAoKHJlbCk8PDgpIHwgKHNlcSkpCisjaWYgZGVmaW5lZChfX2kzODZfXykKKyMgIGRlZmluZSBCUkVBS1BPSU5UKCkgYXNtKCIgICBpbnQgJDMiKTsKKyNlbHNlCisjICBkZWZpbmUgQlJFQUtQT0lOVCgpIHsgfQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0RFVklDRV9DT1VOVCA0CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpZmRlZiBDT05GSUdfSERMQ19NT0RVTEUKKyNkZWZpbmUgQ09ORklHX0hETEMgMQorI2VuZGlmCisKKyNkZWZpbmUgR0VUX1VTRVIoZXJyb3IsdmFsdWUsYWRkcikgZXJyb3IgPSBnZXRfdXNlcih2YWx1ZSxhZGRyKQorI2RlZmluZSBDT1BZX0ZST01fVVNFUihlcnJvcixkZXN0LHNyYyxzaXplKSBlcnJvciA9IGNvcHlfZnJvbV91c2VyKGRlc3Qsc3JjLHNpemUpID8gLUVGQVVMVCA6IDAKKyNkZWZpbmUgUFVUX1VTRVIoZXJyb3IsdmFsdWUsYWRkcikgZXJyb3IgPSBwdXRfdXNlcih2YWx1ZSxhZGRyKQorI2RlZmluZSBDT1BZX1RPX1VTRVIoZXJyb3IsZGVzdCxzcmMsc2l6ZSkgZXJyb3IgPSBjb3B5X3RvX3VzZXIoZGVzdCxzcmMsc2l6ZSkgPyAtRUZBVUxUIDogMAorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImxpbnV4L3N5bmNsaW5rLmgiCisKK3N0YXRpYyBNR1NMX1BBUkFNUyBkZWZhdWx0X3BhcmFtcyA9IHsKKwlNR1NMX01PREVfSERMQywJCQkvKiB1bnNpZ25lZCBsb25nIG1vZGUgKi8KKwkwLAkJCQkvKiB1bnNpZ25lZCBjaGFyIGxvb3BiYWNrOyAqLworCUhETENfRkxBR19VTkRFUlJVTl9BQk9SVDE1LAkvKiB1bnNpZ25lZCBzaG9ydCBmbGFnczsgKi8KKwlIRExDX0VOQ09ESU5HX05SWklfU1BBQ0UsCS8qIHVuc2lnbmVkIGNoYXIgZW5jb2Rpbmc7ICovCisJMCwJCQkJLyogdW5zaWduZWQgbG9uZyBjbG9ja19zcGVlZDsgKi8KKwkweGZmLAkJCQkvKiB1bnNpZ25lZCBjaGFyIGFkZHJfZmlsdGVyOyAqLworCUhETENfQ1JDXzE2X0NDSVRULAkJLyogdW5zaWduZWQgc2hvcnQgY3JjX3R5cGU7ICovCisJSERMQ19QUkVBTUJMRV9MRU5HVEhfOEJJVFMsCS8qIHVuc2lnbmVkIGNoYXIgcHJlYW1ibGVfbGVuZ3RoOyAqLworCUhETENfUFJFQU1CTEVfUEFUVEVSTl9OT05FLAkvKiB1bnNpZ25lZCBjaGFyIHByZWFtYmxlOyAqLworCTk2MDAsCQkJCS8qIHVuc2lnbmVkIGxvbmcgZGF0YV9yYXRlOyAqLworCTgsCQkJCS8qIHVuc2lnbmVkIGNoYXIgZGF0YV9iaXRzOyAqLworCTEsCQkJCS8qIHVuc2lnbmVkIGNoYXIgc3RvcF9iaXRzOyAqLworCUFTWU5DX1BBUklUWV9OT05FCQkvKiB1bnNpZ25lZCBjaGFyIHBhcml0eTsgKi8KK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWNoYXIgZGF0YVsxXTsKK30gUlhCVUY7CisKKy8qIFRoZSBxdWV1ZSBvZiBCSCBhY3Rpb25zIHRvIGJlIHBlcmZvcm1lZCAqLworCisjZGVmaW5lIEJIX1JFQ0VJVkUgIDEKKyNkZWZpbmUgQkhfVFJBTlNNSVQgMgorI2RlZmluZSBCSF9TVEFUVVMgICA0CisKKyNkZWZpbmUgSU9fUElOX1NIVVRET1dOX0xJTUlUIDEwMAorCisjZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKKworc3RydWN0IF9pbnB1dF9zaWduYWxfZXZlbnRzIHsKKwlpbnQJcmlfdXA7CQorCWludAlyaV9kb3duOworCWludAlkc3JfdXA7CisJaW50CWRzcl9kb3duOworCWludAlkY2RfdXA7CisJaW50CWRjZF9kb3duOworCWludAljdHNfdXA7CisJaW50CWN0c19kb3duOworfTsKKworCisvKgorICogRGV2aWNlIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlCisgKi8KKyAKK3R5cGVkZWYgc3RydWN0IF9tZ3NscGNfaW5mbyB7CisJdm9pZCAqaWZfcHRyOwkvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAodXNlZCBieSBTUFBQKSAqLworCWludAkJCW1hZ2ljOworCWludAkJCWZsYWdzOworCWludAkJCWNvdW50OwkJLyogY291bnQgb2Ygb3BlbnMgKi8KKwlpbnQJCQlsaW5lOworCXVuc2lnbmVkIHNob3J0CQljbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OwkvKiB0aW1lIHRvIHdhaXQgYmVmb3JlIGNsb3NpbmcgKi8KKwkKKwlzdHJ1Y3QgbWdzbF9pY291bnQJaWNvdW50OworCQorCXN0cnVjdCB0dHlfc3RydWN0IAkqdHR5OworCWludAkJCXRpbWVvdXQ7CisJaW50CQkJeF9jaGFyOwkJLyogeG9uL3hvZmYgY2hhcmFjdGVyICovCisJaW50CQkJYmxvY2tlZF9vcGVuOwkvKiAjIG9mIGJsb2NrZWQgb3BlbnMgKi8KKwl1bnNpZ25lZCBjaGFyCQlyZWFkX3N0YXR1c19tYXNrOworCXVuc2lnbmVkIGNoYXIJCWlnbm9yZV9zdGF0dXNfbWFzazsJCisKKwl1bnNpZ25lZCBjaGFyICp0eF9idWY7CisJaW50ICAgICAgICAgICAgdHhfcHV0OworCWludCAgICAgICAgICAgIHR4X2dldDsKKwlpbnQgICAgICAgICAgICB0eF9jb3VudDsKKworCS8qIGNpcmN1bGFyIGxpc3Qgb2YgZml4ZWQgbGVuZ3RoIHJ4IGJ1ZmZlcnMgKi8KKworCXVuc2lnbmVkIGNoYXIgICpyeF9idWY7ICAgICAgICAvKiBtZW1vcnkgYWxsb2NhdGVkIGZvciBhbGwgcnggYnVmZmVycyAqLworCWludCAgICAgICAgICAgIHJ4X2J1Zl90b3RhbF9zaXplOyAvKiBzaXplIG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHJ4IGJ1ZmZlcnMgKi8KKwlpbnQgICAgICAgICAgICByeF9wdXQ7ICAgICAgICAgLyogaW5kZXggb2YgbmV4dCBlbXB0eSByeCBidWZmZXIgKi8KKwlpbnQgICAgICAgICAgICByeF9nZXQ7ICAgICAgICAgLyogaW5kZXggb2YgbmV4dCBmdWxsIHJ4IGJ1ZmZlciAqLworCWludCAgICAgICAgICAgIHJ4X2J1Zl9zaXplOyAgICAvKiBzaXplIGluIGJ5dGVzIG9mIHNpbmdsZSByeCBidWZmZXIgKi8KKwlpbnQgICAgICAgICAgICByeF9idWZfY291bnQ7ICAgLyogdG90YWwgbnVtYmVyIG9mIHJ4IGJ1ZmZlcnMgKi8KKwlpbnQgICAgICAgICAgICByeF9mcmFtZV9jb3VudDsgLyogbnVtYmVyIG9mIGZ1bGwgcnggYnVmZmVycyAqLworCQorCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OworCQorCXdhaXRfcXVldWVfaGVhZF90CXN0YXR1c19ldmVudF93YWl0X3E7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZXZlbnRfd2FpdF9xOworCXN0cnVjdCB0aW1lcl9saXN0CXR4X3RpbWVyOwkvKiBIRExDIHRyYW5zbWl0IHRpbWVvdXQgdGltZXIgKi8KKwlzdHJ1Y3QgX21nc2xwY19pbmZvCSpuZXh0X2RldmljZTsJLyogZGV2aWNlIGxpc3QgbGluayAqLworCisJdW5zaWduZWQgc2hvcnQgaW1yYV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCBpbXJiX3ZhbHVlOworCXVuc2lnbmVkIGNoYXIgIHBpbV92YWx1ZTsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGFzazsJCS8qIHRhc2sgc3RydWN0dXJlIGZvciBzY2hlZHVsaW5nIGJoICovCisKKwl1MzIgbWF4X2ZyYW1lX3NpemU7CisKKwl1MzIgcGVuZGluZ19iaDsKKworCWludCBiaF9ydW5uaW5nOworCWludCBiaF9yZXF1ZXN0ZWQ7CisJCisJaW50IGRjZF9jaGtjb3VudDsgLyogY2hlY2sgY291bnRzIHRvIHByZXZlbnQgKi8KKwlpbnQgY3RzX2Noa2NvdW50OyAvKiB0b28gbWFueSBJUlFzIGlmIGEgc2lnbmFsICovCisJaW50IGRzcl9jaGtjb3VudDsgLyogaXMgZmxvYXRpbmcgKi8KKwlpbnQgcmlfY2hrY291bnQ7CisKKwlpbnQgcnhfZW5hYmxlZDsKKwlpbnQgcnhfb3ZlcmZsb3c7CisKKwlpbnQgdHhfZW5hYmxlZDsKKwlpbnQgdHhfYWN0aXZlOworCWludCB0eF9hYm9ydGluZzsKKwl1MzIgaWRsZV9tb2RlOworCisJaW50IGlmX21vZGU7IC8qIHNlcmlhbCBpbnRlcmZhY2Ugc2VsZWN0aW9uIChSUy0yMzIsIHYuMzUgZXRjKSAqLworCisJY2hhciBkZXZpY2VfbmFtZVsyNV07CQkvKiBkZXZpY2UgaW5zdGFuY2UgbmFtZSAqLworCisJdW5zaWduZWQgaW50IGlvX2Jhc2U7CS8qIGJhc2UgSS9PIGFkZHJlc3Mgb2YgYWRhcHRlciAqLworCXVuc2lnbmVkIGludCBpcnFfbGV2ZWw7CisJCisJTUdTTF9QQVJBTVMgcGFyYW1zOwkJLyogY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLworCisJdW5zaWduZWQgY2hhciBzZXJpYWxfc2lnbmFsczsJLyogY3VycmVudCBzZXJpYWwgc2lnbmFsIHN0YXRlcyAqLworCisJY2hhciBpcnFfb2NjdXJyZWQ7CQkvKiBmb3IgZGlhZ25vc3RpY3MgdXNlICovCisJY2hhciB0ZXN0aW5nX2lycTsKKwl1bnNpZ25lZCBpbnQgaW5pdF9lcnJvcjsJLyogc3RhcnR1cCBlcnJvciAoRElBR1MpCSovCisKKwljaGFyIGZsYWdfYnVmW01BWF9BU1lOQ19CVUZGRVJfU0laRV07CisJQk9PTEVBTiBkcm9wX3J0c19vbl90eF9kb25lOworCisJc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzCWlucHV0X3NpZ25hbF9ldmVudHM7CisKKwkvKiBQQ01DSUEgc3VwcG9ydCAqLworCWRldl9saW5rX3QJICAgICAgbGluazsKKwlkZXZfbm9kZV90CSAgICAgIG5vZGU7CisJaW50CQkgICAgICBzdG9wOworCisJLyogU1BQUC9DaXNjbyBIRExDIGRldmljZSBwYXJ0cyAqLworCWludCBuZXRjb3VudDsKKwlpbnQgZG9zeW5jcHBwOworCXNwaW5sb2NrX3QgbmV0bG9jazsKKworI2lmZGVmIENPTkZJR19IRExDCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKyNlbmRpZgorCit9IE1HU0xQQ19JTkZPOworCisjZGVmaW5lIE1HU0xQQ19NQUdJQyAweDU0MDIKKworLyoKKyAqIFRoZSBzaXplIG9mIHRoZSBzZXJpYWwgeG1pdCBidWZmZXIgaXMgMSBwYWdlLCBvciA0MDk2IGJ5dGVzCisgKi8KKyNkZWZpbmUgVFhCVUZTSVpFIDQwOTYKKworICAgIAorI2RlZmluZSBDSEEgICAgIDB4MDAgICAvKiBjaGFubmVsIEEgb2Zmc2V0ICovCisjZGVmaW5lIENIQiAgICAgMHg0MCAgIC8qIGNoYW5uZWwgQiBvZmZzZXQgKi8KKworLyoKKyAqICBGSVhNRTogUFBDIGhhcyBQVlIgZGVmaW5lZCBpbiBhc20vcmVnLmguICBGb3Igbm93IHdlIGp1c3QgdW5kZWYgaXQuCisgKi8KKyN1bmRlZiBQVlIKKworI2RlZmluZSBSWEZJRk8gIDAKKyNkZWZpbmUgVFhGSUZPICAwCisjZGVmaW5lIFNUQVIgICAgMHgyMAorI2RlZmluZSBDTURSICAgIDB4MjAKKyNkZWZpbmUgUlNUQSAgICAweDIxCisjZGVmaW5lIFBSRSAgICAgMHgyMQorI2RlZmluZSBNT0RFICAgIDB4MjIKKyNkZWZpbmUgVElNUiAgICAweDIzCisjZGVmaW5lIFhBRDEgICAgMHgyNAorI2RlZmluZSBYQUQyICAgIDB4MjUKKyNkZWZpbmUgUkFIMSAgICAweDI2CisjZGVmaW5lIFJBSDIgICAgMHgyNworI2RlZmluZSBEQUZPICAgIDB4MjcKKyNkZWZpbmUgUkFMMSAgICAweDI4CisjZGVmaW5lIFJGQyAgICAgMHgyOAorI2RlZmluZSBSSENSICAgIDB4MjkKKyNkZWZpbmUgUkFMMiAgICAweDI5CisjZGVmaW5lIFJCQ0wgICAgMHgyYQorI2RlZmluZSBYQkNMICAgIDB4MmEKKyNkZWZpbmUgUkJDSCAgICAweDJiCisjZGVmaW5lIFhCQ0ggICAgMHgyYgorI2RlZmluZSBDQ1IwICAgIDB4MmMKKyNkZWZpbmUgQ0NSMSAgICAweDJkCisjZGVmaW5lIENDUjIgICAgMHgyZQorI2RlZmluZSBDQ1IzICAgIDB4MmYKKyNkZWZpbmUgVlNUUiAgICAweDM0CisjZGVmaW5lIEJHUiAgICAgMHgzNAorI2RlZmluZSBSTENSICAgIDB4MzUKKyNkZWZpbmUgQU1MICAgICAweDM2CisjZGVmaW5lIEFNSCAgICAgMHgzNworI2RlZmluZSBHSVMgICAgIDB4MzgKKyNkZWZpbmUgSVZBICAgICAweDM4CisjZGVmaW5lIElQQyAgICAgMHgzOQorI2RlZmluZSBJU1IgICAgIDB4M2EKKyNkZWZpbmUgSU1SICAgICAweDNhCisjZGVmaW5lIFBWUiAgICAgMHgzYworI2RlZmluZSBQSVMgICAgIDB4M2QKKyNkZWZpbmUgUElNICAgICAweDNkCisjZGVmaW5lIFBDUiAgICAgMHgzZQorI2RlZmluZSBDQ1I0ICAgIDB4M2YKKyAgICAKKy8vIElNUi9JU1IKKyAgICAKKyNkZWZpbmUgSVJRX0JSRUFLX09OICAgIEJJVDE1ICAgLy8gcnggYnJlYWsgZGV0ZWN0ZWQKKyNkZWZpbmUgSVJRX0RBVEFPVkVSUlVOIEJJVDE0CS8vIHJlY2VpdmUgZGF0YSBvdmVyZmxvdworI2RlZmluZSBJUlFfQUxMU0VOVCAgICAgQklUMTMJLy8gYWxsIHNlbnQKKyNkZWZpbmUgSVJRX1VOREVSUlVOICAgIEJJVDEyCS8vIHRyYW5zbWl0IGRhdGEgdW5kZXJydW4KKyNkZWZpbmUgSVJRX1RJTUVSICAgICAgIEJJVDExCS8vIHRpbWVyIGludGVycnVwdAorI2RlZmluZSBJUlFfQ1RTICAgICAgICAgQklUMTAJLy8gQ1RTIHN0YXR1cyBjaGFuZ2UKKyNkZWZpbmUgSVJRX1RYUkVQRUFUICAgIEJJVDkJLy8gdHggbWVzc2FnZSByZXBlYXQKKyNkZWZpbmUgSVJRX1RYRklGTyAgICAgIEJJVDgJLy8gdHJhbnNtaXQgcG9vbCByZWFkeQorI2RlZmluZSBJUlFfUlhFT00gICAgICAgQklUNwkvLyByZWNlaXZlIG1lc3NhZ2UgZW5kCisjZGVmaW5lIElSUV9FWElUSFVOVCAgICBCSVQ2CS8vIHJlY2VpdmUgZnJhbWUgc3RhcnQKKyNkZWZpbmUgSVJRX1JYVElNRSAgICAgIEJJVDYgICAgLy8gcnggY2hhciB0aW1lb3V0CisjZGVmaW5lIElSUV9EQ0QgICAgICAgICBCSVQyCS8vIGNhcnJpZXIgZGV0ZWN0IHN0YXR1cyBjaGFuZ2UKKyNkZWZpbmUgSVJRX09WRVJSVU4gICAgIEJJVDEJLy8gcmVjZWl2ZSBmcmFtZSBvdmVyZmxvdworI2RlZmluZSBJUlFfUlhGSUZPICAgICAgQklUMAkvLyByZWNlaXZlIHBvb2wgZnVsbAorICAgIAorLy8gU1RBUgorICAgIAorI2RlZmluZSBYRlcgICBCSVQ2CQkvLyB0cmFuc21pdCBGSUZPIHdyaXRlIGVuYWJsZQorI2RlZmluZSBDRUMgICBCSVQyCQkvLyBjb21tYW5kIGV4ZWN1dGluZworI2RlZmluZSBDVFMgICBCSVQxCQkvLyBDVFMgc3RhdGUKKyAgICAKKyNkZWZpbmUgUFZSX0RUUiAgICAgIEJJVDAKKyNkZWZpbmUgUFZSX0RTUiAgICAgIEJJVDEKKyNkZWZpbmUgUFZSX1JJICAgICAgIEJJVDIKKyNkZWZpbmUgUFZSX0FVVE9DVFMgIEJJVDMKKyNkZWZpbmUgUFZSX1JTMjMyICAgIDB4MjAgICAvKiAwMDEwYiAqLworI2RlZmluZSBQVlJfVjM1ICAgICAgMHhlMCAgIC8qIDExMTBiICovCisjZGVmaW5lIFBWUl9SUzQyMiAgICAweDQwICAgLyogMDEwMGIgKi8KKyAgICAKKy8qIFJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8gCisgICAgCisjZGVmaW5lIHdyaXRlX3JlZyhpbmZvLCByZWcsIHZhbCkgb3V0YigodmFsKSwoaW5mbyktPmlvX2Jhc2UgKyAocmVnKSkKKyNkZWZpbmUgcmVhZF9yZWcoaW5mbywgcmVnKSBpbmIoKGluZm8pLT5pb19iYXNlICsgKHJlZykpCisKKyNkZWZpbmUgcmVhZF9yZWcxNihpbmZvLCByZWcpIGludygoaW5mbyktPmlvX2Jhc2UgKyAocmVnKSkgIAorI2RlZmluZSB3cml0ZV9yZWcxNihpbmZvLCByZWcsIHZhbCkgb3V0dygodmFsKSwgKGluZm8pLT5pb19iYXNlICsgKHJlZykpCisgICAgCisjZGVmaW5lIHNldF9yZWdfYml0cyhpbmZvLCByZWcsIG1hc2spIFwKKyAgICB3cml0ZV9yZWcoaW5mbywgKHJlZyksIFwKKwkJICh1bnNpZ25lZCBjaGFyKSAocmVhZF9yZWcoaW5mbywgKHJlZykpIHwgKG1hc2spKSkgIAorI2RlZmluZSBjbGVhcl9yZWdfYml0cyhpbmZvLCByZWcsIG1hc2spIFwKKyAgICB3cml0ZV9yZWcoaW5mbywgKHJlZyksIFwKKwkJICh1bnNpZ25lZCBjaGFyKSAocmVhZF9yZWcoaW5mbywgKHJlZykpICYgfihtYXNrKSkpICAKKy8qCisgKiBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUgcm91dGluZXMKKyAqLyAKK3N0YXRpYyB2b2lkIGlycV9kaXNhYmxlKE1HU0xQQ19JTkZPICppbmZvLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IG1hc2spIAoreworCWlmIChjaGFubmVsID09IENIQSkgeworCQlpbmZvLT5pbXJhX3ZhbHVlIHw9IG1hc2s7CisJCXdyaXRlX3JlZzE2KGluZm8sIENIQSArIElNUiwgaW5mby0+aW1yYV92YWx1ZSk7CisJfSBlbHNlIHsKKwkJaW5mby0+aW1yYl92YWx1ZSB8PSBtYXNrOworCQl3cml0ZV9yZWcxNihpbmZvLCBDSEIgKyBJTVIsIGluZm8tPmltcmJfdmFsdWUpOworCX0KK30KK3N0YXRpYyB2b2lkIGlycV9lbmFibGUoTUdTTFBDX0lORk8gKmluZm8sIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgbWFzaykgCit7CisJaWYgKGNoYW5uZWwgPT0gQ0hBKSB7CisJCWluZm8tPmltcmFfdmFsdWUgJj0gfm1hc2s7CisJCXdyaXRlX3JlZzE2KGluZm8sIENIQSArIElNUiwgaW5mby0+aW1yYV92YWx1ZSk7CisJfSBlbHNlIHsKKwkJaW5mby0+aW1yYl92YWx1ZSAmPSB+bWFzazsKKwkJd3JpdGVfcmVnMTYoaW5mbywgQ0hCICsgSU1SLCBpbmZvLT5pbXJiX3ZhbHVlKTsKKwl9Cit9CisKKyNkZWZpbmUgcG9ydF9pcnFfZGlzYWJsZShpbmZvLCBtYXNrKSBcCisgIHsgaW5mby0+cGltX3ZhbHVlIHw9IChtYXNrKTsgd3JpdGVfcmVnKGluZm8sIFBJTSwgaW5mby0+cGltX3ZhbHVlKTsgfQorCisjZGVmaW5lIHBvcnRfaXJxX2VuYWJsZShpbmZvLCBtYXNrKSBcCisgIHsgaW5mby0+cGltX3ZhbHVlICY9IH4obWFzayk7IHdyaXRlX3JlZyhpbmZvLCBQSU0sIGluZm8tPnBpbV92YWx1ZSk7IH0KKworc3RhdGljIHZvaWQgcnhfc3RhcnQoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgcnhfc3RvcChNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIHR4X3N0YXJ0KE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIHR4X3N0b3AoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgdHhfc2V0X2lkbGUoTUdTTFBDX0lORk8gKmluZm8pOworCitzdGF0aWMgdm9pZCBnZXRfc2lnbmFscyhNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBzZXRfc2lnbmFscyhNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIHJlc2V0X2RldmljZShNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIGhkbGNfbW9kZShNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBhc3luY19tb2RlKE1HU0xQQ19JTkZPICppbmZvKTsKKworc3RhdGljIHZvaWQgdHhfdGltZW91dCh1bnNpZ25lZCBsb25nIGNvbnRleHQpOworCitzdGF0aWMgaW50IGlvY3RsX2NvbW1vbihNR1NMUENfSU5GTyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisjaWZkZWYgQ09ORklHX0hETEMKKyNkZWZpbmUgZGV2X3RvX3BvcnQoRCkgKGRldl90b19oZGxjKEQpLT5wcml2KQorc3RhdGljIHZvaWQgaGRsY2Rldl90eF9kb25lKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGhkbGNkZXZfcngoTUdTTFBDX0lORk8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworc3RhdGljIGludCAgaGRsY2Rldl9pbml0KE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIGhkbGNkZXZfZXhpdChNR1NMUENfSU5GTyAqaW5mbyk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgdHJhY2VfYmxvY2soTUdTTFBDX0lORk8gKmluZm8sY29uc3QgY2hhciogZGF0YSwgaW50IGNvdW50LCBpbnQgeG1pdCk7CisKK3N0YXRpYyBCT09MRUFOIHJlZ2lzdGVyX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIEJPT0xFQU4gaXJxX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIGludCBhZGFwdGVyX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pOworCitzdGF0aWMgaW50IGNsYWltX3Jlc291cmNlcyhNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCByZWxlYXNlX3Jlc291cmNlcyhNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBtZ3NscGNfYWRkX2RldmljZShNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBtZ3NscGNfcmVtb3ZlX2RldmljZShNR1NMUENfSU5GTyAqaW5mbyk7CisKK3N0YXRpYyBpbnQgIHJ4X2dldF9mcmFtZShNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCByeF9yZXNldF9idWZmZXJzKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyBpbnQgIHJ4X2FsbG9jX2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIHZvaWQgcnhfZnJlZV9idWZmZXJzKE1HU0xQQ19JTkZPICppbmZvKTsKKworc3RhdGljIGlycXJldHVybl90IG1nc2xwY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworCisvKgorICogQm90dG9tIGhhbGYgaW50ZXJydXB0IGhhbmRsZXJzCisgKi8KK3N0YXRpYyB2b2lkIGJoX2hhbmRsZXIodm9pZCogQ29udGV4dCk7CitzdGF0aWMgdm9pZCBiaF90cmFuc21pdChNR1NMUENfSU5GTyAqaW5mbyk7CitzdGF0aWMgdm9pZCBiaF9zdGF0dXMoTUdTTFBDX0lORk8gKmluZm8pOworCisvKgorICogaW9jdGwgaGFuZGxlcnMKKyAqLworc3RhdGljIGludCB0aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IHRpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKK3N0YXRpYyBpbnQgZ2V0X3N0YXRzKE1HU0xQQ19JTkZPICppbmZvLCBzdHJ1Y3QgbWdzbF9pY291bnQgX191c2VyICp1c2VyX2ljb3VudCk7CitzdGF0aWMgaW50IGdldF9wYXJhbXMoTUdTTFBDX0lORk8gKmluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqdXNlcl9wYXJhbXMpOworc3RhdGljIGludCBzZXRfcGFyYW1zKE1HU0xQQ19JTkZPICppbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKm5ld19wYXJhbXMpOworc3RhdGljIGludCBnZXRfdHhpZGxlKE1HU0xQQ19JTkZPICppbmZvLCBpbnQgX191c2VyICppZGxlX21vZGUpOworc3RhdGljIGludCBzZXRfdHhpZGxlKE1HU0xQQ19JTkZPICppbmZvLCBpbnQgaWRsZV9tb2RlKTsKK3N0YXRpYyBpbnQgc2V0X3R4ZW5hYmxlKE1HU0xQQ19JTkZPICppbmZvLCBpbnQgZW5hYmxlKTsKK3N0YXRpYyBpbnQgdHhfYWJvcnQoTUdTTFBDX0lORk8gKmluZm8pOworc3RhdGljIGludCBzZXRfcnhlbmFibGUoTUdTTFBDX0lORk8gKmluZm8sIGludCBlbmFibGUpOworc3RhdGljIGludCB3YWl0X2V2ZW50cyhNR1NMUENfSU5GTyAqaW5mbywgaW50IF9fdXNlciAqbWFzayk7CisKK3N0YXRpYyBNR1NMUENfSU5GTyAqbWdzbHBjX2RldmljZV9saXN0ID0gTlVMTDsKK3N0YXRpYyBpbnQgbWdzbHBjX2RldmljZV9jb3VudCA9IDA7CisKKy8qCisgKiBTZXQgdGhpcyBwYXJhbSB0byBub24temVybyB0byBsb2FkIGVheCB3aXRoIHRoZQorICogLnRleHQgc2VjdGlvbiBhZGRyZXNzIGFuZCBicmVha3BvaW50IG9uIG1vZHVsZSBsb2FkLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHVzZSB3aXRoIGdkYiBhbmQgYWRkLXN5bWJvbC1maWxlIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgYnJlYWtfb25fbG9hZD0wOworCisvKgorICogRHJpdmVyIG1ham9yIG51bWJlciwgZGVmYXVsdHMgdG8gemVybyB0byBnZXQgYXV0bworICogYXNzaWduZWQgbWFqb3IgbnVtYmVyLiBNYXkgYmUgZm9yY2VkIGFzIG1vZHVsZSBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQgdHR5bWFqb3I9MDsKKworc3RhdGljIGludCBkZWJ1Z19sZXZlbCA9IDA7CitzdGF0aWMgaW50IG1heGZyYW1lW01BWF9ERVZJQ0VfQ09VTlRdID0gezAsfTsKK3N0YXRpYyBpbnQgZG9zeW5jcHBwW01BWF9ERVZJQ0VfQ09VTlRdID0gezEsMSwxLDF9OworCittb2R1bGVfcGFyYW0oYnJlYWtfb25fbG9hZCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0odHR5bWFqb3IsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWdfbGV2ZWwsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWF4ZnJhbWUsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG9zeW5jcHBwLCBpbnQsIE5VTEwsIDApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJTeW5jTGluayBQQyBDYXJkIGRyaXZlciI7CitzdGF0aWMgY2hhciAqZHJpdmVyX3ZlcnNpb24gPSAiJFJldmlzaW9uOiA0LjI2ICQiOworCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbF9kcml2ZXI7CisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4geG1pdCBidWZmZXIgYmVmb3JlIHdlIGFzayBmb3IgbW9yZSAqLworI2RlZmluZSBXQUtFVVBfQ0hBUlMgMjU2CisKK3N0YXRpYyB2b2lkIG1nc2xwY19jaGFuZ2VfcGFyYW1zKE1HU0xQQ19JTkZPICppbmZvKTsKK3N0YXRpYyB2b2lkIG1nc2xwY193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOworCisvKiBQQ01DSUEgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZCBtZ3NscGNfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgbWdzbHBjX3JlbGVhc2UodV9sb25nIGFyZyk7CitzdGF0aWMgaW50ICBtZ3NscGNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CitzdGF0aWMgZGV2X2xpbmtfdCAqbWdzbHBjX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIG1nc2xwY19kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAic3luY2xpbmtfY3MiOworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKKworLyoKKyAqIDFzdCBmdW5jdGlvbiBkZWZpbmVkIGluIC50ZXh0IHNlY3Rpb24uIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbgorICogaW5pdF9tb2R1bGUoKSBmb2xsb3dlZCBieSBhIGJyZWFrcG9pbnQgYWxsb3dzIGEgcmVtb3RlIGRlYnVnZ2VyCisgKiAoZ2RiKSB0byBnZXQgdGhlIC50ZXh0IGFkZHJlc3MgZm9yIHRoZSBhZGQtc3ltYm9sLWZpbGUgY29tbWFuZC4KKyAqIFRoaXMgYWxsb3dzIHJlbW90ZSBkZWJ1Z2dpbmcgb2YgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcy4KKyAqLworc3RhdGljIHZvaWQqIG1nc2xwY19nZXRfdGV4dF9wdHIodm9pZCkKK3sKKwlyZXR1cm4gbWdzbHBjX2dldF90ZXh0X3B0cjsKK30KKworLyoqCisgKiBsaW5lIGRpc2NpcGxpbmUgY2FsbGJhY2sgd3JhcHBlcnMKKyAqCisgKiBUaGUgd3JhcHBlcnMgbWFpbnRhaW4gbGluZSBkaXNjaXBsaW5lIHJlZmVyZW5jZXMKKyAqIHdoaWxlIGNhbGxpbmcgaW50byB0aGUgbGluZSBkaXNjaXBsaW5lLgorICoKKyAqIGxkaXNjX2ZsdXNoX2J1ZmZlciAtIGZsdXNoIGxpbmUgZGlzY2lwbGluZSByZWNlaXZlIGJ1ZmZlcnMKKyAqIGxkaXNjX3JlY2VpdmVfYnVmICAtIHBhc3MgcmVjZWl2ZSBkYXRhIHRvIGxpbmUgZGlzY2lwbGluZQorICovCisKK3N0YXRpYyB2b2lkIGxkaXNjX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfbGRpc2MgKmxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCWlmIChsZCkgeworCQlpZiAobGQtPmZsdXNoX2J1ZmZlcikKKwkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxkaXNjX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkgICAgICBjb25zdCBfX3U4ICpkYXRhLCBjaGFyICpmbGFncywgaW50IGNvdW50KQoreworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCWlmICghdHR5KQorCQlyZXR1cm47CisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGxkKSB7CisJCWlmIChsZC0+cmVjZWl2ZV9idWYpCisJCQlsZC0+cmVjZWl2ZV9idWYodHR5LCBkYXRhLCBmbGFncywgY291bnQpOworCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCX0KK30KKworc3RhdGljIGRldl9saW5rX3QgKm1nc2xwY19hdHRhY2godm9pZCkKK3sKKyAgICBNR1NMUENfSU5GTyAqaW5mbzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGludCByZXQ7CisgICAgCisgICAgaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJICAgIHByaW50aygibWdzbHBjX2F0dGFjaFxuIik7CisJCisgICAgaW5mbyA9IChNR1NMUENfSU5GTyAqKWttYWxsb2Moc2l6ZW9mKE1HU0xQQ19JTkZPKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFpbmZvKSB7CisJICAgIHByaW50aygiRXJyb3IgY2FuJ3QgYWxsb2NhdGUgZGV2aWNlIGluc3RhbmNlIGRhdGFcbiIpOworCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKE1HU0xQQ19JTkZPKSk7CisgICAgaW5mby0+bWFnaWMgPSBNR1NMUENfTUFHSUM7CisgICAgSU5JVF9XT1JLKCZpbmZvLT50YXNrLCBiaF9oYW5kbGVyLCBpbmZvKTsKKyAgICBpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IDQwOTY7CisgICAgaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworICAgIGluZm8tPmNsb3Npbmdfd2FpdCA9IDMwKkhaOworICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSk7CisgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKyAgICBzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CisgICAgc3Bpbl9sb2NrX2luaXQoJmluZm8tPm5ldGxvY2spOworICAgIG1lbWNweSgmaW5mby0+cGFyYW1zLCZkZWZhdWx0X3BhcmFtcyxzaXplb2YoTUdTTF9QQVJBTVMpKTsKKyAgICBpbmZvLT5pZGxlX21vZGUgPSBIRExDX1RYSURMRV9GTEFHUzsJCQorICAgIGluZm8tPmltcmFfdmFsdWUgPSAweGZmZmY7CisgICAgaW5mby0+aW1yYl92YWx1ZSA9IDB4ZmZmZjsKKyAgICBpbmZvLT5waW1fdmFsdWUgPSAweGZmOworCisgICAgbGluayA9ICZpbmZvLT5saW5rOworICAgIGxpbmstPnByaXYgPSBpbmZvOworICAgIAorICAgIC8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisKKyAgICAvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgICA9IElSUV9JTkZPMl9WQUxJRCB8IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9IE5VTEw7CisgICAgCisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gMDsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCSAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm1nc2xwY19ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCSAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCSAgICBtZ3NscGNfZGV0YWNoKGxpbmspOworCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZ3NscGNfYWRkX2RldmljZShpbmZvKTsKKworICAgIHJldHVybiBsaW5rOworfQorCisvKiBDYXJkIGhhcyBiZWVuIGluc2VydGVkLgorICovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgbWdzbHBjX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgTUdTTFBDX0lORk8gKmluZm8gPSBsaW5rLT5wcml2OworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CisgICAgdV9jaGFyIGJ1Zls2NF07CisgICAgY29uZmlnX2luZm9fdCBjb25mOworICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgZGZsdCA9IHsgMCB9OworICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZzsKKyAgICAKKyAgICBpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkgICAgcHJpbnRrKCJtZ3NscGNfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIHJlYWQgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworICAgIAorICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIC8qIExvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCisgICAgQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJmNvbmYpKTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IGNvbmYuVmNjOworCisgICAgLyogZ2V0IENJUyBjb25maWd1cmF0aW9uIGVudHJ5ICovCisKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisKKyAgICBjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKworICAgIGlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkgZGZsdCA9ICpjZmc7CisgICAgaWYgKGNmZy0+aW5kZXggPT0gMCkKKwkgICAgZ290byBjc19mYWlsZWQ7CisKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCQorICAgIC8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDA7CisgICAgaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKKwkgICAgY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOworCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCSAgICBpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKwkgICAgaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKKwkJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKKwkgICAgbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJICAgIENTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pKTsKKyAgICB9CisKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gODsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKyAgICAKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyB8PSBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgICAgID0gbWdzbHBjX2lzcjsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgICAgPSBpbmZvOworICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworICAgIGluZm8tPmlvX2Jhc2UgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgaW5mby0+aXJxX2xldmVsID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworCisgICAgLyogYWRkIHRvIGxpbmtlZCBsaXN0IG9mIGRldmljZXMgKi8KKyAgICBzcHJpbnRmKGluZm8tPm5vZGUuZGV2X25hbWUsICJtZ3NscGMwIik7CisgICAgaW5mby0+bm9kZS5tYWpvciA9IGluZm8tPm5vZGUubWlub3IgPSAwOworICAgIGxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGluZGV4IDB4JTAyeDoiLAorCSAgIGluZm8tPm5vZGUuZGV2X25hbWUsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgpOworICAgIGlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCisJICAgIHByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJICAgIHByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAorCQkgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOworICAgIHByaW50aygiXG4iKTsKKyAgICAKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworICAgIG1nc2xwY19yZWxlYXNlKCh1X2xvbmcpbGluayk7Cit9CisKKy8qIENhcmQgaGFzIGJlZW4gcmVtb3ZlZC4KKyAqIFVucmVnaXN0ZXIgZGV2aWNlIGFuZCByZWxlYXNlIFBDTUNJQSBjb25maWd1cmF0aW9uLgorICogSWYgZGV2aWNlIGlzIG9wZW4sIHBvc3Rwb25lIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3JlbGVhc2UodV9sb25nIGFyZykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gKGRldl9saW5rX3QgKilhcmc7CisKKyAgICBpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkgICAgcHJpbnRrKCJtZ3NscGNfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBVbmxpbmsgdGhlIGRldmljZSBjaGFpbiAqLworICAgIGxpbmstPmRldiA9IE5VTEw7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisKKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIGlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpCisJICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9TVEFMRV9MSU5LKQorCSAgICBtZ3NscGNfZGV0YWNoKGxpbmspOworfQorCitzdGF0aWMgdm9pZCBtZ3NscGNfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJICAgIHByaW50aygibWdzbHBjX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisgICAgCisgICAgLyogZmluZCBkZXZpY2UgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCSAgICBpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICAvKiBkZXZpY2UgaXMgY29uZmlndXJlZC9hY3RpdmUsIG1hcmsgaXQgc28gd2hlbgorCSAgICAgKiByZWxlYXNlKCkgaXMgY2FsbGVkIGEgcHJvcGVyIGRldGFjaCgpIG9jY3Vycy4KKwkgICAgICovCisJICAgIGlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQkgICAgcHJpbnRrKEtFUk5fREVCVUcgInN5bmNsaW5rcGM6IGRldGFjaCBwb3N0cG9uZWQsICclcycgIgorCQkJICAgInN0aWxsIGxvY2tlZFxuIiwgbGluay0+ZGV2LT5kZXZfbmFtZSk7CisJICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVEFMRV9MSU5LOworCSAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwkgICAgcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisgICAgCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGFuZCBmcmVlIGl0ICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBtZ3NscGNfcmVtb3ZlX2RldmljZSgoTUdTTFBDX0lORk8gKilsaW5rLT5wcml2KTsKK30KKworc3RhdGljIGludCBtZ3NscGNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBNR1NMUENfSU5GTyAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgCisgICAgaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJICAgIHByaW50aygibWdzbHBjX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJICAgIGxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkgICAgKChNR1NMUENfSU5GTyAqKWxpbmstPnByaXYpLT5zdG9wID0gMTsKKwkJICAgIG1nc2xwY19yZWxlYXNlKCh1X2xvbmcpbGluayk7CisJICAgIH0KKwkgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkgICAgbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJICAgIG1nc2xwY19jb25maWcobGluayk7CisJICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkgICAgbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJICAgIC8qIE1hcmsgdGhlIGRldmljZSBhcyBzdG9wcGVkLCB0byBibG9jayBJTyB1bnRpbCBsYXRlciAqLworCSAgICBpbmZvLT5zdG9wID0gMTsKKwkgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJICAgIGxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkgICAgLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCSAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgaW5mby0+c3RvcCA9IDA7CisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWdzbHBjX3BhcmFub2lhX2NoZWNrKE1HU0xQQ19JTkZPICppbmZvLAorCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIE1HU0xQQ19QQVJBTk9JQV9DSEVDSworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9CisJCSJXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBtZ3NsIHN0cnVjdCAoJXMpIGluICVzXG4iOworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRpbmZvID0KKwkJIldhcm5pbmc6IG51bGwgbWdzbHBjX2luZm8gZm9yICglcykgaW4gJXNcbiI7CisKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGluZm8tPm1hZ2ljICE9IE1HU0xQQ19NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisjZWxzZQorCWlmICghaW5mbykKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIENNRF9SWEZJRk8gICAgICBCSVQ3CS8vIHJlbGVhc2UgY3VycmVudCByeCBGSUZPCisjZGVmaW5lIENNRF9SWFJFU0VUICAgICBCSVQ2CS8vIHJlY2VpdmVyIHJlc2V0CisjZGVmaW5lIENNRF9SWEZJRk9fUkVBRCBCSVQ1CisjZGVmaW5lIENNRF9TVEFSVF9USU1FUiBCSVQ0CisjZGVmaW5lIENNRF9UWEZJRk8gICAgICBCSVQzCS8vIHJlbGVhc2UgY3VycmVudCB0eCBGSUZPCisjZGVmaW5lIENNRF9UWEVPTSAgICAgICBCSVQxCS8vIHRyYW5zbWl0IGVuZCBtZXNzYWdlCisjZGVmaW5lIENNRF9UWFJFU0VUICAgICBCSVQwCS8vIHRyYW5zbWl0IHJlc2V0CisKK3N0YXRpYyBCT09MRUFOIHdhaXRfY29tbWFuZF9jb21wbGV0ZShNR1NMUENfSU5GTyAqaW5mbywgdW5zaWduZWQgY2hhciBjaGFubmVsKSAKK3sKKwlpbnQgaSA9IDA7CisJLyogd2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uICovIAorCXdoaWxlIChyZWFkX3JlZyhpbmZvLCAodW5zaWduZWQgY2hhcikoY2hhbm5lbCtTVEFSKSkgJiBCSVQyKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKGkrKyA9PSAxMDAwKQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgaXNzdWVfY29tbWFuZChNR1NMUENfSU5GTyAqaW5mbywgdW5zaWduZWQgY2hhciBjaGFubmVsLCB1bnNpZ25lZCBjaGFyIGNtZCkgCit7CisJd2FpdF9jb21tYW5kX2NvbXBsZXRlKGluZm8sIGNoYW5uZWwpOworCXdyaXRlX3JlZyhpbmZvLCAodW5zaWduZWQgY2hhcikgKGNoYW5uZWwgKyBDTURSKSwgY21kKTsKK30KKworc3RhdGljIHZvaWQgdHhfcGF1c2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInR4X3BhdXNlIikpCisJCXJldHVybjsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJ0eF9wYXVzZSglcylcbiIsaW5mby0+ZGV2aWNlX25hbWUpOwkKKwkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmIChpbmZvLT50eF9lbmFibGVkKQorCSAJdHhfc3RvcChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdHhfcmVsZWFzZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAidHhfcmVsZWFzZSIpKQorCQlyZXR1cm47CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygidHhfcmVsZWFzZSglcylcbiIsaW5mby0+ZGV2aWNlX25hbWUpOwkKKwkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmICghaW5mby0+dHhfZW5hYmxlZCkKKwkgCXR4X3N0YXJ0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCisvKiBSZXR1cm4gbmV4dCBib3R0b20gaGFsZiBhY3Rpb24gdG8gcGVyZm9ybS4KKyAqIG9yIDAgaWYgbm90aGluZyB0byBkby4KKyAqLworc3RhdGljIGludCBiaF9hY3Rpb24oTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWlmIChpbmZvLT5wZW5kaW5nX2JoICYgQkhfUkVDRUlWRSkgeworCQlpbmZvLT5wZW5kaW5nX2JoICY9IH5CSF9SRUNFSVZFOworCQlyYyA9IEJIX1JFQ0VJVkU7CisJfSBlbHNlIGlmIChpbmZvLT5wZW5kaW5nX2JoICYgQkhfVFJBTlNNSVQpIHsKKwkJaW5mby0+cGVuZGluZ19iaCAmPSB+QkhfVFJBTlNNSVQ7CisJCXJjID0gQkhfVFJBTlNNSVQ7CisJfSBlbHNlIGlmIChpbmZvLT5wZW5kaW5nX2JoICYgQkhfU1RBVFVTKSB7CisJCWluZm8tPnBlbmRpbmdfYmggJj0gfkJIX1NUQVRVUzsKKwkJcmMgPSBCSF9TVEFUVVM7CisJfQorCisJaWYgKCFyYykgeworCQkvKiBNYXJrIEJIIHJvdXRpbmUgYXMgY29tcGxldGUgKi8KKwkJaW5mby0+YmhfcnVubmluZyAgID0gMDsKKwkJaW5mby0+YmhfcmVxdWVzdGVkID0gMDsKKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCisJcmV0dXJuIHJjOworfQorCit2b2lkIGJoX2hhbmRsZXIodm9pZCogQ29udGV4dCkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyopQ29udGV4dDsKKwlpbnQgYWN0aW9uOworCisJaWYgKCFpbmZvKQorCQlyZXR1cm47CisJCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCkKKwkJcHJpbnRrKCAiJXMoJWQpOmJoX2hhbmRsZXIoJXMpIGVudHJ5XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQorCWluZm8tPmJoX3J1bm5pbmcgPSAxOworCisJd2hpbGUoKGFjdGlvbiA9IGJoX2FjdGlvbihpbmZvKSkgIT0gMCkgeworCQorCQkvKiBQcm9jZXNzIHdvcmsgaXRlbSAqLworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0JIICkKKwkJCXByaW50ayggIiVzKCVkKTpiaF9oYW5kbGVyKCkgd29yayBpdGVtIGFjdGlvbj0lZFxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxhY3Rpb24pOworCisJCXN3aXRjaCAoYWN0aW9uKSB7CisJCQorCQljYXNlIEJIX1JFQ0VJVkU6CisJCQl3aGlsZShyeF9nZXRfZnJhbWUoaW5mbykpOworCQkJYnJlYWs7CisJCWNhc2UgQkhfVFJBTlNNSVQ6CisJCQliaF90cmFuc21pdChpbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIEJIX1NUQVRVUzoKKwkJCWJoX3N0YXR1cyhpbmZvKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogdW5rbm93biB3b3JrIGl0ZW0gSUQgKi8KKwkJCXByaW50aygiVW5rbm93biB3b3JrIGl0ZW0gSUQ9JTA4WCFcbiIsIGFjdGlvbik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCkKKwkJcHJpbnRrKCAiJXMoJWQpOmJoX2hhbmRsZXIoJXMpIGV4aXRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7Cit9CisKK3ZvaWQgYmhfdHJhbnNtaXQoTUdTTFBDX0lORk8gKmluZm8pCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkgpCisJCXByaW50aygiYmhfdHJhbnNtaXQoKSBlbnRyeSBvbiAlc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpOworCisJaWYgKHR0eSkgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl9Cit9CisKK3ZvaWQgYmhfc3RhdHVzKE1HU0xQQ19JTkZPICppbmZvKQoreworCWluZm8tPnJpX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5kc3JfY2hrY291bnQgPSAwOworCWluZm8tPmRjZF9jaGtjb3VudCA9IDA7CisJaW5mby0+Y3RzX2Noa2NvdW50ID0gMDsKK30KKworLyogZW9tOiBub24temVybyA9IGVuZCBvZiBmcmFtZSAqLyAKK3N0YXRpYyB2b2lkIHJ4X3JlYWR5X2hkbGMoTUdTTFBDX0lORk8gKmluZm8sIGludCBlb20pCit7CisJdW5zaWduZWQgY2hhciBkYXRhWzJdOworCXVuc2lnbmVkIGNoYXIgZmlmb19jb3VudCwgcmVhZF9jb3VudCwgaTsKKwlSWEJVRiAqYnVmID0gKFJYQlVGKikoaW5mby0+cnhfYnVmICsgKGluZm8tPnJ4X3B1dCAqIGluZm8tPnJ4X2J1Zl9zaXplKSk7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTpyeF9yZWFkeV9oZGxjKGVvbT0lZClcbiIsX19GSUxFX18sX19MSU5FX18sZW9tKTsKKwkKKwlpZiAoIWluZm8tPnJ4X2VuYWJsZWQpCisJCXJldHVybjsKKworCWlmIChpbmZvLT5yeF9mcmFtZV9jb3VudCA+PSBpbmZvLT5yeF9idWZfY291bnQpIHsKKwkJLyogbm8gbW9yZSBmcmVlIGJ1ZmZlcnMgKi8KKwkJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9SWFJFU0VUKTsKKwkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9SRUNFSVZFOworCQlpbmZvLT5yeF9vdmVyZmxvdyA9IDE7CisJCWluZm8tPmljb3VudC5idWZfb3ZlcnJ1bisrOworCQlyZXR1cm47CisJfQorCisJaWYgKGVvbSkgeworCQkvKiBlbmQgb2YgZnJhbWUsIGdldCBGSUZPIGNvdW50IGZyb20gUkJDTCByZWdpc3RlciAqLyAKKwkJaWYgKCEoZmlmb19jb3VudCA9ICh1bnNpZ25lZCBjaGFyKShyZWFkX3JlZyhpbmZvLCBDSEErUkJDTCkgJiAweDFmKSkpCisJCQlmaWZvX2NvdW50ID0gMzI7CisJfSBlbHNlCisJCWZpZm9fY291bnQgPSAzMjsKKwkKKwlkbyB7CisJCWlmIChmaWZvX2NvdW50ID09IDEpIHsKKwkJCXJlYWRfY291bnQgPSAxOworCQkJZGF0YVswXSA9IHJlYWRfcmVnKGluZm8sIENIQSArIFJYRklGTyk7CisJCX0gZWxzZSB7CisJCQlyZWFkX2NvdW50ID0gMjsKKwkJCSooKHVuc2lnbmVkIHNob3J0ICopIGRhdGEpID0gcmVhZF9yZWcxNihpbmZvLCBDSEEgKyBSWEZJRk8pOworCQl9CisJCWZpZm9fY291bnQgLT0gcmVhZF9jb3VudDsKKwkJaWYgKCFmaWZvX2NvdW50ICYmIGVvbSkKKwkJCWJ1Zi0+c3RhdHVzID0gZGF0YVstLXJlYWRfY291bnRdOworCisJCWZvciAoaSA9IDA7IGkgPCByZWFkX2NvdW50OyBpKyspIHsKKwkJCWlmIChidWYtPmNvdW50ID49IGluZm8tPm1heF9mcmFtZV9zaXplKSB7CisJCQkJLyogZnJhbWUgdG9vIGxhcmdlLCByZXNldCByZWNlaXZlciBhbmQgcmVzZXQgY3VycmVudCBidWZmZXIgKi8KKwkJCQlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1JYUkVTRVQpOworCQkJCWJ1Zi0+Y291bnQgPSAwOworCQkJCXJldHVybjsKKwkJCX0KKwkJCSooYnVmLT5kYXRhICsgYnVmLT5jb3VudCkgPSBkYXRhW2ldOworCQkJYnVmLT5jb3VudCsrOworCQl9CisJfSB3aGlsZSAoZmlmb19jb3VudCk7CisKKwlpZiAoZW9tKSB7CisJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfUkVDRUlWRTsKKwkJaW5mby0+cnhfZnJhbWVfY291bnQrKzsKKwkJaW5mby0+cnhfcHV0Kys7CisJCWlmIChpbmZvLT5yeF9wdXQgPj0gaW5mby0+cnhfYnVmX2NvdW50KQorCQkJaW5mby0+cnhfcHV0ID0gMDsKKwl9CisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9SWEZJRk8pOworfQorCitzdGF0aWMgdm9pZCByeF9yZWFkeV9hc3luYyhNR1NMUENfSU5GTyAqaW5mbywgaW50IHRjZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGEsIHN0YXR1czsKKwlpbnQgZmlmb19jb3VudDsKKyAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKyAJc3RydWN0IG1nc2xfaWNvdW50ICppY291bnQgPSAmaW5mby0+aWNvdW50OworCisJaWYgKHRjZCkgeworCQkvKiBlYXJseSB0ZXJtaW5hdGlvbiwgZ2V0IEZJRk8gY291bnQgZnJvbSBSQkNMIHJlZ2lzdGVyICovIAorCQlmaWZvX2NvdW50ID0gKHVuc2lnbmVkIGNoYXIpKHJlYWRfcmVnKGluZm8sIENIQStSQkNMKSAmIDB4MWYpOworCisJCS8qIFplcm8gZmlmbyBjb3VudCBjb3VsZCBtZWFuIDAgb3IgMzIgYnl0ZXMgYXZhaWxhYmxlLgorCQkgKiBJZiBCSVQ1IG9mIFNUQVIgaXMgc2V0IHRoZW4gYXQgbGVhc3QgMSBieXRlIGlzIGF2YWlsYWJsZS4KKwkJICovCisJCWlmICghZmlmb19jb3VudCAmJiAocmVhZF9yZWcoaW5mbyxDSEErU1RBUikgJiBCSVQ1KSkKKwkJCWZpZm9fY291bnQgPSAzMjsKKwl9IGVsc2UKKwkJZmlmb19jb3VudCA9IDMyOworCQorCS8qIEZsdXNoIHJlY2VpdmVkIGFzeW5jIGRhdGEgdG8gcmVjZWl2ZSBkYXRhIGJ1ZmZlci4gKi8gCisJd2hpbGUgKGZpZm9fY291bnQpIHsKKwkJZGF0YSAgID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgUlhGSUZPKTsKKwkJc3RhdHVzID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgUlhGSUZPKTsKKwkJZmlmb19jb3VudCAtPSAyOworCisJCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKKwkJCWJyZWFrOworCQkJCisJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gZGF0YTsKKwkJaWNvdW50LT5yeCsrOworCQkKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCisJCS8vIGlmIG5vIGZyYW1laW5nL2NyYyBlcnJvciB0aGVuIHNhdmUgZGF0YQorCQkvLyBCSVQ3OnBhcml0eSBlcnJvcgorCQkvLyBCSVQ2OmZyYW1pbmcgZXJyb3IKKworCQlpZiAoc3RhdHVzICYgKEJJVDcgKyBCSVQ2KSkgeworCQkJaWYgKHN0YXR1cyAmIEJJVDcpIAorCQkJCWljb3VudC0+cGFyaXR5Kys7CisJCQllbHNlCisJCQkJaWNvdW50LT5mcmFtZSsrOworCisJCQkvKiBkaXNjYXJkIGNoYXIgaWYgdHR5IGNvbnRyb2wgZmxhZ3Mgc2F5IHNvICovCisJCQlpZiAoc3RhdHVzICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKQorCQkJCWNvbnRpbnVlOworCQkJCQorCQkJc3RhdHVzICY9IGluZm8tPnJlYWRfc3RhdHVzX21hc2s7CisKKwkJCWlmIChzdGF0dXMgJiBCSVQ3KQorCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIEJJVDYpCisJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCX0KKwkJCisJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKKwkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOworCQl0dHktPmZsaXAuY291bnQrKzsKKwl9CisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9SWEZJRk8pOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikgeworCQlwcmludGsoIiVzKCVkKTpyeF9yZWFkeV9hc3luYyBjb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLHR0eS0+ZmxpcC5jb3VudCk7CisJCXByaW50aygiJXMoJWQpOnJ4PSVkIGJyaz0lZCBwYXJpdHk9JWQgZnJhbWU9JWQgb3ZlcnJ1bj0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGljb3VudC0+cngsaWNvdW50LT5icmssCisJCQlpY291bnQtPnBhcml0eSxpY291bnQtPmZyYW1lLGljb3VudC0+b3ZlcnJ1bik7CisJfQorCQkJCisJaWYgKHR0eS0+ZmxpcC5jb3VudCkKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworCitzdGF0aWMgdm9pZCB0eF9kb25lKE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmICghaW5mby0+dHhfYWN0aXZlKQorCQlyZXR1cm47CisJCQkKKwlpbmZvLT50eF9hY3RpdmUgPSAwOworCWluZm8tPnR4X2Fib3J0aW5nID0gMDsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMpCisJCXJldHVybjsKKworCWluZm8tPnR4X2NvdW50ID0gaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfZ2V0ID0gMDsKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisJCisJaWYgKGluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUpIHsKKwkJZ2V0X3NpZ25hbHMoaW5mbyk7CisJCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpIHsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCQkJc2V0X3NpZ25hbHMoaW5mbyk7CisJCX0KKwkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDA7CisJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKKwllbHNlIAorI2VuZGlmCisJeworCQlpZiAoaW5mby0+dHR5LT5zdG9wcGVkIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJdHhfc3RvcChpbmZvKTsKKwkJCXJldHVybjsKKwkJfQorCQlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1RSQU5TTUlUOworCX0KK30KKworc3RhdGljIHZvaWQgdHhfcmVhZHkoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciBmaWZvX2NvdW50ID0gMzI7CisJaW50IGM7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTp0eF9yZWFkeSglcylcbiIsIF9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgeworCQlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkJCXJldHVybjsKKwl9IGVsc2UgeworCQlpZiAoaW5mby0+dHR5LT5zdG9wcGVkIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJdHhfc3RvcChpbmZvKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWluZm8tPnR4X2NvdW50KQorCQkJaW5mby0+dHhfYWN0aXZlID0gMDsKKwl9CisKKwlpZiAoIWluZm8tPnR4X2NvdW50KQorCQlyZXR1cm47CisKKwl3aGlsZSAoaW5mby0+dHhfY291bnQgJiYgZmlmb19jb3VudCkgeworCQljID0gbWluKDIsIG1pbl90KGludCwgZmlmb19jb3VudCwgbWluKGluZm8tPnR4X2NvdW50LCBUWEJVRlNJWkUgLSBpbmZvLT50eF9nZXQpKSk7CisJCQorCQlpZiAoYyA9PSAxKSB7CisJCQl3cml0ZV9yZWcoaW5mbywgQ0hBICsgVFhGSUZPLCAqKGluZm8tPnR4X2J1ZiArIGluZm8tPnR4X2dldCkpOworCQl9IGVsc2UgeworCQkJd3JpdGVfcmVnMTYoaW5mbywgQ0hBICsgVFhGSUZPLAorCQkJCQkgICooKHVuc2lnbmVkIHNob3J0KikoaW5mby0+dHhfYnVmICsgaW5mby0+dHhfZ2V0KSkpOworCQl9CisJCWluZm8tPnR4X2NvdW50IC09IGM7CisJCWluZm8tPnR4X2dldCA9IChpbmZvLT50eF9nZXQgKyBjKSAmIChUWEJVRlNJWkUgLSAxKTsKKwkJZmlmb19jb3VudCAtPSBjOworCX0KKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMpIHsKKwkJaWYgKGluZm8tPnR4X2NvdW50IDwgV0FLRVVQX0NIQVJTKQorCQkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKwkJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9UWEZJRk8pOworCX0gZWxzZSB7CisJCWlmIChpbmZvLT50eF9jb3VudCkKKwkJCWlzc3VlX2NvbW1hbmQoaW5mbywgQ0hBLCBDTURfVFhGSUZPKTsKKwkJZWxzZQorCQkJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9UWEZJRk8gKyBDTURfVFhFT00pOworCX0KK30KKworc3RhdGljIHZvaWQgY3RzX2NoYW5nZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlpZiAoKGluZm8tPmN0c19jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpCisJCWlycV9kaXNhYmxlKGluZm8sIENIQiwgSVJRX0NUUyk7CisJaW5mby0+aWNvdW50LmN0cysrOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuY3RzX3VwKys7CisJZWxzZQorCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmN0c19kb3duKys7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgeworCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKSB7CisJCQkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJCQkJcHJpbnRrKCJDVFMgdHggc3RhcnQuLi4iKTsKKwkJCQlpZiAoaW5mby0+dHR5KQorCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCXR4X3N0YXJ0KGluZm8pOworCQkJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfVFJBTlNNSVQ7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKSkgeworCQkJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCQkJCXByaW50aygiQ1RTIHR4IHN0b3AuLi4iKTsKKwkJCQlpZiAoaW5mby0+dHR5KQorCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCXR4X3N0b3AoaW5mbyk7CisJCQl9CisJCX0KKwl9CisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9TVEFUVVM7Cit9CisKK3N0YXRpYyB2b2lkIGRjZF9jaGFuZ2UoTUdTTFBDX0lORk8gKmluZm8pCit7CisJZ2V0X3NpZ25hbHMoaW5mbyk7CisJaWYgKChpbmZvLT5kY2RfY2hrY291bnQpKysgPj0gSU9fUElOX1NIVVRET1dOX0xJTUlUKQorCQlpcnFfZGlzYWJsZShpbmZvLCBDSEIsIElSUV9EQ0QpOworCWluZm8tPmljb3VudC5kY2QrKzsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSB7CisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZGNkX3VwKys7CisJfQorCWVsc2UKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfZG93bisrOworI2lmZGVmIENPTkZJR19IRExDCisJaWYgKGluZm8tPm5ldGNvdW50KQorCQloZGxjX3NldF9jYXJyaWVyKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCwgaW5mby0+bmV0ZGV2KTsKKyNlbmRpZgorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpIHsKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJCXByaW50aygiJXMgQ0Qgbm93ICVzLi4uIiwgaW5mby0+ZGV2aWNlX25hbWUsCisJCQkgICAgICAgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCkgPyAib24iIDogIm9mZiIpOworCQlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCQllbHNlIHsKKwkJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCQkJcHJpbnRrKCJkb2luZyBzZXJpYWwgaGFuZ3VwLi4uIik7CisJCQlpZiAoaW5mby0+dHR5KQorCQkJCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKwkJfQorCX0KKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1NUQVRVUzsKK30KKworc3RhdGljIHZvaWQgZHNyX2NoYW5nZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlpZiAoKGluZm8tPmRzcl9jaGtjb3VudCkrKyA+PSBJT19QSU5fU0hVVERPV05fTElNSVQpCisJCXBvcnRfaXJxX2Rpc2FibGUoaW5mbywgUFZSX0RTUik7CisJaW5mby0+aWNvdW50LmRzcisrOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EU1IpCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZHNyX3VwKys7CisJZWxzZQorCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRzcl9kb3duKys7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9TVEFUVVM7Cit9CisKK3N0YXRpYyB2b2lkIHJpX2NoYW5nZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlpZiAoKGluZm8tPnJpX2Noa2NvdW50KSsrID49IElPX1BJTl9TSFVURE9XTl9MSU1JVCkKKwkJcG9ydF9pcnFfZGlzYWJsZShpbmZvLCBQVlJfUkkpOworCWluZm8tPmljb3VudC5ybmcrKzsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMucmlfdXArKzsKKwllbHNlCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMucmlfZG93bisrOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5ldmVudF93YWl0X3EpOworCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfU1RBVFVTOworfQorCisvKiBJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGVudHJ5IHBvaW50LgorICogCQorICogQXJndW1lbnRzOgorICogCisgKiBpcnEgICAgIGludGVycnVwdCBudW1iZXIgdGhhdCBjYXVzZWQgaW50ZXJydXB0CisgKiBkZXZfaWQgIGRldmljZSBJRCBzdXBwbGllZCBkdXJpbmcgaW50ZXJydXB0IHJlZ2lzdHJhdGlvbgorICogcmVncyAgICBpbnRlcnJ1cHRlZCBwcm9jZXNzb3IgY29udGV4dAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbWdzbHBjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlNR1NMUENfSU5GTyAqIGluZm8gPSAoTUdTTFBDX0lORk8gKilkZXZfaWQ7CisJdW5zaWduZWQgc2hvcnQgaXNyOworCXVuc2lnbmVkIGNoYXIgZ2lzLCBwaXM7CisJaW50IGNvdW50PTA7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQkKKwkJcHJpbnRrKCJtZ3NscGNfaXNyKCVkKSBlbnRyeS5cbiIsIGlycSk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gSVJRX05PTkU7CisJCQorCWlmICghKGluZm8tPmxpbmsuc3RhdGUgJiBERVZfQ09ORklHKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKworCXdoaWxlICgoZ2lzID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgR0lTKSkpIHsKKwkJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikJCisJCQlwcmludGsoIm1nc2xwY19pc3IgJXMgZ2lzPSUwNFhcbiIsIGluZm8tPmRldmljZV9uYW1lLGdpcyk7CisKKwkJaWYgKChnaXMgJiAweDcwKSB8fCBjb3VudCA+IDEwMDApIHsKKwkJCXByaW50aygic3luY2xpbmtfY3M6aGFyZHdhcmUgZmFpbGVkIG9yIGVqZWN0ZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJY291bnQrKzsKKworCQlpZiAoZ2lzICYgKEJJVDEgKyBCSVQwKSkgeworCQkJaXNyID0gcmVhZF9yZWcxNihpbmZvLCBDSEIgKyBJU1IpOworCQkJaWYgKGlzciAmIElSUV9EQ0QpCisJCQkJZGNkX2NoYW5nZShpbmZvKTsKKwkJCWlmIChpc3IgJiBJUlFfQ1RTKQorCQkJCWN0c19jaGFuZ2UoaW5mbyk7CisJCX0KKwkJaWYgKGdpcyAmIChCSVQzICsgQklUMikpCisJCXsKKwkJCWlzciA9IHJlYWRfcmVnMTYoaW5mbywgQ0hBICsgSVNSKTsKKwkJCWlmIChpc3IgJiBJUlFfVElNRVIpIHsKKwkJCQlpbmZvLT5pcnFfb2NjdXJyZWQgPSAxOworCQkJCWlycV9kaXNhYmxlKGluZm8sIENIQSwgSVJRX1RJTUVSKTsKKwkJCX0KKworCQkJLyogcmVjZWl2ZSBJUlFzICovIAorCQkJaWYgKGlzciAmIElSUV9FWElUSFVOVCkgeworCQkJCWluZm8tPmljb3VudC5leGl0aHVudCsrOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKwkJCX0KKwkJCWlmIChpc3IgJiBJUlFfQlJFQUtfT04pIHsKKwkJCQlpbmZvLT5pY291bnQuYnJrKys7CisJCQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfU0FLKQorCQkJCQlkb19TQUsoaW5mby0+dHR5KTsKKwkJCX0KKwkJCWlmIChpc3IgJiBJUlFfUlhUSU1FKSB7CisJCQkJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9SWEZJRk9fUkVBRCk7CisJCQl9CisJCQlpZiAoaXNyICYgKElSUV9SWEVPTSArIElSUV9SWEZJRk8pKSB7CisJCQkJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKQorCQkJCQlyeF9yZWFkeV9oZGxjKGluZm8sIGlzciAmIElSUV9SWEVPTSk7IAorCQkJCWVsc2UKKwkJCQkJcnhfcmVhZHlfYXN5bmMoaW5mbywgaXNyICYgSVJRX1JYRU9NKTsKKwkJCX0KKworCQkJLyogdHJhbnNtaXQgSVJRcyAqLyAKKwkJCWlmIChpc3IgJiBJUlFfVU5ERVJSVU4pIHsKKwkJCQlpZiAoaW5mby0+dHhfYWJvcnRpbmcpCisJCQkJCWluZm8tPmljb3VudC50eGFib3J0Kys7CisJCQkJZWxzZQorCQkJCQlpbmZvLT5pY291bnQudHh1bmRlcisrOworCQkJCXR4X2RvbmUoaW5mbyk7CisJCQl9CisJCQllbHNlIGlmIChpc3IgJiBJUlFfQUxMU0VOVCkgeworCQkJCWluZm8tPmljb3VudC50eG9rKys7CisJCQkJdHhfZG9uZShpbmZvKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGlzciAmIElSUV9UWEZJRk8pCisJCQkJdHhfcmVhZHkoaW5mbyk7CisJCX0KKwkJaWYgKGdpcyAmIEJJVDcpIHsKKwkJCXBpcyA9IHJlYWRfcmVnKGluZm8sIENIQSArIFBJUyk7CisJCQlpZiAocGlzICYgQklUMSkKKwkJCQlkc3JfY2hhbmdlKGluZm8pOworCQkJaWYgKHBpcyAmIEJJVDIpCisJCQkJcmlfY2hhbmdlKGluZm8pOworCQl9CisJfQorCQorCS8qIFJlcXVlc3QgYm90dG9tIGhhbGYgcHJvY2Vzc2luZyBpZiB0aGVyZSdzIHNvbWV0aGluZyAKKwkgKiBmb3IgaXQgdG8gZG8gYW5kIHRoZSBiaCBpcyBub3QgYWxyZWFkeSBydW5uaW5nCisJICovCisKKwlpZiAoaW5mby0+cGVuZGluZ19iaCAmJiAhaW5mby0+YmhfcnVubmluZyAmJiAhaW5mby0+YmhfcmVxdWVzdGVkKSB7CisJCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSICkJCisJCQlwcmludGsoIiVzKCVkKTolcyBxdWV1ZWluZyBiaCB0YXNrLlxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRhc2spOworCQlpbmZvLT5iaF9yZXF1ZXN0ZWQgPSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQkKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX2lzciglZClleGl0LlxuIiwKKwkJICAgICAgIF9fRklMRV9fLF9fTElORV9fLGlycSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIEluaXRpYWxpemUgYW5kIHN0YXJ0IGRldmljZS4KKyAqLworc3RhdGljIGludCBzdGFydHVwKE1HU0xQQ19JTkZPICogaW5mbykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6c3RhcnR1cCglcylcbiIsX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCQkKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKwkJcmV0dXJuIDA7CisJCisJaWYgKCFpbmZvLT50eF9idWYpIHsKKwkJLyogYWxsb2NhdGUgYSBwYWdlIG9mIG1lbW9yeSBmb3IgYSB0cmFuc21pdCBidWZmZXIgKi8KKwkJaW5mby0+dHhfYnVmID0gKHVuc2lnbmVkIGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghaW5mby0+dHhfYnVmKSB7CisJCQlwcmludGsoS0VSTl9FUlIiJXMoJWQpOiVzIGNhbid0IGFsbG9jYXRlIHRyYW5zbWl0IGJ1ZmZlclxuIiwKKwkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWluZm8tPnBlbmRpbmdfYmggPSAwOworCQorCWluaXRfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKwlpbmZvLT50eF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwlpbmZvLT50eF90aW1lci5mdW5jdGlvbiA9IHR4X3RpbWVvdXQ7CisKKwkvKiBBbGxvY2F0ZSBhbmQgY2xhaW0gYWRhcHRlciByZXNvdXJjZXMgKi8KKwlyZXR2YWwgPSBjbGFpbV9yZXNvdXJjZXMoaW5mbyk7CisJCisJLyogcGVyZm9ybSBleGlzdGFuY2UgY2hlY2sgYW5kIGRpYWdub3N0aWNzICovCisJaWYgKCAhcmV0dmFsICkKKwkJcmV0dmFsID0gYWRhcHRlcl90ZXN0KGluZm8pOworCQkKKwlpZiAoIHJldHZhbCApIHsKKyAgCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJiBpbmZvLT50dHkpCisJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKyAgCQlyZXR1cm4gcmV0dmFsOworICAJfQorCisJLyogcHJvZ3JhbSBoYXJkd2FyZSBmb3IgY3VycmVudCBwYXJhbWV0ZXJzICovCisJbWdzbHBjX2NoYW5nZV9wYXJhbXMoaW5mbyk7CisJCisJaWYgKGluZm8tPnR0eSkKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCBieSBtZ3NscGNfY2xvc2UoKSBhbmQgbWdzbHBjX2hhbmd1cCgpIHRvIHNodXRkb3duIGhhcmR3YXJlCisgKi8KK3N0YXRpYyB2b2lkIHNodXRkb3duKE1HU0xQQ19JTkZPICogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlyZXR1cm47CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX3NodXRkb3duKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCS8qIGNsZWFyIHN0YXR1cyB3YWl0IHF1ZXVlIGJlY2F1c2Ugc3RhdHVzIGNoYW5nZXMgKi8KKwkvKiBjYW4ndCBoYXBwZW4gYWZ0ZXIgc2h1dHRpbmcgZG93biB0aGUgaGFyZHdhcmUgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKworCWRlbF90aW1lcigmaW5mby0+dHhfdGltZXIpOwkKKworCWlmIChpbmZvLT50eF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT50eF9idWYpOworCQlpbmZvLT50eF9idWYgPSBOVUxMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJ4X3N0b3AoaW5mbyk7CisJdHhfc3RvcChpbmZvKTsKKworCS8qIFRPRE86ZGlzYWJsZSBpbnRlcnJ1cHRzIGluc3RlYWQgb2YgcmVzZXQgdG8gcHJlc2VydmUgc2lnbmFsIHN0YXRlcyAqLworCXJlc2V0X2RldmljZShpbmZvKTsKKwkKKyAJaWYgKCFpbmZvLT50dHkgfHwgaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIHsKKyAJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX0RUUiArIFNlcmlhbFNpZ25hbF9SVFMpOworCQlzZXRfc2lnbmFscyhpbmZvKTsKKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsJCisJCisJaWYgKGluZm8tPnR0eSkKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKK30KKworc3RhdGljIHZvaWQgbWdzbHBjX3Byb2dyYW1faHcoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKwlyeF9zdG9wKGluZm8pOworCXR4X3N0b3AoaW5mbyk7CisJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCQorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyB8fCBpbmZvLT5uZXRjb3VudCkKKwkJaGRsY19tb2RlKGluZm8pOworCWVsc2UKKwkJYXN5bmNfbW9kZShpbmZvKTsKKwkJCisJc2V0X3NpZ25hbHMoaW5mbyk7CisJCisJaW5mby0+ZGNkX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5jdHNfY2hrY291bnQgPSAwOworCWluZm8tPnJpX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5kc3JfY2hrY291bnQgPSAwOworCisJaXJxX2VuYWJsZShpbmZvLCBDSEIsIElSUV9EQ0QgfCBJUlFfQ1RTKTsKKwlwb3J0X2lycV9lbmFibGUoaW5mbywgKHVuc2lnbmVkIGNoYXIpIFBWUl9EU1IgfCBQVlJfUkkpOworCWdldF9zaWduYWxzKGluZm8pOworCQkKKwlpZiAoaW5mby0+bmV0Y291bnQgfHwgaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpCisJCXJ4X3N0YXJ0KGluZm8pOworCQkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogUmVjb25maWd1cmUgYWRhcHRlciBiYXNlZCBvbiBuZXcgcGFyYW1ldGVycworICovCitzdGF0aWMgdm9pZCBtZ3NscGNfY2hhbmdlX3BhcmFtcyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjZmxhZzsKKwlpbnQgYml0c19wZXJfY2hhcjsKKworCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCisJCXJldHVybjsKKwkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19jaGFuZ2VfcGFyYW1zKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwljZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCS8qIGlmIEIwIHJhdGUgKGhhbmd1cCkgc3BlY2lmaWVkIHRoZW4gbmVnYXRlIERUUiBhbmQgUlRTICovCisJLyogb3RoZXJ3aXNlIGFzc2VydCBEVFIgYW5kIFJUUyAqLworIAlpZiAoY2ZsYWcgJiBDQkFVRCkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJZWxzZQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSKTsKKwkKKwkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLworCQorCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNTsgYnJlYWs7CisJY2FzZSBDUzY6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA2OyBicmVhazsKKwljYXNlIENTNzogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDc7IGJyZWFrOworCWNhc2UgQ1M4OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gODsgYnJlYWs7CisJZGVmYXVsdDogIGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA3OyBicmVhazsKKwl9CisJICAgICAgCisJaWYgKGNmbGFnICYgQ1NUT1BCKQorCQlpbmZvLT5wYXJhbXMuc3RvcF9iaXRzID0gMjsKKwllbHNlCisJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgPSAxOworCisJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9OT05FOworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlpZiAoY2ZsYWcgJiBQQVJPREQpCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX09ERDsKKwkJZWxzZQorCQkJaW5mby0+cGFyYW1zLnBhcml0eSA9IEFTWU5DX1BBUklUWV9FVkVOOworI2lmZGVmIENNU1BBUgorCQlpZiAoY2ZsYWcgJiBDTVNQQVIpCisJCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX1NQQUNFOworI2VuZGlmCisJfQorCisJLyogY2FsY3VsYXRlIG51bWJlciBvZiBqaWZmaWVzIHRvIHRyYW5zbWl0IGEgZnVsbAorCSAqIEZJRk8gKDMyIGJ5dGVzKSBhdCBzcGVjaWZpZWQgZGF0YSByYXRlCisJICovCisJYml0c19wZXJfY2hhciA9IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgKyAKKwkJCWluZm8tPnBhcmFtcy5zdG9wX2JpdHMgKyAxOworCisJLyogaWYgcG9ydCBkYXRhIHJhdGUgaXMgc2V0IHRvIDQ2MDgwMCBvciBsZXNzIHRoZW4KKwkgKiBhbGxvdyB0dHkgc2V0dGluZ3MgdG8gb3ZlcnJpZGUsIG90aGVyd2lzZSBrZWVwIHRoZQorCSAqIGN1cnJlbnQgZGF0YSByYXRlLgorCSAqLworCWlmIChpbmZvLT5wYXJhbXMuZGF0YV9yYXRlIDw9IDQ2MDgwMCkgeworCQlpbmZvLT5wYXJhbXMuZGF0YV9yYXRlID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwl9CisJCisJaWYgKCBpbmZvLT5wYXJhbXMuZGF0YV9yYXRlICkgeworCQlpbmZvLT50aW1lb3V0ID0gKDMyKkhaKmJpdHNfcGVyX2NoYXIpIC8gCisJCQkJaW5mby0+cGFyYW1zLmRhdGFfcmF0ZTsKKwl9CisJaW5mby0+dGltZW91dCArPSBIWi81MDsJCS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwllbHNlCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwkJCisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKworCS8qIHByb2Nlc3MgdHR5IGlucHV0IGNvbnRyb2wgZmxhZ3MgKi8KKwkKKwlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gMDsKKwlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IEJJVDcgfCBCSVQ2OworCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gQklUNyB8IEJJVDY7CisKKwltZ3NscGNfcHJvZ3JhbV9odyhpbmZvKTsKK30KKworLyogQWRkIGEgY2hhcmFjdGVyIHRvIHRoZSB0cmFuc21pdCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykgeworCQlwcmludGsoICIlcyglZCk6bWdzbHBjX3B1dF9jaGFyKCVkKSBvbiAlc1xuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGNoLGluZm8tPmRldmljZV9uYW1lKTsKKwl9CisKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19wdXRfY2hhciIpKQorCQlyZXR1cm47CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9BU1lOQyB8fCAhaW5mby0+dHhfYWN0aXZlKSB7CisJCWlmIChpbmZvLT50eF9jb3VudCA8IFRYQlVGU0laRSAtIDEpIHsKKwkJCWluZm8tPnR4X2J1ZltpbmZvLT50eF9wdXQrK10gPSBjaDsKKwkJCWluZm8tPnR4X3B1dCAmPSBUWEJVRlNJWkUtMTsKKwkJCWluZm8tPnR4X2NvdW50Kys7CisJCX0KKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qIEVuYWJsZSB0cmFuc21pdHRlciBzbyByZW1haW5pbmcgY2hhcmFjdGVycyBpbiB0aGUKKyAqIHRyYW5zbWl0IGJ1ZmZlciBhcmUgc2VudC4KKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50ayggIiVzKCVkKTptZ3NscGNfZmx1c2hfY2hhcnMoKSBlbnRyeSBvbiAlcyB0eF9jb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGluZm8tPnR4X2NvdW50KTsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19mbHVzaF9jaGFycyIpKQorCQlyZXR1cm47CisKKwlpZiAoaW5mby0+dHhfY291bnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwKKwkgICAgdHR5LT5od19zdG9wcGVkIHx8ICFpbmZvLT50eF9idWYpCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoICIlcyglZCk6bWdzbHBjX2ZsdXNoX2NoYXJzKCkgZW50cnkgb24gJXMgc3RhcnRpbmcgdHJhbnNtaXR0ZXJcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKCFpbmZvLT50eF9hY3RpdmUpCisJIAl0eF9zdGFydChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKK30KKworLyogU2VuZCBhIGJsb2NrIG9mIGRhdGEKKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogdHR5ICAgICAgICBwb2ludGVyIHRvIHR0eSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqIGJ1ZgkgICAgICBwb2ludGVyIHRvIGJ1ZmZlciBjb250YWluaW5nIHNlbmQgZGF0YQorICogY291bnQgICAgICBzaXplIG9mIHNlbmQgZGF0YSBpbiBieXRlcworICogCQorICogUmV0dXJuczogbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbgorICovCitzdGF0aWMgaW50IG1nc2xwY193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBjLCByZXQgPSAwOworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoICIlcyglZCk6bWdzbHBjX3dyaXRlKCVzKSBjb3VudD0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLGNvdW50KTsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY193cml0ZSIpIHx8CisJICAgICF0dHkgfHwgIWluZm8tPnR4X2J1ZikKKwkJZ290byBjbGVhbnVwOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCWlmIChjb3VudCA+IFRYQlVGU0laRSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAoaW5mby0+dHhfYWN0aXZlKQorCQkJZ290byBjbGVhbnVwOworCQllbHNlIGlmIChpbmZvLT50eF9jb3VudCkKKwkJCWdvdG8gc3RhcnQ7CisJfQorCisJZm9yICg7OykgeworCQljID0gbWluKGNvdW50LAorCQkJbWluKFRYQlVGU0laRSAtIGluZm8tPnR4X2NvdW50IC0gMSwKKwkJCSAgICBUWEJVRlNJWkUgLSBpbmZvLT50eF9wdXQpKTsKKwkJaWYgKGMgPD0gMCkKKwkJCWJyZWFrOworCQkJCisJCW1lbWNweShpbmZvLT50eF9idWYgKyBpbmZvLT50eF9wdXQsIGJ1ZiwgYyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpbmZvLT50eF9wdXQgPSAoaW5mby0+dHhfcHV0ICsgYykgJiAoVFhCVUZTSVpFLTEpOworCQlpbmZvLT50eF9jb3VudCArPSBjOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJcmV0ICs9IGM7CisJfQorc3RhcnQ6CisgCWlmIChpbmZvLT50eF9jb3VudCAmJiAhdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkJIAl0eF9zdGFydChpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisgCX0KK2NsZWFudXA6CQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoICIlcyglZCk6bWdzbHBjX3dyaXRlKCVzKSByZXR1cm5pbmc9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSxyZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJldHVybiB0aGUgY291bnQgb2YgZnJlZSBieXRlcyBpbiB0cmFuc21pdCBidWZmZXIKKyAqLworc3RhdGljIGludCBtZ3NscGNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCQkJCQorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKKwkJLyogSERMQyAoZnJhbWUgb3JpZW50ZWQpIG1vZGUgKi8KKwkJaWYgKGluZm8tPnR4X2FjdGl2ZSkKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gSERMQ19NQVhfRlJBTUVfU0laRTsKKwl9IGVsc2UgeworCQlyZXQgPSBUWEJVRlNJWkUgLSBpbmZvLT50eF9jb3VudCAtIDE7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0ID0gMDsKKwl9CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY193cml0ZV9yb29tKCVzKT0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJuIHRoZSBjb3VudCBvZiBieXRlcyBpbiB0cmFuc21pdCBidWZmZXIKKyAqLworc3RhdGljIGludCBtZ3NscGNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCWludCByYzsKKwkJIAorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfY2hhcnNfaW5fYnVmZmVyKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19jaGFyc19pbl9idWZmZXIiKSkKKwkJcmV0dXJuIDA7CisJCQorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykKKwkJcmMgPSBpbmZvLT50eF9hY3RpdmUgPyBpbmZvLT5tYXhfZnJhbWVfc2l6ZSA6IDA7CisJZWxzZQorCQlyYyA9IGluZm8tPnR4X2NvdW50OworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19jaGFyc19pbl9idWZmZXIoJXMpPSVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSwgcmMpOworCQkJIAorCXJldHVybiByYzsKK30KKworLyogRGlzY2FyZCBhbGwgZGF0YSBpbiB0aGUgc2VuZCBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfZmx1c2hfYnVmZmVyKCVzKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19mbHVzaF9idWZmZXIiKSkKKwkJcmV0dXJuOworCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7IAorCWluZm8tPnR4X2NvdW50ID0gaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfZ2V0ID0gMDsKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKiBTZW5kIGEgaGlnaC1wcmlvcml0eSBYT04vWE9GRiBjaGFyYWN0ZXIKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfc2VuZF94Y2hhciglcywlZClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBjaCApOworCQkJIAorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3NlbmRfeGNoYXIiKSkKKwkJcmV0dXJuOworCisJaW5mby0+eF9jaGFyID0gY2g7CisJaWYgKGNoKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaWYgKCFpbmZvLT50eF9lbmFibGVkKQorCQkgCXR4X3N0YXJ0KGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9Cit9CisKKy8qIFNpZ25hbCByZW1vdGUgZGV2aWNlIHRvIHRocm90dGxlIHNlbmQgZGF0YSAob3VyIHJlY2VpdmUgZGF0YSkKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfdGhyb3R0bGUoJXMpIGVudHJ5XG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfdGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCWlmIChJX0lYT0ZGKHR0eSkpCisJCW1nc2xwY19zZW5kX3hjaGFyKHR0eSwgU1RPUF9DSEFSKHR0eSkpOworIAorIAlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK30KKworLyogU2lnbmFsIHJlbW90ZSBkZXZpY2UgdG8gc3RvcCB0aHJvdHRsaW5nIHNlbmQgZGF0YSAob3VyIHJlY2VpdmUgZGF0YSkKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY191bnRocm90dGxlKCVzKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKworCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3VudGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJaWYgKGluZm8tPnhfY2hhcikKKwkJCWluZm8tPnhfY2hhciA9IDA7CisJCWVsc2UKKwkJCW1nc2xwY19zZW5kX3hjaGFyKHR0eSwgU1RBUlRfQ0hBUih0dHkpKTsKKwl9CisJCisgCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKwkgCXNldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9Cit9CisKKy8qIGdldCB0aGUgY3VycmVudCBzZXJpYWwgc3RhdGlzdGljcworICovCitzdGF0aWMgaW50IGdldF9zdGF0cyhNR1NMUENfSU5GTyAqIGluZm8sIHN0cnVjdCBtZ3NsX2ljb3VudCBfX3VzZXIgKnVzZXJfaWNvdW50KQoreworCWludCBlcnI7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiZ2V0X3BhcmFtcyglcylcbiIsIGluZm8tPmRldmljZV9uYW1lKTsKKwlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfaWNvdW50LCAmaW5mby0+aWNvdW50LCBzaXplb2Yoc3RydWN0IG1nc2xfaWNvdW50KSk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIGdldCB0aGUgY3VycmVudCBzZXJpYWwgcGFyYW1ldGVycworICovCitzdGF0aWMgaW50IGdldF9wYXJhbXMoTUdTTFBDX0lORk8gKiBpbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKnVzZXJfcGFyYW1zKQoreworCWludCBlcnI7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiZ2V0X3BhcmFtcyglcylcbiIsIGluZm8tPmRldmljZV9uYW1lKTsKKwlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfcGFyYW1zLCAmaW5mby0+cGFyYW1zLCBzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHRoZSBzZXJpYWwgcGFyYW1ldGVycworICogCQorICogQXJndW1lbnRzOgorICogCisgKiAJaW5mbwkJcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICogCW5ld19wYXJhbXMJdXNlciBidWZmZXIgY29udGFpbmluZyBuZXcgc2VyaWFsIHBhcmFtcworICoKKyAqIFJldHVybnM6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBzZXRfcGFyYW1zKE1HU0xQQ19JTkZPICogaW5mbywgTUdTTF9QQVJBTVMgX191c2VyICpuZXdfcGFyYW1zKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCU1HU0xfUEFSQU1TIHRtcF9wYXJhbXM7CisJaW50IGVycjsKKyAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6c2V0X3BhcmFtcyAlc1xuIiwgX19GSUxFX18sX19MSU5FX18sCisJCQlpbmZvLT5kZXZpY2VfbmFtZSApOworCUNPUFlfRlJPTV9VU0VSKGVyciwmdG1wX3BhcmFtcywgbmV3X3BhcmFtcywgc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJaWYgKGVycikgeworCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQorCQkJcHJpbnRrKCAiJXMoJWQpOnNldF9wYXJhbXMoJXMpIHVzZXIgYnVmZmVyIGNvcHkgZmFpbGVkXG4iLAorCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwltZW1jcHkoJmluZm8tPnBhcmFtcywmdG1wX3BhcmFtcyxzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKyAJbWdzbHBjX2NoYW5nZV9wYXJhbXMoaW5mbyk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3R4aWRsZShNR1NMUENfSU5GTyAqIGluZm8sIGludCBfX3VzZXIgKmlkbGVfbW9kZSkKK3sKKwlpbnQgZXJyOworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoImdldF90eGlkbGUoJXMpPSVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aWRsZV9tb2RlKTsKKwlDT1BZX1RPX1VTRVIoZXJyLGlkbGVfbW9kZSwgJmluZm8tPmlkbGVfbW9kZSwgc2l6ZW9mKGludCkpOworCWlmIChlcnIpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF90eGlkbGUoTUdTTFBDX0lORk8gKiBpbmZvLCBpbnQgaWRsZV9tb2RlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoInNldF90eGlkbGUoJXMsJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaWRsZV9tb2RlKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaW5mby0+aWRsZV9tb2RlID0gaWRsZV9tb2RlOworCXR4X3NldF9pZGxlKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9pbnRlcmZhY2UoTUdTTFBDX0lORk8gKiBpbmZvLCBpbnQgX191c2VyICppZl9tb2RlKQoreworCWludCBlcnI7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiZ2V0X2ludGVyZmFjZSglcyk9JWRcbiIsIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pZl9tb2RlKTsKKwlDT1BZX1RPX1VTRVIoZXJyLGlmX21vZGUsICZpbmZvLT5pZl9tb2RlLCBzaXplb2YoaW50KSk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2ludGVyZmFjZShNR1NMUENfSU5GTyAqIGluZm8sIGludCBpZl9tb2RlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdmFsOworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoInNldF9pbnRlcmZhY2UoJXMsJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaWZfbW9kZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWluZm8tPmlmX21vZGUgPSBpZl9tb2RlOworCisJdmFsID0gcmVhZF9yZWcoaW5mbywgUFZSKSAmIDB4MGY7CisJc3dpdGNoIChpbmZvLT5pZl9tb2RlKQorCXsKKwljYXNlIE1HU0xfSU5URVJGQUNFX1JTMjMyOiB2YWwgfD0gUFZSX1JTMjMyOyBicmVhazsKKwljYXNlIE1HU0xfSU5URVJGQUNFX1YzNTogICB2YWwgfD0gUFZSX1YzNTsgICBicmVhazsKKwljYXNlIE1HU0xfSU5URVJGQUNFX1JTNDIyOiB2YWwgfD0gUFZSX1JTNDIyOyBicmVhazsKKwl9CisJd3JpdGVfcmVnKGluZm8sIFBWUiwgdmFsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF90eGVuYWJsZShNR1NMUENfSU5GTyAqIGluZm8sIGludCBlbmFibGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygic2V0X3R4ZW5hYmxlKCVzLCVkKVxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIGVuYWJsZSk7CisJCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKGVuYWJsZSkgeworCQlpZiAoIWluZm8tPnR4X2VuYWJsZWQpCisJCQl0eF9zdGFydChpbmZvKTsKKwl9IGVsc2UgeworCQlpZiAoaW5mby0+dHhfZW5hYmxlZCkKKwkJCXR4X3N0b3AoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR4X2Fib3J0KE1HU0xQQ19JTkZPICogaW5mbykKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJ0eF9hYm9ydCglcylcbiIsIGluZm8tPmRldmljZV9uYW1lKTsKKwkJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoaW5mby0+dHhfYWN0aXZlICYmIGluZm8tPnR4X2NvdW50ICYmCisJICAgIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCS8qIGNsZWFyIGRhdGEgY291bnQgc28gRklGTyBpcyBub3QgZmlsbGVkIG9uIG5leHQgSVJRLgorCQkgKiBUaGlzIHJlc3VsdHMgaW4gdW5kZXJydW4gYW5kIGFib3J0IHRyYW5zbWlzc2lvbi4KKwkJICovCisJCWluZm8tPnR4X2NvdW50ID0gaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfZ2V0ID0gMDsKKwkJaW5mby0+dHhfYWJvcnRpbmcgPSBUUlVFOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfcnhlbmFibGUoTUdTTFBDX0lORk8gKiBpbmZvLCBpbnQgZW5hYmxlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworIAorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoInNldF9yeGVuYWJsZSglcywlZClcbiIsIGluZm8tPmRldmljZV9uYW1lLCBlbmFibGUpOworCQkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmIChlbmFibGUpIHsKKwkJaWYgKCFpbmZvLT5yeF9lbmFibGVkKQorCQkJcnhfc3RhcnQoaW5mbyk7CisJfSBlbHNlIHsKKwkJaWYgKGluZm8tPnJ4X2VuYWJsZWQpCisJCQlyeF9zdG9wKGluZm8pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogd2FpdCBmb3Igc3BlY2lmaWVkIGV2ZW50IHRvIG9jY3VyCisgKiAJCisgKiBBcmd1bWVudHM6CSAJaW5mbwlwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiAJCQltYXNrCXBvaW50ZXIgdG8gYml0bWFzayBvZiBldmVudHMgdG8gd2FpdCBmb3IKKyAqIFJldHVybiBWYWx1ZToJMCAJaWYgc3VjY2Vzc2Z1bCBhbmQgYml0IG1hc2sgdXBkYXRlZCB3aXRoCisgKgkJCQlvZiBldmVudHMgdHJpZ2dlcnJlZCwKKyAqIAkJCW90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9ldmVudHMoTUdTTFBDX0lORk8gKiBpbmZvLCBpbnQgX191c2VyICptYXNrX3B0cikKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgczsKKwlpbnQgcmM9MDsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY3ByZXYsIGNub3c7CisJaW50IGV2ZW50czsKKwlpbnQgbWFzazsKKwlzdHJ1Y3QJX2lucHV0X3NpZ25hbF9ldmVudHMgb2xkc2lncywgbmV3c2lnczsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCUNPUFlfRlJPTV9VU0VSKHJjLCZtYXNrLCBtYXNrX3B0ciwgc2l6ZW9mKGludCkpOworCWlmIChyYykKKwkJcmV0dXJuICAtRUZBVUxUOworCQkgCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygid2FpdF9ldmVudHMoJXMsJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgbWFzayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwkvKiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgc3RhdGUgbWF0Y2hlcyByZXF1ZXN0ZWQgZXZlbnRzICovCisJZ2V0X3NpZ25hbHMoaW5mbyk7CisJcyA9IGluZm8tPnNlcmlhbF9zaWduYWxzOworCWV2ZW50cyA9IG1hc2sgJgorCQkoICgocyAmIFNlcmlhbFNpZ25hbF9EU1IpID8gTWdzbEV2ZW50X0RzckFjdGl2ZTpNZ3NsRXZlbnRfRHNySW5hY3RpdmUpICsKKyAJCSAgKChzICYgU2VyaWFsU2lnbmFsX0RDRCkgPyBNZ3NsRXZlbnRfRGNkQWN0aXZlOk1nc2xFdmVudF9EY2RJbmFjdGl2ZSkgKworCQkgICgocyAmIFNlcmlhbFNpZ25hbF9DVFMpID8gTWdzbEV2ZW50X0N0c0FjdGl2ZTpNZ3NsRXZlbnRfQ3RzSW5hY3RpdmUpICsKKwkJICAoKHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IE1nc2xFdmVudF9SaUFjdGl2ZSA6TWdzbEV2ZW50X1JpSW5hY3RpdmUpICk7CisJaWYgKGV2ZW50cykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIHNhdmUgY3VycmVudCBpcnEgY291bnRzICovCisJY3ByZXYgPSBpbmZvLT5pY291bnQ7CisJb2xkc2lncyA9IGluZm8tPmlucHV0X3NpZ25hbF9ldmVudHM7CisJCisJaWYgKChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgJiYKKwkgICAgKG1hc2sgJiBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlKSkKKwkJaXJxX2VuYWJsZShpbmZvLCBDSEEsIElSUV9FWElUSFVOVCk7CisJCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+ZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCisJCisJZm9yKDs7KSB7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQkJCisJCS8qIGdldCBjdXJyZW50IGlycSBjb3VudHMgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQljbm93ID0gaW5mby0+aWNvdW50OworCQluZXdzaWdzID0gaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50czsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwkJLyogaWYgbm8gY2hhbmdlLCB3YWl0IGFib3J0ZWQgZm9yIHNvbWUgcmVhc29uICovCisJCWlmIChuZXdzaWdzLmRzcl91cCAgID09IG9sZHNpZ3MuZHNyX3VwICAgJiYKKwkJICAgIG5ld3NpZ3MuZHNyX2Rvd24gPT0gb2xkc2lncy5kc3JfZG93biAmJgorCQkgICAgbmV3c2lncy5kY2RfdXAgICA9PSBvbGRzaWdzLmRjZF91cCAgICYmCisJCSAgICBuZXdzaWdzLmRjZF9kb3duID09IG9sZHNpZ3MuZGNkX2Rvd24gJiYKKwkJICAgIG5ld3NpZ3MuY3RzX3VwICAgPT0gb2xkc2lncy5jdHNfdXAgICAmJgorCQkgICAgbmV3c2lncy5jdHNfZG93biA9PSBvbGRzaWdzLmN0c19kb3duICYmCisJCSAgICBuZXdzaWdzLnJpX3VwICAgID09IG9sZHNpZ3MucmlfdXAgICAgJiYKKwkJICAgIG5ld3NpZ3MucmlfZG93biAgPT0gb2xkc2lncy5yaV9kb3duICAmJgorCQkgICAgY25vdy5leGl0aHVudCAgICA9PSBjcHJldi5leGl0aHVudCAgICYmCisJCSAgICBjbm93LnJ4aWRsZSAgICAgID09IGNwcmV2LnJ4aWRsZSkgeworCQkJcmMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlldmVudHMgPSBtYXNrICYKKwkJCSggKG5ld3NpZ3MuZHNyX3VwICAgIT0gb2xkc2lncy5kc3JfdXAgICA/IE1nc2xFdmVudF9Ec3JBY3RpdmU6MCkgICArCisJCQkgIChuZXdzaWdzLmRzcl9kb3duICE9IG9sZHNpZ3MuZHNyX2Rvd24gPyBNZ3NsRXZlbnRfRHNySW5hY3RpdmU6MCkgKworCQkJICAobmV3c2lncy5kY2RfdXAgICAhPSBvbGRzaWdzLmRjZF91cCAgID8gTWdzbEV2ZW50X0RjZEFjdGl2ZTowKSAgICsKKwkJCSAgKG5ld3NpZ3MuZGNkX2Rvd24gIT0gb2xkc2lncy5kY2RfZG93biA/IE1nc2xFdmVudF9EY2RJbmFjdGl2ZTowKSArCisJCQkgIChuZXdzaWdzLmN0c191cCAgICE9IG9sZHNpZ3MuY3RzX3VwICAgPyBNZ3NsRXZlbnRfQ3RzQWN0aXZlOjApICAgKworCQkJICAobmV3c2lncy5jdHNfZG93biAhPSBvbGRzaWdzLmN0c19kb3duID8gTWdzbEV2ZW50X0N0c0luYWN0aXZlOjApICsKKwkJCSAgKG5ld3NpZ3MucmlfdXAgICAgIT0gb2xkc2lncy5yaV91cCAgICA/IE1nc2xFdmVudF9SaUFjdGl2ZTowKSAgICArCisJCQkgIChuZXdzaWdzLnJpX2Rvd24gICE9IG9sZHNpZ3MucmlfZG93biAgPyBNZ3NsRXZlbnRfUmlJbmFjdGl2ZTowKSAgKworCQkJICAoY25vdy5leGl0aHVudCAgICAhPSBjcHJldi5leGl0aHVudCAgID8gTWdzbEV2ZW50X0V4aXRIdW50TW9kZTowKSArCisJCQkgIChjbm93LnJ4aWRsZSAgICAgICE9IGNwcmV2LnJ4aWRsZSAgICAgPyBNZ3NsRXZlbnRfSWRsZVJlY2VpdmVkOjApICk7CisJCWlmIChldmVudHMpCisJCQlicmVhazsKKwkJCisJCWNwcmV2ID0gY25vdzsKKwkJb2xkc2lncyA9IG5ld3NpZ3M7CisJfQorCQorCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5ldmVudF93YWl0X3EsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJaWYgKG1hc2sgJiBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZpbmZvLT5ldmVudF93YWl0X3EpKQorCQkJaXJxX2Rpc2FibGUoaW5mbywgQ0hBLCBJUlFfRVhJVEhVTlQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9CitleGl0OgorCWlmIChyYyA9PSAwKQorCQlQVVRfVVNFUihyYywgZXZlbnRzLCBtYXNrX3B0cik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1vZGVtX2lucHV0X3dhaXQoTUdTTFBDX0lORk8gKmluZm8saW50IGFyZykKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisJc3RydWN0IG1nc2xfaWNvdW50IGNwcmV2LCBjbm93OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJLyogc2F2ZSBjdXJyZW50IGlycSBjb3VudHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJY3ByZXYgPSBpbmZvLT5pY291bnQ7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJZm9yKDs7KSB7CisJCXNjaGVkdWxlKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGdldCBuZXcgaXJxIGNvdW50cyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJCS8qIGlmIG5vIGNoYW5nZSwgd2FpdCBhYm9ydGVkIGZvciBzb21lIHJlYXNvbiAqLworCQlpZiAoY25vdy5ybmcgPT0gY3ByZXYucm5nICYmIGNub3cuZHNyID09IGNwcmV2LmRzciAmJgorCQkgICAgY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmIGNub3cuY3RzID09IGNwcmV2LmN0cykgeworCQkJcmMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBmb3IgY2hhbmdlIGluIGNhbGxlciBzcGVjaWZpZWQgbW9kZW0gaW5wdXQgKi8KKwkJaWYgKChhcmcgJiBUSU9DTV9STkcgJiYgY25vdy5ybmcgIT0gY3ByZXYucm5nKSB8fAorCQkgICAgKGFyZyAmIFRJT0NNX0RTUiAmJiBjbm93LmRzciAhPSBjcHJldi5kc3IpIHx8CisJCSAgICAoYXJnICYgVElPQ01fQ0QgICYmIGNub3cuZGNkICE9IGNwcmV2LmRjZCkgfHwKKwkJICAgIChhcmcgJiBUSU9DTV9DVFMgJiYgY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkgeworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQljcHJldiA9IGNub3c7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIHNlcmlhbCBjb250cm9sIGFuZCBzdGF0dXMgc2lnbmFscworICovCitzdGF0aWMgaW50IHRpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlnZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJlc3VsdCA9ICgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKSA/IFRJT0NNX1JUUzowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFRSKSA/IFRJT0NNX0RUUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSA/IFRJT0NNX0NBUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IFRJT0NNX1JORzowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFNSKSA/IFRJT0NNX0RTUjowKSArCisJCSgoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKSA/IFRJT0NNX0NUUzowKTsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB0aW9jbWdldCgpIHZhbHVlPSUwOFhcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCByZXN1bHQgKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBzZXQgbW9kZW0gY29udHJvbCBzaWduYWxzIChEVFIvUlRTKQorICovCitzdGF0aWMgaW50IHRpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTolcyB0aW9jbXNldCgleCwleClcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgc2V0LCBjbGVhcik7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9EVFI7CisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+U2VyaWFsU2lnbmFsX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfRFRSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlzZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBTZXQgb3IgY2xlYXIgdHJhbnNtaXQgYnJlYWsgY29uZGl0aW9uCisgKgorICogQXJndW1lbnRzOgkJdHR5CQlwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCisgKgkJCWJyZWFrX3N0YXRlCS0xPXNldCBicmVhayBjb25kaXRpb24sIDA9Y2xlYXIKKyAqLworc3RhdGljIHZvaWQgbWdzbHBjX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKK3sKKwlNR1NMUENfSU5GTyAqIGluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19icmVhayglcywlZClcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCBicmVha19zdGF0ZSk7CisJCQkgCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfYnJlYWsiKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCXNldF9yZWdfYml0cyhpbmZvLCBDSEErREFGTywgQklUNik7CisJZWxzZSAKKwkJY2xlYXJfcmVnX2JpdHMoaW5mbywgQ0hBK0RBRk8sIEJJVDYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCisvKiBTZXJ2aWNlIGFuIElPQ1RMIHJlcXVlc3QKKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCXR0eQlwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCisgKiAJZmlsZQlwb2ludGVyIHRvIGFzc29jaWF0ZWQgZmlsZSBvYmplY3QgZm9yIGRldmljZQorICogCWNtZAlJT0NUTCBjb21tYW5kIGNvZGUKKyAqIAlhcmcJY29tbWFuZCBhcmd1bWVudC9jb250ZXh0CisgKiAJCisgKiBSZXR1cm4gVmFsdWU6CTAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBtZ3NscGNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJTUdTTFBDX0lORk8gKiBpbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6bWdzbHBjX2lvY3RsICVzIGNtZD0lMDhYXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCWluZm8tPmRldmljZV9uYW1lLCBjbWQgKTsKKwkKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoY21kICE9IFRJT0NHU0VSSUFMKSAmJiAoY21kICE9IFRJT0NTU0VSSUFMKSAmJgorCSAgICAoY21kICE9IFRJT0NNSVdBSVQpICYmIChjbWQgIT0gVElPQ0dJQ09VTlQpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJICAgIHJldHVybiAtRUlPOworCX0KKworCXJldHVybiBpb2N0bF9jb21tb24oaW5mbywgY21kLCBhcmcpOworfQorCitpbnQgaW9jdGxfY29tbW9uKE1HU0xQQ19JTkZPICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IG1nc2xfaWNvdW50IGNub3c7CS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCisJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICpwX2N1c2VyOwkvKiB1c2VyIHNwYWNlICovCisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTUdTTF9JT0NHUEFSQU1TOgorCQlyZXR1cm4gZ2V0X3BhcmFtcyhpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DU1BBUkFNUzoKKwkJcmV0dXJuIHNldF9wYXJhbXMoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ0dUWElETEU6CisJCXJldHVybiBnZXRfdHhpZGxlKGluZm8sIGFyZ3ApOworCWNhc2UgTUdTTF9JT0NTVFhJRExFOgorCQlyZXR1cm4gc2V0X3R4aWRsZShpbmZvLCAoaW50KWFyZyk7CisJY2FzZSBNR1NMX0lPQ0dJRjoKKwkJcmV0dXJuIGdldF9pbnRlcmZhY2UoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ1NJRjoKKwkJcmV0dXJuIHNldF9pbnRlcmZhY2UoaW5mbywoaW50KWFyZyk7CisJY2FzZSBNR1NMX0lPQ1RYRU5BQkxFOgorCQlyZXR1cm4gc2V0X3R4ZW5hYmxlKGluZm8sKGludClhcmcpOworCWNhc2UgTUdTTF9JT0NSWEVOQUJMRToKKwkJcmV0dXJuIHNldF9yeGVuYWJsZShpbmZvLChpbnQpYXJnKTsKKwljYXNlIE1HU0xfSU9DVFhBQk9SVDoKKwkJcmV0dXJuIHR4X2Fib3J0KGluZm8pOworCWNhc2UgTUdTTF9JT0NHU1RBVFM6CisJCXJldHVybiBnZXRfc3RhdHMoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ1dBSVRFVkVOVDoKKwkJcmV0dXJuIHdhaXRfZXZlbnRzKGluZm8sIGFyZ3ApOworCWNhc2UgVElPQ01JV0FJVDoKKwkJcmV0dXJuIG1vZGVtX2lucHV0X3dhaXQoaW5mbywoaW50KWFyZyk7CisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQljbm93ID0gaW5mby0+aWNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJcF9jdXNlciA9IGFyZ3A7CisJCVBVVF9VU0VSKGVycm9yLGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cucm5nLCAmcF9jdXNlci0+cm5nKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cucngsICZwX2N1c2VyLT5yeCk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQlQVVRfVVNFUihlcnJvcixjbm93LnR4LCAmcF9jdXNlci0+dHgpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5mcmFtZSwgJnBfY3VzZXItPmZyYW1lKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCVBVVF9VU0VSKGVycm9yLGNub3cub3ZlcnJ1biwgJnBfY3VzZXItPm92ZXJydW4pOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5wYXJpdHksICZwX2N1c2VyLT5wYXJpdHkpOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5icmssICZwX2N1c2VyLT5icmspOworCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKwkJUFVUX1VTRVIoZXJyb3IsY25vdy5idWZfb3ZlcnJ1biwgJnBfY3VzZXItPmJ1Zl9vdmVycnVuKTsKKwkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBTZXQgbmV3IHRlcm1pb3Mgc2V0dGluZ3MKKyAqIAkKKyAqIEFyZ3VtZW50czoKKyAqIAorICogCXR0eQkJcG9pbnRlciB0byB0dHkgc3RydWN0dXJlCisgKiAJdGVybWlvcwkJcG9pbnRlciB0byBidWZmZXIgdG8gaG9sZCByZXR1cm5lZCBvbGQgdGVybWlvcworICovCitzdGF0aWMgdm9pZCBtZ3NscGNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfc2V0X3Rlcm1pb3MgJXNcbiIsIF9fRklMRV9fLF9fTElORV9fLAorCQkJdHR5LT5kcml2ZXItPm5hbWUgKTsKKwkKKwkvKiBqdXN0IHJldHVybiBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCisJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCisJICAgICYmIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpIAorCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQorCSAgcmV0dXJuOworCisJbWdzbHBjX2NoYW5nZV9wYXJhbXMoaW5mbyk7CisKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KKwlpZiAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KKwkKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiBhd2F5IGZyb20gQjAgc3RhdHVzICovCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpIHsKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RUUjsKKyAJCWlmICghKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8IAorIAkJICAgICF0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpIHsKKwkJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFM7CisgCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkgCXNldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl9CisJCisJLyogSGFuZGxlIHR1cm5pbmcgb2ZmIENSVFNDVFMgKi8KKwlpZiAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJdHhfcmVsZWFzZSh0dHkpOworCX0KK30KKworc3RhdGljIHZvaWQgbWdzbHBjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlNR1NMUENfSU5GTyAqIGluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKG1nc2xwY19wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtZ3NscGNfY2xvc2UiKSkKKwkJcmV0dXJuOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfY2xvc2UoJXMpIGVudHJ5LCBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPmNvdW50KTsKKwkJCSAKKwlpZiAoIWluZm8tPmNvdW50KQorCQlyZXR1cm47CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJZ290byBjbGVhbnVwOworCQkJCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgeworCQkvKgorCQkgKiB0dHktPmNvdW50IGlzIDEgYW5kIHRoZSB0dHkgc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuCisJCSAqIGluZm8tPmNvdW50IHNob3VsZCBiZSBvbmUgaW4gdGhpcyBjYXNlLgorCQkgKiBpZiBpdCdzIG5vdCwgY29ycmVjdCBpdCBzbyB0aGF0IHRoZSBwb3J0IGlzIHNodXRkb3duLgorCQkgKi8KKwkJcHJpbnRrKCJtZ3NscGNfY2xvc2U6IGJhZCByZWZjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKwkKKwlpbmZvLT5jb3VudC0tOworCQorCS8qIGlmIGF0IGxlYXN0IG9uZSBvcGVuIHJlbWFpbmluZywgbGVhdmUgaGFyZHdhcmUgYWN0aXZlICovCisJaWYgKGluZm8tPmNvdW50KQorCQlnb3RvIGNsZWFudXA7CisJCisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKwkKKwkvKiBzZXQgdHR5LT5jbG9zaW5nIHRvIG5vdGlmeSBsaW5lIGRpc2NpcGxpbmUgdG8gCisJICogb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuIE9ubHkgdGhlIE5fVFRZCisJICogZGlzY2lwbGluZSBhcHBlYXJzIHRvIHVzZSB0aGlzIChwcHAgZG9lcyBub3QpLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJCisJLyogd2FpdCBmb3IgdHJhbnNtaXQgZGF0YSB0byBjbGVhciBhbGwgbGF5ZXJzICovCisJCisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkgeworCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50aygiJXMoJWQpOm1nc2xwY19jbG9zZSglcykgY2FsbGluZyB0dHlfd2FpdF91bnRpbF9zZW50XG4iLAorCQkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJfQorCQkKKyAJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCisgCQltZ3NscGNfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+dGltZW91dCk7CisKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCisJbGRpc2NfZmx1c2hfYnVmZmVyKHR0eSk7CisJCQorCXNodXRkb3duKGluZm8pOworCQorCXR0eS0+Y2xvc2luZyA9IDA7CisJaW5mby0+dHR5ID0gTlVMTDsKKwkKKwlpZiAoaW5mby0+YmxvY2tlZF9vcGVuKSB7CisJCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhpbmZvLT5jbG9zZV9kZWxheSkpOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwl9CisJCisJaW5mby0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOworCQkJIAorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCitjbGVhbnVwOgkJCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfY2xvc2UoJXMpIGV4aXQsIGNvdW50PSVkXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXywKKwkJCXR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCk7Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5LgorICovCitzdGF0aWMgdm9pZCBtZ3NscGNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCU1HU0xQQ19JTkZPICogaW5mbyA9IChNR1NMUENfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKKworCWlmICghaW5mbyApCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfd2FpdF91bnRpbF9zZW50KCVzKSBlbnRyeVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKyAgICAgIAorCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3dhaXRfdW50aWxfc2VudCIpKQorCQlyZXR1cm47CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJZ290byBleGl0OworCSAKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworICAgICAgCisJLyogU2V0IGNoZWNrIGludGVydmFsIHRvIDEvNSBvZiBlc3RpbWF0ZWQgdGltZSB0bworCSAqIHNlbmQgYSBjaGFyYWN0ZXIsIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuIFRoZSBjaGVjaworCSAqIGludGVydmFsIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiB0aGUgdGltZW91dC4KKwkgKiBOb3RlOiB1c2UgdGlnaHQgdGltaW5ncyBoZXJlIHRvIHNhdGlzZnkgdGhlIE5JU1QtUENUUy4KKwkgKi8gCisgICAgICAgCisJaWYgKCBpbmZvLT5wYXJhbXMuZGF0YV9yYXRlICkgeworCSAgICAgICAJY2hhcl90aW1lID0gaW5mby0+dGltZW91dC8oMzIgKiA1KTsKKwkJaWYgKCFjaGFyX3RpbWUpCisJCQljaGFyX3RpbWUrKzsKKwl9IGVsc2UKKwkJY2hhcl90aW1lID0gMTsKKwkJCisJaWYgKHRpbWVvdXQpCisJCWNoYXJfdGltZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNoYXJfdGltZSwgdGltZW91dCk7CisJCQorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQykgeworCQl3aGlsZSAoaW5mby0+dHhfYWN0aXZlKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoYXJfdGltZSkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICgoaW5mby0+dHhfY291bnQgfHwgaW5mby0+dHhfYWN0aXZlKSAmJgorCQkJaW5mby0+dHhfZW5hYmxlZCkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlicmVhazsKKwkJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisgICAgICAKK2V4aXQ6CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY193YWl0X3VudGlsX3NlbnQoJXMpIGV4aXRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lICk7Cit9CisKKy8qIENhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KKyAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgY2xvc2luZyBhbGwgb3BlbiBmaWxlcyBmb3IgdGhlIHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIG1nc2xwY19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlNR1NMUENfSU5GTyAqIGluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTptZ3NscGNfaGFuZ3VwKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19oYW5ndXAiKSkKKwkJcmV0dXJuOworCisJbWdzbHBjX2ZsdXNoX2J1ZmZlcih0dHkpOworCXNodXRkb3duKGluZm8pOworCQorCWluZm8tPmNvdW50ID0gMDsJCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKK30KKworLyogQmxvY2sgdGhlIGN1cnJlbnQgcHJvY2VzcyB1bnRpbCB0aGUgc3BlY2lmaWVkIHBvcnQKKyAqIGlzIHJlYWR5IHRvIGJlIG9wZW5lZC4KKyAqLworc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICBNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQJCXJldHZhbDsKKwlpbnQJCWRvX2Nsb2NhbCA9IDAsIGV4dHJhX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkgb24gJXNcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lICk7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgfHwgdHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpeworCQkvKiBub25ibG9jayBtb2RlIGlzIHNldCBvciBwb3J0IGlzIG5vdCBlbmFibGVkICovCisJCS8qIGp1c3QgdmVyaWZ5IHRoYXQgY2FsbG91dCBkZXZpY2UgaXMgbm90IGFjdGl2ZSAqLworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQorCQlkb19jbG9jYWwgPSAxOworCisJLyogV2FpdCBmb3IgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBpbmZvLT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAorCSAqIG1nc2xwY19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCSAKKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCIlcyglZCk6YmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jayBvbiAlcyBjb3VudD0lZFxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIGluZm8tPmNvdW50ICk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlleHRyYV9jb3VudCA9IDE7CisJCWluZm8tPmNvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpbmZvLT5ibG9ja2VkX29wZW4rKzsKKwkKKwl3aGlsZSAoMSkgeworCQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJfQorCQkKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpeworCQkJcmV0dmFsID0gKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJCQktRUFHQUlOIDogLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkgCWdldF9zaWduYWxzKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJCisgCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisgCQkgICAgKGRvX2Nsb2NhbCB8fCAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSkgKSB7CisgCQkJYnJlYWs7CisJCX0KKwkJCQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCQorCQlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJCXByaW50aygiJXMoJWQpOmJsb2NrX3RpbF9yZWFkeSBibG9ja2luZyBvbiAlcyBjb3VudD0lZFxuIiwKKwkJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCApOworCQkJCSAKKwkJc2NoZWR1bGUoKTsKKwl9CisJCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisJCisJaWYgKGV4dHJhX2NvdW50KQorCQlpbmZvLT5jb3VudCsrOworCWluZm8tPmJsb2NrZWRfb3Blbi0tOworCQorCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpibG9ja190aWxfcmVhZHkgYWZ0ZXIgYmxvY2tpbmcgb24gJXMgY291bnQ9JWRcbiIsCisJCQkgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCApOworCQkJIAorCWlmICghcmV0dmFsKQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQkKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IG1nc2xwY19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlNR1NMUENfSU5GTwkqaW5mbzsKKwlpbnQgCQkJcmV0dmFsLCBsaW5lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiB2ZXJpZnkgcmFuZ2Ugb2Ygc3BlY2lmaWVkIGxpbmUgbnVtYmVyICovCQorCWxpbmUgPSB0dHktPmluZGV4OworCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IG1nc2xwY19kZXZpY2VfY291bnQpKSB7CisJCXByaW50aygiJXMoJWQpOm1nc2xwY19vcGVuIHdpdGggaW52YWxpZCBsaW5lICMlZC5cbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxsaW5lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogZmluZCB0aGUgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgbGluZSAqLworCWluZm8gPSBtZ3NscGNfZGV2aWNlX2xpc3Q7CisJd2hpbGUoaW5mbyAmJiBpbmZvLT5saW5lICE9IGxpbmUpCisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19vcGVuIikpCisJCXJldHVybiAtRU5PREVWOworCQorCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOworCWluZm8tPnR0eSA9IHR0eTsKKwkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19vcGVuKCVzKSwgb2xkIHJlZiBjb3VudCA9ICVkXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLHR0eS0+ZHJpdmVyLT5uYW1lLCBpbmZvLT5jb3VudCk7CisKKwkvKiBJZiBwb3J0IGlzIGNsb3NpbmcsIHNpZ25hbCBjYWxsZXIgdG8gdHJ5IGFnYWluICovCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKXsKKwkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworCQlyZXR2YWwgPSAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJCisJaW5mby0+dHR5LT5sb3dfbGF0ZW5jeSA9IChpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwlpZiAoaW5mby0+bmV0Y291bnQpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJaW5mby0+Y291bnQrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+Y291bnQgPT0gMSkgeworCQkvKiAxc3Qgb3BlbiBvbiB0aGlzIGRldmljZSwgaW5pdCBoYXJkd2FyZSAqLworCQlyZXR2YWwgPSBzdGFydHVwKGluZm8pOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisJCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQkJcHJpbnRrKCIlcyglZCk6YmxvY2tfdGlsX3JlYWR5KCVzKSByZXR1cm5lZCAlZFxuIiwKKwkJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lLCByZXR2YWwpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXMoJWQpOm1nc2xwY19vcGVuKCVzKSBzdWNjZXNzXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisJcmV0dmFsID0gMDsKKwkKK2NsZWFudXA6CQkJCisJaWYgKHJldHZhbCkgeworCQlpZiAodHR5LT5jb3VudCA9PSAxKQorCQkJaW5mby0+dHR5ID0gTlVMTDsgLyogdHR5IGxheWVyIHdpbGwgcmVsZWFzZSB0dHkgc3RydWN0ICovCisJCWlmKGluZm8tPmNvdW50KQorCQkJaW5mby0+Y291bnQtLTsKKwl9CisJCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIC9wcm9jIGZzIHJvdXRpbmVzLi4uLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmVfaW5mbyhjaGFyICpidWYsIE1HU0xQQ19JTkZPICppbmZvKQoreworCWNoYXIJc3RhdF9idWZbMzBdOworCWludAlyZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJXM6aW86JTA0WCBpcnE6JWQiLAorCQkgICAgICBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aW9fYmFzZSwgaW5mby0+aXJxX2xldmVsKTsKKworCS8qIG91dHB1dCBjdXJyZW50IHNlcmlhbCBzaWduYWwgc3RhdGVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworIAlnZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKwlzdGF0X2J1ZlswXSA9IDA7CisJc3RhdF9idWZbMV0gPSAwOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxSVFMiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8Q1RTIik7CisJaWYgKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RUUikKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERUUiIpOworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EU1IpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxEU1IiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKQorCQlzdHJjYXQoc3RhdF9idWYsICJ8Q0QiKTsKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxSSSIpOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgSERMQyB0eG9rOiVkIHJ4b2s6JWQiLAorCQkJICAgICAgaW5mby0+aWNvdW50LnR4b2ssIGluZm8tPmljb3VudC5yeG9rKTsKKwkJaWYgKGluZm8tPmljb3VudC50eHVuZGVyKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiB0eHVuZGVyOiVkIiwgaW5mby0+aWNvdW50LnR4dW5kZXIpOworCQlpZiAoaW5mby0+aWNvdW50LnR4YWJvcnQpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHR4YWJvcnQ6JWQiLCBpbmZvLT5pY291bnQudHhhYm9ydCk7CisJCWlmIChpbmZvLT5pY291bnQucnhzaG9ydCkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhzaG9ydDolZCIsIGluZm8tPmljb3VudC5yeHNob3J0KTsJCisJCWlmIChpbmZvLT5pY291bnQucnhsb25nKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeGxvbmc6JWQiLCBpbmZvLT5pY291bnQucnhsb25nKTsKKwkJaWYgKGluZm8tPmljb3VudC5yeG92ZXIpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4b3ZlcjolZCIsIGluZm8tPmljb3VudC5yeG92ZXIpOworCQlpZiAoaW5mby0+aWNvdW50LnJ4Y3JjKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiByeGNyYzolZCIsIGluZm8tPmljb3VudC5yeGNyYyk7CisJfSBlbHNlIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBBU1lOQyB0eDolZCByeDolZCIsCisJCQkgICAgICBpbmZvLT5pY291bnQudHgsIGluZm8tPmljb3VudC5yeCk7CisJCWlmIChpbmZvLT5pY291bnQuZnJhbWUpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIGZlOiVkIiwgaW5mby0+aWNvdW50LmZyYW1lKTsKKwkJaWYgKGluZm8tPmljb3VudC5wYXJpdHkpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHBlOiVkIiwgaW5mby0+aWNvdW50LnBhcml0eSk7CisJCWlmIChpbmZvLT5pY291bnQuYnJrKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBicms6JWQiLCBpbmZvLT5pY291bnQuYnJrKTsJCisJCWlmIChpbmZvLT5pY291bnQub3ZlcnJ1bikKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgb2U6JWQiLCBpbmZvLT5pY291bnQub3ZlcnJ1bik7CisJfQorCQorCS8qIEFwcGVuZCBzZXJpYWwgc2lnbmFsIHN0YXR1cyB0byBlbmQgKi8KKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiICVzXG4iLCBzdGF0X2J1ZisxKTsKKwkKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAidHhhY3RpdmU9JWQgYmhfcmVxPSVkIGJoX3J1bj0lZCBwZW5kaW5nX2JoPSV4XG4iLAorCQkgICAgICAgaW5mby0+dHhfYWN0aXZlLGluZm8tPmJoX3JlcXVlc3RlZCxpbmZvLT5iaF9ydW5uaW5nLAorCQkgICAgICAgaW5mby0+cGVuZGluZ19iaCk7CisJCisJcmV0dXJuIHJldDsKK30KKworLyogQ2FsbGVkIHRvIHByaW50IGluZm9ybWF0aW9uIGFib3V0IGRldmljZXMKKyAqLworc3RhdGljIGludCBtZ3NscGNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMCwgbDsKKwlvZmZfdAliZWdpbiA9IDA7CisJTUdTTFBDX0lORk8gKmluZm87CisJCisJbGVuICs9IHNwcmludGYocGFnZSwgInN5bmNsaW5rIGRyaXZlcjolc1xuIiwgZHJpdmVyX3ZlcnNpb24pOworCQorCWluZm8gPSBtZ3NscGNfZGV2aWNlX2xpc3Q7CisJd2hpbGUoIGluZm8gKSB7CisJCWwgPSBsaW5lX2luZm8ocGFnZSArIGxlbiwgaW5mbyk7CisJCWxlbiArPSBsOworCQlpZiAobGVuK2JlZ2luID4gb2ZmK2NvdW50KQorCQkJZ290byBkb25lOworCQlpZiAobGVuK2JlZ2luIDwgb2ZmKSB7CisJCQliZWdpbiArPSBsZW47CisJCQlsZW4gPSAwOworCQl9CisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwl9CisKKwkqZW9mID0gMTsKK2RvbmU6CisJaWYgKG9mZiA+PSBsZW4rYmVnaW4pCisJCXJldHVybiAwOworCSpzdGFydCA9IHBhZ2UgKyAob2ZmLWJlZ2luKTsKKwlyZXR1cm4gKChjb3VudCA8IGJlZ2luK2xlbi1vZmYpID8gY291bnQgOiBiZWdpbitsZW4tb2ZmKTsKK30KKworaW50IHJ4X2FsbG9jX2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pCit7CisJLyogZWFjaCBidWZmZXIgaGFzIGhlYWRlciBhbmQgZGF0YSAqLworCWluZm8tPnJ4X2J1Zl9zaXplID0gc2l6ZW9mKFJYQlVGKSArIGluZm8tPm1heF9mcmFtZV9zaXplOworCisJLyogY2FsY3VsYXRlIHRvdGFsIGFsbG9jYXRpb24gc2l6ZSBmb3IgOCBidWZmZXJzICovCisJaW5mby0+cnhfYnVmX3RvdGFsX3NpemUgPSBpbmZvLT5yeF9idWZfc2l6ZSAqIDg7CisKKwkvKiBsaW1pdCB0b3RhbCBhbGxvY2F0ZWQgbWVtb3J5ICovCisJaWYgKGluZm8tPnJ4X2J1Zl90b3RhbF9zaXplID4gMHgxMDAwMCkKKwkJaW5mby0+cnhfYnVmX3RvdGFsX3NpemUgPSAweDEwMDAwOworCisJLyogY2FsY3VsYXRlIG51bWJlciBvZiBidWZmZXJzICovCisJaW5mby0+cnhfYnVmX2NvdW50ID0gaW5mby0+cnhfYnVmX3RvdGFsX3NpemUgLyBpbmZvLT5yeF9idWZfc2l6ZTsKKworCWluZm8tPnJ4X2J1ZiA9IGttYWxsb2MoaW5mby0+cnhfYnVmX3RvdGFsX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChpbmZvLT5yeF9idWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyeF9yZXNldF9idWZmZXJzKGluZm8pOworCXJldHVybiAwOworfQorCit2b2lkIHJ4X2ZyZWVfYnVmZmVycyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAoaW5mby0+cnhfYnVmKQorCQlrZnJlZShpbmZvLT5yeF9idWYpOworCWluZm8tPnJ4X2J1ZiA9IE5VTEw7Cit9CisKK2ludCBjbGFpbV9yZXNvdXJjZXMoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaWYgKHJ4X2FsbG9jX2J1ZmZlcnMoaW5mbykgPCAwICkgeworCQlwcmludGsoICJDYW50IGFsbG9jYXRlIHJ4IGJ1ZmZlciAlc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpOworCQlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQkKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZWxlYXNlX3Jlc291cmNlcyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJyZWxlYXNlX3Jlc291cmNlcyglcylcbiIsIGluZm8tPmRldmljZV9uYW1lKTsKKwlyeF9mcmVlX2J1ZmZlcnMoaW5mbyk7Cit9CisKKy8qIEFkZCB0aGUgc3BlY2lmaWVkIGRldmljZSBpbnN0YW5jZSBkYXRhIHN0cnVjdHVyZSB0byB0aGUKKyAqIGdsb2JhbCBsaW5rZWQgbGlzdCBvZiBkZXZpY2VzIGFuZCBpbmNyZW1lbnQgdGhlIGRldmljZSBjb3VudC4KKyAqIAkKKyAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICovCit2b2lkIG1nc2xwY19hZGRfZGV2aWNlKE1HU0xQQ19JTkZPICppbmZvKQoreworCWluZm8tPm5leHRfZGV2aWNlID0gTlVMTDsKKwlpbmZvLT5saW5lID0gbWdzbHBjX2RldmljZV9jb3VudDsKKwlzcHJpbnRmKGluZm8tPmRldmljZV9uYW1lLCJ0dHlTTFAlZCIsaW5mby0+bGluZSk7CisJCisJaWYgKGluZm8tPmxpbmUgPCBNQVhfREVWSUNFX0NPVU5UKSB7CisJCWlmIChtYXhmcmFtZVtpbmZvLT5saW5lXSkKKwkJCWluZm8tPm1heF9mcmFtZV9zaXplID0gbWF4ZnJhbWVbaW5mby0+bGluZV07CisJCWluZm8tPmRvc3luY3BwcCA9IGRvc3luY3BwcFtpbmZvLT5saW5lXTsKKwl9CisKKwltZ3NscGNfZGV2aWNlX2NvdW50Kys7CisJCisJaWYgKCFtZ3NscGNfZGV2aWNlX2xpc3QpCisJCW1nc2xwY19kZXZpY2VfbGlzdCA9IGluZm87CisJZWxzZSB7CQorCQlNR1NMUENfSU5GTyAqY3VycmVudF9kZXYgPSBtZ3NscGNfZGV2aWNlX2xpc3Q7CisJCXdoaWxlKCBjdXJyZW50X2Rldi0+bmV4dF9kZXZpY2UgKQorCQkJY3VycmVudF9kZXYgPSBjdXJyZW50X2Rldi0+bmV4dF9kZXZpY2U7CisJCWN1cnJlbnRfZGV2LT5uZXh0X2RldmljZSA9IGluZm87CisJfQorCQorCWlmIChpbmZvLT5tYXhfZnJhbWVfc2l6ZSA8IDQwOTYpCisJCWluZm8tPm1heF9mcmFtZV9zaXplID0gNDA5NjsKKwllbHNlIGlmIChpbmZvLT5tYXhfZnJhbWVfc2l6ZSA+IDY1NTM1KQorCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IDY1NTM1OworCQorCXByaW50ayggIlN5bmNMaW5rIFBDIENhcmQgJXM6SU89JTA0WCBJUlE9JWRcbiIsCisJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pb19iYXNlLCBpbmZvLT5pcnFfbGV2ZWwpOworCisjaWZkZWYgQ09ORklHX0hETEMKKwloZGxjZGV2X2luaXQoaW5mbyk7CisjZW5kaWYKK30KKwordm9pZCBtZ3NscGNfcmVtb3ZlX2RldmljZShNR1NMUENfSU5GTyAqcmVtb3ZlX2luZm8pCit7CisJTUdTTFBDX0lORk8gKmluZm8gPSBtZ3NscGNfZGV2aWNlX2xpc3Q7CisJTUdTTFBDX0lORk8gKmxhc3QgPSBOVUxMOworCisJd2hpbGUoaW5mbykgeworCQlpZiAoaW5mbyA9PSByZW1vdmVfaW5mbykgeworCQkJaWYgKGxhc3QpCisJCQkJbGFzdC0+bmV4dF9kZXZpY2UgPSBpbmZvLT5uZXh0X2RldmljZTsKKwkJCWVsc2UKKwkJCQltZ3NscGNfZGV2aWNlX2xpc3QgPSBpbmZvLT5uZXh0X2RldmljZTsKKyNpZmRlZiBDT05GSUdfSERMQworCQkJaGRsY2Rldl9leGl0KGluZm8pOworI2VuZGlmCisJCQlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKKwkJCWtmcmVlKGluZm8pOworCQkJbWdzbHBjX2RldmljZV9jb3VudC0tOworCQkJcmV0dXJuOworCQl9CisJCWxhc3QgPSBpbmZvOworCQlpbmZvID0gaW5mby0+bmV4dF9kZXZpY2U7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbWdzbHBjX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gInN5bmNsaW5rX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gbWdzbHBjX2F0dGFjaCwKKwkuZGV0YWNoCQk9IG1nc2xwY19kZXRhY2gsCit9OworCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIG1nc2xwY19vcHMgPSB7CisJLm9wZW4gPSBtZ3NscGNfb3BlbiwKKwkuY2xvc2UgPSBtZ3NscGNfY2xvc2UsCisJLndyaXRlID0gbWdzbHBjX3dyaXRlLAorCS5wdXRfY2hhciA9IG1nc2xwY19wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSBtZ3NscGNfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBtZ3NscGNfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gbWdzbHBjX2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gbWdzbHBjX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSBtZ3NscGNfaW9jdGwsCisJLnRocm90dGxlID0gbWdzbHBjX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gbWdzbHBjX3VudGhyb3R0bGUsCisJLnNlbmRfeGNoYXIgPSBtZ3NscGNfc2VuZF94Y2hhciwKKwkuYnJlYWtfY3RsID0gbWdzbHBjX2JyZWFrLAorCS53YWl0X3VudGlsX3NlbnQgPSBtZ3NscGNfd2FpdF91bnRpbF9zZW50LAorCS5yZWFkX3Byb2MgPSBtZ3NscGNfcmVhZF9wcm9jLAorCS5zZXRfdGVybWlvcyA9IG1nc2xwY19zZXRfdGVybWlvcywKKwkuc3RvcCA9IHR4X3BhdXNlLAorCS5zdGFydCA9IHR4X3JlbGVhc2UsCisJLmhhbmd1cCA9IG1nc2xwY19oYW5ndXAsCisJLnRpb2NtZ2V0ID0gdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gdGlvY21zZXQsCit9OworCitzdGF0aWMgdm9pZCBzeW5jbGlua19jc19jbGVhbnVwKHZvaWQpCit7CisJaW50IHJjOworCisJcHJpbnRrKCJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIGRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbik7CisKKwl3aGlsZShtZ3NscGNfZGV2aWNlX2xpc3QpCisJCW1nc2xwY19yZW1vdmVfZGV2aWNlKG1nc2xwY19kZXZpY2VfbGlzdCk7CisKKwlpZiAoc2VyaWFsX2RyaXZlcikgeworCQlpZiAoKHJjID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpKSkKKwkJCXByaW50aygiJXMoJWQpIGZhaWxlZCB0byB1bnJlZ2lzdGVyIHR0eSBkcml2ZXIgZXJyPSVkXG4iLAorCQkJICAgICAgIF9fRklMRV9fLF9fTElORV9fLHJjKTsKKwkJcHV0X3R0eV9kcml2ZXIoc2VyaWFsX2RyaXZlcik7CisJfQorCisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZtZ3NscGNfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHN5bmNsaW5rX2NzX2luaXQodm9pZCkKK3sKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoYnJlYWtfb25fbG9hZCkgeworCSAgICBtZ3NscGNfZ2V0X3RleHRfcHRyKCk7CisJICAgIEJSRUFLUE9JTlQoKTsKKyAgICB9CisKKyAgICBwcmludGsoIiVzICVzXG4iLCBkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24pOworCisgICAgaWYgKChyYyA9IHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJm1nc2xwY19kcml2ZXIpKSA8IDApCisJICAgIHJldHVybiByYzsKKworICAgIHNlcmlhbF9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1BWF9ERVZJQ0VfQ09VTlQpOworICAgIGlmICghc2VyaWFsX2RyaXZlcikgeworCSAgICByYyA9IC1FTk9NRU07CisJICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KKwkKKyAgICBzZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworICAgIHNlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gInN5bmNsaW5rX2NzIjsKKyAgICBzZXJpYWxfZHJpdmVyLT5uYW1lID0gInR0eVNMUCI7CisgICAgc2VyaWFsX2RyaXZlci0+bWFqb3IgPSB0dHltYWpvcjsKKyAgICBzZXJpYWxfZHJpdmVyLT5taW5vcl9zdGFydCA9IDY0OworICAgIHNlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworICAgIHNlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisgICAgc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworICAgIHNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkgICAgQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworICAgIHNlcmlhbF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKyAgICB0dHlfc2V0X29wZXJhdGlvbnMoc2VyaWFsX2RyaXZlciwgJm1nc2xwY19vcHMpOworCisgICAgaWYgKChyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpIDwgMCkgeworCSAgICBwcmludGsoIiVzKCVkKTpDb3VsZG4ndCByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iLAorCQkgICBfX0ZJTEVfXyxfX0xJTkVfXyk7CisJICAgIHB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCSAgICBzZXJpYWxfZHJpdmVyID0gTlVMTDsKKwkgICAgZ290byBlcnJvcjsKKyAgICB9CisJCQkKKyAgICBwcmludGsoIiVzICVzLCB0dHkgbWFqb3IjJWRcbiIsCisJICAgZHJpdmVyX25hbWUsIGRyaXZlcl92ZXJzaW9uLAorCSAgIHNlcmlhbF9kcml2ZXItPm1ham9yKTsKKwkKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgc3luY2xpbmtfY3NfY2xlYW51cCgpOworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN5bmNsaW5rX2NzX2V4aXQodm9pZCkgCit7CisJc3luY2xpbmtfY3NfY2xlYW51cCgpOworfQorCittb2R1bGVfaW5pdChzeW5jbGlua19jc19pbml0KTsKK21vZHVsZV9leGl0KHN5bmNsaW5rX2NzX2V4aXQpOworCitzdGF0aWMgdm9pZCBtZ3NscGNfc2V0X3JhdGUoTUdTTFBDX0lORk8gKmluZm8sIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IE0sIE47CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwkvKiBub3RlOnN0YW5kYXJkIEJSRyBtb2RlIGlzIGJyb2tlbiBpbiBWMy4yIGNoaXAgCisJICogc28gZW5oYW5jZWQgbW9kZSBpcyBhbHdheXMgdXNlZCAKKwkgKi8KKworCWlmIChyYXRlKSB7CisJCU4gPSAzNjg2NDAwIC8gcmF0ZTsKKwkJaWYgKCFOKQorCQkJTiA9IDE7CisJCU4gPj49IDE7CisJCWZvciAoTSA9IDE7IE4gPiA2NCAmJiBNIDwgMTY7IE0rKykKKwkJCU4gPj49IDE7CisJCU4tLTsKKworCQkvKiBCR1JbNS4uMF0gPSBOCisJCSAqIEJHUls5Li42XSA9IE0KKwkJICogQkdSWzcuLjBdIGNvbnRhaW5lZCBpbiBCR1IgcmVnaXN0ZXIKKwkJICogQkdSWzkuLjhdIGNvbnRhaW5lZCBpbiBDQ1IyWzcuLjZdCisJCSAqIGRpdmlzb3IgPSAoTisxKSoyXk0KKwkJICoKKwkJICogTm90ZTogTSAqbXVzdCogbm90IGJlIHplcm8gKGNhdXNlcyBhc3ltZXRyaWMgZHV0eSBjeWNsZSkKKwkJICovIAorCQl3cml0ZV9yZWcoaW5mbywgKHVuc2lnbmVkIGNoYXIpIChjaGFubmVsICsgQkdSKSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyKSAoKE0gPDwgNikgKyBOKSk7CisJCXZhbCA9IHJlYWRfcmVnKGluZm8sICh1bnNpZ25lZCBjaGFyKSAoY2hhbm5lbCArIENDUjIpKSAmIDB4M2Y7CisJCXZhbCB8PSAoKE0gPDwgNCkgJiAweGMwKTsKKwkJd3JpdGVfcmVnKGluZm8sICh1bnNpZ25lZCBjaGFyKSAoY2hhbm5lbCArIENDUjIpLCB2YWwpOworCX0KK30KKworLyogRW5hYmxlZCB0aGUgQVVYIGNsb2NrIG91dHB1dCBhdCB0aGUgc3BlY2lmaWVkIGZyZXF1ZW5jeS4KKyAqLworc3RhdGljIHZvaWQgZW5hYmxlX2F1eGNsayhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwkKKwkvKiBNT0RFCisJICoKKwkgKiAwNy4uMDYgIE1EU1sxLi4wXSAxMCA9IHRyYW5zcGFyZW50IEhETEMgbW9kZQorCSAqIDA1ICAgICAgQURNIEFkZHJlc3MgTW9kZSwgMCA9IG5vIGFkZHIgcmVjb2duaXRpb24KKwkgKiAwNCAgICAgIFRNRCBUaW1lciBNb2RlLCAwID0gZXh0ZXJuYWwKKwkgKiAwMyAgICAgIFJBQyBSZWNlaXZlciBBY3RpdmUsIDAgPSBpbmFjdGl2ZQorCSAqIDAyICAgICAgUlRTIDA9UlRTIGFjdGl2ZSBkdXJpbmcgeG1pdCwgMT1SVFMgYWx3YXlzIGFjdGl2ZQorCSAqIDAxICAgICAgVFJTIFRpbWVyIFJlc29sdXRpb24sIDE9NTEyCisJICogMDAgICAgICBUTFAgVGVzdCBMb29wLCAwID0gbm8gbG9vcAorCSAqCisJICogMTAwMCAwMDEwCisJICovIAorCXZhbCA9IDB4ODI7CisJCisJLyogY2hhbm5lbCBCIFJUUyBpcyB1c2VkIHRvIGVuYWJsZSBBVVhDTEsgZHJpdmVyIG9uIFNQNTA1ICovIAorCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfSERMQyAmJiBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpCisJCXZhbCB8PSBCSVQyOworCXdyaXRlX3JlZyhpbmZvLCBDSEIgKyBNT0RFLCB2YWwpOworCQorCS8qIENDUjAKKwkgKgorCSAqIDA3ICAgICAgUFUgUG93ZXIgVXAsIDE9YWN0aXZlLCAwPXBvd2VyIGRvd24KKwkgKiAwNiAgICAgIE1DRSBNYXN0ZXIgQ2xvY2sgRW5hYmxlLCAxPWVuYWJsZWQKKwkgKiAwNSAgICAgIFJlc2VydmVkLCAwCisJICogMDQuLjAyICBTQ1syLi4wXSBFbmNvZGluZworCSAqIDAxLi4wMCAgU01bMS4uMF0gU2VyaWFsIE1vZGUsIDAwPUhETEMKKwkgKgorCSAqIDExMDAwMDAwCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEIgKyBDQ1IwLCAweGMwKTsKKwkKKwkvKiBDQ1IxCisJICoKKwkgKiAwNyAgICAgIFNGTEcgU2hhcmVkIEZsYWcsIDAgPSBkaXNhYmxlIHNoYXJlZCBmbGFncworCSAqIDA2ICAgICAgR0FMUCBHbyBBY3RpdmUgT24gTG9vcCwgMCA9IG5vdCB1c2VkCisJICogMDUgICAgICBHTFAgR28gT24gTG9vcCwgMCA9IG5vdCB1c2VkCisJICogMDQgICAgICBPRFMgT3V0cHV0IERyaXZlciBTZWxlY3QsIDE9VHhEIGlzIHB1c2gtcHVsbCBvdXRwdXQKKwkgKiAwMyAgICAgIElURiBJbnRlcmZyYW1lIFRpbWUgRmlsbCwgMD1tYXJrLCAxPWZsYWcKKwkgKiAwMi4uMDAgIENNWzIuLjBdIENsb2NrIE1vZGUKKwkgKgorCSAqIDAwMDEgMDExMQorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hCICsgQ0NSMSwgMHgxNyk7CisJCisJLyogQ0NSMiAoQ2hhbm5lbCBCKQorCSAqCisJICogMDcuLjA2ICBCR1JbOS4uOF0gQmF1ZCByYXRlIGJpdHMgOS4uOAorCSAqIDA1ICAgICAgQkRGIEJhdWQgcmF0ZSBkaXZpc29yIGZhY3RvciwgMD0xLCAxPUJHUiB2YWx1ZQorCSAqIDA0ICAgICAgU1NFTCBDbG9jayBzb3VyY2Ugc2VsZWN0LCAxPXN1Ym1vZGUgYgorCSAqIDAzICAgICAgVE9FIDA9VHhDTEsgaXMgaW5wdXQsIDE9VHhDTEsgaXMgb3V0cHV0CisJICogMDIgICAgICBSV1ggUmVhZC9Xcml0ZSBFeGNoYW5nZSAwPWRpc2FibGVkCisJICogMDEgICAgICBDMzIsIENSQyBzZWxlY3QsIDA9Q1JDLTE2LCAxPUNSQy0zMgorCSAqIDAwICAgICAgRElWLCBkYXRhIGludmVyc2lvbiAwPWRpc2FibGVkLCAxPWVuYWJsZWQKKwkgKgorCSAqIDAwMTEgMTAwMAorCSAqLyAKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgJiYgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKQorCQl3cml0ZV9yZWcoaW5mbywgQ0hCICsgQ0NSMiwgMHgzOCk7CisJZWxzZQorCQl3cml0ZV9yZWcoaW5mbywgQ0hCICsgQ0NSMiwgMHgzMCk7CisJCisJLyogQ0NSNAorCSAqCisJICogMDcgICAgICBNQ0s0IE1hc3RlciBDbG9jayBEaXZpZGUgYnkgNCwgMT1lbmFibGVkCisJICogMDYgICAgICBFQlJHIEVuaGFuY2VkIEJhdWQgUmF0ZSBHZW5lcmF0b3IgTW9kZSwgMT1lbmFibGVkCisJICogMDUgICAgICBUU1QxIFRlc3QgUGluLCAwPW5vcm1hbCBvcGVyYXRpb24KKwkgKiAwNCAgICAgIElDRCBJdmVydCBDYXJyaWVyIERldGVjdCwgMT1lbmFibGVkIChhY3RpdmUgbG93KQorCSAqIDAzLi4wMiAgUmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDAxLi4wMCAgUkZUWzEuLjBdIFJ4RklGTyBUaHJlc2hvbGQgMDA9MzIgYnl0ZXMKKwkgKgorCSAqIDAxMDEgMDAwMAorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hCICsgQ0NSNCwgMHg1MCk7CisJCisJLyogaWYgYXV4Y2xrIG5vdCBlbmFibGVkLCBzZXQgaW50ZXJuYWwgQlJHIHNvCisJICogQ1RTIHRyYW5zaXRpb25zIGNhbiBiZSBkZXRlY3RlZCAocmVxdWlyZXMgVHhDKQorCSAqLyAKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMgJiYgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKQorCQltZ3NscGNfc2V0X3JhdGUoaW5mbywgQ0hCLCBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpOworCWVsc2UKKwkJbWdzbHBjX3NldF9yYXRlKGluZm8sIENIQiwgOTIxNjAwKTsKK30KKworc3RhdGljIHZvaWQgbG9vcGJhY2tfZW5hYmxlKE1HU0xQQ19JTkZPICppbmZvKSAKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwkKKwkvKiBDQ1IxOjAyLi4wMCAgQ01bMi4uMF0gQ2xvY2sgTW9kZSA9IDExMSAoY2xvY2sgbW9kZSA3KSAqLyAKKwl2YWwgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBDQ1IxKSB8IChCSVQyICsgQklUMSArIEJJVDApOworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IxLCB2YWwpOworCQorCS8qIENDUjI6MDQgU1NFTCBDbG9jayBzb3VyY2Ugc2VsZWN0LCAxPXN1Ym1vZGUgYiAqLyAKKwl2YWwgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBDQ1IyKSB8IChCSVQ0ICsgQklUNSk7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjIsIHZhbCk7CisJCisJLyogc2V0IExpbmtTcGVlZCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBkZWZhdWx0IHRvIDJNYnBzICovIAorCWlmIChpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpCisJCW1nc2xwY19zZXRfcmF0ZShpbmZvLCBDSEEsIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCk7CisJZWxzZQorCQltZ3NscGNfc2V0X3JhdGUoaW5mbywgQ0hBLCAxODQzMjAwKTsKKwkKKwkvKiBNT0RFOjAwIFRMUCBUZXN0IExvb3AsIDE9bG9vcGJhY2sgZW5hYmxlZCAqLyAKKwl2YWwgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBNT0RFKSB8IEJJVDA7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIE1PREUsIHZhbCk7Cit9CisKK3ZvaWQgaGRsY19tb2RlKE1HU0xQQ19JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCXVuc2lnbmVkIGNoYXIgY2xrbW9kZSwgY2xrc3VibW9kZTsKKworCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8gCisJaXJxX2Rpc2FibGUoaW5mbywgQ0hBLCAweGZmZmYpOworCWlycV9kaXNhYmxlKGluZm8sIENIQiwgMHhmZmZmKTsKKwlwb3J0X2lycV9kaXNhYmxlKGluZm8sIDB4ZmYpOworCQorCS8qIGFzc3VtZSBjbG9jayBtb2RlIDBhLCByY3Y9UnhDIHhtdD1UeEMgKi8gCisJY2xrbW9kZSA9IGNsa3N1Ym1vZGUgPSAwOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX0RQTEwKKwkgICAgJiYgaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1RYQ19EUExMKSB7CisJCS8qIGNsb2NrIG1vZGUgN2EsIHJjdiA9IERQTEwsIHhtdCA9IERQTEwgKi8gCisJCWNsa21vZGUgPSA3OworCX0gZWxzZSBpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1JYQ19CUkcKKwkJICYmIGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfQlJHKSB7CisJCS8qIGNsb2NrIG1vZGUgN2IsIHJjdiA9IEJSRywgeG10ID0gQlJHICovIAorCQljbGttb2RlID0gNzsKKwkJY2xrc3VibW9kZSA9IDE7CisJfSBlbHNlIGlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfUlhDX0RQTEwpIHsKKwkJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfQlJHKSB7CisJCQkvKiBjbG9jayBtb2RlIDZiLCByY3YgPSBEUExMLCB4bXQgPSBCUkcvMTYgKi8gCisJCQljbGttb2RlID0gNjsKKwkJCWNsa3N1Ym1vZGUgPSAxOworCQl9IGVsc2UgeworCQkJLyogY2xvY2sgbW9kZSA2YSwgcmN2ID0gRFBMTCwgeG10ID0gVHhDICovIAorCQkJY2xrbW9kZSA9IDY7CisJCX0KKwl9IGVsc2UgaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfQlJHKSB7CisJCS8qIGNsb2NrIG1vZGUgMGIsIHJjdiA9IFJ4QywgeG10ID0gQlJHICovIAorCQljbGtzdWJtb2RlID0gMTsKKwl9CisJCisJLyogTU9ERQorCSAqCisJICogMDcuLjA2ICBNRFNbMS4uMF0gMTAgPSB0cmFuc3BhcmVudCBIRExDIG1vZGUKKwkgKiAwNSAgICAgIEFETSBBZGRyZXNzIE1vZGUsIDAgPSBubyBhZGRyIHJlY29nbml0aW9uCisJICogMDQgICAgICBUTUQgVGltZXIgTW9kZSwgMCA9IGV4dGVybmFsCisJICogMDMgICAgICBSQUMgUmVjZWl2ZXIgQWN0aXZlLCAwID0gaW5hY3RpdmUKKwkgKiAwMiAgICAgIFJUUyAwPVJUUyBhY3RpdmUgZHVyaW5nIHhtaXQsIDE9UlRTIGFsd2F5cyBhY3RpdmUKKwkgKiAwMSAgICAgIFRSUyBUaW1lciBSZXNvbHV0aW9uLCAxPTUxMgorCSAqIDAwICAgICAgVExQIFRlc3QgTG9vcCwgMCA9IG5vIGxvb3AKKwkgKgorCSAqIDEwMDAgMDAxMAorCSAqLyAKKwl2YWwgPSAweDgyOworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2spCisJCXZhbCB8PSBCSVQwOworCQorCS8qIHByZXNlcnZlIFJUUyBzdGF0ZSAqLyAKKwlpZiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKQorCQl2YWwgfD0gQklUMjsKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgTU9ERSwgdmFsKTsKKwkKKwkvKiBDQ1IwCisJICoKKwkgKiAwNyAgICAgIFBVIFBvd2VyIFVwLCAxPWFjdGl2ZSwgMD1wb3dlciBkb3duCisJICogMDYgICAgICBNQ0UgTWFzdGVyIENsb2NrIEVuYWJsZSwgMT1lbmFibGVkCisJICogMDUgICAgICBSZXNlcnZlZCwgMAorCSAqIDA0Li4wMiAgU0NbMi4uMF0gRW5jb2RpbmcKKwkgKiAwMS4uMDAgIFNNWzEuLjBdIFNlcmlhbCBNb2RlLCAwMD1IRExDCisJICoKKwkgKiAxMTAwMDAwMAorCSAqLyAKKwl2YWwgPSAweGMwOworCXN3aXRjaCAoaW5mby0+cGFyYW1zLmVuY29kaW5nKQorCXsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSToKKwkJdmFsIHw9IEJJVDM7CisJCWJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOgorCQl2YWwgfD0gQklUNDsKKwkJYnJlYWs7CQkvLyBGTTAKKwljYXNlIEhETENfRU5DT0RJTkdfQklQSEFTRV9NQVJLOgorCQl2YWwgfD0gQklUNCArIEJJVDI7CisJCWJyZWFrOwkJLy8gRk0xCisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUw6CisJCXZhbCB8PSBCSVQ0ICsgQklUMzsKKwkJYnJlYWs7CQkvLyBNYW5jaGVzdGVyCisJfQorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IwLCB2YWwpOworCQorCS8qIENDUjEKKwkgKgorCSAqIDA3ICAgICAgU0ZMRyBTaGFyZWQgRmxhZywgMCA9IGRpc2FibGUgc2hhcmVkIGZsYWdzCisJICogMDYgICAgICBHQUxQIEdvIEFjdGl2ZSBPbiBMb29wLCAwID0gbm90IHVzZWQKKwkgKiAwNSAgICAgIEdMUCBHbyBPbiBMb29wLCAwID0gbm90IHVzZWQKKwkgKiAwNCAgICAgIE9EUyBPdXRwdXQgRHJpdmVyIFNlbGVjdCwgMT1UeEQgaXMgcHVzaC1wdWxsIG91dHB1dAorCSAqIDAzICAgICAgSVRGIEludGVyZnJhbWUgVGltZSBGaWxsLCAwPW1hcmssIDE9ZmxhZworCSAqIDAyLi4wMCAgQ01bMi4uMF0gQ2xvY2sgTW9kZQorCSAqCisJICogMDAwMSAwMDAwCisJICovIAorCXZhbCA9IDB4MTAgKyBjbGttb2RlOworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IxLCB2YWwpOworCQorCS8qIENDUjIKKwkgKgorCSAqIDA3Li4wNiAgQkdSWzkuLjhdIEJhdWQgcmF0ZSBiaXRzIDkuLjgKKwkgKiAwNSAgICAgIEJERiBCYXVkIHJhdGUgZGl2aXNvciBmYWN0b3IsIDA9MSwgMT1CR1IgdmFsdWUKKwkgKiAwNCAgICAgIFNTRUwgQ2xvY2sgc291cmNlIHNlbGVjdCwgMT1zdWJtb2RlIGIKKwkgKiAwMyAgICAgIFRPRSAwPVR4Q0xLIGlzIGlucHV0LCAwPVR4Q0xLIGlzIGlucHV0CisJICogMDIgICAgICBSV1ggUmVhZC9Xcml0ZSBFeGNoYW5nZSAwPWRpc2FibGVkCisJICogMDEgICAgICBDMzIsIENSQyBzZWxlY3QsIDA9Q1JDLTE2LCAxPUNSQy0zMgorCSAqIDAwICAgICAgRElWLCBkYXRhIGludmVyc2lvbiAwPWRpc2FibGVkLCAxPWVuYWJsZWQKKwkgKgorCSAqIDAwMDAgMDAwMAorCSAqLyAKKwl2YWwgPSAweDAwOworCWlmIChjbGttb2RlID09IDIgfHwgY2xrbW9kZSA9PSAzIHx8IGNsa21vZGUgPT0gNgorCSAgICB8fCBjbGttb2RlID09IDcgfHwgKGNsa21vZGUgPT0gMCAmJiBjbGtzdWJtb2RlID09IDEpKQorCQl2YWwgfD0gQklUNTsKKwlpZiAoY2xrc3VibW9kZSkKKwkJdmFsIHw9IEJJVDQ7CisJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ18zMl9DQ0lUVCkKKwkJdmFsIHw9IEJJVDE7CisJaWYgKGluZm8tPnBhcmFtcy5lbmNvZGluZyA9PSBIRExDX0VOQ09ESU5HX05SWkIpCisJCXZhbCB8PSBCSVQwOworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IyLCB2YWwpOworCQorCS8qIENDUjMKKwkgKgorCSAqIDA3Li4wNiAgUFJFWzEuLjBdIFByZWFtYmxlIGNvdW50IDAwPTEsIDAxPTIsIDEwPTQsIDExPTgKKwkgKiAwNSAgICAgIEVQVCBFbmFibGUgcHJlYW1ibGUgdHJhbnNtaXNzaW9uLCAxPWVuYWJsZWQKKwkgKiAwNCAgICAgIFJBREQgUmVjZWl2ZSBhZGRyZXNzIHB1c2hlZCB0byBGSUZPLCAwPWRpc2FibGVkCisJICogMDMgICAgICBDUkwgQ1JDIFJlc2V0IExldmVsLCAwPUZGRkYKKwkgKiAwMiAgICAgIFJDUkMgUnggQ1JDIDA9T24gMT1PZmYKKwkgKiAwMSAgICAgIFRDUkMgVHggQ1JDIDA9T24gMT1PZmYKKwkgKiAwMCAgICAgIFBTRCBEUExMIFBoYXNlIFNoaWZ0IERpc2FibGUKKwkgKgorCSAqIDAwMDAgMDAwMAorCSAqLyAKKwl2YWwgPSAweDAwOworCWlmIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgPT0gSERMQ19DUkNfTk9ORSkKKwkJdmFsIHw9IEJJVDIgKyBCSVQxOworCWlmIChpbmZvLT5wYXJhbXMucHJlYW1ibGUgIT0gSERMQ19QUkVBTUJMRV9QQVRURVJOX05PTkUpCisJCXZhbCB8PSBCSVQ1OworCXN3aXRjaCAoaW5mby0+cGFyYW1zLnByZWFtYmxlX2xlbmd0aCkKKwl7CisJY2FzZSBIRExDX1BSRUFNQkxFX0xFTkdUSF8xNkJJVFM6CisJCXZhbCB8PSBCSVQ2OworCQlicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfTEVOR1RIXzMyQklUUzoKKwkJdmFsIHw9IEJJVDY7CisJCWJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9MRU5HVEhfNjRCSVRTOgorCQl2YWwgfD0gQklUNyArIEJJVDY7CisJCWJyZWFrOworCX0KKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSMywgdmFsKTsKKwkKKwkvKiBQUkUgLSBQcmVhbWJsZSBwYXR0ZXJuICovIAorCXZhbCA9IDA7CisJc3dpdGNoIChpbmZvLT5wYXJhbXMucHJlYW1ibGUpCisJeworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOX0ZMQUdTOiB2YWwgPSAweDdlOyBicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfUEFUVEVSTl8xMDogICAgdmFsID0gMHhhYTsgYnJlYWs7CisJY2FzZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fMDE6ICAgIHZhbCA9IDB4NTU7IGJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOX09ORVM6ICB2YWwgPSAweGZmOyBicmVhazsKKwl9CisJd3JpdGVfcmVnKGluZm8sIENIQSArIFBSRSwgdmFsKTsKKwkKKwkvKiBDQ1I0CisJICoKKwkgKiAwNyAgICAgIE1DSzQgTWFzdGVyIENsb2NrIERpdmlkZSBieSA0LCAxPWVuYWJsZWQKKwkgKiAwNiAgICAgIEVCUkcgRW5oYW5jZWQgQmF1ZCBSYXRlIEdlbmVyYXRvciBNb2RlLCAxPWVuYWJsZWQKKwkgKiAwNSAgICAgIFRTVDEgVGVzdCBQaW4sIDA9bm9ybWFsIG9wZXJhdGlvbgorCSAqIDA0ICAgICAgSUNEIEl2ZXJ0IENhcnJpZXIgRGV0ZWN0LCAxPWVuYWJsZWQgKGFjdGl2ZSBsb3cpCisJICogMDMuLjAyICBSZXNlcnZlZCwgbXVzdCBiZSAwCisJICogMDEuLjAwICBSRlRbMS4uMF0gUnhGSUZPIFRocmVzaG9sZCAwMD0zMiBieXRlcworCSAqCisJICogMDEwMSAwMDAwCisJICovIAorCXZhbCA9IDB4NTA7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjQsIHZhbCk7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfRFBMTCkKKwkJbWdzbHBjX3NldF9yYXRlKGluZm8sIENIQSwgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkICogMTYpOworCWVsc2UKKwkJbWdzbHBjX3NldF9yYXRlKGluZm8sIENIQSwgaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKTsKKwkKKwkvKiBSTENSIFJlY2VpdmUgbGVuZ3RoIGNoZWNrIHJlZ2lzdGVyCisJICoKKwkgKiA3ICAgICAxPWVuYWJsZSByZWNlaXZlIGxlbmd0aCBjaGVjaworCSAqIDYuLjAgIE1heCBmcmFtZSBsZW5ndGggPSAoUkwgKyAxKSAqIDMyCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBSTENSLCAwKTsKKwkKKwkvKiBYQkNIIFRyYW5zbWl0IEJ5dGUgQ291bnQgSGlnaAorCSAqCisJICogMDcgICAgICBETUEgbW9kZSwgMCA9IGludGVycnVwdCBkcml2ZW4KKwkgKiAwNiAgICAgIE5STSwgMD1BQk0gKGlnbm9yZWQpCisJICogMDUgICAgICBDQVMgQ2FycmllciBBdXRvIFN0YXJ0CisJICogMDQgICAgICBYQyBUcmFuc21pdCBDb250aW51b3VzbHkgKGlnbm9yZWQpCisJICogMDMuLjAwICBYQkNbMTAuLjhdIFRyYW5zbWl0IGJ5dGUgY291bnQgYml0cyAxMC4uOAorCSAqCisJICogMDAwMCAwMDAwCisJICovIAorCXZhbCA9IDB4MDA7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0RDRCkKKwkJdmFsIHw9IEJJVDU7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIFhCQ0gsIHZhbCk7CisJZW5hYmxlX2F1eGNsayhpbmZvKTsKKwlpZiAoaW5mby0+cGFyYW1zLmxvb3BiYWNrIHx8IGluZm8tPnRlc3RpbmdfaXJxKQorCQlsb29wYmFja19lbmFibGUoaW5mbyk7CisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0NUUykKKwl7CisJCWlycV9lbmFibGUoaW5mbywgQ0hCLCBJUlFfQ1RTKTsKKwkJLyogUFZSWzNdIDE9QVVUTyBDVFMgYWN0aXZlICovIAorCQlzZXRfcmVnX2JpdHMoaW5mbywgQ0hBICsgUFZSLCBCSVQzKTsKKwl9IGVsc2UKKwkJY2xlYXJfcmVnX2JpdHMoaW5mbywgQ0hBICsgUFZSLCBCSVQzKTsKKworCWlycV9lbmFibGUoaW5mbywgQ0hBLAorCQkJIElSUV9SWEVPTSArIElSUV9SWEZJRk8gKyBJUlFfQUxMU0VOVCArCisJCQkgSVJRX1VOREVSUlVOICsgSVJRX1RYRklGTyk7CisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9UWFJFU0VUICsgQ01EX1JYUkVTRVQpOworCXdhaXRfY29tbWFuZF9jb21wbGV0ZShpbmZvLCBDSEEpOworCXJlYWRfcmVnMTYoaW5mbywgQ0hBICsgSVNSKTsJLyogY2xlYXIgcGVuZGluZyBJUlFzICovCisJCisJLyogTWFzdGVyIGNsb2NrIG1vZGUgZW5hYmxlZCBhYm92ZSB0byBhbGxvdyByZXNldCBjb21tYW5kcworCSAqIHRvIGNvbXBsZXRlIGV2ZW4gaWYgbm8gZGF0YSBjbG9ja3MgYXJlIHByZXNlbnQuCisJICoKKwkgKiBEaXNhYmxlIG1hc3RlciBjbG9jayBtb2RlIGZvciBub3JtYWwgY29tbXVuaWNhdGlvbnMgYmVjYXVzZQorCSAqIFYzLjIgb2YgdGhlIEVTQ0MyIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHRoZSB0cmFuc21pdCBhbGwgc2VudAorCSAqIElSUSB3aGVuIGluIG1hc3RlciBjbG9jayBtb2RlLgorCSAqCisJICogTGVhdmUgbWFzdGVyIGNsb2NrIG1vZGUgZW5hYmxlZCBmb3IgSVJRIHRlc3QgYmVjYXVzZSB0aGUKKwkgKiB0aW1lciBJUlEgdXNlZCBieSB0aGUgdGVzdCBjYW4gb25seSBoYXBwZW4gaW4gbWFzdGVyIGNsb2NrIG1vZGUuCisJICovIAorCWlmICghaW5mby0+dGVzdGluZ19pcnEpCisJCWNsZWFyX3JlZ19iaXRzKGluZm8sIENIQSArIENDUjAsIEJJVDYpOworCisJdHhfc2V0X2lkbGUoaW5mbyk7CisKKwl0eF9zdG9wKGluZm8pOworCXJ4X3N0b3AoaW5mbyk7Cit9CisKK3ZvaWQgcnhfc3RvcChNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTpyeF9zdG9wKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwkvKiBNT0RFOjAzIFJBQyBSZWNlaXZlciBBY3RpdmUsIDA9aW5hY3RpdmUgKi8gCisJY2xlYXJfcmVnX2JpdHMoaW5mbywgQ0hBICsgTU9ERSwgQklUMyk7CisKKwlpbmZvLT5yeF9lbmFibGVkID0gMDsKKwlpbmZvLT5yeF9vdmVyZmxvdyA9IDA7Cit9CisKK3ZvaWQgcnhfc3RhcnQoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKKwkJcHJpbnRrKCIlcyglZCk6cnhfc3RhcnQoJXMpXG4iLAorCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSApOworCisJcnhfcmVzZXRfYnVmZmVycyhpbmZvKTsKKwlpbmZvLT5yeF9lbmFibGVkID0gMDsKKwlpbmZvLT5yeF9vdmVyZmxvdyA9IDA7CisKKwkvKiBNT0RFOjAzIFJBQyBSZWNlaXZlciBBY3RpdmUsIDE9YWN0aXZlICovIAorCXNldF9yZWdfYml0cyhpbmZvLCBDSEEgKyBNT0RFLCBCSVQzKTsKKworCWluZm8tPnJ4X2VuYWJsZWQgPSAxOworfQorCit2b2lkIHR4X3N0YXJ0KE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCisJCXByaW50aygiJXMoJWQpOnR4X3N0YXJ0KCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlpZiAoaW5mby0+dHhfY291bnQpIHsKKwkJLyogSWYgYXV0byBSVFMgZW5hYmxlZCBhbmQgUlRTIGlzIGluYWN0aXZlLCB0aGVuIGFzc2VydCAqLworCQkvKiBSVFMgYW5kIHNldCBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBkcml2ZXIgc2hvdWxkICovCisJCS8qIG5lZ2F0ZSBSVFMgd2hlbiB0aGUgdHJhbnNtaXNzaW9uIGNvbXBsZXRlcy4gKi8KKwkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDA7CisKKwkJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX1JUUykgeworCQkJZ2V0X3NpZ25hbHMoaW5mbyk7CisJCQlpZiAoIShpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpKSB7CisJCQkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKwkJCQlzZXRfc2lnbmFscyhpbmZvKTsKKwkJCQlpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lID0gMTsKKwkJCX0KKwkJfQorCisJCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMpIHsKKwkJCWlmICghaW5mby0+dHhfYWN0aXZlKSB7CisJCQkJaW5mby0+dHhfYWN0aXZlID0gMTsKKwkJCQl0eF9yZWFkeShpbmZvKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWluZm8tPnR4X2FjdGl2ZSA9IDE7CisJCQl0eF9yZWFkeShpbmZvKTsKKwkJCWluZm8tPnR4X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDAwKTsKKwkJCWFkZF90aW1lcigmaW5mby0+dHhfdGltZXIpOwkKKwkJfQorCX0KKworCWlmICghaW5mby0+dHhfZW5hYmxlZCkKKwkJaW5mby0+dHhfZW5hYmxlZCA9IDE7Cit9CisKK3ZvaWQgdHhfc3RvcChNR1NMUENfSU5GTyAqaW5mbykKK3sKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQorCQlwcmludGsoIiVzKCVkKTp0eF9zdG9wKCVzKVxuIiwKKwkJCSBfX0ZJTEVfXyxfX0xJTkVfXywgaW5mby0+ZGV2aWNlX25hbWUgKTsKKwkJCSAKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsJCisKKwlpbmZvLT50eF9lbmFibGVkID0gMDsKKwlpbmZvLT50eF9hY3RpdmUgID0gMDsKK30KKworLyogUmVzZXQgdGhlIGFkYXB0ZXIgdG8gYSBrbm93biBzdGF0ZSBhbmQgcHJlcGFyZSBpdCBmb3IgZnVydGhlciB1c2UuCisgKi8KK3ZvaWQgcmVzZXRfZGV2aWNlKE1HU0xQQ19JTkZPICppbmZvKQoreworCS8qIHBvd2VyIHVwIGJvdGggY2hhbm5lbHMgKHNldCBCSVQ3KSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSMCwgMHg4MCk7CisJd3JpdGVfcmVnKGluZm8sIENIQiArIENDUjAsIDB4ODApOworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBNT0RFLCAwKTsKKwl3cml0ZV9yZWcoaW5mbywgQ0hCICsgTU9ERSwgMCk7CisJCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLyAKKwlpcnFfZGlzYWJsZShpbmZvLCBDSEEsIDB4ZmZmZik7CisJaXJxX2Rpc2FibGUoaW5mbywgQ0hCLCAweGZmZmYpOworCXBvcnRfaXJxX2Rpc2FibGUoaW5mbywgMHhmZik7CisJCisJLyogUENSIFBvcnQgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCSAqCisJICogMDcuLjA0ICBERUNbMy4uMF0gU2VyaWFsIEkvRiBzZWxlY3Qgb3V0cHV0cworCSAqIDAzICAgICAgb3V0cHV0LCAxPUFVVE8gQ1RTIGNvbnRyb2wgZW5hYmxlZAorCSAqIDAyICAgICAgUkkgUmluZyBJbmRpY2F0b3IgaW5wdXQgMD1hY3RpdmUKKwkgKiAwMSAgICAgIERTUiBpbnB1dCAwPWFjdGl2ZQorCSAqIDAwICAgICAgRFRSIG91dHB1dCAwPWFjdGl2ZQorCSAqCisJICogMDAwMCAwMTEwCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBQQ1IsIDB4MDYpOworCQorCS8qIFBWUiBQb3J0IFZhbHVlIFJlZ2lzdGVyCisJICoKKwkgKiAwNy4uMDQgIERFQ1szLi4wXSBTZXJpYWwgSS9GIHNlbGVjdCAoMDAwMD1kaXNhYmxlZCkKKwkgKiAwMyAgICAgIEFVVE8gQ1RTIG91dHB1dCAxPWVuYWJsZWQKKwkgKiAwMiAgICAgIFJJIFJpbmcgSW5kaWNhdG9yIGlucHV0CisJICogMDEgICAgICBEU1IgaW5wdXQKKwkgKiAwMCAgICAgIERUUiBvdXRwdXQgKDE9aW5hY3RpdmUpCisJICoKKwkgKiAwMDAwIDAwMDEKKwkgKi8KKy8vCXdyaXRlX3JlZyhpbmZvLCBQVlIsIFBWUl9EVFIpOworCQorCS8qIElQQyBJbnRlcnJ1cHQgUG9ydCBDb25maWd1cmF0aW9uCisJICoKKwkgKiAwNyAgICAgIFZJUyAxPU1hc2tlZCBpbnRlcnJ1cHRzIHZpc2libGUKKwkgKiAwNi4uMDUgIFJlc2VydmVkLCAwCisJICogMDQuLjAzICBTTEEgU2xhdmUgYWRkcmVzcywgMDAgaWdub3JlZAorCSAqIDAyICAgICAgQ0FTTSBDYXNjYWRpbmcgTW9kZSwgMT1kYWlzeSBjaGFpbgorCSAqIDAxLi4wMCAgSUNbMS4uMF0gSW50ZXJydXB0IENvbmZpZywgMDE9cHVzaC1wdWxsIG91dHB1dCwgYWN0aXZlIGxvdworCSAqCisJICogMDAwMCAwMTAxCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBJUEMsIDB4MDUpOworfQorCit2b2lkIGFzeW5jX21vZGUoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovIAorCWlycV9kaXNhYmxlKGluZm8sIENIQSwgMHhmZmZmKTsKKwlpcnFfZGlzYWJsZShpbmZvLCBDSEIsIDB4ZmZmZik7CisJcG9ydF9pcnFfZGlzYWJsZShpbmZvLCAweGZmKTsKKwkKKwkvKiBNT0RFCisJICoKKwkgKiAwNyAgICAgIFJlc2VydmVkLCAwCisJICogMDYgICAgICBGUlRTIFJUUyBTdGF0ZSwgMD1hY3RpdmUKKwkgKiAwNSAgICAgIEZDVFMgRmxvdyBDb250cm9sIG9uIENUUworCSAqIDA0ICAgICAgRkxPTiBGbG93IENvbnRyb2wgRW5hYmxlCisJICogMDMgICAgICBSQUMgUmVjZWl2ZXIgQWN0aXZlLCAwID0gaW5hY3RpdmUKKwkgKiAwMiAgICAgIFJUUyAwPUF1dG8gUlRTLCAxPW1hbnVhbCBSVFMKKwkgKiAwMSAgICAgIFRSUyBUaW1lciBSZXNvbHV0aW9uLCAxPTUxMgorCSAqIDAwICAgICAgVExQIFRlc3QgTG9vcCwgMCA9IG5vIGxvb3AKKwkgKgorCSAqIDAwMDAgMDExMAorCSAqLyAKKwl2YWwgPSAweDA2OworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2spCisJCXZhbCB8PSBCSVQwOworCQorCS8qIHByZXNlcnZlIFJUUyBzdGF0ZSAqLyAKKwlpZiAoIShpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpKQorCQl2YWwgfD0gQklUNjsKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgTU9ERSwgdmFsKTsKKwkKKwkvKiBDQ1IwCisJICoKKwkgKiAwNyAgICAgIFBVIFBvd2VyIFVwLCAxPWFjdGl2ZSwgMD1wb3dlciBkb3duCisJICogMDYgICAgICBNQ0UgTWFzdGVyIENsb2NrIEVuYWJsZSwgMT1lbmFibGVkCisJICogMDUgICAgICBSZXNlcnZlZCwgMAorCSAqIDA0Li4wMiAgU0NbMi4uMF0gRW5jb2RpbmcsIDAwMD1OUloKKwkgKiAwMS4uMDAgIFNNWzEuLjBdIFNlcmlhbCBNb2RlLCAxMT1Bc3luYworCSAqCisJICogMTAwMCAwMDExCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IwLCAweDgzKTsKKwkKKwkvKiBDQ1IxCisJICoKKwkgKiAwNy4uMDUgIFJlc2VydmVkLCAwCisJICogMDQgICAgICBPRFMgT3V0cHV0IERyaXZlciBTZWxlY3QsIDE9VHhEIGlzIHB1c2gtcHVsbCBvdXRwdXQKKwkgKiAwMyAgICAgIEJDUiBCaXQgQ2xvY2sgUmF0ZSwgMT0xNngKKwkgKiAwMi4uMDAgIENNWzIuLjBdIENsb2NrIE1vZGUsIDExMT1CUkcKKwkgKgorCSAqIDAwMDEgMTExMQorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSMSwgMHgxZik7CisJCisJLyogQ0NSMiAoY2hhbm5lbCBBKQorCSAqCisJICogMDcuLjA2ICBCR1JbOS4uOF0gQmF1ZCByYXRlIGJpdHMgOS4uOAorCSAqIDA1ICAgICAgQkRGIEJhdWQgcmF0ZSBkaXZpc29yIGZhY3RvciwgMD0xLCAxPUJHUiB2YWx1ZQorCSAqIDA0ICAgICAgU1NFTCBDbG9jayBzb3VyY2Ugc2VsZWN0LCAxPXN1Ym1vZGUgYgorCSAqIDAzICAgICAgVE9FIDA9VHhDTEsgaXMgaW5wdXQsIDA9VHhDTEsgaXMgaW5wdXQKKwkgKiAwMiAgICAgIFJXWCBSZWFkL1dyaXRlIEV4Y2hhbmdlIDA9ZGlzYWJsZWQKKwkgKiAwMSAgICAgIFJlc2VydmVkLCAwCisJICogMDAgICAgICBESVYsIGRhdGEgaW52ZXJzaW9uIDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZAorCSAqCisJICogMDAwMSAwMDAwCisJICovIAorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBDQ1IyLCAweDEwKTsKKwkKKwkvKiBDQ1IzCisJICoKKwkgKiAwNy4uMDEgIFJlc2VydmVkLCAwCisJICogMDAgICAgICBQU0QgRFBMTCBQaGFzZSBTaGlmdCBEaXNhYmxlCisJICoKKwkgKiAwMDAwIDAwMDAKKwkgKi8gCisJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjMsIDApOworCQorCS8qIENDUjQKKwkgKgorCSAqIDA3ICAgICAgTUNLNCBNYXN0ZXIgQ2xvY2sgRGl2aWRlIGJ5IDQsIDE9ZW5hYmxlZAorCSAqIDA2ICAgICAgRUJSRyBFbmhhbmNlZCBCYXVkIFJhdGUgR2VuZXJhdG9yIE1vZGUsIDE9ZW5hYmxlZAorCSAqIDA1ICAgICAgVFNUMSBUZXN0IFBpbiwgMD1ub3JtYWwgb3BlcmF0aW9uCisJICogMDQgICAgICBJQ0QgSXZlcnQgQ2FycmllciBEZXRlY3QsIDE9ZW5hYmxlZCAoYWN0aXZlIGxvdykKKwkgKiAwMy4uMDAgIFJlc2VydmVkLCBtdXN0IGJlIDAKKwkgKgorCSAqIDAxMDEgMDAwMAorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgQ0NSNCwgMHg1MCk7CisJbWdzbHBjX3NldF9yYXRlKGluZm8sIENIQSwgaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSAqIDE2KTsKKwkKKwkvKiBEQUZPIERhdGEgRm9ybWF0CisJICoKKwkgKiAwNyAgICAgIFJlc2VydmVkLCAwCisJICogMDYgICAgICBYQlJLIHRyYW5zbWl0IGJyZWFrLCAwPW5vcm1hbCBvcGVyYXRpb24KKwkgKiAwNSAgICAgIFN0b3AgYml0cyAoMD0xLCAxPTIpCisJICogMDQuLjAzICBQQVJbMS4uMF0gUGFyaXR5ICgwMT1vZGQsIDEwPWV2ZW4pCisJICogMDIgICAgICBQQVJFTiBQYXJpdHkgRW5hYmxlCisJICogMDEuLjAwICBDSExbMS4uMF0gQ2hhcmFjdGVyIExlbmd0aCAoMDA9OCwgMDE9NykKKwkgKgorCSAqLyAKKwl2YWwgPSAweDAwOworCWlmIChpbmZvLT5wYXJhbXMuZGF0YV9iaXRzICE9IDgpCisJCXZhbCB8PSBCSVQwOwkvKiA3IGJpdHMgKi8KKwlpZiAoaW5mby0+cGFyYW1zLnN0b3BfYml0cyAhPSAxKQorCQl2YWwgfD0gQklUNTsKKwlpZiAoaW5mby0+cGFyYW1zLnBhcml0eSAhPSBBU1lOQ19QQVJJVFlfTk9ORSkKKwl7CisJCXZhbCB8PSBCSVQyOwkvKiBQYXJpdHkgZW5hYmxlICovCisJCWlmIChpbmZvLT5wYXJhbXMucGFyaXR5ID09IEFTWU5DX1BBUklUWV9PREQpCisJCQl2YWwgfD0gQklUMzsKKwkJZWxzZQorCQkJdmFsIHw9IEJJVDQ7CisJfQorCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBEQUZPLCB2YWwpOworCQorCS8qIFJGQyBSeCBGSUZPIENvbnRyb2wKKwkgKgorCSAqIDA3ICAgICAgUmVzZXJ2ZWQsIDAKKwkgKiAwNiAgICAgIERQUywgMT1wYXJpdHkgYml0IG5vdCBzdG9yZWQgaW4gZGF0YSBieXRlCisJICogMDUgICAgICBEWFMsIDA9YWxsIGRhdGEgc3RvcmVkIGluIEZJRk8gKGluY2x1ZGluZyBYT04vWE9GRikKKwkgKiAwNCAgICAgIFJGREYgUnggRklGTyBEYXRhIEZvcm1hdCwgMT1zdGF0dXMgYnl0ZSBzdG9yZWQgaW4gRklGTworCSAqIDAzLi4wMiAgUkZUSFsxLi4wXSwgcnggdGhyZXNob2xkLCAxMT0xNiBzdGF0dXMgKyAxNiBkYXRhIGJ5dGUKKwkgKiAwMSAgICAgIFJlc2VydmVkLCAwCisJICogMDAgICAgICBUQ0RFIFRlcm1pbmF0ZSBDaGFyIERldGVjdCBFbmFibGUsIDA9ZGlzYWJsZWQKKwkgKgorCSAqIDAxMDEgMTEwMAorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgUkZDLCAweDVjKTsKKwkKKwkvKiBSTENSIFJlY2VpdmUgbGVuZ3RoIGNoZWNrIHJlZ2lzdGVyCisJICoKKwkgKiBNYXggZnJhbWUgbGVuZ3RoID0gKFJMICsgMSkgKiAzMgorCSAqLyAKKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgUkxDUiwgMCk7CisJCisJLyogWEJDSCBUcmFuc21pdCBCeXRlIENvdW50IEhpZ2gKKwkgKgorCSAqIDA3ICAgICAgRE1BIG1vZGUsIDAgPSBpbnRlcnJ1cHQgZHJpdmVuCisJICogMDYgICAgICBOUk0sIDA9QUJNIChpZ25vcmVkKQorCSAqIDA1ICAgICAgQ0FTIENhcnJpZXIgQXV0byBTdGFydAorCSAqIDA0ICAgICAgWEMgVHJhbnNtaXQgQ29udGludW91c2x5IChpZ25vcmVkKQorCSAqIDAzLi4wMCAgWEJDWzEwLi44XSBUcmFuc21pdCBieXRlIGNvdW50IGJpdHMgMTAuLjgKKwkgKgorCSAqIDAwMDAgMDAwMAorCSAqLyAKKwl2YWwgPSAweDAwOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19EQ0QpCisJCXZhbCB8PSBCSVQ1OworCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBYQkNILCB2YWwpOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19DVFMpCisJCWlycV9lbmFibGUoaW5mbywgQ0hBLCBJUlFfQ1RTKTsKKwkKKwkvKiBNT0RFOjAzIFJBQyBSZWNlaXZlciBBY3RpdmUsIDE9YWN0aXZlICovIAorCXNldF9yZWdfYml0cyhpbmZvLCBDSEEgKyBNT0RFLCBCSVQzKTsKKwllbmFibGVfYXV4Y2xrKGluZm8pOworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19DVFMpIHsKKwkJaXJxX2VuYWJsZShpbmZvLCBDSEIsIElSUV9DVFMpOworCQkvKiBQVlJbM10gMT1BVVRPIENUUyBhY3RpdmUgKi8gCisJCXNldF9yZWdfYml0cyhpbmZvLCBDSEEgKyBQVlIsIEJJVDMpOworCX0gZWxzZQorCQljbGVhcl9yZWdfYml0cyhpbmZvLCBDSEEgKyBQVlIsIEJJVDMpOworCWlycV9lbmFibGUoaW5mbywgQ0hBLAorCQkJICBJUlFfUlhFT00gKyBJUlFfUlhGSUZPICsgSVJRX0JSRUFLX09OICsgSVJRX1JYVElNRSArCisJCQkgIElSUV9BTExTRU5UICsgSVJRX1RYRklGTyk7CisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9UWFJFU0VUICsgQ01EX1JYUkVTRVQpOworCXdhaXRfY29tbWFuZF9jb21wbGV0ZShpbmZvLCBDSEEpOworCXJlYWRfcmVnMTYoaW5mbywgQ0hBICsgSVNSKTsJLyogY2xlYXIgcGVuZGluZyBJUlFzICovCit9CisKKy8qIFNldCB0aGUgSERMQyBpZGxlIG1vZGUgZm9yIHRoZSB0cmFuc21pdHRlci4KKyAqLwordm9pZCB0eF9zZXRfaWRsZShNR1NMUENfSU5GTyAqaW5mbykKK3sKKwkvKiBOb3RlOiBFU0NDMiBvbmx5IHN1cHBvcnRzIGZsYWdzIGFuZCBvbmUgaWRsZSBtb2RlcyAqLyAKKwlpZiAoaW5mby0+aWRsZV9tb2RlID09IEhETENfVFhJRExFX0ZMQUdTKQorCQlzZXRfcmVnX2JpdHMoaW5mbywgQ0hBICsgQ0NSMSwgQklUMyk7CisJZWxzZQorCQljbGVhcl9yZWdfYml0cyhpbmZvLCBDSEEgKyBDQ1IxLCBCSVQzKTsKK30KKworLyogZ2V0IHN0YXRlIG9mIHRoZSBWMjQgc3RhdHVzIChpbnB1dCkgc2lnbmFscy4KKyAqLwordm9pZCBnZXRfc2lnbmFscyhNR1NMUENfSU5GTyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisJCisJLyogcHJlc2VydmUgRFRSIGFuZCBSVFMgKi8gCisJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gU2VyaWFsU2lnbmFsX0RUUiArIFNlcmlhbFNpZ25hbF9SVFM7CisKKwlpZiAocmVhZF9yZWcoaW5mbywgQ0hCICsgVlNUUikgJiBCSVQ3KQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfRENEOworCWlmIChyZWFkX3JlZyhpbmZvLCBDSEIgKyBTVEFSKSAmIEJJVDEpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9DVFM7CisKKwlzdGF0dXMgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBQVlIpOworCWlmICghKHN0YXR1cyAmIFBWUl9SSSkpCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SSTsKKwlpZiAoIShzdGF0dXMgJiBQVlJfRFNSKSkKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RTUjsKK30KKworLyogU2V0IHRoZSBzdGF0ZSBvZiBEVFIgYW5kIFJUUyBiYXNlZCBvbiBjb250ZW50cyBvZgorICogc2VyaWFsX3NpZ25hbHMgbWVtYmVyIG9mIGRldmljZSBleHRlbnNpb24uCisgKi8KK3ZvaWQgc2V0X3NpZ25hbHMoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwl2YWwgPSByZWFkX3JlZyhpbmZvLCBDSEEgKyBNT0RFKTsKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0FTWU5DKSB7CisJCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCQl2YWwgJj0gfkJJVDY7CisJCWVsc2UKKwkJCXZhbCB8PSBCSVQ2OworCX0gZWxzZSB7CisJCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCQl2YWwgfD0gQklUMjsKKwkJZWxzZQorCQkJdmFsICY9IH5CSVQyOworCX0KKwl3cml0ZV9yZWcoaW5mbywgQ0hBICsgTU9ERSwgdmFsKTsKKworCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EVFIpCisJCWNsZWFyX3JlZ19iaXRzKGluZm8sIENIQSArIFBWUiwgUFZSX0RUUik7CisJZWxzZQorCQlzZXRfcmVnX2JpdHMoaW5mbywgQ0hBICsgUFZSLCBQVlJfRFRSKTsKK30KKwordm9pZCByeF9yZXNldF9idWZmZXJzKE1HU0xQQ19JTkZPICppbmZvKQoreworCVJYQlVGICpidWY7CisJaW50IGk7CisKKwlpbmZvLT5yeF9wdXQgPSAwOworCWluZm8tPnJ4X2dldCA9IDA7CisJaW5mby0+cnhfZnJhbWVfY291bnQgPSAwOworCWZvciAoaT0wIDsgaSA8IGluZm8tPnJ4X2J1Zl9jb3VudCA7IGkrKykgeworCQlidWYgPSAoUlhCVUYqKShpbmZvLT5yeF9idWYgKyAoaSAqIGluZm8tPnJ4X2J1Zl9zaXplKSk7CisJCWJ1Zi0+c3RhdHVzID0gYnVmLT5jb3VudCA9IDA7CisJfQorfQorCisvKiBBdHRlbXB0IHRvIHJldHVybiBhIHJlY2VpdmVkIEhETEMgZnJhbWUKKyAqIE9ubHkgZnJhbWVzIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzIGFyZSByZXR1cm5lZC4KKyAqCisgKiBSZXR1cm5zIDEgaWYgZnJhbWUgcmV0dXJuZWQsIG90aGVyd2lzZSAwCisgKi8KK2ludCByeF9nZXRfZnJhbWUoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCVJYQlVGICpidWY7CisJdW5zaWduZWQgaW50IGZyYW1lc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCWludCByZXR1cm5fZnJhbWUgPSAwOworCQorCWlmIChpbmZvLT5yeF9mcmFtZV9jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWJ1ZiA9IChSWEJVRiopKGluZm8tPnJ4X2J1ZiArIChpbmZvLT5yeF9nZXQgKiBpbmZvLT5yeF9idWZfc2l6ZSkpOworCisJc3RhdHVzID0gYnVmLT5zdGF0dXM7CisKKwkvKiAwNyAgVkZSICAxPXZhbGlkIGZyYW1lCisJICogMDYgIFJETyAgMT1kYXRhIG92ZXJydW4KKwkgKiAwNSAgQ1JDICAxPU9LLCAwPWVycm9yCisJICogMDQgIFJBQiAgMT1mcmFtZSBhYm9ydGVkCisJICovCisJaWYgKChzdGF0dXMgJiAweGYwKSAhPSAweEEwKSB7CisJCWlmICghKHN0YXR1cyAmIEJJVDcpIHx8IChzdGF0dXMgJiBCSVQ0KSkKKwkJCWluZm8tPmljb3VudC5yeGFib3J0Kys7CisJCWVsc2UgaWYgKHN0YXR1cyAmIEJJVDYpCisJCQlpbmZvLT5pY291bnQucnhvdmVyKys7CisJCWVsc2UgaWYgKCEoc3RhdHVzICYgQklUNSkpIHsKKwkJCWluZm8tPmljb3VudC5yeGNyYysrOworCQkJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX1JFVFVSTl9FWCkKKwkJCQlyZXR1cm5fZnJhbWUgPSAxOworCQl9CisJCWZyYW1lc2l6ZSA9IDA7CisjaWZkZWYgQ09ORklHX0hETEMKKwkJeworCQkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhpbmZvLT5uZXRkZXYpOworCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOworCQl9CisjZW5kaWYKKwl9IGVsc2UKKwkJcmV0dXJuX2ZyYW1lID0gMTsKKworCWlmIChyZXR1cm5fZnJhbWUpCisJCWZyYW1lc2l6ZSA9IGJ1Zi0+Y291bnQ7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkgpCisJCXByaW50aygiJXMoJWQpOnJ4X2dldF9mcmFtZSglcykgc3RhdHVzPSUwNFggc2l6ZT0lZFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLHN0YXR1cyxmcmFtZXNpemUpOworCQkJCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0RBVEEpCisJCXRyYWNlX2Jsb2NrKGluZm8sIGJ1Zi0+ZGF0YSwgZnJhbWVzaXplLCAwKTsJCisJCQorCWlmIChmcmFtZXNpemUpIHsKKwkJaWYgKChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19SRVRVUk5fRVggJiYKKwkJICAgICAgZnJhbWVzaXplKzEgPiBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkgfHwKKwkJICAgIGZyYW1lc2l6ZSA+IGluZm8tPm1heF9mcmFtZV9zaXplKQorCQkJaW5mby0+aWNvdW50LnJ4bG9uZysrOworCQllbHNlIHsKKwkJCWlmIChzdGF0dXMgJiBCSVQ1KQorCQkJCWluZm8tPmljb3VudC5yeG9rKys7CisKKwkJCWlmIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19SRVRVUk5fRVgpIHsKKwkJCQkqKGJ1Zi0+ZGF0YSArIGZyYW1lc2l6ZSkgPSBzdGF0dXMgJiBCSVQ1ID8gUlhfT0s6UlhfQ1JDX0VSUk9SOworCQkJCSsrZnJhbWVzaXplOworCQkJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwkJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCQloZGxjZGV2X3J4KGluZm8sIGJ1Zi0+ZGF0YSwgZnJhbWVzaXplKTsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCWxkaXNjX3JlY2VpdmVfYnVmKHR0eSwgYnVmLT5kYXRhLCBpbmZvLT5mbGFnX2J1ZiwgZnJhbWVzaXplKTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlidWYtPnN0YXR1cyA9IGJ1Zi0+Y291bnQgPSAwOworCWluZm8tPnJ4X2ZyYW1lX2NvdW50LS07CisJaW5mby0+cnhfZ2V0Kys7CisJaWYgKGluZm8tPnJ4X2dldCA+PSBpbmZvLT5yeF9idWZfY291bnQpCisJCWluZm8tPnJ4X2dldCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworQk9PTEVBTiByZWdpc3Rlcl90ZXN0KE1HU0xQQ19JTkZPICppbmZvKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhdHRlcm5zW10gPSAKKwkgICAgeyAweDAwLCAweGZmLCAweGFhLCAweDU1LCAweDY5LCAweDk2LCAweDBmIH07CisJc3RhdGljIHVuc2lnbmVkIGludCBjb3VudCA9IHNpemVvZihwYXR0ZXJucykgLyBzaXplb2YocGF0dGVybnNbMF0pOworCXVuc2lnbmVkIGludCBpOworCUJPT0xFQU4gcmMgPSBUUlVFOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmVzZXRfZGV2aWNlKGluZm8pOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJd3JpdGVfcmVnKGluZm8sIFhBRDEsIHBhdHRlcm5zW2ldKTsKKwkJd3JpdGVfcmVnKGluZm8sIFhBRDIsIHBhdHRlcm5zWyhpICsgMSkgJSBjb3VudF0pOworCQlpZiAoKHJlYWRfcmVnKGluZm8sIFhBRDEpICE9IHBhdHRlcm5zW2ldKSB8fCAKKwkJICAgIChyZWFkX3JlZyhpbmZvLCBYQUQyKSAhPSBwYXR0ZXJuc1soaSArIDEpICUgY291bnRdKSkgeworCQkJcmMgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitCT09MRUFOIGlycV90ZXN0KE1HU0xQQ19JTkZPICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXNldF9kZXZpY2UoaW5mbyk7CisKKwlpbmZvLT50ZXN0aW5nX2lycSA9IFRSVUU7CisJaGRsY19tb2RlKGluZm8pOworCisJaW5mby0+aXJxX29jY3VycmVkID0gRkFMU0U7CisKKwkvKiBpbml0IGhkbGMgbW9kZSAqLworCisJaXJxX2VuYWJsZShpbmZvLCBDSEEsIElSUV9USU1FUik7CisJd3JpdGVfcmVnKGluZm8sIENIQSArIFRJTVIsIDApOwkvKiA1MTIgY3ljbGVzICovCisJaXNzdWVfY29tbWFuZChpbmZvLCBDSEEsIENNRF9TVEFSVF9USU1FUik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWVuZF90aW1lPTEwMDsKKwl3aGlsZShlbmRfdGltZS0tICYmICFpbmZvLT5pcnFfb2NjdXJyZWQpIHsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCX0KKwkKKwlpbmZvLT50ZXN0aW5nX2lycSA9IEZBTFNFOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJlc2V0X2RldmljZShpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkKKwlyZXR1cm4gaW5mby0+aXJxX29jY3VycmVkID8gVFJVRSA6IEZBTFNFOworfQorCitpbnQgYWRhcHRlcl90ZXN0KE1HU0xQQ19JTkZPICppbmZvKQoreworCWlmICghcmVnaXN0ZXJfdGVzdChpbmZvKSkgeworCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19BZGRyZXNzRmFpbHVyZTsKKwkJcHJpbnRrKCAiJXMoJWQpOlJlZ2lzdGVyIHRlc3QgZmFpbHVyZSBmb3IgZGV2aWNlICVzIEFkZHI9JTA0WFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lLCAodW5zaWduZWQgc2hvcnQpKGluZm8tPmlvX2Jhc2UpICk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghaXJxX3Rlc3QoaW5mbykpIHsKKwkJaW5mby0+aW5pdF9lcnJvciA9IERpYWdTdGF0dXNfSXJxRmFpbHVyZTsKKwkJcHJpbnRrKCAiJXMoJWQpOkludGVycnVwdCB0ZXN0IGZhaWx1cmUgZm9yIGRldmljZSAlcyBJUlE9JWRcbiIsCisJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwgKHVuc2lnbmVkIHNob3J0KShpbmZvLT5pcnFfbGV2ZWwpICk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzKCVkKTpkZXZpY2UgJXMgcGFzc2VkIGRpYWdub3N0aWNzXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCXJldHVybiAwOworfQorCit2b2lkIHRyYWNlX2Jsb2NrKE1HU0xQQ19JTkZPICppbmZvLGNvbnN0IGNoYXIqIGRhdGEsIGludCBjb3VudCwgaW50IHhtaXQpCit7CisJaW50IGk7CisJaW50IGxpbmVjb3VudDsKKwlpZiAoeG1pdCkKKwkJcHJpbnRrKCIlcyB0eCBkYXRhOlxuIixpbmZvLT5kZXZpY2VfbmFtZSk7CisJZWxzZQorCQlwcmludGsoIiVzIHJ4IGRhdGE6XG4iLGluZm8tPmRldmljZV9uYW1lKTsKKwkJCisJd2hpbGUoY291bnQpIHsKKwkJaWYgKGNvdW50ID4gMTYpCisJCQlsaW5lY291bnQgPSAxNjsKKwkJZWxzZQorCQkJbGluZWNvdW50ID0gY291bnQ7CisJCQkKKwkJZm9yKGk9MDtpPGxpbmVjb3VudDtpKyspCisJCQlwcmludGsoIiUwMlggIiwodW5zaWduZWQgY2hhcilkYXRhW2ldKTsKKwkJZm9yKDtpPDE3O2krKykKKwkJCXByaW50aygiICAgIik7CisJCWZvcihpPTA7aTxsaW5lY291bnQ7aSsrKSB7CisJCQlpZiAoZGF0YVtpXT49MDQwICYmIGRhdGFbaV08PTAxNzYpCisJCQkJcHJpbnRrKCIlYyIsZGF0YVtpXSk7CisJCQllbHNlCisJCQkJcHJpbnRrKCIuIik7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCQkKKwkJZGF0YSAgKz0gbGluZWNvdW50OworCQljb3VudCAtPSBsaW5lY291bnQ7CisJfQorfQorCisvKiBIRExDIGZyYW1lIHRpbWUgb3V0CisgKiB1cGRhdGUgc3RhdHMgYW5kIGRvIHR4IGNvbXBsZXRpb24gcHJvY2Vzc2luZworICovCit2b2lkIHR4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gKE1HU0xQQ19JTkZPKiljb250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPICkKKwkJcHJpbnRrKCAiJXMoJWQpOnR4X3RpbWVvdXQoJXMpXG4iLAorCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOworCWlmKGluZm8tPnR4X2FjdGl2ZSAmJgorCSAgIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCWluZm8tPmljb3VudC50eHRpbWVvdXQrKzsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWluZm8tPnR4X2FjdGl2ZSA9IDA7CisJaW5mby0+dHhfY291bnQgPSBpbmZvLT50eF9wdXQgPSBpbmZvLT50eF9nZXQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJCisjaWZkZWYgQ09ORklHX0hETEMKKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKKwllbHNlCisjZW5kaWYKKwkJYmhfdHJhbnNtaXQoaW5mbyk7Cit9CisKKyNpZmRlZiBDT05GSUdfSERMQworCisvKioKKyAqIGNhbGxlZCBieSBnZW5lcmljIEhETEMgbGF5ZXIgd2hlbiBwcm90b2NvbCBzZWxlY3RlZCAoUFBQLCBmcmFtZSByZWxheSwgZXRjLikKKyAqIHNldCBlbmNvZGluZyBhbmQgZnJhbWUgY2hlY2sgc2VxdWVuY2UgKEZDUykgb3B0aW9ucworICoKKyAqIGRldiAgICAgICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogZW5jb2RpbmcgIHNlcmlhbCBlbmNvZGluZyBzZXR0aW5nCisgKiBwYXJpdHkgICAgRkNTIHNldHRpbmcKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBlbmNvZGluZywKKwkJCSAgdW5zaWduZWQgc2hvcnQgcGFyaXR5KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBjaGFyICBuZXdfZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgbmV3X2NyY3R5cGU7CisKKwkvKiByZXR1cm4gZXJyb3IgaWYgVFRZIGludGVyZmFjZSBvcGVuICovCisJaWYgKGluZm8tPmNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChlbmNvZGluZykKKwl7CisJY2FzZSBFTkNPRElOR19OUlo6ICAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWjsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19OUlpJOiAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWklfU1BBQ0U7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fTUFSSzogICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fU1BBQ0U6ICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOyBicmVhazsKKwljYXNlIEVOQ09ESU5HX01BTkNIRVNURVI6IG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfQklQSEFTRV9MRVZFTDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChwYXJpdHkpCisJeworCWNhc2UgUEFSSVRZX05PTkU6ICAgICAgICAgICAgbmV3X2NyY3R5cGUgPSBIRExDX0NSQ19OT05FOyBicmVhazsKKwljYXNlIFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQ6IG5ld19jcmN0eXBlID0gSERMQ19DUkNfMTZfQ0NJVFQ7IGJyZWFrOworCWNhc2UgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVDogbmV3X2NyY3R5cGUgPSBIRExDX0NSQ18zMl9DQ0lUVDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5mby0+cGFyYW1zLmVuY29kaW5nID0gbmV3X2VuY29kaW5nOworCWluZm8tPnBhcmFtcy5jcmNfdHlwZSA9IG5ld19jcmN0eXBlOzsKKworCS8qIGlmIG5ldHdvcmsgaW50ZXJmYWNlIHVwLCByZXByb2dyYW0gaGFyZHdhcmUgKi8KKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCW1nc2xwY19wcm9ncmFtX2h3KGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGdlbmVyaWMgSERMQyBsYXllciB0byBzZW5kIGZyYW1lCisgKgorICogc2tiICBzb2NrZXQgYnVmZmVyIGNvbnRhaW5pbmcgSERMQyBmcmFtZQorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoS0VSTl9JTkZPICIlczpoZGxjX3htaXQoJXMpXG4iLF9fRklMRV9fLGRldi0+bmFtZSk7CisKKwkvKiBzdG9wIHNlbmRpbmcgdW50aWwgdGhpcyBmcmFtZSBjb21wbGV0ZXMgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBjb3B5IGRhdGEgdG8gZGV2aWNlIGJ1ZmZlcnMgKi8KKwltZW1jcHkoaW5mby0+dHhfYnVmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpbmZvLT50eF9nZXQgPSAwOworCWluZm8tPnR4X3B1dCA9IGluZm8tPnR4X2NvdW50ID0gc2tiLT5sZW47CisKKwkvKiB1cGRhdGUgbmV0d29yayBzdGF0aXN0aWNzICovCisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkvKiBkb25lIHdpdGggc29ja2V0IGJ1ZmZlciwgc28gZnJlZSBpdCAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCS8qIHNhdmUgc3RhcnQgdGltZSBmb3IgdHJhbnNtaXQgdGltZW91dCBkZXRlY3Rpb24gKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIHN0YXJ0IGhhcmR3YXJlIHRyYW5zbWl0dGVyIGlmIG5lY2Vzc2FyeSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkgCXR4X3N0YXJ0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgd2hlbiBpbnRlcmZhY2UgZW5hYmxlZAorICogY2xhaW0gcmVzb3VyY2VzIGFuZCBpbml0aWFsaXplIGhhcmR3YXJlCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzOmhkbGNkZXZfb3BlbiglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCS8qIGdlbmVyaWMgSERMQyBsYXllciBvcGVuIHByb2Nlc3NpbmcgKi8KKwlpZiAoKHJjID0gaGRsY19vcGVuKGRldikpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBhcmJpdHJhdGUgYmV0d2VlbiBuZXR3b3JrIGFuZCB0dHkgb3BlbnMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5jb3VudCAhPSAwIHx8IGluZm8tPm5ldGNvdW50ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGhkbGNfb3BlbiByZXR1cm5pbmcgYnVzeVxuIiwgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpbmZvLT5uZXRjb3VudD0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCS8qIGNsYWltIHJlc291cmNlcyBhbmQgaW5pdCBhZGFwdGVyICovCisJaWYgKChyYyA9IHN0YXJ0dXAoaW5mbykpICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJaW5mby0+bmV0Y291bnQ9MDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogYXNzZXJ0IERUUiBhbmQgUlRTLCBhcHBseSBoYXJkd2FyZSBzZXR0aW5ncyAqLworCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCW1nc2xwY19wcm9ncmFtX2h3KGluZm8pOworCisJLyogZW5hYmxlIG5ldHdvcmsgbGF5ZXIgdHJhbnNtaXQgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogaW5mb3JtIGdlbmVyaWMgSERMQyBsYXllciBvZiBjdXJyZW50IERDRCBzdGF0dXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWdldF9zaWduYWxzKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwloZGxjX3NldF9jYXJyaWVyKGluZm8tPnNlcmlhbF9zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCwgZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHdoZW4gaW50ZXJmYWNlIGlzIGRpc2FibGVkCisgKiBzaHV0ZG93biBoYXJkd2FyZSBhbmQgcmVsZWFzZSByZXNvdXJjZXMKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCisJCXByaW50aygiJXM6aGRsY2Rldl9jbG9zZSglcylcbiIsX19GSUxFX18sZGV2LT5uYW1lKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIHNodXRkb3duIGFkYXB0ZXIgYW5kIHJlbGVhc2UgcmVzb3VyY2VzICovCisJc2h1dGRvd24oaW5mbyk7CisKKwloZGxjX2Nsb3NlKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWluZm8tPm5ldGNvdW50PTA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgdG8gcHJvY2VzcyBJT0NUTCBjYWxsIHRvIG5ldHdvcmsgZGV2aWNlCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogaWZyICBwb2ludGVyIHRvIG5ldHdvcmsgaW50ZXJmYWNlIHJlcXVlc3Qgc3RydWN0dXJlCisgKiBjbWQgIElPQ1RMIGNvbW1hbmQgY29kZQorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGhkbGNkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3luY19zZXJpYWxfc2V0dGluZ3MpOworCXN5bmNfc2VyaWFsX3NldHRpbmdzIG5ld19saW5lOworCXN5bmNfc2VyaWFsX3NldHRpbmdzIF9fdXNlciAqbGluZSA9IGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnN5bmM7CisJTUdTTFBDX0lORk8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGludCBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoIiVzOmhkbGNkZXZfaW9jdGwoJXMpXG4iLF9fRklMRV9fLGRldi0+bmFtZSk7CisKKwkvKiByZXR1cm4gZXJyb3IgaWYgVFRZIGludGVyZmFjZSBvcGVuICovCisJaWYgKGluZm8tPmNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCXN3aXRjaChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfSUZBQ0U6IC8qIHJldHVybiBjdXJyZW50IHN5bmNfc2VyaWFsX3NldHRpbmdzICovCisKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX0lGQUNFX1NZTkNfU0VSSUFMOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKworCQlmbGFncyA9IGluZm8tPnBhcmFtcy5mbGFncyAmIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19SWENfRFBMTCB8CisJCQkJCSAgICAgIEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1JYQ19UWENQSU4gfAorCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX1RYQ1BJTiB8IEhETENfRkxBR19UWENfRFBMTCB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOworCisJCXN3aXRjaCAoZmxhZ3MpeworCQljYXNlIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfVFhDUElOKTogbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX0VYVDsgYnJlYWs7CisJCWNhc2UgKEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19CUkcpOiAgICBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfSU5UOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19UWElOVDsgYnJlYWs7CisJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfVFhGUk9NUlg7IGJyZWFrOworCQlkZWZhdWx0OiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfREVGQVVMVDsKKwkJfQorCisJCW5ld19saW5lLmNsb2NrX3JhdGUgPSBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQ7CisJCW5ld19saW5lLmxvb3BiYWNrICAgPSBpbmZvLT5wYXJhbXMubG9vcGJhY2sgPyAxOjA7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihsaW5lLCAmbmV3X2xpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDogLyogc2V0IHN5bmNfc2VyaWFsX3NldHRpbmdzICovCisKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19saW5lLCBsaW5lLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXN3aXRjaCAobmV3X2xpbmUuY2xvY2tfdHlwZSkKKwkJeworCQljYXNlIENMT0NLX0VYVDogICAgICBmbGFncyA9IEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU47IGJyZWFrOworCQljYXNlIENMT0NLX1RYRlJPTVJYOiBmbGFncyA9IEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19SWENQSU47IGJyZWFrOworCQljYXNlIENMT0NLX0lOVDogICAgICBmbGFncyA9IEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19CUkc7ICAgIGJyZWFrOworCQljYXNlIENMT0NLX1RYSU5UOiAgICBmbGFncyA9IEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19CUkc7ICAgIGJyZWFrOworCQljYXNlIENMT0NLX0RFRkFVTFQ6ICBmbGFncyA9IGluZm8tPnBhcmFtcy5mbGFncyAmCisJCQkJCSAgICAgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7IGJyZWFrOworCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChuZXdfbGluZS5sb29wYmFjayAhPSAwICYmIG5ld19saW5lLmxvb3BiYWNrICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpbmZvLT5wYXJhbXMuZmxhZ3MgJj0gfihIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19SWENfRFBMTCB8CisJCQkJCUhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1JYQ19UWENQSU4gfAorCQkJCQlIRExDX0ZMQUdfVFhDX1RYQ1BJTiB8IEhETENfRkxBR19UWENfRFBMTCB8CisJCQkJCUhETENfRkxBR19UWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19SWENQSU4pOworCQlpbmZvLT5wYXJhbXMuZmxhZ3MgfD0gZmxhZ3M7CisKKwkJaW5mby0+cGFyYW1zLmxvb3BiYWNrID0gbmV3X2xpbmUubG9vcGJhY2s7CisKKwkJaWYgKGZsYWdzICYgKEhETENfRkxBR19SWENfQlJHIHwgSERMQ19GTEFHX1RYQ19CUkcpKQorCQkJaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkID0gbmV3X2xpbmUuY2xvY2tfcmF0ZTsKKwkJZWxzZQorCQkJaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkID0gMDsKKworCQkvKiBpZiBuZXR3b3JrIGludGVyZmFjZSB1cCwgcmVwcm9ncmFtIGhhcmR3YXJlICovCisJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCW1nc2xwY19wcm9ncmFtX2h3KGluZm8pOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCX0KK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB3aGVuIHRyYW5zbWl0IHRpbWVvdXQgaXMgZGV0ZWN0ZWQKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCU1HU0xQQ19JTkZPICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQorCQlwcmludGsoImhkbGNkZXZfdHhfdGltZW91dCglcylcbiIsZGV2LT5uYW1lKTsKKworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMrKzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl0eF9zdG9wKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gdHJhbnNtaXQgY29tcGxldGVzCisgKiByZWVuYWJsZSBuZXR3b3JrIGxheWVyIHRyYW5zbWl0IGlmIHN0b3BwZWQKKyAqCisgKiBpbmZvICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X2RvbmUoTUdTTFBDX0lORk8gKmluZm8pCit7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoaW5mby0+bmV0ZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShpbmZvLT5uZXRkZXYpOworfQorCisvKioKKyAqIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVyIHdoZW4gZnJhbWUgcmVjZWl2ZWQKKyAqIHBhc3MgZnJhbWUgdG8gbmV0d29yayBsYXllcgorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKiBidWYgICBwb2ludGVyIHRvIGJ1ZmZlciBjb250aWFuaW5nIGZyYW1lIGRhdGEKKyAqIHNpemUgIGNvdW50IG9mIGRhdGEgYnl0ZXMgaW4gYnVmCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfcngoTUdTTFBDX0lORk8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisKKwlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykKKwkJcHJpbnRrKCJoZGxjZGV2X3J4KCVzKVxuIixkZXYtPm5hbWUpOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNhbid0IGFsbG9jIHNrYiwgZHJvcHBpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplKSxidWYsc2l6ZSk7CisKKwlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgaW5mby0+bmV0ZGV2KTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNpemU7CisKKwluZXRpZl9yeChza2IpOworCisJaW5mby0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIGFkZGluZyBkZXZpY2UgaW5zdGFuY2UKKyAqIGRvIGdlbmVyaWMgSERMQyBpbml0aWFsaXphdGlvbgorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9pbml0KE1HU0xQQ19JTkZPICppbmZvKQoreworCWludCByYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWhkbGNfZGV2aWNlICpoZGxjOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgbmV0d29yayBhbmQgSERMQyBsYXllciBvYmplY3RzICovCisKKwlpZiAoIShkZXYgPSBhbGxvY19oZGxjZGV2KGluZm8pKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOmhkbGMgZGV2aWNlIGFsbG9jYXRpb24gZmFpbHVyZVxuIixfX0ZJTEVfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGZvciBuZXR3b3JrIGxheWVyIHJlcG9ydGluZyBwdXJwb3NlcyBvbmx5ICovCisJZGV2LT5iYXNlX2FkZHIgPSBpbmZvLT5pb19iYXNlOworCWRldi0+aXJxICAgICAgID0gaW5mby0+aXJxX2xldmVsOworCisJLyogbmV0d29yayBsYXllciBjYWxsYmFja3MgYW5kIHNldHRpbmdzICovCisJZGV2LT5kb19pb2N0bCAgICAgICA9IGhkbGNkZXZfaW9jdGw7CisJZGV2LT5vcGVuICAgICAgICAgICA9IGhkbGNkZXZfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgID0gaGRsY2Rldl9jbG9zZTsKKwlkZXYtPnR4X3RpbWVvdXQgICAgID0gaGRsY2Rldl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAxMCpIWjsKKwlkZXYtPnR4X3F1ZXVlX2xlbiAgID0gNTA7CisKKwkvKiBnZW5lcmljIEhETEMgbGF5ZXIgY2FsbGJhY2tzIGFuZCBzZXR0aW5ncyAqLworCWhkbGMgICAgICAgICA9IGRldl90b19oZGxjKGRldik7CisJaGRsYy0+YXR0YWNoID0gaGRsY2Rldl9hdHRhY2g7CisJaGRsYy0+eG1pdCAgID0gaGRsY2Rldl94bWl0OworCisJLyogcmVnaXN0ZXIgb2JqZWN0cyB3aXRoIEhETEMgbGF5ZXIgKi8KKwlpZiAoKHJjID0gcmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6dW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMgZGV2aWNlXG4iLF9fRklMRV9fKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKworCWluZm8tPm5ldGRldiA9IGRldjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIHJlbW92aW5nIGRldmljZSBpbnN0YW5jZQorICogZG8gZ2VuZXJpYyBIRExDIGNsZWFudXAKKyAqCisgKiBpbmZvICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X2V4aXQoTUdTTFBDX0lORk8gKmluZm8pCit7CisJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShpbmZvLT5uZXRkZXYpOworCWZyZWVfbmV0ZGV2KGluZm8tPm5ldGRldik7CisJaW5mby0+bmV0ZGV2ID0gTlVMTDsKK30KKworI2VuZGlmIC8qIENPTkZJR19IRExDICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wcGRldi5jIGIvZHJpdmVycy9jaGFyL3BwZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkYTA3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wcGRldi5jCkBAIC0wLDAgKzEsODI0IEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL3BwZGV2LmMKKyAqCisgKiBUaGlzIGlzIHRoZSBjb2RlIGJlaGluZCAvZGV2L3BhcnBvcnQqIC0tIGl0IGFsbG93cyBhIHVzZXItc3BhY2UKKyAqIGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUgcGFycG9ydCBzdWJzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAsIDIwMDIgVGltIFdhdWdoIDx0aW1AY3liZXJlbGsubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQSAvZGV2L3BhcnBvcnR4IGRldmljZSBub2RlIHJlcHJlc2VudHMgYW4gYXJiaXRyYXJ5IGRldmljZQorICogb24gcG9ydCAneCcuICBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIHBvc3NpYmxlOgorICoKKyAqIG9wZW4JCWRvIG5vdGhpbmcsIHNldCB1cCBkZWZhdWx0IElFRUUgMTI4NCBwcm90b2NvbCB0byBiZSBDT01QQVQKKyAqIGNsb3NlCXJlbGVhc2UgcG9ydCBhbmQgdW5yZWdpc3RlciBkZXZpY2UgKGlmIG5lY2Vzc2FyeSkKKyAqIGlvY3RsCisgKiAgIEVYQ0wJcmVnaXN0ZXIgZGV2aWNlIGV4Y2x1c2l2ZWx5IChtYXkgZmFpbCkKKyAqICAgQ0xBSU0JKHJlZ2lzdGVyIGRldmljZSBmaXJzdCB0aW1lKSBwYXJwb3J0X2NsYWltX29yX2Jsb2NrCisgKiAgIFJFTEVBU0UJcGFycG9ydF9yZWxlYXNlCisgKiAgIFNFVE1PREUJc2V0IHRoZSBJRUVFIDEyODQgcHJvdG9jb2wgdG8gdXNlIGZvciByZWFkL3dyaXRlCisgKiAgIFNFVFBIQVNFCXNldCB0aGUgSUVFRSAxMjg0IHBoYXNlIG9mIGEgcGFydGljdWxhciBtb2RlLiAgTm90IHRvIGJlCisgKiAgICAgICAgICAgICAgY29uZnVzZWQgd2l0aCBpb2N0bChmZCwgU0VUUEhBU0VSLCAmc3R1bikuIDstKQorICogICBEQVRBRElSCWRhdGFfZm9yd2FyZCAvIGRhdGFfcmV2ZXJzZQorICogICBXREFUQQl3cml0ZV9kYXRhCisgKiAgIFJEQVRBCXJlYWRfZGF0YQorICogICBXQ09OVFJPTAl3cml0ZV9jb250cm9sCisgKiAgIFJDT05UUk9MCXJlYWRfY29udHJvbAorICogICBGQ09OVFJPTAlmcm9iX2NvbnRyb2wKKyAqICAgUlNUQVRVUwlyZWFkX3N0YXR1cworICogICBORUdPVAlwYXJwb3J0X25lZ290aWF0ZQorICogICBZSUVMRAlwYXJwb3J0X3lpZWxkX2Jsb2NraW5nCisgKiAgIFdDVExPTklSUQlvbiBpbnRlcnJ1cHQsIHNldCBjb250cm9sIGxpbmVzCisgKiAgIENMUklSUQljbGVhciAoYW5kIHJldHVybikgaW50ZXJydXB0IGNvdW50CisgKiAgIFNFVFRJTUUJc2V0cyBkZXZpY2UgdGltZW91dCAoc3RydWN0IHRpbWV2YWwpCisgKiAgIEdFVFRJTUUJZ2V0cyBkZXZpY2UgdGltZW91dCAoc3RydWN0IHRpbWV2YWwpCisgKiAgIEdFVE1PREVTCWdldHMgaGFyZHdhcmUgc3VwcG9ydGVkIG1vZGVzICh1bnNpZ25lZCBpbnQpCisgKiAgIEdFVE1PREUJZ2V0cyB0aGUgY3VycmVudCBJRUVFMTI4NCBtb2RlCisgKiAgIEdFVFBIQVNFICAgZ2V0cyB0aGUgY3VycmVudCBJRUVFMTI4NCBwaGFzZQorICogICBHRVRGTEFHUyAgIGdldHMgY3VycmVudCAodXNlci12aXNpYmxlKSBmbGFncworICogICBTRVRGTEFHUyAgIHNldHMgY3VycmVudCAodXNlci12aXNpYmxlKSBmbGFncworICogcmVhZC93cml0ZQlyZWFkIG9yIHdyaXRlIGluIGN1cnJlbnQgSUVFRSAxMjg0IHByb3RvY29sCisgKiBzZWxlY3QJd2FpdCBmb3IgaW50ZXJydXB0IChpbiByZWFkZmRzKQorICoKKyAqIENoYW5nZXM6CisgKiBBZGRlZCBTRVRUSU1FL0dFVFRJTUUgaW9jdGwsIEZyZWQgQmFybmVzLCAxOTk5LgorICoKKyAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAyMDAwLzA4LzI1CisgKiAtIE9uIGVycm9yLCBjb3B5X2Zyb21fdXNlciBhbmQgY29weV90b191c2VyIGRvIG5vdCByZXR1cm4gLUVGQVVMVCwKKyAqICAgVGhleSByZXR1cm4gdGhlIHBvc2l0aXZlIG51bWJlciBvZiBieXRlcyAqbm90KiBjb3BpZWQgZHVlIHRvIGFkZHJlc3MKKyAqICAgc3BhY2UgZXJyb3JzLgorICoKKyAqIEFkZGVkIEdFVE1PREVTL0dFVE1PREUvR0VUUEhBU0UgaW9jdGxzLCBGcmVkIEJhcm5lcyA8ZnJtYjJAdWtjLmFjLnVrPiwgMDMvMDEvMjAwMS4KKyAqIEFkZGVkIEdFVEZMQUdTL1NFVEZMQUdTIGlvY3RscywgRnJlZCBCYXJuZXMsIDA0LzIwMDEKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNkZWZpbmUgUFBfVkVSU0lPTiAicHBkZXY6IHVzZXItc3BhY2UgcGFyYWxsZWwgcG9ydCBkcml2ZXIiCisjZGVmaW5lIENIUkRFViAicHBkZXYiCisKK3N0cnVjdCBwcF9zdHJ1Y3QgeworCXN0cnVjdCBwYXJkZXZpY2UgKiBwZGV2OworCXdhaXRfcXVldWVfaGVhZF90IGlycV93YWl0OworCWF0b21pY190IGlycWM7CisJdW5zaWduZWQgaW50IGZsYWdzOworCWludCBpcnFyZXNwb25zZTsKKwl1bnNpZ25lZCBjaGFyIGlycWN0bDsKKwlzdHJ1Y3QgaWVlZTEyODRfaW5mbyBzdGF0ZTsKKwlzdHJ1Y3QgaWVlZTEyODRfaW5mbyBzYXZlZF9zdGF0ZTsKKwlsb25nIGRlZmF1bHRfaW5hY3Rpdml0eTsKK307CisKKy8qIHBwX3N0cnVjdC5mbGFncyBiaXRmaWVsZHMgKi8KKyNkZWZpbmUgUFBfQ0xBSU1FRCAgICAoMTw8MCkKKyNkZWZpbmUgUFBfRVhDTCAgICAgICAoMTw8MSkKKworLyogT3RoZXIgY29uc3RhbnRzICovCisjZGVmaW5lIFBQX0lOVEVSUlVQVF9USU1FT1VUICgxMCAqIEhaKSAvKiAxMHMgKi8KKyNkZWZpbmUgUFBfQlVGRkVSX1NJWkUgMTAyNAorI2RlZmluZSBQQVJERVZJQ0VfTUFYIDgKKworLyogUk9VTkRfVVAgbWFjcm8gZnJvbSBmcy9zZWxlY3QuYyAqLworI2RlZmluZSBST1VORF9VUCh4LHkpICgoKHgpKyh5KS0xKS8oeSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcF9lbmFibGVfaXJxIChzdHJ1Y3QgcHBfc3RydWN0ICpwcCkKK3sKKwlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IHBwLT5wZGV2LT5wb3J0OworCXBvcnQtPm9wcy0+ZW5hYmxlX2lycSAocG9ydCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBwX3JlYWQgKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwKKwkJCWxvZmZfdCAqIHBwb3MpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHBfc3RydWN0ICpwcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICoga2J1ZmZlcjsKKwlzc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOworCXN0cnVjdCBwYXJwb3J0ICpwcG9ydDsKKwlpbnQgbW9kZTsKKworCWlmICghKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpKSB7CisJCS8qIERvbid0IGhhdmUgdGhlIHBvcnQgY2xhaW1lZCAqLworCQlwcmludGsgKEtFUk5fREVCVUcgQ0hSREVWICIleDogY2xhaW0gdGhlIHBvcnQgZmlyc3RcbiIsCisJCQltaW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRyaXZpYWwgY2FzZS4gKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlrYnVmZmVyID0ga21hbGxvYyhtaW5fdChzaXplX3QsIGNvdW50LCBQUF9CVUZGRVJfU0laRSksIEdGUF9LRVJORUwpOworCWlmICgha2J1ZmZlcikgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHBvcnQgPSBwcC0+cGRldi0+cG9ydDsKKwltb2RlID0gcHBvcnQtPmllZWUxMjg0Lm1vZGUgJiB+KElFRUUxMjg0X0RFVklDRUlEIHwgSUVFRTEyODRfQUREUik7CisKKwlwYXJwb3J0X3NldF90aW1lb3V0IChwcC0+cGRldiwKKwkJCSAgICAgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSA/CisJCQkgICAgIFBBUlBPUlRfSU5BQ1RJVklUWV9PX05PTkJMT0NLIDoKKwkJCSAgICAgcHAtPmRlZmF1bHRfaW5hY3Rpdml0eSk7CisKKwl3aGlsZSAoYnl0ZXNfcmVhZCA9PSAwKSB7CisJCXNzaXplX3QgbmVlZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50LCBQUF9CVUZGRVJfU0laRSk7CisKKwkJaWYgKG1vZGUgPT0gSUVFRTEyODRfTU9ERV9FUFApIHsKKwkJCS8qIHZhcmlvdXMgc3BlY2lhbHMgZm9yIEVQUCBtb2RlICovCisJCQlpbnQgZmxhZ3MgPSAwOworCQkJc2l6ZV90ICgqZm4pKHN0cnVjdCBwYXJwb3J0ICosIHZvaWQgKiwgc2l6ZV90LCBpbnQpOworCisJCQlpZiAocHAtPmZsYWdzICYgUFBfVzkxMjg0UElDKSB7CisJCQkJZmxhZ3MgfD0gUEFSUE9SVF9XOTEyODRQSUM7CisJCQl9CisJCQlpZiAocHAtPmZsYWdzICYgUFBfRkFTVFJFQUQpIHsKKwkJCQlmbGFncyB8PSBQQVJQT1JUX0VQUF9GQVNUOworCQkJfQorCQkJaWYgKHBwb3J0LT5pZWVlMTI4NC5tb2RlICYgSUVFRTEyODRfQUREUikgeworCQkJCWZuID0gcHBvcnQtPm9wcy0+ZXBwX3JlYWRfYWRkcjsKKwkJCX0gZWxzZSB7CisJCQkJZm4gPSBwcG9ydC0+b3BzLT5lcHBfcmVhZF9kYXRhOworCQkJfQorCQkJYnl0ZXNfcmVhZCA9ICgqZm4pKHBwb3J0LCBrYnVmZmVyLCBuZWVkLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlieXRlc19yZWFkID0gcGFycG9ydF9yZWFkIChwcG9ydCwga2J1ZmZlciwgbmVlZCk7CisJCX0KKworCQlpZiAoYnl0ZXNfcmVhZCAhPSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlieXRlc19yZWFkID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJYnl0ZXNfcmVhZCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCisJcGFycG9ydF9zZXRfdGltZW91dCAocHAtPnBkZXYsIHBwLT5kZWZhdWx0X2luYWN0aXZpdHkpOworCisJaWYgKGJ5dGVzX3JlYWQgPiAwICYmIGNvcHlfdG9fdXNlciAoYnVmLCBrYnVmZmVyLCBieXRlc19yZWFkKSkKKwkJYnl0ZXNfcmVhZCA9IC1FRkFVTFQ7CisKKwlrZnJlZSAoa2J1ZmZlcik7CisJcHBfZW5hYmxlX2lycSAocHApOworCXJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgc3NpemVfdCBwcF93cml0ZSAoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHBfc3RydWN0ICpwcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICoga2J1ZmZlcjsKKwlzc2l6ZV90IGJ5dGVzX3dyaXR0ZW4gPSAwOworCXNzaXplX3Qgd3JvdGU7CisJaW50IG1vZGU7CisJc3RydWN0IHBhcnBvcnQgKnBwb3J0OworCisJaWYgKCEocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkpIHsKKwkJLyogRG9uJ3QgaGF2ZSB0aGUgcG9ydCBjbGFpbWVkICovCisJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiBjbGFpbSB0aGUgcG9ydCBmaXJzdFxuIiwKKwkJCW1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJa2J1ZmZlciA9IGttYWxsb2MobWluX3Qoc2l6ZV90LCBjb3VudCwgUFBfQlVGRkVSX1NJWkUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtidWZmZXIpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBwb3J0ID0gcHAtPnBkZXYtPnBvcnQ7CisJbW9kZSA9IHBwb3J0LT5pZWVlMTI4NC5tb2RlICYgfihJRUVFMTI4NF9ERVZJQ0VJRCB8IElFRUUxMjg0X0FERFIpOworCisJcGFycG9ydF9zZXRfdGltZW91dCAocHAtPnBkZXYsCisJCQkgICAgIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgPworCQkJICAgICBQQVJQT1JUX0lOQUNUSVZJVFlfT19OT05CTE9DSyA6CisJCQkgICAgIHBwLT5kZWZhdWx0X2luYWN0aXZpdHkpOworCisJd2hpbGUgKGJ5dGVzX3dyaXR0ZW4gPCBjb3VudCkgeworCQlzc2l6ZV90IG4gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjb3VudCAtIGJ5dGVzX3dyaXR0ZW4sIFBQX0JVRkZFUl9TSVpFKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIgKGtidWZmZXIsIGJ1ZiArIGJ5dGVzX3dyaXR0ZW4sIG4pKSB7CisJCQlieXRlc193cml0dGVuID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChwcC0+ZmxhZ3MgJiBQUF9GQVNUV1JJVEUpICYmIChtb2RlID09IElFRUUxMjg0X01PREVfRVBQKSkgeworCQkJLyogZG8gYSBmYXN0IEVQUCB3cml0ZSAqLworCQkJaWYgKHBwb3J0LT5pZWVlMTI4NC5tb2RlICYgSUVFRTEyODRfQUREUikgeworCQkJCXdyb3RlID0gcHBvcnQtPm9wcy0+ZXBwX3dyaXRlX2FkZHIgKHBwb3J0LAorCQkJCQlrYnVmZmVyLCBuLCBQQVJQT1JUX0VQUF9GQVNUKTsKKwkJCX0gZWxzZSB7CisJCQkJd3JvdGUgPSBwcG9ydC0+b3BzLT5lcHBfd3JpdGVfZGF0YSAocHBvcnQsCisJCQkJCWtidWZmZXIsIG4sIFBBUlBPUlRfRVBQX0ZBU1QpOworCQkJfQorCQl9IGVsc2UgeworCQkJd3JvdGUgPSBwYXJwb3J0X3dyaXRlIChwcC0+cGRldi0+cG9ydCwga2J1ZmZlciwgbik7CisJCX0KKworCQlpZiAod3JvdGUgPD0gMCkgeworCQkJaWYgKCFieXRlc193cml0dGVuKSB7CisJCQkJYnl0ZXNfd3JpdHRlbiA9IHdyb3RlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlieXRlc193cml0dGVuICs9IHdyb3RlOworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJaWYgKCFieXRlc193cml0dGVuKQorCQkJCWJ5dGVzX3dyaXR0ZW4gPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQlpZiAoIWJ5dGVzX3dyaXR0ZW4pIHsKKwkJCQlieXRlc193cml0dGVuID0gLUVJTlRSOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwlwYXJwb3J0X3NldF90aW1lb3V0IChwcC0+cGRldiwgcHAtPmRlZmF1bHRfaW5hY3Rpdml0eSk7CisKKwlrZnJlZSAoa2J1ZmZlcik7CisJcHBfZW5hYmxlX2lycSAocHApOworCXJldHVybiBieXRlc193cml0dGVuOworfQorCitzdGF0aWMgdm9pZCBwcF9pcnEgKGludCBpcnEsIHZvaWQgKiBwcml2YXRlLCBzdHJ1Y3QgcHRfcmVncyAqIHVudXNlZCkKK3sKKwlzdHJ1Y3QgcHBfc3RydWN0ICogcHAgPSAoc3RydWN0IHBwX3N0cnVjdCAqKSBwcml2YXRlOworCisJaWYgKHBwLT5pcnFyZXNwb25zZSkgeworCQlwYXJwb3J0X3dyaXRlX2NvbnRyb2wgKHBwLT5wZGV2LT5wb3J0LCBwcC0+aXJxY3RsKTsKKwkJcHAtPmlycXJlc3BvbnNlID0gMDsKKwl9CisKKwlhdG9taWNfaW5jICgmcHAtPmlycWMpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnBwLT5pcnFfd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfZGV2aWNlIChpbnQgbWlub3IsIHN0cnVjdCBwcF9zdHJ1Y3QgKnBwKQoreworCXN0cnVjdCBwYXJwb3J0ICpwb3J0OworCXN0cnVjdCBwYXJkZXZpY2UgKiBwZGV2ID0gTlVMTDsKKwljaGFyICpuYW1lOworCWludCBmbDsKKworCW5hbWUgPSBrbWFsbG9jIChzdHJsZW4gKENIUkRFVikgKyAzLCBHRlBfS0VSTkVMKTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwcmludGYgKG5hbWUsIENIUkRFViAiJXgiLCBtaW5vcik7CisKKwlwb3J0ID0gcGFycG9ydF9maW5kX251bWJlciAobWlub3IpOworCWlmICghcG9ydCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IG5vIGFzc29jaWF0ZWQgcG9ydCFcbiIsIG5hbWUpOworCQlrZnJlZSAobmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZmwgPSAocHAtPmZsYWdzICYgUFBfRVhDTCkgPyBQQVJQT1JUX0ZMQUdfRVhDTCA6IDA7CisJcGRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlIChwb3J0LCBuYW1lLCBOVUxMLAorCQkJCQlOVUxMLCBwcF9pcnEsIGZsLCBwcCk7CisJcGFycG9ydF9wdXRfcG9ydCAocG9ydCk7CisKKwlpZiAoIXBkZXYpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIVxuIiwgbmFtZSk7CisJCWtmcmVlIChuYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlwcC0+cGRldiA9IHBkZXY7CisJcHJpbnRrIChLRVJOX0RFQlVHICIlczogcmVnaXN0ZXJlZCBwYXJkZXZpY2VcbiIsIG5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBpZWVlMTI4NF9waGFzZSBpbml0X3BoYXNlIChpbnQgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUgJiB+KElFRUUxMjg0X0RFVklDRUlECisJCQkgfCBJRUVFMTI4NF9BRERSKSkgeworCWNhc2UgSUVFRTEyODRfTU9ERV9OSUJCTEU6CisJY2FzZSBJRUVFMTI4NF9NT0RFX0JZVEU6CisJCXJldHVybiBJRUVFMTI4NF9QSF9SRVZfSURMRTsKKwl9CisJcmV0dXJuIElFRUUxMjg0X1BIX0ZXRF9JRExFOworfQorCitzdGF0aWMgaW50IHBwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgcHBfc3RydWN0ICpwcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGFycG9ydCAqIHBvcnQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwkvKiBGaXJzdCBoYW5kbGUgdGhlIGNhc2VzIHRoYXQgZG9uJ3QgdGFrZSBhcmd1bWVudHMuICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQQ0xBSU06CisJICAgIHsKKwkJc3RydWN0IGllZWUxMjg0X2luZm8gKmluZm87CisJCWludCByZXQ7CisKKwkJaWYgKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpIHsKKwkJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYKKwkJCQkiJXg6IHlvdSd2ZSBhbHJlYWR5IGdvdCBpdCFcbiIsIG1pbm9yKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogRGVmZXJyZWQgZGV2aWNlIHJlZ2lzdHJhdGlvbi4gKi8KKwkJaWYgKCFwcC0+cGRldikgeworCQkJaW50IGVyciA9IHJlZ2lzdGVyX2RldmljZSAobWlub3IsIHBwKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisKKwkJcmV0ID0gcGFycG9ydF9jbGFpbV9vcl9ibG9jayAocHAtPnBkZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcHAtPmZsYWdzIHw9IFBQX0NMQUlNRUQ7CisKKwkJLyogRm9yIGludGVycnVwdC1yZXBvcnRpbmcgdG8gd29yaywgd2UgbmVlZCB0byBiZQorCQkgKiBpbmZvcm1lZCBvZiBlYWNoIGludGVycnVwdC4gKi8KKwkJcHBfZW5hYmxlX2lycSAocHApOworCisJCS8qIFdlIG1heSBuZWVkIHRvIGZpeCB1cCB0aGUgc3RhdGUgbWFjaGluZS4gKi8KKwkJaW5mbyA9ICZwcC0+cGRldi0+cG9ydC0+aWVlZTEyODQ7CisJCXBwLT5zYXZlZF9zdGF0ZS5tb2RlID0gaW5mby0+bW9kZTsKKwkJcHAtPnNhdmVkX3N0YXRlLnBoYXNlID0gaW5mby0+cGhhc2U7CisJCWluZm8tPm1vZGUgPSBwcC0+c3RhdGUubW9kZTsKKwkJaW5mby0+cGhhc2UgPSBwcC0+c3RhdGUucGhhc2U7CisJCXBwLT5kZWZhdWx0X2luYWN0aXZpdHkgPSBwYXJwb3J0X3NldF90aW1lb3V0IChwcC0+cGRldiwgMCk7CisJCXBhcnBvcnRfc2V0X3RpbWVvdXQgKHBwLT5wZGV2LCBwcC0+ZGVmYXVsdF9pbmFjdGl2aXR5KTsKKworCQlyZXR1cm4gMDsKKwkgICAgfQorCWNhc2UgUFBFWENMOgorCQlpZiAocHAtPnBkZXYpIHsKKwkJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiB0b28gbGF0ZSBmb3IgUFBFWENMOyAiCisJCQkJImFscmVhZHkgcmVnaXN0ZXJlZFxuIiwgbWlub3IpOworCQkJaWYgKHBwLT5mbGFncyAmIFBQX0VYQ0wpCisJCQkJLyogQnV0IGl0J3Mgbm90IHJlYWxseSBhbiBlcnJvci4gKi8KKwkJCQlyZXR1cm4gMDsKKwkJCS8qIFRoZXJlJ3Mgbm8gY2hhbmNlIG9mIG1ha2luZyB0aGUgZHJpdmVyIGhhcHB5LiAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBKdXN0IHJlbWVtYmVyIHRvIHJlZ2lzdGVyIHRoZSBkZXZpY2UgZXhjbHVzaXZlbHkKKwkJICogd2hlbiB3ZSBmaW5hbGx5IGRvIHRoZSByZWdpc3RyYXRpb24uICovCisJCXBwLT5mbGFncyB8PSBQUF9FWENMOworCQlyZXR1cm4gMDsKKwljYXNlIFBQU0VUTU9ERToKKwkgICAgeworCQlpbnQgbW9kZTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmbW9kZSwgYXJncCwgc2l6ZW9mIChtb2RlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogRklYTUU6IHZhbGlkYXRlIG1vZGUgKi8KKwkJcHAtPnN0YXRlLm1vZGUgPSBtb2RlOworCQlwcC0+c3RhdGUucGhhc2UgPSBpbml0X3BoYXNlIChtb2RlKTsKKworCQlpZiAocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkgeworCQkJcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0Lm1vZGUgPSBtb2RlOworCQkJcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0LnBoYXNlID0gcHAtPnN0YXRlLnBoYXNlOworCQl9CisKKwkJcmV0dXJuIDA7CisJICAgIH0KKwljYXNlIFBQR0VUTU9ERToKKwkgICAgeworCQlpbnQgbW9kZTsKKworCQlpZiAocHAtPmZsYWdzICYgUFBfQ0xBSU1FRCkgeworCQkJbW9kZSA9IHBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NC5tb2RlOworCQl9IGVsc2UgeworCQkJbW9kZSA9IHBwLT5zdGF0ZS5tb2RlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIgKGFyZ3AsICZtb2RlLCBzaXplb2YgKG1vZGUpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIDA7CisJICAgIH0KKwljYXNlIFBQU0VUUEhBU0U6CisJICAgIHsKKwkJaW50IHBoYXNlOworCQlpZiAoY29weV9mcm9tX3VzZXIgKCZwaGFzZSwgYXJncCwgc2l6ZW9mIChwaGFzZSkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQkvKiBGSVhNRTogdmFsaWRhdGUgcGhhc2UgKi8KKwkJcHAtPnN0YXRlLnBoYXNlID0gcGhhc2U7CisKKwkJaWYgKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpIHsKKwkJCXBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NC5waGFzZSA9IHBoYXNlOworCQl9CisKKwkJcmV0dXJuIDA7CisJICAgIH0KKwljYXNlIFBQR0VUUEhBU0U6CisJICAgIHsKKwkJaW50IHBoYXNlOworCisJCWlmIChwcC0+ZmxhZ3MgJiBQUF9DTEFJTUVEKSB7CisJCQlwaGFzZSA9IHBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NC5waGFzZTsKKwkJfSBlbHNlIHsKKwkJCXBoYXNlID0gcHAtPnN0YXRlLnBoYXNlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIgKGFyZ3AsICZwaGFzZSwgc2l6ZW9mIChwaGFzZSkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKKwkgICAgfQorCWNhc2UgUFBHRVRNT0RFUzoKKwkgICAgeworCQl1bnNpZ25lZCBpbnQgbW9kZXM7CisKKwkJcG9ydCA9IHBhcnBvcnRfZmluZF9udW1iZXIgKG1pbm9yKTsKKwkJaWYgKCFwb3J0KQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJbW9kZXMgPSBwb3J0LT5tb2RlczsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJm1vZGVzLCBzaXplb2YgKG1vZGVzKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiAwOworCSAgICB9CisJY2FzZSBQUFNFVEZMQUdTOgorCSAgICB7CisJCWludCB1ZmxhZ3M7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmdWZsYWdzLCBhcmdwLCBzaXplb2YgKHVmbGFncykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlwcC0+ZmxhZ3MgJj0gflBQX0ZMQUdNQVNLOworCQlwcC0+ZmxhZ3MgfD0gKHVmbGFncyAmIFBQX0ZMQUdNQVNLKTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwljYXNlIFBQR0VURkxBR1M6CisJICAgIHsKKwkJaW50IHVmbGFnczsKKworCQl1ZmxhZ3MgPSBwcC0+ZmxhZ3MgJiBQUF9GTEFHTUFTSzsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnVmbGFncywgc2l6ZW9mICh1ZmxhZ3MpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CS8qIGVuZCBzd2l0Y2goKSAqLworCisJLyogRXZlcnl0aGluZyBlbHNlIHJlcXVpcmVzIHRoZSBwb3J0IHRvIGJlIGNsYWltZWQsIHNvIGNoZWNrCisJICogdGhhdCBub3cuICovCisJaWYgKChwcC0+ZmxhZ3MgJiBQUF9DTEFJTUVEKSA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiBjbGFpbSB0aGUgcG9ydCBmaXJzdFxuIiwKKwkJCW1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcG9ydCA9IHBwLT5wZGV2LT5wb3J0OworCXN3aXRjaCAoY21kKSB7CisJCXN0cnVjdCBpZWVlMTI4NF9pbmZvICppbmZvOworCQl1bnNpZ25lZCBjaGFyIHJlZzsKKwkJdW5zaWduZWQgY2hhciBtYXNrOworCQlpbnQgbW9kZTsKKwkJaW50IHJldDsKKwkJc3RydWN0IHRpbWV2YWwgcGFyX3RpbWVvdXQ7CisJCWxvbmcgdG9famlmZmllczsKKworCWNhc2UgUFBSU1RBVFVTOgorCQlyZWcgPSBwYXJwb3J0X3JlYWRfc3RhdHVzIChwb3J0KTsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnJlZywgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIFBQUkRBVEE6CisJCXJlZyA9IHBhcnBvcnRfcmVhZF9kYXRhIChwb3J0KTsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnJlZywgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIFBQUkNPTlRST0w6CisJCXJlZyA9IHBhcnBvcnRfcmVhZF9jb250cm9sIChwb3J0KTsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnJlZywgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIFBQWUlFTEQ6CisJCXBhcnBvcnRfeWllbGRfYmxvY2tpbmcgKHBwLT5wZGV2KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQUkVMRUFTRToKKwkJLyogU2F2ZSB0aGUgc3RhdGUgbWFjaGluZSdzIHN0YXRlLiAqLworCQlpbmZvID0gJnBwLT5wZGV2LT5wb3J0LT5pZWVlMTI4NDsKKwkJcHAtPnN0YXRlLm1vZGUgPSBpbmZvLT5tb2RlOworCQlwcC0+c3RhdGUucGhhc2UgPSBpbmZvLT5waGFzZTsKKwkJaW5mby0+bW9kZSA9IHBwLT5zYXZlZF9zdGF0ZS5tb2RlOworCQlpbmZvLT5waGFzZSA9IHBwLT5zYXZlZF9zdGF0ZS5waGFzZTsKKwkJcGFycG9ydF9yZWxlYXNlIChwcC0+cGRldik7CisJCXBwLT5mbGFncyAmPSB+UFBfQ0xBSU1FRDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQV0NPTlRST0w6CisJCWlmIChjb3B5X2Zyb21fdXNlciAoJnJlZywgYXJncCwgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwYXJwb3J0X3dyaXRlX2NvbnRyb2wgKHBvcnQsIHJlZyk7CisJCXJldHVybiAwOworCisJY2FzZSBQUFdEQVRBOgorCQlpZiAoY29weV9mcm9tX3VzZXIgKCZyZWcsIGFyZ3AsIHNpemVvZiAocmVnKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcGFycG9ydF93cml0ZV9kYXRhIChwb3J0LCByZWcpOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFBGQ09OVFJPTDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmbWFzaywgYXJncCwKKwkJCQkgICAgc2l6ZW9mIChtYXNrKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmcmVnLCAxICsgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIGFyZywKKwkJCQkgICAgc2l6ZW9mIChyZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwYXJwb3J0X2Zyb2JfY29udHJvbCAocG9ydCwgbWFzaywgcmVnKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQREFUQURJUjoKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmbW9kZSwgYXJncCwgc2l6ZW9mIChtb2RlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKG1vZGUpCisJCQlwb3J0LT5vcHMtPmRhdGFfcmV2ZXJzZSAocG9ydCk7CisJCWVsc2UKKwkJCXBvcnQtPm9wcy0+ZGF0YV9mb3J3YXJkIChwb3J0KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQTkVHT1Q6CisJCWlmIChjb3B5X2Zyb21fdXNlciAoJm1vZGUsIGFyZ3AsIHNpemVvZiAobW9kZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXN3aXRjaCAoKHJldCA9IHBhcnBvcnRfbmVnb3RpYXRlIChwb3J0LCBtb2RlKSkpIHsKKwkJY2FzZSAwOiBicmVhazsKKwkJY2FzZSAtMTogLyogaGFuZHNoYWtlIGZhaWxlZCwgcGVyaXBoZXJhbCBub3QgSUVFRSAxMjg0ICovCisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCWNhc2UgMTogIC8qIGhhbmRzaGFrZSBzdWNjZWVkZWQsIHBlcmlwaGVyYWwgcmVqZWN0ZWQgbW9kZSAqLworCQkJcmV0ID0gLUVOWElPOworCQkJYnJlYWs7CisJCX0KKwkJcHBfZW5hYmxlX2lycSAocHApOworCQlyZXR1cm4gcmV0OworCisJY2FzZSBQUFdDVExPTklSUToKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgmcmVnLCBhcmdwLCBzaXplb2YgKHJlZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogUmVtZW1iZXIgd2hhdCB0byBzZXQgdGhlIGNvbnRyb2wgbGluZXMgdG8sIGZvciBuZXh0CisJCSAqIHRpbWUgd2UgZ2V0IGFuIGludGVycnVwdC4gKi8KKwkJcHAtPmlycWN0bCA9IHJlZzsKKwkJcHAtPmlycXJlc3BvbnNlID0gMTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFBQQ0xSSVJROgorCQlyZXQgPSBhdG9taWNfcmVhZCAoJnBwLT5pcnFjKTsKKwkJaWYgKGNvcHlfdG9fdXNlciAoYXJncCwgJnJldCwgc2l6ZW9mIChyZXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlhdG9taWNfc3ViIChyZXQsICZwcC0+aXJxYyk7CisJCXJldHVybiAwOworCisJY2FzZSBQUFNFVFRJTUU6CisJCWlmIChjb3B5X2Zyb21fdXNlciAoJnBhcl90aW1lb3V0LCBhcmdwLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJLyogQ29udmVydCB0byBqaWZmaWVzLCBwbGFjZSBpbiBwcC0+cGRldi0+dGltZW91dCAqLworCQlpZiAoKHBhcl90aW1lb3V0LnR2X3NlYyA8IDApIHx8IChwYXJfdGltZW91dC50dl91c2VjIDwgMCkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXRvX2ppZmZpZXMgPSBST1VORF9VUChwYXJfdGltZW91dC50dl91c2VjLCAxMDAwMDAwL0haKTsKKwkJdG9famlmZmllcyArPSBwYXJfdGltZW91dC50dl9zZWMgKiAobG9uZylIWjsKKwkJaWYgKHRvX2ppZmZpZXMgPD0gMCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcHAtPnBkZXYtPnRpbWVvdXQgPSB0b19qaWZmaWVzOworCQlyZXR1cm4gMDsKKworCWNhc2UgUFBHRVRUSU1FOgorCQl0b19qaWZmaWVzID0gcHAtPnBkZXYtPnRpbWVvdXQ7CisJCXBhcl90aW1lb3V0LnR2X3NlYyA9IHRvX2ppZmZpZXMgLyBIWjsKKwkJcGFyX3RpbWVvdXQudHZfdXNlYyA9ICh0b19qaWZmaWVzICUgKGxvbmcpSFopICogKDEwMDAwMDAvSFopOworCQlpZiAoY29weV90b191c2VyIChhcmdwLCAmcGFyX3RpbWVvdXQsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX0RFQlVHIENIUkRFViAiJXg6IFdoYXQ/IChjbWQ9MHgleClcbiIsIG1pbm9yLAorCQkJY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogS2VlcCB0aGUgY29tcGlsZXIgaGFwcHkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcF9vcGVuIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHBwX3N0cnVjdCAqcHA7CisKKwlpZiAobWlub3IgPj0gUEFSUE9SVF9NQVgpCisJCXJldHVybiAtRU5YSU87CisKKwlwcCA9IGttYWxsb2MgKHNpemVvZiAoc3RydWN0IHBwX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmICghcHApCisJCXJldHVybiAtRU5PTUVNOworCisJcHAtPnN0YXRlLm1vZGUgPSBJRUVFMTI4NF9NT0RFX0NPTVBBVDsKKwlwcC0+c3RhdGUucGhhc2UgPSBpbml0X3BoYXNlIChwcC0+c3RhdGUubW9kZSk7CisJcHAtPmZsYWdzID0gMDsKKwlwcC0+aXJxcmVzcG9uc2UgPSAwOworCWF0b21pY19zZXQgKCZwcC0+aXJxYywgMCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCAoJnBwLT5pcnFfd2FpdCk7CisKKwkvKiBEZWZlciB0aGUgYWN0dWFsIGRldmljZSByZWdpc3RyYXRpb24gdW50aWwgdGhlIGZpcnN0IGNsYWltLgorCSAqIFRoYXQgd2F5LCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBkcml2ZXIgd2FudHMgdG8gaGF2ZQorCSAqIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIHBvcnQgKFBQRVhDTCkuCisJICovCisJcHAtPnBkZXYgPSBOVUxMOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHBfcmVsZWFzZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBwcF9zdHJ1Y3QgKnBwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBjb21wYXRfbmVnb3Q7CisKKwljb21wYXRfbmVnb3QgPSAwOworCWlmICghKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpICYmIHBwLT5wZGV2ICYmCisJICAgIChwcC0+c3RhdGUubW9kZSAhPSBJRUVFMTI4NF9NT0RFX0NPTVBBVCkpIHsKKwkgICAgCXN0cnVjdCBpZWVlMTI4NF9pbmZvICppbmZvOworCisJCS8qIHBhcnBvcnQgcmVsZWFzZWQsIGJ1dCBub3QgaW4gY29tcGF0aWJpbGl0eSBtb2RlICovCisJCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sgKHBwLT5wZGV2KTsKKwkJcHAtPmZsYWdzIHw9IFBQX0NMQUlNRUQ7CisJCWluZm8gPSAmcHAtPnBkZXYtPnBvcnQtPmllZWUxMjg0OworCQlwcC0+c2F2ZWRfc3RhdGUubW9kZSA9IGluZm8tPm1vZGU7CisJCXBwLT5zYXZlZF9zdGF0ZS5waGFzZSA9IGluZm8tPnBoYXNlOworCQlpbmZvLT5tb2RlID0gcHAtPnN0YXRlLm1vZGU7CisJCWluZm8tPnBoYXNlID0gcHAtPnN0YXRlLnBoYXNlOworCQljb21wYXRfbmVnb3QgPSAxOworCX0gZWxzZSBpZiAoKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpICYmIHBwLT5wZGV2ICYmCisJICAgIChwcC0+cGRldi0+cG9ydC0+aWVlZTEyODQubW9kZSAhPSBJRUVFMTI4NF9NT0RFX0NPTVBBVCkpIHsKKwkJY29tcGF0X25lZ290ID0gMjsKKwl9CisJaWYgKGNvbXBhdF9uZWdvdCkgeworCQlwYXJwb3J0X25lZ290aWF0ZSAocHAtPnBkZXYtPnBvcnQsIElFRUUxMjg0X01PREVfQ09NUEFUKTsKKwkJcHJpbnRrIChLRVJOX0RFQlVHIENIUkRFVgorCQkJIiV4OiBuZWdvdGlhdGVkIGJhY2sgdG8gY29tcGF0aWJpbGl0eSBtb2RlIGJlY2F1c2UgIgorCQkJInVzZXItc3BhY2UgZm9yZ290XG4iLCBtaW5vcik7CisJfQorCisJaWYgKHBwLT5mbGFncyAmIFBQX0NMQUlNRUQpIHsKKwkJc3RydWN0IGllZWUxMjg0X2luZm8gKmluZm87CisKKwkJaW5mbyA9ICZwcC0+cGRldi0+cG9ydC0+aWVlZTEyODQ7CisJCXBwLT5zdGF0ZS5tb2RlID0gaW5mby0+bW9kZTsKKwkJcHAtPnN0YXRlLnBoYXNlID0gaW5mby0+cGhhc2U7CisJCWluZm8tPm1vZGUgPSBwcC0+c2F2ZWRfc3RhdGUubW9kZTsKKwkJaW5mby0+cGhhc2UgPSBwcC0+c2F2ZWRfc3RhdGUucGhhc2U7CisJCXBhcnBvcnRfcmVsZWFzZSAocHAtPnBkZXYpOworCQlpZiAoY29tcGF0X25lZ290ICE9IDEpIHsKKwkJCXByaW50ayAoS0VSTl9ERUJVRyBDSFJERVYgIiV4OiByZWxlYXNlZCBwYXJkZXZpY2UgIgorCQkJCSJiZWNhdXNlIHVzZXItc3BhY2UgZm9yZ290XG4iLCBtaW5vcik7CisJCX0KKwl9CisKKwlpZiAocHAtPnBkZXYpIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHBwLT5wZGV2LT5uYW1lOworCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlIChwcC0+cGRldik7CisJCWtmcmVlIChuYW1lKTsKKwkJcHAtPnBkZXYgPSBOVUxMOworCQlwcmludGsgKEtFUk5fREVCVUcgQ0hSREVWICIleDogdW5yZWdpc3RlcmVkIHBhcmRldmljZVxuIiwKKwkJCW1pbm9yKTsKKwl9CisKKwlrZnJlZSAocHApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIGhlbGQgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBwX3BvbGwgKHN0cnVjdCBmaWxlICogZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJc3RydWN0IHBwX3N0cnVjdCAqcHAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJcG9sbF93YWl0IChmaWxlLCAmcHAtPmlycV93YWl0LCB3YWl0KTsKKwlpZiAoYXRvbWljX3JlYWQgKCZwcC0+aXJxYykpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqcHBkZXZfY2xhc3M7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBwX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHBwX3JlYWQsCisJLndyaXRlCQk9IHBwX3dyaXRlLAorCS5wb2xsCQk9IHBwX3BvbGwsCisJLmlvY3RsCQk9IHBwX2lvY3RsLAorCS5vcGVuCQk9IHBwX29wZW4sCisJLnJlbGVhc2UJPSBwcF9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgcHBfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHBwZGV2X2NsYXNzLCBNS0RFVihQUF9NQUpPUiwgcG9ydC0+bnVtYmVyKSwKKwkJCU5VTEwsICJwYXJwb3J0JWQiLCBwb3J0LT5udW1iZXIpOworfQorCitzdGF0aWMgdm9pZCBwcF9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUFBfTUFKT1IsIHBvcnQtPm51bWJlcikpOworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHBwX2RyaXZlciA9IHsKKwkubmFtZQkJPSBDSFJERVYsCisJLmF0dGFjaAkJPSBwcF9hdHRhY2gsCisJLmRldGFjaAkJPSBwcF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcGRldl9pbml0ICh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCisJaWYgKHJlZ2lzdGVyX2NocmRldiAoUFBfTUFKT1IsIENIUkRFViwgJnBwX2ZvcHMpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIENIUkRFViAiOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkXG4iLAorCQkJUFBfTUFKT1IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHBkZXZfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCBDSFJERVYpOworCWlmIChJU19FUlIocHBkZXZfY2xhc3MpKSB7CisJCWVyciA9IFBUUl9FUlIocHBkZXZfY2xhc3MpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCWRldmZzX21rX2RpcigicGFycG9ydHMiKTsKKwlmb3IgKGkgPSAwOyBpIDwgUEFSUE9SVF9NQVg7IGkrKykgeworCQlkZXZmc19ta19jZGV2KE1LREVWKFBQX01BSk9SLCBpKSwKKwkJCQlTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sICJwYXJwb3J0cy8lZCIsIGkpOworCX0KKwlpZiAocGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJnBwX2RyaXZlcikpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgQ0hSREVWICI6IHVuYWJsZSB0byByZWdpc3RlciB3aXRoIHBhcnBvcnRcbiIpOworCQlnb3RvIG91dF9jbGFzczsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBQUF9WRVJTSU9OICJcbiIpOworCWdvdG8gb3V0OworCitvdXRfY2xhc3M6CisJZm9yIChpID0gMDsgaSA8IFBBUlBPUlRfTUFYOyBpKyspCisJCWRldmZzX3JlbW92ZSgicGFycG9ydHMvJWQiLCBpKTsKKwlkZXZmc19yZW1vdmUoInBhcnBvcnRzIik7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kocHBkZXZfY2xhc3MpOworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihQUF9NQUpPUiwgQ0hSREVWKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHBkZXZfY2xlYW51cCAodm9pZCkKK3sKKwlpbnQgaTsKKwkvKiBDbGVhbiB1cCBhbGwgcGFycG9ydCBzdHVmZiAqLworCWZvciAoaSA9IDA7IGkgPCBQQVJQT1JUX01BWDsgaSsrKQorCQlkZXZmc19yZW1vdmUoInBhcnBvcnRzLyVkIiwgaSk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmcHBfZHJpdmVyKTsKKwlkZXZmc19yZW1vdmUoInBhcnBvcnRzIik7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kocHBkZXZfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2IChQUF9NQUpPUiwgQ0hSREVWKTsKK30KKworbW9kdWxlX2luaXQocHBkZXZfaW5pdCk7Cittb2R1bGVfZXhpdChwcGRldl9jbGVhbnVwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0NIQVJERVZfTUFKT1IoUFBfTUFKT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3B0eS5jIGIvZHJpdmVycy9jaGFyL3B0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzI4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcHR5LmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9jaGFyL3B0eS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQWRkZWQgc3VwcG9ydCBmb3IgYSBVbml4OTgtc3R5bGUgcHRteCBkZXZpY2UuCisgKiAgICAtLSBDLiBTY290dCBBbmFuaWFuIDxjYW5hbmlhbkBhbHVtbmkucHJpbmNldG9uLmVkdT4sIDE0LUphbi0xOTk4CisgKiAgQWRkZWQgVFRZX0RPX1dSSVRFX1dBS0VVUCB0byBlbmFibGUgbl90dHkgdG8gc2VuZCBQT0xMX09VVCB0bworICogICAgICB3YWl0aW5nIHdyaXRlcnMgLS0gU2FwYW4gQmhhdGlhIDxzYXBhbkBjb3Jld2Fycy5vcmc+CisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIEZvciBFWFBPUlRfU1lNQk9MICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZwdHNfZnMuaD4KKworLyogVGhlc2UgYXJlIGdsb2JhbCBiZWNhdXNlIHRoZXkgYXJlIGFjY2Vzc2VkIGluIHR0eV9pby5jICovCisjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCitzdHJ1Y3QgdHR5X2RyaXZlciAqcHRtX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRzX2RyaXZlcjsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwdHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCWlmICh0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpIHsKKwkJaWYgKHR0eS0+Y291bnQgPiAxKQorCQkJcHJpbnRrKCJtYXN0ZXIgcHR5X2Nsb3NlOiBjb3VudCA9ICVkISFcbiIsIHR0eS0+Y291bnQpOworCX0gZWxzZSB7CisJCWlmICh0dHktPmNvdW50ID4gMikKKwkJCXJldHVybjsKKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnJlYWRfd2FpdCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eS0+cGFja2V0ID0gMDsKKwlpZiAoIXR0eS0+bGluaykKKwkJcmV0dXJuOworCXR0eS0+bGluay0+cGFja2V0ID0gMDsKKwlzZXRfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmxpbmstPmZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+bGluay0+cmVhZF93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+bGluay0+d3JpdGVfd2FpdCk7CisJaWYgKHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikgeworCQlzZXRfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmZsYWdzKTsKKyNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKKwkJaWYgKHR0eS0+ZHJpdmVyID09IHB0bV9kcml2ZXIpCisJCQlkZXZwdHNfcHR5X2tpbGwodHR5LT5pbmRleCk7CisjZW5kaWYKKwkJdHR5X3ZoYW5ndXAodHR5LT5saW5rKTsKKwl9Cit9CisKKy8qCisgKiBUaGUgdW50aHJvdHRsZSByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIHNpZ25hbAorICogdGhhdCBpdCBjYW4gcmVjZWl2ZSBtb3JlIGNoYXJhY3RlcnMuICBGb3IgUFRZJ3MsIHRoZSBUVFlfVEhST1RUTEVECisgKiBmbGFnIGlzIGFsd2F5cyBzZXQsIHRvIGZvcmNlIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gYWx3YXlzIGNhbGwgdGhlCisgKiB1bnRocm90dGxlIHJvdXRpbmUgd2hlbiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBUVFlfVEhSRVNIT0xEX1VOVEhST1RUTEUgCisgKiBjaGFyYWN0ZXJzIGluIHRoZSBxdWV1ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGVhY2ggdGltZSB0aGlzCisgKiBoYXBwZW5zLCB3ZSBuZWVkIHRvIHdha2UgdXAgYW55IHNsZWVwaW5nIHByb2Nlc3NlcyB0aGF0IGNvdWxkIGJlCisgKiAoMSkgdHJ5aW5nIHRvIHNlbmQgZGF0YSB0byB0aGUgcHR5LCBvciAoMikgd2FpdGluZyBpbiB3YWl0X3VudGlsX3NlbnQoKQorICogZm9yIHRoZSBwdHkgYnVmZmVyIHRvIGJlIGRyYWluZWQuCisgKi8KK3N0YXRpYyB2b2lkIHB0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICpvX3R0eSA9IHR0eS0+bGluazsKKworCWlmICghb190dHkpCisJCXJldHVybjsKKworCXR0eV93YWtldXAob190dHkpOworCXNldF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpOworfQorCisvKgorICogV1NIIDA1LzI0Lzk3OiBtb2RpZmllZCB0byAKKyAqICAgKDEpIHVzZSBzcGFjZSBpbiB0dHktPmZsaXAgaW5zdGVhZCBvZiBhIHNoYXJlZCB0ZW1wIGJ1ZmZlcgorICoJIFRoZSBmbGlwIGJ1ZmZlcnMgYXJlbid0IGJlaW5nIHVzZWQgZm9yIGEgcHR5LCBzbyB0aGVyZSdzIGxvdHMKKyAqCSBvZiBzcGFjZSBhdmFpbGFibGUuICBUaGUgYnVmZmVyIGlzIHByb3RlY3RlZCBieSBhIHBlci1wdHkKKyAqCSBzZW1hcGhvcmUgdGhhdCBzaG91bGQgYWxtb3N0IG5ldmVyIGNvbWUgdW5kZXIgY29udGVudGlvbi4KKyAqICAgKDIpIGF2b2lkIHJlZHVuZGFudCBjb3B5aW5nIGZvciBjYXNlcyB3aGVyZSBjb3VudCA+PiByZWNlaXZlX3Jvb20KKyAqIE4uQi4gQ2FsbHMgZnJvbSB1c2VyIHNwYWNlIG1heSBub3cgcmV0dXJuIGFuIGVycm9yIGNvZGUgaW5zdGVhZCBvZgorICogYSBjb3VudC4KKyAqCisgKiBGSVhNRTogT3VyIHB0eV93cml0ZSBtZXRob2QgaXMgY2FsbGVkIHdpdGggb3VyIGxkaXNjIGxvY2sgaGVsZCBidXQKKyAqIG5vdCBvdXIgcGFydG5lcnMuIFdlIGNhbid0IGp1c3QgdGFrZSB0aGUgb3RoZXIgb25lIGJsaW5kbHkgd2l0aG91dAorICogcmlza2luZyBkZWFkbG9ja3MuICBUaGVyZSBpcyBhbHNvIHRoZSBzbWFsbCBtYXR0ZXIgb2YgVFRZX0RPTlRfRkxJUAorICovCitzdGF0aWMgaW50IHB0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnRvID0gdHR5LT5saW5rOworCWludAljOworCisJaWYgKCF0byB8fCB0dHktPnN0b3BwZWQpCisJCXJldHVybiAwOworCisJYyA9IHRvLT5sZGlzYy5yZWNlaXZlX3Jvb20odG8pOworCWlmIChjID4gY291bnQpCisJCWMgPSBjb3VudDsKKwl0by0+bGRpc2MucmVjZWl2ZV9idWYodG8sIGJ1ZiwgTlVMTCwgYyk7CisJCisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbnQgcHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdG8gPSB0dHktPmxpbms7CisKKwlpZiAoIXRvIHx8IHR0eS0+c3RvcHBlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdG8tPmxkaXNjLnJlY2VpdmVfcm9vbSh0byk7Cit9CisKKy8qCisgKglXU0ggMDUvMjQvOTc6ICBNb2RpZmllZCBmb3IgYXN5bW1ldHJpYyBNQVNURVIvU0xBVkUgYmVoYXZpb3IKKyAqCVRoZSBjaGFyc19pbl9idWZmZXIoKSB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBsZGlzYyBzZWxlY3QoKSBmdW5jdGlvbiAKKyAqCXRvIGhvbGQgb2ZmIHdyaXRpbmcgd2hlbiBjaGFyc19pbl9idWZmZXIgPiBXQUtFVVBfQ0hBUlMgKD09IDI1NikuCisgKglUaGUgcHR5IGRyaXZlciBjaGFyc19pbl9idWZmZXIoKSBNYXN0ZXIvU2xhdmUgbXVzdCBiZWhhdmUgZGlmZmVyZW50bHk6CisgKgorICogICAgICBUaGUgTWFzdGVyIHNpZGUgbmVlZHMgdG8gYWxsb3cgdHlwZWQtYWhlYWQgY29tbWFuZHMgdG8gYWNjdW11bGF0ZQorICogICAgICB3aGlsZSBiZWluZyBjYW5vbmljYWxpemVkLCBzbyB3ZSByZXBvcnQgIm91ciBidWZmZXIiIGFzIGVtcHR5IHVudGlsCisgKglzb21lIHRocmVzaG9sZCBpcyByZWFjaGVkLCBhbmQgdGhlbiByZXBvcnQgdGhlIGNvdW50LiAoQW55IGNvdW50ID4KKyAqCVdBS0VVUF9DSEFSUyBpcyByZWdhcmRlZCBieSBzZWxlY3QoKSBhcyAiZnVsbCIuKSAgVG8gYXZvaWQgZGVhZGxvY2sgCisgKgl0aGUgY291bnQgcmV0dXJuZWQgbXVzdCBiZSAwIGlmIG5vIGNhbm9uaWNhbCBkYXRhIGlzIGF2YWlsYWJsZSB0byBiZSAKKyAqCXJlYWQuIChUaGUgTl9UVFkgbGRpc2MuY2hhcnNfaW5fYnVmZmVyIG5vdyBrbm93cyB0aGlzLikKKyAqICAKKyAqCVRoZSBTbGF2ZSBzaWRlIHBhc3NlcyBhbGwgY2hhcmFjdGVycyBpbiByYXcgbW9kZSB0byB0aGUgTWFzdGVyIHNpZGUncworICoJYnVmZmVyIHdoZXJlIHRoZXkgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHksIHNvIGluIHRoaXMgY2FzZSB3ZSBjYW4KKyAqCXJldHVybiB0aGUgdHJ1ZSBjb3VudCBpbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IHB0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdG8gPSB0dHktPmxpbms7CisJc3NpemVfdCAoKmNoYXJzX2luX2J1ZmZlcikoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CisJaW50IGNvdW50OworCisJLyogV2Ugc2hvdWxkIGdldCB0aGUgbGluZSBkaXNjaXBsaW5lIGxvY2sgZm9yICJ0dHktPmxpbmsiICovCisJaWYgKCF0byB8fCAhKGNoYXJzX2luX2J1ZmZlciA9IHRvLT5sZGlzYy5jaGFyc19pbl9idWZmZXIpKQorCQlyZXR1cm4gMDsKKworCS8qIFRoZSBsZGlzYyBtdXN0IHJlcG9ydCAwIGlmIG5vIGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KKwljb3VudCA9IGNoYXJzX2luX2J1ZmZlcih0byk7CisKKwlpZiAodHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUpIHJldHVybiBjb3VudDsKKworCS8qIE1hc3RlciBzaWRlIGRyaXZlciAuLi4gaWYgdGhlIG90aGVyIHNpZGUncyByZWFkIGJ1ZmZlciBpcyBsZXNzIHRoYW4gCisJICogaGFsZiBmdWxsLCByZXR1cm4gMCB0byBhbGxvdyB3cml0ZXJzIHRvIHByb2NlZWQ7IG90aGVyd2lzZSByZXR1cm4KKwkgKiB0aGUgY291bnQuICBUaGlzIGxlYXZlcyBhIGNvbWZvcnRhYmxlIG1hcmdpbiB0byBhdm9pZCBvdmVyZmxvdywgCisJICogYW5kIHN0aWxsIGFsbG93cyBoYWxmIGEgYnVmZmVyJ3Mgd29ydGggb2YgdHlwZWQtYWhlYWQgY29tbWFuZHMuCisJICovCisJcmV0dXJuICgoY291bnQgPCBOX1RUWV9CVUZfU0laRS8yKSA/IDAgOiBjb3VudCk7Cit9CisKKy8qIFNldCB0aGUgbG9jayBmbGFnIG9uIGEgcHR5ICovCitzdGF0aWMgaW50IHB0eV9zZXRfbG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICogYXJnKQoreworCWludCB2YWw7CisJaWYgKGdldF91c2VyKHZhbCxhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodmFsKQorCQlzZXRfYml0KFRUWV9QVFlfTE9DSywgJnR0eS0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KFRUWV9QVFlfTE9DSywgJnR0eS0+ZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnRvID0gdHR5LT5saW5rOworCQorCWlmICghdG8pCisJCXJldHVybjsKKwkKKwlpZiAodG8tPmxkaXNjLmZsdXNoX2J1ZmZlcikKKwkJdG8tPmxkaXNjLmZsdXNoX2J1ZmZlcih0byk7CisJCisJaWYgKHRvLT5wYWNrZXQpIHsKKwkJdHR5LT5jdHJsX3N0YXR1cyB8PSBUSU9DUEtUX0ZMVVNIV1JJVEU7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdG8tPnJlYWRfd2FpdCk7CisJfQorfQorCitzdGF0aWMgaW50IHB0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpbnQJcmV0dmFsID0gLUVOT0RFVjsKKworCWlmICghdHR5IHx8ICF0dHktPmxpbmspCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gLUVJTzsKKwlpZiAodGVzdF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpKQorCQlnb3RvIG91dDsKKwlpZiAodGVzdF9iaXQoVFRZX1BUWV9MT0NLLCAmdHR5LT5saW5rLT5mbGFncykpCisJCWdvdG8gb3V0OworCWlmICh0dHktPmxpbmstPmNvdW50ICE9IDEpCisJCWdvdG8gb3V0OworCisJY2xlYXJfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmxpbmstPmZsYWdzKTsKKwlzZXRfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKTsKKwlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHB0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisgICAgICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+KENTSVpFIHwgUEFSRU5CKTsKKyAgICAgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IChDUzggfCBDUkVBRCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcHR5X29wcyA9IHsKKwkub3BlbiA9IHB0eV9vcGVuLAorCS5jbG9zZSA9IHB0eV9jbG9zZSwKKwkud3JpdGUgPSBwdHlfd3JpdGUsCisJLndyaXRlX3Jvb20gPSBwdHlfd3JpdGVfcm9vbSwKKwkuZmx1c2hfYnVmZmVyID0gcHR5X2ZsdXNoX2J1ZmZlciwKKwkuY2hhcnNfaW5fYnVmZmVyID0gcHR5X2NoYXJzX2luX2J1ZmZlciwKKwkudW50aHJvdHRsZSA9IHB0eV91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IHB0eV9zZXRfdGVybWlvcywKK307CisKKy8qIFRyYWRpdGlvbmFsIEJTRCBkZXZpY2VzICovCisjaWZkZWYgQ09ORklHX0xFR0FDWV9QVFlTCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnB0eV9kcml2ZXIsICpwdHlfc2xhdmVfZHJpdmVyOworCitzdGF0aWMgaW50IHB0eV9ic2RfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NTUFRMQ0s6IC8qIFNldCBQVCBMb2NrIChkaXNhbGxvdyBzbGF2ZSBvcGVuKSAqLworCQlyZXR1cm4gcHR5X3NldF9sb2NrKHR0eSwgKGludCBfX3VzZXIgKikgYXJnKTsKKwl9CisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGxlZ2FjeV9wdHlfaW5pdCh2b2lkKQoreworCisJcHR5X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlJfUFRZUyk7CisJaWYgKCFwdHlfZHJpdmVyKQorCQlwYW5pYygiQ291bGRuJ3QgYWxsb2NhdGUgcHR5IGRyaXZlciIpOworCisJcHR5X3NsYXZlX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlJfUFRZUyk7CisJaWYgKCFwdHlfc2xhdmVfZHJpdmVyKQorCQlwYW5pYygiQ291bGRuJ3QgYWxsb2NhdGUgcHR5IHNsYXZlIGRyaXZlciIpOworCisJcHR5X2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlwdHlfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJwdHlfbWFzdGVyIjsKKwlwdHlfZHJpdmVyLT5uYW1lID0gInB0eSI7CisJcHR5X2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJwdHkvbSI7CisJcHR5X2RyaXZlci0+bWFqb3IgPSBQVFlfTUFTVEVSX01BSk9SOworCXB0eV9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwlwdHlfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1BUWTsKKwlwdHlfZHJpdmVyLT5zdWJ0eXBlID0gUFRZX1RZUEVfTUFTVEVSOworCXB0eV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwdHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pZmxhZyA9IDA7CisJcHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb2ZsYWcgPSAwOworCXB0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQ7CisJcHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfbGZsYWcgPSAwOworCXB0eV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TIHwgVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwlwdHlfZHJpdmVyLT5vdGhlciA9IHB0eV9zbGF2ZV9kcml2ZXI7CisJdHR5X3NldF9vcGVyYXRpb25zKHB0eV9kcml2ZXIsICZwdHlfb3BzKTsKKwlwdHlfZHJpdmVyLT5pb2N0bCA9IHB0eV9ic2RfaW9jdGw7CisKKwlwdHlfc2xhdmVfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXB0eV9zbGF2ZV9kcml2ZXItPmRyaXZlcl9uYW1lID0gInB0eV9zbGF2ZSI7CisJcHR5X3NsYXZlX2RyaXZlci0+bmFtZSA9ICJ0dHlwIjsKKwlwdHlfc2xhdmVfZHJpdmVyLT5kZXZmc19uYW1lID0gInB0eS9zIjsKKwlwdHlfc2xhdmVfZHJpdmVyLT5tYWpvciA9IFBUWV9TTEFWRV9NQUpPUjsKKwlwdHlfc2xhdmVfZHJpdmVyLT5taW5vcl9zdGFydCA9IDA7CisJcHR5X3NsYXZlX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9QVFk7CisJcHR5X3NsYXZlX2RyaXZlci0+c3VidHlwZSA9IFBUWV9UWVBFX1NMQVZFOworCXB0eV9zbGF2ZV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwdHlfc2xhdmVfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEIzODQwMCB8IENTOCB8IENSRUFEOworCXB0eV9zbGF2ZV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TIHwKKwkJCQkJVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwlwdHlfc2xhdmVfZHJpdmVyLT5vdGhlciA9IHB0eV9kcml2ZXI7CisJdHR5X3NldF9vcGVyYXRpb25zKHB0eV9zbGF2ZV9kcml2ZXIsICZwdHlfb3BzKTsKKworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHB0eV9kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgcHR5IGRyaXZlciIpOworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHB0eV9zbGF2ZV9kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgcHR5IHNsYXZlIGRyaXZlciIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZWdhY3lfcHR5X2luaXQodm9pZCkgeyB9CisjZW5kaWYKKworLyogVW5peDk4IGRldmljZXMgKi8KKyNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKKy8qCisgKiBzeXNjdGwgc3VwcG9ydCBmb3Igc2V0dGluZyBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBVbml4OTggcHR5cyBhbGxvY2F0ZWQuCisgKiBPdGhlcndpc2Ugb25lIGNhbiBlYXQgdXAgYWxsIGtlcm5lbCBtZW1vcnkgYnkgb3BlbmluZyAvZGV2L3B0bXggcmVwZWF0ZWRseS4KKyAqLworaW50IHB0eV9saW1pdCA9IE5SX1VOSVg5OF9QVFlfREVGQVVMVDsKK3N0YXRpYyBpbnQgcHR5X2xpbWl0X21pbiA9IDA7CitzdGF0aWMgaW50IHB0eV9saW1pdF9tYXggPSBOUl9VTklYOThfUFRZX01BWDsKKworY3RsX3RhYmxlIHB0eV90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gUFRZX01BWCwKKwkJLnByb2NuYW1lCT0gIm1heCIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5kYXRhCQk9ICZwdHlfbGltaXQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZwdHlfbGltaXRfbWluLAorCQkuZXh0cmEyCQk9ICZwdHlfbGltaXRfbWF4LAorCX0sIHsKKwkJLmN0bF9uYW1lCT0gUFRZX05SLAorCQkucHJvY25hbWUJPSAibnIiLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwgeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKKworc3RhdGljIGludCBwdHlfdW5peDk4X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DU1BUTENLOiAvKiBTZXQgUFQgTG9jayAoZGlzYWxsb3cgc2xhdmUgb3BlbikgKi8KKwkJcmV0dXJuIHB0eV9zZXRfbG9jayh0dHksIChpbnQgX191c2VyICopYXJnKTsKKwljYXNlIFRJT0NHUFROOiAvKiBHZXQgUFQgTnVtYmVyICovCisJCXJldHVybiBwdXRfdXNlcih0dHktPmluZGV4LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisJfQorCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHVuaXg5OF9wdHlfaW5pdCh2b2lkKQoreworCWRldmZzX21rX2RpcigicHRzIik7CisJcHRtX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlJfVU5JWDk4X1BUWV9NQVgpOworCWlmICghcHRtX2RyaXZlcikKKwkJcGFuaWMoIkNvdWxkbid0IGFsbG9jYXRlIFVuaXg5OCBwdG0gZHJpdmVyIik7CisJcHRzX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTlJfVU5JWDk4X1BUWV9NQVgpOworCWlmICghcHRzX2RyaXZlcikKKwkJcGFuaWMoIkNvdWxkbid0IGFsbG9jYXRlIFVuaXg5OCBwdHMgZHJpdmVyIik7CisKKwlwdG1fZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXB0bV9kcml2ZXItPmRyaXZlcl9uYW1lID0gInB0eV9tYXN0ZXIiOworCXB0bV9kcml2ZXItPm5hbWUgPSAicHRtIjsKKwlwdG1fZHJpdmVyLT5tYWpvciA9IFVOSVg5OF9QVFlfTUFTVEVSX01BSk9SOworCXB0bV9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwlwdG1fZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1BUWTsKKwlwdG1fZHJpdmVyLT5zdWJ0eXBlID0gUFRZX1RZUEVfTUFTVEVSOworCXB0bV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlwdG1fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pZmxhZyA9IDA7CisJcHRtX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb2ZsYWcgPSAwOworCXB0bV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQ7CisJcHRtX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfbGZsYWcgPSAwOworCXB0bV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TIHwgVFRZX0RSSVZFUl9SRUFMX1JBVyB8CisJCVRUWV9EUklWRVJfTk9fREVWRlMgfCBUVFlfRFJJVkVSX0RFVlBUU19NRU07CisJcHRtX2RyaXZlci0+b3RoZXIgPSBwdHNfZHJpdmVyOworCXR0eV9zZXRfb3BlcmF0aW9ucyhwdG1fZHJpdmVyLCAmcHR5X29wcyk7CisJcHRtX2RyaXZlci0+aW9jdGwgPSBwdHlfdW5peDk4X2lvY3RsOworCisJcHRzX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlwdHNfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJwdHlfc2xhdmUiOworCXB0c19kcml2ZXItPm5hbWUgPSAicHRzIjsKKwlwdHNfZHJpdmVyLT5tYWpvciA9IFVOSVg5OF9QVFlfU0xBVkVfTUFKT1I7CisJcHRzX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCXB0c19kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfUFRZOworCXB0c19kcml2ZXItPnN1YnR5cGUgPSBQVFlfVFlQRV9TTEFWRTsKKwlwdHNfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJcHRzX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCMzg0MDAgfCBDUzggfCBDUkVBRDsKKwlwdHNfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUyB8IFRUWV9EUklWRVJfUkVBTF9SQVcgfAorCQlUVFlfRFJJVkVSX05PX0RFVkZTIHwgVFRZX0RSSVZFUl9ERVZQVFNfTUVNOworCXB0c19kcml2ZXItPm90aGVyID0gcHRtX2RyaXZlcjsKKwl0dHlfc2V0X29wZXJhdGlvbnMocHRzX2RyaXZlciwgJnB0eV9vcHMpOworCQorCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHB0bV9kcml2ZXIpKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgVW5peDk4IHB0bSBkcml2ZXIiKTsKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihwdHNfZHJpdmVyKSkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIFVuaXg5OCBwdHMgZHJpdmVyIik7CisKKwlwdHlfdGFibGVbMV0uZGF0YSA9ICZwdG1fZHJpdmVyLT5yZWZjb3VudDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdW5peDk4X3B0eV9pbml0KHZvaWQpIHsgfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHB0eV9pbml0KHZvaWQpCit7CisJbGVnYWN5X3B0eV9pbml0KCk7CisJdW5peDk4X3B0eV9pbml0KCk7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChwdHlfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcXRyb25peC5jIGIvZHJpdmVycy9jaGFyL3F0cm9uaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGEzY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3F0cm9uaXguYwpAQCAtMCwwICsxLDYwMSBAQAorLyoKKyAqCisgKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KKyAqCVF0cm9uaXggOTkwUCBpbmZyYXJlZCBrZXlib2FyZCBkcml2ZXIuCisgKgorICoKKyAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIAlwcG9wb3ZAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqCisgKiAgVGhlIGJvdHRvbSBwb3J0aW9uIG9mIHRoaXMgZHJpdmVyIHdhcyB0YWtlIGZyb20gCisgKiAgcGNfa2V5Yi5jICBQbGVhc2Ugc2VlIHRoYXQgZmlsZSBmb3IgY29weXJpZ2h0cy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKiAKKyAqIE5PVEU6ICAKKyAqCisgKglUaGlzIGRyaXZlciBoYXMgb25seSBiZWVuIHRlc3RlZCB3aXRoIHRoZSBDb25zdW1lciBJUgorICoJcG9ydCBvZiB0aGUgSVRFIDgxNzIgc3lzdGVtIGNvbnRyb2xsZXIuCisgKgorICoJWW91IGRvIG5vdCBuZWVkIHRoaXMgZHJpdmVyIGlmIHlvdSBhcmUgdXNpbmcgdGhlIHBzLzIgb3IKKyAqCVVTQiBhZGFwdGVyIHRoYXQgdGhlIGtleWJvYXJkIHNoaXBzIHdpdGguICBZb3Ugb25seSBuZWVkIAorICoJdGhpcyBkcml2ZXIgaWYgeW91ciBib2FyZCBoYXMgYSBJUiBwb3J0IGFuZCB0aGUga2V5Ym9hcmQKKyAqCWRhdGEgaXMgYmVpbmcgc2VudCBkaXJlY3RseSB0byB0aGUgSVIuICBJbiB0aGF0IGNhc2UsCisgKgl5b3UgYWxzbyBuZWVkIHNvbWUgbG93LWxldmVsIElSIHN1cHBvcnQuIFNlZSBpdDgxNzJfY2lyLmMuCisgKgkKKyAqLworCisjaWZkZWYgQ09ORklHX1FUUk9OSVhfS0VZQk9BUkQKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vaXQ4MTcyL2l0ODE3Mi5oPgorI2luY2x1ZGUgPGFzbS9pdDgxNzIvaXQ4MTcyX2ludC5oPgorI2luY2x1ZGUgPGFzbS9pdDgxNzIvaXQ4MTcyX2Npci5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjX2tleWIuaD4KKworI2luY2x1ZGUgPGFzbS9rZXlib2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBsZWFkaW5nMSAwCisjZGVmaW5lIGxlYWRpbmcyIDB4RgorCisjZGVmaW5lIEtCRF9DSVJfUE9SVCAwCisjZGVmaW5lIEFVWF9SRUNPTk5FQ1QgMTcwIC8qIHNjYW5jb2RlIHdoZW4gcHMyIGRldmljZSBpcyBwbHVnZ2VkIChiYWNrKSBpbiAqLworCitzdGF0aWMgaW50IGRhdGFfaW5kZXg7CitzdHJ1Y3QgY2lyX3BvcnQgKmNpcjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtiZGJ5dGVzWzVdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2lyX2RhdGFbMzJdOyAvKiB3ZSBvbmx5IG5lZWQgMTYgY2hhcnMgKi8KKworc3RhdGljIHZvaWQga2JkX2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBoYW5kbGVfZGF0YSh1bnNpZ25lZCBjaGFyICpwX2RhdGEpOworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9tb3VzZV9ldmVudCh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfa2V5Ym9hcmRfZXZlbnQodW5zaWduZWQgY2hhciBzY2FuY29kZSwgaW50IGRvd24pOworc3RhdGljIGludCBfX2luaXQgcHNhdXhfaW5pdCh2b2lkKTsKKworc3RhdGljIHN0cnVjdCBhdXhfcXVldWUgKnF1ZXVlOwkvKiBNb3VzZSBkYXRhIGJ1ZmZlci4gKi8KK3N0YXRpYyBpbnQgYXV4X2NvdW50ID0gMDsKKworLyoKKyAqIEtleXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgJ0ZuJyBrZXkKKyAqIFRoZSBGbiBrZXkgZG9lcyBub3QgcHJvZHVjZSBhIGtleS11cCBzZXF1ZW5jZS4gU28sIHRoZSBmaXJzdAorICogdGltZSB0aGUgdXNlciBwcmVzc2VzIGl0LCBpdCB3aWxsIGJlIGtleS1kb3duIGV2ZW50LiBUaGUga2V5CisgKiBzdGF5cyBkb3duIHVudGlsIHRoZSB1c2VyIHByZXNzZXMgaXQgYWdhaW4uCisgKi8KKyNkZWZpbmUgTlVNX0ZOX0tFWVMgNTYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZuX2tleXNbTlVNX0ZOX0tFWVNdID0geworCTAsMCwwLDAsMCwwLDAsMCwgICAgICAgIC8qIDAgNyAgICovCisJOCw5LDEwLDkzLDAsMCwwLDAsICAgICAgLyogOCAxNSAgKi8KKwkwLDAsMCwwLDAsMCwwLDUsICAgICAgICAvKiAxNiAyMyAqLworCTYsNyw5MSwwLDAsMCwwLDAsICAgICAgIC8qIDI0IDMxICovCisJMCwwLDAsMCwwLDIsMyw0LCAgICAgICAgLyogMzIgMzkgKi8KKwk5MiwwLDAsMCwwLDAsMCwwLCAgICAgICAvKiA0MCA0NyAqLworCTAsMCwwLDAsMTEsMCw5NCw5NSAgICAgICAgLyogNDggNTUgKi8KKworfTsKKwordm9pZCBfX2luaXQgaW5pdF9xdHJvbml4Xzk5MFBfa2JkKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCWNpciA9IChzdHJ1Y3QgY2lyX3BvcnQgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2lyX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNpcikgeworCQlwcmludGsoIlVuYWJsZSB0byBpbml0aWFsaXplIFF0cm9uaXgga2V5Ym9hcmRcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogCisJICogcmV2aXNpdAorCSAqIHRoaXMgc2hvdWxkIGJlIHByb2dyYW1tYWJsZSwgc29tZWhvdyBieSB0aGUsIGJ5IHRoZSB1c2VyLgorCSAqLworCWNpci0+cG9ydCA9IEtCRF9DSVJfUE9SVDsKKwljaXItPmJhdWRfcmF0ZSA9IDB4MWQ7CisJY2lyLT5yZHdvcyA9IDA7CisJY2lyLT5yeGRjciA9IDB4MzsKKwljaXItPmhjZnMgPSAwOworCWNpci0+Zmlmb190bCA9IDA7CisJY2lyLT5jZnEgPSAweDFkOworCWNpcl9wb3J0X2luaXQoY2lyKTsKKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKElUODE3Ml9DSVIwX0lSUSwga2JkX2ludF9oYW5kbGVyLCAKKwkJCSh1bnNpZ25lZCBsb25nICkoU0FfSU5URVJSVVBUfFNBX1NISVJRKSwgCisJCQkoY29uc3QgY2hhciAqKSJRdHJvbml4IElSIEtleWJvYXJkIiwgKHZvaWQgKiljaXIpOworCisJaWYgKHJldHZhbCkgeworCQlwcmludGsoInVuYWJsZSB0byBhbGxvY2F0ZSBjaXIgJWQgaXJxICVkXG4iLCAKKwkJCQljaXItPnBvcnQsIElUODE3Ml9DSVIwX0lSUSk7CisJfQorI2lmZGVmIENPTkZJR19QU01PVVNFCisJcHNhdXhfaW5pdCgpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBCaXRSZXZlcnNlKHVuc2lnbmVkIHNob3J0IGtleSkKK3sKKwl1bnNpZ25lZCBjaGFyIHJrZXkgPSAwOworCXJrZXkgfD0gKGtleSAmIDB4MSkgPDwgNzsKKwlya2V5IHw9IChrZXkgJiAweDIpIDw8IDU7CisJcmtleSB8PSAoa2V5ICYgMHg0KSA8PCAzOworCXJrZXkgfD0gKGtleSAmIDB4OCkgPDwgMTsKKwlya2V5IHw9IChrZXkgJiAweDEwKSA+PiAxOworCXJrZXkgfD0gKGtleSAmIDB4MjApID4+IDM7CisJcmtleSB8PSAoa2V5ICYgMHg0MCkgPj4gNTsKKwlya2V5IHw9IChrZXkgJiAweDgwKSA+PiA3OworCXJldHVybiBya2V5OworCit9CisKKworc3RhdGljIGlubGluZSB1X2ludDhfdCBVcHBlckJ5dGUodV9pbnQ4X3QgZGF0YSkKK3sKKwlyZXR1cm4gKGRhdGEgPj4gNCk7Cit9CisKKworc3RhdGljIGlubGluZSB1X2ludDhfdCBMb3dlckJ5dGUodV9pbnQ4X3QgZGF0YSkKK3sKKwlyZXR1cm4gKGRhdGEgJiAweEYpOworfQorCisKK2ludCBDaGVja1N1bU9rKHVfaW50OF90IGJ5dGUxLCB1X2ludDhfdCBieXRlMiwgCisJCXVfaW50OF90IGJ5dGUzLCB1X2ludDhfdCBieXRlNCwgdV9pbnQ4X3QgYnl0ZTUpCit7CisJdV9pbnQ4X3QgQ2hlY2tTdW07CisKKwlDaGVja1N1bSA9IChieXRlMSAmIDB4MEYpICsgYnl0ZTIgKyBieXRlMyArIGJ5dGU0ICsgYnl0ZTU7CisJaWYgKCBMb3dlckJ5dGUoVXBwZXJCeXRlKENoZWNrU3VtKSArIExvd2VyQnl0ZShDaGVja1N1bSkpICE9IFVwcGVyQnl0ZShieXRlMSkgKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIGtiZF9pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBjaXJfcG9ydCAqY2lyOworCWludCBqOworCXVuc2lnbmVkIGNoYXIgaW50X3N0YXR1czsKKworCWNpciA9IChzdHJ1Y3QgY2lyX3BvcnQgKilkZXZfaWQ7CisJaW50X3N0YXR1cyA9IGdldF9pbnRfc3RhdHVzKGNpcik7CisJaWYgKGludF9zdGF0dXMgJiAweDQpIHsKKwkJY2xlYXJfZmlmbyhjaXIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKGNpcl9nZXRfcnhfY291bnQoY2lyKSkgeworCisJCWNpcl9kYXRhW2RhdGFfaW5kZXhdID0gY2lyX3JlYWRfZGF0YShjaXIpOworCisJCWlmIChkYXRhX2luZGV4ID09IDApIHsvKiBleHBlY3RpbmcgZmlyc3QgYnl0ZSAqLworCQkJaWYgKGNpcl9kYXRhW2RhdGFfaW5kZXhdICE9IGxlYWRpbmcxKSB7CisJCQkJLy9wcmludGsoIiFsZWFkaW5nIGJ5dGUgJXhcbiIsIGNpcl9kYXRhW2RhdGFfaW5kZXhdKTsKKwkJCQlzZXRfcnhfYWN0aXZlKGNpcik7CisJCQkJY2xlYXJfZmlmbyhjaXIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmIChkYXRhX2luZGV4ID09IDEpIHsKKwkJCWlmICgoY2lyX2RhdGFbZGF0YV9pbmRleF0gJiAweGYpICE9IGxlYWRpbmcyKSB7CisJCQkJc2V0X3J4X2FjdGl2ZShjaXIpOworCQkJCWRhdGFfaW5kZXggPSAwOyAvKiBzdGFydCBvdmVyICovCisJCQkJY2xlYXJfZmlmbyhjaXIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKCAoY2lyX2RhdGFbZGF0YV9pbmRleF0gPT0gMHhmZikpIHsgLyogbGFzdCBieXRlICovCisJCQkvL3ByaW50aygiZGF0YV9pbmRleCAlZFxuIiwgZGF0YV9pbmRleCk7CisJCQlzZXRfcnhfYWN0aXZlKGNpcik7CisjaWYgMAorCQkJZm9yIChqPTA7IGo8PWRhdGFfaW5kZXg7IGorKykgeworCQkJCXByaW50aygicnhfZGF0YSAlZDogICV4XG4iLCBqLCBjaXJfZGF0YVtqXSk7CisJCQl9CisjZW5kaWYKKwkJCWRhdGFfaW5kZXggPSAwOworCQkJaGFuZGxlX2RhdGEoY2lyX2RhdGEpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UgaWYgKGRhdGFfaW5kZXg+MTYpIHsKKwkJCXNldF9yeF9hY3RpdmUoY2lyKTsKKyNpZiAwCisJCQlwcmludGsoIndhcm5pbmc6IGRhdGFfaW5kZXggJWRcbiIsIGRhdGFfaW5kZXgpOworCQkJZm9yIChqPTA7IGo8PWRhdGFfaW5kZXg7IGorKykgeworCQkJCXByaW50aygicnhfZGF0YSAlZDogICV4XG4iLCBqLCBjaXJfZGF0YVtqXSk7CisJCQl9CisjZW5kaWYKKwkJCWRhdGFfaW5kZXggPSAwOworCQkJY2xlYXJfZmlmbyhjaXIpOworCQkJcmV0dXJuOworCQl9CisJCWRhdGFfaW5kZXgrKzsKKwl9Cit9CisKKworI2RlZmluZSBOVU1fS0JEX0JZVEVTIDUKK3N0YXRpYyBpbnQgaGFuZGxlX2RhdGEodW5zaWduZWQgY2hhciAqcF9kYXRhKQoreworCXVfaW50MzJfdCBiaXRfYnVja2V0OworCXVfaW50MzJfdCBpLCBqOworCXVfaW50MzJfdCBnb3RfYml0cywgbmV4dF9ieXRlOworCWludCBkb3duID0gMDsKKworCS8qIFJlb3JnYW5pemUgdGhlIGJpdCBzdHJlYW0gKi8KKwlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQlwX2RhdGFbaV0gPSBCaXRSZXZlcnNlKH5wX2RhdGFbaV0pOworCisJLyogCisJICogV2UndmUgYWxyZWFkeSBwcmV2aW91c2x5IGNoZWNrZWQgdGhhdCBwX2RhdGFbMF0KKwkgKiBpcyBlcXVhbCB0byBsZWFkaW5nMSBhbmQgdGhhdCAocF9kYXRhWzFdICYgMHhmKQorCSAqIGlzIGVxdWFsIHRvIGxlYWRpbmcyLiBUaGVzZSB0d2VsdmUgYml0cyBhcmUgdGhlCisJICogbGVhZGVyIGNvZGUuICBXZSBjYW4gbm93IHRocm93IHRoZW0gYXdheSAodGhlIDEyCisJICogYml0cykgYW5kIGNvbnRpbnVlIHBhcnNpbmcgdGhlIHN0cmVhbS4KKwkgKi8KKwliaXRfYnVja2V0ID0gcF9kYXRhWzFdIDw8IDEyOworCWdvdF9iaXRzID0gNDsKKwluZXh0X2J5dGUgPSAyOworCisJLyogCisJICogUHJvY2VzcyBmb3VyIGJpdHMgYXQgYSB0aW1lCisJICovCisJZm9yIChpPTA7IGk8TlVNX0tCRF9CWVRFUzsgaSsrKSB7CisKKwkJa2JkYnl0ZXNbaV09MDsKKworCQlmb3IgKGo9MDsgajw4OyBqKyspIC8qIDggYml0cyBwZXIgYnl0ZSAqLworCQl7CisJCQlpZiAoZ290X2JpdHMgPCA0KSB7CisJCQkJYml0X2J1Y2tldCB8PSAocF9kYXRhW25leHRfYnl0ZSsrXSA8PCAoOCAtIGdvdF9iaXRzKSk7CisJCQkJZ290X2JpdHMgKz0gODsKKwkJCX0KKworCQkJaWYgKChiaXRfYnVja2V0ICYgMHhGMDAwKSA9PSAweDgwMDApIHsgCisJCQkJLyogQ29udmVydCAxMDAwYiB0byAxICovCisJCQkJa2JkYnl0ZXNbaV0gPSAweDgwIHwgKGtiZGJ5dGVzW2ldID4+IDEpOworCQkJCWdvdF9iaXRzIC09IDQ7CisJCQkJYml0X2J1Y2tldCA9IGJpdF9idWNrZXQgPDwgNDsKKwkJCX0KKwkJCWVsc2UgaWYgKChiaXRfYnVja2V0ICYgMHhDMDAwKSA9PSAweDgwMDApIHsKKwkJCQkvKiBDb252ZXJ0IDEwYiB0byAwICovCisJCQkJa2JkYnl0ZXNbaV0gPSAga2JkYnl0ZXNbaV0gPj4gMTsKKwkJCQlnb3RfYml0cyAtPSAyOworCQkJCWJpdF9idWNrZXQgPSBiaXRfYnVja2V0IDw8IDI7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBiYWQgc2VyaWFsIHN0cmVhbSAqLworCQkJCXJldHVybiAxOworCQkJfQorCisJCQlpZiAobmV4dF9ieXRlID4gMTYpIHsKKwkJCQkvL3ByaW50aygiZXJyb3I6IHRvbyBtYW55IGJ5dGVzXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYgKCFDaGVja1N1bU9rKGtiZGJ5dGVzWzBdLCBrYmRieXRlc1sxXSwgCisJCQkJa2JkYnl0ZXNbMl0sIGtiZGJ5dGVzWzNdLCBrYmRieXRlc1s0XSkpIHsKKwkJLy9wcmludGsoImNoZWNrc3VtIGZhaWxlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChrYmRieXRlc1sxXSAmIDB4MDgpIHsKKwkJLy9wcmludGsoIm06ICV4ICV4ICV4XG4iLCBrYmRieXRlc1sxXSwga2JkYnl0ZXNbMl0sIGtiZGJ5dGVzWzNdKTsKKwkJaGFuZGxlX21vdXNlX2V2ZW50KGtiZGJ5dGVzWzFdKTsKKwkJaGFuZGxlX21vdXNlX2V2ZW50KGtiZGJ5dGVzWzJdKTsKKwkJaGFuZGxlX21vdXNlX2V2ZW50KGtiZGJ5dGVzWzNdKTsKKwl9CisJZWxzZSB7CisJCWlmIChrYmRieXRlc1syXSA9PSAwKSBkb3duID0gMTsKKyNpZiAwCisJCWlmIChkb3duKQorCQkJcHJpbnRrKCJkb3duICVkXG4iLCBrYmRieXRlc1szXSk7CisJCWVsc2UKKwkJCXByaW50aygidXAgJWRcbiIsIGtiZGJ5dGVzWzNdKTsKKyNlbmRpZgorCQloYW5kbGVfa2V5Ym9hcmRfZXZlbnQoa2JkYnl0ZXNbM10sIGRvd24pOworCX0KKwlyZXR1cm4gMDsKK30KKworCitERUZJTkVfU1BJTkxPQ0soa2JkX2NvbnRyb2xsZXJfbG9jayk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBoYW5kbGVfa2JkX2V2ZW50KHZvaWQpOworCisKK2ludCBrYmRfc2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHVuc2lnbmVkIGludCBrZXljb2RlKQoreworCXByaW50aygia2JkX3NldGtleWNvZGUgc2NhbmNvZGUgJXgga2V5Y29kZSAleFxuIiwgc2NhbmNvZGUsIGtleWNvZGUpOworCXJldHVybiAwOworfQorCitpbnQga2JkX2dldGtleWNvZGUodW5zaWduZWQgaW50IHNjYW5jb2RlKQoreworCXJldHVybiBzY2FuY29kZTsKK30KKworCitpbnQga2JkX3RyYW5zbGF0ZSh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlLCB1bnNpZ25lZCBjaGFyICprZXljb2RlLAorCQkgICAgY2hhciByYXdfbW9kZSkKK3sKKwlzdGF0aWMgaW50IHByZXZfc2NhbmNvZGUgPSAwOworCisJaWYgKHNjYW5jb2RlID09IDB4MDAgfHwgc2NhbmNvZGUgPT0gMHhmZikgeworCQlwcmV2X3NjYW5jb2RlID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdG9kbyAqLworCWlmICghcHJldl9zY2FuY29kZSAmJiBzY2FuY29kZSA9PSAxNjApIHsgLyogRm4ga2V5IGRvd24gKi8KKwkJLy9wcmludGsoIkZuIGtleSBkb3duXG4iKTsKKwkJcHJldl9zY2FuY29kZSA9IDE2MDsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgaWYgKHByZXZfc2NhbmNvZGUgJiYgc2NhbmNvZGUgPT0gMTYwKSB7IC8qIEZuIGtleSB1cCAqLworCQkvL3ByaW50aygiRm4ga2V5IHVwXG4iKTsKKwkJcHJldl9zY2FuY29kZSA9IDA7CisJCXJldHVybiAwOworCX0KKworCS8qIHRvZG8gKi8KKwlpZiAocHJldl9zY2FuY29kZSA9PSAxNjApIHsKKwkJaWYgKHNjYW5jb2RlIDw9IE5VTV9GTl9LRVlTKSB7CisJCQkqa2V5Y29kZSA9IGZuX2tleXNbc2NhbmNvZGVdOworCQkJLy9wcmludGsoImZuIGtleWNvZGUgJWRcbiIsICprZXljb2RlKTsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IAorCWVsc2UgaWYgKHNjYW5jb2RlIDw9IDEyNykgeworCQkqa2V5Y29kZSA9IHNjYW5jb2RlOworCX0KKwllbHNlCisJCXJldHVybiAwOworCisKKyAJcmV0dXJuIDE7Cit9CisKK2NoYXIga2JkX3VuZXhwZWN0ZWRfdXAodW5zaWduZWQgY2hhciBrZXljb2RlKQoreworCS8vcHJpbnRrKCJrYmRfdW5leHBlY3RlZF91cFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtiZF9leGlzdHMgPSAxOworCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2tleWJvYXJkX2V2ZW50KHVuc2lnbmVkIGNoYXIgc2NhbmNvZGUsIGludCBkb3duKQoreworCWtiZF9leGlzdHMgPSAxOworCWhhbmRsZV9zY2FuY29kZShzY2FuY29kZSwgZG93bik7CisJdGFza2xldF9zY2hlZHVsZSgma2V5Ym9hcmRfdGFza2xldCk7Cit9CQorCisKK3ZvaWQga2JkX2xlZHModW5zaWduZWQgY2hhciBsZWRzKQoreworfQorCisvKiBkdW1teSAqLwordm9pZCBrYmRfaW5pdF9odyh2b2lkKQoreworfQorCisKKworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9tb3VzZV9ldmVudCh1bnNpZ25lZCBjaGFyIHNjYW5jb2RlKQoreworCWlmKHNjYW5jb2RlID09IEFVWF9SRUNPTk5FQ1QpeworCQlxdWV1ZS0+aGVhZCA9IHF1ZXVlLT50YWlsID0gMDsgIC8qIEZsdXNoIGlucHV0IHF1ZXVlICovCisJLy8JX19hdXhfd3JpdGVfYWNrKEFVWF9FTkFCTEVfREVWKTsgIC8qIHBpbmcgdGhlIG1vdXNlIDopICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoYXV4X2NvdW50KSB7CisJCWludCBoZWFkID0gcXVldWUtPmhlYWQ7CisKKwkJcXVldWUtPmJ1ZltoZWFkXSA9IHNjYW5jb2RlOworCQloZWFkID0gKGhlYWQgKyAxKSAmIChBVVhfQlVGX1NJWkUtMSk7CisJCWlmIChoZWFkICE9IHF1ZXVlLT50YWlsKSB7CisJCQlxdWV1ZS0+aGVhZCA9IGhlYWQ7CisJCQlraWxsX2Zhc3luYygmcXVldWUtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxdWV1ZS0+cHJvY19saXN0KTsKKwkJfQorCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2Zyb21fcXVldWUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmtiZF9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSBxdWV1ZS0+YnVmW3F1ZXVlLT50YWlsXTsKKwlxdWV1ZS0+dGFpbCA9IChxdWV1ZS0+dGFpbCArIDEpICYgKEFVWF9CVUZfU0laRS0xKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrYmRfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBxdWV1ZV9lbXB0eSh2b2lkKQoreworCXJldHVybiBxdWV1ZS0+aGVhZCA9PSBxdWV1ZS0+dGFpbDsKK30KKworc3RhdGljIGludCBmYXN5bmNfYXV4KGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKK3sKKwlpbnQgcmV0dmFsOworCisJLy9wcmludGsoImZhc3luY19hdXhcbiIpOworCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmcXVldWUtPmZhc3luYyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFJhbmRvbSBtYWdpYyBjb29raWUgZm9yIHRoZSBhdXggZGV2aWNlCisgKi8KKyNkZWZpbmUgQVVYX0RFViAoKHZvaWQgKilxdWV1ZSkKKworc3RhdGljIGludCByZWxlYXNlX2F1eChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCWZhc3luY19hdXgoLTEsIGZpbGUsIDApOworCWF1eF9jb3VudC0tOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZW5fYXV4KHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJaWYgKGF1eF9jb3VudCsrKSB7CisJCXJldHVybiAwOworCX0KKwlxdWV1ZS0+aGVhZCA9IHF1ZXVlLT50YWlsID0gMDsJCS8qIEZsdXNoIGlucHV0IHF1ZXVlICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQdXQgYnl0ZXMgZnJvbSBpbnB1dCBxdWV1ZSB0byBidWZmZXIuCisgKi8KKworc3RhdGljIHNzaXplX3QgcmVhZF9hdXgoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyICogYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCBpID0gY291bnQ7CisJdW5zaWduZWQgY2hhciBjOworCisJaWYgKHF1ZXVlX2VtcHR5KCkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWFkZF93YWl0X3F1ZXVlKCZxdWV1ZS0+cHJvY19saXN0LCAmd2FpdCk7CityZXBlYXQ6CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChxdWV1ZV9lbXB0eSgpICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJc2NoZWR1bGUoKTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcXVldWUtPnByb2NfbGlzdCwgJndhaXQpOworCX0KKwl3aGlsZSAoaSA+IDAgJiYgIXF1ZXVlX2VtcHR5KCkpIHsKKwkJYyA9IGdldF9mcm9tX3F1ZXVlKCk7CisJCXB1dF91c2VyKGMsIGJ1ZmZlcisrKTsKKwkJaS0tOworCX0KKwlpZiAoY291bnQtaSkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCWlub2RlLT5pX2F0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIGNvdW50LWk7CisJfQorCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlIHRvIHRoZSBhdXggZGV2aWNlLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2F1eChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBidWZmZXIsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJLyoKKwkgKiBUaGUgSVRFIGJvYXJkcyB0aGlzIHdhcyB0ZXN0ZWQgb24gZGlkIG5vdCBoYXZlIHRoZQorCSAqIHRyYW5zbWl0IHdpcmVzIGNvbm5lY3RlZC4KKwkgKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXV4X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmcXVldWUtPnByb2NfbGlzdCwgd2FpdCk7CisJaWYgKCFxdWV1ZV9lbXB0eSgpKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwc2F1eF9mb3BzID0geworCS5yZWFkCQk9IHJlYWRfYXV4LAorCS53cml0ZQkJPSB3cml0ZV9hdXgsCisJLnBvbGwJCT0gYXV4X3BvbGwsCisJLm9wZW4JCT0gb3Blbl9hdXgsCisJLnJlbGVhc2UJPSByZWxlYXNlX2F1eCwKKwkuZmFzeW5jCQk9IGZhc3luY19hdXgsCit9OworCisvKgorICogSW5pdGlhbGl6ZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBwc2F1eF9tb3VzZSA9IHsKKwlQU01PVVNFX01JTk9SLCAicHNhdXgiLCAmcHNhdXhfZm9wcworfTsKKworc3RhdGljIGludCBfX2luaXQgcHNhdXhfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBtaXNjX3JlZ2lzdGVyKCZwc2F1eF9tb3VzZSk7CisJaWYocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXF1ZXVlID0gKHN0cnVjdCBhdXhfcXVldWUgKikga21hbGxvYyhzaXplb2YoKnF1ZXVlKSwgR0ZQX0tFUk5FTCk7CisJbWVtc2V0KHF1ZXVlLCAwLCBzaXplb2YoKnF1ZXVlKSk7CisJcXVldWUtPmhlYWQgPSBxdWV1ZS0+dGFpbCA9IDA7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUtPnByb2NfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGluaXRfcXRyb25peF85OTBQX2tiZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9xdHJvbml4bWFwLmNfc2hpcHBlZCBiL2RyaXZlcnMvY2hhci9xdHJvbml4bWFwLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJiOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3F0cm9uaXhtYXAuY19zaGlwcGVkCkBAIC0wLDAgKzEsMjY1IEBACisKKy8qIERvIG5vdCBlZGl0IHRoaXMgZmlsZSEgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5ICAgKi8KKy8qICAgIGxvYWRrZXlzIC0tbWt0YWJsZSBkZWZrZXltYXAubWFwID4gZGVma2V5bWFwLmMgICAgICAgICAgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCit1X3Nob3J0IHBsYWluX21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjA2MCwJMHhmMDMxLAkweGYwMzIsCTB4ZjAzMywJMHhmMDM0LAkweGYwMzUsCTB4ZjAzNiwKKwkweGYwMzcsCTB4ZjAzOCwJMHhmMDM5LAkweGYwMzAsCTB4ZjAyZCwJMHhmMDNkLAkweGYyMDAsCTB4ZjA3ZiwKKwkweGYwMDksCTB4ZmI3MSwJMHhmYjc3LAkweGZiNjUsCTB4ZmI3MiwJMHhmYjc0LAkweGZiNzksCTB4ZmI3NSwKKwkweGZiNjksCTB4ZmI2ZiwJMHhmYjcwLAkweGYwNWIsCTB4ZjA1ZCwJMHhmMDVjLAkweGYyMDcsCTB4ZmI2MSwKKwkweGZiNzMsCTB4ZmI2NCwJMHhmYjY2LAkweGZiNjcsCTB4ZmI2OCwJMHhmYjZhLAkweGZiNmIsCTB4ZmI2YywKKwkweGYwM2IsCTB4ZjAyNywJMHhmMDYwLAkweGYyMDEsCTB4ZjcwMCwJMHhmMjAwLAkweGZiN2EsCTB4ZmI3OCwKKwkweGZiNjMsCTB4ZmI3NiwJMHhmYjYyLAkweGZiNmUsCTB4ZmI2ZCwJMHhmMDJjLAkweGYwMmUsCTB4ZjAyZiwKKwkweGYyMDAsCTB4ZjcwMCwJMHhmNzAyLAkweGYyMDAsCTB4ZjcwMywJMHhmMDIwLAkweGY3MDMsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTUsCTB4ZjA3ZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMSwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDMsCTB4ZjYwMCwJMHhmMTE4LAkweGYxMTksCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjYwMiwJMHhmMjA4LAkweGYwMmQsCTB4ZjAyYiwJMHhmMzBjLAkweGYwMmUsCTB4ZjMwZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTcsCTB4ZjYwMCwJMHhmMjAwLAkweGYwMWIsCTB4ZjIwMCwKKwkweGYxMDAsCTB4ZjEwMSwJMHhmMTAyLAkweGYxMDMsCTB4ZjEwNCwJMHhmMTA1LAkweGYxMDYsCTB4ZjEwNywKKwkweGYxMDgsCTB4ZjEwOSwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMWQsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgc2hpZnRfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMDdlLAkweGYwMjEsCTB4ZjA0MCwJMHhmMDIzLAkweGYwMjQsCTB4ZjAyNSwJMHhmMDVlLAorCTB4ZjAyNiwJMHhmMDJhLAkweGYwMjgsCTB4ZjAyOSwJMHhmMDVmLAkweGYwMmIsCTB4ZjIwMCwJMHhmMDdmLAorCTB4ZjAwOSwJMHhmYjUxLAkweGZiNTcsCTB4ZmI0NSwJMHhmYjUyLAkweGZiNTQsCTB4ZmI1OSwJMHhmYjU1LAorCTB4ZmI0OSwJMHhmYjRmLAkweGZiNTAsCTB4ZjA3YiwJMHhmMDdkLAkweGYwN2MsCTB4ZjIwNywJMHhmYjQxLAorCTB4ZmI1MywJMHhmYjQ0LAkweGZiNDYsCTB4ZmI0NywJMHhmYjQ4LAkweGZiNGEsCTB4ZmI0YiwJMHhmYjRjLAorCTB4ZjAzYSwJMHhmMDIyLAkweGYwN2UsCTB4ZjIwMSwJMHhmNzAwLAkweGYyMDAsCTB4ZmI1YSwJMHhmYjU4LAorCTB4ZmI0MywJMHhmYjU2LAkweGZiNDIsCTB4ZmI0ZSwJMHhmYjRkLAkweGYwM2MsCTB4ZjAzZSwJMHhmMDNmLAorCTB4ZjIwMCwJMHhmNzAwLAkweGY3MDIsCTB4ZjIwMCwJMHhmNzAzLAkweGYwMjAsCTB4ZjcwMywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNSwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAxLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMywJMHhmNjAwLAkweGYyMGIsCTB4ZjIwYSwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNjAyLAkweGYyMTMsCTB4ZjAyZCwJMHhmMDJiLAkweGYzMGMsCTB4ZjAyZSwJMHhmMzBkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNywJMHhmNjAwLAkweGYyMDAsCTB4ZjAxYiwJMHhmMjAwLAorCTB4ZjEwYSwJMHhmMTBiLAkweGYxMGMsCTB4ZjEwZCwJMHhmMTBlLAkweGYxMGYsCTB4ZjExMCwJMHhmMTExLAorCTB4ZjExMiwJMHhmMTEzLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExZCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBhbHRncl9tYXBbTlJfS0VZU10gPSB7CisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDQwLAkweGYyMDAsCTB4ZjAyNCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMDdiLAkweGYwNWIsCTB4ZjA1ZCwJMHhmMDdkLAkweGYwNWMsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGZiNzEsCTB4ZmI3NywJMHhmYjY1LAkweGZiNzIsCTB4ZmI3NCwJMHhmYjc5LAkweGZiNzUsCisJMHhmYjY5LAkweGZiNmYsCTB4ZmI3MCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjA3LAkweGZiNjEsCisJMHhmYjczLAkweGZiNjQsCTB4ZmI2NiwJMHhmYjY3LAkweGZiNjgsCTB4ZmI2YSwJMHhmYjZiLAkweGZiNmMsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAxLAkweGY3MDAsCTB4ZjIwMCwJMHhmYjdhLAkweGZiNzgsCisJMHhmYjYzLAkweGZiNzYsCTB4ZmI2MiwJMHhmYjZlLAkweGZiNmQsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGY3MDAsCTB4ZjcwMiwJMHhmMjAwLAkweGY3MDMsCTB4ZjIwMCwJMHhmNzAzLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE1LAkweGYwN2YsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDEsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAzLAkweGY2MDAsCTB4ZjExOCwJMHhmMTE5LAkweGYyMDAsCisJMHhmMjAwLAkweGY2MDIsCTB4ZjIwOCwJMHhmMDJkLAkweGYwMmIsCTB4ZjMwYywJMHhmMDJlLAkweGYzMGQsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTE3LAkweGY2MDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCisJMHhmNTBjLAkweGY1MGQsCTB4ZjUwZSwJMHhmNTBmLAkweGY1MTAsCTB4ZjUxMSwJMHhmNTEyLAkweGY1MTMsCisJMHhmNTE0LAkweGY1MTUsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMTFkLAkweGYyMDAsCit9OworCit1X3Nob3J0IGN0cmxfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjAwMCwJMHhmMDFiLAkweGYwMWMsCTB4ZjAxZCwJMHhmMDFlLAorCTB4ZjAxZiwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDFmLAkweGYyMDAsCTB4ZjIwMCwJMHhmMDA4LAorCTB4ZjIwMCwJMHhmMDExLAkweGYwMTcsCTB4ZjAwNSwJMHhmMDEyLAkweGYwMTQsCTB4ZjAxOSwJMHhmMDE1LAorCTB4ZjAwOSwJMHhmMDBmLAkweGYwMTAsCTB4ZjAxYiwJMHhmMDFkLAkweGYwMWMsCTB4ZjIwNywJMHhmMDAxLAorCTB4ZjAxMywJMHhmMDA0LAkweGYwMDYsCTB4ZjAwNywJMHhmMDA4LAkweGYwMGEsCTB4ZjAwYiwJMHhmMDBjLAorCTB4ZjAwNywJMHhmMDAwLAkweGYyMDAsCTB4ZjIwMSwJMHhmNzAwLAkweGYyMDAsCTB4ZjAxYSwJMHhmMDE4LAorCTB4ZjAwMywJMHhmMDE2LAkweGYwMDIsCTB4ZjAwZSwJMHhmMjBlLAkweGYwN2YsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNzAwLAkweGY3MDIsCTB4ZjIwMCwJMHhmNzAzLAkweGYwMDAsCTB4ZjcwMywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNSwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAxLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMywJMHhmNjAwLAkweGYxMTgsCTB4ZjExOSwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNjAyLAkweGYyMDgsCTB4ZjAyZCwJMHhmMDJiLAkweGYzMGMsCTB4ZjAyZSwJMHhmMzBkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNywJMHhmNjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjEwMCwJMHhmMTAxLAkweGYxMDIsCTB4ZjEwMywJMHhmMTA0LAkweGYxMDUsCTB4ZjEwNiwJMHhmMTA3LAorCTB4ZjEwOCwJMHhmMTA5LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExZCwJMHhmMjAwLAorfTsKKwordV9zaG9ydCBzaGlmdF9jdHJsX21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYwMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjAxZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjAxMSwJMHhmMDE3LAkweGYwMDUsCTB4ZjAxMiwJMHhmMDE0LAkweGYwMTksCTB4ZjAxNSwKKwkweGYwMDksCTB4ZjAwZiwJMHhmMDEwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDcsCTB4ZjAwMSwKKwkweGYwMTMsCTB4ZjAwNCwJMHhmMDA2LAkweGYwMDcsCTB4ZjAwOCwJMHhmMDBhLAkweGYwMGIsCTB4ZjAwYywKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDEsCTB4ZjcwMCwJMHhmMjAwLAkweGYwMWEsCTB4ZjAxOCwKKwkweGYwMDMsCTB4ZjAxNiwJMHhmMDAyLAkweGYwMGUsCTB4ZjAwZCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjcwMCwJMHhmNzAyLAkweGYyMDAsCTB4ZjcwMywJMHhmMjAwLAkweGY3MDMsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTUsCTB4ZjA3ZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMSwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDMsCTB4ZjYwMCwJMHhmMTE4LAkweGYxMTksCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjYwMiwJMHhmMjA4LAkweGYwMmQsCTB4ZjAyYiwJMHhmMzBjLAkweGYwMmUsCTB4ZjMwZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTcsCTB4ZjYwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMWQsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgYWx0X21hcFtOUl9LRVlTXSA9IHsKKwkweGYyMDAsCTB4ZjgxYiwJMHhmODMxLAkweGY4MzIsCTB4ZjgzMywJMHhmODM0LAkweGY4MzUsCTB4ZjgzNiwKKwkweGY4MzcsCTB4ZjgzOCwJMHhmODM5LAkweGY4MzAsCTB4ZjgyZCwJMHhmODNkLAkweGYyMDAsCTB4Zjg3ZiwKKwkweGY4MDksCTB4Zjg3MSwJMHhmODc3LAkweGY4NjUsCTB4Zjg3MiwJMHhmODc0LAkweGY4NzksCTB4Zjg3NSwKKwkweGY4NjksCTB4Zjg2ZiwJMHhmODcwLAkweGY4NWIsCTB4Zjg1ZCwJMHhmODVjLAkweGYyMDcsCTB4Zjg2MSwKKwkweGY4NzMsCTB4Zjg2NCwJMHhmODY2LAkweGY4NjcsCTB4Zjg2OCwJMHhmODZhLAkweGY4NmIsCTB4ZjgzYiwKKwkweGY4MjcsCTB4Zjg2MCwJMHhmMjAwLAkweGY4MGQsCTB4ZjcwMCwJMHhmMjAwLAkweGY4N2EsCTB4Zjg3OCwKKwkweGY4NjMsCTB4Zjg3NiwJMHhmODYyLAkweGY4MmMsCTB4ZjgyZSwJMHhmODJmLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjcwMCwJMHhmNzAyLAkweGYyMDAsCTB4ZjcwMywJMHhmODIwLAkweGY3MDMsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTUsCTB4ZjA3ZiwJMHhmMjAwLAkweGYyMDAsCTB4ZjIxMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGY2MDMsCTB4ZjYwMCwJMHhmMTE4LAkweGYxMTksCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIxMSwJMHhmMjA4LAkweGYwMmQsCTB4ZjAyYiwJMHhmMzBjLAkweGYwMmUsCTB4ZjMwZCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMTcsCTB4ZjYwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwKKwkweGY1MDAsCTB4ZjUwMSwJMHhmNTAyLAkweGY1MDMsCTB4ZjUwNCwJMHhmNTA1LAkweGY1MDYsCTB4ZjUwNywKKwkweGY1MDgsCTB4ZjUwOSwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYxMWQsCTB4ZjIwMCwKK307CisKK3Vfc2hvcnQgY3RybF9hbHRfbWFwW05SX0tFWVNdID0geworCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmODExLAkweGY4MTcsCTB4ZjgwNSwJMHhmODEyLAkweGY4MTQsCTB4ZjgxOSwJMHhmODE1LAorCTB4ZjgwOSwJMHhmODBmLAkweGY4MTAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwNywJMHhmODAxLAorCTB4ZjgxMywJMHhmODA0LAkweGY4MDYsCTB4ZjgwNywJMHhmODA4LAkweGY4MGEsCTB4ZjgwYiwJMHhmODBjLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMSwJMHhmNzAwLAkweGYyMDAsCTB4ZjgxYSwJMHhmODE4LAorCTB4ZjgwMywJMHhmODE2LAkweGY4MDIsCTB4ZjgwZSwJMHhmODBkLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNzAwLAkweGY3MDIsCTB4ZjIwMCwJMHhmNzAzLAkweGYyMDAsCTB4ZjcwMywJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNSwJMHhmMDdmLAkweGYyMDAsCTB4ZjIwMCwJMHhmNjAxLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjYwMywJMHhmNjAwLAkweGYxMTgsCTB4ZjExOSwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmNjAyLAkweGYyMDgsCTB4ZjAyZCwJMHhmMDJiLAkweGYzMGMsCTB4ZjAyZSwJMHhmMzBkLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExNywJMHhmNjAwLAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAorCTB4ZjUwMCwJMHhmNTAxLAkweGY1MDIsCTB4ZjUwMywJMHhmNTA0LAkweGY1MDUsCTB4ZjUwNiwJMHhmNTA3LAorCTB4ZjUwOCwJMHhmNTA5LAkweGYyMDAsCTB4ZjIwMCwJMHhmMjAwLAkweGYyMDAsCTB4ZjExZCwJMHhmMjAwLAorfTsKKwordXNob3J0ICprZXlfbWFwc1tNQVhfTlJfS0VZTUFQU10gPSB7CisJcGxhaW5fbWFwLCBzaGlmdF9tYXAsIGFsdGdyX21hcCwgMCwKKwljdHJsX21hcCwgc2hpZnRfY3RybF9tYXAsIDAsIDAsCisJYWx0X21hcCwgMCwgMCwgMCwKKwljdHJsX2FsdF9tYXAsCTAKK307CisKK3Vuc2lnbmVkIGludCBrZXltYXBfY291bnQgPSA3OworCisKKy8qCisgKiBQaGlsb3NvcGh5OiBtb3N0IHBlb3BsZSBkbyBub3QgZGVmaW5lIG1vcmUgc3RyaW5ncywgYnV0IHRoZXkgd2hvIGRvCisgKiBvZnRlbiB3YW50IHF1aXRlIGEgbG90IG9mIHN0cmluZyBzcGFjZS4gU28sIHdlIHN0YXRpY2FsbHkgYWxsb2NhdGUKKyAqIHRoZSBkZWZhdWx0IGFuZCBhbGxvY2F0ZSBkeW5hbWljYWxseSBpbiBjaHVua3Mgb2YgNTEyIGJ5dGVzLgorICovCisKK2NoYXIgZnVuY19idWZbXSA9IHsKKwknXDAzMycsICdbJywgJ1snLCAnQScsIDAsIAorCSdcMDMzJywgJ1snLCAnWycsICdCJywgMCwgCisJJ1wwMzMnLCAnWycsICdbJywgJ0MnLCAwLCAKKwknXDAzMycsICdbJywgJ1snLCAnRCcsIDAsIAorCSdcMDMzJywgJ1snLCAnWycsICdFJywgMCwgCisJJ1wwMzMnLCAnWycsICcxJywgJzcnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMScsICc4JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzEnLCAnOScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzAnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICcxJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnMycsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzQnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICc1JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnNicsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcyJywgJzgnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMicsICc5JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzMnLCAnMScsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICczJywgJzInLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMycsICczJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzMnLCAnNCcsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICcxJywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzInLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnMycsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICc0JywgJ34nLCAwLCAKKwknXDAzMycsICdbJywgJzUnLCAnficsIDAsIAorCSdcMDMzJywgJ1snLCAnNicsICd+JywgMCwgCisJJ1wwMzMnLCAnWycsICdNJywgMCwgCisJJ1wwMzMnLCAnWycsICdQJywgMCwgCit9OworCisKK2NoYXIgKmZ1bmNidWZwdHIgPSBmdW5jX2J1ZjsKK2ludCBmdW5jYnVmc2l6ZSA9IHNpemVvZihmdW5jX2J1Zik7CitpbnQgZnVuY2J1ZmxlZnQgPSAwOyAgICAgICAgICAvKiBzcGFjZSBsZWZ0ICovCisKK2NoYXIgKmZ1bmNfdGFibGVbTUFYX05SX0ZVTkNdID0geworCWZ1bmNfYnVmICsgMCwKKwlmdW5jX2J1ZiArIDUsCisJZnVuY19idWYgKyAxMCwKKwlmdW5jX2J1ZiArIDE1LAorCWZ1bmNfYnVmICsgMjAsCisJZnVuY19idWYgKyAyNSwKKwlmdW5jX2J1ZiArIDMxLAorCWZ1bmNfYnVmICsgMzcsCisJZnVuY19idWYgKyA0MywKKwlmdW5jX2J1ZiArIDQ5LAorCWZ1bmNfYnVmICsgNTUsCisJZnVuY19idWYgKyA2MSwKKwlmdW5jX2J1ZiArIDY3LAorCWZ1bmNfYnVmICsgNzMsCisJZnVuY19idWYgKyA3OSwKKwlmdW5jX2J1ZiArIDg1LAorCWZ1bmNfYnVmICsgOTEsCisJZnVuY19idWYgKyA5NywKKwlmdW5jX2J1ZiArIDEwMywKKwlmdW5jX2J1ZiArIDEwOSwKKwlmdW5jX2J1ZiArIDExNSwKKwlmdW5jX2J1ZiArIDEyMCwKKwlmdW5jX2J1ZiArIDEyNSwKKwlmdW5jX2J1ZiArIDEzMCwKKwlmdW5jX2J1ZiArIDEzNSwKKwlmdW5jX2J1ZiArIDE0MCwKKwlmdW5jX2J1ZiArIDE0NSwKKwkwLAorCTAsCisJZnVuY19idWYgKyAxNDksCisJMCwKK307CisKK3N0cnVjdCBrYmRpYWNyIGFjY2VudF90YWJsZVtNQVhfRElBQ1JdID0geworCXsnYCcsICdBJywgJ8AnfSwJeydgJywgJ2EnLCAn4Cd9LAorCXsnXCcnLCAnQScsICfBJ30sCXsnXCcnLCAnYScsICfhJ30sCisJeydeJywgJ0EnLCAnwid9LAl7J14nLCAnYScsICfiJ30sCisJeyd+JywgJ0EnLCAnwyd9LAl7J34nLCAnYScsICfjJ30sCisJeyciJywgJ0EnLCAnxCd9LAl7JyInLCAnYScsICfkJ30sCisJeydPJywgJ0EnLCAnxSd9LAl7J28nLCAnYScsICflJ30sCisJeycwJywgJ0EnLCAnxSd9LAl7JzAnLCAnYScsICflJ30sCisJeydBJywgJ0EnLCAnxSd9LAl7J2EnLCAnYScsICflJ30sCisJeydBJywgJ0UnLCAnxid9LAl7J2EnLCAnZScsICfmJ30sCisJeycsJywgJ0MnLCAnxyd9LAl7JywnLCAnYycsICfnJ30sCisJeydgJywgJ0UnLCAnyCd9LAl7J2AnLCAnZScsICfoJ30sCisJeydcJycsICdFJywgJ8knfSwJeydcJycsICdlJywgJ+knfSwKKwl7J14nLCAnRScsICfKJ30sCXsnXicsICdlJywgJ+onfSwKKwl7JyInLCAnRScsICfLJ30sCXsnIicsICdlJywgJ+snfSwKKwl7J2AnLCAnSScsICfMJ30sCXsnYCcsICdpJywgJ+wnfSwKKwl7J1wnJywgJ0knLCAnzSd9LAl7J1wnJywgJ2knLCAn7Sd9LAorCXsnXicsICdJJywgJ84nfSwJeydeJywgJ2knLCAn7id9LAorCXsnIicsICdJJywgJ88nfSwJeyciJywgJ2knLCAn7yd9LAorCXsnLScsICdEJywgJ9AnfSwJeyctJywgJ2QnLCAn8Cd9LAorCXsnficsICdOJywgJ9EnfSwJeyd+JywgJ24nLCAn8Sd9LAorCXsnYCcsICdPJywgJ9InfSwJeydgJywgJ28nLCAn8id9LAorCXsnXCcnLCAnTycsICfTJ30sCXsnXCcnLCAnbycsICfzJ30sCisJeydeJywgJ08nLCAn1Cd9LAl7J14nLCAnbycsICf0J30sCisJeyd+JywgJ08nLCAn1Sd9LAl7J34nLCAnbycsICf1J30sCisJeyciJywgJ08nLCAn1id9LAl7JyInLCAnbycsICf2J30sCisJeycvJywgJ08nLCAn2Cd9LAl7Jy8nLCAnbycsICf4J30sCisJeydgJywgJ1UnLCAn2Sd9LAl7J2AnLCAndScsICf5J30sCisJeydcJycsICdVJywgJ9onfSwJeydcJycsICd1JywgJ/onfSwKKwl7J14nLCAnVScsICfbJ30sCXsnXicsICd1JywgJ/snfSwKKwl7JyInLCAnVScsICfcJ30sCXsnIicsICd1JywgJ/wnfSwKKwl7J1wnJywgJ1knLCAn3Sd9LAl7J1wnJywgJ3knLCAn/Sd9LAorCXsnVCcsICdIJywgJ94nfSwJeyd0JywgJ2gnLCAn/id9LAorCXsncycsICdzJywgJ98nfSwJeyciJywgJ3knLCAn/yd9LAorCXsncycsICd6JywgJ98nfSwJeydpJywgJ2onLCAn/yd9LAorfTsKKwordW5zaWduZWQgaW50IGFjY2VudF90YWJsZV9zaXplID0gNjg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcXRyb25peG1hcC5tYXAgYi9kcml2ZXJzL2NoYXIvcXRyb25peG1hcC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxZmY1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9xdHJvbml4bWFwLm1hcApAQCAtMCwwICsxLDI4NyBAQAorIyBEZWZhdWx0IGtlcm5lbCBrZXltYXAuIFRoaXMgdXNlcyA3IG1vZGlmaWVyIGNvbWJpbmF0aW9ucy4KK2tleW1hcHMgMC0yLDQtNSw4LDEyCisjIENoYW5nZSB0aGUgYWJvdmUgbGluZSBpbnRvCisjCWtleW1hcHMgMC0yLDQtNiw4LDEyCisjIGluIGNhc2UgeW91IHdhbnQgdGhlIGVudHJpZXMKKyMJYWx0Z3IgICBjb250cm9sIGtleWNvZGUgIDgzID0gQm9vdCAgICAgICAgICAgIAorIwlhbHRnciAgIGNvbnRyb2wga2V5Y29kZSAxMTEgPSBCb290ICAgICAgICAgICAgCisjIGJlbG93LgorIworIyBJbiBmYWN0IEFsdEdyIGlzIHVzZWQgdmVyeSBsaXR0bGUsIGFuZCBvbmUgbW9yZSBrZXltYXAgY2FuCisjIGJlIHNhdmVkIGJ5IG1hcHBpbmcgQWx0R3IgdG8gQWx0IChhbmQgYWRhcHRpbmcgYSBmZXcgZW50cmllcyk6CisjIGtleWNvZGUgMTAwID0gQWx0CisjCitrZXljb2RlICAgMSA9IGdyYXZlICAgICAgICBhc2NpaXRpbGRlCisJYWx0ICAgICBrZXljb2RlICAgMSA9IE1ldGFfRXNjYXBlICAgICAKK2tleWNvZGUgICAyID0gb25lICAgICAgICAgICAgICBleGNsYW0gICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgMiA9IE1ldGFfb25lICAgICAgICAKK2tleWNvZGUgICAzID0gdHdvICAgICAgICAgICAgICBhdCAgICAgICAgICAgICAgIGF0ICAgICAgICAgICAgICAKKwljb250cm9sCWtleWNvZGUgICAzID0gbnVsICAgICAgICAgICAgIAorCXNoaWZ0CWNvbnRyb2wJa2V5Y29kZSAgIDMgPSBudWwgICAgICAgICAgICAgCisJYWx0CWtleWNvZGUgICAzID0gTWV0YV90d28gICAgICAgIAora2V5Y29kZSAgIDQgPSB0aHJlZSAgICAgICAgICAgIG51bWJlcnNpZ24gICAgICAKKwljb250cm9sIGtleWNvZGUgICA0ID0gRXNjYXBlICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgIDQgPSBNZXRhX3RocmVlICAgICAgCitrZXljb2RlICAgNSA9IGZvdXIgICAgICAgICAgICAgZG9sbGFyICAgICAgICAgICBkb2xsYXIgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAgNSA9IENvbnRyb2xfYmFja3NsYXNoCisJYWx0ICAgICBrZXljb2RlICAgNSA9IE1ldGFfZm91ciAgICAgICAKK2tleWNvZGUgICA2ID0gZml2ZSAgICAgICAgICAgICBwZXJjZW50ICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAgNiA9IENvbnRyb2xfYnJhY2tldHJpZ2h0CisJYWx0ICAgICBrZXljb2RlICAgNiA9IE1ldGFfZml2ZSAgICAgICAKK2tleWNvZGUgICA3ID0gc2l4ICAgICAgICAgICAgICBhc2NpaWNpcmN1bSAgICAgCisJY29udHJvbCBrZXljb2RlICAgNyA9IENvbnRyb2xfYXNjaWljaXJjdW0KKwlhbHQgICAgIGtleWNvZGUgICA3ID0gTWV0YV9zaXggICAgICAgIAora2V5Y29kZSAgIDggPSBzZXZlbiAgICAgICAgICAgIGFtcGVyc2FuZCAgICAgICAgYnJhY2VsZWZ0ICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgIDggPSBDb250cm9sX3VuZGVyc2NvcmUKKwlhbHQgICAgIGtleWNvZGUgICA4ID0gTWV0YV9zZXZlbiAgICAgIAora2V5Y29kZSAgIDkgPSBlaWdodCAgICAgICAgICAgIGFzdGVyaXNrICAgICAgICAgYnJhY2tldGxlZnQgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgIDkgPSBEZWxldGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAgOSA9IE1ldGFfZWlnaHQgICAgICAKK2tleWNvZGUgIDEwID0gbmluZSAgICAgICAgICAgICBwYXJlbmxlZnQgICAgICAgIGJyYWNrZXRyaWdodCAgICAKKwlhbHQgICAgIGtleWNvZGUgIDEwID0gTWV0YV9uaW5lICAgICAgIAora2V5Y29kZSAgMTEgPSB6ZXJvICAgICAgICAgICAgIHBhcmVucmlnaHQgICAgICAgYnJhY2VyaWdodCAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTEgPSBNZXRhX3plcm8gICAgICAgCitrZXljb2RlICAxMiA9IG1pbnVzICAgICAgICAgICAgdW5kZXJzY29yZSAgICAgICBiYWNrc2xhc2ggICAgICAgCisJY29udHJvbAlrZXljb2RlICAxMiA9IENvbnRyb2xfdW5kZXJzY29yZQorCXNoaWZ0CWNvbnRyb2wJa2V5Y29kZSAgMTIgPSBDb250cm9sX3VuZGVyc2NvcmUKKwlhbHQJa2V5Y29kZSAgMTIgPSBNZXRhX21pbnVzICAgICAgCitrZXljb2RlICAxMyA9IGVxdWFsICAgICAgICAgICAgcGx1cyAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTMgPSBNZXRhX2VxdWFsICAgICAgCitrZXljb2RlICAxNSA9IERlbGV0ZSAgICAgICAgICAgRGVsZXRlICAgICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTUgPSBCYWNrU3BhY2UKKwlhbHQgICAgIGtleWNvZGUgIDE1ID0gTWV0YV9EZWxldGUgICAgIAora2V5Y29kZSAgMTYgPSBUYWIgICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDE2ID0gTWV0YV9UYWIgICAgICAgIAora2V5Y29kZSAgMTcgPSBxICAgICAgICAgICAgICAgCitrZXljb2RlICAxOCA9IHcgICAgICAgICAgICAgICAKK2tleWNvZGUgIDE5ID0gZQora2V5Y29kZSAgMjAgPSByICAgICAgICAgICAgICAgCitrZXljb2RlICAyMSA9IHQgICAgICAgICAgICAgICAKK2tleWNvZGUgIDIyID0geSAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjMgPSB1CSAKK2tleWNvZGUgIDI0ID0gaSAgICAgICAgICAgICAgIAora2V5Y29kZSAgMjUgPSBvICAgICAgICAgICAgICAgCitrZXljb2RlICAyNiA9IHAgICAgICAgICAgICAgICAKK2tleWNvZGUgIDI3ID0gYnJhY2tldGxlZnQgICAgICBicmFjZWxlZnQgICAgICAgCisJY29udHJvbCBrZXljb2RlICAyNyA9IEVzY2FwZSAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDI3ID0gTWV0YV9icmFja2V0bGVmdAora2V5Y29kZSAgMjggPSBicmFja2V0cmlnaHQgICAgIGJyYWNlcmlnaHQKKwljb250cm9sIGtleWNvZGUgIDI4ID0gQ29udHJvbF9icmFja2V0cmlnaHQKKwlhbHQgICAgIGtleWNvZGUgIDI4ID0gTWV0YV9icmFja2V0cmlnaHQKK2tleWNvZGUgIDI5ID0gYmFja3NsYXNoICAgICAgICBiYXIgICAgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICAyOSA9IENvbnRyb2xfYmFja3NsYXNoCisJYWx0ICAgICBrZXljb2RlICAyOSA9IE1ldGFfYmFja3NsYXNoICAKK2tleWNvZGUgIDMwID0gQ2Fwc19Mb2NrCitrZXljb2RlICAzMSA9IGEgICAgICAgICAgICAgICAKK2tleWNvZGUgIDMyID0gcwora2V5Y29kZSAgMzMgPSBkCitrZXljb2RlICAzNCA9IGYgICAgICAgICAgICAgICAKK2tleWNvZGUgIDM1ID0gZyAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzYgPSBoICAgICAgICAgICAgICAgCitrZXljb2RlICAzNyA9IGogICAgICAgICAgICAgICAKK2tleWNvZGUgIDM4ID0gayAgICAgICAgICAgICAgIAora2V5Y29kZSAgMzkgPSBsICAgICAgICAgICAgICAgCitrZXljb2RlICA0MCA9IHNlbWljb2xvbiAgICAgICAgY29sb24gICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMzkgPSBNZXRhX3NlbWljb2xvbiAgCitrZXljb2RlICA0MSA9IGFwb3N0cm9waGUgICAgICAgcXVvdGVkYmwgICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNDAgPSBDb250cm9sX2cgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA0MCA9IE1ldGFfYXBvc3Ryb3BoZSAKK2tleWNvZGUgIDQyID0gZ3JhdmUgICAgICAgICAgICBhc2NpaXRpbGRlICAgICAgCisJY29udHJvbCBrZXljb2RlICA0MSA9IG51bCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDQxID0gTWV0YV9ncmF2ZSAgICAgIAora2V5Y29kZSAgNDMgPSBSZXR1cm4gICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA0MyA9IE1ldGFfQ29udHJvbF9tICAKK2tleWNvZGUgIDQ0ID0gU2hpZnQgICAgICAgICAgICAgICAKK2tleWNvZGUgIDQ2ID0gegora2V5Y29kZSAgNDcgPSB4ICAgICAgICAgICAgICAgCitrZXljb2RlICA0OCA9IGMKK2tleWNvZGUgIDQ5ID0gdiAgICAgICAgICAgICAgIAora2V5Y29kZSAgNTAgPSBiICAgICAgICAgICAgICAgCitrZXljb2RlICA1MSA9IG4KK2tleWNvZGUgIDUyID0gbQora2V5Y29kZSAgNTMgPSBjb21tYSAgICAgICAgICAgIGxlc3MgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDUxID0gTWV0YV9jb21tYSAgICAgIAora2V5Y29kZSAgNTQgPSBwZXJpb2QgICAgICAgICAgIGdyZWF0ZXIgICAgICAgICAKKwljb250cm9sIGtleWNvZGUgIDUyID0gQ29tcG9zZSAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgNTIgPSBNZXRhX3BlcmlvZCAgICAgCitrZXljb2RlICA1NSA9IHNsYXNoICAgICAgICAgICAgcXVlc3Rpb24gICAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgNTMgPSBEZWxldGUgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICA1MyA9IE1ldGFfc2xhc2ggICAgICAKK2tleWNvZGUgIDU3ID0gU2hpZnQKK2tleWNvZGUgIDU4ID0gQ29udHJvbAora2V5Y29kZSAgNjAgPSBBbHQKK2tleWNvZGUgIDYxID0gc3BhY2UgICAgICAgICAgICBzcGFjZSAgICAgICAgICAgCisJY29udHJvbCBrZXljb2RlICA2MSA9IG51bCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDYxID0gTWV0YV9zcGFjZSAgICAgIAora2V5Y29kZSAgNjIgPSBBbHQKKwora2V5Y29kZSA3NSA9IEluc2VydCAgICAgICAgICAKK2tleWNvZGUgNzYgPSBEZWxldGUgICAgICAgICAgCisKK2tleWNvZGUgODMgPSBVcCAgICAgICAgICAgICAgCitrZXljb2RlIDg0ID0gRG93biAgICAgICAgICAgICAgCisKK2tleWNvZGUgODUgPSBQcmlvciAgICAgICAgICAgCisJc2hpZnQgICBrZXljb2RlIDg1ID0gU2Nyb2xsX0JhY2t3YXJkIAora2V5Y29kZSA4NiA9IE5leHQgICAgICAgICAgICAKKwlzaGlmdCAgIGtleWNvZGUgODYgPSBTY3JvbGxfRm9yd2FyZCAgCitrZXljb2RlIDg5ID0gUmlnaHQgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSA4OSA9IEluY3JfQ29uc29sZQora2V5Y29kZSA3OSA9IExlZnQgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgNzkgPSBEZWNyX0NvbnNvbGUKKwora2V5Y29kZSAgOTAgPSBOdW1fTG9jaworCXNoaWZ0ICAga2V5Y29kZSAgOTAgPSBCYXJlX051bV9Mb2NrCisKK2tleWNvZGUgOTEgPSBtaW51cwora2V5Y29kZSA5MiA9IHBsdXMKK2tleWNvZGUgOTMgPSBLUF9NdWx0aXBseQora2V5Y29kZSA5NCA9IHBlcmlvZAora2V5Y29kZSA5NSA9IEtQX0RpdmlkZQorCitrZXljb2RlIDEwNyA9IFNlbGVjdCAgICAgICAgICAKK2tleWNvZGUgMTA4ID0gRG93biAgICAgICAgICAgIAorCitrZXljb2RlIDExMCA9IEVzY2FwZSAgICAgICAgICAgRXNjYXBlICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgIDEgPSBNZXRhX0VzY2FwZSAgICAgCisKK2tleWNvZGUgIDExMiA9IEYxICAgICAgICAgICAgICBGMTEgICAgICAgICAgICAgIENvbnNvbGVfMTMgICAgICAKKwljb250cm9sIGtleWNvZGUgIDExMiA9IEYxICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDExMiA9IENvbnNvbGVfMSAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTEyID0gQ29uc29sZV8xICAgICAgIAora2V5Y29kZSAgMTEzID0gRjIgICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICAgQ29uc29sZV8xNCAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTEzID0gRjIgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTEzID0gQ29uc29sZV8yICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMTMgPSBDb25zb2xlXzIgICAgICAgCitrZXljb2RlICAxMTQgPSBGMyAgICAgICAgICAgICAgRjEzICAgICAgICAgICAgICBDb25zb2xlXzE1ICAgICAgCisJY29udHJvbCBrZXljb2RlICAxMTQgPSBGMyAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMTQgPSBDb25zb2xlXzMgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDExNCA9IENvbnNvbGVfMyAgICAgICAKK2tleWNvZGUgIDExNSA9IEY0ICAgICAgICAgICAgICBGMTQgICAgICAgICAgICAgIENvbnNvbGVfMTYgICAgICAKKwljb250cm9sIGtleWNvZGUgIDExNSA9IEY0ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDExNSA9IENvbnNvbGVfNCAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTE1ID0gQ29uc29sZV80ICAgICAgIAora2V5Y29kZSAgMTE2ID0gRjUgICAgICAgICAgICAgIEYxNSAgICAgICAgICAgICAgQ29uc29sZV8xNyAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTE2ID0gRjUgICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTE2ID0gQ29uc29sZV81ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMTYgPSBDb25zb2xlXzUgICAgICAgCitrZXljb2RlICAxMTcgPSBGNiAgICAgICAgICAgICAgRjE2ICAgICAgICAgICAgICBDb25zb2xlXzE4ICAgICAgCisJY29udHJvbCBrZXljb2RlICAxMTcgPSBGNiAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMTcgPSBDb25zb2xlXzYgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDExNyA9IENvbnNvbGVfNiAgICAgICAKK2tleWNvZGUgIDExOCA9IEY3ICAgICAgICAgICAgICBGMTcgICAgICAgICAgICAgIENvbnNvbGVfMTkgICAgICAKKwljb250cm9sIGtleWNvZGUgIDExOCA9IEY3ICAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDExOCA9IENvbnNvbGVfNyAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTE4ID0gQ29uc29sZV83ICAgICAgIAora2V5Y29kZSAgMTE5ID0gRjggICAgICAgICAgICAgIEYxOCAgICAgICAgICAgICAgQ29uc29sZV8yMCAgICAgIAorCWNvbnRyb2wga2V5Y29kZSAgMTE5ID0gRjggICAgICAgICAgICAgIAorCWFsdCAgICAga2V5Y29kZSAgMTE5ID0gQ29uc29sZV84ICAgICAgIAorCWNvbnRyb2wgYWx0ICAgICBrZXljb2RlICAxMTkgPSBDb25zb2xlXzggICAgICAgCitrZXljb2RlICAxMjAgPSBGOSAgICAgICAgICAgICAgRjE5ICAgICAgICAgICAgICBDb25zb2xlXzIxICAgICAgCisJY29udHJvbCBrZXljb2RlICAxMjAgPSBGOSAgICAgICAgICAgICAgCisJYWx0ICAgICBrZXljb2RlICAxMjAgPSBDb25zb2xlXzkgICAgICAgCisJY29udHJvbCBhbHQgICAgIGtleWNvZGUgIDEyMCA9IENvbnNvbGVfOSAgICAgICAKK2tleWNvZGUgIDEyMSA9IEYxMCAgICAgICAgICAgICBGMjAgICAgICAgICAgICAgIENvbnNvbGVfMjIgICAgICAKKwljb250cm9sIGtleWNvZGUgIDEyMSA9IEYxMCAgICAgICAgICAgICAKKwlhbHQgICAgIGtleWNvZGUgIDEyMSA9IENvbnNvbGVfMTAgICAgICAKKwljb250cm9sIGFsdCAgICAga2V5Y29kZSAgMTIxID0gQ29uc29sZV8xMCAgICAgIAorCQora2V5Y29kZSAxMjYgPSBQYXVzZSAgICAgICAgICAgCisKKworc3RyaW5nIEYxID0gIlwwMzNbW0EiCitzdHJpbmcgRjIgPSAiXDAzM1tbQiIKK3N0cmluZyBGMyA9ICJcMDMzW1tDIgorc3RyaW5nIEY0ID0gIlwwMzNbW0QiCitzdHJpbmcgRjUgPSAiXDAzM1tbRSIKK3N0cmluZyBGNiA9ICJcMDMzWzE3fiIKK3N0cmluZyBGNyA9ICJcMDMzWzE4fiIKK3N0cmluZyBGOCA9ICJcMDMzWzE5fiIKK3N0cmluZyBGOSA9ICJcMDMzWzIwfiIKK3N0cmluZyBGMTAgPSAiXDAzM1syMX4iCitzdHJpbmcgRjExID0gIlwwMzNbMjN+Igorc3RyaW5nIEYxMiA9ICJcMDMzWzI0fiIKK3N0cmluZyBGMTMgPSAiXDAzM1syNX4iCitzdHJpbmcgRjE0ID0gIlwwMzNbMjZ+Igorc3RyaW5nIEYxNSA9ICJcMDMzWzI4fiIKK3N0cmluZyBGMTYgPSAiXDAzM1syOX4iCitzdHJpbmcgRjE3ID0gIlwwMzNbMzF+Igorc3RyaW5nIEYxOCA9ICJcMDMzWzMyfiIKK3N0cmluZyBGMTkgPSAiXDAzM1szM34iCitzdHJpbmcgRjIwID0gIlwwMzNbMzR+Igorc3RyaW5nIEZpbmQgPSAiXDAzM1sxfiIKK3N0cmluZyBJbnNlcnQgPSAiXDAzM1syfiIKK3N0cmluZyBSZW1vdmUgPSAiXDAzM1szfiIKK3N0cmluZyBTZWxlY3QgPSAiXDAzM1s0fiIKK3N0cmluZyBQcmlvciA9ICJcMDMzWzV+Igorc3RyaW5nIE5leHQgPSAiXDAzM1s2fiIKK3N0cmluZyBNYWNybyA9ICJcMDMzW00iCitzdHJpbmcgUGF1c2UgPSAiXDAzM1tQIgorY29tcG9zZSAnYCcgJ0EnIHRvICfAJworY29tcG9zZSAnYCcgJ2EnIHRvICfgJworY29tcG9zZSAnXCcnICdBJyB0byAnwScKK2NvbXBvc2UgJ1wnJyAnYScgdG8gJ+EnCitjb21wb3NlICdeJyAnQScgdG8gJ8InCitjb21wb3NlICdeJyAnYScgdG8gJ+InCitjb21wb3NlICd+JyAnQScgdG8gJ8MnCitjb21wb3NlICd+JyAnYScgdG8gJ+MnCitjb21wb3NlICciJyAnQScgdG8gJ8QnCitjb21wb3NlICciJyAnYScgdG8gJ+QnCitjb21wb3NlICdPJyAnQScgdG8gJ8UnCitjb21wb3NlICdvJyAnYScgdG8gJ+UnCitjb21wb3NlICcwJyAnQScgdG8gJ8UnCitjb21wb3NlICcwJyAnYScgdG8gJ+UnCitjb21wb3NlICdBJyAnQScgdG8gJ8UnCitjb21wb3NlICdhJyAnYScgdG8gJ+UnCitjb21wb3NlICdBJyAnRScgdG8gJ8YnCitjb21wb3NlICdhJyAnZScgdG8gJ+YnCitjb21wb3NlICcsJyAnQycgdG8gJ8cnCitjb21wb3NlICcsJyAnYycgdG8gJ+cnCitjb21wb3NlICdgJyAnRScgdG8gJ8gnCitjb21wb3NlICdgJyAnZScgdG8gJ+gnCitjb21wb3NlICdcJycgJ0UnIHRvICfJJworY29tcG9zZSAnXCcnICdlJyB0byAn6ScKK2NvbXBvc2UgJ14nICdFJyB0byAnyicKK2NvbXBvc2UgJ14nICdlJyB0byAn6icKK2NvbXBvc2UgJyInICdFJyB0byAnyycKK2NvbXBvc2UgJyInICdlJyB0byAn6ycKK2NvbXBvc2UgJ2AnICdJJyB0byAnzCcKK2NvbXBvc2UgJ2AnICdpJyB0byAn7CcKK2NvbXBvc2UgJ1wnJyAnSScgdG8gJ80nCitjb21wb3NlICdcJycgJ2knIHRvICftJworY29tcG9zZSAnXicgJ0knIHRvICfOJworY29tcG9zZSAnXicgJ2knIHRvICfuJworY29tcG9zZSAnIicgJ0knIHRvICfPJworY29tcG9zZSAnIicgJ2knIHRvICfvJworY29tcG9zZSAnLScgJ0QnIHRvICfQJworY29tcG9zZSAnLScgJ2QnIHRvICfwJworY29tcG9zZSAnficgJ04nIHRvICfRJworY29tcG9zZSAnficgJ24nIHRvICfxJworY29tcG9zZSAnYCcgJ08nIHRvICfSJworY29tcG9zZSAnYCcgJ28nIHRvICfyJworY29tcG9zZSAnXCcnICdPJyB0byAn0ycKK2NvbXBvc2UgJ1wnJyAnbycgdG8gJ/MnCitjb21wb3NlICdeJyAnTycgdG8gJ9QnCitjb21wb3NlICdeJyAnbycgdG8gJ/QnCitjb21wb3NlICd+JyAnTycgdG8gJ9UnCitjb21wb3NlICd+JyAnbycgdG8gJ/UnCitjb21wb3NlICciJyAnTycgdG8gJ9YnCitjb21wb3NlICciJyAnbycgdG8gJ/YnCitjb21wb3NlICcvJyAnTycgdG8gJ9gnCitjb21wb3NlICcvJyAnbycgdG8gJ/gnCitjb21wb3NlICdgJyAnVScgdG8gJ9knCitjb21wb3NlICdgJyAndScgdG8gJ/knCitjb21wb3NlICdcJycgJ1UnIHRvICfaJworY29tcG9zZSAnXCcnICd1JyB0byAn+icKK2NvbXBvc2UgJ14nICdVJyB0byAn2ycKK2NvbXBvc2UgJ14nICd1JyB0byAn+ycKK2NvbXBvc2UgJyInICdVJyB0byAn3CcKK2NvbXBvc2UgJyInICd1JyB0byAn/CcKK2NvbXBvc2UgJ1wnJyAnWScgdG8gJ90nCitjb21wb3NlICdcJycgJ3knIHRvICf9JworY29tcG9zZSAnVCcgJ0gnIHRvICfeJworY29tcG9zZSAndCcgJ2gnIHRvICf+JworY29tcG9zZSAncycgJ3MnIHRvICffJworY29tcG9zZSAnIicgJ3knIHRvICf/JworY29tcG9zZSAncycgJ3onIHRvICffJworY29tcG9zZSAnaScgJ2onIHRvICf/JwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOWI1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKQEAgLTAsMCArMSwxNjI5IEBACisvKgorICogcmFuZG9tLmMgLS0gQSBzdHJvbmcgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAqCisgKiBWZXJzaW9uIDEuODksIGxhc3QgbW9kaWZpZWQgMTktU2VwLTk5CisgKgorICogQ29weXJpZ2h0IFRoZW9kb3JlIFRzJ28sIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkuICBBbGwKKyAqIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHByb2R1Y3QgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlCisgKiByZXF1aXJlZCBJTlNURUFEIE9GIHRoZSBhYm92ZSByZXN0cmljdGlvbnMuICAoVGhpcyBjbGF1c2UgaXMKKyAqIG5lY2Vzc2FyeSBkdWUgdG8gYSBwb3RlbnRpYWwgYmFkIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIEdQTCBhbmQKKyAqIHRoZSByZXN0cmljdGlvbnMgY29udGFpbmVkIGluIGEgQlNELXN0eWxlIGNvcHlyaWdodC4pCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKi8KKworLyoKKyAqIChub3csIHdpdGggbGVnYWwgQi5TLiBvdXQgb2YgdGhlIHdheS4uLi4uKQorICoKKyAqIFRoaXMgcm91dGluZSBnYXRoZXJzIGVudmlyb25tZW50YWwgbm9pc2UgZnJvbSBkZXZpY2UgZHJpdmVycywgZXRjLiwKKyAqIGFuZCByZXR1cm5zIGdvb2QgcmFuZG9tIG51bWJlcnMsIHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaGljIHVzZS4KKyAqIEJlc2lkZXMgdGhlIG9idmlvdXMgY3J5cHRvZ3JhcGhpYyB1c2VzLCB0aGVzZSBudW1iZXJzIGFyZSBhbHNvIGdvb2QKKyAqIGZvciBzZWVkaW5nIFRDUCBzZXF1ZW5jZSBudW1iZXJzLCBhbmQgb3RoZXIgcGxhY2VzIHdoZXJlIGl0IGlzCisgKiBkZXNpcmFibGUgdG8gaGF2ZSBudW1iZXJzIHdoaWNoIGFyZSBub3Qgb25seSByYW5kb20sIGJ1dCBoYXJkIHRvCisgKiBwcmVkaWN0IGJ5IGFuIGF0dGFja2VyLgorICoKKyAqIFRoZW9yeSBvZiBvcGVyYXRpb24KKyAqID09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBDb21wdXRlcnMgYXJlIHZlcnkgcHJlZGljdGFibGUgZGV2aWNlcy4gIEhlbmNlIGl0IGlzIGV4dHJlbWVseSBoYXJkCisgKiB0byBwcm9kdWNlIHRydWx5IHJhbmRvbSBudW1iZXJzIG9uIGEgY29tcHV0ZXIgLS0tIGFzIG9wcG9zZWQgdG8KKyAqIHBzZXVkby1yYW5kb20gbnVtYmVycywgd2hpY2ggY2FuIGVhc2lseSBnZW5lcmF0ZWQgYnkgdXNpbmcgYQorICogYWxnb3JpdGhtLiAgVW5mb3J0dW5hdGVseSwgaXQgaXMgdmVyeSBlYXN5IGZvciBhdHRhY2tlcnMgdG8gZ3Vlc3MKKyAqIHRoZSBzZXF1ZW5jZSBvZiBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzLCBhbmQgZm9yIHNvbWUKKyAqIGFwcGxpY2F0aW9ucyB0aGlzIGlzIG5vdCBhY2NlcHRhYmxlLiAgU28gaW5zdGVhZCwgd2UgbXVzdCB0cnkgdG8KKyAqIGdhdGhlciAiZW52aXJvbm1lbnRhbCBub2lzZSIgZnJvbSB0aGUgY29tcHV0ZXIncyBlbnZpcm9ubWVudCwgd2hpY2gKKyAqIG11c3QgYmUgaGFyZCBmb3Igb3V0c2lkZSBhdHRhY2tlcnMgdG8gb2JzZXJ2ZSwgYW5kIHVzZSB0aGF0IHRvCisgKiBnZW5lcmF0ZSByYW5kb20gbnVtYmVycy4gIEluIGEgVW5peCBlbnZpcm9ubWVudCwgdGhpcyBpcyBiZXN0IGRvbmUKKyAqIGZyb20gaW5zaWRlIHRoZSBrZXJuZWwuCisgKgorICogU291cmNlcyBvZiByYW5kb21uZXNzIGZyb20gdGhlIGVudmlyb25tZW50IGluY2x1ZGUgaW50ZXIta2V5Ym9hcmQKKyAqIHRpbWluZ3MsIGludGVyLWludGVycnVwdCB0aW1pbmdzIGZyb20gc29tZSBpbnRlcnJ1cHRzLCBhbmQgb3RoZXIKKyAqIGV2ZW50cyB3aGljaCBhcmUgYm90aCAoYSkgbm9uLWRldGVybWluaXN0aWMgYW5kIChiKSBoYXJkIGZvciBhbgorICogb3V0c2lkZSBvYnNlcnZlciB0byBtZWFzdXJlLiAgUmFuZG9tbmVzcyBmcm9tIHRoZXNlIHNvdXJjZXMgYXJlCisgKiBhZGRlZCB0byBhbiAiZW50cm9weSBwb29sIiwgd2hpY2ggaXMgbWl4ZWQgdXNpbmcgYSBDUkMtbGlrZSBmdW5jdGlvbi4KKyAqIFRoaXMgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZywgYnV0IGl0IGlzIGFkZXF1YXRlIGFzc3VtaW5nCisgKiB0aGUgcmFuZG9tbmVzcyBpcyBub3QgY2hvc2VuIG1hbGljaW91c2x5LCBhbmQgaXQgaXMgZmFzdCBlbm91Z2ggdGhhdAorICogdGhlIG92ZXJoZWFkIG9mIGRvaW5nIGl0IG9uIGV2ZXJ5IGludGVycnVwdCBpcyB2ZXJ5IHJlYXNvbmFibGUuCisgKiBBcyByYW5kb20gYnl0ZXMgYXJlIG1peGVkIGludG8gdGhlIGVudHJvcHkgcG9vbCwgdGhlIHJvdXRpbmVzIGtlZXAKKyAqIGFuICplc3RpbWF0ZSogb2YgaG93IG1hbnkgYml0cyBvZiByYW5kb21uZXNzIGhhdmUgYmVlbiBzdG9yZWQgaW50bworICogdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yJ3MgaW50ZXJuYWwgc3RhdGUuCisgKgorICogV2hlbiByYW5kb20gYnl0ZXMgYXJlIGRlc2lyZWQsIHRoZXkgYXJlIG9idGFpbmVkIGJ5IHRha2luZyB0aGUgU0hBCisgKiBoYXNoIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgImVudHJvcHkgcG9vbCIuICBUaGUgU0hBIGhhc2ggYXZvaWRzCisgKiBleHBvc2luZyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGVudHJvcHkgcG9vbC4gIEl0IGlzIGJlbGlldmVkIHRvCisgKiBiZSBjb21wdXRhdGlvbmFsbHkgaW5mZWFzaWJsZSB0byBkZXJpdmUgYW55IHVzZWZ1bCBpbmZvcm1hdGlvbgorICogYWJvdXQgdGhlIGlucHV0IG9mIFNIQSBmcm9tIGl0cyBvdXRwdXQuICBFdmVuIGlmIGl0IGlzIHBvc3NpYmxlIHRvCisgKiBhbmFseXplIFNIQSBpbiBzb21lIGNsZXZlciB3YXksIGFzIGxvbmcgYXMgdGhlIGFtb3VudCBvZiBkYXRhCisgKiByZXR1cm5lZCBmcm9tIHRoZSBnZW5lcmF0b3IgaXMgbGVzcyB0aGFuIHRoZSBpbmhlcmVudCBlbnRyb3B5IGluCisgKiB0aGUgcG9vbCwgdGhlIG91dHB1dCBkYXRhIGlzIHRvdGFsbHkgdW5wcmVkaWN0YWJsZS4gIEZvciB0aGlzCisgKiByZWFzb24sIHRoZSByb3V0aW5lIGRlY3JlYXNlcyBpdHMgaW50ZXJuYWwgZXN0aW1hdGUgb2YgaG93IG1hbnkKKyAqIGJpdHMgb2YgInRydWUgcmFuZG9tbmVzcyIgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZW50cm9weSBwb29sIGFzIGl0CisgKiBvdXRwdXRzIHJhbmRvbSBudW1iZXJzLgorICoKKyAqIElmIHRoaXMgZXN0aW1hdGUgZ29lcyB0byB6ZXJvLCB0aGUgcm91dGluZSBjYW4gc3RpbGwgZ2VuZXJhdGUKKyAqIHJhbmRvbSBudW1iZXJzOyBob3dldmVyLCBhbiBhdHRhY2tlciBtYXkgKGF0IGxlYXN0IGluIHRoZW9yeSkgYmUKKyAqIGFibGUgdG8gaW5mZXIgdGhlIGZ1dHVyZSBvdXRwdXQgb2YgdGhlIGdlbmVyYXRvciBmcm9tIHByaW9yCisgKiBvdXRwdXRzLiAgVGhpcyByZXF1aXJlcyBzdWNjZXNzZnVsIGNyeXB0YW5hbHlzaXMgb2YgU0hBLCB3aGljaCBpcworICogbm90IGJlbGlldmVkIHRvIGJlIGZlYXNpYmxlLCBidXQgdGhlcmUgaXMgYSByZW1vdGUgcG9zc2liaWxpdHkuCisgKiBOb25ldGhlbGVzcywgdGhlc2UgbnVtYmVycyBzaG91bGQgYmUgdXNlZnVsIGZvciB0aGUgdmFzdCBtYWpvcml0eQorICogb2YgcHVycG9zZXMuCisgKgorICogRXhwb3J0ZWQgaW50ZXJmYWNlcyAtLS0tIG91dHB1dAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBleHBvcnRlZCBpbnRlcmZhY2VzOyB0aGUgZmlyc3QgaXMgb25lIGRlc2lnbmVkIHRvCisgKiBiZSB1c2VkIGZyb20gd2l0aGluIHRoZSBrZXJuZWw6CisgKgorICogCXZvaWQgZ2V0X3JhbmRvbV9ieXRlcyh2b2lkICpidWYsIGludCBuYnl0ZXMpOworICoKKyAqIFRoaXMgaW50ZXJmYWNlIHdpbGwgcmV0dXJuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHJhbmRvbSBieXRlcywKKyAqIGFuZCBwbGFjZSBpdCBpbiB0aGUgcmVxdWVzdGVkIGJ1ZmZlci4KKyAqCisgKiBUaGUgdHdvIG90aGVyIGludGVyZmFjZXMgYXJlIHR3byBjaGFyYWN0ZXIgZGV2aWNlcyAvZGV2L3JhbmRvbSBhbmQKKyAqIC9kZXYvdXJhbmRvbS4gIC9kZXYvcmFuZG9tIGlzIHN1aXRhYmxlIGZvciB1c2Ugd2hlbiB2ZXJ5IGhpZ2gKKyAqIHF1YWxpdHkgcmFuZG9tbmVzcyBpcyBkZXNpcmVkIChmb3IgZXhhbXBsZSwgZm9yIGtleSBnZW5lcmF0aW9uIG9yCisgKiBvbmUtdGltZSBwYWRzKSwgYXMgaXQgd2lsbCBvbmx5IHJldHVybiBhIG1heGltdW0gb2YgdGhlIG51bWJlciBvZgorICogYml0cyBvZiByYW5kb21uZXNzIChhcyBlc3RpbWF0ZWQgYnkgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yKQorICogY29udGFpbmVkIGluIHRoZSBlbnRyb3B5IHBvb2wuCisgKgorICogVGhlIC9kZXYvdXJhbmRvbSBkZXZpY2UgZG9lcyBub3QgaGF2ZSB0aGlzIGxpbWl0LCBhbmQgd2lsbCByZXR1cm4KKyAqIGFzIG1hbnkgYnl0ZXMgYXMgYXJlIHJlcXVlc3RlZC4gIEFzIG1vcmUgYW5kIG1vcmUgcmFuZG9tIGJ5dGVzIGFyZQorICogcmVxdWVzdGVkIHdpdGhvdXQgZ2l2aW5nIHRpbWUgZm9yIHRoZSBlbnRyb3B5IHBvb2wgdG8gcmVjaGFyZ2UsCisgKiB0aGlzIHdpbGwgcmVzdWx0IGluIHJhbmRvbSBudW1iZXJzIHRoYXQgYXJlIG1lcmVseSBjcnlwdG9ncmFwaGljYWxseQorICogc3Ryb25nLiAgRm9yIG1hbnkgYXBwbGljYXRpb25zLCBob3dldmVyLCB0aGlzIGlzIGFjY2VwdGFibGUuCisgKgorICogRXhwb3J0ZWQgaW50ZXJmYWNlcyAtLS0tIGlucHV0CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGUgY3VycmVudCBleHBvcnRlZCBpbnRlcmZhY2VzIGZvciBnYXRoZXJpbmcgZW52aXJvbm1lbnRhbCBub2lzZQorICogZnJvbSB0aGUgZGV2aWNlcyBhcmU6CisgKgorICogCXZvaWQgYWRkX2lucHV0X3JhbmRvbW5lc3ModW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSk7CisgKiAJdm9pZCBhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaW50IGlycSk7CisgKgorICogYWRkX2lucHV0X3JhbmRvbW5lc3MoKSB1c2VzIHRoZSBpbnB1dCBsYXllciBpbnRlcnJ1cHQgdGltaW5nLCBhcyB3ZWxsIGFzCisgKiB0aGUgZXZlbnQgdHlwZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoKSB1c2VzIHRoZSBpbnRlci1pbnRlcnJ1cHQgdGltaW5nIGFzIHJhbmRvbQorICogaW5wdXRzIHRvIHRoZSBlbnRyb3B5IHBvb2wuICBOb3RlIHRoYXQgbm90IGFsbCBpbnRlcnJ1cHRzIGFyZSBnb29kCisgKiBzb3VyY2VzIG9mIHJhbmRvbW5lc3MhICBGb3IgZXhhbXBsZSwgdGhlIHRpbWVyIGludGVycnVwdHMgaXMgbm90IGEKKyAqIGdvb2QgY2hvaWNlLCBiZWNhdXNlIHRoZSBwZXJpb2RpY2l0eSBvZiB0aGUgaW50ZXJydXB0cyBpcyB0b28KKyAqIHJlZ3VsYXIsIGFuZCBoZW5jZSBwcmVkaWN0YWJsZSB0byBhbiBhdHRhY2tlci4gIERpc2sgaW50ZXJydXB0cyBhcmUKKyAqIGEgYmV0dGVyIG1lYXN1cmUsIHNpbmNlIHRoZSB0aW1pbmcgb2YgdGhlIGRpc2sgaW50ZXJydXB0cyBhcmUgbW9yZQorICogdW5wcmVkaWN0YWJsZS4KKyAqCisgKiBBbGwgb2YgdGhlc2Ugcm91dGluZXMgdHJ5IHRvIGVzdGltYXRlIGhvdyBtYW55IGJpdHMgb2YgcmFuZG9tbmVzcyBhCisgKiBwYXJ0aWN1bGFyIHJhbmRvbW5lc3Mgc291cmNlLiAgVGhleSBkbyB0aGlzIGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlCisgKiBmaXJzdCBhbmQgc2Vjb25kIG9yZGVyIGRlbHRhcyBvZiB0aGUgZXZlbnQgdGltaW5ncy4KKyAqCisgKiBFbnN1cmluZyB1bnByZWRpY3RhYmlsaXR5IGF0IHN5c3RlbSBzdGFydHVwCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFdoZW4gYW55IG9wZXJhdGluZyBzeXN0ZW0gc3RhcnRzIHVwLCBpdCB3aWxsIGdvIHRocm91Z2ggYSBzZXF1ZW5jZQorICogb2YgYWN0aW9ucyB0aGF0IGFyZSBmYWlybHkgcHJlZGljdGFibGUgYnkgYW4gYWR2ZXJzYXJ5LCBlc3BlY2lhbGx5CisgKiBpZiB0aGUgc3RhcnQtdXAgZG9lcyBub3QgaW52b2x2ZSBpbnRlcmFjdGlvbiB3aXRoIGEgaHVtYW4gb3BlcmF0b3IuCisgKiBUaGlzIHJlZHVjZXMgdGhlIGFjdHVhbCBudW1iZXIgb2YgYml0cyBvZiB1bnByZWRpY3RhYmlsaXR5IGluIHRoZQorICogZW50cm9weSBwb29sIGJlbG93IHRoZSB2YWx1ZSBpbiBlbnRyb3B5X2NvdW50LiAgSW4gb3JkZXIgdG8KKyAqIGNvdW50ZXJhY3QgdGhpcyBlZmZlY3QsIGl0IGhlbHBzIHRvIGNhcnJ5IGluZm9ybWF0aW9uIGluIHRoZQorICogZW50cm9weSBwb29sIGFjcm9zcyBzaHV0LWRvd25zIGFuZCBzdGFydC11cHMuICBUbyBkbyB0aGlzLCBwdXQgdGhlCisgKiBmb2xsb3dpbmcgbGluZXMgYW4gYXBwcm9wcmlhdGUgc2NyaXB0IHdoaWNoIGlzIHJ1biBkdXJpbmcgdGhlIGJvb3QKKyAqIHNlcXVlbmNlOgorICoKKyAqCWVjaG8gIkluaXRpYWxpemluZyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4uLiIKKyAqCXJhbmRvbV9zZWVkPS92YXIvcnVuL3JhbmRvbS1zZWVkCisgKgkjIENhcnJ5IGEgcmFuZG9tIHNlZWQgZnJvbSBzdGFydC11cCB0byBzdGFydC11cAorICoJIyBMb2FkIGFuZCB0aGVuIHNhdmUgdGhlIHdob2xlIGVudHJvcHkgcG9vbAorICoJaWYgWyAtZiAkcmFuZG9tX3NlZWQgXTsgdGhlbgorICoJCWNhdCAkcmFuZG9tX3NlZWQgPi9kZXYvdXJhbmRvbQorICoJZWxzZQorICoJCXRvdWNoICRyYW5kb21fc2VlZAorICoJZmkKKyAqCWNobW9kIDYwMCAkcmFuZG9tX3NlZWQKKyAqCWRkIGlmPS9kZXYvdXJhbmRvbSBvZj0kcmFuZG9tX3NlZWQgY291bnQ9MSBicz01MTIKKyAqCisgKiBhbmQgdGhlIGZvbGxvd2luZyBsaW5lcyBpbiBhbiBhcHByb3ByaWF0ZSBzY3JpcHQgd2hpY2ggaXMgcnVuIGFzCisgKiB0aGUgc3lzdGVtIGlzIHNodXRkb3duOgorICoKKyAqCSMgQ2FycnkgYSByYW5kb20gc2VlZCBmcm9tIHNodXQtZG93biB0byBzdGFydC11cAorICoJIyBTYXZlIHRoZSB3aG9sZSBlbnRyb3B5IHBvb2wKKyAqCWVjaG8gIlNhdmluZyByYW5kb20gc2VlZC4uLiIKKyAqCXJhbmRvbV9zZWVkPS92YXIvcnVuL3JhbmRvbS1zZWVkCisgKgl0b3VjaCAkcmFuZG9tX3NlZWQKKyAqCWNobW9kIDYwMCAkcmFuZG9tX3NlZWQKKyAqCWRkIGlmPS9kZXYvdXJhbmRvbSBvZj0kcmFuZG9tX3NlZWQgY291bnQ9MSBicz01MTIKKyAqCisgKiBGb3IgZXhhbXBsZSwgb24gbW9zdCBtb2Rlcm4gc3lzdGVtcyB1c2luZyB0aGUgU3lzdGVtIFYgaW5pdAorICogc2NyaXB0cywgc3VjaCBjb2RlIGZyYWdtZW50cyB3b3VsZCBiZSBmb3VuZCBpbgorICogL2V0Yy9yYy5kL2luaXQuZC9yYW5kb20uICBPbiBvbGRlciBMaW51eCBzeXN0ZW1zLCB0aGUgY29ycmVjdCBzY3JpcHQKKyAqIGxvY2F0aW9uIG1pZ2h0IGJlIGluIC9ldGMvcmNiLmQvcmMubG9jYWwgb3IgL2V0Yy9yYy5kL3JjLjAuCisgKgorICogRWZmZWN0aXZlbHksIHRoZXNlIGNvbW1hbmRzIGNhdXNlIHRoZSBjb250ZW50cyBvZiB0aGUgZW50cm9weSBwb29sCisgKiB0byBiZSBzYXZlZCBhdCBzaHV0LWRvd24gdGltZSBhbmQgcmVsb2FkZWQgaW50byB0aGUgZW50cm9weSBwb29sIGF0CisgKiBzdGFydC11cC4gIChUaGUgJ2RkJyBpbiB0aGUgYWRkaXRpb24gdG8gdGhlIGJvb3R1cCBzY3JpcHQgaXMgdG8KKyAqIG1ha2Ugc3VyZSB0aGF0IC9ldGMvcmFuZG9tLXNlZWQgaXMgZGlmZmVyZW50IGZvciBldmVyeSBzdGFydC11cCwKKyAqIGV2ZW4gaWYgdGhlIHN5c3RlbSBjcmFzaGVzIHdpdGhvdXQgZXhlY3V0aW5nIHJjLjAuKSAgRXZlbiB3aXRoCisgKiBjb21wbGV0ZSBrbm93bGVkZ2Ugb2YgdGhlIHN0YXJ0LXVwIGFjdGl2aXRpZXMsIHByZWRpY3RpbmcgdGhlIHN0YXRlCisgKiBvZiB0aGUgZW50cm9weSBwb29sIHJlcXVpcmVzIGtub3dsZWRnZSBvZiB0aGUgcHJldmlvdXMgaGlzdG9yeSBvZgorICogdGhlIHN5c3RlbS4KKyAqCisgKiBDb25maWd1cmluZyB0aGUgL2Rldi9yYW5kb20gZHJpdmVyIHVuZGVyIExpbnV4CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhlIC9kZXYvcmFuZG9tIGRyaXZlciB1bmRlciBMaW51eCB1c2VzIG1pbm9yIG51bWJlcnMgOCBhbmQgOSBvZgorICogdGhlIC9kZXYvbWVtIG1ham9yIG51bWJlciAoIzEpLiAgU28gaWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgaGF2ZQorICogL2Rldi9yYW5kb20gYW5kIC9kZXYvdXJhbmRvbSBjcmVhdGVkIGFscmVhZHksIHRoZXkgY2FuIGJlIGNyZWF0ZWQKKyAqIGJ5IHVzaW5nIHRoZSBjb21tYW5kczoKKyAqCisgKiAJbWtub2QgL2Rldi9yYW5kb20gYyAxIDgKKyAqIAlta25vZCAvZGV2L3VyYW5kb20gYyAxIDkKKyAqCisgKiBBY2tub3dsZWRnZW1lbnRzOgorICogPT09PT09PT09PT09PT09PT0KKyAqCisgKiBJZGVhcyBmb3IgY29uc3RydWN0aW5nIHRoaXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2VyZSBkZXJpdmVkCisgKiBmcm9tIFByZXR0eSBHb29kIFByaXZhY3kncyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciwgYW5kIGZyb20gcHJpdmF0ZQorICogZGlzY3Vzc2lvbnMgd2l0aCBQaGlsIEthcm4uICBDb2xpbiBQbHVtYiBwcm92aWRlZCBhIGZhc3RlciByYW5kb20KKyAqIG51bWJlciBnZW5lcmF0b3IsIHdoaWNoIHNwZWVkIHVwIHRoZSBtaXhpbmcgZnVuY3Rpb24gb2YgdGhlIGVudHJvcHkKKyAqIHBvb2wsIHRha2VuIGZyb20gUEdQZm9uZS4gIERhbGUgV29ybGV5IGhhcyBhbHNvIGNvbnRyaWJ1dGVkIG1hbnkKKyAqIHVzZWZ1bCBpZGVhcyBhbmQgc3VnZ2VzdGlvbnMgdG8gaW1wcm92ZSB0aGlzIGRyaXZlci4KKyAqCisgKiBBbnkgZmxhd3MgaW4gdGhlIGRlc2lnbiBhcmUgc29sZWx5IG15IHJlc3BvbnNpYmlsaXR5LCBhbmQgc2hvdWxkCisgKiBub3QgYmUgYXR0cmlidXRlZCB0byB0aGUgUGhpbCwgQ29saW4sIG9yIGFueSBvZiBhdXRob3JzIG9mIFBHUC4KKyAqCisgKiBGdXJ0aGVyIGJhY2tncm91bmQgaW5mb3JtYXRpb24gb24gdGhpcyB0b3BpYyBtYXkgYmUgb2J0YWluZWQgZnJvbQorICogUkZDIDE3NTAsICJSYW5kb21uZXNzIFJlY29tbWVuZGF0aW9ucyBmb3IgU2VjdXJpdHkiLCBieSBEb25hbGQKKyAqIEVhc3RsYWtlLCBTdGV2ZSBDcm9ja2VyLCBhbmQgSmVmZiBTY2hpbGxlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qCisgKiBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgSU5QVVRfUE9PTF9XT1JEUyAxMjgKKyNkZWZpbmUgT1VUUFVUX1BPT0xfV09SRFMgMzIKKyNkZWZpbmUgU0VDX1hGRVJfU0laRSA1MTIKKworLyoKKyAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIG9mIGVudHJvcHkgYmVmb3JlIHdlIHdha2UgdXAgYSByZWFkIG9uCisgKiAvZGV2L3JhbmRvbS4gIFNob3VsZCBiZSBlbm91Z2ggdG8gZG8gYSBzaWduaWZpY2FudCByZXNlZWQuCisgKi8KK3N0YXRpYyBpbnQgcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCA9IDY0OworCisvKgorICogSWYgdGhlIGVudHJvcHkgY291bnQgZmFsbHMgdW5kZXIgdGhpcyBudW1iZXIgb2YgYml0cywgdGhlbiB3ZQorICogc2hvdWxkIHdha2UgdXAgcHJvY2Vzc2VzIHdoaWNoIGFyZSBzZWxlY3Rpbmcgb3IgcG9sbGluZyBvbiB3cml0ZQorICogYWNjZXNzIHRvIC9kZXYvcmFuZG9tLgorICovCitzdGF0aWMgaW50IHJhbmRvbV93cml0ZV93YWtldXBfdGhyZXNoID0gMTI4OworCisvKgorICogV2hlbiB0aGUgaW5wdXQgcG9vbCBnb2VzIG92ZXIgdHJpY2tsZV90aHJlc2gsIHN0YXJ0IGRyb3BwaW5nIG1vc3QKKyAqIHNhbXBsZXMgdG8gYXZvaWQgd2FzdGluZyBDUFUgdGltZSBhbmQgcmVkdWNlIGxvY2sgY29udGVudGlvbi4KKyAqLworCitzdGF0aWMgaW50IHRyaWNrbGVfdGhyZXNoID0gSU5QVVRfUE9PTF9XT1JEUyAqIDI4OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCB0cmlja2xlX2NvdW50KSA9IDA7CisKKy8qCisgKiBBIHBvb2wgb2Ygc2l6ZSAucG9vbHdvcmRzIGlzIHN0aXJyZWQgd2l0aCBhIHByaW1pdGl2ZSBwb2x5bm9taWFsCisgKiBvZiBkZWdyZWUgLnBvb2x3b3JkcyBvdmVyIEdGKDIpLiAgVGhlIHRhcHMgZm9yIHZhcmlvdXMgc2l6ZXMgYXJlCisgKiBkZWZpbmVkIGJlbG93LiAgVGhleSBhcmUgY2hvc2VuIHRvIGJlIGV2ZW5seSBzcGFjZWQgKG1pbmltdW0gUk1TCisgKiBkaXN0YW5jZSBmcm9tIGV2ZW5seSBzcGFjZWQ7IHRoZSBudW1iZXJzIGluIHRoZSBjb21tZW50cyBhcmUgYQorICogc2NhbGVkIHNxdWFyZWQgZXJyb3Igc3VtKSBleGNlcHQgZm9yIHRoZSBsYXN0IHRhcCwgd2hpY2ggaXMgMSB0bworICogZ2V0IHRoZSB0d2lzdGluZyBoYXBwZW5pbmcgYXMgZmFzdCBhcyBwb3NzaWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBwb29saW5mbyB7CisJaW50IHBvb2x3b3JkczsKKwlpbnQgdGFwMSwgdGFwMiwgdGFwMywgdGFwNCwgdGFwNTsKK30gcG9vbGluZm9fdGFibGVbXSA9IHsKKwkvKiB4XjEyOCArIHheMTAzICsgeF43NiArIHheNTEgK3heMjUgKyB4ICsgMSAtLSAxMDUgKi8KKwl7IDEyOCwJMTAzLAk3NiwJNTEsCTI1LAkxIH0sCisJLyogeF4zMiArIHheMjYgKyB4XjIwICsgeF4xNCArIHheNyArIHggKyAxIC0tIDE1ICovCisJeyAzMiwJMjYsCTIwLAkxNCwJNywJMSB9LAorI2lmIDAKKwkvKiB4XjIwNDggKyB4XjE2MzggKyB4XjEyMzEgKyB4XjgxOSArIHheNDExICsgeCArIDEgIC0tIDExNSAqLworCXsgMjA0OCwJMTYzOCwJMTIzMSwJODE5LAk0MTEsCTEgfSwKKworCS8qIHheMTAyNCArIHheODE3ICsgeF42MTUgKyB4XjQxMiArIHheMjA0ICsgeCArIDEgLS0gMjkwICovCisJeyAxMDI0LAk4MTcsCTYxNSwJNDEyLAkyMDQsCTEgfSwKKworCS8qIHheMTAyNCArIHheODE5ICsgeF42MTYgKyB4XjQxMCArIHheMjA3ICsgeF4yICsgMSAtLSAxMTUgKi8KKwl7IDEwMjQsCTgxOSwJNjE2LAk0MTAsCTIwNywJMiB9LAorCisJLyogeF41MTIgKyB4XjQxMSArIHheMzA4ICsgeF4yMDggKyB4XjEwNCArIHggKyAxIC0tIDIyNSAqLworCXsgNTEyLAk0MTEsCTMwOCwJMjA4LAkxMDQsCTEgfSwKKworCS8qIHheNTEyICsgeF40MDkgKyB4XjMwNyArIHheMjA2ICsgeF4xMDIgKyB4XjIgKyAxIC0tIDk1ICovCisJeyA1MTIsCTQwOSwJMzA3LAkyMDYsCTEwMiwJMiB9LAorCS8qIHheNTEyICsgeF40MDkgKyB4XjMwOSArIHheMjA1ICsgeF4xMDMgKyB4XjIgKyAxIC0tIDk1ICovCisJeyA1MTIsCTQwOSwJMzA5LAkyMDUsCTEwMywJMiB9LAorCisJLyogeF4yNTYgKyB4XjIwNSArIHheMTU1ICsgeF4xMDEgKyB4XjUyICsgeCArIDEgLS0gMTI1ICovCisJeyAyNTYsCTIwNSwJMTU1LAkxMDEsCTUyLAkxIH0sCisKKwkvKiB4XjEyOCArIHheMTAzICsgeF43OCArIHheNTEgKyB4XjI3ICsgeF4yICsgMSAtLSA3MCAqLworCXsgMTI4LAkxMDMsCTc4LAk1MSwJMjcsCTIgfSwKKworCS8qIHheNjQgKyB4XjUyICsgeF4zOSArIHheMjYgKyB4XjE0ICsgeCArIDEgLS0gMTUgKi8KKwl7IDY0LAk1MiwJMzksCTI2LAkxNCwJMSB9LAorI2VuZGlmCit9OworCisjZGVmaW5lIFBPT0xCSVRTCXBvb2x3b3JkcyozMgorI2RlZmluZSBQT09MQllURVMJcG9vbHdvcmRzKjQKKworLyoKKyAqIEZvciB0aGUgcHVycG9zZXMgb2YgYmV0dGVyIG1peGluZywgd2UgdXNlIHRoZSBDUkMtMzIgcG9seW5vbWlhbCBhcworICogd2VsbCB0byBtYWtlIGEgdHdpc3RlZCBHZW5lcmFsaXplZCBGZWVkYmFjayBTaGlmdCBSZWlnc3RlcgorICoKKyAqIChTZWUgTS4gTWF0c3Vtb3RvICYgWS4gS3VyaXRhLCAxOTkyLiAgVHdpc3RlZCBHRlNSIGdlbmVyYXRvcnMuICBBQ00KKyAqIFRyYW5zYWN0aW9ucyBvbiBNb2RlbGluZyBhbmQgQ29tcHV0ZXIgU2ltdWxhdGlvbiAyKDMpOjE3OS0xOTQuCisgKiBBbHNvIHNlZSBNLiBNYXRzdW1vdG8gJiBZLiBLdXJpdGEsIDE5OTQuICBUd2lzdGVkIEdGU1IgZ2VuZXJhdG9ycworICogSUkuICBBQ00gVHJhbnNhY3Rpb25zIG9uIE1kZWxpbmcgYW5kIENvbXB1dGVyIFNpbXVsYXRpb24gNDoyNTQtMjY2KQorICoKKyAqIFRoYW5rcyB0byBDb2xpbiBQbHVtYiBmb3Igc3VnZ2VzdGluZyB0aGlzLgorICoKKyAqIFdlIGhhdmUgbm90IGFuYWx5emVkIHRoZSByZXN1bHRhbnQgcG9seW5vbWlhbCB0byBwcm92ZSBpdCBwcmltaXRpdmU7CisgKiBpbiBmYWN0IGl0IGFsbW9zdCBjZXJ0YWlubHkgaXNuJ3QuICBOb25ldGhlbGVzcywgdGhlIGlycmVkdWNpYmxlIGZhY3RvcnMKKyAqIG9mIGEgcmFuZG9tIGxhcmdlLWRlZ3JlZSBwb2x5bm9taWFsIG92ZXIgR0YoMikgYXJlIG1vcmUgdGhhbiBsYXJnZSBlbm91Z2gKKyAqIHRoYXQgcGVyaW9kaWNpdHkgaXMgbm90IGEgY29uY2Vybi4KKyAqCisgKiBUaGUgaW5wdXQgaGFzaCBpcyBtdWNoIGxlc3Mgc2Vuc2l0aXZlIHRoYW4gdGhlIG91dHB1dCBoYXNoLiAgQWxsCisgKiB0aGF0IHdlIHdhbnQgb2YgaXQgaXMgdGhhdCBpdCBiZSBhIGdvb2Qgbm9uLWNyeXB0b2dyYXBoaWMgaGFzaDsKKyAqIGkuZS4gaXQgbm90IHByb2R1Y2UgY29sbGlzaW9ucyB3aGVuIGZlZCAicmFuZG9tIiBkYXRhIG9mIHRoZSBzb3J0CisgKiB3ZSBleHBlY3QgdG8gc2VlLiAgQXMgbG9uZyBhcyB0aGUgcG9vbCBzdGF0ZSBkaWZmZXJzIGZvciBkaWZmZXJlbnQKKyAqIGlucHV0cywgd2UgaGF2ZSBwcmVzZXJ2ZWQgdGhlIGlucHV0IGVudHJvcHkgYW5kIGRvbmUgYSBnb29kIGpvYi4KKyAqIFRoZSBmYWN0IHRoYXQgYW4gaW50ZWxsaWdlbnQgYXR0YWNrZXIgY2FuIGNvbnN0cnVjdCBpbnB1dHMgdGhhdAorICogd2lsbCBwcm9kdWNlIGNvbnRyb2xsZWQgYWx0ZXJhdGlvbnMgdG8gdGhlIHBvb2wncyBzdGF0ZSBpcyBub3QKKyAqIGltcG9ydGFudCBiZWNhdXNlIHdlIGRvbid0IGNvbnNpZGVyIHN1Y2ggaW5wdXRzIHRvIGNvbnRyaWJ1dGUgYW55CisgKiByYW5kb21uZXNzLiAgVGhlIG9ubHkgcHJvcGVydHkgd2UgbmVlZCB3aXRoIHJlc3BlY3QgdG8gdGhlbSBpcyB0aGF0CisgKiB0aGUgYXR0YWNrZXIgY2FuJ3QgaW5jcmVhc2UgaGlzL2hlciBrbm93bGVkZ2Ugb2YgdGhlIHBvb2wncyBzdGF0ZS4KKyAqIFNpbmNlIGFsbCBhZGRpdGlvbnMgYXJlIHJldmVyc2libGUgKGtub3dpbmcgdGhlIGZpbmFsIHN0YXRlIGFuZCB0aGUKKyAqIGlucHV0LCB5b3UgY2FuIHJlY29uc3RydWN0IHRoZSBpbml0aWFsIHN0YXRlKSwgaWYgYW4gYXR0YWNrZXIgaGFzCisgKiBhbnkgdW5jZXJ0YWludHkgYWJvdXQgdGhlIGluaXRpYWwgc3RhdGUsIGhlL3NoZSBjYW4gb25seSBzaHVmZmxlCisgKiB0aGF0IHVuY2VydGFpbnR5IGFib3V0LCBidXQgbmV2ZXIgY2F1c2UgYW55IGNvbGxpc2lvbnMgKHdoaWNoIHdvdWxkCisgKiBkZWNyZWFzZSB0aGUgdW5jZXJ0YWludHkpLgorICoKKyAqIFRoZSBjaG9zZW4gc3lzdGVtIGxldHMgdGhlIHN0YXRlIG9mIHRoZSBwb29sIGJlIChlc3NlbnRpYWxseSkgdGhlIGlucHV0CisgKiBtb2R1bG8gdGhlIGdlbmVyYXRvciBwb2x5bW5vbWlhbC4gIE5vdywgZm9yIHJhbmRvbSBwcmltaXRpdmUgcG9seW5vbWlhbHMsCisgKiB0aGlzIGlzIGEgdW5pdmVyc2FsIGNsYXNzIG9mIGhhc2ggZnVuY3Rpb25zLCBtZWFuaW5nIHRoYXQgdGhlIGNoYW5jZQorICogb2YgYSBjb2xsaXNpb24gaXMgbGltaXRlZCBieSB0aGUgYXR0YWNrZXIncyBrbm93bGVkZ2Ugb2YgdGhlIGdlbmVyYXRvcgorICogcG9seW5vbWFpbCwgc28gaWYgaXQgaXMgY2hvc2VuIGF0IHJhbmRvbSwgYW4gYXR0YWNrZXIgY2FuIG5ldmVyIGZvcmNlCisgKiBhIGNvbGxpc2lvbi4gIEhlcmUsIHdlIHVzZSBhIGZpeGVkIHBvbHlub21pYWwsIGJ1dCB3ZSAqY2FuKiBhc3N1bWUgdGhhdAorICogIyMjLS0+IGl0IGlzIHVua25vd24gdG8gdGhlIHByb2Nlc3NlcyBnZW5lcmF0aW5nIHRoZSBpbnB1dCBlbnRyb3B5LiA8LSMjIworICogQmVjYXVzZSBvZiB0aGlzIGltcG9ydGFudCBwcm9wZXJ0eSwgdGhpcyBpcyBhIGdvb2QsIGNvbGxpc2lvbi1yZXNpc3RhbnQKKyAqIGhhc2g7IGhhc2ggY29sbGlzaW9ucyB3aWxsIG9jY3VyIG5vIG1vcmUgb2Z0ZW4gdGhhbiBjaGFuY2UuCisgKi8KKworLyoKKyAqIFN0YXRpYyBnbG9iYWwgdmFyaWFibGVzCisgKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyYW5kb21fcmVhZF93YWl0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyYW5kb21fd3JpdGVfd2FpdCk7CisKKyNpZiAwCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgMDY0NCk7CisjZGVmaW5lIERFQlVHX0VOVChmbXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIFwKKwlwcmludGsoS0VSTl9ERUJVRyAicmFuZG9tICUwNGQgJTA0ZCAlMDRkOiAiIFwKKwlmbXQsXAorCWlucHV0X3Bvb2wuZW50cm9weV9jb3VudCxcCisJYmxvY2tpbmdfcG9vbC5lbnRyb3B5X2NvdW50LFwKKwlub25ibG9ja2luZ19wb29sLmVudHJvcHlfY291bnQsXAorCSMjIGFyZyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBERUJVR19FTlQoZm10LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogT1MgaW5kZXBlbmRlbnQgZW50cm9weSBzdG9yZS4gICBIZXJlIGFyZSB0aGUgZnVuY3Rpb25zIHdoaWNoIGhhbmRsZQorICogc3RvcmluZyBlbnRyb3B5IGluIGFuIGVudHJvcHkgcG9vbC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGVudHJvcHlfc3RvcmU7CitzdHJ1Y3QgZW50cm9weV9zdG9yZSB7CisJLyogbW9zdGx5LXJlYWQgZGF0YTogKi8KKwlzdHJ1Y3QgcG9vbGluZm8gKnBvb2xpbmZvOworCV9fdTMyICpwb29sOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGxpbWl0OworCXN0cnVjdCBlbnRyb3B5X3N0b3JlICpwdWxsOworCisJLyogcmVhZC13cml0ZSBkYXRhOiAqLworCXNwaW5sb2NrX3QgbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCXVuc2lnbmVkIGFkZF9wdHI7CisJaW50IGVudHJvcHlfY291bnQ7CisJaW50IGlucHV0X3JvdGF0ZTsKK307CisKK3N0YXRpYyBfX3UzMiBpbnB1dF9wb29sX2RhdGFbSU5QVVRfUE9PTF9XT1JEU107CitzdGF0aWMgX191MzIgYmxvY2tpbmdfcG9vbF9kYXRhW09VVFBVVF9QT09MX1dPUkRTXTsKK3N0YXRpYyBfX3UzMiBub25ibG9ja2luZ19wb29sX2RhdGFbT1VUUFVUX1BPT0xfV09SRFNdOworCitzdGF0aWMgc3RydWN0IGVudHJvcHlfc3RvcmUgaW5wdXRfcG9vbCA9IHsKKwkucG9vbGluZm8gPSAmcG9vbGluZm9fdGFibGVbMF0sCisJLm5hbWUgPSAiaW5wdXQiLAorCS5saW1pdCA9IDEsCisJLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnBvb2wgPSBpbnB1dF9wb29sX2RhdGEKK307CisKK3N0YXRpYyBzdHJ1Y3QgZW50cm9weV9zdG9yZSBibG9ja2luZ19wb29sID0geworCS5wb29saW5mbyA9ICZwb29saW5mb190YWJsZVsxXSwKKwkubmFtZSA9ICJibG9ja2luZyIsCisJLmxpbWl0ID0gMSwKKwkucHVsbCA9ICZpbnB1dF9wb29sLAorCS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5wb29sID0gYmxvY2tpbmdfcG9vbF9kYXRhCit9OworCitzdGF0aWMgc3RydWN0IGVudHJvcHlfc3RvcmUgbm9uYmxvY2tpbmdfcG9vbCA9IHsKKwkucG9vbGluZm8gPSAmcG9vbGluZm9fdGFibGVbMV0sCisJLm5hbWUgPSAibm9uYmxvY2tpbmciLAorCS5wdWxsID0gJmlucHV0X3Bvb2wsCisJLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnBvb2wgPSBub25ibG9ja2luZ19wb29sX2RhdGEKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBieXRlIGludG8gdGhlIGVudHJvcHkgInBvb2wiLiAgSXQgZG9lcyBub3QKKyAqIHVwZGF0ZSB0aGUgZW50cm9weSBlc3RpbWF0ZS4gIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwKKyAqIGNyZWRpdF9lbnRyb3B5X3N0b3JlIGlmIHRoaXMgaXMgYXBwcm9wcmlhdGUuCisgKgorICogVGhlIHBvb2wgaXMgc3RpcnJlZCB3aXRoIGEgcHJpbWl0aXZlIHBvbHlub21pYWwgb2YgdGhlIGFwcHJvcHJpYXRlCisgKiBkZWdyZWUsIGFuZCB0aGVuIHR3aXN0ZWQuICBXZSB0d2lzdCBieSB0aHJlZSBiaXRzIGF0IGEgdGltZSBiZWNhdXNlCisgKiBpdCdzIGNoZWFwIHRvIGRvIHNvIGFuZCBoZWxwcyBzbGlnaHRseSBpbiB0aGUgZXhwZWN0ZWQgY2FzZSB3aGVyZQorICogdGhlIGVudHJvcHkgaXMgY29uY2VudHJhdGVkIGluIHRoZSBsb3ctb3JkZXIgYml0cy4KKyAqLworc3RhdGljIHZvaWQgX19hZGRfZW50cm9weV93b3JkcyhzdHJ1Y3QgZW50cm9weV9zdG9yZSAqciwgY29uc3QgX191MzIgKmluLAorCQkJCWludCBud29yZHMsIF9fdTMyIG91dFsxNl0pCit7CisJc3RhdGljIF9fdTMyIGNvbnN0IHR3aXN0X3RhYmxlWzhdID0geworCQkweDAwMDAwMDAwLCAweDNiNmUyMGM4LCAweDc2ZGM0MTkwLCAweDRkYjI2MTU4LAorCQkweGVkYjg4MzIwLCAweGQ2ZDZhM2U4LCAweDliNjRjMmIwLCAweGEwMGFlMjc4IH07CisJdW5zaWduZWQgbG9uZyBpLCBhZGRfcHRyLCB0YXAxLCB0YXAyLCB0YXAzLCB0YXA0LCB0YXA1OworCWludCBuZXdfcm90YXRlLCBpbnB1dF9yb3RhdGU7CisJaW50IHdvcmRtYXNrID0gci0+cG9vbGluZm8tPnBvb2x3b3JkcyAtIDE7CisJX191MzIgdywgbmV4dF93OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBUYXBzIGFyZSBjb25zdGFudCwgc28gd2UgY2FuIGxvYWQgdGhlbSB3aXRob3V0IGhvbGRpbmcgci0+bG9jay4gICovCisJdGFwMSA9IHItPnBvb2xpbmZvLT50YXAxOworCXRhcDIgPSByLT5wb29saW5mby0+dGFwMjsKKwl0YXAzID0gci0+cG9vbGluZm8tPnRhcDM7CisJdGFwNCA9IHItPnBvb2xpbmZvLT50YXA0OworCXRhcDUgPSByLT5wb29saW5mby0+dGFwNTsKKwluZXh0X3cgPSAqaW4rKzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyLT5sb2NrLCBmbGFncyk7CisJcHJlZmV0Y2hfcmFuZ2Uoci0+cG9vbCwgd29yZG1hc2spOworCWlucHV0X3JvdGF0ZSA9IHItPmlucHV0X3JvdGF0ZTsKKwlhZGRfcHRyID0gci0+YWRkX3B0cjsKKworCXdoaWxlIChud29yZHMtLSkgeworCQl3ID0gcm9sMzIobmV4dF93LCBpbnB1dF9yb3RhdGUpOworCQlpZiAobndvcmRzID4gMCkKKwkJCW5leHRfdyA9ICppbisrOworCQlpID0gYWRkX3B0ciA9IChhZGRfcHRyIC0gMSkgJiB3b3JkbWFzazsKKwkJLyoKKwkJICogTm9ybWFsbHksIHdlIGFkZCA3IGJpdHMgb2Ygcm90YXRpb24gdG8gdGhlIHBvb2wuCisJCSAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBvb2wsIGFkZCBhbiBleHRyYSA3IGJpdHMKKwkJICogcm90YXRpb24sIHNvIHRoYXQgc3VjY2Vzc2l2ZSBwYXNzZXMgc3ByZWFkIHRoZQorCQkgKiBpbnB1dCBiaXRzIGFjcm9zcyB0aGUgcG9vbCBldmVubHkuCisJCSAqLworCQluZXdfcm90YXRlID0gaW5wdXRfcm90YXRlICsgMTQ7CisJCWlmIChpKQorCQkJbmV3X3JvdGF0ZSA9IGlucHV0X3JvdGF0ZSArIDc7CisJCWlucHV0X3JvdGF0ZSA9IG5ld19yb3RhdGUgJiAzMTsKKworCQkvKiBYT1IgaW4gdGhlIHZhcmlvdXMgdGFwcyAqLworCQl3IF49IHItPnBvb2xbKGkgKyB0YXAxKSAmIHdvcmRtYXNrXTsKKwkJdyBePSByLT5wb29sWyhpICsgdGFwMikgJiB3b3JkbWFza107CisJCXcgXj0gci0+cG9vbFsoaSArIHRhcDMpICYgd29yZG1hc2tdOworCQl3IF49IHItPnBvb2xbKGkgKyB0YXA0KSAmIHdvcmRtYXNrXTsKKwkJdyBePSByLT5wb29sWyhpICsgdGFwNSkgJiB3b3JkbWFza107CisJCXcgXj0gci0+cG9vbFtpXTsKKwkJci0+cG9vbFtpXSA9ICh3ID4+IDMpIF4gdHdpc3RfdGFibGVbdyAmIDddOworCX0KKworCXItPmlucHV0X3JvdGF0ZSA9IGlucHV0X3JvdGF0ZTsKKwlyLT5hZGRfcHRyID0gYWRkX3B0cjsKKworCWlmIChvdXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCW91dFtpXSA9IHItPnBvb2xbYWRkX3B0cl07CisJCQlhZGRfcHRyID0gKGFkZF9wdHIgLSAxKSAmIHdvcmRtYXNrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2VudHJvcHlfd29yZHMoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIGNvbnN0IF9fdTMyICppbiwKKwkJCQkgICAgIGludCBud29yZHMpCit7CisJX19hZGRfZW50cm9weV93b3JkcyhyLCBpbiwgbndvcmRzLCBOVUxMKTsKK30KKworLyoKKyAqIENyZWRpdCAob3IgZGViaXQpIHRoZSBlbnRyb3B5IHN0b3JlIHdpdGggbiBiaXRzIG9mIGVudHJvcHkKKyAqLworc3RhdGljIHZvaWQgY3JlZGl0X2VudHJvcHlfc3RvcmUoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIGludCBuYml0cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmxvY2ssIGZsYWdzKTsKKworCWlmIChyLT5lbnRyb3B5X2NvdW50ICsgbmJpdHMgPCAwKSB7CisJCURFQlVHX0VOVCgibmVnYXRpdmUgZW50cm9weS9vdmVyZmxvdyAoJWQrJWQpXG4iLAorCQkJICByLT5lbnRyb3B5X2NvdW50LCBuYml0cyk7CisJCXItPmVudHJvcHlfY291bnQgPSAwOworCX0gZWxzZSBpZiAoci0+ZW50cm9weV9jb3VudCArIG5iaXRzID4gci0+cG9vbGluZm8tPlBPT0xCSVRTKSB7CisJCXItPmVudHJvcHlfY291bnQgPSByLT5wb29saW5mby0+UE9PTEJJVFM7CisJfSBlbHNlIHsKKwkJci0+ZW50cm9weV9jb3VudCArPSBuYml0czsKKwkJaWYgKG5iaXRzKQorCQkJREVCVUdfRU5UKCJhZGRlZCAlZCBlbnRyb3B5IGNyZWRpdHMgdG8gJXNcbiIsCisJCQkJICBuYml0cywgci0+bmFtZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+bG9jaywgZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRW50cm9weSBpbnB1dCBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlcmUgaXMgb25lIG9mIHRoZXNlIHBlciBlbnRyb3B5IHNvdXJjZSAqLworc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgeworCWN5Y2xlc190IGxhc3RfdGltZTsKKwlsb25nIGxhc3RfZGVsdGEsbGFzdF9kZWx0YTI7CisJdW5zaWduZWQgZG9udF9jb3VudF9lbnRyb3B5OjE7Cit9OworCitzdGF0aWMgc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgaW5wdXRfdGltZXJfc3RhdGU7CitzdGF0aWMgc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKmlycV90aW1lcl9zdGF0ZVtOUl9JUlFTXTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBlbnRyb3B5IHRvIHRoZSBlbnRyb3B5ICJwb29sIiBieSB1c2luZyB0aW1pbmcKKyAqIGRlbGF5cy4gIEl0IHVzZXMgdGhlIHRpbWVyX3JhbmRfc3RhdGUgc3RydWN0dXJlIHRvIG1ha2UgYW4gZXN0aW1hdGUKKyAqIG9mIGhvdyBtYW55IGJpdHMgb2YgZW50cm9weSB0aGlzIGNhbGwgaGFzIGFkZGVkIHRvIHRoZSBwb29sLgorICoKKyAqIFRoZSBudW1iZXIgIm51bSIgaXMgYWxzbyBhZGRlZCB0byB0aGUgcG9vbCAtIGl0IHNob3VsZCBzb21laG93IGRlc2NyaWJlCisgKiB0aGUgdHlwZSBvZiBldmVudCB3aGljaCBqdXN0IGhhcHBlbmVkLiAgVGhpcyBpcyBjdXJyZW50bHkgMC0yNTUgZm9yCisgKiBrZXlib2FyZCBzY2FuIGNvZGVzLCBhbmQgMjU2IHVwd2FyZHMgZm9yIGludGVycnVwdHMuCisgKgorICovCitzdGF0aWMgdm9pZCBhZGRfdGltZXJfcmFuZG9tbmVzcyhzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIG51bSkKK3sKKwlzdHJ1Y3QgeworCQljeWNsZXNfdCBjeWNsZXM7CisJCWxvbmcgamlmZmllczsKKwkJdW5zaWduZWQgbnVtOworCX0gc2FtcGxlOworCWxvbmcgZGVsdGEsIGRlbHRhMiwgZGVsdGEzOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyogaWYgb3ZlciB0aGUgdHJpY2tsZSB0aHJlc2hvbGQsIHVzZSBvbmx5IDEgaW4gNDA5NiBzYW1wbGVzICovCisJaWYgKGlucHV0X3Bvb2wuZW50cm9weV9jb3VudCA+IHRyaWNrbGVfdGhyZXNoICYmCisJICAgIChfX2dldF9jcHVfdmFyKHRyaWNrbGVfY291bnQpKysgJiAweGZmZikpCisJCWdvdG8gb3V0OworCisJc2FtcGxlLmppZmZpZXMgPSBqaWZmaWVzOworCXNhbXBsZS5jeWNsZXMgPSBnZXRfY3ljbGVzKCk7CisJc2FtcGxlLm51bSA9IG51bTsKKwlhZGRfZW50cm9weV93b3JkcygmaW5wdXRfcG9vbCwgKHUzMiAqKSZzYW1wbGUsIHNpemVvZihzYW1wbGUpLzQpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJpdHMgb2YgcmFuZG9tbmVzcyB3ZSBwcm9iYWJseSBhZGRlZC4KKwkgKiBXZSB0YWtlIGludG8gYWNjb3VudCB0aGUgZmlyc3QsIHNlY29uZCBhbmQgdGhpcmQtb3JkZXIgZGVsdGFzCisJICogaW4gb3JkZXIgdG8gbWFrZSBvdXIgZXN0aW1hdGUuCisJICovCisKKwlpZiAoIXN0YXRlLT5kb250X2NvdW50X2VudHJvcHkpIHsKKwkJZGVsdGEgPSBzYW1wbGUuamlmZmllcyAtIHN0YXRlLT5sYXN0X3RpbWU7CisJCXN0YXRlLT5sYXN0X3RpbWUgPSBzYW1wbGUuamlmZmllczsKKworCQlkZWx0YTIgPSBkZWx0YSAtIHN0YXRlLT5sYXN0X2RlbHRhOworCQlzdGF0ZS0+bGFzdF9kZWx0YSA9IGRlbHRhOworCisJCWRlbHRhMyA9IGRlbHRhMiAtIHN0YXRlLT5sYXN0X2RlbHRhMjsKKwkJc3RhdGUtPmxhc3RfZGVsdGEyID0gZGVsdGEyOworCisJCWlmIChkZWx0YSA8IDApCisJCQlkZWx0YSA9IC1kZWx0YTsKKwkJaWYgKGRlbHRhMiA8IDApCisJCQlkZWx0YTIgPSAtZGVsdGEyOworCQlpZiAoZGVsdGEzIDwgMCkKKwkJCWRlbHRhMyA9IC1kZWx0YTM7CisJCWlmIChkZWx0YSA+IGRlbHRhMikKKwkJCWRlbHRhID0gZGVsdGEyOworCQlpZiAoZGVsdGEgPiBkZWx0YTMpCisJCQlkZWx0YSA9IGRlbHRhMzsKKworCQkvKgorCQkgKiBkZWx0YSBpcyBub3cgbWluaW11bSBhYnNvbHV0ZSBkZWx0YS4KKwkJICogUm91bmQgZG93biBieSAxIGJpdCBvbiBnZW5lcmFsIHByaW5jaXBsZXMsCisJCSAqIGFuZCBsaW1pdCBlbnRyb3B5IGVudGltYXRlIHRvIDEyIGJpdHMuCisJCSAqLworCQljcmVkaXRfZW50cm9weV9zdG9yZSgmaW5wdXRfcG9vbCwKKwkJCQkgICAgIG1pbl90KGludCwgZmxzKGRlbHRhPj4xKSwgMTEpKTsKKwl9CisKKwlpZihpbnB1dF9wb29sLmVudHJvcHlfY291bnQgPj0gcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyYW5kb21fcmVhZF93YWl0KTsKKworb3V0OgorCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK2V4dGVybiB2b2lkIGFkZF9pbnB1dF9yYW5kb21uZXNzKHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwKKwkJCQkgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxhc3RfdmFsdWU7CisKKwkvKiBpZ25vcmUgYXV0b3JlcGVhdCBhbmQgdGhlIGxpa2UgKi8KKwlpZiAodmFsdWUgPT0gbGFzdF92YWx1ZSkKKwkJcmV0dXJuOworCisJREVCVUdfRU5UKCJpbnB1dCBldmVudFxuIik7CisJbGFzdF92YWx1ZSA9IHZhbHVlOworCWFkZF90aW1lcl9yYW5kb21uZXNzKCZpbnB1dF90aW1lcl9zdGF0ZSwKKwkJCSAgICAgKHR5cGUgPDwgNCkgXiBjb2RlIF4gKGNvZGUgPj4gNCkgXiB2YWx1ZSk7Cit9CisKK3ZvaWQgYWRkX2ludGVycnVwdF9yYW5kb21uZXNzKGludCBpcnEpCit7CisJaWYgKGlycSA+PSBOUl9JUlFTIHx8IGlycV90aW1lcl9zdGF0ZVtpcnFdID09IDApCisJCXJldHVybjsKKworCURFQlVHX0VOVCgiaXJxIGV2ZW50ICVkXG4iLCBpcnEpOworCWFkZF90aW1lcl9yYW5kb21uZXNzKGlycV90aW1lcl9zdGF0ZVtpcnFdLCAweDEwMCArIGlycSk7Cit9CisKK3ZvaWQgYWRkX2Rpc2tfcmFuZG9tbmVzcyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlpZiAoIWRpc2sgfHwgIWRpc2stPnJhbmRvbSkKKwkJcmV0dXJuOworCS8qIGZpcnN0IG1ham9yIGlzIDEsIHNvIHdlIGdldCA+PSAweDIwMCBoZXJlICovCisJREVCVUdfRU5UKCJkaXNrIGV2ZW50ICVkOiVkXG4iLCBkaXNrLT5tYWpvciwgZGlzay0+Zmlyc3RfbWlub3IpOworCisJYWRkX3RpbWVyX3JhbmRvbW5lc3MoZGlzay0+cmFuZG9tLAorCQkJICAgICAweDEwMCArIE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vcikpOworfQorCitFWFBPUlRfU1lNQk9MKGFkZF9kaXNrX3JhbmRvbW5lc3MpOworCisjZGVmaW5lIEVYVFJBQ1RfU0laRSAxMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRW50cm9weSBleHRyYWN0aW9uIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QgZXh0cmFjdF9lbnRyb3B5KHN0cnVjdCBlbnRyb3B5X3N0b3JlICpyLCB2b2lkICogYnVmLAorCQkJICAgICAgIHNpemVfdCBuYnl0ZXMsIGludCBtaW4sIGludCByc3ZkKTsKKworLyoKKyAqIFRoaXMgdXRpbGl0eSBpbmxpbmUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHRyYW5zZmVyaW5nIGVudHJvcHkKKyAqIGZyb20gdGhlIHByaW1hcnkgcG9vbCB0byB0aGUgc2Vjb25kYXJ5IGV4dHJhY3Rpb24gcG9vbC4gV2UgbWFrZQorICogc3VyZSB3ZSBwdWxsIGVub3VnaCBmb3IgYSAnY2F0YXN0cm9waGljIHJlc2VlZCcuCisgKi8KK3N0YXRpYyB2b2lkIHhmZXJfc2Vjb25kYXJ5X3Bvb2woc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIHNpemVfdCBuYnl0ZXMpCit7CisJX191MzIgdG1wW09VVFBVVF9QT09MX1dPUkRTXTsKKworCWlmIChyLT5wdWxsICYmIHItPmVudHJvcHlfY291bnQgPCBuYnl0ZXMgKiA4ICYmCisJICAgIHItPmVudHJvcHlfY291bnQgPCByLT5wb29saW5mby0+UE9PTEJJVFMpIHsKKwkJaW50IGJ5dGVzID0gbWF4X3QoaW50LCByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoIC8gOCwKKwkJCQltaW5fdChpbnQsIG5ieXRlcywgc2l6ZW9mKHRtcCkpKTsKKwkJaW50IHJzdmQgPSByLT5saW1pdCA/IDAgOiByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoLzQ7CisKKwkJREVCVUdfRU5UKCJnb2luZyB0byByZXNlZWQgJXMgd2l0aCAlZCBiaXRzICIKKwkJCSAgIiglZCBvZiAlZCByZXF1ZXN0ZWQpXG4iLAorCQkJICByLT5uYW1lLCBieXRlcyAqIDgsIG5ieXRlcyAqIDgsIHItPmVudHJvcHlfY291bnQpOworCisJCWJ5dGVzPWV4dHJhY3RfZW50cm9weShyLT5wdWxsLCB0bXAsIGJ5dGVzLAorCQkJCSAgICAgIHJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2ggLyA4LCByc3ZkKTsKKwkJYWRkX2VudHJvcHlfd29yZHMociwgdG1wLCAoYnl0ZXMgKyAzKSAvIDQpOworCQljcmVkaXRfZW50cm9weV9zdG9yZShyLCBieXRlcyo4KTsKKwl9Cit9CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgZXh0cmFjdHMgcmFuZG9tbmVzcyBmcm9tIHRoZSAiZW50cm9weSBwb29sIiwgYW5kCisgKiByZXR1cm5zIGl0IGluIGEgYnVmZmVyLgorICoKKyAqIFRoZSBtaW4gcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbWluaW11bSBhbW91bnQgd2UgY2FuIHB1bGwgYmVmb3JlCisgKiBmYWlsaW5nIHRvIGF2b2lkIHJhY2VzIHRoYXQgZGVmZWF0IGNhdGFzdHJvcGhpYyByZXNlZWRpbmcgd2hpbGUgdGhlCisgKiByZXNlcnZlZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIGhvdyBtdWNoIGVudHJvcHkgd2UgbXVzdCBsZWF2ZSBpbiB0aGUKKyAqIHBvb2wgYWZ0ZXIgZWFjaCBwdWxsIHRvIGF2b2lkIHN0YXJ2aW5nIG90aGVyIHJlYWRlcnMuCisgKgorICogTm90ZTogZXh0cmFjdF9lbnRyb3B5KCkgYXNzdW1lcyB0aGF0IC5wb29sd29yZHMgaXMgYSBtdWx0aXBsZSBvZiAxNiB3b3Jkcy4KKyAqLworCitzdGF0aWMgc2l6ZV90IGFjY291bnQoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIHNpemVfdCBuYnl0ZXMsIGludCBtaW4sCisJCSAgICAgIGludCByZXNlcnZlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQlVHX09OKHItPmVudHJvcHlfY291bnQgPiByLT5wb29saW5mby0+UE9PTEJJVFMpOworCisJLyogSG9sZCBsb2NrIHdoaWxlIGFjY291bnRpbmcgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+bG9jaywgZmxhZ3MpOworCisJREVCVUdfRU5UKCJ0cnlpbmcgdG8gZXh0cmFjdCAlZCBiaXRzIGZyb20gJXNcbiIsCisJCSAgbmJ5dGVzICogOCwgci0+bmFtZSk7CisKKwkvKiBDYW4gd2UgcHVsbCBlbm91Z2g/ICovCisJaWYgKHItPmVudHJvcHlfY291bnQgLyA4IDwgbWluICsgcmVzZXJ2ZWQpIHsKKwkJbmJ5dGVzID0gMDsKKwl9IGVsc2UgeworCQkvKiBJZiBsaW1pdGVkLCBuZXZlciBwdWxsIG1vcmUgdGhhbiBhdmFpbGFibGUgKi8KKwkJaWYgKHItPmxpbWl0ICYmIG5ieXRlcyArIHJlc2VydmVkID49IHItPmVudHJvcHlfY291bnQgLyA4KQorCQkJbmJ5dGVzID0gci0+ZW50cm9weV9jb3VudC84IC0gcmVzZXJ2ZWQ7CisKKwkJaWYoci0+ZW50cm9weV9jb3VudCAvIDggPj0gbmJ5dGVzICsgcmVzZXJ2ZWQpCisJCQlyLT5lbnRyb3B5X2NvdW50IC09IG5ieXRlcyo4OworCQllbHNlCisJCQlyLT5lbnRyb3B5X2NvdW50ID0gcmVzZXJ2ZWQ7CisKKwkJaWYgKHItPmVudHJvcHlfY291bnQgPCByYW5kb21fd3JpdGVfd2FrZXVwX3RocmVzaCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmFuZG9tX3dyaXRlX3dhaXQpOworCX0KKworCURFQlVHX0VOVCgiZGViaXRpbmcgJWQgZW50cm9weSBjcmVkaXRzIGZyb20gJXMlc1xuIiwKKwkJICBuYnl0ZXMgKiA4LCByLT5uYW1lLCByLT5saW1pdCA/ICIiIDogIiAodW5saW1pdGVkKSIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHZvaWQgZXh0cmFjdF9idWYoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIF9fdTggKm91dCkKK3sKKwlpbnQgaSwgeDsKKwlfX3UzMiBkYXRhWzE2XSwgYnVmWzUgKyBTSEFfV09SS1NQQUNFX1dPUkRTXTsKKworCXNoYV9pbml0KGJ1Zik7CisJLyoKKwkgKiBBcyB3ZSBoYXNoIHRoZSBwb29sLCB3ZSBtaXggaW50ZXJtZWRpYXRlIHZhbHVlcyBvZgorCSAqIHRoZSBoYXNoIGJhY2sgaW50byB0aGUgcG9vbC4gIFRoaXMgZWxpbWluYXRlcworCSAqIGJhY2t0cmFja2luZyBhdHRhY2tzICh3aGVyZSB0aGUgYXR0YWNrZXIga25vd3MKKwkgKiB0aGUgc3RhdGUgb2YgdGhlIHBvb2wgcGx1cyB0aGUgY3VycmVudCBvdXRwdXRzLCBhbmQKKwkgKiBhdHRlbXB0cyB0byBmaW5kIHByZXZpb3VzIG91cHV0cyksIHVubGVzcyB0aGUgaGFzaAorCSAqIGZ1bmN0aW9uIGNhbiBiZSBpbnZlcnRlZC4KKwkgKi8KKwlmb3IgKGkgPSAwLCB4ID0gMDsgaSA8IHItPnBvb2xpbmZvLT5wb29sd29yZHM7IGkgKz0gMTYsIHgrPTIpIHsKKwkJc2hhX3RyYW5zZm9ybShidWYsIChfX3U4ICopci0+cG9vbCtpLCBidWYgKyA1KTsKKwkJYWRkX2VudHJvcHlfd29yZHMociwgJmJ1Zlt4ICUgNV0sIDEpOworCX0KKworCS8qCisJICogVG8gYXZvaWQgZHVwbGljYXRlcywgd2UgYXRvbWljYWxseSBleHRyYWN0IGEKKwkgKiBwb3J0aW9uIG9mIHRoZSBwb29sIHdoaWxlIG1peGluZywgYW5kIGhhc2ggb25lCisJICogZmluYWwgdGltZS4KKwkgKi8KKwlfX2FkZF9lbnRyb3B5X3dvcmRzKHIsICZidWZbeCAlIDVdLCAxLCBkYXRhKTsKKwlzaGFfdHJhbnNmb3JtKGJ1ZiwgKF9fdTggKilkYXRhLCBidWYgKyA1KTsKKworCS8qCisJICogSW4gY2FzZSB0aGUgaGFzaCBmdW5jdGlvbiBoYXMgc29tZSByZWNvZ25pemFibGUKKwkgKiBvdXRwdXQgcGF0dGVybiwgd2UgZm9sZCBpdCBpbiBoYWxmLgorCSAqLworCisJYnVmWzBdIF49IGJ1ZlszXTsKKwlidWZbMV0gXj0gYnVmWzRdOworCWJ1ZlswXSBePSByb2wzMihidWZbM10sIDE2KTsKKwltZW1jcHkob3V0LCBidWYsIEVYVFJBQ1RfU0laRSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworfQorCitzdGF0aWMgc3NpemVfdCBleHRyYWN0X2VudHJvcHkoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIHZvaWQgKiBidWYsCisJCQkgICAgICAgc2l6ZV90IG5ieXRlcywgaW50IG1pbiwgaW50IHJlc2VydmVkKQoreworCXNzaXplX3QgcmV0ID0gMCwgaTsKKwlfX3U4IHRtcFtFWFRSQUNUX1NJWkVdOworCisJeGZlcl9zZWNvbmRhcnlfcG9vbChyLCBuYnl0ZXMpOworCW5ieXRlcyA9IGFjY291bnQociwgbmJ5dGVzLCBtaW4sIHJlc2VydmVkKTsKKworCXdoaWxlIChuYnl0ZXMpIHsKKwkJZXh0cmFjdF9idWYociwgdG1wKTsKKwkJaSA9IG1pbl90KGludCwgbmJ5dGVzLCBFWFRSQUNUX1NJWkUpOworCQltZW1jcHkoYnVmLCB0bXAsIGkpOworCQluYnl0ZXMgLT0gaTsKKwkJYnVmICs9IGk7CisJCXJldCArPSBpOworCX0KKworCS8qIFdpcGUgZGF0YSBqdXN0IHJldHVybmVkIGZyb20gbWVtb3J5ICovCisJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZXh0cmFjdF9lbnRyb3B5X3VzZXIoc3RydWN0IGVudHJvcHlfc3RvcmUgKnIsIHZvaWQgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBuYnl0ZXMpCit7CisJc3NpemVfdCByZXQgPSAwLCBpOworCV9fdTggdG1wW0VYVFJBQ1RfU0laRV07CisKKwl4ZmVyX3NlY29uZGFyeV9wb29sKHIsIG5ieXRlcyk7CisJbmJ5dGVzID0gYWNjb3VudChyLCBuYnl0ZXMsIDAsIDApOworCisJd2hpbGUgKG5ieXRlcykgeworCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmIChyZXQgPT0gMCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJfQorCisJCWV4dHJhY3RfYnVmKHIsIHRtcCk7CisJCWkgPSBtaW5fdChpbnQsIG5ieXRlcywgRVhUUkFDVF9TSVpFKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHRtcCwgaSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCW5ieXRlcyAtPSBpOworCQlidWYgKz0gaTsKKwkJcmV0ICs9IGk7CisJfQorCisJLyogV2lwZSBkYXRhIGp1c3QgcmV0dXJuZWQgZnJvbSBtZW1vcnkgKi8KKwltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgZXhwb3J0ZWQga2VybmVsIGludGVyZmFjZS4gIEl0IHJldHVybnMgc29tZQorICogbnVtYmVyIG9mIGdvb2QgcmFuZG9tIG51bWJlcnMsIHN1aXRhYmxlIGZvciBzZWVkaW5nIFRDUCBzZXF1ZW5jZQorICogbnVtYmVycywgZXRjLgorICovCit2b2lkIGdldF9yYW5kb21fYnl0ZXModm9pZCAqYnVmLCBpbnQgbmJ5dGVzKQoreworCWV4dHJhY3RfZW50cm9weSgmbm9uYmxvY2tpbmdfcG9vbCwgYnVmLCBuYnl0ZXMsIDAsIDApOworfQorCitFWFBPUlRfU1lNQk9MKGdldF9yYW5kb21fYnl0ZXMpOworCisvKgorICogaW5pdF9zdGRfZGF0YSAtIGluaXRpYWxpemUgcG9vbCB3aXRoIHN5c3RlbSBkYXRhCisgKgorICogQHI6IHBvb2wgdG8gaW5pdGlhbGl6ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSBwb29sJ3MgZW50cm9weSBjb3VudCBhbmQgbWl4ZXMgc29tZSBzeXN0ZW0KKyAqIGRhdGEgaW50byB0aGUgcG9vbCB0byBwcmVwYXJlIGl0IGZvciB1c2UuIFRoZSBwb29sIGlzIG5vdCBjbGVhcmVkCisgKiBhcyB0aGF0IGNhbiBvbmx5IGRlY3JlYXNlIHRoZSBlbnRyb3B5IGluIHRoZSBwb29sLgorICovCitzdGF0aWMgdm9pZCBpbml0X3N0ZF9kYXRhKHN0cnVjdCBlbnRyb3B5X3N0b3JlICpyKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+bG9jaywgZmxhZ3MpOworCXItPmVudHJvcHlfY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmxvY2ssIGZsYWdzKTsKKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCWFkZF9lbnRyb3B5X3dvcmRzKHIsIChfX3UzMiAqKSZ0diwgc2l6ZW9mKHR2KS80KTsKKwlhZGRfZW50cm9weV93b3JkcyhyLCAoX191MzIgKikmc3lzdGVtX3V0c25hbWUsCisJCQkgIHNpemVvZihzeXN0ZW1fdXRzbmFtZSkvNCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHJhbmRfaW5pdGlhbGl6ZSh2b2lkKQoreworCWluaXRfc3RkX2RhdGEoJmlucHV0X3Bvb2wpOworCWluaXRfc3RkX2RhdGEoJmJsb2NraW5nX3Bvb2wpOworCWluaXRfc3RkX2RhdGEoJm5vbmJsb2NraW5nX3Bvb2wpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQocmFuZF9pbml0aWFsaXplKTsKKwordm9pZCByYW5kX2luaXRpYWxpemVfaXJxKGludCBpcnEpCit7CisJc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKnN0YXRlOworCisJaWYgKGlycSA+PSBOUl9JUlFTIHx8IGlycV90aW1lcl9zdGF0ZVtpcnFdKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIGttYWxsb2MgcmV0dXJucyBudWxsLCB3ZSBqdXN0IHdvbid0IHVzZSB0aGF0IGVudHJvcHkKKwkgKiBzb3VyY2UuCisJICovCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSkgeworCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSkpOworCQlpcnFfdGltZXJfc3RhdGVbaXJxXSA9IHN0YXRlOworCX0KK30KKwordm9pZCByYW5kX2luaXRpYWxpemVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqc3RhdGU7CisKKwkvKgorCSAqIElmIGttYWxsb2MgcmV0dXJucyBudWxsLCB3ZSBqdXN0IHdvbid0IHVzZSB0aGF0IGVudHJvcHkKKwkgKiBzb3VyY2UuCisJICovCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSkgeworCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSkpOworCQlkaXNrLT5yYW5kb20gPSBzdGF0ZTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90CityYW5kb21fcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCBuLCByZXR2YWwgPSAwLCBjb3VudCA9IDA7CisKKwlpZiAobmJ5dGVzID09IDApCisJCXJldHVybiAwOworCisJd2hpbGUgKG5ieXRlcyA+IDApIHsKKwkJbiA9IG5ieXRlczsKKwkJaWYgKG4gPiBTRUNfWEZFUl9TSVpFKQorCQkJbiA9IFNFQ19YRkVSX1NJWkU7CisKKwkJREVCVUdfRU5UKCJyZWFkaW5nICVkIGJpdHNcbiIsIG4qOCk7CisKKwkJbiA9IGV4dHJhY3RfZW50cm9weV91c2VyKCZibG9ja2luZ19wb29sLCBidWYsIG4pOworCisJCURFQlVHX0VOVCgicmVhZCBnb3QgJWQgYml0cyAoJWQgc3RpbGwgbmVlZGVkKVxuIiwKKwkJCSAgbio4LCAobmJ5dGVzLW4pKjgpOworCisJCWlmIChuID09IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCURFQlVHX0VOVCgic2xlZXBpbmc/XG4iKTsKKworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJhbmRvbV9yZWFkX3dhaXQsCisJCQkJaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50ID49CisJCQkJCQkgcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCk7CisKKwkJCURFQlVHX0VOVCgiYXdha2VcbiIpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG4gPCAwKSB7CisJCQlyZXR2YWwgPSBuOworCQkJYnJlYWs7CisJCX0KKwkJY291bnQgKz0gbjsKKwkJYnVmICs9IG47CisJCW5ieXRlcyAtPSBuOworCQlicmVhazsJCS8qIFRoaXMgYnJlYWsgbWFrZXMgdGhlIGRldmljZSB3b3JrICovCisJCQkJLyogbGlrZSBhIG5hbWVkIHBpcGUgKi8KKwl9CisKKwkvKgorCSAqIElmIHdlIGdhdmUgdGhlIHVzZXIgc29tZSBieXRlcywgdXBkYXRlIHRoZSBhY2Nlc3MgdGltZS4KKwkgKi8KKwlpZiAoY291bnQpCisJCWZpbGVfYWNjZXNzZWQoZmlsZSk7CisKKwlyZXR1cm4gKGNvdW50ID8gY291bnQgOiByZXR2YWwpOworfQorCitzdGF0aWMgc3NpemVfdAordXJhbmRvbV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCSAgICAgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gZXh0cmFjdF9lbnRyb3B5X3VzZXIoJm5vbmJsb2NraW5nX3Bvb2wsIGJ1ZiwgbmJ5dGVzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorcmFuZG9tX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrOworCisJcG9sbF93YWl0KGZpbGUsICZyYW5kb21fcmVhZF93YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJnJhbmRvbV93cml0ZV93YWl0LCB3YWl0KTsKKwltYXNrID0gMDsKKwlpZiAoaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50ID49IHJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2gpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50IDwgcmFuZG9tX3dyaXRlX3dha2V1cF90aHJlc2gpCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBzc2l6ZV90CityYW5kb21fd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXQgPSAwOworCXNpemVfdCBieXRlczsKKwlfX3UzMiBidWZbMTZdOworCWNvbnN0IGNoYXIgX191c2VyICpwID0gYnVmZmVyOworCXNpemVfdCBjID0gY291bnQ7CisKKwl3aGlsZSAoYyA+IDApIHsKKwkJYnl0ZXMgPSBtaW4oYywgc2l6ZW9mKGJ1ZikpOworCisJCWJ5dGVzIC09IGNvcHlfZnJvbV91c2VyKCZidWYsIHAsIGJ5dGVzKTsKKwkJaWYgKCFieXRlcykgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWMgLT0gYnl0ZXM7CisJCXAgKz0gYnl0ZXM7CisKKwkJYWRkX2VudHJvcHlfd29yZHMoJmlucHV0X3Bvb2wsIGJ1ZiwgKGJ5dGVzICsgMykgLyA0KTsKKwl9CisJaWYgKHAgPT0gYnVmZmVyKSB7CisJCXJldHVybiAoc3NpemVfdClyZXQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCSAgICAgICAgaW5vZGUtPmlfbXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuIChzc2l6ZV90KShwIC0gYnVmZmVyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3JhbmRvbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHNpemUsIGVudF9jb3VudDsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisJaW50IHJldHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSTkRHRVRFTlRDTlQ6CisJCWVudF9jb3VudCA9IGlucHV0X3Bvb2wuZW50cm9weV9jb3VudDsKKwkJaWYgKHB1dF91c2VyKGVudF9jb3VudCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBSTkRBRERUT0VOVENOVDoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGdldF91c2VyKGVudF9jb3VudCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJY3JlZGl0X2VudHJvcHlfc3RvcmUoJmlucHV0X3Bvb2wsIGVudF9jb3VudCk7CisJCS8qCisJCSAqIFdha2UgdXAgd2FpdGluZyBwcm9jZXNzZXMgaWYgd2UgaGF2ZSBlbm91Z2gKKwkJICogZW50cm9weS4KKwkJICovCisJCWlmIChpbnB1dF9wb29sLmVudHJvcHlfY291bnQgPj0gcmFuZG9tX3JlYWRfd2FrZXVwX3RocmVzaCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmFuZG9tX3JlYWRfd2FpdCk7CisJCXJldHVybiAwOworCWNhc2UgUk5EQURERU5UUk9QWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGdldF91c2VyKGVudF9jb3VudCwgcCsrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZW50X2NvdW50IDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIoc2l6ZSwgcCsrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR2YWwgPSByYW5kb21fd3JpdGUoZmlsZSwgKGNvbnN0IGNoYXIgX191c2VyICopIHAsCisJCQkJICAgICAgc2l6ZSwgJmZpbGUtPmZfcG9zKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQljcmVkaXRfZW50cm9weV9zdG9yZSgmaW5wdXRfcG9vbCwgZW50X2NvdW50KTsKKwkJLyoKKwkJICogV2FrZSB1cCB3YWl0aW5nIHByb2Nlc3NlcyBpZiB3ZSBoYXZlIGVub3VnaAorCQkgKiBlbnRyb3B5LgorCQkgKi8KKwkJaWYgKGlucHV0X3Bvb2wuZW50cm9weV9jb3VudCA+PSByYW5kb21fcmVhZF93YWtldXBfdGhyZXNoKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyYW5kb21fcmVhZF93YWl0KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBSTkRaQVBFTlRDTlQ6CisJY2FzZSBSTkRDTEVBUlBPT0w6CisJCS8qIENsZWFyIHRoZSBlbnRyb3B5IHBvb2wgY291bnRlcnMuICovCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWluaXRfc3RkX2RhdGEoJmlucHV0X3Bvb2wpOworCQlpbml0X3N0ZF9kYXRhKCZibG9ja2luZ19wb29sKTsKKwkJaW5pdF9zdGRfZGF0YSgmbm9uYmxvY2tpbmdfcG9vbCk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYW5kb21fZm9wcyA9IHsKKwkucmVhZCAgPSByYW5kb21fcmVhZCwKKwkud3JpdGUgPSByYW5kb21fd3JpdGUsCisJLnBvbGwgID0gcmFuZG9tX3BvbGwsCisJLmlvY3RsID0gcmFuZG9tX2lvY3RsLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1cmFuZG9tX2ZvcHMgPSB7CisJLnJlYWQgID0gdXJhbmRvbV9yZWFkLAorCS53cml0ZSA9IHJhbmRvbV93cml0ZSwKKwkuaW9jdGwgPSByYW5kb21faW9jdGwsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYW5kb20gVVVJRCBpbnRlcmZhY2UKKyAqCisgKiBVc2VkIGhlcmUgZm9yIGEgQm9vdCBJRCwgYnV0IGNhbiBiZSB1c2VmdWwgZm9yIG90aGVyIGtlcm5lbAorICogZHJpdmVycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBHZW5lcmF0ZSByYW5kb20gVVVJRAorICovCit2b2lkIGdlbmVyYXRlX3JhbmRvbV91dWlkKHVuc2lnbmVkIGNoYXIgdXVpZF9vdXRbMTZdKQoreworCWdldF9yYW5kb21fYnl0ZXModXVpZF9vdXQsIDE2KTsKKwkvKiBTZXQgVVVJRCB2ZXJzaW9uIHRvIDQgLS0tIHRydWVseSByYW5kb20gZ2VuZXJhdGlvbiAqLworCXV1aWRfb3V0WzZdID0gKHV1aWRfb3V0WzZdICYgMHgwRikgfCAweDQwOworCS8qIFNldCB0aGUgVVVJRCB2YXJpYW50IHRvIERDRSAqLworCXV1aWRfb3V0WzhdID0gKHV1aWRfb3V0WzhdICYgMHgzRikgfCAweDgwOworfQorCitFWFBPUlRfU1lNQk9MKGdlbmVyYXRlX3JhbmRvbV91dWlkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3lzY3RsIGludGVyZmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19TWVNDVEwKKworI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCitzdGF0aWMgaW50IG1pbl9yZWFkX3RocmVzaCA9IDgsIG1pbl93cml0ZV90aHJlc2g7CitzdGF0aWMgaW50IG1heF9yZWFkX3RocmVzaCA9IElOUFVUX1BPT0xfV09SRFMgKiAzMjsKK3N0YXRpYyBpbnQgbWF4X3dyaXRlX3RocmVzaCA9IElOUFVUX1BPT0xfV09SRFMgKiAzMjsKK3N0YXRpYyBjaGFyIHN5c2N0bF9ib290aWRbMTZdOworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGlzIHVzZWQgdG8gcmV0dXJuIGJvdGggdGhlIGJvb3RpZCBVVUlELCBhbmQgcmFuZG9tCisgKiBVVUlELiAgVGhlIGRpZmZlcmVuY2UgaXMgaW4gd2hldGhlciB0YWJsZS0+ZGF0YSBpcyBOVUxMOyBpZiBpdCBpcywKKyAqIHRoZW4gYSBuZXcgVVVJRCBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkIHRvIHRoZSB1c2VyLgorICoKKyAqIElmIHRoZSB1c2VyIGFjY2Vzc2VzIHRoaXMgdmlhIHRoZSBwcm9jIGludGVyZmFjZSwgaXQgd2lsbCBiZSByZXR1cm5lZAorICogYXMgYW4gQVNDSUkgc3RyaW5nIGluIHRoZSBzdGFuZGFyZCBVVUlEIGZvcm1hdC4gIElmIGFjY2Vzc2VzIHZpYSB0aGUKKyAqIHN5c2N0bCBzeXN0ZW0gY2FsbCwgaXQgaXMgcmV0dXJuZWQgYXMgMTYgYnl0ZXMgb2YgYmluYXJ5IGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgcHJvY19kb191dWlkKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwljdGxfdGFibGUgZmFrZV90YWJsZTsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2NF0sIHRtcF91dWlkWzE2XSwgKnV1aWQ7CisKKwl1dWlkID0gdGFibGUtPmRhdGE7CisJaWYgKCF1dWlkKSB7CisJCXV1aWQgPSB0bXBfdXVpZDsKKwkJdXVpZFs4XSA9IDA7CisJfQorCWlmICh1dWlkWzhdID09IDApCisJCWdlbmVyYXRlX3JhbmRvbV91dWlkKHV1aWQpOworCisJc3ByaW50ZihidWYsICIlMDJ4JTAyeCUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSIKKwkJIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCXV1aWRbMF0sICB1dWlkWzFdLCAgdXVpZFsyXSwgIHV1aWRbM10sCisJCXV1aWRbNF0sICB1dWlkWzVdLCAgdXVpZFs2XSwgIHV1aWRbN10sCisJCXV1aWRbOF0sICB1dWlkWzldLCAgdXVpZFsxMF0sIHV1aWRbMTFdLAorCQl1dWlkWzEyXSwgdXVpZFsxM10sIHV1aWRbMTRdLCB1dWlkWzE1XSk7CisJZmFrZV90YWJsZS5kYXRhID0gYnVmOworCWZha2VfdGFibGUubWF4bGVuID0gc2l6ZW9mKGJ1Zik7CisKKwlyZXR1cm4gcHJvY19kb3N0cmluZygmZmFrZV90YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgdXVpZF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKKwkJCSB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQoreworCXVuc2lnbmVkIGNoYXIgdG1wX3V1aWRbMTZdLCAqdXVpZDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKCFvbGR2YWwgfHwgIW9sZGxlbnApCisJCXJldHVybiAxOworCisJdXVpZCA9IHRhYmxlLT5kYXRhOworCWlmICghdXVpZCkgeworCQl1dWlkID0gdG1wX3V1aWQ7CisJCXV1aWRbOF0gPSAwOworCX0KKwlpZiAodXVpZFs4XSA9PSAwKQorCQlnZW5lcmF0ZV9yYW5kb21fdXVpZCh1dWlkKTsKKworCWlmIChnZXRfdXNlcihsZW4sIG9sZGxlbnApKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAobGVuKSB7CisJCWlmIChsZW4gPiAxNikKKwkJCWxlbiA9IDE2OworCQlpZiAoY29weV90b191c2VyKG9sZHZhbCwgdXVpZCwgbGVuKSB8fAorCQkgICAgcHV0X3VzZXIobGVuLCBvbGRsZW5wKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzeXNjdGxfcG9vbHNpemUgPSBJTlBVVF9QT09MX1dPUkRTICogMzI7CitjdGxfdGFibGUgcmFuZG9tX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUgCT0gUkFORE9NX1BPT0xTSVpFLAorCQkucHJvY25hbWUJPSAicG9vbHNpemUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3Bvb2xzaXplLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IFJBTkRPTV9FTlRST1BZX0NPVU5ULAorCQkucHJvY25hbWUJPSAiZW50cm9weV9hdmFpbCIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwkJLmRhdGEJCT0gJmlucHV0X3Bvb2wuZW50cm9weV9jb3VudCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gUkFORE9NX1JFQURfVEhSRVNILAorCQkucHJvY25hbWUJPSAicmVhZF93YWtldXBfdGhyZXNob2xkIiwKKwkJLmRhdGEJCT0gJnJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2gsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fcmVhZF90aHJlc2gsCisJCS5leHRyYTIJCT0gJm1heF9yZWFkX3RocmVzaCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gUkFORE9NX1dSSVRFX1RIUkVTSCwKKwkJLnByb2NuYW1lCT0gIndyaXRlX3dha2V1cF90aHJlc2hvbGQiLAorCQkuZGF0YQkJPSAmcmFuZG9tX3dyaXRlX3dha2V1cF90aHJlc2gsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fd3JpdGVfdGhyZXNoLAorCQkuZXh0cmEyCQk9ICZtYXhfd3JpdGVfdGhyZXNoLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBSQU5ET01fQk9PVF9JRCwKKwkJLnByb2NuYW1lCT0gImJvb3RfaWQiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2Jvb3RpZCwKKwkJLm1heGxlbgkJPSAxNiwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX3V1aWQsCisJCS5zdHJhdGVneQk9ICZ1dWlkX3N0cmF0ZWd5LAorCX0sCisJeworCQkuY3RsX25hbWUJPSBSQU5ET01fVVVJRCwKKwkJLnByb2NuYW1lCT0gInV1aWQiLAorCQkubWF4bGVuCQk9IDE2LAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9fdXVpZCwKKwkJLnN0cmF0ZWd5CT0gJnV1aWRfc3RyYXRlZ3ksCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKyNlbmRpZiAJLyogQ09ORklHX1NZU0NUTCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSYW5kb20gZnVudGlvbnMgZm9yIG5ldHdvcmtpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUQ1AgaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgcGlja2luZy4gIFRoaXMgdXNlcyB0aGUgcmFuZG9tIG51bWJlcgorICogZ2VuZXJhdG9yIHRvIHBpY2sgYW4gaW5pdGlhbCBzZWNyZXQgdmFsdWUuICBUaGlzIHZhbHVlIGlzIGhhc2hlZAorICogYWxvbmcgd2l0aCB0aGUgVENQIGVuZHBvaW50IGluZm9ybWF0aW9uIHRvIHByb3ZpZGUgYSB1bmlxdWUKKyAqIHN0YXJ0aW5nIHBvaW50IGZvciBlYWNoIHBhaXIgb2YgVENQIGVuZHBvaW50cy4gIFRoaXMgZGVmZWF0cworICogYXR0YWNrcyB3aGljaCByZWx5IG9uIGd1ZXNzaW5nIHRoZSBpbml0aWFsIFRDUCBzZXF1ZW5jZSBudW1iZXIuCisgKiBUaGlzIGFsZ29yaXRobSB3YXMgc3VnZ2VzdGVkIGJ5IFN0ZXZlIEJlbGxvdmluLgorICoKKyAqIFVzaW5nIGEgdmVyeSBzdHJvbmcgaGFzaCB3YXMgdGFraW5nIGFuIGFwcHJlY2lhYmxlIGFtb3VudCBvZiB0aGUgdG90YWwKKyAqIFRDUCBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgdGltZSwgc28gdGhpcyBpcyBhIHdlYWtlciBoYXNoLAorICogY29tcGVuc2F0ZWQgZm9yIGJ5IGNoYW5naW5nIHRoZSBzZWNyZXQgcGVyaW9kaWNhbGx5LgorICovCisKKy8qIEYsIEcgYW5kIEggYXJlIGJhc2ljIE1ENCBmdW5jdGlvbnM6IHNlbGVjdGlvbiwgbWFqb3JpdHksIHBhcml0eSAqLworI2RlZmluZSBGKHgsIHksIHopICgoeikgXiAoKHgpICYgKCh5KSBeICh6KSkpKQorI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHkpKSArICgoKHgpIF4gKHkpKSAmICh6KSkpCisjZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKworLyoKKyAqIFRoZSBnZW5lcmljIHJvdW5kIGZ1bmN0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIGlzIHNvIHNwZWNpZmljIHRoYXQKKyAqIHdlIGRvbid0IGJvdGhlciBwcm90ZWN0aW5nIGFsbCB0aGUgYXJndW1lbnRzIHdpdGggcGFyZW5zLCBhcyBpcyBnZW5lcmFsbHkKKyAqIGdvb2QgbWFjcm8gcHJhY3RpY2UsIGluIGZhdm9yIG9mIGV4dHJhIGxlZ2liaWxpdHkuCisgKiBSb3RhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGFkZGl0aW9uIHRvIHByZXZlbnQgcmVjb21wdXRhdGlvbgorICovCisjZGVmaW5lIFJPVU5EKGYsIGEsIGIsIGMsIGQsIHgsIHMpCVwKKwkoYSArPSBmKGIsIGMsIGQpICsgeCwgYSA9IChhIDw8IHMpIHwgKGEgPj4gKDMyIC0gcykpKQorI2RlZmluZSBLMSAwCisjZGVmaW5lIEsyIDAxMzI0MDQ3NDYzMVVMCisjZGVmaW5lIEszIDAxNTY2NjM2NTY0MVVMCisKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKworc3RhdGljIF9fdTMyIHR3b3RoaXJkc01ENFRyYW5zZm9ybSAoX191MzIgY29uc3QgYnVmWzRdLCBfX3UzMiBjb25zdCBpblsxMl0pCit7CisJX191MzIgYSA9IGJ1ZlswXSwgYiA9IGJ1ZlsxXSwgYyA9IGJ1ZlsyXSwgZCA9IGJ1ZlszXTsKKworCS8qIFJvdW5kIDEgKi8KKwlST1VORChGLCBhLCBiLCBjLCBkLCBpblsgMF0gKyBLMSwgIDMpOworCVJPVU5EKEYsIGQsIGEsIGIsIGMsIGluWyAxXSArIEsxLCAgNyk7CisJUk9VTkQoRiwgYywgZCwgYSwgYiwgaW5bIDJdICsgSzEsIDExKTsKKwlST1VORChGLCBiLCBjLCBkLCBhLCBpblsgM10gKyBLMSwgMTkpOworCVJPVU5EKEYsIGEsIGIsIGMsIGQsIGluWyA0XSArIEsxLCAgMyk7CisJUk9VTkQoRiwgZCwgYSwgYiwgYywgaW5bIDVdICsgSzEsICA3KTsKKwlST1VORChGLCBjLCBkLCBhLCBiLCBpblsgNl0gKyBLMSwgMTEpOworCVJPVU5EKEYsIGIsIGMsIGQsIGEsIGluWyA3XSArIEsxLCAxOSk7CisJUk9VTkQoRiwgYSwgYiwgYywgZCwgaW5bIDhdICsgSzEsICAzKTsKKwlST1VORChGLCBkLCBhLCBiLCBjLCBpblsgOV0gKyBLMSwgIDcpOworCVJPVU5EKEYsIGMsIGQsIGEsIGIsIGluWzEwXSArIEsxLCAxMSk7CisJUk9VTkQoRiwgYiwgYywgZCwgYSwgaW5bMTFdICsgSzEsIDE5KTsKKworCS8qIFJvdW5kIDIgKi8KKwlST1VORChHLCBhLCBiLCBjLCBkLCBpblsgMV0gKyBLMiwgIDMpOworCVJPVU5EKEcsIGQsIGEsIGIsIGMsIGluWyAzXSArIEsyLCAgNSk7CisJUk9VTkQoRywgYywgZCwgYSwgYiwgaW5bIDVdICsgSzIsICA5KTsKKwlST1VORChHLCBiLCBjLCBkLCBhLCBpblsgN10gKyBLMiwgMTMpOworCVJPVU5EKEcsIGEsIGIsIGMsIGQsIGluWyA5XSArIEsyLCAgMyk7CisJUk9VTkQoRywgZCwgYSwgYiwgYywgaW5bMTFdICsgSzIsICA1KTsKKwlST1VORChHLCBjLCBkLCBhLCBiLCBpblsgMF0gKyBLMiwgIDkpOworCVJPVU5EKEcsIGIsIGMsIGQsIGEsIGluWyAyXSArIEsyLCAxMyk7CisJUk9VTkQoRywgYSwgYiwgYywgZCwgaW5bIDRdICsgSzIsICAzKTsKKwlST1VORChHLCBkLCBhLCBiLCBjLCBpblsgNl0gKyBLMiwgIDUpOworCVJPVU5EKEcsIGMsIGQsIGEsIGIsIGluWyA4XSArIEsyLCAgOSk7CisJUk9VTkQoRywgYiwgYywgZCwgYSwgaW5bMTBdICsgSzIsIDEzKTsKKworCS8qIFJvdW5kIDMgKi8KKwlST1VORChILCBhLCBiLCBjLCBkLCBpblsgM10gKyBLMywgIDMpOworCVJPVU5EKEgsIGQsIGEsIGIsIGMsIGluWyA3XSArIEszLCAgOSk7CisJUk9VTkQoSCwgYywgZCwgYSwgYiwgaW5bMTFdICsgSzMsIDExKTsKKwlST1VORChILCBiLCBjLCBkLCBhLCBpblsgMl0gKyBLMywgMTUpOworCVJPVU5EKEgsIGEsIGIsIGMsIGQsIGluWyA2XSArIEszLCAgMyk7CisJUk9VTkQoSCwgZCwgYSwgYiwgYywgaW5bMTBdICsgSzMsICA5KTsKKwlST1VORChILCBjLCBkLCBhLCBiLCBpblsgMV0gKyBLMywgMTEpOworCVJPVU5EKEgsIGIsIGMsIGQsIGEsIGluWyA1XSArIEszLCAxNSk7CisJUk9VTkQoSCwgYSwgYiwgYywgZCwgaW5bIDldICsgSzMsICAzKTsKKwlST1VORChILCBkLCBhLCBiLCBjLCBpblsgMF0gKyBLMywgIDkpOworCVJPVU5EKEgsIGMsIGQsIGEsIGIsIGluWyA0XSArIEszLCAxMSk7CisJUk9VTkQoSCwgYiwgYywgZCwgYSwgaW5bIDhdICsgSzMsIDE1KTsKKworCXJldHVybiBidWZbMV0gKyBiOyAvKiAibW9zdCBoYXNoZWQiIHdvcmQgKi8KKwkvKiBBbHRlcm5hdGl2ZTogcmV0dXJuIHN1bSBvZiBhbGwgd29yZHM/ICovCit9CisjZW5kaWYKKworI3VuZGVmIFJPVU5ECisjdW5kZWYgRgorI3VuZGVmIEcKKyN1bmRlZiBICisjdW5kZWYgSzEKKyN1bmRlZiBLMgorI3VuZGVmIEszCisKKy8qIFRoaXMgc2hvdWxkIG5vdCBiZSBkZWNyZWFzZWQgc28gbG93IHRoYXQgSVNOcyB3cmFwIHRvbyBmYXN0LiAqLworI2RlZmluZSBSRUtFWV9JTlRFUlZBTCAoMzAwICogSFopCisvKgorICogQml0IGxheW91dCBvZiB0aGUgdGNwIHNlcXVlbmNlIG51bWJlcnMgKGJlZm9yZSBhZGRpbmcgY3VycmVudCB0aW1lKToKKyAqIGJpdCAyNC0zMTogaW5jcmVhc2VkIGFmdGVyIGV2ZXJ5IGtleSBleGNoYW5nZQorICogYml0IDAtMjM6IGhhc2goc291cmNlLGRlc3QpCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIGFsZ29yaXRobSBkZXNjcmliZWQKKyAqIGluIHRoZSBBcHBlbmRpeCBvZiBSRkMgMTE4NSwgZXhjZXB0IHRoYXQKKyAqIC0gaXQgdXNlcyBhIDEgTUh6IGNsb2NrIGluc3RlYWQgb2YgYSAyNTAga0h6IGNsb2NrCisgKiAtIGl0IHBlcmZvcm1zIGEgcmVrZXkgZXZlcnkgNSBtaW51dGVzLCB3aGljaCBpcyBlcXVpdmFsZW50CisgKiAJdG8gYSAoc291cmNlLGRlc3QpIHR1bHBsZSBkZXBlbmRlbnQgZm9yd2FyZCBqdW1wIG9mIHRoZQorICogCWNsb2NrIGJ5IDAuLjJeKEhBU0hfQklUUysxKQorICoKKyAqIFRodXMgdGhlIGF2ZXJhZ2UgSVNOIHdyYXBhcm91bmQgdGltZSBpcyA2OCBtaW51dGVzIGluc3RlYWQgb2YKKyAqIDQuNTUgaG91cnMuCisgKgorICogU01QIGNsZWFudXAgYW5kIGxvY2sgYXZvaWRhbmNlIHdpdGggcG9vciBtYW4ncyBSQ1UuCisgKiAJCQlNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPgorICoKKyAqLworI2RlZmluZSBDT1VOVF9CSVRTIDgKKyNkZWZpbmUgQ09VTlRfTUFTSyAoKDEgPDwgQ09VTlRfQklUUykgLSAxKQorI2RlZmluZSBIQVNIX0JJVFMgMjQKKyNkZWZpbmUgSEFTSF9NQVNLICgoMSA8PCBIQVNIX0JJVFMpIC0gMSkKKworc3RhdGljIHN0cnVjdCBrZXlkYXRhIHsKKwlfX3UzMiBjb3VudDsgLyogYWxyZWFkeSBzaGlmdGVkIHRvIHRoZSBmaW5hbCBwb3NpdGlvbiAqLworCV9fdTMyIHNlY3JldFsxMl07Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZCBpcF9rZXlkYXRhWzJdOworCitzdGF0aWMgdW5zaWduZWQgaW50IGlwX2NudDsKKworc3RhdGljIHZvaWQgcmVrZXlfc2VxX2dlbmVyYXRvcih2b2lkICpwcml2YXRlXyk7CisKK3N0YXRpYyBERUNMQVJFX1dPUksocmVrZXlfd29yaywgcmVrZXlfc2VxX2dlbmVyYXRvciwgTlVMTCk7CisKKy8qCisgKiBMb2NrIGF2b2lkYW5jZToKKyAqIFRoZSBJU04gZ2VuZXJhdGlvbiBydW5zIGxvY2tsZXNzIC0gaXQncyBqdXN0IGEgaGFzaCBvdmVyIHJhbmRvbSBkYXRhLgorICogU3RhdGUgY2hhbmdlcyBoYXBwZW4gZXZlcnkgNSBtaW51dGVzIHdoZW4gdGhlIHJhbmRvbSBrZXkgaXMgcmVwbGFjZWQuCisgKiBTeW5jaHJvbml6YXRpb24gaXMgcGVyZm9ybWVkIGJ5IGhhdmluZyB0d28gY29waWVzIG9mIHRoZSBoYXNoIGZ1bmN0aW9uCisgKiBzdGF0ZSBhbmQgcmVrZXlfc2VxX2dlbmVyYXRvciBhbHdheXMgdXBkYXRlcyB0aGUgaW5hY3RpdmUgY29weS4KKyAqIFRoZSBjb3B5IGlzIHRoZW4gYWN0aXZhdGVkIGJ5IHVwZGF0aW5nIGlwX2NudC4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBicmVha3MgZG93biBpZiBzb21lb25lIGJsb2NrcyB0aGUgdGhyZWFkCisgKiB0aGF0IHByb2Nlc3NlcyBTWU4gcmVxdWVzdHMgZm9yIG1vcmUgdGhhbiA1IG1pbnV0ZXMuIFNob3VsZCBuZXZlcgorICogaGFwcGVuLCBhbmQgZXZlbiBpZiB0aGF0IGhhcHBlbnMgb25seSBhIG5vdCBwZXJmZWN0bHkgY29tcGxpYW50CisgKiBJU04gaXMgZ2VuZXJhdGVkLCBub3RoaW5nIGZhdGFsLgorICovCitzdGF0aWMgdm9pZCByZWtleV9zZXFfZ2VuZXJhdG9yKHZvaWQgKnByaXZhdGVfKQoreworCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSAmaXBfa2V5ZGF0YVsxIF4gKGlwX2NudCAmIDEpXTsKKworCWdldF9yYW5kb21fYnl0ZXMoa2V5cHRyLT5zZWNyZXQsIHNpemVvZihrZXlwdHItPnNlY3JldCkpOworCWtleXB0ci0+Y291bnQgPSAoaXBfY250ICYgQ09VTlRfTUFTSykgPDwgSEFTSF9CSVRTOworCXNtcF93bWIoKTsKKwlpcF9jbnQrKzsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJla2V5X3dvcmssIFJFS0VZX0lOVEVSVkFMKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2V5ZGF0YSAqZ2V0X2tleXB0cih2b2lkKQoreworCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSAmaXBfa2V5ZGF0YVtpcF9jbnQgJiAxXTsKKworCXNtcF9ybWIoKTsKKworCXJldHVybiBrZXlwdHI7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHNlcWdlbl9pbml0KHZvaWQpCit7CisJcmVrZXlfc2VxX2dlbmVyYXRvcihOVUxMKTsKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoc2VxZ2VuX2luaXQpOworCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCitfX3UzMiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKF9fdTMyICpzYWRkciwgX191MzIgKmRhZGRyLAorCQkJCSAgIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlfX3UzMiBzZXE7CisJX191MzIgaGFzaFsxMl07CisJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9IGdldF9rZXlwdHIoKTsKKworCS8qIFRoZSBwcm9jZWR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIElQdjQsIGJ1dCBhZGRyZXNzZXMgYXJlIGxvbmdlci4KKwkgKiBUaHVzIHdlIG11c3QgdXNlIHR3b3RoaXJkc01ENFRyYW5zZm9ybS4KKwkgKi8KKworCW1lbWNweShoYXNoLCBzYWRkciwgMTYpOworCWhhc2hbNF09KHNwb3J0IDw8IDE2KSArIGRwb3J0OworCW1lbWNweSgmaGFzaFs1XSxrZXlwdHItPnNlY3JldCxzaXplb2YoX191MzIpICogNyk7CisKKwlzZXEgPSB0d290aGlyZHNNRDRUcmFuc2Zvcm0oZGFkZHIsIGhhc2gpICYgSEFTSF9NQVNLOworCXNlcSArPSBrZXlwdHItPmNvdW50OworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJc2VxICs9IHR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwOworCisJcmV0dXJuIHNlcTsKK30KK0VYUE9SVF9TWU1CT0woc2VjdXJlX3RjcHY2X3NlcXVlbmNlX251bWJlcik7CisjZW5kaWYKKworLyogIFRoZSBjb2RlIGJlbG93IGlzIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKCkuCisgKiAgQWxsIGJsYW1lcyB0byBBbmRyZXkgVi4gU2F2b2Noa2luIDxzYXdAbXN1LnJ1Pi4KKyAqLworX191MzIgc2VjdXJlX2lwX2lkKF9fdTMyIGRhZGRyKQoreworCXN0cnVjdCBrZXlkYXRhICprZXlwdHI7CisJX191MzIgaGFzaFs0XTsKKworCWtleXB0ciA9IGdldF9rZXlwdHIoKTsKKworCS8qCisJICogIFBpY2sgYSB1bmlxdWUgc3RhcnRpbmcgb2Zmc2V0IGZvciBlYWNoIElQIGRlc3RpbmF0aW9uLgorCSAqICBUaGUgZGVzdCBpcCBhZGRyZXNzIGlzIHBsYWNlZCBpbiB0aGUgc3RhcnRpbmcgdmVjdG9yLAorCSAqICB3aGljaCBpcyB0aGVuIGhhc2hlZCB3aXRoIHJhbmRvbSBkYXRhLgorCSAqLworCWhhc2hbMF0gPSBkYWRkcjsKKwloYXNoWzFdID0ga2V5cHRyLT5zZWNyZXRbOV07CisJaGFzaFsyXSA9IGtleXB0ci0+c2VjcmV0WzEwXTsKKwloYXNoWzNdID0ga2V5cHRyLT5zZWNyZXRbMTFdOworCisJcmV0dXJuIGhhbGZfbWQ0X3RyYW5zZm9ybShoYXNoLCBrZXlwdHItPnNlY3JldCk7Cit9CisKKyNpZmRlZiBDT05GSUdfSU5FVAorCitfX3UzMiBzZWN1cmVfdGNwX3NlcXVlbmNlX251bWJlcihfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCisJCQkJIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlfX3UzMiBzZXE7CisJX191MzIgaGFzaFs0XTsKKwlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyID0gZ2V0X2tleXB0cigpOworCisJLyoKKwkgKiAgUGljayBhIHVuaXF1ZSBzdGFydGluZyBvZmZzZXQgZm9yIGVhY2ggVENQIGNvbm5lY3Rpb24gZW5kcG9pbnRzCisJICogIChzYWRkciwgZGFkZHIsIHNwb3J0LCBkcG9ydCkuCisJICogIE5vdGUgdGhhdCB0aGUgd29yZHMgYXJlIHBsYWNlZCBpbnRvIHRoZSBzdGFydGluZyB2ZWN0b3IsIHdoaWNoIGlzCisJICogIHRoZW4gbWl4ZWQgd2l0aCBhIHBhcnRpYWwgTUQ0IG92ZXIgcmFuZG9tIGRhdGEuCisJICovCisJaGFzaFswXT1zYWRkcjsKKwloYXNoWzFdPWRhZGRyOworCWhhc2hbMl09KHNwb3J0IDw8IDE2KSArIGRwb3J0OworCWhhc2hbM109a2V5cHRyLT5zZWNyZXRbMTFdOworCisJc2VxID0gaGFsZl9tZDRfdHJhbnNmb3JtKGhhc2gsIGtleXB0ci0+c2VjcmV0KSAmIEhBU0hfTUFTSzsKKwlzZXEgKz0ga2V5cHRyLT5jb3VudDsKKwkvKgorCSAqCUFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIFJGQyA3OTMsIHdoaWNoCisJICoJc3VnZ2VzdHMgdXNpbmcgYSAyNTAga0h6IGNsb2NrLgorCSAqCUZ1cnRoZXIgcmVhZGluZyBzaG93cyB0aGlzIGFzc3VtZXMgMiBNYi9zIG5ldHdvcmtzLgorCSAqCUZvciAxMCBNYi9zIEV0aGVybmV0LCBhIDEgTUh6IGNsb2NrIGlzIGFwcHJvcHJpYXRlLgorCSAqCVRoYXQncyBmdW5ueSwgTGludXggaGFzIG9uZSBidWlsdCBpbiEgIFVzZSBpdCEKKwkgKgkoTmV0d29ya3MgYXJlIGZhc3RlciBub3cgLSBzaG91bGQgdGhpcyBiZSBpbmNyZWFzZWQ/KQorCSAqLworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCXNlcSArPSB0di50dl91c2VjICsgdHYudHZfc2VjICogMTAwMDAwMDsKKyNpZiAwCisJcHJpbnRrKCJpbml0X3NlcSglbHgsICVseCwgJWQsICVkKSA9ICVkXG4iLAorCSAgICAgICBzYWRkciwgZGFkZHIsIHNwb3J0LCBkcG9ydCwgc2VxKTsKKyNlbmRpZgorCXJldHVybiBzZXE7Cit9CisKK0VYUE9SVF9TWU1CT0woc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIpOworCisKKworLyogR2VuZXJhdGUgc2VjdXJlIHN0YXJ0aW5nIHBvaW50IGZvciBlcGhlbWVyYWwgVENQIHBvcnQgc2VhcmNoICovCit1MzIgc2VjdXJlX3RjcF9wb3J0X2VwaGVtZXJhbChfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsIF9fdTE2IGRwb3J0KQoreworCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSBnZXRfa2V5cHRyKCk7CisJdTMyIGhhc2hbNF07CisKKwkvKgorCSAqICBQaWNrIGEgdW5pcXVlIHN0YXJ0aW5nIG9mZnNldCBmb3IgZWFjaCBlcGhlbWVyYWwgcG9ydCBzZWFyY2gKKwkgKiAgKHNhZGRyLCBkYWRkciwgZHBvcnQpIGFuZCA0OGJpdHMgb2YgcmFuZG9tIGRhdGEuCisJICovCisJaGFzaFswXSA9IHNhZGRyOworCWhhc2hbMV0gPSBkYWRkcjsKKwloYXNoWzJdID0gZHBvcnQgXiBrZXlwdHItPnNlY3JldFsxMF07CisJaGFzaFszXSA9IGtleXB0ci0+c2VjcmV0WzExXTsKKworCXJldHVybiBoYWxmX21kNF90cmFuc2Zvcm0oaGFzaCwga2V5cHRyLT5zZWNyZXQpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCit1MzIgc2VjdXJlX3RjcHY2X3BvcnRfZXBoZW1lcmFsKGNvbnN0IF9fdTMyICpzYWRkciwgY29uc3QgX191MzIgKmRhZGRyLCBfX3UxNiBkcG9ydCkKK3sKKwlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyID0gZ2V0X2tleXB0cigpOworCXUzMiBoYXNoWzEyXTsKKworCW1lbWNweShoYXNoLCBzYWRkciwgMTYpOworCWhhc2hbNF0gPSBkcG9ydDsKKwltZW1jcHkoJmhhc2hbNV0sa2V5cHRyLT5zZWNyZXQsc2l6ZW9mKF9fdTMyKSAqIDcpOworCisJcmV0dXJuIHR3b3RoaXJkc01ENFRyYW5zZm9ybShkYWRkciwgaGFzaCk7Cit9CitFWFBPUlRfU1lNQk9MKHNlY3VyZV90Y3B2Nl9wb3J0X2VwaGVtZXJhbCk7CisjZW5kaWYKKworI2VuZGlmIC8qIENPTkZJR19JTkVUICovCisKKworLyoKKyAqIEdldCBhIHJhbmRvbSB3b3JkIGZvciBpbnRlcm5hbCBrZXJuZWwgdXNlIG9ubHkuIFNpbWlsYXIgdG8gdXJhbmRvbSBidXQKKyAqIHdpdGggdGhlIGdvYWwgb2YgbWluaW1hbCBlbnRyb3B5IHBvb2wgZGVwbGV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIHJhbmRvbQorICogdmFsdWUgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSBidXQgZm9yIHNldmVyYWwgdXNlcyB0aGUgY29zdCBvZgorICogZGVwbGV0aW5nIGVudHJvcHkgaXMgdG9vIGhpZ2gKKyAqLwordW5zaWduZWQgaW50IGdldF9yYW5kb21faW50KHZvaWQpCit7CisJLyoKKwkgKiBVc2UgSVAncyBSTkcuIEl0IHN1aXRzIG91ciBwdXJwb3NlIHBlcmZlY3RseTogaXQgcmUta2V5cyBpdHNlbGYKKwkgKiBldmVyeSBzZWNvbmQsIGZyb20gdGhlIGVudHJvcHkgcG9vbCAoYW5kIHRodXMgY3JlYXRlcyBhIGxpbWl0ZWQKKwkgKiBkcmFpbiBvbiBpdCksIGFuZCB1c2VzIGhhbGZNRDRUcmFuc2Zvcm0gd2l0aGluIHRoZSBzZWNvbmQuIFdlCisJICogYWxzbyBtaXggaXQgd2l0aCBqaWZmaWVzIGFuZCB0aGUgUElEOgorCSAqLworCXJldHVybiBzZWN1cmVfaXBfaWQoY3VycmVudC0+cGlkICsgamlmZmllcyk7Cit9CisKKy8qCisgKiByYW5kb21pemVfcmFuZ2UoKSByZXR1cm5zIGEgc3RhcnQgYWRkcmVzcyBzdWNoIHRoYXQKKyAqCisgKiAgICBbLi4uLi4uIDxyYW5nZT4gLi4uLi5dCisgKiAgc3RhcnQgICAgICAgICAgICAgICAgICBlbmQKKyAqCisgKiBhIDxyYW5nZT4gd2l0aCBzaXplICJsZW4iIHN0YXJ0aW5nIGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgaW5zaWRlIGluIHRoZQorICogYXJlYSBkZWZpbmVkIGJ5IFtzdGFydCwgZW5kXSwgYnV0IGlzIG90aGVyd2lzZSByYW5kb21pemVkLgorICovCit1bnNpZ25lZCBsb25nCityYW5kb21pemVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBlbmQgLSBsZW4gLSBzdGFydDsKKworCWlmIChlbmQgPD0gc3RhcnQgKyBsZW4pCisJCXJldHVybiAwOworCXJldHVybiBQQUdFX0FMSUdOKGdldF9yYW5kb21faW50KCkgJSByYW5nZSArIHN0YXJ0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYXcuYyBiL2RyaXZlcnMvY2hhci9yYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmUzM2VjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jhdy5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL3Jhdy5jCisgKgorICogRnJvbnQtZW5kIHJhdyBjaGFyYWN0ZXIgZGV2aWNlcy4gIFRoZXNlIGNhbiBiZSBib3VuZCB0byBhbnkgYmxvY2sKKyAqIGRldmljZXMgdG8gcHJvdmlkZSBnZW51aW5lIFVuaXggcmF3IGNoYXJhY3RlciBkZXZpY2Ugc2VtYW50aWNzLgorICoKKyAqIFdlIHJlc2VydmUgbWlub3IgbnVtYmVyIDAgZm9yIGEgY29udHJvbCBpbnRlcmZhY2UuICBpb2N0bCgpcyBvbiB0aGlzCisgKiBkZXZpY2UgYXJlIHVzZWQgdG8gYmluZCB0aGUgb3RoZXIgbWlub3IgbnVtYmVycyB0byBibG9jayBkZXZpY2VzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jhdy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdHJ1Y3QgcmF3X2RldmljZV9kYXRhIHsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiaW5kaW5nOworCWludCBpbnVzZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpyYXdfY2xhc3M7CitzdGF0aWMgc3RydWN0IHJhd19kZXZpY2VfZGF0YSByYXdfZGV2aWNlc1tNQVhfUkFXX01JTk9SU107CitzdGF0aWMgREVDTEFSRV9NVVRFWChyYXdfbXV0ZXgpOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmF3X2N0bF9mb3BzOwkgICAgIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KKworLyoKKyAqIE9wZW4vY2xvc2UgY29kZSBmb3IgcmF3IElPLgorICoKKyAqIFdlIGp1c3QgcmV3cml0ZSB0aGUgaV9tYXBwaW5nIGZvciB0aGUgL2Rldi9yYXcvcmF3TiBmaWxlIGRlc2NyaXB0b3IgdG8KKyAqIHBvaW50IGF0IHRoZSBibG9ja2RldidzIGFkZHJlc3Nfc3BhY2UgYW5kIHNldCB0aGUgZmlsZSBoYW5kbGUgdG8gdXNlCisgKiBPX0RJUkVDVC4KKyAqCisgKiBTZXQgdGhlIGRldmljZSdzIHNvZnQgYmxvY2tzaXplIHRvIHRoZSBtaW5pbXVtIHBvc3NpYmxlLiAgVGhpcyBnaXZlcyB0aGUKKyAqIGZpbmVzdCBwb3NzaWJsZSBhbGlnbm1lbnQgYW5kIGhhcyBubyBhZHZlcnNlIGltcGFjdCBvbiBwZXJmb3JtYW5jZS4KKyAqLworc3RhdGljIGludCByYXdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwljb25zdCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJaW50IGVycjsKKworCWlmIChtaW5vciA9PSAwKSB7CS8qIEl0IGlzIHRoZSBjb250cm9sIGRldmljZSAqLworCQlmaWxwLT5mX29wID0gJnJhd19jdGxfZm9wczsKKwkJcmV0dXJuIDA7CisJfQorCisJZG93bigmcmF3X211dGV4KTsKKworCS8qCisJICogQWxsIHdlIG5lZWQgdG8gZG8gb24gb3BlbiBpcyBjaGVjayB0aGF0IHRoZSBkZXZpY2UgaXMgYm91bmQuCisJICovCisJYmRldiA9IHJhd19kZXZpY2VzW21pbm9yXS5iaW5kaW5nOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFiZGV2KQorCQlnb3RvIG91dDsKKwlpZ3JhYihiZGV2LT5iZF9pbm9kZSk7CisJZXJyID0gYmxrZGV2X2dldChiZGV2LCBmaWxwLT5mX21vZGUsIDApOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IGJkX2NsYWltKGJkZXYsIHJhd19vcGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZXJyID0gc2V0X2Jsb2Nrc2l6ZShiZGV2LCBiZGV2X2hhcmRzZWN0X3NpemUoYmRldikpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKwlmaWxwLT5mX2ZsYWdzIHw9IE9fRElSRUNUOworCWZpbHAtPmZfbWFwcGluZyA9IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CisJaWYgKCsrcmF3X2RldmljZXNbbWlub3JdLmludXNlID09IDEpCisJCWZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcgPQorCQkJYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBiZGV2OworCXVwKCZyYXdfbXV0ZXgpOworCXJldHVybiAwOworCitvdXQyOgorCWJkX3JlbGVhc2UoYmRldik7CitvdXQxOgorCWJsa2Rldl9wdXQoYmRldik7CitvdXQ6CisJdXAoJnJhd19tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFdoZW4gdGhlIGZpbmFsIGZkIHdoaWNoIHJlZmVycyB0byB0aGlzIGNoYXJhY3Rlci1zcGVjaWFsIG5vZGUgaXMgY2xvc2VkLCB3ZQorICogbWFrZSBpdHMgLT5tYXBwaW5nIHBvaW50IGJhY2sgYXQgaXRzIG93biBpX2RhdGEuCisgKi8KK3N0YXRpYyBpbnQgcmF3X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJY29uc3QgaW50IG1pbm9yPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisKKwlkb3duKCZyYXdfbXV0ZXgpOworCWJkZXYgPSByYXdfZGV2aWNlc1ttaW5vcl0uYmluZGluZzsKKwlpZiAoLS1yYXdfZGV2aWNlc1ttaW5vcl0uaW51c2UgPT0gMCkgeworCQkvKiBIZXJlICBpbm9kZS0+aV9tYXBwaW5nID09IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcgICovCisJCWlub2RlLT5pX21hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CisJfQorCXVwKCZyYXdfbXV0ZXgpOworCisJYmRfcmVsZWFzZShiZGV2KTsKKwlibGtkZXZfcHV0KGJkZXYpOworCXJldHVybiAwOworfQorCisvKgorICogRm9yd2FyZCBpb2N0bHMgdG8gdGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlLgorICovCitzdGF0aWMgaW50CityYXdfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gaW9jdGxfYnlfYmRldihiZGV2LCBjb21tYW5kLCBhcmcpOworfQorCitzdGF0aWMgdm9pZCBiaW5kX2RldmljZShzdHJ1Y3QgcmF3X2NvbmZpZ19yZXF1ZXN0ICpycSkKK3sKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihSQVdfTUFKT1IsIHJxLT5yYXdfbWlub3IpKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChyYXdfY2xhc3MsIE1LREVWKFJBV19NQUpPUiwgcnEtPnJhd19taW5vciksCisJCQkJICAgICAgTlVMTCwgInJhdyVkIiwgcnEtPnJhd19taW5vcik7Cit9CisKKy8qCisgKiBEZWFsIHdpdGggaW9jdGxzIGFnYWluc3QgdGhlIHJhdy1kZXZpY2UgY29udHJvbCBpbnRlcmZhY2UsIHRvIGJpbmQKKyAqIGFuZCB1bmJpbmQgb3RoZXIgcmF3IGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgcmF3X2N0bF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCXVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcmF3X2NvbmZpZ19yZXF1ZXN0IHJxOworCXN0cnVjdCByYXdfZGV2aWNlX2RhdGEgKnJhd2RldjsKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgUkFXX1NFVEJJTkQ6CisJY2FzZSBSQVdfR0VUQklORDoKKworCQkvKiBGaXJzdCwgZmluZCBvdXQgd2hpY2ggcmF3IG1pbm9yIHdlIHdhbnQgKi8KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJxLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YocnEpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHJxLnJhd19taW5vciA8IDAgfHwgcnEucmF3X21pbm9yID49IE1BWF9SQVdfTUlOT1JTKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmF3ZGV2ID0gJnJhd19kZXZpY2VzW3JxLnJhd19taW5vcl07CisKKwkJaWYgKGNvbW1hbmQgPT0gUkFXX1NFVEJJTkQpIHsKKwkJCWRldl90IGRldjsKKworCQkJLyoKKwkJCSAqIFRoaXMgaXMgbGlrZSBtYWtpbmcgYmxvY2sgZGV2aWNlcywgc28gZGVtYW5kIHRoZQorCQkJICogc2FtZSBjYXBhYmlsaXR5CisJCQkgKi8KKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJCWVyciA9IC1FUEVSTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEZvciBub3csIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgdW5kZXJseWluZworCQkJICogYmxvY2sgZGV2aWNlIGlzIHByZXNlbnQgb3Igbm90OiB3ZSBjYW4gZG8gdGhhdCB3aGVuCisJCQkgKiB0aGUgcmF3IGRldmljZSBpcyBvcGVuZWQuICBKdXN0IGNoZWNrIHRoYXQgdGhlCisJCQkgKiBtYWpvci9taW5vciBudW1iZXJzIG1ha2Ugc2Vuc2UuCisJCQkgKi8KKworCQkJZGV2ID0gTUtERVYocnEuYmxvY2tfbWFqb3IsIHJxLmJsb2NrX21pbm9yKTsKKwkJCWlmICgocnEuYmxvY2tfbWFqb3IgPT0gMCAmJiBycS5ibG9ja19taW5vciAhPSAwKSB8fAorCQkJCQlNQUpPUihkZXYpICE9IHJxLmJsb2NrX21ham9yIHx8CisJCQkJCU1JTk9SKGRldikgIT0gcnEuYmxvY2tfbWlub3IpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlkb3duKCZyYXdfbXV0ZXgpOworCQkJaWYgKHJhd2Rldi0+aW51c2UpIHsKKwkJCQl1cCgmcmF3X211dGV4KTsKKwkJCQllcnIgPSAtRUJVU1k7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAocmF3ZGV2LT5iaW5kaW5nKSB7CisJCQkJYmRwdXQocmF3ZGV2LT5iaW5kaW5nKTsKKwkJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwkJCX0KKwkJCWlmIChycS5ibG9ja19tYWpvciA9PSAwICYmIHJxLmJsb2NrX21pbm9yID09IDApIHsKKwkJCQkvKiB1bmJpbmQgKi8KKwkJCQlyYXdkZXYtPmJpbmRpbmcgPSBOVUxMOworCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFJBV19NQUpPUiwKKwkJCQkJCQkJcnEucmF3X21pbm9yKSk7CisJCQl9IGVsc2UgeworCQkJCXJhd2Rldi0+YmluZGluZyA9IGJkZ2V0KGRldik7CisJCQkJaWYgKHJhd2Rldi0+YmluZGluZyA9PSBOVUxMKQorCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCWVsc2UgeworCQkJCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCQkJCQliaW5kX2RldmljZSgmcnEpOworCQkJCX0KKwkJCX0KKwkJCXVwKCZyYXdfbXV0ZXgpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKworCQkJZG93bigmcmF3X211dGV4KTsKKwkJCWJkZXYgPSByYXdkZXYtPmJpbmRpbmc7CisJCQlpZiAoYmRldikgeworCQkJCXJxLmJsb2NrX21ham9yID0gTUFKT1IoYmRldi0+YmRfZGV2KTsKKwkJCQlycS5ibG9ja19taW5vciA9IE1JTk9SKGJkZXYtPmJkX2Rldik7CisJCQl9IGVsc2UgeworCQkJCXJxLmJsb2NrX21ham9yID0gcnEuYmxvY2tfbWlub3IgPSAwOworCQkJfQorCQkJdXAoJnJhd19tdXRleCk7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnJxLCBzaXplb2YocnEpKSkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJhd19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpb3ZlYyBsb2NhbF9pb3YgPSB7CisJCS5pb3ZfYmFzZSA9IChjaGFyIF9fdXNlciAqKWJ1ZiwKKwkJLmlvdl9sZW4gPSBjb3VudAorCX07CisKKwlyZXR1cm4gZ2VuZXJpY19maWxlX3dyaXRlX25vbG9jayhmaWxlLCAmbG9jYWxfaW92LCAxLCBwcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QgcmF3X2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBpb3ZlYyBsb2NhbF9pb3YgPSB7CisJCS5pb3ZfYmFzZSA9IChjaGFyIF9fdXNlciAqKWJ1ZiwKKwkJLmlvdl9sZW4gPSBjb3VudAorCX07CisKKwlyZXR1cm4gZ2VuZXJpY19maWxlX2Fpb193cml0ZV9ub2xvY2soaW9jYiwgJmxvY2FsX2lvdiwgMSwgJmlvY2ItPmtpX3Bvcyk7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmF3X2ZvcHMgPSB7CisJLnJlYWQJPQlnZW5lcmljX2ZpbGVfcmVhZCwKKwkuYWlvX3JlYWQgPSAJZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorCS53cml0ZQk9CXJhd19maWxlX3dyaXRlLAorCS5haW9fd3JpdGUgPSAJcmF3X2ZpbGVfYWlvX3dyaXRlLAorCS5vcGVuCT0JcmF3X29wZW4sCisJLnJlbGVhc2U9CXJhd19yZWxlYXNlLAorCS5pb2N0bAk9CXJhd19pb2N0bCwKKwkucmVhZHYJPSAJZ2VuZXJpY19maWxlX3JlYWR2LAorCS53cml0ZXYJPSAJZ2VuZXJpY19maWxlX3dyaXRldiwKKwkub3duZXIJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhd19jdGxfZm9wcyA9IHsKKwkuaW9jdGwJPQlyYXdfY3RsX2lvY3RsLAorCS5vcGVuCT0JcmF3X29wZW4sCisJLm93bmVyCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IGNkZXYgcmF3X2NkZXYgPSB7CisJLmtvYmoJPQl7Lm5hbWUgPSAicmF3IiwgfSwKKwkub3duZXIJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJhd19pbml0KHZvaWQpCit7CisJaW50IGk7CisJZGV2X3QgZGV2ID0gTUtERVYoUkFXX01BSk9SLCAwKTsKKworCWlmIChyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgTUFYX1JBV19NSU5PUlMsICJyYXciKSkKKwkJZ290byBlcnJvcjsKKworCWNkZXZfaW5pdCgmcmF3X2NkZXYsICZyYXdfZm9wcyk7CisJaWYgKGNkZXZfYWRkKCZyYXdfY2RldiwgZGV2LCBNQVhfUkFXX01JTk9SUykpIHsKKwkJa29iamVjdF9wdXQoJnJhd19jZGV2LmtvYmopOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBNQVhfUkFXX01JTk9SUyk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmF3X2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgInJhdyIpOworCWlmIChJU19FUlIocmF3X2NsYXNzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGNyZWF0aW5nIHJhdyBjbGFzcy5cbiIpOworCQljZGV2X2RlbCgmcmF3X2NkZXYpOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBNQVhfUkFXX01JTk9SUyk7CisJCWdvdG8gZXJyb3I7CisJfQorCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHJhd19jbGFzcywgTUtERVYoUkFXX01BSk9SLCAwKSwgTlVMTCwgInJhd2N0bCIpOworCisJZGV2ZnNfbWtfY2RldihNS0RFVihSQVdfTUFKT1IsIDApLAorCQkgICAgICBTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCSAgICAgICJyYXcvcmF3Y3RsIik7CisJZm9yIChpID0gMTsgaSA8IE1BWF9SQVdfTUlOT1JTOyBpKyspCisJCWRldmZzX21rX2NkZXYoTUtERVYoUkFXX01BSk9SLCBpKSwKKwkJCSAgICAgIFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywKKwkJCSAgICAgICJyYXcvcmF3JWQiLCBpKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcHJpbnRrKEtFUk5fRVJSICJlcnJvciByZWdpc3RlciByYXcgZGV2aWNlXG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJhd19leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgTUFYX1JBV19NSU5PUlM7IGkrKykKKwkJZGV2ZnNfcmVtb3ZlKCJyYXcvcmF3JWQiLCBpKTsKKwlkZXZmc19yZW1vdmUoInJhdy9yYXdjdGwiKTsKKwlkZXZmc19yZW1vdmUoInJhdyIpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFJBV19NQUpPUiwgMCkpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KHJhd19jbGFzcyk7CisJY2Rldl9kZWwoJnJhd19jZGV2KTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoUkFXX01BSk9SLCAwKSwgTUFYX1JBV19NSU5PUlMpOworfQorCittb2R1bGVfaW5pdChyYXdfaW5pdCk7Cittb2R1bGVfZXhpdChyYXdfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL3Jpby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2UyYmQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggcmlvLXN1YnN5c3RlbS4KKyMKKyMgKEMpIFIuRS5Xb2xmZkBCaXRXaXphcmQubmwgCisjIAorIyBUaGlzIGZpbGUgaXMgR1BMLiBTZWUgb3RoZXIgZmlsZXMgZm9yIHRoZSBmdWxsIEJsdXJiLiBJJ20gbGF6eSB0b2RheS4gCisjCisKK29iai0kKENPTkZJR19SSU8pICs9IHJpby5vCisKK3Jpby1vYmpzIDo9IHJpb19saW51eC5vIHJpb2luaXQubyByaW9ib290Lm8gcmlvY21kLm8gcmlvY3RybC5vIHJpb2ludHIubyBcCisgICAgICAgICAgICByaW9wYXJhbS5vIHJpb3BjaWNvcHkubyByaW9yb3V0ZS5vIHJpb3RhYmxlLm8gcmlvdHR5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vYm9hcmQuaCBiL2RyaXZlcnMvY2hhci9yaW8vYm9hcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM5N2UxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9ib2FyZC5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4gCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogYm9hcmQuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MDcKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjAKKyoqCisqKiAgaWRlbnQgQCgjKWJvYXJkLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYJX19yaW9fYm9hcmRfaF9fCisjZGVmaW5lCV9fcmlvX2JvYXJkX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfYm9hcmRfaF9zY2NzXyA9ICJAKCMpYm9hcmQuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBib2FyZC5oIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlICpoYXJkd2FyZSogb2YgdGhlIGhvc3QgY2FyZHMuCisqKiBJdCBkZXNjcmliZXMgdGhlIG1lbW9yeSBvdmVybGF5IGZvciB0aGUgZHVhbCBwb3J0IFJBTSBhcmVhLgorKi8KKworI2RlZmluZQlEUF9TUkFNMV9TSVpFCTB4N0MwMAorI2RlZmluZQlEUF9TUkFNMl9TSVpFCTB4MDIwMAorI2RlZmluZQlEUF9TUkFNM19TSVpFCTB4NzAwMAorI2RlZmluZQlEUF9TQ1JBVENIX1NJWkUJMHgxMDAwCisjZGVmaW5lCURQX1BBUk1NQVBfQUREUgkweDAxRkUJLyogb2Zmc2V0IGludG8gU1JBTTIgKi8KKyNkZWZpbmUJRFBfU1RBUlRVUF9BRERSCTB4MDFGOAkvKiBvZmZzZXQgaW50byBTUkFNMiAqLworCisvKgorKioJVGhlIHNoYXBlIG9mIHRoZSBIb3N0IENvbnRyb2wgYXJlYSwgYXQgb2Zmc2V0IDB4N0MwMCwgV3JpdGUgT25seQorKi8KK3N0cnVjdCBzX0N0cmwKK3sKKwlCWVRFCURwQ3RsOwkJCQkvKiA3QzAwICovCisJQllURQlEcF9VbnVzZWQyX1sxMjddOworCUJZVEUJRHBJbnRTZXQ7CQkJLyogN0M4MCAqLworCUJZVEUJRHBfVW51c2VkM19bMTI3XTsKKwlCWVRFCURwVHB1UmVzZXQ7CQkJLyogN0QwMCAqLworCUJZVEUJRHBfVW51c2VkNF9bMTI3XTsKKwlCWVRFCURwSW50UmVzZXQ7CQkJLyogN0Q4MCAqLworCUJZVEUJRHBfVW51c2VkNV9bMTI3XTsKK307CisKKy8qCisqKiBUaGUgUFJPTSBkYXRhIGFyZWEgb24gdGhlIGhvc3QgKDB4N0MwMCksIFJlYWQgT25seQorKi8KK3N0cnVjdCBzX1Byb20KK3sKKwlXT1JECURwU2x4Q29kZVsyXTsKKwlXT1JECURwUmV2OworCVdPUkQJRHBfVW51c2VkNl87CisJV09SRAlEcFVuaXFbNF07CisJV09SRAlEcEphaHJlOworCVdPUkQJRHBXb2NoZTsKKwlXT1JECURwSHdGZWF0dXJlWzVdOworCVdPUkQJRHBPZW1JZDsKKwlXT1JECURwU2lnZ3lbMTZdOworfTsKKworLyoKKyoqIFVuaW9uIG9mIHRoZSBDdHJsIGFuZCBQcm9tIGFyZWFzCisqLwordW5pb24gdV9DdHJsUHJvbQkvKiBUaGlzIGlzIHRoZSBjb250cm9sL1BST00gYXJlYSAoMHg3QzAwKSAqLworeworCXN0cnVjdCBzX0N0cmwJRHBDdHJsOworCXN0cnVjdCBzX1Byb20JRHBQcm9tOworfTsKKworLyoKKyoqIFRoZSB0b3AgZW5kIG9mIG1lbW9yeSEKKyovCitzdHJ1Y3Qgc19QYXJtTWFwUwkJLyogQXJlYSBjb250YWluaW5nIFBhcm0gTWFwIFBvaW50ZXIgKi8KK3sKKwlCWVRFCURwX1VudXNlZDhfW0RQX1BBUk1NQVBfQUREUl07CisJV09SRAlEcFBhcm1NYXBBZDsKK307CisKK3N0cnVjdCBzX1N0YXJ0VXBTCit7CisJQllURSAgICBEcF9VbnVzZWQ5X1tEUF9TVEFSVFVQX0FERFJdOworCUJZVEUJRHBfTG9uZ0p1bXBbMHg0XTsKKwlCWVRFCURwX1VudXNlZDEwX1syXTsKKwlCWVRFCURwX1Nob3J0SnVtcFsweDJdOworfTsKKwordW5pb24gdV9TcmFtMlBhcm1NYXAJLyogVGhpcyBpcyB0aGUgdG9wIG9mIG1lbW9yeSAoMHg3RTAwLTB4N0ZGRikgKi8KK3sKKwlCWVRFCURwU3JhbU1lbVtEUF9TUkFNMl9TSVpFXTsKKwlzdHJ1Y3Qgc19QYXJtTWFwUyBEcFBhcm1NYXBTOworCXN0cnVjdCBzX1N0YXJ0VXBTIERwU3RhcnRVcFM7Cit9OworCisvKgorKioJVGhpcyBpcyB0aGUgRFAgUkFNIG92ZXJsYXkuCisqLworc3RydWN0IERwUmFtCit7CisgICAgQllURSAJCSBEcFNyYW0xW0RQX1NSQU0xX1NJWkVdOyAgICAgLyogMDAwMCAtIDdCRkYgKi8KKyAgICB1bmlvbiB1X0N0cmxQcm9tICAgICBEcEN0cmxQcm9tOyAgICAgICAgICAgICAgICAgLyogN0MwMCAtIDdERkYgKi8KKyAgICB1bmlvbiB1X1NyYW0yUGFybU1hcCBEcFNyYW0yUGFybU1hcDsgICAgICAgICAgICAgLyogN0UwMCAtIDdGRkYgKi8KKyAgICBCWVRFCQkgRHBTY3JhdGNoW0RQX1NDUkFUQ0hfU0laRV07IC8qIDgwMDAgLSA4RkZGICovCisgICAgQllURQkJIERwU3JhbTNbRFBfU1JBTTNfU0laRV07ICAgICAvKiA5MDAwIC0gRkZGRiAqLworfTsKKworI2RlZmluZQlEcENvbnRyb2wJRHBDdHJsUHJvbS5EcEN0cmwuRHBDdGwKKyNkZWZpbmUJRHBTZXRJbnQJRHBDdHJsUHJvbS5EcEN0cmwuRHBJbnRTZXQKKyNkZWZpbmUJRHBSZXNldFRwdQlEcEN0cmxQcm9tLkRwQ3RybC5EcFRwdVJlc2V0CisjZGVmaW5lCURwUmVzZXRJbnQJRHBDdHJsUHJvbS5EcEN0cmwuRHBJbnRSZXNldAorCisjZGVmaW5lCURwU2x4CQlEcEN0cmxQcm9tLkRwUHJvbS5EcFNseENvZGUKKyNkZWZpbmUJRHBSZXZpc2lvbglEcEN0cmxQcm9tLkRwUHJvbS5EcFJldgorI2RlZmluZQlEcFVuaXF1ZQlEcEN0cmxQcm9tLkRwUHJvbS5EcFVuaXEKKyNkZWZpbmUJRHBZZWFyCQlEcEN0cmxQcm9tLkRwUHJvbS5EcEphaHJlCisjZGVmaW5lCURwV2VlawkJRHBDdHJsUHJvbS5EcFByb20uRHBXb2NoZQorI2RlZmluZQlEcFNpZ25hdHVyZQlEcEN0cmxQcm9tLkRwUHJvbS5EcFNpZ2d5CisKKyNkZWZpbmUJRHBQYXJtTWFwUglEcFNyYW0yUGFybU1hcC5EcFBhcm1NYXBTLkRwUGFybU1hcEFkCisjZGVmaW5lCURwU3JhbTIJCURwU3JhbTJQYXJtTWFwLkRwU3JhbU1lbQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vYm9vdHBrdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9ib290cGt0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyOWFlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vYm9vdHBrdC5oCkBAIC0wLDAgKzEsNjIgQEAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICBCIE8gTyBUICAgIFAgQSBDIEsgRSBUICAgSCBFIEEgRCBFIFIgICBGIEkgTCBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9wa3RfaAorI2RlZmluZSBfcGt0X2ggMQorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19ib290cGt0X2hfc2NjcyA9ICJAKCMpYm9vdHBrdC5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogT3ZlcmxheWVkIG9udG8gdGhlIERhdGEgZmllbGRzIG9mIGEgcmVndWxhcgorICAgICAqIFBhY2tldAorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBCT09UX1BLVCBCT09UX1BLVCA7CitzdHJ1Y3QgQk9PVF9QS1QgeworICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgc2VxX251bSA7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICBkYXRhWzEwXSA7CisgICAgICAgICAgICAgICAgfSA7CisKKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9icmF0ZXMuaCBiL2RyaXZlcnMvY2hhci9yaW8vYnJhdGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0ZmM4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vYnJhdGVzLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioJCUJSQVRFUy5ICQkJCSAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IEplcmVteSBSb2xscworIERhdGUgICAgOiAxIE5vdiAxOTkwCisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX2JyYXRlc19oCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyICogX2JyYXRlc19oX3NjY3MgPSAiQCgjKWJyYXRlcy5oCTEuNCI7ICovCisjZW5kaWYKKyNkZWZpbmUgX2JyYXRlc19oIDEKKy8qIExpc3Qgb2YgYmF1ZCByYXRlIGRlZmluZXMuIE1vc3QgYXJlIGJvcnJvd2VkIGZyb20gL3Vzci9pbmNsdWRlL3N5cy90ZXJtaW8uaAorKi8KKyNpZm5kZWYgSU5LRVJORUwKKworI2RlZmluZQlCMAkweDAwCisjZGVmaW5lCUI1MAkweDAxCisjZGVmaW5lCUI3NQkweDAyCisjZGVmaW5lCUIxMTAJMHgwMworI2RlZmluZQlCMTM0CTB4MDQKKyNkZWZpbmUJQjE1MAkweDA1CisjZGVmaW5lCUIyMDAJMHgwNgorI2RlZmluZQlCMzAwCTB4MDcKKyNkZWZpbmUJQjYwMAkweDA4CisjZGVmaW5lCUIxMjAwCTB4MDkKKyNkZWZpbmUJQjE4MDAJMHgwYQorI2RlZmluZQlCMjQwMAkweDBiCisjZGVmaW5lCUI0ODAwCTB4MGMKKyNkZWZpbmUJQjk2MDAJMHgwZAorI2RlZmluZQlCMTkyMDAJMHgwZQorI2RlZmluZQlCMzg0MDAJMHgwZgorCisjZW5kaWYKKworLyoKKyoqIFRoZSBmb2xsb3dpbmcgYmF1ZHJhdGVzIG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQKKyoqIG9uIHZhcmlvdXMgVU5JWCBzeXN0ZW1zLgorKiogSWYgdGhleSBhcmUgbm90IHRoZW4gd2UgZGVmaW5lIHRoZW0uCisqKiBJZiB0aGV5IGFyZSB0aGVuIHdlIGRvIG5vdCBkZWZpbmUgdGhlbSA7LSkKKyoqCisqKiBUaGlzIGlzIGFwcGFsbGluZyB0aGF0IHdlIHVzZSBzYW1lIGRlZmluaXRpb25zIGFzIFVOSVgKKyoqIGZvciBvdXIgb3duIGRvd25sb2FkIGNvZGUgYXMgdGhlcmUgaXMgbm8gZ2FydW50ZWUgdGhhdAorKiogQjU3NjAwIHdpbGwgYmUgZGVmaW5lZCBhcyAweDExIGJ5IGEgVU5JWCBzeXN0ZW0uLi4uCisqKiBBcmdoaGhoaCEhISEhISEhISEhISEhCisqLworI2lmICFkZWZpbmVkKEI1NjAwMCkKKyNkZWZpbmUJQjU2MDAwCTB4MTAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQjU3NjAwKQorI2RlZmluZQlCNTc2MDAJMHgxMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChCNjQwMDApCisjZGVmaW5lCUI2NDAwMAkweDEyCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEIxMTUyMDApCisjZGVmaW5lCUIxMTUyMDAJMHgxMworI2VuZGlmCisKKworI2lmICFkZWZpbmVkKEIyMDAwKQorI2RlZmluZSBCMjAwMAkweDE0CisjZW5kaWYKKworCisjZGVmaW5lIE1BWF9SQVRFIEIyMDAwCisKK3N0cnVjdCAgICBiYXVkX3JhdGUgICAgICAgICAgICAvKiBUYWcgZm9yIGJhdWQgcmF0ZXMgKi8KK3sKKyAgICAgLyogc2hvcnQgICAgaG9zdF9yYXRlLCovICAgICAgICAvKiBBcyBwYXNzZWQgYnkgdGhlIGRyaXZlciAqLworICAgICBzaG9ydCAgICBkaXZpc29yLCAgICAgICAgICAvKiBUaGUgZGl2aXNvciAqLworICAgICAgICAgICAgICBwcmVzY2FsZXI7ICAgICAgICAvKiBUaGUgcHJlLXNjYWxlciAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2NoYW4uaCBiL2RyaXZlcnMvY2hhci9yaW8vY2hhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMzA2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2NoYW4uaApAQCAtMCwwICsxLDMzIEBACisvKgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworI2lmbmRlZiBfY2hhbl9oCisjZGVmaW5lIF9jaGFuX2gKKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDUworc3RhdGljIGNoYXIgKl9yaW9fY2hhbl9oX3NjY3MgPSAiQCgjKWNoYW4uaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgTGluazAgICAwCisjZGVmaW5lIExpbmsxICAgMQorI2RlZmluZSBMaW5rMiAgIDIKKyNkZWZpbmUgTGluazMgICAzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9jaXJydXMuaCBiL2RyaXZlcnMvY2hhci9yaW8vY2lycnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwNTZhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY2lycnVzLmgKQEAgLTAsMCArMSw0NjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioJCUNJUlJVUy5ICQkJCSAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IEplcmVteSBSb2xscworIERhdGUgICAgOiAzIEF1ZyAxOTkwCisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX2NpcnJ1c19oCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyKiBfY2lycnVzX2hfc2NjcyA9ICJAKCMpY2lycnVzLmgJMS4xNiI7ICovCisjZW5kaWYKKyNkZWZpbmUgX2NpcnJ1c19oIDEKKworI2lmZGVmIFJUQQorI2RlZmluZQlUT19VQVJUCVJYCisjZGVmaW5lIFRPX0RSSVZFUiBUWAorI2VuZGlmCisKKyNpZmRlZiBIT1NUCisjZGVmaW5lCVRPX1VBUlQJVFgKKyNkZWZpbmUgVE9fRFJJVkVSIFJYCisjZW5kaWYKKyNpZmRlZiBSVEEKKy8qIE1pc2NlbGxhbmVvdXMgZGVmaW5lcyBmb3IgQ0lSUlVTIGFkZHJlc3NlcyBhbmQgcmVsYXRlZCBsb2dpYyBmb3IKKyAgIGludGVycnVwdHMgZXRjLgorKi8KKyNkZWZpbmUJTUFQKGEpCQkoKHNob3J0ICopKGNpcnJ1c19iYXNlICsgKGEpKSkKKyNkZWZpbmUgb3V0cChhLGIpCSgqTUFQIChhKSA9KGIpKQorI2RlZmluZSBpbnAoYSkJCSgoKk1BUCAoYSkpICYgMHhmZikKKyNkZWZpbmUJQ0lSUlVTX0ZJUlNUCShzaG9ydCopMHg3MzAwCisjZGVmaW5lCUNJUlJVU19TRUNPTkQJKHNob3J0KikweDcyMDAKKyNkZWZpbmUJQ0lSUlVTX1RISVJECShzaG9ydCopMHg3MTAwCisjZGVmaW5lCUNJUlJVU19GT1VSVEgJKHNob3J0KikweDcwMDAKKyNkZWZpbmUJUE9SVFNfT05fQ0lSUlVTCTQKKyNkZWZpbmUJQ0lSUlVTX0ZJRk9fU0laRQkxMgorI2RlZmluZQlTUEFDRQkJMHgyMAorI2RlZmluZQlUQUIJCTB4MDkKKyNkZWZpbmUJTElORV9GRUVECTB4MGEKKyNkZWZpbmUJQ0FSUklBR0VfUkVUVVJOCTB4MGQKKyNkZWZpbmUJQkFDS1NQQUNFCTB4MDgKKyNkZWZpbmUJU1BBQ0VTX0lOX1RBQlMJOAorI2RlZmluZQlTRU5EX0VTQ0FQRQkweDAwCisjZGVmaW5lIFNUQVJUX0JSRUFLCTB4ODEKKyNkZWZpbmUJVElNRVJfVElDSwkweDgyCisjZGVmaW5lIFNUT1BfQlJFQUsJMHg4MworI2RlZmluZSBCQVNFKGEpICgoYSkgPCA0ID8gKHNob3J0KilDSVJSVVNfRklSU1QgOiAoKGEpIDwgOCA/IChzaG9ydCAqKUNJUlJVU19TRUNPTkQgOiAoKGEpIDwgMTIgPyAoc2hvcnQqKUNJUlJVU19USElSRCA6IChzaG9ydCAqKUNJUlJVU19GT1VSVEgpKSkKKyNkZWZpbmUgdHhhY2sxCSgoc2hvcnQgKikweDcxMDQpIAorI2RlZmluZSByeGFjazEJKChzaG9ydCAqKTB4NzEwMikgCisjZGVmaW5lIG1kYWNrMSAgKChzaG9ydCAqKTB4NzEwNikKKyNkZWZpbmUgdHhhY2syICAoKHNob3J0ICopMHg3MDA2KSAKKyNkZWZpbmUgcnhhY2syCSgoc2hvcnQgKikweDcwMDQpIAorI2RlZmluZSBtZGFjazIgICgoc2hvcnQgKikweDcxMDApIAorI2RlZmluZSBpbnRfbGF0Y2ggICAgICAgKChzaG9ydCAqKSAweDc4MDApCisjZGVmaW5lIGludF9zdGF0dXMgICAgICAoKHNob3J0ICopIDB4N2MwMCkgCisjZGVmaW5lIHR4MV9wZW5kaW5nICAgICAweDIwIAorI2RlZmluZSByeDFfcGVuZGluZyAgICAgMHgxMCAKKyNkZWZpbmUgbWQxX3BlbmRpbmcgICAgIDB4NDAgCisjZGVmaW5lIHR4Ml9wZW5kaW5nICAgICAweDAyIAorI2RlZmluZSByeDJfcGVuZGluZyAgICAgMHgwMSAKKyNkZWZpbmUgbWQyX3BlbmRpbmcgICAgIDB4NDAgCisjZGVmaW5lIG1vZHVsZTFfYml0cwkweDA3CisjZGVmaW5lIG1vZHVsZTFfbW9kZXJuCTB4MDgKKyNkZWZpbmUgbW9kdWxlMl9iaXRzCTB4NzAKKyNkZWZpbmUgbW9kdWxlMl9tb2Rlcm4JMHg4MAorI2RlZmluZSBtb2R1bGVfYmxhbmsJMHhmCisjZGVmaW5lIHJzMjMyX2QyNQkweDAKKyNkZWZpbmUJcnMyMzJfcmo0NQkweDEKKyNkZWZpbmUgcnM0MjJfZDI1CTB4MworI2RlZmluZSBwYXJhbGxlbAkweDUKKworI2RlZmluZQlDTEswCTB4MDAKKyNkZWZpbmUgQ0xLMQkweDAxCisjZGVmaW5lIENMSzIJMHgwMgorI2RlZmluZSBDTEszCTB4MDMKKyNkZWZpbmUgQ0xLNAkweDA0CisKKyNkZWZpbmUgQ0lSUlVTX1JFVkMgICAgMHg0MgorI2RlZmluZSBDSVJSVVNfUkVWRSAgICAweDQ0CisKKyNkZWZpbmUJVFVSTk9OCTEKKyNkZWZpbmUgVFVSTk9GRiAwCisKKy8qIFRoZSBsaXN0IG9mIENJUlJVUyByZWdpc3RlcnMuIAorICAgTkIuIFRoZXNlIHJlZ2lzdGVycyBhcmUgcmVsYXRpdmUgdmFsdWVzIG9uIDggYml0IGJvdW5kYXJpZXMgd2hlcmVhcworICAgb24gdGhlIFJUQSdzIHRoZSBDSVJSVVMgcmVnaXN0ZXJzIGFyZSBvbiB3b3JkIGJvdW5kYXJpZXMuIFVzZSBwb2ludGVyCisgICBhcml0aG1ldGljIChzaG9ydCAqKSB0byBvYnRhaW4gdGhlIHJlYWwgYWRkcmVzc2VzIHJlcXVpcmVkICovCisjZGVmaW5lIGNjcgkweDA1CS8qIENoYW5uZWwgQ29tbWFuZCBSZWdpc3RlciAgICAgKi8KKyNkZWZpbmUgaWVyCTB4MDYJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAqLworI2RlZmluZSBjb3IxCTB4MDgJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAgICAqLworI2RlZmluZSBjb3IyCTB4MDkJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAgICAqLworI2RlZmluZSBjb3IzCTB4MGEJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMyAgICAqLworI2RlZmluZSBjb3I0CTB4MWUJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgNCAgICAqLworI2RlZmluZQljb3I1CTB4MWYJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgNQkqLworCisjZGVmaW5lIGNjc3IJMHgwYgkvKiBDaGFubmVsIENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIHJkY3IJMHgwZQkvKiBSZWNlaXZlIERhdGEgQ291bnQgUmVnaXN0ZXIgICovCisjZGVmaW5lIHRkY3IJMHgxMgkvKiBUcmFuc21pdCBEYXRhIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIG1jb3IxCTB4MTUJLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lIG1jb3IyCTB4MTYJLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdzaXRlciAyICovCisKKyNkZWZpbmUgbGl2cgkweDE4CS8qIExvY2FsIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgc2NocjEJMHgxYQkvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAxICovCisjZGVmaW5lIHNjaHIyCTB4MWIJLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBzY2hyMwkweDFjCS8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgc2NocjQJMHgxZAkvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciA0ICovCisKKyNkZWZpbmUgcnRyCTB4MjAgICAgLyogUmVjZWl2ZSBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBydHByCTB4MjEJLyogUmVjZWl2ZSBUaW1lb3V0IFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZSBsbmMJMHgyNAkvKiBMbmV4dCBjaGFyYWN0ZXIgKi8KKworI2RlZmluZSByaXZyCTB4NDMJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICAgICovCisjZGVmaW5lIHRpdnIJMHg0MgkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgbWl2cgkweDQxCS8qIE1vZGVtIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgICAgICAqLworI2RlZmluZSBnZnJjcgkweDQwCS8qIEdsb2JhbCBGaXJtd2FyZSBSZXZpc2lvbiBjb2RlIFJlZyAgICAqLworI2RlZmluZSByaWNyCTB4NDQJLyogUmVjZWl2ZSBJbnRlcnJ1cHRpbmcgQ2hhbm5lbCBSZWcgICAgICovCisjZGVmaW5lIHRpY3IJMHg0NQkvKiBUcmFuc21pdCBJbnRlcnJ1cHRpbmcgQ2hhbm5lbCBSZWcgICAgKi8KKyNkZWZpbmUgbWljcgkweDQ2CS8qIE1vZGVtIEludGVycnVwdGluZyBDaGFubmVsIFJlZ2lzdGVyICAqLworCisjZGVmaW5lIGdjcgkweDRiCS8qIEdsb2JhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyKi8KKyNkZWZpbmUgbWlzciAgICAweDRjICAgIC8qIE1vZGVtIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKworI2RlZmluZSByYnVzcgkweDU5CisjZGVmaW5lIHRidXNyCTB4NWEKKyNkZWZpbmUgbWJ1c3IJMHg1YgorCisjZGVmaW5lIGVvaXIJMHg2MAkvKiBFbmQgT2YgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIHJkc3IJMHg2MgkvKiBSZWNlaXZlIERhdGEgLyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgdGRyCTB4NjMJLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBzdnJyCTB4NjcJLyogU2VydmljZSBSZXF1ZXN0IFJlZ2lzdGVyICovCisKKyNkZWZpbmUgY2FyCTB4NjgJLyogQ2hhbm5lbCBBY2Nlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgbWlyCTB4NjkJLyogTW9kZW0gSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIHRpcgkweDZhCS8qIFRyYW5zbWl0IEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSByaXIJMHg2YgkvKiBSZWNlaXZlIEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSBtc3ZyMQkweDZjCS8qIE1vZGVtIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciAxICovCisjZGVmaW5lIG1zdnIyCTB4NmQJLyogTW9kZW0gU2lnbmFsIFZhbHVlIFJlZ2lzdGVyIDIqLworI2RlZmluZSBwc3ZyCTB4NmYJLyogUHJpbnRlciBTaWduYWwgVmFsdWUgUmVnaXN0ZXIqLworCisjZGVmaW5lIHRicHIJMHg3MgkvKiBUcmFuc21pdCBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyICovCisjZGVmaW5lIHRjb3IJMHg3NgkvKiBUcmFuc21pdCBDbG9jayBPcHRpb24gUmVnaXN0ZXIgKi8KKworI2RlZmluZSByYnByCTB4NzgJLyogUmVjZWl2ZSBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyICovCisjZGVmaW5lIHJiZXIJMHg3YQkvKiBSZWNlaXZlIEJhdWQgUmF0ZSBFeHRlbnNpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgcmNvcgkweDdjCS8qIFJlY2VpdmUgQ2xvY2sgT3B0aW9uIFJlZ2lzdGVyKi8KKyNkZWZpbmUgcHByCTB4N2UJLyogUHJlc2NhbGFyIFBlcmlvZCBSZWdpc3RlciAgICAqLworCisvKiBNaXNjIHJlZ2lzdGVycyB1c2VkIGZvciBmb3JjaW5nIHRoZSAxNDAwIG91dCBvZiBpdHMgcmVzZXQgd29lcyAqLworI2RlZmluZSBhaXJsCTB4NmQKKyNkZWZpbmUgYWlybQkweDZlCisjZGVmaW5lIGFpcmgJMHg2ZgorI2RlZmluZSBidGNyCTB4NjYKKyNkZWZpbmUgbXRjcgkweDZjCisjZGVmaW5lIHRiZXIJMHg3NAorCisjZW5kaWYJCQkJLyogI2lmZGVmIFJUQSAqLworCisKKy8qIEJpdCBmaWVsZHMgZm9yIHBhcnRpY3VsYXIgcmVnaXN0ZXJzICovCisKKy8qIEdDUiAqLworI2RlZmluZSBHQ1JfU0VSSUFMCTB4MDAJLyogQ29uZmlndXJlIGFzIHNlcmlhbCBjaGFubmVsICovCisjZGVmaW5lIEdDUl9QQVJBTExFTAkweDgwCS8qIENvbmZpZ3VyZSBhcyBwYXJhbGxlbCBjaGFubmVsICovCisKKy8qIFJEU1IgLSB3aGVuIHN0YXR1cyByZWFkIGZyb20gRklGTyAqLworI2RlZmluZQlSRFNSX0JSRUFLCQkweDA4CS8qIEJyZWFrIHJlY2VpdmVkICovCisjZGVmaW5lIFJEU1JfVElNRU9VVCAgICAJMHg4MCAgICAvKiBObyBuZXcgZGF0YSB0aW1lb3V0ICovCisjZGVmaW5lIFJEU1JfU0MxICAJICAJMHgxMCAgICAvKiBTcGVjaWFsIGNoYXIgMSAodHggWE9OKSBtYXRjaGVkICovCisjZGVmaW5lIFJEU1JfU0MyICAJICAJMHgyMCAgICAvKiBTcGVjaWFsIGNoYXIgMiAodHggWE9GRikgbWF0Y2hlZCAqLworI2RlZmluZSBSRFNSX1NDMTJfTUFTSwkgIAkweDMwICAgIC8qIE1hc2sgZm9yIHNwZWNpYWwgY2hhcnMgMSBhbmQgMiAqLworCisvKiBQUFIgKi8KKyNkZWZpbmUgUFBSX0RFRkFVTFQJMHgzMQkvKiBEZWZhdWx0IHZhbHVlIC0gZm9yIGEgMjVNaHogY2xvY2sgZ2l2ZXMKKwkJCQkgICBhIHRpbWVvdXQgcGVyaW9kIG9mIDFtcyAqLworCisvKiBMSVZSICovCisjZGVmaW5lCUxJVlJfRVhDRVBUSU9OCTB4MDcJLyogUmVjZWl2ZSBleGNlcHRpb24gaW50ZXJydXB0ICovCisKKy8qIENDUiAqLworI2RlZmluZQlDQ1JfUkVTRVQJMHg4MAkvKiBSZXNldCBjaGFubmVsICovCisjZGVmaW5lCUNDUl9DSEFOR0UJMHg0ZQkvKiBDT1IncyBoYXZlIGNoYW5nZWQgLSBOQiBhbHdheXMgY2hhbmdlIGFsbAorCQkJCSAgIENPUidzICovCisjZGVmaW5lCUNDUl9XRkxVU0gJMHg4MgkvKiBGbHVzaCB0cmFuc21pdCBGSUZPIGFuZCBUU1IgLyBUSFIgKi8KKworI2RlZmluZQlDQ1JfU0VORFNDMQkweDIxCS8qIFNlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgb25lICovCisjZGVmaW5lIENDUl9TRU5EU0MyCTB4MjIJLyogU2VuZCBzcGVjaWFsIGNoYXJhY3RlciB0d28gKi8KKyNkZWZpbmUgQ0NSX1NFTkRTQzMJMHgyMwkvKiBTZW5kIHNwZWNpYWwgY2hhcmFjdGVyIHRocmVlICovCisjZGVmaW5lIENDUl9TRU5EU0M0CTB4MjQJLyogU2VuZCBzcGVjaWFsIGNoYXJhY3RlciBmb3VyICovCisKKyNkZWZpbmUgQ0NSX1RFTkFCTEUJMHgxOAkvKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUJQ0NSX1RESVNBQkxFCTB4MTQJLyogRGlzYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZSBDQ1JfUkVOQUJMRQkweDEyCS8qIEVuYWJsZSByZWNlaXZlciAqLworI2RlZmluZSBDQ1JfUkRJU0FCTEUJMHgxMQkvKiBEaXNhYmxlIHJlY2VpdmVyICovCisKKyNkZWZpbmUJQ0NSX1JFQURZCTB4MDAJLyogQ0NSIGlzIHJlYWR5IGZvciBhbm90aGVyIGNvbW1hbmQgKi8KKworLyogQ0NTUiAqLworI2RlZmluZSBDQ1NSX1RYRU5BQkxFCTB4MDgJLyogVHJhbnNtaXR0ZXIgZW5hYmxlICovCisjZGVmaW5lIENDU1JfUlhFTkFCTEUJMHg4MAkvKiBSZWNlaXZlciBlbmFibGUgKi8KKyNkZWZpbmUgQ0NTUl9UWEZMT1dPRkYJMHgwNAkvKiBUcmFuc21pdCBmbG93IG9mZiAqLworI2RlZmluZSBDQ1NSX1RYRkxPV09OCTB4MDIJLyogVHJhbnNtaXQgZmxvdyBvbiAqLworCisvKiBTVlJSICovCisjZGVmaW5lCVNWUlJfUkVDRUlWRQkweDAxCS8qIFJlY2VpdmUgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUJU1ZSUl9UUkFOU01JVAkweDAyCS8qIFRyYW5zbWl0IGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lCVNWUlJfTU9ERU0JMHgwNAkvKiBNb2RlbSBpbnRlcnJ1cHQgcGVuZGluZyAqLworCisvKiBDQVIgKi8KKyNkZWZpbmUgQ0FSX1BPUlRTCTB4MDMJLyogQml0IGZpZWxkcyBmb3IgcG9ydHMgKi8KKworLyogSUVSICovCisjZGVmaW5lCUlFUl9NT0RFTQkweDgwCS8qIENoYW5nZSBpbiBtb2RlbSBzdGF0dXMgKi8KKyNkZWZpbmUJSUVSX1JFQ0VJVkUJMHgxMAkvKiBHb29kIGRhdGEgLyBkYXRhIGV4Y2VwdGlvbiAqLworI2RlZmluZSBJRVJfVFJBTlNNSVRSCTB4MDQJLyogVHJhbnNtaXQgcmVhZHkgKEZJRk8gZW1wdHkpICovCisjZGVmaW5lCUlFUl9UUkFOU01JVEUJMHgwMgkvKiBUcmFuc21pdCBlbXB0eSAqLworI2RlZmluZSBJRVJfVElNRU9VVAkweDAxCS8qIFRpbWVvdXQgb24gbm8gZGF0YSAqLworCisjZGVmaW5lCUlFUl9ERUZBVUxUCTB4OTQJLyogRGVmYXVsdCB2YWx1ZXMgKi8KKyNkZWZpbmUgSUVSX1BBUkFMTEVMICAgIDB4ODQgICAgLyogRGVmYXVsdCBmb3IgUGFyYWxsZWwgKi8KKyNkZWZpbmUJSUVSX0VNUFRZCTB4OTIJLyogVHJhbnNtaXR0ZXIgZW1wdHkgcmF0aGVyIHRoYW4gcmVhZHkgKi8KKworLyogQ09SMSAtIERyaXZlciBvbmx5ICovCisjZGVmaW5lCUNPUjFfSU5QQ0sJMHgxMAkvKiBDaGVjayBwYXJpdHkgb2YgcmVjZWl2ZWQgY2hhcmFjdGVycyAqLworCisvKiBDT1IxIC0gZHJpdmVyIGFuZCBSVEEgKi8KKyNkZWZpbmUJQ09SMV9PREQJMHg4MAkvKiBPZGQgcGFyaXR5ICovCisjZGVmaW5lIENPUjFfRVZFTgkweDAwCS8qIEV2ZW4gcGFyaXR5ICovCisjZGVmaW5lCUNPUjFfTk9QCTB4MDAJLyogTm8gcGFyaXR5ICovCisjZGVmaW5lCUNPUjFfRk9SQ0UJMHgyMAkvKiBGb3JjZSBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9OT1JNQUwJMHg0MAkvKiBXaXRoIHBhcml0eSAqLworI2RlZmluZQlDT1IxXzFTVE9QCTB4MDAJLyogMSBzdG9wIGJpdCAqLworI2RlZmluZQlDT1IxXzE1U1RPUAkweDA0CS8qIDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV8yU1RPUAkweDA4CS8qIDIgc3RvcCBiaXRzICovCisjZGVmaW5lCUNPUjFfNUJJVFMJMHgwMAkvKiA1IGRhdGEgYml0cyAqLworI2RlZmluZQlDT1IxXzZCSVRTCTB4MDEJLyogNiBkYXRhIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV83QklUUwkweDAyCS8qIDcgZGF0YSBiaXRzICovCisjZGVmaW5lCUNPUjFfOEJJVFMJMHgwMwkvKiA4IGRhdGEgYml0cyAqLworCisjZGVmaW5lIENPUjFfSE9TVCAgICAgICAweGVmICAgIC8qIFNhZmUgaG9zdCBiaXRzICovCisKKy8qIFJUQSBvbmx5ICovCisjZGVmaW5lIENPUjFfQ0lOUENLICAgICAweDAwICAgIC8qIENoZWNrIHBhcml0eSBvZiByZWNlaXZlZCBjaGFyYWN0ZXJzICovCisjZGVmaW5lIENPUjFfQ05JTlBDSyAgICAweDEwICAgIC8qIERvbid0IGNoZWNrIHBhcml0eSAqLworCisvKiBDT1IyIGJpdHMgZm9yIGJvdGggUlRBIGFuZCBkcml2ZXIgdXNlICovCisjZGVmaW5lCUNPUjJfSVhBTlkJMHg4MAkvKiBJWEFOWSAtIGFueSBjaGFyYWN0ZXIgaXMgWE9OICovCisjZGVmaW5lCUNPUjJfSVhPTgkweDQwCS8qIElYT04gLSBlbmFibGUgdHggc29mdCBmbG93Y29udHJvbCAqLworI2RlZmluZQlDT1IyX1JUU0ZMT1cJMHgwMgkvKiBFbmFibGUgdHggaGFyZHdhcmUgZmxvdyBjb250cm9sICovCisKKy8qIEFkZGl0aW9uYWwgZHJpdmVyIGJpdHMgKi8KKyNkZWZpbmUJQ09SMl9IVVBDTAkweDIwCS8qIEhhbmcgdXAgb24gY2xvc2UgKi8KKyNkZWZpbmUJQ09SMl9DVFNGTE9XCTB4MDQJLyogRW5hYmxlIHJ4IGhhcmR3YXJlIGZsb3cgY29udHJvbCAqLworI2RlZmluZQlDT1IyX0lYT0ZGCTB4MDEJLyogRW5hYmxlIHJ4IHNvZnR3YXJlIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBDT1IyX0RUUkZMT1cJMHgwOAkvKiBFbmFibGUgdHggaGFyZHdhcmUgZmxvdyBjb250cm9sICovCisKKy8qIFJUQSB1c2Ugb25seSAqLworI2RlZmluZSBDT1IyX0VUQwkweDIwCS8qIEVtYmVkZGVkIHRyYW5zbWl0IG9wdGlvbnMgKi8KKyNkZWZpbmUJQ09SMl9MT0NBTAkweDEwCS8qIExvY2FsIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUJQ09SMl9SRU1PVEUJMHgwOAkvKiBSZW1vdGUgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZQlDT1IyX0hPU1QJMHhjMgkvKiBTYWZlIGhvc3QgYml0cyAqLworCisvKiBDT1IzIC0gUlRBIHVzZSBvbmx5ICovCisjZGVmaW5lCUNPUjNfU0NEUk5HCTB4ODAJLyogRW5hYmxlIHNwZWNpYWwgY2hhciBkZXRlY3QgZm9yIHJhbmdlICovCisjZGVmaW5lCUNPUjNfU0NEMzQJMHg0MAkvKiBTcGVjaWFsIGNoYXJhY3RlciBkZXRlY3QgZm9yIFNDSFIncyAzICsgNCAqLworI2RlZmluZQlDT1IzX0ZDVAkweDIwCS8qIEZsb3cgY29udHJvbCB0cmFuc3BhcmVuY3kgKi8KKyNkZWZpbmUJQ09SM19TQ0QxMgkweDEwCS8qIFNwZWNpYWwgY2hhcmFjdGVyIGRldGVjdCBmb3IgU0NIUidzIDEgKyAyICovCisjZGVmaW5lCUNPUjNfRklGTzEyCTB4MGMJLyogMTIgY2hhcnMgZm9yIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQ09SM19GSUZPMTAgICAgIDB4MGEgICAgLyogMTAgY2hhcnMgZm9yIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQ09SM19GSUZPOCAgICAgIDB4MDggICAgLyogOCBjaGFycyBmb3IgcmVjZWl2ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSBDT1IzX0ZJRk82ICAgICAgMHgwNiAgICAvKiA2IGNoYXJzIGZvciByZWNlaXZlIEZJRk8gdGhyZXNob2xkICovCisKKyNkZWZpbmUgQ09SM19USFJFU0hPTEQgIENPUjNfRklGTzgJLyogTVVTVCBCRSBMRVNTIFRIQU4gTUNPUl9USFJFU0hPTEQgKi8KKworI2RlZmluZQlDT1IzX0RFRkFVTFQJKENPUjNfRkNUIHwgQ09SM19USFJFU0hPTEQpCisJCQkJLyogRGVmYXVsdCBiaXRzIGZvciBDT1IzICovCisKKy8qIENPUjQgZHJpdmVyIGFuZCBSVEEgdXNlICovCisjZGVmaW5lCUNPUjRfSUdOQ1IJMHg4MAkvKiBUaHJvdyBhd2F5IENSJ3Mgb24gaW5wdXQgKi8KKyNkZWZpbmUJQ09SNF9JQ1JOTAkweDQwCS8qIE1hcCBDUiAtPiBOTCBvbiBpbnB1dCAqLworI2RlZmluZQlDT1I0X0lOTENSCTB4MjAJLyogTWFwIE5MIC0+IENSIG9uIGlucHV0ICovCisjZGVmaW5lCUNPUjRfSUdOQlJLCTB4MTAJLyogSWdub3JlIEJyZWFrICovCisjZGVmaW5lCUNPUjRfTkJSS0lOVAkweDA4CS8qIE5vIGludGVycnVwdCBvbiBicmVhayAoLUJSS0lOVCkgKi8KKyNkZWZpbmUgQ09SNF9SQUlTRU1PRAkweDAxCS8qIFJhaXNlIG1vZGVtIG91dHB1dCBsaW5lcyBvbiBub24temVybyBiYXVkICovCisKKworLyogQ09SNCBkcml2ZXIgb25seSAqLworI2RlZmluZSBDT1I0X0lHTlBBUgkweDA0CS8qIElHTlBBUiAoaWdub3JlIGNoYXJhY3RlcnMgd2l0aCBlcnJvcnMpICovCisjZGVmaW5lIENPUjRfUEFSTVJLCTB4MDIJLyogUEFSTVJLICovCisKKyNkZWZpbmUgQ09SNF9IT1NUCTB4ZjgJLyogU2FmZSBob3N0IGJpdHMgKi8KKworLyogQ09SNCBSVEEgb25seSAqLworI2RlZmluZSBDT1I0X0NJR05QQVIJMHgwMgkvKiBUaHJvd24gYXdheSBiYWQgY2hhcmFjdGVycyAqLworI2RlZmluZSBDT1I0X0NQQVJNUksJMHgwNAkvKiBQQVJNUksgY2hhcmFjdGVycyAqLworI2RlZmluZSBDT1I0X0NOUEFSTVJLCTB4MDMJLyogRG9uJ3QgUEFSTVJLICovCisKKy8qIENPUjUgZHJpdmVyIGFuZCBSVEEgdXNlICovCisjZGVmaW5lCUNPUjVfSVNUUklQCTB4ODAJLyogU3RyaXAgaW5wdXQgY2hhcnMgdG8gNyBiaXRzICovCisjZGVmaW5lCUNPUjVfTE5FCTB4NDAJLyogRW5hYmxlIExORVhUIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUJQ09SNV9DTU9FCTB4MjAJLyogTWF0Y2ggZ29vZCBhbmQgZXJyb3JlZCBjaGFyYWN0ZXJzICovCisjZGVmaW5lCUNPUjVfT05MQ1IJMHgwMgkvKiBOTCAtPiBDUiBOTCBvbiBvdXRwdXQgKi8KKyNkZWZpbmUJQ09SNV9PQ1JOTAkweDAxCS8qIENSIC0+IE5MIG9uIG91dHB1dCAqLworCisvKgorKiogU3BhcmUgYml0cyAtIHRoZXNlIGFyZSBub3QgdXNlZCBpbiB0aGUgQ0lSUlVTIHJlZ2lzdGVycywgc28gd2UgdXNlCisqKiB0aGVtIHRvIHNldCB2YXJpb3VzIG90aGVyIGZlYXR1cmVzLgorKi8KKy8qCisqKiB0c3RvcCBhbmQgdGJ1c3kgaW5kaWNhdGlvbgorKi8KKyNkZWZpbmUJQ09SNV9UU1RBVEVfT04JMHgwOAkvKiBUdXJuIG9uIG1vbml0b3Jpbmcgb2YgdGJ1c3kgYW5kIHRzdG9wICovCisjZGVmaW5lCUNPUjVfVFNUQVRFX09GRgkweDA0CS8qIFR1cm4gb2ZmIG1vbml0b3Jpbmcgb2YgdGJ1c3kgYW5kIHRzdG9wICovCisvKgorKiogVEFCMworKi8KKyNkZWZpbmUJQ09SNV9UQUIzCTB4MTAJLyogVEFCMyBtb2RlICovCisKKyNkZWZpbmUJQ09SNV9IT1NUCTB4YzMJLyogU2FmZSBob3N0IGJpdHMgKi8KKworLyogQ0NTUiAqLworI2RlZmluZQlDQ1NSX1RYRkxPRkYJMHgwNAkvKiBUeCBpcyB4b2ZmZWQgKi8KKworLyogTVNWUjEgKi8KKy8qIE5CLiBEVFIgLyBDRCBzd2FwcGVkIGZyb20gQ2lycnVzIHNwZWMgYXMgdGhlIHBpbnMgYXJlIGFsc28gcmV2ZXJzZWQgb24gdGhlCisgICBSVEEuIFRoaXMgaXMgYmVjYXVzZSBvdGhlcndpc2UgRENEIHdvdWxkIGdldCBsb3N0IG9uIHRoZSAxIHBhcmFsbGVsIC8gMworICAgc2VyaWFsIG9wdGlvbi4KKyovCisjZGVmaW5lCU1TVlIxX0NECTB4ODAJLyogQ0QgKERTUiBvbiBDaXJydXMpICovCisjZGVmaW5lCU1TVlIxX1JUUwkweDQwCS8qIFJUUyAoQ1RTIG9uIENpcnJ1cykgKi8KKyNkZWZpbmUJTVNWUjFfUkkJMHgyMAkvKiBSSSAqLworI2RlZmluZQlNU1ZSMV9EVFIJMHgxMAkvKiBEVFIgKENEIG9uIENpcnJ1cykgKi8KKyNkZWZpbmUJTVNWUjFfQ1RTCTB4MDEJLyogQ1RTIG91dHB1dCBwaW4gKFJUUyBvbiBDaXJydXMpICovCisvKiBOZXh0IHR3byB1c2VkIHRvIGluZGljYXRlIHN0YXRlIG9mIHRidXN5IGFuZCB0c3RvcCB0byBkcml2ZXIgKi8KKyNkZWZpbmUJTVNWUjFfVFNUT1AJMHgwOAkvKiBTZXQgaWYgcG9ydCBmbG93IGNvbnRyb2xsZWQgKi8KKyNkZWZpbmUJTVNWUjFfVEVNUFRZCTB4MDQJLyogU2V0IGlmIHBvcnQgdHggYnVmZmVyIGVtcHR5ICovCisKKyNkZWZpbmUJTVNWUjFfSE9TVAkweGYzCS8qIFRoZSBiaXRzIHRoZSBob3N0IHdhbnRzICovCisKKy8qIE1TVlIyICovCisjZGVmaW5lCU1TVlIyX0RTUgkweDAyCS8qIERTUiBvdXRwdXQgcGluIChEVFIgb24gQ2lycnVzKSAqLworCisvKiBNQ09SICovCisjZGVmaW5lCU1DT1JfQ0QJICAgICAgICAweDgwCS8qIENEIChEU1Igb24gQ2lycnVzKSAqLworI2RlZmluZQlNQ09SX1JUUwkweDQwCS8qIFJUUyAoQ1RTIG9uIENpcnJ1cykgKi8KKyNkZWZpbmUJTUNPUl9SSQkgICAgICAgIDB4MjAJLyogUkkgKi8KKyNkZWZpbmUJTUNPUl9EVFIJMHgxMAkvKiBEVFIgKENEIG9uIENpcnJ1cykgKi8KKworI2RlZmluZSBNQ09SX0RFRkFVTFQgICAgKE1DT1JfQ0QgfCBNQ09SX1JUUyB8IE1DT1JfUkkgfCBNQ09SX0RUUikKKyNkZWZpbmUgTUNPUl9GVUxMTU9ERU0gIE1DT1JfREVGQVVMVAorI2RlZmluZSBNQ09SX1JKNDUgICAgICAgKE1DT1JfQ0QgfCBNQ09SX1JUUyB8IE1DT1JfRFRSKQorI2RlZmluZSBNQ09SX1JFU1RSSUNURUQgKE1DT1JfQ0QgfCBNQ09SX1JUUykKKworLyogTW9yZSBNQ09SIC0gSC9XIEhhbmRzaGFrZSAoZmxvd2NvbnRyb2wpIHN0dWZmICovCisjZGVmaW5lCU1DT1JfVEhSRVNIOAkweDA4CS8qIGVpZ2h0IGNoYXJhY3RlcnMgdGhlbiB3ZSBzdG9wICovCisjZGVmaW5lCU1DT1JfVEhSRVNIOQkweDA5CS8qIG5pbmUgY2hhcmFjdGVycyB0aGVuIHdlIHN0b3AgKi8KKyNkZWZpbmUJTUNPUl9USFJFU0gxMAkweDBBCS8qIHRlbiBjaGFyYWN0ZXJzIHRoZW4gd2Ugc3RvcCAqLworI2RlZmluZQlNQ09SX1RIUkVTSDExCTB4MEIJLyogZWxldmVuIGNoYXJhY3RlcnMgdGhlbiB3ZSBzdG9wICovCisKKyNkZWZpbmUJTUNPUl9USFJFU0hCSVRTIDB4MEYJLyogbWFzayBmb3IgQU5EaW5nIG91dCB0aGUgYWJvdmUgKi8KKworI2RlZmluZQlNQ09SX1RIUkVTSE9MRAlNQ09SX1RIUkVTSDkgLyogTVVTVCBCRSBHUkVBVEVSIFRIQU4gQ09SM19USFJFU0hPTEQgKi8KKworCisvKiBSVFBSICovCisjZGVmaW5lIFJUUFJfREVGQVVMVAkweDAyCS8qIERlZmF1bHQgKi8KKworCisvKiBEZWZpbmVzIGZvciB0aGUgc3Vic2NyaXB0cyBvZiBhIENPTkZJRyBwYWNrZXQgKi8KKyNkZWZpbmUJQ09ORklHX0NPUjEJMQkvKiBPcHRpb24gcmVnaXN0ZXIgMSAqLworI2RlZmluZQlDT05GSUdfQ09SMgkyCS8qIE9wdGlvbiByZWdpc3RlciAyICovCisjZGVmaW5lCUNPTkZJR19DT1I0CTMJLyogT3B0aW9uIHJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUJQ09ORklHX0NPUjUJNAkvKiBPcHRpb24gcmVnaXN0ZXIgNSAqLworI2RlZmluZQlDT05GSUdfVFhYT04JNQkvKiBUeCBYT04gY2hhcmFjdGVyICovCisjZGVmaW5lCUNPTkZJR19UWFhPRkYJNgkvKiBUeCBYT0ZGIGNoYXJhY3RlciAqLworI2RlZmluZQlDT05GSUdfUlhYT04JNwkvKiBSeCBYT04gY2hhcmFjdGVyICovCisjZGVmaW5lCUNPTkZJR19SWFhPRkYJOAkvKiBSeCBYT0ZGIGNoYXJhY3RlciAqLworI2RlZmluZSBDT05GSUdfTE5FWFQJOQkvKiBMTkVYVCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJQ09ORklHX1RYQkFVRAkxMAkvKiBUeCBiYXVkIHJhdGUgKi8KKyNkZWZpbmUJQ09ORklHX1JYQkFVRAkxMQkvKiBSeCBiYXVkIHJhdGUgKi8KKworLyogUG9ydCBzdGF0dXMgc3R1ZmYgKi8KKyNkZWZpbmUJSURMRV9DTE9TRUQJMAkvKiBDbG9zZWQgKi8KKyNkZWZpbmUgSURMRV9PUEVOCTEJLyogSWRsZSBvcGVuICovCisjZGVmaW5lIElETEVfQlJFQUsJMgkvKiBJZGxlIG9uIGJyZWFrICovCisKKy8qIFN1YnNjcmlwdCBvZiBNT0RFTSBTVEFUVVMgcGFja2V0ICovCisjZGVmaW5lCU1PREVNX1ZBTFVFCTMJLyogQ3VycmVudCB2YWx1ZXMgb2YgaGFuZHNoYWtlIHBpbnMgKi8KKy8qIFN1YnNjcmlwdCBvZiBTQlJFQUsgcGFja2V0ICovCisjZGVmaW5lIEJSRUFLX0xFTkdUSAkxCS8qIExlbmd0aCBvZiBhIGJyZWFrIGluIHNsaWNlcyBvZiAwLjAxIHNlY29uZHMKKwkJCQkgICAwID0gc3RheSBvbiBicmVhayB1bnRpbCBhbiBFQlJFQUsgY29tbWFuZAorCQkJCSAgIGlzIHNlbnQgKi8KKworCisjZGVmaW5lCVBSRV9FTVBUSVZFCTB4ODAJLyogUHJlLWVtcHRpdmUgYml0IGluIGNvbW1hbmQgZmllbGQgKi8KKworLyogUGFja2V0IHR5cGVzIGdvaW5nIGZyb20gSG9zdCB0byByZW1vdGUgLSB3aXRoIHRoZSBleGNlcHRpb24gb2YgT1BFTiwgTU9QRU4sCisgICBDT05GSUcsIFNCUkVBSyBhbmQgTUVNRFVNUCB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIHRoZSBkYXRhIGFycmF5IHdpbGwgbm90CisgICBiZSB1c2VkIAorKi8KKyNkZWZpbmUJT1BFTgkJMHgwMAkvKiBPcGVuIGEgcG9ydCAqLworI2RlZmluZSBDT05GSUcJCTB4MDEJLyogQ29uZmlndXJlIGEgcG9ydCAqLworI2RlZmluZQlNT1BFTgkJMHgwMgkvKiBNb2RlbSBvcGVuIChibG9jayBmb3IgRENEKSAqLworI2RlZmluZQlDTE9TRQkJMHgwMwkvKiBDbG9zZSBhIHBvcnQgKi8KKyNkZWZpbmUJV0ZMVVNICQkoMHgwNCB8IFBSRV9FTVBUSVZFKSAvKiBXcml0ZSBmbHVzaCAqLworI2RlZmluZQlSRkxVU0gJCSgweDA1IHwgUFJFX0VNUFRJVkUpIC8qIFJlYWQgZmx1c2ggKi8KKyNkZWZpbmUJUkVTVU1FCQkoMHgwNiB8IFBSRV9FTVBUSVZFKSAvKiBSZXN1bWUgaWYgeG9mZmVkICovCisjZGVmaW5lCVNCUkVBSwkJMHgwNyAJLyogU3RhcnQgYnJlYWsgKi8KKyNkZWZpbmUJRUJSRUFLCQkweDA4CS8qIEVuZCBicmVhayAqLworI2RlZmluZQlTVVNQRU5ECQkoMHgwOSB8IFBSRV9FTVBUSVZFKSAvKiBTdXNwIG9wIChiZWhhdmUgYXMgdGhvIHhvZmZlZCkgKi8KKyNkZWZpbmUgRkNMT1NFICAgICAgICAgICgweDBhIHwgUFJFX0VNUFRJVkUpIC8qIEZvcmNlIGNsb3NlICovCisjZGVmaW5lIFhQUklOVCAgICAgICAgICAweDBiICAgIC8qIFhwcmludCBwYWNrZXQgKi8KKyNkZWZpbmUgTUJJUwkJKDB4MGMgfCBQUkVfRU1QVElWRSkgLyogU2V0IG1vZGVtIGxpbmVzICovCisjZGVmaW5lIE1CSUMJCSgweDBkIHwgUFJFX0VNUFRJVkUpIC8qIENsZWFyIG1vZGVtIGxpbmVzICovCisjZGVmaW5lIE1TRVQJCSgweDBlIHwgUFJFX0VNUFRJVkUpIC8qIFNldCBtb2RlbSBsaW5lcyAqLworI2RlZmluZSBQQ0xPU0UJCTB4MGYJLyogUHNldWRvIGNsb3NlIC0gTGVhdmVzIHJ4L3R4IGVuYWJsZWQgKi8KKyNkZWZpbmUgTUdFVAkJKDB4MTAgfCBQUkVfRU1QVElWRSkgLyogRm9yY2UgdXBkYXRlIG9mIG1vZGVtIHN0YXR1cyAqLworI2RlZmluZSBNRU1EVU1QCQkoMHgxMSB8IFBSRV9FTVBUSVZFKSAvKiBTZW5kIGJhY2sgbWVtIGZyb20gYWRkciBzdXBwbGllZCAqLworI2RlZmluZQlSRUFEX1JFR0lTVEVSCSgweDEyIHwgUFJFX0VNUFRJVkUpIC8qIFJlYWQgQ0QxNDAwIHJlZ2lzdGVyIChkZWJ1ZykgKi8KKworLyogIkNvbW1hbmQiIHBhY2tldHMgZ29pbmcgZnJvbSByZW1vdGUgdG8gaG9zdCBDT01QTEVURSBhbmQgTU9ERU1fU1RBVFVTCisgICB1c2UgZGF0YVs0XSAvIGRhdGFbM10gdG8gaW5kaWNhdGUgY3VycmVudCBzdGF0ZSBhbmQgbW9kZW0gc3RhdHVzIHJlc3BlY3RpdmVseQorKi8gCisKKyNkZWZpbmUJQ09NUExFVEUJKDB4MjAgfCBQUkVfRU1QVElWRSkKKwkJCQkvKiBDb21tYW5kIGNvbXBsZXRlICovCisjZGVmaW5lIEJSRUFLX1JFQ0VJVkVECSgweDIxIHwgUFJFX0VNUFRJVkUpCisJCQkJLyogQnJlYWsgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgTU9ERU1fU1RBVFVTCSgweDIyIHwgUFJFX0VNUFRJVkUpCisJCQkJLyogQ2hhbmdlIGluIG1vZGVtIHN0YXR1cyAqLworCisvKiAiQ29tbWFuZCIgcGFja2V0IHRoYXQgY291bGQgZ28gZWl0aGVyIHdheSAtIGhhbmRzaGFrZSB3YWtlLXVwICovCisjZGVmaW5lIEhBTkRTSEFLRQkoMHgyMyB8IFBSRV9FTVBUSVZFKQorCQkJCS8qIFdha2UtdXAgdG8gSE9TVCAvIFJUQSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vY21kLmggYi9kcml2ZXJzL2NoYXIvcmlvL2NtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjllZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2NtZC5oCkBAIC0wLDAgKzEsODQgQEAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICBDIE8gTSBNIEEgTiBEICAgUCBBIEMgSyBFIFQgICBIIEUgQSBEIEUgUiBTCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX2NtZF9oCisjZGVmaW5lIF9jbWRfaAorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19jbWRfaF9zY2NzID0gIkAoIyljbWQuaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKworI2RlZmluZSBQUkVfRU1QVElWRV9DTUQgICAgICAgICAweDgwCisjZGVmaW5lIElOTElORV9DTUQgICAgICAgICAgICAgIH5QUkVfRU1QVElWRV9DTUQKKworI2RlZmluZSBDTURfSUdOT1JFX1BLVCAgICAgICAgICAoICh1c2hvcnQpIDApCisjZGVmaW5lIENNRF9TVEFUVVNfUkVRICAgICAgICAgICggKHVzaG9ydCkgMSkKKyNkZWZpbmUgQ01EX1VOSVRfU1RBVFVTX1JFUSAgICAgKCAodXNob3J0KSAyKSAgICAgLyogSXMgdGhpcyBuZWVkZWQgPz8/ICovCisjZGVmaW5lIENNRF9DT05GX1BPUlQgICAgICAgICAgICggKHVzaG9ydCkgMykKKyNkZWZpbmUgQ01EX0NPTkZfVU5JVCAgICAgICAgICAgKCAodXNob3J0KSA0KQorI2RlZmluZSBDTURfUk9VVEVfTUFQX1JFUSAgICAgICAoICh1c2hvcnQpIDUpCisjZGVmaW5lIENNRF9GTFVTSF9UWCAgICAgICAgICAgICggKHVzaG9ydCkgNikKKyNkZWZpbmUgQ01EX0ZMVVNIX1JYICAgICAgICAgICAgKCAodXNob3J0KSA3KQorI2RlZmluZSBDTURfUEFSVElPTl9QT1JUICAgICAgICAoICh1c2hvcnQpIDgpCisjZGVmaW5lIENNRF9SRVNFVF9QT1JUICAgICAgICAgICggKHVzaG9ydCkgMHgwYSkKKyNkZWZpbmUgQ01EX0JPT1RfVU5JVCAgICAgICAgICAgKCAodXNob3J0KSAweDBiKQorI2RlZmluZSBDTURfRk9VTkRfVU5JVCAgICAgICAgICAoICh1c2hvcnQpIDB4MGMpCisjZGVmaW5lIENNRF9BVFRBQ0hFRF9SVEFfMiAgICAgICggKHVzaG9ydCkgMHgwZCkKKyNkZWZpbmUgQ01EX1BST1ZJREVfQk9PVCAgICAgICAgKCAodXNob3J0KSAweDBlKQorI2RlZmluZSBDTURfQ0lSUlVTICAgICAgICAgICAgICAoICh1c2hvcnQpIDB4MGYpCisKKyNkZWZpbmUgRk9STV9TVEFUVVNfUEtUICAgICAgICAgKCAodXNob3J0KSAxICkKKyNkZWZpbmUgRk9STV9QT0xMX1BLVCAgICAgICAgICAgKCAodXNob3J0KSAyICkKKyNkZWZpbmUgRk9STV9MSU5LX1NUQVRVU19QS1QgICAgKCAodXNob3J0KSAzICkKKworCisjZGVmaW5lIENNRF9EQVRBX1BPUlQgICAgICAgICAgICggKHVzaG9ydCkgMSApCisjZGVmaW5lIENNRF9EQVRBICAgICAgICAgICAgICAgICggKHVzaG9ydCkgMiApCisKKyNkZWZpbmUgQ01EX1RYX1BBUlQgICAgICAgICAgICAgKCAodXNob3J0KSAyICkKKyNkZWZpbmUgQ01EX1JYX1BBUlQgICAgICAgICAgICAgKCAodXNob3J0KSAzICkKKyNkZWZpbmUgQ01EX1JYX0xJTUlUICAgICAgICAgICAgKCAodXNob3J0KSA0ICkKKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9jbWRibGsuaCBiL2RyaXZlcnMvY2hhci9yaW8vY21kYmxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4ZWZiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY21kYmxrLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogY21kYmxrLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjA5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIwCisqKgorKiogIGlkZW50IEAoIyljbWRibGsuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19jbWRibGtfaF9fCisjZGVmaW5lIF9fcmlvX2NtZGJsa19oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfY21kYmxrX2hfc2Njc18gPSAiQCgjKWNtZGJsay5oCTEuMiI7CisjZW5kaWYKKyNlbmRpZgorCisvKgorKiogdGhlIHN0cnVjdHVyZSBvZiBhIGNvbW1hbmQgYmxvY2ssIHVzZWQgdG8gcXVldWUgY29tbWFuZHMgZGVzdGluZWQgZm9yCisqKiBhIHJ1cC4KKyovCisKK3N0cnVjdCBDbWRCbGsKK3sKKyBzdHJ1Y3QgQ21kQmxrICpOZXh0UDsgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IGNvbW1hbmQgYmxvY2sgKi8KKyBzdHJ1Y3QJUEtUICAgICBQYWNrZXQ7ICAgICAgICAgLyogQSBwYWNrZXQsIHRvIGNvcHkgdG8gdGhlIHJ1cCAqLworICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZnVuYyB0byBjYWxsIHRvIGNoZWNrIGlmIE9LICovCisgICAgCWludCAgICAgKCpQcmVGdW5jUCkoaW50LCBzdHJ1Y3QgQ21kQmxrICopOworICAgIAlpbnQgICAgIFByZUFyZzsgICAgICAgICAvKiBUaGUgYXJnIGZvciB0aGUgZnVuYyAqLworICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZnVuYyB0byBjYWxsIHdoZW4gY29tcGxldGVkICovCisgICAgCWludCAgICAgKCpQb3N0RnVuY1ApKGludCwgc3RydWN0IENtZEJsayAqKTsKKyAgICAJaW50ICAgICBQb3N0QXJnOyAgICAgICAgLyogVGhlIGFyZyBmb3IgdGhlIGZ1bmMgKi8KK307CisKKyNkZWZpbmUgTlVNX1JJT19DTURfQkxLUyAoMyAqIChNQVhfUlVQICogNCArIExJTktTX1BFUl9VTklUICogNCkpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vY21kcGt0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2NtZHBrdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmVmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2NtZHBrdC5oCkBAIC0wLDAgKzEsMjA2IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBjbWRwa3QuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MDkKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjAKKyoqCisqKiAgaWRlbnQgQCgjKWNtZHBrdC5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmbmRlZiBfX3Jpb19jbWRwa3RfaF9fCisjZGVmaW5lIF9fcmlvX2NtZHBrdF9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfY21kcGt0X2hfc2Njc18gPSAiQCgjKWNtZHBrdC5oCTEuMiI7CisjZW5kaWYKKyNlbmRpZgorCisvKgorKiogb3ZlcmxheXMgZm9yIHRoZSBkYXRhIGFyZWEgb2YgYSBwYWNrZXQuIFVzZWQgaW4gYm90aCBkaXJlY3Rpb25zCisqKiAodG8gYnVpbGQgYSBwYWNrZXQgdG8gc2VuZCwgYW5kIHRvIGludGVycHJldCBhIHBhY2tldCB0aGF0IGFycml2ZXMpCisqKiBhbmQgaXMgdmVyeSBpbmNvbnZlbmllbnQgZm9yIE1JUFMsIHNvIHRoZXkgYXBwZWFyIGFzIHR3byBzZXBhcmF0ZQorKiogc3RydWN0dXJlcyAtIHRob3NlIHVzZWQgZm9yIG1vZGlmeWluZy9yZWFkaW5nIHBhY2tldHMgb24gdGhlIGNhcmQKKyoqIGFuZCB0aG9zZSBmb3IgbW9kaWZ5aW5nL3JlYWRpbmcgcGFja2V0cyBpbiByZWFsIG1lbW9yeSwgd2hpY2ggaGF2ZSBhbiBfTQorKiogc3VmZml4LgorKi8KKworI2RlZmluZQlSVEFfQk9PVF9EQVRBX1NJWkUgKFBLVF9NQVhfREFUQV9MRU4tMikKKworLyoKKyoqIFRoZSBib290IGluZm9ybWF0aW9uIHBhY2tldCBsb29rcyBsaWtlIHRoaXM6CisqKiBUaGlzIHN0cnVjdHVyZSBvdmVybGF5cyBhIFBrdENtZC0+Q21kRGF0YSBzdHJ1Y3R1cmUsIGFuZCBzbyBzdGFydHMKKyoqIGF0IERhdGFbMl0gaW4gdGhlIGFjdHVhbCBwa3QhCisqLworc3RydWN0IEJvb3RTZXF1ZW5jZQoreworICAgIFdPUkQJTnVtUGFja2V0czsKKyAgICBXT1JECUxvYWRCYXNlOworICAgIFdPUkQJQ29kZVNpemU7Cit9OworCisjZGVmaW5lCUJPT1RfU0VRVUVOQ0VfTEVOCTgKKworc3RydWN0IFNhbVRvcAoreworICAgIEJZVEUgVW5pdDsKKyAgICBCWVRFIExpbms7Cit9OworCitzdHJ1Y3QgQ21kSGRyCit7CisgICAgQllURSBQY0NvbW1hbmQ7CisgICAgdW5pb24KKyAgICB7CisgICAgQllURSBQY1BoYk51bTsKKyAgICBCWVRFIFBjTGlua051bTsKKyAgICBCWVRFIFBjSUROdW07CisgICAgfSBVMDsKK307CisKKworc3RydWN0IFBrdENtZAoreworICAgIHVuaW9uCisgICAgeworCXN0cnVjdCAKKwl7CisJICAgIHN0cnVjdCBDbWRIZHIgQ21kSGRyOworCSAgICBzdHJ1Y3QgQm9vdFNlcXVlbmNlIFBjQm9vdFNlcXVlbmNlOworCX0gUzE7CisJc3RydWN0CisJeworCSAgICBXT1JEIFBjU2VxdWVuY2U7CisJICAgIEJZVEUgUGNCb290RGF0YVtSVEFfQk9PVF9EQVRBX1NJWkVdOworCX0gUzI7CisJc3RydWN0CisJeworCSAgICBXT1JEICBfX2NydWRfXzsKKwkgICAgQllURSAgUGNVbmlxTnVtWzRdOwkgICAgICAgIC8qIHRoaXMgaXMgcmVhbGx5IGEgdWludC4gKi8KKwkgICAgQllURSAgUGNNb2R1bGVUeXBlczsgIAkvKiB3aGF0IG1vZHVsZXMgYXJlIGZpdHRlZCAqLworCX0gUzM7CisJc3RydWN0CisJeworCSAgICBzdHJ1Y3QgQ21kSGRyIENtZEhkcjsKKwkgICAgQllURSAgIF9fdW5kZWZpbmVkX187CisJICAgIEJZVEUgICBQY01vZGVtU3RhdHVzOworCSAgICBCWVRFICAgUGNQb3J0U3RhdHVzOworCSAgICBCWVRFICAgUGNTdWJDb21tYW5kOwkvKiBjb21tYW5kcyBsaWtlIG1lbSBvciByZWdpc3RlciBkdW1wICovCisJICAgIFdPUkQgICBQY1N1YkFkZHI7CQkvKiBBZGRyZXNzIGZvciBjb21tYW5kICovCisJICAgIEJZVEUgICBQY1N1YkRhdGFbNjRdOwkvKiBEYXRlIGFyZWEgZm9yIGNvbW1hbmQgKi8KKwl9IFM0OworCXN0cnVjdAorCXsKKwkgICAgc3RydWN0IENtZEhkciBDbWRIZHI7CisJICAgIEJZVEUgICBQY0NvbW1hbmRUZXh0WzFdOworCSAgICBCWVRFICAgX19jcnVkX19bMjBdOworCSAgICBCWVRFICAgUGNJRE51bTI7CQkvKiBJdCBoYWQgdG8gZ28gc29tZXdoZXJlISAqLworCX0gUzU7CisJc3RydWN0CisJeworCSAgICBzdHJ1Y3QgQ21kSGRyIENtZEhkcjsKKwkgICAgc3RydWN0IFNhbVRvcCAgICBUb3BvbG9neVtMSU5LU19QRVJfVU5JVF07CisJfSBTNjsKKyAgICB9IFUxOworfTsKKworc3RydWN0IFBrdENtZF9NCit7CisgICAgdW5pb24KKyAgICB7CisJc3RydWN0IAorCXsKKwkgICAgc3RydWN0CisJICAgIHsKKyAgICAJCXVjaGFyIFBjQ29tbWFuZDsKKyAgICAJCXVuaW9uCisgICAgCQl7CisgICAgCQkgICAgdWNoYXIgUGNQaGJOdW07CisgICAgCQkgICAgdWNoYXIgUGNMaW5rTnVtOworICAgIAkJICAgIHVjaGFyIFBjSUROdW07CisgICAgCQl9IFUwOworCSAgICB9IENtZEhkcjsKKwkgICAgc3RydWN0CisJICAgIHsKKyAgICAgICAgICAgICAgICB1c2hvcnQJTnVtUGFja2V0czsKKyAgICAgICAgICAgICAgICB1c2hvcnQJTG9hZEJhc2U7CisgICAgICAgICAgICAgICAgdXNob3J0CUNvZGVTaXplOworICAgICAgICAgICAgfSBQY0Jvb3RTZXF1ZW5jZTsKKwl9IFMxOworCXN0cnVjdAorCXsKKwkgICAgdXNob3J0IFBjU2VxdWVuY2U7CisJICAgIHVjaGFyIFBjQm9vdERhdGFbUlRBX0JPT1RfREFUQV9TSVpFXTsKKwl9IFMyOworCXN0cnVjdAorCXsKKwkgICAgdXNob3J0ICBfX2NydWRfXzsKKwkgICAgdWNoYXIgIFBjVW5pcU51bVs0XTsJICAgICAgICAvKiB0aGlzIGlzIHJlYWxseSBhIHVpbnQuICovCisJICAgIHVjaGFyICBQY01vZHVsZVR5cGVzOyAgCS8qIHdoYXQgbW9kdWxlcyBhcmUgZml0dGVkICovCisJfSBTMzsKKwlzdHJ1Y3QKKwl7CisJICAgIHVzaG9ydCAgX19jbWRfaGRyX187CisJICAgIHVjaGFyICAgX191bmRlZmluZWRfXzsKKwkgICAgdWNoYXIgICBQY01vZGVtU3RhdHVzOworCSAgICB1Y2hhciAgIFBjUG9ydFN0YXR1czsKKwkgICAgdWNoYXIgICBQY1N1YkNvbW1hbmQ7CisJICAgIHVzaG9ydCAgUGNTdWJBZGRyOworCSAgICB1Y2hhciAgIFBjU3ViRGF0YVs2NF07CisJfSBTNDsKKwlzdHJ1Y3QKKwl7CisJICAgIHVzaG9ydCAgX19jbWRfaGRyX187CisJICAgIHVjaGFyICAgUGNDb21tYW5kVGV4dFsxXTsKKwkgICAgdWNoYXIgICBfX2NydWRfX1syMF07CisJICAgIHVjaGFyICAgUGNJRE51bTI7CQkvKiBUYWNrZWQgb24gZW5kICovCisJfSBTNTsKKwlzdHJ1Y3QKKwl7CisJICAgIHVzaG9ydCAgX19jbWRfaGRyX187CisJICAgIHN0cnVjdCBUb3AgVG9wb2xvZ3lbTElOS1NfUEVSX1VOSVRdOworCX0gUzY7CisgICAgfSBVMTsKK307CisKKyNkZWZpbmUgQ29tbWFuZAkJVTEuUzEuQ21kSGRyLlBjQ29tbWFuZAorI2RlZmluZSBQaGJOdW0JCVUxLlMxLkNtZEhkci5VMC5QY1BoYk51bQorI2RlZmluZSBJRE51bQkJVTEuUzEuQ21kSGRyLlUwLlBjSUROdW0KKyNkZWZpbmUgSUROdW0yCQlVMS5TNS5QY0lETnVtMgorI2RlZmluZSBMaW5rTnVtCQlVMS5TMS5DbWRIZHIuVTAuUGNMaW5rTnVtCisjZGVmaW5lIFNlcXVlbmNlCVUxLlMyLlBjU2VxdWVuY2UKKyNkZWZpbmUgQm9vdERhdGEJVTEuUzIuUGNCb290RGF0YQorI2RlZmluZSBCb290U2VxdWVuY2UJVTEuUzEuUGNCb290U2VxdWVuY2UKKyNkZWZpbmUgVW5pcU51bQkJVTEuUzMuUGNVbmlxTnVtCisjZGVmaW5lIE1vZGVtU3RhdHVzCVUxLlM0LlBjTW9kZW1TdGF0dXMKKyNkZWZpbmUgUG9ydFN0YXR1cwlVMS5TNC5QY1BvcnRTdGF0dXMKKyNkZWZpbmUgU3ViQ29tbWFuZAlVMS5TNC5QY1N1YkNvbW1hbmQKKyNkZWZpbmUgU3ViQWRkcgkJVTEuUzQuUGNTdWJBZGRyCisjZGVmaW5lIFN1YkRhdGEJCVUxLlM0LlBjU3ViRGF0YQorI2RlZmluZSBDb21tYW5kVGV4dAlVMS5TNS5QY0NvbW1hbmRUZXh0CisjZGVmaW5lIFJvdXRlVG9wb2xvZ3kJVTEuUzYuVG9wb2xvZ3kKKyNkZWZpbmUgTW9kdWxlVHlwZXMJVTEuUzMuUGNNb2R1bGVUeXBlcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vY29udHJvbC5oIGIvZHJpdmVycy9jaGFyL3Jpby9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxMmY2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY29udHJvbC5oCkBAIC0wLDAgKzEsNjIgQEAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICBDIE8gTiBUIFIgTyBMICAgUCBBIEMgSyBFIFQgICBIIEUgQSBEIEUgUiBTCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBKb24gQnJhd24KKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9jb250cm9sX2gKKyNkZWZpbmUgX2NvbnRyb2xfaAorCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyICpfcmlvX2NvbnRyb2xfaF9zY2NzID0gIkAoIyljb250cm9sLmgJMS40IjsgKi8KKyNlbmRpZgorCisjZGVmaW5lCUNPTlRST0wJCSdeJworI2RlZmluZSBJRk9BRAkJKCBDT05UUk9MICsgMSApCisjZGVmaW5lCUlERU5USUZZCSggQ09OVFJPTCArIDIgKQorI2RlZmluZQlaT01CSUUJCSggQ09OVFJPTCArIDMgKQorI2RlZmluZQlVRk9BRAkJKCBDT05UUk9MICsgNCApCisjZGVmaW5lIElXQUlUCQkoIENPTlRST0wgKyA1ICkKKworI2RlZmluZQlJRk9BRF9NQUdJQwkweEYwQUQJCS8qIG9mIGNvdXJzZSAqLworI2RlZmluZQlaT01CSUVfTUFHSUMJKH4weERFQUQpCS8qIG5vdCBkZWFkIC0+IHpvbWJpZSAqLworI2RlZmluZQlVRk9BRF9NQUdJQwkweEQxRQkJLyoga2lsbC15b3VyLW5laWdoYm91ciAqLworI2RlZmluZQlJV0FJVF9NQUdJQwkweEIxREUJCS8qIEJpZGUgeW91ciB0aW1lICovCisKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZGFlbW9uLmggYi9kcml2ZXJzL2NoYXIvcmlvL2RhZW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGJhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2RhZW1vbi5oCkBAIC0wLDAgKzEsMzM0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBkYWVtb24uaAorKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MDkKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKWRhZW1vbi5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvX2RhZW1vbl9oX18KKyNkZWZpbmUJX19yaW9fZGFlbW9uX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9kYWVtb25faF9zY2NzXyA9ICJAKCMpZGFlbW9uLmgJMS4zIjsKKyNlbmRpZgorI2VuZGlmCisKKworLyoKKyoqIHN0cnVjdHVyZXMgdXNlZCBvbiAvZGV2L3JpbworKi8KKworc3RydWN0IEVycm9yCit7CisJdWludAlFcnJvcjsKKwl1aW50CUVudHJ5OworCXVpbnQJT3RoZXI7Cit9OworCitzdHJ1Y3QgRG93bkxvYWQKK3sKKwljaGFyCSpEYXRhUDsKKwl1aW50CUNvdW50OworCXVpbnQJUHJvZHVjdENvZGU7Cit9OworCisvKgorKiogQSBmZXcgY29uc3RhbnRzLi4uLgorKi8KKyNpZm5kZWYgTUFYX1ZFUlNJT05fTEVOCisjZGVmaW5lCU1BWF9WRVJTSU9OX0xFTgkyNTYKKyNlbmRpZgorCisjaWZuZGVmIE1BWF9YUF9DVFJMX0xFTgorI2RlZmluZQlNQVhfWFBfQ1RSTF9MRU4gMTYJCS8qIEFMU08gSU4gUE9SVC5IICovCisjZW5kaWYKKworc3RydWN0CVBvcnRTZXR1cAoreworCXVpbnQJRnJvbTsJLyogU2V0L0NsZWFyIFhQICYgSVhBTlkgQ29udHJvbCBmcm9tIHRoaXMgcG9ydC4uLi4gKi8KKwl1aW50CVRvOwkvKiAuLi4uIHRvIHRoaXMgcG9ydCAqLworCXVpbnQJWHBDcHM7CQkJLyogYXQgdGhpcyBzcGVlZCAqLworCWNoYXIJWHBPbltNQVhfWFBfQ1RSTF9MRU5dOwkvKiB0aGlzIGlzIHRoZSBzdGFydCBzdHJpbmcgKi8KKwljaGFyCVhwT2ZmW01BWF9YUF9DVFJMX0xFTl07CS8qIHRoaXMgaXMgdGhlIHN0b3Agc3RyaW5nICovCisJdWNoYXIJSXhBbnk7CQkJLyogZW5hYmxlL2Rpc2FibGUgSVhBTlkgKi8KKwl1Y2hhcglJeE9uOwkJCS8qIGVuYWJsZS9kaXNhYmxlIElYT04gKi8KKwl1Y2hhcglMb2NrOwkJCS8qIGxvY2sgcG9ydCBwYXJhbXMgKi8KKwl1Y2hhcglTdG9yZTsJCQkvKiBzdG9yZSBwYXJhbXMgYWNyb3NzIGNsb3NlcyAqLworCXVjaGFyCURyYWluOwkJCS8qIGNsb3NlIG9ubHkgd2hlbiBkcmFpbmVkICovCit9OworCitzdHJ1Y3QJTHBiUmVxCit7CisJdWludAlIb3N0OworCXVpbnQJTGluazsKKwlzdHJ1Y3QgIExQQiAgICAgKkxwYlA7Cit9OworCitzdHJ1Y3QJUnVwUmVxCit7CisJdWludAlIb3N0TnVtOworCXVpbnQJUnVwTnVtOworCXN0cnVjdCAgUlVQIAkqUnVwUDsKK307CisKK3N0cnVjdAlQb3J0UmVxCit7CisJdWludAlTeXNQb3J0OworCXN0cnVjdCAgUG9ydCAJKlBvcnRQOworfTsKKworc3RydWN0ICBTdHJlYW1JbmZvCit7CisJdWludAlTeXNQb3J0OworI2lmIDAKKwlxdWV1ZV90IFJRdWV1ZTsKKwlxdWV1ZV90IFdRdWV1ZTsKKyNlbHNlCisJaW50IFJRdWV1ZTsKKwlpbnQgV1F1ZXVlOworI2VuZGlmCit9OworCitzdHJ1Y3QJSG9zdFJlcQoreworCXVpbnQJSG9zdE51bTsKKwlzdHJ1Y3QgIEhvc3QgCSpIb3N0UDsKK307CisKK3N0cnVjdAlIb3N0RHBSYW0KK3sKKwl1aW50CUhvc3ROdW07CisJc3RydWN0CURwUmFtCSpEcFJhbVA7Cit9OworCitzdHJ1Y3QJRGVidWdDdHJsCit7CisJdWludAlTeXNQb3J0OworCXVpbnQJRGVidWc7CisJdWludAlXYWl0OworfTsKKworc3RydWN0CU1hcEluZm8KK3sKKwl1aW50CUZpcnN0UG9ydDsJLyogOCBwb3J0cywgc3RhcnRpbmcgZnJvbSB0aGlzICh0dHkpIG51bWJlciAqLworCXVpbnQJUnRhVW5pcXVlOwkvKiByZXNpZGUgb24gdGhpcyBSVEEgKHVuaXF1ZSBudW1iZXIpICovCit9OworCitzdHJ1Y3QJTWFwSW4KK3sKKwl1aW50CU51bUVudHJpZXM7CQkvKiBIb3cgbWFueSBwb3J0IHNldHMgYXJlIHdlIG1hcHBpbmc/ICovCisJc3RydWN0ICBNYXBJbmZvCSpNYXBJbmZvUDsJLyogUG9pbnRlciB0byAodXNlciBzcGFjZSkgaW5mbyAqLworfTsKKworc3RydWN0ICBTZW5kUGFjaworeworICAgICAgICB1bnNpZ25lZCBpbnQJUG9ydE51bTsKKwl1bnNpZ25lZCBjaGFyCUxlbjsKKwl1bnNpZ25lZCBjaGFyCURhdGFbUEtUX01BWF9EQVRBX0xFTl07Cit9OworCitzdHJ1Y3QgU3BlY2lhbFJ1cENtZAoreworCXN0cnVjdAlQS1QJCVBhY2tldDsKKwl1bnNpZ25lZCBzaG9ydAlIb3N0OworCXVuc2lnbmVkIHNob3J0CVJ1cE51bTsKK307CisKK3N0cnVjdAlJZGVudGlmeVJ0YQoreworCXVsb25nCVJ0YVVuaXF1ZTsKKwl1Y2hhcglJRDsKK307CisKK3N0cnVjdAlLaWxsTmVpZ2hib3VyCit7CisJdWxvbmcJVW5pcXVlTnVtOworCXVjaGFyCUxpbms7Cit9OworCitzdHJ1Y3QgcmlvVmVyc2lvbiB7CisgICAgY2hhciAgICAgICAgdmVyc2lvbltNQVhfVkVSU0lPTl9MRU5dOworICAgIGNoYXIgICAgICAgIHJlbGlkW01BWF9WRVJTSU9OX0xFTl07CisgICAgaW50ICAgICAgICAgYnVpbGRMZXZlbDsKKyAgICBjaGFyICAgICAgICBidWlsZERhdGVbTUFYX1ZFUlNJT05fTEVOXTsKK307CisKKworLyoKKyoqCVJJT0MgY29tbWFuZHMgYXJlIGZvciB0aGUgZGFlbW9uIHR5cGUgb3BlcmF0aW9ucworKioKKyoqIDA5LjEyLjE5OTggQVJHIC0gRVNJTCAwNzc2IHBhcnQgZml4CisqKiBEZWZpbml0aW9uIGZvciAnUklPQycgYWxzbyBhcHBlYXJzIGluIHJpb2lvY3RsLmgsIHNvIHdlJ2QgYmV0dGVyIGRvIGEKKyoqICNpZm5kZWYgaGVyZSBmaXJzdC4KKyoqIHJpb2lvY3RsLmggYWxzbyBub3cgaGFzICNkZWZpbmUgJ1JJT19RVUlDS19DSEVDSycgYXMgdGhpcyBpb2N0bCBpcyBub3cKKyoqIGFsbG93ZWQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuCisqLworI2lmbmRlZiBSSU9DCisjZGVmaW5lCVJJT0MJKCdSJzw8OCl8KCdpJzw8MTYpfCgnbyc8PDI0KQorI2VuZGlmCisKKy8qCisqKiBCb290IHN0dWZmCisqLworI2RlZmluZQlSSU9fR0VUX1RBQkxFICAgICAoUklPQyB8IDEwMCkKKyNkZWZpbmUgUklPX1BVVF9UQUJMRSAgICAgKFJJT0MgfCAxMDEpCisjZGVmaW5lIFJJT19BU1NJR05fUlRBICAgIChSSU9DIHwgMTAyKQorI2RlZmluZSBSSU9fREVMRVRFX1JUQSAgICAoUklPQyB8IDEwMykKKyNkZWZpbmUJUklPX0hPU1RfRk9BRAkgIChSSU9DIHwgMTA0KQorI2RlZmluZQlSSU9fUVVJQ0tfQ0hFQ0sJICAoUklPQyB8IDEwNSkKKyNkZWZpbmUgUklPX1NJR05BTFNfT04gICAgKFJJT0MgfCAxMDYpCisjZGVmaW5lIFJJT19TSUdOQUxTX09GRiAgIChSSU9DIHwgMTA3KQorI2RlZmluZQlSSU9fQ0hBTkdFX05BTUUgICAoUklPQyB8IDEwOCkKKyNkZWZpbmUgUklPX0RPV05MT0FEICAgICAgKFJJT0MgfCAxMDkpCisjZGVmaW5lCVJJT19HRVRfTE9HCSAgKFJJT0MgfCAxMTApCisjZGVmaW5lCVJJT19TRVRVUF9QT1JUUyAgIChSSU9DIHwgMTExKQorI2RlZmluZSBSSU9fQUxMX01PREVNICAgICAoUklPQyB8IDExMikKKworLyoKKyoqIGNhcmQgc3RhdGUsIGRlYnVnIHN0dWZmCisqLworI2RlZmluZQlSSU9fTlVNX0hPU1RTCSAgKFJJT0MgfCAxMjApCisjZGVmaW5lCVJJT19IT1NUX0xQQgkgIChSSU9DIHwgMTIxKQorI2RlZmluZQlSSU9fSE9TVF9SVVAJICAoUklPQyB8IDEyMikKKyNkZWZpbmUJUklPX0hPU1RfUE9SVAkgIChSSU9DIHwgMTIzKQorI2RlZmluZQlSSU9fUEFSTVMgCSAgKFJJT0MgfCAxMjQpCisjZGVmaW5lIFJJT19IT1NUX1JFUQkgIChSSU9DIHwgMTI1KQorI2RlZmluZQlSSU9fUkVBRF9DT05GSUcJICAoUklPQyB8IDEyNikKKyNkZWZpbmUJUklPX1NFVF9DT05GSUcJICAoUklPQyB8IDEyNykKKyNkZWZpbmUJUklPX1ZFUlNJRAkgIChSSU9DIHwgMTI4KQorI2RlZmluZQlSSU9fRkxBR1MJICAoUklPQyB8IDEyOSkKKyNkZWZpbmUJUklPX1NFVERFQlVHCSAgKFJJT0MgfCAxMzApCisjZGVmaW5lCVJJT19HRVRERUJVRwkgIChSSU9DIHwgMTMxKQorI2RlZmluZQlSSU9fUkVBRF9MRVZFTFMgICAoUklPQyB8IDEzMikKKyNkZWZpbmUJUklPX1NFVF9GQVNUX0JVUyAgKFJJT0MgfCAxMzMpCisjZGVmaW5lCVJJT19TRVRfU0xPV19CVVMgIChSSU9DIHwgMTM0KQorI2RlZmluZQlSSU9fU0VUX0JZVEVfTU9ERSAoUklPQyB8IDEzNSkKKyNkZWZpbmUJUklPX1NFVF9XT1JEX01PREUgKFJJT0MgfCAxMzYpCisjZGVmaW5lIFJJT19TVFJFQU1fSU5GTyAgIChSSU9DIHwgMTM3KQorI2RlZmluZQlSSU9fU1RBUlRfUE9MTEVSICAoUklPQyB8IDEzOCkKKyNkZWZpbmUJUklPX1NUT1BfUE9MTEVSICAgKFJJT0MgfCAxMzkpCisjZGVmaW5lCVJJT19MQVNUX0VSUk9SICAgIChSSU9DIHwgMTQwKQorI2RlZmluZQlSSU9fVElDSwkgIChSSU9DIHwgMTQxKQorI2RlZmluZQlSSU9fVE9DSwkgIChSSU9DIHwgMjQxKQkvKiBJIGRpZCB0aGlzIG9uIHB1cnBvc2UsIHlvdSBrbm93LiAqLworI2RlZmluZQlSSU9fU0VORF9QQUNLRVQgICAoUklPQyB8IDE0MikKKyNkZWZpbmUJUklPX1NFVF9CVVNZCSAgKFJJT0MgfCAxNDMpCisjZGVmaW5lCVNQRUNJQUxfUlVQX0NNRCAgIChSSU9DIHwgMTQ0KQorI2RlZmluZQlSSU9fRk9BRF9SVEEgICAgICAoUklPQyB8IDE0NSkKKyNkZWZpbmUJUklPX1pPTUJJRV9SVEEgICAgKFJJT0MgfCAxNDYpCisjZGVmaW5lIFJJT19JREVOVElGWV9SVEEgIChSSU9DIHwgMTQ3KQorI2RlZmluZSBSSU9fS0lMTF9ORUlHSEJPVVIgKFJJT0MgfCAxNDgpCisjZGVmaW5lIFJJT19ERUJVR19NRU0gICAgIChSSU9DIHwgMTQ5KQorLyoKKyoqIDE1MCAtIDE2NyB1c2VkLi4uLi4gICBTZWUgYmVsb3cKKyovCisjZGVmaW5lIFJJT19HRVRfUE9SVF9TRVRVUCAoUklPQyB8IDE2OCkKKyNkZWZpbmUgUklPX1JFU1VNRSAgICAgICAgKFJJT0MgfCAxNjkpCisjZGVmaW5lCVJJT19NRVNHCShSSU9DIHwgMTcwKQorI2RlZmluZQlSSU9fTk9fTUVTRwkoUklPQyB8IDE3MSkKKyNkZWZpbmUJUklPX1dIQVRfTUVTRwkoUklPQyB8IDE3MikKKyNkZWZpbmUgUklPX0hPU1RfRFBSQU0JKFJJT0MgfCAxNzMpCisjZGVmaW5lIFJJT19NQVBfQjUwX1RPXzUwCShSSU9DIHwgMTc0KQorI2RlZmluZSBSSU9fTUFQX0I1MF9UT181NzYwMAkoUklPQyB8IDE3NSkKKyNkZWZpbmUgUklPX01BUF9CMTEwX1RPXzExMAkoUklPQyB8IDE3NikKKyNkZWZpbmUgUklPX01BUF9CMTEwX1RPXzExNTIwMAkoUklPQyB8IDE3NykKKyNkZWZpbmUgUklPX0dFVF9QT1JUX1BBUkFNUwkoUklPQyB8IDE3OCkKKyNkZWZpbmUgUklPX1NFVF9QT1JUX1BBUkFNUwkoUklPQyB8IDE3OSkKKyNkZWZpbmUgUklPX0dFVF9QT1JUX1RUWQkoUklPQyB8IDE4MCkKKyNkZWZpbmUgUklPX1NFVF9QT1JUX1RUWQkoUklPQyB8IDE4MSkKKyNkZWZpbmUgUklPX1NZU0xPR19PTkxZCShSSU9DIHwgMTgyKQorI2RlZmluZSBSSU9fU1lTTE9HX0NPTlMJKFJJT0MgfCAxODMpCisjZGVmaW5lIFJJT19DT05TX09OTFkJKFJJT0MgfCAxODQpCisjZGVmaW5lIFJJT19CTE9DS19PUEVOUwkoUklPQyB8IDE4NSkKKworLyoKKyoqIDAyLjAzLjE5OTkgQVJHIC0gRVNJTCAwODIwIGZpeCA6CisqKiBSSU9Cb290TW9kZSBpcyBubyBsb25nZXIgdXNlIGJ5IHRoZSBkcml2ZXIsIHNvIHRoZXNlIGlvY3RscworKiogYXJlIG5vdyBvYnNvbGV0ZSA6CisqKgorI2RlZmluZSBSSU9fR0VUX0JPT1RfTU9ERQkoUklPQyB8IDE4NikKKyNkZWZpbmUgUklPX1NFVF9CT09UX01PREUJKFJJT0MgfCAxODcpCisqKgorKi8KKworI2RlZmluZSBSSU9fTUVNX0RVTVAJKFJJT0MgfCAxODkpCisjZGVmaW5lIFJJT19SRUFEX1JFR0lTVEVSCShSSU9DIHwgMTkwKQorI2RlZmluZSBSSU9fR0VUX01PRFRZUEUJKFJJT0MgfCAxOTEpCisjZGVmaW5lIFJJT19TRVRfVElNRVIJKFJJT0MgfCAxOTIpCisjZGVmaW5lIFJJT19SRUFEX0NIRUNLCShSSU9DIHwgMTk2KQorI2RlZmluZSBSSU9fV0FJVElOR19GT1JfUkVTVEFSVAkoUklPQyB8IDE5NykKKyNkZWZpbmUgUklPX0JJTkRfUlRBCShSSU9DIHwgMTk4KQorI2RlZmluZSBSSU9fR0VUX0JJTkRJTkdTCShSSU9DIHwgMTk5KQorI2RlZmluZSBSSU9fUFVUX0JJTkRJTkdTCShSSU9DIHwgMjAwKQorCisjZGVmaW5lCVJJT19NQUtFX0RFVgkJKFJJT0MgfCAyMDEpCisjZGVmaW5lCVJJT19NSU5PUgkJKFJJT0MgfCAyMDIpCisKKyNkZWZpbmUJUklPX0lERU5USUZZX0RSSVZFUgkoUklPQyB8IDIwMykKKyNkZWZpbmUJUklPX0RJU1BMQVlfSE9TVF9DRkcJKFJJT0MgfCAyMDQpCisKKworLyoKKyoqIE1BS0VfREVWIC8gTUlOT1Igc3R1ZmYKKyovCisjZGVmaW5lCVJJT19ERVZfRElSRUNUCQkweDAwMDAKKyNkZWZpbmUJUklPX0RFVl9NT0RFTQkJMHgwMjAwCisjZGVmaW5lCVJJT19ERVZfWFBSSU5UCQkweDA0MDAKKyNkZWZpbmUJUklPX0RFVl9NQVNLCQkweDA2MDAKKworLyoKKyoqIHBvcnQgbWFuYWdlbWVudCwgeHByaW50IHN0dWZmCisqLworI2RlZmluZQlySU9DTihOKQkoUklPQ3woTikpCisjZGVmaW5lCXJJT0NSKE4sVCkJKFJJT0N8KE4pKQorI2RlZmluZQlySU9DVyhOLFQpCShSSU9DfChOKSkKKworI2RlZmluZQlSSU9fR0VUX1hQX09OICAgICBySU9DUigxNTAsY2hhclsxNl0pCS8qIHN0YXJ0IHhwcmludCBzdHJpbmcgKi8KKyNkZWZpbmUJUklPX1NFVF9YUF9PTiAgICAgcklPQ1coMTUxLGNoYXJbMTZdKQorI2RlZmluZQlSSU9fR0VUX1hQX09GRiAgICBySU9DUigxNTIsY2hhclsxNl0pCS8qIGZpbmlzaCB4cHJpbnQgc3RyaW5nICovCisjZGVmaW5lCVJJT19TRVRfWFBfT0ZGICAgIHJJT0NXKDE1MyxjaGFyWzE2XSkKKyNkZWZpbmUJUklPX0dFVF9YUF9DUFMgICAgcklPQ1IoMTU0LGludCkJLyogeHByaW50IENQUyAqLworI2RlZmluZQlSSU9fU0VUX1hQX0NQUyAgICBySU9DVygxNTUsaW50KQorI2RlZmluZSBSSU9fR0VUX0lYQU5ZICAgICBySU9DUigxNTYsaW50KQkvKiBpeGFueSBhbGxvd2VkPyAqLworI2RlZmluZSBSSU9fU0VUX0lYQU5ZICAgICBySU9DVygxNTcsaW50KQorI2RlZmluZSBSSU9fU0VUX0lYQU5ZX09OICBySU9DTigxNTgpCQkvKiBhbGxvdyBpeGFueSAqLworI2RlZmluZSBSSU9fU0VUX0lYQU5ZX09GRiBySU9DTigxNTkpCQkvKiBkaXNhbGxvdyBpeGFueSAqLworI2RlZmluZSBSSU9fR0VUX01PREVNICAgICBySU9DUigxNjAsaW50KQkvKiBwb3J0IGlzIG1vZGVtL2RpcmVjdCBsaW5lPyAqLworI2RlZmluZSBSSU9fU0VUX01PREVNICAgICBySU9DVygxNjEsaW50KQorI2RlZmluZSBSSU9fU0VUX01PREVNX09OICBySU9DTigxNjIpCQkvKiBwb3J0IGlzIGEgbW9kZW0gKi8KKyNkZWZpbmUgUklPX1NFVF9NT0RFTV9PRkYgcklPQ04oMTYzKQkJLyogcG9ydCBpcyBkaXJlY3QgKi8KKyNkZWZpbmUgUklPX0dFVF9JWE9OICAgICAgcklPQ1IoMTY0LGludCkJLyogaXhvbiBhbGxvd2VkPyAqLworI2RlZmluZSBSSU9fU0VUX0lYT04gICAgICBySU9DVygxNjUsaW50KQorI2RlZmluZSBSSU9fU0VUX0lYT05fT04gICBySU9DTigxNjYpCQkvKiBhbGxvdyBpeG9uICovCisjZGVmaW5lIFJJT19TRVRfSVhPTl9PRkYgIHJJT0NOKDE2NykJCS8qIGRpc2FsbG93IGl4b24gKi8KKworI2RlZmluZSBSSU9fR0VUX1NJVklFVwkgICgoKCdzJyk8PDgpIHwgMTA2KQkvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFNJICovCisKKyNkZWZpbmUJUklPX0lPQ1RMX1VOS05PV04JLTIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2RhdGEuaCBiL2RyaXZlcnMvY2hhci9yaW8vZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmMyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2RhdGEuaApAQCAtMCwwICsxLDQwIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBkYXRhLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjA5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIylkYXRhLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fZGF0YWRleF9fCisjZGVmaW5lIF9fcmlvX2RhdGFkZXhfXworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfZGF0YV9oX3NjY3NfID0gIkAoIylkYXRhLmgJMS4yIjsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZGVidWcuaCBiL2RyaXZlcnMvY2hhci9yaW8vZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmUwZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9kZWJ1Zy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisqKiBGaWxlOgkJZGVidWcuaAorKioKKyoqIEF1dGhvcjoJCURhdmlkIERpeAorKioKKyoqIENyZWF0ZWQ6CQkxMnRoIE1hcmNoIDE5OTMKKyoqCisqKiBMYXN0IG1vZGlmaWVkOgk5My8wNC8yNworKioKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfZGVidWdfaF8KKyNkZWZpbmUgX2RlYnVnX2hfCisKKworI2lmIGRlZmluZWQoRENJUlJVUykKKyNkZWZpbmUJREJQQUNLRVQocGt0LCBvcHQsIHN0ciwgY2huKSAJZGVidWdfcGFja2V0KChwa3QpLCAob3B0KSwgKHN0ciksIChjaG4pKQorI2Vsc2UKKyNkZWZpbmUJREJQQUNLRVQocGt0LCBvcHQsIHN0ciwgYykKKyNlbmRpZgkvKiBEQ0lSUlVTICovCisKKworI2VuZGlmCS8qIF9kZWJ1Z19oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9kZWZhdWx0cy5oIGIvZHJpdmVycy9jaGFyL3Jpby9kZWZhdWx0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzMwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2RlZmF1bHRzLmgKQEAgLTAsMCArMSw1OSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgRCBFIEYgQSBVIEwgVCBTCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19kZWZhdWx0c19oX3NjY3MgPSAiQCgjKWRlZmF1bHRzLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisKKyNkZWZpbmUgTUlMTElTRUNPTkQgICAgICAgICAgIChpbnQpICgxMDAwLzY0KSAgIC8qIDE1LjYyNSBsb3cgdGlja3MgKi8KKyNkZWZpbmUgU0VDT05EICAgICAgICAgICAgICAgIChpbnQpIDE1NjI1ICAgICAgIC8qIExvdyBwcmlvcml0eSB0aWNrcyAqLworCisjaWZkZWYgUlRBCisjZGVmaW5lIFJYX0xJTUlUICAgICAgICh1c2hvcnQpIDMKKyNlbmRpZgorI2lmZGVmIEhPU1QKKyNkZWZpbmUgUlhfTElNSVQgICAgICAgKHVzaG9ydCkgMQorI2VuZGlmCisKKyNkZWZpbmUgTElOS19USU1FT1VUICAgICAgICAgIChpbnQpIChQT0xMX1BFUklPRCAvIDIpCisKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Vpc2EuaCBiL2RyaXZlcnMvY2hhci9yaW8vZWlzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzcxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2Vpc2EuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBlaXNhLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEwCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIyllaXNhLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fZWlzYV9oX18KKyNkZWZpbmUgX19yaW9fZWlzYV9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfZWlzYV9oX3NjY3NfID0gIkAoIyllaXNhLmgJMS4yIjsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisqKiB0aGluZ3MgdG8gZG8gd2l0aCB0aGUgRUlTQSBidXMKKyovCisKKyNkZWZpbmUgUklPX0VJU0FfU1RSSU5HX0FERFJFU1MgCTB4ZmZmZDkJLyogd2hlcmUgRUlTQSBpcyBzdG9yZWQgKi8KKworI2RlZmluZQlSSU9fTUFYX0VJU0FfU0xPVFMJCTE2CS8qIGhvdyBtYW55IEVJU0Egc2xvdHM/ICovCisKKyNkZWZpbmUJUklPX0VJU0FfSURFTlQJCQkweDk4NEQJLyogU3BlY2lhbGl4ICovCisjZGVmaW5lCVJJT19FSVNBX1BST0RVQ1RfQ09ERQkJMHgxNAkvKiBDb2RlIDE0ICovCisjZGVmaW5lCVJJT19FSVNBX0VOQUJMRV9CSVQJCTB4MDEJLyogVG8gZW5hYmxlIGNhcmQgKi8KKworI2RlZmluZQlFSVNBX01FTU9SWV9CQVNFX0xPCQkweEMwMAkvKiBBMTYtQTIzICovCisjZGVmaW5lCUVJU0FfTUVNT1JZX0JBU0VfSEkJCTB4QzAxCS8qIEEyNC1BMzEgKi8KKyNkZWZpbmUJRUlTQV9JTlRFUlJVUFRfVkVDCQkweEMwMgkvKiBzZWUgYmVsb3cgKi8KKyNkZWZpbmUJRUlTQV9DT05UUk9MX1BPUlQJCTB4QzAyCS8qIHNlZSBiZWxvdyAqLworI2RlZmluZQlFSVNBX0lOVEVSUlVQVF9SRVNFVAkJMHhDMDMJLyogcmVhZCB0byBjbGVhciBJUlEgKi8KKworI2RlZmluZQlFSVNBX1BST0RVQ1RfSURFTlRfTE8JCTB4QzgwCS8qIHdoZXJlIFJJT19FSVNBX0lERU5UIGlzICovCisjZGVmaW5lCUVJU0FfUFJPRFVDVF9JREVOVF9ISQkJMHhDODEKKyNkZWZpbmUJRUlTQV9QUk9EVUNUX05VTUJFUgkJMHhDODIgICAvKiB3aGVyZSBQUk9EX0NPREUgaXMgKi8KKyNkZWZpbmUJRUlTQV9SRVZJU0lPTl9OVU1CRVIJCTB4QzgzCS8qIHJldmlzaW9uICgxZHApICovCisjZGVmaW5lCUVJU0FfRU5BQkxFCQkJMHhDODQJLyogc2V0IExTQiB0byBlbmFibGUgY2FyZCAqLworI2RlZmluZQlFSVNBX1VOSVFVRV9OVU1fMAkJMHhDODgJLyogdm9taXQgKi8KKyNkZWZpbmUJRUlTQV9VTklRVUVfTlVNXzEJCTB4QzhBCisjZGVmaW5lCUVJU0FfVU5JUVVFX05VTV8yCQkweEM5MAkvKiBiaXQgc3RyYW5nZWx5IGFycmFuZ2VkICovCisjZGVmaW5lCUVJU0FfVU5JUVVFX05VTV8zCQkweEM5MgorI2RlZmluZQlFSVNBX01BTlVGX1lFQVIJCQkweEM5OAkvKiB3aGVuICovCisjZGVmaW5lCUVJU0FfTUFOVUZfV0VFSwkJCTB4QzlBCS8qIG1vcmUgd2hlbiAqLworCisjZGVmaW5lCUVJU0FfVFBfQk9PVF9GUk9NX1JBTQkweDAxCisjZGVmaW5lCUVJU0FfVFBfQk9PVF9GUk9NX0xJTksJMHgwMAorI2RlZmluZQlFSVNBX1RQX0ZBU1RfTElOS1MJMHgwMgorI2RlZmluZQlFSVNBX1RQX1NMT1dfTElOS1MJMHgwMAorI2RlZmluZQlFSVNBX1RQX0JVU19FTkFCTEUJMHgwNAorI2RlZmluZQlFSVNBX1RQX0JVU19ESVNBQkxFCTB4MDAKKyNkZWZpbmUJRUlTQV9UUF9SVU4JCTB4MDgKKyNkZWZpbmUJRUlTQV9UUF9SRVNFVAkJMHgwMAorI2RlZmluZQlFSVNBX1BPTExFRAkJMHgwMAorI2RlZmluZQlFSVNBX0lSUV8zCQkweDMwCisjZGVmaW5lCUVJU0FfSVJRXzQJCTB4NDAKKyNkZWZpbmUJRUlTQV9JUlFfNQkJMHg1MAorI2RlZmluZQlFSVNBX0lSUV82CQkweDYwCisjZGVmaW5lCUVJU0FfSVJRXzcJCTB4NzAKKyNkZWZpbmUJRUlTQV9JUlFfOQkJMHg5MAorI2RlZmluZQlFSVNBX0lSUV8xMAkJMHhBMAorI2RlZmluZQlFSVNBX0lSUV8xMQkJMHhCMAorI2RlZmluZQlFSVNBX0lSUV8xMgkJMHhDMAorI2RlZmluZQlFSVNBX0lSUV8xNAkJMHhFMAorI2RlZmluZQlFSVNBX0lSUV8xNQkJMHhGMAorCisjZGVmaW5lCUVJU0FfSU5URVJSVVBUX01BU0sJMHhGMAorI2RlZmluZQlFSVNBX0NPTlRST0xfTUFTSwkweDBGCisKKyNkZWZpbmUJUklPX0VJU0FfREVGQVVMVF9NT0RFCUVJU0FfVFBfU0xPV19MSU5LUworCisjZGVmaW5lCVJJT0Vpc2FUb0l2ZWMoWCkJKHVjaGFyICkoKHVjaGFyKSgoWCkgJiBFSVNBX0lOVEVSUlVQVF9NQVNLKT4+NCkKKworI2RlZmluZQlJTkJaKHoseCkJaW5iKCgoeik8PDEyKSB8ICh4KSkKKyNkZWZpbmUJT1VUQlooeix4LHkpCW91dGIoKCgoeik8PDEyKSB8ICh4KSksIHkpCisKKyNlbmRpZiAvKiBfX3Jpb19laXNhX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9lbmFibGUuaCBiL2RyaXZlcnMvY2hhci9yaW8vZW5hYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5YTQxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZW5hYmxlLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgIEUgTiBBIEIgTCBFICAgSCBFIEEgRCBFIFIgUworICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDUworc3RhdGljIGNoYXIgKl9yaW9fZW5hYmxlX2hfc2NjcyA9ICJAKCMpZW5hYmxlLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisKKyNkZWZpbmUgRU5BQkxFX0xUVCAgVFJVRQorI2RlZmluZSBFTkFCTEVfTFJUICBUUlVFCisKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZXJyb3IuaCBiL2RyaXZlcnMvY2hhci9yaW8vZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk0MzhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9lcnJvci5oCkBAIC0wLDAgKzEsODUgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgRSBSIFIgTyBSICBIIEUgQSBEIEUgUiAgIEYgSSBMIEUKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fZXJyb3JfaF9zY2NzID0gIkAoIyllcnJvci5oCTEuMyI7ICovCisjZW5kaWYKKworI2RlZmluZSBFX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMCkKKyNkZWZpbmUgRV9QUk9DRVNTX05PVF9JTklUICAgICAgICAgICAgICAgKCh1c2hvcnQpIDEpCisjZGVmaW5lIEVfTElOS19USU1FT1VUICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAyKQorI2RlZmluZSBFX05PX1JPVVRFICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMykKKyNkZWZpbmUgRV9DT05GVVNFRCAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDQpCisjZGVmaW5lIEVfSE9NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSA1KQorI2RlZmluZSBFX0NTVU1fRkFJTCAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgNikKKyNkZWZpbmUgRV9ESVNDT05ORUNURUQgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDcpCisjZGVmaW5lIEVfQkFEX1JVUCAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSA4KQorI2RlZmluZSBFX05PX1ZJUkdJTiAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgOSkKKyNkZWZpbmUgRV9CT09UX1JVUF9CVVNZICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDEwKQorCisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogUGFyc2VkIHRvIG1lbV9oYWx0KCkKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBFX0NIQU5BTExPQyAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4MCkKKyNkZWZpbmUgRV9QT0xMX0FMTE9DICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODEpCisjZGVmaW5lIEVfTFRUV0FLRSAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDgyKQorI2RlZmluZSBFX0xUVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4MykKKyNkZWZpbmUgRV9MUlRfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODQpCisjZGVmaW5lIEVfQ0lSUlVTICAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDg1KQorI2RlZmluZSBFX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4NikKKyNkZWZpbmUgRV9QSEJfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4ODcpCisjZGVmaW5lIEVfQVJSQVlfQUxMT0MgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDg4KQorI2RlZmluZSBFX1FCVUZfQUxMT0MgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4OSkKKyNkZWZpbmUgRV9QS1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OGEpCisjZGVmaW5lIEVfR0VUX1RYX1FfQlVGICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDhiKQorI2RlZmluZSBFX0dFVF9SWF9RX0JVRiAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4YykKKyNkZWZpbmUgRV9NRU1fT1VUICAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OGQpCisjZGVmaW5lIEVfTU1VX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDhlKQorI2RlZmluZSBFX0xUVF9JTklUICAgICAgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg4ZikKKyNkZWZpbmUgRV9MUlRfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OTApCisjZGVmaW5lIEVfTElOS19SVU4gICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDkxKQorI2RlZmluZSBFX01PTklUT1JfQUxMT0MgICAgICAgICAgICAgICAgICAoKHVzaG9ydCkgMHg5MikKKyNkZWZpbmUgRV9NT05JVE9SX0lOSVQgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4OTMpCisjZGVmaW5lIEVfUE9MTF9JTklUICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSAweDk0KQorCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZXJyb3JzLmggYi9kcml2ZXJzL2NoYXIvcmlvL2Vycm9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjBiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2Vycm9ycy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBlcnJvcnMuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTAKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKWVycm9ycy5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvX2Vycm9yc19oX18KKyNkZWZpbmUJX19yaW9fZXJyb3JzX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9lcnJvcnNfaF9zY2NzXyA9ICJAKCMpZXJyb3JzLmgJMS4yIjsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisqKiBlcnJvciBjb2RlcworKi8KKworI2RlZmluZQlOT1RISU5HX1dST05HX0FUX0FMTAkJMAorI2RlZmluZQlCQURfQ0hBUkFDVEVSX0lOX05BTUUJCTEKKyNkZWZpbmUJVEFCTEVfRU5UUllfSVNOVF9QUk9QRVJMWV9OVUxMCTIKKyNkZWZpbmUJVU5LTk9XTl9IT1NUX05VTUJFUgkJMworI2RlZmluZQlaRVJPX1JUQV9JRAkJCTQKKyNkZWZpbmUJQkFEX1JUQV9JRAkJCTUKKyNkZWZpbmUJRFVQTElDQVRFRF9SVEFfSUQJCTYKKyNkZWZpbmUJRFVQTElDQVRFX1VOSVFVRV9OVU1CRVIJCTcKKyNkZWZpbmUJQkFEX1RUWV9OVU1CRVIJCQk4CisjZGVmaW5lCVRUWV9OVU1CRVJfSU5fVVNFCQk5CisjZGVmaW5lCU5BTUVfVVNFRF9UV0lDRQkJCTEwCisjZGVmaW5lCUhPU1RfSURfTk9UX1pFUk8JCTExCisjZGVmaW5lCUJPT1RfSU5fUFJPR1JFU1MJCTEyCisjZGVmaW5lCUNPUFlJTl9GQUlMRUQJCQkxMworI2RlZmluZQlIT1NUX0ZJTEVfVE9PX0xBUkdFCQkxNAorI2RlZmluZQlDT1BZT1VUX0ZBSUxFRAkJCTE1CisjZGVmaW5lCU5PVF9TVVBFUl9VU0VSCQkJMTYKKyNkZWZpbmUJUklPX0FMUkVBRFlfUE9MTElORwkJMTcKKworI2RlZmluZQlJRF9OVU1CRVJfT1VUX09GX1JBTkdFCQkxOAorI2RlZmluZSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0UJMTkKKyNkZWZpbmUJSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFCTIwCisjZGVmaW5lCVJVUF9OVU1CRVJfT1VUX09GX1JBTkdFCQkyMQorI2RlZmluZQlUVFlfTlVNQkVSX09VVF9PRl9SQU5HRQkJMjIKKyNkZWZpbmUJTElOS19OVU1CRVJfT1VUX09GX1JBTkdFCTIzCisKKyNkZWZpbmUJSE9TVF9OT1RfUlVOTklORwkJMjQKKyNkZWZpbmUJSU9DVExfQ09NTUFORF9VTktOT1dOCQkyNQorI2RlZmluZQlSSU9fU1lTVEVNX0hBTFRFRAkJMjYKKyNkZWZpbmUJV0FJVF9GT1JfRFJBSU5fQlJPS0VOCQkyNworI2RlZmluZQlQT1JUX05PVF9NQVBQRURfSU5UT19TWVNURU0JMjgKKyNkZWZpbmUJRVhDTFVTSVZFX1VTRV9TRVQJCTI5CisjZGVmaW5lCVdBSVRfRk9SX05PVF9DTE9TSU5HX0JST0tFTgkzMAorI2RlZmluZQlXQUlUX0ZPUl9QT1JUX1RPX09QRU5fQlJPS0VOCTMxCisjZGVmaW5lCVdBSVRfRk9SX0NBUlJJRVJfQlJPS0VOCQkzMgorI2RlZmluZQlXQUlUX0ZPUl9OT1RfSU5fVVNFX0JST0tFTgkzMworI2RlZmluZQlXQUlUX0ZPUl9DQU5fQUREX0NPTU1BTkRfQlJPS0VOCTM0CisjZGVmaW5lCVdBSVRfRk9SX0FERF9DT01NQU5EX0JST0tFTgkzNQorI2RlZmluZQlXQUlUX0ZPUl9OT1RfUEFSQU1fQlJPS0VOCTM2CisjZGVmaW5lCVdBSVRfRk9SX1JFVFJZX0JST0tFTgkJMzcKKyNkZWZpbmUJSE9TVF9IQVNfQUxSRUFEWV9CRUVOX0JPT1RFRAkzOAorI2RlZmluZQlVTklUX0lTX0lOX1VTRQkJCTM5CisjZGVmaW5lCUNPVUxETlRfRklORF9FTlRSWQkJNDAKKyNkZWZpbmUJUlRBX1VOSVFVRV9OVU1CRVJfWkVSTwkJNDEKKyNkZWZpbmUJQ0xPU0VfQ09NTUFORF9GQUlMRUQJCTQyCisjZGVmaW5lCVdBSVRfRk9SX0NMT1NFX0JST0tFTgkJNDMKKyNkZWZpbmUJQ1BTX1ZBTFVFX09VVF9PRl9SQU5HRQkJNDQKKyNkZWZpbmUJSURfQUxSRUFEWV9JTl9VU0UJCTQ1CisjZGVmaW5lCVNJR05BTFNfQUxSRUFEWV9TRVQJCTQ2CisjZGVmaW5lCU5PVF9SRUNFSVZJTkdfUFJPQ0VTUwkJNDcKKyNkZWZpbmUJUlRBX05VTUJFUl9XUk9ORwkJNDgKKyNkZWZpbmUgTk9fU1VDSF9QUk9EVUNUCQkJNDkKKyNkZWZpbmUJSE9TVF9TWVNQT1JUX0JBRAkJNTAKKyNkZWZpbmUJSURfTk9UX1RFTlRBVElWRQkJNTEKKyNkZWZpbmUgWFBSSU5UX0NQU19PVVRfT0ZfUkFOR0UJCTUyCisjZGVmaW5lCU5PVF9FTk9VR0hfQ09SRV9GT1JfUENJX0NPUFkJNTMKKworCisjZW5kaWYgLyogX19yaW9fZXJyb3JzX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9mb3JtcGt0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2Zvcm1wa3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGI2NWFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9mb3JtcGt0LmgKQEAgLTAsMCArMSwxNTQgQEAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgRiBPIFIgTSAgIFAgQSBDIEsgRSBUICAgSCBFIEEgRCBFIFIgICBGIEkgTCBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9mb3JtcGt0X2gKKyNkZWZpbmUgX2Zvcm1wa3RfaCAxCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1MKK3N0YXRpYyBjaGFyICpfcmlvX2Zvcm1wa3RfaF9zY2NzID0gIkAoIylmb3JtcGt0LmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBGT1JNX0JPT1RfUEtUXzEgRk9STV9CT09UX1BLVF8xIDsKK3N0cnVjdCBGT1JNX0JPT1RfUEtUXzEgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHBrdF9udW1iZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHBrdF90b3RhbCA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgYm9vdF90b3AgOworICAgICAgICAgICAgICAgICAgICAgICB9IDsKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9CT09UX1BLVF8yIEZPUk1fQk9PVF9QS1RfMiA7CitzdHJ1Y3QgRk9STV9CT09UX1BLVF8yIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBwa3RfbnVtYmVyIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBib290X2RhdGFbMTBdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgfSA7CisKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9BVFRBQ0hfUlRBICAgRk9STV9BVFRBQ0hfUlRBIDsKK3N0cnVjdCBGT1JNX0FUVEFDSF9SVEEgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVyX3NlcmlhbFs0XSA7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVyX2xpbmsgOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGJvb3RlZV9zZXJpYWxbNF0gOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGJvb3RlZV9saW5rIDsKKyAgICAgICAgICAgICAgICAgICB9IDsKKworCit0eXBlZGVmIHN0cnVjdCBGT1JNX0JPT1RfSUQgICBGT1JNX0JPT1RfSUQgOworc3RydWN0IEZPUk1fQk9PVF9JRCAgeworICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBib290ZWVfc2VyaWFsWzRdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBib290ZWVfcHJvZF9pZCA7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVlX2xpbmsgOworICAgICAgICAgICAgICAgICAgIH0gOworCisKKwordHlwZWRlZiBzdHJ1Y3QgRk9STV9ST1VURV8xICAgRk9STV9ST1VURV8xIDsKK3N0cnVjdCBGT1JNX1JPVVRFXzEgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgY21kX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgcGt0X251bWJlciA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICB0b3RhbF9pbl9zZXF1ZW5jZSA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICB1bml0X2lkIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgIGhvc3RfdW5pdF9pZCA7CisgICAgICAgICAgICAgICAgICAgIH0gOworCit0eXBlZGVmIHN0cnVjdCBGT1JNX1JPVVRFXzIgICBGT1JNX1JPVVRFXzIgOworc3RydWN0IEZPUk1fUk9VVEVfMiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgY21kX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBrdF9udW1iZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHRvdGFsX2luX3NlcXVlbmNlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICByb3V0ZV9kYXRhWzldIDsKKyAgICAgICAgICAgICAgICAgICAgfSA7CisKK3R5cGVkZWYgc3RydWN0IEZPUk1fUk9VVEVfUkVRICAgRk9STV9ST1VURV9SRVEgOworc3RydWN0IEZPUk1fUk9VVEVfUkVRIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBrdF9udW1iZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgdG90YWxfaW5fc2VxdWVuY2UgOworICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcm91dGVfZGF0YVsxMF0gOworICAgICAgICAgICAgICAgICAgICAgIH0gOworCisKK3R5cGVkZWYgc3RydWN0IEZPUk1fRVJST1IgICBGT1JNX0VSUk9SIDsKK3N0cnVjdCBGT1JNX0VSUk9SIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgZXJyb3JfY29kZSA7CisKKyAgICAgICAgICAgICAgICAgICAgfSA7CisKK3R5cGVkZWYgc3RydWN0IEZPUk1fU1RBVFVTICAgRk9STV9TVEFUVVMgOworc3RydWN0IEZPUk1fU1RBVFVTIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBjbWRfY29kZSA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgc3RhdHVzX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIGxhc3RfcGFja2V0X3ZhbGlkIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICB0eF9idWZmZXIgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHJ4X2J1ZmZlciA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcG9ydF9zdGF0dXMgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBoYl9zdGF0dXMgOworICAgICAgICAgICAgICAgICAgICB9IDsKKworCit0eXBlZGVmIHN0cnVjdCBGT1JNX0xJTktfU1RBVFVTICAgRk9STV9MSU5LX1NUQVRVUyA7CitzdHJ1Y3QgRk9STV9MSU5LX1NUQVRVUyB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgc3RhdHVzX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBsaW5rX251bWJlciA7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIHJ4X2Vycm9ycyA7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIHR4X2Vycm9ycyA7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIGNzdW1fZXJyb3JzIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCAgZGlzY29ubmVjdHMgOworICAgICAgICAgICAgICAgICAgICB9IDsKKworCisKK3R5cGVkZWYgc3RydWN0IEZPUk1fUEFSVElUSU9OIEZPUk1fUEFSVElUSU9OIDsKK3N0cnVjdCBGT1JNX1BBUlRJVElPTiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGNtZF9jb2RlIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgc3RhdHVzX2NvZGUgOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBwb3J0X251bWJlciA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHR4X21heCA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHJ4X21heCA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHJ4X2xpbWl0IDsKKyAgICAgICAgICAgICAgICAgICAgICB9IDsKKworCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Z1bmMuaCBiL2RyaXZlcnMvY2hhci9yaW8vZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjM4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2Z1bmMuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogZnVuYy5oCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMAorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpZnVuYy5oCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fZnVuY19oX2RlZgorI2RlZmluZSBfX2Z1bmNfaF9kZWYKKworI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgKl9mdW5jX2hfc2Njc18gPSAiQCgjKWZ1bmMuaAkxLjMiOworI2VuZGlmCisjZW5kaWYKKworLyogcmlvYm9vdC5jICovCitpbnQgUklPQm9vdENvZGVSVEEoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBEb3duTG9hZCAqKTsKK2ludCBSSU9Cb290Q29kZUhPU1Qoc3RydWN0IHJpb19pbmZvICosIHJlZ2lzdGVyIHN0cnVjdCBEb3duTG9hZCAqKTsKK2ludCBSSU9Cb290Q29kZVVOS05PV04oc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBEb3duTG9hZCAqKTsKK3ZvaWQgbXNlY190aW1lb3V0KHN0cnVjdCBIb3N0ICopOworaW50IFJJT0Jvb3RSdXAoc3RydWN0IHJpb19pbmZvICosIHVpbnQsIHN0cnVjdCBIb3N0ICosIHN0cnVjdCBQS1QgKik7CitpbnQgUklPQm9vdE9rKHN0cnVjdCByaW9faW5mbyAqLHN0cnVjdCBIb3N0ICosIHVsb25nKTsKK2ludCBSSU9SdGFCb3VuZChzdHJ1Y3QgcmlvX2luZm8gKiwgdWludCk7IAordm9pZCBGaWxsU2xvdChpbnQsIGludCwgdWludCwgc3RydWN0IEhvc3QgKik7CisKKy8qIHJpb2NtZC5jICovCitpbnQgUklPRm9hZFJ0YShzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgTWFwICopOworaW50IFJJT1pvbWJpZVJ0YShzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgTWFwICopOworaW50IFJJT0NvbW1hbmRSdGEoc3RydWN0IHJpb19pbmZvICosIHVpbnQsIGludCAoKiBmdW5jKSggc3RydWN0IEhvc3QgKiwgCisJCQkJCQkJCXN0cnVjdCBNYXAgKikpOworaW50IFJJT0lkZW50aWZ5UnRhKHN0cnVjdCByaW9faW5mbyAqLCBjYWRkcl90KTsgCitpbnQgUklPS2lsbE5laWdoYm91cihzdHJ1Y3QgcmlvX2luZm8gKiwgY2FkZHJfdCk7CitpbnQgUklPU3VzcGVuZEJvb3RSdGEoc3RydWN0IEhvc3QgKiwgaW50LCBpbnQpOworaW50IFJJT0ZvYWRXYWtldXAoc3RydWN0IHJpb19pbmZvICopOworc3RydWN0IENtZEJsayAqIFJJT0dldENtZEJsayh2b2lkKTsKK3ZvaWQgUklPRnJlZUNtZEJsayhzdHJ1Y3QgQ21kQmxrICopOworaW50IFJJT1F1ZXVlQ21kQmxrKHN0cnVjdCBIb3N0ICosIHVpbnQsIHN0cnVjdCBDbWRCbGsgKik7Cit2b2lkIFJJT1BvbGxIb3N0Q29tbWFuZHMoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBIb3N0ICopOworaW50IFJJT1dGbHVzaE1hcmsoaW50LCBzdHJ1Y3QgQ21kQmxrICopOworaW50IFJJT1JGbHVzaEVuYWJsZShpbnQsIHN0cnVjdCBDbWRCbGsgKik7CitpbnQgUklPVW5Vc2UoaW50LCBzdHJ1Y3QgQ21kQmxrICopOwordm9pZCBTaG93UGFja2V0KHVpbnQsIHN0cnVjdCBQS1QgKik7CisKKy8qIHJpb2N0cmwuYyAqLworaW50IGNvcHlpbihpbnQsIGNhZGRyX3QsIGludCk7CitpbnQgcmlvY29udHJvbChzdHJ1Y3QgcmlvX2luZm8gKiwgZGV2X3QsaW50LGNhZGRyX3QsaW50KTsgCitpbnQgUklPUHJlZW1wdGl2ZUNtZChzdHJ1Y3QgcmlvX2luZm8gKixzdHJ1Y3QgUG9ydCAqLHVjaGFyKTsKKworLyogcmlvaW5pdC5jICovCit2b2lkIHJpb2luaXQoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBSaW9Ib3N0SW5mbyAqKTsKK3ZvaWQgUklPSW5pdEhvc3RzKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgUmlvSG9zdEluZm8gKik7Cit2b2lkIFJJT0lTQWluaXQoc3RydWN0IHJpb19pbmZvICosaW50KTsKK2ludCBSSU9Eb0FUKHN0cnVjdCByaW9faW5mbyAqLCBpbnQsIGludCk7CitjYWRkcl90IFJJT0NoZWNrRm9yQVRDYXJkKGludCk7CitpbnQgUklPQXNzaWduQVQoc3RydWN0IHJpb19pbmZvICosIGludCwgY2FkZHJfdCwgaW50KTsKK2ludCBSSU9Cb2FyZFRlc3QocGFkZHJfdCwgY2FkZHJfdCwgdWNoYXIsIGludCk7Cit2b2lkIFJJT0FsbG9jRGF0YVN0cnVjdHMoc3RydWN0IHJpb19pbmZvICopOwordm9pZCBSSU9TZXR1cERhdGFTdHJ1Y3RzKHN0cnVjdCByaW9faW5mbyAqKTsKK2ludCBSSU9EZWZhdWx0TmFtZShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCk7CitzdHJ1Y3QgcmlvVmVyc2lvbiAqIFJJT1ZlcnNpZCh2b2lkKTsKK2ludCBSSU9NYXBpbihwYWRkcl90LCBpbnQsIGNhZGRyX3QgKik7Cit2b2lkIFJJT01hcG91dChwYWRkcl90LCBsb25nLCBjYWRkcl90KTsKK3ZvaWQgUklPSG9zdFJlc2V0KHVpbnQsIHZvbGF0aWxlIHN0cnVjdCBEcFJhbSAqLCB1aW50KTsKKworLyogcmlvaW50ci5jICovCit2b2lkIFJJT1R4RW5hYmxlKGNoYXIgKik7Cit2b2lkIFJJT1NlcnZpY2VIb3N0KHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCBpbnQpOworaW50IHJpb3Rwcm9jKHN0cnVjdCByaW9faW5mbyAqLCByZWdpc3RlciBzdHJ1Y3QgdHR5c3RhdGljcyAqLCBpbnQsIGludCk7CisKKy8qIHJpb3BhcmFtLmMgKi8KK2ludCBSSU9QYXJhbShzdHJ1Y3QgUG9ydCAqLCBpbnQsIGludCwgaW50KTsKK2ludCBSSU9EZWxheShzdHJ1Y3QgUG9ydCAqUG9ydFAsIGludCk7CitpbnQgUklPRGVsYXlfbmkoc3RydWN0IFBvcnQgKlBvcnRQLCBpbnQpOwordm9pZCBtc190aW1lb3V0KHN0cnVjdCBQb3J0ICopOworaW50IGNhbl9hZGRfdHJhbnNtaXQoc3RydWN0IFBLVCAqKiwgc3RydWN0IFBvcnQgKik7Cit2b2lkIGFkZF90cmFuc21pdChzdHJ1Y3QgUG9ydCAqKTsKK3ZvaWQgcHV0X2ZyZWVfZW5kKHN0cnVjdCBIb3N0ICosIHN0cnVjdCBQS1QgKik7CitpbnQgY2FuX3JlbW92ZV9yZWNlaXZlKHN0cnVjdCBQS1QgKiosIHN0cnVjdCBQb3J0ICopOwordm9pZCByZW1vdmVfcmVjZWl2ZShzdHJ1Y3QgUG9ydCAqKTsKKworLyogcmlvcm91dGUuYyAqLworaW50IFJJT1JvdXRlUnVwKHN0cnVjdCByaW9faW5mbyAqLCB1aW50LCBzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgUEtUICopOwordm9pZCBSSU9GaXhQaGJzKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCB1aW50KTsgCit1aW50IEdldFVuaXRUeXBlKHVpbnQpOworaW50IFJJT1NldENoYW5nZShzdHJ1Y3QgcmlvX2luZm8gKik7CitpbnQgUklPRmluZEZyZWVJRChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCAqLCB1aW50ICopOworCisKKy8qIHJpb3R0eS5jICovCisKK2ludCByaW90b3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKK2ludCByaW90Y2xvc2Uodm9pZCAgKnB0cik7CitpbnQgcmlvdGlvY3RsKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqLCByZWdpc3RlciBpbnQsIHJlZ2lzdGVyIGNhZGRyX3QpOyAKK3ZvaWQgdHR5c2V0aChzdHJ1Y3QgUG9ydCAqLCBzdHJ1Y3QgdHR5c3RhdGljcyAqLCBzdHJ1Y3Qgb2xkX3NndHR5YiAqc2cpOworCisvKiByaW90YWJsZS5jICovCitpbnQgUklPTmV3VGFibGUoc3RydWN0IHJpb19pbmZvICopOworaW50IFJJT0FwZWwoc3RydWN0IHJpb19pbmZvICopOworaW50IFJJT0RlbGV0ZVJ0YShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IE1hcCAqKTsKK2ludCBSSU9Bc3NpZ25SdGEoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBNYXAgKik7CitpbnQgUklPUmVNYXBQb3J0cyhzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgc3RydWN0IE1hcCAqKTsKK2ludCBSSU9DaGFuZ2VOYW1lKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgTWFwKik7CisKKyNpZiAwCisvKiByaW9kcnZyLmMgKi8KK3N0cnVjdCByaW9faW5mbyAqIHJpb19pbnN0YWxsKHN0cnVjdCBSaW9Ib3N0SW5mbyAqKTsKK2ludCByaW9fdW5pbnN0YWxsKHJlZ2lzdGVyIHN0cnVjdCByaW9faW5mbyAqKTsKK2ludCByaW9fb3BlbihzdHJ1Y3QgcmlvX2luZm8gKiwgaW50LCBzdHJ1Y3QgZmlsZSAqKTsKK2ludCByaW9fY2xvc2Uoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBmaWxlICopOworaW50IHJpb19yZWFkKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBjaGFyICosIGludCk7CitpbnQgcmlvX3dyaXRlKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqCWYsIGNoYXIgKiwgaW50KTsKK2ludCByaW9faW9jdGwoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBmaWxlICosIGludCwgY2hhciAqKTsKK2ludCByaW9fc2VsZWN0KHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqCWYsIGludCwgc3RydWN0IHNlbCAqKTsKK2ludAlyaW9faW50cihjaGFyICopOworaW50IHJpb19pc3JfdGhyZWFkKGNoYXIgICopOworc3RydWN0IHJpb19pbmZvICogcmlvX2luZm9fc3RvcmUoIGludCBjbWQsIHN0cnVjdCByaW9faW5mbyAqIHApOworI2VuZGlmCisKK2V4dGVybiBpbnQgICAgcmlvX3BjaWNvcHkoY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBuKTsKK2V4dGVybiBpbnQgcmlvX21pbm9yIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiBpbnQgcmlvX2lzbW9kZW0gKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIHZvaWQgcmlvX3VkZWxheSAoaW50IHVzZWNzKTsKKworZXh0ZXJuIHZvaWQgcmlvX3N0YXJ0X2NhcmRfcnVubmluZyAoc3RydWN0IEhvc3QgKiBIb3N0UCk7CisKKyNlbmRpZgkvKiBfX2Z1bmNfaF9kZWYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2NTk2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBob3N0LmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEwCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIylob3N0LmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9faG9zdF9oX18KKyNkZWZpbmUgX19yaW9faG9zdF9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyICpfaG9zdF9oX3NjY3NfID0gIkAoIylob3N0LmgJMS4yIjsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisqKiB0aGUgaG9zdCBzdHJ1Y3R1cmUgLSBvbmUgcGVyIGhvc3QgY2FyZCBpbiB0aGUgc3lzdGVtLgorKi8KKworI2RlZmluZQlNQVhfRVhUUkFfVU5JVFMJNjQKKworLyoKKyoqICAgIEhvc3QgZGF0YSBzdHJ1Y3R1cmUuIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHNvZnR3YXJlIGVxdWl2LiBvZgorKiogICAgdGhlIGhvc3QuCisqLworc3RydWN0ICAgIEhvc3QKK3sKKyAgICB1Y2hhciAgICAgICAgICAgICAJICAgIFR5cGU7ICAgICAgLyogUklPX0VJU0EsIFJJT19NQ0EsIC4uLiAqLworICAgIHVjaGFyICAgICAgICAgICAgIAkgICAgSXZlYzsgICAgICAvKiBQT0xMRUQgb3IgaXZlYyBudW1iZXIgKi8KKyAgICB1Y2hhciAgICAgICAgICAgICAJICAgIE1vZGU7ICAgICAgLyogQ29udHJvbCBzdHVmZiAqLworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgIFNsb3Q7ICAgICAgLyogU2xvdCAqLworICAgIHZvbGF0aWxlIGNhZGRyX3QgICAgICAgIENhZGRyOyAgICAgLyogS1YgYWRkcmVzcyBvZiBEUFJBTSAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBEcFJhbSAgKkNhcmRQOyAgICAgLyogS1YgYWRkcmVzcyBvZiBEUFJBTSwgd2l0aCBvdmVybGF5ICovCisgICAgcGFkZHJfdCAgICAgICAgICAJICAgIFBhZGRyUDsgICAgLyogUGh5cy4gYWRkcmVzcyBvZiBEUFJBTSAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIE5hbWVbTUFYX05BTUVfTEVOXTsgIC8qIFRoZSBuYW1lIG9mIHRoZSBob3N0ICovCisgICAgdWludCAgICAgICAgICAgIAkgICAgVW5pcXVlTnVtOyAvKiBob3N0IHVuaXF1ZSBudW1iZXIgKi8KKyAgICBzcGlubG9ja190CSAgICAgICAgICAgIEhvc3RMb2NrOyAgLyogTG9jayBzdHJ1Y3R1cmUgZm9yIE1QWCAqLworICAgIC8qc3RydWN0IHBjaV9kZXZpbmZvICAgIFBjaURldkluZm87ICovLyogUENJIEJ1cy9EZXZpY2UvRnVuY3Rpb24gc3R1ZmYgKi8KKyAgICAvKnN0cnVjdCBsb2NrYgkgICAgSG9zdExvY2s7ICAqLy8qIExvY2sgc3RydWN0dXJlIGZvciBNUFggKi8KKyAgICB1aW50ICAgICAgICAgICAgICAgICAgICBXb3JrVG9CZURvbmU7IC8qIHNldCB0byB0cnVlIGVhY2ggaW50ZXJydXB0ICovCisgICAgdWludCAgICAgICAgICAgICAgICAgICAgSW5JbnRyOyAgICAvKiBCZWluZyBzZXJ2aWNlZD8gKi8KKyAgICB1aW50ICAgICAgICAgICAgICAgICAgICBJbnRTcnZEb25lOy8qIGhvc3QncyBpbnRlcnJ1cHQgaGFzIGJlZW4gc2VydmljZWQgKi8KKyAgICBpbnQJCQkgICAgKCpDb3B5KSggY2FkZHJfdCwgY2FkZHJfdCwgaW50ICk7IC8qIGNvcHkgZnVuYyAqLworICAgIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworICAgIC8qCisgICAgKiogICAgICAgICAgICAgICBJIE0gUCBPIFIgVCBBIE4gVCAhCisgICAgKioKKyAgICAqKiBUaGUgcmVzdCBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGNsZWFyZWQgdG8gemVybyBhZnRlcgorICAgICoqIGEgUklPX0hPU1RfRk9BRCBjb21tYW5kLgorICAgICovCisgICAgCisgICAgdWxvbmcgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAvKiBXaGF0cyBnb2luZyBkb3duICovCisjZGVmaW5lIFJDX1dBSVRJTkcgICAgICAgICAgICAwCisjZGVmaW5lIFJDX1NUQVJUVVAgICAgICAgICAgICAxCisjZGVmaW5lIFJDX1JVTk5JTkcgICAgICAgICAgICAyCisjZGVmaW5lIFJDX1NUVUZGRUQgICAgICAgICAgICAzCisjZGVmaW5lIFJDX1NPTUVUSElORyAgICAgICAgICA0CisjZGVmaW5lIFJDX1NPTUVUSElOR19ORVcgICAgICA1CisjZGVmaW5lIFJDX1NPTUVUSElOR19FTFNFICAgICA2CisjZGVmaW5lIFJDX1JFQURZICAgICAgICAgICAgICA3CisjZGVmaW5lIFJVTl9TVEFURSAgICAgICAgICAgICA3CisvKgorKiogQm9vdCBtb2RlIGFwcGxpZXMgdG8gdGhlIHdheSBpbiB3aGljaCBob3N0cyBpbiB0aGlzIHN5c3RlbSB3aWxsCisqKiBib290IFJUQXMKKyovCisjZGVmaW5lIFJDX0JPT1RfQUxMICAgICAgICAgICAweDgJLyogQm9vdCBhbGwgUlRBcyBhdHRhY2hlZCAqLworI2RlZmluZSBSQ19CT09UX09XTiAgICAgICAgICAgMHgxMAkvKiBPbmx5IGJvb3QgUlRBcyBib3VuZCB0byB0aGlzIHN5c3RlbSAqLworI2RlZmluZSBSQ19CT09UX05PTkUgICAgICAgICAgMHgyMAkvKiBEb24ndCBib290IGFueSBSVEFzIChzbGF2ZSBtb2RlKSAqLworCisgICAgc3RydWN0IFRvcAkJICAgIFRvcG9sb2d5W0xJTktTX1BFUl9VTklUXTsgLyogb25lIHBlciBsaW5rICovCisgICAgc3RydWN0IE1hcCAgICAgICAgICAgICAgTWFwcGluZ1tNQVhfUlVQXTsgICAgIC8qIE1hcHBpbmdzIGZvciBob3N0ICovCisgICAgc3RydWN0IFBIQgkJICAgICpQaGJQOyAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBQSEIgYXJyYXkgKi8KKyAgICB1c2hvcnQgICAgICAgICAgIAkgICAgKlBoYk51bVA7ICAgICAgICAgICAgIC8qIFB0ciB0byBOdW1iZXIgb2YgUEhCJ3MgKi8KKyAgICBzdHJ1Y3QgTFBCIAkgICAgICAgICAgICAqTGlua1N0clAgOyAgICAgICAgICAgLyogTGluayBTdHJ1Y3R1cmUgQXJyYXkgKi8KKyAgICBzdHJ1Y3QgUlVQICAgICAgIAkgICAgKlJ1cFA7ICAgICAgICAgICAgICAgIC8qIFNpeHRlZW4gcmVhbCBydXBzIGhlcmUgKi8KKyAgICBzdHJ1Y3QgUEFSTV9NQVAgIAkgICAgKlBhcm1NYXBQOyAgICAgICAgICAgIC8qIHBvaW50cyB0byB0aGUgcGFybW1hcCAqLworICAgIHVpbnQgICAgICAgICAgICAgICAgICAgIEV4dHJhVW5pdHNbTUFYX0VYVFJBX1VOSVRTXTsgLyogdW5rbm93biB0aGluZ3MgKi8KKyAgICB1aW50ICAgICAgICAgICAgICAgICAgICBOdW1FeHRyYUJvb3RlZDsgICAgICAgLyogaG93IG1hbnkgb2YgdGhlIGFib3ZlICovCisgICAgLyoKKyAgICAqKiBUd2VudHkgbG9naWNhbCBydXBzLgorICAgICoqIFRoZSBmaXJzdCBzaXh0ZWVuIGFyZSB0aGUgcmVhbCBSdXAgZW50cmllcyAoYWJvdmUpLCB0aGUgbGFzdCBmb3VyCisgICAgKiogYXJlIHRoZSBsaW5rIFJVUHMuCisgICAgKi8KKyAgICBzdHJ1Y3QgVW5peFJ1cAkgICAgVW5peFJ1cHNbTUFYX1JVUCtMSU5LU19QRVJfVU5JVF07CisJaW50CQkJCXRpbWVvdXRfaWQ7CS8qIEZvciBjYWxsaW5nIDEwMCBtcyBkZWxheXMgKi8KKwlpbnQJCQkJdGltZW91dF9zZW07LyogRm9yIGNhbGxpbmcgMTAwIG1zIGRlbGF5cyAqLworICAgIGxvbmcgbG9ja3M7IC8qIGxvbmcgcmVxJ2QgZm9yIHNldF9iaXQgLS1SUiAqLworICAgIGNoYXIgICAgICAgICAgICAgCSAgICBfX19fZW5kX21hcmtlcl9fX187Cit9OworI2RlZmluZSBDb250cm9sICAgICAgQ2FyZFAtPkRwQ29udHJvbAorI2RlZmluZSBTZXRJbnQgICAgICAgQ2FyZFAtPkRwU2V0SW50CisjZGVmaW5lIFJlc2V0VHB1ICAgICBDYXJkUC0+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+cnhfZW5kKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhiLT5yeF9hZGQgPSBwaGItPnJ4X3N0YXJ0O1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhiLT5yeF9hZGQrKzsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBSVEEKKyNkZWZpbmUgc3BseChvbGRzcGwpICAgIGlmICgob2xkc3BsKSA9PSAwKSBzcGwwKCkKKyNlbmRpZgorCisjZW5kaWYgLyogaWZuZGVmIF9saXN0LmggKi8KKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbHJ0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2xydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWM4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2xydC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgTCBSIFQKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19scnRfaF9zY2NzID0gIkAoIylscnQuaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIERDSVJSVVMKKyNkZWZpbmUgTFJUX1NUQUNLICAgICAgICh1bnNpZ25lZCBzaG9ydCkgNjAwCisjZWxzZQorI2RlZmluZSBMUlRfU1RBQ0sgICAgICAgICh1c2hvcnQpIDIwMAorI2VuZGlmCisKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2x0dC5oIGIvZHJpdmVycy9jaGFyL3Jpby9sdHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdkY2VjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9sdHQuaApAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIEwgVCBUCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9fbHR0X2hfc2NjcyA9ICJAKCMpbHR0LmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRENJUlJVUworI2RlZmluZSBMVFRfU1RBQ0sgICAgICAgKHVuc2lnbmVkIHNob3J0KSAgNjAwCisjZWxzZQorI2RlZmluZSBMVFRfU1RBQ0sgICAgICAgKHVzaG9ydCkgMjAwCisjZW5kaWYKKyAKKworCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbHR0d2FrZS5oIGIvZHJpdmVycy9jaGFyL3Jpby9sdHR3YWtlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxN2QwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbHR0d2FrZS5oCkBAIC0wLDAgKzEsNTMgQEAKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICBMIFQgVCAgICBXIEEgSyBFIFUgUCAgICBIIEUgQSBEIEUgUgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX2x0dHdha2VfaF9zY2NzID0gIkAoIylsdHR3YWtlLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIExUVF9XQUtFVVBfU1RBQ0sgICAgICAgICAgNTAwCisjZGVmaW5lIExUVF9XQUtFVVBfSU5URVJWQUwgICAgICAgKGludCkgKDUwMCAqIE1JTExJU0VDT05EKQorCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbWFwLmggYi9kcml2ZXJzL2NoYXIvcmlvL21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDY0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL21hcC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBtYXAuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTEKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKW1hcC5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX21hcF9oX18KKyNkZWZpbmUgX19yaW9fbWFwX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfbWFwX2hfc2Njc18gPSAiQCgjKW1hcC5oCTEuMiI7CisjZW5kaWYKKworLyoKKyoqIG1hcHBpbmcgc3RydWN0dXJlIHBhc3NlZCB0byBhbmQgZnJvbSB0aGUgY29uZmlnLnJpbyBwcm9ncmFtIHRvCisqKiBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgdG9wb2xvZ3kgb2YgdGhlIHdvcmxkCisqLworCisjZGVmaW5lIE1BWF9NQVBfRU5UUlkgMTcKKyNkZWZpbmUJVE9UQUxfTUFQX0VOVFJJRVMgKE1BWF9NQVBfRU5UUlkqUklPX1NMT1RTKQorI2RlZmluZQlNQVhfTkFNRV9MRU4gMzIKKworc3RydWN0IE1hcAoreworCXVpbnQJSG9zdFVuaXF1ZU51bTsJICAgICAgICAvKiBTdXBwb3J0aW5nIGhvc3RzIHVuaXF1ZSBudW1iZXIgKi8KKwl1aW50CVJ0YVVuaXF1ZU51bTsJICAgICAgICAvKiBVbmlxdWUgbnVtYmVyICovCisJLyoKKwkqKiBUaGUgbmV4dCB0d28gSURzIG11c3QgYmUgc3dhcHBlZCBvbiBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMKKwkqKiB3aGVuIHVzaW5nIGEgdjIuMDQgL2V0Yy9yaW8vY29uZmlnIHdpdGggYSB2My4wMCBkcml2ZXIgKHdoZW4KKwkqKiB1cGdyYWRpbmcgZm9yIGV4YW1wbGUpLgorCSovCisJdXNob3J0CUlEOwkJCS8qIElEIHVzZWQgaW4gdGhlIHN1Ym5ldCAqLworCXVzaG9ydAlJRDI7CQkJLyogSUQgb2YgMm5kIGJsb2NrIG9mIDggZm9yIDE2IHBvcnQgKi8KKwl1bG9uZwlGbGFnczsJCQkvKiBCb290ZWQsIElEIEdpdmVuLCBEaXNjb25uZWN0ZWQgKi8KKwl1bG9uZwlTeXNQb3J0OwkJLyogRmlyc3QgdHR5IG1hcHBlZCB0byB0aGlzIHBvcnQgKi8KKwlzdHJ1Y3QgVG9wICAgVG9wb2xvZ3lbTElOS1NfUEVSX1VOSVRdOwkvKiBJRCBjb25uZWN0ZWQgdG8gZWFjaCBsaW5rICovCisJY2hhcglOYW1lW01BWF9OQU1FX0xFTl07ICAgICAgICAvKiBDdXRlIG5hbWUgYnkgd2hpY2ggUlRBIGlzIGtub3duICovCit9OworCisvKgorKiogRmxhZyB2YWx1ZXM6CisqLworI2RlZmluZQlSVEFfQk9PVEVECQkweDAwMDAwMDAxCisjZGVmaW5lIFJUQV9ORVdCT09UCQkweDAwMDAwMDEwCisjZGVmaW5lCU1TR19ET05FCQkweDAwMDAwMDIwCisjZGVmaW5lCVJUQV9JTlRFUkNPTk5FQ1QJMHgwMDAwMDA0MAorI2RlZmluZQlSVEExNl9TRUNPTkRfU0xPVAkweDAwMDAwMDgwCisjZGVmaW5lCUJFRU5fSEVSRQkJMHgwMDAwMDEwMAorI2RlZmluZSBTTE9UX1RFTlRBVElWRQkJMHg0MDAwMDAwMAorI2RlZmluZSBTTE9UX0lOX1VTRQkJMHg4MDAwMDAwMAorCisvKgorKiogSG9zdFVuaXF1ZU51bSBpcyB0aGUgdW5pcXVlIG51bWJlciBmcm9tIHRoZSBob3N0IGNhcmQgdGhhdCB0aGlzIFJUQQorKiogaXMgdG8gYmUgY29ubmVjdGVkIHRvLgorKiogUnRhVW5pcXVlTnVtIGlzIHRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBSVEEgY29uY2VybmVkLiBJdCB3aWxsIGJlIFpFUk8KKyoqIGlmIHRoZSBzbG90IGluIHRoZSB0YWJsZSBpcyB1bnVzZWQuIElmIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBIb3N0VW5pcXVlTnVtCisqKiB0aGVuIHRoaXMgc2xvdCByZXByZXNlbnRzIGEgaG9zdCBjYXJkLgorKiogRmxhZ3MgY29udGFpbnMgY3VycmVudCBib290L3JvdXRlIHN0YXRlIGluZm8KKyoqIFN5c1BvcnQgaXMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgMC01MDQsIGJlaW5nIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IHR0eQorKiogb24gdGhpcyBSVEEuIEVhY2ggUlRBIHN1cHBvcnRzIDggcG9ydHMuIFRoZSBTeXNQb3J0IHZhbHVlIG11c3QgYmUgbW9kdWxvIDguCisqKiBTeXNQb3J0IDAtMTI3IGNvcnJlc3BvbmQgdG8gL2Rldi90dHlyMDAxIHRvIC9kZXYvdHR5cjEyOCwgd2l0aCBtaW5vcgorKiogbnVtYmVycyAwLTEyNy4gU3lzUG9ydCAxMjgtMjU1IGNvcnJlc3BvbmQgdG8gL2Rldi90dHlyMTI5IHRvIC9kZXYvdHR5cjI1NiwKKyoqIGFnYWluIHdpdGggbWlub3IgbnVtYmVycyAwLTEyNywgYW5kIHNvIG9uIGZvciBTeXNQb3J0cyAyNTYtMzgzIGFuZCAzODQtNTExCisqKiBJRCB3aWxsIGJlIGluIHRoZSByYW5nZSAwLTE2IGZvciBhIGBrbm93bicgUlRBLiBJRCB3aWxsIGJlIDB4RkZGRiBmb3IgYW4KKyoqIHVudXNlZCBzbG90L3Vua25vd24gSUQgZXRjLgorKiogVGhlIFRvcG9sb2d5IGFycmF5IGNvbnRhaW5zIHRoZSBJRCBvZiB0aGUgdW5pdCBjb25uZWN0ZWQgdG8gZWFjaCBvZiB0aGUKKyoqIGZvdXIgbGlua3Mgb24gdGhpcyB1bml0LiBUaGUgZW50cnkgd2lsbCBiZSAweEZGRkYgaWYgTk9USElORyBpcyBjb25uZWN0ZWQKKyoqIHRvIHRoZSBsaW5rLCBvciB3aWxsIGJlIDB4RkYwMCBpZiBhbiBVTktOT1dOIHVuaXQgaXMgY29ubmVjdGVkIHRvIHRoZSBsaW5rLgorKiogVGhlIE5hbWUgZmllbGQgaXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLCB1cHRvIDMxIGNoYXJhY3RlcnMsIGNvbnRhaW5pbmcKKyoqIHRoZSAnY3V0ZScgbmFtZSB0aGF0IHRoZSBzeXNhZG1pbi91c2VycyBrbm93IHRoZSBSVEEgYnkuIEl0IGlzIHBlcm1pc3NpYmxlCisqKiBmb3IgdGhpcyBzdHJpbmcgdG8gY29udGFpbiBhbnkgY2hhcmFjdGVyIGluIHRoZSByYW5nZSBcMDQwIHRvIFwxNzYgaW5jbHVzaXZlLgorKiogSW4gcGFydGljdWxhciwgY3RybCBzZXF1ZW5jZXMgYW5kIERFTCAoMHg3RiwgXDE3NykgYXJlIG5vdCBhbGxvd2VkLiBUaGUKKyoqIHNwZWNpYWwgY2hhcmFjdGVyICclJyBJUyBhbGxvd2FibGUsIGFuZCBuZWVkcyBubyBzcGVjaWFsIGFjdGlvbi4KKyoqCisqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbWNhLmggYi9kcml2ZXJzL2NoYXIvcmlvL21jYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTMyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL21jYS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IG1jYS5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMQorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpbWNhLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fbWNhX2hfXworI2RlZmluZQlfX3Jpb19tY2FfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9tY2FfaF9zY2NzXyA9ICJAKCMpbWNhLmgJMS4yIjsKKyNlbmRpZgorCisvKgorKiogTWljcm8gQ2hhbm5lbCBzdHVmZgorKi8KKworI2RlZmluZQlNY2FNYXhTbG90cwk4CisjZGVmaW5lIE1jYVNsb3RTZWxlY3QJMHg5NgorI2RlZmluZQlNY2FTbG90RW5hYmxlCTB4MDgKKyNkZWZpbmUJTWNhSWRMb3cJMHgxMDAKKyNkZWZpbmUJTWNhSWRIaWdoCTB4MTAxCisjZGVmaW5lCU1jYUlycUVuYWJsZQkweDEwMgorI2RlZmluZQlNY2FNZW1vcnkJMHgxMDMKKyNkZWZpbmUgTWNhUklPSWQJMHg2YTVjCisjZGVmaW5lCU1jYUlycTkJCTB4MDAKKyNkZWZpbmUJTWNhSXJxMwkJMHgwMgorI2RlZmluZQlNY2FJcnE0CQkweDA0CisjZGVmaW5lCU1jYUlycTcJCTB4MDYKKyNkZWZpbmUJTWNhSXJxMTAJMHgwOAorI2RlZmluZQlNY2FJcnExMQkweDBBCisjZGVmaW5lCU1jYUlycTEyCTB4MEMKKyNkZWZpbmUJTWNhSXJxMTUJMHgwRQorI2RlZmluZSBNY2FJcnFNYXNrCTB4MEUKKyNkZWZpbmUJTWNhQ2FyZEVuYWJsZQkweDAxCisjZGVmaW5lCU1jYUFkZHJlc3MoWCkJKCgoWCkmMHhGRik8PDE2KQorCisjZGVmaW5lCU1jYVRwRmFzdExpbmtzCSAgICAgICAgMHg0MAorI2RlZmluZQlNY2FUcFNsb3dMaW5rcwkgICAgICAgIDB4MDAKKyNkZWZpbmUJTWNhVHBCb290RnJvbVJhbQkweDAxCisjZGVmaW5lCU1jYVRwQm9vdEZyb21MaW5rCTB4MDAKKyNkZWZpbmUJTWNhVHBCdXNFbmFibGUJCTB4MDIKKyNkZWZpbmUJTWNhVHBCdXNEaXNhYmxlCQkweDAwCisKKyNkZWZpbmUJUklPX01DQV9ERUZBVUxUX01PREUJU0xPV19MSU5LUworCisjZW5kaWYJLyogX19yaW9fbWNhX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9tZXNnLmggYi9kcml2ZXJzL2NoYXIvcmlvL21lc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Y2YzBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9tZXNnLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogbWVzZy5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMgorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpbWVzZy5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX21lc2dfaF9fCisjZGVmaW5lCV9fcmlvX21lc2dfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9tZXNnX2hfc2Njc18gPSAiQCgjKW1lc2cuaAkxLjIiOworI2VuZGlmCisKKworI2VuZGlmIC8qIF9fcmlvX21lc2dfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BhcmFtLmggYi9kcml2ZXJzL2NoYXIvcmlvL3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjMzBiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcGFyYW0uaApAQCAtMCwwICsxLDYxIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBwYXJhbS5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMgorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMQorKioKKyoqICBpZGVudCBAKCMpcGFyYW0uaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19wYXJhbV9oX18KKyNkZWZpbmUgX19yaW9fcGFyYW1faF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9wYXJhbV9oX3NjY3NfID0gIkAoIylwYXJhbS5oCTEuMiI7CisjZW5kaWYKKworCisvKgorKiogdGhlIHBhcmFtIGNvbW1hbmQgYmxvY2ssIGFzIHVzZWQgaW4gT1BFTiBhbmQgUEFSQU0gY2FsbHMuCisqLworCitzdHJ1Y3QgcGhiX3BhcmFtCit7CisgICAgQllURSAgICBDbWQ7ICAgICAgICAvKiBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZXNlIGxpbmUgdXAgKi8KKyAgICBCWVRFICAgIENvcjE7ICAgICAgIC8qIHdpdGggd2hhdCBpcyBleHBlY3RlZCBhdCB0aGUgb3RoZXIgZW5kLiAqLworICAgIEJZVEUgICAgQ29yMjsgICAgICAgLyogdG8gY29uZmlybSB0aGF0IHlvdSd2ZSBnb3QgaXQgcmlnaHQsICAgICovCisgICAgQllURSAgICBDb3I0OyAgICAgICAvKiBjaGVjayB3aXRoIGNpcnJ1cy9jaXJydXMuaCAgICAgICAgICAgICAgKi8KKyAgICBCWVRFICAgIENvcjU7CisgICAgQllURSAgICBUeFhvbjsJLyogVHJhbnNtaXQgWC1PbiBjaGFyYWN0ZXIgKi8KKyAgICBCWVRFICAgIFR4WG9mZjsJLyogVHJhbnNtaXQgWC1PZmYgY2hhcmFjdGVyICovCisgICAgQllURSAgICBSeFhvbjsJLyogUmVjZWl2ZSBYLU9uIGNoYXJhY3RlciAqLworICAgIEJZVEUgICAgUnhYb2ZmOwkvKiBSZWNlaXZlIFgtT2ZmIGNoYXJhY3RlciAqLworICAgIEJZVEUgICAgTE5leHQ7CS8qIExpdGVyYWwtbmV4dCBjaGFyYWN0ZXIgKi8KKyAgICBCWVRFICAgIFR4QmF1ZDsJLyogVHJhbnNtaXQgYmF1ZHJhdGUgKi8KKyAgICBCWVRFICAgIFJ4QmF1ZDsJLyogUmVjZWl2ZSBiYXVkcmF0ZSAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Bhcm1tYXAuaCBiL2RyaXZlcnMvY2hhci9yaW8vcGFybW1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Zjk5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Bhcm1tYXAuaApAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgSCBPIFMgVCAgIE0gRSBNIE8gUiBZICBNIEEgUAorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzYvNC8xOTkxICAgam9uYgkJICAgICBNYWRlIGNoYW5nZXMgdG8gYWNjb21tb2RhdGUgTWlwcyBSMzIzMCBidXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3Bhcm1hcF9oCisjZGVmaW5lIF9wYXJtYXBfaAorCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19wYXJtbWFwX2hfc2NjcyA9ICJAKCMpcGFybW1hcC5oCTEuNCI7ICovCisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBQQVJNX01BUCBQQVJNX01BUCA7CisKK3N0cnVjdCBQQVJNX01BUAoreworUEhCX3B0ciAgICAgICAgICAgcGhiX3B0ciA7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBQSEIgYXJyYXkgKi8KK1dPUkRfcHRyICAgICAgICAgIHBoYl9udW1fcHRyIDsgICAgICAgICAgLyogUHRyIHRvIE51bWJlciBvZiBQSEIncyAqLworRlJFRV9MSVNUX3B0ciAgICAgZnJlZV9saXN0OyAgICAgICAgICAgICAvKiBGcmVlIExpc3QgcG9pbnRlciAqLworRlJFRV9MSVNUX3B0ciAgICAgZnJlZV9saXN0X2VuZDsgICAgICAgICAvKiBGcmVlIExpc3QgRW5kIHBvaW50ZXIgKi8KK1FfQlVGX3B0cl9wdHIgICAgIHFfZnJlZV9saXN0X3B0ciA7ICAgICAgLyogUHRyIHRvIFFfQlVGIHZhcmlhYmxlICovCitCWVRFX3B0ciAgICAgICAgICB1bml0X2lkX3B0ciA7ICAgICAgICAgIC8qIFVuaXQgSWQgKi8KK0xQQl9wdHIgICAgICAgICAgIGxpbmtfc3RyX3B0ciA7ICAgICAgICAgLyogTGluayBTdHJ1Y3R1cmUgQXJyYXkgKi8KK0JZVEVfcHRyICAgICAgICAgIGJvb3Rsb2FkZXJfMSA7ICAgICAgICAgLyogMXN0IFN0YWdlIEJvb3QgTG9hZGVyICovCitCWVRFX3B0ciAgICAgICAgICBib290bG9hZGVyXzIgOyAgICAgICAgIC8qIDJuZCBTdGFnZSBCb290IExvYWRlciAqLworV09SRF9wdHIgICAgICAgICAgcG9ydF9yb3V0ZV9tYXBfcHRyIDsgICAvKiBQb3J0IFJvdXRlIE1hcCAqLworUk9VVEVfU1RSX3B0ciAgICAgcm91dGVfcHRyIDsgICAgICAgICAgICAvKiBVbml0IFJvdXRlIE1hcCAqLworTlVNQkVSX3B0ciAgICAgICAgbWFwX3ByZXNlbnQgOyAgICAgICAgICAvKiBSb3V0ZSBNYXAgcHJlc2VudCAqLworTlVNQkVSICAgICAgICAgICAgcGt0X251bSA7ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHBhY2tldHMgKi8KK05VTUJFUiAgICAgICAgICAgIHFfbnVtIDsgICAgICAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBRIHBhY2tldHMgKi8KK1dPUkQgICAgICAgICAgICAgIGJ1ZmZlcnNfcGVyX3BvcnQgOyAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHBlciBwb3J0ICovCitXT1JEICAgICAgICAgICAgICBoZWFwX3NpemUgOyAgICAgICAgICAgICAvKiBJbml0aWFsIHNpemUgb2YgaGVhcCAqLworV09SRCAgICAgICAgICAgICAgaGVhcF9sZWZ0IDsgICAgICAgICAgICAgLyogQ3VycmVudCBIZWFwIGxlZnQgKi8KK1dPUkQgICAgICAgICAgICAgIGVycm9yIDsgICAgICAgICAgICAgICAgIC8qIEVycm9yIGNvZGUgKi8KK1dPUkQgICAgICAgICAgICAgIHR4X21heDsgICAgICAgICAgICAgICAgIC8qIE1heCBudW1iZXIgb2YgdHggcGt0cyBwZXIgcGhiICovCitXT1JEICAgICAgICAgICAgICByeF9tYXg7ICAgICAgICAgICAgICAgICAvKiBNYXggbnVtYmVyIG9mIHJ4IHBrdHMgcGVyIHBoYiAqLworV09SRCAgICAgICAgICAgICAgcnhfbGltaXQ7ICAgICAgICAgICAgICAgLyogRm9yIGhpZ2ggLyBsb3cgd2F0ZXJtYXJrcyAqLworTlVNQkVSICAgICAgICAgICAgbGlua3MgOyAgICAgICAgICAgICAgICAgLyogTGlua3MgdG8gdXNlICovCitOVU1CRVIgICAgICAgICAgICB0aW1lciA7ICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHRzIHBlciBzZWNvbmQgKi8KK1JVUF9wdHIgICAgICAgICAgIHJ1cHMgOyAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgUlVQcyAqLworV09SRCAgICAgICAgICAgICAgbWF4X3BoYiA7ICAgICAgICAgICAgICAvKiBNb3N0bHkgZm9yIGRlYnVnZ2luZyAqLworV09SRCAgICAgICAgICAgICAgbGl2aW5nIDsgICAgICAgICAgICAgICAvKiBKdXN0IGluY3JlbWVudHMhISAqLworV09SRCAgICAgICAgICAgICAgaW5pdF9kb25lIDsgICAgICAgICAgICAvKiBJbml0aWFsaXNhdGlvbiBvdmVyICovCitXT1JEICAgICAgICAgICAgICBib290aW5nX2xpbmsgOworV09SRCAgICAgICAgICAgICAgaWRsZV9jb3VudCA7ICAgICAgICAgICAvKiBJZGxlIHRpbWUgY291bnRlciAqLworV09SRCAgICAgICAgICAgICAgYnVzeV9jb3VudCA7ICAgICAgICAgICAvKiBCdXN5IGNvdW50ZXIgKi8KK1dPUkQgICAgICAgICAgICAgIGlkbGVfY29udHJvbCA7ICAgICAgICAgLyogQ29udHJvbCBJZGxlIFByb2Nlc3MgKi8KKyNpZiBkZWZpbmVkKEhPU1QpIHx8IGRlZmluZWQoSU5LRVJORUwpCitXT1JEICAgICAgICAgICAgICB0eF9pbnRyOyAgICAgICAgICAgICAgIC8qIFRYIGludGVycnVwdCBwZW5kaW5nICovCitXT1JEICAgICAgICAgICAgICByeF9pbnRyOyAgICAgICAgICAgICAgIC8qIFJYIGludGVycnVwdCBwZW5kaW5nICovCitXT1JEICAgICAgICAgICAgICBydXBfaW50cjsgICAgICAgICAgICAgIC8qIFJVUCBpbnRlcnJ1cHQgcGVuZGluZyAqLworI2VuZGlmCisjaWYgZGVmaW5lZChSVEEpCitXT1JECQkgIGR5aW5nX2NvdW50OwkJLyogQ291bnQgb2YgcHJvY2Vzc2VzIGRlYWQgKi8KKyNlbmRpZgorfSA7CisKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wY2kuaCBiL2RyaXZlcnMvY2hhci9yaW8vcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2MzViZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcGNpLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcGNpLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEyCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCisqKgorKiogIGlkZW50IEAoIylwY2kuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19wY2lfaF9fCisjZGVmaW5lCV9fcmlvX3BjaV9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3BjaV9oX3NjY3NfID0gIkAoIylwY2kuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBQQ0kgc3R1ZmYKKyovCisKKyNkZWZpbmUJUENJVHBGYXN0Q2xvY2sJCTB4ODAKKyNkZWZpbmUJUENJVHBTbG93Q2xvY2sJCTB4MDAKKyNkZWZpbmUJUENJVHBGYXN0TGlua3MJICAgICAgICAweDQwCisjZGVmaW5lCVBDSVRwU2xvd0xpbmtzCSAgICAgICAgMHgwMAorI2RlZmluZQlQQ0lUcEludEVuYWJsZQkJMHgwNAorI2RlZmluZQlQQ0lUcEludERpc2FibGUJCTB4MDAKKyNkZWZpbmUJUENJVHBCdXNFbmFibGUJCTB4MDIKKyNkZWZpbmUJUENJVHBCdXNEaXNhYmxlCQkweDAwCisjZGVmaW5lCVBDSVRwQm9vdEZyb21SYW0JMHgwMQorI2RlZmluZQlQQ0lUcEJvb3RGcm9tTGluawkweDAwCisKKyNkZWZpbmUJUklPX1BDSV9WRU5ET1IJCTB4MTFDQgorI2RlZmluZQlSSU9fUENJX0RFVklDRQkJMHg4MDAwCisjZGVmaW5lCVJJT19QQ0lfQkFTRV9DTEFTUwkweDAyCisjZGVmaW5lCVJJT19QQ0lfU1VCX0NMQVNTCTB4ODAKKyNkZWZpbmUJUklPX1BDSV9QUk9HX0lGQUNFCTB4MDAKKworI2RlZmluZSBSSU9fUENJX1JJRAkJMHgwMDA4CisjZGVmaW5lIFJJT19QQ0lfQkFEUjAJCTB4MDAxMAorI2RlZmluZSBSSU9fUENJX0lOVExOCQkweDAwM0MKKyNkZWZpbmUgUklPX1BDSV9JTlRQSU4JCTB4MDAzRAorCisjZGVmaW5lCVJJT19QQ0lfTUVNX1NJWkUJNjU1MzYKKworI2RlZmluZQlSSU9fUENJX1RVUkJPX1RQCTB4ODAKKyNkZWZpbmUJUklPX1BDSV9GQVNUX0xJTktTCTB4NDAKKyNkZWZpbmUJUklPX1BDSV9JTlRfRU5BQkxFCTB4MDQKKyNkZWZpbmUJUklPX1BDSV9UUF9CVVNfRU5BQkxFCTB4MDIKKyNkZWZpbmUJUklPX1BDSV9CT09UX0ZST01fUkFNCTB4MDEKKworI2RlZmluZQlSSU9fUENJX0RFRkFVTFRfTU9ERQkweDA1CisKKyNlbmRpZgkvKiBfX3Jpb19wY2lfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BoYi5oIGIvZHJpdmVycy9jaGFyL3Jpby9waGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTQ4M2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9waGIuaApAQCAtMCwwICsxLDI5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgUCBIIEIgICAgIEggRSBBIEQgRSBSICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEsIEplcmVteSBSb2xscworIERhdGUgICAgOiAKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcGhiX2gKKyNkZWZpbmUgX3BoYl9oIDEKKworI2lmZGVmIFNDQ1NfTEFCRUxTCisjaWZuZGVmIGxpbnQKKy8qIHN0YXRpYyBjaGFyICpfcmlvX3BoYl9oX3NjY3MgPSAiQCgjKXBoYi5oCTEuMTIiOyAqLworI2VuZGlmCisjZW5kaWYKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBTZXQgdGhlIExJTUlUIHZhbHVlcy4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFJUQQorI2RlZmluZSBSWF9MSU1JVCAgICAgICAodXNob3J0KSAzCisjZW5kaWYKKyNpZmRlZiBIT1NUCisjZGVmaW5lIFJYX0xJTUlUICAgICAgICh1c2hvcnQpIDEKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIYW5kc2hha2UgYXNzZXJ0ZWQuIERlYXNzZXJ0ZWQgYnkgdGhlIExUVChzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEhCX0hBTkRTSEFLRV9TRVQgICAgICAoKHVzaG9ydCkgMHgwMDEpIC8qIFNldCBieSBMUlQgKi8KKworI2RlZmluZSBQSEJfSEFORFNIQUtFX1JFU0VUICAgICAoKHVzaG9ydCkgMHgwMDIpIC8qIFNldCBieSBJU1IgLyBkcml2ZXIgKi8KKworI2RlZmluZSBQSEJfSEFORFNIQUtFX0ZMQUdTICAgICAoUEhCX0hBTkRTSEFLRV9SRVNFVCB8IFBIQl9IQU5EU0hBS0VfU0VUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgYnkgbHR0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIFBIQidzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQgKEhPU1QpIHx8IGRlZmluZWQgKElOS0VSTkVMKQorI2RlZmluZSBNQVhfUEhCICAgICAgICAgICAgICAgKCh1c2hvcnQpIDEyOCkgIC8qIHJhbmdlIDAtMTI3ICovCisjZWxzZQorI2RlZmluZSBNQVhfUEhCICAgICAgICAgICAgICAgKCh1c2hvcnQpIDgpICAgIC8qIHJhbmdlIDAtNyAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWZpbmVzIGZvciB0aGUgbW9kZSBmaWVsZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRYUEtUX0lOQ09NUExFVEUgICAgICAgIDB4MDAwMSAgLyogUHJldmlvdXMgdHggcGFja2V0IG5vdCBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgVFhJTlRSX0VOQUJMRUQgICAgICAgICAgMHgwMDAyICAvKiBUeCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCAqLworI2RlZmluZSBUWF9UQUIzICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIFRBQjMgbW9kZSAqLworI2RlZmluZSBUWF9PQ1JOTCAgICAgICAgICAgICAgICAweDAwMDggIC8qIE9DUk5MIG1vZGUgKi8KKyNkZWZpbmUgVFhfT05MQ1IgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBPTkxDUiBtb2RlICovCisjZGVmaW5lIFRYX1NFTkRTUEFDRVMgICAgICAgICAgIDB4MDAyMCAgLyogU2VuZCBuIHNwYWNlcyBjb21tYW5kIG5lZWRzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpbmcgKi8KKyNkZWZpbmUgVFhfU0VORE5VTEwgICAgICAgICAgICAgMHgwMDQwICAvKiBFc2NhcGluZyBOVUxMIG5lZWRzIGNvbXBsZXRpbmcgKi8KKyNkZWZpbmUgVFhfU0VORExGICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMRiAtPiBDUiBMRiBuZWVkcyBjb21wbGV0aW5nICovCisjZGVmaW5lIFRYX1BBUkFMTEVMQlVHICAgICAgICAgIDB4MDEwMCAgLyogQ0QxNDAwIExGIC0+IENSIExGIGJ1ZyBvbiBwYXJhbGxlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgKi8KKyNkZWZpbmUgVFhfSEFOR09WRVIgICAgICAgICAgICAgKFRYX1NFTkRTUEFDRVMgfCBUWF9TRU5ETEYgfCBUWF9TRU5ETlVMTCkKKyNkZWZpbmUgVFhfRFRSRkxPVwkJMHgwMjAwCS8qIERUUiB0eCBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUJVFhfRFRSRkxPV0VECQkweDA0MDAJLyogRFRSIGlzIGxvdyAtIGRvbid0IGFsbG93IG1vcmUgZGF0YQorCQkJCQkgICBpbnRvIHRoZSBGSUZPICovCisjZGVmaW5lCVRYX0RBVEFJTkZJRk8JCTB4MDgwMAkvKiBUaGVyZSBpcyBkYXRhIGluIHRoZSBGSUZPICovCisjZGVmaW5lCVRYX0JVU1kJCQkweDEwMDAJLyogRGF0YSBpbiBGSUZPLCBzaGlmdCBvciBob2xkaW5nIHJlZ3MgKi8KKworI2RlZmluZSBSWF9TUEFSRQkgICAgICAgIDB4MDAwMSAgIC8qIFNQQVJFICovCisjZGVmaW5lIFJYSU5UUl9FTkFCTEVEICAgICAgICAgIDB4MDAwMiAgIC8qIFJ4IGludGVycnVwdCBlbmFibGVkICovCisjZGVmaW5lIFJYX0lDUk5MICAgICAgICAgICAgICAgIDB4MDAwOCAgIC8qIElDUk5MIG1vZGUgKi8KKyNkZWZpbmUgUlhfSU5MQ1IgICAgICAgICAgICAgICAgMHgwMDEwICAgLyogSU5MQ1IgbW9kZSAqLworI2RlZmluZSBSWF9JR05DUiAgICAgICAgICAgICAgICAweDAwMjAgICAvKiBJR05DUiBtb2RlICovCisjZGVmaW5lIFJYX0NUU0ZMT1cgICAgICAgICAgICAgIDB4MDA0MCAgIC8qIENUU0ZMT1cgZW5hYmxlZCAqLworI2RlZmluZSBSWF9JWE9GRiAgICAgICAgICAgICAgICAweDAwODAgICAvKiBJWE9GRiBlbmFibGVkICovCisjZGVmaW5lIFJYX0NUU0ZMT1dFRCAgICAgICAgICAgIDB4MDEwMCAgIC8qIENUU0ZMT1cgYW5kIENUUyBkcm9wcGVkICovCisjZGVmaW5lIFJYX0lYT0ZGRUQgICAgICAgICAgICAgIDB4MDIwMCAgIC8qIElYT0ZGIGFuZCB4b2ZmIHNlbnQgKi8KKyNkZWZpbmUgUlhfQlVGRkVSRUQJCTB4MDQwMAkgLyogVHJ5IGFuZCBwYXNzIG9uIGNvbXBsZXRlIHBhY2tldHMgKi8KKworI2RlZmluZSBQT1JUX0lTT1BFTiAgICAgICAgICAgICAweDAwMDEgIC8qIFBvcnQgb3Blbj8gKi8KKyNkZWZpbmUgUE9SVF9IVVBDTCAgICAgICAgICAgICAgMHgwMDAyICAvKiBIYW5ndXAgb24gY2xvc2U/ICovCisjZGVmaW5lIFBPUlRfTU9QRU5QRU5EICAgICAgICAgIDB4MDAwNCAgLyogTW9kZW0gb3BlbiBwZW5kaW5nICovCisjZGVmaW5lIFBPUlRfSVNQQVJBTExFTCAgICAgICAgIDB4MDAwOCAgLyogUGFyYWxsZWwgcG9ydCAqLworI2RlZmluZSBQT1JUX0JSRUFLICAgICAgICAgICAgICAweDAwMTAgIC8qIFBvcnQgb24gYnJlYWsgKi8KKyNkZWZpbmUgUE9SVF9TVEFUVVNQRU5ECQkweDAwMjAgIC8qIFN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLworI2RlZmluZSBQT1JUX0JSRUFLUEVORCAgICAgICAgICAweDAwNDAgIC8qIEJyZWFrIHBhY2tldCBwZW5kaW5nICovCisjZGVmaW5lIFBPUlRfTU9ERU1QRU5EICAgICAgICAgIDB4MDA4MCAgLyogTW9kZW0gc3RhdHVzIHBhY2tldCBwZW5kaW5nICovCisjZGVmaW5lIFBPUlRfUEFSQUxMRUxCVUcgICAgICAgIDB4MDEwMCAgLyogQ0QxNDAwIExGIC0+IENSIExGIGJ1ZyBvbiBwYXJhbGxlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgKi8KKyNkZWZpbmUgUE9SVF9GVUxMTU9ERU0gICAgICAgICAgMHgwMjAwICAvKiBGdWxsIG1vZGVtIHNpZ25hbHMgKi8KKyNkZWZpbmUgUE9SVF9SSjQ1ICAgICAgICAgICAgICAgMHgwNDAwICAvKiBSSjQ1IGNvbm5lY3RvciAtIG5vIFJJIHNpZ25hbCAqLworI2RlZmluZSBQT1JUX1JFU1RSSUNURUQgICAgICAgICAweDA2MDAgIC8qIFJlc3RyaWN0ZWQgY29ubmVjdG9yIC0gbm8gUkkgLyBEVFIgKi8KKworI2RlZmluZSBQT1JUX01PREVNQklUUyAgICAgICAgICAweDA2MDAgIC8qIE1hc2sgZm9yIG1vZGVtIGZpZWxkcyAqLworCisjZGVmaW5lIFBPUlRfV0NMT1NFICAgICAgICAgICAgIDB4MDgwMCAgLyogV2FpdGluZyBmb3IgY2xvc2UgKi8KKyNkZWZpbmUJUE9SVF9IQU5EU0hBS0VGSVgJMHgxMDAwCS8qIFBvcnQgaGFzIEgvVyBmbG93IGNvbnRyb2wgZml4ICovCisjZGVmaW5lCVBPUlRfV0FTUENMT1NFRAkJMHgyMDAwCS8qIFBvcnQgY2xvc2VkIHdpdGggUENMT1NFICovCisjZGVmaW5lCURVTVBNT0RFCQkweDQwMDAJLyogRHVtcCBSVEEgbWVtICovCisjZGVmaW5lCVJFQURfUkVHCQkweDgwMDAJLyogUmVhZCBDRDE0MDAgcmVnaXN0ZXIgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUEhCIFN0cnVjdHVyZQorICogQSAgZmV3IHdvcmRzLgorICoKKyAqIE5vcm1hbGx5IFBhY2tldHMgYXJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIHJlbW92ZWQgZnJvbQorICogdGhlIHN0YXJ0LiBUaGUgcG9pbnRlciB0eF9hZGQgcG9pbnRzIHRvIGEgU1BBQ0UgdG8gcHV0IGEgUGFja2V0LgorICogVGhlIHBvaW50ZXIgdHhfcmVtb3ZlIHBvaW50cyB0byB0aGUgbmV4dCBQYWNrZXQgdG8gcmVtb3ZlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgSU5LRVJORUwKKyNkZWZpbmUgc3JjX3VuaXQgICAgIHUyLnMyLnVuaXQKKyNkZWZpbmUgc3JjX3BvcnQgICAgIHUyLnMyLnBvcnQKKyNkZWZpbmUgZGVzdF91bml0ICAgIHUxLnMxLnVuaXQKKyNkZWZpbmUgZGVzdF9wb3J0ICAgIHUxLnMxLnBvcnQKKyNlbmRpZgorI2lmZGVmIEhPU1QKKyNkZWZpbmUgdHhfc3RhcnQgICAgIHUzLnMxLnR4X3N0YXJ0X3B0cl9wdHIKKyNkZWZpbmUgdHhfYWRkICAgICAgIHUzLnMxLnR4X2FkZF9wdHJfcHRyCisjZGVmaW5lIHR4X2VuZCAgICAgICB1My5zMS50eF9lbmRfcHRyX3B0cgorI2RlZmluZSB0eF9yZW1vdmUgICAgdTMuczEudHhfcmVtb3ZlX3B0cl9wdHIKKyNkZWZpbmUgcnhfc3RhcnQgICAgIHU0LnMxLnJ4X3N0YXJ0X3B0cl9wdHIKKyNkZWZpbmUgcnhfYWRkICAgICAgIHU0LnMxLnJ4X2FkZF9wdHJfcHRyCisjZGVmaW5lIHJ4X2VuZCAgICAgICB1NC5zMS5yeF9lbmRfcHRyX3B0cgorI2RlZmluZSByeF9yZW1vdmUgICAgdTQuczEucnhfcmVtb3ZlX3B0cl9wdHIKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgUEhCIFBIQiA7CitzdHJ1Y3QgUEhCIHsKKyNpZmRlZiBSVEEKKyAgICAgICAgdXNob3J0ICAgICAgcG9ydDsKKyNlbmRpZgorI2lmZGVmIElOS0VSTkVMCisgICAgICAgIFdPUkQgICAgICBzb3VyY2U7CisjZWxzZQorICAgICAgICB1bmlvbiAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgdXNob3J0IHNvdXJjZTsgICAgICAgICAgICAgIC8qIENvbXBsZXRlIHNvdXJjZSAqLworICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB1bml0OyAgICAgLyogU291cmNlIHVuaXQgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHBvcnQ7ICAgICAvKiBTb3VyY2UgcG9ydCAqLworICAgICAgICAgICAgfSBzMjsKKyAgICAgICAgfSB1MjsKKyNlbmRpZgorICAgICAgICBXT1JEICAgICAgaGFuZHNoYWtlIDsKKyAgICAgICAgV09SRCAgICAgIHN0YXR1cyA7CisgICAgICAgIE5VTUJFUiAgICAgICB0aW1lb3V0IDsgICAgICAgICAgIC8qIE1heGltdW0gb2YgMS45IHNlY29uZHMgKi8KKyAgICAgICAgV09SRCAgICAgIGxpbmsgOyAgICAgICAgICAgICAgLyogU2VuZCBkb3duIHRoaXMgbGluayAqLworI2lmZGVmIElOS0VSTkVMCisgICAgICAgIFdPUkQgICAgICBkZXN0aW5hdGlvbjsKKyNlbHNlCisgICAgICAgIHVuaW9uICAgICAgIAorICAgICAgICB7CisgICAgICAgICAgICB1c2hvcnQgZGVzdGluYXRpb247ICAgICAgICAgLyogQ29tcGxldGUgZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdW5pdDsgICAgIC8qIERlc3RpbmF0aW9uIHVuaXQgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHBvcnQ7ICAgICAvKiBEZXN0aW5hdGlvbiBwb3J0ICovCisgICAgICAgICAgICB9IHMxOworICAgICAgICB9IHUxOworI2VuZGlmCisjaWZkZWYgUlRBCisgICAgICAgIHVzaG9ydCAgICAgIHR4X3BrdHNfYWRkZWQ7CisgICAgICAgIHVzaG9ydCAgICAgIHR4X3BrdHNfcmVtb3ZlZDsKKyAgICAgICAgUV9CVUZfcHRyICAgdHhfcV9zdGFydCA7ICAgICAgICAvKiBTdGFydCBvZiB0aGUgUSBsaXN0IGNoYWluICovCisgICAgICAgIHNob3J0ICAgICAgIG51bV90eF9xX2J1ZnMgOyAgICAgLyogTnVtYmVyIG9mIFEgYnVmZmVycyBpbiB0aGUgY2hhaW4gKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfYWRkIDsgICAgICAgICAgICAvKiBBZGQgYSBuZXcgUGFja2V0IGhlcmUgKi8KKyAgICAgICAgUV9CVUZfcHRyICAgdHhfYWRkX3FiOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBhZGQgUSBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfYWRkX3N0X3FiYiA7ICAgICAvKiBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBRJ3MgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHR4X2FkZF9lbmRfcWJiIDsgICAgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBRJ3MgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHR4X3JlbW92ZSA7ICAgICAgICAgLyogUmVtb3ZlIGEgUGFja2V0IGhlcmUgKi8KKyAgICAgICAgUV9CVUZfcHRyICAgdHhfcmVtb3ZlX3FiIDsgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZW1vdmUgUSBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfcmVtb3ZlX3N0X3FiYiA7ICAvKiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgUSBidWYgKi8KKyAgICAgICAgUEtUX3B0cl9wdHIgdHhfcmVtb3ZlX2VuZF9xYmIgOyAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIFEgYnVmICovCisjZW5kaWYKKyNpZmRlZiBJTktFUk5FTAorICAgICAgICBQS1RfcHRyX3B0ciB0eF9zdGFydCA7CisgICAgICAgIFBLVF9wdHJfcHRyIHR4X2VuZCA7CisgICAgICAgIFBLVF9wdHJfcHRyIHR4X2FkZCA7CisgICAgICAgIFBLVF9wdHJfcHRyIHR4X3JlbW92ZSA7CisjZW5kaWYKKyNpZmRlZiBIT1NUCisgICAgICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHR4X3N0YXJ0X3B0cl9wdHI7CisgICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgdHhfZW5kX3B0cl9wdHI7CisgICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgdHhfYWRkX3B0cl9wdHI7CisgICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgdHhfcmVtb3ZlX3B0cl9wdHI7CisgICAgICAgICAgICB9IHMxOworICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNob3J0ICogdHhfc3RhcnRfcHRyOworICAgICAgICAgICAgICAgIHVzaG9ydCAqIHR4X2VuZF9wdHI7CisgICAgICAgICAgICAgICAgdXNob3J0ICogdHhfYWRkX3B0cjsKKyAgICAgICAgICAgICAgICB1c2hvcnQgKiB0eF9yZW1vdmVfcHRyOworICAgICAgICAgICAgfSBzMjsKKyAgICAgICAgfSB1MzsKKyNlbmRpZgorCisjaWZkZWYgIFJUQQorICAgICAgICB1c2hvcnQgICAgICByeF9wa3RzX2FkZGVkOworICAgICAgICB1c2hvcnQgICAgICByeF9wa3RzX3JlbW92ZWQ7CisgICAgICAgIFFfQlVGX3B0ciAgIHJ4X3Ffc3RhcnQgOyAgICAgICAgLyogU3RhcnQgb2YgdGhlIFEgbGlzdCBjaGFpbiAqLworICAgICAgICBzaG9ydCAgICAgICBudW1fcnhfcV9idWZzIDsgICAgIC8qIE51bWJlciBvZiBRIGJ1ZmZlcnMgaW4gdGhlIGNoYWluICovCisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X2FkZCA7ICAgICAgICAgICAgLyogQWRkIGEgbmV3IFBhY2tldCBoZXJlICovCisgICAgICAgIFFfQlVGX3B0ciAgIHJ4X2FkZF9xYiA7ICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYWRkIFEgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X2FkZF9zdF9xYmIgOyAgICAgLyogUG9pbnRlciB0byBzdGFydCBvZiB0aGUgUSdzIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciByeF9hZGRfZW5kX3FiYiA7ICAgIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSdzIGJ1ZiAqLworICAgICAgICBQS1RfcHRyX3B0ciByeF9yZW1vdmUgOyAgICAgICAgIC8qIFJlbW92ZSBhIFBhY2tldCBoZXJlICovCisgICAgICAgIFFfQlVGX3B0ciAgIHJ4X3JlbW92ZV9xYiA7ICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVtb3ZlIFEgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X3JlbW92ZV9zdF9xYmIgOyAgLyogUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIFEgYnVmICovCisgICAgICAgIFBLVF9wdHJfcHRyIHJ4X3JlbW92ZV9lbmRfcWJiIDsgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBRIGJ1ZiAqLworI2VuZGlmCisjaWZkZWYgSU5LRVJORUwKKyAgICAgICAgUEtUX3B0cl9wdHIgcnhfc3RhcnQgOworICAgICAgICBQS1RfcHRyX3B0ciByeF9lbmQgOworICAgICAgICBQS1RfcHRyX3B0ciByeF9hZGQgOworICAgICAgICBQS1RfcHRyX3B0ciByeF9yZW1vdmUgOworI2VuZGlmCisjaWZkZWYgSE9TVAorICAgICAgICB1bmlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciByeF9zdGFydF9wdHJfcHRyOworICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHJ4X2VuZF9wdHJfcHRyOworICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHJ4X2FkZF9wdHJfcHRyOworICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHJ4X3JlbW92ZV9wdHJfcHRyOworICAgICAgICAgICAgfSBzMTsKKyAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaG9ydCAqIHJ4X3N0YXJ0X3B0cjsKKyAgICAgICAgICAgICAgICB1c2hvcnQgKiByeF9lbmRfcHRyOworICAgICAgICAgICAgICAgIHVzaG9ydCAqIHJ4X2FkZF9wdHI7CisgICAgICAgICAgICAgICAgdXNob3J0ICogcnhfcmVtb3ZlX3B0cjsKKyAgICAgICAgICAgIH0gczI7CisgICAgICAgIH0gdTQ7CisjZW5kaWYKKworI2lmZGVmIFJUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgZmllbGRzIGZvciB0aGUgcmVtb3RlcyAqLworICAgICAgICB1c2hvcnQgICAgIGZsdXNoX2NvdW50OwkJLyogQ291bnQgb2Ygd3JpdGUgZmx1c2hlcyAqLworICAgICAgICB1c2hvcnQgICAgIHR4bW9kZTsJCS8qIE1vZGVzIGZvciB0eCAqLworICAgICAgICB1c2hvcnQgICAgIHJ4bW9kZTsJCS8qIE1vZGVzIGZvciByeCAqLworICAgICAgICB1c2hvcnQgICAgIHBvcnRtb2RlOwkJLyogR2VuZXJpYyBtb2RlcyAqLworICAgICAgICB1c2hvcnQgICAgIGNvbHVtbjsJCS8qIFRBQjMgY29sdW1uIGNvdW50ICovCisgICAgICAgIHVzaG9ydCAgICAgdHhfc3Vic2NyaXB0OwkvKiAoVFgpIFN1YnNjcmlwdCBpbnRvIGRhdGEgZmllbGQgKi8KKyAgICAgICAgdXNob3J0ICAgICByeF9zdWJzY3JpcHQ7CS8qIChSWCkgU3Vic2NyaXB0IGludG8gZGF0YSBmaWVsZCAqLworICAgICAgICBQS1RfcHRyICAgIHJ4X2luY29tcGxldGU7CS8qIEhvbGQgYW4gaW5jb21wbGV0ZSBwYWNrZXQgaGVyZSAqLworICAgICAgICB1c2hvcnQgICAgIG1vZGVtX2JpdHM7CQkvKiBNb2RlbSBiaXRzIHRvIG1hc2sgKi8KKwl1c2hvcnQJICAgbGFzdE1vZGVtOwkJLyogTW9kZW0gY29udHJvbCBsaW5lcy4gKi8KKyAgICAgICAgdXNob3J0ICAgICBhZGRyOwkJLyogQWRkcmVzcyBmb3Igc3ViIGNvbW1hbmRzICovCisgICAgICAgIHVzaG9ydCAgICAgTW9uaXRvclRzdGF0ZTsJLyogVFJVRSBpZiBtb25pdG9yaW5nIHRzdG9wICovCisjZW5kaWYKKworICAgICAgICB9IDsKKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wa3QuaCBiL2RyaXZlcnMvY2hhci9yaW8vcGt0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiYjJmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcGt0LmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICBQIEEgQyBLIEUgVCAgIEggRSBBIEQgRSBSICAgRiBJIEwgRQorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcGt0X2gKKyNkZWZpbmUgX3BrdF9oIDEKKworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcGt0X2hfc2NjcyA9ICJAKCMpcGt0LmgJMS44IjsgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX1RUTCAgICAgICAgIDB4ZgorI2RlZmluZSBQS1RfQ01EX0JJVCAgICAgKCh1c2hvcnQpIDB4MDgwKQorI2RlZmluZSBQS1RfQ01EX0RBVEEgICAgKCh1c2hvcnQpIDB4MDgwKQorCisjZGVmaW5lIFBLVF9BQ0sgICAgICAgICAoKHVzaG9ydCkgMHgwNDApCisKKyNkZWZpbmUgUEtUX1RHTCAgICAgICAgICgodXNob3J0KSAweDAyMCkKKworI2RlZmluZSBQS1RfTEVOX01BU0sgICAgKCh1c2hvcnQpIDB4MDdmKQorCisjZGVmaW5lIERBVEFfV05EVyAgICAgICAoKHVzaG9ydCkgMHgxMCkKKyNkZWZpbmUgUEtUX1RUTF9NQVNLICAgICgodXNob3J0KSAweDBmKQorCisjZGVmaW5lIFBLVF9NQVhfREFUQV9MRU4gICA3MgorCisjZGVmaW5lIFBLVF9MRU5HVEggICAgICAgICBzaXplb2Yoc3RydWN0IFBLVCkKKyNkZWZpbmUgU1lOQ19QS1RfTEVOR1RIICAgIChQS1RfTEVOR1RIICsgNCkKKworI2RlZmluZSBDT05UUk9MX1BLVF9MRU5fTUFTSyBQS1RfTEVOX01BU0sKKyNkZWZpbmUgQ09OVFJPTF9QS1RfQ01EX0JJVCAgUEtUX0NNRF9CSVQKKyNkZWZpbmUgQ09OVFJPTF9QS1RfQUNLIChQS1RfQUNLIDw8IDgpCisjZGVmaW5lIENPTlRST0xfUEtUX1RHTCAoUEtUX1RHTCA8PCA4KQorI2RlZmluZSBDT05UUk9MX1BLVF9UVExfTUFTSyAoUEtUX1RUTF9NQVNLIDw8IDgpCisjZGVmaW5lIENPTlRST0xfREFUQV9XTkRXICAoREFUQV9XTkRXIDw8IDgpCisKK3N0cnVjdCBQS1QgICAgeworI2lmZGVmIElOS0VSTkVMCisgICAgICAgICAgICAgICAgICAgQllURSAgICBkZXN0X3VuaXQgOyAgICAvKiBEZXN0aW5hdGlvbiBVbml0IElkICovCisgICAgICAgICAgICAgICAgICAgQllURSAgICBkZXN0X3BvcnQgOyAgICAvKiBEZXN0aW5hdGlvbiBQT3J0ICovCisgICAgICAgICAgICAgICAgICAgQllURSAgICBzcmNfdW5pdCA7ICAgICAvKiBTb3VyY2UgVW5pdCBJZCAqLworICAgICAgICAgICAgICAgICAgIEJZVEUgICAgc3JjX3BvcnQgOyAgICAgLyogU291cmNlIFBPcnQgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgdW5pb24gICAgICAgCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgZGVzdGluYXRpb247ICAgICAgICAgLyogQ29tcGxldGUgZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdW5pdDsgICAgIC8qIERlc3RpbmF0aW9uIHVuaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcG9ydDsgICAgIC8qIERlc3RpbmF0aW9uIHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgfSBzMTsKKyAgICAgICAgICAgICAgICAgICB9IHUxOworICAgICAgICAgICAgICAgICAgIHVuaW9uICAgICAgIAorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNvdXJjZTsgICAgICAgICAgICAgIC8qIENvbXBsZXRlIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB1bml0OyAgICAgLyogU291cmNlIHVuaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcG9ydDsgICAgIC8qIFNvdXJjZSBwb3J0ICovCisgICAgICAgICAgICAgICAgICAgICAgIH0gczI7CisgICAgICAgICAgICAgICAgICAgfSB1MjsKKyNlbmRpZgorI2lmZGVmIElOS0VSTkVMCisgICAgICAgICAgICAgICAgICAgQllURSBsZW4gOworICAgICAgICAgICAgICAgICAgIEJZVEUgY29udHJvbDsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgICAgICBjb250cm9sOworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjb250cm9sOworICAgICAgICAgICAgICAgICAgICAgICAgfSBzMzsKKyAgICAgICAgICAgICAgICAgICAgfSB1MzsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIEJZVEUgICAgZGF0YVtQS1RfTUFYX0RBVEFfTEVOXSA7ICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdHVhbCBkYXRhIDotKSAqLworICAgICAgICAgICAgICAgICAgIFdPUkQgIGNzdW0gOyAgICAgICAgICAgICAgICAgIC8qIEMtU1VNICovCisgICAgICAgICAgICAgICB9IDsKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wb2xsLmggYi9kcml2ZXJzL2NoYXIvcmlvL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWI4ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wb2xsLmgKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICBQIE8gTCBMCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9wb2xsX2gKKyNkZWZpbmUgX3BvbGxfaAorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9fcG9sbF9oX3NjY3MgPSAiQCgjKXBvbGwuaAkxLjIiIDsKKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIEhPU1QKKyNkZWZpbmUgUE9MTF9TVEFDSyAgICAgICAgICAgIDEwMAorI2VuZGlmCisjaWZkZWYgUlRBCisjZGVmaW5lIFBPTExfU1RBQ0sgICAgICAgICAgICAyMDAKKyNlbmRpZgorCisjZGVmaW5lIFBPTExfUEVSSU9EICAgICAgICAgICAoaW50KSBTRUNPTkQKKworLyogVGhlIHZhcmlvdXMgcG9sbCBjb21tYW5kcyAqLworI2RlZmluZSBQT0xMX1BPTEwgICAgICAgICAgICAgMCAgICAgICAgICAgIC8qIFdlIGFyZSBjb25uZWN0ZWQgYW5kIGhhcHB5Li4gKi8KKyNkZWZpbmUgUE9MTF9JTlRSTyAgICAgICAgICAgIDEgICAgICAgICAgICAvKiBJbnRyb2R1Y3Rpb24gcGFja2V0ICovCisjZGVmaW5lIFBPTExfVE9QT0xPR1kgICAgICAgICAyICAgICAgICAgICAgLyogVG9wb2xvZ3kgdXBkYXRlICovCisjZGVmaW5lIFBPTExfQVNTSUdOICAgICAgICAgICAzICAgICAgICAgICAgLyogSUQgYXNzaWduICovCisjZGVmaW5lIFBPTExfRk9BRCAgICAgICAgICAgICA0ICAgICAgICAgICAgLyogRioqKiBPZmYgQW5kIERpZSAqLworI2RlZmluZSBQT0xMX0xNRAkgICAgICA1CQkgICAvKiBMZXQgTWUgRGllICovCisjZGVmaW5lIFBPTExfRFlCCSAgICAgIDYJCSAgIC8qIERpZSBZb3UgQmEqKioqKiAqLworCisvKiBUaGUgd2F5IGRhdGEgZmllbGRzIGFyZSBzcGxpdCB1cCBmb3IgUE9MTCBwYWNrZXRzICovCisjZGVmaW5lIFBPTExfSE9TVF9TRVJJQUwgICAgICAyICAgICAgICAgICAgLyogSG9zdCB3aG8gYm9vdGVkIG1lICovCisjZGVmaW5lIFBPTExfTVlfU0VSSUFMICAgICAgICA2ICAgICAgICAgICAgLyogTXkgc2VyaWFsIG51bWJlciAqLworI2RlZmluZSBQT0xMX1lPVVJfSUQgICAgICAgICAgMSAgICAgICAgICAgIC8qIFlvdXIgSUQgbnVtYmVyICovCisjZGVmaW5lIFBPTExfVE9QT0xPR1lfRklFTERTICAyICAgICAgICAgICAgLyogVG9wb2xvZ3kgbWFwcyAqLworCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wb3J0LmggYi9kcml2ZXJzL2NoYXIvcmlvL3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA2YWYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wb3J0LmgKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHBvcnQuaAorKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTIKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKKyoqCisqKiAgaWRlbnQgQCgjKXBvcnQuaAkxLjMKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZglfX3Jpb19wb3J0X2hfXworI2RlZmluZQlfX3Jpb19wb3J0X2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcG9ydF9oX3NjY3NfID0gIkAoIylwb3J0LmgJMS4zIjsKKyNlbmRpZgorCisKKyN1bmRlZiBWUElYCisKKworLyoKKyoqIHRoZSBwb3J0IGRhdGEgc3RydWN0dXJlIC0gb25lIHBlciBwb3J0IGluIHRoZSBzeXN0ZW0KKyovCisKKyNpZmRlZiBTVEFUUworc3RydWN0IFJJT1N0YXRzCit7CisJLyoKKwkqKiBpbnRlcnJ1cHQgc3RhdGlzdGljcworCSovCisJdWludAlCcmVha0ludENudDsKKwl1aW50CU1vZGVtT2ZmQ250OworCXVpbnQJTW9kZW1PbkNudDsKKwl1aW50CVJ4SW50Q250OworCXVpbnQJVHhJbnRDbnQ7CisJLyoKKwkqKiB0aHJvdWdocHV0IHN0YXRpc3RpY3MKKwkqLworCXVpbnQJUnhDaGFyQ250OworCXVpbnQJUnhQa3RDbnQ7CisJdWludAlSeFNhdmVDbnQ7CisJdWludAlUeENoYXJDbnQ7CisJdWludAlUeFBrdENudDsKKwkvKgorCSoqIGRyaXZlciBlbnRyeSBzdGF0aXN0aWNzCisJKi8KKwl1aW50CUNsb3NlQ250OworCXVpbnQJSW9jdGxDbnQ7CisJdWludAlPcGVuQ250OworCXVpbnQJUmVhZENudDsKKwl1aW50CVdyaXRlQ250OworCS8qCisJKiogcHJvYyBzdGF0aXN0aWNzCisJKi8KKwl1aW50CUJsb2NrQ250OworCXVpbnQJT3V0cHV0Q250OworCXVpbnQJUmVzdW1lQ250OworCXVpbnQJUmZsdXNoQ250OworCXVpbnQJU3VzcGVuZENudDsKKwl1aW50CVRicmVha0NudDsKKwl1aW50CVRpbWVvdXRDbnQ7CisJdWludAlVbmJsb2NrQ250OworCXVpbnQJV2ZsdXNoQ250OworCXVpbnQJV0ZCb2RnZUNudDsKK307CisjZW5kaWYKKworLyoKKyoqCVBvcnQgZGF0YSBzdHJ1Y3R1cmUKKyovCitzdHJ1Y3QJUG9ydAoreworICBzdHJ1Y3QgZ3NfcG9ydCBnczsgCisgIGludAkJCQlQb3J0TnVtOwkvKiBSSU8gcG9ydCBuby4sIDAtNTExICovCisgIHN0cnVjdCBIb3N0CSpIb3N0UDsKKyAgdm9sYXRpbGUgY2FkZHJfdAkJQ2FkZHI7CisgIHVzaG9ydAkJCUhvc3RQb3J0OyAgLyogUG9ydCBudW1iZXIgb24gaG9zdCBjYXJkICovCisgIHVjaGFyCQkJUnVwTnVtOwkvKiBOdW1iZXIgb2YgUlVQIGZvciBwb3J0ICovCisgIHVjaGFyCQkJSUQyOwkvKiBTZWNvbmQgSUQgb2YgUlRBIGZvciBwb3J0ICovCisgIHVsb25nCQkJU3RhdGU7CS8qIEZMQUdTIGZvciBvcGVuICYgeG9wZW4gKi8KKyNkZWZpbmUJUklPX0xPUEVOCTB4MDAwMDEJCS8qIExvY2FsIG9wZW4gKi8KKyNkZWZpbmUJUklPX01PUEVOCTB4MDAwMDIJCS8qIE1vZGVtIG9wZW4gKi8KKyNkZWZpbmUJUklPX1dPUEVOCTB4MDAwMDQJCS8qIFdhaXRpbmcgZm9yIG9wZW4gKi8KKyNkZWZpbmUJUklPX0NMT1NJTkcJMHgwMDAwOAkJLyogVGhlIHBvcnQgaXMgYmVpbmcgY2xvc2UgKi8KKyNkZWZpbmUJUklPX1hQQlVTWQkweDAwMDEwCQkvKiBUcmFuc3BhcmVudCBwcmludGVyIGJ1c3kgKi8KKyNkZWZpbmUJUklPX0JSRUFLSU5HCTB4MDAwMjAJCS8qIEJyZWFrIGluIHByb2dyZXNzICovCisjZGVmaW5lCVJJT19ESVJFQ1QJMHgwMDA0MAkJLyogRG9pbmcgRGlyZWN0IG91dHB1dCAqLworI2RlZmluZQlSSU9fRVhDTFVTSVZFCTB4MDAwODAJCS8qIFN0cmVhbSBvcGVuIGZvciBleGNsdXNpdmUgdXNlICovCisjZGVmaW5lCVJJT19OREVMQVkJMHgwMDEwMAkJLyogU3RyZWFtIGlzIG9wZW4gRk5ERUxBWSAqLworI2RlZmluZQlSSU9fQ0FSUl9PTgkweDAwMjAwCQkvKiBTdHJlYW0gaGFzIGNhcnJpZXIgcHJlc2VudCAqLworI2RlZmluZQlSSU9fWFBXQU5UUgkweDAwNDAwCQkvKiBTdHJlYW0gd2FudGVkIGJ5IFhwcmludCAqLworI2RlZmluZQlSSU9fUkJMSwkweDAwODAwCQkvKiBTdHJlYW0gaXMgcmVhZC1ibG9ja2VkICovCisjZGVmaW5lCVJJT19CVVNZCTB4MDEwMDAJCS8qIFN0cmVhbSBpcyBCVVNZIGZvciB3cml0ZSAqLworI2RlZmluZQlSSU9fVElNRU9VVAkweDAyMDAwCQkvKiBTdHJlYW0gdGltZW91dCBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlSSU9fVFhTVE9QCTB4MDQwMDAJCS8qIFN0cmVhbSBvdXRwdXQgaXMgc3RvcHBlZCAqLworI2RlZmluZQlSSU9fV0FJVEZMVVNICTB4MDgwMDAJCS8qIFN0cmVhbSB3YWl0aW5nIGZvciBmbHVzaCAqLworI2RlZmluZQlSSU9fRFlOT1JPRAkweDEwMDAwCQkvKiBEcmFpbiBmYWlsZWQgKi8KKyNkZWZpbmUJUklPX0RFTEVURUQJMHgyMDAwMAkJLyogUlRBIGhhcyBiZWVuIGRlbGV0ZWQgKi8KKyNkZWZpbmUgUklPX0lTU0NBTkNPREUJMHg0MDAwMAkJLyogVGhpcyBsaW5lIGlzIGluIHNjYW5jb2RlIG1vZGUgKi8KKyNkZWZpbmUJUklPX1VTSU5HX0VVQwkweDEwMDAwMAkvKiBVc2luZyBleHRlbmRlZCBVbml4IGNoYXJzICovCisjZGVmaW5lCVJJT19DQU5fQ09PSwkweDIwMDAwMAkvKiBUaGlzIGxpbmUgY2FuIGRvIGNvb2tpbmcgKi8KKyNkZWZpbmUgUklPX1RSSUFEX01PREUgIDB4NDAwMDAwICAgICAgICAvKiBFbmFibGUgVFJJQUQgc3BlY2lhbCBvcHMuICovCisjZGVmaW5lIFJJT19UUklBRF9CTE9DSyAweDgwMDAwMCAgICAgICAgLyogTmV4dCByZWFkIHdpbGwgYmxvY2sgKi8KKyNkZWZpbmUgUklPX1RSSUFEX0ZVTkMgIDB4MTAwMDAwMCAgICAgICAvKiBTZWVuIGEgZnVuY3Rpb24ga2V5IGNvbWluZyBpbiAqLworI2RlZmluZSBSSU9fVEhST1RUTEVfUlggMHgyMDAwMDAwICAgICAgIC8qIFJYIG5lZWRzIHRvIGJlIHRocm90dGxlZC4gKi8KKworICAgIHVsb25nCQkJQ29uZmlnOwkvKiBGTEFHUyBmb3IgTk9SRUFELi4uLiAqLworI2RlZmluZQlSSU9fTk9SRUFECTB4MDAwMQkJLyogQXJlIG5vdCBhbGxvd2VkIHRvIHJlYWQgcG9ydCAqLworI2RlZmluZQlSSU9fTk9XUklURQkweDAwMDIJCS8qIEFyZSBub3QgYWxsb3dlZCB0byB3cml0ZSBwb3J0ICovCisjZGVmaW5lCVJJT19OT1hQUklOVAkweDAwMDQJCS8qIEFyZSBub3QgYWxsb3dlZCB0byB4cHJpbnQgcG9ydCAqLworI2RlZmluZQlSSU9fTk9NQVNLCTB4MDAwNwkJLyogQWxsIG5vdCBhbGxvd2VkIHRoaW5ncyAqLworI2RlZmluZSBSSU9fSVhBTlkJMHgwMDA4ICAgICAgICAgIC8qIFBvcnQgaXMgYWxsb3dlZCBpeGFueSAqLworI2RlZmluZQlSSU9fTU9ERU0JMHgwMDEwCQkvKiBTdHJlYW0gaXMgYSBtb2RlbSBkZXZpY2UgKi8KKyNkZWZpbmUJUklPX0lYT04JMHgwMDIwCQkvKiBQb3J0IGlzIGFsbG93ZWQgaXhvbiAqLworI2RlZmluZSBSSU9fV0FJVERSQUlOCTB4MDA0MAkJLyogV2FpdCBmb3IgcG9ydCB0byBjb21wbGV0ZWx5IGRyYWluICovCisjZGVmaW5lIFJJT19NQVBfNTBfVE9fNTAJMHgwMDgwCS8qIE1hcCA1MCBiYXVkIHRvIDUwIGJhdWQgKi8KKyNkZWZpbmUgUklPX01BUF8xMTBfVE9fMTEwCTB4MDEwMAkvKiBNYXAgMTEwIGJhdWQgdG8gMTEwIGJhdWQgKi8KKworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYxIHBydCBmaXgKKyoqIEFzIEx5bnhPUyBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBIYXJkd2FyZSBGbG93IENvbnRyb2wgLi4uLi4KKyoqIERlZmluZSBvdXIgb3duIGZsb3cgY29udHJvbCBmbGFncyBpbiAnQ29uZmlnJy4KKyovCisjZGVmaW5lIFJJT19DVFNGTE9XCTB4MDIwMAkJLyogUklPJ3Mgb3duIENUU0ZMT1cgZmxhZyAqLworI2RlZmluZSBSSU9fUlRTRkxPVwkweDA0MDAJCS8qIFJJTydzIG93biBSVFNGTE9XIGZsYWcgKi8KKworCisgICAgc3RydWN0IFBIQgkJCSpQaGJQOwkgIC8qIHBvaW50ZXIgdG8gUEhCIGZvciBwb3J0ICovCisgICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICpUeEFkZDsgICAvKiBBZGQgcGFja2V0cyBoZXJlICovCisgICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICpUeFN0YXJ0OyAvKiBTdGFydCBvZiBhZGQgYXJyYXkgKi8KKyAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlR4RW5kOyAgICAgICAgIC8qIEVuZCBvZiBhZGQgYXJyYXkgKi8KKyAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlJ4UmVtb3ZlOyAgICAgIC8qIFJlbW92ZSBwYWNrZXRzIGhlcmUgKi8KKyAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlJ4U3RhcnQ7ICAgICAgIC8qIFN0YXJ0IG9mIHJlbW92ZSBhcnJheSAqLworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAqUnhFbmQ7ICAgICAgICAgLyogRW5kIG9mIHJlbW92ZSBhcnJheSAqLworICAgIHVpbnQJCQlSdGFVbmlxdWVOdW07CS8qIFVuaXF1ZSBudW1iZXIgb2YgUlRBICovCisgICAgdXNob3J0CQkJUG9ydFN0YXRlOwkvKiBzdGF0dXMgb2YgcG9ydCAqLworICAgIHVzaG9ydAkJCU1vZGVtU3RhdGU7CS8qIHN0YXR1cyBvZiBtb2RlbSBsaW5lcyAqLworICAgIHVsb25nCQkJTW9kZW1MaW5lczsJLyogTW9kZW0gYml0cyBzZW50IHRvIFJUQSAqLworICAgIHVjaGFyCQkJQ29va01vZGU7CS8qIHdobyBleHBhbmRzIENSL0xGPyAqLworICAgIHVjaGFyCQkJUGFyYW1TZW07CS8qIFByZXZlbnQgd3JpdGUgZHVyaW5nIHBhcmFtICovCisgICAgdWNoYXIJCQlNYXBwZWQ7CQkvKiBpZiBwb3J0IG1hcHBlZCBvbnRvIGhvc3QgKi8KKyAgICB1Y2hhcgkJCVNlY29uZEJsb2NrOwkvKiBpZiBwb3J0IGJlbG9uZ3MgdG8gMm5kIGJsb2NrCisJCQkJCQkgICBvZiAxNiBwb3J0IFJUQSAqLworICAgIHVjaGFyCQkJSW5Vc2U7CQkvKiBob3cgbWFueSBwcmUtZW1wdGl2ZSBjbWRzICovCisgICAgdWNoYXIJCQlMb2NrOwkJLyogaWYgcGFyYW1zIGxvY2tlZCAqLworICAgIHVjaGFyCQkJU3RvcmU7CS8qIGlmIHBhcmFtcyBzdG9yZWQgYWNyb3NzIGNsb3NlcyAqLworICAgIHVjaGFyCQkJRmlyc3RPcGVuOyAvKiBUUlVFIGlmIGZpcnN0IHRpbWUgcG9ydCBvcGVuZWQgKi8KKyAgICB1Y2hhcgkJCUZsdXNoQ21kQm9kZ2U7CS8qIGlmIGRvaW5nIGEgKG5vbilmbHVzaCAqLworICAgIHVjaGFyCQkJTWFnaWNGbGFnczsJLyogcmVxdWlyZSBpbnRyIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUJTUFHSUNfRkxVU0gJMHgwMQkvKiBtaXJyb3Igb2YgV2ZsdXNoRmxhZyAqLworI2RlZmluZQlNQUdJQ19SRUJPT1QJMHgwMgkvKiBSVEEgcmUtYm9vdGVkLCByZS1vcGVuIHBvcnRzICovCisjZGVmaW5lCU1PUkVfT1VUUFVUX0VZR09SIDB4MDQJLyogcmlvdHByb2MgZmFpbGVkIHRvIGVtcHR5IGNsaXN0cyAqLworICAgIHVjaGFyCQkJV2ZsdXNoRmxhZzsJLyogMSBIb3cgbWFueSBXRkxVU0hzIGFjdGl2ZSAqLworLyoKKyoqIFRyYW5zcGFyZW50IHByaW50IHN0dWZmCisqLworICAgIHN0cnVjdCBYcHJpbnQKKyAgICB7CisjaWZuZGVmIE1BWF9YUF9DVFJMX0xFTgorI2RlZmluZSBNQVhfWFBfQ1RSTF9MRU4JCTE2CQkvKiBBTFNPIElOIERBRU1PTi5IICovCisjZW5kaWYKKwl1aW50CQkJWHBDcHM7CisJY2hhcgkJCVhwT25bTUFYX1hQX0NUUkxfTEVOXTsKKwljaGFyCQkJWHBPZmZbTUFYX1hQX0NUUkxfTEVOXTsKKwl1c2hvcnQJCQlYcExlbjsJCS8qIHN0cmxlbihYcE9uKStzdHJsZW4oWHBPZmYpICovCisJdWNoYXIJCQlYcEFjdGl2ZTsKKwl1Y2hhcgkJCVhwTGFzdFRpY2tPazsJLyogVFJVRSBpZiB3ZSBjYW4gcHJvY2VzcyAqLworI2RlZmluZQlYUF9PUEVOCQkwMDAwMQorI2RlZmluZQlYUF9SVU5BQkxFCTAwMDAyCisJc3RydWN0IHR0eXN0YXRpY3MgCQkqWHR0eVA7CisgICAgfSBYcHJpbnQ7CisjaWZkZWYgVlBJWAorICAgIHY4Nl90CQkJKlN0YXNoUDsKKyAgICB1aW50CQkJSW50TWFzazsKKyAgICBzdHJ1Y3QgdGVybXNzIAkJVnBpeFNzOworICAgIHVjaGFyCQkJTW9kZW1TdGF0dXNSZWc7CS8qIE1vZGVtIHN0YXR1cyByZWdpc3RlciAqLworI2VuZGlmCisgICAgdWNoYXIJCQlSeERhdGFTdGFydDsKKyAgICB1Y2hhcgkJCUNvcjJDb3B5OwkvKiBjb3B5IG9mIENPUjIgKi8KKyAgICBjaGFyCQkJKk5hbWU7CQkvKiBwb2ludHMgdG8gdGhlIFJ0YSdzIG5hbWUgKi8KKyNpZmRlZiBTVEFUUworICAgIHN0cnVjdCBSSU9TdGF0cyAJCVN0YXQ7CQkvKiBwb3J0cyBzdGF0aXN0aWNzICovCisjZW5kaWYKKyAgICBjaGFyCQkJKlR4UmluZ0J1ZmZlcjsKKyAgICB1c2hvcnQJCQlUeEJ1ZmZlckluOwkvKiBOZXcgZGF0YSBhcnJpdmVzIGhlcmUgKi8KKyAgICB1c2hvcnQJCQlUeEJ1ZmZlck91dDsJLyogSW50ciByZW1vdmVzIGRhdGEgaGVyZSAqLworICAgIHVzaG9ydAkJCU9sZFR4QnVmZmVyT3V0OwkvKiBJbmRpY2F0ZXMgaWYgZHJhaW5pbmcgKi8KKyAgICBpbnQJCQkJVGltZW91dElkOwkvKiBUaW1lb3V0IElEICovCisgICAgdWludAkJCURlYnVnOworICAgIHVjaGFyCQkJV2FpdFVudGlsQm9vdGVkOyAvKiBUcnVlIGlmIG9wZW4gc2hvdWxkIGJsb2NrICovCisgICAgdWludAkJCXN0YXRzR2F0aGVyOwkvKiBUcnVlIGlmIGdhdGhlcmluZyBzdGF0cyAqLworICAgIHVsb25nCQkJdHhjaGFyczsJLyogQ2hhcnMgdHJhbnNtaXR0ZWQgKi8KKyAgICB1bG9uZwkJCXJ4Y2hhcnM7CS8qIENoYXJzIHJlY2VpdmVkICovCisgICAgdWxvbmcJCQlvcGVuczsJCS8qIHBvcnQgb3BlbiBjb3VudCAqLworICAgIHVsb25nCQkJY2xvc2VzOwkJLyogcG9ydCBjbG9zZSBjb3VudCAqLworICAgIHVsb25nCQkJaW9jdGxzOwkJLyogaW9jdGwgY291bnQgKi8KKyAgICB1Y2hhcgkJCUxhc3RSeFRnbDsJLyogTGFzdCBzdGF0ZSBvZiByeCB0b2dnbGUgYml0ICovCisgIHNwaW5sb2NrX3QJCQkJcG9ydFNlbTsJLyogTG9jayB1c2luZyB0aGlzIHNlbSAqLworCWludAkJCQlNb25pdG9yVHN0YXRlOwkvKiBNb25pdG9yaW5nID8gKi8KKwlpbnQJCQkJdGltZW91dF9pZDsJLyogRm9yIGNhbGxpbmcgMTAwIG1zIGRlbGF5cyAqLworCWludAkJCQl0aW1lb3V0X3NlbTsvKiBGb3IgY2FsbGluZyAxMDAgbXMgZGVsYXlzICovCisJaW50CQkJCWZpcnN0T3BlbjsJLyogRmlyc3QgdGltZSBvcGVuID8gKi8KKwljaGFyICoJCQlwOwkJCS8qIHNhdmUgdGhlIGdsb2JhbCBzdHJ1YyBoZXJlIC4uICovCit9OworCitzdHJ1Y3QgTW9kdWxlSW5mbworeworCWNoYXIJKk5hbWU7CisJdWludAlGbGFnc1s0XTsJLyogb25lIHBlciBwb3J0IG9uIGEgbW9kdWxlICovCit9OworI2VuZGlmCisKKy8qCisqKiBUaGlzIHN0cnVjdCBpcyByZXF1aXJlZCBiZWNhdXNlIHRyeWluZyB0byBncmFiIGFuIGVudGlyZSBQb3J0IHN0cnVjdHVyZQorKiogcnVucyBpbnRvIHByb2JsZW1zIHdpdGggZGlmZmVyaW5nIHN0cnVjdCBzaXplcyBiZXR3ZWVuIGRyaXZlciBhbmQgY29uZmlnLgorKi8KK3N0cnVjdCBQb3J0UGFyYW1zIHsKKwl1aW50CVBvcnQ7CisJdWxvbmcJQ29uZmlnOworCXVsb25nCVN0YXRlOworCXN0cnVjdCB0dHlzdGF0aWNzCSpUdHlQOworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcHJvdG8uaCBiL2RyaXZlcnMvY2hhci9yaW8vcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZmMGVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wcm90by5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpZm5kZWYJX3Byb3RvdHlwZXNfaAorI2RlZmluZSBfcHJvdG90eXBlc19oCisKKworLyoKKyoqIGJvb3QuYworKi8KK3ZvaWQgaW5pdF9ib290KCBjaGFyICpwLCBzaG9ydCBzdGFnZSk7CisKKy8qCisqKiBkaXNjb25jdC5jCisqLwordm9pZCBraWxsX2Jvb3QgKCBMUEIgKmxpbmsgKTsKK3ZvaWQgZGlzY29ubmVjdGVkKCBMUEIgKmxpbmsgKTsKK3Nob3J0IGJvb3RfMyggTFBCICpsaW5rLCBQS1QgKnBrdCApOworc2hvcnQgc2VuZF8zX3BrdCggTFBCICpsaW5rLCBQS1QgKnBrdCk7CisKKy8qCisqKiBlcnJvci5jCisqLwordm9pZCBkdV9lcnJvcih2b2lkKTsKKworLyoKKyoqIGZvcm1wa3QuYworKi8KK3VzaG9ydCBzdW1faXQoIFBLVCAqcGt0ICkgOwordm9pZCBmb3JtX3J1cF9wa3QoIFJVUCAqZm9ybV9ydXAsIFBLVCAqcGt0ICk7Cit2b2lkIGZvcm1fcG9sbF9wa3QgKCBpbnQgdHlwZSwgTFBCICpsaW5rLCBpbnQgbm9kZSApOwordm9pZCBmb3JtX3JvdXRlX3BrdCAoIGludCB0eXBlLCBQS1QgKnBrdCwgTFBCICpsaW5rICk7CisKKy8qCisqKiBpZGxlLmMKKyovCit2b2lkIGlkbGUoIFByb2Nlc3MgKmlkbGVfcCApOworCisvKgorKiogaW5pdC5jCisqLwordm9pZCBnZW5lcmFsX2luaXQodm9pZCk7Cit2b2lkIG1lbV9oYWx0KCBpbnQgZXJyb3IpOworCisvKgorKiogbGlua2luaXQuYworKi8KK3ZvaWQgaW5pdGxpbmsoIHVfc2hvcnQgbnVtYmVyLCBMUEIgKmxpbmspOwordm9pZCBydW5saW5rKCBMUEIgKmxpbmspOworCisvKgorKiogbGlzdC5jCisqLworUEtUICpnZXRfZnJlZV9zdGFydCh2b2lkKTsKK3ZvaWQgcHV0X2ZyZWVfc3RhcnQoIFBLVCAqcGt0KTsKKworI2lmZGVmIEhPU1QKK2ludCBjYW5fcmVtb3ZlX3RyYW5zbWl0ICggUEtUICoqcGt0LCBQS1QgKnBvaW50ZXIgKTsKKyNlbmRpZgorCisjaWZkZWYgUlRBCitpbnQgc3BsNyAoIHZvaWQgKTsKK2ludCBzcGwwICggdm9pZCApOworUV9CVUYgKmdldF9mcmVlX3EoIHZvaWQgKTsKK1BLVCAqZ2V0X2ZyZWVfZW5kKHZvaWQpOworaW50IGFkZF9lbmQoIFBLVCAqcGt0LCBQSEIgKnBoYiwgaW50IHR5cGUpOwordW5zaWduZWQgc2hvcnQgZnJlZV9wYWNrZXRzKCBQSEIgKnBoYiwgaW50IHR5cGUpOworaW50IGNhbl9yZW1vdmVfc3RhcnQoIFBLVCAqKnBrdCwgUEhCICpwaGIsIGludCB0eXBlKTsKK2ludCBjYW5fYWRkX3N0YXJ0KCBQSEIgKnBoYiwgaW50IHR5cGUpOworaW50IGNhbl9hZGRfZW5kKCBQSEIgKnBoYiwgaW50IHR5cGUpOwordm9pZCBwdXRfZnJlZV9lbmQoIFBLVCAqcGt0KTsKK2ludCByZW1vdmVfc3RhcnQoIFBLVCAqKnBrdCwgUEhCICpwaGIsIGludCB0eXBlKTsKKyNlbmRpZgorCisvKgorKiogTHJ0LmMKKyovCit2b2lkIGxydCggUHJvY2VzcyAqbHJ0X3AsIExQQiAqbGluayApOworCisjaWZkZWYgUlRBCit2b2lkIHNldF9sZWRfcmVkICggTFBCICpsaW5rICk7CisjZW5kaWYKKworLyoKKyoqIGx0dC5jCisqLwordm9pZCBsdHQoIFByb2Nlc3MgKmx0dF9wLCBMUEIgKmxpbmssIFBIQiAqcGhiX3B0cltdICk7Cit2b2lkIHNlbmRfcG9sbCAoIExQQiAqbGluayApOwordm9pZCByZXF1ZXN0X2lkICggTFBCICpsaW5rICk7Cit2b2lkIHNlbmRfdG9wb2xvZ3lfdXBkYXRlICggTFBCICpsaW5rICk7Cit2b2lkIHNlbmRfdG9wb2xvZ3kgKCBMUEIgKmxpbmsgKTsKK3ZvaWQgc3VwcGx5X2lkICggTFBCICpsaW5rICk7CisKKyNpZmRlZiBSVEEKK3ZvaWQgcmVkaXJlY3RfcXVldWUgKCBMUEIgKmxpbmssIHVzaG9ydCBmbHVzaCApOworaW50IG9idGFpbl9ydXAgKCBpbnQgcnVwX251bWJlciwgUEtUICoqcGt0X2FkZHJlc3MsIExQQiAqbGluayApOworI2VuZGlmCisKKyNpZmRlZiBURVNUSU5HX1BFUkYKK2ludCBjb25zdW1lX2NwdSggdm9pZCApOworI2VuZGlmCisKKy8qCisqKiBsdHR3YWtlLmMKKyovCisjaWZkZWYgSE9TVAordm9pZCBsdHRfd2FrZXVwKCBQcm9jZXNzICpsdHRfd2FrZXVwX3AgKTsKKyNlbmRpZgorCisvKgorKiogbWFwZ2VuLmMKKyovCit2b2lkIGdlbmVyYXRlX2lkX21hcCggc2hvcnQgbWFwcGluZywgUk9VVEVfU1RSIHJvdXRlW10gKTsKK3ZvaWQgZ2VuX21hcCggaW50IG1hcHBpbmcsIGludCBsb29raW5nX2F0LCBpbnQgY29tZV9mcm9tLCBST1VURV9TVFIgcm91dGVbXSwgaW50IGxpbmssIGludCAqdHRsICk7Cit2b2lkIGFkanVzdF90dGwoIGludCBtYXBwaW5nLCBpbnQgbG9va2luZ19hdCwgaW50IGNvbWVfZnJvbSwgUk9VVEVfU1RSIHJvdXRlW10sIGludCBsaW5rLCBpbnQgKnR0bCk7Cit2b2lkIGluaXRfc3lzX21hcCh2b2lkKTsKKworLyoKKyoqIG1tdS5jCisqLworY2hhciAqcmlvX21hbGxvYyggdW5zaWduZWQgaW50IGFtb3VudCk7CitjaGFyICpyaW9fY2FsbG9jKCB1bnNpZ25lZCBpbnQgbnVtLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitFUlJPUiByaW9fbW11X2luaXQoIHVpbnQgdG90YWxfbWVtICk7CisKKy8qCisqKiBwYXJ0bi5jCisqLwordm9pZCBwYXJ0aXRpb25fdHgoIHN0cnVjdCBQSEIgKnBoYiwgdV9zaG9ydCB0eF9zaXplLCB1X3Nob3J0IHJ4X3NpemUsIHVfc2hvcnQgcnhfbGltaXQpOworCisvKgorKiogcG9sbC5jCisqLwordm9pZCB0eF9wb2xsKCBQcm9jZXNzICp0eF9wb2xsX3ApOworCisvKgorKiogcHJvY2Vzcy5jCisqLworaW50ICBnZXRfcHJvY19zcGFjZSggUHJvY2VzcyAqKnBkLCBpbnQgKipwd3MsIGludCB3c3NpemUpOworCisvKgorKiogcmVhZHJvbS5jCisqLwordm9pZCByZWFkX3NlcmlhbF9udW1iZXIoY2hhciAqYnVmKTsKKworLyoKKyoqIHJpby5jCisqLworaW50IG1haW4oIHZvaWQgKTsKKworLyoKKyoqIHJvdXRlLmMKKyovCit2b2lkIHJvdXRlX3VwZGF0ZSAoIFBLVCAqcGt0LCBMUEIgKmxpbmspOworCisvKgorKiogcnRhaW5pdC5jCisqLworI2lmIGRlZmluZWQoUlRBKQordm9pZCBydGFfaW5pdCh1c2hvcnQgUnRhVHlwZSk7CisjZW5kaWYgLyogZGVmaW5lZChSVEEpICovCisKKy8qCisqKiBydXBib290LmMKKyovCit2b2lkIHJ1cF9ib290KCBQS1QgKnBrdCwgUlVQICp0aGlzX3J1cCwgTFBCICpsaW5rKTsKKworI2lmZGVmIFJUQQordm9pZCBraWxsX3lvdXJfbmVpZ2hib3VyKCBpbnQgbGlua190b19raWxsICk7CisjZW5kaWYKKworLyoKKyoqIHJ1cGNtZC5jCisqLwordm9pZCBydXBfY29tbWFuZCggUEtUICpwa3QsIHN0cnVjdCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmspOworCisvKgorKiogcnVwZXJyLmMKKyovCit2b2lkIHJ1cF9lcnJvciggUEtUICpwa3QsIFJVUCAqdGhpc19ydXAsIExQQiAqbGluayApOwordm9pZCBpbGxlZ2FsX2NtZCggUEtUICpzcmNfcGt0ICk7CisKKy8qCisqKiBydXBwb2xsLmMKKyovCit2b2lkIHJ1cF9wb2xsKCBQS1QgKnBrdCwgUlVQICp0aGlzX3J1cCwgTFBCICpsaW5rICk7CisKKy8qCisqKiBydXBwb3dlci5jCisqLwordm9pZCBydXBfcG93ZXIoIFBLVCAqcGt0LCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmsgKTsKKworLyoKKyoqIHJ1cHJtLmMKKyovCit2b2lkIHJ1cF9yb3V0ZV9tYXAoIFBLVCAqcGt0LCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmspOworCisvKgorKiogcnVwc3RhdC5jCisqLwordm9pZCBydXBfc3RhdHVzKCBQS1QgKnBrdCwgUlVQICp0aGlzX3J1cCwgTFBCICpsaW5rKTsKKworLyoKKyoqIHJ1cHN5bmMuYworKi8KK3ZvaWQgcnVwX3N5bmMoIFBLVCAqcGt0KTsKKworLyoKKyoqIHJ4cGt0LmMKKyovCitFUlJPUiAgcnhfcGt0KCBQS1RfcHRyX3B0ciBwa3RfYWRkcmVzcywgTFBCICpsaW5rKTsKKworLyoKKyoqIHNlbmRzdHMuYworKi8KK3ZvaWQgc2VuZF9zdGF0dXMoIFBLVCAqcmVxdWVzdGluZ19wa3QsIFJVUCAqdGhpc19ydXApOworCisvKgorKiogc2VyaWFsLmMKKyovCit2b2lkIGFzc2lnbl9zZXJpYWwgKCBjaGFyICpzZXJfaW4sIGNoYXIgKnNlcl9vdXQpOworaW50IGNtcF9zZXJpYWwgKCBjaGFyICpzZXJfMSwgY2hhciAqc2VyXzIpOworCisvKgorKiogdHhwa3QuYworKi8KK0VSUk9SICB0eF9wa3QoIFBLVCAqcGt0LCBMUEIgKmxpbmspOworc2hvcnQgc2VuZF9zeW5jKCBMUEIgKmxpbmspOworCisjZW5kaWYJLyogX3Byb3RvdHlwZXNfaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wcm90c3RzLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Byb3RzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDgxMTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wcm90c3RzLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICBQIFIgTyBUIE8gQyBPIEwgICAgUyBUIEEgVCBVIFMgICBTIFQgUiBVIEMgVCBVIFIgRSAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3Byb3RzdHNfaAorI2RlZmluZSBfcHJvdHN0c19oIDEKKworCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcHJvdHN0c19oX3NjY3MgPSAiQCgjKXByb3RzdHMuaAkxLjQiOyAqLworI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFDSyBiaXQuIExhc3QgUGFja2V0IHJlY2VpdmVkIE9LLiBTZXQgYnkKKyAqIHJ4cGt0IHRvIGluZGljYXRlIHRoYXQgdGhlIFBhY2tldCBoYXMgYmVlbgorICogcmVjZWl2ZWQgT0sgYW5kIHRoYXQgdGhlIExUVCBtdXN0IHNldCB0aGUgQUNLCisgKiBiaXQgaW4gdGhlIG5leHQgb3V0d2FyZCBib3VuZCBQYWNrZXQKKyAqIGFuZCByZS1zZXQgYnkgTFRUJ3MgYWZ0ZXIgeG1pdC4KKyAqCisgKiBHZXRzIHNob3ZlZCBpbnRvIHJ4X3N0YXR1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEhCX1JYX0xBU1RfUEtUX0FDS0VEICAgICgodXNob3J0KSAweDA4MCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBSeCBUT0dHTEUgYml0LgorICogU3R1ZmZlZCBpbnRvIHJ4X3N0YXR1cyBieSBSWFBLVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEhCX1JYX0RBVEFfV05EVyAgICAgICAgICgodXNob3J0KSAweDA0MCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBSeCBUT0dHTEUgYml0LiBNYXRjaGVzIHRoZSBzZXR0aW5nIGluIFBLVC5ICisgKiBTdHVmZmVkIGludG8gcnhfc3RhdHVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfUlhfVEdMICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4MjAwMCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBiaXQgaXMgc2V0IGJ5IHRoZSBMUlQgdG8gaW5kaWNhdGUgdGhhdAorICogYW4gQUNLIChwYWNrZXQpIG11c3QgYmUgcmV0dXJuZWQuCisgKgorICogR2V0cyBzaG92ZWQgaW50byB0eF9zdGF0dXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBIQl9UWF9TRU5EX1BLVF9BQ0sgICAgICAoKHVzaG9ydCkgMHgwOCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCBieSBMVFQgdG8gaW5kaWNhdGUgdGhhdCBhbiBBQ0sgaXMgcmVxdWlyZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfVFhfQUNLX1JRUkQgICAgICAgICAoKHVzaG9ydCkgMHgwMSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIFR4IFRPR0dMRSBiaXQuCisgKiBTdHVmZmVkIGludG8gdHhfc3RhdHVzIGJ5IFJYUEtUIGZyb20gdGhlIFBLVCBXbmRXCisgKiBmaWVsZC4gTG9va2VkIGJ5IHRoZSBMVFQgd2hlbiB0aGUgTkVYVCBQYWNrZXQKKyAqIGlzIGdvaW5nIHRvIGJlIHNlbnQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfVFhfREFUQV9XTkRXICAgICAgICAgKCh1c2hvcnQpIDB4MDQpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBUeCBUT0dHTEUgYml0LiBNYXRjaGVzIHRoZSBzZXR0aW5nIGluIFBLVC5ICisgKiBTdHVmZmVkIGludG8gdHhfc3RhdHVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSEJfVFhfVEdMICAgICAgICAgICAgICAgKCh1c2hvcnQpIDB4MDIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXF1ZXN0IGludHIgYml0LiBTZXQgd2hlbiB0aGUgcXVldWUgaGFzIGdvbmUgcXVpZXQKKyAqIGFuZCB0aGUgUEhCIGhhcyByZXF1ZXN0ZWQgYW4gaW50ZXJydXB0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEhCX1RYX0lOVFIgICAgICAgICAgICAgKCh1c2hvcnQpIDB4MTAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0VUIGlmIHRoZSBQSEIgY2Fubm90IHNlbmQgYW55IG1vcmUgZGF0YSBkb3duIHRoZQorICogTGluaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEhCX1RYX0hBTkRTSEFLRSAgICAgICAgICgodXNob3J0KSAweDAxMCkKKworCisjZGVmaW5lIFJVUF9TRU5EX1dORFcJCSAoKHVzaG9ydCkgMHgwOCkgOworCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcWJ1Zi5oIGIvZHJpdmVycy9jaGFyL3Jpby9xYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjZTAyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcWJ1Zi5oCkBAIC0wLDAgKzEsNjcgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICBRIFUgRSBVIEUgICAgQiBVIEYgRiBFIFIgICBTIFQgUiBVIEMgVCBVIFIgRSBTCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9xYnVmX2gKKyNkZWZpbmUgX3FidWZfaCAxCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19xYnVmX2hfc2NjcyA9ICJAKCMpcWJ1Zi5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworCisKKyNpZmRlZiBIT1NUCisjZGVmaW5lIFBLVFNfUEVSX0JVRkZFUiAgICAxCisjZWxzZQorI2RlZmluZSBQS1RTX1BFUl9CVUZGRVIgICAgKDIyMCAvIFBLVF9MRU5HVEgpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgUV9CVUYgUV9CVUYgOworc3RydWN0IFFfQlVGICB7CisgICAgICAgICAgICAgICAgICBRX0JVRl9wdHIgbmV4dCA7CisgICAgICAgICAgICAgICAgICBRX0JVRl9wdHIgcHJldiA7CisgICAgICAgICAgICAgICAgICBQS1RfcHRyIGJ1ZltQS1RTX1BFUl9CVUZGRVJdIDsKKyAgICAgICAgICAgICAgfSA7CisKKworI2VuZGlmCisKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpby5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2E5OTMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW8uaApAQCAtMCwwICsxLDI5NCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMTk5OCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvLmgKKyoqCVNJRAkJOiAxLjMKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEzCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIylyaW8uaAkxLjMKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZglfX3Jpb19yaW9faF9fCisjZGVmaW5lCV9fcmlvX3Jpb19oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19oX3NjY3NfID0gIkAoIylyaW8uaAkxLjMiOworI2VuZGlmCisKKy8qCisqKiAzMC4wOS4xOTk4IEFSRyAtCisqKiBJbnRyb2R1Y2VkIGRyaXZlciB2ZXJzaW9uIGFuZCBob3N0IGNhcmQgdHlwZSBzdHJpbmdzCisqLworI2RlZmluZSBSSU9fRFJWX1NUUiAiU3BlY2lhbGl4IFJJTyBEcml2ZXIiCisjZGVmaW5lIFJJT19BVF9IT1NUX1NUUiAiSVNBIgorI2RlZmluZSBSSU9fUENJX0hPU1RfU1RSICJQQ0kiCisKKworLyoKKyoqIHJpb19pbmZvX3N0b3JlKCkgY29tbWFuZHMgKGFyYml0YXJ5IHZhbHVlcykgOgorKi8KKyNkZWZpbmUgUklPX0lORk9fUFVUCTB4QTRCM0MyRDEKKyNkZWZpbmUgUklPX0lORk9fR0VUCTB4RjFFMkQzQzQKKworCisvKgorKiogYW55dGhpbmcgdGhhdCBJIGNvdWxkbid0IGNyYW0gaW4gc29tZXdoZXJlIGVsc2UKKyovCisvKgorI2lmbmRlZiBSSU9ERUJVRworI2RlZmluZSBkZWJ1ZworI2Vsc2UKKyNkZWZpbmUgZGVidWcgcmlvcHJpbnQKKyNlbmRpZgorKi8KKworCisvKgorKioJTWF4aW11bSBudW1iZXJzIG9mIHRoaW5ncworKi8KKyNkZWZpbmUJUklPX1NMT1RTCTQJLyogbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb24gc2xvdHMgKi8KKyNkZWZpbmUJUklPX0hPU1RTCTQJLyogbnVtYmVyIG9mIGhvc3RzIHRoYXQgY2FuIGJlIGZvdW5kICovCisjZGVmaW5lCVBPUlRTX1BFUl9IT1NUCTEyOAkvKiBudW1iZXIgb2YgcG9ydHMgcGVyIGhvc3QgKi8KKyNkZWZpbmUJTElOS1NfUEVSX1VOSVQJNAkvKiBudW1iZXIgb2YgbGlua3MgZnJvbSBhIGhvc3QgKi8KKyNkZWZpbmUJUklPX1BPUlRTCShQT1JUU19QRVJfSE9TVCAqIFJJT19IT1NUUykgLyogbWF4LiBuby4gb2YgcG9ydHMgKi8KKyNkZWZpbmUJUlRBU19QRVJfSE9TVAkoTUFYX1JVUCkgLyogbnVtYmVyIG9mIFJUQXMgcGVyIGhvc3QgKi8KKyNkZWZpbmUJUE9SVFNfUEVSX1JUQQkoUE9SVFNfUEVSX0hPU1QvUlRBU19QRVJfSE9TVCkJLyogcG9ydHMgb24gYSBydGEgKi8KKyNkZWZpbmUJUE9SVFNfUEVSX01PRFVMRSA0CS8qIG51bWJlciBvZiBwb3J0cyBvbiBhIHBsdWctaW4gbW9kdWxlICovCisJCQkJLyogbnVtYmVyIG9mIG1vZHVsZXMgb24gYW4gUlRBICovCisjZGVmaW5lCU1PRFVMRVNfUEVSX1JUQQkgKFBPUlRTX1BFUl9SVEEvUE9SVFNfUEVSX01PRFVMRSkKKyNkZWZpbmUgTUFYX1BST0RVQ1QJMTYJLyogbnVtYnIgb2YgZGlmZmVyZW50IHByb2R1Y3QgY29kZXMgKi8KKyNkZWZpbmUgTUFYX01PRFVMRV9UWVBFUyAxNgkvKiBudW1iZXIgb2YgZGlmZmVyZW50IHR5cGVzIG9mIG1vZHVsZSAqLworCisjZGVmaW5lIFJJT19DT05UUk9MX0RFVgkxMjgJLyogbWlub3IgbnVtYmVyIG9mIGhvc3QvY29udHJvbCBkZXZpY2UgKi8KKyNkZWZpbmUgUklPX0lOVkFMSURfTUFKT1IgMAkvKiB0ZXN0IGZpcnN0IGhvc3QgY2FyZCdzIG1ham9yIG5vIGZvciB2YWxpZGl0eSAqLworCisvKgorKiogbnVtYmVyIG9mIFJUQXMgdGhhdCBjYW4gYmUgYm91bmQgdG8gYSBtYXN0ZXIKKyovCisjZGVmaW5lIE1BWF9SVEFfQklORElOR1MgKE1BWF9SVVAgKiBSSU9fSE9TVFMpCisKKy8qCisqKglVbml0IHR5cGVzCisqLworI2RlZmluZSBQQ19SVEExNgkweDkwMDAwMDAwCisjZGVmaW5lIFBDX1JUQTgJCTB4ZTAwMDAwMDAKKyNkZWZpbmUgVFlQRV9IT1NUCTAKKyNkZWZpbmUgVFlQRV9SVEE4CTEKKyNkZWZpbmUgVFlQRV9SVEExNgkyCisKKy8qCisqKglGbGFnIHZhbHVlcyByZXR1cm5lZCBieSBmdW5jdGlvbnMKKyovCisjZGVmaW5lCVJJT19GQUlMCS0xCisjZGVmaW5lCVJJT19TVUNDRVNTCTAKKyNkZWZpbmUJQ09QWUZBSUwJLTEJLyogY29weVtpbnxvdXRdIGZhaWxlZCAqLworCisvKgorKiogU3lzUG9ydCB2YWx1ZSBmb3Igc29tZXRoaW5nIHRoYXQgaGFzbid0IGFueSBwb3J0cworKi8KKyNkZWZpbmUJTk9fUE9SVAkweEZGRkZGRkZGCisKKy8qCisqKiBVbml0IElEIE9mIGFsbCBob3N0cworKi8KKyNkZWZpbmUJSE9TVF9JRAkwCisKKy8qCisqKiBCcmVhayBieXRlcyBpbnRvIG55YmxlcworKi8KKyNkZWZpbmUJTE9OWUJMRShYKQkoKFgpICYgMHhGKQorI2RlZmluZQlISU5ZQkxFKFgpCSgoKFgpPj40KSAmIDB4RikKKworLyoKKyoqIEZsYWcgdmFsdWVzIHBhc3NlZCBpbnRvIHNvbWUgZnVuY3Rpb25zCisqLworI2RlZmluZQlET05UX1NMRUVQCTAKKyNkZWZpbmUJT0tfVE9fU0xFRVAJMQorCisjZGVmaW5lCURPTlRfUFJJTlQJMQorI2RlZmluZQlET19QUklOVAkwCisKKyNkZWZpbmUgUFJJTlRfVE9fTE9HX0NPTlMJMAorI2RlZmluZSBQUklOVF9UT19DT05TCTEKKyNkZWZpbmUgUFJJTlRfVE9fTE9HCTIKKworLyoKKyoqIFRpbWVvdXQgaGFzIHRyb3VibGUgd2l0aCB0aW1lcyBvZiBsZXNzIHRoYW4gMyB0aWNrcy4uLgorKi8KKyNkZWZpbmUJTUlOX1RJTUVPVVQJMworCisvKgorKioJR2VuZXJhbGx5IHVzZWZ1bCBjb25zdGFudHMKKyovCisjZGVmaW5lCUhBTEZfQV9TRUNPTkQJCSgoSFopPj4xKQorI2RlZmluZQlBX1NFQ09ORAkJKEhaKQorI2RlZmluZQlIVU5EUkVEX0haCQkoKEhaLzEwMCk/KEhaLzEwMCk6MSkKKyNkZWZpbmUJRklGVFlfSFoJCSgoSFovNTApPyhIWi81MCk6MSkKKyNkZWZpbmUJVFdFTlRZX0haCQkoKEhaLzIwKT8oSFovMjApOjEpCisjZGVmaW5lCVRFTl9IWgkJCSgoSFovMTApPyhIWi8xMCk6MSkKKyNkZWZpbmUJRklWRV9IWgkJCSgoSFovNSk/KEhaLzUpOjEpCisjZGVmaW5lCUhVTkRSRURfTVMJCVRFTl9IWgorI2RlZmluZQlGSUZUWV9NUwkJVFdFTlRZX0haCisjZGVmaW5lCVRXRU5UWV9NUwkJRklGVFlfSFoKKyNkZWZpbmUJVEVOX01TCQkJSFVORFJFRF9IWgorI2RlZmluZQlUV09fU0VDT05EUwkJKChBX1NFQ09ORCkqMikKKyNkZWZpbmUJRklWRV9TRUNPTkRTCQkoKEFfU0VDT05EKSo1KQorI2RlZmluZQlURU5fU0VDT05EUwkJKChBX1NFQ09ORCkqMTApCisjZGVmaW5lCUZJRlRFRU5fU0VDT05EUwkJKChBX1NFQ09ORCkqMTUpCisjZGVmaW5lCVRXRU5UWV9TRUNPTkRTCQkoKEFfU0VDT05EKSoyMCkKKyNkZWZpbmUJSEFMRl9BX01JTlVURQkJKEFfTUlOVVRFPj4xKQorI2RlZmluZQlBX01JTlVURQkJKEFfU0VDT05EKjYwKQorI2RlZmluZQlGSVZFX01JTlVURVMJCShBX01JTlVURSo1KQorI2RlZmluZQlRVUFSVEVSX0hPVVIJCShBX01JTlVURSoxNSkKKyNkZWZpbmUJSEFMRl9IT1VSCQkoQV9NSU5VVEUqMzApCisjZGVmaW5lCUhPVVIJCQkoQV9NSU5VVEUqNjApCisKKyNkZWZpbmUJU0lYVEVFTl9NRUcJCTB4MTAwMDAwMAorI2RlZmluZQlPTkVfTUVHCQkJMHgxMDAwMDAKKyNkZWZpbmUJU0lYVFlfRk9VUl9LCQkweDEwMDAwCisKKyNkZWZpbmUJUklPX0FUX01FTV9TSVpFCQlTSVhUWV9GT1VSX0sKKyNkZWZpbmUJUklPX0VJU0FfTUVNX1NJWkUJU0lYVFlfRk9VUl9LCisjZGVmaW5lCVJJT19NQ0FfTUVNX1NJWkUJU0lYVFlfRk9VUl9LCisKKyNkZWZpbmUJUE9MTF9WRUNUT1IJCTB4MTAwCisKKyNkZWZpbmUJQ09PS19XRUxMCQkwCisjZGVmaW5lCUNPT0tfTUVESVVNCQkxCisjZGVmaW5lCUNPT0tfUkFXCQkyCisKKy8qCisqKglQb2ludGVyIG1hbmlwdWxhdGlvbiBzdHVmZgorKioJUklPX1BUUiB0YWtlcyBob3N0cC0+Q2FkZHIgYW5kIHRoZSBvZmZzZXQgaW50byB0aGUgRFAgUkFNIGFyZWEKKyoqCWFuZCBwcm9kdWNlcyBhIFVOSVggY2FkZHJfdCAocG9pbnRlcikgdG8gdGhlIG9iamVjdAorKioJUklPX09CSiB0YWtlcyBob3N0cC0+Q2FkZHIgYW5kIGEgVU5JWCBwb2ludGVyIHRvIGFuIG9iamVjdCBhbmQKKyoqCXJldHVybnMgdGhlIG9mZnNldCBpbnRvIHRoZSBEUCBSQU0gYXJlYS4KKyovCisjZGVmaW5lCVJJT19QVFIoQyxPKSAoKChjYWRkcl90KShDKSkrKDB4RkZGRiYoTykpKQorI2RlZmluZQlSSU9fT0ZGKEMsTykgKChpbnQpKE8pLShpbnQpKEMpKQorCisvKgorKioJSG93IHRvIGNvbnZlcnQgZnJvbSB2YXJpb3VzIGRpZmZlcmVudCBkZXZpY2UgbnVtYmVyIGZvcm1hdHM6CisqKglERVYgaXMgYSBkZXYgbnVtYmVyLCBhcyBwYXNzZWQgdG8gb3BlbiwgY2xvc2UgZXRjIC0gTk9UIGEgbWlub3IKKyoqCW51bWJlciEKKyoqCisqKglOb3RlOglMeW54T1Mgb25seSBnaXZlcyB1cyA4IGJpdHMgZm9yIHRoZSBkZXZpY2UgbWlub3IgbnVtYmVyLAorKioJCXNvIGFsbCB0aGlzIGNyYXAgaGVyZSB0byBkZWFsIHdpdGggJ21vZGVtJyBiaXRzIGV0Yy4gaXMKKyoqCQlqdXN0IGEgbG9hZCBvZiBpcnJlbGV2YW50IG9sZCBidW5rdW0hCisqKgkJVGhpcyBob3dldmVyIGRvZXMgbm90IHN0b3AgdXMgbmVlZGluZyB0byBkZWZpbmUgYSB2YWx1ZQorKioJCWZvciBSSU9fTU9ERU1PRkZTRVQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgdGhlICdyaW9ta2RldicKKyoqCQl1dGlsaXR5IGluIHRoZSBOZXcgQ29uZmlnIFV0aWxpdGllcyBzdWl0ZS4KKyovCisvKiAwLTUxMTogZGlyZWN0IDUxMi0xMDIzOiBtb2RlbSAqLworI2RlZmluZQlSSU9fTU9ERU1PRkZTRVQJCTB4MjAwCS8qIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyAqLworI2RlZmluZQlSSU9fTU9ERU1fTUFTSwkJMHgxRkYKKyNkZWZpbmUJUklPX01PREVNX0JJVAkJMHgyMDAKKyNkZWZpbmUJUklPX1VOTU9ERU0oREVWKQkoTUlOT1IoREVWKSAmIFJJT19NT0RFTV9NQVNLKQorI2RlZmluZQlSSU9fSVNNT0RFTShERVYpCShNSU5PUihERVYpICYgUklPX01PREVNX0JJVCkKKyNkZWZpbmUgUklPX1BPUlQoREVWLEZJUlNUX01BSikJKCAoTUFKT1IoREVWKSAtIEZJUlNUX01BSikgKiBQT1JUU19QRVJfSE9TVCkgXAorCQkJCQkrIE1JTk9SKERFVikKKworI2RlZmluZQlzcGxyaW8Jc3BsdHR5CisKKyNkZWZpbmUJUklPX0lQTAk1CisjZGVmaW5lCVJJT19QUkkJKFBaRVJPKzEwKQorI2RlZmluZSBSSU9fQ0xPU0VfUFJJCVBaRVJPLTEJLyogdW5pbnRlcnJ1cHRpYmxlIHNsZWVwcyBmb3IgY2xvc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRGJJbmYKK3sKKwl1aW50CUZsYWc7CisJY2hhcglOYW1lWzhdOworfSBEYkluZjsKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lCVRSVUUgKDE9PTEpCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUJRkFMU0UJKCFUUlVFKQorI2VuZGlmCisKKyNkZWZpbmUgQ1NVTShwa3RfcHRyKSAgKCgodXNob3J0ICopKHBrdF9wdHIpKVswXSArICgodXNob3J0ICopKHBrdF9wdHIpKVsxXSArIFwKKwkJCSgodXNob3J0ICopKHBrdF9wdHIpKVsyXSArICgodXNob3J0ICopKHBrdF9wdHIpKVszXSArIFwKKwkJCSgodXNob3J0ICopKHBrdF9wdHIpKVs0XSArICgodXNob3J0ICopKHBrdF9wdHIpKVs1XSArIFwKKwkJCSgodXNob3J0ICopKHBrdF9wdHIpKVs2XSArICgodXNob3J0ICopKHBrdF9wdHIpKVs3XSArIFwKKwkJCSgodXNob3J0ICopKHBrdF9wdHIpKVs4XSArICgodXNob3J0ICopKHBrdF9wdHIpKVs5XSApCisKKy8qCisqKiBUaGlzIGhhcHB5IGxpdHRsZSBtYWNybyBjb3BpZXMgU0laRSBieXRlcyBvZiBkYXRhIGZyb20gRlJPTSB0byBUTworKiogcXVpdGUgd2VsbC4gU0laRSBtdXN0IGJlIGEgY29uc3RhbnQuCisqLworI2RlZmluZSBDQ09QWSggRlJPTSwgVE8sIFNJWkUgKSB7ICooc3RydWN0IHMgeyBjaGFyIGRhdGFbU0laRV07IH0gKikoVE8pID0gKihzdHJ1Y3QgcyAqKShGUk9NKTsgfQorCisvKgorKiogaW5jcmVtZW50IGEgYnVmZmVyIHBvaW50ZXIgbW9kdWxvIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuLi4KKyovCisjZGVmaW5lCUJVTVAoIFAsIEkgKQkoKFApID0gKCgoUCkrKEkpKSAmIFJJT0J1ZmZlck1hc2spKQorCisjZGVmaW5lIElOSVRfUEFDS0VUKCBQSywgUFAgKSBcCit7IFwKKwkqKCh1aW50ICopUEspICAgID0gUFAtPlBhY2tldEluZm87IFwKK30KKworI2RlZmluZQlSSU9fTElOS19FTkFCTEUJMHg4MEZGIC8qIEZGIGlzIGEgaGFjaywgbWFpbmx5IGZvciBNaXBzLCB0byAgICAgICAgKi8KKwkJCSAgICAgICAvKiBwcmV2ZW50IGEgcmVhbGx5IHN0dXBpZCByYWNlIGNvbmRpdGlvbi4gICovCisKKyNkZWZpbmUJTk9UX0lOSVRJQUxJU0VECTAKKyNkZWZpbmUJSU5JVElBTElTRUQJMQorCisjZGVmaW5lCU5PVF9QT0xMSU5HCTAKKyNkZWZpbmUJUE9MTElORwkJMQorCisjZGVmaW5lCU5PVF9DSEFOR0VECTAKKyNkZWZpbmUJQ0hBTkdFRAkJMQorCisjZGVmaW5lCU5PVF9JTlVTRQkwCisKKyNkZWZpbmUJRElTQ09OTkVDVAkwCisjZGVmaW5lCUNPTk5FQ1QJCTEKKworCisvKgorKiogTWFjaGluZSB0eXBlcyAtIHRoZXNlIG11c3QgTk9UIG92ZXJsYXAgd2l0aCBwcm9kdWN0IGNvZGVzIDAtMTUKKyovCisjZGVmaW5lCVJJT19NSVBTX1IzMjMwCTMxCisjZGVmaW5lCVJJT19NSVBTX1I0MDMwCTMyCisKKyNkZWZpbmUJUklPX0lPX1VOS05PV04JLTIKKworI3VuZGVmCU1PREVSTgorI2RlZmluZQlFUlJPUiggRSApCWRvIHsgdS51X2Vycm9yID0gRTsgcmV0dXJuIE9QRU5GQUlMIH0gd2hpbGUgKCAwICkKKworLyogRGVmaW5lcyBmb3IgTVBYIGxpbmUgZGlzY2lwbGluZSByb3V0aW5lcyAqLworCisjZGVmaW5lIERJU1RfTElORVNXX09QRU4JMHgwMQorI2RlZmluZSBESVNUX0xJTkVTV19DTE9TRQkweDAyCisjZGVmaW5lIERJU1RfTElORVNXX1JFQUQJMHgwNAorI2RlZmluZSBESVNUX0xJTkVTV19XUklURQkweDA4CisjZGVmaW5lIERJU1RfTElORVNXX0lPQ1RMCTB4MTAKKyNkZWZpbmUgRElTVF9MSU5FU1dfSU5QVVQJMHgyMAorI2RlZmluZSBESVNUX0xJTkVTV19PVVRQVVQJMHg0MAorI2RlZmluZSBESVNUX0xJTkVTV19NRE1JTlQJMHg4MAorCisjZW5kaWYgLyogX19yaW9faF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFhZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguYwpAQCAtMCwwICsxLDEzODAgQEAKKworLyogcmlvX2xpbnV4LmMgLS0gTGludXggZHJpdmVyIGZvciB0aGUgU3BlY2lhbGl4IFJJTyBzZXJpZXMgY2FyZHMuIAorICoKKyAqCisgKiAgIChDKSAxOTk5IFIuRS5Xb2xmZkBCaXRXaXphcmQubmwKKyAqCisgKiBTcGVjaWFsaXggcGF5cyBmb3IgdGhlIGRldmVsb3BtZW50IGFuZCBzdXBwb3J0IG9mIHRoaXMgZHJpdmVyLgorICogUGxlYXNlIERPIGNvbnRhY3Qgc3VwcG9ydEBzcGVjaWFsaXguY28udWsgaWYgeW91IHJlcXVpcmUKKyAqIHN1cHBvcnQuIEJ1dCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiAocmlvLnR4dCkgZmlyc3QuCisgKgorICoKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiAgICAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogICAgICBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgICBVU0EuCisgKgorICogUmV2aXNpb24gaGlzdG9yeToKKyAqICRMb2c6IHJpby5jLHYgJAorICogUmV2aXNpb24gMS4xICAxOTk5LzA3LzExIDEwOjEzOjU0ICB3b2xmZgorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gCisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKKyMgIGVycm9yIEZJWE1FOiB0aGlzIGRyaXZlciBvbmx5IHdvcmtzIG9uIDMyLWJpdCBwbGF0Zm9ybXMKKyNlbmRpZgorCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKyNpbmNsdWRlICJwYXJhbS5oIgorI2luY2x1ZGUgImxpc3QuaCIKKyNpbmNsdWRlICJzYW0uaCIKKyNpbmNsdWRlICJwcm90c3RzLmgiCisjaW5jbHVkZSAicmlvYm9hcmQuaCIKKworCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisKKy8qIEkgZG9uJ3QgdGhpbmsgdGhhdCB0aGlzIGRyaXZlciBjYW4gaGFuZGxlIG1vcmUgdGhhbiA1MTIgcG9ydHMgb24KK29uZSBtYWNoaW5lLiAgU3BlY2lhbGl4IHNwZWNpZmllcyBtYXggNCBib2FyZHMgaW4gb25lIG1hY2hpbmUuIEkgZG9uJ3QKK2tub3cgd2h5LiBJZiB5b3Ugd2FudCB0byB0cnkgYW55d2F5IHlvdSdsbCBoYXZlIHRvIGluY3JlYXNlIHRoZSBudW1iZXIKK29mIGJvYXJkcyBpbiByaW8uaC4gIFlvdSdsbCBoYXZlIHRvIGFsbG9jYXRlIG1vcmUgbWFqb3JzIGlmIHlvdSBuZWVkCittb3JlIHRoYW4gNTEyIHBvcnRzLi4uLiAqLworCisjaWZuZGVmIFJJT19OT1JNQUxfTUFKT1IwCisvKiBUaGlzIGFsbG93cyBvdmVycmlkaW5nIG9uIHRoZSBjb21waWxlciBjb21tYW5kbGluZSwgb3IgaW4gYSAibWFqb3IuaCIgCisgICBpbmNsdWRlIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgKi8KKyNkZWZpbmUgUklPX05PUk1BTF9NQUpPUjAgIDE1NAorI2RlZmluZSBSSU9fTk9STUFMX01BSk9SMSAgMTU2CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9TWF9YSU9fSU84CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzggMHgyMDAwCisjZW5kaWYKKworI2lmbmRlZiBSSU9fV0lORE9XX0xFTiAKKyNkZWZpbmUgUklPX1dJTkRPV19MRU4gMHgxMDAwMAorI2VuZGlmCisKKworLyogQ29uZmlndXJhYmxlIG9wdGlvbnM6IAorICAgKERvbid0IGJlIHRvbyBzdXJlIHRoYXQgaXQnbGwgd29yayBpZiB5b3UgdG9nZ2xlIHRoZW0pICovCisKKy8qIEFtIEkgcGFyYW5vaWQgb3Igbm90ID8gOy0pICovCisjdW5kZWYgUklPX1BBUkFOT0lBX0NIRUNLCisKKworLyogMjAgLT4gMjAwMCBwZXIgc2Vjb25kLiBUaGUgY2FyZCBzaG91bGQgcmF0ZS1saW1pdCBpbnRlcnJ1cHRzIGF0IDEwMDAKKyAgIEh6LCBidXQgaXQgaXMgdXNlciBjb25maWd1cmFibGUuIEkgZG9uJ3QgcmVjb21tZW5kIGdvaW5nIGFib3ZlIDEwMDAKKyAgIEh6LiBUaGUgaW50ZXJydXB0IHJhdGVsaW1pdCBtaWdodCB0cmlnZ2VyIGlmIHRoZSBpbnRlcnJ1cHQgaXMKKyAgIHNoYXJlZCB3aXRoIGEgdmVyeSBhY3RpdmUgb3RoZXIgZGV2aWNlLiAKKyAgIHVuZGVmIHRoaXMgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGUgY2hlY2suLi4uCisqLworI2RlZmluZSBJUlFfUkFURV9MSU1JVCAyMDAKKworI2lmIDAKKy8qIE5vdCBpbXBsZW1lbnRlZCAqLworLyogCisgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIG1vc3RseSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gQnV0IGlmIHlvdSBuZWVkCisgKiBzb21lIG5pY2UgcmVwb3J0aW5nIGluIHlvdXIgc3lzbG9nLCB5b3UgY2FuIGRlZmluZSB0aGVtIGFsc28uCisgKi8KKyNkZWZpbmUgUklPX1JFUE9SVF9GSUZPCisjZGVmaW5lIFJJT19SRVBPUlRfT1ZFUlJVTgorI2VuZGlmIAorCisKKy8qIFRoZXNlIGNvbnN0YW50cyBhcmUgZGVyaXZlZCBmcm9tIFNDTyBTb3VyY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgQ29uZgorUklPQ29uZiA9Cit7CisgIC8qIGxvY2F0b3IgKi8gICAgICAgICAiUklPIENvbmZpZyBoZXJlIiwKKyAgLyogc3RhcnR1cHRpbWUgKi8gICAgIEhaKjIsICAgICAgICAgICAvKiBob3cgbG9uZyB0byB3YWl0IGZvciBjYXJkIHRvIHJ1biAqLworICAvKiBzbG93Y29vayAqLyAgICAgICAgMCwgICAgICAgICAgICAgIC8qIFRSVUUgLT4gYWx3YXlzIHVzZSBsaW5lIGRpc2MuICovCisgIC8qIGludHJwb2xsdGltZSAqLyAgICAxLCAgICAgICAgICAgICAgLyogVGhlIGZyZXF1ZW5jeSBvZiBPVVIgcG9sbHMgKi8KKyAgLyogYnJlYWtpbnRlcnZhbCAqLyAgIDI1LCAgICAgICAgICAgICAvKiB4MTAgbVMgWFhYOiB1bml0cyBzZWVtIHRvIGJlIDFtcyBub3QgMTAhIC0tIFJFVyovCisgIC8qIHRpbWVyICovICAgICAgICAgICAxMCwgICAgICAgICAgICAgLyogbVMgKi8KKyAgLyogUnRhTG9hZEJhc2UgKi8gICAgIDB4NzAwMCwKKyAgLyogSG9zdExvYWRCYXNlICovICAgIDB4N0MwMCwKKyAgLyogWHBIeiAqLyAgICAgICAgICAgIDUsICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgWHByaW50IGhpdHMgcGVyIHNlY29uZCAqLworICAvKiBYcENwcyAqLyAgICAgICAgICAgMTIwLCAgICAgICAgICAgIC8qIFhwcmludCBjaGFyYWN0ZXJzIHBlciBzZWNvbmQgKi8KKyAgLyogWHBPbiAqLyAgICAgICAgICAgICJcMDMzZCMiLCAgICAgICAvKiBzdGFydCBYcHJpbnQgZm9yIGEgd3lzZSA2MCAqLworICAvKiBYcE9mZiAqLyAgICAgICAgICAgIlwwMjQiLCAgICAgICAgIC8qIGVuZCBYcHJpbnQgZm9yIGEgd3lzZSA2MCAqLworICAvKiBNYXhYcENwcyAqLyAgICAgICAgMjAwMCwgICAgICAgICAgIC8qIGhpZ2hlc3QgWHByaW50IHNwZWVkICovCisgIC8qIE1pblhwQ3BzICovICAgICAgICAxMCwgICAgICAgICAgICAgLyogc2xvd2VzdCBYcHJpbnQgc3BlZWQgKi8KKyAgLyogU3BpbkNtZHMgKi8gICAgICAgIDEsICAgICAgICAgICAgICAvKiBub24temVybyBmb3IgbWVnYSBmYXN0IGJvb3RzICovCisgIC8qIEZpcnN0IEFkZHIgKi8gICAgICAweDBBMDAwMCwgICAgICAgLyogRmlyc3QgYWRkcmVzcyB0byBsb29rIGF0ICovCisgIC8qIExhc3QgQWRkciAqLyAgICAgICAweEZGMDAwMCwgICAgICAgLyogTGFzdCBhZGRyZXNzIGxvb2tlZCBhdCAqLworICAvKiBCdWZmZXJTaXplICovICAgICAgMTAyNCwgICAgICAgICAgIC8qIEJ5dGVzIHBlciBwb3J0IG9mIGJ1ZmZlcmluZyAqLworICAvKiBMb3dXYXRlciAqLyAgICAgICAgMjU2LCAgICAgICAgICAgIC8qIGhvdyBtdWNoIGRhdGEgbGVmdCBiZWZvcmUgd2FrZXVwICovCisgIC8qIExpbmVMZW5ndGggKi8gICAgICA4MCwgICAgICAgICAgICAgLyogaG93IHdpZGUgaXMgdGhlIGNvbnNvbGU/ICovCisgIC8qIENtZFRpbWVvdXQgKi8gICAgICBIWiwgICAgICAgICAgICAgLyogaG93IGxvbmcgYSBjbG9zZSBjb21tYW5kIG1heSB0YWtlICovCit9OworCisKKworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkIHJpb19kaXNhYmxlX3R4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpOyAKK3N0YXRpYyB2b2lkIHJpb19lbmFibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAorc3RhdGljIHZvaWQgcmlvX2Rpc2FibGVfcnhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAorc3RhdGljIHZvaWQgcmlvX2VuYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKTsgCitzdGF0aWMgaW50ICByaW9fZ2V0X0NEICh2b2lkICogcHRyKTsgCitzdGF0aWMgdm9pZCByaW9fc2h1dGRvd25fcG9ydCAodm9pZCAqIHB0cik7CitzdGF0aWMgaW50ICByaW9fc2V0X3JlYWxfdGVybWlvcyAodm9pZCAgKnB0cik7CitzdGF0aWMgdm9pZCByaW9faHVuZ3VwICh2b2lkICAqcHRyKTsKK3N0YXRpYyB2b2lkIHJpb19jbG9zZSAodm9pZCAgKnB0cik7CitzdGF0aWMgaW50IHJpb19jaGFyc19pbl9idWZmZXIgKHZvaWQgKiBwdHIpOworc3RhdGljIGludCByaW9fZndfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IHJpb19pbml0X2RyaXZlcnModm9pZCk7CisKK3N0YXRpYyB2b2lkIG15X2hkICh2b2lkICphZGRyLCBpbnQgbGVuKTsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpyaW9fZHJpdmVyLCAqcmlvX2RyaXZlcjI7CisKKy8qIFRoZSBuYW1lICJwIiBpcyBhIGJpdCBub24tZGVzY3JpcHQuIEJ1dCB0aGF0J3Mgd2hhdCB0aGUgcmlvLWx5bnhvcworc291cmNlcyB1c2UgYWxsIG92ZXIgdGhlIHBsYWNlLiAqLworc3RydWN0IHJpb19pbmZvICpwOworCitpbnQgcmlvX2RlYnVnOworCisKKy8qIFlvdSBjYW4gaGF2ZSB0aGUgZHJpdmVyIHBvbGwgeW91ciBjYXJkLiAKKyAgICAtIFNldCByaW9fcG9sbCB0byAxIHRvIHBvbGwgZXZlcnkgdGltZXIgdGljayAoMTBtcyBvbiBJbnRlbCkuIAorICAgICAgVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGNhcmQgY2Fubm90IHVzZSBhbiBpbnRlcnJ1cHQgZm9yIHNvbWUgcmVhc29uLgorKi8KK3N0YXRpYyBpbnQgcmlvX3BvbGwgPSAxOworCisKKy8qIFRoZXNlIGFyZSB0aGUgb25seSBvcGVuIHNwYWNlcyBpbiBteSBjb21wdXRlci4gWW91cnMgbWF5IGhhdmUgbW9yZQorICAgb3IgbGVzcy4uLi4gKi8KK3N0YXRpYyBpbnQgcmlvX3Byb2JlX2FkZHJzW109IHsweGMwMDAwLCAweGQwMDAwLCAweGUwMDAwfTsKKworI2RlZmluZSBOUl9SSU9fQUREUlMgKHNpemVvZihyaW9fcHJvYmVfYWRkcnMpL3NpemVvZiAoaW50KSkKKworCisvKiBTZXQgdGhlIG1hc2sgdG8gYWxsLW9uZXMuIFRoaXMgYWxhcywgb25seSBzdXBwb3J0cyAzMiBpbnRlcnJ1cHRzLiAKKyAgIFNvbWUgYXJjaGl0ZWN0dXJlcyBtYXkgbmVlZCBtb3JlLiAtLSBDaGFuZ2VkIHRvIExPTkcgdG8KKyAgIHN1cHBvcnQgdXAgdG8gNjQgYml0cyBvbiA2NGJpdCBhcmNoaXRlY3R1cmVzLiAtLSBSRVcgMjAvMDYvOTkgKi8KK2xvbmcgcmlvX2lycW1hc2sgPSAtMTsKKworTU9EVUxFX0FVVEhPUigiUm9naWVyIFdvbGZmIDxSLkUuV29sZmZAYml0d2l6YXJkLm5sPiwgUGF0cmljayB2YW4gZGUgTGFnZXdlZyA8cGF0cmlja0BiaXR3aXphcmQubmw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShyaW9fcG9sbCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyaW9fZGVidWcsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0ocmlvX2lycW1hc2ssIGxvbmcsIDApOworCitzdGF0aWMgc3RydWN0IHJlYWxfZHJpdmVyIHJpb19yZWFsX2RyaXZlciA9IHsKKyAgcmlvX2Rpc2FibGVfdHhfaW50ZXJydXB0cywKKyAgcmlvX2VuYWJsZV90eF9pbnRlcnJ1cHRzLAorICByaW9fZGlzYWJsZV9yeF9pbnRlcnJ1cHRzLAorICByaW9fZW5hYmxlX3J4X2ludGVycnVwdHMsCisgIHJpb19nZXRfQ0QsCisgIHJpb19zaHV0ZG93bl9wb3J0LCAKKyAgcmlvX3NldF9yZWFsX3Rlcm1pb3MsIAorICByaW9fY2hhcnNfaW5fYnVmZmVyLAorICByaW9fY2xvc2UsCisgIHJpb19odW5ndXAsCisgIE5VTEwKK307CisKKy8qIAorICogIEZpcm13YXJlIGxvYWRlciBkcml2ZXIgc3BlY2lmaWMgcm91dGluZXMKKyAqCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmlvX2Z3X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSByaW9fZndfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgcmlvX2Z3X2RldmljZSA9IHsKKwlSSU9DVExfTUlTQ19NSU5PUiwgInJpb2N0bCIsICZyaW9fZndfZm9wcworfTsKKworCisKKworCisjaWZkZWYgUklPX1BBUkFOT0lBX0NIRUNLCisKKy8qIFRoaXMgZG9lc24ndCB3b3JrLiBXaG8ncyBwYXJhbm9pZCBhcm91bmQgaGVyZT8gTm90IG1lISAqLworCitzdGF0aWMgaW5saW5lIGludCByaW9fcGFyYW5vaWFfY2hlY2soc3RydWN0IHJpb19wb3J0IGNvbnN0ICogcG9ydCwKKwkJCQkgICAgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKK3sKKworICBzdGF0aWMgY29uc3QgY2hhciAqYmFkbWFnaWMgPQorICAgIEtFUk5fRVJSICJyaW86IFdhcm5pbmc6IGJhZCByaW8gcG9ydCBtYWdpYyBudW1iZXIgZm9yIGRldmljZSAlcyBpbiAlc1xuIjsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQorICAgIEtFUk5fRVJSICJyaW86IFdhcm5pbmc6IG51bGwgcmlvIHBvcnQgZm9yIGRldmljZSAlcyBpbiAlc1xuIjsKKyAKKyAgaWYgKCFwb3J0KSB7CisgICAgcHJpbnRrIChiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAocG9ydC0+bWFnaWMgIT0gUklPX01BR0lDKSB7CisgICAgcHJpbnRrIChiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHJpb19wYXJhbm9pYV9jaGVjayhhLGIsYykgMAorI2VuZGlmCisKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBteV9oZCAodm9pZCAqYWQsIGludCBsZW4pCit7CisgIGludCBpLCBqLCBjaDsKKyAgdW5zaWduZWQgY2hhciAqYWRkciA9IGFkOworICAKKyAgZm9yIChpPTA7aTxsZW47aSs9MTYpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiJTA4eCAiLCAoaW50KSBhZGRyK2kpOworICAgIGZvciAoaj0wO2o8MTY7aisrKSB7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiJTAyeCAlcyIsIGFkZHJbaitpXSwgKGo9PTcpPyIgIjoiIik7CisgICAgfQorICAgIGZvciAoaj0wO2o8MTY7aisrKSB7CisgICAgICBjaCA9IGFkZHJbaitpXTsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICIlYyIsIChjaCA8IDB4MjApPycuJzooKGNoID4gMHg3Zik/Jy4nOmNoKSk7CisgICAgfQorICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJcbiIpOworICB9Cit9CisjZWxzZQorI2RlZmluZSBteV9oZChhZCxsZW4pIGRvey8qIG5vdGhpbmcqLyB9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyogRGVsYXkgYSBudW1iZXIgb2YgamlmZmllcywgYWxsb3dpbmcgYSBzaWduYWwgdG8gaW50ZXJydXB0ICovIAoraW50IFJJT0RlbGF5IChzdHJ1Y3QgUG9ydCAqUG9ydFAsIGludCBuamlmZmllcykKK3sKKyAgZnVuY19lbnRlciAoKTsKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0RFTEFZLCAiZGVsYXlpbmcgJWQgamlmZmllc1xuIiwgbmppZmZpZXMpOyAgCisgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MobmppZmZpZXMpKTsKKyAgZnVuY19leGl0KCk7CisKKyAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgIHJldHVybiBSSU9fRkFJTDsKKyAgZWxzZQorICAgIHJldHVybiAhUklPX0ZBSUw7Cit9CisKKworLyogRGVsYXkgYSBudW1iZXIgb2YgamlmZmllcywgZGlzYWxsb3dpbmcgYSBzaWduYWwgdG8gaW50ZXJydXB0ICovIAoraW50IFJJT0RlbGF5X25pIChzdHJ1Y3QgUG9ydCAqUG9ydFAsIGludCBuamlmZmllcykKK3sKKyAgZnVuY19lbnRlciAoKTsKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0RFTEFZLCAiZGVsYXlpbmcgJWQgamlmZmllcyAobmkpXG4iLCBuamlmZmllcyk7ICAKKyAgbXNsZWVwKGppZmZpZXNfdG9fbXNlY3MobmppZmZpZXMpKTsKKyAgZnVuY19leGl0KCk7CisgIHJldHVybiAhUklPX0ZBSUw7Cit9CisKKworaW50IHJpb19taW5vcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiB0dHktPmluZGV4ICsgKHR0eS0+ZHJpdmVyID09IHJpb19kcml2ZXIpID8gMCA6IDI1NjsKK30KKworCitpbnQgcmlvX2lzbW9kZW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gMTsKK30KKworCit2b2lkIHJpb191ZGVsYXkgKGludCB1c2VjcykKK3sKKyAgdWRlbGF5ICh1c2Vjcyk7Cit9CisKK3N0YXRpYyBpbnQgcmlvX3NldF9yZWFsX3Rlcm1pb3MgKHZvaWQgKnB0cikKK3sKKyAgaW50IHJ2LCBtb2RlbTsKKyAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKyAgZnVuY19lbnRlcigpOworCisgIHR0eSA9ICgoc3RydWN0IFBvcnQgKilwdHIpLT5ncy50dHk7CisKKyAgbW9kZW0gPSByaW9faXNtb2RlbSh0dHkpOworCisgIHJ2ID0gUklPUGFyYW0oIChzdHJ1Y3QgUG9ydCAqKSBwdHIsIENPTkZJRywgbW9kZW0sIDEpOworCisgIGZ1bmNfZXhpdCAoKTsKKworICByZXR1cm4gcnY7Cit9CisKKworc3RhdGljIHZvaWQgcmlvX3Jlc2V0X2ludGVycnVwdCAoc3RydWN0IEhvc3QgKkhvc3RQKQoreworICBmdW5jX2VudGVyKCk7CisKKyAgc3dpdGNoKCBIb3N0UC0+VHlwZSApIHsKKyAgY2FzZSBSSU9fQVQ6CisgIGNhc2UgUklPX01DQToKKyAgY2FzZSBSSU9fUENJOgorICAgIFdCWVRFKEhvc3RQLT5SZXNldEludCAsIDB4ZmYpOworICB9CisKKyAgZnVuY19leGl0KCk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHJpb19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKnB0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHN0cnVjdCBIb3N0ICpIb3N0UDsKKyAgZnVuY19lbnRlciAoKTsKKworICBIb3N0UCA9IChzdHJ1Y3QgSG9zdCopcHRyOyAvKiAmcC0+UklPSG9zdHNbKGxvbmcpcHRyXTsgKi8KKyAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JRkxPVywgInJpbzogZW50ZXIgcmlvX2ludGVycnVwdCAoJWQvJWQpXG4iLCAKKyAgICAgICAgICAgICAgIGlycSwgSG9zdFAtPkl2ZWMpOyAKKworICAvKiBBQWFyZ2ghIFRoZSBvcmRlciBpbiB3aGljaCB0byBkbyB0aGVzZSB0aGluZ3MgaXMgZXNzZW50aWFsIGFuZAorICAgICBub3QgdHJpdmlhbC4gCisgICAgIAorICAgICAtIFJhdGUgbGltaXQgZ29lcyBiZWZvcmUgInJlY3Vyc2l2ZSIuIE90aGVyd2lzZSBhIHNlcmllcyBvZgorICAgICAgIHJlY3Vyc2l2ZSBjYWxscyB3aWxsIGhhbmcgdGhlIG1hY2hpbmUgaW4gdGhlIGludGVycnVwdCByb3V0aW5lLiAKKworICAgICAtIGhhcmR3YXJlIHR3aWRkbGluZyBnb2VzIGJlZm9yZSAicmVjdXJzaXZlIi4gT3RoZXJ3aXNlIHdoZW4gd2UKKyAgICAgICBwb2xsIHRoZSBjYXJkLCBhbmQgYSByZWN1cnNpdmUgaW50ZXJydXB0IGhhcHBlbnMsIHdlIHdvbid0CisgICAgICAgYWNrIHRoZSBjYXJkLCBzbyBpdCBtaWdodCBrZWVwIG9uIGludGVycnVwdGluZyB1cy4gKGVzcGVjaWFsbHkKKyAgICAgICBsZXZlbCBzZW5zaXRpdmUgaW50ZXJydXB0IHN5c3RlbXMgbGlrZSBQQ0kpLgorCisgICAgIC0gUmF0ZSBsaW1pdCBnb2VzIGJlZm9yZSBoYXJkd2FyZSB0d2lkZGxpbmcuIE90aGVyd2lzZSB3ZSB3b24ndAorICAgICAgIGNhdGNoIGEgY2FyZCB0aGF0IGhhcyBnb25lIGJvbmtlcnMuCisKKyAgICAgLSBUaGUgImluaXRpYWxpemVkIiB0ZXN0IGdvZXMgYWZ0ZXIgdGhlIGhhcmR3YXJlIHR3aWRkbGluZy4gT3RoZXJ3aXNlCisgICAgICAgdGhlIGNhcmQgd2lsbCBzdGljayB1cyBpbiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgYWdhaW4uCisKKyAgICAgLSBUaGUgaW5pdGlhbGl6ZWQgdGVzdCBnb2VzIGJlZm9yZSByZWN1cnNpdmUuIAorICAqLworCisKKworI2lmZGVmIElSUV9SQVRFX0xJTUlUCisgIC8qIEFhYXJnaCEgSSdtIGFzaGFtZWQuIFRoaXMgY29zdHMgbW9yZSBsaW5lcy1vZi1jb2RlIHRoYW4gdGhlCisgICAgIGFjdHVhbCBpbnRlcnJ1cHQgcm91dGluZSEuIChXZWxsLCB1c2VkIHRvIHdoZW4gSSB3cm90ZSB0aGF0IGNvbW1lbnQpICovCisgIHsKKyAgICBzdGF0aWMgaW50IGxhc3RqaWY7CisgICAgc3RhdGljIGludCBuaW50cj0wOworCisgICAgaWYgKGxhc3RqaWYgPT0gamlmZmllcykgeworICAgICAgaWYgKCsrbmludHIgPiBJUlFfUkFURV9MSU1JVCkgeworICAgICAgICBmcmVlX2lycSAoSG9zdFAtPkl2ZWMsIHB0cik7CisgICAgICAgIHByaW50ayAoS0VSTl9FUlIgInJpbzogVG9vIG1hbnkgaW50ZXJydXB0cy4gVHVybmluZyBvZmYgaW50ZXJydXB0ICVkLlxuIiwgCisgICAgICAgICAgICAgICAgSG9zdFAtPkl2ZWMpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBsYXN0amlmID0gamlmZmllczsKKyAgICAgIG5pbnRyID0gMDsKKyAgICB9CisgIH0KKyNlbmRpZgorICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lGTE9XLCAicmlvOiBXZSd2ZSBoYXZlIG5vdGljZWQgdGhlIGludGVycnVwdFxuIik7IAorICBpZiAoSG9zdFAtPkl2ZWMgPT0gaXJxKSB7CisgICAgLyogVGVsbCB0aGUgY2FyZCB3ZSd2ZSBub3RpY2VkIHRoZSBpbnRlcnJ1cHQuICovCisgICAgcmlvX3Jlc2V0X2ludGVycnVwdCAoSG9zdFApOworICB9CisKKyAgaWYgKChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcpCisgIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKyAgaWYgKHRlc3RfYW5kX3NldF9iaXQgKFJJT19CT0FSRF9JTlRSX0xPQ0ssICZIb3N0UC0+bG9ja3MpKSB7CisgICAgcHJpbnRrIChLRVJOX0VSUiAiUmVjdXJzaXZlIGludGVycnVwdCEgKGhvc3QgJWQvaXJxJWQpXG4iLCAKKyAgICAgICAgICAgIChpbnQpIHB0ciwgSG9zdFAtPkl2ZWMpOworICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgfQorCisgIFJJT1NlcnZpY2VIb3N0KHAsIEhvc3RQLCBpcnEpOworCisgIHJpb19kcHJpbnRrICggUklPX0RFQlVHX0lGTE9XLCAicmlvaW50cigpIGRvaW5nIGhvc3QgJWQgdHlwZSAlZFxuIiwgCisgICAgICAgICAgICAgICAgKGludCkgcHRyLCBIb3N0UC0+VHlwZSk7CisKKyAgY2xlYXJfYml0IChSSU9fQk9BUkRfSU5UUl9MT0NLLCAmSG9zdFAtPmxvY2tzKTsKKyAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JRkxPVywgInJpbzogZXhpdCByaW9faW50ZXJydXB0ICglZC8lZClcbiIsIAorICAgICAgICAgICAgICAgaXJxLCBIb3N0UC0+SXZlYyk7IAorICBmdW5jX2V4aXQgKCk7CisgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgdm9pZCByaW9fcG9sbGZ1bmMgKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKyAgZnVuY19lbnRlciAoKTsKKworICByaW9faW50ZXJydXB0ICgwLCAmcC0+UklPSG9zdHNbZGF0YV0sIE5VTEwpOworICBwLT5SSU9Ib3N0c1tkYXRhXS50aW1lci5leHBpcmVzID0gamlmZmllcyArIHJpb19wb2xsOworICBhZGRfdGltZXIgKCZwLT5SSU9Ib3N0c1tkYXRhXS50aW1lcik7CisKKyAgZnVuY19leGl0ICgpOworfQorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorICogICAgICAgICAgICAgICAgSGVyZSBhcmUgdGhlIHJvdXRpbmVzIHRoYXQgYWN0dWFsbHkgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgaW50ZXJmYWNlIHdpdGggdGhlIGdlbmVyaWNfc2VyaWFsIGRyaXZlciAgICAgICAgICAgICAgICAgICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogRWhobS4gSSBkb24ndCBrbm93IGhvdyB0byBmaWRkbGUgd2l0aCBpbnRlcnJ1cHRzIG9uIHRoZSBTcGVjaWFsaXggCisgICBjYXJkcy4gLi4uLiAgIEhtbS4gT2sgSSBmaWd1cmVkIGl0IG91dC4gWW91IGRvbid0LiAgLS0gUkVXICovCisKK3N0YXRpYyB2b2lkIHJpb19kaXNhYmxlX3R4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworICBmdW5jX2VudGVyKCk7CisKKyAgLyogIHBvcnQtPmdzLmZsYWdzICY9IH5HU19UWF9JTlRFTjsgKi8KKworICBmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgdm9pZCByaW9fZW5hYmxlX3R4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAoreworICBzdHJ1Y3QgUG9ydCAqUG9ydFAgPSBwdHI7CisgIC8qIGludCBobjsgKi8KKworICBmdW5jX2VudGVyKCk7CisKKyAgLyogaG4gPSBQb3J0UC0+SG9zdFAgLSBwLT5SSU9Ib3N0czsKKworICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlB1c2hpbmcgaG9zdCAlZFxuIiwgaG4pOworICAgICByaW9faW50ZXJydXB0ICgtMSwodm9pZCAqKSBobiwgTlVMTCk7ICovCisKKyAgUklPVHhFbmFibGUoKGNoYXIgKikgUG9ydFApOworCisgIC8qIAorICAgKiBJbiBnZW5lcmFsIHdlIGNhbm5vdCBjb3VudCBvbiAidHggZW1wdHkiIGludGVycnVwdHMsIGFsdGhvdWdoCisgICAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBzZWVtcyB0byBiZSBhYmxlIHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UuIAorICAgKi8KKyAgUG9ydFAtPmdzLmZsYWdzICY9IH5HU19UWF9JTlRFTjsKKworICBmdW5jX2V4aXQoKTsKK30KKworCitzdGF0aWMgdm9pZCByaW9fZGlzYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKSAKK3sKKyAgZnVuY19lbnRlcigpOworICBmdW5jX2V4aXQoKTsKK30KKworc3RhdGljIHZvaWQgcmlvX2VuYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKSAKK3sKKyAgLyogIHN0cnVjdCByaW9fcG9ydCAqcG9ydCA9IHB0cjsgKi8KKyAgZnVuY19lbnRlcigpOworICBmdW5jX2V4aXQoKTsKK30KKworCisvKiBKZWV6LiBJc24ndCB0aGlzIHNpbXBsZT8gICovCitzdGF0aWMgaW50IHJpb19nZXRfQ0QgKHZvaWQgKiBwdHIpIAoreworICBzdHJ1Y3QgUG9ydCAqUG9ydFAgPSBwdHI7CisgIGludCBydjsKKworICBmdW5jX2VudGVyKCk7CisgIHJ2ID0gKFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfQ0QpICE9IDA7CisKKyAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiR2V0dGluZyBDRCBzdGF0dXM6ICVkXG4iLCBydik7CisgIAorICBmdW5jX2V4aXQoKTsgIAorICByZXR1cm4gcnY7Cit9CisKKworLyogSmVlei4gSXNuJ3QgdGhpcyBzaW1wbGU/IEFjdHVhbGx5LCB3ZSBjYW4gc3luYyB3aXRoIHRoZSBhY3R1YWwgcG9ydAorICAgYnkganVzdCBwdXNoaW5nIHN0dWZmIGludG8gdGhlIHF1ZXVlIGdvaW5nIHRvIHRoZSBwb3J0Li4uICovCitzdGF0aWMgaW50IHJpb19jaGFyc19pbl9idWZmZXIgKHZvaWQgKiBwdHIpIAoreworICBmdW5jX2VudGVyKCk7CisKKyAgZnVuY19leGl0KCk7ICAKKyAgcmV0dXJuIDA7Cit9CisKKworLyogTm90aGluZyBzcGVjaWFsIGhlcmUuLi4gKi8KK3N0YXRpYyB2b2lkIHJpb19zaHV0ZG93bl9wb3J0ICh2b2lkICogcHRyKSAKK3sKKyAgc3RydWN0IFBvcnQgKlBvcnRQOworCisgIGZ1bmNfZW50ZXIoKTsKKworICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKXB0cjsKKyAgUG9ydFAtPmdzLnR0eSA9IE5VTEw7CisjaWYgMAorICBwb3J0LT5ncy5mbGFncyAmPSB+IEdTX0FDVElWRTsKKyAgaWYgKCFwb3J0LT5ncy50dHkpIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RCVUdfVFRZLCAiTm8gdHR5LlxuIik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghcG9ydC0+Z3MudHR5LT50ZXJtaW9zKSB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJObyB0ZXJtaW9zLlxuIik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChwb3J0LT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgeworICAgIHJpb19zZXRzaWduYWxzIChwb3J0LCAwLCAwKTsKKyAgfQorI2VuZGlmCisKKyAgZnVuY19leGl0KCk7Cit9CisKKworLyogSSBoYXZlbid0IHRoZSBmb2dnaWVzdCB3aHkgdGhlIGRlY3JlbWVudCB1c2UgY291bnQgaGFzIHRvIGhhcHBlbgorICAgaGVyZS4gVGhlIHdob2xlIGxpbnV4IHNlcmlhbCBkcml2ZXJzIHN0dWZmIG5lZWRzIHRvIGJlIHJlZGVzaWduZWQuCisgICBNeSBndWVzcyBpcyB0aGF0IHRoaXMgaXMgYSBoYWNrIHRvIG1pbmltaXplIHRoZSBpbXBhY3Qgb2YgYSBidWcKKyAgIGVsc2V3aGVyZS4gVGhpbmtpbmcgYWJvdXQgaXQgc29tZSBtb3JlLiAodHJ5IGl0IHNvbWV0aW1lKSBUcnkKKyAgIHJ1bm5pbmcgbWluaWNvbSBvbiBhIHNlcmlhbCBwb3J0IHRoYXQgaXMgZHJpdmVuIGJ5IGEgbW9kdWxhcml6ZWQKKyAgIGRyaXZlci4gSGF2ZSB0aGUgbW9kZW0gaGFuZ3VwLiBUaGVuIHJlbW92ZSB0aGUgZHJpdmVyIG1vZHVsZS4gVGhlbgorICAgZXhpdCBtaW5pY29tLiAgSSBleHBlY3QgYW4gIm9vcHMiLiAgLS0gUkVXICovCitzdGF0aWMgdm9pZCByaW9faHVuZ3VwICh2b2lkICpwdHIpCit7CisgIHN0cnVjdCBQb3J0ICpQb3J0UDsKKworICBmdW5jX2VudGVyKCk7CisgIAorICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKXB0cjsKKyAgUG9ydFAtPmdzLnR0eSA9IE5VTEw7CisKKyAgZnVuY19leGl0ICgpOworfQorCisKKy8qIFRoZSBzdGFuZGFyZCBzZXJpYWxfY2xvc2Ugd291bGQgYmVjb21lIHNob3J0ZXIgaWYgeW91J2Qgd3JhcCBpdCBsaWtlCisgICB0aGlzLiAKKyAgIHJzX2Nsb3NlICguLi4pe3NhdmVfZmxhZ3M7Y2xpO3JlYWxfY2xvc2UoKTtkZWNfdXNlX2NvdW50O3Jlc3RvcmVfZmxhZ3M7fQorICovCitzdGF0aWMgdm9pZCByaW9fY2xvc2UgKHZvaWQgKnB0cikKK3sKKyAgc3RydWN0IFBvcnQgKlBvcnRQOworCisgIGZ1bmNfZW50ZXIgKCk7CisKKyAgUG9ydFAgPSAoc3RydWN0IFBvcnQgKilwdHI7CisKKyAgcmlvdGNsb3NlIChwdHIpOworCisgIGlmKFBvcnRQLT5ncy5jb3VudCkgeworICAgIHByaW50ayAoS0VSTl9FUlIgIldBUk5JTkcgcG9ydCBjb3VudDolZFxuIiwgUG9ydFAtPmdzLmNvdW50KTsKKyAgICBQb3J0UC0+Z3MuY291bnQgPSAwOyAKKyAgfSAgICAgICAgICAgICAgICAKKworICBQb3J0UC0+Z3MudHR5ID0gTlVMTDsKKyAgZnVuY19leGl0ICgpOworfQorCisKKworc3RhdGljIGludCByaW9fZndfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgaW50IHJjID0gMDsKKyAgZnVuY19lbnRlcigpOworCisgIC8qIFRoZSAiZGV2IiBhcmd1bWVudCBpc24ndCB1c2VkLiAqLworICByYyA9IHJpb2NvbnRyb2wgKHAsIDAsIGNtZCwgKHZvaWQgKilhcmcsIGNhcGFibGUoQ0FQX1NZU19BRE1JTikpOworCisgIGZ1bmNfZXhpdCAoKTsKKyAgcmV0dXJuIHJjOworfQorCitleHRlcm4gaW50IFJJT1Nob3J0Q29tbWFuZChzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBQb3J0ICpQb3J0UCwKKyAgICAgICAgICAgICAgIGludCBjb21tYW5kLCBpbnQgbGVuLCBpbnQgYXJnKTsKKworc3RhdGljIGludCByaW9faW9jdGwgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgIGludCByYzsKKyAgc3RydWN0IFBvcnQgKlBvcnRQOworICBpbnQgaXZhbDsKKworICBmdW5jX2VudGVyKCk7CisKKyAgUG9ydFAgPSAoc3RydWN0IFBvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCisgIHJjICA9IDA7CisgIHN3aXRjaCAoY21kKSB7CisjaWYgMAorICBjYXNlIFRJT0NHU09GVENBUjoKKyAgICByYyA9IHB1dF91c2VyKCgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSA/IDEgOiAwKSwKKyAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKKyAgICBicmVhazsKKyNlbmRpZgorICBjYXNlIFRJT0NTU09GVENBUjoKKyAgICBpZiAoKHJjID0gZ2V0X3VzZXIoaXZhbCwgKHVuc2lnbmVkIGludCAqKSBhcmcpKSA9PSAwKSB7CisgICAgICB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorICAgICAgICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAorICAgICAgICAoaXZhbCA/IENMT0NBTCA6IDApOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUSU9DR1NFUklBTDoKKyAgICByYyA9IC1FRkFVTFQ7CisgICAgaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkICopIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkpCisgICAgICByYyA9IGdzX2dldHNlcmlhbCgmUG9ydFAtPmdzLCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKKyAgICBicmVhazsKKyAgY2FzZSBUQ1NCUks6CisgICAgaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQlJFQUsgb24gZGVsZXRlZCBSVEFcbiIpOworICAgICAgcmMgPSAtRUlPOyAgICAgIAorICAgIH0gZWxzZSB7CisgICAgICBpZiAoUklPU2hvcnRDb21tYW5kKHAsIFBvcnRQLCBTQlJFQUssIDIsIDI1MCkgPT0gUklPX0ZBSUwpIHsKKyAgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlNCUkVBSyBSSU9TaG9ydENvbW1hbmQgZmFpbGVkXG4iKTsKKyAgICAgICAgIHJjID0gLUVJTzsKKyAgICAgIH0gICAgICAgICAgCisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRDU0JSS1A6CisgICAgaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQlJFQUsgb24gZGVsZXRlZCBSVEFcbiIpOworICAgICAgcmMgPSAtRUlPOyAgICAgIAorICAgIH0gZWxzZSB7CisgICAgICBpbnQgbDsKKyAgICAgIGwgPSBhcmc/YXJnKjEwMDoyNTA7CisgICAgICBpZiAobCA+IDI1NSkgbCA9IDI1NTsKKyAgICAgIGlmIChSSU9TaG9ydENvbW1hbmQocCwgUG9ydFAsIFNCUkVBSywgMiwgYXJnP2FyZyoxMDA6MjUwKSA9PSBSSU9fRkFJTCkgeworICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiU0JSRUFLIFJJT1Nob3J0Q29tbWFuZCBmYWlsZWRcbiIpOworICAgICAgICAgcmMgPSAtRUlPOworICAgICAgfSAgICAgICAgICAKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVElPQ1NTRVJJQUw6CisgICAgcmMgPSAtRUZBVUxUOworICAgIGlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkICopIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkpCisgICAgICByYyA9IGdzX3NldHNlcmlhbCgmUG9ydFAtPmdzLCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKKyAgICBicmVhazsKKyNpZiAwCisgIC8qCisgICAqIG5vdGU6IHRoZXNlIElPQ1RMcyBubyBsb25nZXIgcmVhY2ggaGVyZS4gIFVzZQorICAgKiB0aW9jbXNldC90aW9jbWdldCBkcml2ZXIgbWV0aG9kcyBpbnN0ZWFkLiAgVGhlCisgICAqICNpZiAwIGRpc2FibGVtZW50IHByZWRhdGVzIHRoaXMgY29tbWVudC4KKyAgICovCisgIGNhc2UgVElPQ01HRVQ6CisgICAgcmMgPSAtRUZBVUxUOworICAgIGlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodm9pZCAqKSBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBpbnQpKSkgeworICAgICAgcmMgPSAwOworICAgICAgaXZhbCA9IHJpb19nZXRzaWduYWxzKHBvcnQpOworICAgICAgcHV0X3VzZXIoaXZhbCwgKHVuc2lnbmVkIGludCAqKSBhcmcpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUSU9DTUJJUzoKKyAgICBpZiAoKHJjID0gZ2V0X3VzZXIoaXZhbCwgKHVuc2lnbmVkIGludCAqKSBhcmcpKSA9PSAwKSB7CisgICAgICByaW9fc2V0c2lnbmFscyhwb3J0LCAoKGl2YWwgJiBUSU9DTV9EVFIpID8gMSA6IC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXZhbCAmIFRJT0NNX1JUUykgPyAxIDogLTEpKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVElPQ01CSUM6CisgICAgaWYgKChyYyA9IGdldF91c2VyKGl2YWwsICh1bnNpZ25lZCBpbnQgKikgYXJnKSkgPT0gMCkgeworICAgICAgcmlvX3NldHNpZ25hbHMocG9ydCwgKChpdmFsICYgVElPQ01fRFRSKSA/IDAgOiAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl2YWwgJiBUSU9DTV9SVFMpID8gMCA6IC0xKSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRJT0NNU0VUOgorICAgIGlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZykpID09IDApIHsKKyAgICAgIHJpb19zZXRzaWduYWxzKHBvcnQsICgoaXZhbCAmIFRJT0NNX0RUUikgPyAxIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl2YWwgJiBUSU9DTV9SVFMpID8gMSA6IDApKTsKKyAgICB9CisgICAgYnJlYWs7CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICByYyA9IC1FTk9JT0NUTENNRDsKKyAgICBicmVhazsKKyAgfQorICBmdW5jX2V4aXQoKTsKKyAgcmV0dXJuIHJjOworfQorCisKKy8qIFRoZSB0aHJvdHRsZS91bnRocm90dGxlIHNjaGVtZSBmb3IgdGhlIFNwZWNpYWxpeCBjYXJkIGlzIGRpZmZlcmVudAorICogZnJvbSBvdGhlciBkcml2ZXJzIGFuZCBkZXNlcnZlcyBzb21lIGV4cGxhbmF0aW9uLiAKKyAqIFRoZSBTcGVjaWFsaXggaGFyZHdhcmUgdGFrZXMgY2FyZSBvZiBYT04vWE9GRgorICogYW5kIENUUy9SVFMgZmxvdyBjb250cm9sIGl0c2VsZi4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgd2UgaGF2ZSB0bworICogZG8gd2hlbiBzaWduYWxsZWQgYnkgdGhlIHVwcGVyIHR0eSBsYXllciB0byB0aHJvdHRsZS91bnRocm90dGxlIGlzCisgKiB0byBtYWtlIGEgbm90ZSBvZiBpdCBoZXJlLiAgV2hlbiB3ZSBjb21lIHRvIHJlYWQgY2hhcmFjdGVycyBmcm9tIHRoZQorICogcnggYnVmZmVycyBvbiB0aGUgY2FyZCAocmlvX3JlY2VpdmVfY2hhcnMoKSkgd2UgbG9vayB0byBzZWUgaWYgdGhlCisgKiB1cHBlciBsYXllciBjYW4gYWNjZXB0IG1vcmUgKGFzIG5vdGVkIGhlcmUgaW4gcmlvX3J4X3Rocm90W10pLiAKKyAqIElmIGl0IGNhbid0IHdlIHNpbXBseSBkb24ndCByZW1vdmUgY2hhcnMgZnJvbSB0aGUgY2FyZHMgYnVmZmVyLiAKKyAqIFdoZW4gdGhlIHR0eSBsYXllciBjYW4gYWNjZXB0IGNoYXJzLCB3ZSBhZ2FpbiBub3RlIHRoYXQgaGVyZSBhbmQgd2hlbgorICogcmlvX3JlY2VpdmVfY2hhcnMoKSBpcyBjYWxsZWQgaXQgd2lsbCByZW1vdmUgdGhlbSBmcm9tIHRoZSBjYXJkcyBidWZmZXIuCisgKiBUaGUgY2FyZCB3aWxsIG5vdGljZSB0aGF0IGEgcG9ydHMgYnVmZmVyIGhhcyBkcmFpbmVkIGJlbG93IHNvbWUgbG93CisgKiB3YXRlciBtYXJrIGFuZCB3aWxsIHVuZmxvdyBjb250cm9sIHRoZSBsaW5lIGl0c2VsZiwgdXNpbmcgd2hhdGV2ZXIKKyAqIGZsb3cgY29udHJvbCBzY2hlbWUgaXMgaW4gdXNlIGZvciB0aGF0IHBvcnQuIC0tIFNpbW9uIEFsbGVuCisgKi8KKworc3RhdGljIHZvaWQgcmlvX3Rocm90dGxlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKyAgc3RydWN0IFBvcnQgKnBvcnQgPSAoc3RydWN0IFBvcnQgKil0dHktPmRyaXZlcl9kYXRhOworICAKKyAgZnVuY19lbnRlcigpOworICAvKiBJZiB0aGUgcG9ydCBpcyB1c2luZyBhbnkgdHlwZSBvZiBpbnB1dCBmbG93CisgICAqIGNvbnRyb2wgdGhlbiB0aHJvdHRsZSB0aGUgcG9ydC4KKyAgICovCisKKyAgaWYoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8IChJX0lYT0ZGKHR0eSkpICkgeworICAgIHBvcnQtPlN0YXRlIHw9IFJJT19USFJPVFRMRV9SWDsKKyAgfQorCisgIGZ1bmNfZXhpdCgpOworfQorCisKK3N0YXRpYyB2b2lkIHJpb191bnRocm90dGxlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKyAgc3RydWN0IFBvcnQgKnBvcnQgPSAoc3RydWN0IFBvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCisgIGZ1bmNfZW50ZXIoKTsKKyAgLyogQWx3YXlzIHVudGhyb3R0bGUgZXZlbiBpZiBmbG93IGNvbnRyb2wgaXMgbm90IGVuYWJsZWQgb24KKyAgICogdGhpcyBwb3J0IGluIGNhc2Ugd2UgZGlzYWJsZWQgZmxvdyBjb250cm9sIHdoaWxlIHRoZSBwb3J0CisgICAqIHdhcyB0aHJvdHRsZWQKKyAgICovCisKKyAgcG9ydC0+U3RhdGUgJj0gflJJT19USFJPVFRMRV9SWDsKKworICBmdW5jX2V4aXQoKTsKKyAgcmV0dXJuOworfQorCisKKworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorICogICAgICAgICAgICAgICAgICAgIEhlcmUgYXJlIHRoZSBpbml0aWFsaXphdGlvbiByb3V0aW5lcy4gICAgICAgICAgICAgICAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworc3RhdGljIHN0cnVjdCB2cGRfcHJvbSAqZ2V0X1ZQRF9QUk9NIChzdHJ1Y3QgSG9zdCAqaHApCit7CisgIHN0YXRpYyBzdHJ1Y3QgdnBkX3Byb20gdnBkcDsKKyAgY2hhciAqcDsKKyAgaW50IGk7CisKKyAgZnVuY19lbnRlcigpOworICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiR29pbmcgdG8gdmVyaWZ5IHZwZCBwcm9tIGF0ICVwLlxuIiwgCisgICAgICAgICAgICAgIGhwLT5DYWRkciArIFJJT19WUERfUk9NKTsKKworICBwID0gKGNoYXIgKikgJnZwZHA7CisgIGZvciAoaT0wO2k8IHNpemVvZiAoc3RydWN0IHZwZF9wcm9tKTtpKyspCisgICAgKnArKyA9IHJlYWRiIChocC0+Q2FkZHIrUklPX1ZQRF9ST00gKyBpKjIpOworICAgICAgLyogcmVhZF9yaW9fYnl0ZSAoaHAsIFJJT19WUERfUk9NICsgaSoyKTsgKi8KKworICAvKiBUZXJtaW5hdGUgdGhlIGlkZW50aWZpZXIgc3RyaW5nLiAKKyAgICAgKioqIHJlcXVpcmVzIG9uZSBleHRyYSBieXRlIGluIHN0cnVjdCB2cGRfcHJvbSAqKiogKi8KKyAgKnArKz0wOyAKKworICBpZiAocmlvX2RlYnVnICYgUklPX0RFQlVHX1BST0JFKQorICAgIG15X2hkICgoY2hhciAqKSZ2cGRwLCAweDIwKTsKKyAgCisgIGZ1bmNfZXhpdCgpOworCisgIHJldHVybiAmdnBkcDsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyByaW9fb3BzID0geworCS5vcGVuICA9IHJpb3RvcGVuLAorCS5jbG9zZSA9IGdzX2Nsb3NlLAorCS53cml0ZSA9IGdzX3dyaXRlLAorCS5wdXRfY2hhciA9IGdzX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IGdzX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gZ3Nfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gZ3NfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBnc19mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gcmlvX2lvY3RsLAorCS50aHJvdHRsZSA9IHJpb190aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IHJpb191bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IGdzX3NldF90ZXJtaW9zLAorCS5zdG9wID0gZ3Nfc3RvcCwKKwkuc3RhcnQgPSBnc19zdGFydCwKKwkuaGFuZ3VwID0gZ3NfaGFuZ3VwLAorfTsKKworc3RhdGljIGludCByaW9faW5pdF9kcml2ZXJzKHZvaWQpCit7CisJaW50IGVycm9yID0gLUVOT01FTTsKKworCXJpb19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKDI1Nik7CisJaWYgKCFyaW9fZHJpdmVyKQorCQlnb3RvIG91dDsKKwlyaW9fZHJpdmVyMiA9IGFsbG9jX3R0eV9kcml2ZXIoMjU2KTsKKwlpZiAoIXJpb19kcml2ZXIyKQorCQlnb3RvIG91dDE7CisKKwlmdW5jX2VudGVyKCk7CisKKwlyaW9fZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXJpb19kcml2ZXItPmRyaXZlcl9uYW1lID0gInNwZWNpYWxpeF9yaW8iOworCXJpb19kcml2ZXItPm5hbWUgPSAidHR5U1IiOworCXJpb19kcml2ZXItPm1ham9yID0gUklPX05PUk1BTF9NQUpPUjA7CisJcmlvX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJcmlvX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlyaW9fZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJcmlvX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJcmlvX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhyaW9fZHJpdmVyLCAmcmlvX29wcyk7CisKKwlyaW9fZHJpdmVyMi0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlyaW9fZHJpdmVyMi0+ZHJpdmVyX25hbWUgPSAic3BlY2lhbGl4X3JpbyI7CisJcmlvX2RyaXZlcjItPm5hbWUgPSAidHR5U1IiOworCXJpb19kcml2ZXIyLT5tYWpvciA9IFJJT19OT1JNQUxfTUFKT1IxOworCXJpb19kcml2ZXIyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlyaW9fZHJpdmVyMi0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlyaW9fZHJpdmVyMi0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXJpb19kcml2ZXIyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlyaW9fZHJpdmVyMi0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhyaW9fZHJpdmVyMiwgJnJpb19vcHMpOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAic2V0X3Rlcm1pb3MgPSAlcFxuIiwgZ3Nfc2V0X3Rlcm1pb3MpOworCisJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIocmlvX2RyaXZlcikpKQorCQlnb3RvIG91dDI7CisJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIocmlvX2RyaXZlcjIpKSkKKwkJZ290byBvdXQzOworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOworb3V0MzoKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocmlvX2RyaXZlcik7CitvdXQyOgorCXB1dF90dHlfZHJpdmVyKHJpb19kcml2ZXIyKTsKK291dDE6CisJcHV0X3R0eV9kcml2ZXIocmlvX2RyaXZlcik7CitvdXQ6CisJcHJpbnRrKEtFUk5fRVJSICJyaW86IENvdWxkbid0IHJlZ2lzdGVyIGEgcmlvIGRyaXZlciwgZXJyb3IgPSAlZFxuIiwKKwkgICAgIGVycm9yKTsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgdm9pZCAqIGNrbWFsbG9jIChpbnQgc2l6ZSkKK3sKKyAgdm9pZCAqcDsKKworICBwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKyAgaWYgKHApIAorICAgIG1lbXNldChwLCAwLCBzaXplKTsKKyAgcmV0dXJuIHA7Cit9CisKKworCitzdGF0aWMgaW50IHJpb19pbml0X2RhdGFzdHJ1Y3R1cmVzICh2b2lkKQoreworICBpbnQgaTsKKyAgc3RydWN0IFBvcnQgKnBvcnQ7CisgIGZ1bmNfZW50ZXIoKTsKKworICAvKiBNYW55IGRyaXZlcnMgc3RhdGljYWxseSBhbGxvY2F0ZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9ydHMKKyAgICAgVGhlcmUgaXMgbm8gcmVhc29uIG5vdCB0byBhbGxvY2F0ZSB0aGVtIGR5bmFtaWNhbGx5LiBJcyB0aGVyZT8gLS0gUkVXICovCisgIC8qIEhvd2V2ZXIsIHRoZSBSSU8gZHJpdmVyIGFsbG93cyB1c2VycyB0byBjb25maWd1cmUgdGhlaXIgZmlyc3QKKyAgICAgUlRBIGFzIHRoZSBwb3J0cyBudW1iZXJlZCA1MDQtNTExLiBXZSB0aGVyZWZvcmUgbmVlZCB0byBhbGxvY2F0ZSAKKyAgICAgdGhlIHdob2xlIHJhbmdlLiA6LSggICAtLSBSRVcgKi8KKyAgCisjZGVmaW5lIFJJX1NaICAgc2l6ZW9mKHN0cnVjdCByaW9faW5mbykKKyNkZWZpbmUgSE9TVF9TWiBzaXplb2Yoc3RydWN0IEhvc3QpCisjZGVmaW5lIFBPUlRfU1ogc2l6ZW9mKHN0cnVjdCBQb3J0ICopCisjZGVmaW5lIFRNSU9fU1ogc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zICopCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgImdldHRpbmcgOiAlZCAlZCAlZCAlZCAlZCBieXRlc1xuIiwgCisgICAgICAgICAgICAgICBSSV9TWiwgCisgICAgICAgICAgICAgICBSSU9fSE9TVFMgKiBIT1NUX1NaLAorICAgICAgICAgICAgICAgUklPX1BPUlRTICogUE9SVF9TWiwKKyAgICAgICAgICAgICAgIFJJT19QT1JUUyAqIFRNSU9fU1osCisgICAgICAgICAgICAgICBSSU9fUE9SVFMgKiBUTUlPX1NaKTsKKyAgCisgIGlmICghKHAgICAgICAgICAgICAgICAgICA9IGNrbWFsbG9jICggICAgICAgICAgICAgIFJJX1NaKSkpIGdvdG8gZnJlZTA7CisgIGlmICghKHAtPlJJT0hvc3RzICAgICAgICA9IGNrbWFsbG9jIChSSU9fSE9TVFMgKiBIT1NUX1NaKSkpIGdvdG8gZnJlZTE7CisgIGlmICghKHAtPlJJT1BvcnRwICAgICAgICA9IGNrbWFsbG9jIChSSU9fUE9SVFMgKiBQT1JUX1NaKSkpIGdvdG8gZnJlZTI7CisgIHAtPlJJT0NvbmYgPSBSSU9Db25mOworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJHb3QgOiAlcCAlcCAlcFxuIiwgCisgICAgICAgICAgICAgICBwLCBwLT5SSU9Ib3N0cywgcC0+UklPUG9ydHApOworCisjaWYgMQorICBmb3IgKGkgPSAwOyBpIDwgUklPX1BPUlRTOyBpKyspIHsKKyAgICBwb3J0ID0gcC0+UklPUG9ydHBbaV0gPSBja21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgUG9ydCkpOworICAgIGlmICghcG9ydCkgeworICAgICAgZ290byBmcmVlNjsKKyAgICB9CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiaW5pdGluZyBwb3J0ICVkICglZClcbiIsIGksIHBvcnQtPk1hcHBlZCk7CisgICAgcG9ydC0+UG9ydE51bSA9IGk7CisgICAgcG9ydC0+Z3MubWFnaWMgPSBSSU9fTUFHSUM7CisgICAgcG9ydC0+Z3MuY2xvc2VfZGVsYXkgPSBIWi8yOworICAgIHBvcnQtPmdzLmNsb3Npbmdfd2FpdCA9IDMwICogSFo7CisgICAgcG9ydC0+Z3MucmQgPSAmcmlvX3JlYWxfZHJpdmVyOworICAgIHNwaW5fbG9ja19pbml0KCZwb3J0LT5wb3J0U2VtKTsKKyAgICAvKgorICAgICAqIEluaXRpYWxpemluZyB3YWl0IHF1ZXVlCisgICAgICovCisgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+Z3Mub3Blbl93YWl0KTsKKyAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5jbG9zZV93YWl0KTsKKyAgfQorI2Vsc2UKKyAgLyogV2UgY291bGQgcG9zdHBvbmUgaW5pdGlhbGl6aW5nIHRoZW0gdG8gd2hlbiB0aGV5IGFyZSBjb25maWd1cmVkLiAqLworI2VuZGlmCisKKworICAKKyAgaWYgKHJpb19kZWJ1ZyAmIFJJT19ERUJVR19JTklUKSB7CisgICAgbXlfaGQgKCZyaW9fcmVhbF9kcml2ZXIsIHNpemVvZiAocmlvX3JlYWxfZHJpdmVyKSk7CisgIH0KKworICAKKyAgZnVuY19leGl0KCk7CisgIHJldHVybiAwOworCisgZnJlZTY6Zm9yIChpLS07aT49MDtpLS0pCisgICAgICAgIGtmcmVlIChwLT5SSU9Qb3J0cFtpXSk7CisvKmZyZWU1OgorIGZyZWU0OgorIGZyZWUzOiova2ZyZWUgKHAtPlJJT1BvcnRwKTsKKyBmcmVlMjprZnJlZSAocC0+UklPSG9zdHMpOworIGZyZWUxOgorICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJOb3QgZW5vdWdoIG1lbW9yeSEgJXAgJXAgJXBcbiIsIAorICAgICAgICAJICAgICAgIHAsIHAtPlJJT0hvc3RzLCBwLT5SSU9Qb3J0cCk7CisgIGtmcmVlKHApOyAgICAgICAgCSAgICAgIAorIGZyZWUwOgorICByZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgIF9fZXhpdCByaW9fcmVsZWFzZV9kcml2ZXJzKHZvaWQpCit7CisgIGZ1bmNfZW50ZXIoKTsKKyAgdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJpb19kcml2ZXIyKTsKKyAgdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJpb19kcml2ZXIpOworICBwdXRfdHR5X2RyaXZlcihyaW9fZHJpdmVyMik7CisgIHB1dF90dHlfZHJpdmVyKHJpb19kcml2ZXIpOworICBmdW5jX2V4aXQoKTsKK30KKworCisjaWZkZWYgQ09ORklHX1BDSQorIC8qIFRoaXMgd2FzIHdyaXR0ZW4gZm9yIFNYLCBidXQgYXBwbGllcyB0byBSSU8gdG9vLi4uCisgICAgKGluY2x1ZGluZyBidWdzLi4uLikKKworICAgIFRoZXJlIGlzIGFub3RoZXIgYml0IGJlc2lkZXMgQml0IDE3LiBUdXJuaW5nIHRoYXQgYml0IG9mZgorICAgIChvbiBib2FyZHMgc2hpcHBlZCB3aXRoIHRoZSBmaXggaW4gdGhlIGVlcHJvbSkgcmVzdWx0cyBpbiBhIAorICAgIGhhbmcgb24gdGhlIG5leHQgYWNjZXNzIHRvIHRoZSBjYXJkLiAKKyAqLworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogU2V0dGluZyBiaXQgMTcgaW4gdGhlIENOVFJMIHJlZ2lzdGVyIG9mIHRoZSBQTFggOTA1MCAgKiAKKyAqIGNoaXAgZm9yY2VzIGEgcmV0cnkgb24gd3JpdGVzIHdoaWxlIGEgcmVhZCBpcyBwZW5kaW5nLioKKyAqIFRoaXMgaXMgdG8gcHJldmVudCB0aGUgY2FyZCBsb2NraW5nIHVwIG9uIEludGVsIFhlb24gICoKKyAqIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMgd2l0aCB0aGUgTlggY2hpcHNldC4gICAgLS0gTlYgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTmV3ZXIgY2FyZHMgYXJlIHByb2R1Y2VkIHdpdGggdGhpcyBiaXQgc2V0IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KKyAgIEVFcHJvbS4gIEFzIHRoZSBiaXQgaXMgcmVhZC93cml0ZSBmb3IgdGhlIENQVSwgd2UgY2FuIGZpeCBpdCBoZXJlLAorICAgaWYgd2UgZGV0ZWN0IHRoYXQgaXQgaXNuJ3Qgc2V0IGNvcnJlY3RseS4gLS0gUkVXICovCisKK3N0YXRpYyB2b2lkIGZpeF9yaW9fcGNpIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKyAgdW5zaWduZWQgaW50IGh3YmFzZTsKKyAgdW5zaWduZWQgbG9uZyByZWJhc2U7CisgIHVuc2lnbmVkIGludCB0OworCisjZGVmaW5lIENOVFJMX1JFR19PRkZTRVQgICAgICAgIDB4NTAKKyNkZWZpbmUgQ05UUkxfUkVHX0dPT0RWQUxVRSAgICAgMHgxODI2MDAwMAorCisgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZod2Jhc2UpOworICBod2Jhc2UgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKyAgcmViYXNlID0gICh1bG9uZykgaW9yZW1hcChod2Jhc2UsIDB4ODApOworICB0ID0gcmVhZGwgKHJlYmFzZSArIENOVFJMX1JFR19PRkZTRVQpOworICBpZiAodCAhPSBDTlRSTF9SRUdfR09PRFZBTFVFKSB7CisgICAgcHJpbnRrIChLRVJOX0RFQlVHICJyaW86IHBlcmZvcm1pbmcgY250cmwgcmVnIGZpeDogJTA4eCAtPiAlMDh4XG4iLCAKKyAgICAgICAgICAgIHQsIENOVFJMX1JFR19HT09EVkFMVUUpOyAKKyAgICB3cml0ZWwgKENOVFJMX1JFR19HT09EVkFMVUUsIHJlYmFzZSArIENOVFJMX1JFR19PRkZTRVQpOyAgCisgIH0KKyAgaW91bm1hcCgoY2hhciopIHJlYmFzZSk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IF9faW5pdCByaW9faW5pdCh2b2lkKSAKK3sKKyAgaW50IGZvdW5kID0gMDsKKyAgaW50IGk7CisgIHN0cnVjdCBIb3N0ICpocDsKKyAgaW50IHJldHZhbDsKKyAgc3RydWN0IHZwZF9wcm9tICp2cGRwOworICBpbnQgb2tib2FyZDsKKworI2lmZGVmIENPTkZJR19QQ0kKKyAgc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgdGludDsKKyAgdW5zaWduZWQgc2hvcnQgdHNob3J0OworI2VuZGlmCisKKyAgZnVuY19lbnRlcigpOworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJbml0aW5nIHJpbyBtb2R1bGUuLi4gKHJpb19kZWJ1Zz0lZClcbiIsIAorCSAgICAgICByaW9fZGVidWcpOworCisgIGlmIChhYnMgKChsb25nKSAoJnJpb19kZWJ1ZykgLSByaW9fZGVidWcpIDwgMHgxMDAwMCkgeworICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJyaW86IHJpb19kZWJ1ZyBpcyBhbiBhZGRyZXNzLCBpbnN0ZWFkIG9mIGEgdmFsdWUuICIKKyAgICAgICAgICAgICJBc3N1bWluZyAtMS4gV2FzICV4LyVwLlxuIiwgcmlvX2RlYnVnLCAmcmlvX2RlYnVnKTsKKyAgICByaW9fZGVidWc9LTE7CisgIH0KKworICBpZiAobWlzY19yZWdpc3RlcigmcmlvX2Z3X2RldmljZSkgPCAwKSB7CisgICAgcHJpbnRrKEtFUk5fRVJSICJSSU86IFVuYWJsZSB0byByZWdpc3RlciBmaXJtd2FyZSBsb2FkZXIgZHJpdmVyLlxuIik7CisgICAgcmV0dXJuIC1FSU87CisgIH0KKworICByZXR2YWwgPSByaW9faW5pdF9kYXRhc3RydWN0dXJlcyAoKTsKKyAgaWYgKHJldHZhbCA8IDApIHsKKyAgICBtaXNjX2RlcmVnaXN0ZXIoJnJpb19md19kZXZpY2UpOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKworI2lmZGVmIENPTkZJR19QQ0kKKyAgICAvKiBGaXJzdCBsb29rIGZvciB0aGUgSkVUIGRldmljZXM6ICovCisgICAgd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9TWF9YSU9fSU84LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYpKSkgeworICAgICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgY29udGludWU7CisKKyAgICAgIC8qIFNwZWNpYWxpeCBoYXMgYSB3aG9sZSBidW5jaCBvZiBjYXJkcyB3aXRoCisgICAgICAgICAweDIwMDAgYXMgdGhlIGRldmljZSBJRC4gVGhleSBzYXkgaXRzIGJlY2F1c2UKKyAgICAgICAgIHRoZSBzdGFuZGFyZCByZXF1aXJlcyBpdC4gU3R1cGlkIHN0YW5kYXJkLiAqLworICAgICAgLyogSXQgc2VlbXMgdGhhdCByZWFkaW5nIGEgd29yZCBkb2Vzbid0IHdvcmsgcmVsaWFibHkgb24gMi4wLgorICAgICAgICAgQWxzbywgcmVhZGluZyBhIG5vbi1hbGlnbmVkIGR3b3JkIGRvZXNuJ3Qgd29yay4gU28gd2UgcmVhZCB0aGUKKyAgICAgICAgIHdob2xlIGR3b3JkIGF0IDB4MmMgYW5kIGV4dHJhY3QgdGhlIHdvcmQgYXQgMHgyZSAoU1VCU1lTVEVNX0lEKQorICAgICAgICAgb3Vyc2VsdmVzICovCisgICAgICAvKiBJIGRvbid0IGtub3cgd2h5IHRoZSBkZWZpbmUgZG9lc24ndCB3b3JrLCBjb25zdGFudCAweDJjIGRvZXMgLS1SRVcgKi8gCisgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQgKHBkZXYsIDB4MmMsICZ0aW50KTsKKyAgICAgIHRzaG9ydCA9ICh0aW50ID4+IDE2KSAmIDB4ZmZmZjsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb3QgYSBzcGVjaWFsaXggY2FyZDogJXguXG4iLCB0aW50KTsKKyAgICAgIGlmICh0c2hvcnQgIT0gMHgwMTAwKSB7CisgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJCdXQgaXQncyBub3QgYSBSSU8gY2FyZCAoJWQpLi4uXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgdHNob3J0KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiY3AxXG4iKTsKKworICAgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMiwgJnRpbnQpOworCisgICAgICBocCA9ICZwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c107CisgICAgICBocC0+UGFkZHJQID0gIHRpbnQgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworICAgICAgaHAtPkl2ZWMgPSBwZGV2LT5pcnE7CisgICAgICBpZiAoKCgxIDw8IGhwLT5JdmVjKSAmIHJpb19pcnFtYXNrKSA9PSAwKQorICAgICAgICAgICAgICBocC0+SXZlYyA9IDA7CisgICAgICBocC0+Q2FkZHIgPSBpb3JlbWFwKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIFJJT19XSU5ET1dfTEVOKTsKKyAgICAgIGhwLT5DYXJkUAk9IChzdHJ1Y3QgRHBSYW0gKikgaHAtPkNhZGRyOworICAgICAgaHAtPlR5cGUgID0gUklPX1BDSTsKKyAgICAgIGhwLT5Db3B5ICA9IHJpb19wY2ljb3B5OyAKKyAgICAgIGhwLT5Nb2RlICA9IFJJT19QQ0lfQk9PVF9GUk9NX1JBTTsKKyAgICAgIHNwaW5fbG9ja19pbml0KCZocC0+SG9zdExvY2spOworICAgICAgcmlvX3Jlc2V0X2ludGVycnVwdCAoaHApOworICAgICAgcmlvX3N0YXJ0X2NhcmRfcnVubmluZyAoaHApOworCisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiR29pbmcgdG8gdGVzdCBpdCAoJXAvJXApLlxuIiwKKyAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsCisgICAgICAgICAgICAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhZGRyKTsKKyAgICAgIGlmIChSSU9Cb2FyZFRlc3QoIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgUklPX1BDSSwgMCApID09IFJJT19TVUNDRVNTKSB7CisgICAgICAgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkRvbmUgUklPQm9hcmRUZXN0XG4iKTsKKyAgICAgICAgICAgICAgV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LCAweGZmKTsKKyAgICAgICAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZU51bSAgPQorICAgICAgICAgICAgICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVswXSkgJjB4RkYpPDwgMCl8CisgICAgICAgICAgICAgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzFdKSAmMHhGRik8PCA4KXwKKyAgICAgICAgICAgICAgICAgICAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMl0pICYweEZGKTw8MTYpfAorICAgICAgICAgICAgICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVszXSkgJjB4RkYpPDwyNCk7CisgICAgICAgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJIbW0gVGVzdGVkIG9rLCB1bmlxaWQgPSAleC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGZpeF9yaW9fcGNpIChwZGV2KTsKKyAgICAgICAgICAgICAgcC0+UklPTGFzdFBDSVNlYXJjaCA9IFJJT19TVUNDRVNTOworICAgICAgICAgICAgICBwLT5SSU9OdW1Ib3N0cysrOworICAgICAgICAgICAgICBmb3VuZCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaW91bm1hcCgoY2hhciopIChwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogVGhlbiBsb29rIGZvciB0aGUgb2xkZXIgUENJIGNhcmQuLi4uIDogKi8KKworICAvKiBUaGVzZSBvbGRlciBQQ0kgY2FyZHMgaGF2ZSBwcm9ibGVtcyAob25seSBieXRlLW1vZGUgYWNjZXNzIGlzCisgICAgIHN1cHBvcnRlZCksIHdoaWNoIG1ha2VzIHRoZW0gYSBiaXQgYXdrd2FyZCB0byBzdXBwb3J0LiAKKyAgICAgVGhleSBhbHNvIGhhdmUgcHJvYmxlbXMgc2hhcmluZyBpbnRlcnJ1cHRzLiBCZSBjYXJlZnVsLiAKKyAgICAgKFRoZSBkcml2ZXIgbm93IHJlZnVzZXMgdG8gc2hhcmUgaW50ZXJydXB0cyBmb3IgdGhlc2UKKyAgICAgY2FyZHMuIFRoaXMgc2hvdWxkIGJlIHN1ZmZpY2llbnQpLgorICAqLworCisgICAgLyogVGhlbiBsb29rIGZvciB0aGUgb2xkZXIgUklPL1BDSSBkZXZpY2VzOiAqLworICAgIHdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZSAoUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfUklPLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYpKSkgeworICAgICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgY29udGludWU7CisKKyNpZmRlZiBDT05GSUdfUklPX09MRFBDSQorICAgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJnRpbnQpOworCisgICAgICBocCA9ICZwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c107CisgICAgICBocC0+UGFkZHJQID0gIHRpbnQgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworICAgICAgaHAtPkl2ZWMgPSBwZGV2LT5pcnE7CisgICAgICBpZiAoKCgxIDw8IGhwLT5JdmVjKSAmIHJpb19pcnFtYXNrKSA9PSAwKSAKKyAgICAgIAlocC0+SXZlYyA9IDA7CisgICAgICBocC0+SXZlYyB8PSAweDgwMDA7IC8qIE1hcmsgYXMgbm9uLXNoYXJhYmxlICovCisgICAgICBocC0+Q2FkZHIgPSBpb3JlbWFwKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIFJJT19XSU5ET1dfTEVOKTsKKyAgICAgIGhwLT5DYXJkUAk9IChzdHJ1Y3QgRHBSYW0gKikgaHAtPkNhZGRyOworICAgICAgaHAtPlR5cGUgID0gUklPX1BDSTsKKyAgICAgIGhwLT5Db3B5ICA9IHJpb19wY2ljb3B5OworICAgICAgaHAtPk1vZGUgID0gUklPX1BDSV9CT09UX0ZST01fUkFNOworICAgICAgc3Bpbl9sb2NrX2luaXQoJmhwLT5Ib3N0TG9jayk7CisKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJJdmVjOiAleFxuIiwgaHAtPkl2ZWMpOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIk1vZGU6ICV4XG4iLCBocC0+TW9kZSk7CisKKyAgICAgIHJpb19yZXNldF9pbnRlcnJ1cHQgKGhwKTsKKyAgICAgIHJpb19zdGFydF9jYXJkX3J1bm5pbmcgKGhwKTsKKyAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiR29pbmcgdG8gdGVzdCBpdCAoJXAvJXApLlxuIiwKKyAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsCisgICAgICAgICAgICAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhZGRyKTsKKyAgICAgIGlmIChSSU9Cb2FyZFRlc3QoIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgUklPX1BDSSwgMCApID09IFJJT19TVUNDRVNTKSB7CisgICAgICAgIFdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5SZXNldEludCwgMHhmZik7CisgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0gID0KKyAgICAgICAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMF0pICYweEZGKTw8IDApfAorICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsxXSkgJjB4RkYpPDwgOCl8CisgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzJdKSAmMHhGRik8PDE2KXwKKyAgICAgICAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbM10pICYweEZGKTw8MjQpOworICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiSG1tIFRlc3RlZCBvaywgdW5pcWlkID0gJXguXG4iLAorICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOworCisgICAgICAgIHAtPlJJT0xhc3RQQ0lTZWFyY2ggPSBSSU9fU1VDQ0VTUzsKKyAgICAgICAgcC0+UklPTnVtSG9zdHMrKzsKKyAgICAgICAgZm91bmQrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlvdW5tYXAoKGNoYXIqKSAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhZGRyKSk7CisgICAgICB9CisjZWxzZQorICAgICAgcHJpbnRrIChLRVJOX0VSUiAiRm91bmQgYW4gb2xkZXIgUklPIFBDSSBjYXJkLCBidXQgdGhlIGRyaXZlciBpcyBub3QgIgorICAgICAgICAgICAgICAiY29tcGlsZWQgdG8gc3VwcG9ydCBpdC5cbiIpOworI2VuZGlmCisgICAgfQorI2VuZGlmIC8qIFBDSSAqLworCisgIC8qIE5vdyBwcm9iZSBmb3IgSVNBIGNhcmRzLi4uICovCisgIGZvciAoaT0wO2k8TlJfUklPX0FERFJTO2krKykgeworICAgIGhwID0gJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXTsKKyAgICBocC0+UGFkZHJQID0gcmlvX3Byb2JlX2FkZHJzW2ldOworICAgIC8qIFRoZXJlIHdhcyBzb21ldGhpbmcgYWJvdXQgdGhlIElSUXMgb2YgdGhlc2UgY2FyZHMuICdGb3JnZXQgd2hhdC4tLVJFVyAqLworICAgIGhwLT5JdmVjID0gMDsKKyAgICBocC0+Q2FkZHIgPSBpb3JlbWFwKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIFJJT19XSU5ET1dfTEVOKTsKKyAgICBocC0+Q2FyZFAgPSAoc3RydWN0IERwUmFtICopIGhwLT5DYWRkcjsKKyAgICBocC0+VHlwZSA9IFJJT19BVDsKKyAgICBocC0+Q29weSA9IHJpb19wY2ljb3B5OyAvKiBBVCBjYXJkIFBDST8/Pz8gLSBQVkRMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogLS0gWUVTISB0aGlzIGlzIG5vdyBhIG5vcm1hbCBjb3B5LiBPbmx5IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbGQgUENJIGNhcmQgdXNlcyB0aGUgc3BlY2lhbCBQQ0kgY29weS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTW9yZW92ZXIsIHRoZSBJU0EgY2FyZCB3aWxsIHdvcmsgd2l0aCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3BlY2lhbCBQQ0kgY29weSBhbnl3YXkuIC0tIFJFVyAqLworICAgIGhwLT5Nb2RlID0gMDsKKyAgICBzcGluX2xvY2tfaW5pdCgmaHAtPkhvc3RMb2NrKTsKKworICAgIHZwZHAgPSBnZXRfVlBEX1BST00gKGhwKTsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiR290IFZQRCBST01cbiIpOworICAgIG9rYm9hcmQgPSAwOworICAgIGlmICgoc3RybmNtcCAodnBkcC0+aWRlbnRpZmllciwgUklPX0lTQV9JREVOVCwgMTYpID09IDApIHx8CisgICAgICAgIChzdHJuY21wICh2cGRwLT5pZGVudGlmaWVyLCBSSU9fSVNBMl9JREVOVCwgMTYpID09IDApIHx8CisgICAgICAgIChzdHJuY21wICh2cGRwLT5pZGVudGlmaWVyLCBSSU9fSVNBM19JREVOVCwgMTYpID09IDApKSB7CisgICAgICAvKiBCb2FyZCBpcyBwcmVzZW50Li4uICovCisgICAgICBpZiAoUklPQm9hcmRUZXN0IChocC0+UGFkZHJQLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwLT5DYWRkciwgUklPX0FULCAwKSA9PSBSSU9fU1VDQ0VTUykgeworICAgICAgICAvKiAuLi4gYW5kIGZlZWxpbmcgZmluZSEhISEgKi8KKyAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkhtbSBUZXN0ZWQgb2ssIHVuaXFpZCA9ICV4LlxuIiwKKyAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtKTsKKyAgICAgICAgaWYgKFJJT0Fzc2lnbkFUKHAsIGhwLT5QYWRkclAsIGhwLT5DYWRkciwgMCkpIHsgICAgICAgIAorICAgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJIbW0gVGVzdGVkIG9rLCBob3N0JWQgdW5pcWlkID0gJXguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwLT5SSU9OdW1Ib3N0cywgCisgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzLTFdLlVuaXF1ZU51bSk7CisgICAgICAgICAgb2tib2FyZCsrOworICAgICAgICAgIGZvdW5kKys7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIGlmICghb2tib2FyZCkKKyAgICAgIGlvdW5tYXAgKChjaGFyKikgKGhwLT5DYWRkcikpOworICAgIH0KKyAgfQorCisKKyAgZm9yIChpPTA7aTxwLT5SSU9OdW1Ib3N0cztpKyspIHsKKyAgICBocCA9ICZwLT5SSU9Ib3N0c1tpXTsKKyAgICBpZiAoaHAtPkl2ZWMpIHsKKyAgICAgIGludCBtb2RlID0gU0FfU0hJUlE7CisgICAgICBpZiAoaHAtPkl2ZWMgJiAweDgwMDApIHttb2RlID0gMDsgaHAtPkl2ZWMgJj0gMHg3ZmZmO30KKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJlcXVlc3RpbmcgaW50ZXJydXB0IGhwOiAlcCByaW9faW50ZXJydXB0OiAlZCBNb2RlOiAleFxuIiwgaHAsaHAtPkl2ZWMsIGhwLT5Nb2RlKTsKKyAgICAgIHJldHZhbCA9IHJlcXVlc3RfaXJxIChocC0+SXZlYywgcmlvX2ludGVycnVwdCwgbW9kZSwgInJpbyIsIGhwKTsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJldHVybiB2YWx1ZSBmcm9tIHJlcXVlc3RfaXJxOiAlZFxuIiwgcmV0dmFsKTsKKyAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJyaW86IENhbm5vdCBhbGxvY2F0ZSBpcnEgJWQuXG4iLCBocC0+SXZlYyk7CisgICAgICAgICAgICAgIGhwLT5JdmVjID0gMDsKKyAgICAgIH0KKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkdvdCBpcnEgJWQuXG4iLCBocC0+SXZlYyk7CisgICAgICBpZiAoaHAtPkl2ZWMgIT0gMCl7CisgICAgICAgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVuYWJsaW5nIGludGVycnVwdHMgb24gcmlvIGNhcmQuXG4iKTsgCisgICAgICAgICAgICAgIGhwLT5Nb2RlIHw9IFJJT19QQ0lfSU5UX0VOQUJMRTsKKyAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBocC0+TW9kZSAmPSAhUklPX1BDSV9JTlRfRU5BQkxFOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiTmV3IE1vZGU6ICV4XG4iLCBocC0+TW9kZSk7CisgICAgICByaW9fc3RhcnRfY2FyZF9ydW5uaW5nIChocCk7CisgICAgfQorICAgIC8qIEluaXQgdGhlIHRpbWVyICJhbHdheXMiIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGNhbiBzYWZlbHkgYmUgCisgICAgICAgZGVsZXRlZCB3aGVuIHdlIHVubG9hZC4uLiAqLworCisgICAgaW5pdF90aW1lciAoJmhwLT50aW1lcik7CisgICAgaWYgKCFocC0+SXZlYykgeworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU3RhcnRpbmcgcG9sbGluZyBhdCAlZGogaW50ZXJ2YWxzLlxuIiwgCisgICAgICAgICAgICAgICAgICAgcmlvX3BvbGwpOworICAgICAgaHAtPnRpbWVyLmRhdGEgPSBpOworICAgICAgaHAtPnRpbWVyLmZ1bmN0aW9uID0gcmlvX3BvbGxmdW5jOworICAgICAgaHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcmlvX3BvbGw7CisgICAgICBhZGRfdGltZXIgKCZocC0+dGltZXIpOworICAgIH0KKyAgfQorCisgIGlmIChmb3VuZCkgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgInJpbzogdG90YWwgb2YgJWQgYm9hcmRzIGRldGVjdGVkLlxuIiwgZm91bmQpOworICAgIHJpb19pbml0X2RyaXZlcnMgKCk7CisgIH0gZWxzZSB7CisgICAgLyogZGVyZWdpc3RlciB0aGUgbWlzYyBkZXZpY2Ugd2UgY3JlYXRlZCBlYXJsaWVyICovCisgICAgbWlzY19kZXJlZ2lzdGVyKCZyaW9fZndfZGV2aWNlKTsKKyAgfQorCisgIGZ1bmNfZXhpdCgpOworICByZXR1cm4gZm91bmQ/MDotRUlPOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCByaW9fZXhpdCAodm9pZCkKK3sKKyAgaW50IGk7IAorICBzdHJ1Y3QgSG9zdCAqaHA7CisgIAorICBmdW5jX2VudGVyKCk7CisKKyAgZm9yIChpPTAsaHA9cC0+UklPSG9zdHM7aTxwLT5SSU9OdW1Ib3N0cztpKyssIGhwKyspIHsKKyAgICBSSU9Ib3N0UmVzZXQgKGhwLT5UeXBlLCBocC0+Q2FyZFAsIGhwLT5TbG90KTsKKyAgICBpZiAoaHAtPkl2ZWMpIHsKKyAgICAgIGZyZWVfaXJxIChocC0+SXZlYywgaHApOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiZnJlZWQgaXJxICVkLlxuIiwgaHAtPkl2ZWMpOworICAgIH0KKyAgICAvKiBJdCBpcyBzYWZlL2FsbG93ZWQgdG8gZGVsX3RpbWVyIGEgbm9uLWFjdGl2ZSB0aW1lciAqLworICAgIGRlbF90aW1lciAoJmhwLT50aW1lcik7CisgIH0KKworICBpZiAobWlzY19kZXJlZ2lzdGVyKCZyaW9fZndfZGV2aWNlKSA8IDApIHsKKyAgICBwcmludGsgKEtFUk5fSU5GTyAicmlvOiBjb3VsZG4ndCBkZXJlZ2lzdGVyIGNvbnRyb2wtZGV2aWNlXG4iKTsKKyAgfQorCisKKyAgcmlvX2RwcmludGsgKFJJT19ERUJVR19DTEVBTlVQLCAiQ2xlYW5pbmcgdXAgZHJpdmVyc1xuIik7CisKKyAgcmlvX3JlbGVhc2VfZHJpdmVycyAoKTsKKworICAvKiBSZWxlYXNlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAga2ZyZWUgKHAtPlJJT1BvcnRwKTsKKyAga2ZyZWUgKHAtPlJJT0hvc3RzKTsKKyAga2ZyZWUgKHApOworCisgIGZ1bmNfZXhpdCgpOworfQorCittb2R1bGVfaW5pdChyaW9faW5pdCk7Cittb2R1bGVfZXhpdChyaW9fZXhpdCk7CisKKy8qCisgKiBBbnlib2R5IHdobyBrbm93cyB3aHkgdGhpcyBkb2Vzbid0IHdvcmsgZm9yIG1lLCBwbGVhc2UgdGVsbCBtZSAtLSBSRVcuCisgKiBTbmF0Y2hlZCBmcm9tIHNjc2kuYyAoZml4ZWQgb25lIHNwZWxsaW5nIGVycm9yKToKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMnIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjLWluZGVudC1sZXZlbDogNAorICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCisgKiBjLWJyYWNlLW9mZnNldDogLTQKKyAqIGMtYXJnZGVjbC1pbmRlbnQ6IDQKKyAqIGMtbGFiZWwtb2Zmc2V0OiAtNAorICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogNAorICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYmExOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguaApAQCAtMCwwICsxLDE4NyBAQAorCisvKgorICogIHJpb19saW51eC5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OCwxOTk5LDIwMDAgUi5FLldvbGZmQEJpdFdpemFyZC5ubAorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgUklPIHNlcmlhbCBkcml2ZXIuCisgKgorICogIFZlcnNpb24gMS4wIC0tIEp1bHksIDE5OTkuIAorICogCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBSSU9fTkJPQVJEUyAgICAgICAgNAorI2RlZmluZSBSSU9fUE9SVFNQRVJCT0FSRCAxMjgKKyNkZWZpbmUgUklPX05QT1JUUyAgICAgICAgKFJJT19OQk9BUkRTICogUklPX1BPUlRTUEVSQk9BUkQpCisKKyNkZWZpbmUgTU9ERU1fU1VQUE9SVAorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIFJJT19NQUdJQyAweDEyMzQ1Njc4CisKKworc3RydWN0IHZwZF9wcm9tIHsKKyAgdW5zaWduZWQgc2hvcnQgaWQ7CisgIGNoYXIgaHdyZXY7CisgIGNoYXIgaHdhc3M7CisgIGludCB1bmlxaWQ7CisgIGNoYXIgbXllYXI7CisgIGNoYXIgbXdlZWs7CisgIGNoYXIgaHdfZmVhdHVyZVs1XTsKKyAgY2hhciBvZW1faWQ7CisgIGNoYXIgaWRlbnRpZmllclsxNl07Cit9OworCisKKyNkZWZpbmUgUklPX0RFQlVHX0FMTCAgICAgICAgICAgMHhmZmZmZmZmZgorCisjZGVmaW5lIE9fT1RIRVIodHR5KSAgICBcCisgICAgICAoKE9fT0xDVUModHR5KSkgIHx8XAorICAgICAgKE9fT05MQ1IodHR5KSkgICB8fFwKKyAgICAgIChPX09DUk5MKHR0eSkpICAgfHxcCisgICAgICAoT19PTk9DUih0dHkpKSAgIHx8XAorICAgICAgKE9fT05MUkVUKHR0eSkpICB8fFwKKyAgICAgIChPX09GSUxMKHR0eSkpICAgfHxcCisgICAgICAoT19PRkRFTCh0dHkpKSAgIHx8XAorICAgICAgKE9fTkxETFkodHR5KSkgICB8fFwKKyAgICAgIChPX0NSRExZKHR0eSkpICAgfHxcCisgICAgICAoT19UQUJETFkodHR5KSkgIHx8XAorICAgICAgKE9fQlNETFkodHR5KSkgICB8fFwKKyAgICAgIChPX1ZURExZKHR0eSkpICAgfHxcCisgICAgICAoT19GRkRMWSh0dHkpKSkKKworLyogU2FtZSBmb3IgaW5wdXQuICovCisjZGVmaW5lIElfT1RIRVIodHR5KSAgICBcCisgICAgICAoKElfSU5MQ1IodHR5KSkgIHx8XAorICAgICAgKElfSUdOQ1IodHR5KSkgICB8fFwKKyAgICAgIChJX0lDUk5MKHR0eSkpICAgfHxcCisgICAgICAoSV9JVUNMQyh0dHkpKSAgIHx8XAorICAgICAgKExfSVNJRyh0dHkpKSkKKworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisKKyNkZWZpbmUgUklPX0JPQVJEX0lOVFJfTE9DSyAgMQorCisKKyNpZm5kZWYgUklPQ1RMX01JU0NfTUlOT1IgCisvKiBBbGxvdyBvdGhlcnMgdG8gZ2F0aGVyIHRoaXMgaW50byAibWFqb3IuaCIgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCAqLworI2RlZmluZSBSSU9DVExfTUlTQ19NSU5PUiAgICAxNjkKKyNlbmRpZgorCisKKy8qIEFsbG93IHVzIHRvIGRlYnVnICJpbiB0aGUgZmllbGQiIHdpdGhvdXQgcmVxdWlyaW5nIGNsaWVudHMgdG8KKyAgIHJlY29tcGlsZS4uLi4gKi8KKyNpZiAxCisjZGVmaW5lIHJpb19zcGluX2xvY2tfaXJxc2F2ZShzZW0sIGZsYWdzKSBkbyB7IFwKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1NQSU5MT0NLLCAic3BpbmxvY2tpcnFzYXZlOiAlcCAlczolZFxuIiwgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtLCBfX0ZJTEVfXywgX19MSU5FX18pO1wKKwlzcGluX2xvY2tfaXJxc2F2ZShzZW0sIGZsYWdzKTtcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzZW0sIGZsYWdzKSBkbyB7IFwKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1NQSU5MT0NLLCAic3BpbnVubG9ja2lycXJlc3RvcmU6ICVwICVzOiVkXG4iLFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbSwgX19GSUxFX18sIF9fTElORV9fKTtcCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzZW0sIGZsYWdzKTtcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSByaW9fc3Bpbl9sb2NrKHNlbSkgZG8geyBcCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19TUElOTE9DSywgInNwaW5sb2NrOiAlcCAlczolZFxuIixcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW0sIF9fRklMRV9fLCBfX0xJTkVfXyk7XAorCXNwaW5fbG9jayhzZW0pO1wKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHJpb19zcGluX3VubG9jayhzZW0pIGRvIHsgXAorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfU1BJTkxPQ0ssICJzcGludW5sb2NrOiAlcCAlczolZFxuIixcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW0sIF9fRklMRV9fLCBfX0xJTkVfXyk7XAorCXNwaW5fdW5sb2NrKHNlbSk7XAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSByaW9fc3Bpbl9sb2NrX2lycXNhdmUoc2VtLCBmbGFncykgXAorICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoc2VtLCBmbGFncykKKworI2RlZmluZSByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzZW0sIGZsYWdzKSBcCisgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbSwgZmxhZ3MpCisKKyNkZWZpbmUgcmlvX3NwaW5fbG9jayhzZW0pIFwKKyAgICAgICAgICAgIHNwaW5fbG9jayhzZW0pIAorCisjZGVmaW5lIHJpb19zcGluX3VubG9jayhzZW0pIFwKKyAgICAgICAgICAgIHNwaW5fdW5sb2NrKHNlbSkgCisKKyNlbmRpZgorCisKKworI2lmZGVmIENPTkZJR19SSU9fT0xEUENJCitzdGF0aWMgaW5saW5lIHZvaWQgKnJpb19tZW1jcHlfdG9pbyAodm9pZCAqZHVtbXksIHZvaWQgKmRlc3QsIHZvaWQgKnNvdXJjZSwgaW50IG4pCit7CisgIGNoYXIgKmRzdCA9IGRlc3Q7CisgIGNoYXIgKnNyYyA9IHNvdXJjZTsKKworICB3aGlsZSAobi0tKSB7CisgICAgd3JpdGViICgqc3JjKyssIGRzdCsrKTsKKyAgICAodm9pZCkgcmVhZGIgKGR1bW15KTsKKyAgfQorCisgIHJldHVybiBkZXN0OworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqcmlvX21lbWNweV9mcm9taW8gKHZvaWQgKmRlc3QsIHZvaWQgKnNvdXJjZSwgaW50IG4pCit7CisgIGNoYXIgKmRzdCA9IGRlc3Q7CisgIGNoYXIgKnNyYyA9IHNvdXJjZTsKKworICB3aGlsZSAobi0tKSAKKyAgICAqZHN0KysgPSByZWFkYiAoc3JjKyspOworCisgIHJldHVybiBkZXN0OworfQorCisjZWxzZQorI2RlZmluZSByaW9fbWVtY3B5X3RvaW8oZHVtbXksZGVzdCxzb3VyY2UsbikgICBtZW1jcHlfdG9pbyhkZXN0LCBzb3VyY2UsIG4pCisjZGVmaW5lIHJpb19tZW1jcHlfZnJvbWlvICAgICAgICAgICAgICAgICAgICAgIG1lbWNweV9mcm9taW8KKyNlbmRpZgorCisjZGVmaW5lIERFQlVHIDEKKworCisvKiAKKyAgIFRoaXMgZHJpdmVyIGNhbiBzcGV3IGEgd2hvbGUgbG90IG9mIGRlYnVnZ2luZyBvdXRwdXQgYXQgeW91LiBJZiB5b3UKKyAgIG5lZWQgbWF4aW11bSBwZXJmb3JtYW5jZSwgeW91IHNob3VsZCBkaXNhYmxlIHRoZSBERUJVRyBkZWZpbmUuIFRvCisgICBhaWQgaW4gZGVidWdnaW5nIGluIHRoZSBmaWVsZCwgSSdtIGxlYXZpbmcgdGhlIGNvbXBpbGUtdGltZSBkZWJ1ZworICAgZmVhdHVyZXMgZW5hYmxlZCwgYW5kIGRpc2FibGUgdGhlbSAicnVudGltZSIuIFRoYXQgYWxsb3dzIG1lIHRvCisgICBpbnN0cnVjdCBwZW9wbGUgd2l0aCBwcm9ibGVtcyB0byBlbmFibGUgZGVidWdnaW5nIHdpdGhvdXQgcmVxdWlyaW5nCisgICB0aGVtIHRvIHJlY29tcGlsZS4uLiAKKyovCisKKyNpZmRlZiBERUJVRworI2RlZmluZSByaW9fZHByaW50ayhmLCBzdHIuLi4pIGRvIHsgaWYgKHJpb19kZWJ1ZyAmIGYpIHByaW50ayAoc3RyKTt9IHdoaWxlICgwKQorI2RlZmluZSBmdW5jX2VudGVyKCkgcmlvX2RwcmludGsgKFJJT19ERUJVR19GTE9XLCAicmlvOiBlbnRlciAlc1xuIiwgX19GVU5DVElPTl9fKQorI2RlZmluZSBmdW5jX2V4aXQoKSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19GTE9XLCAicmlvOiBleGl0ICAlc1xuIiwgX19GVU5DVElPTl9fKQorI2RlZmluZSBmdW5jX2VudGVyMigpIHJpb19kcHJpbnRrIChSSU9fREVCVUdfRkxPVywgInJpbzogZW50ZXIgJXMgKHBvcnQgJWQpXG4iLF9fRlVOQ1RJT05fXywgcG9ydC0+bGluZSkKKyNlbHNlCisjZGVmaW5lIHJpb19kcHJpbnRrKGYsIHN0ci4uLikgLyogbm90aGluZyAqLworI2RlZmluZSBmdW5jX2VudGVyKCkKKyNkZWZpbmUgZnVuY19leGl0KCkKKyNkZWZpbmUgZnVuY19lbnRlcjIoKQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvYm9hcmQuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvYm9hcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzZhYzZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9ib2FyZC5oCkBAIC0wLDAgKzEsMjgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJVGl0bGUJCToJUklPIEhvc3QgQ2FyZCBIYXJkd2FyZSBEZWZpbml0aW9ucwkqLworLyoJCQkJCQkJCQkqLworLyoJQXV0aG9yCQk6CU4uUC5WYXNzYWxsbwkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJQ3JlYXRpb24JOgkyNnRoIEFwcmlsIDE5OTkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVZlcnNpb24JCToJMS4wLjAJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDb3B5cmlnaHQJOgkoYykgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiAxOTk5CSoKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgkJCQkJCQkJCSovCisvKglEZXNjcmlwdGlvbgk6CVByb3RvdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCSovCisvKgkJCQlkZXNjcmliaW5nIHRoZSBSSU8gYm9hcmQgaGFyZHdhcmUJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhpc3RvcnkuLi4KKworMS4wLjAJMjYvMDQvOTkgTlBWCUNyZWF0aW9uLgorCisqLworCisjaWZuZGVmCV9yaW9ib2FyZF9oCQkJCS8qIElmIFJJT0JPQVJELkggbm90IGFscmVhZHkgZGVmaW5lZCAqLworI2RlZmluZQlfcmlvYm9hcmRfaCAgICAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgIEhhcmR3YXJlIENvbnRyb2wgUmVnaXN0ZXJzICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhhcmR3YXJlIFJlZ2lzdGVycy4uLiAqLworCisjZGVmaW5lCVJJT19SRUdfQkFTRQkweDdDMDAJCQkvKiBCYXNlIG9mIGNvbnRyb2wgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUJUklPX0NPTkZJRwlSSU9fUkVHX0JBU0UgKyAweDAwMDAJLyogV1JJVEU6IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUklPX0lOVFNFVAlSSU9fUkVHX0JBU0UgKyAweDAwODAJLyogV1JJVEU6IEludGVycnVwdCBTZXQgKi8KKyNkZWZpbmUJUklPX1JFU0VUCVJJT19SRUdfQkFTRSArIDB4MDEwMAkvKiBXUklURTogSG9zdCBSZXNldCAqLworI2RlZmluZQlSSU9fSU5UUkVTRVQJUklPX1JFR19CQVNFICsgMHgwMTgwCS8qIFdSSVRFOiBJbnRlcnJ1cHQgUmVzZXQgKi8KKworI2RlZmluZQlSSU9fVlBEX1JPTQlSSU9fUkVHX0JBU0UgKyAweDAwMDAJLyogUkVBRDogVml0YWwgUHJvZHVjdCBEYXRhIFJPTSAqLworI2RlZmluZQlSSU9fSU5UU1RBVAlSSU9fUkVHX0JBU0UgKyAweDAwODAJLyogUkVBRDogSW50ZXJydXB0IFN0YXR1cyAoSmV0IGJvYXJkcyBvbmx5KSAqLworI2RlZmluZQlSSU9fUkVTRVRTVEFUCVJJT19SRUdfQkFTRSArIDB4MDEwMAkvKiBSRUFEOiBSZXNldCBTdGF0dXMgKEpldCBib2FyZHMgb25seSkgKi8KKworLyogUklPX1ZQRF9ST00gZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJVlBEX1NMWF9JRDEJMHgwMAkJCS8qIFJFQUQ6IFNwZWNpYWxpeCBJZGVudGlmaWVyICMxICovCisjZGVmaW5lCVZQRF9TTFhfSUQyCTB4MDEJCQkvKiBSRUFEOiBTcGVjaWFsaXggSWRlbnRpZmllciAjMiAqLworI2RlZmluZQlWUERfSFdfUkVWCTB4MDIJCQkvKiBSRUFEOiBIYXJkd2FyZSBSZXZpc2lvbiAqLworI2RlZmluZQlWUERfSFdfQVNTRU0JMHgwMwkJCS8qIFJFQUQ6IEhhcmR3YXJlIEFzc2VtYmx5IExldmVsICovCisjZGVmaW5lCVZQRF9VTklRVUVJRDQJMHgwNAkJCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICM0ICovCisjZGVmaW5lCVZQRF9VTklRVUVJRDMJMHgwNQkJCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICMzICovCisjZGVmaW5lCVZQRF9VTklRVUVJRDIJMHgwNgkJCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICMyICovCisjZGVmaW5lCVZQRF9VTklRVUVJRDEJMHgwNwkJCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICMxICovCisjZGVmaW5lCVZQRF9NQU5VX1lFQVIJMHgwOAkJCS8qIFJFQUQ6IFllYXIgT2YgTWFudWZhY3R1cmUgKDAgPSAxOTcwKSAqLworI2RlZmluZQlWUERfTUFOVV9XRUVLCTB4MDkJCQkvKiBSRUFEOiBXZWVrIE9mIE1hbnVmYWN0dXJlICgwID0gd2VlayAxIEphbikgKi8KKyNkZWZpbmUJVlBEX0hXRkVBVFVSRTEJMHgwQQkJCS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSAxICovCisjZGVmaW5lCVZQRF9IV0ZFQVRVUkUyCTB4MEIJCQkvKiBSRUFEOiBIYXJkd2FyZSBGZWF0dXJlIEJ5dGUgMiAqLworI2RlZmluZQlWUERfSFdGRUFUVVJFMwkweDBDCQkJLyogUkVBRDogSGFyZHdhcmUgRmVhdHVyZSBCeXRlIDMgKi8KKyNkZWZpbmUJVlBEX0hXRkVBVFVSRTQJMHgwRAkJCS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSA0ICovCisjZGVmaW5lCVZQRF9IV0ZFQVRVUkU1CTB4MEUJCQkvKiBSRUFEOiBIYXJkd2FyZSBGZWF0dXJlIEJ5dGUgNSAqLworI2RlZmluZQlWUERfT0VNSUQJMHgwRgkJCS8qIFJFQUQ6IE9FTSBJZGVudGlmaWVyICovCisjZGVmaW5lCVZQRF9JREVOVAkweDEwCQkJLyogUkVBRDogSWRlbnRpZmllciBzdHJpbmcgKDE2IGJ5dGVzKSAqLworI2RlZmluZQlWUERfSURFTlRfTEVOCTB4MTAKKworLyogVlBEIFJPTSBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlTTFhfSUQxCQkweDRECisjZGVmaW5lCVNMWF9JRDIJCTB4OTgKKworI2RlZmluZQlQUk9EVUNUX0lEKGEpCSgoYT4+NCkmMHhGKQkJLyogVXNlIHRvIG9idGFpbiBQcm9kdWN0IElEIGZyb20gVlBEX1VOSVFVRUlEMSAqLworCisjZGVmaW5lCUlEX1NYX0lTQQkweDIKKyNkZWZpbmUJSURfUklPX0VJU0EJMHgzCisjZGVmaW5lCUlEX1NYX1BDSQkweDUKKyNkZWZpbmUJSURfU1hfRUlTQQkweDcKKyNkZWZpbmUJSURfUklPX1JUQTE2CTB4OQorI2RlZmluZQlJRF9SSU9fSVNBCTB4QQorI2RlZmluZQlJRF9SSU9fTUNBCTB4QgorI2RlZmluZQlJRF9SSU9fU0JVUwkweEMKKyNkZWZpbmUJSURfUklPX1BDSQkweEQKKyNkZWZpbmUJSURfUklPX1JUQTgJMHhFCisKKy8qIFRyYW5zcHV0ZXIgYm9vdHN0cmFwIGRlZmluaXRpb25zLi4uICovCisKKyNkZWZpbmUJQk9PVExPQURBRERSCQkoMHg4MDAwIC0gNikKKyNkZWZpbmUJQk9PVElORElDQVRFCQkoMHg4MDAwIC0gMikKKworLyogRmlybXdhcmUgbG9hZCBwb3NpdGlvbi4uLiAqLworCisjZGVmaW5lCUZJUk1XQVJFTE9BREFERFIJMHg3QzAwCQkvKiBGaXJtd2FyZSBpcyBsb2FkZWQgX2JlZm9yZV8gdGhpcyBhZGRyZXNzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJJTyAoUmV2MSkgSVNBICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX0lTQV9JREVOVAkiSkJKR1BHR0hJTlNNSlBKUiIKKworI2RlZmluZQlSSU9fSVNBX0NGR19CT09UUkFNCTB4MDEJCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLworI2RlZmluZQlSSU9fSVNBX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX0lTQV9DRkdfSVJRTUFTSwkweDMwCQkvKiBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZQkgIFJJT19JU0FfQ0ZHX0lSUTEyCTB4MTAJCS8qIEludGVycnVwdCBMZXZlbCAxMiAqLworI2RlZmluZQkgIFJJT19JU0FfQ0ZHX0lSUTExCTB4MjAJCS8qIEludGVycnVwdCBMZXZlbCAxMSAqLworI2RlZmluZQkgIFJJT19JU0FfQ0ZHX0lSUTkJMHgzMAkJLyogSW50ZXJydXB0IExldmVsIDkgKi8KKyNkZWZpbmUJUklPX0lTQV9DRkdfTElOSzIwCTB4NDAJCS8qIDIwTWJwcyBsaW5rLCBlbHNlIDEwTWJwcyAqLworI2RlZmluZQlSSU9fSVNBX0NGR19XQUlUU1RBVEUwCTB4ODAJCS8qIDAgd2FpdHN0YXRlcywgZWxzZSAxICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJJTyAoUmV2MikgSVNBICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX0lTQTJfSURFTlQJIkpCSkdQR0dISU5TTUpQSlIiCisKKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCisjZGVmaW5lCVJJT19JU0EyX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX0lOVEVOQUJMRQkweDA0CQkvKiBJbnRlcnJ1cHQgZW5hYmxlLCBlbHNlIGRpc2FibGUgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHXzE2QklUCTB4MDgJCS8qIDE2Yml0IG1vZGUsIGVsc2UgOGJpdCAqLworI2RlZmluZQlSSU9fSVNBMl9DRkdfSVJRTUFTSwkweDMwCQkvKiBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZQkgIFJJT19JU0EyX0NGR19JUlExNQkweDAwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTUgKi8KKyNkZWZpbmUJICBSSU9fSVNBMl9DRkdfSVJRMTIJMHgxMAkJLyogSW50ZXJydXB0IExldmVsIDEyICovCisjZGVmaW5lCSAgUklPX0lTQTJfQ0ZHX0lSUTExCTB4MjAJCS8qIEludGVycnVwdCBMZXZlbCAxMSAqLworI2RlZmluZQkgIFJJT19JU0EyX0NGR19JUlE5CTB4MzAJCS8qIEludGVycnVwdCBMZXZlbCA5ICovCisjZGVmaW5lCVJJT19JU0EyX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19JU0EyX0NGR19XQUlUU1RBVEUwCTB4ODAJCS8qIDAgd2FpdHN0YXRlcywgZWxzZSAxICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJJTyAoSmV0KSBJU0EgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX0lTQTNfSURFTlQJIkpFVCBIT1NUIEJZIEtFViMiCisKKyNkZWZpbmUJUklPX0lTQTNfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fSVNBM19DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworI2RlZmluZQlSSU9fSVNBMzJfQ0ZHX0lSUU1BU0sJMHhGMzAJCS8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lCSAgUklPX0lTQTNfQ0ZHX0lSUTE1CTB4RjAJCS8qIEludGVycnVwdCBMZXZlbCAxNSAqLworI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlExMgkweEMwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTIgKi8KKyNkZWZpbmUJICBSSU9fSVNBM19DRkdfSVJRMTEJMHhCMAkJLyogSW50ZXJydXB0IExldmVsIDExICovCisjZGVmaW5lCSAgUklPX0lTQTNfQ0ZHX0lSUTEwCTB4QTAJCS8qIEludGVycnVwdCBMZXZlbCAxMCAqLworI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlE5CTB4OTAJCS8qIEludGVycnVwdCBMZXZlbCA5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBSSU8gTUNBICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUklPX01DQV9JREVOVAkiSkJKR1BHR0hJTlNNSlBKUiIKKworI2RlZmluZQlSSU9fTUNBX0NGR19CT09UUkFNCTB4MDEJCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLworI2RlZmluZQlSSU9fTUNBX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX01DQV9DRkdfTElOSzIwCTB4NDAJCS8qIDIwTWJwcyBsaW5rLCBlbHNlIDEwTWJwcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBSSU8gRUlTQSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFSVNBIENvbmZpZ3VyYXRpb24gU3BhY2UgRGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJRUlTQV9QUk9EVUNUX0lEMQkweEM4MAorI2RlZmluZQlFSVNBX1BST0RVQ1RfSUQyCTB4QzgxCisjZGVmaW5lCUVJU0FfUFJPRFVDVF9OVU1CRVIJMHhDODIKKyNkZWZpbmUJRUlTQV9SRVZJU0lPTl9OVU1CRVIJMHhDODMKKyNkZWZpbmUJRUlTQV9DQVJEX0VOQUJMRQkweEM4NAorI2RlZmluZQlFSVNBX1ZQRF9VTklRVUVJRDQJMHhDODgJCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICM0ICovCisjZGVmaW5lCUVJU0FfVlBEX1VOSVFVRUlEMwkweEM4QQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzMgKi8KKyNkZWZpbmUJRUlTQV9WUERfVU5JUVVFSUQyCTB4QzkwCQkvKiBSRUFEOiBVbmlxdWUgSWRlbnRpZmllciAjMiAqLworI2RlZmluZQlFSVNBX1ZQRF9VTklRVUVJRDEJMHhDOTIJCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICMxICovCisjZGVmaW5lCUVJU0FfVlBEX01BTlVfWUVBUgkweEM5OAkJLyogUkVBRDogWWVhciBPZiBNYW51ZmFjdHVyZSAoMCA9IDE5NzApICovCisjZGVmaW5lCUVJU0FfVlBEX01BTlVfV0VFSwkweEM5QQkJLyogUkVBRDogV2VlayBPZiBNYW51ZmFjdHVyZSAoMCA9IHdlZWsgMSBKYW4pICovCisjZGVmaW5lCUVJU0FfTUVNX0FERFJfMjNfMTYJMHhDMDAKKyNkZWZpbmUJRUlTQV9NRU1fQUREUl8zMV8yNAkweEMwMQorI2RlZmluZQlFSVNBX1JJT19DT05GSUcJCTB4QzAyCQkvKiBXUklURTogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlFSVNBX1JJT19JTlRTRVQJCTB4QzAzCQkvKiBXUklURTogSW50ZXJydXB0IFNldCAqLworI2RlZmluZQlFSVNBX1JJT19JTlRSRVNFVAkweEMwMwkJLyogUkVBRDogIEludGVycnVwdCBSZXNldCAqLworCisvKiBDb250cm9sIFJlZ2lzdGVyIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJJT19FSVNBX0NGR19CT09UUkFNCTB4MDEJCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLworI2RlZmluZQlSSU9fRUlTQV9DRkdfTElOSzIwCTB4MDIJCS8qIDIwTWJwcyBsaW5rLCBlbHNlIDEwTWJwcyAqLworI2RlZmluZQlSSU9fRUlTQV9DRkdfQlVTRU5BQkxFCTB4MDQJCS8qIEVuYWJsZSBwcm9jZXNzb3IgYnVzICovCisjZGVmaW5lCVJJT19FSVNBX0NGR19QUk9DUlVOCTB4MDgJCS8qIFByb2Nlc3NvciBydW5uaW5nLCBlbHNlIHJlc2V0ICovCisjZGVmaW5lCVJJT19FSVNBX0NGR19JUlFNQVNLCTB4RjAJCS8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTE1CTB4RjAJCS8qIEludGVycnVwdCBMZXZlbCAxNSAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlExNAkweEUwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTQgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRMTIJMHhDMAkJLyogSW50ZXJydXB0IExldmVsIDEyICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTExCTB4QjAJCS8qIEludGVycnVwdCBMZXZlbCAxMSAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlExMAkweEEwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTAgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJROQkweDkwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgOSAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE3CTB4NzAJCS8qIEludGVycnVwdCBMZXZlbCA3ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTYJMHg2MAkJLyogSW50ZXJydXB0IExldmVsIDYgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRNQkweDUwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNSAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE0CTB4NDAJCS8qIEludGVycnVwdCBMZXZlbCA0ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTMJMHgzMAkJLyogSW50ZXJydXB0IExldmVsIDMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUklPIFNCdXMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fU0JVU19JREVOVAkiSkJQR0sjXDBcMFwwXDBcMFwwXDBcMFwwXDAiCisKKyNkZWZpbmUJUklPX1NCVVNfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCisjZGVmaW5lCVJJT19TQlVTX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX1NCVVNfQ0ZHX0lOVEVOQUJMRQkweDA0CQkvKiBJbnRlcnJ1cHQgZW5hYmxlLCBlbHNlIGRpc2FibGUgKi8KKyNkZWZpbmUJUklPX1NCVVNfQ0ZHX0lSUU1BU0sJMHgzOAkJLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRTk9ORQkweDAwCQkvKiBObyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRNwkweDM4CQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNyAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlE2CTB4MzAJCS8qIEludGVycnVwdCBMZXZlbCA2ICovCisjZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTUJMHgyOAkJLyogSW50ZXJydXB0IExldmVsIDUgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRNAkweDIwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNCAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlEzCTB4MTgJCS8qIEludGVycnVwdCBMZXZlbCAzICovCisjZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTIJMHgxMAkJLyogSW50ZXJydXB0IExldmVsIDIgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRMQkweDA4CQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMSAqLworI2RlZmluZQlSSU9fU0JVU19DRkdfTElOSzIwCTB4NDAJCS8qIDIwTWJwcyBsaW5rLCBlbHNlIDEwTWJwcyAqLworI2RlZmluZQlSSU9fU0JVU19DRkdfUFJPQzI1CTB4ODAJCS8qIDI1TWh6IHByb2Nlc3NvciBjbG9jaywgZWxzZSAyME1oeiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUklPIFBDSSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb250cm9sIFJlZ2lzdGVyIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJJT19QQ0lfSURFTlQJIkVDRERQR0pHSkhKUkdTSyMiCisKKyNkZWZpbmUJUklPX1BDSV9DRkdfQk9PVFJBTQkweDAxCQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KKyNkZWZpbmUJUklPX1BDSV9DRkdfQlVTRU5BQkxFCTB4MDIJCS8qIEVuYWJsZSBwcm9jZXNzb3IgYnVzICovCisjZGVmaW5lCVJJT19QQ0lfQ0ZHX0lOVEVOQUJMRQkweDA0CQkvKiBJbnRlcnJ1cHQgZW5hYmxlLCBlbHNlIGRpc2FibGUgKi8KKyNkZWZpbmUJUklPX1BDSV9DRkdfTElOSzIwCTB4NDAJCS8qIDIwTWJwcyBsaW5rLCBlbHNlIDEwTWJwcyAqLworI2RlZmluZQlSSU9fUENJX0NGR19QUk9DMjUJMHg4MAkJLyogMjVNaHogcHJvY2Vzc29yIGNsb2NrLCBlbHNlIDIwTWh6ICovCisKKy8qIFBDSSBEZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlTUFhfVkVORE9SX0lECQkweDExQ0IJCS8qIEFzc2lnbmVkIGJ5IHRoZSBQQ0kgU0lHICovCisjZGVmaW5lCVNQWF9ERVZJQ0VfSUQJCTB4ODAwMAkJLyogUklPIGJyaWRnZSBib2FyZHMgKi8KKyNkZWZpbmUJU1BYX1BMWERFVklDRV9JRAkweDIwMDAJCS8qIFBMWCBicmlkZ2UgYm9hcmRzICovCisjZGVmaW5lCVNQWF9TVUJfVkVORE9SX0lECVNQWF9WRU5ET1JfSUQJLyogU2FtZSBhcyB2ZW5kb3IgaWQgKi8KKyNkZWZpbmUJUklPX1NVQl9TWVNfSUQJCTB4MDgwMAkJLyogUklPIFBDSSBib2FyZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBSSU8gKEpldCkgUENJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb250cm9sIFJlZ2lzdGVyIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJJT19QQ0kyX0lERU5UCSJKRVQgSE9TVCBCWSBLRVYjIgorCisjZGVmaW5lCVJJT19QQ0kyX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX1BDSTJfQ0ZHX0lOVEVOQUJMRQkweDA0CQkvKiBJbnRlcnJ1cHQgZW5hYmxlLCBlbHNlIGRpc2FibGUgKi8KKworLyogUENJIERlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJJTzJfU1VCX1NZU19JRAkJMHgwMTAwCQkvKiBSSU8gKEpldCkgUENJIGJvYXJkICovCisKKyNlbmRpZgkJCQkJCS8qX3Jpb2JvYXJkX2ggKi8KKworLyogRW5kIG9mIFJJT0JPQVJELkggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvYm9vdC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9ib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiZTExZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvYm9vdC5jCkBAIC0wLDAgKzEsMTM2MCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvYm9vdC5jCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMDozMzozNgorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMDozMzo0OAorKioKKyoqICBpZGVudCBAKCMpcmlvYm9vdC5jCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvYm9vdF9jX3NjY3NfID0gIkAoIylyaW9ib290LmMJMS4zIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKworCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKworc3RhdGljIGludCBSSU9Cb290Q29tcGxldGUoIHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IEhvc3QgKkhvc3RQLCB1aW50IFJ1cCwgc3RydWN0IFBrdENtZCAqUGt0Q21kUCApOworCitzdGF0aWMgdWNoYXIKK1JJT0F0VmVjMkN0cmxbXSA9Cit7CisJLyogMCAqLyAgSU5URVJSVVBUX0RJU0FCTEUsCisJLyogMSAqLyAgSU5URVJSVVBUX0RJU0FCTEUsCisJLyogMiAqLyAgSU5URVJSVVBUX0RJU0FCTEUsCisJLyogMyAqLyAgSU5URVJSVVBUX0RJU0FCTEUsCisJLyogNCAqLyAgSU5URVJSVVBUX0RJU0FCTEUsCisJLyogNSAqLyAgSU5URVJSVVBUX0RJU0FCTEUsCisJLyogNiAqLyAgSU5URVJSVVBUX0RJU0FCTEUsCisJLyogNyAqLyAgSU5URVJSVVBUX0RJU0FCTEUsCisJLyogOCAqLyAgSU5URVJSVVBUX0RJU0FCTEUsCisJLyogOSAqLyAgSVJRXzl8SU5URVJSVVBUX0VOQUJMRSwKKwkvKiAxMCAqLyBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiAxMSAqLyBJUlFfMTF8SU5URVJSVVBUX0VOQUJMRSwKKwkvKiAxMiAqLyBJUlFfMTJ8SU5URVJSVVBUX0VOQUJMRSwKKwkvKiAxMyAqLyBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiAxNCAqLyBJTlRFUlJVUFRfRElTQUJMRSwKKwkvKiAxNSAqLyBJUlFfMTV8SU5URVJSVVBUX0VOQUJMRQorfTsKKworLyoKKyoqIExvYWQgaW4gdGhlIFJUQSBib290IGNvZGUuCisqLworaW50CitSSU9Cb290Q29kZVJUQShwLCByYnApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IERvd25Mb2FkICoJcmJwOyAKK3sKKwlpbnQgb2Zmc2V0OworCisJZnVuY19lbnRlciAoKTsKKworCS8qIExpbnV4IGRvZXNuJ3QgYWxsb3cgeW91IHRvIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgYQorCSAgICJjb3B5aW4iLiAoQ3Jhc2ggd2hlbiBhIHBhZ2VmYXVsdCBvY2N1cnMpLiAqLworCS8qIGRpc2FibGUob2xkc3BsKTsgKi8KKwkKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJEYXRhIGF0IHVzZXIgYWRkcmVzcyAweCV4XG4iLChpbnQpcmJwLT5EYXRhUCk7CisKKwkvKgorCSoqIENoZWNrIHRoYXQgd2UgaGF2ZSBzZXQgYXNzaWRlIGVub3VnaCBtZW1vcnkgZm9yIHRoaXMKKwkqLworCWlmICggcmJwLT5Db3VudCA+IFNJWFRZX0ZPVVJfSyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUlRBIEJvb3QgQ29kZSBUb28gTGFyZ2UhXG4iKTsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX0ZJTEVfVE9PX0xBUkdFOworCQkvKiByZXN0b3JlKG9sZHNwbCk7ICovCisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCBwLT5SSU9Cb290aW5nICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSVEEgQm9vdCBDb2RlIDogQlVTWSBCVVNZIEJVU1khXG4iKTsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBCT09UX0lOX1BST0dSRVNTOworCQkvKiByZXN0b3JlKG9sZHNwbCk7ICovCisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKgorCSoqIFRoZSBkYXRhIHdlIGxvYWQgaW4gbXVzdCBlbmQgb24gYSAoUlRBX0JPT1RfREFUQV9TSVpFKSBieXRlIGJvdW5kYXJ5LAorCSoqIHNvIGNhbGN1bGF0ZSBob3cgZmFyIHdlIGhhdmUgdG8gbW92ZSB0aGUgZGF0YSB1cCB0aGUgYnVmZmVyCisJKiogdG8gYWNoaWV2ZSB0aGlzLgorCSovCisJb2Zmc2V0ID0gKFJUQV9CT09UX0RBVEFfU0laRSAtIChyYnAtPkNvdW50ICUgUlRBX0JPT1RfREFUQV9TSVpFKSkgJSAKKwkJCQkJCQlSVEFfQk9PVF9EQVRBX1NJWkU7CisKKwkvKgorCSoqIEJlIGNsZWFuLCBhbmQgY2xlYXIgdGhlICd1bnVzZWQnIHBvcnRpb24gb2YgdGhlIGJvb3QgYnVmZmVyLAorCSoqIGJlY2F1c2UgaXQgd2lsbCAoZXZlbnR1YWxseSkgYmUgcGFydCBvZiB0aGUgUnRhIHJ1biB0aW1lIGVudmlyb25tZW50CisJKiogYW5kIHNvIHNob3VsZCBiZSB6ZXJvZWQuCisJKi8KKwliemVybyggKGNhZGRyX3QpcC0+UklPQm9vdFBhY2tldHMsIG9mZnNldCApOworCisJLyoKKwkqKiBDb3B5IHRoZSBkYXRhIGZyb20gdXNlciBzcGFjZS4KKwkqLworCisJaWYgKCBjb3B5aW4oKGludClyYnAtPkRhdGFQLCgoY2FkZHJfdCkocC0+UklPQm9vdFBhY2tldHMpKStvZmZzZXQsCisJCQkJcmJwLT5Db3VudCkgPT1DT1BZRkFJTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQmFkIGRhdGEgY29weSBmcm9tIHVzZXIgc3BhY2VcbiIpOworCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCS8qIHJlc3RvcmUob2xkc3BsKTsgKi8KKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKgorCSoqIE1ha2Ugc3VyZSB0aGF0IG91ciBjb3B5IG9mIHRoZSBzaXplIGluY2x1ZGVzIHRoYXQgb2Zmc2V0IHdlIGRpc2N1c3NlZAorCSoqIGVhcmxpZXIuCisJKi8KKwlwLT5SSU9OdW1Cb290UGt0cyA9IChyYnAtPkNvdW50K29mZnNldCkvUlRBX0JPT1RfREFUQV9TSVpFOworCXAtPlJJT0Jvb3RDb3VudCAgID0gcmJwLT5Db3VudDsKKworCS8qIHJlc3RvcmUob2xkc3BsKTsgKi8KKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByaW9fc3RhcnRfY2FyZF9ydW5uaW5nIChzdHJ1Y3QgSG9zdCAqIEhvc3RQKQoreworCWZ1bmNfZW50ZXIgKCk7CisKKwlzd2l0Y2ggKCBIb3N0UC0+VHlwZSApIHsKKwljYXNlIFJJT19BVDoKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiU3RhcnQgSVNBIGNhcmQgcnVubmluZ1xuIik7CisJCVdCWVRFKEhvc3RQLT5Db250cm9sLCAKKwkJICAgICAgQk9PVF9GUk9NX1JBTSB8IEVYVEVSTkFMX0JVU19PTgorCQkgICAgICB8IEhvc3RQLT5Nb2RlCisJCSAgICAgIHwgUklPQXRWZWMyQ3RybFtIb3N0UC0+SXZlYyAmIDB4Rl0gKTsKKwkJYnJlYWs7CisJCQorI2lmZGVmIEZVVFVSRV9SRUxFQVNFCisJY2FzZSBSSU9fTUNBOgorCQkJCS8qCisJCQkJKiogTUNBIGhhbmRsZXMgSVJRIHZlY3RvcnMgZGlmZmVyZW50bHksIHNvIHdlIGRvbid0IHdyaXRlIAorCQkJCSoqIHRoZW0gdG8gdGhpcyByZWdpc3Rlci4KKwkJCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJTdGFydCBNQ0EgY2FyZCBydW5uaW5nXG4iKTsKKwkJV0JZVEUoSG9zdFAtPkNvbnRyb2wsIE1jYVRwQm9vdEZyb21SYW0gfCBNY2FUcEJ1c0VuYWJsZSB8IEhvc3RQLT5Nb2RlKTsKKwkJYnJlYWs7CisKKwljYXNlIFJJT19FSVNBOgorCQkJCS8qCisJCQkJKiogRUlTQSBpcyB0b3RhbGx5IGRpZmZlcmVudCBhbmQgZXhwZWN0cyBPVVRCWnMgdG8gdHVybiBpdCBvbi4KKwkJCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJTdGFydCBFSVNBIGNhcmQgcnVubmluZ1xuIik7CisJCU9VVEJaKCBIb3N0UC0+U2xvdCwgRUlTQV9DT05UUk9MX1BPUlQsIEhvc3RQLT5Nb2RlIHwgUklPRWlzYVZlYzJDdHJsW0hvc3RQLT5JdmVjXSB8IEVJU0FfVFBfUlVOIHwgRUlTQV9UUF9CVVNfRU5BQkxFIHwgRUlTQV9UUF9CT09UX0ZST01fUkFNICk7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIFJJT19QQ0k6CisJCQkJLyoKKwkJCQkqKiBQQ0kgaXMgbXVjaCB0aGUgc2FtZSBhcyBNQ0EuIEV2ZXJ5dGhpbmcgaXMgb25jZSBhZ2FpbiBtZW1vcnkKKwkJCQkqKiBtYXBwZWQsIHNvIHdlIGFyZSB3cml0aW5nIHRvIG1lbW9yeSByZWdpc3RlcnMgaW5zdGVhZCBvZiBpbworCQkJCSoqIHBvcnRzLgorCQkJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlN0YXJ0IFBDSSBjYXJkIHJ1bm5pbmdcbiIpOworCQlXQllURShIb3N0UC0+Q29udHJvbCwgUENJVHBCb290RnJvbVJhbSB8IFBDSVRwQnVzRW5hYmxlIHwgSG9zdFAtPk1vZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJVbmtub3duIGhvc3QgdHlwZSAlZFxuIiwgSG9zdFAtPlR5cGUpOworCQlicmVhazsKKwl9CisvKiAKKwlwcmludGsgKEtFUk5fSU5GTyAiRG9uZSB3aXRoIHN0YXJ0aW5nIHRoZSBjYXJkXG4iKTsKKwlmdW5jX2V4aXQgKCk7CisqLworCXJldHVybjsKK30KKworLyoKKyoqIExvYWQgaW4gdGhlIGhvc3QgYm9vdCBjb2RlIC0gbG9hZCBpdCBkaXJlY3RseSBvbnRvIGFsbCBoYWx0ZWQgaG9zdHMKKyoqIG9mIHRoZSBjb3JyZWN0IHR5cGUuCisqKgorKiogUHV0IHlvdXIgcnViYmVyIHBhbnRzIG9uIGJlZm9yZSBtZXNzaW5nIHdpdGggdGhpcyBjb2RlIC0gZXZlbiB0aGUgbWFnaWMKKyoqIG51bWJlcnMgaGF2ZSB0cm91YmxlIHVuZGVyc3RhbmRpbmcgd2hhdCB0aGV5IGFyZSBkb2luZyBoZXJlLgorKi8KK2ludAorUklPQm9vdENvZGVIT1NUKHAsIHJicCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CityZWdpc3RlciBzdHJ1Y3QgRG93bkxvYWQgKnJicDsKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgSG9zdCAqSG9zdFA7CisJcmVnaXN0ZXIgY2FkZHJfdCBDYWQ7CisJcmVnaXN0ZXIgUEFSTV9NQVAgKlBhcm1NYXBQOworCXJlZ2lzdGVyIGludCBSdXBOOworCWludCBQb3J0TjsKKwl1aW50IGhvc3Q7CisJY2FkZHJfdCBTdGFydFA7CisJQllURSAqRGVzdFA7CisJaW50IHdhaXRfY291bnQ7CisJdXNob3J0IE9sZFBhcm1NYXA7CisJdXNob3J0IG9mZnNldDsJLyogSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGlzIGlzIGEgdXNob3J0ICovCisJLyogdWludCBieXRlOyAqLworCWNhZGRyX3QgRG93bkNvZGUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlIb3N0UCA9IE5VTEw7IC8qIEFzc3VyZSB0aGUgY29tcGlsZXIgd2UndmUgaW5pdGlhbGl6ZWQgaXQgKi8KKwlmb3IgKCBob3N0PTA7IGhvc3Q8cC0+UklPTnVtSG9zdHM7IGhvc3QrKyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQXR0ZW1wdCB0byBib290IGhvc3QgJWRcbiIsaG9zdCk7CisJCUhvc3RQID0gJnAtPlJJT0hvc3RzW2hvc3RdOworCQkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAgIkhvc3QgVHlwZSA9IDB4JXgsIE1vZGUgPSAweCV4LCBJVmVjID0gMHgleFxuIiwKKwkJICAgIEhvc3RQLT5UeXBlLCBIb3N0UC0+TW9kZSwgSG9zdFAtPkl2ZWMpOworCisKKwkJaWYgKCAoSG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19XQUlUSU5HICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiJXMgJWQgYWxyZWFkeSBydW5uaW5nXG4iLCJIb3N0Iixob3N0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJKiogR3JhYiBhIDMyIGJpdCBwb2ludGVyIHRvIHRoZSBjYXJkLgorCQkqLworCQlDYWQgPSBIb3N0UC0+Q2FkZHI7CisKKwkJLyoKKwkJKiogV2UgYXJlIGdvaW5nIHRvICh0cnkpIGFuZCBsb2FkIGluIHJicC0+Q291bnQgYnl0ZXMuCisJCSoqIFRoZSBsYXN0IGJ5dGUgd2lsbCByZXNpZGUgYXQgcC0+UklPQ29uZi5Ib3N0TG9hZEJhc2UtMTsKKwkJKiogVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIHN0YXJ0IGNvcHlpbmcgYXQgYWRkcmVzcworCQkqKiAoY2FkZHIrcC0+UklPQ29uZi5Ib3N0TG9hZEJhc2UtcmJwLT5Db3VudCkKKwkJKi8KKwkJU3RhcnRQID0gKGNhZGRyX3QpJkNhZFtwLT5SSU9Db25mLkhvc3RMb2FkQmFzZS1yYnAtPkNvdW50XTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJrZXJuZWwgdmlydHVhbCBhZGRyZXNzIGZvciBob3N0IGlzIDB4JXhcbiIsIChpbnQpQ2FkICk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgImtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgZm9yIGRvd25sb2FkIGlzIDB4JXhcbiIsIChpbnQpU3RhcnRQKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiaG9zdCBsb2FkYmFzZSBpcyAweCV4XG4iLHAtPlJJT0NvbmYuSG9zdExvYWRCYXNlKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAic2l6ZSBvZiBkb3dubG9hZCBpcyAweCV4XG4iLCByYnAtPkNvdW50KTsKKworCQlpZiAoIHAtPlJJT0NvbmYuSG9zdExvYWRCYXNlIDwgcmJwLT5Db3VudCApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkJpbiB0b28gbGFyZ2VcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX0ZJTEVfVE9PX0xBUkdFOworCQkJZnVuY19leGl0ICgpOworCQkJcmV0dXJuIC1FRkJJRzsKKwkJfQorCQkvKgorCQkqKiBFbnN1cmUgdGhhdCB0aGUgaG9zdCByZWFsbHkgaXMgc3RvcHBlZC4KKwkJKiogRGlzYWJsZSBpdCdzIGV4dGVybmFsIGJ1cyAmIHR3YW5nIGl0cyByZXNldCBsaW5lLgorCQkqLworCQlSSU9Ib3N0UmVzZXQoIEhvc3RQLT5UeXBlLCAoc3RydWN0IERwUmFtICopSG9zdFAtPkNhcmRQLCBIb3N0UC0+U2xvdCApOworCisJCS8qCisJCSoqIENvcHkgdGhlIGRhdGEgZGlyZWN0bHkgZnJvbSB1c2VyIHNwYWNlIHRvIHRoZSBTUkFNLgorCQkqKiBUaGlzIGFpbid0IGdvaW5nIHRvIGJlIG5vbmUgdG9vIGNsZXZlciBpZiB0aGUgZG93bmxvYWQKKwkJKiogY29kZSBpcyBiaWdnZXIgdGhhbiB0aGlzIHNlZ21lbnQuCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkNvcHkgaW4gY29kZVxuIik7CisKKwkJLyoKKwkJKiogUENJIGhvc3RjYXJkIGNhbid0IGNvcGUgd2l0aCAzMiBiaXQgYWNjZXNzZXMgYW5kIHNvIG5lZWQgdG8gY29weSAKKwkJKiogZGF0YSB0byBhIGxvY2FsIGJ1ZmZlciwgYW5kIHRoZW4gZHJpcGZlZWQgdGhlIGNhcmQuCisJCSovCisJCWlmICggSG9zdFAtPlR5cGUgPT0gUklPX1BDSSApIHsKKwkJICAvKiBpbnQgb2Zmc2V0OyAqLworCisJCQlEb3duQ29kZSA9IHN5c2JyayhyYnAtPkNvdW50KTsKKwkJCWlmICggIURvd25Db2RlICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIk5vIHN5c3RlbSBtZW1vcnkgYXZhaWxhYmxlXG4iKTsKKwkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9FTk9VR0hfQ09SRV9GT1JfUENJX0NPUFk7CisJCQkJZnVuY19leGl0ICgpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnplcm8oRG93bkNvZGUsIHJicC0+Q291bnQpOworCisJCQlpZiAoIGNvcHlpbigoaW50KXJicC0+RGF0YVAsRG93bkNvZGUscmJwLT5Db3VudCk9PUNPUFlGQUlMICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkJhZCBjb3B5aW4gb2YgaG9zdCBkYXRhXG4iKTsKKwkJCQlzeXNmcmVlKCBEb3duQ29kZSwgcmJwLT5Db3VudCApOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQlmdW5jX2V4aXQgKCk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCUhvc3RQLT5Db3B5KCBEb3duQ29kZSwgU3RhcnRQLCByYnAtPkNvdW50ICk7CisKKwkJCXN5c2ZyZWUoIERvd25Db2RlLCByYnAtPkNvdW50ICk7CisJCX0KKwkJZWxzZSBpZiAoIGNvcHlpbigoaW50KXJicC0+RGF0YVAsU3RhcnRQLHJicC0+Q291bnQpPT1DT1BZRkFJTCApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkJhZCBjb3B5aW4gb2YgaG9zdCBkYXRhXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCWZ1bmNfZXhpdCAoKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQ29weSBjb21wbGV0ZWRcbiIpOworCisJCS8qCisJCSoqCQkJUyBUIE8gUCAhCisJCSoqCisJCSoqIFVwdG8gdGhpcyBwb2ludCB0aGUgY29kZSBoYXMgYmVlbiBmYWlybHkgcmF0aW9uYWwsIGFuZCBwb3NzaWJseQorCQkqKiBldmVuIHN0cmFpZ2h0IGZvcndhcmQuIFdoYXQgZm9sbG93cyBpcyBhIHBpbGUgb2YgY3J1ZCB0aGF0IHdpbGwKKwkJKiogbWFnaWNhbGx5IHR1cm4gaW50byBzaXggYnl0ZXMgb2YgdHJhbnNwdXRlciBhc3NlbWJsZXIuIE5vcm1hbGx5CisJCSoqIHlvdSB3b3VsZCBleHBlY3QgYW4gYXJyYXkgb3Igc29tZXRoaW5nLCBidXQsIGJlaW5nIG1lLCBJIGhhdmUKKwkJKiogY2hvc2VuIFtiZWVuIHRvbGRdIHRvIHVzZSBhIHRlY2huaXF1ZSB3aGVyZWJ5IHRoZSBzdGFydHVwIGNvZGUKKwkJKiogd2lsbCBiZSBjb3JyZWN0IGlmIHdlIGNoYW5nZSB0aGUgbG9hZGJhc2UgZm9yIHRoZSBjb2RlLiBXaGljaAorCQkqKiBicmluZ3MgdXMgb250byBhbm90aGVyIGlzc3VlIC0gdGhlIGxvYWRiYXNlIGlzIHRoZSAqZW5kKiBvZiB0aGUKKwkJKiogY29kZSwgbm90IHRoZSBzdGFydC4KKwkJKioKKwkJKiogSWYgSSB3ZXJlIHlvdSBJIHdvdWxkbid0IHN0YXJ0IGZyb20gaGVyZS4KKwkJKi8KKworCQkvKgorCQkqKiBXZSBub3cgbmVlZCB0byBpbnNlcnQgYSBzaG9ydCBib290IHNlY3Rpb24gaW50bworCQkqKiB0aGUgbWVtb3J5IGF0IHRoZSBlbmQgb2YgU3JhbTIuIFRoaXMgaXMgbm9ybWFsbHkgKGRlKWNvbXBvc2VkCisJCSoqIG9mIHRoZSBsYXN0IGVpZ2h0IGJ5dGVzIG9mIHRoZSBkb3dubG9hZCBjb2RlLiBUaGUKKwkJKiogZG93bmxvYWQgaGFzIGJlZW4gYXNzZW1ibGVkL2NvbXBpbGVkIHRvIGV4cGVjdCB0byBiZQorCQkqKiBsb2FkZWQgZnJvbSAweDdGRkYgZG93bndhcmRzLiBXZSBoYXZlIGxvYWRlZCBpdAorCQkqKiBhdCBzb21lIG90aGVyIGFkZHJlc3MuIFRoZSBzdGFydHVwIGNvZGUgZ29lcyBpbnRvIHRoZSBzbWFsbAorCQkqKiByYW0gd2luZG93IGF0IFNyYW0yLCBpbiB0aGUgbGFzdCA4IGJ5dGVzLCB3aGljaCBhcmUgcmVhbGx5CisJCSoqIGF0IGFkZHJlc3NlcyAweDdGRjgtMHg3RkZGLgorCQkqKgorCQkqKiBJZiB0aGUgbG9hZGJhc2UgaXMsIHNheSwgMHg3QzAwLCB0aGVuIHdlIG5lZWQgdG8gYnJhbmNoIHRvCisJCSoqIGFkZHJlc3MgMHg3QkZFIHRvIHJ1biB0aGUgaG9zdC5iaW4gc3RhcnR1cCBjb2RlLiBXZSBhc3NlbWJsZQorCQkqKiB0aGlzIGp1bXAgbWFudWFsbHkuCisJCSoqCisJCSoqIFRoZSB0d28gYnl0ZSBzZXF1ZW5jZSA2MCAwOCBpcyBsb2FkZWQgaW50byBtZW1vcnkgYXQgYWRkcmVzcworCQkqKiAweDdGRkUsRi4gVGhpcyBpcyBhIGxvY2FsIGJyYW5jaCB0byBsb2NhdGlvbiAweDdGRjggKDYwIGlzIG5maXggMCwKKwkJKiogd2hpY2ggYWRkcyAnMCcgdG8gdGhlIC5PIHJlZ2lzdGVyLCBjb21wbGVtZW50cyAuTywgYW5kIHRoZW4gc2hpZnRzCisJCSoqIGl0IGxlZnQgYnkgNCBiaXQgcG9zaXRpb25zLCAwOCBpcyBhIGp1bXAgLk8rOCBpbnN0cnVjdGlvbi4gVGhpcyB3aWxsCisJCSoqIGFkZCA4IHRvIC5PICh3aGljaCB3YXMgMHhGRkYwKSwgYW5kIHdpbGwgYnJhbmNoIFJFTEFUSVZFIHRvIHRoZSBuZXcKKwkJKiogbG9jYXRpb24uIE5vdywgdGhlIGJyYW5jaCBzdGFydHMgZnJvbSB0aGUgdmFsdWUgb2YgLlBDIChvciAuSVAgb3IKKwkJKiogd2hhdGV2ZXIgdGhlIGJsb29keSByZWdpc3RlciBpcyBjYWxsZWQgb24gdGhpcyBjaGlwKSwgYW5kIHRoZSAuUEMKKwkJKiogd2lsbCBiZSBwb2ludGluZyB0byB0aGUgbG9jYXRpb24gQUZURVIgdGhlIGJyYW5jaCwgaW4gdGhpcyBjYXNlCisJCSoqIC5QQyA9PSAweDgwMDAsIHNvIHRoZSBicmFuY2ggd2lsbCBiZSB0byAweDgwMDArMHhGRkY4ID0gMHg3RkY4LgorCQkqKgorCQkqKiBBIGxvbmcgYnJhbmNoIGlzIGNvZGVkIGF0IDB4N0ZGOC4gVGhpcyBjb25zaXN0cyBvZiBsb2FkaW5nIGEgZm91cgorCQkqKiBieXRlIG9mZnNldCBpbnRvIC5PIHVzaW5nIG5maXggKGFzIGFib3ZlKSBhbmQgcGZpeCBvcGVyYXRvcnMuIFRoZQorCQkqKiBwZml4IG9wZXJhdGVzIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIHRoZSBuZml4IG9wZXJhdG9yLCBidXQKKwkJKiogd2l0aG91dCB0aGUgY29tcGxlbWVudCBvcGVyYXRpb24uIFRoZSBvZmZzZXQsIG9mIGNvdXJzZSwgbXVzdCBiZQorCQkqKiByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgYnl0ZSBBRlRFUiB0aGUgYnJhbmNoIGluc3RydWN0aW9uLAorCQkqKiB3aGljaCB3aWxsIGJlICh1cm0pIDB4N0ZGQywgc28sIG91ciBmaW5hbCBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoCisJCSoqIChsb2FkYmFzZS0yKSwgaGFzIHRvIGJlIHJlYWNoZWQgZnJvbSBoZXJlLiBJbWFnaW5lIHRoYXQgdGhlIGxvYWRiYXNlCisJCSoqIGlzIDB4N0MwMCAod2hpY2ggaXQgaXMpLCB0aGVuIHdlIHdpbGwgbmVlZCB0byBicmFuY2ggdG8gMHg3QkZFICh3aGljaAorCQkqKiBpcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgaW5pdGlhbCB0d28gYnl0ZSBzaG9ydCBsb2NhbCBicmFuY2ggb2YgdGhlCisJCSoqIGRvd25sb2FkIGNvZGUpLgorCQkqKgorCQkqKiBUbyBjb2RlIGEganVtcCBmcm9tIDB4N0ZGQyAod2hpY2ggaXMgd2hlcmUgdGhlIGJyYW5jaCB3aWxsIHN0YXJ0CisJCSoqIGZyb20pIHRvIDB4N0JGRSwgd2Ugd2lsbCBuZWVkIHRvIGJyYW5jaCAweEZDMDIgYnl0ZXMgKDB4N0ZGQysweEZDMDIpPQorCQkqKiAweDdCRkUuCisJCSoqIFRoaXMgd2lsbCBiZSBjb2RlZCBhcyBmb3VyIGJ5dGVzOgorCQkqKiA2MCAyQyAyMCAwMgorCQkqKiBiZWluZyBuZml4IC5PKzAKKwkJKioJICAgcGZpeCAuTytDCisJCSoqCSAgIHBmaXggLk8rMAorCQkqKgkgICBqdW1wIC5PKzIKKwkJKioKKwkJKiogVGhlIG5maXggb3BlcmF0b3IgaXMgdXNlZCwgc28gdGhhdCB0aGUgc3RhcnR1cCBjb2RlIHdpbGwgYmUKKwkJKiogY29tcGF0aWJsZSB3aXRoIHRoZSB3aG9sZSBUcCBmYW1pbHkuIChsaWVzLCBkYW1uIGxpZXMsIGl0J2xsIG5ldmVyCisJCSoqIHdvcmsgaW4gYSBtb250aCBvZiBTdW5kYXlzKS4KKwkJKioKKwkJKiogVGhlIG5maXggbnlibGUgaXMgdGhlIDFzIGNvbXBsZW1lbnQgb2YgdGhlIG55YmxlIHZhbHVlIHlvdQorCQkqKiB3YW50IHRvIGxvYWQgLSBpbiB0aGlzIGNhc2Ugd2Ugd2FudGVkICdGJyBzbyB3ZSBuZml4IGxvYWRlZCAnMCcuCisJCSovCisKKworCQkvKgorCQkqKiBEZXN0IHBvaW50cyB0byB0aGUgdG9wIDggYnl0ZXMgb2YgU3JhbTIuIFRoZSBUcCBqdW1wcworCQkqKiB0byAweDdGRkUgYXQgcmVzZXQgdGltZSwgYW5kIHN0YXJ0cyBleGVjdXRpbmcuIFRoaXMgaXMKKwkJKiogYSBzaG9ydCBicmFuY2ggdG8gMHg3RkY4LCB3aGVyZSBhIGxvbmcgYnJhbmNoIGlzIGNvZGVkLgorCQkqLworCisJCURlc3RQID0gKEJZVEUgKikmQ2FkWzB4N0ZGOF07CS8qIDw8PC0tLS0gUkVBRCBUSEUgQUJPVkUgQ09NTUVOVFMgKi8KKworI2RlZmluZQlORklYKE4pCSgweDYwIHwgKE4pKQkvKiAuTyAgPSAofiguTyArIE4pKTw8NCAqLworI2RlZmluZQlQRklYKE4pCSgweDIwIHwgKE4pKQkvKiAuTyAgPSAgICguTyArIE4pPDw0ICAqLworI2RlZmluZQlKVU1QKE4pCSgweDAwIHwgKE4pKQkvKiAuUEMgPSAgIC5QQyArIC5PCSAqLworCisJCS8qCisJCSoqIDB4N0ZGQyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24gZm9sbG93aW5nIHRoZSBsYXN0IGJ5dGUgb2YKKwkJKiogdGhlIGZvdXIgYnl0ZSBqdW1wIGluc3RydWN0aW9uLgorCQkqKiBSRUFEIFRIRSBBQk9WRSBDT01NRU5UUworCQkqKgorCQkqKiBvZmZzZXQgaXMgKFRPLUZST00pICUgTUVNU0laRSwgYnV0IHdpdGggY29tcG91bmQgYnVnZ2VyaW5nIGFib3V0LgorCQkqKiBNZW1zaXplIGlzIDY0SyBmb3IgdGhpcyByYW5nZSBvZiBUcCwgc28gb2Zmc2V0IGlzIGEgc2hvcnQgKHVuc2lnbmVkLAorCQkqKiBjb3MgSSBkb24ndCB1bmRlcnN0YW5kIDIncyBjb21wbGVtZW50KS4KKwkJKi8KKwkJb2Zmc2V0ID0gKHAtPlJJT0NvbmYuSG9zdExvYWRCYXNlLTIpLTB4N0ZGQzsKKwkJV0JZVEUoIERlc3RQWzBdICwgTkZJWCgoKHVzaG9ydCkofm9mZnNldCkgPj4gKHVzaG9ydCkxMikgJiAweEYpICk7CisJCVdCWVRFKCBEZXN0UFsxXSAsIFBGSVgoKCBvZmZzZXQgPj4gOCkgJiAweEYpICk7CisJCVdCWVRFKCBEZXN0UFsyXSAsIFBGSVgoKCBvZmZzZXQgPj4gNCkgJiAweEYpICk7CisJCVdCWVRFKCBEZXN0UFszXSAsIEpVTVAoIG9mZnNldCAmIDB4RikgKTsKKworCQlXQllURSggRGVzdFBbNl0gLCBORklYKDApICk7CisJCVdCWVRFKCBEZXN0UFs3XSAsIEpVTVAoOCkgKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJob3N0IGxvYWRiYXNlIGlzIDB4JXhcbiIscC0+UklPQ29uZi5Ib3N0TG9hZEJhc2UpOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJzdGFydHVwIG9mZnNldCBpcyAweCV4XG4iLG9mZnNldCk7CisKKwkJLyoKKwkJKiogRmxhZyB3aGF0IGlzIGdvaW5nIG9uCisJCSovCisJCUhvc3RQLT5GbGFncyAmPSB+UlVOX1NUQVRFOworCQlIb3N0UC0+RmxhZ3MgfD0gUkNfU1RBUlRVUDsKKworCQkvKgorCQkqKiBHcmFiIGEgY29weSBvZiB0aGUgY3VycmVudCBQYXJtTWFwIHBvaW50ZXIsIHNvIHdlCisJCSoqIGNhbiB0ZWxsIHdoZW4gaXQgaGFzIGNoYW5nZWQuCisJCSovCisJCU9sZFBhcm1NYXAgPSBSV09SRChIb3N0UC0+X19QYXJtTWFwUik7CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiT3JpZ2luYWwgcGFybW1hcCBpcyAweCV4XG4iLE9sZFBhcm1NYXApOworCisJCS8qCisJCSoqIEFuZCBzdGFydCBpdCBydW5uaW5nIChJIGhvcGUpLgorCQkqKiBBcyB0aGVyZSBpcyBub3RoaW5nIGRvZGd5IG9yIG9ic2N1cmUgYWJvdXQgdGhlCisJCSoqIGFib3ZlIGNvZGUsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byB3b3JrIGV2ZXJ5IHRpbWUuCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgICJIb3N0IFR5cGUgPSAweCV4LCBNb2RlID0gMHgleCwgSVZlYyA9IDB4JXhcbiIsCisJCSAgICBIb3N0UC0+VHlwZSwgSG9zdFAtPk1vZGUsIEhvc3RQLT5JdmVjKTsKKworCQlyaW9fc3RhcnRfY2FyZF9ydW5uaW5nKEhvc3RQKTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJTZXQgY29udHJvbCBwb3J0XG4iKTsKKworCQkvKgorCQkqKiBOb3csIHdhaXQgZm9yIHVwdG8gZml2ZSBzZWNvbmRzIGZvciB0aGUgVHAgdG8gc2V0dXAgdGhlIHBhcm1tYXAKKwkJKiogcG9pbnRlcjoKKwkJKi8KKwkJZm9yICggd2FpdF9jb3VudD0wOyAod2FpdF9jb3VudDxwLT5SSU9Db25mLlN0YXJ0dXBUaW1lKSYmCisJCQkoUldPUkQoSG9zdFAtPl9fUGFybU1hcFIpPT1PbGRQYXJtTWFwKTsgd2FpdF9jb3VudCsrICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiQ2hlY2tvdXQgJWQsIDB4JXhcbiIsd2FpdF9jb3VudCxSV09SRChIb3N0UC0+X19QYXJtTWFwUikpOworCQkJZGVsYXkoSG9zdFAsIEhVTkRSRURfTVMpOworCisJCX0KKworCQkvKgorCQkqKiBJZiB0aGUgcGFybW1hcCBwb2ludGVyIGlzIHVuY2hhbmdlZCwgdGhlbiB0aGUgaG9zdCBjb2RlCisJCSoqIGhhcyBjcmFzaGVkICYgYnVybmVkIGluIGEgcmVhbGx5IHNwZWN0YWN1bGFyIHdheQorCQkqLworCQlpZiAoIFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKSA9PSBPbGRQYXJtTWFwICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAicGFybW1hcCAweCV4XG4iLCBSV09SRChIb3N0UC0+X19QYXJtTWFwUikpOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUklPIE1lc2cgUnVuIEZhaWxcbiIpOworCisjZGVmaW5lCUhPU1RfRElTQUJMRSBcCisJCUhvc3RQLT5GbGFncyAmPSB+UlVOX1NUQVRFOyBcCisJCUhvc3RQLT5GbGFncyB8PSBSQ19TVFVGRkVEOyBcCisJCVJJT0hvc3RSZXNldCggSG9zdFAtPlR5cGUsIChzdHJ1Y3QgRHBSYW0gKilIb3N0UC0+Q2FyZFAsIEhvc3RQLT5TbG90ICk7XAorCQljb250aW51ZQorCisJCQlIT1NUX0RJU0FCTEU7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSdW5uaW5nIDB4JXhcbiIsIFJXT1JEKEhvc3RQLT5fX1Bhcm1NYXBSKSk7CisKKwkJLyoKKwkJKiogV2VsbCwgdGhlIGJvYXJkIHRob3VnaHQgaXQgd2FzIE9LLCBhbmQgc2V0dXAgaXRzIHBhcm1tYXAKKwkJKiogcG9pbnRlci4gRm9yIHRoZSB0aW1lIGJlaW5nLCB3ZSB3aWxsIHByZXRlbmQgdGhhdCB0aGlzCisJCSoqIGJvYXJkIGlzIHJ1bm5pbmcsIGFuZCBjaGVjayBvdXQgd2hhdCB0aGUgZXJyb3IgZmxhZyBzYXlzLgorCQkqLworCisJCS8qCisJCSoqIEdyYWIgYSAzMiBiaXQgcG9pbnRlciB0byB0aGUgcGFybW1hcCBzdHJ1Y3R1cmUKKwkJKi8KKwkJUGFybU1hcFAgPSAoUEFSTV9NQVAgKilSSU9fUFRSKENhZCxSV09SRChIb3N0UC0+X19QYXJtTWFwUikpOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJQYXJtTWFwUCA6ICV4XG4iLCAoaW50KVBhcm1NYXBQKTsKKwkJUGFybU1hcFAgPSAoUEFSTV9NQVAgKikoKHVuc2lnbmVkIGxvbmcpQ2FkICsgCisJCQkJCQkodW5zaWduZWQgbG9uZykoKFJXT1JEKChIb3N0UC0+X19QYXJtTWFwUikpKSAmIDB4RkZGRikpOyAKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUGFybU1hcFAgOiAleFxuIiwgKGludClQYXJtTWFwUCk7CisKKwkJLyoKKwkJKiogVGhlIGxpbmtzIGVudHJ5IHNob3VsZCBiZSAweEZGRkY7IHdlIHNldCBpdCB1cAorCQkqKiB3aXRoIGEgbWFzayB0byBzYXkgaG93IG1hbnkgUEhCcyB0byB1c2UsIGFuZCAKKwkJKiogd2hpY2ggbGlua3MgdG8gdXNlLgorCQkqLworCQlpZiAoIChSV09SRChQYXJtTWFwUC0+bGlua3MpICYgMHhGRkZGKSAhPSAweEZGRkYgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSSU8gTWVzZyBSdW4gRmFpbCAlc1xuIiwgSG9zdFAtPk5hbWUpOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiTGlua3MgPSAweCV4XG4iLFJXT1JEKFBhcm1NYXBQLT5saW5rcykpOworCQkJSE9TVF9ESVNBQkxFOworCQl9CisKKwkJV1dPUkQoUGFybU1hcFAtPmxpbmtzICwgUklPX0xJTktfRU5BQkxFKTsKKworCQkvKgorCQkqKiBub3cgd2FpdCBmb3IgdGhlIGNhcmQgdG8gc2V0IGFsbCB0aGUgcGFybW1hcC0+WFhYIHN0dWZmCisJCSoqIHRoaXMgaXMgYSB3YWl0IG9mIHVwdG8gdHdvIHNlY29uZHMuLi4uCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkxvb2tpbmcgZm9yIGluaXRfZG9uZSAtICVkIHRpY2tzXG4iLHAtPlJJT0NvbmYuU3RhcnR1cFRpbWUpOworCQlIb3N0UC0+dGltZW91dF9pZCA9IDA7CisJCWZvciAoIHdhaXRfY291bnQ9MDsgKHdhaXRfY291bnQ8cC0+UklPQ29uZi5TdGFydHVwVGltZSkgJiYgCisJCQkJCQkhUldPUkQoUGFybU1hcFAtPmluaXRfZG9uZSk7IHdhaXRfY291bnQrKyApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIldhaXRpbmcgZm9yIGluaXRfZG9uZVxuIik7CisJCQlkZWxheShIb3N0UCwgSFVORFJFRF9NUyk7CisJCX0KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiT0shIGluaXRfZG9uZSFcbiIpOworCisJCWlmIChSV09SRChQYXJtTWFwUC0+ZXJyb3IpICE9IEVfTk9fRVJST1IgfHwgCisJCQkJCQkJIVJXT1JEKFBhcm1NYXBQLT5pbml0X2RvbmUpICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUklPIE1lc2cgUnVuIEZhaWwgJXNcbiIsIEhvc3RQLT5OYW1lKTsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlRpbWVkb3V0IHdhaXRpbmcgZm9yIGluaXRfZG9uZVxuIik7CisJCQlIT1NUX0RJU0FCTEU7CisJCX0KKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJHb3QgaW5pdF9kb25lXG4iKTsKKworCQkvKgorCQkqKiBJdCBydW5zISBJdCBydW5zIQorCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJIb3N0IElEICV4IFJ1bm5pbmdcbiIsSG9zdFAtPlVuaXF1ZU51bSk7CisKKwkJLyoKKwkJKiogc2V0IHRoZSB0aW1lIHBlcmlvZCBiZXR3ZWVuIGludGVycnVwdHMuCisJCSovCisJCVdXT1JEKFBhcm1NYXBQLT50aW1lciwgKHNob3J0KXAtPlJJT0NvbmYuVGltZXIgKTsKKworCQkvKgorCQkqKiBUcmFuc2xhdGUgYWxsIHRoZSAxNiBiaXQgcG9pbnRlcnMgaW4gdGhlIF9fUGFybU1hcFIgaW50bworCQkqKiAzMiBiaXQgcG9pbnRlcnMgZm9yIHRoZSBkcml2ZXIuCisJCSovCisJCUhvc3RQLT5QYXJtTWFwUAkgPQlQYXJtTWFwUDsKKwkJSG9zdFAtPlBoYlAJCSA9CShQSEIqKVJJT19QVFIoQ2FkLFJXT1JEKFBhcm1NYXBQLT5waGJfcHRyKSk7CisJCUhvc3RQLT5SdXBQCQkgPQkoUlVQKilSSU9fUFRSKENhZCxSV09SRChQYXJtTWFwUC0+cnVwcykpOworCQlIb3N0UC0+UGhiTnVtUAkgID0gKHVzaG9ydCopUklPX1BUUihDYWQsUldPUkQoUGFybU1hcFAtPnBoYl9udW1fcHRyKSk7CisJCUhvc3RQLT5MaW5rU3RyUAkgPQkoTFBCKilSSU9fUFRSKENhZCxSV09SRChQYXJtTWFwUC0+bGlua19zdHJfcHRyKSk7CisKKwkJLyoKKwkJKiogcG9pbnQgdGhlIFVuaXhSdXBzIGF0IHRoZSByZWFsIFJ1cHMKKwkJKi8KKwkJZm9yICggUnVwTiA9IDA7IFJ1cE48TUFYX1JVUDsgUnVwTisrICkgeworCQkJSG9zdFAtPlVuaXhSdXBzW1J1cE5dLlJ1cFAJCT0gJkhvc3RQLT5SdXBQW1J1cE5dOworCQkJSG9zdFAtPlVuaXhSdXBzW1J1cE5dLklkCQkgID0gUnVwTisxOworCQkJSG9zdFAtPlVuaXhSdXBzW1J1cE5dLkJhc2VTeXNQb3J0ID0gTk9fUE9SVDsKKwkJCXNwaW5fbG9ja19pbml0KCZIb3N0UC0+VW5peFJ1cHNbUnVwTl0uUnVwTG9jayk7CisJCX0KKworCQlmb3IgKCBSdXBOID0gMDsgUnVwTjxMSU5LU19QRVJfVU5JVDsgUnVwTisrICkgeworCQkJSG9zdFAtPlVuaXhSdXBzW1J1cE4rTUFYX1JVUF0uUnVwUAk9ICZIb3N0UC0+TGlua1N0clBbUnVwTl0ucnVwOworCQkJSG9zdFAtPlVuaXhSdXBzW1J1cE4rTUFYX1JVUF0uSWQgID0gMDsKKwkJCUhvc3RQLT5Vbml4UnVwc1tSdXBOK01BWF9SVVBdLkJhc2VTeXNQb3J0ID0gTk9fUE9SVDsKKwkJCXNwaW5fbG9ja19pbml0KCZIb3N0UC0+VW5peFJ1cHNbUnVwTitNQVhfUlVQXS5SdXBMb2NrKTsKKwkJfQorCisJCS8qCisJCSoqIHBvaW50IHRoZSBQb3J0UC0+UGhicyBhdCB0aGUgcmVhbCBQaGJzCisJCSovCisJCWZvciAoIFBvcnROPXAtPlJJT0ZpcnN0UG9ydHNNYXBwZWQ7IAorCQkJCVBvcnROPHAtPlJJT0xhc3RQb3J0c01hcHBlZCtQT1JUU19QRVJfUlRBOyBQb3J0TisrICkgeworCQkJaWYgKCBwLT5SSU9Qb3J0cFtQb3J0Tl0tPkhvc3RQID09IEhvc3RQICkgeworCQkJCXN0cnVjdCBQb3J0ICpQb3J0UCA9IHAtPlJJT1BvcnRwW1BvcnROXTsKKwkJCQlzdHJ1Y3QgUEhCICpQaGJQOworCQkJCS8qIGludCBvbGRzcGw7ICovCisKKwkJCQlpZiAoICFQb3J0UC0+TWFwcGVkICkKKwkJCQkJY29udGludWU7CisKKwkJCQlQaGJQID0gJkhvc3RQLT5QaGJQW1BvcnRQLT5Ib3N0UG9ydF07CisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisJCQkJUG9ydFAtPlBoYlAgPSBQaGJQOworCisJCQkJUG9ydFAtPlR4QWRkCT0gKFdPUkQgKilSSU9fUFRSKENhZCxSV09SRChQaGJQLT50eF9hZGQpKTsKKwkJCQlQb3J0UC0+VHhTdGFydCAgPSAoV09SRCAqKVJJT19QVFIoQ2FkLFJXT1JEKFBoYlAtPnR4X3N0YXJ0KSk7CisJCQkJUG9ydFAtPlR4RW5kCT0gKFdPUkQgKilSSU9fUFRSKENhZCxSV09SRChQaGJQLT50eF9lbmQpKTsKKwkJCQlQb3J0UC0+UnhSZW1vdmUgPSAoV09SRCAqKVJJT19QVFIoQ2FkLFJXT1JEKFBoYlAtPnJ4X3JlbW92ZSkpOworCQkJCVBvcnRQLT5SeFN0YXJ0ICA9IChXT1JEICopUklPX1BUUihDYWQsUldPUkQoUGhiUC0+cnhfc3RhcnQpKTsKKwkJCQlQb3J0UC0+UnhFbmQJPSAoV09SRCAqKVJJT19QVFIoQ2FkLFJXT1JEKFBoYlAtPnJ4X2VuZCkpOworCisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJLyoKKwkJCQkqKiBwb2ludCB0aGUgVW5peFJ1cCBhdCB0aGUgYmFzZSBTeXNQb3J0CisJCQkJKi8KKwkJCQlpZiAoICEoUG9ydE4gJSBQT1JUU19QRVJfUlRBKSApCisJCQkJCUhvc3RQLT5Vbml4UnVwc1tQb3J0UC0+UnVwTnVtXS5CYXNlU3lzUG9ydCA9IFBvcnROOworCQkJfQorCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiU2V0IHRoZSBjYXJkIHJ1bm5pbmcuLi4gXG4iKTsKKwkJLyoKKwkJKiogbGFzdCB0aGluZyAtIHNob3cgdGhlIHdvcmxkIHRoYXQgZXZlcnl0aGluZyBpcyBpbiBwbGFjZQorCQkqLworCQlIb3N0UC0+RmxhZ3MgJj0gflJVTl9TVEFURTsKKwkJSG9zdFAtPkZsYWdzIHw9IFJDX1JVTk5JTkc7CisJfQorCS8qCisJKiogTVBYIGFsd2F5cyB1c2VzIGEgcG9sbGVyLiBUaGlzIGlzIGFjdHVhbGx5IHBhdGNoZWQgaW50byB0aGUgc3lzdGVtCisJKiogY29uZmlndXJhdGlvbiBhbmQgY2FsbGVkIGRpcmVjdGx5IGZyb20gZWFjaCBjbG9jayB0aWNrLgorCSoqCisJKi8KKwlwLT5SSU9Qb2xsaW5nID0gMTsKKworCXAtPlJJT1N5c3RlbVVwKys7CisJCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiRG9uZSBldmVyeXRoaW5nICV4XG4iLCBIb3N0UC0+SXZlYyk7CisJZnVuY19leGl0ICgpOworCXJldHVybiAwOworfQorCisKKworLyoKKyoqIEJvb3QgYW4gUlRBLiBJZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgdGhpcyBib290LCB0aGVuCisqKiByZXR1cm4gMS4gSWYgd2UgaGF2ZW50LCB0aGVuIHJldHVybiAwLgorKi8KK2ludAorUklPQm9vdFJ1cCggcCwgUnVwLCBIb3N0UCwgUGFja2V0UCkKK3N0cnVjdCByaW9faW5mbyAqCXA7Cit1aW50IFJ1cDsKK3N0cnVjdCBIb3N0ICpIb3N0UDsKK3N0cnVjdCBQS1QgKlBhY2tldFA7IAoreworCXN0cnVjdCBQa3RDbWQgKlBrdENtZFAgPSAoc3RydWN0IFBrdENtZCAqKVBhY2tldFAtPmRhdGE7CisJc3RydWN0IFBrdENtZF9NICpQa3RSZXBseVA7CisJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKKwl1aW50IHNlcXVlbmNlOworCisjaWZkZWYgQ0hFQ0sKKwlDaGVja0hvc3QoSG9zdCk7CisJQ2hlY2tSdXAoUnVwKTsKKwlDaGVja0hvc3RQKEhvc3RQKTsKKwlDaGVja1BhY2tldFAoUGFja2V0UCk7CisjZW5kaWYKKworCS8qCisJKiogSWYgd2UgaGF2ZW4ndCBiZWVuIHRvbGQgd2hhdCB0byBib290LCB3ZSBjYW4ndCBib290IGl0LgorCSovCisJaWYgKCBwLT5SSU9OdW1Cb290UGt0cyA9PSAwICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJObyBSVEEgY29kZSB0byBkb3dubG9hZCB5ZXRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiByaW9fZHByaW50KFJJT19ERUJVR19CT09ULCBOVUxMLERCR19CT09ULCJJbmNvbWluZyBjb21tYW5kIHBhY2tldFxuIik7ICovCisJLyogU2hvd1BhY2tldCggREJHX0JPT1QsIFBhY2tldFAgKTsgKi8KKworCS8qCisJKiogU3BlY2lhbCBjYXNlIG9mIGJvb3QgY29tcGxldGVkIC0gaWYgd2UgZ2V0IG9uZSBvZiB0aGVzZSB0aGVuIHdlCisJKiogZG9uJ3QgbmVlZCBhIGNvbW1hbmQgYmxvY2suIEZvciBhbGwgb3RoZXIgY2FzZXMgd2UgZG8sIHNvIGhhbmRsZQorCSoqIHRoaXMgZmlyc3QgYW5kIHRoZW4gZ2V0IGEgY29tbWFuZCBibG9jaywgdGhlbiBoYW5kbGUgZXZlcnkgb3RoZXIKKwkqKiBjYXNlLCByZWxpbnF1aXNoaW5nIHRoZSBjb21tYW5kIGJsb2NrIGlmIGRpc2FzdGVyIHN0cmlrZXMhCisJKi8KKwlpZiAoIChSQllURShQYWNrZXRQLT5sZW4pICYgUEtUX0NNRF9CSVQpICYmIAorCQkJKFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpPT1CT09UX0NPTVBMRVRFRCkgKQorCQlyZXR1cm4gUklPQm9vdENvbXBsZXRlKHAsIEhvc3RQLCBSdXAsIFBrdENtZFAgKTsKKworCS8qCisJKiogdHJ5IHRvIHVuaG9vayBhIGNvbW1hbmQgYmxvY2sgZnJvbSB0aGUgY29tbWFuZCBmcmVlIGxpc3QuCisJKi8KKwlpZiAoICEoQ21kQmxrUCA9IFJJT0dldENtZEJsaygpKSApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiTm8gY29tbWFuZCBibG9ja3MgdG8gYm9vdCBSVEEhIGNvbWUgYmFjayBsYXRlci5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSoqIEZpbGwgaW4gdGhlIGRlZmF1bHQgaW5mbyBvbiB0aGUgY29tbWFuZCBibG9jaworCSovCisJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IFJ1cCA8ICh1c2hvcnQpTUFYX1JVUCA/IFJ1cCA6IDA7CisJQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBCT09UX1JVUDsKKworCUNtZEJsa1AtPlByZUZ1bmNQID0gQ21kQmxrUC0+UG9zdEZ1bmNQID0gTlVMTDsKKwlQa3RSZXBseVAgPSAoc3RydWN0IFBrdENtZF9NICopQ21kQmxrUC0+UGFja2V0LmRhdGE7CisKKwkvKgorCSoqIHByb2Nlc3MgQ09NTUFORFMgb24gdGhlIGJvb3QgcnVwIQorCSovCisJaWYgKCBSQllURShQYWNrZXRQLT5sZW4pICYgUEtUX0NNRF9CSVQgKSB7CisJCS8qCisJCSoqIFdlIG9ubHkgZXhwZWN0IG9uZSB0eXBlIG9mIGNvbW1hbmQgLSBhIEJPT1RfUkVRVUVTVCEKKwkJKi8KKwkJaWYgKCBSQllURShQa3RDbWRQLT5Db21tYW5kKSAhPSBCT09UX1JFUVVFU1QgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJVbmV4cGVjdGVkIGNvbW1hbmQgJWQgb24gQk9PVCBSVVAgJWQgb2YgaG9zdCAlZFxuIiwgCisJCQkJCQlQa3RDbWRQLT5Db21tYW5kLFJ1cCxIb3N0UC1wLT5SSU9Ib3N0cyk7CisJCQlTaG93UGFja2V0KCBEQkdfQk9PVCwgUGFja2V0UCApOworCQkJUklPRnJlZUNtZEJsayggQ21kQmxrUCApOworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKgorCQkqKiBCdWlsZCBhIEJvb3QgU2VxdWVuY2UgY29tbWFuZCBibG9jaworCQkqKgorCQkqKiAwMi4wMy4xOTk5IEFSRyAtIEVTSUwgMDgyMCBmaXgKKwkJKiogV2Ugbm8gbG9uZ2VyIG5lZWQgdG8gdXNlICJCb290IE1vZGUiLCB3ZSdsbCBhbHdheXMgYWxsb3cKKwkJKiogYm9vdCByZXF1ZXN0cyAtIHRoZSBib290IHdpbGwgbm90IGNvbXBsZXRlIGlmIHRoZSBkZXZpY2UKKwkJKiogYXBwZWFycyBpbiB0aGUgYmluZGluZ3MgdGFibGUuCisJCSoqIFNvLCB0aGlzIGNvbmRpdGlvbmFsIGlzIG5vdCByZXF1aXJlZCAuLi4KKwkJKioKKwkJaWYgKHAtPlJJT0Jvb3RNb2RlID09IFJDX0JPT1RfTk9ORSkKKwkJCSoqCisJCQkqKiBJZiB0aGUgc3lzdGVtIGlzIGluIHNsYXZlIG1vZGUsIGFuZCBhIGJvb3QgcmVxdWVzdCBpcworCQkJKiogcmVjZWl2ZWQsIHNldCBjb21tYW5kIHRvIEJPT1RfQUJPUlQgc28gdGhhdCB0aGUgYm9vdAorCQkJKiogd2lsbCBub3QgY29tcGxldGUuCisJCQkqKgorCQkJUGt0UmVwbHlQLT5Db21tYW5kCQkJID0gQk9PVF9BQk9SVDsKKwkJZWxzZQorCQkqKgorCQkqKiBXZSdsbCBqdXN0IChhbHdheXMpIHNldCB0aGUgY29tbWFuZCBmaWVsZCBpbiBwYWNrZXQgcmVwbHkKKwkJKiogdG8gYWxsb3cgYW4gYXR0ZW1wdGVkIGJvb3Qgc2VxdWVuY2UgOgorCQkqLworCQlQa3RSZXBseVAtPkNvbW1hbmQgPSBCT09UX1NFUVVFTkNFOworCisJCVBrdFJlcGx5UC0+Qm9vdFNlcXVlbmNlLk51bVBhY2tldHMgPSBwLT5SSU9OdW1Cb290UGt0czsKKwkJUGt0UmVwbHlQLT5Cb290U2VxdWVuY2UuTG9hZEJhc2UgICA9IHAtPlJJT0NvbmYuUnRhTG9hZEJhc2U7CisJCVBrdFJlcGx5UC0+Qm9vdFNlcXVlbmNlLkNvZGVTaXplICAgPSBwLT5SSU9Cb290Q291bnQ7CisKKwkJQ21kQmxrUC0+UGFja2V0LmxlbgkJCQk9IEJPT1RfU0VRVUVOQ0VfTEVOIHwgUEtUX0NNRF9CSVQ7CisKKwkJYmNvcHkoIkJPT1QiLCh2b2lkICopJkNtZEJsa1AtPlBhY2tldC5kYXRhW0JPT1RfU0VRVUVOQ0VfTEVOXSw0KTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJCb290IFJUQSBvbiBIb3N0ICVkIFJ1cCAlZCAtICVkICgweCV4KSBwYWNrZXRzIHRvIDB4JXhcbiIsCisJCQlIb3N0UC1wLT5SSU9Ib3N0cywgUnVwLCBwLT5SSU9OdW1Cb290UGt0cywgcC0+UklPTnVtQm9vdFBrdHMsIAorCQkJCQkJCQlwLT5SSU9Db25mLlJ0YUxvYWRCYXNlKTsKKworCQkvKgorCQkqKiBJZiB0aGlzIGhvc3QgaXMgaW4gc2xhdmUgbW9kZSwgc2VuZCB0aGUgUlRBIGFuIGludmFsaWQgYm9vdAorCQkqKiBzZXF1ZW5jZSBjb21tYW5kIGJsb2NrIHRvIGZvcmNlIGl0IHRvIGtpbGwgdGhlIGJvb3QuIFdlIHdhaXQKKwkJKiogZm9yIGhhbGYgYSBzZWNvbmQgYmVmb3JlIHNlbmRpbmcgdGhpcyBwYWNrZXQgdG8gcHJldmVudCB0aGUgUlRBCisJCSoqIGF0dGVtcHRpbmcgdG8gYm9vdCB0b28gb2Z0ZW4uIFRoZSBtYXN0ZXIgaG9zdCBzaG91bGQgdGhlbiBncmFiCisJCSoqIHRoZSBSVEEgYW5kIG1ha2UgaXQgaXRzIG93bi4KKwkJKi8KKwkJcC0+UklPQm9vdGluZysrOworCQlSSU9RdWV1ZUNtZEJsayggSG9zdFAsIFJ1cCwgQ21kQmxrUCApOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSoqIEl0IGlzIGEgcmVxdWVzdCBmb3IgYm9vdCBkYXRhLgorCSovCisJc2VxdWVuY2UgPSBSV09SRChQa3RDbWRQLT5TZXF1ZW5jZSk7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJCb290IGJsb2NrICVkIG9uIEhvc3QgJWQgUnVwJWRcbiIsc2VxdWVuY2UsSG9zdFAtcC0+UklPSG9zdHMsUnVwKTsKKworCWlmICggc2VxdWVuY2UgPj0gcC0+UklPTnVtQm9vdFBrdHMgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkdvdCBhIHJlcXVlc3QgZm9yIHBhY2tldCAlZCwgbWF4IGlzICVkXG4iLCBzZXF1ZW5jZSwgCisJCQkJCXAtPlJJT051bUJvb3RQa3RzKTsKKwkJU2hvd1BhY2tldCggREJHX0JPT1QsIFBhY2tldFAgKTsKKwl9CisKKwlQa3RSZXBseVAtPlNlcXVlbmNlID0gc2VxdWVuY2U7CisKKwliY29weSggcC0+UklPQm9vdFBhY2tldHNbIHAtPlJJT051bUJvb3RQa3RzIC0gc2VxdWVuY2UgLSAxIF0sIAorCQkJCVBrdFJlcGx5UC0+Qm9vdERhdGEsIFJUQV9CT09UX0RBVEFfU0laRSApOworCisJQ21kQmxrUC0+UGFja2V0LmxlbiA9IFBLVF9NQVhfREFUQV9MRU47CisJU2hvd1BhY2tldCggREJHX0JPT1QsICZDbWRCbGtQLT5QYWNrZXQgKTsKKwlSSU9RdWV1ZUNtZEJsayggSG9zdFAsIFJ1cCwgQ21kQmxrUCApOworCXJldHVybiAxOworfQorCisvKgorKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBSVEEgYmVlbiBib290ZWQuCisqKiBJZiBib290ZWQgYnkgYSBob3N0LCBIb3N0UC0+SG9zdFVuaXF1ZU51bSBpcyB0aGUgYm9vdGluZyBob3N0LgorKiogSWYgYm9vdGVkIGJ5IGFuIFJUQSwgSG9zdFAtPk1hcHBpbmdbUnVwXS5SdGFVbmlxdWVOdW0gaXMgdGhlIGJvb3RpbmcgUlRBLgorKiogUnRhVW5pcSBpcyB0aGUgYm9vdGVkIFJUQS4KKyovCitzdGF0aWMgaW50IFJJT0Jvb3RDb21wbGV0ZSggc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIHVpbnQgUnVwLCBzdHJ1Y3QgUGt0Q21kICpQa3RDbWRQICkKK3sKKwlzdHJ1Y3QgTWFwCSpNYXBQID0gTlVMTDsKKwlzdHJ1Y3QgTWFwCSpNYXBQMiA9IE5VTEw7CisJaW50CUZsYWc7CisJaW50CWZvdW5kOworCWludAlob3N0LCBydGE7CisJaW50CUVtcHR5U2xvdCA9IC0xOworCWludAllbnRyeSwgZW50cnkyOworCWNoYXIJKk15VHlwZSwgKk15TmFtZTsKKwl1aW50CU15TGluazsKKwl1c2hvcnQJUnRhVHlwZTsKKwl1aW50CVJ0YVVuaXEgPSAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVswXSkpICsKKwkJCSAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bMV0pIDw8IDgpICsKKwkJCSAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bMl0pIDw8IDE2KSArCisJCQkgIChSQllURShQa3RDbWRQLT5VbmlxTnVtWzNdKSA8PCAyNCk7CisKKwkvKiBXYXMgUklPQm9vdGluZy0tIC4gVGhhdCdzIGJhZC4gSWYgYW4gUlRBIHNlbmRzIHR3byBvZiB0aGVtLCB0aGUKKwkgICBkcml2ZXIgd2lsbCBuZXZlciB0aGluayB0aGF0IHRoZSBSVEEgaGFzIGJvb3RlZC4uLiAtLSBSRVcgKi8KKwlwLT5SSU9Cb290aW5nID0gMDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJUQSBCb290IGNvbXBsZXRlZCAtIEJvb3RJblByb2dyZXNzIG5vdyAlZFxuIiwgcC0+UklPQm9vdGluZyk7CisKKwkvKgorCSoqIERldGVybWluZSB0eXBlIG9mIHVuaXQgKDE2LzggcG9ydCBSVEEpLgorCSovCisJUnRhVHlwZSA9IEdldFVuaXRUeXBlKFJ0YVVuaXEpOworICAgICAgICBpZiAoIFJ1cCA+PSAodXNob3J0KU1BWF9SVVAgKSB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJJTzogSG9zdCAlcyBoYXMgYm9vdGVkIGFuIFJUQSglZCkgb24gbGluayAlY1xuIiwKKwkgICAgIEhvc3RQLT5OYW1lLCA4ICogUnRhVHlwZSwgUkJZVEUoUGt0Q21kUC0+TGlua051bSkrJ0EnKTsKKwl9IGVsc2UgeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSSU86IFJUQSAlcyBoYXMgYm9vdGVkIGFuIFJUQSglZCkgb24gbGluayAlY1xuIiwKKwkgICAgIEhvc3RQLT5NYXBwaW5nW1J1cF0uTmFtZSwgOCAqIFJ0YVR5cGUsCisJICAgICBSQllURShQa3RDbWRQLT5MaW5rTnVtKSsnQScpOworCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlVuaXFOdW0gaXMgMHgleFxuIixSdGFVbmlxKTsKKworICAgICAgICBpZiAoICggUnRhVW5pcSA9PSAweDAwMDAwMDAwICkgfHwgKCBSdGFVbmlxID09IDB4ZmZmZmZmZmYgKSApCisJeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJJbGxlZ2FsIFJUQSBVbmlxIE51bWJlclxuIik7CisJICAgIHJldHVybiBUUlVFOworCX0KKworCS8qCisJKiogSWYgdGhpcyBSVEEgaGFzIGp1c3QgYm9vdGVkIGFuIFJUQSB3aGljaCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzCisJKiogc3lzdGVtLCBvciB0aGUgc3lzdGVtIGlzIGluIHNsYXZlIG1vZGUsIGRvIG5vdCBhdHRlbXB0IHRvIGNyZWF0ZQorCSoqIGEgbmV3IHRhYmxlIGVudHJ5IGZvciBpdC4KKwkqLworCWlmICghUklPQm9vdE9rKHAsIEhvc3RQLCBSdGFVbmlxKSkKKwl7CisJICAgIE15TGluayA9IFJCWVRFKFBrdENtZFAtPkxpbmtOdW0pOworCSAgICBpZiAoUnVwIDwgKHVzaG9ydCkgTUFYX1JVUCkKKwkgICAgeworCQkvKgorCQkqKiBSdGFVbmlxIHdhcyBjbG9uZSBib290ZWQgKGJ5IHRoaXMgUlRBKS4gSW5zdHJ1Y3QgdGhpcyBSVEEKKwkJKiogdG8gaG9sZCBvZmYgZnVydGhlciBhdHRlbXB0cyB0byBib290IG9uIHRoaXMgbGluayBmb3IgMzAKKwkJKiogc2Vjb25kcy4KKwkJKi8KKwkJaWYgKFJJT1N1c3BlbmRCb290UnRhKEhvc3RQLCBIb3N0UC0+TWFwcGluZ1tSdXBdLklELCBNeUxpbmspKQorCQl7CisJCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSVEEgZmFpbGVkIHRvIHN1c3BlbmQgYm9vdGluZyBvbiBsaW5rICVjXG4iLAorCQkgICAgICdBJyArIE15TGluayk7CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyoKKwkJKiogUnRhVW5pcSB3YXMgYm9vdGVkIGJ5IHRoaXMgaG9zdC4gU2V0IHRoZSBib290aW5nIGxpbmsKKwkJKiogdG8gaG9sZCBvZmYgZm9yIDMwIHNlY29uZHMgdG8gZ2l2ZSBhbm90aGVyIHVuaXQgYQorCQkqKiBjaGFuY2UgdG8gYm9vdCBpdC4KKwkJKi8KKwkJV1dPUkQoSG9zdFAtPkxpbmtTdHJQW015TGlua10uV2FpdE5vQm9vdCwgMzApOworCSAgICB9CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJUQSAleCBub3Qgb3duZWQgLSBzdXNwZW5kIGJvb3RpbmcgZG93biBsaW5rICVjIG9uIHVuaXQgJXhcbiIsCisJICAgICAgUnRhVW5pcSwgJ0EnICsgTXlMaW5rLCBIb3N0UC0+TWFwcGluZ1tSdXBdLlJ0YVVuaXF1ZU51bSk7CisJICAgIHJldHVybiBUUlVFOworCX0KKworCS8qCisJKiogQ2hlY2sgZm9yIGEgU0xPVF9JTl9VU0UgZW50cnkgZm9yIHRoaXMgUlRBIGF0dGFjaGVkIHRvIHRoZQorCSoqIGN1cnJlbnQgaG9zdCBjYXJkIGluIHRoZSBkcml2ZXIgdGFibGUuCisJKioKKwkqKiBJZiBpdCBleGlzdHMsIG1ha2UgYSBub3RlIHRoYXQgd2UgaGF2ZSBib290ZWQgaXQuIE90aGVyIHBhcnRzIG9mCisJKiogdGhlIGRyaXZlciBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGluZm9ybWF0aW9uIGF0IGEgbGF0ZXIgZGF0ZSwKKwkqKiBpbiBwYXJ0aWN1bGFyIHdoZW4gdGhlIGJvb3RpbmcgUlRBIGFza3MgZm9yIGFuIElEIGZvciB0aGlzIHVuaXQsCisJKiogd2UgbXVzdCBoYXZlIHNldCB0aGUgQk9PVEVEIGZsYWcsIGFuZCB0aGUgTkVXQk9PVCBmbGFnIGlzIHVzZWQKKwkqKiB0byBmb3JjZSBhbiBvcGVuIG9uIGFueSBwb3J0cyB0aGF0IHdoZXJlIHByZXZpb3VzbHkgb3BlbiBvbiB0aGlzCisJKiogdW5pdC4KKwkqLworICAgICAgICBmb3IgKCBlbnRyeT0wOyBlbnRyeTxNQVhfUlVQOyBlbnRyeSsrICkKKwl7CisJICAgIHVpbnQgc3lzcG9ydDsKKworCSAgICBpZiAoKEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5GbGFncyAmIFNMT1RfSU5fVVNFKSAmJiAKKwkgICAgICAgKEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5SdGFVbmlxdWVOdW09PVJ0YVVuaXEpKQorCSAgICB7CisJICAgICAgICBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uRmxhZ3MgfD0gUlRBX0JPT1RFRHxSVEFfTkVXQk9PVDsKKyNpZiBORUVEX1RPX0ZJWAorCQlSSU9fU1ZfQlJPQURDQVNUKEhvc3RQLT5zdkZsYWdzW2VudHJ5XSk7CisjZW5kaWYKKwkJaWYgKCAoc3lzcG9ydD1Ib3N0UC0+TWFwcGluZ1tlbnRyeV0uU3lzUG9ydCkgIT0gTk9fUE9SVCApCisJCXsKKwkJICAgaWYgKCBzeXNwb3J0IDwgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCApCisJCQlwLT5SSU9GaXJzdFBvcnRzQm9vdGVkID0gc3lzcG9ydDsKKwkJICAgaWYgKCBzeXNwb3J0ID4gcC0+UklPTGFzdFBvcnRzQm9vdGVkICkKKwkJCXAtPlJJT0xhc3RQb3J0c0Jvb3RlZCA9IHN5c3BvcnQ7CisJCSAgIC8qCisJCSAgICoqIEZvciBhIDE2IHBvcnQgUlRBLCBjaGVjayB0aGUgc2Vjb25kIGJhbmsgb2YgOCBwb3J0cworCQkgICAqLworCQkgICBpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorCQkgICB7CisJCQllbnRyeTIgPSBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uSUQyIC0gMTsKKwkJCUhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uRmxhZ3MgfD0gUlRBX0JPT1RFRHxSVEFfTkVXQk9PVDsKKyNpZiBORUVEX1RPX0ZJWAorCQkJUklPX1NWX0JST0FEQ0FTVChIb3N0UC0+c3ZGbGFnc1tlbnRyeTJdKTsKKyNlbmRpZgorCQkJc3lzcG9ydCA9IEhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydDsKKwkJCWlmICggc3lzcG9ydCA8IHAtPlJJT0ZpcnN0UG9ydHNCb290ZWQgKQorCQkJICAgIHAtPlJJT0ZpcnN0UG9ydHNCb290ZWQgPSBzeXNwb3J0OworCQkJaWYgKCBzeXNwb3J0ID4gcC0+UklPTGFzdFBvcnRzQm9vdGVkICkKKwkJCSAgICBwLT5SSU9MYXN0UG9ydHNCb290ZWQgPSBzeXNwb3J0OworCQkgICB9CisJCX0KKwkJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikgeworCQkgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJSVEEgd2lsbCBiZSBnaXZlbiBJRHMgJWQrJWRcbiIsCisJCSAgICBlbnRyeSsxLCBlbnRyeTIrMSk7CisJCX0gZWxzZSB7CisJCSAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlJUQSB3aWxsIGJlIGdpdmVuIElEICVkXG4iLGVudHJ5KzEpOworCQl9CisJCXJldHVybiBUUlVFOworCSAgICB9CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiUlRBIG5vdCBjb25maWd1cmVkIGZvciB0aGlzIGhvc3RcbiIpOworCisJaWYgKCBSdXAgPj0gKHVzaG9ydClNQVhfUlVQICkKKwl7CisJICAgIC8qCisJICAgICoqIEl0IHdhcyBhIGhvc3QgdGhhdCBkaWQgdGhlIGJvb3RpbmcKKwkgICAgKi8KKwkgICAgTXlUeXBlID0gIkhvc3QiOworCSAgICBNeU5hbWUgPSBIb3N0UC0+TmFtZTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyoKKwkgICAgKiogSXQgd2FzIGFuIFJUQSB0aGF0IGRpZCB0aGUgYm9vdGluZworCSAgICAqLworCSAgICBNeVR5cGUgPSAiUlRBIjsKKwkgICAgTXlOYW1lID0gSG9zdFAtPk1hcHBpbmdbUnVwXS5OYW1lOworCX0KKyNpZmRlZiBDSEVDSworCUNoZWNrU3RyaW5nKE15VHlwZSk7CisJQ2hlY2tTdHJpbmcoTXlOYW1lKTsKKyNlbmRpZgorCisJTXlMaW5rID0gUkJZVEUoUGt0Q21kUC0+TGlua051bSk7CisKKwkvKgorCSoqIFRoZXJlIGlzIG5vIFNMT1RfSU5fVVNFIGVudHJ5IGZvciB0aGlzIFJUQSBhdHRhY2hlZCB0byB0aGUgY3VycmVudAorCSoqIGhvc3QgY2FyZCBpbiB0aGUgZHJpdmVyIHRhYmxlLgorCSoqCisJKiogQ2hlY2sgZm9yIGEgU0xPVF9URU5UQVRJVkUgZW50cnkgZm9yIHRoaXMgUlRBIGF0dGFjaGVkIHRvIHRoZQorCSoqIGN1cnJlbnQgaG9zdCBjYXJkIGluIHRoZSBkcml2ZXIgdGFibGUuCisJKioKKwkqKiBJZiB3ZSBmaW5kIG9uZSwgdGhlbiB3ZSByZS11c2UgdGhhdCBzbG90LgorCSovCisJZm9yICggZW50cnk9MDsgZW50cnk8TUFYX1JVUDsgZW50cnkrKyApCisJeworCSAgICBpZiAoIChIb3N0UC0+TWFwcGluZ1tlbnRyeV0uRmxhZ3MgJiBTTE9UX1RFTlRBVElWRSkgJiYKKwkJIChIb3N0UC0+TWFwcGluZ1tlbnRyeV0uUnRhVW5pcXVlTnVtID09IFJ0YVVuaXEpICkKKwkgICAgeworCQlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorCQl7CisJCSAgICBlbnRyeTIgPSBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uSUQyIC0gMTsKKwkJICAgIGlmICggKEhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uRmxhZ3MgJiBTTE9UX1RFTlRBVElWRSkgJiYKKwkJCSAoSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5SdGFVbmlxdWVOdW0gPT0gUnRhVW5pcSkgKQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiRm91bmQgcHJldmlvdXMgdGVudGF0aXZlIHNsb3RzICglZCslZClcbiIsCisJCQkgZW50cnksIGVudHJ5Mik7CisJCSAgICBlbHNlCisJCQljb250aW51ZTsKKwkJfQorCQllbHNlCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsICJGb3VuZCBwcmV2aW91cyB0ZW50YXRpdmUgc2xvdCAoJWQpXG4iLGVudHJ5KTsKKwkJaWYgKCEgcC0+UklPTm9NZXNzYWdlKQorCQkgICAgY3ByaW50ZigiUlRBIGNvbm5lY3RlZCB0byAlcyAnJXMnICglYykgbm90IGNvbmZpZ3VyZWQuXG4iLE15VHlwZSxNeU5hbWUsTXlMaW5rKydBJyk7CisJCXJldHVybiBUUlVFOworCSAgICB9CisJfQorCisJLyoKKwkqKiBUaGVyZSBpcyBubyBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeSBmb3IgdGhpcyBSVEEKKwkqKiBhdHRhY2hlZCB0byB0aGUgY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIENoZWNrIGlmIHRoZXJlIGlzIGEgU0xPVF9JTl9VU0Ugb3IgU0xPVF9URU5UQVRJVkUgZW50cnkgb24gYW5vdGhlcgorCSoqIGhvc3QgZm9yIHRoaXMgUlRBIGluIHRoZSBkcml2ZXIgdGFibGUuCisJKioKKwkqKiBGb3IgYSBTTE9UX0lOX1VTRSBlbnRyeSBvbiBhbm90aGVyIGhvc3QsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBSVEEKKwkqKiBlbnRyeSBmcm9tIHRoZSBvdGhlciBob3N0IGFuZCBhZGQgaXQgdG8gdGhpcyBob3N0ICh1c2luZyBzb21lIG9mCisJKiogdGhlIGZ1bmN0aW9ucyBmcm9tIHRhYmxlLmMgd2hpY2ggZG8gdGhpcykuCisJKiogRm9yIGEgU0xPVF9URU5UQVRJVkUgZW50cnkgb24gYW5vdGhlciBob3N0LCB3ZSBtdXN0IGNvcGUgd2l0aCB0aGUKKwkqKiBmb2xsb3dpbmcgc2NlbmFyaW86CisJKioKKwkqKiArIFBsdWcgOCBwb3J0IFJUQSBpbnRvIGhvc3QgQS4gKFRoaXMgY3JlYXRlcyBTTE9UX1RFTlRBVElWRSBlbnRyeQorCSoqICAgaW4gdGFibGUpCisJKiogKyBVbnBsdWcgUlRBIGFuZCBwbHVnIGludG8gaG9zdCBCLiAoV2Ugbm93IGhhdmUgMiBTTE9UX1RFTlRBVElWRQorCSoqICAgZW50cmllcykKKwkqKiArIENvbmZpZ3VyZSBSVEEgb24gaG9zdCBCLiAoVGhpcyBzbG90IG5vdyBiZWNvbWVzIFNMT1RfSU5fVVNFKQorCSoqICsgVW5wbHVnIFJUQSBhbmQgcGx1ZyBiYWNrIGludG8gaG9zdCBBLgorCSoqICsgQ29uZmlndXJlIFJUQSBvbiBob3N0IEEuIFdlIG5vdyBoYXZlIHRoZSBzYW1lIFJUQSBjb25maWd1cmVkCisJKiogICB3aXRoIGRpZmZlcmVudCBwb3J0cyBvbiB0d28gZGlmZmVyZW50IGhvc3RzLgorCSovCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiSGF2ZSB3ZSBzZWVuIFJUQSAleCBiZWZvcmU/XG4iLCBSdGFVbmlxICk7CisJZm91bmQgPSAwOworCUZsYWcgPSAwOyAvKiBDb252aW5jZSB0aGUgY29tcGlsZXIgdGhpcyB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCAqLworCWZvciAoIGhvc3QgPSAwOyAhZm91bmQgJiYgKGhvc3QgPCBwLT5SSU9OdW1Ib3N0cyk7IGhvc3QrKyApCisJeworCSAgICBmb3IgKCBydGE9MDsgcnRhPE1BWF9SVVA7IHJ0YSsrICkKKwkgICAgeworCQlpZiAoKHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbcnRhXS5GbGFncyAmCisJCSAoU0xPVF9JTl9VU0UgfCBTTE9UX1RFTlRBVElWRSkpICYmCisJCSAocC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1tydGFdLlJ0YVVuaXF1ZU51bT09UnRhVW5pcSkpCisJCXsKKwkJICAgIEZsYWcgPSBwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3J0YV0uRmxhZ3M7CisJCSAgICBNYXBQID0gJnAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbcnRhXTsKKwkJICAgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJCSAgICB7CisJCQlNYXBQMiA9ICZwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW01hcFAtPklEMiAtIDFdOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVGhpcyBSVEEgaXMgdW5pdHMgJWQrJWQgZnJvbSBob3N0ICVzXG4iLAorCQkJIHJ0YSsxLCBNYXBQLT5JRDIsIHAtPlJJT0hvc3RzW2hvc3RdLk5hbWUpOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiVGhpcyBSVEEgaXMgdW5pdCAlZCBmcm9tIGhvc3QgJXNcbiIsCisJCQkgcnRhKzEsIHAtPlJJT0hvc3RzW2hvc3RdLk5hbWUpOworCQkgICAgZm91bmQgPSAxOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKworCS8qCisJKiogVGhlcmUgaXMgbm8gU0xPVF9JTl9VU0Ugb3IgU0xPVF9URU5UQVRJVkUgZW50cnkgZm9yIHRoaXMgUlRBCisJKiogYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnQgaG9zdCBjYXJkIGluIHRoZSBkcml2ZXIgdGFibGUuCisJKioKKwkqKiBJZiB3ZSBoYXZlIG5vdCBmb3VuZCBhIFNMT1RfSU5fVVNFIG9yIFNMT1RfVEVOVEFUSVZFIGVudHJ5IG9uCisJKiogYW5vdGhlciBob3N0IGZvciB0aGlzIFJUQSBpbiB0aGUgZHJpdmVyIHRhYmxlLi4uCisJKioKKwkqKiBDaGVjayBmb3IgYSBTTE9UX0lOX1VTRSBlbnRyeSBmb3IgdGhpcyBSVEEgaW4gdGhlIGNvbmZpZyB0YWJsZS4KKwkqLworCWlmICggIU1hcFAgKQorCXsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiTG9vayBmb3IgUlRBICV4IGluIFJJT1NhdmVkVGFibGVcbiIsUnRhVW5pcSk7CisJICAgIGZvciAoIHJ0YT0wOyBydGEgPCBUT1RBTF9NQVBfRU5UUklFUzsgcnRhKysgKQorCSAgICB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIkNoZWNrIHRhYmxlIGVudHJ5ICVkICgleCkiLAorCQkgICAgICBydGEsCisJCSAgICAgIHAtPlJJT1NhdmVkVGFibGVbcnRhXS5SdGFVbmlxdWVOdW0pOworCisJCWlmICggKHAtPlJJT1NhdmVkVGFibGVbcnRhXS5GbGFncyAmIFNMT1RfSU5fVVNFKSAmJgorCQkgKHAtPlJJT1NhdmVkVGFibGVbcnRhXS5SdGFVbmlxdWVOdW0gPT0gUnRhVW5pcSkgKQorCQl7CisJCSAgICBNYXBQID0gJnAtPlJJT1NhdmVkVGFibGVbcnRhXTsKKwkJICAgIEZsYWcgPSBwLT5SSU9TYXZlZFRhYmxlW3J0YV0uRmxhZ3M7CisJCSAgICBpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorCQkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlbnRyeTIgPSBydGEgKyAxOyBlbnRyeTIgPCBUT1RBTF9NQVBfRU5UUklFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeTIrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC0+UklPU2F2ZWRUYWJsZVtlbnRyeTJdLlJ0YVVuaXF1ZU51bSA9PSBSdGFVbmlxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hcFAyID0gJnAtPlJJT1NhdmVkVGFibGVbZW50cnkyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlRoaXMgUlRBIGlzIGZyb20gdGFibGUgZW50cmllcyAlZCslZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YSwgZW50cnkyKTsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlRoaXMgUlRBIGlzIGZyb20gdGFibGUgZW50cnkgJWRcbiIsIHJ0YSk7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorCisJLyoKKwkqKiBUaGVyZSBpcyBubyBTTE9UX0lOX1VTRSBvciBTTE9UX1RFTlRBVElWRSBlbnRyeSBmb3IgdGhpcyBSVEEKKwkqKiBhdHRhY2hlZCB0byB0aGUgY3VycmVudCBob3N0IGNhcmQgaW4gdGhlIGRyaXZlciB0YWJsZS4KKwkqKgorCSoqIFdlIG1heSBoYXZlIGZvdW5kIGEgU0xPVF9JTl9VU0UgZW50cnkgb24gYW5vdGhlciBob3N0IGZvciB0aGlzCisJKiogUlRBIGluIHRoZSBjb25maWcgdGFibGUsIG9yIGEgU0xPVF9JTl9VU0Ugb3IgU0xPVF9URU5UQVRJVkUgZW50cnkKKwkqKiBvbiBhbm90aGVyIGhvc3QgZm9yIHRoaXMgUlRBIGluIHRoZSBkcml2ZXIgdGFibGUuCisJKioKKwkqKiBDaGVjayB0aGUgZHJpdmVyIHRhYmxlIGZvciByb29tIHRvIGZpdCB0aGlzIG5ld2x5IGRpc2NvdmVyZWQgUlRBLgorCSoqIFJJT0ZpbmRGcmVlSUQoKSBmaXJzdCBsb29rcyBmb3IgZnJlZSBzbG90cyBhbmQgaWYgaXQgZG9lcyBub3QKKwkqKiBmaW5kIGFueSBmcmVlIHNsb3RzIGl0IHdpbGwgdGhlbiBhdHRlbXB0IHRvIG91c3QgYW55CisJKiogdGVudGF0aXZlIGVudHJ5IGluIHRoZSB0YWJsZS4KKwkqLworCUVtcHR5U2xvdCA9IDE7CisJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKwl7CisJICAgIGlmIChSSU9GaW5kRnJlZUlEKHAsIEhvc3RQLCAmZW50cnksICZlbnRyeTIpID09IDApCisJICAgIHsKKwkJUklPRGVmYXVsdE5hbWUocCwgSG9zdFAsIGVudHJ5KTsKKwkJRmlsbFNsb3QoZW50cnksIGVudHJ5MiwgUnRhVW5pcSwgSG9zdFApOworCQlFbXB0eVNsb3QgPSAwOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIGlmIChSSU9GaW5kRnJlZUlEKHAsIEhvc3RQLCAmZW50cnksIE5VTEwpID09IDApCisJICAgIHsKKwkJUklPRGVmYXVsdE5hbWUocCwgSG9zdFAsIGVudHJ5KTsKKwkJRmlsbFNsb3QoZW50cnksIDAsIFJ0YVVuaXEsIEhvc3RQKTsKKwkJRW1wdHlTbG90ID0gMDsKKwkgICAgfQorCX0KKworCS8qCisJKiogVGhlcmUgaXMgbm8gU0xPVF9JTl9VU0Ugb3IgU0xPVF9URU5UQVRJVkUgZW50cnkgZm9yIHRoaXMgUlRBCisJKiogYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnQgaG9zdCBjYXJkIGluIHRoZSBkcml2ZXIgdGFibGUuCisJKioKKwkqKiBJZiB3ZSBmb3VuZCBhIFNMT1RfSU5fVVNFIGVudHJ5IG9uIGFub3RoZXIgaG9zdCBmb3IgdGhpcworCSoqIFJUQSBpbiB0aGUgY29uZmlnIG9yIGRyaXZlciB0YWJsZSwgYW5kIHRoZXJlIGFyZSBlbm91Z2ggZnJlZQorCSoqIHNsb3RzIGluIHRoZSBkcml2ZXIgdGFibGUsIHRoZW4gd2UgbmVlZCB0byBtb3ZlIGl0IG92ZXIgYW5kCisJKiogZGVsZXRlIGl0IGZyb20gdGhlIG90aGVyIGhvc3QuCisJKiogSWYgd2UgZm91bmQgYSBTTE9UX1RFTlRBVElWRSBlbnRyeSBvbiBhbm90aGVyIGhvc3QgZm9yIHRoaXMKKwkqKiBSVEEgaW4gdGhlIGRyaXZlciB0YWJsZSwganVzdCBkZWxldGUgdGhlIG90aGVyIGhvc3QgZW50cnkuCisJKi8KKwlpZiAoRW1wdHlTbG90ID09IDApCisJeworCSAgICBpZiAoIE1hcFAgKQorCSAgICB7CisJCWlmIChGbGFnICYgU0xPVF9JTl9VU0UpCisJCXsKKwkJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgCisgICAgIlRoaXMgUlRBIGNvbmZpZ3VyZWQgb24gYW5vdGhlciBob3N0IC0gbW92ZSBlbnRyeSB0byBjdXJyZW50IGhvc3QgKDEpXG4iKTsKKwkJICAgIEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5TeXNQb3J0ID0gTWFwUC0+U3lzUG9ydDsKKwkJICAgIENDT1BZKCBNYXBQLT5OYW1lLCBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uTmFtZSwgTUFYX05BTUVfTEVOICk7CisJCSAgICBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uRmxhZ3MgPQorCQkgICAgIFNMT1RfSU5fVVNFIHwgUlRBX0JPT1RFRCB8IFJUQV9ORVdCT09UOworI2lmIE5FRURfVE9fRklYCisJCSAgICBSSU9fU1ZfQlJPQURDQVNUKEhvc3RQLT5zdkZsYWdzW2VudHJ5XSk7CisjZW5kaWYKKwkJICAgIFJJT1JlTWFwUG9ydHMoIHAsIEhvc3RQLCAmSG9zdFAtPk1hcHBpbmdbZW50cnldICk7CisJCSAgICBpZiAoIEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5TeXNQb3J0IDwgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCApCisJCQlwLT5SSU9GaXJzdFBvcnRzQm9vdGVkID0gSG9zdFAtPk1hcHBpbmdbZW50cnldLlN5c1BvcnQ7CisJCSAgICBpZiAoIEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5TeXNQb3J0ID4gcC0+UklPTGFzdFBvcnRzQm9vdGVkICkKKwkJCXAtPlJJT0xhc3RQb3J0c0Jvb3RlZCA9IEhvc3RQLT5NYXBwaW5nW2VudHJ5XS5TeXNQb3J0OworCQkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiU3lzUG9ydCAlZCwgTmFtZSAlc1xuIiwoaW50KU1hcFAtPlN5c1BvcnQsTWFwUC0+TmFtZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0JPT1QsIAorICAgIlRoaXMgUlRBIGhhcyBhIHRlbnRhdGl2ZSBlbnRyeSBvbiBhbm90aGVyIGhvc3QgLSBkZWxldGUgdGhhdCBlbnRyeSAoMSlcbiIpOworCQkgICAgSG9zdFAtPk1hcHBpbmdbZW50cnldLkZsYWdzID0KKwkJICAgICBTTE9UX1RFTlRBVElWRSB8IFJUQV9CT09URUQgfCBSVEFfTkVXQk9PVDsKKyNpZiBORUVEX1RPX0ZJWAorCQkgICAgUklPX1NWX0JST0FEQ0FTVChIb3N0UC0+c3ZGbGFnc1tlbnRyeV0pOworI2VuZGlmCisJCX0KKwkJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKwkJeworCQkgICAgaWYgKEZsYWcgJiBTTE9UX0lOX1VTRSkKKwkJICAgIHsKKwkJCUhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uRmxhZ3MgPSBTTE9UX0lOX1VTRSB8CisJCQkgUlRBX0JPT1RFRCB8IFJUQV9ORVdCT09UIHwgUlRBMTZfU0VDT05EX1NMT1Q7CisjaWYgTkVFRF9UT19GSVgKKwkJCVJJT19TVl9CUk9BRENBU1QoSG9zdFAtPnN2RmxhZ3NbZW50cnkyXSk7CisjZW5kaWYKKwkJCUhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydCA9IE1hcFAyLT5TeXNQb3J0OworCQkJLyoKKwkJCSoqIE1hcCBzZWNvbmQgYmxvY2sgb2YgdHR5cyBmb3IgMTYgcG9ydCBSVEEKKwkJCSovCisJCQlSSU9SZU1hcFBvcnRzKCBwLCBIb3N0UCwgJkhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0gKTsKKwkJICAgICAgIGlmIChIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLlN5c1BvcnQgPCBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkKQorCQkJIHAtPlJJT0ZpcnN0UG9ydHNCb290ZWQgPSBIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLlN5c1BvcnQ7CisJCSAgICAgICBpZiAoSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5TeXNQb3J0ID4gcC0+UklPTGFzdFBvcnRzQm9vdGVkKQorCQkJIHAtPlJJT0xhc3RQb3J0c0Jvb3RlZCA9IEhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydDsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQk9PVCwgIlN5c1BvcnQgJWQsIE5hbWUgJXNcbiIsCisJCQkgICAgICAgKGludClIb3N0UC0+TWFwcGluZ1tlbnRyeTJdLlN5c1BvcnQsCisJCQkgICAgICAgSG9zdFAtPk1hcHBpbmdbZW50cnldLk5hbWUpOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5GbGFncyA9IFNMT1RfVEVOVEFUSVZFIHwKKwkJCSBSVEFfQk9PVEVEIHwgUlRBX05FV0JPT1QgfCBSVEExNl9TRUNPTkRfU0xPVDsKKyNpZiBORUVEX1RPX0ZJWAorCQkJUklPX1NWX0JST0FEQ0FTVChIb3N0UC0+c3ZGbGFnc1tlbnRyeTJdKTsKKyNlbmRpZgorCQkgICAgYnplcm8oIChjYWRkcl90KU1hcFAyLCBzaXplb2Yoc3RydWN0IE1hcCkgKTsKKwkJfQorCQliemVybyggKGNhZGRyX3QpTWFwUCwgc2l6ZW9mKHN0cnVjdCBNYXApICk7CisJCWlmICghIHAtPlJJT05vTWVzc2FnZSkKKwkJICAgIGNwcmludGYoIkFuIG9ycGhhbmVkIFJUQSBoYXMgYmVlbiBhZG9wdGVkIGJ5ICVzICclcycgKCVjKS5cbiIsTXlUeXBlLE15TmFtZSxNeUxpbmsrJ0EnKTsKKwkgICAgfQorCSAgICBlbHNlIGlmICghIHAtPlJJT05vTWVzc2FnZSkKKwkJY3ByaW50ZigiUlRBIGNvbm5lY3RlZCB0byAlcyAnJXMnICglYykgbm90IGNvbmZpZ3VyZWQuXG4iLE15VHlwZSxNeU5hbWUsTXlMaW5rKydBJyk7CisJICAgIFJJT1NldENoYW5nZShwKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQorCisJLyoKKwkqKiBUaGVyZSBpcyBubyByb29tIGluIHRoZSBkcml2ZXIgdGFibGUgdG8gbWFrZSBhbiBlbnRyeSBmb3IgdGhlCisJKiogYm9vdGVkIFJUQS4gS2VlcCBhIG5vdGUgb2YgaXRzIFVuaXEgTnVtIGluIHRoZSBvdmVyZmxvdyB0YWJsZSwKKwkqKiBzbyB3ZSBjYW4gaWdub3JlIGl0J3MgSUQgcmVxdWVzdHMuCisJKi8KKwlpZiAoISBwLT5SSU9Ob01lc3NhZ2UpCisJICAgIGNwcmludGYoIlRoZSBSVEEgY29ubmVjdGVkIHRvICVzICclcycgKCVjKSBjYW5ub3QgYmUgY29uZmlndXJlZC4gIFlvdSBjYW5ub3QgY29uZmlndXJlIG1vcmUgdGhhbiAxMjggcG9ydHMgdG8gb25lIGhvc3QgY2FyZC5cbiIsTXlUeXBlLE15TmFtZSxNeUxpbmsrJ0EnKTsKKwlmb3IgKCBlbnRyeT0wOyBlbnRyeTxIb3N0UC0+TnVtRXh0cmFCb290ZWQ7IGVudHJ5KysgKQorCXsKKwkgICAgaWYgKCBIb3N0UC0+RXh0cmFVbml0c1tlbnRyeV0gPT0gUnRhVW5pcSApCisJICAgIHsKKwkJLyoKKwkJKiogYWxyZWFkeSBnb3QgaXQhCisJCSovCisJCXJldHVybiBUUlVFOworCSAgICB9CisJfQorCS8qCisJKiogSWYgdGhlcmUgaXMgcm9vbSwgYWRkIHRoZSB1bml0IHRvIHRoZSBsaXN0IG9mIGV4dHJhcworCSovCisJaWYgKCBIb3N0UC0+TnVtRXh0cmFCb290ZWQgPCBNQVhfRVhUUkFfVU5JVFMgKQorCSAgICBIb3N0UC0+RXh0cmFVbml0c1tIb3N0UC0+TnVtRXh0cmFCb290ZWQrK10gPSBSdGFVbmlxOworCXJldHVybiBUUlVFOworfQorCisKKy8qCisqKiBJZiB0aGUgUlRBIG9yIGl0cyBob3N0IGFwcGVhcnMgaW4gdGhlIFJJT0JpbmRUYWJbXSBzdHJ1Y3R1cmUgdGhlbgorKiogd2UgbXVzdG4ndCBib290IHRoZSBSVEEgYW5kIHNob3VsZCByZXR1cm4gRkFMU0UuCisqKiBUaGlzIG9wZXJhdGlvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgZHJpdmVycyBmb3IgUklPCisqKiBpbiB0aGF0IHRoaXMgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBuZXcgdXRpbGl0aWVzCisqKiBub3QgY29uZmlnLnJpbyBhbmQgaXMgRkFSIFNJTVBMRVIuCisqKiBXZSBubyBsb25nZXIgc3VwcG9ydCB0aGUgUklPQm9vdE1vZGUgdmFyaWFibGUuIEl0IGlzIGFsbCBkb25lIGZyb20gdGhlCisqKiAiYm9vdC9ub2Jvb3QiIGZpZWxkIGluIHRoZSByaW8uY2YgZmlsZS4KKyovCitpbnQKK1JJT0Jvb3RPayhwLCBIb3N0UCwgUnRhVW5pcSkKK3N0cnVjdCByaW9faW5mbyAqCXA7CitzdHJ1Y3QgSG9zdCAqCQlIb3N0UDsKK3Vsb25nIFJ0YVVuaXE7Cit7CisgICAgaW50CQlFbnRyeTsKKyAgICB1aW50IEhvc3RVbmlxID0gSG9zdFAtPlVuaXF1ZU51bTsKKworCS8qCisJKiogU2VhcmNoIGJpbmRpbmdzIHRhYmxlIGZvciBSVEEgb3IgaXRzIHBhcmVudC4KKwkqKiBJZiBpdCBleGlzdHMsIHJldHVybiAwLCBlbHNlIDEuCisJKi8KKwlmb3IgKEVudHJ5ID0gMDsKKwkgICAgKCBFbnRyeSA8IE1BWF9SVEFfQklORElOR1MgKSAmJiAoIHAtPlJJT0JpbmRUYWJbRW50cnldICE9IDAgKTsKKwkgICAgRW50cnkrKykKKwl7CisJCWlmICggKHAtPlJJT0JpbmRUYWJbRW50cnldID09IEhvc3RVbmlxKSB8fAorCQkgICAgIChwLT5SSU9CaW5kVGFiW0VudHJ5XSA9PSBSdGFVbmlxKSApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisqKiBNYWtlIGFuIGVtcHR5IHNsb3QgdGVudGF0aXZlLiBJZiB0aGlzIGlzIGEgMTYgcG9ydCBSVEEsIG1ha2UgYm90aAorKiogc2xvdHMgdGVudGF0aXZlLCBhbmQgdGhlIHNlY29uZCBvbmUgUlRBX1NFQ09ORF9TTE9UIGFzIHdlbGwuCisqLworCit2b2lkCitGaWxsU2xvdChlbnRyeSwgZW50cnkyLCBSdGFVbmlxLCBIb3N0UCkKK2ludCBlbnRyeTsKK2ludCBlbnRyeTI7Cit1aW50IFJ0YVVuaXE7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7Cit7CisJaW50CQlsaW5rOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19CT09ULCAiRmlsbFNsb3QoJWQsICVkLCAweCV4Li4uKVxuIiwgZW50cnksIGVudHJ5MiwgUnRhVW5pcSk7CisKKwlIb3N0UC0+TWFwcGluZ1tlbnRyeV0uRmxhZ3MgPSAoUlRBX0JPT1RFRCB8IFJUQV9ORVdCT09UIHwgU0xPVF9URU5UQVRJVkUpOworCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5TeXNQb3J0ID0gTk9fUE9SVDsKKwlIb3N0UC0+TWFwcGluZ1tlbnRyeV0uUnRhVW5pcXVlTnVtID0gUnRhVW5pcTsKKwlIb3N0UC0+TWFwcGluZ1tlbnRyeV0uSG9zdFVuaXF1ZU51bSA9IEhvc3RQLT5VbmlxdWVOdW07CisJSG9zdFAtPk1hcHBpbmdbZW50cnldLklEID0gZW50cnkgKyAxOworCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5JRDIgPSAwOworCWlmIChlbnRyeTIpIHsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5GbGFncyA9IChSVEFfQk9PVEVEIHwgUlRBX05FV0JPT1QgfCAKKwkJCQkJCQkJU0xPVF9URU5UQVRJVkUgfCBSVEExNl9TRUNPTkRfU0xPVCk7CisJCUhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uU3lzUG9ydCA9IE5PX1BPUlQ7CisJCUhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uUnRhVW5pcXVlTnVtID0gUnRhVW5pcTsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5Ib3N0VW5pcXVlTnVtID0gSG9zdFAtPlVuaXF1ZU51bTsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5OYW1lWzBdID0gJ1wwJzsKKwkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5JRCA9IGVudHJ5MiArIDE7CisJCUhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uSUQyID0gZW50cnkgKyAxOworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeV0uSUQyID0gZW50cnkyICsgMTsKKwl9CisJLyoKKwkqKiBNdXN0IHNldCB0aGVzZSB1cCwgc28gdGhhdCB1dGlsaXRpZXMgc2hvdworCSoqIHRvcG9sb2d5IG9mIDE2IHBvcnQgUlRBcyBjb3JyZWN0bHkKKwkqLworCWZvciAoIGxpbms9MDsgbGluazxMSU5LU19QRVJfVU5JVDsgbGluaysrICkgeworCQlIb3N0UC0+TWFwcGluZ1tlbnRyeV0uVG9wb2xvZ3lbbGlua10uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCUhvc3RQLT5NYXBwaW5nW2VudHJ5XS5Ub3BvbG9neVtsaW5rXS5MaW5rID0gTk9fTElOSzsKKwkJaWYgKGVudHJ5MikgeworCQkJSG9zdFAtPk1hcHBpbmdbZW50cnkyXS5Ub3BvbG9neVtsaW5rXS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkJCUhvc3RQLT5NYXBwaW5nW2VudHJ5Ml0uVG9wb2xvZ3lbbGlua10uTGluayA9IE5PX0xJTks7CisJCX0KKwl9Cit9CisKKyNpZiAwCisvKgorCUZ1bmN0aW9uOglUaGlzIGZ1bmN0aW9uIGlzIHRvIGRpc2FibGUgdGhlIGRpc2sgaW50ZXJydXB0IAorICAgIFJldHVybnMgOiAgIE5vdGhpbmcKKyovCit2b2lkCitkaXNhYmxlX2ludGVycnVwdCh2ZWN0b3IpCitpbnQJdmVjdG9yOworeworCWludAlwczsKKwlpbnQJdmFsOworCisJZGlzYWJsZShwcyk7CisJaWYgKHZlY3RvciA+IDQwKSAgeworCQl2YWwgPSAxIDw8ICh2ZWN0b3IgLSA0MCk7CisJCV9fb3V0YihTODI1OSsxLCBfX2luYihTODI1OSsxKSB8IHZhbCk7CisJfQorCWVsc2UgeworCQl2YWwgPSAxIDw8ICh2ZWN0b3IgLSAzMik7CisJCV9fb3V0YihNODI1OSsxLCBfX2luYihNODI1OSsxKSB8IHZhbCk7CisJfQorCXJlc3RvcmUocHMpOworfQorCisvKgorCUZ1bmN0aW9uOglUaGlzIGZ1bmN0aW9uIGlzIHRvIGVuYWJsZSB0aGUgZGlzayBpbnRlcnJ1cHQgCisgICAgUmV0dXJucyA6ICAgTm90aGluZworKi8KK3ZvaWQKK2VuYWJsZV9pbnRlcnJ1cHQodmVjdG9yKQoraW50CXZlY3RvcjsKK3sKKwlpbnQJcHM7CisJaW50CXZhbDsKKworCWRpc2FibGUocHMpOworCWlmICh2ZWN0b3IgPiA0MCkgIHsKKwkJdmFsID0gMSA8PCAodmVjdG9yIC0gNDApOworCQl2YWwgPSB+dmFsOworCQlfX291dGIoUzgyNTkrMSwgX19pbmIoUzgyNTkrMSkgJiB2YWwpOworCX0KKwllbHNlIHsKKwkJdmFsID0gMSA8PCAodmVjdG9yIC0gMzIpOworCQl2YWwgPSB+dmFsOworCQlfX291dGIoTTgyNTkrMSwgX19pbmIoTTgyNTkrMSkgJiB2YWwpOworCX0KKwlyZXN0b3JlKHBzKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMDg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY21kLmMKQEAgLTAsMCArMSwxMDQxIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBwb3J0ZWQgZnJvbSB0aGUgZXhpc3RpbmcgU0NPIGRyaXZlciBzb3VyY2UKKyoqCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvY21kLmMKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDEwOjMzOjQxCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDEwOjMzOjQ5CisqKgorKiogIGlkZW50IEAoIylyaW9jbWQuYwkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9jbWRfY19zY2NzXyA9ICJAKCMpcmlvY21kLmMJMS4yIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgorCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisKKworc3RhdGljIHN0cnVjdCBJZGVudGlmeVJ0YSBJZFJ0YTsKK3N0YXRpYyBzdHJ1Y3QgS2lsbE5laWdoYm91ciBLaWxsVW5pdDsKKworaW50CitSSU9Gb2FkUnRhKHN0cnVjdCBIb3N0ICpIb3N0UCwgc3RydWN0IE1hcCAqTWFwUCkKK3sKKwlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJGT0FEIFJUQVxuIik7CisKKwlDbWRCbGtQID0gUklPR2V0Q21kQmxrKCk7CisKKwlpZiAoICFDbWRCbGtQICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkZPQUQgUlRBOiBHZXRDbWRCbGsgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gTWFwUC0+SUQ7CisJQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQubGVuCSAgID0gMHg4NDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSAgID0gSUZPQUQ7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMV0gICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMl0gICA9IElGT0FEX01BR0lDICYgMHhGRjsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVszXSAgID0gKElGT0FEX01BR0lDID4+IDgpICYgMHhGRjsKKworCWlmICggUklPUXVldWVDbWRCbGsoIEhvc3RQLCBNYXBQLT5JRC0xLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJGT0FEIFJUQTogRmFpbGVkIHRvIHF1ZXVlIGZvYWQgY29tbWFuZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitSSU9ab21iaWVSdGEoc3RydWN0IEhvc3QgKkhvc3RQLCBzdHJ1Y3QgTWFwICpNYXBQKQoreworCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlpPTUJJRSBSVEFcbiIpOworCisJQ21kQmxrUCA9IFJJT0dldENtZEJsaygpOworCisJaWYgKCAhQ21kQmxrUCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJaT01CSUUgUlRBOiBHZXRDbWRCbGsgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gTWFwUC0+SUQ7CisJQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQubGVuCSAgID0gMHg4NDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSAgID0gWk9NQklFOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdICAgPSAwOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzJdICAgPSBaT01CSUVfTUFHSUMgJiAweEZGOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzNdICAgPSAoWk9NQklFX01BR0lDID4+IDgpICYgMHhGRjsKKworCWlmICggUklPUXVldWVDbWRCbGsoIEhvc3RQLCBNYXBQLT5JRC0xLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJaT01CSUUgUlRBOiBGYWlsZWQgdG8gcXVldWUgem9tYmllIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludAorUklPQ29tbWFuZFJ0YShzdHJ1Y3QgcmlvX2luZm8gKnAsIHVpbnQgUnRhVW5pcXVlLAorCWludCAoKiBmdW5jKShzdHJ1Y3QgSG9zdCAqSG9zdFAsIHN0cnVjdCBNYXAgKk1hcFApKQoreworCXVpbnQgSG9zdDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ29tbWFuZCBSVEEgMHgleCBmdW5jIDB4JXhcbiIsIFJ0YVVuaXF1ZSwgKGludClmdW5jKTsKKworCWlmICggIVJ0YVVuaXF1ZSApCisJCXJldHVybigwKTsKKworCWZvciAoIEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsKKwkJdWludCBSdGE7CisJCXN0cnVjdCBIb3N0ICpIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKKworCQlmb3IgKCBSdGEgPSAwOyBSdGEgPCBSVEFTX1BFUl9IT1NUOyBSdGErKyApIHsKKwkJCXN0cnVjdCBNYXAgKk1hcFAgPSAmSG9zdFAtPk1hcHBpbmdbUnRhXTsKKworCQkJaWYgKCBNYXBQLT5SdGFVbmlxdWVOdW0gPT0gUnRhVW5pcXVlICkgeworCQkJCXVpbnQgTGluazsKKworCQkJCS8qCisJCQkJKiogbm93LCBsZXRzIGp1c3QgY2hlY2sgd2UgaGF2ZSBhIHJvdXRlIHRvIGl0Li4uCisJCQkJKiogSUYgdGhlIHJvdXRpbmcgc3R1ZmYgaXMgd29ya2luZywgdGhlbiBvbmUgb2YgdGhlCisJCQkJKiogdG9wb2xvZ3kgZW50cmllcyBmb3IgdGhpcyB1bml0IHdpbGwgaGF2ZSBhIGxlZ2l0CisJCQkJKiogcm91dGUgKnNvbWV3aGVyZSouIFdlIGNhcmUgbm90IHdoZXJlIC0gaWYgaXRzIGdvdAorCQkJCSoqIGFueSBjb25uZWN0aW9ucywgd2UgY2FuIGdldCB0byBpdC4KKwkJCQkqLworCQkJCWZvciAoIExpbmsgPSAwOyBMaW5rIDwgTElOS1NfUEVSX1VOSVQ7IExpbmsrKyApIHsKKwkJCQkJaWYgKCBNYXBQLT5Ub3BvbG9neVtMaW5rXS5Vbml0IDw9ICh1Y2hhcilNQVhfUlVQICkgeworCQkJCQkJLyoKKwkJCQkJCSoqIEl0cyB3b3J0aCB0cnlpbmcgdGhlIG9wZXJhdGlvbi4uLgorCQkJCQkJKi8KKwkJCQkJCXJldHVybiAoKmZ1bmMpKCBIb3N0UCwgTWFwUCApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAtRU5YSU87Cit9CisKKworaW50CitSSU9JZGVudGlmeVJ0YShzdHJ1Y3QgcmlvX2luZm8gKnAsIGNhZGRyX3QgYXJnKQoreworCXVpbnQgSG9zdDsKKworCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJklkUnRhLCBzaXplb2YoSWRSdGEpICkgPT0gQ09QWUZBSUwgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUklPX0lERU5USUZZX1JUQSBjb3B5IGZhaWxlZFxuIik7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZm9yICggSG9zdCA9IDAgOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsKKwkJdWludCBSdGE7CisJCXN0cnVjdCBIb3N0ICpIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKKworCQlmb3IgKCBSdGEgPSAwOyBSdGEgPCBSVEFTX1BFUl9IT1NUOyBSdGErKyApIHsKKwkJCXN0cnVjdCBNYXAgKk1hcFAgPSAmSG9zdFAtPk1hcHBpbmdbUnRhXTsKKworCQkJaWYgKCBNYXBQLT5SdGFVbmlxdWVOdW0gPT0gSWRSdGEuUnRhVW5pcXVlICkgeworCQkJCXVpbnQgTGluazsKKwkJCQkvKgorCQkJCSoqIG5vdywgbGV0cyBqdXN0IGNoZWNrIHdlIGhhdmUgYSByb3V0ZSB0byBpdC4uLgorCQkJCSoqIElGIHRoZSByb3V0aW5nIHN0dWZmIGlzIHdvcmtpbmcsIHRoZW4gb25lIG9mIHRoZQorCQkJCSoqIHRvcG9sb2d5IGVudHJpZXMgZm9yIHRoaXMgdW5pdCB3aWxsIGhhdmUgYSBsZWdpdAorCQkJCSoqIHJvdXRlICpzb21ld2hlcmUqLiBXZSBjYXJlIG5vdCB3aGVyZSAtIGlmIGl0cyBnb3QKKwkJCQkqKiBhbnkgY29ubmVjdGlvbnMsIHdlIGNhbiBnZXQgdG8gaXQuCisJCQkJKi8KKwkJCQlmb3IgKCBMaW5rID0gMDsgTGluayA8IExJTktTX1BFUl9VTklUOyBMaW5rKysgKSB7CisJCQkJCWlmICggTWFwUC0+VG9wb2xvZ3lbTGlua10uVW5pdCA8PSAodWNoYXIpTUFYX1JVUCApIHsKKwkJCQkJCS8qCisJCQkJCQkqKiBJdHMgd29ydGggdHJ5aW5nIHRoZSBvcGVyYXRpb24uLi4KKwkJCQkJCSovCisJCQkJCQlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIklERU5USUZZIFJUQVxuIik7CisKKwkJCQkJCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKKworCQkJCQkJaWYgKCAhQ21kQmxrUCApIHsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIklERU5USUZZIFJUQTogR2V0Q21kQmxrIGZhaWxlZFxuIik7CisJCQkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQkJCX0KKwkJCisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gTWFwUC0+SUQ7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQk9PVF9SVVA7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgID0gMDsKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBCT09UX1JVUDsKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5sZW4JICAgPSAweDg0OworCQkJCQkJQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0gICA9IElERU5USUZZOworCQkJCQkJQ21kQmxrUC0+UGFja2V0LmRhdGFbMV0gICA9IDA7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSAgID0gSWRSdGEuSUQ7CisJCQorCQkJCQkJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIE1hcFAtPklELTEsIENtZEJsa1ApID09IFJJT19GQUlMICkgeworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSURFTlRJRlkgUlRBOiBGYWlsZWQgdG8gcXVldWUgY29tbWFuZFxuIik7CisJCQkJCQkJcmV0dXJuIC1FSU87CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0gCisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKworaW50CitSSU9LaWxsTmVpZ2hib3VyKHN0cnVjdCByaW9faW5mbyAqcCwgY2FkZHJfdCBhcmcpCit7CisJdWludCBIb3N0OworCXVpbnQgSUQ7CisJc3RydWN0IEhvc3QgKkhvc3RQOworCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIktJTEwgSE9TVCBORUlHSEJPVVJcbiIpOworCisJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdCkmS2lsbFVuaXQsIHNpemVvZihLaWxsVW5pdCkgKSA9PSBDT1BZRkFJTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSSU9fS0lMTF9ORUlHSEJPVVIgY29weSBmYWlsZWRcbiIpOworCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICggS2lsbFVuaXQuTGluayA+IDMgKQorCQlyZXR1cm4gLUVOWElPOworIAorCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKKworCWlmICggIUNtZEJsa1AgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiVUZPQUQ6IEdldENtZEJsayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSAwOworCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LmxlbgkgICA9IDB4ODQ7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0gICA9IFVGT0FEOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdICAgPSBLaWxsVW5pdC5MaW5rOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzJdICAgPSBVRk9BRF9NQUdJQyAmIDB4RkY7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbM10gICA9IChVRk9BRF9NQUdJQyA+PiA4KSAmIDB4RkY7CisKKwlmb3IgKCBIb3N0ID0gMDsgSG9zdCA8IHAtPlJJT051bUhvc3RzOyBIb3N0KysgKSB7CisJCUlEID0gMDsKKwkJSG9zdFAgPSAmcC0+UklPSG9zdHNbSG9zdF07CisKKwkJaWYgKCBIb3N0UC0+VW5pcXVlTnVtID09IEtpbGxVbml0LlVuaXF1ZU51bSApIHsKKwkJCWlmICggUklPUXVldWVDbWRCbGsoIEhvc3RQLCBSVEFTX1BFUl9IT1NUK0tpbGxVbml0LkxpbmssCisJCQkJCQkJQ21kQmxrUCkgPT0gUklPX0ZBSUwgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJVRk9BRDogRmFpbGVkIHF1ZXVlIGNvbW1hbmRcbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKworCQlmb3IgKCBJRD0wOyBJRCA8IFJUQVNfUEVSX0hPU1Q7IElEKysgKSB7CisJCQlpZiAoIEhvc3RQLT5NYXBwaW5nW0lEXS5SdGFVbmlxdWVOdW0gPT0gS2lsbFVuaXQuVW5pcXVlTnVtICkgeworCQkJCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBJRCsxOworCQkJCWlmICggUklPUXVldWVDbWRCbGsoIEhvc3RQLCBJRCwgQ21kQmxrUCkgPT0gUklPX0ZBSUwgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiVUZPQUQ6IEZhaWxlZCBxdWV1ZSBjb21tYW5kXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU87CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCVJJT0ZyZWVDbWRCbGsoIENtZEJsa1AgKTsKKwlyZXR1cm4gLUVOWElPOworfQorCitpbnQKK1JJT1N1c3BlbmRCb290UnRhKHN0cnVjdCBIb3N0ICpIb3N0UCwgaW50IElELCBpbnQgTGluaykKK3sKKwlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJTVVNQRU5EIEJPT1QgT04gUlRBIElEICVkLCBsaW5rICVjXG4iLCBJRCwgJ0EnICsgTGluayk7CisKKwlDbWRCbGtQID0gUklPR2V0Q21kQmxrKCk7CisKKwlpZiAoICFDbWRCbGtQICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlNVU1BFTkQgQk9PVCBPTiBSVEE6IEdldENtZEJsayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBJRDsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQk9PVF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ICA9IDA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ICA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5sZW4JICAgPSAweDg0OworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzBdICAgPSBJV0FJVDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsxXSAgID0gTGluazsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSAgID0gSVdBSVRfTUFHSUMgJiAweEZGOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzNdICAgPSAoSVdBSVRfTUFHSUMgPj4gOCkgJiAweEZGOworCisJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIElEIC0gMSwgQ21kQmxrUCkgPT0gUklPX0ZBSUwgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiU1VTUEVORCBCT09UIE9OIFJUQTogRmFpbGVkIHRvIHF1ZXVlIGl3YWl0IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludAorUklPRm9hZFdha2V1cChzdHJ1Y3QgcmlvX2luZm8gKnApCit7CisJaW50IHBvcnQ7CisJcmVnaXN0ZXIgc3RydWN0IFBvcnQgKlBvcnRQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmb3IgKCBwb3J0PTA7IHBvcnQ8UklPX1BPUlRTOyBwb3J0KyspIHsKKwkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCVBvcnRQLT5Db25maWcgPSAwOworCQlQb3J0UC0+U3RhdGUgPSAwOworCQlQb3J0UC0+SW5Vc2UgPSBOT1RfSU5VU0U7CisJCVBvcnRQLT5Qb3J0U3RhdGUgPSAwOworCQlQb3J0UC0+Rmx1c2hDbWRCb2RnZSA9IDA7CisJCVBvcnRQLT5Nb2RlbUxpbmVzID0gMDsKKwkJUG9ydFAtPk1vZGVtU3RhdGUgPSAwOworCQlQb3J0UC0+Q29va01vZGUgPSAwOworCQlQb3J0UC0+UGFyYW1TZW0gPSAwOworCQlQb3J0UC0+TWFwcGVkID0gMDsKKwkJUG9ydFAtPldmbHVzaEZsYWcgPSAwOworCQlQb3J0UC0+TWFnaWNGbGFncyA9IDA7CisJCVBvcnRQLT5SeERhdGFTdGFydCA9IDA7CisJCVBvcnRQLT5UeEJ1ZmZlckluID0gMDsKKwkJUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJfQorCXJldHVybigwKTsKK30KKworLyoKKyoqIEluY29taW5nIGNvbW1hbmQgb24gdGhlIENPTU1BTkRfUlVQIHRvIGJlIHByb2Nlc3NlZC4KKyovCitzdGF0aWMgaW50CitSSU9Db21tYW5kUnVwKHN0cnVjdCByaW9faW5mbyAqcCwgdWludCBSdXAsIHN0cnVjdCBIb3N0ICpIb3N0UCwgUEtUICpQYWNrZXRQKQoreworCXN0cnVjdCBQa3RDbWQgKlBrdENtZFAgPSAoc3RydWN0IFBrdENtZCAqKVBhY2tldFAtPmRhdGE7CisJc3RydWN0IFBvcnQgKlBvcnRQOworCXN0cnVjdCBVbml4UnVwICpVbml4UnVwUDsKKwl1c2hvcnQgU3lzUG9ydDsKKwl1c2hvcnQgUmVwb3J0ZWRNb2RlbVN0YXR1czsKKwl1c2hvcnQgcnVwOworCXVzaG9ydCBzdWJDb21tYW5kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmdW5jX2VudGVyICgpOworCisjaWZkZWYgQ0hFQ0sKKwlDaGVja0hvc3QoIEhvc3QgKTsKKwlDaGVja0hvc3RQKCBIb3N0UCApOworCUNoZWNrUGFja2V0UCggUGFja2V0UCApOworI2VuZGlmCisKKwkvKgorCSoqIDE2IHBvcnQgUlRBIG5vdGU6CisJKiogQ29tbWFuZCBydXAgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgUlRBIHdpbGwgaGF2ZSBwa3QtPmRhdGFbMV0gKHdoaWNoCisJKiogdHJhbnNsYXRlcyB0byBQa3RDbWRQLT5QaGJOdW0pIHNldCB0byB0aGUgaG9zdCBwb3J0IG51bWJlciBmb3IgdGhlCisJKiogcGFydGljdWxhciB1bml0LiBUbyBhY2Nlc3MgdGhlIGNvcnJlY3QgQmFzZVN5c1BvcnQgZm9yIGEgMTYgcG9ydCBSVEEsCisJKiogd2UgY2FuIHVzZSBQaGJOdW0gdG8gZ2V0IHRoZSBydXAgbnVtYmVyIGZvciB0aGUgYXBwcm9wcmlhdGUgOCBwb3J0CisJKiogYmxvY2sgKGZvciB0aGUgZmlyc3QgYmxvY2ssIHRoaXMgc2hvdWxkIGJlIGVxdWFsIHRvICdSdXAnKS4KKwkqLworCXJ1cCA9IFJCWVRFKFBrdENtZFAtPlBoYk51bSkgLyAodXNob3J0KVBPUlRTX1BFUl9SVEE7CisJVW5peFJ1cFAgPSAmSG9zdFAtPlVuaXhSdXBzW3J1cF07CisJU3lzUG9ydCA9IFVuaXhSdXBQLT5CYXNlU3lzUG9ydCArIAorCQkJKFJCWVRFKFBrdENtZFAtPlBoYk51bSkgJSAodXNob3J0KVBPUlRTX1BFUl9SVEEpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ29tbWFuZCBvbiBydXAgJWQsIHBvcnQgJWRcbiIsIHJ1cCwgU3lzUG9ydCk7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrUnVwKCBydXAgKTsKKwlDaGVja1VuaXhSdXBQKCBVbml4UnVwUCApOworI2VuZGlmCisJaWYgKCBVbml4UnVwUC0+QmFzZVN5c1BvcnQgPT0gTk9fUE9SVCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJPQlNDVVJFIEVSUk9SIVxuIik7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiRGlhZ25vc3RpY3MgZm9sbG93LiBQbGVhc2UgV1JJVEUgVEhFU0UgRE9XTiBhbmQgcmVwb3J0IHRoZW0gdG8gU3BlY2lhbGl4IFRlY2huaWNhbCBTdXBwb3J0XG4iKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDT05UUk9MIGluZm9ybWF0aW9uOiBIb3N0IG51bWJlciAlZCwgbmFtZSBgYCVzJydcbiIsIAorCQkJICAgICBIb3N0UC1wLT5SSU9Ib3N0cywgSG9zdFAtPk5hbWUgKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDT05UUk9MIGluZm9ybWF0aW9uOiBSdXAgbnVtYmVyICAweCV4XG4iLCBydXApOworCisJCWlmICggUnVwID49ICh1c2hvcnQpTUFYX1JVUCApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogVGhpcyBpcyB0aGUgUlVQIGZvciBSVEEgYGAlcycnXG4iLAorCQkJCSAgICAgSG9zdFAtPk1hcHBpbmdbUnVwXS5OYW1lKTsKKwkJfSBlbHNlCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTlRST0wgaW5mb3JtYXRpb246IFRoaXMgaXMgdGhlIFJVUCBmb3IgbGluayBgYCVjJycgb2YgaG9zdCBgYCVzJydcbiIsIAorCQkJCSAgICAgKCdBJyArIFJ1cCAtIE1BWF9SVVApLCBIb3N0UC0+TmFtZSk7CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJQQUNLRVQgaW5mb3JtYXRpb246IERlc3RpbmF0aW9uIDB4JXg6MHgleFxuIiwKKwkJCSAgICAgUGFja2V0UC0+ZGVzdF91bml0LCBQYWNrZXRQLT5kZXN0X3BvcnQgKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJQQUNLRVQgaW5mb3JtYXRpb246IFNvdXJjZQkgIDB4JXg6MHgleFxuIiwKKwkJCSAgICAgUGFja2V0UC0+c3JjX3VuaXQsIFBhY2tldFAtPnNyY19wb3J0ICk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUEFDS0VUIGluZm9ybWF0aW9uOiBMZW5ndGgJICAweCV4ICglZClcbiIsIFBhY2tldFAtPmxlbixQYWNrZXRQLT5sZW4gKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJQQUNLRVQgaW5mb3JtYXRpb246IENvbnRyb2wJIDB4JXggKCVkKVxuIiwgUGFja2V0UC0+Y29udHJvbCwgUGFja2V0UC0+Y29udHJvbCk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUEFDS0VUIGluZm9ybWF0aW9uOiBDaGVjawkgICAweCV4ICglZClcbiIsIFBhY2tldFAtPmNzdW0sIFBhY2tldFAtPmNzdW0gKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDT01NQU5EIGluZm9ybWF0aW9uOiBIb3N0IFBvcnQgTnVtYmVyIDB4JXgsICIKKwkJCQkJIkNvbW1hbmQgQ29kZSAweCV4XG4iLCBQa3RDbWRQLT5QaGJOdW0sIFBrdENtZFAtPkNvbW1hbmQgKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisjaWZkZWYgQ0hFQ0sKKwlDaGVja1N5c1BvcnQoIFN5c1BvcnQgKTsKKyNlbmRpZgorCVBvcnRQID0gcC0+UklPUG9ydHBbIFN5c1BvcnQgXTsKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJc3dpdGNoKCBSQllURShQa3RDbWRQLT5Db21tYW5kKSApIHsKKwkJY2FzZSBCUkVBS19SRUNFSVZFRDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUmVjZWl2ZWQgYSBicmVhayFcbiIpOworCQkJLyogSWYgdGhlIGN1cnJlbnQgbGluZSBkaXNjLiBpcyBub3QgbXVsdGktdGhyZWFkaW5nIGFuZAorCSAgIAkJCXRoZSBjdXJyZW50IHByb2Nlc3NvciBpcyBub3QgdGhlIGRlZmF1bHQsIHJlc2V0IHJ1cF9pbnRyCisJICAgCQkJYW5kIHJldHVybiBGQUxTRSB0byBlbnN1cmUgdGhhdCB0aGUgY29tbWFuZCBwYWNrZXQgaXMKKwkgICAJCQlub3QgZnJlZWQuICovCisJCQkvKiBDYWxsIHRtZ3IgSEFOR1VQIEhFUkUgKi8KKwkJCS8qIEZpeCB0aGlzIGxhdGVyIHdoZW4gZXZlcnkgdGhpbmcgd29ya3MgISEhISBSQU1SQUogKi8KKwkJCWdzX2dvdF9icmVhayAoJlBvcnRQLT5ncyk7CisJCQlicmVhazsKKworCQljYXNlIENPTVBMRVRFOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIGNvbXBsZXRlIG9uIHBoYiAlZCBob3N0ICVkXG4iLAorCQkJICAgICBSQllURShQa3RDbWRQLT5QaGJOdW0pLCBIb3N0UC1wLT5SSU9Ib3N0cyk7CisJCQlzdWJDb21tYW5kID0gMTsKKwkJCXN3aXRjaCAoUkJZVEUoUGt0Q21kUC0+U3ViQ29tbWFuZCkpIHsKKwkJCQljYXNlIE1FTURVTVAgOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJNZW1vcnkgZHVtcCBjbWQgKDB4JXgpIGZyb20gYWRkciAweCV4XG4iLAorCQkJCSAgICAgUkJZVEUoUGt0Q21kUC0+U3ViQ29tbWFuZCksIFJXT1JEKFBrdENtZFAtPlN1YkFkZHIpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRUFEX1JFR0lTVEVSIDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUmVhZCByZWdpc3RlciAoMHgleClcbiIsIFJXT1JEKFBrdENtZFAtPlN1YkFkZHIpKTsKKwkJCQkJcC0+Q2RSZWdpc3RlciA9IChSQllURShQa3RDbWRQLT5Nb2RlbVN0YXR1cykgJiBNU1ZSMV9IT1NUKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCXN1YkNvbW1hbmQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN1YkNvbW1hbmQpCisJCQkJYnJlYWs7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk5ldyBzdGF0dXMgaXMgMHgleCB3YXMgMHgleFxuIiwKKwkJCQkgICAgIFJCWVRFKFBrdENtZFAtPlBvcnRTdGF0dXMpLFBvcnRQLT5Qb3J0U3RhdGUpOworCQkJaWYgKFBvcnRQLT5Qb3J0U3RhdGUgIT0gUkJZVEUoUGt0Q21kUC0+UG9ydFN0YXR1cykpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk1hcmsgc3RhdHVzICYgd2FrZXVwXG4iKTsKKwkJCQlQb3J0UC0+UG9ydFN0YXRlID0gUkJZVEUoUGt0Q21kUC0+UG9ydFN0YXR1cyk7CisJCQkJLyogV2hhdCBzaG91bGQgd2UgZG8gaGVyZSAuLi4KKwkJCQl3YWtldXAoICZQb3J0UC0+UG9ydFN0YXRlICk7CisJCQkJKi8KKwkJfSBlbHNlIAorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJObyBjaGFuZ2VcbiIpOworCisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIE1PREVNX1NUQVRVUzoKKwkJCS8qCisJCQkqKiBLbm9jayBvdXQgdGhlIHRidXN5IGFuZCB0c3RvcCBiaXRzLCBhcyB0aGVzZSBhcmUgbm90IHJlbGV2YW50CisJCQkqKiB0byB0aGUgY2hlY2sgZm9yIG1vZGVtIHN0YXR1cyBjaGFuZ2UgKHRoZXkncmUganVzdCB0aGVyZSBiZWNhdXNlCisJCQkqKiBpdCdzIGEgY29udmVuaWVudCBwbGFjZSB0byBwdXQgdGhlbSEpLgorCQkJKi8KKwkJCVJlcG9ydGVkTW9kZW1TdGF0dXMgPSBSQllURShQa3RDbWRQLT5Nb2RlbVN0YXR1cyk7CisJCQlpZiAoKFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfSE9TVCkgPT0KKwkJCQkJKFJlcG9ydGVkTW9kZW1TdGF0dXMgJiBNU1ZSMV9IT1NUKSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiTW9kZW0gc3RhdHVzIHVuY2hhbmdlZCAweCV4XG4iLCBQb3J0UC0+TW9kZW1TdGF0ZSk7CisJCQkJLyoKKwkJCQkqKiBVcGRhdGUgTW9kZW1TdGF0ZSBqdXN0IGluIGNhc2UgdGJ1c3kgb3IgdHN0b3Agc3RhdGVzIGhhdmUKKwkJCQkqKiBjaGFuZ2VkLgorCQkJCSovCisJCQkJUG9ydFAtPk1vZGVtU3RhdGUgPSBSZXBvcnRlZE1vZGVtU3RhdHVzOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJNb2RlbSBzdGF0dXMgY2hhbmdlIGZyb20gMHgleCB0byAweCV4XG4iLAorCQkJCSAgICAgUG9ydFAtPk1vZGVtU3RhdGUsIFJlcG9ydGVkTW9kZW1TdGF0dXMpOworCQkJCVBvcnRQLT5Nb2RlbVN0YXRlID0gUmVwb3J0ZWRNb2RlbVN0YXR1czsKKyNpZmRlZiBNT0RFTV9TVVBQT1JUCisJCQkJaWYgKCBQb3J0UC0+TWFwcGVkICkgeworCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKwkJCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkJKioqCQkJCQkJCQkJCQkJCSAgICoqKgorCQkJCSoqKgkJICBNIE8gRCBFIE0gICBTIFQgQSBUIEUgICBDIEggQSBOIEcgRQkJICAqKioKKwkJCQkqKioJCQkJCQkJCQkJCQkJICAgKioqCisJCQkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJCVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJCQkvKgorCQkJCSoqIElmIHRoZSBkZXZpY2UgaXMgYSBtb2RlbSwgdGhlbiBjaGVjayB0aGUgbW9kZW0KKwkJCQkqKiBjYXJyaWVyLgorCQkJCSovCisJCQkJaWYgKFBvcnRQLT5ncy50dHkgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKFBvcnRQLT5ncy50dHktPnRlcm1pb3MgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkgIAorCQkJCWlmICghKFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmCisJCQkJKChQb3J0UC0+U3RhdGUgJiAoUklPX01PUEVOfFJJT19XT1BFTikpKSkgeworCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSXMgdGhlcmUgYSBDYXJyaWVyP1xuIik7CisJCQkvKgorCQkJKiogSXMgdGhlcmUgYSBjYXJyaWVyPworCQkJKi8KKwkJCQkJaWYgKCBQb3J0UC0+TW9kZW1TdGF0ZSAmIE1TVlIxX0NEICkgeworCQkJLyoKKwkJCSoqIEhhcyBjYXJyaWVyIGp1c3QgYXBwZWFyZWQ/CisJCQkqLworCQkJCQkJaWYgKCEoUG9ydFAtPlN0YXRlICYgUklPX0NBUlJfT04pKSB7CisJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDYXJyaWVyIGp1c3QgY2FtZSB1cC5cbiIpOworCQkJCQkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQ0FSUl9PTjsKKwkJCQkvKgorCQkJCSoqIHdha2V1cCBhbnlvbmUgaW4gV09QRU4KKwkJCQkqLworCQkJCQkJCWlmIChQb3J0UC0+U3RhdGUgJiAoUE9SVF9JU09QRU4gfCBSSU9fV09QRU4pICkKKwkJCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmUG9ydFAtPmdzLm9wZW5fd2FpdCk7CisjaWZkZWYgU1RBVFMKKwkJCQlQb3J0UC0+U3RhdC5Nb2RlbU9uQ250Kys7CisjZW5kaWYKKwkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCS8qCisJCQkqKiBIYXMgY2FycmllciBqdXN0IGRyb3BwZWQ/CisJCQkqLworCQkJCQkJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19DQVJSX09OKSB7CisJCQkJCQkJaWYgKFBvcnRQLT5TdGF0ZSAmIChQT1JUX0lTT1BFTnxSSU9fV09QRU58UklPX01PUEVOKSkKKwkJCQkJCQkJdHR5X2hhbmd1cCAoUG9ydFAtPmdzLnR0eSk7CisJCQkJCQkJUG9ydFAtPlN0YXRlICY9IH5SSU9fQ0FSUl9PTjsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNhcnJpcmVyIGp1c3Qgd2VudCBkb3duXG4iKTsKKyNpZmRlZiBTVEFUUworCQkJCVBvcnRQLT5TdGF0Lk1vZGVtT2ZmQ250Kys7CisjZW5kaWYKKwkJCX0KKwkJCX0KKwkJfQorCQl9CisjZW5kaWYKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlVua25vd24gY29tbWFuZCAlZCBvbiBDTURfUlVQIG9mIGhvc3QgJWRcbiIsCisJCQkgICAgIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpLEhvc3RQLXAtPlJJT0hvc3RzKTsKKwkJCWJyZWFrOworCX0KKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCWZ1bmNfZXhpdCAoKTsKKworCXJldHVybiBUUlVFOworfQorLyoKKyoqIFRoZSBjb21tYW5kIG1lY2hhbmlzbToKKyoqCUVhY2ggcnVwIGhhcyBhIGNoYWluIG9mIGNvbW1hbmRzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyoqCVRoaXMgY2hhaW4gaXMgbWFpbnRhaW5lZCBieSByb3V0aW5lcyBpbiB0aGlzIGZpbGUuCisqKglQZXJpb2RpY2FsbHkgd2UgYXJlIGNhbGxlZCBhbmQgd2UgcnVuIGEgcXVpY2sgY2hlY2sgb2YgYWxsIHRoZQorKioJYWN0aXZlIGNoYWlucyB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLAorKioJYW5kIGlmIHRoZSBydXAgaXMgcmVhZHkgdG8gYWNjZXB0IGl0LgorKioKKyovCisKKy8qCisqKiBBbGxvY2F0ZSBhbiBlbXB0eSBjb21tYW5kIGJsb2NrLgorKi8KK3N0cnVjdCBDbWRCbGsgKgorUklPR2V0Q21kQmxrKHZvaWQpCit7CisJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKKworCUNtZEJsa1AgPSAoc3RydWN0IENtZEJsayAqKXN5c2JyayhzaXplb2Yoc3RydWN0IENtZEJsaykpOworCWlmIChDbWRCbGtQKQorCQliemVybyhDbWRCbGtQLCBzaXplb2Yoc3RydWN0IENtZEJsaykpOworCisJcmV0dXJuIENtZEJsa1A7Cit9CisKKy8qCisqKiBSZXR1cm4gYSBibG9jayB0byB0aGUgaGVhZCBvZiB0aGUgZnJlZSBsaXN0LgorKi8KK3ZvaWQKK1JJT0ZyZWVDbWRCbGsoc3RydWN0IENtZEJsayAqQ21kQmxrUCkKK3sKKwlzeXNmcmVlKCh2b2lkICopQ21kQmxrUCwgc2l6ZW9mKHN0cnVjdCBDbWRCbGspKTsKK30KKworLyoKKyoqIGF0dGFjaCBhIGNvbW1hbmQgYmxvY2sgdG8gdGhlIGxpc3Qgb2YgY29tbWFuZHMgdG8gYmUgcGVyZm9ybWVkIGZvcgorKiogYSBnaXZlbiBydXAuCisqLworaW50CitSSU9RdWV1ZUNtZEJsayhzdHJ1Y3QgSG9zdCAqSG9zdFAsIHVpbnQgUnVwLCBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQKQoreworCXN0cnVjdCBDbWRCbGsgKipCYXNlOworCXN0cnVjdCBVbml4UnVwICpVbml4UnVwUDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQ0hFQ0sKKwlDaGVja0hvc3RQKCBIb3N0UCApOworCUNoZWNrUnVwKCBSdXAgKTsKKwlDaGVja0NtZEJsa1AoIENtZEJsa1AgKTsKKyNlbmRpZgorCWlmICggUnVwID49ICh1c2hvcnQpKE1BWF9SVVArTElOS1NfUEVSX1VOSVQpICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIklsbGVnYWwgcnVwIG51bWJlciAlZCBpbiBSSU9RdWV1ZUNtZEJsa1xuIixSdXApOworCQlSSU9GcmVlQ21kQmxrKCBDbWRCbGtQICk7CisJCXJldHVybiBSSU9fRkFJTDsKKwl9CisKKwlVbml4UnVwUCA9ICZIb3N0UC0+VW5peFJ1cHNbUnVwXTsKKworCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKworCS8qCisJKiogSWYgdGhlIFJVUCBpcyBjdXJyZW50bHkgaW5hY3RpdmUsIHRoZW4gcHV0IHRoZSByZXF1ZXN0CisJKiogc3RyYWlnaHQgb24gdGhlIFJVUC4uLi4KKwkqLworCWlmICggKFVuaXhSdXBQLT5DbWRzV2FpdGluZ1AgPT0gTlVMTCkgJiYgKFVuaXhSdXBQLT5DbWRQZW5kaW5nUCA9PSBOVUxMKSAmJiAKKwkgICAgIChSV09SRChVbml4UnVwUC0+UnVwUC0+dHhjb250cm9sKSA9PSBUWF9SVVBfSU5BQ1RJVkUgKSAmJgorCQkoQ21kQmxrUC0+UHJlRnVuY1AgPyAoKkNtZEJsa1AtPlByZUZ1bmNQKShDbWRCbGtQLT5QcmVBcmcsQ21kQmxrUCkKKwkJCQkJCQk6VFJVRSkpIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSVVAgaW5hY3RpdmUtcGxhY2luZyBjb21tYW5kIHN0cmFpZ2h0IG9uLiBDbWQgYnl0ZSBpcyAweCV4XG4iLAorCQkJCQkgICAgIENtZEJsa1AtPlBhY2tldC5kYXRhWzBdKTsKKworCQkvKgorCQkqKiBXaGFtbXkhIGJsYXQgdGhhdCBwYWNrIQorCQkqLworCQlIb3N0UC0+Q29weSggKGNhZGRyX3QpJkNtZEJsa1AtPlBhY2tldCwgCisJCQlSSU9fUFRSKEhvc3RQLT5DYWRkciwgVW5peFJ1cFAtPlJ1cFAtPnR4cGt0ICksIHNpemVvZihQS1QpICk7CisKKwkJLyoKKwkJKiogcGxhY2UgY29tbWFuZCBwYWNrZXQgb24gdGhlIHBlbmRpbmcgcG9zaXRpb24uCisJCSovCisJCVVuaXhSdXBQLT5DbWRQZW5kaW5nUCA9IENtZEJsa1A7CisKKwkJLyoKKwkJKiogc2V0IHRoZSBjb21tYW5kIHJlZ2lzdGVyCisJCSovCisJCVdXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wgLCBUWF9QQUNLRVRfUkVBRFkpOworCisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCisJCXJldHVybiBSSU9fU1VDQ0VTUzsKKwl9CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSVVAgYWN0aXZlIC0gZW4tcXVlaW5nXG4iKTsKKworCWlmICggVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCAhPSBOVUxMKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJ1cCBhY3RpdmUgLSBjb21tYW5kIHdhaXRpbmdcbiIpOworCWlmICggVW5peFJ1cFAtPkNtZFBlbmRpbmdQICE9IE5VTEwgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJ1cCBhY3RpdmUgLSBjb21tYW5kIHBlbmRpbmdcbiIpOworCWlmICggUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCkgIT0gVFhfUlVQX0lOQUNUSVZFICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSdXAgYWN0aXZlIC0gY29tbWFuZCBydXAgbm90IHJlYWR5XG4iKTsKKworCUJhc2UgPSAmVW5peFJ1cFAtPkNtZHNXYWl0aW5nUDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiRmlyc3QgdHJ5IHRvIHF1ZXVlIGNtZGJsayAweCV4IGF0IDB4JXhcbiIsIChpbnQpQ21kQmxrUCwoaW50KUJhc2UpOworCisJd2hpbGUgKCAqQmFzZSApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIGNtZGJsayAweCV4IGhlcmVcbiIsIChpbnQpKCpCYXNlKSk7CisJCUJhc2UgPSAmKCgqQmFzZSktPk5leHRQKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJOb3cgdHJ5IHRvIHF1ZXVlIGNtZCBjbWRibGsgMHgleCBhdCAweCV4XG4iLAorCQkJCQkgICAgIChpbnQpQ21kQmxrUCwoaW50KUJhc2UpOworCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiV2lsbCBxdWV1ZSBjbWRibGsgMHgleCBhdCAweCV4XG4iLChpbnQpQ21kQmxrUCwoaW50KUJhc2UpOworCisJKkJhc2UgPSBDbWRCbGtQOworCisJQ21kQmxrUC0+TmV4dFAgPSBOVUxMOworCisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gUklPX1NVQ0NFU1M7Cit9CisKKy8qCisqKiBIZXJlIHdlIGdvIC0gaWYgdGhlcmUgaXMgYW4gZW1wdHkgcnVwLCBmaWxsIGl0IQorKiogbXVzdCBiZSBjYWxsZWQgYXQgc3BscmlvKCkgb3IgaGlnaGVyLgorKi8KK3ZvaWQKK1JJT1BvbGxIb3N0Q29tbWFuZHMoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFApCit7CisJcmVnaXN0ZXIgc3RydWN0IENtZEJsayAqQ21kQmxrUDsKKwlyZWdpc3RlciBzdHJ1Y3QgVW5peFJ1cCAqVW5peFJ1cFA7CisJc3RydWN0IFBLVCAqUGFja2V0UDsKKwl1c2hvcnQgUnVwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCVJ1cCA9IE1BWF9SVVArTElOS1NfUEVSX1VOSVQ7CisKKwlkbyB7CS8qIGRvIHRoaXMgbG9vcCBmb3IgZWFjaCBSVVAgKi8KKwkJLyoKKwkJKiogbG9jYXRlIHRoZSBydXAgd2UgYXJlIHByb2Nlc3NpbmcgJiBsb2NrIGl0CisJCSovCisJCVVuaXhSdXBQID0gJkhvc3RQLT5Vbml4UnVwc1stLVJ1cF07CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJKiogRmlyc3QgY2hlY2sgZm9yIGluY29taW5nIGNvbW1hbmRzOgorCQkqLworCQlpZiAoIFJXT1JEKFVuaXhSdXBQLT5SdXBQLT5yeGNvbnRyb2wpICE9IFJYX1JVUF9JTkFDVElWRSApIHsKKwkJCWludCBGcmVlTWU7CisKKwkJCVBhY2tldFAgPShQS1QgKilSSU9fUFRSKEhvc3RQLT5DYWRkcixSV09SRChVbml4UnVwUC0+UnVwUC0+cnhwa3QpKTsKKworCQkJU2hvd1BhY2tldCggREJHX0NNRCwgUGFja2V0UCApOworCisJCQlzd2l0Y2ggKCBSQllURShQYWNrZXRQLT5kZXN0X3BvcnQpICkgeworCQkJCWNhc2UgQk9PVF9SVVA6CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSW5jb21pbmcgQm9vdCAlcyBwYWNrZXQgJyV4J1xuIiwgCisJCQkJCQlSQllURShQYWNrZXRQLT5sZW4pICYgMHg4MCA/ICJDb21tYW5kIjoiRGF0YSIsIAorCQkJCQkJCSAgICAgUkJZVEUoUGFja2V0UC0+ZGF0YVswXSkpOyAKKwkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQkJCUZyZWVNZT0gUklPQm9vdFJ1cChwLCBSdXAsSG9zdFAsUGFja2V0UCk7CisJCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIENPTU1BTkRfUlVQOgorCQkJCQkvKgorCQkJCQkqKiBGcmVlIHRoZSBSVVAgbG9jayBhcyBsb3NzIG9mIGNhcnJpZXIgY2F1c2VzIGEKKwkJCQkJKiogdHR5Zmx1c2ggd2hpY2ggd2lsbCAoZXZlbnR1YWxseSkgY2FsbCBhbm90aGVyCisJCQkJCSoqIHJvdXRpbmUgdGhhdCB1c2VzIHRoZSBSVVAgbG9jay4KKwkJCQkJKi8KKwkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQkJCUZyZWVNZT0gUklPQ29tbWFuZFJ1cChwLCBSdXAsSG9zdFAsUGFja2V0UCk7CisJCQkJCWlmIChQYWNrZXRQLT5kYXRhWzVdID09IE1FTURVTVApIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiTWVtZHVtcCBmcm9tIDB4JXggY29tcGxldGVcbiIsCisJCQkJCQkJCSAgICAgKih1c2hvcnQgKikgJihQYWNrZXRQLT5kYXRhWzZdKSk7CisJCQkJCQlIb3N0UC0+Q29weSggKGNhZGRyX3QpJihQYWNrZXRQLT5kYXRhWzhdKSwgCisJCQkJCQkJCShjYWRkcl90KXAtPlJJT01lbUR1bXAsIDMyICk7CisJCQkJCX0KKwkJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUk9VVEVfUlVQOgorCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQkJCUZyZWVNZSA9IFJJT1JvdXRlUnVwKHAsIFJ1cCwgSG9zdFAsIFBhY2tldFAgKTsKKwkJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCAmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzICk7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJVbmtub3duIFJVUCAlZFxuIiwgUkJZVEUoUGFja2V0UC0+ZGVzdF9wb3J0KSk7CisJCQkJCUZyZWVNZSA9IDE7CisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIEZyZWVNZSApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkZyZWUgcHJvY2Vzc2VkIGluY29taW5nIGNvbW1hbmQgcGFja2V0XG4iKTsKKwkJCQlwdXRfZnJlZV9lbmQoSG9zdFAsUGFja2V0UCk7CisKKwkJCQlXV09SRChVbml4UnVwUC0+UnVwUC0+cnhjb250cm9sICwgUlhfUlVQX0lOQUNUSVZFKTsKKworCQkJCWlmICggUldPUkQoVW5peFJ1cFAtPlJ1cFAtPmhhbmRzaGFrZSk9PVBIQl9IQU5EU0hBS0VfU0VUICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkhhbmRzaGFrZSBydXAgJWRcbiIsUnVwKTsKKwkJCQkJV1dPUkQoVW5peFJ1cFAtPlJ1cFAtPmhhbmRzaGFrZSwKKwkJCQkJCVBIQl9IQU5EU0hBS0VfU0VUfFBIQl9IQU5EU0hBS0VfUkVTRVQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qCisJCSoqIElGIGEgY29tbWFuZCB3YXMgcnVubmluZyBvbiB0aGUgcG9ydCwgCisJCSoqIGFuZCBpdCBoYXMgY29tcGxldGVkLCB0aGVuIHRpZHkgaXQgdXAuCisJCSovCisJCWlmICggKENtZEJsa1AgPSBVbml4UnVwUC0+Q21kUGVuZGluZ1ApICYmIC8qIEFTU0lHTiEgKi8KKwkJICAgICAoUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCkgPT0gVFhfUlVQX0lOQUNUSVZFKSkgeworCQkJLyoKKwkJCSoqIHdlIGFyZSBpZGxlLgorCQkJKiogdGhlcmUgaXMgYSBjb21tYW5kIGluIHBlbmRpbmcuCisJCQkqKiBUaGVyZWZvcmUsIHRoaXMgY29tbWFuZCBoYXMgZmluaXNoZWQuCisJCQkqKiBTbywgd2FrZXVwIHdob2V2ZXIgaXMgd2FpdGluZyBmb3IgaXQgKGFuZCB0ZWxsIHRoZW0KKwkJCSoqIHdoYXQgaGFwcGVuZWQpLgorCQkJKi8KKwkJCWlmICggQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9PSBCT09UX1JVUCApCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJGcmVlIEJvb3QgJXMgQ29tbWFuZCBCbG9jayAnJXgnXG4iLCAKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5sZW4gJiAweDgwID8gIkNvbW1hbmQiOiJEYXRhIiwgCisJCQkJCQkJICAgICBDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSk7CisKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ29tbWFuZCAweCV4IGNvbXBsZXRlZFxuIiwoaW50KUNtZEJsa1ApOworCisJCQkvKgorCQkJKiogQ2xlYXIgdGhlIFJ1cCBsb2NrIHRvIHByZXZlbnQgbXV0dWFsIGV4Y2x1c2lvbi4KKwkJCSovCisJCQlpZiAoIENtZEJsa1AtPlBvc3RGdW5jUCApIHsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwkJCQkoKkNtZEJsa1AtPlBvc3RGdW5jUCkgKENtZEJsa1AtPlBvc3RBcmcsQ21kQmxrUCk7CisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCQkJfQorCisJCQkvKgorCQkJKiogLi4uLmNsZWFyIHRoZSBwZW5kaW5nIGZsYWcuLi4uCisJCQkqLworCQkJVW5peFJ1cFAtPkNtZFBlbmRpbmdQID0gTlVMTDsKKworCQkJLyoKKwkJCSoqIC4uLi5hbmQgcmV0dXJuIHRoZSBjb21tYW5kIGJsb2NrIHRvIHRoZSBmcmVlbGlzdC4KKwkJCSovCisJCQlSSU9GcmVlQ21kQmxrKCBDbWRCbGtQICk7CisJCX0KKworCQkvKgorCQkqKiBJZiB0aGVyZSBpcyBhIGNvbW1hbmQgZm9yIHRoaXMgcnVwLCBhbmQgdGhlIHJ1cAorCQkqKiBpcyBpZGxlLCB0aGVuIHByb2Nlc3MgdGhlIGNvbW1hbmQKKwkJKi8KKwkJaWYgKCAoQ21kQmxrUCA9IFVuaXhSdXBQLT5DbWRzV2FpdGluZ1ApICYmIC8qIEFTU0lHTiEgKi8KKwkJCShVbml4UnVwUC0+Q21kUGVuZGluZ1AgPT0gTlVMTCkgJiYKKwkJICAgICAoUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCkgPT0gVFhfUlVQX0lOQUNUSVZFKSkgeworCQkJLyoKKwkJCSoqIGlmIHRoZSBwcmUtZnVuY3Rpb24gaXMgbm9uLXplcm8sIGNhbGwgaXQuCisJCQkqKiBJZiBpdCByZXR1cm5zIFJJT19GQUlMIHRoZW4gZG9uJ3QKKwkJCSoqIHNlbmQgdGhpcyBjb21tYW5kIHlldCEKKwkJCSovCisjaWZkZWYgQ0hFQ0sKKwkJCUNoZWNrQ21kQmxrUCAoQ21kQmxrUCk7CisjZW5kaWYKKwkJCWlmICggIShDbWRCbGtQLT5QcmVGdW5jUCA/CisJCQkJKCpDbWRCbGtQLT5QcmVGdW5jUCkoQ21kQmxrUC0+UHJlQXJnLCBDbWRCbGtQKSA6IFRSVUUpKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJOb3QgcmVhZHkgdG8gc3RhcnQgY29tbWFuZCAweCV4XG4iLChpbnQpQ21kQmxrUCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlN0YXJ0IG5ldyBjb21tYW5kIDB4JXggQ21kIGJ5dGUgaXMgMHgleFxuIiwKKwkJCQkJCQkgICAgIChpbnQpQ21kQmxrUCwgQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0pOworCQkJCS8qCisJCQkJKiogV2hhbW15ISBibGF0IHRoYXQgcGFjayEKKwkJCQkqLworI2lmZGVmIENIRUNLCisJCQkJQ2hlY2tQYWNrZXRQICgoUEtUICopUklPX1BUUihIb3N0UC0+Q2FkZHIsIFVuaXhSdXBQLT5SdXBQLT50eHBrdCkpOworI2VuZGlmCisJCQkJSG9zdFAtPkNvcHkoIChjYWRkcl90KSZDbWRCbGtQLT5QYWNrZXQsIAorCQkJCQlSSU9fUFRSKEhvc3RQLT5DYWRkciwgVW5peFJ1cFAtPlJ1cFAtPnR4cGt0KSwgc2l6ZW9mKFBLVCkpOworCisJCQkJLyoKKwkJCQkqKiByZW1vdmUgdGhlIGNvbW1hbmQgZnJvbSB0aGUgcnVwIGNvbW1hbmQgcXVldWUuLi4KKwkJCQkqLworCQkJCVVuaXhSdXBQLT5DbWRzV2FpdGluZ1AgPSBDbWRCbGtQLT5OZXh0UDsKKworCQkJCS8qCisJCQkJKiogLi4uYW5kIHBsYWNlIGl0IG9uIHRoZSBwZW5kaW5nIHBvc2l0aW9uLgorCQkJCSovCisJCQkJVW5peFJ1cFAtPkNtZFBlbmRpbmdQID0gQ21kQmxrUDsKKworCQkJCS8qCisJCQkJKiogc2V0IHRoZSBjb21tYW5kIHJlZ2lzdGVyCisJCQkJKi8KKwkJCQlXV09SRChVbml4UnVwUC0+UnVwUC0+dHhjb250cm9sLFRYX1BBQ0tFVF9SRUFEWSk7CisKKwkJCQkvKgorCQkJCSoqIHRoZSBjb21tYW5kIGJsb2NrIHdpbGwgYmUgZnJlZWQKKwkJCQkqKiB3aGVuIHRoZSBjb21tYW5kIGhhcyBiZWVuIHByb2Nlc3NlZC4KKwkJCQkqLworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJfSB3aGlsZSAoIFJ1cCApOworfQorCitpbnQKK1JJT1dGbHVzaE1hcmsoaW50IGlQb3J0UCwgc3RydWN0IENtZEJsayAqQ21kQmxrUCkKK3sKKwlzdHJ1Y3QgUG9ydCAqCVBvcnRQID0gKHN0cnVjdCBQb3J0ICopaVBvcnRQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisjaWZkZWYgQ0hFQ0sKKwlDaGVja1BvcnRQKCBQb3J0UCApOworI2VuZGlmCisJUG9ydFAtPldmbHVzaEZsYWcrKzsKKwlQb3J0UC0+TWFnaWNGbGFncyB8PSBNQUdJQ19GTFVTSDsKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwlyZXR1cm4gUklPVW5Vc2UoIGlQb3J0UCwgQ21kQmxrUCApOworfQorCitpbnQKK1JJT1JGbHVzaEVuYWJsZShpbnQgaVBvcnRQLCBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQKQoreworCXN0cnVjdCBQb3J0ICoJUG9ydFAgPSAoc3RydWN0IFBvcnQgKilpUG9ydFA7CisJUEtUICpQYWNrZXRQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwl3aGlsZSAoIGNhbl9yZW1vdmVfcmVjZWl2ZSgmUGFja2V0UCwgUG9ydFApICkgeworCQlyZW1vdmVfcmVjZWl2ZShQb3J0UCk7CisJCVNob3dQYWNrZXQoREJHX1BST0MsIFBhY2tldFAgKTsKKwkJcHV0X2ZyZWVfZW5kKCBQb3J0UC0+SG9zdFAsIFBhY2tldFAgKTsKKwl9CisKKwlpZiAoIFJXT1JEKFBvcnRQLT5QaGJQLT5oYW5kc2hha2UpPT1QSEJfSEFORFNIQUtFX1NFVCApIHsKKwkJLyoKKwkJKiogTUFHSUMhIChCYXNpY2FsbHksIGhhbmRzaGFrZSB0aGUgUlggYnVmZmVyLCBzbyB0aGF0CisJCSoqIHRoZSBSVEFzIHVwc3RyZWFtIGNhbiBiZSByZS1lbmFibGVkLikKKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJVdGlsOiBTZXQgUlggaGFuZHNoYWtlIGJpdFxuIik7CisJCVdXT1JEKFBvcnRQLT5QaGJQLT5oYW5kc2hha2UsIFBIQl9IQU5EU0hBS0VfU0VUfFBIQl9IQU5EU0hBS0VfUkVTRVQpOworCX0KKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwlyZXR1cm4gUklPVW5Vc2UoIGlQb3J0UCwgQ21kQmxrUCApOworfQorCitpbnQKK1JJT1VuVXNlKGludCBpUG9ydFAsIHN0cnVjdCBDbWRCbGsgKkNtZEJsa1ApCit7CisJc3RydWN0IFBvcnQgKglQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKWlQb3J0UDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisjaWZkZWYgQ0hFQ0sKKwlDaGVja1BvcnRQKCBQb3J0UCApOworI2VuZGlmCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJEZWNyZW1lbnQgaW4gdXNlIGNvdW50IGZvciBwb3J0XG4iKTsKKworCWlmIChQb3J0UC0+SW5Vc2UpIHsKKwkJaWYgKCAtLVBvcnRQLT5JblVzZSAhPSBOT1RfSU5VU0UgKSB7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qCisJKiogV2hpbGUgUG9ydFAtPkluVXNlIGlzIHNldCAoaS5lLiBhIHByZWVtcHRpdmUgY29tbWFuZCBoYXMgYmVlbiBzZW50IHRvCisJKiogdGhlIFJUQSBhbmQgaXMgYXdhaXRpbmcgY29tcGxldGlvbiksIGFueSB0cmFuc21pdCBkYXRhIGlzIHByZXZlbnRlZCBmcm9tCisJKiogYmVpbmcgdHJhbnNmZXJyZWQgZnJvbSB0aGUgd3JpdGUgcXVldWUgaW50byB0aGUgdHJhbnNtaXQgcGFja2V0cworCSoqIChhZGRfdHJhbnNtaXQpIGFuZCBubyBmdXJ0aHVyIHRyYW5zbWl0IGludGVycnVwdCB3aWxsIGJlIHNlbnQgZm9yIHRoYXQKKwkqKiBkYXRhLiBUaGUgbmV4dCBpbnRlcnJ1cHQgd2lsbCBvY2N1ciB1cCB0byA1MDBtcyBsYXRlciAoUklPSW50ciBpcyBjYWxsZWQKKwkqKiB0d2ljZSBhIHNlY29uZCBhcyBhIHNhZnRleSBtZWFzdXJlKS4gVGhpcyB3YXMgdGhlIGNhc2Ugd2hlbiBrZXJtaXQgd2FzCisJKiogdXNlZCB0byBzZW5kIGRhdGEgaW50byBhIFJJTyBwb3J0LiBBZnRlciBlYWNoIHBhY2tldCB3YXMgc2VudCwgVENGTFNICisJKiogd2FzIGNhbGxlZCB0byBmbHVzaCB0aGUgcmVhZCBxdWV1ZSBwcmVlbXB0aXZlbHkuIFBvcnRQLT5JblVzZSB3YXMKKwkqKiBpbmNyZW1lbnRlZCwgdGhlcmVieSBibG9ja2luZyB0aGUgNiBieXRlIGFja25vd2xlZGdlbWVudCBwYWNrZXQKKwkqKiB0cmFuc21pdHRlZCBiYWNrLiBUaGlzIGFja25vd2xlZGdtZW50IGh1bmcgYXJvdW5kIGZvciA1MDBtcyBiZWZvcmUKKwkqKiBiZWluZyBzZW50LCB0aHVzIHJlZHVjaW5nIGlucHV0IHBlcmZvcm1hbmNlIHN1YnN0YW50aWFsbHkhLgorCSoqIFdoZW4gUG9ydFAtPkluVXNlIGJlY29tZXMgTk9UX0lOVVNFLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IGFueSBkYXRhCisJKiogaGFuZ2luZyBhcm91bmQgaW4gdGhlIHRyYW5zbWl0IGJ1ZmZlciBpcyBzZW50IGltbWVkaWF0ZWx5LgorCSovCisJV1dPUkQoUG9ydFAtPkhvc3RQLT5QYXJtTWFwUC0+dHhfaW50ciwgMSk7CisJLyogV2hhdCB0byBkbyBoZXJlIC4uCisJd2FrZXVwKCAoY2FkZHJfdCkmKFBvcnRQLT5JblVzZSkgKTsKKwkqLworCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJldHVybiAwOworfQorCit2b2lkCitTaG93UGFja2V0KHVpbnQgRmxhZ3MsIHN0cnVjdCBQS1QgKlBhY2tldFApCit7Cit9CisKKy8qCisqKiAKKyoqIEhvdyB0byB1c2UgdGhpcyBmaWxlOgorKiogCisqKiBUbyBzZW5kIGEgY29tbWFuZCBkb3duIGEgcnVwLCB5b3UgbmVlZCB0byBhbGxvY2F0ZSBhIGNvbW1hbmQgYmxvY2ssIGZpbGwKKyoqIGluIHRoZSBwYWNrZXQgaW5mb3JtYXRpb24sIGZpbGwgaW4gdGhlIGNvbW1hbmQgbnVtYmVyLCBmaWxsIGluIHRoZSBwcmUtCisqKiBhbmQgcG9zdC0gZnVuY3Rpb25zIGFuZCBhcmd1bWVudHMsIGFuZCB0aGVuIGFkZCB0aGUgY29tbWFuZCBibG9jayB0byB0aGUKKyoqIHF1ZXVlIG9mIGNvbW1hbmQgYmxvY2tzIGZvciB0aGUgcG9ydCBpbiBxdWVzdGlvbi4gV2hlbiB0aGUgcG9ydCBpcyBpZGxlLAorKiogdGhlbiB0aGUgcHJlLWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkLiBJZiB0aGlzIHJldHVybnMgUklPX0ZBSUwgdGhlbiB0aGUKKyoqIGNvbW1hbmQgd2lsbCBiZSByZS1xdWV1ZWQgYW5kIHRyaWVkIGFnYWluIGF0IGEgbGF0ZXIgZGF0ZSAocHJvYmFibHkgaW4gb25lCisqKiBjbG9jayB0aWNrKS4gSWYgdGhlIHByZS1mdW5jdGlvbiByZXR1cm5zIE5PVCBSSU9fRkFJTCwgdGhlbiB0aGUgY29tbWFuZAorKiogcGFja2V0IHdpbGwgYmUgcXVldWVkIG9uIHRoZSBSVVAsIGFuZCB0aGUgdHhjb250cm9sIGZpZWxkIHNldCB0byB0aGUKKyoqIGNvbW1hbmQgbnVtYmVyLiBXaGVuIHRoZSB0eGNvbnRyb2wgZmllbGQgaGFzIGNoYW5nZWQgZnJvbSBiZWluZyB0aGUKKyoqIGNvbW1hbmQgbnVtYmVyLCB0aGVuIHRoZSBwb3N0LWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkLCB3aXRoIHRoZSBhcmd1bWVudAorKiogc3BlY2lmaWVkIGVhcmxpZXIsIGEgcG9pbnRlciB0byB0aGUgY29tbWFuZCBibG9jaywgYW5kIHRoZSB2YWx1ZSBvZgorKiogdHhjb250cm9sLgorKiogCisqKiBUbyBhbGxvY2F0ZSBhIGNvbW1hbmQgYmxvY2ssIGNhbGwgUklPR2V0Q21kQmxrKCkuIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIKKyoqIHRvIHRoZSBjb21tYW5kIGJsb2NrIHN0cnVjdHVyZSBhbGxvY2F0ZWQsIG9yIE5VTEwgaWYgdGhlcmUgYXJlbid0IGFueS4KKyoqIFRoZSBibG9jayB3aWxsIGhhdmUgYmVlbiB6ZXJvZWQgZm9yIHlvdS4KKyoqIAorKiogVGhlIHN0cnVjdHVyZSBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisqKiAKKyoqIHN0cnVjdCBDbWRCbGsKKyoqIHsKKyoqCSBzdHJ1Y3QgQ21kQmxrICpOZXh0UDsJCSAgKiogUG9pbnRlciB0byBuZXh0IGNvbW1hbmQgYmxvY2sgICAqKgorKioJIHN0cnVjdCBQS1QJIFBhY2tldDsJCSoqIEEgcGFja2V0LCB0byBjb3B5IHRvIHRoZSBydXAJKioKKyoqCQkJaW50CSAoKlByZUZ1bmNQKSgpOyAgKiogVGhlIGZ1bmMgdG8gY2FsbCB0byBjaGVjayBpZiBPSyAqKgorKioJCQlpbnQJIFByZUFyZzsJCSoqIFRoZSBhcmcgZm9yIHRoZSBmdW5jCQkJKioKKyoqCQkJaW50CSAoKlBvc3RGdW5jUCkoKTsgKiogVGhlIGZ1bmMgdG8gY2FsbCB3aGVuIGNvbXBsZXRlZCAqKgorKioJCQlpbnQJIFBvc3RBcmc7CSAgICoqIFRoZSBhcmcgZm9yIHRoZSBmdW5jCQkJKioKKyoqIH07CisqKiAKKyoqIFlvdSBuZWVkIHRvIGZpbGwgaW4gQUxMIGZpZWxkcyBFWENFUFQgTmV4dFAsIHdoaWNoIGlzIHVzZWQgdG8gbGluayB0aGUKKyoqIGJsb2NrcyB0b2dldGhlciBlaXRoZXIgb24gdGhlIGZyZWUgbGlzdCBvciBvbiB0aGUgUnVwIGxpc3QuCisqKiAKKyoqIFBhY2tldCBpcyBhbiBhY3R1YWwgcGFja2V0IHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgcGFja2V0CisqKiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1hbmQuIFlvdSBuZWVkIHRvIGZpbGwgaW4gZXZlcnl0aGluZywKKyoqIGFzIHRoZSBjb21tYW5kIHByb2Nlc3NvcmUgZG9lc24ndCBwcm9jZXNzIHRoZSBjb21tYW5kIHBhY2tldCBpbiBhbnkgd2F5LgorKiogCisqKiBUaGUgUHJlRnVuY1AgaXMgY2FsbGVkIGJlZm9yZSB0aGUgcGFja2V0IGlzIGVucXVldWVkIG9uIHRoZSBob3N0IHJ1cC4KKyoqIFByZUZ1bmNQIGlzIGNhbGxlZCBhcyAoKlByZUZ1bmNQKShQcmVBcmcsIENtZEJsa1ApOy4gUHJlRnVuY1AgbXVzdAorKiogcmV0dXJuICFSSU9fRkFJTCB0byBoYXZlIHRoZSBwYWNrZXQgcXVldWVkIG9uIHRoZSBydXAsIGFuZCBSSU9fRkFJTAorKiogaWYgdGhlIHBhY2tldCBpcyBOT1QgdG8gYmUgcXVldWVkLgorKiogCisqKiBUaGUgUG9zdEZ1bmNQIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGhhcyBjb21wbGV0ZWQuIEl0IGlzIGNhbGxlZAorKiogYXMgKCpQb3N0RnVuY1ApKFBvc3RBcmcsIENtZEJsa1AsIHR4Y29udHJvbCk7LiBQb3N0RnVuY1AgaXMgbm90IGV4cGVjdGVkCisqKiB0byByZXR1cm4gYSB2YWx1ZS4gUG9zdEZ1bmNQIGRvZXMgTk9UIG5lZWQgdG8gZnJlZSB0aGUgY29tbWFuZCBibG9jaywKKyoqIGFzIHRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGFmdGVyIFBvc3RGdW5jUCByZXR1cm5zLgorKiogCisqKiBPbmNlIHRoZSBjb21tYW5kIGJsb2NrIGhhcyBiZWVuIGZpbGxlZCBpbiwgaXQgaXMgYXR0YWNoZWQgdG8gdGhlIGNvcnJlY3QKKyoqIHF1ZXVlIGJ5IGNhbGxpbmcgUklPUXVldWVDbWRCbGsoIEhvc3RQLCBSdXAsIENtZEJsa1AgKSB3aGVyZSBIb3N0UCBpcworKiogYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgSG9zdCwgUnVwIGlzIHRoZSBOVU1CRVIgb2YgdGhlIHJ1cCAoTk9UIGEgcG9pbnRlcgorKiogdG8gaXQhKSwgYW5kIENtZEJsa1AgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgYmxvY2sgYWxsb2NhdGVkIHVzaW5nCisqKiBSSU9HZXRDbWRCbGsoKS4KKyoqIAorKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvY3RybC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkMWEyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY3RybC5jCkBAIC0wLDAgKzEsMTg2OSBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvY3RybC5jCisqKglTSUQJCTogMS4zCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMDozMzo0MgorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMDozMzo0OQorKioKKyoqICBpZGVudCBAKCMpcmlvY3RybC5jCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb2N0cmxfY19zY2NzXyA9ICJAKCMpcmlvY3RybC5jCTEuMyI7CisjZW5kaWYKKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKworI2luY2x1ZGUgImxpbnV4X2NvbXBhdC5oIgorI2luY2x1ZGUgInJpb19saW51eC5oIgorI2luY2x1ZGUgInR5cGRlZi5oIgorI2luY2x1ZGUgInBrdC5oIgorI2luY2x1ZGUgImRhZW1vbi5oIgorI2luY2x1ZGUgInJpby5oIgorI2luY2x1ZGUgInJpb3NwYWNlLmgiCisjaW5jbHVkZSAidG9wLmgiCisjaW5jbHVkZSAiY21kcGt0LmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAicmlvdHlwZXMuaCIKKyNpbmNsdWRlICJydXAuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmlvZHJ2ci5oIgorI2luY2x1ZGUgInJpb2luZm8uaCIKKyNpbmNsdWRlICJmdW5jLmgiCisjaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyNpbmNsdWRlICJwYXJtbWFwLmgiCisjaW5jbHVkZSAidW5peHJ1cC5oIgorI2luY2x1ZGUgImJvYXJkLmgiCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAicGhiLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgImNtZGJsay5oIgorI2luY2x1ZGUgInJvdXRlLmgiCisjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgImNpcnJ1cy5oIgorI2luY2x1ZGUgInJpb2lvY3RsLmgiCisKKworc3RhdGljIHN0cnVjdCBMcGJSZXEJIExwYlJlcTsKK3N0YXRpYyBzdHJ1Y3QgUnVwUmVxCSBSdXBSZXE7CitzdGF0aWMgc3RydWN0IFBvcnRSZXEJUG9ydFJlcTsKK3N0YXRpYyBzdHJ1Y3QgSG9zdFJlcQlIb3N0UmVxOworc3RhdGljIHN0cnVjdCBIb3N0RHBSYW0gSG9zdERwUmFtOworc3RhdGljIHN0cnVjdCBEZWJ1Z0N0cmwgRGVidWdDdHJsOworc3RhdGljIHN0cnVjdCBNYXAJCSBNYXBFbnQ7CitzdGF0aWMgc3RydWN0IFBvcnRTZXR1cCBQb3J0U2V0dXA7CitzdGF0aWMgc3RydWN0IERvd25Mb2FkCURvd25Mb2FkOworc3RhdGljIHN0cnVjdCBTZW5kUGFjayAgU2VuZFBhY2s7CisvKiBzdGF0aWMgc3RydWN0IFN0cmVhbUluZm8JU3RyZWFtSW5mbzsgKi8KKy8qIHN0YXRpYyBjaGFyIG1vZGVtdGFibGVbUklPX1BPUlRTXTsgKi8KK3N0YXRpYyBzdHJ1Y3QgU3BlY2lhbFJ1cENtZCBTcGVjaWFsUnVwQ21kOworc3RhdGljIHN0cnVjdCBQb3J0UGFyYW1zIFBvcnRQYXJhbXM7CitzdGF0aWMgc3RydWN0IHBvcnRTdGF0cyBwb3J0U3RhdHM7CisKK3N0YXRpYyBzdHJ1Y3QgU3ViQ21kU3RydWN0IHsKKwl1c2hvcnQJSG9zdDsKKwl1c2hvcnQJUnVwOworCXVzaG9ydAlQb3J0OworCXVzaG9ydAlBZGRyOworfSBTdWJDbWQ7CisKK3N0cnVjdCBQb3J0VHR5IHsKKwl1aW50CQlwb3J0OworCXN0cnVjdCB0dHlzdGF0aWNzCVR0eTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgUG9ydFR0eQlQb3J0VHR5OwordHlwZWRlZiBzdHJ1Y3QgdHR5c3RhdGljcyBURVJNSU87CisKKy8qCisqKiBUaGlzIHRhYmxlIGlzIHVzZWQgd2hlbiB0aGUgY29uZmlnLnJpbyBkb3dubG9hZHMgYmluIGNvZGUgdG8gdGhlCisqKiBkcml2ZXIuIFdlIGluZGV4IHRoZSB0YWJsZSB1c2luZyB0aGUgcHJvZHVjdCBjb2RlLCAwLUYsIGFuZCBjYWxsCisqKiB0aGUgZnVuY3Rpb24gcG9pbnRlZCB0byBieSB0aGUgZW50cnksIHBhc3NpbmcgdGhlIGluZm9ybWF0aW9uCisqKiBhYm91dCB0aGUgYm9vdC4KKyoqIFRoZSBSSU9Cb290Q29kZVVOS05PV04gZW50cnkgaXMgdGhlcmUgdG8gcG9saXRlbHkgdGVsbCB0aGUgY2FsbGluZworKiogcHJvY2VzcyB0byBib2cgb2ZmLgorKi8KK3N0YXRpYyBpbnQgCisoKlJJT0Jvb3RUYWJsZVtNQVhfUFJPRFVDVF0pKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgRG93bkxvYWQgKikgPQoreworLyogMCAqLwlSSU9Cb290Q29kZUhPU1QsCS8qIEhvc3QgQ2FyZCAqLworLyogMSAqLwlSSU9Cb290Q29kZVJUQSwJCS8qIFJUQSAqLworfTsKKworI2RlZmluZSBkcnZfbWFrZWRldihtYWosIG1pbikgKCgoKHVpbnQpIG1haiAmIDB4ZmYpIDw8IDgpIHwgKCh1aW50KSBtaW4gJiAweGZmKSkKKworaW50IGNvcHlpbiAoaW50IGFyZywgY2FkZHJfdCBkcCwgaW50IHNpeikKK3sKKyAgaW50IHJ2OworCisgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkNvcHlpbmcgJWQgYnl0ZXMgZnJvbSB1c2VyICVwIHRvICVwLlxuIiwgc2l6LCAodm9pZCAqKWFyZywgZHApOworICBydiA9IGNvcHlfZnJvbV91c2VyIChkcCwgKHZvaWQgKilhcmcsIHNpeik7CisgIGlmIChydikgcmV0dXJuIENPUFlGQUlMOworICBlbHNlIHJldHVybiBydjsKK30KKworc3RhdGljIGludCBjb3B5b3V0IChjYWRkcl90IGRwLCBpbnQgYXJnLCBpbnQgc2l6KQoreworICBpbnQgcnY7CisKKyAgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29weWluZyAlZCBieXRlcyB0byB1c2VyICVwIGZyb20gJXAuXG4iLCBzaXosICh2b2lkICopYXJnLCBkcCk7CisgIHJ2ID0gY29weV90b191c2VyICgodm9pZCAqKWFyZywgZHAsIHNpeik7CisgIGlmIChydikgcmV0dXJuIENPUFlGQUlMOworICBlbHNlIHJldHVybiBydjsKK30KKworaW50CityaW9jb250cm9sKHAsIGRldiwgY21kLCBhcmcsIHN1KQorc3RydWN0IHJpb19pbmZvCSogcDsKK2Rldl90CQlkZXY7CitpbnQJCWNtZDsKK2NhZGRyX3QJCWFyZzsKK2ludAkJc3U7Cit7CisJdWludAlIb3N0OwkvKiBsZWF2ZSBtZSB1bnNpZ25lZCEgKi8KKwl1aW50CXBvcnQ7CS8qIGFuZCBtZSEgKi8KKwlzdHJ1Y3QgSG9zdAkqSG9zdFA7CisJdXNob3J0CWxvb3A7CisJaW50CQlFbnRyeTsKKwlzdHJ1Y3QgUG9ydAkqUG9ydFA7CisJUEtUCSpQYWNrZXRQOworCWludAkJcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWZ1bmNfZW50ZXIgKCk7CisJCisJLyogQ29uZnVzZSB0aGUgY29tcGlsZXIgdG8gdGhpbmsgdGhhdCB3ZSd2ZSBpbml0aWFsaXplZCB0aGVzZSAqLworCUhvc3Q9MDsKKwlQb3J0UCA9IE5VTEw7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJjb250cm9sIGlvY3RsIGNtZDogMHgleCBhcmc6IDB4JXhcbiIsIGNtZCwgKGludClhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwkJLyoKKwkJKiogUklPX1NFVF9USU1FUgorCQkqKgorCQkqKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBob3N0IGNhcmQgaW50ZXJydXB0IHRpbWVyLgorCQkqKiBJZiB0aGUgaG9zdCBjYXJkIG51bWJlciBpcyAtMSB0aGVuIGFsbCBob3N0IGNhcmRzIGFyZSBjaGFuZ2VkCisJCSoqIG90aGVyd2lzZSBqdXN0IHRoZSBzcGVjaWZpZWQgaG9zdCBjYXJkIHdpbGwgYmUgY2hhbmdlZC4KKwkJKi8KKwkJY2FzZSBSSU9fU0VUX1RJTUVSOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVF9USU1FUiB0byAlZG1zXG4iLCAodWludClhcmcpOworCQkJeworCQkJCWludCBob3N0LCB2YWx1ZTsKKwkJCQlob3N0ID0gKHVpbnQpYXJnID4+IDE2OworCQkJCXZhbHVlID0gKHVpbnQpYXJnICYgMHgwMDAwZmZmZjsKKwkJCQlpZiAoaG9zdCA9PSAtMSkgeworCQkJCQlmb3IgKGhvc3QgPSAwOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKykgeworCQkJCQkJaWYgKHAtPlJJT0hvc3RzW2hvc3RdLkZsYWdzID09IFJDX1JVTk5JTkcpIHsKKwkJCQkJCQlXV09SRChwLT5SSU9Ib3N0c1tob3N0XS5QYXJtTWFwUC0+dGltZXIgLCB2YWx1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGhvc3QgPj0gcC0+UklPTnVtSG9zdHMpIHsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCBwLT5SSU9Ib3N0c1tob3N0XS5GbGFncyA9PSBSQ19SVU5OSU5HICkgeworCQkJCQkJV1dPUkQocC0+UklPSG9zdHNbaG9zdF0uUGFybU1hcFAtPnRpbWVyICwgdmFsdWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBSSU9fSURFTlRJRllfRFJJVkVSOgorCQkJLyoKKwkJCSoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYwIHBhcnQgZml4CisJCQkqKiBBZGRlZCBkcml2ZXIgaWRlbnQgc3RyaW5nIG91dHB1dC4KKwkJCSoqCisjaWZuZGVmIF9fVEhJU19SRUxFQVNFX18KKyN3YXJuaW5nIERyaXZlciBWZXJzaW9uIHN0cmluZyBub3QgZGVmaW5lZCAhCisjZW5kaWYKKwkJCWNwcmludGYoIiVzICVzICVzICVzXG4iLAorCQkJCVJJT19EUlZfU1RSLAorCQkJCV9fVEhJU19SRUxFQVNFX18sCisJCQkJX19EQVRFX18sIF9fVElNRV9fICk7CisKKwkJCXJldHVybiAwOworCisJCWNhc2UgUklPX0RJU1BMQVlfSE9TVF9DRkc6CisJCQkqKgorCQkJKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjAgcGFydCBmaXgKKwkJCSoqIEFkZGVkIGRyaXZlciBob3N0IGNhcmQgaWRlbnQgc3RyaW5nIG91dHB1dC4KKwkJCSoqCisJCQkqKiBOb3RlIHRoYXQgdGhlIG9ubHkgdHlwZXMgY3VycmVudGx5IHN1cHBvcnRlZAorCQkJKiogYXJlIElTQSBhbmQgUENJLiBBbHNvIHRoaXMgZHJpdmVyIGRvZXMgbm90CisJCQkqKiAoeWV0KSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBPbGQgUENJIGNhcmQKKwkJCSoqIGFuZCB0aGUgSmV0IFBDSSBjYXJkLiBJbiBmYWN0IEkgdGhpbmsgdGhpcworCQkJKiogZHJpdmVyIG9ubHkgc3VwcG9ydHMgSkVUIFBDSSAhCisJCQkqKgorCisJCQlmb3IgKEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykKKwkJCXsKKwkJCQlIb3N0UCA9ICYocC0+UklPSG9zdHNbSG9zdF0pOworCisJCQkJc3dpdGNoICggSG9zdFAtPlR5cGUgKQorCQkJCXsKKwkJCQkgICAgY2FzZSBSSU9fQVQgOgorCQkJCQlzdHJjcHkoIGhvc3RfdHlwZSwgUklPX0FUX0hPU1RfU1RSICk7CisJCQkJCWJyZWFrOworCisJCQkJICAgIGNhc2UgUklPX1BDSSA6CisJCQkJCXN0cmNweSggaG9zdF90eXBlLCBSSU9fUENJX0hPU1RfU1RSICk7CisJCQkJCWJyZWFrOworCisJCQkJICAgIGRlZmF1bHQgOgorCQkJCQlzdHJjcHkoIGhvc3RfdHlwZSwgIlVua25vd24iICk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNwcmludGYoCisJCQkJICAiUklPIEhvc3QgJWQgLSBUeXBlOiVzIEFkZHI6JVggSVJROiVkXG4iLAorCQkJCQlIb3N0LCBob3N0X3R5cGUsCisJCQkJCSh1aW50KUhvc3RQLT5QYWRkclAsCisJCQkJCShpbnQpSG9zdFAtPkl2ZWMgLSAzMiAgKTsKKwkJCX0KKwkJCXJldHVybiAwOworCQkJKioKKwkJCSovCisKKwkJY2FzZSBSSU9fRk9BRF9SVEE6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fRk9BRF9SVEFcbiIpOworCQkJcmV0dXJuIFJJT0NvbW1hbmRSdGEocCwgKHVpbnQpYXJnLCBSSU9Gb2FkUnRhKTsKKworCQljYXNlIFJJT19aT01CSUVfUlRBOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1pPTUJJRV9SVEFcbiIpOworCQkJcmV0dXJuIFJJT0NvbW1hbmRSdGEocCwgKHVpbnQpYXJnLCBSSU9ab21iaWVSdGEpOworCisJCWNhc2UgUklPX0lERU5USUZZX1JUQToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19JREVOVElGWV9SVEFcbiIpOworCQkJcmV0dXJuIFJJT0lkZW50aWZ5UnRhKHAsIGFyZyk7CisKKwkJY2FzZSBSSU9fS0lMTF9ORUlHSEJPVVI6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fS0lMTF9ORUlHSEJPVVJcbiIpOworCQkJcmV0dXJuIFJJT0tpbGxOZWlnaGJvdXIocCwgYXJnKTsKKworCQljYXNlIFNQRUNJQUxfUlVQX0NNRDoKKwkJCXsKKwkJCQlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiU1BFQ0lBTF9SVVBfQ01EXG4iKTsKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmU3BlY2lhbFJ1cENtZCwgCisJCQkJCQkJc2l6ZW9mKFNwZWNpYWxSdXBDbWQpKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiU1BFQ0lBTF9SVVBfQ01EIGNvcHkgZmFpbGVkXG4iKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkgCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKKwkJCQlpZiAoICFDbWRCbGtQICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTUEVDSUFMX1JVUF9DTUQgR2V0Q21kQmxrIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCUNtZEJsa1AtPlBhY2tldCA9IFNwZWNpYWxSdXBDbWQuUGFja2V0OworCQkJCWlmICggU3BlY2lhbFJ1cENtZC5Ib3N0ID49IHAtPlJJT051bUhvc3RzICkKKwkJCQkJU3BlY2lhbFJ1cENtZC5Ib3N0ID0gMDsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgc3BlY2lhbCBydXAgY29tbWFuZCBmb3IgaG9zdCAlZCBydXAgJWRcbiIsCisJCQkJCQlTcGVjaWFsUnVwQ21kLkhvc3QsIFNwZWNpYWxSdXBDbWQuUnVwTnVtKTsKKwkJCQkJaWYgKFJJT1F1ZXVlQ21kQmxrKCZwLT5SSU9Ib3N0c1tTcGVjaWFsUnVwQ21kLkhvc3RdLCAKKwkJCQkJCQlTcGVjaWFsUnVwQ21kLlJ1cE51bSwgQ21kQmxrUCkgPT0gUklPX0ZBSUwpIHsKKwkJCQkJCWNwcmludGYoIkZBSUxFRCBUTyBRVUVVRSBTUEVDSUFMIFJVUCBDT01NQU5EXG4iKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCWNhc2UgUklPX0RFQlVHX01FTToKKyNpZmRlZiBERUJVR19NRU1fU1VQUE9SVAorUklPX0RFQlVHX0NUUkwsIAkJCQlpZiAoc3UpCisJCQkJCXJldHVybiByaW9fUklPRGVidWdNZW1vcnkoUklPX0RFQlVHX0NUUkwsIGFyZyk7CisJCQkJZWxzZQorI2VuZGlmCisJCQkJCXJldHVybiAtRVBFUk07CisKKwkJCWNhc2UgUklPX0FMTF9NT0RFTToKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fQUxMX01PREVNXG4iKTsKKwkJCQlwLT5SSU9FcnJvci5FcnJvciA9IElPQ1RMX0NPTU1BTkRfVU5LTk9XTjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJY2FzZSBSSU9fR0VUX1RBQkxFOgorCQkJCS8qCisJCQkJKiogUmVhZCB0aGUgcm91dGluZyB0YWJsZSBmcm9tIHRoZSBkZXZpY2UgZHJpdmVyIHRvIHVzZXIgc3BhY2UKKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfVEFCTEVcbiIpOworCisJCQkJaWYgKChyZXR2YWwgPSBSSU9BcGVsKHApKSAhPSAwKQorCQkgCQkJcmV0dXJuIHJldHZhbDsKKworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KXAtPlJJT0Nvbm5lY3RUYWJsZSwgKGludClhcmcsCisJCQkJCQlUT1RBTF9NQVBfRU5UUklFUypzaXplb2Yoc3RydWN0IE1hcCkpID09IENPUFlGQUlMKSB7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX1RBQkxFIGNvcHkgZmFpbGVkXG4iKTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisKKwkJCQl7CisJCQkJCWludCBlbnRyeTsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAgIioqKioqXG5NQVAgRU5UUklFU1xuIik7CisJCQkJCWZvciAoIGVudHJ5PTA7IGVudHJ5PFRPVEFMX01BUF9FTlRSSUVTOyBlbnRyeSsrICkKKwkJCQkJeworCQkJCQkgIGlmICgocC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5JRCA9PSAwKSAmJgorCQkJCQkgICAgICAocC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ib3N0VW5pcXVlTnVtID09IDApICYmCisJCQkJCSAgICAgIChwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlJ0YVVuaXF1ZU51bSA9PSAwKSkgY29udGludWU7CisJCQkJCSAgICAgIAorCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLkhvc3RVbmlxdWVOdW0gPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ib3N0VW5pcXVlTnVtICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuUnRhVW5pcXVlTnVtID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuSUQgPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5JRCApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLklEMiA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLklEMiApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLkZsYWdzID0gMHgleFxuIiwgZW50cnksIChpbnQpcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5GbGFncyApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlN5c1BvcnQgPSAweCV4XG4iLCBlbnRyeSwgKGludClwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlN5c1BvcnQgKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbMF0uVW5pdCA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVswXS5Vbml0ICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzBdLkxpbmsgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMF0uTGluayApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFsxXS5Vbml0ID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzFdLlVuaXQgKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbMV0uTGluayA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVsxXS5MaW5rICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzJdLlVuaXQgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMl0uVW5pdCApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFsyXS5MaW5rID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzJdLkxpbmsgKTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbM10uVW5pdCA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVszXS5Vbml0ICk7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzRdLkxpbmsgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbM10uTGluayApOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLk5hbWUgPSAlc1xuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uTmFtZSApOworCQkJCQl9CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgICIqKioqKlxuRU5EIE1BUCBFTlRSSUVTXG4iKTsKKwkJCQl9CisJCQkJcC0+UklPUXVpY2tDaGVjayA9IE5PVF9DSEFOR0VEOwkvKiBhIHRhYmxlIGhhcyBiZWVuIGdvdHRlbiAqLworCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19QVVRfVEFCTEU6CisJCQkJLyoKKwkJCQkqKiBXcml0ZSB0aGUgcm91dGluZyB0YWJsZSB0byB0aGUgZGV2aWNlIGRyaXZlciBmcm9tIHVzZXIgc3BhY2UKKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfVEFCTEVcbiIpOworCisJCQkJaWYgKCAhc3UgKSB7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUFVUX1RBQkxFICFSb290XG4iKTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCSAJCQlyZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlpZiAoIGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJnAtPlJJT0Nvbm5lY3RUYWJsZVswXSwgCisJCQkJCVRPVEFMX01BUF9FTlRSSUVTKnNpemVvZihzdHJ1Y3QgTWFwKSApID09IENPUFlGQUlMICkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9UQUJMRSBjb3B5IGZhaWxlZFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCQl7CisJCQkJCWludCBlbnRyeTsKKwkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiKioqKipcbk1BUCBFTlRSSUVTXG4iKSApOworCQkJCQlmb3IgKCBlbnRyeT0wOyBlbnRyeTxUT1RBTF9NQVBfRU5UUklFUzsgZW50cnkrKyApCisJCQkJCXsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5Ib3N0VW5pcXVlTnVtID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSG9zdFVuaXF1ZU51bSApICk7CisJCQkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAgKCJNYXAgZW50cnkgJWQuUnRhVW5pcXVlTnVtID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5JRCA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLklEICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5JRDIgPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5JRDIgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLkZsYWdzID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uRmxhZ3MgKSApOworCQkJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgICgiTWFwIGVudHJ5ICVkLlN5c1BvcnQgPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5TeXNQb3J0ICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5Ub3BbMF0uVW5pdCA9ICViXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVswXS5Vbml0ICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5Ub3BbMF0uTGluayA9ICViXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVswXS5MaW5rICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5Ub3BbMV0uVW5pdCA9ICViXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVsxXS5Vbml0ICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5Ub3BbMV0uTGluayA9ICViXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVsxXS5MaW5rICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5Ub3BbMl0uVW5pdCA9ICViXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVsyXS5Vbml0ICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5Ub3BbMl0uTGluayA9ICViXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVsyXS5MaW5rICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5Ub3BbM10uVW5pdCA9ICViXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVszXS5Vbml0ICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5Ub3BbNF0uTGluayA9ICViXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVszXS5MaW5rICkgKTsKKwkJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIk1hcCBlbnRyeSAlZC5OYW1lID0gJXNcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLk5hbWUgKSApOworCQkJCQl9CisJCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICAoIioqKioqXG5FTkQgTUFQIEVOVFJJRVNcbiIpICk7CisJCQkJfQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisJCQkJcmV0dXJuIFJJT05ld1RhYmxlKHApOworCisJIAkJY2FzZSBSSU9fR0VUX0JJTkRJTkdTIDoKKwkJCQkvKgorCQkJCSoqIFNlbmQgYmluZGluZ3MgdGFibGUsIGNvbnRhaW5pbmcgdW5pcXVlIG51bWJlcnMgb2YgUlRBcyBvd25lZAorCQkJCSoqIGJ5IHRoaXMgc3lzdGVtIHRvIHVzZXIgc3BhY2UKKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfQklORElOR1NcbiIpOworCisJCQkJaWYgKCAhc3UgKQorCQkJCXsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfQklORElOR1MgIVJvb3RcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJIAkJCXJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSBwLT5SSU9CaW5kVGFiLCAoaW50KWFyZywgCisJCQkJCQkoc2l6ZW9mKHVsb25nKSAqIE1BWF9SVEFfQklORElOR1MpKSA9PSBDT1BZRkFJTCApIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfQklORElOR1MgY29weSBmYWlsZWRcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gMDsKKworCSAJCWNhc2UgUklPX1BVVF9CSU5ESU5HUyA6CisJCQkvKgorCQkJKiogUmVjZWl2ZSBhIGJpbmRpbmdzIHRhYmxlLCBjb250YWluaW5nIHVuaXF1ZSBudW1iZXJzIG9mIFJUQXMgb3duZWQKKwkJCSoqIGJ5IHRoaXMgc3lzdGVtCisJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfQklORElOR1NcbiIpOworCisJCQkJaWYgKCAhc3UgKQorCQkJCXsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfQklORElOR1MgIVJvb3RcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJIAkJCXJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZwLT5SSU9CaW5kVGFiWzBdLCAKKwkJCQkJCShzaXplb2YodWxvbmcpICogTUFYX1JUQV9CSU5ESU5HUykpPT1DT1BZRkFJTCApIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfQklORElOR1MgY29weSBmYWlsZWRcbiIpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkgCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19CSU5EX1JUQSA6CisJCQkJeworCQkJCQlpbnQJRW1wdHlTbG90ID0gLTE7CisJCQkJCS8qCisJCQkJCSoqIEJpbmQgdGhpcyBSVEEgdG8gaG9zdCwgc28gdGhhdCBpdCB3aWxsIGJlIGJvb3RlZCBieSAKKwkJCQkJKiogaG9zdCBpbiAnYm9vdCBvd25lZCBSVEFzJyBtb2RlLgorCQkJCQkqLworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fQklORF9SVEFcbiIpOworCisJCQkJCWlmICggIXN1ICkgeworCQkgCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19CSU5EX1JUQSAhUm9vdFxuIik7CisJCSAJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJIAkJCQlyZXR1cm4gLUVQRVJNOworCQkJCQl9CisJCQkJCWZvciAoRW50cnkgPSAwOyBFbnRyeSA8IE1BWF9SVEFfQklORElOR1M7IEVudHJ5KyspIHsKKwkJIAkJCQlpZiAoKEVtcHR5U2xvdCA9PSAtMSkgJiYgKHAtPlJJT0JpbmRUYWJbRW50cnldID09IDBMKSkKKwkJCQkJCQlFbXB0eVNsb3QgPSBFbnRyeTsKKwkJIAkJCQllbHNlIGlmIChwLT5SSU9CaW5kVGFiW0VudHJ5XSA9PSAoaW50KSBhcmcpIHsKKwkJCQkJCQkvKgorCQkJCQkJCSoqIEFscmVhZHkgZXhpc3RzIC0gZGVsZXRlCisJCQkJCQkJKi8KKwkJCQkJCQlwLT5SSU9CaW5kVGFiW0VudHJ5XSA9IDBMOworCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlbW92aW5nIFJ0YSAleCBmcm9tIHAtPlJJT0JpbmRUYWJcbiIsCisJCSAJCQkJCQkJCQkJCQkoaW50KSBhcmcpOworCQkJCQkJCXJldHVybiAwOworCQkgCQkJCX0KKwkJCQkJfQorCQkJCQkvKgorCQkJCQkqKiBEb3Nlbid0IGV4aXN0IC0gYWRkCisJCQkJCSovCisJCQkJCWlmIChFbXB0eVNsb3QgIT0gLTEpIHsKKwkJIAkJCQlwLT5SSU9CaW5kVGFiW0VtcHR5U2xvdF0gPSAoaW50KSBhcmc7CisJCSAJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQWRkaW5nIFJ0YSAleCB0byBwLT5SSU9CaW5kVGFiXG4iLAorCQkgIAkJCQkJKGludCkgYXJnKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJIAkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJwLT5SSU9CaW5kVGFiIGZ1bGwhIC0gUnRhICV4IG5vdCBhZGRlZFxuIiwKKwkJICAJCQkJCShpbnQpIGFyZyk7CisJCSAJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJCX0KKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQljYXNlIFJJT19SRVNVTUUgOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRVNVTUVcbiIpOworCQkJCXBvcnQgPSAodWludCkgYXJnOworCQkJCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gNTExKSkgeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRTogQmFkIHBvcnQgbnVtYmVyICVkXG4iLCBwb3J0KTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkgCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCVBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07CisJCQkJaWYgKCFQb3J0UC0+TWFwcGVkKSB7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FOiBQb3J0ICVkIG5vdCBtYXBwZWRcbiIsIHBvcnQpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05PVF9NQVBQRURfSU5UT19TWVNURU07CisJCSAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJaWYgKCEoUG9ydFAtPlN0YXRlICYgKFJJT19MT1BFTiB8IFJJT19NT1BFTikpKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRVNVTUU6IFBvcnQgJWQgbm90IG9wZW5cbiIsIHBvcnQpOworCQkgCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCWlmIChSSU9QcmVlbXB0aXZlQ21kKHAsIChwLT5SSU9Qb3J0cFtwb3J0XSksIFJFU1VNRSkgPT0gCisJCQkJCQkJCQkJUklPX0ZBSUwpIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRSBmYWlsZWRcbiIpOworCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRVNVTUU6IFBvcnQgJWQgcmVzdW1lZFxuIiwgcG9ydCk7CisJCQkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKwkJCQl9CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fQVNTSUdOX1JUQToKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fQVNTSUdOX1JUQVxuIik7CisJCQkJaWYgKCAhc3UgKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19BU1NJR05fUlRBICFSb290XG4iKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQl9CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJk1hcEVudCwgc2l6ZW9mKE1hcEVudCkpCisJCQkJCQkJCQk9PSBDT1BZRkFJTCkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDb3B5IGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gUklPQXNzaWduUnRhKHAsICZNYXBFbnQpOworCisJCQljYXNlIFJJT19DSEFOR0VfTkFNRToKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fQ0hBTkdFX05BTUVcbiIpOworCQkJCWlmICggIXN1ICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fQ0hBTkdFX05BTUUgIVJvb3RcbiIpOworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmTWFwRW50LCBzaXplb2YoTWFwRW50KSkKKwkJCQkJCT09IENPUFlGQUlMKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkNvcHkgZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiBSSU9DaGFuZ2VOYW1lKHAsICZNYXBFbnQpOworCisJCQljYXNlIFJJT19ERUxFVEVfUlRBOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19ERUxFVEVfUlRBXG4iKTsKKwkJCQlpZiAoICFzdSApIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19ERUxFVEVfUlRBICFSb290XG4iKTsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCSAJCQlyZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmTWFwRW50LCBzaXplb2YoTWFwRW50KSkKKwkJCQkJCQk9PSBDT1BZRkFJTCApIHsKKwkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkNvcHkgZnJvbSBkYXRhIHNwYWNlIGZhaWxlZFxuIik7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIFJJT0RlbGV0ZVJ0YShwLCAmTWFwRW50KTsKKworCQkJY2FzZSBSSU9fUVVJQ0tfQ0hFQ0s6CisJCQkJLyoKKwkJCQkqKiAwOS4xMi4xOTk4IEFSRyAtIEVTSUwgMDc3NiBwYXJ0IGZpeAorCQkJCSoqIEEgY3VzdG9tZXIgd2FzIHVzaW5nIHRoaXMgdG8gZ2V0IHRoZSBSVEFzCisJCQkJKiogY29ubmVjdC9kaXNjb25uZWN0IHN0YXR1cy4KKwkJCQkqKiBSSU9Db25Db24oKSBoYWQgYmVlbiBib3RjaGVkIHVzZSBSSU9IYWx0ZWQKKwkJCQkqKiB0byBrZWVwIHRyYWNrIG9mIFJUQSBjb25uZWN0aW9ucyBhbmQKKwkJCQkqKiBkaXNjb25uZWN0aW9ucy4gVGhhdCBoYXMgYmVlbiBjaGFuZ2VkIGFuZAorCQkJCSoqIFJJT1J0YURpc0NvbnMgaW4gdGhlIHJpb19pbmZvIHN0cnVjdCBub3cKKwkJCQkqKiBkb2VzIHRoZSBqb2IuIFNvIHdlIG5lZWQgdG8gcmV0dXJuIHRoZSB2YWx1ZQorCQkJCSoqIG9mIFJJT1J0YUNvbnMgaW5zdGVhZCBvZiBSSU9IYWx0ZWQuCisJCQkJKioKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPSGFsdGVkLChpbnQpYXJnLAorCQkJCQkJCXNpemVvZih1aW50KSk9PUNPUFlGQUlMKSB7CisJCQkJKioKKwkJCQkqLworCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT1J0YURpc0NvbnMsKGludClhcmcsCisJCQkJCQkJc2l6ZW9mKHVpbnQpKT09Q09QWUZBSUwpIHsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19MQVNUX0VSUk9SOgorCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9FcnJvciwgKGludClhcmcsIAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBFcnJvcikpID09Q09QWUZBSUwgKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlyZXR1cm4gMDsKKworCQkJY2FzZSBSSU9fR0VUX0xPRzoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX0xPR1xuIik7CisjaWZkZWYgTE9HR0lORworCQkJCVJJT0dldExvZyhhcmcpOworCQkJCXJldHVybiAwOworI2Vsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorCisJCQljYXNlIFJJT19HRVRfTU9EVFlQRToKKwkJCQlpZiAoIGNvcHlpbiggKGludClhcmcsIChjYWRkcl90KSZwb3J0LCAKKwkJCQkJCQkJCXNpemVvZih1aW50KSkgPT0gQ09QWUZBSUwgKQorCQkJCXsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJIAkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJHZXQgbW9kdWxlIHR5cGUgZm9yIHBvcnQgJWRcbiIsIHBvcnQpOworCQkJCWlmICggcG9ydCA8IDAgfHwgcG9ydCA+IDUxMSApCisJCQkJeworCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9NT0RUWVBFOiBCYWQgcG9ydCBudW1iZXIgJWRcbiIsIHBvcnQpOworCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCSAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJUG9ydFAgPSAocC0+UklPUG9ydHBbcG9ydF0pOworCQkJCWlmICghUG9ydFAtPk1hcHBlZCkKKwkJCQl7CisJCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX01PRFRZUEU6IFBvcnQgJWQgbm90IG1hcHBlZFxuIiwgcG9ydCk7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTk9UX01BUFBFRF9JTlRPX1NZU1RFTTsKKwkJIAkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQkvKgorCQkJCSoqIFJldHVybiBtb2R1bGUgdHlwZSBvZiBwb3J0CisJCQkJKi8KKwkJCQlwb3J0ID0gUG9ydFAtPkhvc3RQLT5Vbml4UnVwc1tQb3J0UC0+UnVwTnVtXS5Nb2RUeXBlczsKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcG9ydCwgKGludClhcmcsIAorCQkJCQkJCXNpemVvZih1aW50KSkgPT0gQ09QWUZBSUwpIHsKKwkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuKDApOworCQkJLyoKKwkJCSoqIDAyLjAzLjE5OTkgQVJHIC0gRVNJTCAwODIwIGZpeAorCQkJKiogV2UgYXJlIG5vIGxvbmdlciB1c2luZyAiQm9vdCBNb2RlIiwgc28gdGhlc2UgaW9jdGxzCisJCQkqKiBhcmUgbm90IHJlcXVpcmVkIDoKKwkJCSoqCisJIAkJY2FzZSBSSU9fR0VUX0JPT1RfTU9ERSA6CisJCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgKCJHZXQgYm9vdCBtb2RlIC0gJXhcbiIsIHAtPlJJT0Jvb3RNb2RlKSk7CisJCQkJKioKKwkJCQkqKiBSZXR1cm4gYm9vdCBzdGF0ZSBvZiBzeXN0ZW0gLSBCT09UX0FMTCwgQk9PVF9PV04gb3IgQk9PVF9OT05FCisJCQkJKioKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPQm9vdE1vZGUsIChpbnQpYXJnLCAKKwkJCQkJCXNpemVvZihwLT5SSU9Cb290TW9kZSkpID09IENPUFlGQUlMKSB7CisJCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkgCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybigwKTsKKwkJCQorIAkJCWNhc2UgUklPX1NFVF9CT09UX01PREUgOgorCQkJCXAtPlJJT0Jvb3RNb2RlID0gKHVpbnQpIGFyZzsKKwkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAoIlNldCBib290IG1vZGUgdG8gMHgleFxuIiwgcC0+UklPQm9vdE1vZGUpKTsKKwkJCQlyZXR1cm4oMCk7CisJCQkqKgorCQkJKiogRW5kIEVTSUwgMDgyMCBmaXgKKwkJCSovCisKKwkgCQljYXNlIFJJT19CTE9DS19PUEVOUzoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJPcGVucyBibG9jayB1bnRpbCBib290ZWRcbiIpOworCQkJCWZvciAoIEVudHJ5PTA7IEVudHJ5IDwgUklPX1BPUlRTOyBFbnRyeSsrICkgeworCQkgCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkgCQkJcC0+UklPUG9ydHBbRW50cnldLT5XYWl0VW50aWxCb290ZWQgPSAxOworCQkgCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJCisJIAkJY2FzZSBSSU9fU0VUVVBfUE9SVFM6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiU2V0dXAgcG9ydHNcbiIpOworCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZQb3J0U2V0dXAsIHNpemVvZihQb3J0U2V0dXApKSAKKwkJCQkJCT09IENPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiRUZBVUxUIik7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKCBQb3J0U2V0dXAuRnJvbSA+IFBvcnRTZXR1cC5UbyB8fCAKKwkJCQkJCQkJUG9ydFNldHVwLlRvID49IFJJT19QT1JUUyApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiRU5YSU8iKTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCWlmICggUG9ydFNldHVwLlhwQ3BzID4gcC0+UklPQ29uZi5NYXhYcENwcyB8fAorCQkJCQkgUG9ydFNldHVwLlhwQ3BzIDwgcC0+UklPQ29uZi5NaW5YcENwcyApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gWFBSSU5UX0NQU19PVVRfT0ZfUkFOR0U7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJFSU5WQUwiKTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlpZiAoICFwLT5SSU9Qb3J0cCApIHsKKwkJCQkJIGNwcmludGYoIk5vIHAtPlJJT1BvcnRwIGFycmF5IVxuIik7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJObyBwLT5SSU9Qb3J0cCBhcnJheSFcbiIpOworCQkJCQkgcmV0dXJuIC1FSU87CisJCQkJfQorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgImVudGVyaW5nIGxvb3AgKCVkICVkKSFcbiIsIFBvcnRTZXR1cC5Gcm9tLCBQb3J0U2V0dXAuVG8pOworCQkJCWZvciAobG9vcD1Qb3J0U2V0dXAuRnJvbTsgbG9vcDw9UG9ydFNldHVwLlRvOyBsb29wKyspIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJpbiBsb29wICglZCkhXG4iLCBsb29wKTsKKyNpZiAwCisJCQkJCVBvcnRQID0gcC0+UklPUG9ydHBbbG9vcF07CisJCQkJCWlmICggIVBvcnRQLT5UdHlQICkKKwkJCQkJCVBvcnRQLT5UdHlQID0gJnAtPmNoYW5uZWxbbG9vcF07CisKKwkJIAkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJCQlpZiAoIFBvcnRTZXR1cC5JeEFueSApCisJCQkJCQkJUG9ydFAtPkNvbmZpZyB8PSBSSU9fSVhBTlk7CisJCQkJCQllbHNlCisJCQkJCQkJUG9ydFAtPkNvbmZpZyAmPSB+UklPX0lYQU5ZOworCQkJCQkJaWYgKCBQb3J0U2V0dXAuSXhPbiApCisJCQkJCQkJUG9ydFAtPkNvbmZpZyB8PSBSSU9fSVhPTjsKKwkJCQkJCWVsc2UKKwkJCQkJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fSVhPTjsKKwkJCQkJIAorCQkJCQkgLyoKKwkJCQkJICoqIElmIHRoZSBwb3J0IG5lZWRzIHRvIHdhaXQgZm9yIGFsbCBhIHByb2Nlc3NlcyBvdXRwdXQKKwkJCQkJICoqIHRvIGRyYWluIGJlZm9yZSBjbG9zaW5nIHRoZW4gdGhpcyBmbGFnIHdpbGwgYmUgc2V0LgorCQkJCQkgKi8KKwkJCQkJIAlpZiAoUG9ydFNldHVwLkRyYWluKSB7CisJCQkJCQkJUG9ydFAtPkNvbmZpZyB8PSBSSU9fV0FJVERSQUlOOworCQkJCQkgCX0gZWxzZSB7CisJCQkJCQkJUG9ydFAtPkNvbmZpZyAmPSB+UklPX1dBSVREUkFJTjsKKwkJCQkJIAl9CisJCQkJCSAvKgorCQkJCQkgKiogU3RvcmUgc2V0dGluZ3MgaWYgbG9ja2luZyBvciB1bmxvY2tpbmcgcG9ydCBvciBpZiB0aGUKKwkJCQkJICoqIHBvcnQgaXMgbm90IGxvY2tlZCwgd2hlbiBzZXR0aW5nIHRoZSBzdG9yZSBvcHRpb24uCisJCQkJCSAqLworCQkJCQkgaWYgKFBvcnRQLT5NYXBwZWQgJiYKKwkJCQkJCSAoKFBvcnRTZXR1cC5Mb2NrICYmICFQb3J0UC0+TG9jaykgfHwKKwkJCQkJCQkoIVBvcnRQLT5Mb2NrICYmCisJCQkJCQkJKFBvcnRTZXR1cC5TdG9yZSAmJiAhUG9ydFAtPlN0b3JlKSkpKSB7CisJCQkJCQlQb3J0UC0+U3RvcmVkVHR5LmlmbGFnID0gUG9ydFAtPlR0eVAtPnRtLmNfaWZsYWc7CisJCQkJCQlQb3J0UC0+U3RvcmVkVHR5Lm9mbGFnID0gUG9ydFAtPlR0eVAtPnRtLmNfb2ZsYWc7CisJCQkJCQlQb3J0UC0+U3RvcmVkVHR5LmNmbGFnID0gUG9ydFAtPlR0eVAtPnRtLmNfY2ZsYWc7CisJCQkJCQlQb3J0UC0+U3RvcmVkVHR5LmxmbGFnID0gUG9ydFAtPlR0eVAtPnRtLmNfbGZsYWc7CisJCQkJCQlQb3J0UC0+U3RvcmVkVHR5LmxpbmUgPSBQb3J0UC0+VHR5UC0+dG0uY19saW5lOworCQkJCQkJYmNvcHkoUG9ydFAtPlR0eVAtPnRtLmNfY2MsIFBvcnRQLT5TdG9yZWRUdHkuY2MsCisJCQkJCSAJCU5DQyArIDUpOworCQkJCQkgfQorCQkJCQkgUG9ydFAtPkxvY2sgPSBQb3J0U2V0dXAuTG9jazsKKwkJCQkJIFBvcnRQLT5TdG9yZSA9IFBvcnRTZXR1cC5TdG9yZTsKKwkJCQkJIFBvcnRQLT5YcHJpbnQuWHBDcHMgPSBQb3J0U2V0dXAuWHBDcHM7CisJCQkJCSBiY29weShQb3J0U2V0dXAuWHBPbixQb3J0UC0+WHByaW50LlhwT24sTUFYX1hQX0NUUkxfTEVOKTsKKwkJCQkJIGJjb3B5KFBvcnRTZXR1cC5YcE9mZixQb3J0UC0+WHByaW50LlhwT2ZmLE1BWF9YUF9DVFJMX0xFTik7CisJCQkJCSBQb3J0UC0+WHByaW50LlhwT25bTUFYX1hQX0NUUkxfTEVOLTFdID0gJ1wwJzsKKwkJCQkJIFBvcnRQLT5YcHJpbnQuWHBPZmZbTUFYX1hQX0NUUkxfTEVOLTFdID0gJ1wwJzsKKwkJCQkJIFBvcnRQLT5YcHJpbnQuWHBMZW4gPSBSSU9TdHJsZW4oUG9ydFAtPlhwcmludC5YcE9uKSsKKwkJCQkJCQkJUklPU3RybGVuKFBvcnRQLT5YcHJpbnQuWHBPZmYpOworCQkJCQkgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKyNlbmRpZgorCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJhZnRlciBsb29wICglZCkhXG4iLCBsb29wKTsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXR2YWw6JXhcbiIsIHJldHZhbCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fR0VUX1BPUlRfU0VUVVAgOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkdldCBwb3J0IHNldHVwXG4iKTsKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUG9ydFNldHVwLCBzaXplb2YoUG9ydFNldHVwKSkgCisJCQkJCQkJPT0gQ09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKCBQb3J0U2V0dXAuRnJvbSA+PSBSSU9fUE9SVFMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCisJCQkJcG9ydCA9IFBvcnRTZXR1cC5UbyA9IFBvcnRTZXR1cC5Gcm9tOworCQkJCVBvcnRTZXR1cC5JeEFueSA9IChwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICYgUklPX0lYQU5ZKSA/IAorCQkJCQkJCQkJCQkJCTEgOiAwOworCQkJCVBvcnRTZXR1cC5JeE9uID0gKHAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgJiBSSU9fSVhPTikgPyAKKwkJCQkJCQkJCQkJCQkxIDogMDsKKwkJCQlQb3J0U2V0dXAuRHJhaW4gPSAocC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyAmIFJJT19XQUlURFJBSU4pID8KKwkJCQkJCQkJCQkJCSAJMSA6IDA7CisJCQkJUG9ydFNldHVwLlN0b3JlID0gcC0+UklPUG9ydHBbcG9ydF0tPlN0b3JlOworCQkJCVBvcnRTZXR1cC5Mb2NrID0gcC0+UklPUG9ydHBbcG9ydF0tPkxvY2s7CisJCQkJUG9ydFNldHVwLlhwQ3BzID0gcC0+UklPUG9ydHBbcG9ydF0tPlhwcmludC5YcENwczsKKwkJCQliY29weShwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwT24sIFBvcnRTZXR1cC5YcE9uLAorCQkJCQkJCQkJCQkJCU1BWF9YUF9DVFJMX0xFTik7CisJCQkJYmNvcHkocC0+UklPUG9ydHBbcG9ydF0tPlhwcmludC5YcE9mZiwgUG9ydFNldHVwLlhwT2ZmLAorCQkJCQkJCQkJCQkJCU1BWF9YUF9DVFJMX0xFTik7CisJCQkJUG9ydFNldHVwLlhwT25bTUFYX1hQX0NUUkxfTEVOLTFdID0gJ1wwJzsKKwkJCQlQb3J0U2V0dXAuWHBPZmZbTUFYX1hQX0NUUkxfTEVOLTFdID0gJ1wwJzsKKworCQkJCWlmICggY29weW91dCgoY2FkZHJfdCkmUG9ydFNldHVwLChpbnQpYXJnLHNpemVvZihQb3J0U2V0dXApKQorCQkJCQkJCQkJCQkJCQk9PUNPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19HRVRfUE9SVF9QQVJBTVMgOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkdldCBwb3J0IHBhcmFtc1xuIik7CisJCQkJaWYgKGNvcHlpbiggKGludClhcmcsIChjYWRkcl90KSZQb3J0UGFyYW1zLAorCQkJCQlzaXplb2Yoc3RydWN0IFBvcnRQYXJhbXMpKSA9PSBDT1BZRkFJTCkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoUG9ydFBhcmFtcy5Qb3J0ID49IFJJT19QT1JUUykgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJUG9ydFAgPSAocC0+UklPUG9ydHBbUG9ydFBhcmFtcy5Qb3J0XSk7CisJCQkJUG9ydFBhcmFtcy5Db25maWcgPSBQb3J0UC0+Q29uZmlnOworCQkJCVBvcnRQYXJhbXMuU3RhdGUgPSBQb3J0UC0+U3RhdGU7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUG9ydCAlZFxuIiwgUG9ydFBhcmFtcy5Qb3J0KTsKKworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZQb3J0UGFyYW1zLCAoaW50KWFyZywgCisJCQkJCQlzaXplb2Yoc3RydWN0IFBvcnRQYXJhbXMpKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fR0VUX1BPUlRfVFRZIDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJHZXQgcG9ydCB0dHlcbiIpOworCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZQb3J0VHR5LCBzaXplb2Yoc3RydWN0IFBvcnRUdHkpKSAKKwkJCQkJCT09IENPUFlGQUlMKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKCBQb3J0VHR5LnBvcnQgPj0gUklPX1BPUlRTICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlBvcnQgJWRcbiIsIFBvcnRUdHkucG9ydCk7CisJCQkJUG9ydFAgPSAocC0+UklPUG9ydHBbUG9ydFR0eS5wb3J0XSk7CisjaWYgMAorCQkJCVBvcnRUdHkuVHR5LnRtLmNfaWZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19pZmxhZzsKKwkJCQlQb3J0VHR5LlR0eS50bS5jX29mbGFnID0gUG9ydFAtPlR0eVAtPnRtLmNfb2ZsYWc7CisJCQkJUG9ydFR0eS5UdHkudG0uY19jZmxhZyA9IFBvcnRQLT5UdHlQLT50bS5jX2NmbGFnOworCQkJCVBvcnRUdHkuVHR5LnRtLmNfbGZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19sZmxhZzsKKyNlbmRpZgorCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZQb3J0VHR5LCAoaW50KWFyZywgCisJCQkJCQkJc2l6ZW9mKHN0cnVjdCBQb3J0VHR5KSkgPT0gQ09QWUZBSUwpIHsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NFVF9QT1JUX1RUWSA6CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRUdHksIAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBQb3J0VHR5KSkgPT0gQ09QWUZBSUwpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTZXQgcG9ydCAlZCB0dHlcbiIsIFBvcnRUdHkucG9ydCk7CisJCQkJaWYgKFBvcnRUdHkucG9ydCA+PSAodXNob3J0KSBSSU9fUE9SVFMpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJUG9ydFAgPSAocC0+UklPUG9ydHBbUG9ydFR0eS5wb3J0XSk7CisjaWYgMAorCQkgCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJUG9ydFAtPlR0eVAtPnRtLmNfaWZsYWcgPSBQb3J0VHR5LlR0eS50bS5jX2lmbGFnOworCQkJCVBvcnRQLT5UdHlQLT50bS5jX29mbGFnID0gUG9ydFR0eS5UdHkudG0uY19vZmxhZzsKKwkJCQlQb3J0UC0+VHR5UC0+dG0uY19jZmxhZyA9IFBvcnRUdHkuVHR5LnRtLmNfY2ZsYWc7CisJCQkJUG9ydFAtPlR0eVAtPnRtLmNfbGZsYWcgPSBQb3J0VHR5LlR0eS50bS5jX2xmbGFnOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisjZW5kaWYKKworCQkJCVJJT1BhcmFtKFBvcnRQLCBDT05GSUcsIFBvcnRQLT5TdGF0ZSAmIFJJT19NT0RFTSwgT0tfVE9fU0xFRVApOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NFVF9QT1JUX1BBUkFNUyA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiU2V0IHBvcnQgcGFyYW1zXG4iKTsKKwkJCQlpZiAoIGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRQYXJhbXMsIHNpemVvZihQb3J0UGFyYW1zKSkKKwkJCQkJPT0gQ09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKFBvcnRQYXJhbXMuUG9ydCA+PSAodXNob3J0KSBSSU9fUE9SVFMpIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJUG9ydFAgPSAocC0+UklPUG9ydHBbUG9ydFBhcmFtcy5Qb3J0XSk7CisJCSAJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlQb3J0UC0+Q29uZmlnID0gUG9ydFBhcmFtcy5Db25maWc7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19HRVRfUE9SVF9TVEFUUyA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9QT1JUX1NUQVRTXG4iKTsKKwkJCQlpZiAoIGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJnBvcnRTdGF0cywgCisJCQkJCQlzaXplb2Yoc3RydWN0IHBvcnRTdGF0cykpID09IENPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmICggcG9ydFN0YXRzLnBvcnQgPj0gUklPX1BPUlRTICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtwb3J0U3RhdHMucG9ydF0pOworCQkJCXBvcnRTdGF0cy5nYXRoZXIgPSBQb3J0UC0+c3RhdHNHYXRoZXI7CisJCQkJcG9ydFN0YXRzLnR4Y2hhcnMgPSBQb3J0UC0+dHhjaGFyczsKKwkJCQlwb3J0U3RhdHMucnhjaGFycyA9IFBvcnRQLT5yeGNoYXJzOworCQkJCXBvcnRTdGF0cy5vcGVucyA9IFBvcnRQLT5vcGVuczsKKwkJCQlwb3J0U3RhdHMuY2xvc2VzID0gUG9ydFAtPmNsb3NlczsKKwkJCQlwb3J0U3RhdHMuaW9jdGxzID0gUG9ydFAtPmlvY3RsczsKKwkJCQlpZiAoIGNvcHlvdXQoKGNhZGRyX3QpJnBvcnRTdGF0cywgKGludClhcmcsIAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgcG9ydFN0YXRzKSkgPT0gQ09QWUZBSUwgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1JFU0VUX1BPUlRfU1RBVFMgOgorCQkJCXBvcnQgPSAodWludCkgYXJnOworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRVNFVF9QT1JUX1NUQVRTXG4iKTsKKwkJCQlpZiAoIHBvcnQgPj0gUklPX1BPUlRTICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtwb3J0XSk7CisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCVBvcnRQLT50eGNoYXJzCT0gMDsKKwkJCQlQb3J0UC0+cnhjaGFycwk9IDA7CisJCQkJUG9ydFAtPm9wZW5zCT0gMDsKKwkJCQlQb3J0UC0+Y2xvc2VzCT0gMDsKKwkJCQlQb3J0UC0+aW9jdGxzCT0gMDsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19HQVRIRVJfUE9SVF9TVEFUUyA6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0dBVEhFUl9QT1JUX1NUQVRTXG4iKTsKKwkJCQlpZiAoIGNvcHlpbiggKGludClhcmcsIChjYWRkcl90KSZwb3J0U3RhdHMsIAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBwb3J0U3RhdHMpKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIHBvcnRTdGF0cy5wb3J0ID49IFJJT19QT1JUUyApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJUG9ydFAgPSAocC0+UklPUG9ydHBbcG9ydFN0YXRzLnBvcnRdKTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJUG9ydFAtPnN0YXRzR2F0aGVyID0gcG9ydFN0YXRzLmdhdGhlcjsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCXJldHVybiByZXR2YWw7CisKKyNpZmRlZiBERUJVR19TVVBQT1JURUQKKwkJCWNhc2UgUklPX1JFQURfTEVWRUxTOgorCQkJCXsKKwkJCQkJIGludCBudW07CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVBRF9MRVZFTFNcbiIpOworCQkJCQkgZm9yICggbnVtPTA7IFJJT0RiSW5mW251bV0uRmxhZzsgbnVtKysgKSA7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICIlZCBsZXZlbHMgdG8gY29weVxuIixudW0pOworCQkJCQkgaWYgKGNvcHlvdXQoKGNhZGRyX3QpUklPRGJJbmYsKGludClhcmcsCisJCQkJCQlzaXplb2Yoc3RydWN0IERiSW5mKSoobnVtKzEpKT09Q09QWUZBSUwpIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlYWRMZXZlbHMgQ29weSBmYWlsZWRcbiIpOworCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkgfQorCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiJWQgbGV2ZWxzIHRvIGNvcGllZFxuIixudW0pOworCQkJCQkgcmV0dXJuIHJldHZhbDsKKwkJCQl9CisjZW5kaWYKKworCQkJIGNhc2UgUklPX1JFQURfQ09ORklHOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRUFEX0NPTkZJR1xuIik7CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT0NvbmYsIChpbnQpYXJnLCAKKwkJCQkJCQlzaXplb2Yoc3RydWN0IENvbmYpKSA9PUNPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRfQ09ORklHOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRfQ09ORklHXG4iKTsKKwkJCQlpZiAoICFzdSApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQkJCSByZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlpZiAoIGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJnAtPlJJT0NvbmYsIHNpemVvZihzdHJ1Y3QgQ29uZikgKQorCQkJCQkJPT1DT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQkvKgorCQkJCSoqIG1vdmUgYSBmZXcgdmFsdWUgYXJvdW5kCisJCQkJKi8KKwkJCQlmb3IgKEhvc3Q9MDsgSG9zdCA8IHAtPlJJT051bUhvc3RzOyBIb3N0KyspCisJCQkJCSBpZiAoIChwLT5SSU9Ib3N0c1tIb3N0XS5GbGFncyAmIFJVTl9TVEFURSkgPT0gUkNfUlVOTklORyApCisJCQkJCSAJV1dPUkQocC0+UklPSG9zdHNbSG9zdF0uUGFybU1hcFAtPnRpbWVyICwgCisJCQkJCQkJCXAtPlJJT0NvbmYuVGltZXIpOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NUQVJUX1BPTExFUjoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU1RBUlRfUE9MTEVSXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJY2FzZSBSSU9fU1RPUF9QT0xMRVI6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NUT1BfUE9MTEVSXG4iKTsKKwkJCQlpZiAoICFzdSApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQkJCSByZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlwLT5SSU9Qb2xsaW5nID0gTk9UX1BPTExJTkc7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0VUREVCVUc6CisJCQljYXNlIFJJT19HRVRERUJVRzoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUREVCVUcvUklPX0dFVERFQlVHXG4iKTsKKwkJCQlpZiAoIGNvcHlpbiggKGludClhcmcsIChjYWRkcl90KSZEZWJ1Z0N0cmwsIHNpemVvZihEZWJ1Z0N0cmwpICkKKwkJCQkJCQk9PUNPUFlGQUlMICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmICggRGVidWdDdHJsLlN5c1BvcnQgPT0gTk9fUE9SVCApIHsKKwkJCQkJaWYgKCBjbWQgPT0gUklPX1NFVERFQlVHICkgeworCQkJCQkJaWYgKCAhc3UgKSB7CisJCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCQkJfQorCQkJCQkJcC0+cmlvX2RlYnVnID0gRGVidWdDdHJsLkRlYnVnOworCQkJCQkJcC0+UklPRGVidWdXYWl0ID0gRGVidWdDdHJsLldhaXQ7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJTZXQgZ2xvYmFsIGRlYnVnIHRvIDB4JXggc2V0IHdhaXQgdG8gMHgleFxuIiwKKwkJCQkJCQlwLT5yaW9fZGVidWcscC0+UklPRGVidWdXYWl0KTsKKwkJCQkJfQorCQkJCSAJZWxzZSB7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJHZXQgZ2xvYmFsIGRlYnVnIDB4JXggd2FpdCAweCV4XG4iLAorCQkJCQkJCQkJCXAtPnJpb19kZWJ1ZyxwLT5SSU9EZWJ1Z1dhaXQpOworCQkJCQkJRGVidWdDdHJsLkRlYnVnID0gcC0+cmlvX2RlYnVnOworCQkJCQkJRGVidWdDdHJsLldhaXQgID0gcC0+UklPRGVidWdXYWl0OworCQkJCQkJaWYgKCBjb3B5b3V0KChjYWRkcl90KSZEZWJ1Z0N0cmwsKGludClhcmcsCisJCQkJCQkJCXNpemVvZihEZWJ1Z0N0cmwpKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUL0dFVCBERUJVRzogYmFkIHBvcnQgbnVtYmVyICVkXG4iLAorCQkJCQkJCQkJRGVidWdDdHJsLlN5c1BvcnQpOworCQkJCQkJIAlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkJIAlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmICggRGVidWdDdHJsLlN5c1BvcnQgPj0gUklPX1BPUlRTICYmIAorCQkJCQkJCURlYnVnQ3RybC5TeXNQb3J0ICE9IE5PX1BPUlQgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUL0dFVCBERUJVRzogYmFkIHBvcnQgbnVtYmVyICVkXG4iLAorCQkJCQkJCQkJRGVidWdDdHJsLlN5c1BvcnQpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQllbHNlIGlmICggY21kID09IFJJT19TRVRERUJVRyApIHsKKwkJCQkJaWYgKCAhc3UgKSB7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQkJfQorCQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJCXAtPlJJT1BvcnRwW0RlYnVnQ3RybC5TeXNQb3J0XS0+RGVidWcgPSBEZWJ1Z0N0cmwuRGVidWc7CisJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRERUJVRyAweCV4XG4iLAorCQkJCQkJCQlwLT5SSU9Qb3J0cFtEZWJ1Z0N0cmwuU3lzUG9ydF0tPkRlYnVnKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRERUJVRyAweCV4XG4iLAorCQkJCQkJCQkJIHAtPlJJT1BvcnRwW0RlYnVnQ3RybC5TeXNQb3J0XS0+RGVidWcpOworCQkJCQlEZWJ1Z0N0cmwuRGVidWcgPSBwLT5SSU9Qb3J0cFtEZWJ1Z0N0cmwuU3lzUG9ydF0tPkRlYnVnOworCQkJCQlpZiAoIGNvcHlvdXQoKGNhZGRyX3QpJkRlYnVnQ3RybCwoaW50KWFyZywKKwkJCQkJCQkJc2l6ZW9mKERlYnVnQ3RybCkpPT1DT1BZRkFJTCApIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRERUJVRzogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fVkVSU0lEOgorCQkJCS8qCisJCQkJKiogRW5xdWlyZSBhYm91dCB0aGUgcmVsZWFzZSBhbmQgdmVyc2lvbi4KKwkJCQkqKiBXZSByZXR1cm4gTUFYX1ZFUlNJT05fTEVOIGJ5dGVzLCBiZWluZyBhCisJCQkJKiogdGV4dHVhbCBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLgorCQkJCSovCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1ZFUlNJRFxuIik7CisJCQkJaWYgKCBjb3B5b3V0KAkoY2FkZHJfdClSSU9WZXJzaWQoKSwKKwkJCQkJCShpbnQpYXJnLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCByaW9WZXJzaW9uKSApID09IENPUFlGQUlMICkKKwkJCQl7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICAiUklPX1ZFUlNJRDogQmFkIGNvcHkgdG8gdXNlciBzcGFjZSAoaG9zdD0lZClcbiIsIEhvc3QpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQkvKgorCQkJKiogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCQkJKiogISEgY29tbWVudGVkIG91dCBwcmV2aW91cyAnUklPX1ZFUlNJRCcgZnVuY3Rpb25hbGl0eSAhIQorCQkJKiogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCQkJKioKKwkJCWNhc2UgUklPX1ZFUlNJRDoKKwkJCQkqKgorCQkJCSoqIEVucXVpcmUgYWJvdXQgdGhlIHJlbGVhc2UgYW5kIHZlcnNpb24uCisJCQkJKiogV2UgcmV0dXJuIE1BWF9WRVJTSU9OX0xFTiBieXRlcywgYmVpbmcgYSB0ZXh0dWFsIG51bGwKKwkJCQkqKiB0ZXJtaW5hdGVkIHN0cmluZy4KKwkJCQkqKgorCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICgiUklPX1ZFUlNJRFxuIikpOworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KVJJT1ZlcnNpZCgpLCAKKwkJCQkJCShpbnQpYXJnLCBNQVhfVkVSU0lPTl9MRU4gKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICgiUklPX1ZFUlNJRDogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIixIb3N0KSk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisJCQkqKgorCQkJKiogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCQkJKi8KKworCQkJY2FzZSBSSU9fTlVNX0hPU1RTOgorCQkJCS8qCisJCQkJKiogRW5xdWlyZSBhcyB0byB0aGUgbnVtYmVyIG9mIGhvc3RzIGxvY2F0ZWQKKwkJCQkqKiBhdCBpbml0IHRpbWUuCisJCQkJKi8KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTlVNX0hPU1RTXG4iKTsKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPTnVtSG9zdHMsIChpbnQpYXJnLCAKKwkJCQkJCQlzaXplb2YocC0+UklPTnVtSG9zdHMpICk9PUNPUFlGQUlMICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX05VTV9IT1NUUzogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0hPU1RfRk9BRDoKKwkJCQkvKgorCQkJCSoqIEtpbGwgaG9zdC4gVGhpcyBtYXkgbm90IGJlIGluIHRoZSBmaW5hbCB2ZXJzaW9uLi4uCisJCQkJKi8KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9GT0FEICVkXG4iLCAoaW50KWFyZyk7CisJCQkJaWYgKCAhc3UgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9GT0FEOiBOb3Qgc3VwZXIgdXNlclxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCQkgcmV0dXJuIC1FUEVSTTsKKwkJCQl9CisJCQkJcC0+UklPSGFsdGVkID0gMTsKKwkJCQlwLT5SSU9TeXN0ZW1VcCA9IDA7CisKKwkJCQlmb3IgKCBIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsKKwkJCQkJICh2b2lkKVJJT0JvYXJkVGVzdCggcC0+UklPSG9zdHNbSG9zdF0uUGFkZHJQLCAKKwkJCQkJCXAtPlJJT0hvc3RzW0hvc3RdLkNhZGRyLCBwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlLCAKKwkJCQkJCQkJcC0+UklPSG9zdHNbSG9zdF0uU2xvdCApOworCQkJCQkgYnplcm8oIChjYWRkcl90KSZwLT5SSU9Ib3N0c1tIb3N0XS5GbGFncywgCisJCQkJCQkJKChpbnQpJnAtPlJJT0hvc3RzW0hvc3RdLl9fX19lbmRfbWFya2VyX19fXykgLQorCQkJCQkJCQkgKChpbnQpJnAtPlJJT0hvc3RzW0hvc3RdLkZsYWdzKSApOworCQkJCQkgcC0+UklPSG9zdHNbSG9zdF0uRmxhZ3MgID0gUkNfV0FJVElORzsKKyNpZiAwCisJCQkJCSBSSU9TZXR1cERhdGFTdHJ1Y3RzKHApOworI2VuZGlmCisJCQkJfQorCQkJCVJJT0ZvYWRXYWtldXAocCk7CisJCQkJcC0+UklPTnVtQm9vdFBrdHMgPSAwOworCQkJCXAtPlJJT0Jvb3RpbmcgPSAwOworCisjaWZkZWYgUklOR0JVRkZFUl9TVVBQT1JUCisJCQkJZm9yKCBsb29wPTA7IGxvb3A8UklPX1BPUlRTOyBsb29wKysgKQorCQkJCQlpZiAoIHAtPlJJT1BvcnRwW2xvb3BdLT5UeFJpbmdCdWZmZXIgKQorCQkJCQkJc3lzZnJlZSgodm9pZCAqKXAtPlJJT1BvcnRwW2xvb3BdLT5UeFJpbmdCdWZmZXIsIAorCQkJCQkJCVJJT0J1ZmZlclNpemUgKTsKKyNlbmRpZgorI2lmIDAKKwkJCQliemVybygoY2FkZHJfdCkmcC0+UklPUG9ydHBbMF0sUklPX1BPUlRTKnNpemVvZihzdHJ1Y3QgUG9ydCkpOworI2Vsc2UKKwkJCQlwcmludGsgKCJIRUVFRUVMUCFcbiIpOworI2VuZGlmCisKKwkJCQlmb3IoIGxvb3A9MDsgbG9vcDxSSU9fUE9SVFM7IGxvb3ArKyApIHsKKyNpZiAwCisJCQkJCXAtPlJJT1BvcnRwW2xvb3BdLT5UdHlQID0gJnAtPmNoYW5uZWxbbG9vcF07CisjZW5kaWYKKwkJCQkJCisJCQkJCXNwaW5fbG9ja19pbml0KCZwLT5SSU9Qb3J0cFtsb29wXS0+cG9ydFNlbSk7CisJCQkJCXAtPlJJT1BvcnRwW2xvb3BdLT5JblVzZSA9IE5PVF9JTlVTRTsKKwkJCQl9CisKKwkJCQlwLT5SSU9TeXN0ZW1VcCA9IDA7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fRE9XTkxPQUQ6CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RPV05MT0FEXG4iKTsKKwkJCQlpZiAoICFzdSApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19ET1dOTE9BRDogTm90IHN1cGVyIHVzZXJcbiIpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJCQkJIHJldHVybiAtRVBFUk07CisJCQkJfQorCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmRG93bkxvYWQsIAorCQkJCQkJCXNpemVvZihEb3duTG9hZCkgKT09Q09QWUZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fRE9XTkxPQUQ6IENvcHkgaW4gZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29waWVkIGluIGRvd25sb2FkIGNvZGUgZm9yIHByb2R1Y3QgY29kZSAweCV4XG4iLAorCQkJCSAgICBEb3duTG9hZC5Qcm9kdWN0Q29kZSk7CisKKwkJCQkvKgorCQkJCSoqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBwcm9kdWN0IGNvZGUgaXMgYW4gdW5zaWduZWQgb2JqZWN0IQorCQkJCSovCisJCQkJaWYgKCBEb3duTG9hZC5Qcm9kdWN0Q29kZSA+IE1BWF9QUk9EVUNUICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RPV05MT0FEOiBCYWQgcHJvZHVjdCBjb2RlICVkIHBhc3NlZFxuIiwKKwkJCQkJCQlEb3duTG9hZC5Qcm9kdWN0Q29kZSk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IE5PX1NVQ0hfUFJPRFVDVDsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCS8qCisJCQkJKiogZG8gc29tZXRoaW5nIQorCQkJCSovCisJCQkJcmV0dmFsID0gKCooUklPQm9vdFRhYmxlW0Rvd25Mb2FkLlByb2R1Y3RDb2RlXSkpKHAsICZEb3duTG9hZCk7CisJCQkJCQkJCQkJLyogPC0tIFBhbmljICovCisJCQkJcC0+UklPSGFsdGVkID0gMDsKKwkJCQkvKgorCQkJCSoqIGFuZCBnbyBiYWNrLCBjb250ZW50IHdpdGggYSBqb2Igd2VsbCBjb21wbGV0ZWQuCisJCQkJKi8KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19QQVJNUzoKKwkJCQl7CisJCQkJCXVpbnQgaG9zdDsKKworCQkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmaG9zdCwgCisJCQkJCQkJc2l6ZW9mKGhvc3QpICkgPT0gQ09QWUZBSUwgKSB7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsIAorCQkJCQkJCSJSSU9fSE9TVF9SRVE6IENvcHkgaW4gZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkqKiBGZXRjaCB0aGUgcGFybW1hcAorCQkJCQkqLworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUEFSTVNcbiIpOworCQkJCQlpZiAoIGNvcHlvdXQoIChjYWRkcl90KXAtPlJJT0hvc3RzW2hvc3RdLlBhcm1NYXBQLCAKKwkJCQkJCQkJKGludClhcmcsIHNpemVvZihQQVJNX01BUCkgKT09Q09QWUZBSUwgKSB7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BBUk1TOiBDb3B5IG91dCB0byB1c2VyIHNwYWNlIGZhaWxlZFxuIik7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19IT1NUX1JFUToKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SRVFcbiIpOworCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZIb3N0UmVxLCAKKwkJCQkJCQlzaXplb2YoSG9zdFJlcSkgKT09Q09QWUZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SRVE6IENvcHkgaW4gZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKCBIb3N0UmVxLkhvc3ROdW0gPj0gcC0+UklPTnVtSG9zdHMgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JFUTogSWxsZWdhbCBob3N0IG51bWJlciAlZFxuIiwKKwkJCQkJCQlIb3N0UmVxLkhvc3ROdW0pOworCQkJCQkgcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVxdWVzdCBmb3IgaG9zdCAlZFxuIiwgSG9zdFJlcS5Ib3N0TnVtKTsKKworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9Ib3N0c1tIb3N0UmVxLkhvc3ROdW1dLCAKKwkJCQkJKGludClIb3N0UmVxLkhvc3RQLHNpemVvZihzdHJ1Y3QgSG9zdCkgKSA9PSBDT1BZRkFJTCkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SRVE6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJIGNhc2UgUklPX0hPU1RfRFBSQU06CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVxdWVzdCBmb3IgRFBSQU1cbiIpOworCQkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJkhvc3REcFJhbSwgCisJCQkJCQkJCXNpemVvZihIb3N0RHBSYW0pICk9PUNPUFlGQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9EUFJBTTogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJaWYgKCBIb3N0RHBSYW0uSG9zdE51bSA+PSBwLT5SSU9OdW1Ib3N0cyApIHsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0RQUkFNOiBJbGxlZ2FsIGhvc3QgbnVtYmVyICVkXG4iLAorCQkJCQkJCQkJCUhvc3REcFJhbS5Ib3N0TnVtKTsKKwkJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQl9CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVxdWVzdCBmb3IgaG9zdCAlZFxuIiwgSG9zdERwUmFtLkhvc3ROdW0pOworCisJCQkJaWYgKHAtPlJJT0hvc3RzW0hvc3REcFJhbS5Ib3N0TnVtXS5UeXBlID09IFJJT19QQ0kpIHsKKwkJCQkJIGludCBvZmY7CisJCQkJCSAvKiBJdCdzIGhhcmR3YXJlIGxpa2UgdGhpcyB0aGF0IHJlYWxseSBnZXRzIG9uIG15IHRpdHMuICovCisJCQkJCSBzdGF0aWMgdW5zaWduZWQgY2hhciBjb3B5W3NpemVvZihzdHJ1Y3QgRHBSYW0pXTsKKwkJCQkJZm9yICggb2ZmPTA7IG9mZjxzaXplb2Yoc3RydWN0IERwUmFtKTsgb2ZmKysgKQorCQkJCQkJY29weVtvZmZdID0gcC0+UklPSG9zdHNbSG9zdERwUmFtLkhvc3ROdW1dLkNhZGRyW29mZl07CisJCQkJCWlmICggY29weW91dCggKGNhZGRyX3QpY29weSwgKGludClIb3N0RHBSYW0uRHBSYW1QLCAKKwkJCQkJCQlzaXplb2Yoc3RydWN0IERwUmFtKSApID09IENPUFlGQUlMICkgeworCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0RQUkFNOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKGNvcHlvdXQoKGNhZGRyX3QpcC0+UklPSG9zdHNbSG9zdERwUmFtLkhvc3ROdW1dLkNhZGRyLAorCQkJCQkoaW50KUhvc3REcFJhbS5EcFJhbVAsIAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBEcFJhbSkgKSA9PSBDT1BZRkFJTCApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9EUFJBTTogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJIGNhc2UgUklPX1NFVF9CVVNZOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRfQlVTWVxuIik7CisJCQkJaWYgKCAoaW50KWFyZyA8IDAgfHwgKGludClhcmcgPiA1MTEgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUX0JVU1k6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwoaW50KWFyZyk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcC0+UklPUG9ydHBbKGludClhcmddLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCSBjYXNlIFJJT19IT1NUX1BPUlQ6CisJCQkJLyoKKwkJCQkqKiBUaGUgZGFlbW9uIHdhbnQgcG9ydCBpbmZvcm1hdGlvbgorCQkJCSoqIChwcm9iYWJseSBmb3IgZGVidWcgcmVhc29ucykKKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1BPUlRcbiIpOworCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUG9ydFJlcSwgCisJCQkJCXNpemVvZihQb3J0UmVxKSApPT1DT1BZRkFJTCApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUE9SVDogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisKKwkJCQlpZiAoUG9ydFJlcS5TeXNQb3J0ID49IFJJT19QT1JUUykgeyAvKiBTeXNQb3J0IGlzIHVuc2lnbmVkICovCisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9QT1JUOiBJbGxlZ2FsIHBvcnQgbnVtYmVyICVkXG4iLAorCQkJCQkJCQkJCQlQb3J0UmVxLlN5c1BvcnQpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBwb3J0ICVkXG4iLCBQb3J0UmVxLlN5c1BvcnQpOworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KXAtPlJJT1BvcnRwW1BvcnRSZXEuU3lzUG9ydF0sIAorCQkJCQkJCSAoaW50KVBvcnRSZXEuUG9ydFAsCisJCQkJCQkJCXNpemVvZihzdHJ1Y3QgUG9ydCkgKSA9PSBDT1BZRkFJTCkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1BPUlQ6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0hPU1RfUlVQOgorCQkJCS8qCisJCQkJKiogVGhlIGRhZW1vbiB3YW50IHJ1cCBpbmZvcm1hdGlvbgorCQkJCSoqIChwcm9iYWJseSBmb3IgZGVidWcgcmVhc29ucykKKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JVUFxuIik7CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlJ1cFJlcSwgCisJCQkJCQlzaXplb2YoUnVwUmVxKSApPT1DT1BZRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JVUDogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoUnVwUmVxLkhvc3ROdW0gPj0gcC0+UklPTnVtSG9zdHMpIHsgLyogaG9zdCBpcyB1bnNpZ25lZCAqLworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQOiBJbGxlZ2FsIGhvc3QgbnVtYmVyICVkXG4iLAorCQkJCQkJCQlSdXBSZXEuSG9zdE51bSk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCWlmICggUnVwUmVxLlJ1cE51bSA+PSBNQVhfUlVQK0xJTktTX1BFUl9VTklUICkgeyAvKiBlZWshICovCisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IElsbGVnYWwgcnVwIG51bWJlciAlZFxuIiwKKwkJCQkJCQlSdXBSZXEuUnVwTnVtKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUlVQX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJSG9zdFAgPSAmcC0+UklPSG9zdHNbUnVwUmVxLkhvc3ROdW1dOworCisJCQkJaWYgKChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcpIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JVUDogSG9zdCAlZCBub3QgcnVubmluZ1xuIiwKKwkJCQkJCQlSdXBSZXEuSG9zdE51bSk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTk9UX1JVTk5JTkc7CisJCQkJCSByZXR1cm4gLUVJTzsKKwkJCQl9CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVxdWVzdCBmb3IgcnVwICVkIGZyb20gaG9zdCAlZFxuIiwKKwkJCQkJCVJ1cFJlcS5SdXBOdW0sUnVwUmVxLkhvc3ROdW0pOworCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpSG9zdFAtPlVuaXhSdXBzW1J1cFJlcS5SdXBOdW1dLlJ1cFAsCisJCQkJCShpbnQpUnVwUmVxLlJ1cFAsc2l6ZW9mKHN0cnVjdCBSVVApICkgPT0gQ09QWUZBSUwpIHsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX0hPU1RfTFBCOgorCQkJCS8qCisJCQkJKiogVGhlIGRhZW1vbiB3YW50IGxwYiBpbmZvcm1hdGlvbgorCQkJCSoqIChwcm9iYWJseSBmb3IgZGVidWcgcmVhc29ucykKKwkJCQkqLworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0xQQlxuIik7CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJkxwYlJlcSwgCisJCQkJCXNpemVvZihMcGJSZXEpICk9PUNPUFlGQUlMICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCOiBCYWQgY29weSBmcm9tIHVzZXIgc3BhY2VcbiIpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWlmIChMcGJSZXEuSG9zdCA+PSBwLT5SSU9OdW1Ib3N0cykgeyAvKiBob3N0IGlzIHVuc2lnbmVkICovCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0xQQjogSWxsZWdhbCBob3N0IG51bWJlciAlZFxuIiwKKwkJCQkJCQlMcGJSZXEuSG9zdCk7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQlpZiAoIExwYlJlcS5MaW5rID49IExJTktTX1BFUl9VTklUICkgeyAvKiBlZWshICovCisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IElsbGVnYWwgbGluayBudW1iZXIgJWRcbiIsCisJCQkJCQkJTHBiUmVxLkxpbmspOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBMSU5LX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJSG9zdFAgPSAmcC0+UklPSG9zdHNbTHBiUmVxLkhvc3RdOworCisJCQkJaWYgKCAoSG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCOiBIb3N0ICVkIG5vdCBydW5uaW5nXG4iLAorCQkJCQkJTHBiUmVxLkhvc3QgKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OT1RfUlVOTklORzsKKwkJCQkJIHJldHVybiAtRUlPOworCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBscGIgJWQgZnJvbSBob3N0ICVkXG4iLAorCQkJCQlMcGJSZXEuTGluaywgTHBiUmVxLkhvc3QpOworCisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJkhvc3RQLT5MaW5rU3RyUFtMcGJSZXEuTGlua10sCisJCQkJCShpbnQpTHBiUmVxLkxwYlAsc2l6ZW9mKHN0cnVjdCBMUEIpICkgPT0gQ09QWUZBSUwpIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiByZXR2YWw7CisKKwkJCQkvKgorCQkJCSoqIEhlcmUgMyBJT0NUTCdzIHRoYXQgYWxsb3cgdXMgdG8gY2hhbmdlIHRoZSB3YXkgaW4gd2hpY2gKKwkJCQkqKiByaW8gbG9ncyBlcnJvcnMuIHNlbmQgdGhlbSBqdXN0IHRvIHN5c2xvZyBvciBzZW5kIHRoZW0KKwkJCQkqKiB0byBib3RoIHN5c2xvZyBhbmQgY29uc29sZSBvciBzZW5kIHRoZW0gdG8ganVzdCB0aGUgY29uc29sZS4KKwkJCQkqKgorCQkJCSoqIFNlZSBSaW9TdHJCdWYoKSBpbiB1dGlsLmMgZm9yIHRoZSBvdGhlciBoYWxmLgorCQkJCSovCisJCQljYXNlIFJJT19TWVNMT0dfT05MWToKKwkJCQlwLT5SSU9QcmludExvZ1N0YXRlID0gUFJJTlRfVE9fTE9HOwkvKiBKdXN0IHN5c2xvZyAqLworCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19TWVNMT0dfQ09OUzoKKwkJCQlwLT5SSU9QcmludExvZ1N0YXRlID0gUFJJTlRfVE9fTE9HX0NPTlM7Lyogc3lzbG9nIGFuZCBjb25zb2xlICovCisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX0NPTlNfT05MWToKKwkJCQlwLT5SSU9QcmludExvZ1N0YXRlID0gUFJJTlRfVE9fQ09OUzsJLyogSnVzdCBjb25zb2xlICovCisJCQkJcmV0dXJuIDA7CisKKwkJCWNhc2UgUklPX1NJR05BTFNfT046CisJCQkJaWYgKCBwLT5SSU9TaWduYWxQcm9jZXNzICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBTSUdOQUxTX0FMUkVBRFlfU0VUOworCQkJCQkgcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisJCQkJcC0+UklPU2lnbmFsUHJvY2VzcyA9IGdldHBpZCgpOworCQkJCXAtPlJJT1ByaW50RGlzYWJsZWQgPSBET05UX1BSSU5UOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX1NJR05BTFNfT0ZGOgorCQkJCWlmICggcC0+UklPU2lnbmFsUHJvY2VzcyAhPSBnZXRwaWQoKSApIHsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1JFQ0VJVklOR19QUk9DRVNTOworCQkJCQkgcmV0dXJuIC1FUEVSTTsKKwkJCQl9CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ2xlYXIgc2lnbmFsIHByb2Nlc3MgdG8gemVyb1xuIik7CisJCQkJcC0+UklPU2lnbmFsUHJvY2VzcyA9IDA7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0VUX0JZVEVfTU9ERToKKwkJCQlmb3IgKCBIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKyApCisJCQkJCSBpZiAoIHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgPT0gUklPX0FUICkKKwkJCQkJCSBwLT5SSU9Ib3N0c1tIb3N0XS5Nb2RlICY9IH5XT1JEX09QRVJBVElPTjsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TRVRfV09SRF9NT0RFOgorCQkJCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkKKwkJCQkJIGlmICggcC0+UklPSG9zdHNbSG9zdF0uVHlwZSA9PSBSSU9fQVQgKQorCQkJCQkJIHAtPlJJT0hvc3RzW0hvc3RdLk1vZGUgfD0gV09SRF9PUEVSQVRJT047CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0VUX0ZBU1RfQlVTOgorCQkJCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkKKwkJCQkJIGlmICggcC0+UklPSG9zdHNbSG9zdF0uVHlwZSA9PSBSSU9fQVQgKQorCQkJCQkJIHAtPlJJT0hvc3RzW0hvc3RdLk1vZGUgfD0gRkFTVF9BVF9CVVM7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fU0VUX1NMT1dfQlVTOgorCQkJCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkKKwkJCQkJIGlmICggcC0+UklPSG9zdHNbSG9zdF0uVHlwZSA9PSBSSU9fQVQgKQorCQkJCQkJIHAtPlJJT0hvc3RzW0hvc3RdLk1vZGUgJj0gfkZBU1RfQVRfQlVTOworCQkJCXJldHVybiByZXR2YWw7CisKKwkJCWNhc2UgUklPX01BUF9CNTBfVE9fNTA6CisJCQljYXNlIFJJT19NQVBfQjUwX1RPXzU3NjAwOgorCQkJY2FzZSBSSU9fTUFQX0IxMTBfVE9fMTEwOgorCQkJY2FzZSBSSU9fTUFQX0IxMTBfVE9fMTE1MjAwOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkJhdWQgcmF0ZSBtYXBwaW5nXG4iKTsKKwkJCQlwb3J0ID0gKHVpbnQpIGFyZzsKKwkJCQlpZiAoIHBvcnQgPCAwIHx8IHBvcnQgPiA1MTEgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJCYXVkIHJhdGUgbWFwcGluZzogQmFkIHBvcnQgbnVtYmVyICVkXG4iLCBwb3J0KTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlzd2l0Y2goIGNtZCApCisJCQkJeworCQkJCQljYXNlIFJJT19NQVBfQjUwX1RPXzUwIDoKKwkJCQkJCXAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgfD0gUklPX01BUF81MF9UT181MDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFJJT19NQVBfQjUwX1RPXzU3NjAwIDoKKwkJCQkJCXAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgJj0gflJJT19NQVBfNTBfVE9fNTA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBSSU9fTUFQX0IxMTBfVE9fMTEwIDoKKwkJCQkJCXAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgfD0gUklPX01BUF8xMTBfVE9fMTEwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgUklPX01BUF9CMTEwX1RPXzExNTIwMCA6CisJCQkJCQlwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICY9IH5SSU9fTUFQXzExMF9UT18xMTA7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCisJCQljYXNlIFJJT19TVFJFQU1fSU5GTzoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU1RSRUFNX0lORk9cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQljYXNlIFJJT19TRU5EX1BBQ0tFVDoKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VORF9QQUNLRVRcbiIpOworCQkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJlNlbmRQYWNrLAorCQkJCQkJCQkJc2l6ZW9mKFNlbmRQYWNrKSApPT1DT1BZRkFJTCApIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TRU5EX1BBQ0tFVDogQmFkIGNvcHkgZnJvbSB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlpZiAoIFNlbmRQYWNrLlBvcnROdW0gPj0gMTI4ICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVOWElPOworCQkJCX0KKworCQkJCVBvcnRQID0gcC0+UklPUG9ydHBbU2VuZFBhY2suUG9ydE51bV07CisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisJCQkJaWYgKCAhY2FuX2FkZF90cmFuc21pdCgmUGFja2V0UCxQb3J0UCkgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFVOSVRfSVNfSU5fVVNFOworCQkJCQkgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQkJIHJldHVybiAtRU5PU1BDOworCQkJCX0KKworCQkJCWZvciAoIGxvb3A9MDsgbG9vcDwodXNob3J0KShTZW5kUGFjay5MZW4gJiAxMjcpOyBsb29wKysgKQorCQkJCQkgV0JZVEUoUGFja2V0UC0+ZGF0YVtsb29wXSwgU2VuZFBhY2suRGF0YVtsb29wXSApOworCisJCQkJV0JZVEUoUGFja2V0UC0+bGVuLCBTZW5kUGFjay5MZW4pOworCisJCQkJYWRkX3RyYW5zbWl0KCBQb3J0UCApOworCQkJCS8qCisJCQkJKiogQ291bnQgY2hhcmFjdGVycyB0cmFuc21pdHRlZCBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZworCQkJCSovCisJCQkJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKKwkJCQkJIFBvcnRQLT50eGNoYXJzICs9IChTZW5kUGFjay5MZW4gJiAxMjcpOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJcmV0dXJuIHJldHZhbDsKKworCQkJY2FzZSBSSU9fTk9fTUVTRzoKKwkJCQlpZiAoIHN1ICkKKwkJCQkJIHAtPlJJT05vTWVzc2FnZSA9IDE7CisJCQkJcmV0dXJuIHN1ID8gMCA6IC1FUEVSTTsKKworCQkJY2FzZSBSSU9fTUVTRzoKKwkJCQlpZiAoIHN1ICkKKwkJCQkJcC0+UklPTm9NZXNzYWdlID0gMDsKKwkJCQlyZXR1cm4gc3UgPyAwIDogLUVQRVJNOworCisJCQljYXNlIFJJT19XSEFUX01FU0c6CisJCQkJaWYgKCBjb3B5b3V0KCAoY2FkZHJfdCkmcC0+UklPTm9NZXNzYWdlLCAoaW50KWFyZywgCisJCQkJCXNpemVvZihwLT5SSU9Ob01lc3NhZ2UpICk9PUNPUFlGQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fV0hBVF9NRVNHOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19NRU1fRFVNUCA6CisJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlN1YkNtZCwgCisJCQkJCQlzaXplb2Yoc3RydWN0IFN1YkNtZFN0cnVjdCkpID09IENPUFlGQUlMKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX01FTV9EVU1QIGhvc3QgJWQgcnVwICVkIGFkZHIgJXhcbiIsIAorCQkJCQkJU3ViQ21kLkhvc3QsIFN1YkNtZC5SdXAsIFN1YkNtZC5BZGRyKTsKKworCQkJCWlmIChTdWJDbWQuUnVwID49IE1BWF9SVVArTElOS1NfUEVSX1VOSVQgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFJVUF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJaWYgKFN1YkNtZC5Ib3N0ID49IHAtPlJJT051bUhvc3RzICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlwb3J0ID0gcC0+UklPSG9zdHNbU3ViQ21kLkhvc3RdLgorCQkJCQkJCQlVbml4UnVwc1tTdWJDbWQuUnVwXS5CYXNlU3lzUG9ydDsKKworCQkJCVBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07CisKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkJCQlpZiAoIFJJT1ByZWVtcHRpdmVDbWQocCwgIFBvcnRQLCBNRU1EVU1QICkgPT0gUklPX0ZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTUVNX0RVTVAgZmFpbGVkXG4iKTsKKwkJCQkJIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJCSByZXR1cm4gLUVCVVNZOworCQkJCX0KKwkJCQllbHNlCisJCQkJCSBQb3J0UC0+U3RhdGUgfD0gUklPX0JVU1k7CisKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOworCQkJCWlmICggY29weW91dCggKGNhZGRyX3QpcC0+UklPTWVtRHVtcCwgKGludClhcmcsIAorCQkJCQkJCU1FTURVTVBfU0laRSkgPT0gQ09QWUZBSUwgKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTUVNX0RVTVAgY29weSBmYWlsZWRcbiIpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gMDsKKworCQkJY2FzZSBSSU9fVElDSzoKKwkJCQlpZiAoKGludClhcmcgPCAwIHx8IChpbnQpYXJnID49IHAtPlJJT051bUhvc3RzKQorCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiU2V0IGludGVycnVwdCBmb3IgaG9zdCAlZFxuIiwgKGludClhcmcpOworCQkJCVdCWVRFKHAtPlJJT0hvc3RzWyhpbnQpYXJnXS5TZXRJbnQgLCAweGZmKTsKKwkJCQlyZXR1cm4gMDsKKworCQkJY2FzZSBSSU9fVE9DSzoKKwkJCQlpZiAoKGludClhcmcgPCAwIHx8IChpbnQpYXJnID49IHAtPlJJT051bUhvc3RzKQorCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ2xlYXIgaW50ZXJydXB0IGZvciBob3N0ICVkXG4iLCAoaW50KWFyZyk7CisJCQkJV0JZVEUoKHAtPlJJT0hvc3RzWyhpbnQpYXJnXS5SZXNldEludCkgLCAweGZmKTsKKwkJCQlyZXR1cm4gMDsKKworCQkJY2FzZSBSSU9fUkVBRF9DSEVDSzoKKwkJCQkvKiBDaGVjayByZWFkcyBmb3IgcGt0cyB3aXRoIGRhdGFbMF0gdGhlIHNhbWUgKi8KKwkJCQlwLT5SSU9SZWFkQ2hlY2sgPSAhcC0+UklPUmVhZENoZWNrOworCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9SZWFkQ2hlY2ssKGludClhcmcsCisJCQkJCQkJc2l6ZW9mKHVpbnQpKT09IENPUFlGQUlMKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCXJldHVybiAwOworCisJCQljYXNlIFJJT19SRUFEX1JFR0lTVEVSIDoKKwkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmU3ViQ21kLCAKKwkJCQkJCQlzaXplb2Yoc3RydWN0IFN1YkNtZFN0cnVjdCkpID09IENPUFlGQUlMKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQkJCSByZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFQURfUkVHSVNURVIgaG9zdCAlZCBydXAgJWQgcG9ydCAlZCByZWcgJXhcbiIsIAorCQkJCQkJU3ViQ21kLkhvc3QsIFN1YkNtZC5SdXAsIFN1YkNtZC5Qb3J0LCBTdWJDbWQuQWRkcik7CisKKwkJCQlpZiAoU3ViQ21kLlBvcnQgPiA1MTEpIHsKKwkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkJhdWQgcmF0ZSBtYXBwaW5nOiBCYWQgcG9ydCBudW1iZXIgJWRcbiIsIAorCQkJCQkJCQlTdWJDbWQuUG9ydCk7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQkJIHJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCWlmIChTdWJDbWQuUnVwID49IE1BWF9SVVArTElOS1NfUEVSX1VOSVQgKSB7CisJCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFJVUF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJaWYgKFN1YkNtZC5Ib3N0ID49IHAtPlJJT051bUhvc3RzICkgeworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlwb3J0ID0gcC0+UklPSG9zdHNbU3ViQ21kLkhvc3RdLgorCQkJCQkJVW5peFJ1cHNbU3ViQ21kLlJ1cF0uQmFzZVN5c1BvcnQgKyBTdWJDbWQuUG9ydDsKKwkJCQlQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOworCisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisJCQkJaWYgKFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIFJFQURfUkVHSVNURVIpID09IFJJT19GQUlMKSB7CisJCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVBRF9SRUdJU1RFUiBmYWlsZWRcbiIpOworCQkJCQkgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKKwkJCQkJIHJldHVybiAtRUJVU1k7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJIFBvcnRQLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7CisJCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPkNkUmVnaXN0ZXIsIChpbnQpYXJnLCAKKwkJCQkJCQlzaXplb2YodWludCkpID09IENPUFlGQUlMICkgeworCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFQURfUkVHSVNURVIgY29weSBmYWlsZWRcbiIpOworCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQkJIHJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gMDsKKwkJCQkvKgorCQkJCSoqIHJpb19tYWtlX2RldjogZ2l2ZW4gcG9ydCBudW1iZXIgKDAtNTExKSBPUmVkIHdpdGggcG9ydCB0eXBlCisJCQkJKiogKFJJT19ERVZfRElSRUNULCBSSU9fREVWX01PREVNLCBSSU9fREVWX1hQUklOVCkgcmV0dXJuIGRldl90CisJCQkJKiogdmFsdWUgdG8gcGFzcyB0byBta25vZCB0byBjcmVhdGUgdGhlIGNvcnJlY3QgZGV2aWNlIG5vZGUuCisJCQkJKi8KKwkJCWNhc2UgUklPX01BS0VfREVWOgorCQkJCXsKKwkJCQkJdWludCBwb3J0ID0gKHVpbnQpYXJnICYgUklPX01PREVNX01BU0s7CisKKwkJCQkJc3dpdGNoICggKHVpbnQpYXJnICYgUklPX0RFVl9NQVNLICkgeworCQkJCQkJY2FzZSBSSU9fREVWX0RJUkVDVDoKKwkJCQkJCQlhcmcgPSAoY2FkZHJfdClkcnZfbWFrZWRldihNQUpPUihkZXYpLCBwb3J0KTsKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYWtlZGV2IGRpcmVjdCAweCV4IGlzIDB4JXhcbiIscG9ydCwgKGludClhcmcpOworCQkJCQkJCXJldHVybiAoaW50KWFyZzsKKwkJCQkJIAljYXNlIFJJT19ERVZfTU9ERU06CisJCQkJCQkJYXJnID0gIChjYWRkcl90KWRydl9tYWtlZGV2KE1BSk9SKGRldiksIChwb3J0fFJJT19NT0RFTV9CSVQpICk7CisJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFrZWRldiBtb2RlbSAweCV4IGlzIDB4JXhcbiIscG9ydCwgKGludClhcmcpOworCQkJCQkJCXJldHVybiAoaW50KWFyZzsKKwkJCQkJCWNhc2UgUklPX0RFVl9YUFJJTlQ6CisJCQkJCQkJYXJnID0gKGNhZGRyX3QpZHJ2X21ha2VkZXYoTUFKT1IoZGV2KSwgcG9ydCk7CisJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFrZWRldiBwcmludGVyIDB4JXggaXMgMHgleFxuIixwb3J0LCAoaW50KWFyZyk7CisJCQkJCQkJcmV0dXJuIChpbnQpYXJnOworCQkJCQl9CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1BS0UgRGV2aWNlIGlzIGNhbGxlZFxuIik7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQkvKgorCQkJCSoqIHJpb19taW5vcjogZ2l2ZW4gYSBkZXZfdCBmcm9tIGEgc3RhdCgpIGNhbGwsIHJldHVybgorCQkJCSoqIHRoZSBwb3J0IG51bWJlciAoMC01MTEpIE9SZWQgd2l0aCB0aGUgcG9ydCB0eXBlCisJCQkJKiogKCBSSU9fREVWX0RJUkVDVCwgUklPX0RFVl9NT0RFTSwgUklPX0RFVl9YUFJJTlQgKQorCQkJCSovCisJCQljYXNlIFJJT19NSU5PUjoKKwkJCQl7CisJCQkJCWRldl90IGR2OworCQkJCQlpbnQgbWlubzsKKworCQkJCQlkdiA9IChkZXZfdCkoKGludClhcmcpOworCQkJCQltaW5vID0gUklPX1VOTU9ERU0oZHYpOworCisJCQkJCWlmICggUklPX0lTTU9ERU0oZHYpICkgeworCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWlub3IgZm9yIGRldmljZSAweCV4OiBtb2RlbSAlZFxuIiwgZHYsIG1pbm8pOworCQkJCQkJYXJnID0gKGNhZGRyX3QpKG1pbm8gfCBSSU9fREVWX01PREVNKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1pbm9yIGZvciBkZXZpY2UgMHgleDogZGlyZWN0ICVkXG4iLCBkdiwgbWlubyk7CisJCQkJCQlhcmcgPSAoY2FkZHJfdCkobWlubyB8IFJJT19ERVZfRElSRUNUKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gKGludClhcmc7CisJCQkJfQorCX0KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJJTlZBTElEIERBRU1PTiBJT0NUTCAweCV4XG4iLGNtZCk7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBJT0NUTF9DT01NQU5EX1VOS05PV047CisKKwlmdW5jX2V4aXQgKCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisqKiBQcmUtZW1wdGl2ZSBjb21tYW5kcyBnbyBvbiBSVVBzIGFuZCBhcmUgb25seSBvbmUgYnl0ZSBsb25nLgorKi8KK2ludAorUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgQ21kKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3N0cnVjdCBQb3J0ICpQb3J0UDsKK3VjaGFyIENtZDsKK3sKKwlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOworCXN0cnVjdCBQa3RDbWRfTSAqUGt0Q21kUDsKKwlpbnQgUmV0OworCXVzaG9ydCBydXA7CisJaW50IHBvcnQ7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrUG9ydFAoIFBvcnRQICk7CisjZW5kaWYKKworCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlByZWVtcHRpdmUgY29tbWFuZCB0byBkZWxldGVkIFJUQSBpZ25vcmVkXG4iKTsKKwkJcmV0dXJuIFJJT19GQUlMOworCX0KKworCWlmICgoKGludCkoKGNoYXIpUG9ydFAtPkluVXNlKSA9PSAtMSkgfHwgISAoQ21kQmxrUCA9IFJJT0dldENtZEJsaygpKSApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ2Fubm90IGFsbG9jYXRlIGNvbW1hbmQgYmxvY2sgZm9yIGNvbW1hbmQgJWQgb24gcG9ydCAlZFxuIiwKKwkJICAgICAgIENtZCwgUG9ydFAtPlBvcnROdW0pOworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29tbWFuZCBibGsgMHgleCAtIEluVXNlIG5vdyAlZFxuIiwgCisJICAgICAgIChpbnQpQ21kQmxrUCxQb3J0UC0+SW5Vc2UpOworCisJUGt0Q21kUCA9IChzdHJ1Y3QgUGt0Q21kX00gKikmQ21kQmxrUC0+UGFja2V0LmRhdGFbMF07CisKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgID0gMDsKKwlpZiAoUG9ydFAtPlNlY29uZEJsb2NrKQorCQlydXAgPSBQb3J0UC0+SUQyOworCWVsc2UKKwkJcnVwID0gUG9ydFAtPlJ1cE51bTsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gcnVwOworCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBDT01NQU5EX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQ09NTUFORF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LmxlbgkgID0gUEtUX0NNRF9CSVQgfCAyOworCUNtZEJsa1AtPlBvc3RGdW5jUAk9IFJJT1VuVXNlOworCUNtZEJsa1AtPlBvc3RBcmcJPSAoaW50KVBvcnRQOworCVBrdENtZFAtPkNvbW1hbmQJPSBDbWQ7CisJcG9ydAkJCQk9IFBvcnRQLT5Ib3N0UG9ydCAlICh1c2hvcnQpUE9SVFNfUEVSX1JUQTsKKwkvKgorCSoqIEluZGV4IHBvcnRzIDgtMTUgZm9yIDJuZCBibG9jayBvZiAxNiBwb3J0IFJUQS4KKwkqLworCWlmIChQb3J0UC0+U2Vjb25kQmxvY2spCisJCXBvcnQgKz0gKHVzaG9ydCkgUE9SVFNfUEVSX1JUQTsKKwlQa3RDbWRQLT5QaGJOdW0JICAgPSBwb3J0OworCisJc3dpdGNoICggQ21kICkgeworCQljYXNlIE1FTURVTVA6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBNRU1EVU1QIGNvbW1hbmQgYmxrIDB4JXggKGFkZHIgMHgleClcbiIsCisJCQkgICAgICAgKGludClDbWRCbGtQLCAoaW50KVN1YkNtZC5BZGRyKTsKKwkJCVBrdENtZFAtPlN1YkNvbW1hbmQJCT0gTUVNRFVNUDsKKwkJCVBrdENtZFAtPlN1YkFkZHIJCT0gU3ViQ21kLkFkZHI7CisJCQlicmVhazsKKwkJY2FzZSBGQ0xPU0U6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBGQ0xPU0UgY29tbWFuZCBibGsgMHgleFxuIiwoaW50KUNtZEJsa1ApOworCQkJYnJlYWs7CisJCWNhc2UgUkVBRF9SRUdJU1RFUjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIFJFQURfUkVHSVNURVIgKDB4JXgpIGNvbW1hbmQgYmxrIDB4JXhcbiIsCisJCSAJCShpbnQpU3ViQ21kLkFkZHIsIChpbnQpQ21kQmxrUCk7CisJCQlQa3RDbWRQLT5TdWJDb21tYW5kCQk9IFJFQURfUkVHSVNURVI7CisJCQlQa3RDbWRQLT5TdWJBZGRyCQk9IFN1YkNtZC5BZGRyOworCQkJYnJlYWs7CisJCWNhc2UgUkVTVU1FOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgUkVTVU1FIGNvbW1hbmQgYmxrIDB4JXhcbiIsKGludClDbWRCbGtQKTsKKwkJCWJyZWFrOworCQljYXNlIFJGTFVTSDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIFJGTFVTSCBjb21tYW5kIGJsayAweCV4XG4iLChpbnQpQ21kQmxrUCk7CisJCQlDbWRCbGtQLT5Qb3N0RnVuY1AgPSBSSU9SRmx1c2hFbmFibGU7CisJCQlicmVhazsKKwkJY2FzZSBTVVNQRU5EOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgU1VTUEVORCBjb21tYW5kIGJsayAweCV4XG4iLChpbnQpQ21kQmxrUCk7CisJCQlicmVhazsKKworCQljYXNlIE1HRVQgOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgTUdFVCBjb21tYW5kIGJsayAweCV4XG4iLCAoaW50KUNtZEJsa1ApOworCQkJYnJlYWs7CisKKwkJY2FzZSBNU0VUIDoKKwkJY2FzZSBNQklDIDoKKwkJY2FzZSBNQklTIDoKKwkJCUNtZEJsa1AtPlBhY2tldC5kYXRhWzRdID0gKGNoYXIpIFBvcnRQLT5Nb2RlbUxpbmVzOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgTVNFVC9NQklDL01CSVMgY29tbWFuZCBibGsgMHgleFxuIiwgKGludClDbWRCbGtQKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0ZMVVNIOgorCQkJLyoKKwkJCSoqIElmIHdlIGhhdmUgcXVldWVkIHVwIHRoZSBtYXhpbXVtIG51bWJlciBvZiBXcml0ZSBmbHVzaGVzCisJCQkqKiBhbGxvd2VkIHRoZW4gd2Ugc2hvdWxkIG5vdCBib3RoZXIgc2VuZGluZyBhbnkgbW9yZSB0byB0aGUKKwkJCSoqIFJUQS4KKwkJCSovCisJCQlpZiAoKGludCkoKGNoYXIpUG9ydFAtPldmbHVzaEZsYWcpID09IChpbnQpLTEpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJUcmFzaGVkIFdGTFVTSCwgV2ZsdXNoRmxhZyBhYm91dCB0byB3cmFwISIpOworCQkJCVJJT0ZyZWVDbWRCbGsoQ21kQmxrUCk7CisJCQkJcmV0dXJuKFJJT19GQUlMKTsKKwkJCX0gZWxzZSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgV0ZMVVNIIGNvbW1hbmQgYmxrIDB4JXhcbiIsCisJCQkJICAgICAgIChpbnQpQ21kQmxrUCk7CisJCQkJQ21kQmxrUC0+UG9zdEZ1bmNQID0gUklPV0ZsdXNoTWFyazsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCVBvcnRQLT5JblVzZSsrOworCisJUmV0ID0gUklPUXVldWVDbWRCbGsoIFBvcnRQLT5Ib3N0UCwgcnVwLCBDbWRCbGtQICk7CisKKwlyZXR1cm4gUmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9kcnZyLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2RydnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzM4YWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9kcnZyLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb2RydnIuaAorKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMDk6MjI6NDYKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMDk6MjI6NDYKKyoqCisqKiAgaWRlbnQgQCgjKXJpb2RydnIuaAkxLjMKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb2RydnJfaAorI2RlZmluZSBfX3Jpb2RydnJfaAorCisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CS8qIGZvciBIWiAqLworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvZHJ2cl9oX3NjY3NfID0gIkAoIylyaW9kcnZyLmgJMS4zIjsKKyNlbmRpZgorCisjZGVmaW5lIE1FTURVTVBfU0laRQkzMgorI2RlZmluZQlNT0RfRElTQUJMRQkoUklPX05PUkVBRHxSSU9fTk9XUklURXxSSU9fTk9YUFJJTlQpCisKKworc3RydWN0IHJpb19pbmZvIHsKKwlpbnQJCQltb2RlOwkJCS8qIEludHIgb3IgcG9sbGVkLCB3b3JkL2J5dGUgKi8KKwlzcGlubG9ja190CQlSSU9JbnRyU2VtOwkJLyogSW50ZXJydXB0IHRocmVhZCBzZW0gKi8KKwlpbnQJCQljdXJyZW50X2NoYW47CQkvKiBjdXJyZW50IGNoYW5uZWwgKi8KKwlpbnQJCQlSSU9GYWlsZWQ7CQkvKiBOb3QgaW5pdGlhbGlzZWQgPyAqLworCWludAkJCVJJT0luc3RhbGxBdHRlbXB0czsJLyogbm8uIG9mIHJpby1pbnN0YWxsKCkgY2FsbHMgKi8KKwlpbnQJCQlSSU9MYXN0UENJU2VhcmNoOwkvKiBzdGF0dXMgb2YgbGFzdCBzZWFyY2ggKi8KKwlpbnQJCQlSSU9OdW1Ib3N0czsJCS8qIE51bWJlciBvZiBSSU8gSG9zdHMgKi8KKwlzdHJ1Y3QgSG9zdAkJKiBSSU9Ib3N0czsJCS8qIFJJTyBIb3N0IHZhbHVlcyAqLworCXN0cnVjdCBQb3J0CQkqKlJJT1BvcnRwOwkJLyogUklPIHBvcnQgdmFsdWVzICovCisvKgorKiogMDIuMDMuMTk5OSBBUkcgLSBFU0lMIDA4MjAgZml4CisqKiBXZSBubyBsb25nZXIgdXNlIFJJT0Jvb3RNb2RlCisqKgorCWludAkJCVJJT0Jvb3RNb2RlOwkJKiBSSU8gYm9vdCBtb2RlICoKKyoqCisqLworCWludAkJCVJJT1ByaW50RGlzYWJsZWQ7CS8qIFJJTyBwcmludGluZyBkaXNhYmxlZCA/ICovCisJaW50CQkJUklPUHJpbnRMb2dTdGF0ZTsJLyogUklPIHByaW50aW5nIHN0YXRlID8gKi8KKwlpbnQJCQlSSU9Qb2xsaW5nOwkJLyogUG9sbGluZyA/ICovCisvKgorKiogMDkuMTIuMTk5OCBBUkcgLSBFU0lMIDA3NzYgcGFydCBmaXgKKyoqIFRoZSAnUklPX1FVSUNLX0NIRUNLJyBpb2N0bCB3YXMgdXNpbmcgUklPSGFsdGVkLgorKiogVGhlIGZpeCBmb3IgdGhpcyBFU0lMIGludHJvZHVjZXMgYW5vdGhlciBtZW1iZXIgKFJJT1J0YURpc0NvbnMpIGhlcmUgdG8gYmUKKyoqIHVwZGF0ZWQgaW4gUklPQ29uQ29uKCkgLSB0byBrZWVwIHRyYWNrIG9mIFJUQSBjb25uZWN0aW9ucy9kaXNjb25uZWN0aW9ucy4KKyoqICdSSU9fUVVJQ0tfQ0hFQ0snIG5vdyByZXR1cm5zIHRoZSB2YWx1ZSBvZiBSSU9SdGFEaXNDb25zLgorKi8KKwlpbnQJCQlSSU9IYWx0ZWQ7CQkvKiBoYWx0ZWQgPyAqLworCWludAkJCVJJT1J0YURpc0NvbnM7CQkvKiBSVEEgY29ubmVjdGlvbnMvZGlzY29ubmVjdGlvbnMgKi8KKwl1aW50CQkJUklPUmVhZENoZWNrOwkJLyogUmlvIHJlYWQgY2hlY2sgKi8KKwl1aW50CQkJUklPTm9NZXNzYWdlOwkJLyogVG8gZGlzcGxheSBtZXNzYWdlIG9yIG5vdCAqLworCXVpbnQJCQlSSU9OdW1Cb290UGt0czsJCS8qIGhvdyBtYW55IHBhY2tldHMgZm9yIGFuIFJUQSAqLworCXVpbnQJCQlSSU9Cb290Q291bnQ7IAkJLyogc2l6ZSBvZiBSVEEgY29kZSAqLworCXVpbnQJCQlSSU9Cb290aW5nOwkJLyogY291bnQgb2Ygb3V0c3RhbmRpbmcgYm9vdHMgKi8KKwl1aW50CQkJUklPU3lzdGVtVXA7CQkvKiBCb290ZWQgPz8gKi8KKwl1aW50CQkJUklPQ291bnRpbmc7CQkvKiBmb3IgY291bnRpbmcgaW50ZXJydXB0cyAqLworCXVpbnQJCQlSSU9JbnRDb3VudDsJCS8qICMgb2YgaW50ciBzaW5jZSBsYXN0IGNoZWNrICovCisJdWludAkJCVJJT1R4Q291bnQ7CQkvKiBudW1iZXIgb2YgeG1pdCBpbnRycyAgKi8KKwl1aW50CQkJUklPUnhDb3VudDsJCS8qIG51bWJlciBvZiByeCBpbnRycyAqLworCXVpbnQJCQlSSU9SdXBDb3VudDsJCS8qIG51bWJlciBvZiBydXAgaW50cnMgKi8KKwlpbnQJCQlSSVhUaW1lcjsgCisJaW50CQkJUklPQnVmZmVyU2l6ZTsJCS8qIEJ1ZmZlcnNpemUgKi8KKwlpbnQJCQlSSU9CdWZmZXJNYXNrOwkJLyogQnVmZmVyc2l6ZSAqLworCisJaW50CQkJUklPRmlyc3RNYWpvcjsJCS8qIEZpcnN0IGhvc3QgY2FyZCdzIG1ham9yIG5vICovCisKKwl1aW50CQkJUklPTGFzdFBvcnRzTWFwcGVkOwkvKiBoaWdoZXN0IHBvcnQgbnVtYmVyIGtub3duICovCisJdWludAkJCVJJT0ZpcnN0UG9ydHNNYXBwZWQ7CS8qIGxvd2VzdCBwb3J0IG51bWJlciBrbm93biAqLworCisJdWludAkJCVJJT0xhc3RQb3J0c0Jvb3RlZDsJLyogaGlnaGVzdCBwb3J0IG51bWJlciBydW5uaW5nICovCisJdWludAkJCVJJT0ZpcnN0UG9ydHNCb290ZWQ7CS8qIGxvd2VzdCBwb3J0IG51bWJlciBydW5uaW5nICovCisKKwl1aW50CQkJUklPTGFzdFBvcnRzT3BlbmVkOwkvKiBoaWdoZXN0IHBvcnQgbnVtYmVyIHJ1bm5pbmcgKi8KKwl1aW50CQkJUklPRmlyc3RQb3J0c09wZW5lZDsJLyogbG93ZXN0IHBvcnQgbnVtYmVyIHJ1bm5pbmcgKi8KKworCS8qIEZsYWcgdG8gc2F5IHRoYXQgdGhlIHRvcG9sb2d5IGluZm9ybWF0aW9uIGhhcyBiZWVuIGNoYW5nZWQuICovCisJdWludAkJCVJJT1F1aWNrQ2hlY2s7IAorCXVpbnQJCQlDZFJlZ2lzdGVyOwkJLyogPz8/ICovCisJaW50CQkJUklPU2lnbmFsUHJvY2VzczsJLyogU2lnbmFsbGluZyBwcm9jZXNzICovCisJaW50CQkJcmlvX2RlYnVnOwkJLyogVG8gZGVidWcgLi4uICovCisJaW50CQkJUklPRGVidWdXYWl0OwkJLyogRm9yIHdoYXQgPz8/ICovCisJaW50CQkJdHByaTsJCQkvKiBUaHJlYWQgcHJpbyAqLworCWludAkJCXRpZDsJCQkvKiBUaHJlYWQgaWQgKi8KKwl1aW50CQkJX1JJT19Qb2xsZWQ7CQkvKiBDb3VudGVyIGZvciBwb2xsaW5nICovCisJdWludAkJCV9SSU9fSW50ZXJydXB0ZWQ7CS8qIENvdW50ZXIgZm9yIGludGVycnVwdCAqLworCWludAkJCWludHJfdGlkOwkJLyogaW9pbnRzZXQgcmV0dXJuIHZhbHVlICovCisJaW50CQkJVHhFblNlbTsJCS8qIFR4RW5hYmxlIFNlbWFwaG9yZSAqLworCisKKwlzdHJ1Y3QgRXJyb3IJCVJJT0Vycm9yOwkJLyogdG8gSWRlbnRpZnkgd2hhdCB3ZW50IHdyb25nICovIAorCXN0cnVjdCBDb25mCQlSSU9Db25mOwkJLyogQ29uZmlndXJhdGlvbiA/Pz8gKi8KKwlzdHJ1Y3QgdHR5c3RhdGljcwljaGFubmVsW1JJT19QT1JUU107CS8qIGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KKwljaGFyCQkJUklPQm9vdFBhY2tldHNbMSsoU0lYVFlfRk9VUl9LL1JUQV9CT09UX0RBVEFfU0laRSldCisJCQkJCQkJCVtSVEFfQk9PVF9EQVRBX1NJWkVdOworCXN0cnVjdCBNYXAJCVJJT0Nvbm5lY3RUYWJsZVtUT1RBTF9NQVBfRU5UUklFU107CisJc3RydWN0IE1hcAkJUklPU2F2ZWRUYWJsZVtUT1RBTF9NQVBfRU5UUklFU107CisKKwkvKiBSVEEgdG8gaG9zdCBiaW5kaW5nIHRhYmxlIGZvciBtYXN0ZXIvc2xhdmUgb3BlcmF0aW9uICovCisJdWxvbmcJCQlSSU9CaW5kVGFiW01BWF9SVEFfQklORElOR1NdOworCS8qIFJUQSBtZW1vcnkgZHVtcCB2YXJpYWJsZSAqLworCXVjaGFyCQkJUklPTWVtRHVtcFtNRU1EVU1QX1NJWkVdOyAKKwlzdHJ1Y3QgTW9kdWxlSW5mbyAJUklPTW9kdWxlVHlwZXNbTUFYX01PRFVMRV9UWVBFU107CisKK307CisKKworI2lmZGVmIGxpbnV4CisjZGVmaW5lIGRlYnVnKHgpICAgICAgICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZGVidWcoeCkJa2twcmludGYgeAorI2VuZGlmCisKKworCisjZGVmaW5lIFJJT19SRVNFVF9JTlQJMHg3ZDgwCisjZGVmaW5lIFdSQllURSh4LHkpCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoKHgpKSA9IFwKKwkJCQkJKHVuc2lnbmVkIGNoYXIpKHkpCisKKyNlbmRpZgkvKiBfX3Jpb2RydnIuaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pbmZvLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDg0MjFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pbmZvLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvaW5mby5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxNDowNzo0OQorKioJUmV0cmlldmVkCTogMTEvNi85OCAxNDowNzo1MAorKioKKyoqICBpZGVudCBAKCMpcmlvaW5mby5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvaW5mb19oCisjZGVmaW5lIF9fcmlvaW5mb19oCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9pbmZvX2hfc2Njc18gPSAiQCgjKXJpb2luZm8uaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBIb3N0IGNhcmQgZGF0YSBzdHJ1Y3R1cmUKKyovCitzdHJ1Y3QgUmlvSG9zdEluZm8geworCWxvbmcJbG9jYXRpb247CS8qIFJJTyBDYXJkIEJhc2UgSS9PIGFkZHJlc3MgKi8KKwlsb25nCXZlY3RvcjsJCS8qIFJJTyBDYXJkIElSUSB2ZWN0b3IgKi8KKwlpbnQJYnVzOwkJLyogSVNBL0VJU0EvTUNBL1BDSSAqLworCWludAltb2RlOwkJLyogcG9pbnRlciB0byBob3N0IG1vZGUgLSBJTlRFUlJVUFQgLyBQT0xMRUQgKi8KKwlzdHJ1Y3Qgb2xkX3NndHR5YgorCQkqIFNnOwkJLyogcG9pbnRlciB0byBkZWZhdWx0IHRlcm0gY2hhcmFjdGVyaXN0aWNzICovCit9OworCisKKy8qIE1vZGUgaW4gcmlvIGRldmljZSBpbmZvICovCisjZGVmaW5lIElOVEVSUlVQVEVEX01PREUJMHgwMQkJLyogSW50ZXJydXB0IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBQT0xMRURfTU9ERQkJMHgwMgkJLyogTm8gaW50ZXJydXB0ICovCisjZGVmaW5lIEFVVE9fTU9ERQkJMHgwMwkJLyogQXV0byBtb2RlICovCisKKyNkZWZpbmUgV09SRF9BQ0NFU1NfTU9ERQkweDEwCQkvKiBXb3JkIEFjY2VzcyBNb2RlICovCisjZGVmaW5lIEJZVEVfQUNDRVNTX01PREUJMHgyMAkJLyogQnl0ZSBBY2Nlc3MgTW9kZSAqLworCisKKy8qIEJ1cyB0eXBlIHRoYXQgUklPIHN1cHBvcnRzICovCisjZGVmaW5lIElTQV9CVVMJCQkweDAxCQkvKiBUaGUgY2FyZCBpcyBJU0EgKi8KKyNkZWZpbmUgRUlTQV9CVVMJCTB4MDIJCS8qIFRoZSBjYXJkIGlzIEVJU0EgKi8KKyNkZWZpbmUgTUNBX0JVUwkJCTB4MDQJCS8qIFRoZSBjYXJkIGlzIE1DQSAqLworI2RlZmluZSBQQ0lfQlVTCQkJMHgwOAkJLyogVGhlIGNhcmQgaXMgUENJICovCisKKy8qCisqKiAxMS4xMS4xOTk4IEFSRyAtIEVTSUwgPz8/PyBwYXJ0IGZpeAorKiogTW92ZWQgZGVmaW5pdGlvbiBmb3IgJ0NIQU4nIGhlcmUgZnJvbSByaW9pbmZvLmMgKGl0IGlzIG5vdworKiogY2FsbGVkICdERUZfVEVSTV9DSEFSQUNURVJJU1RJQ1MnKS4KKyovCisKKyNkZWZpbmUgREVGX1RFUk1fQ0hBUkFDVEVSSVNUSUNTIFwKK3sgXAorCUIxOTIwMCwgQjE5MjAwLAkJCQkvKiBpbnB1dCBhbmQgb3V0cHV0IHNwZWVkICovIFwKKwknSCcgLSAnQCcsCQkJCS8qIGVyYXNlIGNoYXIgKi8gXAorCS0xLAkJCQkJLyogMm5kIGVyYXNlIGNoYXIgKi8gXAorCSdVJyAtICdAJywJCQkJLyoga2lsbCBjaGFyICovIFwKKwlFQ0hPIHwgQ1JNT0QsCQkJCS8qIG1vZGUgKi8gXAorCSdDJyAtICdAJywJCQkJLyogaW50ZXJydXB0IGNoYXJhY3RlciAqLyBcCisJJ1xcJyAtICdAJywJCQkJLyogcXVpdCBjaGFyICovIFwKKwknUScgLSAnQCcsCQkJCS8qIHN0YXJ0IGNoYXIgKi8gXAorCSdTJyAtICdAJywJCQkJLyogc3RvcCBjaGFyICovIFwKKwknRCcgLSAnQCcsCQkJCS8qIEVPRiAqLyBcCisJLTEsCQkJCQkvKiBicmsgKi8gXAorCShMQ1JUQlMgfCBMQ1JURVJBIHwgTENSVEtJTCB8IExDVExFQ0gpLAkvKiBsb2NhbCBtb2RlIHdvcmQgKi8gXAorCSdaJyAtICdAJywJCQkJLyogcHJvY2VzcyBzdG9wICovIFwKKwknWScgLSAnQCcsCQkJCS8qIGRlbGF5ZWQgc3RvcCAqLyBcCisJJ1InIC0gJ0AnLAkJCQkvKiByZXByaW50IGxpbmUgKi8gXAorCSdPJyAtICdAJywJCQkJLyogZmx1c2ggb3V0cHV0ICovIFwKKwknVycgLSAnQCcsCQkJCS8qIHdvcmQgZXJhc2UgKi8gXAorCSdWJyAtICdAJwkJCQkvKiBsaXRlcmFsIG5leHQgY2hhciAqLyBcCit9CisKKyNlbmRpZiAvKiBfX3Jpb2luZm9faCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pbml0LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E5NDFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pbml0LmMKQEAgLTAsMCArMSwxNjE3IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9pbml0LmMKKyoqCVNJRAkJOiAxLjMKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDEwOjMzOjQzCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDEwOjMzOjQ5CisqKgorKiogIGlkZW50IEAoIylyaW9pbml0LmMJMS4zCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvaW5pdF9jX3NjY3NfID0gIkAoIylyaW9pbml0LmMJMS4zIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKworI2luY2x1ZGUgImxpbnV4X2NvbXBhdC5oIgorI2luY2x1ZGUgInR5cGRlZi5oIgorI2luY2x1ZGUgInBrdC5oIgorI2luY2x1ZGUgImRhZW1vbi5oIgorI2luY2x1ZGUgInJpby5oIgorI2luY2x1ZGUgInJpb3NwYWNlLmgiCisjaW5jbHVkZSAidG9wLmgiCisjaW5jbHVkZSAiY21kcGt0LmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAicmlvdHlwZXMuaCIKKyNpbmNsdWRlICJydXAuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmlvZHJ2ci5oIgorI2luY2x1ZGUgInJpb2luZm8uaCIKKyNpbmNsdWRlICJmdW5jLmgiCisjaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyNpbmNsdWRlICJwYXJtbWFwLmgiCisjaW5jbHVkZSAidW5peHJ1cC5oIgorI2luY2x1ZGUgImJvYXJkLmgiCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAicGhiLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgImNtZGJsay5oIgorI2luY2x1ZGUgInJvdXRlLmgiCisjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgImNpcnJ1cy5oIgorI2luY2x1ZGUgInJpb2lvY3RsLmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisKKyN1bmRlZiBiY29weQorI2RlZmluZSBiY29weSByaW9fcGNpY29weQorCitpbnQgUklPUENJaW5pdChzdHJ1Y3QgcmlvX2luZm8gKnAsIGludCBNb2RlKTsKKworI2lmIDAKK3N0YXRpYyB2b2lkIFJJT0FsbG9jYXRlSW50ZXJydXB0cyhzdHJ1Y3QgcmlvX2luZm8gKik7CitzdGF0aWMgaW50IFJJT1JlcG9ydChzdHJ1Y3QgcmlvX2luZm8gKik7CitzdGF0aWMgdm9pZCBSSU9TdG9wSW50ZXJydXB0cyhzdHJ1Y3QgcmlvX2luZm8gKiwgaW50LCBpbnQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgUklPU2NydWIoaW50LCBCWVRFICosIGludCk7CisKKyNpZiAwCitleHRlcm4gaW50CXJpb19pbnRyKCk7CisKKy8qCisqKglJbml0IHRpbWUgY29kZS4KKyovCit2b2lkCityaW9pbml0KCBwLCBpbmZvICkKK3N0cnVjdCByaW9faW5mbwkJKiBwOworc3RydWN0IFJpb0hvc3RJbmZvCSogaW5mbzsKK3sKKwkvKgorCSoqIE11bHRpLUhvc3QgY2FyZCBzdXBwb3J0IC0gdGFraW5nIHRoZSBlYXN5IHdheSBvdXQgLSBzb3JyeSAhCisJKiogV2UgYWxsb2NhdGUgYW5kIHNldCB1cCB0aGUgSG9zdCBhbmQgUG9ydCBzdHJ1Y3RzIHdoZW4gdGhlCisJKiogZHJpdmVyIGlzIGNhbGxlZCB0byAnaW5zdGFsbCcgdGhlIGZpcnN0IGhvc3QuCisJKiogV2UgY2hlY2sgZm9yIHRoaXMgZmlyc3QgJ2NhbGwnIGJ5IHRlc3RpbmcgdGhlIFJJT1BvcnRwIHBvaW50ZXIuCisJKi8KKwlpZiAoICFwLT5SSU9Qb3J0cCApCisJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiQWxsb2NhdGluZyBhbmQgc2V0dGluZyB1cCBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmVzXG4iKTsKKworCQlSSU9BbGxvY0RhdGFTdHJ1Y3RzKHApOwkJLyogYWxsb2NhdGUgaG9zdC9wb3J0IHN0cnVjdHMgKi8KKwkJUklPU2V0dXBEYXRhU3RydWN0cyhwKTsJCS8qIHNldHVwIHRvcG9sb2d5IHN0cnVjdHMgKi8KKwl9CisKKwlSSU9Jbml0SG9zdHMoIHAsIGluZm8gKTsJLyogaHVudCBkb3duIHRoZSBoYXJkd2FyZSAqLworCisJUklPQWxsb2NhdGVJbnRlcnJ1cHRzKHApOwkvKiBhbGxvY2F0ZSBpbnRlcnJ1cHRzICovCisJUklPUmVwb3J0KHApOwkJCS8qIHNob3cgd2hhdCB3ZSBmb3VuZCAqLworfQorCisvKgorKiogSW5pdGlhbGlzZSB0aGUgQ2FyZHMgCisqLyAKK3ZvaWQKK1JJT0luaXRIb3N0cyhwLCBpbmZvKQorc3RydWN0IHJpb19pbmZvCQkqIHA7CitzdHJ1Y3QgUmlvSG9zdEluZm8JKiBpbmZvOworeworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYyIHBhcnQgZml4CisqKiBJZiB0aGVyZSBpcyBubyBJU0EgY2FyZCBkZWZpbml0aW9uIC0gd2UgYWx3YXlzIGxvb2sgZm9yIFBDSSBjYXJkcy4KKyoqIEFzIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgb25lIGhvc3QgY2FyZCB0aGlzIGxldHMgYW4gSVNBIGNhcmQKKyoqIGRlZmluaXRpb24gdGFrZSBwcmVjZWRlbmNlIG92ZXIgUExVRyBhbmQgUExBWS4KKyoqIE5vIElTQSBjYXJkIC0gd2UgYXJlIFBMVUcgYW5kIFBMQVkgd2l0aCBQQ0kuCisqLworCisJLyoKKwkqKiBOb3RlIC0gZm9yIFBDSSBib3RoIHRoZXNlIHdpbGwgYmUgemVybywgdGhhdCdzIG9rYXkgYmVjYXVzZQorCSoqIFJJT1BDSUluaXQoKSBmaWxscyB0aGVtIGluIGlmIGEgY2FyZCBpcyBmb3VuZC4KKwkqLworCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5JdmVjCT0gaW5mby0+dmVjdG9yOworCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAJPSBpbmZvLT5sb2NhdGlvbjsKKworCS8qCisJKiogQ2hlY2sgdGhhdCB3ZSBhcmUgYWJsZSB0byBhY2NvbW1vZGF0ZSBhbm90aGVyIGhvc3QKKwkqLworCWlmICggcC0+UklPTnVtSG9zdHMgPj0gUklPX0hPU1RTICkKKwl7CisJCXAtPlJJT0ZhaWxlZCsrOworCQlyZXR1cm47CisJfQorCisJaWYgKCBpbmZvLT5idXMgJiBJU0FfQlVTICkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJpbml0aWFsaXNpbmcgY2FyZCAlZCAoSVNBKVxuIiwgcC0+UklPTnVtSG9zdHMpOworCQlSSU9JU0Fpbml0KHAsIHAtPm1vZGUpOworCX0KKwllbHNlCisJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiaW5pdGlhbGlzaW5nIGNhcmQgJWQgKFBDSSlcbiIsIHAtPlJJT051bUhvc3RzKTsKKwkJUklPUENJaW5pdChwLCBSSU9fUENJX0RFRkFVTFRfTU9ERSk7CisJfQorCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIlRvdGFsIGhvc3RzIGluaXRpYWxpc2VkIHNvIGZhciA6ICVkXG4iLCBwLT5SSU9OdW1Ib3N0cyk7CisKKworI2lmZGVmIEZVVFVSRV9SRUxFQVNFCisJaWYgKHAtPmJ1cyAmIEVJU0FfQlVTKQorCQkvKiBFSVNBIGNhcmQgKi8KKwkJUklPRUlTQWluaXQocCwgUklPX0VJU0FfREVGQVVMVF9NT0RFKTsKKworCWlmIChwLT5idXMgJiBNQ0FfQlVTKQorCQkvKiBNQ0EgY2FyZCAqLworCQlSSU9NQ0Fpbml0KHAsIFJJT19NQ0FfREVGQVVMVF9NT0RFKTsKKyNlbmRpZgorfQorCisvKgorKiogZ28gdGhyb3VnaCBtZW1vcnkgZm9yIGFuIEFUIGhvc3QgdGhhdCB3ZSBwYXNzIGluIHRoZSBkZXZpY2UgaW5mbworKiogc3RydWN0dXJlIGFuZCBpbml0aWFsaXNlCisqLwordm9pZAorUklPSVNBaW5pdChwLCBtb2RlKQorc3RydWN0IHJpb19pbmZvICoJcDsKK2ludAkJCQkJbW9kZTsKK3sKKworICAvKiBYWFggTmVlZCB0byBpbXBsZW1lbnQgdGhpcy4gKi8KKyNpZiAwCisJcC0+aW50cl90aWQgPSBpb2ludHNldChwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uSXZlYywKKwkJCQkJKGludCAoKikoKSlyaW9faW50ciwgKGNoYXIqKXAtPlJJT051bUhvc3RzKTsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJTZXQgaW50ZXJydXB0IGhhbmRsZXIsIGludHJfdGlkID0gMHgleFxuIiwgcC0+aW50cl90aWQgKTsKKworCWlmIChSSU9Eb0FUKHAsIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIG1vZGUpKSB7CisJCXJldHVybjsKKwl9CisJZWxzZSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJT0RvQVQgZmFpbGVkXG4iKTsKKwkJcC0+UklPRmFpbGVkKys7CisJfQorI2VuZGlmCisKK30KKworLyoKKyoqIFJJT0RvQVQgOgorKioKKyoqIE1hcCBpbiBhIGJvYXJkcyBwaHlzaWNhbCBhZGRyZXNzLCBjaGVjayB0aGF0IHRoZSBib2FyZCBpcyB0aGVyZSwKKyoqIHRlc3QgdGhlIGJvYXJkIGFuZCBpZiBldmVyeXRoaW5nIGlzIG9rYXkgYXNzaWduIHRoZSBib2FyZCBhbiBlbnRyeQorKiogaW4gdGhlIFJpbyBIb3N0cyBzdHJ1Y3R1cmUuCisqLworaW50CitSSU9Eb0FUKHAsIEJhc2UsIG1vZGUpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworaW50CQlCYXNlOworaW50CQltb2RlOworeworI2RlZmluZQlGT1VORAkJMQorI2RlZmluZSBOT1RfRk9VTkQJMAorCisJY2FkZHJfdAkJY2FyZEFkZHI7CisKKwkvKgorCSoqIENoZWNrIHRvIHNlZSBpZiB3ZSBhY3R1YWxseSBoYXZlIGEgYm9hcmQgYXQgdGhpcyBwaHlzaWNhbCBhZGRyZXNzLgorCSovCisJaWYgKChjYXJkQWRkciA9IFJJT0NoZWNrRm9yQVRDYXJkKEJhc2UpKSAhPSAwKSB7CisJCS8qCisJCSoqIE5vdyB0ZXN0IHRoZSBib2FyZCB0byBzZWUgaWYgaXQgaXMgd29ya2luZy4KKwkJKi8KKwkJaWYgKFJJT0JvYXJkVGVzdChCYXNlLCBjYXJkQWRkciwgUklPX0FULCAwKSA9PSBSSU9fU1VDQ0VTUykgeworCQkJLyoKKwkJCSoqIEZpbGwgb3V0IGEgc2xvdCBpbiB0aGUgUmlvIGhvc3Qgc3RydWN0dXJlLgorCQkJKi8KKwkJCWlmIChSSU9Bc3NpZ25BVChwLCBCYXNlLCBjYXJkQWRkciwgbW9kZSkpIHsKKwkJCQlyZXR1cm4oRk9VTkQpOworCQkJfQorCQl9CisJCVJJT01hcG91dChCYXNlLCBSSU9fQVRfTUVNX1NJWkUsIGNhcmRBZGRyKTsKKwl9CisJcmV0dXJuKE5PVF9GT1VORCk7Cit9CisKK2NhZGRyX3QKK1JJT0NoZWNrRm9yQVRDYXJkKEJhc2UpCitpbnQJCUJhc2U7Cit7CisJaW50CQkJCW9mZjsKKwlzdHJ1Y3QgRHBSYW0JKmNhcmRwOwkJLyogKFBvaW50cyBhdCB0aGUgaG9zdCkgKi8KKwljYWRkcl90CQkJdmlydEFkZHI7CisJdW5zaWduZWQgY2hhcgkJCVJJT1NpZ1RhYlsyNF07CisvKgorKiogVGFibGUgb2YgdmFsdWVzIHRvIHNlYXJjaCBmb3IgYXMgcHJvbSBzaWduYXR1cmUgb2YgYSBob3N0IGNhcmQKKyovCisJc3RyY3B5KFJJT1NpZ1RhYiwgIkpCSkdQR0dISU5TTUpQSlIiKTsKKworCS8qCisJKiogSGV5ISBZZXMsIFlvdSByZWFkaW5nIHRoaXMgY29kZSEgWW8sIGdyYWIgYSBsb2FkIGEgdGhpczoKKwkqKgorCSoqIElGIHRoZSBjYXJkIGlzIHVzaW5nIFdPUkQgTU9ERSByYXRoZXIgdGhhbiBCWVRFIE1PREUKKwkqKiB0aGVuIGl0IHdpbGwgb2NjdXB5IDEyOEsgb2YgUEhZU0lDQUwgbWVtb3J5IGFyZWEuIFNvLAorCSoqIHlvdSBtaWdodCB0aGluayB0aGF0IHRoZSBmb2xsb3dpbmcgTWFwaW4gaXMgd3JvbmcuIFdlbGwsCisJKiogaXQgaXNuJ3QsIGJlY2F1c2UgdGhlIFNFQ09ORCA2NEsgb2Ygb2NjdXBpZWQgc3BhY2UgaXMgYW4KKwkqKiBFWEFDVCBDT1BZIG9mIHRoZSBGSVJTVCA2NEsuIChnb29kPyksIHNvLCB3ZSBuZWVkIG9ubHkKKwkqKiBtYXAgaXQgaW4gaW4gb25lIDY0SyBibG9jay4KKwkqLworCWlmIChSSU9NYXBpbihCYXNlLCBSSU9fQVRfTUVNX1NJWkUsICZ2aXJ0QWRkcikgPT0gLTEpIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IENvdWxkbid0IG1hcCB0aGUgYm9hcmQgaW4hXG4iKTsKKwkJcmV0dXJuKChjYWRkcl90KTApOworCX0KKworCS8qCisJKiogdmlydEFkZHIgcG9pbnRzIHRvIHRoZSBEUCByYW0gb2YgdGhlIHN5c3RlbS4KKwkqKiBXZSBub3cgY2FzdCB0aGlzIHRvIGEgcG9pbnRlciB0byBhIFJJTyBIb3N0LAorCSoqIGFuZCBoYXZlIGEgcnVtbWFnZSBhYm91dCBpbiB0aGUgUFJPTS4KKwkqLworCWNhcmRwID0gKHN0cnVjdCBEcFJhbSAqKXZpcnRBZGRyOworCisJZm9yIChvZmY9MDsgUklPU2lnVGFiW29mZl07IG9mZisrKSB7CisJCWlmICgoUkJZVEUoY2FyZHAtPkRwU2lnbmF0dXJlW29mZl0pICYgMHhGRikgIT0gUklPU2lnVGFiW29mZl0pIHsKKwkJCS8qCisJCQkqKiBTaWduYXR1cmUgbWlzbWF0Y2ggLSBjYXJkIG5vdCBhdCB0aGlzIGFkZHJlc3MKKwkJCSovCisJCQlSSU9NYXBvdXQoQmFzZSwgUklPX0FUX01FTV9TSVpFLCB2aXJ0QWRkcik7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogQ291bGRuJ3QgbWF0Y2ggdGhlIHNpZ25hdHVyZSAweCV4IDB4JXghXG4iLAorCQkJCQkJKGludCljYXJkcCwgb2ZmKTsKKwkJCXJldHVybigoY2FkZHJfdCkwKTsKKwkJfQorCX0KKworCS8qCisJKiogSWYgd2UgZ2V0IGhlcmUgdGhlbiB3ZSBtdXN0IGhhdmUgZm91bmQgYSB2YWxpZCBib2FyZCBzbyByZXR1cm4KKwkqKiBpdHMgdmlydHVhbCBhZGRyZXNzLgorCSovCisJcmV0dXJuKHZpcnRBZGRyKTsKK30KKyNlbmRpZgorCisvKioKKyoqIFJJT0Fzc2lnbkFUIDoKKyoqCisqKiBGaWxsIG91dCB0aGUgZmllbGRzIGluIHRoZSBwLT5SSU9Ib3N0cyBzdHJ1Y3R1cmUgbm93IHdlIGtub3cgd2Uga25vdworKiogd2UgaGF2ZSBhIGJvYXJkIHByZXNlbnQuCisqKgorKiogYml0cyA8IDAgaW5kaWNhdGVzIDggYml0IG9wZXJhdGlvbiByZXF1ZXN0ZWQsCisqKiBiaXRzID4gMCBpbmRpY2F0ZXMgMTYgYml0IG9wZXJhdGlvbi4KKyovCitpbnQKK1JJT0Fzc2lnbkFUKHAsIEJhc2UsIHZpcnRBZGRyLCBtb2RlKQorc3RydWN0IHJpb19pbmZvICoJcDsKK2ludAkJQmFzZTsKK2NhZGRyX3QJdmlydEFkZHI7CitpbnQJCW1vZGU7Cit7CisJaW50CQliaXRzOworCXN0cnVjdCBEcFJhbSAqY2FyZHAgPSAoc3RydWN0IERwUmFtICopdmlydEFkZHI7CisKKwlpZiAoKEJhc2UgPCBPTkVfTUVHKSB8fCAobW9kZSAmIEJZVEVfQUNDRVNTX01PREUpKQorCQliaXRzID0gQllURV9PUEVSQVRJT047CisJZWxzZQorCQliaXRzID0gV09SRF9PUEVSQVRJT047CisKKwkvKgorCSoqIEJvYXJkIGhhcyBwYXNzZWQgaXRzIHNjcnViIHRlc3QuIEZpbGwgaW4gYWxsIHRoZQorCSoqIHRyYW5zaWVudCBzdHVmZi4KKwkqLworCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkcgk9IHZpcnRBZGRyOworCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYXJkUAk9IChzdHJ1Y3QgRHBSYW0gKil2aXJ0QWRkcjsKKworCS8qCisJKiogUmV2aXNpb24gMDEgQVQgaG9zdCBjYXJkcyBkb24ndCBzdXBwb3J0IFdPUkQgb3BlcmF0aW9ucywKKwkqLworCWlmICggUkJZVEUoY2FyZHAtPkRwUmV2aXNpb24pID09IDAxICkKKwkJYml0cyA9IEJZVEVfT1BFUkFUSU9OOworCisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlR5cGUgPSBSSU9fQVQ7CisJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNvcHkgPSBiY29weTsKKwkJCQkJCQkJCQkJLyogc2V0IHRoaXMgbGF0ZXIgKi8KKwlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uU2xvdCA9IC0xOworCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Nb2RlID0gU0xPV19MSU5LUyB8IFNMT1dfQVRfQlVTIHwgYml0czsKKwlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ29udHJvbCwgCisJCQlCT09UX0ZST01fUkFNIHwgRVhURVJOQUxfQlVTX09GRiB8IAorCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLk1vZGUgfCAKKwkJCUlOVEVSUlVQVF9ESVNBQkxFICk7CisJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LDB4ZmYpOworCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Db250cm9sLAorCQkJQk9PVF9GUk9NX1JBTSB8IEVYVEVSTkFMX0JVU19PRkYgfCAKKwkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Nb2RlIHwKKwkJCUlOVEVSUlVQVF9ESVNBQkxFICk7CisJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LDB4ZmYpOworCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0gPQorCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMF0pJjB4RkYpPDwwKXwKKwkJKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzFdKSYweEZGKTw8OCl8CisJCSgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkmMHhGRik8PDE2KXwKKwkJKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzNdKSYweEZGKTw8MjQpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBVbmlxdWVudW0gMHgleFxuIixwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtKTsKKworCXAtPlJJT051bUhvc3RzKys7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFRlc3RzIFBhc3NlZCBhdCAweCV4XG4iLCBCYXNlKTsKKwlyZXR1cm4oMSk7Cit9CisjaWYgMAorI2lmZGVmIEZVVFVSRV9SRUxFQVNFCitpbnQgUklPTUNBaW5pdChpbnQgTW9kZSkKK3sKKwl1Y2hhciBTbG90TnVtYmVyOworCWNhZGRyX3QgQ2FkZHI7CisJdWludAlQYWRkcjsKKwl1aW50CUl2ZWM7CisJaW50CSBIYW5kbGU7CisJaW50CSByZXQgPSAwOworCisJLyoKKwkqKiBWYWxpZCBtb2RlIGluZm9ybWF0aW9uIGZvciBNQ0EgY2FyZHMKKwkqKiBpcyBvbmx5IEZBU1QgTElOS1MKKwkqLworCU1vZGUgPSAoTW9kZSAmIEZBU1RfTElOS1MpID8gTWNhVHBGYXN0TGlua3MgOiBNY2FUcFNsb3dMaW5rczsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU9NQ0Fpbml0KCVkKVxuIixNb2RlKTsKKworCisJLyoKKwkqKiBDaGVjayBvdXQgZWFjaCBvZiB0aGUgc2xvdHMKKwkqLworCWZvciAoU2xvdE51bWJlciA9IDA7IFNsb3ROdW1iZXIgPCBNY2FNYXhTbG90czsgU2xvdE51bWJlcisrKSB7CisJLyoKKwkqKiBFbmFibGUgdGhlIHNsb3Qgd2Ugd2FudCB0byB0YWxrIHRvCisJKi8KKwlvdXRiKCBNY2FTbG90U2VsZWN0LCBTbG90TnVtYmVyIHwgTWNhU2xvdEVuYWJsZSApOworCisJLyoKKwkqKiBSZWFkIHRoZSBJRCB3b3JkIGZyb20gdGhlIHNsb3QKKwkqLworCWlmICgoKGluYihNY2FJZEhpZ2gpPDwgOCl8aW5iKE1jYUlkTG93KSkgPT0gTWNhUklPSWQpCisJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJQb3RlbnRpYWwgTUNBIGNhcmQgaW4gc2xvdCAlZFxuIiwgU2xvdE51bWJlcik7CisKKwkJLyoKKwkJKiogQ2FyZCBhcHBlYXJzIHRvIGJlIGEgUklPIE1DQSBjYXJkIQorCQkqLworCQlSSU9NYWNoaW5lVHlwZSB8PSAoMTw8UklPX01DQSk7CisKKwkJLyoKKwkJKiogSnVzdCBjaGVjayB3ZSBoYXZlbid0IGZvdW5kIHRvbyBtYW55IHdvbmRlcmZ1bCBvYmplY3RzCisJCSovCisJCWlmICggUklPTnVtSG9zdHMgPj0gUklPX0hPU1RTICkKKwkJeworCQlScHJpbnRmKFJJT01lc2dUb29NYW55Q2FyZHMpOworCQlyZXR1cm4ocmV0KTsKKwkJfQorCisJCS8qCisJCSoqIE1jYUlycUVuYWJsZSBjb250YWlucyB0aGUgaW50ZXJydXB0IHZlY3RvciwgYW5kIGEgY2FyZAorCQkqKiBlbmFibGUgYml0LgorCQkqLworCQlJdmVjID0gaW5iKE1jYUlycUVuYWJsZSk7CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSXZlYyBpcyAleFxuIiwgSXZlYyk7CisKKwkJc3dpdGNoICggSXZlYyAmIE1jYUlycU1hc2sgKQorCQl7CisJCWNhc2UgTWNhSXJxOToKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSVJROVxuIik7CisJCWJyZWFrOworCQljYXNlIE1jYUlycTM6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTNcbiIpOworCQlicmVhazsKKwkJY2FzZSBNY2FJcnE0OgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlE0XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgTWNhSXJxNzoKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSVJRN1xuIik7CisJCWJyZWFrOworCQljYXNlIE1jYUlycTEwOgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlExMFxuIik7CisJCWJyZWFrOworCQljYXNlIE1jYUlycTExOgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlExMVxuIik7CisJCWJyZWFrOworCQljYXNlIE1jYUlycTEyOgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlExMlxuIik7CisJCWJyZWFrOworCQljYXNlIE1jYUlycTE1OgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlExNVxuIik7CisJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJKiogSWYgdGhlIGNhcmQgZW5hYmxlIGJpdCBpc24ndCBzZXQsIHRoZW4gc2V0IGl0IQorCQkqLworCQlpZiAoKEl2ZWMgJiBNY2FDYXJkRW5hYmxlKSAhPSBNY2FDYXJkRW5hYmxlKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJNY2FDYXJkRW5hYmxlIG5vdCBzZXQgLSBzZXR0aW5nIVxuIik7CisJCQlvdXRiKE1jYUlycUVuYWJsZSxJdmVjfE1jYUNhcmRFbmFibGUpOworCQl9IGVsc2UKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIk1jYUNhcmRFbmFibGUgYWxyZWFkeSBzZXRcbiIpOworCisJCS8qCisJCSoqIENvbnZlcnQgdGhlIElSUSBlbmFibGUgbWFzayBpbnRvIHNvbWV0aGluZyB1c2VmdWwKKwkJKi8KKwkJSXZlYyA9IFJJT01jYVRvSXZlY1tJdmVjICYgTWNhSXJxTWFza107CisKKwkJLyoKKwkJKiogRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcworCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJpbmIoTWNhTWVtb3J5KSBpcyAleFxuIiwgaW5iKE1jYU1lbW9yeSkpOworCQlQYWRkciA9IE1jYUFkZHJlc3MoaW5iKE1jYU1lbW9yeSkpOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIk1DQSBjYXJkIGhhcyBJdmVjICVkIEFkZHIgJXhcbiIsIEl2ZWMsIFBhZGRyKTsKKworCQlpZiAoIFBhZGRyICE9IDAgKQorCQl7CisKKwkJLyoKKwkJKiogVGVsbCB0aGUgbWVtb3J5IG1hcHBlciB0aGF0IHdlIHdhbnQgdG8gdGFsayB0byBpdAorCQkqLworCQlIYW5kbGUgPSBSSU9NYXBpbiggUGFkZHIsIFJJT19NQ0FfTUVNX1NJWkUsICZDYWRkciApOworCisJCWlmICggSGFuZGxlID09IC0xICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQ291bGRuJ3QgbWFwICVkIGJ5dGVzIGF0ICV4XG4iLCBSSU9fTUNBX01FTV9TSVpFLCBQYWRkcjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQm9hcmQgbWFwcGVkIHRvIHZhZGRyIDB4JXhcbiIsIENhZGRyKTsKKworCQkvKgorCQkqKiBBbmQgY2hlY2sgdGhhdCBpdCBpcyBhY3R1YWxseSB0aGVyZSEKKwkJKi8KKwkJaWYgKCBSSU9Cb2FyZFRlc3QoIFBhZGRyLENhZGRyLFJJT19NQ0EsU2xvdE51bWJlciApID09IFJJT19TVUNDRVNTICkKKwkJeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQm9hcmQgaGFzIHBhc3NlZCB0ZXN0XG4iKTsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlNsb3QgJWQuIFR5cGUgJWQuIFBhZGRyIDB4JXguIENhZGRyIDB4JXguIE1vZGUgMHgleC5cbiIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdE51bWJlciwgUklPX01DQSwgUGFkZHIsIENhZGRyLCBNb2RlKTsKKworCQkJLyoKKwkJCSoqIEJvYXJkIGhhcyBwYXNzZWQgaXRzIHNjcnViIHRlc3QuIEZpbGwgaW4gYWxsIHRoZQorCQkJKiogdHJhbnNpZW50IHN0dWZmLgorCQkJKi8KKwkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5TbG90CSA9IFNsb3ROdW1iZXI7CisJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uSXZlYwkgPSBJdmVjOworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlR5cGUJID0gUklPX01DQTsKKwkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5Db3B5CSA9IGJjb3B5OworCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlBhZGRyUCAgID0gUGFkZHI7CisJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uQ2FkZHIJPSBDYWRkcjsKKwkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5DYXJkUAk9IChzdHJ1Y3QgRHBSYW0gKilDYWRkcjsKKwkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5Nb2RlCSA9IE1vZGU7CisJCQlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQgLCAweGZmKTsKKwkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVOdW0gPQorCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzBdKSYweEZGKTw8MCl8CisJCQkJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMV0pJjB4RkYpPDw4KXwKKwkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkmMHhGRik8PDE2KXwKKwkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVszXSkmMHhGRik8PDI0KTsKKwkJCVJJT051bUhvc3RzKys7CisJCQlyZXQrKzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qCisJCQkqKiBJdCBmYWlsZWQgdGhlIHRlc3QsIHNvIGlnbm9yZSBpdC4KKwkJCSovCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJURVNUIEZBSUxFRFxuIik7CisJCQlSSU9NYXBvdXQoUGFkZHIsIFJJT19NQ0FfTUVNX1NJWkUsIENhZGRyICk7CisJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU2xvdCAlZCAtIFBhZGRyIHplcm8hXG4iLCBTbG90TnVtYmVyKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJTbG90ICVkIE5PVCBSSU9cbiIsIFNsb3ROdW1iZXIpOworCX0KKwl9CisJLyoKKwkqKiBOb3cgd2UgaGF2ZSBjaGVja2VkIGFsbCB0aGUgc2xvdHMsIHR1cm4gb2ZmIHRoZSBNQ0Egc2xvdCBzZWxlY3RvcgorCSovCisJb3V0YihNY2FTbG90U2VsZWN0LDApOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlNsb3QgJWQgTk9UIFJJT1xuIiwgU2xvdE51bWJlcik7CisJcmV0dXJuIHJldDsKK30KKworaW50IFJJT0VJU0Fpbml0KCBpbnQgTW9kZSApCit7CisJc3RhdGljIGludCBFSVNBRG9uZSA9IDA7CisJdWludCBQYWRkcjsKKwlpbnQgUG9sbEludE1peE1zZ0RvbmUgPSAwOworCWNhZGRyX3QgQ2FkZHI7CisJdXNob3J0IElkZW50OworCXVjaGFyIEVpc2FTbG90OworCXVjaGFyIEl2ZWM7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSoqIFRoZSBvbmx5IHZhbGlkIG1vZGUgaW5mb3JtYXRpb24gZm9yIEVJU0EgaG9zdHMgaXMgZmFzdCBvciBzbG93CisJKiogbGlua3MuCisJKi8KKwlNb2RlID0gKE1vZGUgJiBGQVNUX0xJTktTKSA/IEVJU0FfVFBfRkFTVF9MSU5LUyA6IEVJU0FfVFBfU0xPV19MSU5LUzsKKworCWlmICggRUlTQURvbmUgKQorCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPRUlTQWluaXQoKSAtIGFscmVhZHkgZG9uZSwgcmV0dXJuLlxuIik7CisJCXJldHVybigwKTsKKwl9CisKKwlFSVNBRG9uZSsrOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPRUlTQWluaXQoKVxuIik7CisKKworCS8qCisJKiogRmlyc3QgY2hlY2sgYWxsIGNhcmRzIHRvIHNlZSBpZiBBTlkgYXJlIHNldCBmb3IgcG9sbGVkIG1vZGUgb3BlcmF0aW9uLgorCSoqIElmIHNvLCBzZXQgQUxMIHRvIHBvbGxlZC4KKwkqLworCisJZm9yICggRWlzYVNsb3Q9MTsgRWlzYVNsb3Q8PVJJT19NQVhfRUlTQV9TTE9UUzsgRWlzYVNsb3QrKyApCisJeworCUlkZW50ID0gKElOQlooRWlzYVNsb3QsRUlTQV9QUk9EVUNUX0lERU5UX0hJKTw8OCkgfAorCQkgSU5CWihFaXNhU2xvdCxFSVNBX1BST0RVQ1RfSURFTlRfTE8pOworCisJaWYgKCBJZGVudCA9PSBSSU9fRUlTQV9JREVOVCApCisJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJGb3VuZCBTcGVjaWFsaXggcHJvZHVjdFxuIik7CisKKwkJaWYgKCBJTkJaKEVpc2FTbG90LEVJU0FfUFJPRFVDVF9OVU1CRVIpICE9IFJJT19FSVNBX1BST0RVQ1RfQ09ERSApCisJCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiTm90IFNwZWNpYWxpeCBSSU8gLSBQcm9kdWN0IG51bWJlciAleFxuIiwKKwkJCQkJCUlOQlooRWlzYVNsb3QsIEVJU0FfUFJPRFVDVF9OVU1CRVIpKTsKKwkJY29udGludWU7ICAvKiBuZXh0IHNsb3QgKi8KKwkJfQorCQkvKgorCQkqKiBJdHMgYSBTcGVjaWFsaXggUklPIQorCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8gUmV2aXNpb24gJWRcbiIsCisJCQkJCUlOQlooRWlzYVNsb3QsIEVJU0FfUkVWSVNJT05fTlVNQkVSKSk7CisJCQorCQlSSU9NYWNoaW5lVHlwZSB8PSAoMTw8UklPX0VJU0EpOworCisJCS8qCisJCSoqIEp1c3QgY2hlY2sgd2UgaGF2ZW4ndCBmb3VuZCB0b28gbWFueSB3b25kZXJmdWwgb2JqZWN0cworCQkqLworCQlpZiAoIFJJT051bUhvc3RzID49IFJJT19IT1NUUyApCisJCXsKKwkJUnByaW50ZihSSU9NZXNnVG9vTWFueUNhcmRzKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCQkvKgorCQkqKiBFbnN1cmUgdGhhdCB0aGUgZW5hYmxlIGJpdCBpcyBzZXQhCisJCSovCisJCU9VVEJaKCBFaXNhU2xvdCwgRUlTQV9FTkFCTEUsIFJJT19FSVNBX0VOQUJMRV9CSVQgKTsKKworCQkvKgorCQkqKiBFSVNBX0lOVEVSUlVQVF9WRUMgY29udGFpbnMgdGhlIGludGVycnVwdCB2ZWN0b3IuCisJCSovCisJCUl2ZWMgPSBJTkJaKEVpc2FTbG90LEVJU0FfSU5URVJSVVBUX1ZFQyk7CisKKyNpZmRlZiBSSU9ERUJVRworCQlzd2l0Y2ggKCBJdmVjICYgRUlTQV9JTlRFUlJVUFRfTUFTSyApCisJCXsKKwkJY2FzZSBFSVNBX0lSUV8zOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgM1xuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfSVJRXzQ6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSA0XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfNToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDVcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV82OgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgNlxuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfSVJRXzc6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSA3XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfOToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDlcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV8xMDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDEwXG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfMTE6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSAxMVxuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfSVJRXzEyOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgMTJcbiIpOworCQlicmVhazsKKwkJY2FzZSBFSVNBX0lSUV8xNDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDE0XG4iKTsKKwkJYnJlYWs7CisJCWNhc2UgRUlTQV9JUlFfMTU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSAxNVxuIik7CisJCWJyZWFrOworCQljYXNlIEVJU0FfUE9MTEVEOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBQT0xMRURcbiIpOworCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgTlVMTCxEQkdfSU5JVHxEQkdfRkFJTCwiU2hhZ2dlZCBpbnRlcnJ1cHQgbnVtYmVyIVxuIik7CisJCUl2ZWMgJj0gRUlTQV9DT05UUk9MX01BU0s7CisJCX0KKyNlbmRpZgorCisJCWlmICggKEl2ZWMgJiBFSVNBX0lOVEVSUlVQVF9NQVNLKSA9PQorCQkgRUlTQV9QT0xMRUQgKQorCQl7CisJCVJJT1dpbGxQb2xsID0gMTsKKwkJYnJlYWs7CQkvKiBGcm9tIEVpc2FTbG90IGxvb3AgKi8KKwkJfQorCX0KKwl9CisKKwkvKgorCSoqIERvIGl0IGFsbCBhZ2FpbiBub3cgd2Uga25vdyB3aGV0aGVyIHRvIGNoYW5nZSBhbGwgY2FyZHMgdG8gcG9sbGVkCisJKiogbW9kZSBvciBub3QKKwkqLworCisJZm9yICggRWlzYVNsb3Q9MTsgRWlzYVNsb3Q8PVJJT19NQVhfRUlTQV9TTE9UUzsgRWlzYVNsb3QrKyApCisJeworCUlkZW50ID0gKElOQlooRWlzYVNsb3QsRUlTQV9QUk9EVUNUX0lERU5UX0hJKTw8OCkgfAorCQkgSU5CWihFaXNhU2xvdCxFSVNBX1BST0RVQ1RfSURFTlRfTE8pOworCisJaWYgKCBJZGVudCA9PSBSSU9fRUlTQV9JREVOVCApCisJeworCQlpZiAoIElOQlooRWlzYVNsb3QsRUlTQV9QUk9EVUNUX05VTUJFUikgIT0gUklPX0VJU0FfUFJPRFVDVF9DT0RFICkKKwkJY29udGludWU7ICAvKiBuZXh0IHNsb3QgKi8KKworCQkvKgorCQkqKiBJdHMgYSBTcGVjaWFsaXggUklPIQorCQkqLworCQkKKwkJLyoKKwkJKiogRW5zdXJlIHRoYXQgdGhlIGVuYWJsZSBiaXQgaXMgc2V0IQorCQkqLworCQlPVVRCWiggRWlzYVNsb3QsIEVJU0FfRU5BQkxFLCBSSU9fRUlTQV9FTkFCTEVfQklUICk7CisKKwkJLyoKKwkJKiogRUlTQV9JTlRFUlJVUFRfVkVDIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgdmVjdG9yLgorCQkqLworCQlJdmVjID0gSU5CWihFaXNhU2xvdCxFSVNBX0lOVEVSUlVQVF9WRUMpOworCisJCWlmICggUklPV2lsbFBvbGwgKQorCQl7CisJCQkvKgorCQkJKiogSWYgd2UgYXJlIGdvaW5nIHRvIG9wZXJhdGUgaW4gcG9sbGVkIG1vZGUsIGJ1dCB0aGlzCisJCQkqKiBib2FyZCBpcyBjb25maWd1cmVkIHRvIGJlIGludGVycnVwdCBkcml2ZW4sIGRpc3BsYXkKKwkJCSoqIHRoZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIHNpdHVhdGlvbiB0byB0aGUgcHVudGVyLAorCQkJKiogYXNzdW1pbmcgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28uCisJCQkqLworCisJCQlpZiAoICFQb2xsSW50TWl4TXNnRG9uZSAmJgorCQkJIChJdmVjICYgRUlTQV9JTlRFUlJVUFRfTUFTSykgIT0gRUlTQV9QT0xMRUQgKQorCQkJeworCQkJUnByaW50ZihSSU9NZXNnQWxsUG9sbGVkKTsKKwkJCVBvbGxJbnRNaXhNc2dEb25lID0gMTsKKwkJCX0KKworCQkJLyoKKwkJCSoqIFVuZ3JhY2lvdXNseSBpZ25vcmUgd2hhdGV2ZXIgdGhlIGJvYXJkIHJlcG9ydHMgYXMgaXRzCisJCQkqKiBpbnRlcnJ1cHQgdmVjdG9yLi4uCisJCQkqLworCisJCQlJdmVjICY9IH5FSVNBX0lOVEVSUlVQVF9NQVNLOworCisJCQkvKgorCQkJKiogLi4uYW5kIGZvcmNlIGl0IHRvIGRhbmNlIHRvIHRoZSBwb2xsIHR1bmUuCisJCQkqLworCisJCQlJdmVjIHw9IEVJU0FfUE9MTEVEOworCQl9CisKKwkJLyoKKwkJKiogQ29udmVydCB0aGUgSVJRIGVuYWJsZSBtYXNrIGludG8gc29tZXRoaW5nIHVzZWZ1bCAoMC0xNSkKKwkJKi8KKwkJSXZlYyA9IFJJT0Vpc2FUb0l2ZWMoSXZlYyk7CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBob3N0IGluIHNsb3QgJWQgaGFzIEl2ZWMgMHgleFxuIiwKKwkJIEVpc2FTbG90LCBJdmVjKTsKKworCQkvKgorCQkqKiBGaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzCisJCSovCisJCVBhZGRyID0gKElOQlooRWlzYVNsb3QsRUlTQV9NRU1PUllfQkFTRV9ISSk8PDI0KSB8CisJCQkJKElOQlooRWlzYVNsb3QsRUlTQV9NRU1PUllfQkFTRV9MTyk8PDE2KTsKKworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIGNhcmQgaGFzIEl2ZWMgJWQgQWRkciAleFxuIiwgSXZlYywgUGFkZHIpOworCisJCWlmICggUGFkZHIgPT0gMCApCisJCXsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULAorCQkgIkJvYXJkIGluIHNsb3QgJWQgY29uZmlndXJlZCBmb3IgYWRkcmVzcyB6ZXJvIVxuIiwgRWlzYVNsb3QpOworCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSoqIFRlbGwgdGhlIG1lbW9yeSBtYXBwZXIgdGhhdCB3ZSB3YW50IHRvIHRhbGsgdG8gaXQKKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQWJvdXQgdG8gbWFwIEVJU0EgY2FyZCBcbiIpOworCisJCWlmIChSSU9NYXBpbiggUGFkZHIsIFJJT19FSVNBX01FTV9TSVpFLCAmQ2FkZHIpID09IC0xKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkNvdWxkbid0IG1hcCAlZCBieXRlcyBhdCAleFxuIiwKKwkJCQkJCQlSSU9fRUlTQV9NRU1fU0laRSxQYWRkcik7CisJCWNvbnRpbnVlOworCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiQm9hcmQgbWFwcGVkIHRvIHZhZGRyIDB4JXhcbiIsIENhZGRyKTsKKworCQkvKgorCQkqKiBBbmQgY2hlY2sgdGhhdCBpdCBpcyBhY3R1YWxseSB0aGVyZSEKKwkJKi8KKwkJaWYgKCBSSU9Cb2FyZFRlc3QoIFBhZGRyLENhZGRyLFJJT19FSVNBLEVpc2FTbG90KSA9PSBSSU9fU1VDQ0VTUyApCisJCQl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkJvYXJkIGhhcyBwYXNzZWQgdGVzdFxuIik7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgCisJCSJTbG90ICVkLiBJdmVjICVkLiBUeXBlICVkLiBQYWRkciAweCV4LiBDYWRkciAweCV4LiBNb2RlIDB4JXguXG4iLAorCQkJRWlzYVNsb3QsSXZlYyxSSU9fRUlTQSxQYWRkcixDYWRkcixNb2RlKTsKKworCQkvKgorCQkqKiBCb2FyZCBoYXMgcGFzc2VkIGl0cyBzY3J1YiB0ZXN0LiBGaWxsIGluIGFsbCB0aGUKKwkJKiogdHJhbnNpZW50IHN0dWZmLgorCQkqLworCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uU2xvdAkgPSBFaXNhU2xvdDsKKwkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkl2ZWMJID0gSXZlYzsKKwkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlR5cGUJID0gUklPX0VJU0E7CisJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5Db3B5CSA9IGJjb3B5OworCQkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5QYWRkclAgICA9IFBhZGRyOworCQkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5DYWRkcgk9IENhZGRyOworCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uQ2FyZFAJPSAoc3RydWN0IERwUmFtICopQ2FkZHI7CisJCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLk1vZGUJID0gTW9kZTsKKwkJLyoKKwkJKiogYmVjYXVzZSB0aGUgRUlTQSBwcm9tIGlzIG1hcHBlZCBpbnRvIElPIHNwYWNlLCB3ZQorCQkqKiBuZWVkIHRvIGNvcHkgdGhlIHVucWl1ZSBudW1iZXIgaW50byB0aGUgbWVtb3J5IGFyZWEKKwkJKiogdGhhdCBpdCB3b3VsZCBoYXZlIG9jY3VwaWVkLCBzbyB0aGF0IHRoZSBkb3dubG9hZAorCQkqKiBjb2RlIGNhbiBkZXRlcm1pbmUgaXRzIElEIGFuZCBjYXJkIHR5cGUuCisJCSovCisJIFdCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMF0sSU5CWihFaXNhU2xvdCxFSVNBX1VOSVFVRV9OVU1fMCkpOworCSBXQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzFdLElOQlooRWlzYVNsb3QsRUlTQV9VTklRVUVfTlVNXzEpKTsKKwkgV0JZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVsyXSxJTkJaKEVpc2FTbG90LEVJU0FfVU5JUVVFX05VTV8yKSk7CisJIFdCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbM10sSU5CWihFaXNhU2xvdCxFSVNBX1VOSVFVRV9OVU1fMykpOworCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlTnVtID0KKwkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVswXSkmMHhGRik8PDApfAorCQkJCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzFdKSYweEZGKTw8OCl8CisJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMl0pJjB4RkYpPDwxNil8CisJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbM10pJjB4RkYpPDwyNCk7CisJCUlOQlooRWlzYVNsb3QsRUlTQV9JTlRFUlJVUFRfUkVTRVQpOworCQkJCVJJT051bUhvc3RzKys7CisJCXJldCsrOworCQkJfQorCQllbHNlCisJCXsKKwkJLyoKKwkJKiogSXQgZmFpbGVkIHRoZSB0ZXN0LCBzbyBpZ25vcmUgaXQuCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlRFU1QgRkFJTEVEXG4iKTsKKworCQlSSU9NYXBvdXQoUGFkZHIsIFJJT19FSVNBX01FTV9TSVpFLCBDYWRkciApOworCQl9CisJfQorCX0KKwlpZiAoUklPTWFjaGluZVR5cGUgJiBSSU9fRUlTQSkKKwlyZXR1cm4gcmV0KzE7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKKyNpZm5kZWYgbGludXgKKworI2RlZmluZSBDT05GSUdfQUREUkVTUwkweGNmOAorI2RlZmluZSBDT05GSUdfREFUQQkJMHhjZmMKKyNkZWZpbmUgRk9SV0FSRF9SRUcJCTB4Y2ZhCisKKworc3RhdGljIGludAorcmVhZF9jb25maWcoaW50IGJ1c19udW1iZXIsIGludCBkZXZpY2VfbnVtLCBpbnQgcl9udW1iZXIpIAoreworCXVuc2lnbmVkIGludCBjYXY7CisJdW5zaWduZWQgaW50IHZhbDsKKworLyoKKyAgIEJ1aWxkIGNvbmZpZ19hZGRyZXNzX3ZhbHVlOgorCisgICAgICAzMSAgICAgICAgMjQgMjMgICAgICAgIDE2IDE1ICAgICAgMTEgMTAgIDggNyAgICAgICAgMCAKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgfDF8IDAwMDAwMDAgfCBidXNfbnVtYmVyIHwgZGV2aWNlICMgfCAwMDAgfCByZWdpc3RlciB8CisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKwljYXYgPSByX251bWJlciAmIDB4ZmY7CisJY2F2IHw9ICgoZGV2aWNlX251bSAmIDB4MWYpIDw8IDExKTsKKwljYXYgfD0gKChidXNfbnVtYmVyICYgMHhmZikgPDwgMTYpOworCWNhdiB8PSAweDgwMDAwMDAwOyAvKiBFbmFibGUgYml0ICovCisJb3V0cGQoQ09ORklHX0FERFJFU1MsY2F2KTsKKwl2YWwgPSBpbnBkKENPTkZJR19EQVRBKTsKKwlvdXRwZChDT05GSUdfQUREUkVTUywwKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMKK3dyaXRlX2NvbmZpZyhidXNfbnVtYmVyLGRldmljZV9udW0scl9udW1iZXIsdmFsKSAKK3sKKwl1bnNpZ25lZCBpbnQgY2F2OworCisvKgorICAgQnVpbGQgY29uZmlnX2FkZHJlc3NfdmFsdWU6CisKKyAgICAgIDMxICAgICAgICAyNCAyMyAgICAgICAgMTYgMTUgICAgICAxMSAxMCAgOCA3ICAgICAgICAwIAorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICB8MXwgMDAwMDAwMCB8IGJ1c19udW1iZXIgfCBkZXZpY2UgIyB8IDAwMCB8IHJlZ2lzdGVyIHwKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCWNhdiA9IHJfbnVtYmVyICYgMHhmZjsKKwljYXYgfD0gKChkZXZpY2VfbnVtICYgMHgxZikgPDwgMTEpOworCWNhdiB8PSAoKGJ1c19udW1iZXIgJiAweGZmKSA8PCAxNik7CisJY2F2IHw9IDB4ODAwMDAwMDA7IC8qIEVuYWJsZSBiaXQgKi8KKwlvdXRwZChDT05GSUdfQUREUkVTUywgY2F2KTsKKwlvdXRwZChDT05GSUdfREFUQSwgdmFsKTsKKwlvdXRwZChDT05GSUdfQUREUkVTUywgMCk7CisJcmV0dXJuIHZhbDsKK30KKyNlbHNlCisvKiBYWFggSW1wbGVtZW50IHRoZXNlLi4uICovCitzdGF0aWMgaW50CityZWFkX2NvbmZpZyhpbnQgYnVzX251bWJlciwgaW50IGRldmljZV9udW0sIGludCByX251bWJlcikgCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3cml0ZV9jb25maWcoaW50IGJ1c19udW1iZXIsIGludCBkZXZpY2VfbnVtLCBpbnQgcl9udW1iZXIpIAoreworICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKK2ludAorUklPUENJaW5pdChwLCBNb2RlKQorc3RydWN0IHJpb19pbmZvCSpwOworaW50IAkJTW9kZTsKK3sKKwkjZGVmaW5lIE1BWF9QQ0lfU0xPVAkJMzIKKwkjZGVmaW5lIFJJT19QQ0lfSkVUX0NBUkQJMHgyMDAwMTFDQgorCisJc3RhdGljIGludAlzbG90OwkvKiBjb3VudCBvZiBtYWNoaW5lJ3MgUENJIHNsb3RzIHNlYXJjaGVkIHNvIGZhciAqLworCWNhZGRyX3QJCUNhZGRyOwkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgUENJIGhvc3QgY2FyZC4gKi8KKwl1bnNpZ25lZCBjaGFyCUl2ZWM7CS8qIGludGVycnVwdCB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IFBDSSBob3N0ICovCisJdW5zaWduZWQgbG9uZwlQYWRkcjsJLyogUGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIGN1cnJlbnQgUENJIGhvc3QgKi8KKwlpbnQJCUhhbmRsZTsJLyogSGFuZGxlIHRvIFZpcnR1YWwgbWVtb3J5IGFsbG9jYXRlZCBmb3IgY3VycmVudCBQQ0kgaG9zdCAqLworCisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiU2VhcmNoIGZvciBhIFJJTyBQQ0kgY2FyZCAtIHN0YXJ0IGF0IHNsb3QgJWRcbiIsIHNsb3QpOworCisJLyoKKwkqKiBJbml0aWFsaXNlIHRoZSBzZWFyY2ggc3RhdHVzCisJKi8KKwlwLT5SSU9MYXN0UENJU2VhcmNoCT0gUklPX0ZBSUw7CisKKwl3aGlsZSAoIChzbG90IDwgTUFYX1BDSV9TTE9UKSAmIChwLT5SSU9MYXN0UENJU2VhcmNoICE9IFJJT19TVUNDRVNTKSApCisJeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiQ3VycmVudGx5IHRlc3Rpbmcgc2xvdCAlZFxuIiwgc2xvdCk7CisKKwkJaWYgKHJlYWRfY29uZmlnKDAsc2xvdCwwKSA9PSBSSU9fUENJX0pFVF9DQVJEKSB7CisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uSXZlYyA9IDA7CisJCQlQYWRkciA9IHJlYWRfY29uZmlnKDAsc2xvdCwweDE4KTsKKwkJCVBhZGRyID0gUGFkZHIgLSAoUGFkZHIgJiAweDEpOyAvKiBNYXNrIG9mZiB0aGUgaW8gYml0ICovCisKKwkJCWlmICggKFBhZGRyID09IDApIHx8ICgoUGFkZHIgJiAweGZmZmYwMDAwKSA9PSAweGZmZmYwMDAwKSApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiR29vZmVkIHVwIHNsb3RcbiIpOwkvKiB3aGF0ISAqLworCQkJCXNsb3QrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCA9IFBhZGRyOworCQkJSXZlYyA9IChyZWFkX2NvbmZpZygwLHNsb3QsMHgzYykgJiAweGZmKTsKKworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIlBDSSBIb3N0IGF0IDB4JXgsIEludHIgJWRcbiIsIChpbnQpUGFkZHIsIEl2ZWMpOworCisJCQlIYW5kbGUgPSBSSU9NYXBpbiggUGFkZHIsIFJJT19QQ0lfTUVNX1NJWkUsICZDYWRkciApOworCQkJaWYgKEhhbmRsZSA9PSAtMSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJDb3VsZG4ndCBtYXAgJWQgYnl0ZXMgYXQgMHgleFxuIiwgUklPX1BDSV9NRU1fU0laRSwgKGludClQYWRkcik7CisJCQkJc2xvdCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkl2ZWMgPSBJdmVjICsgMzI7CisJCQlwLT5pbnRyX3RpZCA9IGlvaW50c2V0KHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5JdmVjLAorCQkJCQkJKGludCAoKikoKSlyaW9faW50ciwgKGNoYXIgKilwLT5SSU9OdW1Ib3N0cyk7CisJCQlpZiAoUklPQm9hcmRUZXN0KCBQYWRkciwgQ2FkZHIsIFJJT19QQ0ksIDAgKSA9PSBSSU9fU1VDQ0VTUykgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgKCJCb2FyZCBoYXMgcGFzc2VkIHRlc3RcbiIpOworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgKCJQYWRkciAweCV4LiBDYWRkciAweCV4LiBNb2RlIDB4JXguXG4iLCBQYWRkciwgQ2FkZHIsIE1vZGUpOworCisJCQkJLyoKKwkJCQkqKiBCb2FyZCBoYXMgcGFzc2VkIGl0cyBzY3J1YiB0ZXN0LiBGaWxsIGluIGFsbCB0aGUKKwkJCQkqKiB0cmFuc2llbnQgc3R1ZmYuCisJCQkJKi8KKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uU2xvdAkgICA9IDA7CisJCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkl2ZWMJICAgPSBJdmVjICsgMzI7CisJCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlR5cGUJICAgPSBSSU9fUENJOworCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Db3B5CSAgID0gcmlvX3BjaWNvcHk7IAorCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAJICAgPSBQYWRkcjsKKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIJICAgPSBDYWRkcjsKKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FyZFAJICAgPSAoc3RydWN0IERwUmFtICopQ2FkZHI7CisJCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLk1vZGUJICAgPSBNb2RlOworCisjaWYgMAorCQkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Db250cm9sLCAKKwkJCQkJCUJPT1RfRlJPTV9SQU0gfCBFWFRFUk5BTF9CVVNfT0ZGIHwgCisJCQkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uTW9kZSB8IAorCQkJCQkJSU5URVJSVVBUX0RJU0FCTEUgKTsKKwkJCQlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsMHhmZik7CisJCQkJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNvbnRyb2wsCisJCQkJCQlCT09UX0ZST01fUkFNIHwgRVhURVJOQUxfQlVTX09GRiB8IAorCQkJCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLk1vZGUgfAorCQkJCQkJSU5URVJSVVBUX0RJU0FCTEUgKTsKKwkJCQlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsMHhmZik7CisjZWxzZQorCQkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5SZXNldEludCwgMHhmZik7CisjZW5kaWYKKwkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtICA9CisJCQkJCSgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVswXSkmMHhGRik8PDApfAorCQkJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMV0pJjB4RkYpPDw4KXwKKwkJCQkJKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzJdKSYweEZGKTw8MTYpfAorCQkJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbM10pJjB4RkYpPDwyNCk7CisKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJVbmlxdWUgbm8gMHgleC5cbiIsIAorCQkJCSAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtKTsKKworCQkJCXAtPlJJT0xhc3RQQ0lTZWFyY2ggPSBSSU9fU1VDQ0VTUzsKKwkJCQlwLT5SSU9OdW1Ib3N0cysrOworCQkJfQorCQl9CisJCXNsb3QrKzsKKwl9CisKKwlpZiAoIHNsb3QgPj0gTUFYX1BDSV9TTE9UICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiQWxsICVkIFBDSSBzbG90cyBoYXZlIHRlc3RlZCBmb3IgUklPIGNhcmRzICEhIVxuIiwKKwkJCSAgICAgTUFYX1BDSV9TTE9UKTsKKwl9CisKKworCS8qCisJKiogSSBkb24ndCB0aGluayB3ZSB3YW50IHRvIGRvIHRoaXMgYW55bW9yZQorCSoqCisKKwlpZiAoIXAtPlJJT0xhc3RQQ0lTZWFyY2ggPT0gUklPX0ZBSUwgKSB7CisJCXAtPlJJT0ZhaWxlZCsrOworCX0KKworCSoqCisJKi8KK30KKworI2lmZGVmIEZVVFVSRV9SRUxFQVNFCit2b2lkIHJpb2hhbHQoIHZvaWQgKQoreworCWludCBob3N0OworCWZvciAoIGhvc3Q9MDsgaG9zdDxwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkKKwl7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlN0b3AgaG9zdCAlZFxuIiwgaG9zdCk7CisJCSh2b2lkKVJJT0JvYXJkVGVzdCggcC0+UklPSG9zdHNbaG9zdF0uUGFkZHJQLCBwLT5SSU9Ib3N0c1tob3N0XS5DYWRkciwgcC0+UklPSG9zdHNbaG9zdF0uVHlwZSxwLT5SSU9Ib3N0c1tob3N0XS5TbG90ICk7CisJfQorfQorI2VuZGlmCisjZW5kaWYKKworc3RhdGljCXVjaGFyCXZhbFtdID0geworI2lmZGVmIFZFUllfTE9OR19URVNUCisJICAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAorCSAgMHhhNSwgMHhmZiwgMHg1YSwgMHgwMCwgMHhmZiwgMHhjOSwgMHgzNiwgCisjZW5kaWYKKwkgIDB4ZmYsIDB4MDAsIDB4MDAgfTsKKworI2RlZmluZQlURVNUX0VORCBzaXplb2YodmFsKQorCisvKgorKiogUkFNIHRlc3QgYSBib2FyZC4gCisqKiBOb3RoaW5nIHRvbyBjb21wbGljYXRlZCwganVzdCBlbm91Z2ggdG8gY2hlY2sgaXQgb3V0LgorKi8KK2ludAorUklPQm9hcmRUZXN0KHBhZGRyLCBjYWRkciwgdHlwZSwgc2xvdCkKK3BhZGRyX3QJcGFkZHI7CitjYWRkcl90CWNhZGRyOwordWNoYXIJdHlwZTsKK2ludAkJc2xvdDsKK3sKKwlzdHJ1Y3QgRHBSYW0gKkRwUmFtID0gKHN0cnVjdCBEcFJhbSAqKWNhZGRyOworCWNoYXIgKnJhbVs0XTsKKwlpbnQgIHNpemVbNF07CisJaW50ICBvcCwgYmFuazsKKwlpbnQgIG5iYW5rczsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBSZXNldCBob3N0IHR5cGU9JWQsIERwUmFtPTB4JXgsIHNsb3Q9JWRcbiIsCisJCQl0eXBlLChpbnQpRHBSYW0sIHNsb3QpOworCisJUklPSG9zdFJlc2V0KHR5cGUsIERwUmFtLCBzbG90KTsKKworCS8qCisJKiogU2NydWIgdGhlIG1lbW9yeS4gVGhpcyBjb21lcyBpbiBzZXZlcmFsIGJhbmtzOgorCSoqIERQc3JhbTEJLSA3MDAwaCBieXRlcworCSoqIERQc3JhbTIJLSAyMDBoICBieXRlcworCSoqIERQc3JhbTMJLSA3MDAwaCBieXRlcworCSoqIHNjcmF0Y2gJLSAxMDAwaCBieXRlcworCSovCisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogU2V0dXAgcmFtL3NpemUgYXJyYXlzXG4iKTsKKworCXNpemVbMF0gPSBEUF9TUkFNMV9TSVpFOworCXNpemVbMV0gPSBEUF9TUkFNMl9TSVpFOworCXNpemVbMl0gPSBEUF9TUkFNM19TSVpFOworCXNpemVbM10gPSBEUF9TQ1JBVENIX1NJWkU7CisKKwlyYW1bMF0gPSAoY2hhciAqKSZEcFJhbS0+RHBTcmFtMVswXTsKKwlyYW1bMV0gPSAoY2hhciAqKSZEcFJhbS0+RHBTcmFtMlswXTsKKwlyYW1bMl0gPSAoY2hhciAqKSZEcFJhbS0+RHBTcmFtM1swXTsKKwluYmFua3MgPSAodHlwZSA9PSBSSU9fUENJKSA/IDMgOiA0OworCWlmIChuYmFua3MgPT0gNCkKKwkJcmFtWzNdID0gKGNoYXIgKikmRHBSYW0tPkRwU2NyYXRjaFswXTsKKworCisJaWYgKG5iYW5rcyA9PSAzKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBNZW1vcnk6IDB4JXgoMHgleCksIDB4JXgoMHgleCksIDB4JXgoMHgleClcbiIsCisJCQkJKGludClyYW1bMF0sIHNpemVbMF0sIChpbnQpcmFtWzFdLCBzaXplWzFdLCAoaW50KXJhbVsyXSwgc2l6ZVsyXSk7CisJfSBlbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IDB4JXgoMHgleCksIDB4JXgoMHgleCksIDB4JXgoMHgleCksIDB4JXgoMHgleClcbiIsCisJCQkoaW50KXJhbVswXSwgc2l6ZVswXSwgKGludClyYW1bMV0sIHNpemVbMV0sIChpbnQpcmFtWzJdLCBzaXplWzJdLCAoaW50KXJhbVszXSwgCisJCQkJCXNpemVbM10pOworCX0KKworCS8qCisJKiogVGhpcyBzY3J1YiBvcGVyYXRpb24gd2lsbCB0ZXN0IGZvciBjcm9zc3RhbGsgYmV0d2VlbgorCSoqIGJhbmtzLiBURVNUX0VORCBpcyBhIG1hZ2ljIG51bWJlciwgYW5kIHJlbGF0ZXMgdG8gdGhlIG9mZnNldAorCSoqIHdpdGhpbiB0aGUgJ3ZhbCcgYXJyYXkgdXNlZCBieSBTY3J1Yi4KKwkqLworCWZvciAob3A9MDsgb3A8VEVTVF9FTkQ7IG9wKyspIHsKKwkJZm9yIChiYW5rPTA7IGJhbms8bmJhbmtzOyBiYW5rKyspIHsKKwkJCWlmIChSSU9TY3J1YihvcCwgKEJZVEUgKilyYW1bYmFua10sIHNpemVbYmFua10pID09IFJJT19GQUlMKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFJJT1NjcnViIGJhbmQgJWQsIG9wICVkIGZhaWxlZFxuIiwgCisJCQkJCQkJYmFuaywgb3ApOworCQkJCXJldHVybiBSSU9fRkFJTDsKKwkJCX0KKwkJfQorCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlRlc3QgY29tcGxldGVkXG4iKTsKKwlyZXR1cm4gUklPX1NVQ0NFU1M7Cit9CisKKworLyoKKyoqIFNjcnViIGFuIGFyZWEgb2YgUkFNLgorKiogRGVmaW5lIFBSRVRFU1QgYW5kIFBPU1RURVNUIGZvciBhIG1vcmUgdGhvcm91Z2ggY2hlY2tpbmcgb2YgdGhlCisqKiBzdGF0ZSBvZiB0aGUgbWVtb3J5LgorKiogQ2FsbCB3aXRoIG9wIHNldCB0byBhbiBpbmRleCBpbnRvIHRoZSBhYm92ZSAndmFsJyBhcnJheSB0byBkZXRlcm1pbmUKKyoqIHdoaWNoIHZhbHVlIHdpbGwgYmUgd3JpdHRlbiBpbnRvIG1lbW9yeS4KKyoqIENhbGwgd2l0aCBvcCBzZXQgdG8gemVybyBtZWFucyB0aGF0IHRoZSBSQU0gd2lsbCBub3QgYmUgcmVhZCBhbmQgY2hlY2tlZAorKiogYmVmb3JlIGl0IGlzIHdyaXR0ZW4uCisqKiBDYWxsIHdpdGggb3Agbm90IHplcm8sIGFuZCB0aGUgUkFNIHdpbGwgYmUgcmVhZCBhbmQgY29tcGF0ZWQgd2l0aCB2YWxbb3AtMV0KKyoqIHRvIGNoZWNrIHRoYXQgdGhlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgcGhhc2Ugd2FzIHJldGFpbmVkLgorKi8KK3N0YXRpYyBpbnQKK1JJT1NjcnViKG9wLCByYW0sIHNpemUpCitpbnQJCW9wOworQllURSAqCXJhbTsKK2ludAkJc2l6ZTsgCit7CisJaW50CQkJCW9mZjsKKwl1bnNpZ25lZCBjaGFyCW9sZGJ5dGU7CisJdW5zaWduZWQgY2hhcgluZXdieXRlOworCXVuc2lnbmVkIGNoYXIJaW52Ynl0ZTsKKwl1bnNpZ25lZCBzaG9ydAlvbGR3b3JkOworCXVuc2lnbmVkIHNob3J0CW5ld3dvcmQ7CisJdW5zaWduZWQgc2hvcnQJaW52d29yZDsKKwl1bnNpZ25lZCBzaG9ydAlzd2Fwd29yZDsKKworCWlmIChvcCkgeworCQlvbGRieXRlID0gdmFsW29wLTFdOworCQlvbGR3b3JkID0gb2xkYnl0ZSB8IChvbGRieXRlPDw4KTsKKwl9IGVsc2UKKwkgIG9sZGJ5dGUgPSBvbGR3b3JkID0gMDsgLyogVGVsbCB0aGUgY29tcGlsZXIgd2UndmUgaW5pdGlsYWxpemVkIHRoZW0uICovCisJbmV3Ynl0ZSA9IHZhbFtvcF07CisJbmV3d29yZCA9IG5ld2J5dGUgfCAobmV3Ynl0ZTw8OCk7CisJaW52Ynl0ZSA9IH5uZXdieXRlOworCWludndvcmQgPSBpbnZieXRlIHwgKGludmJ5dGU8PDgpOworCisJLyoKKwkqKiBDaGVjayB0aGF0IHRoZSBSQU0gY29udGFpbnMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBsZWZ0IHRoZXJlCisJKiogYnkgdGhlIHByZXZpb3VzIHRlc3QgKG5vdCBhcHBsaWNhYmxlIGZvciBwYXNzIHplcm8pCisJKi8KKwlpZiAob3ApIHsKKwkJZm9yIChvZmY9MDsgb2ZmPHNpemU7IG9mZisrKSB7CisJCQlpZiAoUkJZVEUocmFtW29mZl0pICE9IG9sZGJ5dGUpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogQnl0ZSBQcmUgQ2hlY2sgMTogQllURSBhdCBvZmZzZXQgMHgleCBzaG91bGQgaGF2ZSBiZWVuPSV4LCB3YXM9JXhcbiIsIG9mZiwgb2xkYnl0ZSwgUkJZVEUocmFtW29mZl0pKTsKKwkJCQlyZXR1cm4gUklPX0ZBSUw7CisJCQl9CisJCX0KKwkJZm9yIChvZmY9MDsgb2ZmPHNpemU7IG9mZis9MikgeworCQkJaWYgKCoodXNob3J0ICopJnJhbVtvZmZdICE9IG9sZHdvcmQpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogV29yZCBQcmUgQ2hlY2s6IFdPUkQgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLG9mZixvbGR3b3JkLCoodXNob3J0ICopJnJhbVtvZmZdKTsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogV29yZCBQcmUgQ2hlY2s6IEJZVEUgYXQgb2Zmc2V0IDB4JXggaXMgJXggQllURSBhdCBvZmZzZXQgMHgleCBpcyAleFxuIiwgb2ZmLCBSQllURShyYW1bb2ZmXSksIG9mZisxLCBSQllURShyYW1bb2ZmKzFdKSk7CisJCQkJcmV0dXJuIFJJT19GQUlMOworCQkJfQorCQl9CisJfQorCisJLyoKKwkqKiBOb3cgd3JpdGUgdGhlIElOVkVSU0Ugb2YgdGhlIHRlc3QgZGF0YSBpbnRvIGV2ZXJ5IGxvY2F0aW9uLCB1c2luZworCSoqIEJZVEUgd3JpdGUgb3BlcmF0aW9ucywgZmlyc3QgY2hlY2tpbmcgYmVmb3JlIGVhY2ggYnl0ZSBpcyB3cml0dGVuCisJKiogdGhhdCB0aGUgbG9jYXRpb24gY29udGFpbnMgdGhlIG9sZCB2YWx1ZSBzdGlsbCwgYW5kIGNoZWNraW5nIGFmdGVyCisJKiogdGhlIHdyaXRlIHRoYXQgdGhlIGxvY2F0aW9uIGNvbnRhaW5zIHRoZSBkYXRhIHNwZWNpZmllZCAtIHRoaXMgaXMKKwkqKiB0aGUgQllURSByZWFkL3dyaXRlIHRlc3QuCisJKi8KKwlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKyspIHsKKwkJaWYgKG9wICYmIChSQllURShyYW1bb2ZmXSkgIT0gb2xkYnl0ZSkpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBCeXRlIFByZSBDaGVjayAyOiBCWVRFIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBvbGRieXRlLCBSQllURShyYW1bb2ZmXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJCVdCWVRFKHJhbVtvZmZdLGludmJ5dGUpOworCQlpZiAoUkJZVEUocmFtW29mZl0pICE9IGludmJ5dGUpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBCeXRlIEludiBDaGVjazogQllURSBhdCBvZmZzZXQgMHgleCBzaG91bGQgaGF2ZSBiZWVuPSV4LCB3YXM9JXhcbiIsIG9mZiwgaW52Ynl0ZSwgUkJZVEUocmFtW29mZl0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCX0KKworCS8qCisJKiogbm93LCB1c2UgV09SRCBvcGVyYXRpb25zIHRvIHdyaXRlIHRoZSB0ZXN0IHZhbHVlIGludG8gZXZlcnkgbG9jYXRpb24sCisJKiogY2hlY2sgYXMgYmVmb3JlIHRoYXQgdGhlIGxvY2F0aW9uIGNvbnRhaW5zIHRoZSBwcmV2aW91cyB0ZXN0IHZhbHVlCisJKiogYmVmb3JlIG92ZXJ3cml0aW5nLCBhbmQgdGhhdCBpdCBjb250YWlucyB0aGUgZGF0YSB2YWx1ZSB3cml0dGVuCisJKiogYWZ0ZXJ3YXJkcy4KKwkqKiBUaGlzIGlzIHRoZSBXT1JEIG9wZXJhdGlvbiB0ZXN0LgorCSovCisJZm9yIChvZmY9MDsgb2ZmPHNpemU7IG9mZis9MikgeworCQlpZiAoKih1c2hvcnQgKikmcmFtW29mZl0gIT0gaW52d29yZCkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFdvcmQgSW52IENoZWNrOiBXT1JEIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBpbnZ3b3JkLCAqKHVzaG9ydCAqKSZyYW1bb2ZmXSk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBXb3JkIEludiBDaGVjazogQllURSBhdCBvZmZzZXQgMHgleCBpcyAleCBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4XG4iLCBvZmYsIFJCWVRFKHJhbVtvZmZdKSwgb2ZmKzEsIFJCWVRFKHJhbVtvZmYrMV0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCisJCSoodXNob3J0ICopJnJhbVtvZmZdID0gbmV3d29yZDsKKwkJaWYgKCAqKHVzaG9ydCAqKSZyYW1bb2ZmXSAhPSBuZXd3b3JkICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFBvc3QgV29yZCBDaGVjayAxOiBXT1JEIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBuZXd3b3JkLCAqKHVzaG9ydCAqKSZyYW1bb2ZmXSk7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogUG9zdCBXb3JkIENoZWNrIDE6IEJZVEUgYXQgb2Zmc2V0IDB4JXggaXMgJXggQllURSBhdCBvZmZzZXQgMHgleCBpcyAleFxuIiwgb2ZmLCBSQllURShyYW1bb2ZmXSksIG9mZisxLCBSQllURShyYW1bb2ZmKzFdKSk7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwl9CisKKwkvKgorCSoqIG5vdyBydW4gdGhyb3VnaCB0aGUgYmxvY2sgb2YgbWVtb3J5IGFnYWluLCBmaXJzdCBpbiBieXRlIG1vZGUKKwkqKiB0aGVuIGluIHdvcmQgbW9kZSwgYW5kIGNoZWNrIHRoYXQgYWxsIHRoZSBsb2NhdGlvbnMgY29udGFpbiB0aGUKKwkqKiByZXF1aXJlZCB0ZXN0IGRhdGEuCisJKi8KKwlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKyspIHsKKwkJaWYgKFJCWVRFKHJhbVtvZmZdKSAhPSBuZXdieXRlKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogUG9zdCBCeXRlIENoZWNrOiBCWVRFIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmLCBuZXdieXRlLCBSQllURShyYW1bb2ZmXSkpOworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJfQorCisJZm9yIChvZmY9MDsgb2ZmPHNpemU7IG9mZis9MikgeworCQlpZiAoICoodXNob3J0ICopJnJhbVtvZmZdICE9IG5ld3dvcmQgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogUG9zdCBXb3JkIENoZWNrIDI6IFdPUkQgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIG5ld3dvcmQsICoodXNob3J0ICopJnJhbVtvZmZdKTsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBQb3N0IFdvcmQgQ2hlY2sgMjogQllURSBhdCBvZmZzZXQgMHgleCBpcyAleCBCWVRFIGF0IG9mZnNldCAweCV4IGlzICV4XG4iLCBvZmYsIFJCWVRFKHJhbVtvZmZdKSwgb2ZmKzEsIFJCWVRFKHJhbVtvZmYrMV0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCX0KKworCS8qCisJKiogdGltZSB0byBjaGVjayBvdXQgYnl0ZSBzd2FwcGluZyBlcnJvcnMKKwkqLworCXN3YXB3b3JkID0gaW52Ynl0ZSB8IChuZXdieXRlIDw8IDgpOworCisJZm9yIChvZmY9MDsgb2ZmPHNpemU7IG9mZis9MikgeworCQlXQllURShyYW1bb2ZmXSxpbnZieXRlKTsKKwkJV0JZVEUocmFtW29mZisxXSxuZXdieXRlKTsKKwl9CisKKwlmb3IgKCBvZmY9MDsgb2ZmPHNpemU7IG9mZis9MiApIHsKKwkJaWYgKCoodXNob3J0ICopJnJhbVtvZmZdICE9IHN3YXB3b3JkKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU8taW5pdDogU3dhcFdvcmQgQ2hlY2sgMTogV09SRCBhdCBvZmZzZXQgMHgleCBzaG91bGQgaGF2ZSBiZWVuPSV4LCB3YXM9JXhcbiIsIG9mZiwgc3dhcHdvcmQsICooKHVzaG9ydCAqKSZyYW1bb2ZmXSkpOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFN3YXBXb3JkIENoZWNrIDE6IEJZVEUgYXQgb2Zmc2V0IDB4JXggaXMgJXggQllURSBhdCBvZmZzZXQgMHgleCBpcyAleFxuIiwgb2ZmLCBSQllURShyYW1bb2ZmXSksIG9mZisxLCBSQllURShyYW1bb2ZmKzFdKSk7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJKigodXNob3J0ICopJnJhbVtvZmZdKSA9IH5zd2Fwd29yZDsKKwl9CisKKwlmb3IgKG9mZj0wOyBvZmY8c2l6ZTsgb2ZmKz0yKSB7CisJCWlmIChSQllURShyYW1bb2ZmXSkgIT0gbmV3Ynl0ZSkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IFN3YXBXb3JkIENoZWNrIDI6IEJZVEUgYXQgb2Zmc2V0IDB4JXggc2hvdWxkIGhhdmUgYmVlbj0leCwgd2FzPSV4XG4iLCBvZmYsIG5ld2J5dGUsIFJCWVRFKHJhbVtvZmZdKSk7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJaWYgKFJCWVRFKHJhbVtvZmYrMV0pICE9IGludmJ5dGUpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBTd2FwV29yZCBDaGVjayAyOiBCWVRFIGF0IG9mZnNldCAweCV4IHNob3VsZCBoYXZlIGJlZW49JXgsIHdhcz0leFxuIiwgb2ZmKzEsIGludmJ5dGUsIFJCWVRFKHJhbVtvZmYrMV0pKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQkqKCh1c2hvcnQgKikmcmFtW29mZl0pID0gbmV3d29yZDsKKwl9CisJcmV0dXJuIFJJT19TVUNDRVNTOworfQorCisvKgorKiogdHJ5IHRvIGVuc3VyZSB0aGF0IGV2ZXJ5IGhvc3QgaXMgZWl0aGVyIGluIHBvbGxlZCBtb2RlCisqKiBvciBpcyBpbiBpbnRlcnJ1cHQgbW9kZS4gT25seSBhbGxvdyBpbnRlcnJ1cHQgbW9kZSBpZgorKiogYWxsIGhvc3RzIGNhbiBpbnRlcnJ1cHQgKHdoeT8pCisqKiBhbmQgZm9yY2UgaW50byBwb2xsZWQgbW9kZSBpZiB0b2xkIHRvLiBQYXRjaCB1cCB0aGUKKyoqIGludGVycnVwdCB2ZWN0b3IgJiBzYWx1dGUgVGhlIFF1ZWVuIHdoZW4geW91J3ZlIGRvbmUuCisqLworI2lmIDAKK3N0YXRpYyB2b2lkCitSSU9BbGxvY2F0ZUludGVycnVwdHMocCkKK3N0cnVjdCByaW9faW5mbyAqCXA7Cit7CisJaW50IEhvc3Q7CisKKwkvKgorCSoqIEVhc3kgY2FzZSAtIGlmIHdlIGhhdmUgYmVlbiB0b2xkIHRvIHBvbGwsIHRoZW4gd2UgcG9sbC4KKwkqLworCWlmIChwLT5tb2RlICYgUE9MTEVEX01PREUpIHsKKwkJUklPU3RvcEludGVycnVwdHMocCwgMCwgMCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSoqIGNoZWNrIC0gaWYgYW55IGhvc3QgaGFzIGJlZW4gc2V0IHRvIHBvbGxlZCBtb2RlLCB0aGVuIGFsbCBtdXN0IGJlLgorCSovCisJZm9yIChIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKykgeworCQlpZiAoIChwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlICE9IFJJT19BVCkgJiYKKwkJCQkocC0+UklPSG9zdHNbSG9zdF0uSXZlYyA9PSBQT0xMRUQpICkgeworCQkJUklPU3RvcEludGVycnVwdHMocCwgMSwgSG9zdCApOworCQkJcmV0dXJuOworCQl9CisJfQorCWZvciAoSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KyspIHsKKwkJaWYgKHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgPT0gUklPX0FUKSB7CisJCQlpZiAoIChwLT5SSU9Ib3N0c1tIb3N0XS5JdmVjIC0gMzIpID09IDApIHsKKwkJCQlSSU9TdG9wSW50ZXJydXB0cyhwLCAyLCBIb3N0ICk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorfQorCisvKgorKiogc29tZXRoaW5nIGhhcyBkZWNpZGVkIHRoYXQgd2UgY2FuJ3QgYmUgZG9pbmcgd2l0aCB0aGVzZQorKiogbmV3LWZhbmdsZWQgaW50ZXJydXB0IHRoaW5naWVzLiBTZXQgZXZlcnl0aGluZyB1cCB0byBqdXN0CisqKiBwb2xsLgorKi8KK3N0YXRpYyB2b2lkCitSSU9TdG9wSW50ZXJydXB0cyhwLCBSZWFzb24sIEhvc3QpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworaW50CVJlYXNvbjsKK2ludAlIb3N0OyAKK3sKKyNpZmRlZiBGVVRVUkVfUkVMRUFTRQorCXN3aXRjaCAoUmVhc29uKSB7CisJCWNhc2UgMDoJLyogZm9yY2VkIGludG8gcG9sbGluZyBieSByaW9fcG9sbGVkICovCisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBTQ1UgaGFzIHNldCAnSG9zdCcgaW50byBwb2xsZWQgbW9kZSAqLworCQkJYnJlYWs7CisJCWNhc2UgMjoJLyogdGhlcmUgYXJlbid0IGVub3VnaCBpbnRlcnJ1cHQgdmVjdG9ycyBmb3IgJ0hvc3QnICovCisJCQlicmVhazsKKwl9CisjZW5kaWYKKworCWZvciAoSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKSB7CisJCXN0cnVjdCBIb3N0ICpIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKKworCQlzd2l0Y2ggKEhvc3RQLT5UeXBlKSB7CisJCQljYXNlIFJJT19BVDoKKwkJCQkvKgorCQkJCSoqIFRoZSBBVCBob3N0IGhhcyBpdCdzIGludGVycnVwdHMgZGlzYWJsZWQgYnkgY2xlYXJpbmcgdGhlCisJCQkJKiogaW50X2VuYWJsZSBiaXQuCisJCQkJKi8KKwkJCQlIb3N0UC0+TW9kZSAmPSB+SU5URVJSVVBUX0VOQUJMRTsKKwkJCQlIb3N0UC0+SXZlYyA9IFBPTExFRDsKKwkJCQlicmVhazsKKyNpZmRlZiBGVVRVUkVfUkVMRUFTRQorCQkJY2FzZSBSSU9fRUlTQToKKwkJCQkvKgorCQkJCSoqIFRoZSBFSVNBIGhvc3QgaGFzIGl0J3MgaW50ZXJydXB0cyBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZQorCQkJCSoqIEl2ZWMgdG8gemVybworCQkJCSovCisJCQkJSG9zdFAtPkl2ZWMgPSBQT0xMRUQ7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWNhc2UgUklPX1BDSToKKwkJCQkvKgorCQkJCSoqIFRoZSBQQ0kgaG9zdCBoYXMgaXQncyBpbnRlcnJ1cHRzIGRpc2FibGVkIGJ5IGNsZWFyaW5nIHRoZQorCQkJCSoqIGludF9lbmFibGUgYml0LCBsaWtlIGEgcmVndWxhciBob3N0IGNhcmQuCisJCQkJKi8KKwkJCQlIb3N0UC0+TW9kZSAmPSB+UklPX1BDSV9JTlRfRU5BQkxFOworCQkJCUhvc3RQLT5JdmVjID0gUE9MTEVEOworCQkJCWJyZWFrOworI2lmZGVmIEZVVFVSRV9SRUxFQVNFCisJCQljYXNlIFJJT19NQ0E6CisJCQkJLyoKKwkJCQkqKiBUaGVyZSdzIGFsd2F5cyBvbmUsIGlzbid0IHRoZXJlPworCQkJCSoqIFRoZSBNQ0EgaG9zdCBjYXJkIGNhbm5vdCBoYXZlIGl0J3MgaW50ZXJydXB0cyBkaXNhYmxlZC4KKwkJCQkqLworCQkJCVJJT1BhdGNoVmVjKEhvc3RQKTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQl9CisJfQorfQorCisvKgorKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgaW5pdCB0aW1lIHRvIHNldHVwIHRoZSBkYXRhIHN0cnVjdHVyZXMuCisqLwordm9pZAorUklPQWxsb2NEYXRhU3RydWN0cyhwKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3sKKwlpbnQJcG9ydCwKKwkJaG9zdCwKKwkJdG07CisKKwlwLT5SSU9Qb3J0cCA9IChzdHJ1Y3QgUG9ydCAqKXN5c2JyayhSSU9fUE9SVFMgKiBzaXplb2Yoc3RydWN0IFBvcnQpKTsKKwlpZiAoIXAtPlJJT1BvcnRwKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBObyBtZW1vcnkgZm9yIHBvcnQgc3RydWN0dXJlc1xuIik7CisJCXAtPlJJT0ZhaWxlZCsrOworCQlyZXR1cm47CisJfSAKKwliemVybyggcC0+UklPUG9ydHAsIHNpemVvZihzdHJ1Y3QgUG9ydCkgKiBSSU9fUE9SVFMgKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiUklPLWluaXQ6IGFsbG9jYXRlZCBhbmQgY2xlYXJlZCBtZW1vcnkgZm9yIHBvcnQgc3RydWN0c1xuIik7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkZpcnN0IFJJTyBwb3J0IHN0cnVjdCBAMHgleCwgc2l6ZT0weCV4IGJ5dGVzXG4iLAorCSAgICAoaW50KXAtPlJJT1BvcnRwLCBzaXplb2Yoc3RydWN0IFBvcnQpKTsKKworCWZvciggcG9ydD0wOyBwb3J0PFJJT19QT1JUUzsgcG9ydCsrICkgeworCQlwLT5SSU9Qb3J0cFtwb3J0XS5Qb3J0TnVtID0gcG9ydDsKKwkJcC0+UklPUG9ydHBbcG9ydF0uVHR5UCA9ICZwLT5jaGFubmVsW3BvcnRdOworCQlzcmVzZXQgKHAtPlJJT1BvcnRwW3BvcnRdLkluVXNlKTsJLyogTGV0IHRoZSBmaXJzdCBndXkgdXNlcyBpdCAqLworCQlwLT5SSU9Qb3J0cFtwb3J0XS5wb3J0U2VtID0gLTE7CS8qIExldCB0aGUgZmlyc3QgZ3V5IHRha2VzIGl0ICovCisJCXAtPlJJT1BvcnRwW3BvcnRdLlBhcmFtU2VtID0gLTE7CS8qIExldCB0aGUgZmlyc3QgZ3V5IHRha2VzIGl0ICovCisJCXAtPlJJT1BvcnRwW3BvcnRdLnRpbWVvdXRfaWQgPSAwOwkvKiBMZXQgdGhlIGZpcnN0IGd1eSB0YWtlcyBpdCAqLworCX0KKworCXAtPlJJT0hvc3RzID0gKHN0cnVjdCBIb3N0ICopc3lzYnJrKFJJT19IT1NUUyAqIHNpemVvZihzdHJ1Y3QgSG9zdCkpOworCWlmICghcC0+UklPSG9zdHMpIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IE5vIG1lbW9yeSBmb3IgaG9zdCBzdHJ1Y3R1cmVzXG4iKTsKKwkJcC0+UklPRmFpbGVkKys7CisJCXJldHVybjsKKwl9CisJYnplcm8ocC0+UklPSG9zdHMsIHNpemVvZihzdHJ1Y3QgSG9zdCkqUklPX0hPU1RTKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiUklPLWluaXQ6IGFsbG9jYXRlZCBhbmQgY2xlYXJlZCBtZW1vcnkgZm9yIGhvc3Qgc3RydWN0c1xuIik7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkZpcnN0IFJJTyBob3N0IHN0cnVjdCBAMHgleCwgc2l6ZT0weCV4IGJ5dGVzXG4iLAorCSAgICAoaW50KXAtPlJJT0hvc3RzLCBzaXplb2Yoc3RydWN0IEhvc3QpKTsKKworCWZvciggaG9zdD0wOyBob3N0PFJJT19IT1NUUzsgaG9zdCsrICkgeworCQlzcGluX2xvY2tfaW5pdCAoJnAtPlJJT0hvc3RzW2hvc3RdLkhvc3RMb2NrKTsKKwkJcC0+UklPSG9zdHNbaG9zdF0udGltZW91dF9pZCA9IDA7IC8qIExldCB0aGUgZmlyc3QgZ3V5IHRha2VzIGl0ICovCisJfQorCS8qCisJKiogY2hlY2sgdGhhdCB0aGUgYnVmZmVyIHNpemUgaXMgdmFsaWQsIHJvdW5kIGRvd24gdG8gdGhlIG5leHQgcG93ZXIgb2YKKwkqKiB0d28gaWYgbmVjZXNzYXJ5OyBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIHRoZW4sIGhleSwgbm8gZG91YmxlIGJ1ZmZlcnMuCisJKi8KKwlmb3IgKCB0bSA9IDE7IHRtICYmIHRtIDw9IHAtPlJJT0NvbmYuQnVmZmVyU2l6ZTsgdG0gPDw9IDEgKQorCQk7CisJdG0gPj49IDE7CisJcC0+UklPQnVmZmVyU2l6ZSA9IHRtOworCXAtPlJJT0J1ZmZlck1hc2sgPSB0bSA/IHRtIC0gMSA6IDA7Cit9CisKKy8qCisqKiB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHdoZW5ldmVyIHRoZSBkYXRhIHN0cnVjdHVyZXMgbmVlZCB0byBiZQorKiogcmUtc2V0dXAsIGZvciBleGFtcGxlLCBhZnRlciBhIHJpb2hhbHQgKHdoeSBkaWQgSSBldmVyIGludmVudCBpdD8pCisqLwordm9pZAorUklPU2V0dXBEYXRhU3RydWN0cyhwKQorc3RydWN0IHJpb19pbmZvCSogcDsKK3sKKwlpbnQgaG9zdCwgZW50cnksIHJ1cDsKKworCWZvciAoIGhvc3Q9MDsgaG9zdDxSSU9fSE9TVFM7IGhvc3QrKyApIHsKKwkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW2hvc3RdOworCQlmb3IgKCBlbnRyeT0wOyBlbnRyeTxMSU5LU19QRVJfVU5JVDsgZW50cnkrKyApIHsKKwkJCUhvc3RQLT5Ub3BvbG9neVtlbnRyeV0uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCQlIb3N0UC0+VG9wb2xvZ3lbZW50cnldLkxpbmsgPSBOT19MSU5LOworCQl9CisJCWJjb3B5KCJIT1NUIFgiLCBIb3N0UC0+TmFtZSwgNyk7CisJCUhvc3RQLT5OYW1lWzVdID0gJzEnK2hvc3Q7CisJCWZvciAocnVwPTA7IHJ1cDwoTUFYX1JVUCArIExJTktTX1BFUl9VTklUKTsgcnVwKyspIHsKKwkJCWlmIChydXAgPCBNQVhfUlVQKSB7CisJCQkJZm9yIChlbnRyeT0wOyBlbnRyeTxMSU5LU19QRVJfVU5JVDsgZW50cnkrKyApIHsKKwkJCQkJSG9zdFAtPk1hcHBpbmdbcnVwXS5Ub3BvbG9neVtlbnRyeV0uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCQkJCUhvc3RQLT5NYXBwaW5nW3J1cF0uVG9wb2xvZ3lbZW50cnldLkxpbmsgPSBOT19MSU5LOworCQkJCX0KKwkJCQlSSU9EZWZhdWx0TmFtZShwLCBIb3N0UCwgcnVwKTsKKwkJCX0KKwkJCXNwaW5fbG9ja19pbml0KCZIb3N0UC0+VW5peFJ1cHNbcnVwXS5SdXBMb2NrKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCitpbnQKK1JJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBVbml0SWQpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IEhvc3QgKglIb3N0UDsKK3VpbnQJCQlVbml0SWQ7Cit7CisjaWZkZWYgQ0hFQ0sKKwlDaGVja0hvc3QoIEhvc3QgKTsKKwlDaGVja1VuaXRJZCggVW5pdElkICk7CisjZW5kaWYKKwliY29weSgiVU5LTk9XTiBSVEEgWC1YWCIsSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lLDE3KTsKKwlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLk5hbWVbMTJdPScxJysoSG9zdFAtcC0+UklPSG9zdHMpOworCWlmICgoVW5pdElkKzEpID4gOSkgeworCQlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLk5hbWVbMTRdPScwJysoKFVuaXRJZCsxKS8xMCk7CisJCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uTmFtZVsxNV09JzAnKygoVW5pdElkKzEpJTEwKTsKKwl9CisJZWxzZSB7CisJCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uTmFtZVsxNF09JzEnK1VuaXRJZDsKKwkJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lWzE1XT0wOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBSSU9fUkVMRUFTRQkiTGludXgiCisjZGVmaW5lIFJFTEVBU0VfSUQJIjEuMCIKKworI2lmIDAKK3N0YXRpYyBpbnQKK1JJT1JlcG9ydChwKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3sKKwljaGFyICoJUklPUmVsZWFzZSA9IFJJT19SRUxFQVNFOworCWNoYXIgKglSSU9SZWxJRCA9IFJFTEVBU0VfSUQ7CisJaW50CQlob3N0OworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPIDogUmVsZWFzZTogJXMgSUQ6ICVzXG4iLCBSSU9SZWxlYXNlLCBSSU9SZWxJRCk7CisKKwlpZiAoIHAtPlJJT051bUhvc3RzPT0wICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJcbk5vIEhvc3RzIGNvbmZpZ3VyZWRcbiIpOworCQlyZXR1cm4oMCk7CisJfQorCisJZm9yICggaG9zdD0wOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKyApIHsKKwkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW2hvc3RdOworCQlzd2l0Y2ggKCBIb3N0UC0+VHlwZSApIHsKKwkJCWNhc2UgUklPX0FUOgorCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkFUIEJVUyA6IGZvdW5kIHRoZSBjYXJkIGF0IDB4JXhcbiIsIEhvc3RQLT5QYWRkclApOworCQl9CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcmlvVmVyc2lvbglzdFZlcnNpb247CisKK3N0cnVjdCByaW9WZXJzaW9uICoKK1JJT1ZlcnNpZCh2b2lkKQoreworICAgIHN0cmxjcHkoc3RWZXJzaW9uLnZlcnNpb24sICJSSU8gZHJpdmVyIGZvciBsaW51eCBWMS4wIiwKKwkgICAgc2l6ZW9mKHN0VmVyc2lvbi52ZXJzaW9uKSk7CisgICAgc3RybGNweShzdFZlcnNpb24uYnVpbGREYXRlLCBfX0RBVEVfXywKKwkgICAgc2l6ZW9mKHN0VmVyc2lvbi5idWlsZERhdGUpKTsKKworICAgIHJldHVybiAmc3RWZXJzaW9uOworfQorCisjaWYgMAoraW50CitSSU9NYXBpbihwYWRkciwgc2l6ZSwgdmFkZHIpCitwYWRkcl90CQlwYWRkcjsKK2ludAkJCXNpemU7CitjYWRkcl90ICoJdmFkZHI7Cit7CisJKnZhZGRyID0gKGNhZGRyX3QpcGVybWFwKCAobG9uZylwYWRkciwgc2l6ZSk7CisJcmV0dXJuICgoaW50KSp2YWRkcik7Cit9CisKK3ZvaWQKK1JJT01hcG91dChwYWRkciwgc2l6ZSwgdmFkZHIpCitwYWRkcl90CQlwYWRkcjsKK2xvbmcJCXNpemU7CitjYWRkcl90IAl2YWRkcjsKK3sKK30KKyNlbmRpZgorCisKK3ZvaWQKK1JJT0hvc3RSZXNldChUeXBlLCBEcFJhbVAsIFNsb3QpCit1aW50IFR5cGU7Cit2b2xhdGlsZSBzdHJ1Y3QgRHBSYW0gKkRwUmFtUDsKK3VpbnQgU2xvdDsgCit7CisJLyoKKwkqKiBSZXNldCB0aGUgVHB1CisJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiUklPSG9zdFJlc2V0OiB0eXBlIDB4JXgiLCBUeXBlKTsKKwlzd2l0Y2ggKCBUeXBlICkgeworCQljYXNlIFJJT19BVDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIiAoUklPX0FUKVxuIik7CisJCQlXQllURShEcFJhbVAtPkRwQ29udHJvbCwgIEJPT1RfRlJPTV9SQU0gfCBFWFRFUk5BTF9CVVNfT0ZGIHwgCisJCQkJCSAgSU5URVJSVVBUX0RJU0FCTEUgfCBCWVRFX09QRVJBVElPTiB8CisJCQkJCSAgU0xPV19MSU5LUyB8IFNMT1dfQVRfQlVTKTsKKwkJCVdCWVRFKERwUmFtUC0+RHBSZXNldFRwdSwgMHhGRik7CisJCQlyaW9fdWRlbGF5ICgzKTsKKworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIlJJT0hvc3RSZXNldDogRG9uJ3Qga25vdyBpZiBpdCB3b3JrZWQuIFRyeSByZXNldCBhZ2FpblxuIik7CisJCQlXQllURShEcFJhbVAtPkRwQ29udHJvbCwgIEJPT1RfRlJPTV9SQU0gfCBFWFRFUk5BTF9CVVNfT0ZGIHwKKwkJCQkJICBJTlRFUlJVUFRfRElTQUJMRSB8IEJZVEVfT1BFUkFUSU9OIHwKKwkJCQkJICBTTE9XX0xJTktTIHwgU0xPV19BVF9CVVMpOworCQkJV0JZVEUoRHBSYW1QLT5EcFJlc2V0VHB1LCAweEZGKTsKKwkJCXJpb191ZGVsYXkgKDMpOworCQkJYnJlYWs7CisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKKwljYXNlIFJJT19FSVNBOgorCS8qCisJKiogQmV0IHRoaXMgZG9lc24ndCB3b3JrIQorCSovCisJT1VUQlooIFNsb3QsIEVJU0FfQ09OVFJPTF9QT1JULAorCQlFSVNBX1RQX1JVTgkJfCBFSVNBX1RQX0JVU19ESVNBQkxFICAgfAorCQlFSVNBX1RQX1NMT1dfTElOS1MgfCBFSVNBX1RQX0JPT1RfRlJPTV9SQU0gKTsKKwlPVVRCWiggU2xvdCwgRUlTQV9DT05UUk9MX1BPUlQsCisJCUVJU0FfVFBfUkVTRVQJICB8IEVJU0FfVFBfQlVTX0RJU0FCTEUgICB8IAorCQlFSVNBX1RQX1NMT1dfTElOS1MgfCBFSVNBX1RQX0JPT1RfRlJPTV9SQU0gKTsKKwlzdXNwZW5kKCAzICk7CisJT1VUQlooIFNsb3QsIEVJU0FfQ09OVFJPTF9QT1JULAorCQlFSVNBX1RQX1JVTgkJfCBFSVNBX1RQX0JVU19ESVNBQkxFICAgfCAKKwkJRUlTQV9UUF9TTE9XX0xJTktTIHwgRUlTQV9UUF9CT09UX0ZST01fUkFNICk7CisJYnJlYWs7CisJY2FzZSBSSU9fTUNBOgorCVdCWVRFKERwUmFtUC0+RHBDb250cm9sICAsIE1jYVRwQm9vdEZyb21SYW0gfCBNY2FUcEJ1c0Rpc2FibGUgKTsKKwlXQllURShEcFJhbVAtPkRwUmVzZXRUcHUgLCAweEZGICk7CisJc3VzcGVuZCggMyApOworCVdCWVRFKERwUmFtUC0+RHBDb250cm9sICAsIE1jYVRwQm9vdEZyb21SYW0gfCBNY2FUcEJ1c0Rpc2FibGUgKTsKKwlXQllURShEcFJhbVAtPkRwUmVzZXRUcHUgLCAweEZGICk7CisJc3VzcGVuZCggMyApOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgUklPX1BDSToKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiIChSSU9fUENJKVxuIik7CisJCURwUmFtUC0+RHBDb250cm9sICA9IFJJT19QQ0lfQk9PVF9GUk9NX1JBTTsKKwkJRHBSYW1QLT5EcFJlc2V0SW50ID0gMHhGRjsKKwkJRHBSYW1QLT5EcFJlc2V0VHB1ID0gMHhGRjsKKwkJcmlvX3VkZWxheSAoMTAwKTsKKwkJLyogZm9yIChpPTA7IGk8NjAwMDsgaSsrKTsgICovCisJCS8qIHN1c3BlbmQoIDMgKTsgKi8KKwkJYnJlYWs7CisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKKwlkZWZhdWx0OgorCVJwcmludGYoUklPTWVzZ05vU3VwcG9ydCxUeXBlLERwUmFtUCxTbG90KTsKKwlyZXR1cm47CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIiAoVU5LTk9XTilcbiIpOworCQlicmVhazsKKwl9CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pbnRyLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDJlN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pbnRyLmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb2ludHIuYworKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDQKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NDkKKyoqCisqKiAgaWRlbnQgQCgjKXJpb2ludHIuYwkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9pbnRyX2Nfc2Njc18gPSAiQCgjKXJpb2ludHIuYwkxLjIiOworI2VuZGlmCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgImxpbnV4X2NvbXBhdC5oIgorI2luY2x1ZGUgInJpb19saW51eC5oIgorI2luY2x1ZGUgInR5cGRlZi5oIgorI2luY2x1ZGUgInBrdC5oIgorI2luY2x1ZGUgImRhZW1vbi5oIgorI2luY2x1ZGUgInJpby5oIgorI2luY2x1ZGUgInJpb3NwYWNlLmgiCisjaW5jbHVkZSAidG9wLmgiCisjaW5jbHVkZSAiY21kcGt0LmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAicmlvdHlwZXMuaCIKKyNpbmNsdWRlICJydXAuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmlvZHJ2ci5oIgorI2luY2x1ZGUgInJpb2luZm8uaCIKKyNpbmNsdWRlICJmdW5jLmgiCisjaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyNpbmNsdWRlICJwYXJtbWFwLmgiCisjaW5jbHVkZSAidW5peHJ1cC5oIgorI2luY2x1ZGUgImJvYXJkLmgiCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAicGhiLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgImNtZGJsay5oIgorI2luY2x1ZGUgInJvdXRlLmgiCisjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgImNpcnJ1cy5oIgorI2luY2x1ZGUgInJpb2lvY3RsLmgiCisKKworc3RhdGljIHZvaWQgUklPUmVjZWl2ZShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IFBvcnQgKik7CisKKworc3RhdGljIGNoYXIgKmZpcnN0Y2hhcnMgKGNoYXIgKnAsIGludCBuY2gpCit7CisgIHN0YXRpYyBjaGFyIGJ1ZlsyXVsxMjhdOworICBzdGF0aWMgaW50IHQ9MDsKKyAgdCA9ICEgdDsKKyAgbWVtY3B5IChidWZbdF0sIHAsIG5jaCk7CisgIGJ1Zlt0XVtuY2hdID0gMDsKKyAgcmV0dXJuIGJ1Zlt0XTsKK30KKworCisjZGVmaW5lCUlOQ1IoIFAsIEkgKQkoKFApID0gKCgoUCkrKEkpKSAmIHAtPlJJT0J1ZmZlck1hc2spKQorLyogRW5hYmxlIGFuZCBzdGFydCB0aGUgdHJhbnNtaXNzaW9uIG9mIHBhY2tldHMgKi8KK3ZvaWQKK1JJT1R4RW5hYmxlKGVuKQorY2hhciAqCQllbjsKK3sKKyAgc3RydWN0IFBvcnQgKglQb3J0UDsKKyAgc3RydWN0IHJpb19pbmZvICpwOworICBzdHJ1Y3QgdHR5X3N0cnVjdCogdHR5OworICBpbnQgYzsKKyAgc3RydWN0IFBLVCAqCVBhY2tldFA7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgUG9ydFAgPSAoc3RydWN0IFBvcnQgKillbjsgCisgIHAgPSAoc3RydWN0IHJpb19pbmZvICopUG9ydFAtPnA7CisgIHR0eSA9IFBvcnRQLT5ncy50dHk7CisKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJ0eCBwb3J0ICVkOiAlZCBjaGFycyBxdWV1ZWQuXG4iLCAKKwkgICAgICBQb3J0UC0+UG9ydE51bSwgUG9ydFAtPmdzLnhtaXRfY250KTsKKworICBpZiAoIVBvcnRQLT5ncy54bWl0X2NudCkgcmV0dXJuOworICAKKworICAvKiBUaGlzIHJvdXRpbmUgaXMgYW4gb3JkZXIgb2YgbWFnbml0dWRlIHNpbXBsZXIgdGhhbiB0aGUgc3BlY2lhbGl4CisgICAgIHZlcnNpb24uIE9uZSBvZiB0aGUgZGlzYWR2YW50YWdlcyBpcyB0aGF0IHRoaXMgdmVyc2lvbiB3aWxsIHNlbmQKKyAgICAgYW4gaW5jb21wbGV0ZSBwYWNrZXQgKHVzdWFsbHkgNjQgYnl0ZXMgaW5zdGVhZCBvZiA3Mikgb25jZSBmb3IKKyAgICAgZXZlcnkgNGsgd29ydGggb2YgZGF0YS4gTGV0J3MganVzdCBzYXkgdGhhdCB0aGlzIHdvbid0IGluZmx1ZW5jZQorICAgICBwZXJmb3JtYW5jZSBzaWduaWZpY2FudGx5Li4uLi4gKi8KKworICByaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKyAgd2hpbGUgKGNhbl9hZGRfdHJhbnNtaXQoICZQYWNrZXRQLCBQb3J0UCApKSB7CisgICAgYyA9IFBvcnRQLT5ncy54bWl0X2NudDsKKyAgICBpZiAoYyA+IFBLVF9NQVhfREFUQV9MRU4pIGMgPSBQS1RfTUFYX0RBVEFfTEVOOworCisgICAgLyogRG9uJ3QgY29weSBwYXN0IHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBidWZmZXIgKi8KKyAgICBpZiAoYyA+IFNFUklBTF9YTUlUX1NJWkUgLSBQb3J0UC0+Z3MueG1pdF90YWlsKSAKKyAgICAgIGMgPSBTRVJJQUxfWE1JVF9TSVpFIC0gUG9ydFAtPmdzLnhtaXRfdGFpbDsKKworICAgIHsgaW50IHQ7CisgICAgdCA9IChjID4gMTApPzEwOmM7CisgICAgCisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAicmlvOiB0eCBwb3J0ICVkOiBjb3B5aW5nICVkIGNoYXJzOiAlcyAtICVzXG4iLCAKKwkJIFBvcnRQLT5Qb3J0TnVtLCBjLCAKKwkJIGZpcnN0Y2hhcnMgKFBvcnRQLT5ncy54bWl0X2J1ZiArIFBvcnRQLT5ncy54bWl0X3RhaWwgICAgICAsIHQpLAorCQkgZmlyc3RjaGFycyAoUG9ydFAtPmdzLnhtaXRfYnVmICsgUG9ydFAtPmdzLnhtaXRfdGFpbCArIGMtdCwgdCkpOworICAgIH0KKyAgICAvKiBJZiBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLCB3ZSBjYW4ndCBjb3B5IG1vcmUgZGF0YSwgCisgICAgICAgd2UncmUgZG9uZSEgKi8KKyAgICBpZiAoYyA9PSAwKSBicmVhazsKKworICAgIHJpb19tZW1jcHlfdG9pbyAoUG9ydFAtPkhvc3RQLT5DYWRkciwgKGNhZGRyX3QpUGFja2V0UC0+ZGF0YSwgCisJCSBQb3J0UC0+Z3MueG1pdF9idWYgKyBQb3J0UC0+Z3MueG1pdF90YWlsLCBjKTsKKyAgICAvKiAgICB1ZGVsYXkgKDEpOyAqLworCisgICAgd3JpdGViIChjLCAmKFBhY2tldFAtPmxlbikpOworICAgIGlmICghKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApICkgeworICAgICAgYWRkX3RyYW5zbWl0ICggUG9ydFAgKTsKKyAgICAgIC8qCisgICAgICAqKiBDb3VudCBjaGFycyB0eCdkIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisgICAgICAqLworICAgICAgaWYgKCBQb3J0UC0+c3RhdHNHYXRoZXIgKQorCVBvcnRQLT50eGNoYXJzICs9IGM7CisgICAgfQorICAgIFBvcnRQLT5ncy54bWl0X3RhaWwgPSAoUG9ydFAtPmdzLnhtaXRfdGFpbCArIGMpICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisgICAgUG9ydFAtPmdzLnhtaXRfY250IC09IGM7CisgIH0KKworICByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworICBpZiAoUG9ydFAtPmdzLnhtaXRfY250IDw9IChQb3J0UC0+Z3Mud2FrZXVwX2NoYXJzICsgMipQS1RfTUFYX0RBVEFfTEVOKSkgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIldha2luZyB1cC4uLi4gbGRpc2M6JWQgKCVkLyVkKS4uLi4iLAorCQkgKGludCkoUG9ydFAtPmdzLnR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSksCisJCSBQb3J0UC0+Z3Mud2FrZXVwX2NoYXJzLCBQb3J0UC0+Z3MueG1pdF9jbnQpOyAKKyAgICBpZiAoKFBvcnRQLT5ncy50dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmCisJUG9ydFAtPmdzLnR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKQorICAgICAgKFBvcnRQLT5ncy50dHktPmxkaXNjLndyaXRlX3dha2V1cCkoUG9ydFAtPmdzLnR0eSk7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiKCVkLyVkKVxuIiwKKwkJUG9ydFAtPmdzLndha2V1cF9jaGFycywgUG9ydFAtPmdzLnhtaXRfY250KTsgCisgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZQb3J0UC0+Z3MudHR5LT53cml0ZV93YWl0KTsKKyAgfQorCit9CisKKworLyoKKyoqIFJJTyBIb3N0IFNlcnZpY2Ugcm91dGluZS4gRG9lcyBhbGwgdGhlIHdvcmsgdHJhZGl0aW9uYWxseSBhc3NvY2lhdGVkIHdpdGggYW4KKyoqIGludGVycnVwdC4KKyovCitzdGF0aWMgaW50CVJ1cEludHI7CitzdGF0aWMgaW50CVJ4SW50cjsKK3N0YXRpYyBpbnQJVHhJbnRyOwordm9pZAorUklPU2VydmljZUhvc3QocCwgSG9zdFAsIEZyb20pCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IEhvc3QgKkhvc3RQOworaW50IEZyb207IAoreworICByaW9fc3Bpbl9sb2NrICgmSG9zdFAtPkhvc3RMb2NrKTsKKyAgaWYgKCAoSG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HICkgeyAKKyAgICBzdGF0aWMgaW50IHQgPTA7CisgICAgcmlvX3NwaW5fdW5sb2NrICgmSG9zdFAtPkhvc3RMb2NrKTsgCisgICAgaWYgKCh0KysgJSAyMDApID09IDApCisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJJbnRlcnJ1cHQgYnV0IGhvc3Qgbm90IHJ1bm5pbmcuIGZsYWdzPSV4LlxuIiwgKGludClIb3N0UC0+RmxhZ3MpOworICAgIHJldHVybjsKKyAgfQorICByaW9fc3Bpbl91bmxvY2sgKCZIb3N0UC0+SG9zdExvY2spOyAKKworICBpZiAoIFJXT1JEKCBIb3N0UC0+UGFybU1hcFAtPnJ1cF9pbnRyICkgKSB7CisgICAgV1dPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnVwX2ludHIgLCAwICk7CisgICAgcC0+UklPUnVwQ291bnQrKzsKKyAgICBSdXBJbnRyKys7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAicmlvOiBSVVAgaW50ZXJydXB0IG9uIGhvc3QgJWRcbiIsIEhvc3RQLXAtPlJJT0hvc3RzKTsKKyAgICBSSU9Qb2xsSG9zdENvbW1hbmRzKHAsIEhvc3RQICk7CisgIH0KKworICBpZiAoIFJXT1JEKCBIb3N0UC0+UGFybU1hcFAtPnJ4X2ludHIgKSApIHsKKyAgICBpbnQgcG9ydDsKKworICAgIFdXT1JEKCBIb3N0UC0+UGFybU1hcFAtPnJ4X2ludHIgLCAwICk7CisgICAgcC0+UklPUnhDb3VudCsrOworICAgIFJ4SW50cisrOworCisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAicmlvOiBSWCBpbnRlcnJ1cHQgb24gaG9zdCAlZFxuIiwgSG9zdFAtcC0+UklPSG9zdHMpOworICAgIC8qCisgICAgKiogTG9vcCB0aHJvdWdoIGV2ZXJ5IHBvcnQuIElmIHRoZSBwb3J0IGlzIG1hcHBlZCBpbnRvCisgICAgKiogdGhlIHN5c3RlbSAoIGkuZS4gaGFzIC9kZXYvdHR5WFhYWCBhc3NvY2lhdGVkICkgdGhlbiBpdCBpcworICAgICoqIHdvcnRoIGNoZWNraW5nLiBJZiB0aGUgcG9ydCBpc24ndCBvcGVuLCBncmFiIGFueSBwYWNrZXRzCisgICAgKiogaGFuZ2luZyBvbiBpdHMgcmVjZWl2ZSBxdWV1ZSBhbmQgc3R1ZmYgdGhlbSBvbiB0aGUgZnJlZQorICAgICoqIGxpc3Q7IGNoZWNrIGZvciBjb21tYW5kcyBvbiB0aGUgd2F5LgorICAgICovCisgICAgZm9yICggcG9ydD1wLT5SSU9GaXJzdFBvcnRzQm9vdGVkOyAKKwkgIHBvcnQ8cC0+UklPTGFzdFBvcnRzQm9vdGVkK1BPUlRTX1BFUl9SVEE7IHBvcnQrKyApIHsKKyAgICAgIHN0cnVjdCBQb3J0ICpQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOworICAgICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eVA7CisgICAgICBzdHJ1Y3QgUEtUICpQYWNrZXRQOworCQkKKyAgICAgIC8qCisgICAgICAqKiBub3QgbWFwcGVkIGluIC0gbW9zdCBvZiB0aGUgUklPUG9ydHBbXSBpbmZvcm1hdGlvbgorICAgICAgKiogaGFzIG5vdCBiZWVuIHNldCB1cCEKKyAgICAgICoqIE9wdGltaXNlOiBwb3J0cyBjb21lIGluIGJ1bmRsZXMgb2YgZWlnaHQuCisgICAgICAqLworICAgICAgaWYgKCAhUG9ydFAtPk1hcHBlZCApIHsKKwlwb3J0ICs9IDc7CisJY29udGludWU7IC8qIHdpdGggdGhlIG5leHQgcG9ydCAqLworICAgICAgfQorCisgICAgICAvKgorICAgICAgKiogSWYgdGhlIGhvc3QgYm9hcmQgaXNuJ3QgVEhJUyBob3N0IGJvYXJkLCBjaGVjayB0aGUgbmV4dCBvbmUuCisgICAgICAqKiBvcHRpbWlzZTogcG9ydHMgY29tZSBpbiBidW5kbGVzIG9mIGVpZ2h0LgorICAgICAgKi8KKyAgICAgIGlmICggUG9ydFAtPkhvc3RQICE9IEhvc3RQICkgeworCXBvcnQgKz0gNzsKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICoqIExldCB1cyBzZWUgLSBpcyB0aGUgcG9ydCBvcGVuPyBJZiBub3QsIHRoZW4gZG9uJ3Qgc2VydmljZSBpdC4KKyAgICAgICovCisgICAgICBpZiAoICEoIFBvcnRQLT5Qb3J0U3RhdGUgJiBQT1JUX0lTT1BFTiApICkgeworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKgorICAgICAgKiogZmluZCBjb3JyZXNwb25kaW5nIHR0eSBzdHJ1Y3R1cmUuIFRoZSBwcm9jZXNzIG9mIG1hcHBpbmcKKyAgICAgICoqIHRoZSBwb3J0cyBwdXRzIHRoZXNlIGhlcmUuCisgICAgICAqLworICAgICAgdHR5UCA9IFBvcnRQLT5ncy50dHk7CisKKyAgICAgIC8qCisgICAgICAqKiBMb2NrIHRoZSBwb3J0IGJlZm9yZSB3ZSBiZWdpbiB3b3JraW5nIG9uIGl0LgorICAgICAgKi8KKyAgICAgIHJpb19zcGluX2xvY2soJlBvcnRQLT5wb3J0U2VtKTsKKworICAgICAgLyoKKyAgICAgICoqIFByb2Nlc3MgcmVjZWl2ZWQgZGF0YSBpZiB0aGVyZSBpcyBhbnkuCisgICAgICAqLworICAgICAgaWYgKCBjYW5fcmVtb3ZlX3JlY2VpdmUoICZQYWNrZXRQLCBQb3J0UCApICkKKwlSSU9SZWNlaXZlKHAsIFBvcnRQKTsKKworICAgICAgLyoKKyAgICAgICoqIElmIHRoZXJlIGlzIG5vIGRhdGEgbGVmdCB0byBiZSByZWFkIGZyb20gdGhlIHBvcnQsIGFuZAorICAgICAgKiogaXQncyBoYW5kc2hha2UgYml0IGlzIHNldCwgdGhlbiB3ZSBtdXN0IGNsZWFyIHRoZSBoYW5kc2hha2UsCisgICAgICAqKiBzbyB0aGF0IHRoYXQgZG93bnN0cmVhbSBSVEEgaXMgcmUtZW5hYmxlZC4KKyAgICAgICovCisgICAgICBpZiAoICFjYW5fcmVtb3ZlX3JlY2VpdmUoICZQYWNrZXRQLCBQb3J0UCApICYmIAorCSAgICggUldPUkQoIFBvcnRQLT5QaGJQLT5oYW5kc2hha2UgKT09UEhCX0hBTkRTSEFLRV9TRVQgKSApIHsKKwkJCQkvKgorCQkJCSoqIE1BR0lDISAoIEJhc2ljYWxseSwgaGFuZHNoYWtlIHRoZSBSWCBidWZmZXIsIHNvIHRoYXQKKwkJCQkqKiB0aGUgUlRBcyB1cHN0cmVhbSBjYW4gYmUgcmUtZW5hYmxlZC4gKQorCQkJCSovCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiU2V0IFJYIGhhbmRzaGFrZSBiaXRcbiIpOworCVdXT1JEKCBQb3J0UC0+UGhiUC0+aGFuZHNoYWtlLCAKKwkgICAgICAgUEhCX0hBTkRTSEFLRV9TRVR8UEhCX0hBTkRTSEFLRV9SRVNFVCApOworICAgICAgfQorICAgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisgICAgfQorICB9CisKKyAgaWYgKCBSV09SRCggSG9zdFAtPlBhcm1NYXBQLT50eF9pbnRyICkgKSB7CisgICAgaW50IHBvcnQ7CisKKyAgICBXV09SRCggSG9zdFAtPlBhcm1NYXBQLT50eF9pbnRyICwgMCk7CisKKyAgICBwLT5SSU9UeENvdW50Kys7CisgICAgVHhJbnRyKys7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAicmlvOiBUWCBpbnRlcnJ1cHQgb24gaG9zdCAlZFxuIiwgSG9zdFAtcC0+UklPSG9zdHMpOworCisgICAgLyoKKyAgICAqKiBMb29wIHRocm91Z2ggZXZlcnkgcG9ydC4KKyAgICAqKiBJZiB0aGUgcG9ydCBpcyBtYXBwZWQgaW50byB0aGUgc3lzdGVtICggaS5lLiBoYXMgL2Rldi90dHlYWFhYCisgICAgKiogYXNzb2NpYXRlZCApIHRoZW4gaXQgaXMgd29ydGggY2hlY2tpbmcuCisgICAgKi8KKyAgICBmb3IgKCBwb3J0PXAtPlJJT0ZpcnN0UG9ydHNCb290ZWQ7IAorCSAgcG9ydDxwLT5SSU9MYXN0UG9ydHNCb290ZWQrUE9SVFNfUEVSX1JUQTsgcG9ydCsrICkgeworICAgICAgc3RydWN0IFBvcnQgKlBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07CisgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5UDsKKyAgICAgIHN0cnVjdCBQS1QgKlBhY2tldFA7CisKKyAgICAgIC8qCisgICAgICAqKiBub3QgbWFwcGVkIGluIC0gbW9zdCBvZiB0aGUgUklPUG9ydHBbXSBpbmZvcm1hdGlvbgorICAgICAgKiogaGFzIG5vdCBiZWVuIHNldCB1cCEKKyAgICAgICovCisgICAgICBpZiAoICFQb3J0UC0+TWFwcGVkICkgeworCXBvcnQgKz0gNzsKKwljb250aW51ZTsgLyogd2l0aCB0aGUgbmV4dCBwb3J0ICovCisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBJZiB0aGUgaG9zdCBib2FyZCBpc24ndCBydW5uaW5nLCB0aGVuIGl0cyBkYXRhIHN0cnVjdHVyZXMKKyAgICAgICoqIGFyZSBubyB1c2UgdG8gdXMgLSBjb250aW51ZSBxdWlldGx5LgorICAgICAgKi8KKyAgICAgIGlmICggUG9ydFAtPkhvc3RQICE9IEhvc3RQICkgeworCXBvcnQgKz0gNzsKKwljb250aW51ZTsgLyogd2l0aCB0aGUgbmV4dCBwb3J0ICovCisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAqKiBMZXQgdXMgc2VlIC0gaXMgdGhlIHBvcnQgb3Blbj8gSWYgbm90LCB0aGVuIGRvbid0IHNlcnZpY2UgaXQuCisgICAgICAqLworICAgICAgaWYgKCAhKCBQb3J0UC0+UG9ydFN0YXRlICYgUE9SVF9JU09QRU4gKSApIHsKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAicmlvOiBMb29raW5nIGludG8gcG9ydCAlZC5cbiIsIHBvcnQpOworICAgICAgLyoKKyAgICAgICoqIExvY2sgdGhlIHBvcnQgYmVmb3JlIHdlIGJlZ2luIHdvcmtpbmcgb24gaXQuCisgICAgICAqLworICAgICAgcmlvX3NwaW5fbG9jaygmUG9ydFAtPnBvcnRTZW0pOworCisgICAgICAvKgorICAgICAgKiogSWYgd2UgY2FuJ3QgYWRkIGFueXRoaW5nIHRvIHRoZSB0cmFuc21pdCBxdWV1ZSwgdGhlbgorICAgICAgKiogd2UgbmVlZCBkbyBub25lIG9mIHRoaXMgcHJvY2Vzc2luZy4KKyAgICAgICovCisgICAgICBpZiAoICFjYW5fYWRkX3RyYW5zbWl0KCAmUGFja2V0UCwgUG9ydFAgKSApIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJDYW4ndCBhZGQgdG8gcG9ydCwgc28gc2tpcHBpbmcuXG4iKTsKKwlyaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICoqIGZpbmQgY29ycmVzcG9uZGluZyB0dHkgc3RydWN0dXJlLiBUaGUgcHJvY2VzcyBvZiBtYXBwaW5nCisgICAgICAqKiB0aGUgcG9ydHMgcHV0cyB0aGVzZSBoZXJlLgorICAgICAgKi8KKyAgICAgIHR0eVAgPSBQb3J0UC0+Z3MudHR5OworICAgICAgLyogSWYgdHR5UCBpcyBOVUxMLCB0aGUgcG9ydCBpcyBnZXR0aW5nIGNsb3NlZC4gRm9yZ2V0IGFib3V0IGl0LiAqLworICAgICAgaWYgKCF0dHlQKSB7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAibm8gdHR5LCBzbyBza2lwcGluZy5cbiIpOworCXJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgLyoKKyAgICAgICoqIElmIHRoZXJlIGlzIG1vcmUgcm9vbSBhdmFpbGFibGUgd2Ugc3RhcnQgdXAgdGhlIHRyYW5zbWl0CisgICAgICAqKiBkYXRhIHByb2Nlc3MgYWdhaW4uIFRoaXMgY2FuIGJlIGRpcmVjdCBJL08sIGlmIHRoZSBjb29rbW9kZQorICAgICAgKiogaXMgc2V0IHRvIENPT0tfUkFXIG9yIENPT0tfTUVESVVNLCBvciB3aWxsIGJlIGEgY2FsbCB0byB0aGUKKyAgICAgICoqIHJpb3Rwcm9jKCBUX09VVFBVVCApIGlmIHdlIGFyZSBpbiBDT09LX1dFTEwgbW9kZSwgdG8gZmV0Y2gKKyAgICAgICoqIGNoYXJhY3RlcnMgdmlhIHRoZSBsaW5lIGRpc2NpcGxpbmUuIFdlIG11c3QgYWx3YXlzIGNhbGwKKyAgICAgICoqIHRoZSBsaW5lIGRpc2NpcGxpbmUsCisgICAgICAqKiBzbyB0aGF0IHVzZXIgaW5wdXQgY2hhcmFjdGVycyBjYW4gYmUgZWNob2VkIGNvcnJlY3RseS4KKyAgICAgICoqCisgICAgICAqKiArKysrIFVwZGF0ZSArKysrKworICAgICAgKiogV2l0aCB0aGUgYWR2ZW50IG9mIGRvdWJsZSBidWZmZXJpbmcsIHdlIG5vdyBzZWUgaWYKKyAgICAgICoqIFR4QnVmZmVyT3V0LUluIGlzIG5vbi16ZXJvLiBJZiBzbywgdGhlbiB3ZSBjb3B5IGEgcGFja2V0CisgICAgICAqKiB0byB0aGUgb3V0cHV0IHBsYWNlLCBhbmQgc2V0IGl0IGdvaW5nLiBJZiB0aGlzIGVtcHRpZXMKKyAgICAgICoqIHRoZSBidWZmZXIsIHRoZW4gd2UgbXVzdCBpc3N1ZSBhIHdha2V1cCggKSBvbiBPVVQuCisgICAgICAqKiBJZiBpdCBmcmVlcyBzcGFjZSBpbiB0aGUgYnVmZmVyIHRoZW4gd2UgbXVzdCBpc3N1ZQorICAgICAgKiogYSB3YWtldXAoICkgb24gSU4uCisgICAgICAqKgorICAgICAgKiogKysrKyBFeHRyYSEgRXh0cmEhIElmIFBvcnRQLT5XZmx1c2hGbGFnIGlzIHNldCwgdGhlbiB3ZQorICAgICAgKiogaGF2ZSB0byBzZW5kIGEgV0ZMVVNIIGNvbW1hbmQgZG93biB0aGUgUEhCLCB0byBtYXJrIHRoZQorICAgICAgKiogZW5kIHBvaW50IG9mIGEgV0ZMVVNILiBXZSBhbHNvIG5lZWQgdG8gY2xlYXIgb3V0IGFueQorICAgICAgKiogZGF0YSBmcm9tIHRoZSBkb3VibGUgYnVmZmVyISAoIG5vdGUgdGhhdCBXZmx1c2hGbGFnIGlzIGEKKyAgICAgICoqICpjb3VudCogb2YgdGhlIG51bWJlciBvZiBXRkxVU0ggY29tbWFuZHMgb3V0c3RhbmRpbmchICkKKyAgICAgICoqCisgICAgICAqKiArKysrIEFuZCB0aGVyZSdzIG1vcmUhCisgICAgICAqKiBJZiBhbiBSVEEgaXMgcG93ZXJlZCBvZmYsIHRoZW4gb24gYWdhaW4sIGFuZCByZWJvb3RlZCwKKyAgICAgICoqIHdoaWxzdCBpdCBoYXMgcG9ydHMgb3BlbiwgdGhlbiB3ZSBuZWVkIHRvIHJlLW9wZW4gdGhlIHBvcnRzLgorICAgICAgKiogKCByZWFzb25hYmxlIGVub3VnaCApLiBXZSBjYW4ndCBkbyB0aGlzIHdoZW4gd2Ugc3BvdCB0aGUKKyAgICAgICoqIHJlLWJvb3QsIGluIGludGVycnVwdCB0aW1lLCBiZWNhdXNlIHRoZSBxdWV1ZSBpcyBwcm9iYWJseQorICAgICAgKiogZnVsbC4gU28sIHdoZW4gd2UgY29tZSBpbiBoZXJlLCB3ZSBuZWVkIHRvIHRlc3QgaWYgYW55CisgICAgICAqKiBwb3J0cyBhcmUgaW4gdGhpcyBjb25kaXRpb24sIGFuZCByZS1vcGVuIHRoZSBwb3J0IGJlZm9yZQorICAgICAgKiogd2UgdHJ5IHRvIHNlbmQgYW55IG1vcmUgZGF0YSB0byBpdC4gTm93LCB0aGUgcmUtYm9vdGVkCisgICAgICAqKiBSVEEgd2lsbCBiZSBkaXNjYXJkaW5nIHBhY2tldHMgZnJvbSB0aGUgUEhCIHVudGlsIGl0CisgICAgICAqKiByZWNlaXZlcyB0aGlzIG9wZW4gcGFja2V0LCBidXQgZG9uJ3Qgd29ycnkgdG9vbyBtdWNoCisgICAgICAqKiBhYm91dCB0aGF0LiBUaGUgb25lIHRoaW5nIHRoYXQgaXMgaW50ZXJlc3RpbmcgaXMgdGhlCisgICAgICAqKiBjb21iaW5hdGlvbiBvZiB0aGlzIGVmZmVjdCBhbmQgdGhlIFdGTFVTSCBlZmZlY3QhCisgICAgICAqLworICAgICAgLyogRm9yIG5vdyBkb24ndCBoYW5kbGUgUlRBIHJlYm9vdHMuIC0tIFJFVy4gCisJIFJlZW5hYmxlZC4gT3RoZXJ3aXNlIFJUQSByZWJvb3RzIGRpZG4ndCB3b3JrLiBEdWguIC0tIFJFVyAqLworICAgICAgaWYgKCBQb3J0UC0+TWFnaWNGbGFncyApIHsKKyNpZiAxCisJaWYgKCBQb3J0UC0+TWFnaWNGbGFncyAmIE1BR0lDX1JFQk9PVCApIHsKKwkgIC8qCisJICAqKiB3ZWxsLCB0aGUgUlRBIGhhcyBiZWVuIHJlYm9vdGVkLCBhbmQgdGhlcmUgaXMgcm9vbQorCSAgKiogb24gaXRzIHF1ZXVlIHRvIGFkZCB0aGUgb3BlbiBwYWNrZXQgdGhhdCBpcyByZXF1aXJlZC4KKwkgICoqCisJICAqKiBUaGUgbWVzc3kgcGFydCBvZiB0aGlzIGxpbmUgaXMgdHJ5aW5nIHRvIGRlY2lkZSBpZgorCSAgKiogd2UgbmVlZCB0byBjYWxsIHRoZSBQYXJhbSBmdW5jdGlvbiBhcyBhIHR0eSBvciBhcworCSAgKiogYSBtb2RlbS4KKwkgICoqIERPTlQgVVNFIENMT0NBTCBBUyBBIFRFU1QgRk9SIFRISVMhCisJICAqKgorCSAgKiogSWYgd2UgY2FuJ3QgcGFyYW0gdGhlIHBvcnQsIHRoZW4gbW92ZSBvbiB0byB0aGUKKwkgICoqIG5leHQgcG9ydC4KKwkgICovCisJICBQb3J0UC0+SW5Vc2UgPSBOT1RfSU5VU0U7CisKKwkgIHJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOworCSAgaWYgKCBSSU9QYXJhbShQb3J0UCwgT1BFTiwgKChQb3J0UC0+Q29yMkNvcHkgJiAKKwkJCQkgICAgICAgKENPUjJfUlRTRkxPV3xDT1IyX0NUU0ZMT1cgKSApPT0gCisJCQkJICAgICAgKENPUjJfUlRTRkxPV3xDT1IyX0NUU0ZMT1cgKSApID8gCisJCQlUUlVFIDogRkFMU0UsIERPTlRfU0xFRVAgKSA9PSBSSU9fRkFJTCApIHsKKwkgICAgY29udGludWU7IC8qIHdpdGggbmV4dCBwb3J0ICovCisJICB9CisJICByaW9fc3Bpbl9sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJICBQb3J0UC0+TWFnaWNGbGFncyAmPSB+TUFHSUNfUkVCT09UOworCX0KKyNlbmRpZgorCisJLyoKKwkqKiBBcyBtZW50aW9uZWQgYWJvdmUsIHRoaXMgaXMgYSB0YWNreSBoYWNrIHRvIGNvcGUKKwkqKiB3aXRoIFdGTFVTSAorCSovCisJaWYgKCBQb3J0UC0+V2ZsdXNoRmxhZyApIHsKKwkgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIldhbnQgdG8gV0ZMVVNIIG1hcmsgdGhpcyBwb3J0XG4iKTsKKworCSAgaWYgKCBQb3J0UC0+SW5Vc2UgKQorCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJGQUlMUyAtIFBPUlQgSVMgSU4gVVNFXG4iKTsKKwl9CisJCQkJCisJd2hpbGUgKCBQb3J0UC0+V2ZsdXNoRmxhZyAmJgorCQljYW5fYWRkX3RyYW5zbWl0KCAmUGFja2V0UCwgUG9ydFAgKSAmJiAKKwkJKCBQb3J0UC0+SW5Vc2UgPT0gTk9UX0lOVVNFICkgKSB7CisJICBpbnQgcDsKKwkgIHN0cnVjdCBQa3RDbWQgKlBrdENtZFA7CisKKwkgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIkFkZCBXRkxVU0ggbWFya2VyIHRvIGRhdGEgcXVldWVcbiIpOworCSAgLyoKKwkgICoqIG1ha2UgaXQgbG9vayBqdXN0IGxpa2UgYSBXRkxVU0ggY29tbWFuZAorCSAgKi8KKwkgIFBrdENtZFAgPSAoIHN0cnVjdCBQa3RDbWQgKiApJlBhY2tldFAtPmRhdGFbMF07CisKKwkgIFdCWVRFKCBQa3RDbWRQLT5Db21tYW5kICwgV0ZMVVNIICk7CisKKwkgIHAgPSAgUG9ydFAtPkhvc3RQb3J0ICUgKCB1c2hvcnQgKVBPUlRTX1BFUl9SVEE7CisKKwkgIC8qCisJICAqKiBJZiBzZWNvbmQgYmxvY2sgb2YgcG9ydHMgZm9yIDE2IHBvcnQgUlRBLCBhZGQgOAorCSAgKiogdG8gaW5kZXggOC0xNS4KKwkgICovCisJICBpZiAoIFBvcnRQLT5TZWNvbmRCbG9jayApCisJICAgIHAgKz0gUE9SVFNfUEVSX1JUQTsKKworCSAgV0JZVEUoIFBrdENtZFAtPlBoYk51bSwgcCApOworCisJICAvKgorCSAgKiogdG8gbWFrZSBkZWJ1Z2dlcnkgZWFzaWVyCisJICAqLworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbIDJdLCAnVycgICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsgM10sICdGJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyA0XSwgJ0wnICApOworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbIDVdLCAnVScgICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsgNl0sICdTJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyA3XSwgJ0gnICApOworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbIDhdLCAnICcgICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsgOV0sICcwJytQb3J0UC0+V2ZsdXNoRmxhZyApOworCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbMTBdLCAnICcgICk7CisJICBXQllURSggUGFja2V0UC0+ZGF0YVsxMV0sICcgJyAgKTsKKwkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWzEyXSwgJ1wwJyApOworCisJICAvKgorCSAgKiogaXRzIHR3byBieXRlcyBsb25nIQorCSAgKi8KKwkgIFdCWVRFKCBQYWNrZXRQLT5sZW4gLCBQS1RfQ01EX0JJVCB8IDIgKTsKKworCSAgLyoKKwkgICoqIHF1ZXVlIGl0IQorCSAgKi8KKwkgIGlmICggISggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSApIHsKKwkgICAgYWRkX3RyYW5zbWl0KCBQb3J0UCApOworCSAgICAvKgorCSAgICAqKiBDb3VudCBjaGFycyB0eCdkIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisJICAgICovCisJICAgIGlmICggUG9ydFAtPnN0YXRzR2F0aGVyICkKKwkgICAgICBQb3J0UC0+dHhjaGFycyArPSAyOworCSAgfQorCisJICBpZiAoIC0tKCBQb3J0UC0+V2ZsdXNoRmxhZyApID09IDAgKSB7CisJICAgIFBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NQUdJQ19GTFVTSDsKKwkgIH0KKworCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiV2ZsdXNoIGNvdW50IG5vdyBzdGFuZHMgYXQgJWRcbiIsIAorCQkgUG9ydFAtPldmbHVzaEZsYWcpOworCX0KKwlpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICYgTU9SRV9PVVRQVVRfRVlHT1IgKSB7CisJICBpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICYgTUFHSUNfRkxVU0ggKSB7CisJICAgIFBvcnRQLT5NYWdpY0ZsYWdzIHw9IE1PUkVfT1VUUFVUX0VZR09SOworCSAgfQorCSAgZWxzZSB7CisJICAgIGlmICggIWNhbl9hZGRfdHJhbnNtaXQoICZQYWNrZXRQLCBQb3J0UCApICkgeworCSAgICAgIHJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIHJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOworCSAgICBSSU9UeEVuYWJsZSgoY2hhciAqKVBvcnRQKTsKKwkgICAgcmlvX3NwaW5fbG9jaygmUG9ydFAtPnBvcnRTZW0pOworCSAgICBQb3J0UC0+TWFnaWNGbGFncyAmPSB+TU9SRV9PVVRQVVRfRVlHT1I7CisJICB9CisJfQorICAgICAgfQorCisKKyAgICAgIC8qCisgICAgICAqKiBJZiB3ZSBjYW4ndCBhZGQgYW55dGhpbmcgdG8gdGhlIHRyYW5zbWl0IHF1ZXVlLCB0aGVuCisgICAgICAqKiB3ZSBuZWVkIGRvIG5vbmUgb2YgdGhlIHJlbWFpbmluZyBwcm9jZXNzaW5nLgorICAgICAgKi8KKyAgICAgIGlmICghY2FuX2FkZF90cmFuc21pdCggJlBhY2tldFAsIFBvcnRQICkgKSB7CisJcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIHJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOworICAgICAgUklPVHhFbmFibGUoKGNoYXIgKilQb3J0UCk7CisgICAgfQorICB9Cit9CisKKy8qCisqKiBSb3V0aW5lIGZvciBoYW5kbGluZyByZWNlaXZlZCBkYXRhIGZvciBjbGlzdCBkcml2ZXJzLgorKiogTkI6IENhbGxlZCB3aXRoIHRoZSB0dHkgbG9ja2VkLiBUaGUgc3BsIGZyb20gdGhlIGxvY2tiKCApIGlzIHBhc3NlZC4KKyoqIHdlIHJldHVybiB0aGUgdHR5U3BsIGxldmVsIHRoYXQgd2UgcmUtbG9ja2VkIGF0LgorKi8KK3N0YXRpYyB2b2lkCitSSU9SZWNlaXZlKHAsIFBvcnRQKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3N0cnVjdCBQb3J0ICoJCVBvcnRQOworeworICBzdHJ1Y3QgdHR5X3N0cnVjdCAqVHR5UDsKKyAgcmVnaXN0ZXIgdXNob3J0IHRyYW5zQ291bnQ7CisgIHN0cnVjdCBQS1QgKlBhY2tldFA7CisgIHJlZ2lzdGVyIHVpbnQJRGF0YUNudDsKKyAgdWNoYXIgKglwdHI7CisgIGludCBjb3BpZWQgPTA7CisKKyAgc3RhdGljIGludCBpbnRDb3VudCwgUnhJbnRDbnQ7CisKKyAgLyoKKyAgKiogVGhlIHJlY2VpdmUgZGF0YSBwcm9jZXNzIGlzIHRvIHJlbW92ZSBwYWNrZXRzIGZyb20gdGhlCisgICoqIFBIQiB1bnRpbCB0aGVyZSBhcmVuJ3QgYW55IG1vcmUgb3IgdGhlIGN1cnJlbnQgY2Jsb2NrCisgICoqIGlzIGZ1bGwuIFdoZW4gdGhpcyBvY2N1cnMsIHRoZXJlIHdpbGwgYmUgc29tZSBsZWZ0IG92ZXIKKyAgKiogZGF0YSBpbiB0aGUgcGFja2V0LCB0aGF0IHdlIG11c3QgZG8gc29tZXRoaW5nIHdpdGguCisgICoqIEFzIHdlIGhhdmVuJ3QgdW5ob29rZWQgdGhlIHBhY2tldCBmcm9tIHRoZSByZWFkIGxpc3QKKyAgKiogeWV0LCB3ZSBjYW4ganVzdCBsZWF2ZSB0aGUgcGFja2V0IHRoZXJlLCBoYXZpbmcgZmlyc3QKKyAgKiogbWFkZSBhIG5vdGUgb2YgaG93IGZhciB3ZSBnb3QuIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkCisgICoqIGEgcG9pbnRlciBwZXIgcG9ydCBzYXlpbmcgd2hlcmUgd2Ugc3RhcnQgdGFraW5nIHRoZQorICAqKiBkYXRhIGZyb20gLSB0aGlzIHdpbGwgbm9ybWFsbHkgYmUgemVybywgYnV0IHdoZW4gd2UKKyAgKiogcnVuIG91dCBvZiBzcGFjZSBpdCB3aWxsIGJlIHNldCB0byB0aGUgb2Zmc2V0IG9mIHRoZQorICAqKiBuZXh0IGJ5dGUgdG8gY29weSBmcm9tIHRoZSBwYWNrZXQgZGF0YSBhcmVhLiBUaGUgcGFja2V0CisgICoqIGxlbmd0aCBmaWVsZCBpcyBkZWNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQKKyAgKiogd2Ugc3VjY2VzZnVsbHkgcmVtb3ZlZCBmcm9tIHRoZSBwYWNrZXQuIFdoZW4gdGhpcyByZWFjaGVzCisgICoqIHplcm8sIHdlIHJlc2V0IHRoZSBvZmZzZXQgcG9pbnRlciB0byBiZSB6ZXJvLCBhbmQgZnJlZQorICAqKiB0aGUgcGFja2V0IGZyb20gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4KKyAgKi8KKworICBpbnRDb3VudCsrOworCisgIFR0eVAgPSBQb3J0UC0+Z3MudHR5OworICBpZiAoIVR0eVApIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJSSU9SZWNlaXZlOiB0dHkgaXMgbnVsbC4gXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoUG9ydFAtPlN0YXRlICYgUklPX1RIUk9UVExFX1JYKSB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUklPUmVjZWl2ZTogVGhyb3R0bGVkLiBDYW4ndCBoYW5kbGUgbW9yZSBpbnB1dC5cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKQorICAgIHsKKyAgICAgIHdoaWxlICggY2FuX3JlbW92ZV9yZWNlaXZlKCAmUGFja2V0UCwgUG9ydFAgKSApCisJeworCSAgcmVtb3ZlX3JlY2VpdmUoIFBvcnRQICk7CisJICBwdXRfZnJlZV9lbmQoIFBvcnRQLT5Ib3N0UCwgUGFja2V0UCApOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKgorICAgICAgKiogbG9vcCwganVzdCBzbyBsb25nIGFzOgorICAgICAgKiogICBpICkgdGhlcmUncyBzb21lIGRhdGEgKCBpLmUuIGNhbl9yZW1vdmVfcmVjZWl2ZSApCisgICAgICAqKiAgaWkgKSB3ZSBoYXZlbid0IGJlZW4gYmxvY2tlZAorICAgICAgKiogaWlpICkgdGhlcmUncyBzb21ld2hlcmUgdG8gcHV0IHRoZSBkYXRhCisgICAgICAqKiAgaXYgKSB3ZSBoYXZlbid0IG91dHN0YXllZCBvdXIgd2VsY29tZQorICAgICAgKi8KKyAgICAgIHRyYW5zQ291bnQgPSAxOworICAgICAgd2hpbGUgKCBjYW5fcmVtb3ZlX3JlY2VpdmUoJlBhY2tldFAsIFBvcnRQKQorCSAgICAgICYmIHRyYW5zQ291bnQpCisJeworI2lmZGVmIFNUQVRTCisJICBQb3J0UC0+U3RhdC5SeEludENudCsrOworI2VuZGlmIC8qIFNUQVRTICovCisJICBSeEludENudCsrOworCisJICAvKgorCSAgKiogY2hlY2sgdGhhdCBpdCBpcyBub3QgYSBjb21tYW5kIQorCSAgKi8KKwkgIGlmICggUGFja2V0UC0+bGVuICYgUEtUX0NNRF9CSVQgKSB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlJJTzogdW5leHBlY3RlZCBjb21tYW5kIHBhY2tldCByZWNlaXZlZCBvbiBQSEJcbiIpOworCSAgICAvKgkgICAgcmlvX2RwcmludChSSU9fREVCVUdfSU5UUiwgKCIgc3lzcG9ydCAgID0gJWRcbiIsIHAtPlJJT1BvcnRwLT5Qb3J0TnVtKSk7ICovCisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiBkZXN0X3VuaXQgPSAlZFxuIiwgUGFja2V0UC0+ZGVzdF91bml0KTsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiIGRlc3RfcG9ydCA9ICVkXG4iLCBQYWNrZXRQLT5kZXN0X3BvcnQpOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgc3JjX3VuaXQgID0gJWRcbiIsIFBhY2tldFAtPnNyY191bml0KTsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiIHNyY19wb3J0ICA9ICVkXG4iLCBQYWNrZXRQLT5zcmNfcG9ydCk7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiBsZW4JICAgPSAlZFxuIiwgUGFja2V0UC0+bGVuKTsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiIGNvbnRyb2wgICA9ICVkXG4iLCBQYWNrZXRQLT5jb250cm9sKTsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiIGNzdW0JICAgPSAlZFxuIiwgUGFja2V0UC0+Y3N1bSk7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIgkgZGF0YSBieXRlczogIik7CisJICAgIGZvciAoIERhdGFDbnQ9MDsgRGF0YUNudDxQS1RfTUFYX0RBVEFfTEVOOyBEYXRhQ250KysgKQorCSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiVkXG4iLCBQYWNrZXRQLT5kYXRhW0RhdGFDbnRdKTsKKwkgICAgcmVtb3ZlX3JlY2VpdmUoIFBvcnRQICk7CisJICAgIHB1dF9mcmVlX2VuZCggUG9ydFAtPkhvc3RQLCBQYWNrZXRQICk7CisJICAgIGNvbnRpbnVlOyAvKiB3aXRoIG5leHQgcGFja2V0ICovCisJICB9CisKKwkgIC8qCisJICAqKiBIb3cgbWFueSBjaGFyYWN0ZXJzIGNhbiB3ZSBtb3ZlICd1cHN0cmVhbScgPworCSAgKioKKwkgICoqIERldGVybWluZSB0aGUgbWluaW11bSBvZiB0aGUgYW1vdW50IG9mIGRhdGEKKwkgICoqIGF2YWlsYWJsZSBhbmQgdGhlIGFtb3VudCBvZiBzcGFjZSBpbiB3aGljaCB0bworCSAgKiogcHV0IGl0LgorCSAgKioKKwkgICoqIDEuCUdldCB0aGUgcGFja2V0IGxlbmd0aCBieSBtYXNraW5nICdsZW4nCisJICAqKglmb3Igb25seSB0aGUgbGVuZ3RoIGJpdHMuCisJICAqKiAyLglBdmFpbGFibGUgc3BhY2UgaXMgW2J1ZmZlciBzaXplXSAtIFtzcGFjZSB1c2VkXQorCSAgKioKKwkgICoqIFRyYW5zZmVyIGNvdW50IGlzIHRoZSBtaW5pbXVtIG9mIHBhY2tldCBsZW5ndGgKKwkgICoqIGFuZCBhdmFpbGFibGUgc3BhY2UuCisJICAqLworCQkJCisJICB0cmFuc0NvdW50ID0gbWluX3QodW5zaWduZWQgaW50LCBQYWNrZXRQLT5sZW4gJiBQS1RfTEVOX01BU0ssCisJCQkgICBUVFlfRkxJUEJVRl9TSVpFIC0gVHR5UC0+ZmxpcC5jb3VudCk7CisJICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JFQywgICJwb3J0ICVkOiBDb3B5ICVkIGJ5dGVzXG4iLCAKKwkJCQkgICAgICBQb3J0UC0+UG9ydE51bSwgdHJhbnNDb3VudCk7CisJICAvKgorCSAgKiogVG8gdXNlIHRoZSBmb2xsb3dpbmcgJ2trcHJpbnRmcycgZm9yIGRlYnVnZ2luZyAtIGNoYW5nZSB0aGUgJyN1bmRlZicKKwkgICoqIHRvICcjZGVmaW5lJywgKHRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgX19fREVCVUdfSVRfX18gb2NjdXJzIGluIHRoZQorCSAgKiogZHJpdmVyKS4KKwkgICovCisjdW5kZWYgX19fREVCVUdfSVRfX18KKyNpZmRlZiBfX19ERUJVR19JVF9fXworCSAga2twcmludGYoIkk6JWQgUjolZCBQOiVkIFE6JWQgQzolZCBGOiV4ICIsCisJCSAgIGludENvdW50LAorCQkgICBSeEludENudCwKKwkJICAgUG9ydFAtPlBvcnROdW0sCisJCSAgIFR0eVAtPnJ4cXVldWUuY291bnQsCisJCSAgIHRyYW5zQ291bnQsCisJCSAgIFR0eVAtPmZsYWdzICk7CisjZW5kaWYKKwkgIHB0ciA9ICh1Y2hhciAqKSBQYWNrZXRQLT5kYXRhICsgUG9ydFAtPlJ4RGF0YVN0YXJ0OworCisJICByaW9fbWVtY3B5X2Zyb21pbyAoVHR5UC0+ZmxpcC5jaGFyX2J1Zl9wdHIsIHB0ciwgdHJhbnNDb3VudCk7CisJICBtZW1zZXQoVHR5UC0+ZmxpcC5mbGFnX2J1Zl9wdHIsIFRUWV9OT1JNQUwsIHRyYW5zQ291bnQpOworCisjaWZkZWYgU1RBVFMKKwkgIC8qCisJICAqKiBrZWVwIGEgY291bnQgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzCisJICAqLworCSAgUG9ydFAtPlN0YXQuUnhDaGFyQ250CSs9IHRyYW5zQ291bnQ7CisjZW5kaWYKKwkgIFBvcnRQLT5SeERhdGFTdGFydAkrPSB0cmFuc0NvdW50OworCSAgUGFja2V0UC0+bGVuCQktPSB0cmFuc0NvdW50OworCSAgY29waWVkICs9IHRyYW5zQ291bnQ7CisJICBUdHlQLT5mbGlwLmNvdW50ICs9IHRyYW5zQ291bnQ7CisJICBUdHlQLT5mbGlwLmNoYXJfYnVmX3B0ciArPSB0cmFuc0NvdW50OworCSAgVHR5UC0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gdHJhbnNDb3VudDsKKworCisjaWZkZWYgX19fREVCVUdfSVRfX18KKwkgIGtrcHJpbnRmKCJUOiVkIEw6JWRcbiIsIERhdGFDbnQsIFBhY2tldFAtPmxlbiApOworI2VuZGlmCisKKwkgIGlmICggUGFja2V0UC0+bGVuID09IDAgKQorCSAgICB7CisJCQkJLyoKKwkJCQkqKiBJZiB3ZSBoYXZlIGVtcHRpZWQgdGhlIHBhY2tldCwgdGhlbiB3ZSBjYW4KKwkJCQkqKiBmcmVlIGl0LCBhbmQgcmVzZXQgdGhlIHN0YXJ0IHBvaW50ZXIgZm9yCisJCQkJKiogdGhlIG5leHQgcGFja2V0LgorCQkJCSovCisJICAgICAgcmVtb3ZlX3JlY2VpdmUoIFBvcnRQICk7CisJICAgICAgcHV0X2ZyZWVfZW5kKCBQb3J0UC0+SG9zdFAsIFBhY2tldFAgKTsKKwkgICAgICBQb3J0UC0+UnhEYXRhU3RhcnQgPSAwOworI2lmZGVmIFNUQVRTCisJCQkJLyoKKwkJCQkqKiBtb3JlIGxpZXMgKCBvb3BzLCBJIG1lYW4gc3RhdGlzdGljcyApCisJCQkJKi8KKwkgICAgICBQb3J0UC0+U3RhdC5SeFBrdENudCsrOworI2VuZGlmIC8qIFNUQVRTICovCisJICAgIH0KKwl9CisgICAgfQorICBpZiAoY29waWVkKSB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19SRUMsICJwb3J0ICVkOiBwdXNoaW5nIHR0eSBmbGlwIGJ1ZmZlcjogJWQgdG90YWwgYnl0ZXMgY29waWVkLlxuIiwgUG9ydFAtPlBvcnROdW0sIGNvcGllZCk7CisgICAgdHR5X2ZsaXBfYnVmZmVyX3B1c2ggKFR0eVApOworICB9CisKKyAgcmV0dXJuOworfQorCisjaWZkZWYgRlVUVVJFX1JFTEVBU0UKKy8qCisqKiBUaGUgcHJvYyByb3V0aW5lIGNhbGxlZCBieSB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIGRvIHRoZSB3b3JrIGZvciBpdC4KKyoqIFRoZSBwcm9jIHJvdXRpbmUgd29ya3MgaGFuZCBpbiBoYW5kIHdpdGggdGhlIGludGVycnVwdCByb3V0aW5lLgorKi8KK2ludAorcmlvdHByb2MocCwgdHAsIGNtZCwgcG9ydCkKK3N0cnVjdCByaW9faW5mbyAqCXA7CityZWdpc3RlciBzdHJ1Y3QgdHR5c3RhdGljcyAqdHA7CitpbnQgY21kOworaW50CXBvcnQ7Cit7CisJcmVnaXN0ZXIgc3RydWN0IFBvcnQgKlBvcnRQOworCWludCBTeXNQb3J0OworCXN0cnVjdCBQS1QgKlBhY2tldFA7CisKKwlTeXNQb3J0ID0gcG9ydDsJLyogQmVsaWV2ZSBtZSwgaXQgd29ya3MuICovCisKKwlpZiAoIFN5c1BvcnQgPCAwIHx8IFN5c1BvcnQgPj0gUklPX1BPUlRTICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJJbGxlZ2FsIHBvcnQgJWQgZGVyaXZlZCBmcm9tIFRUWSBpbiByaW90cHJvYygpXG4iLFN5c1BvcnQpOworCQlyZXR1cm4gMDsKKwl9CisJUG9ydFAgPSBwLT5SSU9Qb3J0cFtTeXNQb3J0XTsKKworCWlmICgodWludClQb3J0UC0+UGhiUCA8ICh1aW50KVBvcnRQLT5DYWRkciB8fCAKKwkJCSh1aW50KVBvcnRQLT5QaGJQID49ICh1aW50KVBvcnRQLT5DYWRkcitTSVhUWV9GT1VSX0sgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlJJTzogTlVMTCBvciBCQUQgUGhiUCBvbiBzeXMgcG9ydCAlZCBpbiBwcm9jIHJvdXRpbmVcbiIsCisJCQkJCQkJU3lzUG9ydCk7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIgkgUG9ydFAgPSAweCV4XG4iLFBvcnRQKTsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiCSBQb3J0UC0+UGhiUCA9IDB4JXhcbiIsUG9ydFAtPlBoYlApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIJIFBvcnRQLT5DYWRkciA9IDB4JXhcbiIsUG9ydFAtPlBoYlApOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIJIFBvcnRQLT5Ib3N0UG9ydCA9IDB4JXhcbiIsUG9ydFAtPkhvc3RQb3J0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoKGNtZCkgeworCQljYXNlIFRfV0ZMVVNIOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9XRkxVU0hcbiIpOworCQkJLyoKKwkJCSoqIEJlY2F1c2Ugb2YgdGhlIHNwb29reSB3YXkgdGhlIFJJTyB3b3Jrcywgd2UgZG9uJ3QgbmVlZAorCQkJKiogdG8gaXNzdWUgYSBmbHVzaCBjb21tYW5kIG9uIGFueSBvZiB0aGUgU0VUKkYgY29tbWFuZHMsCisJCQkqKiBhcyB0aGF0IGNhdXNlcyB0cm91YmxlIHdpdGggZ2V0dHkgYW5kIGxvZ2luLCB3aGljaCBpc3N1ZQorCQkJKiogdGhlc2UgY29tbWFuZHMgdG8gaW5jdXIgYSBSRUFEIGZsdXNoLCBhbmQgcmVseSBvbiB0aGUgZmFjdAorCQkJKiogdGhhdCB0aGUgbGluZSBkaXNjaXBsaW5lIGRvZXMgYSB3YWl0IGZvciBkcmFpbiBmb3IgdGhlbS4KKwkJCSoqIEFzIHRoZSByaW8gZG9lc24ndCB3YWl0IGZvciBkcmFpbiwgdGhlIHdyaXRlIGZsdXNoIHdvdWxkCisJCQkqKiBkZXN0cm95IHRoZSBQYXNzd29yZDogcHJvbXB0LiBUaGlzIGlzbid0IHZlcnkgZnJpZW5kbHksIHNvCisJCQkqKiBoZXJlIHdlIG9ubHkgaXNzdWUgYSBXRkxVU0ggY29tbWFuZCBpZiB3ZSBhcmUgaW4gdGhlIGludGVycnVwdAorCQkJKiogcm91dGluZSwgb3Igd2UgYXJlbid0IGV4ZWN1dGluZyBhIFNFVCpGIGNvbW1hbmQuCisJCQkqLworCQkJaWYgKCBQb3J0UC0+SG9zdFAtPkluSW50ciB8fCAhUG9ydFAtPkZsdXNoQ21kQm9kZ2UgKSB7CisJCQkJLyoKKwkJCQkqKiBmb3JtIGEgd2ZsdXNoIHBhY2tldCAtIDEgYnl0ZSBsb25nLCBubyBkYXRhCisJCQkJKi8KKwkJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJXRkxVU0ggb24gZGVsZXRlZCBSVEFcbiIpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaWYgKCBSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBXRkxVU0ggKSA9PSBSSU9fRkFJTCApIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfV0ZMVVNIIENvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1dGTFVTSCBDb21tYW5kXG4iKTsKKwkJCQl9CisJCQkJLyoKKwkJCQkqKiBXRkxVU0ggb3BlcmF0aW9uIC0gZmx1c2ggdGhlIGRhdGEhCisJCQkJKi8KKwkJCQlQb3J0UC0+VHhCdWZmZXJJbiA9IFBvcnRQLT5UeEJ1ZmZlck91dCA9IDA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1dGTFVTSCBDb21tYW5kIGlnbm9yZWRcbiIpOworCQkJfQorCQkJLyoKKwkJCSoqIHNvcnQgb3V0IHRoZSBsaW5lIGRpc2NpcGxpbmUKKwkJCSovCisJCQlpZiAoUG9ydFAtPkNvb2tNb2RlID09IENPT0tfV0VMTCkKKwkJCQlnb3RvIHN0YXJ0OworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9SRVNVTUU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1JFU1VNRVxuIik7CisJCQkvKgorCQkJKiogc2VuZCBwcmUtZW1wdGl2ZSByZXN1bWUgcGFja2V0CisJCQkqLworCQkJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJSRVNVTUUgb24gZGVsZXRlZCBSVEFcbiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKCBSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBSRVNVTUUgKSA9PSBSSU9fRkFJTCApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9SRVNVTUUgQ29tbWFuZCBmYWlsZWRcbiIpOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkqKiBhbmQgcmUtc3RhcnQgdGhlIHNlbmRlciBzb2Z0d2FyZSEKKwkJCSovCisJCQlpZiAoUG9ydFAtPkNvb2tNb2RlID09IENPT0tfV0VMTCkKKwkJCQlnb3RvIHN0YXJ0OworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9USU1FOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9USU1FXG4iKTsKKwkJCS8qCisJCQkqKiBUX1RJTUUgaXMgY2FsbGVkIHdoZW4geERMWSBpcyBzZXQgaW4gb2ZsYWdzIGFuZAorCQkJKiogdGhlIGxpbmUgZGlzY2lwbGluZSB0aW1lb3V0IGhhcyBleHBpcmVkLiBJdCdzCisJCQkqKiBmdW5jdGlvbiBpbiBsaWZlIGlzIHRvIGNsZWFyIHRoZSBUSU1FT1VUIGZsYWcKKwkJCSoqIGFuZCB0byByZS1zdGFydCBvdXRwdXQgdG8gdGhlIHBvcnQuCisJCQkqLworCQkJLyoKKwkJCSoqIEZhbGwgdGhyb3VnaCBhbmQgcmUtc3RhcnQgb3V0cHV0CisJCQkqLworCQljYXNlIFRfT1VUUFVUOgorc3RhcnQ6CisJCQlpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICYgTUFHSUNfRkxVU0ggKSB7CisJCQkJUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTU9SRV9PVVRQVVRfRVlHT1I7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlSSU9UeEVuYWJsZSgoY2hhciAqKVBvcnRQKTsKKwkJCVBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NT1JFX09VVFBVVF9FWUdPUjsKKwkJCS8qcmlvX2RwcmludChSSU9fREVCVUdfSU5UUiwgUG9ydFAsREJHX1BST0MsIlRfT1VUUFVUIGZpbmlzaGVkXG4iKTsqLworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9TVVNQRU5EOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9TVVNQRU5EXG4iKTsKKwkJCS8qCisJCQkqKiBzZW5kIGEgc3VzcGVuZCBwcmUtZW1wdGl2ZSBwYWNrZXQuCisJCQkqLworCQkJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTVVNQRU5EIGRlbGV0ZWQgUlRBXG4iKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmICggUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgU1VTUEVORCApID09IFJJT19GQUlMICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1NVU1BFTkQgQ29tbWFuZCBmYWlsZWRcbiIpOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkqKiBkb25lIQorCQkJKi8KKwkJCWJyZWFrOworCQorCQljYXNlIFRfQkxPQ0s6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX0JMT0NLXG4iKTsKKwkJCWJyZWFrOworCQorCQljYXNlIFRfUkZMVVNIOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9SRkxVU0hcbiIpOworCQkJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJSRkxVU0ggb24gZGVsZXRlZCBSVEFcbiIpOworCQkJCVBvcnRQLT5SeERhdGFTdGFydCA9IDA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoIFJJT1ByZWVtcHRpdmVDbWQoIHAsIFBvcnRQLCBSRkxVU0ggKSA9PSBSSU9fRkFJTCApIHsKKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9SRkxVU0ggQ29tbWFuZCBmYWlsZWRcbiIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKKwkJCQl3aGlsZSAoIGNhbl9yZW1vdmVfcmVjZWl2ZSgmUGFja2V0UCwgUG9ydFApICkgeworCQkJCQlyZW1vdmVfcmVjZWl2ZShQb3J0UCk7CisJCQkJCVNob3dQYWNrZXQoREJHX1BST0MsIFBhY2tldFAgKTsKKwkJCQkJcHV0X2ZyZWVfZW5kKFBvcnRQLT5Ib3N0UCwgUGFja2V0UCApOworCQkJCX0KKwkJCQlpZiAoIFBvcnRQLT5QaGJQLT5oYW5kc2hha2UgPT0gUEhCX0hBTkRTSEFLRV9TRVQgKSB7CisJCQkJCS8qCisJCQkJCSoqIE1BR0lDIQorCQkJCQkqLworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTZXQgcmVjZWl2ZSBoYW5kc2hha2UgYml0XG4iKTsKKwkJCQkJUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSB8PSBQSEJfSEFORFNIQUtFX1JFU0VUOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBUX1VOQkxPQ0s6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1VOQkxPQ0tcbiIpOworCQkJLyoKKwkJCSoqIElmIHRoZXJlIGlzIGFueSBkYXRhIHRvIHJlY2VpdmUgc2V0IGEgdGltZW91dCB0byBzZXJ2aWNlIGl0LgorCQkJKi8KKwkJCVJJT1JlY2VpdmUocCwgUG9ydFApOworCQkJYnJlYWs7CisJCisJCWNhc2UgVF9CUkVBSzoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfQlJFQUtcbiIpOworCQkJLyoKKwkJCSoqIFNlbmQgYSBicmVhayBjb21tYW5kLiBGb3IgU3lzIFYKKwkJCSoqIHRoaXMgaXMgYSB0aW1lZCBicmVhaywgc28gd2UKKwkJCSoqIHNlbmQgYSBTQlJFQUtbdGltZV0gcGFja2V0CisJCQkqLworCQkJLyoKKwkJCSoqIEJ1aWxkIGEgQlJFQUsgY29tbWFuZAorCQkJKi8KKwkJCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiQlJFQUsgb24gZGVsZXRlZCBSVEFcbiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKFJJT1Nob3J0Q29tbWFuZChQb3J0UCxTQlJFQUssMiwKKwkJCQkJCQkJcC0+UklPQ29uZi5CcmVha0ludGVydmFsKT09UklPX0ZBSUwpIHsKKwkJCSAgIAkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiU0JSRUFLIFJJT1Nob3J0Q29tbWFuZCBmYWlsZWRcbiIpOworCQkJCX0KKwkJCX0KKwkKKwkJCS8qCisJCQkqKiBkb25lIQorCQkJKi8KKwkJCWJyZWFrOworCQorCQljYXNlIFRfSU5QVVQ6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJQcm9jIFRfSU5QVVQgY2FsbGVkIC0gSSBkb24ndCBrbm93IHdoYXQgdG8gZG8hXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFRfUEFSTToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlByb2MgVF9QQVJNIGNhbGxlZCAtIEkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIVxuIik7CisJCQlicmVhazsKKwkKKwkJY2FzZSBUX1NXVENIOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUHJvYyBUX1NXVENIIGNhbGxlZCAtIEkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIVxuIik7CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlByb2MgVU5LTk9XTiBjb21tYW5kICVkXG4iLGNtZCk7CisJfQorCS8qCisJKiogVF9PVVRQVVQgcmV0dXJucyB3aXRob3V0IHBhc3NpbmcgdGhyb3VnaCB0aGlzIHBvaW50IQorCSovCisJLypyaW9fZHByaW50KFJJT19ERUJVR19JTlRSLCBQb3J0UCxEQkdfUFJPQywicmlvdHByb2MgZG9uZVxuIik7Ki8KKwlyZXR1cm4oMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvaW9jdGwuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q2Nzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pb2N0bC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW9pb2N0bC5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxMworKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMgorKioKKyoqICBpZGVudCBAKCMpcmlvaW9jdGwuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZglfX3Jpb2lvY3RsX2hfXworI2RlZmluZQlfX3Jpb2lvY3RsX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvaW9jdGxfaF9zY2NzXyA9ICJAKCMpcmlvaW9jdGwuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBSSU8gZGV2aWNlIGRyaXZlciAtIHVzZXIgaW9jdGxzIGFuZCBhc3NvY2lhdGVkIHN0cnVjdHVyZXMuCisqLworCitzdHJ1Y3QgcG9ydFN0YXRzIHsKKwlpbnQJcG9ydDsKKwlpbnQJZ2F0aGVyOworCXVsb25nCXR4Y2hhcnM7CisJdWxvbmcJcnhjaGFyczsKKwl1bG9uZwlvcGVuczsKKwl1bG9uZwljbG9zZXM7CisJdWxvbmcJaW9jdGxzOworfTsgCisKKworI2RlZmluZSBySU9DCSgncic8PDgpCisjZGVmaW5lCVRDUklPU1RBVEUJKHJJT0MgfCAxKQorI2RlZmluZQlUQ1JJT1hQT04JKHJJT0MgfCAyKQorI2RlZmluZQlUQ1JJT1hQT0ZGCShySU9DIHwgMykKKyNkZWZpbmUJVENSSU9YUENQUwkocklPQyB8IDQpCisjZGVmaW5lCVRDUklPWFBSSU5UCShySU9DIHwgNSkKKyNkZWZpbmUgVENSSU9JWEFOWU9OCShySU9DIHwgNikKKyNkZWZpbmUJVENSSU9JWEFOWU9GRgkocklPQyB8IDcpCisjZGVmaW5lIFRDUklPSVhPTk9OCShySU9DIHwgOCkKKyNkZWZpbmUJVENSSU9JWE9OT0ZGCShySU9DIHwgOSkKKyNkZWZpbmUJVENSSU9NQklTCShySU9DIHwgMTApCisjZGVmaW5lCVRDUklPTUJJQwkocklPQyB8IDExKQorI2RlZmluZQlUQ1JJT1RSSUFECShySU9DIHwgMTIpCisjZGVmaW5lIFRDUklPVFNUQVRFCShySU9DIHwgMTMpCisKKy8qCisqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc2MSBwYXJ0IGZpeAorKiogQWRkIFJJTyBpb2N0bHMgZm9yIG1hbmlwdWxhdGluZyBSVFMgYW5kIENUUyBmbG93IGNvbnRyb2wsIChhcyBMeW54T1MKKyoqIGFwcGVhcnMgdG8gbm90IHN1cHBvcnQgaGFyZHdhcmUgZmxvdyBjb250cm9sKS4KKyovCisjZGVmaW5lIFRDUklPQ1RTRkxPV0VOCShySU9DIHwgMTQpCS8qIGVuYWJsZSBDVFMgZmxvdyBjb250cm9sICovCisjZGVmaW5lIFRDUklPQ1RTRkxPV0RJUwkocklPQyB8IDE1KQkvKiBkaXNhYmxlIENUUyBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgVENSSU9SVFNGTE9XRU4JKHJJT0MgfCAxNikJLyogZW5hYmxlIFJUUyBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgVENSSU9SVFNGTE9XRElTCShySU9DIHwgMTcpCS8qIGRpc2FibGUgUlRTIGZsb3cgY29udHJvbCAqLworCisvKgorKiogMDkuMTIuMTk5OCBBUkcgLSBFU0lMIDA3NzYgcGFydCBmaXgKKyoqIERlZmluaXRpb24gZm9yICdSSU9DJyBhbHNvIGFwcGVhcnMgaW4gZGFlbW9uLmgsIHNvIHdlJ2QgYmV0dGVyIGRvIGEKKyoqICNpZm5kZWYgaGVyZSBmaXJzdC4KKyoqICdSSU9fUVVJQ0tfQ0hFQ0snIGFsc28gI2RlZmluZSdkIGhlcmUgYXMgdGhpcyBpb2N0bCBpcyBub3cKKyoqIGFsbG93ZWQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuCisqKgorKiogMDUuMDIuMTk5OSBBUkcgLQorKiogVGhpcyBpcyB3aGF0IEkndmUgZGVjaWVkIHRvIGRvIHdpdGggaW9jdGxzIGV0Yy4sIHdoaWNoIGFyZSBpbnRlbmRlZCB0byBiZQorKiogaW52b2tlZCBmcm9tIHVzZXJzIGFwcGxpY2F0aW9ucyA6CisqKiBBbnl0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGRlZmluZWQgaGVyZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSBkYWVtb24uaCwgdGhhdAorKiogd2F5IGl0IHdvbid0IGVuZCB1cCBoYXZpbmcgdG8gYmUgZGVmaW5lZC9tYWludGFpbmVkIGluIHR3byBwbGFjZXMuIFRoZSBvbmx5CisqKiBjb25zZXF1ZW5jZSBvZiB0aGlzIGlzIHRoYXQgdGhpcyBmaWxlIHNob3VsZCBub3cgYmUgI2luY2x1ZGUnZCBieSBkYWVtb24uaAorKioKKyoqICdzdGF0cycgaW9jdGxzIG5vdyAjZGVmaW5lJ2QgaGVyZSBhcyB0aGV5IGFyZSB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KKyovCisjZGVmaW5lCVJJT0MJKCdSJzw8OCl8KCdpJzw8MTYpfCgnbyc8PDI0KQorCisjZGVmaW5lCVJJT19RVUlDS19DSEVDSwkgIAkoUklPQyB8IDEwNSkKKyNkZWZpbmUgUklPX0dBVEhFUl9QT1JUX1NUQVRTCShSSU9DIHwgMTkzKQorI2RlZmluZSBSSU9fUkVTRVRfUE9SVF9TVEFUUwkoUklPQyB8IDE5NCkKKyNkZWZpbmUgUklPX0dFVF9QT1JUX1NUQVRTCShSSU9DIHwgMTk1KQorCisjZW5kaWYJLyogX19yaW9pb2N0bF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvbG9ja3MuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvbG9ja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTBjZGFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9sb2Nrcy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb2xvY2tzLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEzCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIylyaW9sb2Nrcy5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fcmlvX3Jpb2xvY2tzX2hfXworI2RlZmluZQlfX3Jpb19yaW9sb2Nrc19oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb2xvY2tzX2hfc2Njc18gPSAiQCgjKXJpb2xvY2tzLmgJMS4yIjsKKyNlbmRpZgorCisjZGVmaW5lIExPQ0tCKGxrKQkJbG9ja2IobGspOworI2RlZmluZSBVTkxPQ0tCKGxrLCBvbGRzcGwpCXVubG9ja2IobGssIG9sZHNwbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9wYXJhbS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9wYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDkxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMKQEAgLTAsMCArMSw3NDQgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb3BhcmFtLmMKKyoqCVNJRAkJOiAxLjMKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDEwOjMzOjQ1CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDEwOjMzOjUwCisqKgorKiogIGlkZW50IEAoIylyaW9wYXJhbS5jCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvcGFyYW1fY19zY2NzXyA9ICJAKCMpcmlvcGFyYW0uYwkxLjMiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KKworCisjaW5jbHVkZSAibGludXhfY29tcGF0LmgiCisjaW5jbHVkZSAicmlvX2xpbnV4LmgiCisjaW5jbHVkZSAidHlwZGVmLmgiCisjaW5jbHVkZSAicGt0LmgiCisjaW5jbHVkZSAiZGFlbW9uLmgiCisjaW5jbHVkZSAicmlvLmgiCisjaW5jbHVkZSAicmlvc3BhY2UuaCIKKyNpbmNsdWRlICJ0b3AuaCIKKyNpbmNsdWRlICJjbWRwa3QuaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJyaW90eXBlcy5oIgorI2luY2x1ZGUgInJ1cC5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyaW9kcnZyLmgiCisjaW5jbHVkZSAicmlvaW5mby5oIgorI2luY2x1ZGUgImZ1bmMuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworI2luY2x1ZGUgInBhcm1tYXAuaCIKKyNpbmNsdWRlICJ1bml4cnVwLmgiCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJwaGIuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAiY21kYmxrLmgiCisjaW5jbHVkZSAicm91dGUuaCIKKyNpbmNsdWRlICJjb250cm9sLmgiCisjaW5jbHVkZSAiY2lycnVzLmgiCisjaW5jbHVkZSAicmlvaW9jdGwuaCIKKyNpbmNsdWRlICJwYXJhbS5oIgorI2luY2x1ZGUgImxpc3QuaCIKKyNpbmNsdWRlICJzYW0uaCIKKworCisKKy8qCisqKiBUaGUgU2NhbSwgYmFzZWQgb24gZW1haWwgZnJvbSBqZXJlbXlyQGJ1Z3Muc3BlY2lhbGl4LmNvLnVrLi4uLgorKioKKyoqIFRvIHNlbmQgYSBjb21tYW5kIG9uIGEgcGFydGljdWxhciBwb3J0LCB5b3UgcHV0IGEgcGFja2V0IHdpdGggdGhlCisqKiBjb21tYW5kIGJpdCBzZXQgb250byB0aGUgcG9ydC4gVGhlIGNvbW1hbmQgYml0IGlzIGluIHRoZSBsZW4gZmllbGQsCisqKiBhbmQgZ2V0cyBPUmVkIGluIHdpdGggdGhlIGFjdHVhbCBieXRlIGNvdW50LgorKioKKyoqIFdoZW4geW91IHNlbmQgYSBwYWNrZXQgd2l0aCB0aGUgY29tbWFuZCBiaXQgc2V0LCB0aGVuIHRoZSBmaXJzdAorKiogZGF0YSBieXRlICggZGF0YVswXSApIGlzIGludGVycHJldHRlZCBhcyB0aGUgY29tbWFuZCB0byBleGVjdXRlLgorKiogSXQgYWxzbyBnb3Zlcm5zIHdoYXQgZGF0YSBzdHJ1Y3R1cmUgb3ZlcmxheSBzaG91bGQgYWNjb21wYW55IHRoZSBwYWNrZXQuCisqKiBDb21tYW5kcyBhcmUgZGVmaW5lZCBpbiBjaXJydXMvY2lycnVzLmgKKyoqCisqKiBJZiB5b3Ugd2FudCB0aGUgY29tbWFuZCB0byBwcmUtZW10IGRhdGEgYWxyZWFkeSBvbiB0aGUgcXVldWUgZm9yIHRoZQorKiogcG9ydCwgc2V0IHRoZSBwcmUtZW1wdGl2ZSBiaXQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgY29tbWFuZCBiaXQuCisqKiBJdCBpcyBub3QgZGVmaW5lZCB3aGF0IHdpbGwgaGFwcGVuIGlmIHlvdSBzZXQgdGhlIHByZWVtcHRpdmUgYml0CisqKiBvbiBhIHBhY2tldCB0aGF0IGlzIE5PVCBhIGNvbW1hbmQuCisqKgorKiogUHJlLWVtcHRpdmUgY29tbWFuZHMgc2hvdWxkIGJlIHF1ZXVlZCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgdXNpbmcKKyoqIGFkZF9zdGFydCgpLCB3aGVyZWFzIG5vcm1hbCBjb21tYW5kcyBhbmQgZGF0YSBhcmUgZW5xdWV1ZWQgdXNpbmcKKyoqIGFkZF9lbmQoKS4KKyoqCisqKiBNb3N0IGNvbW1hbmRzIGRvIG5vdCB1c2UgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgZGF0YSBhcnJheS4gVGhlCisqKiBleGNlcHRpb25zIGFyZSBPUEVOIE1PUEVOIGFuZCBDT05GSUcuIChOQi4gQXMgd2l0aCB0aGUgU0kgQ09ORklHIGFuZAorKiogT1BFTiBhcmUgY3VycmVudGx5IGFuYWxhZ291cykuIFdpdGggdGhlc2UgdGhyZWUgY29tbWFuZHMgdGhlIGZvbGxvd2luZworKiogMTEgZGF0YSBieXRlcyBhcmUgYWxsIHVzZWQgdG8gcGFzcyBjb25maWcgaW5mb3JtYXRpb24gc3VjaCBhcyBiYXVkIHJhdGUgZXRjLgorKiogVGhlIGZpZWxkcyBhcmUgYWxzbyBkZWZpbmVkIGluIGNpcnJ1cy5oLiBTb21lIGNvbnRhaW4gc3RyYWlnaHRmb3J3YXJkCisqKiBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSB0cmFuc21pdCBYT04gY2hhcmFjdGVyLiBUd28gY29udGFpbiB0aGUgdHJhbnNtaXQgYW5kCisqKiByZWNlaXZlIGJhdWQgcmF0ZXMgcmVzcGVjdGl2ZWx5LiBGb3IgbW9zdCBiYXVkIHJhdGVzIHRoZXJlIGlzIGEgZGlyZWN0CisqKiBtYXBwaW5nIGJldHdlZW4gdGhlIHJhdGVzIGRlZmluZWQgaW4gPHN5cy90ZXJtaW8uaD4gYW5kIHRoZSBieXRlIGluIHRoZQorKiogcGFja2V0LiBUaGVyZSBhcmUgYWRkaXRpb25hbCAobm9uIFVOSVgtc3RhbmRhcmQpIHJhdGVzIGRlZmluZWQgaW4KKyoqIC91L2Rvcy9yaW8vY2lycnVzL2gvYnJhdGVzLmguCisqKgorKiogVGhlIHJlc3Qgb2YgdGhlIGRhdGEgZmllbGRzIGNvbnRhaW4gYXBwcm94aW1hdGlvbnMgdG8gdGhlIENpcnJ1cyByZWdpc3RlcnMKKyoqIHRoYXQgYXJlIHVzZWQgdG8gcHJvZ3JhbSBudW1iZXIgb2YgYml0cyBldGMuIEVhY2ggcmVnaXN0ZXJzIGJpdCBmaWVsZHMgaXMKKyoqIGRlZmluZWQgaW4gY2lycnVzLmguCisqKiAKKyoqIE5CLiBPbmx5IHVzZSB0aG9zZSBiaXRzIHRoYXQgYXJlIGRlZmluZWQgYXMgYmVpbmcgZHJpdmVyIHNwZWNpZmljCisqKiBvciBjb21tb24gdG8gdGhlIFJUQSBhbmQgdGhlIGRyaXZlci4KKyoqIAorKiogQWxsIGNvbW1hbmRzIGdvaW5nIGZyb20gUlRBLT5Ib3N0IHdpbGwgYmUgZGVhbHQgd2l0aCBieSB0aGUgSG9zdCBjb2RlIC0geW91CisqKiB3aWxsIG5ldmVyIHNlZSB0aGVtLiBBcyB3aXRoIHRoZSBTSSB0aGVyZSB3aWxsIGJlIHRocmVlIGZpZWxkcyB0byBsb29rIG91dAorKiogZm9yIGluIGVhY2ggcGhiIChub3QgeWV0IGRlZmluZWQgLSBuZWVkcyBkZWZpbmluZyBhLnMuYS5wKS4KKyoqIAorKiogbW9kZW1fc3RhdHVzCS0gY3VycmVudCBzdGF0ZSBvZiBoYW5kc2hha2UgcGlucy4KKyoqCisqKiBwb3J0X3N0YXR1cwkgLSBjdXJyZW50IHBvcnQgc3RhdHVzIC0gZXF1aXZhbGVudCB0byBoaV9zdGF0IGZvciBTSSwgaW5kaWNhdGVzCisqKiBpZiBwb3J0IGlzIElETEVfT1BFTiwgSURMRV9DTE9TRUQgZXRjLgorKioKKyoqIGJyZWFrX3N0YXR1cwktIGJpdCBYIHNldCBpZiBicmVhayBoYXMgYmVlbiByZWNlaXZlZC4KKyoqIAorKiogSGFwcHkgaGFja2luZy4KKyoqIAorKi8KKworLyogCisqKiBSSU9QYXJhbSBpcyB1c2VkIHRvIG9wZW4gb3IgY29uZmlndXJlIGEgcG9ydC4gWW91IHBhc3MgaXQgYSBQb3J0UCwKKyoqIHdoaWNoIHdpbGwgaGF2ZSBhIHR0eSBzdHJ1Y3QgYXR0YWNoZWQgdG8gaXQuIFlvdSBhbHNvIHBhc3MgYSBjb21tYW5kLAorKiogZWl0aGVyIE9QRU4gb3IgQ09ORklHLiBUaGUgcG9ydCdzIHNldHVwIGlzIHRha2VuIGZyb20gdGhlIHRfIGZpZWxkcworKiogb2YgdGhlIHR0eSBzdHJ1Y3QgaW5zaWRlIHRoZSBQb3J0UCwgYW5kIHRoZSBwb3J0IGlzIGVpdGhlciBvcGVuZWQKKyoqIG9yIHJlLWNvbmZpZ3VyZWQuIFlvdSBtdXN0IGFsc28gdGVsbCBSSU9QYXJhbSBpZiB0aGUgZGV2aWNlIGlzIGEgbW9kZW0KKyoqIGRldmljZSBvciBub3QgKGkuZS4gdG9wIGJpdCBvZiBtaW5vciBudW1iZXIgc2V0IG9yIGNsZWFyIC0gdGFrZSBzcGVjaWFsCisqKiBjYXJlIHdoZW4gZGVjaWRpbmcgb24gdGhpcyEpLgorKiogUklPUGFyYW0gbmVpdGhlciBmbHVzaGVzIG5vciB3YWl0cyBmb3IgZHJhaW4sIGFuZCBpcyBOT1QgcHJlZW1wdGl2ZS4KKyoqCisqKiBSSU9QYXJhbSBhc3N1bWVzIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNwbHJpbygpLCBhbmQgYWxzbyBhc3N1bWVzCisqKiB0aGF0IENvb2tNb2RlIGlzIHNldCBjb3JyZWN0bHkgaW4gdGhlIHBvcnQgc3RydWN0dXJlLgorKioKKyoqIE5CLiBmb3IgTVBYCisqKgl0dHkgbG9jayBtdXN0IE5PVCBoYXZlIGJlZW4gcHJldmlvdXNseSBhY3F1aXJlZC4KKyovCitpbnQKK1JJT1BhcmFtKFBvcnRQLCBjbWQsIE1vZGVtLCBTbGVlcEZsYWcpCitzdHJ1Y3QgUG9ydCAqUG9ydFA7CitpbnQgY21kOworaW50IE1vZGVtOworaW50IFNsZWVwRmxhZzsgCit7CisJcmVnaXN0ZXIgc3RydWN0IHR0eV9zdHJ1Y3QgKlR0eVA7CisJaW50CXJldHZhbDsKKwlyZWdpc3RlciBzdHJ1Y3QgcGhiX3BhcmFtICpwaGJfcGFyYW1fcHRyOworCVBLVCAqUGFja2V0UDsKKwlpbnQgcmVzOworCXVjaGFyIENvcjE9MCwgQ29yMj0wLCBDb3I0PTAsIENvcjU9MDsKKwl1Y2hhciBUeFhvbj0wLCBUeFhvZmY9MCwgUnhYb249MCwgUnhYb2ZmPTA7CisJdWNoYXIgTE5leHQ9MCwgVHhCYXVkPTAsIFJ4QmF1ZD0wOworCWludAkJcmV0cmllcyA9IDB4ZmY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZ1bmNfZW50ZXIgKCk7CisKKwlUdHlQID0gUG9ydFAtPmdzLnR0eTsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJSSU9QYXJhbTogUG9ydDolZCBjbWQ6JWQgTW9kZW06JWQgU2xlZXBGbGFnOiVkIE1hcHBlZDogJWQsIHR0eT0lcFxuIiwKKwkgICAgUG9ydFAtPlBvcnROdW0sIGNtZCwgTW9kZW0sIFNsZWVwRmxhZywgUG9ydFAtPk1hcHBlZCwgVHR5UCk7CisKKwlpZiAoIVR0eVApIHsKKwkgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJDYW4ndCBjYWxsIHJpb3BhcmFtIHdpdGggbnVsbCB0dHkuXG4iKTsKKworCSAgZnVuY19leGl0ICgpOworCisJICByZXR1cm4gUklPX0ZBSUw7CisJfQorCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzICk7CisKKwlpZiAoY21kID09IE9QRU4pIHsKKwkJLyoKKwkJKiogSWYgdGhlIHBvcnQgaXMgc2V0IHRvIHN0b3JlIG9yIGxvY2sgdGhlIHBhcmFtZXRlcnMsIGFuZCBpdCBpcworCQkqKiBwYXJhbWVkIHdpdGggT1BFTiwgd2Ugd2FudCB0byByZXN0b3JlIHRoZSBzYXZlZCBwb3J0IHRlcm1pbywgYnV0CisJCSoqIG9ubHkgaWYgU3RvcmVkVGVybWlvIGhhcyBiZWVuIHNhdmVkLCBpLmUuIE5PVCAxc3Qgb3BlbiBhZnRlciByZWJvb3QuCisJCSovCisjaWYgMAorCQlpZiAoUG9ydFAtPkZpcnN0T3BlbikgeworCQkJUG9ydFAtPlN0b3JlZFR0eS5pZmxhZyA9IFR0eVAtPnRtLmNfaWZsYWc7CisJCQlQb3J0UC0+U3RvcmVkVHR5Lm9mbGFnID0gVHR5UC0+dG0uY19vZmxhZzsKKwkJCVBvcnRQLT5TdG9yZWRUdHkuY2ZsYWcgPSBUdHlQLT50bS5jX2NmbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5sZmxhZyA9IFR0eVAtPnRtLmNfbGZsYWc7CisJCQlQb3J0UC0+U3RvcmVkVHR5LmxpbmUgPSBUdHlQLT50bS5jX2xpbmU7CisJCQlmb3IgKGkgPSAwOyBpIDwgTkNDICsgNTsgaSsrKQorCQkJCVBvcnRQLT5TdG9yZWRUdHkuY2NbaV0gPSBUdHlQLT50bS5jX2NjW2ldOworCQkJUG9ydFAtPkZpcnN0T3BlbiA9IDA7CisJCX0KKwkJZWxzZSBpZiAoUG9ydFAtPlN0b3JlIHx8IFBvcnRQLT5Mb2NrKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiT1BFTjogUmVzdG9yaW5nIHN0b3JlZC9sb2NrZWQgcGFyYW1zXG4iKTsKKwkJCVR0eVAtPnRtLmNfaWZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmlmbGFnOworCQkJVHR5UC0+dG0uY19vZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkub2ZsYWc7CisJCQlUdHlQLT50bS5jX2NmbGFnID0gUG9ydFAtPlN0b3JlZFR0eS5jZmxhZzsKKwkJCVR0eVAtPnRtLmNfbGZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmxmbGFnOworCQkJVHR5UC0+dG0uY19saW5lID0gUG9ydFAtPlN0b3JlZFR0eS5saW5lOworCQkJZm9yIChpID0gMDsgaSA8IE5DQyArIDU7IGkrKykKKwkJCQlUdHlQLT50bS5jX2NjW2ldID0gUG9ydFAtPlN0b3JlZFR0eS5jY1tpXTsKKwkJfQorI2VuZGlmCisJfQorCisJLyoKKwkqKiB3YWl0IGZvciBzcGFjZQorCSovCisJd2hpbGUgKCAhKHJlcz1jYW5fYWRkX3RyYW5zbWl0KCZQYWNrZXRQLFBvcnRQKSkgfHwgCisJCQkoUG9ydFAtPkluVXNlICE9IE5PVF9JTlVTRSkgKSB7CisJCWlmIChyZXRyaWVzIC0tIDw9IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWlmICggUG9ydFAtPkluVXNlICE9IE5PVF9JTlVTRSApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJQb3J0IElOX1VTRSBmb3IgcHJlLWVtcHRpdmUgY29tbWFuZFxuIik7CisJCX0KKworCQlpZiAoICFyZXMgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUG9ydCBoYXMgbm8gc3BhY2Ugb24gdHJhbnNtaXQgcXVldWVcbiIpOworCQl9CisKKwkJaWYgKCBTbGVlcEZsYWcgIT0gT0tfVE9fU0xFRVAgKSB7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlmdW5jX2V4aXQoKTsKKwkJCQorCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIndhaXQgZm9yIGNhbl9hZGRfdHJhbnNtaXRcbiIpOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXJldHZhbCA9IFJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKTsKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJaWYgKHJldHZhbCA9PSBSSU9fRkFJTCkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIndhaXQgZm9yIGNhbl9hZGRfdHJhbnNtaXQgYnJva2VuIGJ5IHNpZ25hbFxuIik7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlwc2V0ZXJyKEVJTlRSKTsKKwkJCWZ1bmNfZXhpdCgpOworCisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCWZ1bmNfZXhpdCAoKTsKKworCQkJcmV0dXJuIFJJT19TVUNDRVNTOworCQl9CisJfQorCisJaWYgKCFyZXMpIHsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlmdW5jX2V4aXQgKCk7CisKKwkJcmV0dXJuIFJJT19GQUlMOworCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJjYW5fYWRkX3RyYW5zbWl0KCkgcmV0dXJucyAleFxuIixyZXMpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJQYWNrZXQgaXMgMHgleFxuIiwoaW50KSBQYWNrZXRQKTsKKworCXBoYl9wYXJhbV9wdHIgPSAoc3RydWN0IHBoYl9wYXJhbSAqKVBhY2tldFAtPmRhdGE7CisKKworI2lmIDAKKwkvKgorCSoqIENPUiAxCisJKi8KKwlpZiAoIFR0eVAtPnRtLmNfaWZsYWcgJiBJTlBDSyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlBhcml0eSBjaGVja2luZyBvbiBpbnB1dCBlbmFibGVkXG4iKTsKKwkJQ29yMSB8PSBDT1IxX0lOUENLOworCX0KKyNlbmRpZgorCisJc3dpdGNoICggVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIENTSVpFICkgeworCQljYXNlIENTNToKKwkJeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIjUgYml0IGRhdGFcbiIpOworCQkJQ29yMSB8PSBDT1IxXzVCSVRTOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBDUzY6CisJCXsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICI2IGJpdCBkYXRhXG4iKTsKKwkJCUNvcjEgfD0gQ09SMV82QklUUzsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQ1M3OgorCQl7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiNyBiaXQgZGF0YVxuIik7CisJCQlDb3IxIHw9IENPUjFfN0JJVFM7CisJCQlicmVhazsKKwkJfQorCQljYXNlIENTODoKKwkJeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIjggYml0IGRhdGFcbiIpOworCQkJQ29yMSB8PSBDT1IxXzhCSVRTOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBDU1RPUEIgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICIyIHN0b3AgYml0c1xuIik7CisJCUNvcjEgfD0gQ09SMV8yU1RPUDsKKwl9CisJZWxzZSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICIxIHN0b3AgYml0XG4iKTsKKwkJQ29yMSB8PSBDT1IxXzFTVE9QOworCX0KKworCWlmICggVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBwYXJpdHlcbiIpOworCQlDb3IxIHw9IENPUjFfTk9STUFMOworCX0KKwllbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkRpc2FibGUgcGFyaXR5XG4iKTsKKwkJQ29yMSB8PSBDT1IxX05PUDsKKwl9CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiT2RkIHBhcml0eVxuIik7CisJCUNvcjEgfD0gQ09SMV9PREQ7CisJfQorCWVsc2UgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRXZlbiBwYXJpdHlcbiIpOworCQlDb3IxIHw9IENPUjFfRVZFTjsgCisJfQorCisJLyoKKwkqKiBDT1IgMgorCSovCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPTiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBzdGFydC9zdG9wIG91dHB1dCBjb250cm9sXG4iKTsKKwkJQ29yMiB8PSBDT1IyX0lYT047CisJfQorCWVsc2UgeworCQlpZiAoIFBvcnRQLT5Db25maWcgJiBSSU9fSVhPTiApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJGb3JjZSBlbmFibGUgc3RhcnQvc3RvcCBvdXRwdXQgY29udHJvbFxuIik7CisJCQlDb3IyIHw9IENPUjJfSVhPTjsKKwkJfQorCQllbHNlCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSVhPTiBoYXMgYmVlbiBkaXNhYmxlZC5cbiIpOworCX0KKworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVhBTlkpIHsKKwkJaWYgKCBQb3J0UC0+Q29uZmlnICYgUklPX0lYQU5ZICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBhbnkga2V5IHRvIHJlc3RhcnQgb3V0cHV0XG4iKTsKKwkJCUNvcjIgfD0gQ09SMl9JWEFOWTsKKwkJfQorCQllbHNlCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSVhBTlkgaGFzIGJlZW4gZGlzYWJsZWQgZHVlIHRvIHNhbml0eSByZWFzb25zLlxuIik7CisJfQorCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPRkYgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgc3RhcnQvc3RvcCBpbnB1dCBjb250cm9sIDJcbiIpOworCQlDb3IyIHw9IENPUjJfSVhPRkY7CisJfQorCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJIYW5ndXAgb24gbGFzdCBjbG9zZVxuIik7CisJCUNvcjIgfD0gQ09SMl9IVVBDTDsKKwl9CisKKwlpZiAoIENfQ1JUU0NUUyAoVHR5UCkpIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlJ4IGhhcmR3YXJlIGZsb3cgY29udHJvbCBlbmFibGVkXG4iKTsKKwkJQ29yMiB8PSBDT1IyX0NUU0ZMT1c7CisJCUNvcjIgfD0gQ09SMl9SVFNGTE9XOworCX0gZWxzZSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJSeCBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZGlzYWJsZWRcbiIpOworCQlDb3IyICY9IH5DT1IyX0NUU0ZMT1c7CisJCUNvcjIgJj0gfkNPUjJfUlRTRkxPVzsKKwl9CisKKworCWlmICggVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkxvY2FsIGxpbmVcbiIpOworCX0KKwllbHNlIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlBvc3NpYmxlIE1vZGVtIGxpbmVcbiIpOworCX0KKworCS8qCisJKiogQ09SIDQgKHRoZXJlIGlzIG5vIENPUiAzKQorCSovCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSUdOQlJLICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSWdub3JlIGJyZWFrIGNvbmRpdGlvblxuIik7CisJCUNvcjQgfD0gQ09SNF9JR05CUks7CisJfQorCWlmICggIShUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgQlJLSU5UKSApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkJyZWFrIGdlbmVyYXRlcyBOVUxMIGNvbmRpdGlvblxuIik7CisJCUNvcjQgfD0gQ09SNF9OQlJLSU5UOworCX0gZWxzZSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJbnRlcnJ1cHQgb24JYnJlYWsgY29uZGl0aW9uXG4iKTsKKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJTkxDUiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBuZXdsaW5lIHRvIGNhcnJpYWdlIHJldHVybiBvbiBpbnB1dFxuIik7CisJCUNvcjQgfD0gQ09SNF9JTkxDUjsKKwl9CisKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJR05DUiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIklnbm9yZSBjYXJyaWFnZSByZXR1cm4gb24gaW5wdXRcbiIpOworCQlDb3I0IHw9IENPUjRfSUdOQ1I7CisJfQorCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSUNSTkwgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJNYXAgY2FycmlhZ2UgcmV0dXJuIHRvIG5ld2xpbmUgb24gaW5wdXRcbiIpOworCQlDb3I0IHw9IENPUjRfSUNSTkw7CisJfQorCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElHTlBBUiApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIklnbm9yZSBjaGFyYWN0ZXJzIHdpdGggcGFyaXR5IGVycm9yc1xuIik7CisJCUNvcjQgfD0gQ09SNF9JR05QQVI7CisJfQorCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIFBBUk1SSyApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcmsgcGFyaXR5IGVycm9yc1xuIik7CisJCUNvcjQgfD0gQ09SNF9QQVJNUks7CisJfQorCisJLyoKKwkqKiBTZXQgdGhlIFJBSVNFTU9EIGZsYWcgdG8gZW5zdXJlIHRoYXQgdGhlIG1vZGVtIGxpbmVzIGFyZSByYWlzZWQKKwkqKiBvbiByZWNlcHRpb24gb2YgYSBjb25maWcgcGFja2V0LgorCSoqIFRoZSBkb3dubG9hZCBjb2RlIGhhbmRsZXMgdGhlIHplcm8gYmF1ZCBjb25kaXRpb24uCisJKi8KKwlDb3I0IHw9IENPUjRfUkFJU0VNT0Q7CisKKwkvKgorCSoqIENPUiA1CisJKi8KKworCUNvcjUgPSBDT1I1X0NNT0U7CisKKwkvKgorCSoqIFNldCB0byBtb25pdG9yIHRidXN5L3RzdG9wIChvciBub3QpLgorCSovCisKKwlpZiAoUG9ydFAtPk1vbml0b3JUc3RhdGUpCisJCUNvcjUgfD0gQ09SNV9UU1RBVEVfT047CisJZWxzZQorCQlDb3I1IHw9IENPUjVfVFNUQVRFX09GRjsKKworCS8qCisJKiogQ291bGQgc2V0IExORSBoZXJlIGlmIHlvdSB3YW50ZWQgTE5leHQgcHJvY2Vzc2luZy4gU1ZSNCB3aWxsIHVzZSBpdC4KKwkqLworCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElTVFJJUCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlN0cmlwIGlucHV0IGNoYXJhY3RlcnNcbiIpOworCQlpZiAoISAoUG9ydFAtPlN0YXRlICYgUklPX1RSSUFEX01PREUpKSB7CisJCQlDb3I1IHw9IENPUjVfSVNUUklQOworCQl9CisJfQorCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT05MQ1IgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJNYXAgbmV3bGluZSB0byBjYXJyaWFnZS1yZXR1cm4sIG5ld2xpbmUgb24gb3V0cHV0XG4iKTsKKwkJaWYgKCBQb3J0UC0+Q29va01vZGUgPT0gQ09PS19NRURJVU0gKQorCQkJQ29yNSB8PSBDT1I1X09OTENSOworCX0KKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPQ1JOTCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBjYXJyaWFnZSByZXR1cm4gdG8gbmV3bGluZSBvbiBvdXRwdXRcbiIpOworCQlpZiAoIFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX01FRElVTSApCisJCQlDb3I1IHw9IENPUjVfT0NSTkw7CisJfQorCWlmICggKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgVEFCRExZKSA9PSBUQUIzICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiVGFiIGRlbGF5IDMgc2V0XG4iKTsKKwkJaWYgKCBQb3J0UC0+Q29va01vZGUgPT0gQ09PS19NRURJVU0gKQorCQkJQ29yNSB8PSBDT1I1X1RBQjM7CisJfQorCisJLyoKKwkqKiBGbG93IGNvbnRyb2wgYnl0ZXMuCisJKi8KKwlUeFhvbiA9IFR0eVAtPnRlcm1pb3MtPmNfY2NbVlNUQVJUXTsKKwlUeFhvZmYgPSBUdHlQLT50ZXJtaW9zLT5jX2NjW1ZTVE9QXTsKKwlSeFhvbiA9IFR0eVAtPnRlcm1pb3MtPmNfY2NbVlNUQVJUXTsKKwlSeFhvZmYgPSBUdHlQLT50ZXJtaW9zLT5jX2NjW1ZTVE9QXTsKKwkvKgorCSoqIExORVhUIGJ5dGUKKwkqLworCUxOZXh0ID0gMDsKKworCS8qCisJKiogQmF1ZCByYXRlIGJ5dGVzCisJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFwcGluZyBvZiByeC90eCBiYXVkICV4ICgleClcbiIsIAorCQkJCSAgICAgVHR5UC0+dGVybWlvcy0+Y19jZmxhZywgQ0JBVUQpOworCisJc3dpdGNoIChUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpIHsKKyNkZWZpbmUgZShiKSBjYXNlIEIgIyMgYiA6IFJ4QmF1ZCA9IFR4QmF1ZCA9IFJJT19CICMjIGIgO2JyZWFrCisJICBlKDUwKTtlKDc1KTtlKDExMCk7ZSgxMzQpO2UoMTUwKTtlKDIwMCk7ZSgzMDApO2UoNjAwKTtlKDEyMDApOworCSAgZSgxODAwKTtlKDI0MDApO2UoNDgwMCk7ZSg5NjAwKTtlKDE5MjAwKTtlKDM4NDAwKTtlKDU3NjAwKTsKKwkgIGUoMTE1MjAwKTsgLyogZSgyMzA0MDApO2UoNDYwODAwKTsgZSg5MjE2MDApOyAgKi8KKwl9CisKKwkvKiBYWFggTUlzc2luZyBjb252ZXJzaW9uIHRhYmxlLiBYWFggKi8KKwkvKiAJIChUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgVl9DQkFVRCk7ICovCisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAidHggYmF1ZCAweCV4LCByeCBiYXVkIDB4JXhcbiIsIFR4QmF1ZCwgUnhCYXVkKTsKKworCisJLyoKKwkqKiBMZWZ0b3ZlcnMKKwkqLworCWlmICggVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIENSRUFEICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSByZWNlaXZlclxuIik7CisjaWZkZWYgUkNWMUVOCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgUkNWMUVOICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlJDVjFFTiAoPylcbiIpOworI2VuZGlmCisjaWZkZWYgWE1UMUVOCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgWE1UMUVOICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlhNVDFFTiAoPylcbiIpOworI2VuZGlmCisjaWYgMAorCWlmICggVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIExPQkxLICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkxPQkxLIC0gSkNMIG91dHB1dCBibG9ja3Mgd2hlbiBub3QgY3VycmVudFxuIik7CisjZW5kaWYKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBJU0lHICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIklucHV0IGNoYXJhY3RlciBzaWduYWwgZ2VuZXJhdGluZyBlbmFibGVkXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBJQ0FOT04gKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiQ2Fub25pY2FsIGlucHV0OiBlcmFzZSBhbmQga2lsbCBlbmFibGVkXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBYQ0FTRSApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJDYW5vbmljYWwgdXBwZXIvbG93ZXIgcHJlc2VudGF0aW9uXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBFQ0hPICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBpbnB1dCBlY2hvXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBFQ0hPRSApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgZWNobyBlcmFzZVxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgRUNIT0sgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIGVjaG8ga2lsbFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgRUNIT05MICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBlY2hvIG5ld2xpbmVcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIE5PRkxTSCApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJEaXNhYmxlIGZsdXNoIGFmdGVyIGludGVycnVwdCBvciBxdWl0XG4iKTsKKyNpZmRlZiBUT1NUT1AKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBUT1NUT1AgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiU2VuZCBTSUdUVE9VIGZvciBiYWNrZ3JvdW5kIG91dHB1dFxuIik7CisjZW5kaWYKKyNpZmRlZiBYQ0xVREUKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBYQ0xVREUgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRXhjbHVzaXZlIHVzZSBvZiB0aGlzIGxpbmVcbiIpOworI2VuZGlmCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVVDTEMgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFwIHVwcGVyY2FzZSB0byBsb3dlcmNhc2Ugb24gaW5wdXRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9QT1NUICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBvdXRwdXQgcG9zdC1wcm9jZXNzaW5nXG4iKTsKKwlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPTENVQyApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJNYXAgbG93ZXJjYXNlIHRvIHVwcGVyY2FzZSBvbiBvdXRwdXRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9OT0NSICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk5vIGNhcnJpYWdlIHJldHVybiBvdXRwdXQgYXQgY29sdW1uIDBcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9OTFJFVCApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJOZXdsaW5lIHBlcmZvcm1zIGNhcnJpYWdlIHJldHVybiBmdW5jdGlvblxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT0ZJTEwgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiVXNlIGZpbGwgY2hhcmFjdGVycyBmb3IgZGVsYXlcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9GREVMICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkZpbGwgY2hhcmFjdGVyIGlzIERFTFxuIik7CisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgTkxETFkgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTmV3bGluZSBkZWxheSBzZXRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIENSRExZICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkNhcnJpYWdlIHJldHVybiBkZWxheSBzZXRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIFRBQkRMWSApCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJUYWIgZGVsYXkgc2V0XG4iKTsKKyNpZiAwCisJaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgQlNETFkgKQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiQmFjay1zcGFjZSBkZWxheSBzZXRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIFZURExZICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlZlcnRpY2FsIHRhYiBkZWxheSBzZXRcbiIpOworCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIEZGRExZICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkZvcm0tZmVlZCBkZWxheSBzZXRcbiIpOworI2VuZGlmCisJLyoKKwkqKiBUaGVzZSB0aGluZ3MgYXJlIGtpbmQgb2YgdXNlZnVsIGluIGEgbGF0ZXIgbGlmZSEKKwkqLworCVBvcnRQLT5Db3IyQ29weSA9IENvcjI7CisKKwlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgeworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWZ1bmNfZXhpdCAoKTsKKworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCisJLyoKKwkqKiBBY3R1YWxseSB3cml0ZSB0aGUgaW5mbyBpbnRvIHRoZSBwYWNrZXQgdG8gYmUgc2VudAorCSovCisJV0JZVEUocGhiX3BhcmFtX3B0ci0+Q21kLAljbWQpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjEsCSBDb3IxKTsKKwlXQllURShwaGJfcGFyYW1fcHRyLT5Db3IyLAkgQ29yMik7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+Q29yNCwJIENvcjQpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjUsCSBDb3I1KTsKKwlXQllURShwaGJfcGFyYW1fcHRyLT5UeFhvbiwJVHhYb24pOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPlJ4WG9uLAlSeFhvbik7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+VHhYb2ZmLCBUeFhvZmYpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPlJ4WG9mZiwgUnhYb2ZmKTsKKwlXQllURShwaGJfcGFyYW1fcHRyLT5MTmV4dCwJTE5leHQpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPlR4QmF1ZCwgVHhCYXVkKTsKKwlXQllURShwaGJfcGFyYW1fcHRyLT5SeEJhdWQsIFJ4QmF1ZCk7CisKKwkvKgorCSoqIFNldCB0aGUgbGVuZ3RoL2NvbW1hbmQgZmllbGQKKwkqLworCVdCWVRFKFBhY2tldFAtPmxlbiAsIDEyIHwgUEtUX0NNRF9CSVQpOworCisJLyoKKwkqKiBUaGUgcGFja2V0IGlzIGZvcm1lZCAtIG5vdywgd2hhY2sgaXQgb2ZmCisJKiogdG8gaXRzIGZpbmFsIGRlc3RpbmF0aW9uOgorCSovCisJYWRkX3RyYW5zbWl0KFBvcnRQKTsKKwkvKgorCSoqIENvdW50IGNoYXJhY3RlcnMgdHJhbnNtaXR0ZWQgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkqLworCWlmIChQb3J0UC0+c3RhdHNHYXRoZXIpCisJCVBvcnRQLT50eGNoYXJzICs9IDEyOworCisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgImFkZF90cmFuc21pdCByZXR1cm5lZC5cbiIpOworCS8qCisJKiogam9iIGRvbmUuCisJKi8KKwlmdW5jX2V4aXQgKCk7CisKKwlyZXR1cm4gUklPX1NVQ0NFU1M7Cit9CisKKworLyoKKyoqIFdlIGNhbiBhZGQgYW5vdGhlciBwYWNrZXQgdG8gYSB0cmFuc21pdCBxdWV1ZSBpZiB0aGUgcGFja2V0IHBvaW50ZXIgcG9pbnRlZAorKiogdG8gYnkgdGhlIFR4QWRkIHBvaW50ZXIgaGFzIFBLVF9JTl9VU0UgY2xlYXIgaW4gaXRzIGFkZHJlc3MuCisqLworaW50CitjYW5fYWRkX3RyYW5zbWl0KFBrdFAsIFBvcnRQKQorUEtUICoqUGt0UDsKK3N0cnVjdCBQb3J0ICpQb3J0UDsgCit7CisJcmVnaXN0ZXIgUEtUICp0cDsKKworCSpQa3RQID0gdHAgPSAoUEtUICopUklPX1BUUihQb3J0UC0+Q2FkZHIsUldPUkQoKlBvcnRQLT5UeEFkZCkpOworCisJcmV0dXJuICEoKHVpbnQpdHAgJiBQS1RfSU5fVVNFKTsKK30KKworLyoKKyoqIFRvIGFkZCBhIHBhY2tldCB0byB0aGUgcXVldWUsIHlvdSBzZXQgdGhlIFBLVF9JTl9VU0UgYml0IGluIHRoZSBhZGRyZXNzLAorKiogYW5kIHRoZW4gbW92ZSB0aGUgVHhBZGQgcG9pbnRlciBhbG9uZyBvbmUgcG9zaXRpb24gdG8gcG9pbnQgdG8gdGhlIG5leHQKKyoqIHBhY2tldCBwb2ludGVyLiBZb3UgbXVzdCB3cmFwIHRoZSBwb2ludGVyIGZyb20gdGhlIGVuZCBiYWNrIHRvIHRoZSBzdGFydC4KKyovCit2b2lkCithZGRfdHJhbnNtaXQoUG9ydFApCitzdHJ1Y3QgUG9ydCAqUG9ydFA7IAoreworICBpZiAoUldPUkQoKlBvcnRQLT5UeEFkZCkgJiBQS1RfSU5fVVNFKSB7CisgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgImFkZF90cmFuc21pdDogUGFja2V0IGhhcyBiZWVuIHN0b2xlbiEiKTsKKyAgfQorCVdXT1JEKCAqKHVzaG9ydCAqKVBvcnRQLT5UeEFkZCwgUldPUkQoKlBvcnRQLT5UeEFkZCkgfCBQS1RfSU5fVVNFKTsKKwlQb3J0UC0+VHhBZGQgPSAoUG9ydFAtPlR4QWRkID09IFBvcnRQLT5UeEVuZCkgPyBQb3J0UC0+VHhTdGFydCA6IAorCQkJCQlQb3J0UC0+VHhBZGQgKyAxOworCVdXT1JEKCBQb3J0UC0+UGhiUC0+dHhfYWRkICwgUklPX09GRihQb3J0UC0+Q2FkZHIsUG9ydFAtPlR4QWRkKSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHV0IGEgcGFja2V0IG9udG8gdGhlIGVuZCBvZiB0aGUKKyAqIGZyZWUgbGlzdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitwdXRfZnJlZV9lbmQoSG9zdFAsIFBrdFApCitzdHJ1Y3QgSG9zdCAqSG9zdFA7CitQS1QgKlBrdFA7Cit7CisJRlJFRV9MSVNUICp0bXBfcG9pbnRlcjsKKwl1c2hvcnQgb2xkX2VuZCwgbmV3X2VuZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZIb3N0UC0+SG9zdExvY2ssIGZsYWdzKTsKKworCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSogUHV0IGEgcGFja2V0IGJhY2sgb250byB0aGUgYmFjayBvZiB0aGUgZnJlZSBsaXN0CisJKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEZFLCAgInB1dF9mcmVlX2VuZChQa3RQPSV4KVxuIiwoaW50KVBrdFApOworCisJaWYgKChvbGRfZW5kPVJXT1JEKEhvc3RQLT5QYXJtTWFwUC0+ZnJlZV9saXN0X2VuZCkpICE9IFRQTlVMTCkgeworCQluZXdfZW5kID0gUklPX09GRihIb3N0UC0+Q2FkZHIsUGt0UCk7CisJCXRtcF9wb2ludGVyID0gKEZSRUVfTElTVCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLG9sZF9lbmQpOworCQlXV09SRCh0bXBfcG9pbnRlci0+bmV4dCAsIG5ld19lbmQgKTsKKwkJV1dPUkQoKChGUkVFX0xJU1QgKilQa3RQKS0+cHJldiAsIG9sZF9lbmQpOworCQlXV09SRCgoKEZSRUVfTElTVCAqKVBrdFApLT5uZXh0ICwgVFBOVUxMKTsKKwkJV1dPUkQoSG9zdFAtPlBhcm1NYXBQLT5mcmVlX2xpc3RfZW5kLCBuZXdfZW5kKTsKKwl9CisJZWxzZSB7CS8qIEZpcnN0IHBhY2tldCBvbiB0aGUgZnJlZSBsaXN0IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QRkUsICJwdXRfZnJlZV9lbmQoKTogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuXG4iKTsKKwkJV1dPUkQoSG9zdFAtPlBhcm1NYXBQLT5mcmVlX2xpc3RfZW5kICwgUklPX09GRihIb3N0UC0+Q2FkZHIsUGt0UCkpOworCQl0bXBfcG9pbnRlciA9IChGUkVFX0xJU1QgKilQa3RQOworCQlXV09SRCh0bXBfcG9pbnRlci0+cHJldiAsIFRQTlVMTCk7CisJCVdXT1JEKHRtcF9wb2ludGVyLT5uZXh0ICwgVFBOVUxMKTsKKwl9CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJCZWZvcmUgdW5sb2NrOiAlcFxuIiwgJkhvc3RQLT5Ib3N0TG9jayk7CisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkhvc3RQLT5Ib3N0TG9jaywgZmxhZ3MpOworfQorCisvKgorKiogY2FuX3JlbW92ZV9yZWNlaXZlKFBrdFAsUCkgcmV0dXJucyBub24temVybyBpZiBQS1RfSU5fVVNFIGlzIHNldAorKiogZm9yIHRoZSBuZXh0IHBhY2tldCBvbiB0aGUgcXVldWUuIEl0IHdpbGwgYWxzbyBzZXQgUGt0UCB0byBwb2ludCB0byB0aGUKKyoqIHJlbGV2YW50IHBhY2tldCwgW2hhdmluZyBjbGVhcmVkIHRoZSBQS1RfSU5fVVNFIGJpdF0uIElmIFBLVF9JTl9VU0UgaXMgY2xlYXIsCisqKiB0aGVuIGNhbl9yZW1vdmVfcmVjZWl2ZSgpIHJldHVybnMgMC4KKyovCitpbnQKK2Nhbl9yZW1vdmVfcmVjZWl2ZShQa3RQLCBQb3J0UCkKK1BLVCAqKlBrdFA7CitzdHJ1Y3QgUG9ydCAqUG9ydFA7Cit7CisJaWYgKCBSV09SRCgqUG9ydFAtPlJ4UmVtb3ZlKSAmIFBLVF9JTl9VU0UpIHsKKwkJKlBrdFAgPSAoUEtUICopUklPX1BUUihQb3J0UC0+Q2FkZHIsCisJCQkJCVJXT1JEKCpQb3J0UC0+UnhSZW1vdmUpICYgflBLVF9JTl9VU0UpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisqKiBUbyByZW1vdmUgYSBwYWNrZXQgZnJvbSB0aGUgcmVjZWl2ZSBxdWV1ZSB5b3UgY2xlYXIgaXRzIFBLVF9JTl9VU0UgYml0LAorKiogYW5kIHRoZW4gYnVtcCB0aGUgcG9pbnRlcnMuIE9uY2UgdGhlIHBvaW50ZXJzIGdldCB0byB0aGUgZW5kLCB0aGV5IG11c3QKKyoqIGJlIHdyYXBwZWQgYmFjayB0byB0aGUgc3RhcnQuCisqLwordm9pZAorcmVtb3ZlX3JlY2VpdmUoUG9ydFApCitzdHJ1Y3QgUG9ydCAqUG9ydFA7IAoreworCVdXT1JEKCAqUG9ydFAtPlJ4UmVtb3ZlLCBSV09SRCgqUG9ydFAtPlJ4UmVtb3ZlKSAmIH5QS1RfSU5fVVNFICk7CisJUG9ydFAtPlJ4UmVtb3ZlID0gKFBvcnRQLT5SeFJlbW92ZSA9PSBQb3J0UC0+UnhFbmQpID8gUG9ydFAtPlJ4U3RhcnQgOiAKKwkJCQkJCQkJUG9ydFAtPlJ4UmVtb3ZlICsgMTsKKwlXV09SRCggUG9ydFAtPlBoYlAtPnJ4X3JlbW92ZSAsIFJJT19PRkYoUG9ydFAtPkNhZGRyLCBQb3J0UC0+UnhSZW1vdmUpICk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BjaWNvcHkuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcGNpY29weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTk5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BjaWNvcHkuYwpAQCAtMCwwICsxLDggQEAKKworLyogWWVhaC4gV2UgaGF2ZSBjb3B5cmlnaHQgb24gdGhpcyBvbmUuIFN1cmUuICovCisKK3ZvaWQgcmlvX3BjaWNvcHkoIGNoYXIgKmZyb20sIGNoYXIgKnRvLCBpbnQgYW1vdW50KQoreworICB3aGlsZSAoIGFtb3VudC0tICkKKyAgICAqdG8rKyA9ICpmcm9tKys7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3JvdXRlLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3JvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2YjMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcm91dGUuYwpAQCAtMCwwICsxLDEyMzggQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb3JvdXRlLmMKKyoqCVNJRAkJOiAxLjMKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDEwOjMzOjQ2CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDEwOjMzOjUwCisqKgorKiogIGlkZW50IEAoIylyaW9yb3V0ZS5jCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb3JvdXRlX2Nfc2Njc18gPSAiQCgjKXJpb3JvdXRlLmMJMS4zIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKworI2luY2x1ZGUgImxpbnV4X2NvbXBhdC5oIgorI2luY2x1ZGUgInJpb19saW51eC5oIgorI2luY2x1ZGUgInR5cGRlZi5oIgorI2luY2x1ZGUgInBrdC5oIgorI2luY2x1ZGUgImRhZW1vbi5oIgorI2luY2x1ZGUgInJpby5oIgorI2luY2x1ZGUgInJpb3NwYWNlLmgiCisjaW5jbHVkZSAidG9wLmgiCisjaW5jbHVkZSAiY21kcGt0LmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAicmlvdHlwZXMuaCIKKyNpbmNsdWRlICJydXAuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmlvZHJ2ci5oIgorI2luY2x1ZGUgInJpb2luZm8uaCIKKyNpbmNsdWRlICJmdW5jLmgiCisjaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyNpbmNsdWRlICJwYXJtbWFwLmgiCisjaW5jbHVkZSAidW5peHJ1cC5oIgorI2luY2x1ZGUgImJvYXJkLmgiCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAicGhiLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgImNtZGJsay5oIgorI2luY2x1ZGUgInJvdXRlLmgiCisjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgImNpcnJ1cy5oIgorI2luY2x1ZGUgInJpb2lvY3RsLmgiCisjaW5jbHVkZSAicGFyYW0uaCIKKyNpbmNsdWRlICJsaXN0LmgiCisjaW5jbHVkZSAic2FtLmgiCisKK3N0YXRpYyBpbnQgUklPQ2hlY2tJc29sYXRlZChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCk7CitzdGF0aWMgaW50IFJJT0lzb2xhdGUoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBIb3N0ICosIHVpbnQpOworc3RhdGljIGludCBSSU9DaGVjayhzdHJ1Y3QgSG9zdCAqLCB1aW50KTsKK3N0YXRpYyB2b2lkIFJJT0NvbkNvbihzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCwgdWludCwgdWludCwgdWludCwgaW50KTsKKworCisvKgorKiogSW5jb21pbmcgb24gdGhlIFJPVVRFX1JVUAorKiogSSB3cm90ZSB0aGlzIHdoaWxlIEkgd2FzIHRpcmVkLiBGb3JnaXZlIG1lLgorKi8KK2ludCBSSU9Sb3V0ZVJ1cCggc3RydWN0IHJpb19pbmZvICpwLCB1aW50IFJ1cCwgc3RydWN0IEhvc3QgKkhvc3RQLCBQS1QgKlBhY2tldFAgKQoreworICBzdHJ1Y3QgUGt0Q21kICpQa3RDbWRQID0gKHN0cnVjdCBQa3RDbWQgKilQYWNrZXRQLT5kYXRhOworICBzdHJ1Y3QgUGt0Q21kX00gKlBrdFJlcGx5UDsKKyAgc3RydWN0IENtZEJsayAqQ21kQmxrUDsKKyAgc3RydWN0IFBvcnQgKlBvcnRQOworICBzdHJ1Y3QgTWFwICpNYXBQOworICBzdHJ1Y3QgVG9wICpUb3BQOworICBpbnQgVGhpc0xpbmssIFRoaXNMaW5rTWluLCBUaGlzTGlua01heDsKKyAgaW50IHBvcnQ7CisgIGludCBNb2QsIE1vZDEsIE1vZDI7CisgIHVzaG9ydCBSdGFUeXBlOworICB1aW50IFJ0YVVuaXE7CisgIHVpbnQgVGhpc1VuaXQsIFRoaXNVbml0MjsJLyogMiBpZHMgdG8gYWNjb21tb2RhdGUgMTYgcG9ydCBSVEEgKi8KKyAgdWludCBPbGRVbml0LCBOZXdVbml0LCBPbGRMaW5rLCBOZXdMaW5rOworICBjaGFyICpNeVR5cGUsICpNeU5hbWU7CisgIGludCBMaWVzOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgU1RBQ0sKKyAgICBSSU9TdGFja0NoZWNrKCJSSU9Sb3V0ZVJ1cCIpOworI2VuZGlmCisjaWZkZWYgQ0hFQ0sKKyAgICBDaGVja1BhY2tldFAoUGFja2V0UCk7CisgICAgQ2hlY2tIb3N0UChIb3N0UCk7CisgICAgQ2hlY2tSdXAoUnVwKTsKKyAgICBDaGVja0hvc3QoSG9zdCk7CisjZW5kaWYKKyAgLyoKKyAgKiogSXMgdGhpcyB1bml0IHRlbGxpbmcgdXMgaXQncyBjdXJyZW50IGxpbmsgdG9wb2xvZ3k/CisgICovCisgIGlmICggUkJZVEUoUGt0Q21kUC0+Q29tbWFuZCkgPT0gUk9VVEVfVE9QT0xPR1kgKQorICB7CisgICAgTWFwUCA9IEhvc3RQLT5NYXBwaW5nOworCisgICAgLyoKKyAgICAqKiBUaGUgcGFja2V0IGNhbiBiZSBzZW50IGVpdGhlciBieSB0aGUgaG9zdCBvciBieSBhbiBSVEEuCisgICAgKiogSWYgaXQgY29tZXMgZnJvbSB0aGUgaG9zdCwgdGhlbiB3ZSBuZWVkIHRvIGZpbGwgaW4gdGhlCisgICAgKiogVG9wb2xvZ3kgYXJyYXkgaW4gdGhlIGhvc3Qgc3RydWN0dXJlLiBJZiBpdCBjYW1lIGluCisgICAgKiogZnJvbSBhbiBSVEEgdGhlbiB3ZSBuZWVkIHRvIGZpbGwgaW4gdGhlIE1hcHBpbmcgc3RydWN0dXJlJ3MKKyAgICAqKiBUb3BvbG9neSBhcnJheSBmb3IgdGhlIHVuaXQuCisgICAgKi8KKyAgICBpZiAoIFJ1cCA+PSAodXNob3J0KU1BWF9SVVAgKQorICAgIHsKKyAgICAgIFRoaXNVbml0ID0gSE9TVF9JRDsKKyAgICAgIFRvcFAgPSBIb3N0UC0+VG9wb2xvZ3k7CisgICAgICBNeVR5cGUgPSAiSG9zdCI7CisgICAgICBNeU5hbWUgPSBIb3N0UC0+TmFtZTsKKyAgICAgIFRoaXNMaW5rTWluID0gVGhpc0xpbmtNYXggPSBSdXAgLSBNQVhfUlVQOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgVGhpc1VuaXQgPSBSdXArMTsKKyAgICAgIFRvcFAgPSBIb3N0UC0+TWFwcGluZ1tSdXBdLlRvcG9sb2d5OworICAgICAgTXlUeXBlID0gIlJUQSI7CisgICAgICBNeU5hbWUgPSBIb3N0UC0+TWFwcGluZ1tSdXBdLk5hbWU7CisgICAgICBUaGlzTGlua01pbiA9IDA7CisgICAgICBUaGlzTGlua01heCA9IExJTktTX1BFUl9VTklUIC0gMTsKKyAgICB9CisKKyAgICAvKgorICAgICoqIExpZXMgd2lsbCBub3QgYmUgdG9sZXJhdGVkLgorICAgICoqIElmIGFueSBwYWlyIG9mIGxpbmtzIGNsYWltIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgc2FtZQorICAgICoqIHBsYWNlLCB0aGVuIGlnbm9yZSB0aGlzIHBhY2tldCBjb21wbGV0ZWx5LgorICAgICovCisgICAgTGllcyA9IDA7CisgICAgZm9yICggVGhpc0xpbms9VGhpc0xpbmtNaW4gKyAxOyBUaGlzTGluayA8PSBUaGlzTGlua01heDsgVGhpc0xpbmsrKykKKyAgICB7CisgICAgICAvKgorICAgICAgKiogaXQgd29uJ3QgbGllIGFib3V0IG5ldHdvcmsgaW50ZXJjb25uZWN0LCB0b3RhbCBkaXNjb25uZWN0cworICAgICAgKiogYW5kIG5vLUlEcy4gKG9yIGF0IGxlYXN0LCBpdCBkb2Vzbid0ICptYXR0ZXIqIGlmIGl0IGRvZXMpCisgICAgICAqLworICAgICAgaWYgKCBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W1RoaXNMaW5rXS5Vbml0KSA+ICh1c2hvcnQpTUFYX1JVUCApCisJICBjb250aW51ZTsKKworICAgICAgZm9yICggTmV3TGluaz1UaGlzTGlua01pbjsgTmV3TGluayA8IFRoaXNMaW5rOyBOZXdMaW5rKysgKQorICAgICAgeworICAgICAgICBpZiAoIChSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W1RoaXNMaW5rXS5Vbml0KSA9PQorICAgICAgICAgICAgICBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W05ld0xpbmtdLlVuaXQpKSAmJgorCSAgICAgKFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLkxpbmspID09CisgICAgICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbTmV3TGlua10uTGluaykpICkKKwl7CisgICAgICAgICAgTGllcysrOworCX0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIExpZXMgKQorICAgIHsKKyAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJMSUVTISBEQU1OIExJRVMhICVkIExJRVMhXG4iLExpZXMpOworICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIiVkOiVjICVkOiVjICVkOiVjICVkOiVjXG4iLAorICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbMF0uVW5pdCksIAorCSAgJ0EnK1JCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbMF0uTGluayksCisgICAgICAgICAgUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVsxXS5Vbml0KSwKKwkgICdBJytSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzFdLkxpbmspLAorICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbMl0uVW5pdCksCisJICAnQScrUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVsyXS5MaW5rKSwKKyAgICAgICAgICBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzNdLlVuaXQpLAorCSAgJ0EnK1JCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbM10uTGluaykpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLyoKKyAgICAqKiBub3csIHByb2Nlc3MgZWFjaCBsaW5rLgorICAgICovCisgICAgZm9yICggVGhpc0xpbms9VGhpc0xpbmtNaW47IFRoaXNMaW5rIDw9IFRoaXNMaW5rTWF4OyBUaGlzTGluaysrKQorICAgIHsKKyAgICAgIC8qCisgICAgICAqKiB0aGlzIGlzIHdoYXQgaXQgd2FzIGNvbm5lY3RlZCB0bworICAgICAgKi8KKyAgICAgIE9sZFVuaXQgPSBUb3BQW1RoaXNMaW5rXS5Vbml0OworICAgICAgT2xkTGluayA9IFRvcFBbVGhpc0xpbmtdLkxpbms7CisKKyAgICAgIC8qCisgICAgICAqKiB0aGlzIGlzIHdoYXQgaXQgaXMgbm93IGNvbm5lY3RlZCB0bworICAgICAgKi8KKyAgICAgIE5ld1VuaXQgPSBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W1RoaXNMaW5rXS5Vbml0KTsKKyAgICAgIE5ld0xpbmsgPSBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W1RoaXNMaW5rXS5MaW5rKTsKKworICAgICAgaWYgKCBPbGRVbml0ICE9IE5ld1VuaXQgfHwgT2xkTGluayAhPSBOZXdMaW5rICkKKyAgICAgIHsKKwkvKgorCSoqIHNvbWV0aGluZyBoYXMgY2hhbmdlZCEKKwkqLworCisgICAgICAgIGlmICggTmV3VW5pdCA+IE1BWF9SVVAgJiYKKwkgICAgIE5ld1VuaXQgIT0gUk9VVEVfRElTQ09OTkVDVCAmJgorCSAgICAgTmV3VW5pdCAhPSBST1VURV9OT19JRCAmJgorCSAgICAgTmV3VW5pdCAhPSBST1VURV9JTlRFUkNPTk5FQ1QgKQorCXsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkkgaGF2ZSBhIGxpbmsgZnJvbSAlcyAlcyB0byB1bml0ICVkOiVkIC0gSSBkb24ndCBsaWtlIGl0LlxuIiwKKwkJICBNeVR5cGUsCisJCSAgTXlOYW1lLAorCQkgIE5ld1VuaXQsCisJCSAgTmV3TGluayk7CisJfQorCWVsc2UKKwl7CisJICAvKgorCSAgKiogcHV0IHRoZSBuZXcgdmFsdWVzIGluCisJICAqLworCSAgVG9wUFtUaGlzTGlua10uVW5pdCA9IE5ld1VuaXQ7CisJICBUb3BQW1RoaXNMaW5rXS5MaW5rID0gTmV3TGluazsKKworCSAgUklPU2V0Q2hhbmdlKHApOworCisJICBpZiAoIE9sZFVuaXQgPD0gTUFYX1JVUCApCisJICB7CisJICAgIC8qCisJICAgICoqIElmIHNvbWV0aGluZyBoYXMgYmVjb21lIGJ1c3QsIHRoZW4gcmUtZW5hYmxlIHRoZW0gbWVzc2FnZXMKKwkgICAgKi8KKwkgICAgaWYgKCEgcC0+UklPTm9NZXNzYWdlKQorCQlSSU9Db25Db24ocCxIb3N0UCxUaGlzVW5pdCxUaGlzTGluayxPbGRVbml0LE9sZExpbmssRElTQ09OTkVDVCk7CisJICB9CisKKwkgIGlmICggKCBOZXdVbml0IDw9IE1BWF9SVVAgKSAmJiAhcC0+UklPTm9NZXNzYWdlICkKKwkgICAgUklPQ29uQ29uKHAsSG9zdFAsVGhpc1VuaXQsVGhpc0xpbmssTmV3VW5pdCxOZXdMaW5rLENPTk5FQ1QpOworCisJICBpZiAoIE5ld1VuaXQgPT0gUk9VVEVfTk9fSUQgKQorCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiJXMgJXMgKCVjKSBpcyBjb25uZWN0ZWQgdG8gYW4gdW5jb25maWd1cmVkIHVuaXQuXG4iLAorCQkgICAgTXlUeXBlLE15TmFtZSwnQScrVGhpc0xpbmspOworCisJICBpZiAoIE5ld1VuaXQgPT0gUk9VVEVfSU5URVJDT05ORUNUICkKKwkgIHsKKwkgICAgaWYgKCEgcC0+UklPTm9NZXNzYWdlKQorCQljcHJpbnRmKCIlcyAnJXMnICglYykgaXMgY29ubmVjdGVkIHRvIGFub3RoZXIgbmV0d29yay5cbiIsIE15VHlwZSxNeU5hbWUsJ0EnK1RoaXNMaW5rKTsKKwkgIH0KKworCSAgLyoKKwkgICoqIHBlcmZvcm0gYW4gdXBkYXRlIGZvciAndGhlIG90aGVyIGVuZCcsIHNvIHRoYXQgdGhlc2UgbWVzc2FnZXMKKwkgICoqIG9ubHkgYXBwZWFycyBvbmNlLiBPbmx5IGRpc2Nvbm5lY3QgdGhlIG90aGVyIGVuZCBpZiBpdCBpcyBwb2ludGluZworCSAgKiogYXQgdXMhCisJICAqLworCSAgaWYgKCBPbGRVbml0ID09IEhPU1RfSUQgKQorCSAgeworCSAgICBpZiAoIEhvc3RQLT5Ub3BvbG9neVtPbGRMaW5rXS5Vbml0ID09IFRoaXNVbml0ICYmCisJCSBIb3N0UC0+VG9wb2xvZ3lbT2xkTGlua10uTGluayA9PSBUaGlzTGluayApCisJICAgIHsKKwkgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiU0VUVElORyBIT1NUICglYykgVE8gRElTQ09OTkVDVEVEIVxuIiwgT2xkTGluaysnQScpOworCSAgICAgIEhvc3RQLT5Ub3BvbG9neVtPbGRMaW5rXS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKKwkgICAgICBIb3N0UC0+VG9wb2xvZ3lbT2xkTGlua10uTGluayA9IE5PX0xJTks7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkhPU1QoJWMpIFdBUyBOT1QgQ09OTkVDVEVEIFRPICVzICglYykhXG4iLAorCQkgICAgT2xkTGluaysnQScsSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQtMV0uTmFtZSxUaGlzTGluaysnQScpOworCSAgICB9CisJICB9CisJICBlbHNlIGlmICggT2xkVW5pdCA8PSBNQVhfUlVQICkKKwkgIHsKKwkgICAgaWYgKCBIb3N0UC0+TWFwcGluZ1tPbGRVbml0LTFdLlRvcG9sb2d5W09sZExpbmtdLlVuaXQgPT0gVGhpc1VuaXQgJiYKKwkgICAgICAgICBIb3N0UC0+TWFwcGluZ1tPbGRVbml0LTFdLlRvcG9sb2d5W09sZExpbmtdLkxpbmsgPT0gVGhpc0xpbmsgKQorCSAgICB7CisJICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlNFVFRJTkcgUlRBICVzICglYykgVE8gRElTQ09OTkVDVEVEIVxuIiwKKwkJCQkgICBIb3N0UC0+TWFwcGluZ1tPbGRVbml0LTFdLk5hbWUsT2xkTGluaysnQScpOworCSAgICAgIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQtMV0uVG9wb2xvZ3lbT2xkTGlua10uVW5pdD1ST1VURV9ESVNDT05ORUNUOworCSAgICAgIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQtMV0uVG9wb2xvZ3lbT2xkTGlua10uTGluaz1OT19MSU5LOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSVEEgJXMgKCVjKSBXQVMgTk9UIENPTk5FQ1RFRCBUTyAlcyAoJWMpXG4iLAorCQkJICAgIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQtMV0uTmFtZSxPbGRMaW5rKydBJywKKwkJCSAgICBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdC0xXS5OYW1lLFRoaXNMaW5rKydBJyk7CisJICAgIH0KKwkgIH0KKwkgIGlmICggTmV3VW5pdCA9PSBIT1NUX0lEICkKKwkgIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIk1BUktJTkcgSE9TVCAoJWMpIENPTk5FQ1RFRCBUTyAlcyAoJWMpXG4iLAorCQkJCU5ld0xpbmsrJ0EnLE15TmFtZSxUaGlzTGluaysnQScpOworCSAgICBIb3N0UC0+VG9wb2xvZ3lbTmV3TGlua10uVW5pdCA9IFRoaXNVbml0OworCSAgICBIb3N0UC0+VG9wb2xvZ3lbTmV3TGlua10uTGluayA9IFRoaXNMaW5rOworCSAgfQorCSAgZWxzZSBpZiAoIE5ld1VuaXQgPD0gTUFYX1JVUCApCisJICB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJNQVJLSU5HIFJUQSAlcyAoJWMpIENPTk5FQ1RFRCBUTyAlcyAoJWMpXG4iLAorCSAgICAgIEhvc3RQLT5NYXBwaW5nW05ld1VuaXQtMV0uTmFtZSxOZXdMaW5rKydBJyxNeU5hbWUsVGhpc0xpbmsrJ0EnKTsKKwkgICAgSG9zdFAtPk1hcHBpbmdbTmV3VW5pdC0xXS5Ub3BvbG9neVtOZXdMaW5rXS5Vbml0PVRoaXNVbml0OworCSAgICBIb3N0UC0+TWFwcGluZ1tOZXdVbml0LTFdLlRvcG9sb2d5W05ld0xpbmtdLkxpbms9VGhpc0xpbms7CisJICB9CisJfQorCVJJT1NldENoYW5nZShwKTsKKwlSSU9DaGVja0lzb2xhdGVkKHAsIEhvc3RQLCBPbGRVbml0ICk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyoKKyAgKiogVGhlIG9ubHkgb3RoZXIgY29tbWFuZCB3ZSByZWNvZ25pc2UgaXMgYSByb3V0ZV9yZXF1ZXN0IGNvbW1hbmQKKyAgKi8KKyAgaWYgKCBSQllURShQa3RDbWRQLT5Db21tYW5kKSAhPSBST1VURV9SRVFVRVNUICkKKyAgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJVbmtub3duIGNvbW1hbmQgJWQgcmVjZWl2ZWQgb24gcnVwICVkIGhvc3QgJWQgUk9VVEVfUlVQXG4iLCAKKwkgICBSQllURShQa3RDbWRQLT5Db21tYW5kKSxSdXAsKGludClIb3N0UCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgICAgIAorICBSdGFVbmlxID0gKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bMF0pKSArCisJICAgIChSQllURShQa3RDbWRQLT5VbmlxTnVtWzFdKSA8PCA4KSArCisJICAgIChSQllURShQa3RDbWRQLT5VbmlxTnVtWzJdKSA8PCAxNikgKworCSAgICAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVszXSkgPDwgMjQpOworCisgIC8qCisgICoqIERldGVybWluZSBpZiA4IG9yIDE2IHBvcnQgUlRBCisgICovCisgIFJ0YVR5cGUgPSBHZXRVbml0VHlwZShSdGFVbmlxKTsKKworICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUmVjZWl2ZWQgYSByZXF1ZXN0IGZvciBhbiBJRCBmb3Igc2VyaWFsIG51bWJlciAleFxuIiwgUnRhVW5pcSk7CisKKyAgTW9kID0gUkJZVEUoUGt0Q21kUC0+TW9kdWxlVHlwZXMpOworICBNb2QxID0gTE9OWUJMRShNb2QpOworICBpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQorICB7CisgICAgLyoKKyAgICAqKiBPbmx5IG9uZSBpZGVudCBpcyBzZXQgZm9yIGEgMTYgcG9ydCBSVEEuIFRvIG1ha2UgY29tcGF0aWJsZQorICAgICoqIHdpdGggOCBwb3J0LCBzZXQgMm5kIGlkZW50IGluIE1vZDIgdG8gdGhlIHNhbWUgYXMgTW9kMS4KKyAgICAqLworICAgIE1vZDIgPSBNb2QxOworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJCYWNrcGxhbmUgdHlwZSBpcyAlcyAoYWxsIHBvcnRzKVxuIiwKKyAgICAgcC0+UklPTW9kdWxlVHlwZXNbTW9kMV0uTmFtZSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgTW9kMiA9IEhJTllCTEUoTW9kKTsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiTW9kdWxlIHR5cGVzIGFyZSAlcyAocG9ydHMgMC0zKSBhbmQgJXMgKHBvcnRzIDQtNylcbiIsCisgICAgIHAtPlJJT01vZHVsZVR5cGVzW01vZDFdLk5hbWUsIHAtPlJJT01vZHVsZVR5cGVzW01vZDJdLk5hbWUpOworICB9CisKKyAgaWYgKCBSdGFVbmlxID09IDB4ZmZmZmZmZmYgKQorICB7CisgICAgICBTaG93UGFja2V0KCBEQkdfU1BFQ0lBTCwgUGFja2V0UCApOworICB9CisKKyAgLyoKKyAgKiogdHJ5IHRvIHVuaG9vayBhIGNvbW1hbmQgYmxvY2sgZnJvbSB0aGUgY29tbWFuZCBmcmVlIGxpc3QuCisgICovCisgIGlmICggIShDbWRCbGtQID0gUklPR2V0Q21kQmxrKCkpICkKKyAgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJObyBjb21tYW5kIGJsb2NrcyB0byByb3V0ZSBSVEEhIGNvbWUgYmFjayBsYXRlci5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyoKKyAgKiogRmlsbCBpbiB0aGUgZGVmYXVsdCBpbmZvIG9uIHRoZSBjb21tYW5kIGJsb2NrCisgICovCisgIENtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBSdXA7CisgIENtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBST1VURV9SVVA7CisgIENtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCA9IEhPU1RfSUQ7CisgIENtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCA9IFJPVVRFX1JVUDsKKyAgQ21kQmxrUC0+UGFja2V0LmxlbiA9IFBLVF9DTURfQklUIHwgMTsKKyAgQ21kQmxrUC0+UHJlRnVuY1AgPSBDbWRCbGtQLT5Qb3N0RnVuY1AgPSBOVUxMOworICBQa3RSZXBseVAgPSAoc3RydWN0IFBrdENtZF9NICopQ21kQmxrUC0+UGFja2V0LmRhdGE7CisKKyAgaWYgKCEgUklPQm9vdE9rKHAsIEhvc3RQLCBSdGFVbmlxKSkKKyAgeworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSVEEgJXggdHJpZWQgdG8gZ2V0IGFuIElELCBidXQgZG9lcyBub3QgYmVsb25nIC0gRk9BRCBpdCFcbiIsCisJICBSdGFVbmlxKTsKKyAgICBQa3RSZXBseVAtPkNvbW1hbmQgPSBST1VURV9GT0FEOworICAgIEhvc3RQLT5Db3B5KCJSVF9GT0FEIiwgUGt0UmVwbHlQLT5Db21tYW5kVGV4dCwgNyk7CisgICAgUklPUXVldWVDbWRCbGsoSG9zdFAsIFJ1cCwgQ21kQmxrUCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICAvKgorICAqKiBDaGVjayB0byBzZWUgaWYgdGhlIFJUQSBpcyBjb25maWd1cmVkIGZvciB0aGlzIGhvc3QKKyAgKi8KKyAgZm9yICggVGhpc1VuaXQ9MDsgVGhpc1VuaXQ8TUFYX1JVUDsgVGhpc1VuaXQrKyApCisgIHsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiRW50cnkgJWQgRmxhZ3M9JXMgJXMgVW5pcXVlTnVtPTB4JXhcbiIsCisJCQlUaGlzVW5pdCwKKwkJCUhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIFNMT1RfSU5fVVNFID8KKwkJCQkJICAgICJTbG90LUluLVVzZSI6Ik5vdCBJbiBVc2UiLAorCQkJSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgU0xPVF9URU5UQVRJVkUgPyAKKwkJCQkJICAgICJTbG90LVRlbnRhdGl2ZSI6Ik5vdCBUZW50YXRpdmUiLAorCQkJSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlJ0YVVuaXF1ZU51bSk7CisKKyAgICAvKgorICAgICoqIFdlIGhhdmUgYW4gZW50cnkgZm9yIGl0LgorICAgICovCisgICAgaWYgKCAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgKFNMT1RfSU5fVVNFIHwgU0xPVF9URU5UQVRJVkUpKSAmJgorICAgICAgICAgKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5SdGFVbmlxdWVOdW0gPT0gUnRhVW5pcSkgKQorICAgIHsKKyAgICAgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisgICAgICB7CisJICBUaGlzVW5pdDIgPSBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uSUQyIC0gMTsKKyAgICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiRm91bmQgdW5pdCAweCV4IGF0IHNsb3RzICVkKyVkXG4iLAorCQkJCQkgICAgUnRhVW5pcSxUaGlzVW5pdCxUaGlzVW5pdDIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJGb3VuZCB1bml0IDB4JXggYXQgc2xvdCAlZFxuIiwKKwkJCQkJICAgIFJ0YVVuaXEsVGhpc1VuaXQpOworICAgICAgLyoKKyAgICAgICoqIElmIHdlIGhhdmUgbm8ga25vd2xlZGdlIG9mIGJvb3RpbmcgaXQsIHRoZW4gdGhlIGhvc3QgaGFzCisgICAgICAqKiBiZWVuIHJlLWJvb3RlZCwgYW5kIHNvIHdlIG11c3Qga2lsbCB0aGUgUlRBLCBzbyB0aGF0IGl0CisgICAgICAqKiB3aWxsIGJlIGJvb3RlZCBhZ2FpbiAocG90ZW50aWFsbHkgd2l0aCBuZXcgYmlucykKKyAgICAgICoqIGFuZCBpdCB3aWxsIHRoZW4gcmUtYXNrIGZvciBhbiBJRCwgd2hpY2ggd2Ugd2lsbCBzZXJ2aWNlLgorICAgICAgKi8KKyAgICAgIGlmICggKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIFNMT1RfSU5fVVNFKSAmJiAKKwkgICEoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgUlRBX0JPT1RFRCkgKQorICAgICAgeworCWlmICggIShIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBNU0dfRE9ORSkgKQorCXsKKwkgICAgaWYgKCAhcC0+UklPTm9NZXNzYWdlICkKKwkgICAgICAgIGNwcmludGYoIlJUQSAnJXMnIGlzIGJlaW5nIHVwZGF0ZWQuXG4iLEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5OYW1lKTsKKwkgICAgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzIHw9IE1TR19ET05FOworCX0KKwlQa3RSZXBseVAtPkNvbW1hbmQgPSBST1VURV9GT0FEOworCUhvc3RQLT5Db3B5KCJSVF9GT0FEIixQa3RSZXBseVAtPkNvbW1hbmRUZXh0LDcpOworCVJJT1F1ZXVlQ21kQmxrKEhvc3RQLCBSdXAsIENtZEJsa1ApOworCXJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICAvKgorICAgICAgKiogU2VuZCB0aGUgSUQgKGVudHJ5KSB0byB0aGlzIFJUQS4gVGhlIElEIG51bWJlciBpcyBpbXBsaWNpdCBhcworICAgICAgKiogdGhlIG9mZnNldCBpbnRvIHRoZSB0YWJsZS4gSXQgaXMgd29ydGggbm90aW5nIGF0IHRoaXMgc3RhZ2UKKyAgICAgICoqIHRoYXQgb2Zmc2V0IHplcm8gaW4gdGhlIHRhYmxlIGNvbnRhaW5zIHRoZSBlbnRyaWVzIGZvciB0aGUKKyAgICAgICoqIFJUQSB3aXRoIElEIDEhISEhCisgICAgICAqLworICAgICAgUGt0UmVwbHlQLT5Db21tYW5kID0gUk9VVEVfQUxMT0NBVEU7CisgICAgICBQa3RSZXBseVAtPklETnVtICAgPSBUaGlzVW5pdCsxOworICAgICAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKyAgICAgIHsKKyAgICAgICAgaWYgKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIFNMT1RfSU5fVVNFKQorCSAgICAvKgorCSAgICAqKiBBZGp1c3QgdGhlIHBoYiBhbmQgdHggcGt0IGRlc3RfdW5pdHMgZm9yIDJuZCBibG9jayBvZiA4CisJICAgICoqIG9ubHkgaWYgdGhlIFJUQSBoYXMgcG9ydHMgYXNzb2NpYXRlZCAoU0xPVF9JTl9VU0UpCisJICAgICovCisJICAgIFJJT0ZpeFBoYnMocCwgSG9zdFAsIFRoaXNVbml0Mik7CisJICAgIFBrdFJlcGx5UC0+SUROdW0yICA9IFRoaXNVbml0MisxOworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUlRBICclcycgaGFzIGJlZW4gYWxsb2NhdGVkIElEcyAlZCslZFxuIiwKKwkgICAgICAgICAgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLk5hbWUsIFBrdFJlcGx5UC0+SUROdW0sIFBrdFJlcGx5UC0+SUROdW0yKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwkgICAgUGt0UmVwbHlQLT5JRE51bTIgPSBST1VURV9OT19JRDsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJUQSAnJXMnIGhhcyBiZWVuIGFsbG9jYXRlZCBJRCAlZFxuIiwKKwkgICAgICAgICAgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLk5hbWUsUGt0UmVwbHlQLT5JRE51bSk7CisgICAgICB9CisgICAgICBIb3N0UC0+Q29weSgiUlRfQUxMT0NBVCIsUGt0UmVwbHlQLT5Db21tYW5kVGV4dCwxMCk7CisKKyAgICAgIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgUnVwLCBDbWRCbGtQKTsKKworICAgICAgLyoKKyAgICAgICoqIElmIHRoaXMgaXMgYSBmcmVzaGx5IGJvb3RlZCBSVEEsIHRoZW4gd2UgbmVlZCB0byByZS1vcGVuCisgICAgICAqKiB0aGUgcG9ydHMsIGlmIGFueSB3aGVyZSBvcGVuLCBzbyB0aGF0IGRhdGEgbWF5IG9uY2UgbW9yZQorICAgICAgKiogZmxvdyBhcm91bmQgdGhlIHN5c3RlbSEKKyAgICAgICovCisgICAgICBpZiAoIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBSVEFfTkVXQk9PVCkgJiYKKwkgICAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnQgIT0gTk9fUE9SVCkgKQorICAgICAgeworCS8qCisJKiogbG9vayBhdCB0aGUgcG9ydHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmVhc3QgYW5kCisJKiogc2VlIGlmIGFueSB3aGVyZSBvcGVuLiBJZiB0aGV5IHdhcywgdGhlbiByZS1vcGVuCisJKiogdGhlbSwgdXNpbmcgdGhlIGluZm8gZnJvbSB0aGUgdHR5IGZsYWdzLgorCSovCisJZm9yICggcG9ydD0wOyBwb3J0PFBPUlRTX1BFUl9SVEE7IHBvcnQrKyApCisJeworCSAgUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0K0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0XTsKKwkgIGlmICggUG9ydFAtPlN0YXRlICYgKFJJT19NT1BFTnxSSU9fTE9QRU4pICkKKwkgIHsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJlLW9wZW5lZCB0aGlzIHBvcnRcbiIpOworCSAgICByaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJICAgIFBvcnRQLT5NYWdpY0ZsYWdzIHw9IE1BR0lDX1JFQk9PVDsKKwkgICAgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJICB9CisJfQorCWlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJeworCSAgZm9yICggcG9ydD0wOyBwb3J0PFBPUlRTX1BFUl9SVEE7IHBvcnQrKyApCisJICB7CisJICAgIFBvcnRQID0gcC0+UklPUG9ydHBbcG9ydCtIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdDJdLlN5c1BvcnRdOworCSAgICBpZiAoIFBvcnRQLT5TdGF0ZSAmIChSSU9fTU9QRU58UklPX0xPUEVOKSApCisJICAgIHsKKwkgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUmUtb3BlbmVkIHRoaXMgcG9ydFxuIik7CisJICAgICAgcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCSAgICAgIFBvcnRQLT5NYWdpY0ZsYWdzIHw9IE1BR0lDX1JFQk9PVDsKKwkgICAgICByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICoqIGtlZXAgYSBjb3B5IG9mIHRoZSBtb2R1bGUgdHlwZXMhCisgICAgICAqLworICAgICAgSG9zdFAtPlVuaXhSdXBzW1RoaXNVbml0XS5Nb2RUeXBlcyA9IE1vZDsKKyAgICAgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJICAgICAgSG9zdFAtPlVuaXhSdXBzW1RoaXNVbml0Ml0uTW9kVHlwZXMgPSBNb2Q7CisKKyAgICAgIC8qCisgICAgICAqKiBJZiBlaXRoZXIgb2YgdGhlIG1vZHVsZXMgb24gdGhpcyB1bml0IGlzIHJlYWQtb25seSBvciB3cml0ZS1vbmx5CisgICAgICAqKiBvciBub25lLXhwcmludCwgdGhlbiB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoYXQgaW5mbyBvdmVyIHRvIHRoZQorICAgICAgKiogcmVsZXZhbnQgcG9ydHMuCisgICAgICAqLworICAgICAgaWYgKCBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydCAhPSBOT19QT1JUICkKKyAgICAgIHsKKyAgICAgICAgZm9yICggcG9ydD0wOyBwb3J0PFBPUlRTX1BFUl9NT0RVTEU7IHBvcnQrKyApCisJeworCSAgcC0+UklPUG9ydHBbcG9ydCtIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydF0tPkNvbmZpZyAmPSB+UklPX05PTUFTSzsKKwkgIHAtPlJJT1BvcnRwW3BvcnQrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnRdLT5Db25maWcgfD0KKwkgICBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QxXS5GbGFnc1twb3J0XTsKKwkgIHAtPlJJT1BvcnRwW3BvcnQrUE9SVFNfUEVSX01PRFVMRStIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydF0tPkNvbmZpZyAmPSB+UklPX05PTUFTSzsKKwkgIHAtPlJJT1BvcnRwW3BvcnQrUE9SVFNfUEVSX01PRFVMRStIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydF0tPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QyXS5GbGFnc1twb3J0XTsKKwl9CisJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKKwl7CisgICAgICAgICAgZm9yICggcG9ydD0wOyBwb3J0PFBPUlRTX1BFUl9NT0RVTEU7IHBvcnQrKyApCisJICB7CisJICAgIHAtPlJJT1BvcnRwW3BvcnQrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XS0+Q29uZmlnICY9IH5SSU9fTk9NQVNLOworCSAgICBwLT5SSU9Qb3J0cFtwb3J0K0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0Ml0uU3lzUG9ydF0tPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QxXS5GbGFnc1twb3J0XTsKKwkgICAgcC0+UklPUG9ydHBbcG9ydCtQT1JUU19QRVJfTU9EVUxFK0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0Ml0uU3lzUG9ydF0tPkNvbmZpZyAmPSB+UklPX05PTUFTSzsKKwkgICAgcC0+UklPUG9ydHBbcG9ydCtQT1JUU19QRVJfTU9EVUxFK0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0Ml0uU3lzUG9ydF0tPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QyXS5GbGFnc1twb3J0XTsKKyAgICAgICAgICB9CisJfQorICAgICAgfQorCisgICAgICAvKgorICAgICAgKiogSm9iIGRvbmUsIGdldCBvbiB3aXRoIHRoZSBpbnRlcnJ1cHRzIQorICAgICAgKi8KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICAvKgorICAqKiBUaGVyZSBpcyBubyB0YWJsZSBlbnRyeSBmb3IgdGhpcyBSVEEgYXQgYWxsLgorICAqKgorICAqKiBMZXRzIGNoZWNrIHRvIHNlZSBpZiB3ZSBhY3R1YWxseSBib290ZWQgdGhpcyB1bml0IC0gaWYgbm90LAorICAqKiB0aGVuIHdlIHJlc2V0IGl0IGFuZCBpdCB3aWxsIGdvIHJvdW5kIHRoZSBsb29wIG9mIGJlaW5nIGJvb3RlZAorICAqKiB3ZSBjYW4gdGhlbiB3b3JyeSBhYm91dCB0cnlpbmcgdG8gZml0IGl0IGludG8gdGhlIHRhYmxlLgorICAqLworICBmb3IgKCBUaGlzVW5pdD0wOyBUaGlzVW5pdDxIb3N0UC0+TnVtRXh0cmFCb290ZWQ7IFRoaXNVbml0KysgKQorICAgIGlmICggSG9zdFAtPkV4dHJhVW5pdHNbVGhpc1VuaXRdID09IFJ0YVVuaXEgKQorICAgICAgYnJlYWs7CisgIGlmICggVGhpc1VuaXQgPT0gSG9zdFAtPk51bUV4dHJhQm9vdGVkICYmIFRoaXNVbml0ICE9IE1BWF9FWFRSQV9VTklUUyApCisgIHsKKyAgICAvKgorICAgICoqIGlmIHRoZSB1bml0IHdhc24ndCBpbiB0aGUgdGFibGUsIGFuZCB0aGUgdGFibGUgd2Fzbid0IGZ1bGwsIHRoZW4KKyAgICAqKiB3ZSByZXNldCB0aGUgdW5pdCwgYmVjYXVzZSB3ZSBkaWRuJ3QgYm9vdCBpdC4KKyAgICAqKiBIb3dldmVyLCBpZiB0aGUgdGFibGUgaXMgZnVsbCwgaXQgY291bGQgYmUgdGhhdCB3ZSBkaWQgYm9vdAorICAgICoqIHRoaXMgdW5pdCwgYW5kIHNvIHdlIHdvbid0IHJlYm9vdCBpdCwgYmVjYXVzZSBpdCBpc24ndCByZWFsbHkKKyAgICAqKiBhbGwgdGhhdCBkaXNhc3Rlcm91cyB0byBrZWVwIHRoZSBvbGQgYmlucyBpbiBtb3N0IGNhc2VzLiBUaGlzCisgICAgKiogaXMgYSByYXRoZXIgdGFja3kgZmVhdHVyZSwgYnV0IHdlIGFyZSBvbiB0aGUgZWRnZSBvZiByZWFsbGl0eQorICAgICoqIGhlcmUsIGJlY2F1c2UgdGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgc29tZW9uZSBoYXMgY29ubmVjdGVkCisgICAgKiogMTYrTUFYX0VYVFJBX1VOSVRTIG9udG8gb25lIGhvc3QuCisgICAgKi8KKyAgICBzdGF0aWMgaW50IFVua25vd25NZXNnRG9uZSA9IDA7CisKKyAgICBpZiAoICFVbmtub3duTWVzZ0RvbmUgKQorICAgIHsKKwlpZiAoISBwLT5SSU9Ob01lc3NhZ2UpCisJICAgIGNwcmludGYoIk9uZSBvciBtb3JlIHVua25vd24gUlRBcyBhcmUgYmVpbmcgdXBkYXRlZC5cbiIpOworCVVua25vd25NZXNnRG9uZSA9IDE7CisgICAgfQorCisgICAgUGt0UmVwbHlQLT5Db21tYW5kID0gUk9VVEVfRk9BRDsKKyAgICBIb3N0UC0+Q29weSgiUlRfRk9BRCIsUGt0UmVwbHlQLT5Db21tYW5kVGV4dCw3KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKgorICAgICoqIHdlIGRpZCBib290IGl0IChhcyBhbiBleHRyYSksIGFuZCB0aGVyZSBtYXkgbm93IGJlIGEgdGFibGUKKyAgICAqKiBzbG90IGZyZWUgKGJlY2F1c2Ugb2YgYSBkZWxldGUpLCBzbyB3ZSB3aWxsIHRyeSB0byBtYWtlCisgICAgKiogYSB0ZW50YXRpdmUgZW50cnkgZm9yIGl0LCBzbyB0aGF0IHRoZSBjb25maWd1cmF0b3IgY2FuIHNlZSBpdAorICAgICoqIGFuZCBmaWxsIGluIHRoZSBkZXRhaWxzIGZvciB1cy4KKyAgICAqLworICAgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisgICAgeworCWlmIChSSU9GaW5kRnJlZUlEKHAsIEhvc3RQLCAmVGhpc1VuaXQsICZUaGlzVW5pdDIpID09IDApCisJeworCSAgICBSSU9EZWZhdWx0TmFtZShwLCBIb3N0UCwgVGhpc1VuaXQpOworCSAgICBGaWxsU2xvdChUaGlzVW5pdCwgVGhpc1VuaXQyLCBSdGFVbmlxLCBIb3N0UCk7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmIChSSU9GaW5kRnJlZUlEKHAsIEhvc3RQLCAmVGhpc1VuaXQsIE5VTEwpID09IDApCisJeworCSAgICBSSU9EZWZhdWx0TmFtZShwLCBIb3N0UCwgVGhpc1VuaXQpOworCSAgICBGaWxsU2xvdChUaGlzVW5pdCwgMCwgUnRhVW5pcSwgSG9zdFApOworCX0KKyAgICB9CisgICAgUGt0UmVwbHlQLT5Db21tYW5kID0gUk9VVEVfVVNFRDsKKyAgICBIb3N0UC0+Q29weSgiUlRfVVNFRCIsUGt0UmVwbHlQLT5Db21tYW5kVGV4dCw3KTsKKyAgfQorICBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIFJ1cCwgQ21kQmxrUCk7CisgIHJldHVybiBUUlVFOworfQorCisKK3ZvaWQKK1JJT0ZpeFBoYnMocCwgSG9zdFAsIHVuaXQpCitzdHJ1Y3QgcmlvX2luZm8gKnA7CitzdHJ1Y3QgSG9zdCAqSG9zdFA7Cit1aW50IHVuaXQ7Cit7CisJdXNob3J0CQkJbGluaywgcG9ydDsKKwlzdHJ1Y3QgUG9ydAkJKlBvcnRQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IFBvcnROID0gSG9zdFAtPk1hcHBpbmdbdW5pdF0uU3lzUG9ydDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSSU9GaXhQaGJzIHVuaXQgJWQgc3lzcG9ydCAlZFxuIiwgdW5pdCwgUG9ydE4pOworCisJaWYgKFBvcnROICE9IC0xKSB7CisJCXVzaG9ydAkJZGVzdF91bml0ID0gSG9zdFAtPk1hcHBpbmdbdW5pdF0uSUQyOworCisJCS8qCisJCSoqIEdldCB0aGUgbGluayBudW1iZXIgdXNlZCBmb3IgdGhlIDFzdCA4IHBoYnMgb24gdGhpcyB1bml0LgorCQkqLworCQlQb3J0UCA9IHAtPlJJT1BvcnRwW0hvc3RQLT5NYXBwaW5nW2Rlc3RfdW5pdCAtIDFdLlN5c1BvcnRdOworCisJCWxpbmsgPSBSV09SRChQb3J0UC0+UGhiUC0+bGluayk7CisKKwkJZm9yIChwb3J0ID0gMDsgcG9ydCA8IFBPUlRTX1BFUl9SVEE7IHBvcnQrKywgUG9ydE4rKykgeworCQkJdXNob3J0CQlkZXN0X3BvcnQgPSBwb3J0ICsgODsKKyNpZiAwCisJCQl1aW50CQlQa3RJbnQ7CisjZW5kaWYKKwkJCVdPUkQJCSpUeFBrdFA7CisJCQlQS1QJCSpQa3Q7CisKKwkJCVBvcnRQID0gcC0+UklPUG9ydHBbUG9ydE5dOworCisJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkvKgorCQkJKiogSWYgUlRBIGlzIG5vdCBwb3dlcmVkIG9uLCB0aGUgdHggcGFja2V0cyB3aWxsIGJlCisJCQkqKiB1bnNldCwgc28gZ28gbm8gZnVydGhlci4KKwkJCSovCisJCQlpZiAoUG9ydFAtPlR4U3RhcnQgPT0gMCkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiVHggcGt0cyBub3Qgc2V0IHVwIHlldFxuIik7CisJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSoqIEZvciB0aGUgc2Vjb25kIHNsb3Qgb2YgYSAxNiBwb3J0IFJUQSwgdGhlIGRyaXZlciBuZWVkcyB0bworCQkJKiogc29ydCBvdXQgdGhlIHBoYiB0byBwb3J0IG1hcHBpbmdzLiBUaGUgZGVzdF91bml0IGZvciB0aGlzCisJCQkqKiBncm91cCBvZiA4IHBoYnMgaXMgc2V0IHRvIHRoZSBkZXN0X3VuaXQgb2YgdGhlIGFjY29tcGFueWluZworCQkJKiogOCBwb3J0IGJsb2NrLiBUaGUgZGVzdF9wb3J0IG9mIHRoZSBzZWNvbmQgdW5pdCBpcyBzZXQgdG8KKwkJCSoqIGJlIGluIHRoZSByYW5nZSA4LTE1IChpLmUuIDggaXMgYWRkZWQpLiBUaHVzLCBmb3IgYSAxNiBwb3J0CisJCQkqKiBSVEEgd2l0aCBJRHMgNSBhbmQgNiwgdHJhZmZpYyBib3VuZCBmb3IgcG9ydCA2IG9mIHVuaXQgNgorCQkJKiogKGJlaW5nIHRoZSBzZWNvbmQgbWFwIElEKSB3aWxsIGJlIHNlbnQgdG8gZGVzdF91bml0IDUsIHBvcnQKKwkJCSoqIDE0LiBXaGVuIHRoaXMgUlRBIGlzIGRlbGV0ZWQsIGRlc3RfdW5pdCBmb3IgSUQgNiB3aWxsIGJlCisJCQkqKiByZXN0b3JlZCwgYW5kIHRoZSBkZXN0X3BvcnQgd2lsbCBiZSByZWR1Y2VkIGJ5IDguCisJCQkqKiBUcmFuc21pdCBwYWNrZXRzIGFsc28gaGF2ZSBhIGRlc3RpbmF0aW9uIGZpZWxkIHdoaWNoIG5lZWRzCisJCQkqKiBhZGp1c3RpbmcgaW4gdGhlIHNhbWUgbWFubmVyLgorCQkJKiogTm90ZSB0aGF0IHRoZSB1bml0L3BvcnQgYnl0ZXMgaW4gJ2Rlc3QnIGFyZSBzd2FwcGVkLgorCQkJKiogV2UgYWxzbyBuZWVkIHRvIGFkanVzdCB0aGUgcGhiIGFuZCBydXAgbGluayBudW1iZXJzIGZvciB0aGUKKwkJCSoqIHNlY29uZCBibG9jayBvZiA4IHR0eXMuCisJCQkqLworCQkJZm9yIChUeFBrdFAgPSBQb3J0UC0+VHhTdGFydDsgVHhQa3RQIDw9IFBvcnRQLT5UeEVuZDsgVHhQa3RQKyspIHsKKwkJCQkvKgorCQkJCSoqICpUeFBrdFAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IHBhY2tldCBvbiB0aGUgaG9zdAorCQkJCSoqIGNhcmQuIFRoaXMgbmVlZHMgdG8gYmUgdHJhbnNsYXRlZCBpbnRvIGEgMzIgYml0IHBvaW50ZXIKKwkJCQkqKiBzbyBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSB0aGUgZHJpdmVyLgorCQkJCSovCisJCQkJUGt0ID0gKFBLVCAqKSBSSU9fUFRSKEhvc3RQLT5DYWRkcixSSU5EVyhUeFBrdFApKTsKKworCQkJCS8qCisJCQkJKiogSWYgdGhlIHBhY2tldCBpcyB1c2VkLCByZXNldCBpdC4KKwkJCQkqLworCQkJCVBrdCA9IChQS1QgKikoKHVpbnQpUGt0ICYgflBLVF9JTl9VU0UpOworCQkJCVdCWVRFKFBrdC0+ZGVzdF91bml0LCBkZXN0X3VuaXQpOworCQkJCVdCWVRFKFBrdC0+ZGVzdF9wb3J0LCBkZXN0X3BvcnQpOworCQkJfQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgInBoYiBkZXN0OiBPbGQgJXg6JXggTmV3ICV4OiV4XG4iLAorCQkJCQlSV09SRChQb3J0UC0+UGhiUC0+ZGVzdGluYXRpb24pICYgMHhmZiwKKwkJCQkJKFJXT1JEKFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbikgPj4gOCkgJiAweGZmLAorCQkJCQlkZXN0X3VuaXQsIGRlc3RfcG9ydCk7CisJCQlXV09SRChQb3J0UC0+UGhiUC0+ZGVzdGluYXRpb24sIGRlc3RfdW5pdCArIChkZXN0X3BvcnQgPDwgOCkpOworCQkJV1dPUkQoUG9ydFAtPlBoYlAtPmxpbmssIGxpbmspOworCisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJfQorCQkvKgorCQkqKiBOb3cgbWFrZSBzdXJlIHRoZSByYW5nZSBvZiBwb3J0cyB0byBiZSBzZXJ2aWNlZCBpbmNsdWRlcworCQkqKiB0aGUgMm5kIDggb24gdGhpcyAxNiBwb3J0IFJUQS4KKwkJKi8KKwkJaWYgKGxpbmsgPiAzKSByZXR1cm47CisJCWlmICgoKHVuaXQgKiA4KSArIDcpID4gUldPUkQoSG9zdFAtPkxpbmtTdHJQW2xpbmtdLmxhc3RfcG9ydCkpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJsYXN0IHBvcnQgb24gaG9zdCBsaW5rICVkOiAlZFxuIiwgbGluaywgKHVuaXQgKiA4KSArIDcpOworCQkJV1dPUkQoSG9zdFAtPkxpbmtTdHJQW2xpbmtdLmxhc3RfcG9ydCwgKHVuaXQgKiA4KSArIDcpOworCQl9CisJfQorfQorCisvKgorKiogQ2hlY2sgdG8gc2VlIGlmIHRoZSBuZXcgZGlzY29ubmVjdGlvbiBoYXMgaXNvbGF0ZWQgdGhpcyB1bml0LgorKiogSWYgaXQgaGFzLCB0aGVuIGludmFsaWRhdGUgYWxsIGl0cyBsaW5rIGluZm9ybWF0aW9uLCBhbmQgdGVsbAorKiogdGhlIHdvcmxkIGFib3V0IGl0LiBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRvcgorKiogb25seSBnZXRzIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KKyovCitzdGF0aWMgaW50CitSSU9DaGVja0lzb2xhdGVkKHAsIEhvc3RQLCBVbml0SWQpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IEhvc3QgKkhvc3RQOwordWludCBVbml0SWQ7Cit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJkhvc3RQLT5Ib3N0TG9jaywgZmxhZ3MpOworCisjaWZkZWYgQ0hFQ0sKKwlDaGVja0hvc3RQKCBIb3N0UCApOworCUNoZWNrVW5pdElkKCBVbml0SWQgKTsKKyNlbmRpZgorCWlmICggUklPQ2hlY2soIEhvc3RQLCBVbml0SWQgKSApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVuaXQgJWQgaXMgTk9UIGlzb2xhdGVkXG4iLCBVbml0SWQpOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7CisJCXJldHVybigwKTsKKwl9CisKKwlSSU9Jc29sYXRlKHAsIEhvc3RQLCBVbml0SWQgKTsKKwlSSU9TZXRDaGFuZ2UocCk7CisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkhvc3RQLT5Ib3N0TG9jaywgZmxhZ3MpOworCXJldHVybiAxOworfQorCisvKgorKiogSW52YWxpZGF0ZSBhbGwgdGhlIGxpbmsgaW50ZXJjb25uZWN0aXZpdHkgb2YgdGhpcyB1bml0LCBhbmQgb2YKKyoqIGFsbCB0aGUgdW5pdHMgYXR0YWNoZWQgdG8gaXQuIFRoaXMgd2lsbCBtZWFuIHRoYXQgdGhlIGVudGlyZQorKiogc3VibmV0IHdpbGwgcmUtaW50cm9kdWNlIGl0c2VsZi4KKyovCitzdGF0aWMgaW50CitSSU9Jc29sYXRlKHAsIEhvc3RQLCBVbml0SWQpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IEhvc3QgKgkJSG9zdFA7Cit1aW50IFVuaXRJZDsgCit7CisJdWludCBsaW5rLCB1bml0OworCisjaWZkZWYgQ0hFQ0sKKwlDaGVja0hvc3RQKCBIb3N0UCApOworCUNoZWNrVW5pdElkKCBVbml0SWQgKTsKKyNlbmRpZgorCVVuaXRJZC0tOwkJLyogdGhpcyB0cmljayByZWxpZXMgb24gdGhlIFVuaXQgSWQgYmVpbmcgVU5TSUdORUQhICovCisKKwlpZiAoIFVuaXRJZCA+PSBNQVhfUlVQICkJLyogZG9udGNoYSBqdXN0IGx1cnYgdW5zaWduZWQgbWF0aHMhICovCisJCXJldHVybigwKTsKKworCWlmICggSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyAmIEJFRU5fSEVSRSApCisJCXJldHVybigwKTsKKworCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uRmxhZ3MgfD0gQkVFTl9IRVJFOworCisJaWYgKCBwLT5SSU9QcmludERpc2FibGVkID09IERPX1BSSU5UICkKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJJT01lc2dJc29sYXRlZCAlcyIsIEhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uTmFtZSk7CisKKwlmb3IgKCBsaW5rPTA7IGxpbms8TElOS1NfUEVSX1VOSVQ7IGxpbmsrKykgeworCQl1bml0ID0gSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5Ub3BvbG9neVtsaW5rXS5Vbml0OworCQlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLlVuaXQgPSBST1VURV9ESVNDT05ORUNUOworCQlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLkxpbmsgPSBOT19MSU5LOworCQlSSU9Jc29sYXRlKHAsIEhvc3RQLCB1bml0ICk7CisJfQorCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uRmxhZ3MgJj0gfkJFRU5fSEVSRTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorUklPQ2hlY2soSG9zdFAsIFVuaXRJZCkKK3N0cnVjdCBIb3N0ICpIb3N0UDsKK3VpbnQgVW5pdElkOworeworICB1bnNpZ25lZCBjaGFyIGxpbms7CisKKyNpZmRlZiBDSEVDSworCUNoZWNrSG9zdFAoIEhvc3RQICk7CisJQ2hlY2tVbml0SWQoIFVuaXRJZCApOworI2VuZGlmCisvKiAJcmlvX2RwcmludChSSU9fREVCVUdfUk9VVEUsICgiQ2hlY2sgdG8gc2VlIGlmIHVuaXQgJWQgaGFzIGEgcm91dGUgdG8gdGhlIGhvc3RcbiIsVW5pdElkKSk7ICovCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJJT0NoZWNrIDogVW5pdElEID0gJWRcbiIsIFVuaXRJZCk7CisKKwlpZiAoIFVuaXRJZCA9PSBIT1NUX0lEICkgeworCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIGlzIE5PVCBpc29sYXRlZCAtIGl0IElTIHRoZSBob3N0IVxuIiwgVW5pdElkKSk7ICovCisJCXJldHVybiAxOworCX0KKworCVVuaXRJZC0tOworCisJaWYgKCBVbml0SWQgPj0gTUFYX1JVUCApIHsKKwkJLyogcmlvX2RwcmludChSSU9fREVCVUdfUk9VVEUsICgiVW5pdCAlZCAtIGlnbm9yZWQuXG4iLCBVbml0SWQpKTsgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJZm9yICggbGluaz0wOyBsaW5rPExJTktTX1BFUl9VTklUOyBsaW5rKysgKSB7CisJCWlmICggSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5Ub3BvbG9neVtsaW5rXS5Vbml0PT1IT1NUX0lEICkgeworCQkJLyogcmlvX2RwcmludChSSU9fREVCVUdfUk9VVEUsICgiVW5pdCAlZCBpcyBjb25uZWN0ZWQgZGlyZWN0bHkgdG8gaG9zdCB2aWEgbGluayAoJWMpLlxuIiwgCisJCQkJCQlVbml0SWQsICdBJytsaW5rKSk7ICovCisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmICggSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyAmIEJFRU5fSEVSRSApIHsKKwkJLyogcmlvX2RwcmludChSSU9fREVCVUdfUk9VVEUsICgiQmVlbiB0byBVbml0ICVkIGJlZm9yZSAtIGlnbm9yaW5nXG4iLCBVbml0SWQpKTsgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyB8PSBCRUVOX0hFUkU7CisKKwlmb3IgKCBsaW5rPTA7IGxpbmsgPCBMSU5LU19QRVJfVU5JVDsgbGluaysrICkgeworCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIGNoZWNrIGxpbmsgKCVjKVxuIiwgVW5pdElkLCdBJytsaW5rKSk7ICovCisJCWlmICggUklPQ2hlY2soIEhvc3RQLCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLlVuaXQgKSApIHsKKwkJCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX1JPVVRFLCAoIlVuaXQgJWQgaXMgY29ubmVjdGVkIHRvIHNvbWV0aGluZyB0aGF0IGtub3dzIHRoZSBob3N0IHZpYSBsaW5rICglYylcbiIsIFVuaXRJZCxsaW5rKydBJykpOyAqLworCQkJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyAmPSB+QkVFTl9IRVJFOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICY9IH5CRUVOX0hFUkU7CisKKwkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIERPRVNOVCBLTk9XIFRIRSBIT1NUIVxuIiwgVW5pdElkKSk7ICovCisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisqKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHVuaXQgKGhvc3QsIDE2LzggcG9ydCBSVEEpCisqLworCit1aW50CitHZXRVbml0VHlwZShVbmlxKQordWludCBVbmlxOworeworCXN3aXRjaCAoIChVbmlxID4+IDI4KSAmIDB4ZikKKwl7CisJCWNhc2UgUklPX0FUOgorCQljYXNlIFJJT19NQ0E6CisJCWNhc2UgUklPX0VJU0E6CisJCWNhc2UgUklPX1BDSToKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJVbml0IHR5cGU6IEhvc3RcbiIpOworCQkJcmV0dXJuKFRZUEVfSE9TVCk7CisJCWNhc2UgUklPX1JUQV8xNjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJVbml0IHR5cGU6IDE2IHBvcnQgUlRBXG4iKTsKKwkJCXJldHVybihUWVBFX1JUQTE2KTsKKwkJY2FzZSBSSU9fUlRBOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVuaXQgdHlwZTogOCBwb3J0IFJUQVxuIik7CisJCQlyZXR1cm4oVFlQRV9SVEE4KTsKKwkJZGVmYXVsdCA6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCB0eXBlOiBVbnJlY29nbmlzZWRcbiIpOworCQkJcmV0dXJuKDk5KTsKKwl9Cit9CisKK2ludAorUklPU2V0Q2hhbmdlKHApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworeworCWlmICggcC0+UklPUXVpY2tDaGVjayAhPSBOT1RfQ0hBTkdFRCApCisJCXJldHVybigwKTsKKwlwLT5SSU9RdWlja0NoZWNrID0gQ0hBTkdFRDsKKwlpZiAoIHAtPlJJT1NpZ25hbFByb2Nlc3MgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTZW5kIFNJRy1IVVAiKTsKKwkJLyoKKwkJcHNpZ25hbCggUklPU2lnbmFsUHJvY2VzcywgU0lHSFVQICk7CisJCSovCisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQKK1JJT0NvbkNvbihwLCBIb3N0UCwgRnJvbUlkLCBGcm9tTGluaywgVG9JZCwgVG9MaW5rLCBDaGFuZ2UpCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IEhvc3QgKkhvc3RQOwordWludCBGcm9tSWQ7Cit1aW50IEZyb21MaW5rOwordWludCBUb0lkOwordWludCBUb0xpbms7CitpbnQgQ2hhbmdlOyAKK3sKKyAgICBjaGFyICpGcm9tTmFtZTsKKyAgICBjaGFyICpGcm9tVHlwZTsKKyAgICBjaGFyICpUb05hbWU7CisgICAgY2hhciAqVG9UeXBlOworICAgIHVuc2lnbmVkIGludCB0cDsKKworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzU5CisqKiAoUGFydCkgZml4IGZvciBwb3J0IGJlaW5nIHRyYXNoZWQgd2hlbiBvcGVuZWQgd2hpbHN0IFJUQSAiZGlzY29ubmVjdGVkIgorKioKKyoqIFdoYXQncyB0aGlzIGRvaW5nIGluIGhlcmUgYW55d2F5ID8KKyoqIEl0IHdhcyBjYXVzaW5nIHRoZSBwb3J0IHRvIGJlICd1bm1hcHBlZCcgaWYgb3BlbmVkIHdoaWxzdCBSVEEgImRpc2Nvbm5lY3RlZCIKKyoqCisqKiAwOS4xMi4xOTk4IEFSRyAtIEVTSUwgMDc3NiAtIHBhcnQgZml4CisqKiBPa2F5LCBXZSd2ZSBmb3VuZCBvdXQgd2hhdCB0aGlzIHdhcyBhbGwgYWJvdXQgbm93ICEKKyoqIFNvbWVvbmUgaGFkIGJvdGNoZWQgdGhpcyB0byB1c2UgUklPSGFsdGVkIHRvIGluZGljYXRlZCB0aGUgbnVtYmVyIG9mIFJUQXMKKyoqICdkaXNjb25uZWN0ZWQnLiBUaGUgdmFsdWUgaW4gUklPSGFsdGVkIHdhcyB0aGVuIGJlaW5nIHVzZWQgaW4gdGhlCisqKiAnUklPX1FVSUNLX0NIRUNLJyBpb2N0bC4gQSBub25lIHplcm8gdmFsdWUgaW5kaWNhdGluZyB0aGF0IGEgbGVhc3Qgb25lIFJUQQorKiogaXMgJ2Rpc2Nvbm5lY3RlZCcuIFRoZSBjaGFuZ2Ugd2FzIHB1dCBpbiB0byBzYXRpc2Z5IGEgY3VzdG9tZXIncyBuZWVkcy4KKyoqIEhhdmluZyB0YWtlbiB0aGlzIGJpdCBvZiBjb2RlIG91dCAnUklPX1FVSUNLX0NIRUNLJyBub3cgbm8gbG9uZ2VyIHdvcmtzIGZvcgorKiogdGhlIGN1c3RvbWVyLgorKioKKyAgICBpZiAoQ2hhbmdlID09IENPTk5FQ1QpIHsKKwkJaWYgKHAtPlJJT0hhbHRlZCkgcC0+UklPSGFsdGVkIC0tOworCSB9CisJIGVsc2UgeworCQlwLT5SSU9IYWx0ZWQgKys7CisJIH0KKyoqCisqKiBTbyAtIHdlIG5lZWQgdG8gaW1wbGVtZW50IGl0IHNsaWdodGx5IGRpZmZlcmVudGx5IC0gYSBuZXcgbWVtYmVyIG9mIHRoZQorKiogcmlvX2luZm8gc3RydWN0IC0gUklPUnRhRGlzQ29ucyAoUklPIFJUQSBjb25uZWN0aW9ucykga2VlcHMgdHJhY2sgb2YgUlRBCisqKiBjb25uZWN0aW9ucyBhbmQgZGlzY29ubmVjdGlvbnMuIAorKi8KKyAgICBpZiAoQ2hhbmdlID09IENPTk5FQ1QpIHsKKwkJaWYgKHAtPlJJT1J0YURpc0NvbnMpIHAtPlJJT1J0YURpc0NvbnMtLTsKKwkgfQorCSBlbHNlIHsKKwkJcC0+UklPUnRhRGlzQ29ucysrOworCSB9CisKKyAgICBpZiAoIHAtPlJJT1ByaW50RGlzYWJsZWQgPT0gRE9OVF9QUklOVCApCisJCXJldHVybjsKKworICAgIGlmICggRnJvbUlkID4gVG9JZCApIHsKKwkJdHAgPSBGcm9tSWQ7CisJCUZyb21JZCA9IFRvSWQ7CisJCVRvSWQgPSB0cDsKKwkJdHAgPSBGcm9tTGluazsKKwkJRnJvbUxpbmsgPSBUb0xpbms7CisJCVRvTGluayA9IHRwOworICAgIH0KKworICAgIEZyb21OYW1lID0gRnJvbUlkID8gSG9zdFAtPk1hcHBpbmdbRnJvbUlkLTFdLk5hbWUgOiBIb3N0UC0+TmFtZTsKKyAgICBGcm9tVHlwZSA9IEZyb21JZCA/ICJSVEEiIDogIkhPU1QiOworICAgIFRvTmFtZSA9IFRvSWQgPyBIb3N0UC0+TWFwcGluZ1tUb0lkLTFdLk5hbWUgOiBIb3N0UC0+TmFtZTsKKyAgICBUb1R5cGUgPSBUb0lkID8gIlJUQSIgOiAiSE9TVCI7CisKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiTGluayBiZXR3ZWVuICVzICclcycgKCVjKSBhbmQgJXMgJyVzJyAoJWMpICVzLlxuIiwKKwkJCSAgICBGcm9tVHlwZSwgRnJvbU5hbWUsICdBJytGcm9tTGluaywKKwkJCSAgICBUb1R5cGUsICAgVG9OYW1lLCAgICdBJytUb0xpbmssCisJCQkgICAgKENoYW5nZT09Q09OTkVDVCkgPyAiZXN0YWJsaXNoZWQiIDogImRpc2Nvbm5lY3RlZCIpOworICAgIGNwcmludGYoIkxpbmsgYmV0d2VlbiAlcyAnJXMnICglYykgYW5kICVzICclcycgKCVjKSAlcy5cbiIsCisJCQkgICAgRnJvbVR5cGUsIEZyb21OYW1lLCAnQScrRnJvbUxpbmssCisJCQkgICAgVG9UeXBlLCAgIFRvTmFtZSwgICAnQScrVG9MaW5rLAorCQkJICAgIChDaGFuZ2U9PUNPTk5FQ1QpID8gImVzdGFibGlzaGVkIiA6ICJkaXNjb25uZWN0ZWQiKTsKK30KKworLyoKKyoqIFJJT1JlbW92ZUZyb21TYXZlZFRhYmxlIDoKKyoqCisqKiBEZWxldGUgYW5kIFJUQSBlbnRyeSBmcm9tIHRoZSBzYXZlZCB0YWJsZSBnaXZlbiB0byB1cworKiogYnkgdGhlIGNvbmZpZ3VyYXRpb24gcHJvZ3JhbS4KKyovCitzdGF0aWMgaW50CitSSU9SZW1vdmVGcm9tU2F2ZWRUYWJsZShzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBNYXAgKnBNYXApCit7CisgICAgaW50CQllbnRyeTsKKworICAgIC8qCisgICAgKiogV2UgbG9vcCBmb3IgYWxsIGVudHJpZXMgZXZlbiBhZnRlciBmaW5kaW5nIGFuIGVudHJ5IGFuZAorICAgICoqIHplcm9pbmcgaXQgYmVjYXVzZSB3ZSBtYXkgaGF2ZSB0d28gZW50cmllcyB0byBkZWxldGUgaWYKKyAgICAqKiBpdCdzIGEgMTYgcG9ydCBSVEEuCisgICAgKi8KKyAgICBmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBUT1RBTF9NQVBfRU5UUklFUzsgZW50cnkrKykKKyAgICB7CisJaWYgKHAtPlJJT1NhdmVkVGFibGVbZW50cnldLlJ0YVVuaXF1ZU51bSA9PSBwTWFwLT5SdGFVbmlxdWVOdW0pCisJeworCSAgICBiemVybygoY2FkZHJfdCkmcC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0sIHNpemVvZihzdHJ1Y3QgTWFwKSk7CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKgorKiogUklPQ2hlY2tEaXNjb25uZWN0ZWQgOgorKioKKyoqIFNjYW4gdGhlIHVuaXQgbGlua3MgdG8gYW5kIHJldHVybiB6ZXJvIGlmIHRoZSB1bml0IGlzIGNvbXBsZXRlbHkKKyoqIGRpc2Nvbm5lY3RlZC4KKyovCitzdGF0aWMgaW50CitSSU9GcmVlRGlzY29ubmVjdGVkKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IEhvc3QgKkhvc3RQLCBpbnQgdW5pdCkKK3sKKyAgICBpbnQJCWxpbms7CisKKworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSSU9GcmVlRGlzY29ubmVjdCB1bml0ICVkXG4iLCB1bml0KTsKKyAgICAvKgorICAgICoqIElmIHRoZSBzbG90IGlzIHRlbnRhdGl2ZSBhbmQgZG9lcyBub3QgYmVsb25nIHRvIHRoZQorICAgICoqIHNlY29uZCBoYWxmIG9mIGEgMTYgcG9ydCBSVEEgdGhlbiBzY2FuIHRvIHNlZSBpZgorICAgICoqIGlzIGRpc2Nvbm5lY3RlZC4KKyAgICAqLworICAgIGZvciAobGluayA9IDA7IGxpbmsgPCBMSU5LU19QRVJfVU5JVDsgbGluaysrKQorICAgIHsKKwlpZiAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uVG9wb2xvZ3lbbGlua10uVW5pdCAhPSBST1VURV9ESVNDT05ORUNUKQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICAvKgorICAgICoqIElmIG5vdCBhbGwgbGlua3MgYXJlIGRpc2Nvbm5lY3RlZCB0aGVuIHdlIGNhbiBmb3JnZXQgYWJvdXQgaXQuCisgICAgKi8KKyAgICBpZiAobGluayA8IExJTktTX1BFUl9VTklUKQorCSAgICByZXR1cm4gMTsKKworI2lmIE5FRURfVE9fRklYX1RISVMKKyAgICAvKiBPayBzbyBhbGwgdGhlIGxpbmtzIGFyZSBkaXNjb25uZWN0ZWQuIEJ1dCB3ZSBtYXkgaGF2ZSBvbmx5IGp1c3QKKyAgICAqKiBtYWRlIHRoaXMgc2xvdCB0ZW50YXRpdmUgYW5kIG5vdCB5ZXQgcmVjZWl2ZWQgYSB0b3BvbG9neSB1cGRhdGUuCisgICAgKiogTGV0cyBjaGVjayBob3cgbG9uZyBhZ28gd2UgbWFkZSBpdCB0ZW50YXRpdmUuCisgICAgKi8KKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiSnVzdCBhYm91dCB0byBjaGVjayBMQk9MVCBvbiBlbnRyeSAlZFxuIiwgdW5pdCk7CisgICAgaWYgKGRydl9nZXRwYXJtKExCT0xULCAodWxvbmdfdCAqKSAmY3VycmVudF90aW1lKSkKKyAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgImRydl9nZXRwYXJtKExCT0xULC4uLi4pIEZhaWxlZC5cbiIpOworCisgICAgZWxhcHNlX3RpbWUgPSBjdXJyZW50X3RpbWUgLSBUZW50VGltZVt1bml0XTsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiZWxhcHNlICVkID0gY3VycmVudCAlZCAtIHRlbnQgJWQgKCVkIHVzZWMpXG4iLAorICAgICAgICBlbGFwc2VfdGltZSwgY3VycmVudF90aW1lLCBUZW50VGltZVt1bml0XSwgZHJ2X2h6dG91c2VjKGVsYXBzZV90aW1lKSk7CisgICAgaWYgKGRydl9oenRvdXNlYyhlbGFwc2VfdGltZSkgPCBXQUlUX1RPX0ZJTklTSCkKKyAgICB7CisgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiU2tpcHBpbmcgc2xvdCAlZCwgbm90IHRpbWVkIG91dCB5ZXQgJWRcbiIsCisgICAgICAgICAgICB1bml0LCBkcnZfaHp0b3VzZWMoZWxhcHNlX3RpbWUpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICoqIFdlIGhhdmUgZm91bmQgYW4gdXNhYmxlIHNsb3QuCisgICAgKiogSWYgaXQgaXMgaGFsZiBvZiBhIDE2IHBvcnQgUlRBIHRoZW4gZGVsZXRlIHRoZSBvdGhlciBoYWxmLgorICAgICovCisgICAgaWYgKEhvc3RQLT5NYXBwaW5nW3VuaXRdLklEMiAhPSAwKQorICAgIHsKKwlpbnQgbk90aGVyID0gKEhvc3RQLT5NYXBwaW5nW3VuaXRdLklEMikgLTE7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUmlvRnJlZWRpcyBzZWNvbmQgc2xvdCAlZC5cbiIsIG5PdGhlcik7CisJYnplcm8oKGNhZGRyX3QpJkhvc3RQLT5NYXBwaW5nW25PdGhlcl0sIHNpemVvZihzdHJ1Y3QgTWFwKSk7CisgICAgfQorICAgIFJJT1JlbW92ZUZyb21TYXZlZFRhYmxlKHAsICZIb3N0UC0+TWFwcGluZ1t1bml0XSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorKiogUklPRmluZEZyZWVJRCA6CisqKgorKiogVGhpcyBmdW5jdGlvbiBzY2FucyB0aGUgZ2l2ZW4gaG9zdCB0YWJsZSBmb3IgZWl0aGVyIG9uZQorKiogb3IgdHdvIGZyZWUgdW5pdCBJRCdzLgorKi8KK2ludAorUklPRmluZEZyZWVJRChzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBIb3N0ICpIb3N0UCwgdWludCAqcElEMSwgdWludCAqcElEMikKK3sKKyAgICBpbnQgdW5pdCx0ZW1wSUQ7CisKKyAgICAvKgorICAgICoqIEluaXRpYWxpc2UgdGhlIElEJ3MgdG8gTUFYX1JVUC4KKyAgICAqKiBXZSBkbyB0aGlzIHRvIG1ha2UgdGhlIGxvb3AgZm9yIHNldHRpbmcgdGhlIElEJ3MgYXMgc2ltcGxlIGFzCisgICAgKiogcG9zc2libGUuCisgICAgKi8KKyAgICAqcElEMSA9IE1BWF9SVVA7CisgICAgaWYgKHBJRDIgIT0gTlVMTCkKKwkqcElEMiA9IE1BWF9SVVA7CisKKyAgICAvKgorICAgICoqIFNjYW4gYWxsIGVudHJpZXMgb2YgdGhlIGhvc3QgbWFwcGluZyB0YWJsZSBmb3IgZnJlZSBzbG90cy4KKyAgICAqKiBXZSBzY2FuIGZvciBmcmVlIHNsb3RzIGZpcnN0IGFuZCB0aGVuIGlmIHRoYXQgaXMgbm90IHN1Y2Nlc3NmdWwKKyAgICAqKiB3ZSBzdGFydCBhbGwgb3ZlciBhZ2FpbiBsb29raW5nIGZvciB0ZW50YXRpdmUgc2xvdHMgd2UgY2FuIHJlLXVzZS4KKyAgICAqLworICAgIGZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfUlVQOyB1bml0KyspCisgICAgeworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTY2FubmluZyB1bml0ICVkXG4iLHVuaXQpOworCS8qCisJKiogSWYgdGhlIGZsYWdzIGFyZSB6ZXJvIHRoZW4gdGhlIHNsb3QgaXMgZW1wdHkuCisJKi8KKwlpZiAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uRmxhZ3MgPT0gMCkKKwl7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICIgICAgICBUaGlzIHNsb3QgaXMgZW1wdHkuXG4iKTsKKwkgICAgLyoKKwkgICAgKiogSWYgd2UgaGF2ZW4ndCBhbGxvY2F0ZWQgdGhlIGZpcnN0IElEIHRoZW4gZG8gaXQgbm93LgorCSAgICAqLworCSAgICBpZiAoKnBJRDEgPT0gTUFYX1JVUCkKKwkgICAgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiTWFrZSB0ZW50YXRpdmUgZW50cnkgZm9yIGZpcnN0IHVuaXQgJWRcbiIsIHVuaXQpOworCQkqcElEMSA9IHVuaXQ7CisKKwkJLyoKKwkJKiogSWYgdGhlIHNlY29uZCBJRCBpcyBub3QgbmVlZGVkIHRoZW4gd2UgY2FuIHJldHVybgorCQkqKiBub3cuCisJCSovCisJCWlmIChwSUQyID09IE5VTEwpCisJCSAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyoKKwkJKiogQWxsb2NhdGUgdGhlIHNlY29uZCBzbG90IGFuZCByZXR1cm4uCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJNYWtlIHRlbnRhdGl2ZSBlbnRyeSBmb3Igc2Vjb25kIHVuaXQgJWRcbiIsIHVuaXQpOworCQkqcElEMiA9IHVuaXQ7CisJCXJldHVybiAwOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qCisgICAgKiogSWYgd2UgbWFuYWdlIHRvIGNvbWUgb3V0IG9mIHRoZSBmcmVlIHNsb3QgbG9vcCB0aGVuIHdlCisgICAgKiogbmVlZCB0byBzdGFydCBhbGwgb3ZlciBhZ2FpbiBsb29raW5nIGZvciB0ZW50YXRpdmUgc2xvdHMKKyAgICAqKiB0aGF0IHdlIGNhbiByZS11c2UuCisgICAgKi8KKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiU3RhcnRpbmcgdG8gc2NhbiBmb3IgdGVudGF0aXZlIHNsb3RzXG4iKTsKKyAgICBmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX1JVUDsgdW5pdCsrKQorICAgIHsKKwlpZiAoKChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyAmIFNMT1RfVEVOVEFUSVZFKSB8fAorCSAgICAgICAgICAgICAgICAgICAgICAgKEhvc3RQLT5NYXBwaW5nW3VuaXRdLkZsYWdzID09IDApKSAgJiYgISAKKwkgICAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uRmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCApKQorCXsKKwkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIiAgICBTbG90ICVkIGxvb2tzIHByb21pc2luZy5cbiIsdW5pdCk7CisKKwkgICAgaWYodW5pdCA9PSAqcElEMSkKKwkgICAgeworCSAgICAJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIiAgICBObyBpdCBpc24ndCwgaXRzIHRoZSAxc3QgaGFsZlxuIik7CisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgKiogU2xvdCBpcyBUZW50YXRpdmUgb3IgRW1wdHksIGJ1dCBub3QgYSB0ZW50YXRpdmUgc2Vjb25kIAorCSAgICAqKiBzbG90IG9mIGEgMTYgcG9ydGVyLgorCSAgICAqKiBBdHRlbXB0IHRvIGZyZWUgdXAgdGhpcyBzbG90IChhbmQgaXRzIHBhcm50ZXIgaWYKKwkgICAgKiogaXQgaXMgYSAxNiBwb3J0IHNsb3QuIFRoZSBzZWNvbmQgc2xvdCB3aWxsIGJlY29tZQorCSAgICAqKiBlbXB0eSBhZnRlciBhIGNhbGwgdG8gUklPRnJlZURpc2Nvbm5lY3RlZCBzbyB0aGF0cyB3aHkKKwkgICAgKiogd2UgbG9vayBmb3IgZW1wdHkgc2xvdHMgYWJvdmUgIGFzIHdlbGwpLgorCSAgICAqLworCSAgICBpZiAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uRmxhZ3MgIT0gMCkgCisJICAgIAlpZiAoUklPRnJlZURpc2Nvbm5lY3RlZChwLCBIb3N0UCwgdW5pdCkgIT0gMCkKKwkJCSAgICBjb250aW51ZTsKKwkgICAgLyoKKwkgICAgKiogSWYgd2UgaGF2ZW4ndCBhbGxvY2F0ZWQgdGhlIGZpcnN0IElEIHRoZW4gZG8gaXQgbm93LgorCSAgICAqLworCSAgICBpZiAoKnBJRDEgPT0gTUFYX1JVUCkKKwkgICAgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiR3JhYiB0ZW50YXRpdmUgZW50cnkgZm9yIGZpcnN0IHVuaXQgJWRcbiIsIHVuaXQpOworCQkqcElEMSA9IHVuaXQ7CisKKwkJLyoKKwkJKiogQ2xlYXIgb3V0IHRoaXMgc2xvdCBub3cgdGhhdCB3ZSBpbnRlbmQgdG8gdXNlIGl0LgorCQkqLworCQliemVybygmSG9zdFAtPk1hcHBpbmdbdW5pdF0sIHNpemVvZihzdHJ1Y3QgTWFwKSk7CisKKwkJLyoKKwkJKiogSWYgdGhlIHNlY29uZCBJRCBpcyBub3QgbmVlZGVkIHRoZW4gd2UgY2FuIHJldHVybgorCQkqKiBub3cuCisJCSovCisJCWlmIChwSUQyID09IE5VTEwpCisJCSAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyoKKwkJKiogQWxsb2NhdGUgdGhlIHNlY29uZCBzbG90IGFuZCByZXR1cm4uCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJHcmFiIHRlbnRhdGl2ZS9lbXB0eSAgZW50cnkgZm9yIHNlY29uZCB1bml0ICVkXG4iLAorCQkgICAgICB1bml0KTsKKwkJKnBJRDIgPSB1bml0OworCisJCS8qCisJCSoqIENsZWFyIG91dCB0aGlzIHNsb3Qgbm93IHRoYXQgd2UgaW50ZW5kIHRvIHVzZSBpdC4KKwkJKi8KKwkJYnplcm8oJkhvc3RQLT5NYXBwaW5nW3VuaXRdLCBzaXplb2Yoc3RydWN0IE1hcCkpOworCisJCS8qIEF0IHRoaXMgcG9pbnQgdW5kZXIgdGhlIHJpZ2h0KHdyb25nPykgY29uZGl0aW9ucworCQkqKiB3ZSBtYXkgaGF2ZSBhIGZpcnN0IHVuaXQgSUQgYmVpbmcgaGlnaGVyIHRoYW4gdGhlCisJCSoqIHNlY29uZCB1bml0IElELiBUaGlzIGlzIGEgYmFkIGlkZWEgaWYgd2UgYXJlIGFib3V0CisJCSoqIHRvIGZpbGwgdGhlIHNsb3RzIHdpdGggYSAxNiBwb3J0IFJUQS4KKwkJKiogQmV0dGVyIGNoZWNrIGFuZCBzd2FwIHRoZW0gb3Zlci4KKwkJKi8KKworCQlpZiAoKnBJRDEgPiAqcElEMikKKwkJeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlN3YXBwaW5nIElEUyAlZCAlZFxuIiwgKnBJRDEsICpwSUQyKTsKKwkJCXRlbXBJRCA9ICpwSUQxOworCQkJKnBJRDEgPSAqcElEMjsKKwkJCSpwSUQyID0gdGVtcElEOworCQl9CisJCXJldHVybiAwOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qCisgICAgKiogSWYgd2UgbWFuYWdlIHRvIGdldCB0byB0aGUgZW5kIG9mIHRoZSBzZWNvbmQgbG9vcCB0aGVuIHdlCisgICAgKiogY2FuIGdpdmUgdXAgYW5kIHJldHVybiBhIGZhaWx1cmUuCisgICAgKi8KKyAgICByZXR1cm4gMTsKK30KKworCisvKgorKiogVGhlIGxpbmsgc3dpdGNoIHNjZW5hcmlvLgorKioKKyoqIFJ0YSBXdW4gKEEpIGlzIGNvbm5lY3RlZCB0byBUdXcgKEEpLgorKiogVGhlIHRhYmxlcyBhcmUgYWxsIHVwIHRvIGRhdGUsIGFuZCB0aGUgc3lzdGVtIGlzIE9LLgorKioKKyoqIElmIFd1biAoQSkgaXMgbm93IG1vdmVkIHRvIFd1biAoQikgYmVmb3JlIFd1biAoQSkgY2FuCisqKiBiZWNvbWUgZGlzY29ubmVjdGVkLCB0aGVuIHRoZSBmb2xsb3cgaGFwcGVuczoKKyoqCisqKiBUdXcgKEEpIHNwb3RzIHRoZSBjaGFuZ2Ugb2YgdW5pdDpsaW5rIGF0IHRoZSBvdGhlciBlbmQKKyoqIG9mIGl0cyBsaW5rIGFuZCBUdXcgc2VuZHMgYSB0b3BvbG9neSBwYWNrZXQgcmVmbGVjdGluZworKiogdGhlIGNoYW5nZTogVHV3IChBKSBub3cgZGlzY29ubmVjdGVkIGZyb20gV3VuIChBKSwgYW5kCisqKiB0aGlzIGlzIGNsb3NlbHkgZm9sbG93ZWQgYnkgYSBwYWNrZXQgaW5kaWNhdGluZyB0aGF0IAorKiogVHV3IChBKSBpcyBub3cgY29ubmVjdGVkIHRvIFd1biAoQikuCisqKgorKiogV3VuIChCKSB3aWxsIHNwb3QgdGhhdCBpdCBoYXMgbm93IGJlY29tZSBjb25uZWN0ZWQsIGFuZAorKiogV3VuIHdpbGwgc2VuZCBhIHRvcG9sb2d5IHBhY2tldCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQKKyoqIGJvdGggV3VuIChBKSBhbmQgV3VuIChCKSBpcyBjb25uZWN0ZWQgdG8gVHV3IChBKS4KKyoqCisqKiBFdmVudHVhbGx5IFd1biAoQSkgcmVhbGlzZXMgdGhhdCBpdCBpcyBub3cgZGlzY29ubmVjdGVkCisqKiBhbmQgV3VuIHdpbGwgc2VuZCBvdXQgYSB0b3BvbG9neSBwYWNrZXQgaW5kaWNhdGluZyB0aGF0CisqKiBXdW4gKEEpIGlzIG5vdyBkaXNjb25uZWN0ZWQuCisqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9zcGFjZS5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9zcGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjA5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3NwYWNlLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHJpb3NwYWNlLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEzCisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIylyaW9zcGFjZS5oCTEuMgorKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fcmlvX3Jpb3NwYWNlX2hfXworI2RlZmluZSBfX3Jpb19yaW9zcGFjZV9oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb3NwYWNlX2hfc2Njc18gPSAiQCgjKXJpb3NwYWNlLmgJMS4yIjsKKyNlbmRpZgorCisjZGVmaW5lCVJJT19MT0NBVE9SX0xFTgkxNgorI2RlZmluZQlNQVhfUklPX0JPQVJEUwk0CisKKy8qCisqKiBET05UIGNoYW5nZSB0aGlzIGZpbGUuIEF0IGFsbC4gVW5sZXNzIHlvdSBjYW4gcmVidWlsZCB0aGUgZW50aXJlCisqKiBkZXZpY2UgZHJpdmVyLCB3aGljaCB5b3UgcHJvYmFibHkgY2FuJ3QsIHRoZW4gdGhlIHJlc3Qgb2YgdGhlCisqKiBkcml2ZXIgd29uJ3Qgc2VlIGFueSBjaGFuZ2VzIHlvdSBtYWtlIGhlcmUuIFNvIGRvbid0IG1ha2UgYW55LgorKiogSW4gcGFydGljdWxhciwgaXQgd29uJ3QgYmUgYWJsZSB0byBzZWUgY2hhbmdlcyB0byBSSU9fU0xPVFMKKyovCisKK3N0cnVjdCBDb25mCit7CisJY2hhciAgICAgICAgIExvY2F0b3JbMjRdOworCXVuc2lnbmVkIGludCBTdGFydHVwVGltZTsKKwl1bnNpZ25lZCBpbnQgU2xvd0Nvb2s7CisJdW5zaWduZWQgaW50IEludHJQb2xsVGltZTsKKwl1bnNpZ25lZCBpbnQgQnJlYWtJbnRlcnZhbDsKKwl1bnNpZ25lZCBpbnQgVGltZXI7CisJdW5zaWduZWQgaW50IFJ0YUxvYWRCYXNlOworCXVuc2lnbmVkIGludCBIb3N0TG9hZEJhc2U7CisJdW5zaWduZWQgaW50IFhwSHo7CisJdW5zaWduZWQgaW50IFhwQ3BzOworCWNoYXIgICAgICAgICAqWHBPbjsKKwljaGFyICAgICAgICAgKlhwT2ZmOworCXVuc2lnbmVkIGludCBNYXhYcENwczsKKwl1bnNpZ25lZCBpbnQgTWluWHBDcHM7CisJdW5zaWduZWQgaW50IFNwaW5DbWRzOworCXVuc2lnbmVkIGludCBGaXJzdEFkZHI7CisJdW5zaWduZWQgaW50IExhc3RBZGRyOworCXVuc2lnbmVkIGludCBCdWZmZXJTaXplOworCXVuc2lnbmVkIGludCBMb3dXYXRlcjsKKwl1bnNpZ25lZCBpbnQgTGluZUxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgQ21kVGltZTsKK307CisKKy8qCisqKglCb2FyZCB0eXBlcyAtIHRoZXNlIE1VU1QgY29ycmVzcG9uZCB0byBwcm9kdWN0IGNvZGVzIQorKi8gCisjZGVmaW5lCVJJT19FTVBUWQkweDAKKyNkZWZpbmUJUklPX0VJU0EJMHgzCisjZGVmaW5lCVJJT19SVEFfMTYJMHg5CisjZGVmaW5lCVJJT19BVAkJMHhBCisjZGVmaW5lCVJJT19NQ0EJCTB4QgorI2RlZmluZQlSSU9fUENJCQkweEQKKyNkZWZpbmUJUklPX1JUQQkJMHhFCisKKy8qCisqKglCb2FyZCBkYXRhIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VkIGZvciBjb25maWd1cmF0aW9uIGluZm8KKyovCitzdHJ1Y3QJQnJkCit7CisgICAgdW5zaWduZWQgY2hhciBUeXBlOwkvKiBSSU9fRUlTQSwgUklPX01DQSwgUklPX0FULCBSSU9fRU1QVFkuLi4gKi8KKyAgICB1bnNpZ25lZCBjaGFyIEl2ZWM7CS8qIFBPTExFRCBvciBpdmVjIG51bWJlciAqLworICAgIHVuc2lnbmVkIGNoYXIgTW9kZTsJLyogQ29udHJvbCBzdHVmZiwgc2VlIGJlbG93ICovCit9OworCitzdHJ1Y3QJQm9hcmQKK3sKKyAgICBjaGFyICAgICAgIExvY2F0b3JbUklPX0xPQ0FUT1JfTEVOXTsKKyAgICBpbnQgICAgICAgIE51bVNsb3RzOworICAgIHN0cnVjdCBCcmQgQm9hcmRzW01BWF9SSU9fQk9BUkRTXTsKK307CisKKyNkZWZpbmUJQk9PVF9GUk9NX0xJTksJCTB4MDAKKyNkZWZpbmUJQk9PVF9GUk9NX1JBTQkJMHgwMQorI2RlZmluZQlFWFRFUk5BTF9CVVNfT0ZGCTB4MDAKKyNkZWZpbmUJRVhURVJOQUxfQlVTX09OCQkweDAyCisjZGVmaW5lCUlOVEVSUlVQVF9ESVNBQkxFCTB4MDAKKyNkZWZpbmUJSU5URVJSVVBUX0VOQUJMRQkweDA0CisjZGVmaW5lCUJZVEVfT1BFUkFUSU9OCQkweDAwCisjZGVmaW5lCVdPUkRfT1BFUkFUSU9OCQkweDA4CisjZGVmaW5lCVBPTExFRAkJCUlOVEVSUlVQVF9ESVNBQkxFCisjZGVmaW5lCUlSUV8xNQkJCSgweDAwIHwgSU5URVJSVVBUX0VOQUJMRSkKKyNkZWZpbmUJSVJRXzEyCQkJKDB4MTAgfCBJTlRFUlJVUFRfRU5BQkxFKQorI2RlZmluZQlJUlFfMTEJCQkoMHgyMCB8IElOVEVSUlVQVF9FTkFCTEUpCisjZGVmaW5lCUlSUV85CQkJKDB4MzAgfCBJTlRFUlJVUFRfRU5BQkxFKQorI2RlZmluZQlTTE9XX0xJTktTCQkweDAwCisjZGVmaW5lCUZBU1RfTElOS1MJCTB4NDAKKyNkZWZpbmUJU0xPV19BVF9CVVMJCTB4MDAKKyNkZWZpbmUJRkFTVF9BVF9CVVMJCTB4ODAKKyNkZWZpbmUJU0xPV19QQ0lfVFAJCTB4MDAKKyNkZWZpbmUJRkFTVF9QQ0lfVFAJCTB4ODAKKy8qCisqKglEZWJ1ZyBsZXZlbHMKKyovCisjZGVmaW5lCURCR19OT05FCTB4MDAwMDAwMDAKKworI2RlZmluZQlEQkdfSU5JVAkweDAwMDAwMDAxCisjZGVmaW5lCURCR19PUEVOCTB4MDAwMDAwMDIKKyNkZWZpbmUJREJHX0NMT1NFCTB4MDAwMDAwMDQKKyNkZWZpbmUJREJHX0lPQ1RMCTB4MDAwMDAwMDgKKworI2RlZmluZQlEQkdfUkVBRAkweDAwMDAwMDEwCisjZGVmaW5lCURCR19XUklURQkweDAwMDAwMDIwCisjZGVmaW5lCURCR19JTlRSCTB4MDAwMDAwNDAKKyNkZWZpbmUJREJHX1BST0MJMHgwMDAwMDA4MAorCisjZGVmaW5lCURCR19QQVJBTQkweDAwMDAwMTAwCisjZGVmaW5lCURCR19DTUQJCTB4MDAwMDAyMDAKKyNkZWZpbmUJREJHX1hQUklOVAkweDAwMDAwNDAwCisjZGVmaW5lCURCR19QT0xMCTB4MDAwMDA4MDAKKworI2RlZmluZQlEQkdfREFFTU9OCTB4MDAwMDEwMDAKKyNkZWZpbmUJREJHX0ZBSUwJMHgwMDAwMjAwMAorI2RlZmluZSBEQkdfTU9ERU0JMHgwMDAwNDAwMAorI2RlZmluZQlEQkdfTElTVAkweDAwMDA4MDAwCisKKyNkZWZpbmUJREJHX1JPVVRFCTB4MDAwMTAwMDAKKyNkZWZpbmUgREJHX1VUSUwgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgREJHX0JPT1QJMHgwMDA0MDAwMAorI2RlZmluZSBEQkdfQlVGRkVSCTB4MDAwODAwMDAKKworI2RlZmluZQlEQkdfTU9OCQkweDAwMTAwMDAwCisjZGVmaW5lIERCR19TUEVDSUFMICAgICAweDAwMjAwMDAwCisjZGVmaW5lCURCR19WUElYCTB4MDA0MDAwMDAKKyNkZWZpbmUJREJHX0ZMVVNICTB4MDA4MDAwMDAKKworI2RlZmluZQlEQkdfUUVOQUJMRQkweDAxMDAwMDAwCisKKyNkZWZpbmUJREJHX0FMV0FZUwkweDgwMDAwMDAwCisKKyNlbmRpZiAvKiBfX3Jpb19yaW9zcGFjZV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvdGFibGUuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmIyNmFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90YWJsZS5jCkBAIC0wLDAgKzEsMTA0NCBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlvdGFibGUuYworKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDcKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NTAKKyoqCisqKiAgaWRlbnQgQCgjKXJpb3RhYmxlLmMJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvdGFibGVfY19zY2NzXyA9ICJAKCMpcmlvdGFibGUuYwkxLjIiOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgorCisKKyNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKKyNpbmNsdWRlICJyaW9fbGludXguaCIKKyNpbmNsdWRlICJ0eXBkZWYuaCIKKyNpbmNsdWRlICJwa3QuaCIKKyNpbmNsdWRlICJkYWVtb24uaCIKKyNpbmNsdWRlICJyaW8uaCIKKyNpbmNsdWRlICJyaW9zcGFjZS5oIgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgImNtZHBrdC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInJpb3R5cGVzLmgiCisjaW5jbHVkZSAicnVwLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInJpb2RydnIuaCIKKyNpbmNsdWRlICJyaW9pbmZvLmgiCisjaW5jbHVkZSAiZnVuYy5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgInBjaS5oIgorCisjaW5jbHVkZSAicGFybW1hcC5oIgorI2luY2x1ZGUgInVuaXhydXAuaCIKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInBoYi5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJjbWRibGsuaCIKKyNpbmNsdWRlICJyb3V0ZS5oIgorI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJjaXJydXMuaCIKKyNpbmNsdWRlICJyaW9pb2N0bC5oIgorI2luY2x1ZGUgInBhcmFtLmgiCisjaW5jbHVkZSAibGlzdC5oIgorI2luY2x1ZGUgInNhbS5oIgorI2luY2x1ZGUgInByb3RzdHMuaCIKKworLyoKKyoqIEEgY29uZmlndXJhdGlvbiB0YWJsZSBoYXMgYmVlbiBsb2FkZWQuIEl0IGlzIG5vdyB1cCB0byB1cworKiogdG8gc29ydCBpdCBvdXQgYW5kIHVzZSB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIHRoZXJlaW4uCisqLworaW50CitSSU9OZXdUYWJsZShwKQorc3RydWN0IHJpb19pbmZvICoJcDsKK3sKKwlpbnQgSG9zdCwgSG9zdDEsIEhvc3QyLCBOYW1lSXNVbmlxdWUsIEVudHJ5LCBTdWJFbnQ7CisJc3RydWN0IE1hcCAqTWFwUDsKKwlzdHJ1Y3QgTWFwICpIb3N0TWFwUDsKKwlzdHJ1Y3QgSG9zdCAqSG9zdFA7CisKKwljaGFyICpjcHRyOworCisJLyoKKwkqKiBXZSBoYXZlIGJlZW4gc2VudCBhIG5ldyB0YWJsZSB0byBpbnN0YWxsLiBXZSBuZWVkIHRvIGJyZWFrCisJKiogaXQgZG93biBpbnRvIGxpdHRsZSBiaXRzIGFuZCBzcHJlYWQgaXQgYXJvdW5kIGEgYml0IHRvIHNlZQorCSoqIHdoYXQgd2UgaGF2ZSBnb3QuCisJKi8KKwkvKgorCSoqIFRoaW5ncyB0byBjaGVjazoKKwkqKiAodGhpbmdzIG1hcmtlZCAneHgnIGFyZW4ndCBjaGVja2VkIGFueSBtb3JlISkKKwkqKiAoMSkJVGhhdCB0aGVyZSBhcmUgbm8gYm9vdGVkIEhvc3RzL1JUQXMgb3V0IHRoZXJlLgorCSoqICgyKQlUaGF0IHRoZSBuYW1lcyBhcmUgcHJvcGVybHkgZm9ybWVkCisJKiogKDMpCVRoYXQgYmxhbmsgZW50cmllcyByZWFsbHkgYXJlLgorCSoqIHh4ICg0KQlUaGF0IGhvc3RzIG1lbnRpb25lZCBpbiB0aGUgdGFibGUgYWN0dWFsbHkgZXhpc3QuIHh4CisJKiogKDUpCVRoYXQgdGhlIElEcyBhcmUgdW5pcXVlIChwZXIgaG9zdCkuCisJKiogKDYpCVRoYXQgaG9zdCBJRHMgYXJlIHplcm8KKwkqKiAoNykJVGhhdCBwb3J0IG51bWJlcnMgYXJlIHZhbGlkCisJKiogKDgpCVRoYXQgcG9ydCBudW1iZXJzIGFyZW4ndCBkdXBsaWNhdGVkCisJKiogKDkpCVRoYXQgbmFtZXMgYXJlbid0IGR1cGxpY2F0ZWQKKwkqKiB4eCAoMTApIFRoYXQgaG9zdHMgdGhhdCBhY3R1YWxseSBleGlzdCBhcmUgbWVudGlvbmVkIGluIHRoZSB0YWJsZS4geHgKKwkqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoMSlcbiIpOyAKKwlpZiAoIHAtPlJJT1N5c3RlbVVwICkgewkJLyogKDEpICovCisJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9IQVNfQUxSRUFEWV9CRUVOX0JPT1RFRDsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwLT5SSU9FcnJvci5FcnJvciA9IE5PVEhJTkdfV1JPTkdfQVRfQUxMOworCXAtPlJJT0Vycm9yLkVudHJ5ID0gLTE7CisJcC0+UklPRXJyb3IuT3RoZXIgPSAtMTsKKworCWZvciAoIEVudHJ5PTA7IEVudHJ5PFRPVEFMX01BUF9FTlRSSUVTOyBFbnRyeSsrICkgeworCQlNYXBQID0gJnAtPlJJT0Nvbm5lY3RUYWJsZVtFbnRyeV07CisJCWlmICgoTWFwUC0+RmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkgPT0gMCkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZygyKVxuIik7CisJCQljcHRyID0gTWFwUC0+TmFtZTsJCS8qICgyKSAqLworCQkJY3B0cltNQVhfTkFNRV9MRU4tMV09J1wwJzsKKwkJCWlmICggY3B0clswXT09J1wwJyApIHsKKwkJCQliY29weShNYXBQLT5SdGFVbmlxdWVOdW0/IlJUQQlOTiI6IkhPU1QgTk4iLE1hcFAtPk5hbWUsOCk7CisJCQkJTWFwUC0+TmFtZVs1XSA9ICcwJytFbnRyeS8xMDsKKwkJCQlNYXBQLT5OYW1lWzZdID0gJzAnK0VudHJ5JTEwOworCQkJfQorCQkJd2hpbGUgKCAqY3B0ciApIHsKKwkJCQlpZiAoICpjcHRyPCcgJyB8fCAqY3B0cj4nficgKSB7CisJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQkFEX0NIQVJBQ1RFUl9JTl9OQU1FOworCQkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQljcHRyKys7CisJCQl9CisJCX0KKworCQkvKgorCQkqKiBJZiB0aGUgZW50cnkgc2F2ZWQgd2FzIGEgdGVudGF0aXZlIGVudHJ5IHRoZW4ganVzdCBmb3JnZXQKKwkJKiogYWJvdXQgaXQuCisJCSovCisJCWlmICggTWFwUC0+RmxhZ3MgJiBTTE9UX1RFTlRBVElWRSApIHsKKwkJCU1hcFAtPkhvc3RVbmlxdWVOdW0gPSAwOworCQkJTWFwUC0+UnRhVW5pcXVlTnVtID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZygzKVxuIik7CisJCWlmICggIU1hcFAtPlJ0YVVuaXF1ZU51bSAmJiAhTWFwUC0+SG9zdFVuaXF1ZU51bSApIHsgLyogKDMpICovCisJCQlpZiAoIE1hcFAtPklEIHx8IE1hcFAtPlN5c1BvcnQgfHwgTWFwUC0+RmxhZ3MgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIiVzIHByZXRlbmRpbmcgdG8gYmUgZW1wdHkgYnV0IGlzbid0XG4iLE1hcFAtPk5hbWUpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gVEFCTEVfRU5UUllfSVNOVF9QUk9QRVJMWV9OVUxMOworCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCX0KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICIhUklPOiBEYWVtb246IHRlc3QgKDMpIHBhc3Nlc1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoNClcbiIpOworCQlmb3IgKCBIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsgLyogKDQpICovCisJCQlpZiAoIHAtPlJJT0hvc3RzW0hvc3RdLlVuaXF1ZU51bT09TWFwUC0+SG9zdFVuaXF1ZU51bSApIHsKKwkJCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKKwkJCQkvKgorCQkJCSoqIGhhdmluZyBkb25lIHRoZSBsb29rdXAsIHdlIGRvbid0IHJlYWxseSB3YW50IHRvIGRvCisJCQkJKiogaXQgYWdhaW4sIHNvIGhhbmcgdGhlIGhvc3QgbnVtYmVyIGluIGEgc2FmZSBwbGFjZQorCQkJCSovCisJCQkJTWFwUC0+VG9wb2xvZ3lbMF0uVW5pdCA9IEhvc3Q7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIEhvc3QgPj0gcC0+UklPTnVtSG9zdHMgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUlRBICVzIGhhcyB1bmtub3duIGhvc3QgdW5pcXVlIG51bWJlciAweCV4XG4iLAorCQkJCQkJCQkJTWFwUC0+TmFtZSwgTWFwUC0+SG9zdFVuaXF1ZU51bSk7CisJCQlNYXBQLT5Ib3N0VW5pcXVlTnVtID0gMDsKKwkJCS8qIE1hcFAtPlJ0YVVuaXF1ZU51bQk9IDA7ICovCisJCQkvKiBNYXBQLT5JRAkJCT0gMDsgKi8KKwkJCS8qIE1hcFAtPkZsYWdzCQkgPSAwOyAqLworCQkJLyogTWFwUC0+U3lzUG9ydAkJID0gMDsgKi8KKwkJCS8qIE1hcFAtPk5hbWVbMF0JCSA9IDA7ICovCisJCQljb250aW51ZTsKKwkJfQorCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoNSlcbiIpOyAKKwkJaWYgKCBNYXBQLT5SdGFVbmlxdWVOdW0gKSB7IC8qICg1KSAqLworCQkJaWYgKCAhTWFwUC0+SUQgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJTzogUlRBICVzIGhhcyBiZWVuIGFsbG9jYXRlZCBhbiBJRCBvZiB6ZXJvIVxuIiwKKwkJCQkJCQlNYXBQLT5OYW1lKTsKKwkJCQlwLT5SSU9FcnJvci5FcnJvcgkJID0gWkVST19SVEFfSUQ7CisJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJaWYgKCBNYXBQLT5JRCA+IE1BWF9SVVAgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJTzogUlRBICVzIGhhcyBiZWVuIGFsbG9jYXRlZCBhbiBpbnZhbGlkIElEICVkXG4iLAorCQkJCQkJCU1hcFAtPk5hbWUsIE1hcFAtPklEKTsKKwkJCQlwLT5SSU9FcnJvci5FcnJvciA9IElEX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJZm9yICggU3ViRW50PTA7IFN1YkVudDxFbnRyeTsgU3ViRW50KysgKSB7CisJCQkJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtID09IAorCQkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uSG9zdFVuaXF1ZU51bSAmJiAKKwkJCQkJCU1hcFAtPklEID09IHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLklEICkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiRHVwbC4gSUQgbnVtYmVyIGFsbG9jYXRlZCB0byBSVEEgJXMgYW5kIFJUQSAlc1xuIiwKKwkJCQkJCQlNYXBQLT5OYW1lLCBwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5OYW1lKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBEVVBMSUNBVEVEX1JUQV9JRDsKKwkJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQkJcC0+UklPRXJyb3IuT3RoZXIgPSBTdWJFbnQ7CisJCQkJCXJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCS8qCisJCQkJKiogSWYgdGhlIFJ0YVVuaXF1ZU51bSBpcyB0aGUgc2FtZSwgaXQgbWF5IGJlIGxvb2tpbmcgYXQgYm90aAorCQkJCSoqIGVudHJpZXMgZm9yIGEgMTYgcG9ydCBSVEEsIHNvIGNoZWNrIHRoZSBpZHMKKwkJCQkqLworCQkJCWlmICgoTWFwUC0+UnRhVW5pcXVlTnVtID09IAorCQkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uUnRhVW5pcXVlTnVtKQorCQkJCSAJCSYmIChNYXBQLT5JRDIgIT0gcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uSUQpKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgaGFzIGR1cGxpY2F0ZSB1bmlxdWUgbnVtYmVyXG4iLE1hcFAtPk5hbWUpOworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUlRBICVzIGhhcyBkdXBsaWNhdGUgdW5pcXVlIG51bWJlclxuIiwKKwkJCQkJCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5OYW1lKTsKKwkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBEVVBMSUNBVEVfVU5JUVVFX05VTUJFUjsKKwkJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQkJcC0+UklPRXJyb3IuT3RoZXIgPSBTdWJFbnQ7CisJCQkJCXJldHVybiAtRU5YSU87CisJCQkJfQorCQkJfQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg3YSlcbiIpOyAKKwkJCS8qICg3YSkgKi8KKwkJCWlmICgoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSYmKE1hcFAtPlN5c1BvcnQgJSBQT1JUU19QRVJfUlRBKSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJUVFkgUG9ydCBudW1iZXIgJWQtUlRBICVzIGlzIG5vdCBhIG11bHRpcGxlIG9mICVkIVxuIiwKKwkJCQkJKGludClNYXBQLT5TeXNQb3J0LE1hcFAtPk5hbWUsIFBPUlRTX1BFUl9SVEEpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gVFRZX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg3YilcbiIpOyAKKwkJCS8qICg3YikgKi8KKwkJCWlmICgoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSYmKE1hcFAtPlN5c1BvcnQgPj0gUklPX1BPUlRTKSkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJUVFkgUG9ydCBudW1iZXIgJWQgZm9yIFJUQSAlcyBpcyB0b28gYmlnXG4iLAorCQkJCQkJCShpbnQpTWFwUC0+U3lzUG9ydCwgTWFwUC0+TmFtZSk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlmb3IgKCBTdWJFbnQ9MDsgU3ViRW50PEVudHJ5OyBTdWJFbnQrKyApIHsKKwkJCQlpZiAoIHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QgKQorCQkJCQkJY29udGludWU7CisJCQkJaWYgKCBwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5SdGFVbmlxdWVOdW0gKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoOClcbiIpOyAKKwkJCQkJLyogKDgpICovCisJCQkJCWlmICggKE1hcFAtPlN5c1BvcnQgIT0gTk9fUE9SVCkgJiYgKE1hcFAtPlN5c1BvcnQgPT0gCisJCQkJCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5TeXNQb3J0KSApIHsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXM6c2FtZSBUVFkgcG9ydCAjIGFzIFJUQSAlcyAoJWQpXG4iLAorCQkJCQkJCU1hcFAtPk5hbWUsIHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLk5hbWUsCisJCQkJCQkJKGludClNYXBQLT5TeXNQb3J0KTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gVFRZX05VTUJFUl9JTl9VU0U7CisJCQkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCQkJcC0+UklPRXJyb3IuT3RoZXIgPSBTdWJFbnQ7CisJCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCQl9CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoOSlcbiIpOyAKKwkJCQkJaWYgKHN0cmNtcChNYXBQLT5OYW1lLAorCQkJCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLk5hbWUpPT0wICYmICEoTWFwUC0+RmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkpIHsgLyogKDkpICovCisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUlRBIG5hbWUgJXMgdXNlZCB0d2ljZVxuIiwgTWFwUC0+TmFtZSk7CisJCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5BTUVfVVNFRF9UV0lDRTsKKwkJCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CisJCQkJCQlwLT5SSU9FcnJvci5PdGhlciA9IFN1YkVudDsKKwkJCQkJCXJldHVybiAtRU5YSU87CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7IC8qICg2KSAqLworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg2KVxuIik7IAorCQkJaWYgKCBNYXBQLT5JRCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPOkhPU1QgJXMgaGFzIGJlZW4gYWxsb2NhdGVkIElEIHRoYXQgaXNuJ3QgemVybyFcbiIsCisJCQkJCU1hcFAtPk5hbWUpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9JRF9OT1RfWkVSTzsKKwkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlpZiAoIE1hcFAtPlN5c1BvcnQgIT0gTk9fUE9SVCApIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPOiBIT1NUICVzIGhhcyBiZWVuIGFsbG9jYXRlZCBwb3J0IG51bWJlcnMhXG4iLAorCQkJCQlNYXBQLT5OYW1lKTsKKwkJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfU1lTUE9SVF9CQUQ7CisJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQl9CisJfQorCisJLyoKKwkqKiB3b3chIGlmIHdlIGdldCBoZXJlIHRoZW4gaXQncyBhIGdvb2R5IQorCSovCisKKwkvKgorCSoqIFplcm8gdGhlIChvbGQpIGVudHJpZXMgZm9yIGVhY2ggaG9zdC4uLgorCSovCisJZm9yICggSG9zdD0wOyBIb3N0PFJJT19IT1NUUzsgSG9zdCsrICkgeworCQlmb3IgKCBFbnRyeT0wOyBFbnRyeTxNQVhfUlVQOyBFbnRyeSsrICkgeworCQkJYnplcm8oKGNhZGRyX3QpJnAtPlJJT0hvc3RzW0hvc3RdLk1hcHBpbmdbRW50cnldLCAKKwkJCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBNYXApKTsKKwkJfQorCQliemVybygoY2FkZHJfdCkmcC0+UklPSG9zdHNbSG9zdF0uTmFtZVswXSwKKwkJCQkJCQkJc2l6ZW9mKHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUpICk7CisJfQorCisJLyoKKwkqKiBDb3B5IGluIHRoZSBuZXcgdGFibGUgZW50cmllcworCSovCisJZm9yICggRW50cnk9MDsgRW50cnk8IFRPVEFMX01BUF9FTlRSSUVTOyBFbnRyeSsrICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IENvcHkgdGFibGUgZm9yIEhvc3QgZW50cnkgJWRcbiIsIEVudHJ5KTsKKwkJTWFwUCA9ICZwLT5SSU9Db25uZWN0VGFibGVbRW50cnldOworCisJCS8qCisJCSoqIE5vdywgaWYgaXQgaXMgYW4gZW1wdHkgc2xvdCBpZ25vcmUgaXQhCisJCSovCisJCWlmICggTWFwUC0+SG9zdFVuaXF1ZU51bT09MCApCisJCQljb250aW51ZTsKKworCQkvKgorCQkqKiB3ZSBzYXZlZCB0aGUgaG9zdCBudW1iZXIgZWFybGllciwgc28gZ3JhYiBpdCBiYWNrCisJCSovCisJCUhvc3RQID0gJnAtPlJJT0hvc3RzW01hcFAtPlRvcG9sb2d5WzBdLlVuaXRdOworCisJCS8qCisJCSoqIElmIGl0IGlzIGEgaG9zdCwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gZmlsbCBpbiB0aGUgbmFtZSBmaWVsZC4KKwkJKi8KKwkJaWYgKCBNYXBQLT5JRD09MCApIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJIb3N0IGVudHJ5IGZvdW5kLiBOYW1lICVzXG4iLCBNYXBQLT5OYW1lKTsKKwkJCWJjb3B5KE1hcFAtPk5hbWUsSG9zdFAtPk5hbWUsTUFYX05BTUVfTEVOKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJKiogSXRzIGFuIFJUQSBlbnRyeSwgc28gZmlsbCBpbiB0aGUgaG9zdCBtYXBwaW5nIGVudHJpZXMgZm9yIGl0CisJCSoqIGFuZCB0aGUgcG9ydCBtYXBwaW5nIGVudHJpZXMuIE5vdGljZSB0aGF0IGVudHJ5IHplcm8gaXMgZm9yCisJCSoqIElEIG9uZS4KKwkJKi8KKwkJSG9zdE1hcFAgPSAmSG9zdFAtPk1hcHBpbmdbTWFwUC0+SUQtMV07CisKKwkJaWYgKE1hcFAtPkZsYWdzICYgU0xPVF9JTl9VU0UpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSdGEgZW50cnkgZm91bmQuIE5hbWUgJXNcbiIsIE1hcFAtPk5hbWUpOworCQkJLyoKKwkJCSoqIHN0cnVjdHVyZSBhc3NpZ24sIHRoZW4gc29ydCBvdXQgdGhlIGJpdHMgd2Ugc2hvdWxkbid0IGhhdmUgZG9uZQorCQkJKi8KKwkJCSpIb3N0TWFwUCA9ICpNYXBQOworCisJCQlIb3N0TWFwUC0+RmxhZ3MgPSBTTE9UX0lOX1VTRTsKKwkJCWlmIChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKQorCQkJCUhvc3RNYXBQLT5GbGFncyB8PSBSVEExNl9TRUNPTkRfU0xPVDsKKworCQkJUklPUmVNYXBQb3J0cyhwLCBIb3N0UCwgSG9zdE1hcFAgKTsKKwkJfQorCQllbHNlIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJURU5UQVRJVkUgUnRhIGVudHJ5IGZvdW5kLiBOYW1lICVzXG4iLCBNYXBQLT5OYW1lKTsKKwkJfQorCX0KKworCWZvciAoIEVudHJ5PTA7IEVudHJ5PCBUT1RBTF9NQVBfRU5UUklFUzsgRW50cnkrKyApIHsKKwkJcC0+UklPU2F2ZWRUYWJsZVtFbnRyeV0gPSBwLT5SSU9Db25uZWN0VGFibGVbRW50cnldOworCX0KKworCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgeworCQlmb3IgKCBTdWJFbnQ9MDsgU3ViRW50PExJTktTX1BFUl9VTklUOyBTdWJFbnQrKyApIHsKKwkJCXAtPlJJT0hvc3RzW0hvc3RdLlRvcG9sb2d5W1N1YkVudF0uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCQlwLT5SSU9Ib3N0c1tIb3N0XS5Ub3BvbG9neVtTdWJFbnRdLkxpbmsgPSBOT19MSU5LOworCQl9CisJCWZvciAoIEVudHJ5PTA7IEVudHJ5PE1BWF9SVVA7IEVudHJ5KysgKSB7CisJCQlmb3IgKCBTdWJFbnQ9MDsgU3ViRW50PExJTktTX1BFUl9VTklUOyBTdWJFbnQrKyApIHsKKwkJCQlwLT5SSU9Ib3N0c1tIb3N0XS5NYXBwaW5nW0VudHJ5XS5Ub3BvbG9neVtTdWJFbnRdLlVuaXQgPSAKKwkJCQkJCQkJUk9VVEVfRElTQ09OTkVDVDsKKwkJCQlwLT5SSU9Ib3N0c1tIb3N0XS5NYXBwaW5nW0VudHJ5XS5Ub3BvbG9neVtTdWJFbnRdLkxpbmsgPSAKKwkJCQkJCQkJTk9fTElOSzsKKwkJCX0KKwkJfQorCQlpZiAoICFwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lWzBdICkgeworCQkJYmNvcHkoIkhPU1QgMSIscC0+UklPSG9zdHNbSG9zdF0uTmFtZSw3KTsKKwkJCXAtPlJJT0hvc3RzW0hvc3RdLk5hbWVbNV0gKz0gSG9zdDsKKwkJfQorCQkvKgorCQkqKiBDaGVjayB0aGF0IGRlZmF1bHQgbmFtZSBhc3NpZ25lZCBpcyB1bmlxdWUuCisJCSovCisJCUhvc3QxID0gSG9zdDsKKwkJTmFtZUlzVW5pcXVlID0gMDsKKwkJd2hpbGUgKCFOYW1lSXNVbmlxdWUpIHsKKwkJCU5hbWVJc1VuaXF1ZSA9IDE7CisJCQlmb3IgKCBIb3N0Mj0wOyBIb3N0MjxwLT5SSU9OdW1Ib3N0czsgSG9zdDIrKyApIHsKKwkJCQlpZiAoSG9zdDIgPT0gSG9zdCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHN0cmNtcChwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lLCBwLT5SSU9Ib3N0c1tIb3N0Ml0uTmFtZSkKKwkJCQkJCQkJCSA9PSAwKSB7CisJCQkJCU5hbWVJc1VuaXF1ZSA9IDA7CisJCQkJCUhvc3QxKys7CisJCQkJCWlmIChIb3N0MSA+PSBwLT5SSU9OdW1Ib3N0cykKKwkJCQkJCUhvc3QxID0gMDsKKwkJCQkJcC0+UklPSG9zdHNbSG9zdF0uTmFtZVs1XSA9ICcxJyArIEhvc3QxOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKgorCQkqKiBSZW5hbWUgaG9zdCBpZiBuYW1lIGFscmVhZHkgdXNlZC4KKwkJKi8KKwkJaWYgKEhvc3QxICE9IEhvc3QpCisJCXsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJEZWZhdWx0IG5hbWUgJXMgYWxyZWFkeSB1c2VkXG4iLCBwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lKTsKKwkJCWJjb3B5KCJIT1NUIDEiLHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUsNyk7CisJCQlwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lWzVdICs9IEhvc3QxOworCQl9CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJBc3NpZ25pbmcgZGVmYXVsdCBuYW1lICVzXG4iLCBwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisqKiBVc2VyIHByb2Nlc3MgbmVlZHMgdGhlIGNvbmZpZyB0YWJsZSAtIGJ1aWxkIGl0IGZyb20gZmlyc3QKKyoqIHByaW5jaXBsZXMuCisqLworaW50CitSSU9BcGVsKHApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworeworCWludCBIb3N0OworCWludCBsaW5rOworCWludCBSdXA7CisJaW50IE5leHQgPSAwOworCXN0cnVjdCBNYXAgKk1hcFA7CisJc3RydWN0IEhvc3QgKkhvc3RQOworCWxvbmcgb2xkc3BsOworCisJZGlzYWJsZShvbGRzcGwpOwkJLyogc3RyYW5nZSBidXQgdHJ1ZSEgKi8KKyAKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiR2VuZXJhdGluZyBhIHRhYmxlIHRvIHJldHVybiB0byBjb25maWcucmlvXG4iKTsKKworCWJ6ZXJvKChjYWRkcl90KSZwLT5SSU9Db25uZWN0VGFibGVbMF0sIAorCQkJCQlzaXplb2Yoc3RydWN0IE1hcCkgKiBUT1RBTF9NQVBfRU5UUklFUyApOworCisJZm9yICggSG9zdD0wOyBIb3N0PFJJT19IT1NUUzsgSG9zdCsrICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUHJvY2Vzc2luZyBob3N0ICVkXG4iLCBIb3N0KTsKKwkJSG9zdFAgPSAmcC0+UklPSG9zdHNbSG9zdF07CisJCU1hcFAgPSAmcC0+UklPQ29ubmVjdFRhYmxlW05leHQrK107CisJCU1hcFAtPkhvc3RVbmlxdWVOdW0gPSBIb3N0UC0+VW5pcXVlTnVtOworCQlpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKQorCQkJY29udGludWU7CisJCU1hcFAtPlJ0YVVuaXF1ZU51bSA9IDA7CisJCU1hcFAtPklEID0gMDsKKwkJTWFwUC0+RmxhZ3MgPSBTTE9UX0lOX1VTRTsKKwkJTWFwUC0+U3lzUG9ydCA9IE5PX1BPUlQ7CisJCWZvciAoIGxpbms9MDsgbGluazxMSU5LU19QRVJfVU5JVDsgbGluaysrICkKKwkJCU1hcFAtPlRvcG9sb2d5W2xpbmtdID0gSG9zdFAtPlRvcG9sb2d5W2xpbmtdOworCQliY29weShIb3N0UC0+TmFtZSxNYXBQLT5OYW1lLE1BWF9OQU1FX0xFTik7CisJCWZvciAoIFJ1cD0wOyBSdXA8TUFYX1JVUDsgUnVwKysgKSB7CisJCQlpZiAoIEhvc3RQLT5NYXBwaW5nW1J1cF0uRmxhZ3MgJiAoU0xPVF9JTl9VU0V8U0xPVF9URU5UQVRJVkUpICkgeworCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtOZXh0XSA9IEhvc3RQLT5NYXBwaW5nW1J1cF07CisJCQkJaWYgKCBIb3N0UC0+TWFwcGluZ1tSdXBdLkZsYWdzICYgU0xPVF9JTl9VU0UpCisJCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtOZXh0XS5GbGFncyB8PSBTTE9UX0lOX1VTRTsKKwkJCQlpZiAoIEhvc3RQLT5NYXBwaW5nW1J1cF0uRmxhZ3MgJiBTTE9UX1RFTlRBVElWRSkKKwkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW05leHRdLkZsYWdzIHw9IFNMT1RfVEVOVEFUSVZFOworCQkJCWlmICggSG9zdFAtPk1hcHBpbmdbUnVwXS5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UICkKKwkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW05leHRdLkZsYWdzIHw9IFJUQTE2X1NFQ09ORF9TTE9UOworCQkJCU5leHQrKzsKKwkJCX0KKwkJfQorCX0KKwlyZXN0b3JlKG9sZHNwbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisqKiBjb25maWcucmlvIGhhcyB0YWtlbiBhIGRpc2xpa2UgdG8gb25lIG9mIHRoZSBncm9zcyBtYXBzIGVudHJpZXMuCisqKiBpZiB0aGUgZW50cnkgaXMgc3VpdGFibHkgaW5hY3RpdmUsIHRoZW4gd2UgY2FuIGdvYiBvbiBpdCBhbmQgcmVtb3ZlCisqKiBpdCBmcm9tIHRoZSB0YWJsZS4KKyovCitpbnQKK1JJT0RlbGV0ZVJ0YShwLCBNYXBQKQorc3RydWN0IHJpb19pbmZvICpwOworc3RydWN0IE1hcCAqTWFwUDsKK3sKKwlpbnQgaG9zdCwgZW50cnksIHBvcnQsIGxpbms7CisJaW50IFN5c1BvcnQ7CisJc3RydWN0IEhvc3QgKkhvc3RQOworCXN0cnVjdCBNYXAgKkhvc3RNYXBQOworCXN0cnVjdCBQb3J0ICpQb3J0UDsKKwlpbnQgd29ya19kb25lID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MsIHNlbV9mbGFnczsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJEZWxldGUgZW50cnkgb24gaG9zdCAleCwgcnRhICV4XG4iLAorCQkJCQkJCQlNYXBQLT5Ib3N0VW5pcXVlTnVtLCBNYXBQLT5SdGFVbmlxdWVOdW0pOworCisJZm9yICggaG9zdD0wOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKyApIHsKKwkJSG9zdFAgPSAmcC0+UklPSG9zdHNbaG9zdF07CisKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCAmSG9zdFAtPkhvc3RMb2NrLCBsb2NrX2ZsYWdzICk7CisKKwkJaWYgKCAoSG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HICkgeworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkhvc3RQLT5Ib3N0TG9jaywgbG9ja19mbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAoIGVudHJ5PTA7IGVudHJ5PE1BWF9SVVA7IGVudHJ5KysgKSB7CisJCQlpZiAoIE1hcFAtPlJ0YVVuaXF1ZU51bSA9PSBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uUnRhVW5pcXVlTnVtICkgeworCQkJCUhvc3RNYXBQID0gJkhvc3RQLT5NYXBwaW5nW2VudHJ5XTsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiRm91bmQgZW50cnkgb2Zmc2V0ICVkIG9uIGhvc3QgJXNcbiIsIAorCQkJCQkJZW50cnksIEhvc3RQLT5OYW1lKTsKKworCQkJCS8qCisJCQkJKiogQ2hlY2sgYWxsIGZvdXIgbGlua3Mgb2YgdGhlIHVuaXQgYXJlIGRpc2Nvbm5lY3RlZAorCQkJCSovCisJCQkJZm9yICggbGluaz0wOyBsaW5rPCBMSU5LU19QRVJfVU5JVDsgbGluaysrICkgeworCQkJCQlpZiAoIEhvc3RNYXBQLT5Ub3BvbG9neVtsaW5rXS5Vbml0ICE9IFJPVVRFX0RJU0NPTk5FQ1QgKSB7CisJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiRW50cnkgaXMgaW4gdXNlIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCFcbiIpOworCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBVTklUX0lTX0lOX1VTRTsKKwkJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmSG9zdFAtPkhvc3RMb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJCX0KKwkJCQl9CisJCQkJLyoKKwkJCQkqKiBTbG90IGhhcyBiZWVuIGFsbG9jYXRlZCwgQlVUIG5vdCBib290ZWQvcm91dGVkLworCQkJCSoqIGNvbm5lY3RlZC9zZWxlY3RlZCBvciBhbnl0aGluZyBlbHNlLWVkCisJCQkJKi8KKwkJCQlTeXNQb3J0ID0gSG9zdE1hcFAtPlN5c1BvcnQ7CisKKwkJCQlpZiAoIFN5c1BvcnQgIT0gTk9fUE9SVCApIHsKKwkJCQkJZm9yIChwb3J0PVN5c1BvcnQ7IHBvcnQgPCBTeXNQb3J0K1BPUlRTX1BFUl9SVEE7IHBvcnQrKykgeworCQkJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKwkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJVbm1hcCBwb3J0XG4iKTsKKworCQkJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCAmUG9ydFAtPnBvcnRTZW0sIHNlbV9mbGFncyApOworCisJCQkJCQlQb3J0UC0+TWFwcGVkID0gMDsKKworCQkJCQkJaWYgKCBQb3J0UC0+U3RhdGUgJiAoUklPX01PUEVOfFJJT19MT1BFTikgKSB7CisKKwkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiR29iIG9uIHBvcnRcbiIpOworCQkJCQkJCVBvcnRQLT5UeEJ1ZmZlckluID0gUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKKwkJCQkJCQkvKiBXaGF0IHNob3VsZCBJIGRvIAorCQkJCQkJCXdha2V1cCggJlBvcnRQLT5UeEJ1ZmZlckluICk7CisJCQkJCQkJd2FrZXVwKCAmUG9ydFAtPlR4QnVmZmVyT3V0KTsKKwkJCQkJCQkqLworCQkJCQkJCVBvcnRQLT5JblVzZSA9IE5PVF9JTlVTRTsKKwkJCQkJCQkvKiBXaGF0IHNob3VsZCBJIGRvIAorCQkJCQkJCXdha2V1cCggJlBvcnRQLT5JblVzZSApOworCQkJCQkJCXNpZ25hbChQb3J0UC0+VHR5UC0+dF9wZ3JwLFNJR0tJTEwpOworCQkJCQkJCXR0eWZsdXNoKFBvcnRQLT5UdHlQLChGUkVBRHxGV1JJVEUpKTsKKwkJCQkJCQkqLworCQkJCQkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQ0xPU0lORyB8IFJJT19ERUxFVEVEOworCQkJCQkJfQorCisJCQkJCQkvKgorCQkJCQkJKiogRm9yIHRoZSBzZWNvbmQgc2xvdCBvZiBhIDE2IHBvcnQgUlRBLCB0aGUKKwkJCQkJCSoqIGRyaXZlciBuZWVkcyB0byByZXNldCB0aGUgY2hhbmdlcyBtYWRlIHRvCisJCQkJCQkqKiB0aGUgcGhiIHRvIHBvcnQgbWFwcGluZ3MgaW4gUklPUm91dGVSdXAuCisJCQkJCQkqLworCQkJCQkJaWYgKFBvcnRQLT5TZWNvbmRCbG9jaykgeworCQkJCQkJCXVzaG9ydCBkZXN0X3VuaXQgPSBIb3N0TWFwUC0+SUQ7CisJCQkJCQkJdXNob3J0IGRlc3RfcG9ydCA9IHBvcnQgLSBTeXNQb3J0OworCQkJCQkJCVdPUkQJICpUeFBrdFA7CisJCQkJCQkJUEtUCSpQa3Q7CisKKwkJCQkJCQlmb3IgKFR4UGt0UCA9IFBvcnRQLT5UeFN0YXJ0OworCQkJCQkJCQlUeFBrdFAgPD0gUG9ydFAtPlR4RW5kOyBUeFBrdFArKykgeworCQkJCQkJCQkvKgorCQkJCQkJCQkqKiAqVHhQa3RQIGlzIHRoZSBwb2ludGVyIHRvIHRoZQorCQkJCQkJCQkqKiB0cmFuc21pdCBwYWNrZXQgb24gdGhlIGhvc3QgY2FyZC4KKwkJCQkJCQkJKiogVGhpcyBuZWVkcyB0byBiZSB0cmFuc2xhdGVkIGludG8KKwkJCQkJCQkJKiogYSAzMiBiaXQgcG9pbnRlciBzbyBpdCBjYW4gYmUKKwkJCQkJCQkJKiogYWNjZXNzZWQgZnJvbSB0aGUgZHJpdmVyLgorCQkJCQkJCQkqLworCQkJCQkJCQlQa3QgPSAoUEtUICopIFJJT19QVFIoSG9zdFAtPkNhZGRyLAorCQkJCQkJCQkgCVJXT1JEKCpUeFBrdFApKTsKKwkJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgCisJCQkJCQkiVHggcGFja2V0ICgleCkgZGVzdGluYXRpb246IE9sZCAleDoleCBOZXcgJXg6JXhcbiIsCisJCQkJCQkJCSAqVHhQa3RQLCBQa3QtPmRlc3RfdW5pdCwKKwkJCQkJCQkJIFBrdC0+ZGVzdF9wb3J0LCBkZXN0X3VuaXQsIGRlc3RfcG9ydCk7CisJCQkJCQkJCVdXT1JEKFBrdC0+ZGVzdF91bml0LCBkZXN0X3VuaXQpOworCQkJCQkJCQlXV09SRChQa3QtPmRlc3RfcG9ydCwgZGVzdF9wb3J0KTsKKwkJCQkJCQl9CisJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgCisJCQkJCQkiUG9ydCAlZCBwaGIgZGVzdGluYXRpb246IE9sZCAleDoleCBOZXcgJXg6JXhcbiIsCisJCQkJCQkJIHBvcnQsIFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbiAmIDB4ZmYsCisJCQkJCQkJIChQb3J0UC0+UGhiUC0+ZGVzdGluYXRpb24gPj4gOCkgJiAweGZmLAorCQkJCQkJCSBkZXN0X3VuaXQsIGRlc3RfcG9ydCk7CisJCQkJCQkJV1dPUkQoUG9ydFAtPlBoYlAtPmRlc3RpbmF0aW9uLAorCQkJCQkJCSBkZXN0X3VuaXQgKyAoZGVzdF9wb3J0IDw8IDgpKTsKKwkJCQkJCX0KKwkJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgc2VtX2ZsYWdzKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiRW50cnkgbnVsbGVkLlxuIik7CisJCQkJYnplcm8oKGNoYXIgKilIb3N0TWFwUCxzaXplb2Yoc3RydWN0IE1hcCkpOworCQkJCXdvcmtfZG9uZSsrOworCQkJfQorCQl9CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZIb3N0UC0+SG9zdExvY2ssIGxvY2tfZmxhZ3MpOworCX0KKworCS8qIFhYWFhYIGxvY2sgbWUgdXAgKi8KKwlmb3IgKCBlbnRyeT0wOyBlbnRyeTwgVE9UQUxfTUFQX0VOVFJJRVM7IGVudHJ5KysgKSB7CisJCWlmICggcC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtID09IE1hcFAtPlJ0YVVuaXF1ZU51bSApIHsKKwkJCWJ6ZXJvKChjaGFyICopJnAtPlJJT1NhdmVkVGFibGVbZW50cnldLHNpemVvZihzdHJ1Y3QgTWFwKSk7CisJCQl3b3JrX2RvbmUrKzsKKwkJfQorCQlpZiAoIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtID09IE1hcFAtPlJ0YVVuaXF1ZU51bSApIHsKKwkJCWJ6ZXJvKChjaGFyICopJnAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0sc2l6ZW9mKHN0cnVjdCBNYXApKTsKKwkJCXdvcmtfZG9uZSsrOworCQl9CisJfQorCWlmICggd29ya19kb25lICkKKwkJcmV0dXJuIDA7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiQ291bGRuJ3QgZmluZCBlbnRyeSB0byBiZSBkZWxldGVkXG4iKTsKKwlwLT5SSU9FcnJvci5FcnJvciA9IENPVUxETlRfRklORF9FTlRSWTsKKwlyZXR1cm4gLUVOWElPOworfQorCitpbnQgUklPQXNzaWduUnRhKCBzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBNYXAgKk1hcFAgKQoreworICAgIGludCBob3N0OworICAgIHN0cnVjdCBNYXAgKkhvc3RNYXBQOworICAgIGNoYXIgKnNwdHI7CisgICAgaW50CWxpbms7CisKKworICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJBc3NpZ24gZW50cnkgb24gaG9zdCAleCwgcnRhICV4LCBJRCAlZCwgU3lzcG9ydCAlZFxuIiwKKwkJCQlNYXBQLT5Ib3N0VW5pcXVlTnVtLE1hcFAtPlJ0YVVuaXF1ZU51bSwKKwkJCQlNYXBQLT5JRCwgKGludClNYXBQLT5TeXNQb3J0KTsKKworICAgIGlmICgoTWFwUC0+SUQgIT0gKHVzaG9ydCktMSkgJiYKKwkoKGludClNYXBQLT5JRCA8IChpbnQpMSB8fCAoaW50KU1hcFAtPklEID4gTUFYX1JVUCApKQorICAgIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiQmFkIElEIGluIG1hcCBlbnRyeSFcbiIpOworCXAtPlJJT0Vycm9yLkVycm9yID0gSURfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKE1hcFAtPlJ0YVVuaXF1ZU51bSA9PSAwKQorICAgIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUnRhIFVuaXF1ZSBudW1iZXIgemVybyFcbiIpOworCXAtPlJJT0Vycm9yLkVycm9yID0gUlRBX1VOSVFVRV9OVU1CRVJfWkVSTzsKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKCAoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSAmJiAoTWFwUC0+U3lzUG9ydCAlIFBPUlRTX1BFUl9SVEEpICkKKyAgICB7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlBvcnQgJWQgbm90IG11bHRpcGxlIG9mICVkIVxuIiwoaW50KU1hcFAtPlN5c1BvcnQsUE9SVFNfUEVSX1JUQSk7CisJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKCAoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSAmJiAoTWFwUC0+U3lzUG9ydCA+PSBSSU9fUE9SVFMpICkKKyAgICB7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlBvcnQgJWQgbm90IHZhbGlkIVxuIiwoaW50KU1hcFAtPlN5c1BvcnQpOworCXAtPlJJT0Vycm9yLkVycm9yID0gVFRZX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyoKKyAgICAqKiBDb3B5IHRoZSBuYW1lIGFjcm9zcyB0byB0aGUgbWFwIGVudHJ5LgorICAgICovCisgICAgTWFwUC0+TmFtZVtNQVhfTkFNRV9MRU4tMV0gPSAnXDAnOworICAgIHNwdHIgPSBNYXBQLT5OYW1lOworICAgIHdoaWxlICggKnNwdHIgKQorICAgIHsKKyAgICBpZiAoICpzcHRyPCcgJyB8fCAqc3B0cj4nficgKQorICAgIHsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiTmFtZSBlbnRyeSBjb250YWlucyBub24tcHJpbnRpbmcgY2hhcmFjdGVycyFcbiIpOworCXAtPlJJT0Vycm9yLkVycm9yID0gQkFEX0NIQVJBQ1RFUl9JTl9OQU1FOworCXJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzcHRyKys7CisgICAgfQorCisgICAgZm9yICggaG9zdD0wOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKyApCisgICAgeworCWlmICggTWFwUC0+SG9zdFVuaXF1ZU51bSA9PSBwLT5SSU9Ib3N0c1tob3N0XS5VbmlxdWVOdW0gKQorCXsKKwkgICAgaWYgKCAocC0+UklPSG9zdHNbaG9zdF0uRmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKQorCSAgICB7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OT1RfUlVOTklORzsKKwkJcmV0dXJuIC1FTlhJTzsKKwkgICAgfQorCisJICAgIC8qCisJICAgICoqIE5vdyB3ZSBoYXZlIGEgaG9zdCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIElECisJICAgICoqIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgb25lLgorCSAgICAqLworCSAgICBpZiAoTWFwUC0+SUQgPT0gKHVzaG9ydCktMSkKKwkgICAgeworCQlpbnQgbk5ld0lEOworCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJBdHRlbXB0aW5nIHRvIGdldCBhIG5ldyBJRCBmb3IgcnRhIFwiJXNcIlxuIiwKKwkJICAgICAgTWFwUC0+TmFtZSk7CisJCS8qCisJCSoqIFRoZSBpZGVhIGhlcmUgaXMgdG8gYWxsb3cgUlRBJ3MgdG8gYmUgYXNzaWduZWQKKwkJKiogYmVmb3JlIHRoZXkgYWN0dWFsbHkgYXBwZWFyIG9uIHRoZSBuZXR3b3JrLgorCQkqKiBUaGlzIGFsbG93cyB0aGUgYWRkaXRpb24gb2YgUlRBJ3Mgd2l0aG91dCBoYXZpbmcKKwkJKiogdG8gcGx1ZyB0aGVtIGluLgorCQkqKiBXaGF0IHdlIGRvIGlzOgorCQkqKiAgLSBGaW5kIGEgZnJlZSBJRCBhbmQgYWxsb2NhdGUgaXQgdG8gdGhlIFJUQS4KKwkJKiogIC0gSWYgdGhpcyBtYXAgZW50cnkgaXMgdGhlIHNlY29uZCBoYWxmIG9mIGEKKwkJKiogICAgMTYgcG9ydCBlbnRyeSB0aGVuIGZpbmQgdGhlIG90aGVyIGhhbGYgYW5kCisJCSoqICAgIG1ha2Ugc3VyZSB0aGUgMiBjcm9zcyByZWZlcmVuY2UgZWFjaCBvdGhlci4KKwkJKi8KKwkJaWYgKFJJT0ZpbmRGcmVlSUQocCwgJnAtPlJJT0hvc3RzW2hvc3RdLCAmbk5ld0lELCBOVUxMKSAhPSAwKQorCQl7CisJCSAgICBwLT5SSU9FcnJvci5FcnJvciA9IENPVUxETlRfRklORF9FTlRSWTsKKwkJICAgIHJldHVybiAtRUJVU1k7CisJCX0KKwkJTWFwUC0+SUQgPSAodXNob3J0KW5OZXdJRCArIDE7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJBbGxvY2F0ZWQgSUQgJWQgZm9yIHRoaXMgbmV3IFJUQS5cbiIsIE1hcFAtPklEKTsKKwkJSG9zdE1hcFAgPSAmcC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1tuTmV3SURdOworCQlIb3N0TWFwUC0+UnRhVW5pcXVlTnVtID0gTWFwUC0+UnRhVW5pcXVlTnVtOworCQlIb3N0TWFwUC0+SG9zdFVuaXF1ZU51bSA9IE1hcFAtPkhvc3RVbmlxdWVOdW07CisJCUhvc3RNYXBQLT5JRCA9IE1hcFAtPklEOworCQlmb3IgKGxpbmsgPSAwOyBsaW5rIDwgTElOS1NfUEVSX1VOSVQ7IGxpbmsrKykKKwkJeworCQkgICAgSG9zdE1hcFAtPlRvcG9sb2d5W2xpbmtdLlVuaXQgPSBST1VURV9ESVNDT05ORUNUOworCQkgICAgSG9zdE1hcFAtPlRvcG9sb2d5W2xpbmtdLkxpbmsgPSBOT19MSU5LOworCQl9CisJCWlmIChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKQorCQl7CisJCSAgICBpbnQgdW5pdDsKKworCQkgICAgZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9SVVA7IHVuaXQrKykKKwkJCWlmIChwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3VuaXRdLlJ0YVVuaXF1ZU51bSA9PQorCQkJICAgIE1hcFAtPlJ0YVVuaXF1ZU51bSkKKwkJCSAgICBicmVhazsKKwkJICAgIGlmICh1bml0ID09IE1BWF9SVVApCisJCSAgICB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPVUxETlRfRklORF9FTlRSWTsKKwkJCXJldHVybiAtRUJVU1k7CisJCSAgICB9CisJCSAgICBIb3N0TWFwUC0+RmxhZ3MgfD0gUlRBMTZfU0VDT05EX1NMT1Q7CisJCSAgICBIb3N0TWFwUC0+SUQyID0gTWFwUC0+SUQyID0gcC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1t1bml0XS5JRDsKKwkJICAgIHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbdW5pdF0uSUQyID0gTWFwUC0+SUQ7CisJCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiQ3Jvc3MgcmVmZXJlbmNlZCBpZCAlZCB0byBJRCAlZC5cbiIsCisJCQkgIE1hcFAtPklELAorCQkJICBwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3VuaXRdLklEKTsKKwkJfQorCSAgICB9CisKKwkgICAgSG9zdE1hcFAgPSAmcC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1tNYXBQLT5JRC0xXTsKKworCSAgICBpZiAoIEhvc3RNYXBQLT5GbGFncyAmIFNMT1RfSU5fVVNFICkKKwkgICAgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiTWFwIHRhYmxlIHNsb3QgZm9yIElEICVkIGlzIGFscmVhZHkgaW4gdXNlLlxuIiwgTWFwUC0+SUQpOworCQlwLT5SSU9FcnJvci5FcnJvciA9IElEX0FMUkVBRFlfSU5fVVNFOworCQlyZXR1cm4gLUVCVVNZOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgKiogQXNzaWduIHRoZSBzeXMgcG9ydHMgYW5kIHRoZSBuYW1lLCBhbmQgbWFyayB0aGUgc2xvdCBhcworCSAgICAqKiBiZWluZyBpbiB1c2UuCisJICAgICovCisJICAgIEhvc3RNYXBQLT5TeXNQb3J0ID0gTWFwUC0+U3lzUG9ydDsKKwkgICAgaWYgKChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKSA9PSAwKQorCSAgICAgIENDT1BZKCBNYXBQLT5OYW1lLCBIb3N0TWFwUC0+TmFtZSwgTUFYX05BTUVfTEVOICk7CisJICAgIEhvc3RNYXBQLT5GbGFncyA9IFNMT1RfSU5fVVNFIHwgUlRBX0JPT1RFRDsKKyNpZiBORUVEX1RPX0ZJWAorCSAgICBSSU9fU1ZfQlJPQURDQVNUKHAtPlJJT0hvc3RzW2hvc3RdLnN2RmxhZ3NbTWFwUC0+SUQtMV0pOworI2VuZGlmCisJICAgIGlmIChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKQorCQlIb3N0TWFwUC0+RmxhZ3MgfD0gUlRBMTZfU0VDT05EX1NMT1Q7CisKKwkgICAgUklPUmVNYXBQb3J0cyggcCwgJnAtPlJJT0hvc3RzW2hvc3RdLCBIb3N0TWFwUCApOworCSAgICAvKgorCSAgICAqKiBBZGp1c3QgMm5kIGJsb2NrIG9mIDggcGhicworCSAgICAqLworCSAgICBpZiAoTWFwUC0+RmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkKKwkJUklPRml4UGhicyhwLCAmcC0+UklPSG9zdHNbaG9zdF0sIEhvc3RNYXBQLT5JRCAtIDEpOworCisJICAgIGlmICggSG9zdE1hcFAtPlN5c1BvcnQgIT0gTk9fUE9SVCApCisJICAgIHsKKwkJaWYgKCBIb3N0TWFwUC0+U3lzUG9ydCA8IHAtPlJJT0ZpcnN0UG9ydHNCb290ZWQgKQorCQkgICAgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCA9IEhvc3RNYXBQLT5TeXNQb3J0OworCQlpZiAoIEhvc3RNYXBQLT5TeXNQb3J0ID4gcC0+UklPTGFzdFBvcnRzQm9vdGVkICkKKwkJICAgIHAtPlJJT0xhc3RQb3J0c0Jvb3RlZCA9IEhvc3RNYXBQLT5TeXNQb3J0OworCSAgICB9CisJICAgIGlmIChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKQorCSAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlNlY29uZCBtYXAgb2YgUlRBICVzIGFkZGVkIHRvIGNvbmZpZ3VyYXRpb25cbiIsCisJCSBwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW01hcFAtPklEMiAtIDFdLk5hbWUpOworCSAgICBlbHNlCisJICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUlRBICVzIGFkZGVkIHRvIGNvbmZpZ3VyYXRpb25cbiIsIE1hcFAtPk5hbWUpOworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorICAgIHAtPlJJT0Vycm9yLkVycm9yID0gVU5LTk9XTl9IT1NUX05VTUJFUjsKKyAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiVW5rbm93biBob3N0ICV4XG4iLCBNYXBQLT5Ib3N0VW5pcXVlTnVtKTsKKyAgICByZXR1cm4gLUVOWElPOworfQorCisKK2ludAorUklPUmVNYXBQb3J0cyhwLCBIb3N0UCwgSG9zdE1hcFApCitzdHJ1Y3QgcmlvX2luZm8gKglwOworc3RydWN0IEhvc3QgKkhvc3RQOworc3RydWN0IE1hcCAqSG9zdE1hcFA7IAoreworCXJlZ2lzdGVyIHN0cnVjdCBQb3J0ICpQb3J0UDsKKwl1aW50IFN1YkVudDsKKwl1aW50IEhvc3RQb3J0OworCXVpbnQgU3lzUG9ydDsKKwl1c2hvcnQgUnRhVHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQ0hFQ0sKKwlDaGVja0hvc3RQKCBIb3N0UCApOworCUNoZWNrSG9zdE1hcFAoIEhvc3RNYXBQICk7CisjZW5kaWYKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJNYXBwaW5nIHN5c3BvcnQgJWQgdG8gaWQgJWRcbiIsIChpbnQpSG9zdE1hcFAtPlN5c1BvcnQsIEhvc3RNYXBQLT5JRCk7CisKKwkvKgorCSoqIFdlIG5lZWQgdG8gdGVsbCB0aGUgVW5peFJ1cHMgd2hpY2ggc3lzcG9ydCB0aGUgcnVwIGNvcnJlc3BvbmRzIHRvCisJKi8KKwlIb3N0UC0+VW5peFJ1cHNbSG9zdE1hcFAtPklELTFdLkJhc2VTeXNQb3J0ID0gSG9zdE1hcFAtPlN5c1BvcnQ7CisKKwlpZiAoIEhvc3RNYXBQLT5TeXNQb3J0ID09IE5PX1BPUlQgKQorCQlyZXR1cm4oMCk7CisKKwlSdGFUeXBlID0gR2V0VW5pdFR5cGUoSG9zdE1hcFAtPlJ0YVVuaXF1ZU51bSk7CisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIk1hcHBpbmcgc3lzcG9ydCAlZC0lZFxuIiwKKwkJCQkoaW50KUhvc3RNYXBQLT5TeXNQb3J0LCAoaW50KUhvc3RNYXBQLT5TeXNQb3J0K1BPUlRTX1BFUl9SVEEtMSk7CisKKwkvKgorCSoqIG5vdyBtYXAgZWFjaCBvZiBpdHMgZWlnaHQgcG9ydHMKKwkqLworCWZvciAoIFN1YkVudD0wOyBTdWJFbnQ8UE9SVFNfUEVSX1JUQTsgU3ViRW50KyspIHsKKwkgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJzdWJlbnQgPSAlZCwgSG9zdE1hcFAtPlN5c1BvcnQgPSAlZFxuIiwgCisJCSAgU3ViRW50LCAoaW50KUhvc3RNYXBQLT5TeXNQb3J0KTsKKwkJU3lzUG9ydCA9IEhvc3RNYXBQLT5TeXNQb3J0K1N1YkVudDsJCS8qIHBvcnRudW1iZXIgd2l0aGluIHN5c3RlbSAqLworCQkJCQkvKiBwb3J0bnVtYmVyIG9uIGhvc3QgKi8KKwkJCisJCUhvc3RQb3J0ID0gKEhvc3RNYXBQLT5JRC0xKSpQT1JUU19QRVJfUlRBK1N1YkVudDsgCisKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgImMxIHAgPSAlcCwgcC0+cmlvUG9ydHAgPSAlcFxuIiwgcCwgcC0+UklPUG9ydHApOworCQlQb3J0UCA9IHAtPlJJT1BvcnRwW1N5c1BvcnRdOworI2lmIDAKKwkJUG9ydFAtPlR0eVAJPSAmcC0+Y2hhbm5lbFtTeXNQb3J0XTsKKyNlbmRpZgorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiTWFwIHBvcnRcbiIpOworCisJCS8qCisJCSoqIFBvaW50IGF0IGFsbCB0aGUgcmVhbCBuZWF0IGRhdGEgc3RydWN0dXJlcworCQkqLworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCVBvcnRQLT5Ib3N0UCA9IEhvc3RQOworCQlQb3J0UC0+Q2FkZHIgPSBIb3N0UC0+Q2FkZHI7CisKKwkJLyoKKwkJKiogVGhlIFBoYlAgY2Fubm90IGJlIGZpbGxlZCBpbiB5ZXQKKwkJKiogdW5sZXNzIHRoZSBob3N0IGhhcyBiZWVuIGJvb3RlZAorCQkqLworCQlpZiAoKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgPT0gUkNfUlVOTklORykgeworCQkJc3RydWN0IFBIQiAqUGhiUCA9IFBvcnRQLT5QaGJQID0gJkhvc3RQLT5QaGJQW0hvc3RQb3J0XTsKKwkJCVBvcnRQLT5UeEFkZCA9KFdPUkQgKilSSU9fUFRSKEhvc3RQLT5DYWRkcixSV09SRChQaGJQLT50eF9hZGQpKTsKKwkJCVBvcnRQLT5UeFN0YXJ0ID0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFBoYlAtPnR4X3N0YXJ0KSk7CisJCQlQb3J0UC0+VHhFbmQgPShXT1JEICopUklPX1BUUihIb3N0UC0+Q2FkZHIsUldPUkQoUGhiUC0+dHhfZW5kKSk7CisJCQlQb3J0UC0+UnhSZW1vdmU9KFdPUkQgKilSSU9fUFRSKEhvc3RQLT5DYWRkciwKKwkJCQkJCQkJCVJXT1JEKFBoYlAtPnJ4X3JlbW92ZSkpOworCQkJUG9ydFAtPlJ4U3RhcnQgPShXT1JEICopUklPX1BUUihIb3N0UC0+Q2FkZHIsUldPUkQoUGhiUC0+cnhfc3RhcnQpKTsKKwkJCVBvcnRQLT5SeEVuZCA9KFdPUkQgKilSSU9fUFRSKEhvc3RQLT5DYWRkcixSV09SRChQaGJQLT5yeF9lbmQpKTsKKwkJfQorCQllbHNlCisJCQlQb3J0UC0+UGhiUCA9IE5VTEw7CisKKwkJLyoKKwkJKiogcG9ydCByZWxhdGVkIGZsYWdzCisJCSovCisJCVBvcnRQLT5Ib3N0UG9ydAk9IEhvc3RQb3J0OworCQkvKgorCQkqKiBGb3IgZWFjaCBwYXJ0IG9mIGEgMTYgcG9ydCBSVEEsIFJ1cE51bSBpcyBJRCAtIDEuCisJCSovCisJCVBvcnRQLT5SdXBOdW0gPSBIb3N0TWFwUC0+SUQgLSAxOworCQlpZiAoSG9zdE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpIHsKKwkJCVBvcnRQLT5JRDIJCQkgPSBIb3N0TWFwUC0+SUQyIC0gMTsKKwkJCVBvcnRQLT5TZWNvbmRCbG9jawkgPSBUUlVFOworCQl9CisJCWVsc2UgeworCQkJUG9ydFAtPklEMgkJCSA9IDA7CisJCQlQb3J0UC0+U2Vjb25kQmxvY2sJID0gRkFMU0U7CisJCX0KKwkJUG9ydFAtPlJ0YVVuaXF1ZU51bQk9IEhvc3RNYXBQLT5SdGFVbmlxdWVOdW07CisKKwkJLyoKKwkJKiogSWYgdGhlIHBvcnQgd2FzIGFscmVhZHkgbWFwcGVkIHRoZW4gdGhhdHMgYWxsIHdlIG5lZWQgdG8gZG8uCisJCSovCisJCWlmIChQb3J0UC0+TWFwcGVkKSB7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIEhvc3RNYXBQLT5GbGFncyAmPSB+UlRBX05FV0JPT1Q7CisKKwkJUG9ydFAtPlN0YXRlCQkgPSAwOworCQlQb3J0UC0+Q29uZmlnCQk9IDA7CisJCS8qCisJCSoqIENoZWNrIG91dCB0aGUgbW9kdWxlIHR5cGUgLSBpZiBpdCBpcyBzcGVjaWFsIChyZWFkIG9ubHkgZXRjLikKKwkJKiogdGhlbiB3ZSBuZWVkIHRvIHNldCBmbGFncyBpbiB0aGUgUG9ydFAtPkNvbmZpZy4KKwkJKiogTm90ZTogRm9yIDE2IHBvcnQgUlRBLCBhbGwgcG9ydHMgYXJlIG9mIHRoZSBzYW1lIHR5cGUuCisJCSovCisJCWlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpIHsKKwkJCVBvcnRQLT5Db25maWcgfD0gcC0+UklPTW9kdWxlVHlwZXNbSG9zdFAtPlVuaXhSdXBzCisJCQkJW0hvc3RNYXBQLT5JRC0xXS5Nb2RUeXBlc10uRmxhZ3NbU3ViRW50ICUgUE9SVFNfUEVSX01PRFVMRV07CisJCX0gZWxzZSB7CisJCQlpZiAoIFN1YkVudCA8IFBPUlRTX1BFUl9NT0RVTEUgKQorCQkJCVBvcnRQLT5Db25maWcgfD0gcC0+UklPTW9kdWxlVHlwZXNbTE9OWUJMRShIb3N0UC0+VW5peFJ1cHMKKwkJCQlbSG9zdE1hcFAtPklELTFdLk1vZFR5cGVzKV0uRmxhZ3NbU3ViRW50ICUgUE9SVFNfUEVSX01PRFVMRV07CisJCQllbHNlCisJCQkJUG9ydFAtPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tISU5ZQkxFKEhvc3RQLT5Vbml4UnVwcworCQkJCVtIb3N0TWFwUC0+SUQtMV0uTW9kVHlwZXMpXS5GbGFnc1tTdWJFbnQgJSBQT1JUU19QRVJfTU9EVUxFXTsKKwkJfQorCisJCS8qCisJCSoqIG1vcmUgcG9ydCByZWxhdGVkIGZsYWdzCisJCSovCisJCVBvcnRQLT5Qb3J0U3RhdGUJPSAwOworCQlQb3J0UC0+TW9kZW1MaW5lcwk9IDA7CisJCVBvcnRQLT5Nb2RlbVN0YXRlCT0gMDsKKwkJUG9ydFAtPkNvb2tNb2RlCQk9IENPT0tfV0VMTDsKKwkJUG9ydFAtPlBhcmFtU2VtCQk9IDA7CisJCVBvcnRQLT5GbHVzaENtZEJvZGdlPSAwOworCQlQb3J0UC0+V2ZsdXNoRmxhZwk9IDA7CisJCVBvcnRQLT5NYWdpY0ZsYWdzCT0gMDsKKwkJUG9ydFAtPkxvY2sJCQk9IDA7CisJCVBvcnRQLT5TdG9yZQkJPSAwOworCQlQb3J0UC0+Rmlyc3RPcGVuCT0gMTsKKworCQkvKgorCQkqKiBCdWZmZXJzICduIHRoaW5ncworCQkqLworCQlQb3J0UC0+UnhEYXRhU3RhcnQJPSAwOworCQlQb3J0UC0+Q29yMkNvcHkJID0gMDsKKwkJUG9ydFAtPk5hbWUJCSA9ICZIb3N0TWFwUC0+TmFtZVswXTsKKyNpZmRlZiBTVEFUUworCQliemVybyggKGNhZGRyX3QpJlBvcnRQLT5TdGF0LCBzaXplb2Yoc3RydWN0IFJJT1N0YXRzKSApOworI2VuZGlmCisJCVBvcnRQLT5zdGF0c0dhdGhlciA9IDA7CisJCVBvcnRQLT50eGNoYXJzID0gMDsKKwkJUG9ydFAtPnJ4Y2hhcnMgPSAwOworCQlQb3J0UC0+b3BlbnMgPSAwOworCQlQb3J0UC0+Y2xvc2VzID0gMDsKKwkJUG9ydFAtPmlvY3RscyA9IDA7CisJCWlmICggUG9ydFAtPlR4UmluZ0J1ZmZlciApCisJCQliemVybyggUG9ydFAtPlR4UmluZ0J1ZmZlciwgcC0+UklPQnVmZmVyU2l6ZSApOworCQllbHNlIGlmICggcC0+UklPQnVmZmVyU2l6ZSApIHsKKwkJCVBvcnRQLT5UeFJpbmdCdWZmZXIgPSBzeXNicmsocC0+UklPQnVmZmVyU2l6ZSk7CisJCQliemVybyggUG9ydFAtPlR4UmluZ0J1ZmZlciwgcC0+UklPQnVmZmVyU2l6ZSApOworCQl9CisJCVBvcnRQLT5UeEJ1ZmZlck91dAk9IDA7CisJCVBvcnRQLT5UeEJ1ZmZlckluCSA9IDA7CisJCVBvcnRQLT5EZWJ1ZwkJPSAwOworCQkvKgorCQkqKiBMYXN0UnhUZ2wgc3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgcnggdG9nZ2xlIGJpdCBmb3IgdGhpcworCQkqKiBwb3J0LCB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBzdGF0ZSBvZiB0aGUgbmV4dCBwa3QgcmVjZWl2ZWQuCisJCSoqIElmIHRoZSBzYW1lLCB3ZSBoYXZlIHJlY2VpdmVkIHRoZSBzYW1lIHJ4IHBrdCBmcm9tIHRoZSBSVEEKKwkJKiogdHdpY2UuIEluaXRpYWxpc2UgdG8gYSB2YWx1ZSBub3QgZXF1YWwgdG8gUEhCX1JYX1RHTCBvciAwLgorCQkqLworCQlQb3J0UC0+TGFzdFJ4VGdsCT0gfih1Y2hhcilQSEJfUlhfVEdMOworCisJCS8qCisJCSoqIGFuZCBtYXJrIHRoZSBwb3J0IGFzIHVzYWJsZQorCQkqLworCQlQb3J0UC0+TWFwcGVkID0gMTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJfQorCWlmICggSG9zdE1hcFAtPlN5c1BvcnQgPCBwLT5SSU9GaXJzdFBvcnRzTWFwcGVkICkKKwkJcC0+UklPRmlyc3RQb3J0c01hcHBlZCA9IEhvc3RNYXBQLT5TeXNQb3J0OworCWlmICggSG9zdE1hcFAtPlN5c1BvcnQgPiBwLT5SSU9MYXN0UG9ydHNNYXBwZWQgKQorCQlwLT5SSU9MYXN0UG9ydHNNYXBwZWQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKKworCXJldHVybiAwOworfQorCitpbnQKK1JJT0NoYW5nZU5hbWUocCwgTWFwUCkKK3N0cnVjdCByaW9faW5mbyAqcDsKK3N0cnVjdCBNYXAqIE1hcFA7IAoreworCWludCBob3N0OworCXN0cnVjdCBNYXAgKkhvc3RNYXBQOworCWNoYXIgKnNwdHI7CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiQ2hhbmdlIG5hbWUgZW50cnkgb24gaG9zdCAleCwgcnRhICV4LCBJRCAlZCwgU3lzcG9ydCAlZFxuIiwKKwkJCQkJCQkJTWFwUC0+SG9zdFVuaXF1ZU51bSxNYXBQLT5SdGFVbmlxdWVOdW0sCisJCQkJCQkJCU1hcFAtPklELCAoaW50KU1hcFAtPlN5c1BvcnQpOworCisJaWYgKCBNYXBQLT5JRCA+IE1BWF9SVVAgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJCYWQgSUQgaW4gbWFwIGVudHJ5IVxuIik7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gSURfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTWFwUC0+TmFtZVtNQVhfTkFNRV9MRU4tMV0gPSAnXDAnOworCXNwdHIgPSBNYXBQLT5OYW1lOworCisJd2hpbGUgKCAqc3B0ciApIHsKKwkJaWYgKCAqc3B0cjwnICcgfHwgKnNwdHI+J34nICkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIk5hbWUgZW50cnkgY29udGFpbnMgbm9uLXByaW50aW5nIGNoYXJhY3RlcnMhXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQkFEX0NIQVJBQ1RFUl9JTl9OQU1FOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc3B0cisrOworCX0KKworCWZvciAoIGhvc3Q9MDsgaG9zdCA8IHAtPlJJT051bUhvc3RzOyBob3N0KysgKSB7CisJCWlmICggTWFwUC0+SG9zdFVuaXF1ZU51bSA9PSBwLT5SSU9Ib3N0c1tob3N0XS5VbmlxdWVOdW0gKSB7CisJCQlpZiAoIChwLT5SSU9Ib3N0c1tob3N0XS5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApIHsKKwkJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTk9UX1JVTk5JTkc7CisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCX0KKwkJCWlmICggTWFwUC0+SUQ9PTAgKSB7CisJCQkJQ0NPUFkoIE1hcFAtPk5hbWUsIHAtPlJJT0hvc3RzW2hvc3RdLk5hbWUsIE1BWF9OQU1FX0xFTiApOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlIb3N0TWFwUCA9ICZwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW01hcFAtPklELTFdOworCisJCQlpZiAoIEhvc3RNYXBQLT5SdGFVbmlxdWVOdW0gIT0gTWFwUC0+UnRhVW5pcXVlTnVtICkgeworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gUlRBX05VTUJFUl9XUk9ORzsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJQ0NPUFkoIE1hcFAtPk5hbWUsIEhvc3RNYXBQLT5OYW1lLCBNQVhfTkFNRV9MRU4gKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXAtPlJJT0Vycm9yLkVycm9yID0gVU5LTk9XTl9IT1NUX05VTUJFUjsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiVW5rbm93biBob3N0ICV4XG4iLCBNYXBQLT5Ib3N0VW5pcXVlTnVtKTsKKwlyZXR1cm4gLUVOWElPOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW90aW1lLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ1MmJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90aW1lLmgKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgIFQgSSBNIEUKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IEplcmVteSBSb2xscworIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKworICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3Jpb3RpbWVfaAorI2RlZmluZSBfcmlvdGltZV9oIDEKKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDUworc3RhdGljIGNoYXIgKl9yaW9fcmlvdGltZV9oX3NjY3MgPSAiQCgjKXJpb3RpbWUuaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgVFdPX1BPV0VSX0ZJRlRFRU4gKHVzaG9ydCkzMjc2OAorI2RlZmluZSBSaW9UaW1lKCkgICAgcmlvdGltZQorI2RlZmluZSBSaW9UaW1lQWZ0ZXIodGltZTEsdGltZTIpICgodXNob3J0KXRpbWUxIC0gKHVzaG9ydCl0aW1lMikgPCBUV09fUE9XRVJfRklGVEVFTgorI2RlZmluZSBSaW9UaW1lUGx1cyh0aW1lMSx0aW1lMikgKCh1c2hvcnQpdGltZTEgKyAodXNob3J0KXRpbWUyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbnZlcnQgYSBSSU8gdGljayAoMS8xMHRoIHNlY29uZCkKKyAqIGludG8gdHJhbnNwdXRlciBsb3cgcHJpb3JpdHkgdGlja3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKKyNkZWZpbmUgUmlvVGltZVRvTG93KHRpbWUpICh0aW1lKigxMDAwMDAgLyA2NCkpCisjZGVmaW5lIFJpb0xvd1RvVGltZSh0aW1lKSAoKHRpbWUqNjQpLzEwMDAwMCkKKworI2RlZmluZSBSSU9URU5USFNFQ09ORCAodXNob3J0KTEKKyNkZWZpbmUgUklPU0VDT05EICh1c2hvcnQpKFJJT1RFTlRIU0VDT05EICogMTApCisjZW5kaWYKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW90dHkuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2NTUwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdHR5LmMKQEAgLTAsMCArMSwxMzc2IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiByaW90dHkuYworKioJU0lECQk6IDEuMworKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTA6MzM6NDcKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTA6MzM6NTAKKyoqCisqKiAgaWRlbnQgQCgjKXJpb3R0eS5jCTEuMworKioKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb3R0eV9jX3NjY3NfID0gIkAoIylyaW90dHkuYwkxLjMiOworI2VuZGlmCisKKworI2RlZmluZSBfX0VYUExJQ0lUX0RFRl9IX18KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CisKKworI2luY2x1ZGUgImxpbnV4X2NvbXBhdC5oIgorI2luY2x1ZGUgInJpb19saW51eC5oIgorI2luY2x1ZGUgInR5cGRlZi5oIgorI2luY2x1ZGUgInBrdC5oIgorI2luY2x1ZGUgImRhZW1vbi5oIgorI2luY2x1ZGUgInJpby5oIgorI2luY2x1ZGUgInJpb3NwYWNlLmgiCisjaW5jbHVkZSAidG9wLmgiCisjaW5jbHVkZSAiY21kcGt0LmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAicmlvdHlwZXMuaCIKKyNpbmNsdWRlICJydXAuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmlvZHJ2ci5oIgorI2luY2x1ZGUgInJpb2luZm8uaCIKKyNpbmNsdWRlICJmdW5jLmgiCisjaW5jbHVkZSAiZXJyb3JzLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyNpbmNsdWRlICJwYXJtbWFwLmgiCisjaW5jbHVkZSAidW5peHJ1cC5oIgorI2luY2x1ZGUgImJvYXJkLmgiCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAicGhiLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgImNtZGJsay5oIgorI2luY2x1ZGUgInJvdXRlLmgiCisjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgImNpcnJ1cy5oIgorI2luY2x1ZGUgInJpb2lvY3RsLmgiCisjaW5jbHVkZSAicGFyYW0uaCIKKyNpbmNsdWRlICJsaXN0LmgiCisjaW5jbHVkZSAic2FtLmgiCisKKyNpZiAwCitzdGF0aWMgdm9pZCB0dHlzZXRoX3B2KHN0cnVjdCBQb3J0ICosIHN0cnVjdCB0dHlzdGF0aWNzICosIAorCQkJCXN0cnVjdCB0ZXJtaW9zICpzZywgaW50KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBSSU9DbGVhclVwKHN0cnVjdCBQb3J0ICpQb3J0UCk7CitpbnQgUklPU2hvcnRDb21tYW5kKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IFBvcnQgKlBvcnRQLCAKKwkJCSAgIGludCBjb21tYW5kLCBpbnQgbGVuLCBpbnQgYXJnKTsKKworI2lmIDAKK3N0YXRpYyBpbnQgUklPQ29va01vZGUoc3RydWN0IHR0eXN0YXRpY3MgKik7CisjZW5kaWYKKworZXh0ZXJuIGludAljb252X3ZiW107CS8qIG5vdyBkZWZpbmVkIGluIHR0eW1nci5jICovCitleHRlcm4gaW50CWNvbnZfYnZbXTsJLyogbm93IGRlZmluZWQgaW4gdHR5bWdyLmMgKi8KKyAKKy8qCisqKiAxNi4wOS4xOTk4IEFSRyAtIEZpeCB0byBidWlsZCByaW90dHkuay5vIGZvciBNb2R1bGFyIEtlcm5lbCBTdXBwb3J0CisqKgorKiogZXAuZGVmLmggaXMgbmVjZXNzYXJ5IGZvciBNb2R1bGFyIEtlcm5lbCBTdXBwb3J0CisqKiBETyBOT1QgcGxhY2UgYW55IGtlcm5lbCAnZXh0ZXJuJ3MgYWZ0ZXIgdGhpcyBsaW5lCisqKiBvciB0aGlzIHNvdXJjZSBmaWxlIHdpbGwgbm90IGJ1aWxkIHJpb3R0eS5rLm8KKyovCisjaWZkZWYgdUxZTlgKKyNpbmNsdWRlIDxlcC5kZWYuaD4KKyNlbmRpZgorCisjaWZkZWYgTkVFRF9USElTMgorc3RhdGljIHN0cnVjdCBvbGRfc2d0dHliIAorZGVmYXVsdF9zZyA9IAoreyAKKwlCMTkyMDAsIEIxOTIwMCwJCQkJLyogaW5wdXQgYW5kIG91dHB1dCBzcGVlZCAqLyAKKwknSCcgLSAnQCcsCQkJCQkvKiBlcmFzZSBjaGFyICovIAorCS0xLAkJCQkJCQkvKiAybmQgZXJhc2UgY2hhciAqLyAKKwknVScgLSAnQCcsCQkJCQkvKiBraWxsIGNoYXIgKi8gCisJRUNITyB8IENSTU9ELAkJCQkvKiBtb2RlICovIAorCSdDJyAtICdAJywJCQkJCS8qIGludGVycnVwdCBjaGFyYWN0ZXIgKi8gCisJJ1xcJyAtICdAJywJCQkJCS8qIHF1aXQgY2hhciAqLyAKKwknUScgLSAnQCcsCQkJCQkvKiBzdGFydCBjaGFyICovCisJJ1MnIC0gJ0AnLAkJCQkJLyogc3RvcCBjaGFyICovIAorCSdEJyAtICdAJywJCQkJCS8qIEVPRiAqLworCS0xLAkJCQkJCQkvKiBicmsgKi8KKwkoTENSVEJTIHwgTENSVEVSQSB8IExDUlRLSUwgfCBMQ1RMRUNIKSwJLyogbG9jYWwgbW9kZSB3b3JkICovIAorCSdaJyAtICdAJywJCQkJCS8qIHByb2Nlc3Mgc3RvcCAqLworCSdZJyAtICdAJywJCQkJCS8qIGRlbGF5ZWQgc3RvcCAqLworCSdSJyAtICdAJywJCQkJCS8qIHJlcHJpbnQgbGluZSAqLyAKKwknTycgLSAnQCcsCQkJCQkvKiBmbHVzaCBvdXRwdXQgKi8KKwknVycgLSAnQCcsCQkJCQkvKiB3b3JkIGVyYXNlICovCisJJ1YnIC0gJ0AnCQkJCQkvKiBsaXRlcmFsIG5leHQgY2hhciAqLworfTsKKyNlbmRpZgorCisKK2V4dGVybiBzdHJ1Y3QgcmlvX2luZm8gKnA7CisKKworaW50CityaW90b3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXJlZ2lzdGVyIHVpbnQgU3lzUG9ydDsKKwlpbnQgTW9kZW07CisJaW50IHJlcGVhdF90aGlzID0gMjUwOworCXN0cnVjdCBQb3J0ICpQb3J0UDsJCSAvKiBwb2ludGVyIHRvIHRoZSBwb3J0IHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbCA9IDA7CisKKwlmdW5jX2VudGVyICgpOworCisJLyogTWFrZSBzdXJlIGRyaXZlcl9kYXRhIGlzIE5VTEwgaW4gY2FzZSB0aGUgcmlvIGlzbid0IGJvb3RlZCBqZXQuIEVsc2UgZ3NfY2xvc2UKKwkgICBpcyBnb2luZyB0byBvb3BzLgorCSovCisJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisgICAgICAgIAorCVN5c1BvcnQgPSByaW9fbWlub3IodHR5KTsKKwlNb2RlbSAgID0gcmlvX2lzbW9kZW0odHR5KTsKKworCWlmICggcC0+UklPRmFpbGVkICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlN5c3RlbSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCQlwc2V0ZXJyKEVOWElPKTsKKwkJZnVuY19leGl0ICgpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAicG9ydCBvcGVuIFN5c1BvcnQgJWQgKCVzKSAobWFwcGVkOiVkKVxuIiwKKwkgICAgICAgU3lzUG9ydCwgIE1vZGVtID8gIk1vZGVtIiA6ICJ0dHkiLAorCQkJCSAgIHAtPlJJT1BvcnRwW1N5c1BvcnRdLT5NYXBwZWQpOworCisJLyoKKwkqKiBWYWxpZGF0ZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgYSBsZWdpdGltYXRlIHJlcXVlc3QuCisJKiogQ3VycmVudGx5LCBqdXN0IGNoZWNrIHRoYXQgd2UgYXJlIG9wZW5pbmcgYSBwb3J0IG9uCisJKiogYSBob3N0IGNhcmQgdGhhdCBhY3R1YWxseSBleGlzdHMsIGFuZCB0aGF0IHRoZSBwb3J0CisJKiogaGFzIGJlZW4gbWFwcGVkIG9udG8gYSBob3N0LgorCSovCisJaWYgKFN5c1BvcnQgPj0gUklPX1BPUlRTKSB7CS8qIG91dCBvZiByYW5nZSA/ICovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiSWxsZWdhbCBwb3J0IG51bWJlciAlZFxuIixTeXNQb3J0KTsKKwkJcHNldGVycihFTlhJTyk7CisJCWZ1bmNfZXhpdCgpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qCisJKiogR3JhYiBwb2ludGVyIHRvIHRoZSBwb3J0IHN0dWN0dXJlCisJKi8KKwlQb3J0UCA9IHAtPlJJT1BvcnRwW1N5c1BvcnRdOwkvKiBHZXQgY29udHJvbCBzdHJ1YyAqLworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUG9ydFA6ICVwXG4iLCBQb3J0UCk7CisJaWYgKCAhUG9ydFAtPk1hcHBlZCApIHsJLyogd2UgYXJlbid0IG1hcHBlZCB5ZXQhICovCisJCS8qCisJCSoqIFRoZSBzeXN0ZW0gZG9lc24ndCBrbm93IHdoaWNoIFJUQSB0aGlzIHBvcnQKKwkJKiogY29ycmVzcG9uZHMgdG8uCisJCSovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAicG9ydCBub3QgbWFwcGVkIGludG8gc3lzdGVtXG4iKTsKKwkJZnVuY19leGl0ICgpOworCQlwc2V0ZXJyKEVOWElPKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwl0dHktPmRyaXZlcl9kYXRhID0gUG9ydFA7CisKKwlQb3J0UC0+Z3MudHR5ID0gdHR5OworCVBvcnRQLT5ncy5jb3VudCsrOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICIlZCBieXRlcyBpbiB0eCBidWZmZXJcbiIsCisJCQkJICAgUG9ydFAtPmdzLnhtaXRfY250KTsKKworCXJldHZhbCA9IGdzX2luaXRfcG9ydCAoJlBvcnRQLT5ncyk7CisJaWYgKHJldHZhbCkgeworCQlQb3J0UC0+Z3MuY291bnQtLTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJLyoKKwkqKiBJZiB0aGUgaG9zdCBoYXNuJ3QgYmVlbiBib290ZWQgeWV0LCB0aGVuIAorCSoqIGZhaWwKKwkqLworCWlmICggKFBvcnRQLT5Ib3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiSG9zdCBub3QgcnVubmluZ1xuIik7CisJCXBzZXRlcnIoRU5YSU8pOworCQlmdW5jX2V4aXQgKCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyoKKwkqKiBJZiB0aGUgUlRBIGhhcyBub3QgYm9vdGVkIHlldCBhbmQgdGhlIHVzZXIgaGFzIGNob29zZW4gdG8gYmxvY2sKKwkqKiB1bnRpbCB0aGUgUlRBIGlzIHByZXNlbnQgdGhlbiB3ZSBtdXN0IHNwaW4gaGVyZSB3YWl0aW5nIGZvcgorCSoqIHRoZSBSVEEgdG8gYm9vdC4KKwkqLworI2lmIDAKKwlpZiAoIShQb3J0UC0+SG9zdFAtPk1hcHBpbmdbUG9ydFAtPlJ1cE51bV0uRmxhZ3MgJiBSVEFfQk9PVEVEKSkgeworCQlpZiAoUG9ydFAtPldhaXRVbnRpbEJvb3RlZCkgeworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBSVEEgdG8gYm9vdFxuIik7CisJCQlkbyB7CisJCQkJaWYgKFJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgeworCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBFSU5UUiBpbiBkZWxheSBcbiIpOworCQkJCQlmdW5jX2V4aXQgKCk7CisJCQkJCXJldHVybiAtRUlOVFI7CisJCQkJfQorCQkJCWlmIChyZXBlYXRfdGhpcyAtLSA8PSAwKSB7CisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUlRBIHRvIGJvb3QgdGltZW91dFxuIik7CisJCQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKKwkJCQkJcHNldGVycihFSU5UUik7CisJCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQkJcmV0dXJuIC1FSU87CisJCQkJfQorCQkJfSB3aGlsZSghKFBvcnRQLT5Ib3N0UC0+TWFwcGluZ1tQb3J0UC0+UnVwTnVtXS5GbGFncyAmIFJUQV9CT09URUQpKTsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIGhhcyBiZWVuIGJvb3RlZFxuIik7CisJCX0gZWxzZSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBuZXZlciBib290ZWRcbiIpOworCQkJcHNldGVycihFTlhJTyk7CisJCQlmdW5jX2V4aXQgKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNlbHNlCisJLyogSSBmaW5kIHRoZSBhYm92ZSBjb2RlIGEgYml0IGhhaXJ5LiBJIGZpbmQgdGhlIGJlbG93IGNvZGUKKyAgICAgICAgICAgZWFzaWVyIHRvIHJlYWQgYW5kIHNob3J0ZXIuIE5vdywgaWYgaXQgd29ya3MgdG9vIHRoYXQgd291bGQKKwkgICBiZSBncmVhdC4uLiAtLSBSRVcgCisJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNoZWNraW5nIGlmIFJUQSBoYXMgYm9vdGVkLi4uIFxuIik7CisJd2hpbGUgKCEoUG9ydFAtPkhvc3RQLT5NYXBwaW5nW1BvcnRQLT5SdXBOdW1dLkZsYWdzICYgUlRBX0JPT1RFRCkpIHsKKwkgIGlmICghUG9ydFAtPldhaXRVbnRpbEJvb3RlZCkgeworCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBuZXZlciBib290ZWRcbiIpOworCSAgICBmdW5jX2V4aXQgKCk7CisJICAgIHJldHVybiAtRU5YSU87CisJICB9CisKKwkgIC8qIFVuZGVyIExpbnV4IHlvdSdkIG5vcm1hbGx5IHVzZSBhIHdhaXQgaW5zdGVhZCBvZiB0aGlzCisJICAgICBidXN5LXdhaXRpbmcuIEknbGwgc3RpY2sgd2l0aCB0aGUgb2xkIGltcGxlbWVudGF0aW9uIGZvcgorCSAgICAgbm93LiAtLVJFVyAKKwkgICovCisJICBpZiAoUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBX3dhaXRfZm9yX2Jvb3Q6IEVJTlRSIGluIGRlbGF5IFxuIik7CisJICAgIGZ1bmNfZXhpdCAoKTsKKwkgICAgcmV0dXJuIC1FSU5UUjsKKwkgIH0KKwkgIGlmIChyZXBlYXRfdGhpcyAtLSA8PSAwKSB7CisJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUlRBIHRvIGJvb3QgdGltZW91dFxuIik7CisJICAgIGZ1bmNfZXhpdCAoKTsKKwkgICAgcmV0dXJuIC1FSU87CisJICB9CisJfQorCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIGhhcyBiZWVuIGJvb3RlZFxuIik7CisjZW5kaWYKKyNpZiAwCisJdHAgPSAgUG9ydFAtPlR0eVA7CQkvKiBnZXQgdHR5IHN0cnVjdCAqLworI2VuZGlmCisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlnb3RvIGJvbWJvdXQ7CisJfQorI2lmIDAKKwlyZXR2YWwgPSBnc19pbml0X3BvcnQoJlBvcnRQLT5ncyk7CisJaWYgKHJldHZhbCl7CisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisjZW5kaWYKKworCS8qCisJKiogSWYgdGhlIHBvcnQgaXMgaW4gdGhlIGZpbmFsIHRocm93cyBvZiBiZWluZyBjbG9zZWQsCisJKiogd2Ugc2hvdWxkIHdhaXQgaGVyZSAocG9saXRlbHkpLCB3YWl0aW5nCisJKiogZm9yIGl0IHRvIGZpbmlzaCwgc28gdGhhdCBpdCBkb2Vzbid0IGNsb3NlIHVzIQorCSovCisJd2hpbGUgKCAoUG9ydFAtPlN0YXRlICYgUklPX0NMT1NJTkcpICYmICFwLT5SSU9IYWx0ZWQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUklPX0NMT1NJTkcgdG8gZ28gYXdheVxuIik7CisJCWlmIChyZXBlYXRfdGhpcyAtLSA8PSAwKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpZGxlIGNsb3NlZCBicm9rZW4gYnkgc2lnbmFsXG4iKTsKKwkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKKwkJCXJldHZhbCA9IC1FSU5UUjsKKwkJCWdvdG8gYm9tYm91dDsKKwkJfQorCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJaWYgKFJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgeworCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOyAKKwkJCXJldHZhbCA9IC1FSU5UUjsKKwkJCWdvdG8gYm9tYm91dDsKKwkJfQorCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7IAorCX0KKworCWlmICggIVBvcnRQLT5NYXBwZWQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUG9ydCB1bm1hcHBlZCB3aGlsZSBjbG9zaW5nIVxuIik7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR2YWwgPSAtRU5YSU87CisJCWZ1bmNfZXhpdCAoKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJZ290byBib21ib3V0OworCX0KKworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYxIHBhcnQgZml4CisqKiBSSU8gaGFzIGl0J3Mgb3duIENUU0ZMT1cgYW5kIFJUU0ZMT1cgZmxhZ3MgaW4gJ0NvbmZpZycgaW4gdGhlIHBvcnQgc3RydWN0dXJlLAorKiogd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZmxhZ3MgYXJlIGNsZWFyIHdoZW4gdGhlIHBvcnQgaXMgb3BlbmVkLgorKi8KKwkvKiBVaD8gU3VwcG9zZSBJIHR1cm4gdGhlc2Ugb24gYW5kIHRoZW4gYW5vdGhlciBwcm9jZXNzIG9wZW5zCisJICAgdGhlIHBvcnQgYWdhaW4/IFRoZSBmbGFncyBnZXQgY2xlYXJlZCEgTm90IGdvb2QuIC0tIFJFVyAqLworCWlmICggIShQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOIHwgUklPX01PUEVOKSkgKSB7CisJCVBvcnRQLT5Db25maWcgJj0gfihSSU9fQ1RTRkxPV3xSSU9fUlRTRkxPVyk7CisJfQorCisJaWYgKCEoUG9ydFAtPmZpcnN0T3BlbikpIHsJLyogRmlyc3QgdGltZSA/ICovCisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiRmlyc3Qgb3BlbiBmb3IgdGhpcyBwb3J0XG4iKTsKKwkKKworCQlQb3J0UC0+Zmlyc3RPcGVuKys7CisJCVBvcnRQLT5Db29rTW9kZSA9IDA7IC8qIFhYWCBSSU9Db29rTW9kZSh0cCk7ICovCisJCVBvcnRQLT5JblVzZSA9IE5PVF9JTlVTRTsKKworCQkvKiBUZW50YXRpdmUgZml4IGZvciBidWcgUFIyNy4gRGlkbid0IHdvcmsuICovCisJCS8qIFBvcnRQLT5ncy54bWl0X2NudCA9IDA7ICovCisKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisjaWZkZWYgTkVFRF9USElTCisJCXR0eXNldGgoUG9ydFAsIHRwLCAoc3RydWN0IG9sZF9zZ3R0eWIgKikmZGVmYXVsdF9zZyk7CisjZW5kaWYKKworCQkvKiBTb21lb25lIGV4cGxhaW4gdG8gbWUgd2h5IHRoaXMgZGVsYXkvY29uZmlnIGlzCisgICAgICAgICAgICAgICAgICAgaGVyZS4gSWYgSSByZWFkIHRoZSBkb2NzIGNvcnJlY3RseSB0aGUgIm9wZW4iCisgICAgICAgICAgICAgICAgICAgY29tbWFuZCBwaWdneWJhY2tzIHRoZSBwYXJhbWV0ZXJzIGltbWVkaWF0ZWx5LiAKKwkJICAgLS0gUkVXICovCisJCVJJT1BhcmFtKFBvcnRQLE9QRU4sTW9kZW0sT0tfVE9fU0xFRVApOwkJLyogT3BlbiB0aGUgcG9ydCAqLworI2lmIDAKKwkJLyogVGhpcyBkZWxheSBvZiAxIHNlY29uZCB3YXMgYW5ub3lpbmcuIEkgcmVtb3ZlZCBpdC4gLS0gUkVXICovCisJCVJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKjEwKTsKKwkJUklPUGFyYW0oUG9ydFAsQ09ORklHLE1vZGVtLE9LX1RPX1NMRUVQKTsJLyogQ29uZmlnIHRoZSBwb3J0ICovCisjZW5kaWYKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCisJCS8qCisJCSoqIHdhaXQgZm9yIHRoZSBwb3J0IHRvIGJlIG5vdCBjbG9zZWQuCisJCSovCisJCXdoaWxlICggIShQb3J0UC0+UG9ydFN0YXRlICYgUE9SVF9JU09QRU4pICYmICFwLT5SSU9IYWx0ZWQgKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIFBPUlRfSVNPUEVOLWN1cnJlbnRseSAleFxuIixQb3J0UC0+UG9ydFN0YXRlKTsKKy8qCisqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc1OQorKiogKFBhcnQpIGZpeCBmb3IgcG9ydCBiZWluZyB0cmFzaGVkIHdoZW4gb3BlbmVkIHdoaWxzdCBSVEEgImRpc2Nvbm5lY3RlZCIKKyoqIFRha2Ugb3V0IHRoZSBsaW1pdGVkIHdhaXQgLSBub3cgd2FpdCBmb3IgZXZlciBvciB1bnRpbCB1c2VyCisqKiBiYW5ncyB1cyBvdXQuCisqKgorCQkJaWYgKHJlcGVhdF90aGlzIC0tIDw9IDApIHsKKwkJCQlyaW9fZHByaW50KFJJT19ERUJVR19UVFksICgiV2FpdGluZyBmb3Igb3BlbiB0byBmaW5pc2ggdGltZWQgb3V0LlxuIikpOworCQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKKwkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorKioKKyovCisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCWlmIChSSU9EZWxheShQb3J0UCwgSFVORFJFRF9NUykgPT0gUklPX0ZBSUwpIHsKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG9wZW4gdG8gZmluaXNoIGJyb2tlbiBieSBzaWduYWxcbiIpOworCQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOworCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQl9CisKKwkJaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJCSAgcmV0dmFsID0gLUVJTzsKK2JvbWJvdXQ6CisJCSAgLyogCQkJUklPQ2xlYXJVcCggUG9ydFAgKTsgKi8KKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlBPUlRfSVNPUEVOIGZvdW5kXG4iKTsKKwl9CisKKyNpZmRlZiBNT0RFTV9TVVBQT1JUIAorCWlmIChNb2RlbSkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIk1vZGVtIC0gdGVzdCBmb3IgY2FycmllclxuIik7CisJCS8qCisJCSoqIEFDVElPTgorCQkqKiBpbnNlcnQgdGVzdCBmb3IgY2FycmllciBoZXJlLiAtLSA/Pz8KKwkJKiogSSBhbHJlYWR5IHNlZSB0aGF0IHRlc3QgaGVyZS4gV2hhdCdzIHRoZSBkZWFsPyAtLSBSRVcKKwkJKi8KKwkJaWYgKChQb3J0UC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSB8fCAoUG9ydFAtPk1vZGVtU3RhdGUgJiBNU1ZSMV9DRCkpCisJCXsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAib3BlbiglZCkgTW9kZW0gY2FyciBvblxuIiwgU3lzUG9ydCk7CisJCQkvKgorCQkJdHAtPnRtLmNfc3RhdGUgfD0gQ0FSUl9PTjsKKwkJCXdha2V1cCgoY2FkZHJfdCkgJnRwLT50bS5jX2NhbnEpOworCQkJKi8KKwkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQ0FSUl9PTjsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJlBvcnRQLT5ncy5vcGVuX3dhaXQpOworCQl9CisJCWVsc2UgLyogbm8gY2FycmllciAtIHdhaXQgZm9yIERDRCAqLworCQl7CisJCSAgLyoKKwkJCXdoaWxlICghKFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfc3RhdGUgJiBDQVJSX09OKSAmJiAKKwkJCSAgICAgICAhKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJiAhcC0+UklPSGFsdGVkICkKKwkJICAqLworCQkJd2hpbGUgKCEoUG9ydFAtPlN0YXRlICYgUklPX0NBUlJfT04pICYmIAorCQkJICAgICAgICEoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmICFwLT5SSU9IYWx0ZWQgKSB7CisKKwkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIm9wZW4oJWQpIHNsZWVwaW5nIGZvciBjYXJyIG9uXG4iLFN5c1BvcnQpOworCQkJCS8qCisJCQkJUG9ydFAtPmdzLnR0eS0+dGVybWlvcy0+Y19zdGF0ZSB8PSBXT1BFTjsKKwkJCQkqLworCQkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fV09QRU47CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJaWYgKFJJT0RlbGF5IChQb3J0UCwgSFVORFJFRF9NUykgPT0gUklPX0ZBSUwpCisjaWYgMAorCQkJCWlmICggc2xlZXAoKGNhZGRyX3QpJnRwLT50bS5jX2NhbnFvLCBUVElQUkl8UENBVENIKSkKKyNlbmRpZgorCQkJCXsKKwkJCQkJLyoKKwkJCQkJKiogQUNUSU9OOiB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgZ29vZCB0aGluZworCQkJCQkqKiB0byBkbyBoZXJlLiAtLSA/Pz8KKwkJCQkJKiogSSB0aGluayBpdCdzIE9LLiAtLSBSRVcKKwkJCQkJKi8KKwkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJvcGVuKCVkKSBzbGVlcGluZyBmb3IgY2FyciBicm9rZW4gYnkgc2lnbmFsXG4iLAorCQkJCQkgICAgICAgU3lzUG9ydCk7CisJCQkJCVJJT1ByZWVtcHRpdmVDbWQoIHAsIFBvcnRQLCBGQ0xPU0UgKTsKKwkJCQkJLyoKKwkJCQkJdHAtPnRtLmNfc3RhdGUgJj0gfldPUEVOOworCQkJCQkqLworCQkJCQlQb3J0UC0+U3RhdGUgJj0gflJJT19XT1BFTjsKKwkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCQl9CisJCQl9CisJCQlQb3J0UC0+U3RhdGUgJj0gflJJT19XT1BFTjsKKwkJfQorCQlpZiAoIHAtPlJJT0hhbHRlZCApCisJCQlnb3RvIGJvbWJvdXQ7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiU2V0dGluZyBSSU9fTU9QRU5cbiIpOworCQlQb3J0UC0+U3RhdGUgfD0gUklPX01PUEVOOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJCS8qCisJCSoqIEFDVElPTgorCQkqKiBEaXJlY3QgbGluZSBvcGVuIC0gZm9yY2UgY2FycmllciAod2lsbCBwcm9iYWJseSBtZWFuCisJCSoqIHRoYXQgc2xlZXBpbmcgTW9kZW0gbGluZSBmdWJhcikKKwkJKi8KKwkJUG9ydFAtPlN0YXRlIHw9IFJJT19MT1BFTjsKKwl9CisKKwlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJZ290byBib21ib3V0OworCX0KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiaGlnaCBsZXZlbCBvcGVuIGRvbmVcbiIpOworCisjaWZkZWYgU1RBVFMKKwlQb3J0UC0+U3RhdC5PcGVuQ250Kys7CisjZW5kaWYKKwkvKgorCSoqIENvdW50IG9wZW5zIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisJKi8KKwlpZiAoUG9ydFAtPnN0YXRzR2F0aGVyKQorCQlQb3J0UC0+b3BlbnMrKzsKKworCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUmV0dXJuaW5nIGZyb20gb3BlblxuIik7CisJZnVuY19leGl0ICgpOworCXJldHVybiAwOworfQorCisvKgorKiogUklPQ2xvc2UgdGhlIHBvcnQuCisqKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSB0aGlua3MgdGhhdCB0aGlzIGlzIGxhc3QgY2xvc2UgZm9yIHRoZSBkZXZpY2UuCisqKiBBcyB0aGVyZSBhcmUgdHdvIGludGVyZmFjZXMgdG8gdGhlIHBvcnQgKE1vZGVtIGFuZCB0dHkpLCB3ZSBuZWVkIHRvCisqKiBjaGVjayB0aGF0IGJvdGggYXJlIGNsb3NlZCBiZWZvcmUgd2UgY2xvc2UgdGhlIGRldmljZS4KKyovIAoraW50CityaW90Y2xvc2Uodm9pZCAgKnB0cikKK3sKKyNpZiAwCisJcmVnaXN0ZXIgdWludCBTeXNQb3J0ID0gZGV2OworCXN0cnVjdCB0dHlzdGF0aWNzICp0cDsJCS8qIHBvaW50ZXIgdG8gb3VyIHR0eXN0cnVjdCAqLworI2VuZGlmCisJc3RydWN0IFBvcnQgKlBvcnRQID1wdHI7CS8qIHBvaW50ZXIgdG8gdGhlIHBvcnQgc3RydWN0dXJlICovCisJaW50IGRlbGV0ZWQgPSAwOworCWludAl0cnkgPSAtMTsgLyogRGlzYWJsZSB0aGUgdGltZW91dHMgYnkgc2V0dGluZyB0aGVtIHRvIC0xICovCisJaW50CXJlcGVhdF90aGlzID0gLTE7IC8qIENvbmdyYXRzIHRvIHRob3NlIGhhdmluZyAxNSB5ZWFycyBvZiAKKwkJCQkgICAgIHVwdGltZSEgKFlvdSBnZXQgdG8gYnJlYWsgdGhlIGRyaXZlci4pICovCisJbG9uZyBlbmRfdGltZTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBNb2RlbTsKKwlpbnQgcnYgPTA7CisJCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJwb3J0IGNsb3NlIFN5c1BvcnQgJWRcbiIsUG9ydFAtPlBvcnROdW0pOworCisJLyogUG9ydFAgPSBwLT5SSU9Qb3J0cFtTeXNQb3J0XTsgKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlBvcnQgaXMgYXQgYWRkcmVzcyAweCV4XG4iLChpbnQpUG9ydFApOworCS8qIHRwID0gUG9ydFAtPlR0eVA7Ki8JCQkvKiBHZXQgdHR5ICovCisJdHR5ID0gUG9ydFAtPmdzLnR0eTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRUWSBpcyBhdCBhZGRyZXNzIDB4JXhcbiIsKGludCl0dHkpOworCisJaWYgKFBvcnRQLT5ncy5jbG9zaW5nX3dhaXQpIAorCQllbmRfdGltZSA9IGppZmZpZXMgKyBQb3J0UC0+Z3MuY2xvc2luZ193YWl0OworCWVsc2UgCisJCWVuZF90aW1lID0gamlmZmllcyArIE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCisJTW9kZW0gPSByaW9faXNtb2RlbSh0dHkpOworI2lmIDAKKwkvKiBXaGF0IEYuQ0tJTkcgY2FjaGU/IEV2ZW4gdGhlbiwgYSBoaWdseSBpZGxlIG11bHRpcHJvY2Vzc29yLAorCSAgIHN5c3RlbSB3aXRoIGxhcmdlIGNhY2hlcyB0aGlzIHdvbid0IHdvcmsgLiBCZXR0ZXIgZmluZCBvdXQgd2hlbiAKKwkgICB0aGlzIGRvZXNuJ3Qgd29yayBhc2FwLCBhbmQgZml4IHRoZSBjYXVzZS4gIC0tIFJFVyAqLworCQorCVJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKjEwKTsJLyogVG8gZmx1c2ggdGhlIGNhY2hlICovCisjZW5kaWYKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwkvKgorCSoqIFNldHRpbmcgdGhpcyBmbGFnIHdpbGwgbWFrZSBhbnkgcHJvY2VzcyB0cnlpbmcgdG8gb3BlbgorCSoqIHRoaXMgcG9ydCBibG9jayB1bnRpbCB3ZSBhcmUgY29tcGxldGUgY2xvc2luZyBpdC4KKwkqLworCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQ0xPU0lORzsKKworCWlmICggKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDbG9zZSBvbiBkZWxldGVkIFJUQVxuIik7CisJCWRlbGV0ZWQgPSAxOworCX0KKwkKKwlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJUklPQ2xlYXJVcCggUG9ydFAgKTsKKwkJcnYgPSAtRUlPOworCQlnb3RvIGNsb3NlX2VuZDsKKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNsZWFyIGJpdHNcbiIpOworCS8qCisJKiogY2xlYXIgdGhlIG9wZW4gYml0cyBmb3IgdGhpcyBkZXZpY2UKKwkqLworCVBvcnRQLT5TdGF0ZSAmPSAoTW9kZW0gPyB+UklPX01PUEVOIDogflJJT19MT1BFTik7CisJUG9ydFAtPlN0YXRlICY9IH5SSU9fQ0FSUl9PTjsKKwlQb3J0UC0+TW9kZW1TdGF0ZSAmPSB+TVNWUjFfQ0Q7CisJLyoKKwkqKiBJZiB0aGUgZGV2aWNlIHdhcyBvcGVuIGFzIGJvdGggYSBNb2RlbSBhbmQgYSB0dHkgbGluZQorCSoqIHRoZW4gd2UgbmVlZCB0byB3aW1wIG91dCBoZXJlLCBhcyB0aGUgcG9ydCBoYXMgbm90IHJlYWxseQorCSoqIGJlZW4gZmluYWxseSBjbG9zZWQgKGdlZSwgd2hpenohKSBUaGUgdGVzdCBoZXJlIHVzZXMgdGhlCisJKiogYml0IGZvciB0aGUgT1RIRVIgbW9kZSBvZiBvcGVyYXRpb24sIHRvIHNlZSBpZiBUSEFUIGlzCisJKiogc3RpbGwgYWN0aXZlIQorCSovCisJaWYgKCAoUG9ydFAtPlN0YXRlICYgKFJJT19MT1BFTnxSSU9fTU9QRU4pKSApIHsKKwkJLyoKKwkJKiogVGhlIHBvcnQgaXMgc3RpbGwgb3BlbiBmb3IgdGhlIG90aGVyIHRhc2sgLQorCQkqKiByZXR1cm4sIHByZXRlbmRpbmcgdGhhdCB3ZSBhcmUgc3RpbGwgYWN0aXZlLgorCQkqLworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNoYW5uZWwgJWQgc3RpbGwgb3BlbiAhXG4iLFBvcnRQLT5Qb3J0TnVtKTsKKwkJUG9ydFAtPlN0YXRlICY9IH5SSU9fQ0xPU0lORzsKKwkJaWYgKFBvcnRQLT5maXJzdE9wZW4pCisJCQlQb3J0UC0+Zmlyc3RPcGVuLS07CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNsb3NpbmcgZG93biAtIGV2ZXJ5dGhpbmcgbXVzdCBnbyFcbiIpOworCisJUG9ydFAtPlN0YXRlICY9IH5SSU9fRFlOT1JPRDsKKworCS8qCisJKiogVGhpcyBpcyB3aGVyZSB3ZSB3YWl0IGZvciB0aGUgcG9ydAorCSoqIHRvIGRyYWluIGRvd24gYmVmb3JlIGNsb3NpbmcuIEJ5ZS1ieWUuLi4uCisJKiogKFdlIG5ldmVyIG1lYW50IHRvIGRvIHRoaXMpCisJKi8KKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRpbWVvdXQgMSBzdGFydHNcbiIpOworCisJaWYgKCFkZWxldGVkKQorCXdoaWxlICggKFBvcnRQLT5JblVzZSAhPSBOT1RfSU5VU0UpICYmICFwLT5SSU9IYWx0ZWQgJiYgCisJCShQb3J0UC0+VHhCdWZmZXJJbiAhPSBQb3J0UC0+VHhCdWZmZXJPdXQpICkgeworCQljcHJpbnRmKCJOZWVkIHRvIGZsdXNoIHRoZSB0dHlwb3J0XG4iKTsKKwkJaWYgKHJlcGVhdF90aGlzIC0tIDw9IDApIHsKKwkJCXJ2ID0gLUVJTlRSOworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBub3QgaWRsZSBjbG9zZWQgYnJva2VuIGJ5IHNpZ25hbFxuIik7CisJCQlSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBGQ0xPU0UgKTsgCisJCQlnb3RvIGNsb3NlX2VuZDsKKwkJfQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNhbGxpbmcgdGltZW91dCB0byBmbHVzaCBpbiBjbG9zaW5nXG4iKTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWlmIChSSU9EZWxheV9uaShQb3J0UCwgSFVORFJFRF9NUyoxMCkgPT0gUklPX0ZBSUwpIHsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIEVJTlRSIGluIGRlbGF5IFxuIik7CisJCQlydiA9IC1FSU5UUjsKKwkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCWdvdG8gY2xvc2VfZW5kOworCQl9CisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisKKwlQb3J0UC0+VHhCdWZmZXJJbiA9IFBvcnRQLT5UeEJ1ZmZlck91dCA9IDA7CisJcmVwZWF0X3RoaXMgPSAweGZmOworCisJUG9ydFAtPkluVXNlID0gMDsKKwlpZiAoIChQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOfFJJT19NT1BFTikpICkgeworCQkvKgorCQkqKiBUaGUgcG9ydCBoYXMgYmVlbiByZS1vcGVuZWQgZm9yIHRoZSBvdGhlciB0YXNrIC0KKwkJKiogcmV0dXJuLCBwcmV0ZW5kaW5nIHRoYXQgd2UgYXJlIHN0aWxsIGFjdGl2ZS4KKwkJKi8KKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDaGFubmVsICVkIHJlLW9wZW4hXG4iLCBQb3J0UC0+UG9ydE51bSk7CisJCVBvcnRQLT5TdGF0ZSAmPSB+UklPX0NMT1NJTkc7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlpZiAoUG9ydFAtPmZpcnN0T3BlbikKKwkJCVBvcnRQLT5maXJzdE9wZW4tLTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJCVJJT0NsZWFyVXAoIFBvcnRQICk7CisJCWdvdG8gY2xvc2VfZW5kOworCX0KKworCQorCisJLyogQ2FuJ3QgY2FsbCBSSU9TaG9ydENvbW1hbmQgd2l0aCB0aGUgcG9ydCBsb2NrZWQuICovCisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKwlpZiAoUklPU2hvcnRDb21tYW5kKHAsIFBvcnRQLCBDTE9TRSwgMSwgMCkgPT0gUklPX0ZBSUwpIHsKKwkgIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsRkNMT1NFKTsKKwkgIGdvdG8gY2xvc2VfZW5kOworCX0KKworCWlmICghZGVsZXRlZCkKKwkgIHdoaWxlICh0cnkgJiYgKFBvcnRQLT5Qb3J0U3RhdGUgJiBQT1JUX0lTT1BFTikpIHsKKwkgICAgICAgIHRyeS0tOworCQlpZiAodGltZV9hZnRlciAoamlmZmllcywgZW5kX3RpbWUpKSB7CisJCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSdW4gb3V0IG9mIHRyaWVzIC0gZm9yY2UgdGhlIGJ1Z2dlciBzaHV0IVxuIiApOworCQkgIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsRkNMT1NFKTsKKwkJICBicmVhazsKKwkJfQorCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNsb3NlOiBQb3J0U3RhdGU6SVNPUEVOIGlzICVkXG4iLCAKKwkJCQkJICAgUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOKTsKKworCQlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJCVJJT0NsZWFyVXAoIFBvcnRQICk7CisJCQlnb3RvIGNsb3NlX2VuZDsKKwkJfQorCQlpZiAoUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBFSU5UUiBpbiBkZWxheSBcbiIpOworCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCxGQ0xPU0UpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2xvc2U6IHRyeSB3YXMgJWQgb24gY29tcGxldGlvblxuIiwgdHJ5ICk7CisgCisJLyogUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgRkNMT1NFKTsgKi8KKworLyoKKyoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYxIHBhcnQgZml4CisqKiBSSU8gaGFzIGl0J3Mgb3duIENUU0ZMT1cgYW5kIFJUU0ZMT1cgZmxhZ3MgaW4gJ0NvbmZpZycgaW4gdGhlIHBvcnQgc3RydWN0dXJlLCoqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZsYWdzIGFyZSBjbGVhciB3aGVuIHRoZSBwb3J0IGlzIG9wZW5lZC4KKyovCisJUG9ydFAtPkNvbmZpZyAmPSB+KFJJT19DVFNGTE9XfFJJT19SVFNGTE9XKTsKKworCisjaWZkZWYgU1RBVFMKKwlQb3J0UC0+U3RhdC5DbG9zZUNudCsrOworI2VuZGlmCisJLyoKKwkqKiBDb3VudCBvcGVucyBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZworCSovCisJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKKwkJUG9ydFAtPmNsb3NlcysrOworCitjbG9zZV9lbmQ6CisJLyogWFhYOiBXaHkgd291bGQgYSAiREVMRVRFRCIgZmxhZyBiZSByZXNldCBoZXJlPyBJJ2QgaGF2ZQorCSAgIHRob3VnaHQgdGhhdCBhICJkZWxldGVkIiBmbGFnIG1lYW5zIHRoYXQgdGhlIHBvcnQgd2FzCisJICAgcGVybWFuZW50bHkgZ29uZSwgYnV0IGhlcmUgd2UgY2FuIG1ha2UgaXQgcmVhcHBlYXIgYnkgaXQKKwkgICBiZWluZyBpbiBjbG9zZSBkdXJpbmcgdGhlICJkZWxldGlvbiIuCisJKi8KKwlQb3J0UC0+U3RhdGUgJj0gfihSSU9fQ0xPU0lOR3xSSU9fREVMRVRFRCk7CisJaWYgKFBvcnRQLT5maXJzdE9wZW4pCisJCVBvcnRQLT5maXJzdE9wZW4tLTsKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJldHVybiBmcm9tIGNsb3NlXG4iKTsKKwlyZXR1cm4gcnY7Cit9CisKKworLyoKKyoqIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHVzZSB0aGUgbGluZSBkaXNjaXBsaW5lLgorKiogVGhpcyByb3V0aW5lIGNhbiByZXR1cm4gb25lIG9mIHRocmVlIHZhbHVlczoKKyoqIENPT0tfUkFXIGlmIG5vIHByb2Nlc3NpbmcgaGFzIHRvIGJlIGRvbmUgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSBvciB0aGUgY2FyZAorKiogQ09PS19XRUxMIGlmIHRoZSBsaW5lIGRpc2NpcGxpbmUgbXVzdCBiZSB1c2VkIHRvIGRvIHRoZSBwcm9jZXNzaW5nCisqKiBDT09LX01FRElVTSBpZiB0aGUgY2FyZCBjYW4gZG8gYWxsIHRoZSBwcm9jZXNzaW5nIG5lY2Vzc2FyeS4KKyovCisjaWYgMAorc3RhdGljIGludAorUklPQ29va01vZGUoc3RydWN0IHR0eXN0YXRpY3MgKnRwKQoreworCS8qCisJKiogV2UgY2FuJ3QgaGFuZGxlIHRtLmNfbXN0YXRlICE9IDAgb24gU0NPCisJKiogV2UgY2FuJ3QgaGFuZGxlIG1hcHBpbmcKKwkqKiBXZSBjYW4ndCBoYW5kbGUgbm9uLXR0d3JpdGUgbGluZSBkaXNjLgorCSoqIFdlIGNhbid0IGhhbmRsZSBsZmxhZyBYQ0FTRQorCSoqIFdlIGNhbiBoYW5kbGUgb2ZsYWcgT1BPU1QgJiAoT0NSTkwsIE9OTENSLCBUQUIzKQorCSovCisKKyNpZmRlZiBDSEVDSworCUNoZWNrVHR5UCggdHAgKTsKKyNlbmRpZgorCWlmICghKHRwLT50bS5jX29mbGFnICYgT1BPU1QpKQkvKiBObyBwb3N0IHByb2Nlc3NpbmcgKi8KKwkJcmV0dXJuIENPT0tfUkFXOwkvKiBSYXcgbW9kZSBvL3AgKi8KKworCWlmICggdHAtPnRtLmNfbGZsYWcgJiBYQ0FTRSApCisJCXJldHVybiBDT09LX1dFTEw7CS8qIFVzZSBsaW5lIGRpc2MgKi8KKworCWlmICh0cC0+dG0uY19vZmxhZyAmIH4oT1BPU1QgfCBPTkxDUiB8IE9DUk5MIHwgVEFCMyApICkKKwkJcmV0dXJuIENPT0tfV0VMTDsJLyogVXNlIGxpbmUgZGlzYyBmb3Igc3RyYW5nZSBtb2RlcyAqLworCisJaWYgKCB0cC0+dG0uY19vZmxhZyA9PSBPUE9TVCApCS8qIElmIG9ubHkgT1BPU1QgaXMgc2V0LCBkbyBSQVcgKi8KKwkJcmV0dXJuIENPT0tfUkFXOworCisJLyoKKwkqKiBTbywgd2UgbmVlZCB0byBvdXRwdXQgcHJvY2VzcyEKKwkqLworCXJldHVybiBDT09LX01FRElVTTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorUklPQ2xlYXJVcChQb3J0UCkKK3N0cnVjdCBQb3J0ICpQb3J0UDsKK3sKKwlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJJT0hhbHRlZCBzZXRcbiIpOworCVBvcnRQLT5Db25maWcgPSAwOwkgIC8qIERpcmVjdCBzZW1hcGhvcmUgKi8KKwlQb3J0UC0+UG9ydFN0YXRlID0gMDsKKwlQb3J0UC0+Zmlyc3RPcGVuID0gMDsKKwlQb3J0UC0+Rmx1c2hDbWRCb2RnZSA9IDA7CisJUG9ydFAtPk1vZGVtU3RhdGUgPSBQb3J0UC0+Q29va01vZGUgPSAwOworCVBvcnRQLT5NYXBwZWQgPSAwOworCVBvcnRQLT5XZmx1c2hGbGFnID0gMDsKKwlQb3J0UC0+TWFnaWNGbGFncwk9IDA7CisJUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKKwlQb3J0UC0+VHhCdWZmZXJJbiA9IDA7CisJUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKK30KKworLyoKKyoqIFB1dCBhIGNvbW1hbmQgb250byBhIHBvcnQuCisqKiBUaGUgUG9ydFBvaW50ZXIsIGNvbW1hbmQsIGxlbmd0aCBhbmQgYXJnIGFyZSBwYXNzZWQuCisqKiBUaGUgbGVuIGlzIHRoZSBsZW5ndGggKmluY2x1c2l2ZSogb2YgdGhlIGNvbW1hbmQgYnl0ZSwKKyoqIGFuZCBzbyBmb3IgYSBjb21tYW5kIHRoYXQgdGFrZXMgbm8gZGF0YSwgbGVuPT0xLgorKiogVGhlIGFyZyBpcyBhIHNpbmdsZSBieXRlLCBhbmQgaXMgb25seSB1c2VkIGlmIGxlbj09Mi4KKyoqIE90aGVyIHZhbHVlcyBvZiBsZW4gYXJlbid0IGFsbG93ZWQsIGFuZCB3aWxsIGNhdXNlCisqKiBhIHBhbmljLgorKi8KK2ludCBSSU9TaG9ydENvbW1hbmQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgUG9ydCAqUG9ydFAsCisJCWludCBjb21tYW5kLCBpbnQgbGVuLCBpbnQgYXJnKQoreworCVBLVCAqUGFja2V0UDsKKwlpbnQJCXJldHJpZXMgPSAyMDsgLyogYXQgMTAgcGVyIHNlY29uZCAtPiAyIHNlY29uZHMgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJlbnRlcmluZyBzaG9ydGNvbW1hbmQuXG4iKTsKKyNpZmRlZiBDSEVDSworCUNoZWNrUG9ydFAoIFBvcnRQICk7CisJaWYgKCBsZW4gPCAxIHx8IGxlbiA+IDIgKQorCQljcHJpbnRmKCgiU1RVUElEIExFTkdUSCAlZFxuIixsZW4pKTsKKyNlbmRpZgorCisJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJTaG9ydCBjb21tYW5kIHRvIGRlbGV0ZWQgUlRBIGlnbm9yZWRcbiIpOworCQlyZXR1cm4gUklPX0ZBSUw7CisJfQorCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCS8qCisJKiogSWYgdGhlIHBvcnQgaXMgaW4gdXNlIGZvciBwcmUtZW1wdGl2ZSBjb21tYW5kLCB0aGVuIHdhaXQgZm9yIGl0IHRvIAorCSoqIGJlIGZyZWUgYWdhaW4uCisJKi8KKwl3aGlsZSAoIChQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFKSAmJiAhcC0+UklPSGFsdGVkICkgeworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpbiB1c2UgKCVkKVxuIiwgCisJCQkJCSAgIHJldHJpZXMpOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJaWYgKHJldHJpZXMtLSA8PSAwKSB7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJaWYgKFJJT0RlbGF5X25pKFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgeworCQkJcmV0dXJuIFJJT19GQUlMOworCQl9CisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisJaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKKwkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJTaG9ydCBjb21tYW5kIHRvIGRlbGV0ZWQgUlRBIGlnbm9yZWRcbiIpOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dXJuIFJJT19GQUlMOworCX0KKworCXdoaWxlICggIWNhbl9hZGRfdHJhbnNtaXQoJlBhY2tldFAsUG9ydFApICYmICFwLT5SSU9IYWx0ZWQgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyB0byBhZGQgc2hvcnQgY29tbWFuZCB0byBxdWV1ZSAoJWQpXG4iLCByZXRyaWVzKTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWlmIChyZXRyaWVzLS0gPD0gMCkgeworCQkgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAib3V0IG9mIHRyaWVzLiBGYWlsaW5nXG4iKTsKKwkJCXJldHVybiBSSU9fRkFJTDsKKwkJfQorCQlpZiAoIFJJT0RlbGF5X25pKFBvcnRQLCBIVU5EUkVEX01TKT09UklPX0ZBSUwgKSB7CisJCQlyZXR1cm4gUklPX0ZBSUw7CisJCX0KKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCX0KKworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dXJuIFJJT19GQUlMOworCX0KKworCS8qCisJKiogc2V0IHRoZSBjb21tYW5kIGJ5dGUgYW5kIHRoZSBhcmd1bWVudCBieXRlCisJKi8KKwlXQllURShQYWNrZXRQLT5kYXRhWzBdICwgY29tbWFuZCk7CisKKwlpZiAoIGxlbj09MiApCisJCVdCWVRFKFBhY2tldFAtPmRhdGFbMV0gLCBhcmcpOworCisJLyoKKwkqKiBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGFuZCBzZXQgdGhlIGNvbW1hbmQgYml0LgorCSovCisJV0JZVEUoUGFja2V0UC0+bGVuICwgUEtUX0NNRF9CSVQgfCBsZW4pOworCisJYWRkX3RyYW5zbWl0KFBvcnRQKTsKKwkvKgorCSoqIENvdW50IGNoYXJhY3RlcnMgdHJhbnNtaXR0ZWQgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkqLworCWlmIChQb3J0UC0+c3RhdHNHYXRoZXIpCisJCVBvcnRQLT50eGNoYXJzICs9IGxlbjsKKworCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCXJldHVybiBwLT5SSU9IYWx0ZWQgPyBSSU9fRkFJTCA6IH5SSU9fRkFJTDsKK30KKworCisjaWYgMAorLyoKKyoqIFRoaXMgaXMgYW4gaW9jdGwgaW50ZXJmYWNlLiBUaGlzIGlzIHRoZSB0d2VudGlldGggY2VudHVyeS4gWW91IGtub3cgd2hhdAorKiogaXRzIGFsbCBhYm91dC4KKyovCitpbnQKK3Jpb3Rpb2N0bChzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBjbWQsIGNhZGRyX3QgYXJnKQoreworCXJlZ2lzdGVyIHN0cnVjdAkJUG9ydCAqUG9ydFA7CisJcmVnaXN0ZXIgc3RydWN0CQl0dHlzdGF0aWNzICp0cDsKKwlpbnQJCQkJCWN1cnJlbnQ7CisJaW50CQkJCQlQYXJhbVNlbUluY3JlbWVudGVkID0gMDsKKwlpbnQJCQkJCW9sZF9vZmxhZywgb2xkX2NmbGFnLCBvbGRfaWZsYWcsIGNoYW5nZWQsIG9sZGNvb2s7CisJaW50CQkJCQlpOworCXVuc2lnbmVkIGNoYXIJCXNpb19yZWdzWzVdOwkJLyogSGVyZSBiZSBtYWdpYyAqLworCXNob3J0CQkJCXZwaXhfY2ZsYWc7CisJc2hvcnQJCQkJZGl2aXNvcjsKKwlpbnQJCQkJCWJhdWQ7CisJdWludAkJCQlTeXNQb3J0ID0gcmlvX21pbm9yKHR0eSk7CisJaW50CQkJCU1vZGVtID0gcmlvX2lzbW9kZW0odHR5KTsKKwlpbnQJCQkJCWlvY3RsX3Byb2Nlc3NlZDsKKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAicG9ydCBpb2N0bCBTeXNQb3J0ICVkIGNvbW1hbmQgMHgleCBhcmd1bWVudCAweCV4ICVzXG4iLAorCQkJU3lzUG9ydCwgY21kLCBhcmcsIE1vZGVtPyJNb2RlbSI6InR0eSIpIDsKKworCWlmICggU3lzUG9ydCA+PSBSSU9fUE9SVFMgKSB7CisJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQmFkIHBvcnQgbnVtYmVyICVkXG4iLCBTeXNQb3J0KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlQb3J0UCA9IHAtPlJJT1BvcnRwW1N5c1BvcnRdOworCXRwID0gUG9ydFAtPlR0eVA7CisKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisKKyNpZmRlZiBTVEFUUworCVBvcnRQLT5TdGF0LklvY3RsQ250Kys7CisjZW5kaWYKKworCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlSSU9DbGVhclVwKCBQb3J0UCApOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkqKiBDb3VudCBpb2N0bHMgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkqLworCWlmIChQb3J0UC0+c3RhdHNHYXRoZXIpCisJCVBvcnRQLT5pb2N0bHMrKzsKKworCS8qCisJKiogU3BlY2lhbGl4IFJJTyBJb2N0bCBjYWxscworCSovCisJc3dpdGNoIChjbWQpIHsKKworCQljYXNlIFRDUklPVFJJQUQ6CisJCQlpZiAoIGFyZyApCisJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19UUklBRF9NT0RFOworCQkJZWxzZQorCQkJCVBvcnRQLT5TdGF0ZSAmPSB+UklPX1RSSUFEX01PREU7CisJCQkvKgorCQkJKiogTm9ybWFsbHksIHdoZW4gaXN0cmlwIGlzIHNldCBvbiBhIHBvcnQsIGEgY29uZmlnIGlzCisJCQkqKiBzZW50IHRvIHRoZSBSVEEgaW5zdHJ1Y3RpbmcgdGhlIENEMTQwMCB0byBkbyB0aGUKKwkJCSoqIHN0cmlwcGluZy4gSW4gVFJJQUQgbW9kZSwgdGhlIGludGVycnVwdCByZWNlaXZlIHJvdXRpbmUKKwkJCSoqIG11c3QgZG8gdGhlIHN0cmlwcGluZyBpbnN0ZWFkLCBzaW5jZSBpdCBoYXMgdG8gZGV0ZWN0CisJCQkqKiBhbiA4IGJpdCBmdW5jdGlvbiBrZXkgc2VxdWVuY2UuIElmIGlzdHJpcCBpcyBzZXQgd2l0aAorCQkJKiogVFJJQUQgbW9kZSBvbihvZmYpLCBhbmQgOCBiaXQgZGF0YSBpcyBiZWluZyByZWFkIGJ5CisJCQkqKiB0aGUgcG9ydCwgdGhlIHVzZXIgdGhlbiB0dXJucyBUUklBRCBtb2RlIG9mZihvbiksIHRoZSBSVEEKKwkJCSoqIG11c3QgYmUgcmVjb25maWd1cmVkIChub3QpIHRvIGRvIHRoZSBzdHJpcHBpbmcuCisJCQkqKiBIZW5jZSB3ZSBjYWxsIFJJT1BhcmFtIGhlcmUuCisJCQkqLworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKKwkJCXJldHVybiAwOworCisJCWNhc2UgVENSSU9UU1RBVEU6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgInRidXN5L3RzdG9wIG1vbml0b3JpbmcgJXNhYmxlZFxuIiwKKwkJIAkJYXJnID8gImVuIiA6ICJkaXMiKTsKKwkJCS8qIE1vbml0b3JUc3RhdGUgPSAwIDsqLworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlSSU9QYXJhbShQb3J0UCwgQ09ORklHLCBNb2RlbSwgT0tfVE9fU0xFRVApOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1NUQVRFOiAvKiBjdXJyZW50IHN0YXRlIG9mIE1vZGVtIGlucHV0IHBpbnMgKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9TVEFURVxuIik7CisJCQlpZiAoUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgTUdFVCkgPT0gUklPX0ZBSUwpCisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1NUQVRFIGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKwkJCWN1cnJlbnQgPSBQb3J0UC0+TW9kZW1TdGF0ZTsKKwkJCWlmICggY29weW91dCgoY2FkZHJfdCkmY3VycmVudCwgKGludClhcmcsCisJCQkJCQkJc2l6ZW9mKGN1cnJlbnQpKT09Q09QWUZBSUwgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDb3B5b3V0IGZhaWxlZFxuIik7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcHNldGVycihFRkFVTFQpOworCQkJfQorCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPTUJJUzoJCS8qIFNldCBtb2RlbSBsaW5lcyAqLworCQljYXNlIFRDUklPTUJJQzoJCS8qIENsZWFyIG1vZGVtIGxpbmVzICovCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPTUJJUy9UQ1JJT01CSUNcbiIpOworCQkJaWYgKGNtZCA9PSBUQ1JJT01CSVMpIHsKKwkJCQl1aW50CQlzdGF0ZTsKKwkJCQlzdGF0ZSA9ICh1aW50KWFyZzsKKwkJCQlQb3J0UC0+TW9kZW1TdGF0ZSB8PSAodXNob3J0KXN0YXRlOworCQkJCVBvcnRQLT5Nb2RlbUxpbmVzID0gKHVsb25nKSBhcmc7CisJCQkJaWYgKFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIE1CSVMpID09IFJJT19GQUlMKQorCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgCisJCQkJCSAiVENSSU9NQklTIGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXVpbnQJCXN0YXRlOworCisJCQkJc3RhdGUgPSAodWludClhcmc7CisJCQkJUG9ydFAtPk1vZGVtU3RhdGUgJj0gfih1c2hvcnQpc3RhdGU7CisJCQkJUG9ydFAtPk1vZGVtTGluZXMgPSAodWxvbmcpIGFyZzsKKwkJCQlpZiAoUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgTUJJQykgPT0gUklPX0ZBSUwpCisJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9NQklDIGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1hQT046IC8qIHNldCBYcHJpbnQgT04gc3RyaW5nICovCisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPWFBPTlxuIik7CisJCQlpZiAoIGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpUG9ydFAtPlhwcmludC5YcE9uLAorCQkJCQkJTUFYX1hQX0NUUkxfTEVOKT09Q09QWUZBSUwgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDb3B5aW4gZmFpbGVkXG4iKTsKKwkJCQlQb3J0UC0+WHByaW50LlhwT25bMF0gPSAnXDAnOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCXBzZXRlcnIoRUZBVUxUKTsKKwkJCX0KKwkJCVBvcnRQLT5YcHJpbnQuWHBPbltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJUG9ydFAtPlhwcmludC5YcExlbiA9IHN0cmxlbihQb3J0UC0+WHByaW50LlhwT24pKworCQkJCQkJCQkJCQkJc3RybGVuKFBvcnRQLT5YcHJpbnQuWHBPZmYpOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPWFBPRkY6IC8qIHNldCBYcHJpbnQgT0ZGIHN0cmluZyAqLworCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1hQT0ZGXG4iKTsKKwkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpUG9ydFAtPlhwcmludC5YcE9mZiwKKwkJCQkJCU1BWF9YUF9DVFJMX0xFTik9PUNPUFlGQUlMICkgeworCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ29weWluIGZhaWxlZFxuIik7CisJCQkJUG9ydFAtPlhwcmludC5YcE9mZlswXSA9ICdcMCc7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcHNldGVycihFRkFVTFQpOworCQkJfQorCQkJUG9ydFAtPlhwcmludC5YcE9mZltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQkJUG9ydFAtPlhwcmludC5YcExlbiA9IHN0cmxlbihQb3J0UC0+WHByaW50LlhwT24pKworCQkJCQkJCQkJCXN0cmxlbihQb3J0UC0+WHByaW50LlhwT2ZmKTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1hQQ1BTOiAvKiBzZXQgWHByaW50IENQUyBzdHJpbmcgKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9YUENQU1xuIik7CisJCQlpZiAoICh1aW50KWFyZyA+IHAtPlJJT0NvbmYuTWF4WHBDcHMgfHwgCisJCQkJCSh1aW50KWFyZyA8IHAtPlJJT0NvbmYuTWluWHBDcHMgKSB7CisJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICIlZCBDUFMgb3V0IG9mIHJhbmdlXG4iLGFyZyk7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJcHNldGVycihFSU5WQUwpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJUG9ydFAtPlhwcmludC5YcENwcyA9ICh1aW50KWFyZzsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1hQUklOVDoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9YUFJJTlRcbiIpOworCQkJaWYgKCBjb3B5b3V0KChjYWRkcl90KSZQb3J0UC0+WHByaW50LCAoaW50KWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBYcHJpbnQpKT09Q09QWUZBSUwgKSB7CisJCQkgICAgICAgIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCXBzZXRlcnIoRUZBVUxUKTsKKwkJCX0KKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT0lYQU5ZT046CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPSVhBTllPTlxuIik7CisJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWEFOWTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT0lYQU5ZT0ZGOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT0lYQU5ZT0ZGXG4iKTsKKwkJCVBvcnRQLT5Db25maWcgJj0gflJJT19JWEFOWTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT0lYT05PTjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9JWE9OT05cbiIpOworCQkJUG9ydFAtPkNvbmZpZyB8PSBSSU9fSVhPTjsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT0lYT05PRkY6CisJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPSVhPTk9GRlxuIik7CisJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fSVhPTjsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisKKy8qCisqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc2MSBwYXJ0IGZpeAorKiogQWRkZWQgc3VwcG9ydCBmb3IgQ1RTIGFuZCBSVFMgZmxvdyBjb250cm9sIGlvY3RscyA6CisqLworCQljYXNlIFRDUklPQ1RTRkxPV0VOOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT0NUU0ZMT1dFTlxuIik7CisJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19DVFNGTE9XOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKKwkJCXJldHVybiAwOworCisJCWNhc2UgVENSSU9DVFNGTE9XRElTOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT0NUU0ZMT1dESVNcbiIpOworCQkJUG9ydFAtPkNvbmZpZyAmPSB+UklPX0NUU0ZMT1c7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCVJJT1BhcmFtKFBvcnRQLENPTkZJRyxNb2RlbSxPS19UT19TTEVFUCk7CQorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ1JJT1JUU0ZMT1dFTjoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9SVFNGTE9XRU5cbiIpOworCQkJUG9ydFAtPkNvbmZpZyB8PSBSSU9fUlRTRkxPVzsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJUklPUGFyYW0oUG9ydFAsQ09ORklHLE1vZGVtLE9LX1RPX1NMRUVQKTsJCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRDUklPUlRTRkxPV0RJUzoKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9SVFNGTE9XRElTXG4iKTsKKwkJCVBvcnRQLT5Db25maWcgJj0gflJJT19SVFNGTE9XOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKKwkJCXJldHVybiAwOworCisvKiBlbmQgRVNJTCAwNzYxIHBhcnQgZml4ICovCisKKwl9CisKKworCS8qIEx5bnggSU9DVExTICovCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBUSU9DU0VUUDoKKwkJY2FzZSBUSU9DU0VUTjoKKwkJY2FzZSBPVElPQ1NFVFA6CisJCWNhc2UgT1RJT0NTRVROOgorCQkJaW9jdGxfcHJvY2Vzc2VkKys7CisJCQl0dHlzZXRoKFBvcnRQLCB0cCwgKHN0cnVjdCBvbGRfc2d0dHliICopYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIFRDU0VUQToKKwkJY2FzZSBUQ1NFVEFXOgorCQljYXNlIFRDU0VUQUY6CisJCQlpb2N0bF9wcm9jZXNzZWQrKzsKKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiTk9OIFBPU0lYIGlvY3RsXG4iKTsKKwkJCXR0eXNldGhfcHYoUG9ydFAsIHRwLCAoc3RydWN0IHRlcm1pb3MgKilhcmcsIDApOworCQkJYnJlYWs7CisJCWNhc2UgVENTRVRBUDoJLyogcG9zaXggdGNzZXRhdHRyKCkgKi8KKwkJY2FzZSBUQ1NFVEFXUDoJLyogcG9zaXggdGNzZXRhdHRyKCkgKi8KKwkJY2FzZSBUQ1NFVEFGUDoJLyogcG9zaXggdGNzZXRhdHRyKCkgKi8KKwkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiTk9OIFBPU0lYIFNZU1YgaW9jdGxcbiIpOworCQkJdHR5c2V0aF9wdihQb3J0UCwgdHAsIChzdHJ1Y3QgdGVybWlvcyAqKWFyZywgMSk7CisJCQlpb2N0bF9wcm9jZXNzZWQrKzsKKwkJCWJyZWFrOworCX0KKworCS8qCisJKiogSWYgaXRzIGFueSBvZiB0aGUgY29tbWFuZHMgdGhhdCByZXF1aXJlIHRoZSBwb3J0IHRvIGJlIGluIHRoZQorCSoqIG5vbi1idXN5IHN0YXRlIHdhaXQgdW50aWwgYWxsIG91dHB1dCBoYXMgZHJhaW5lZCAKKwkqLworCWlmICghaW9jdGxfcHJvY2Vzc2VkKQorCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBUQ1NFVEFXOgorCQljYXNlIFRDU0VUQUY6CisJCWNhc2UgVENTRVRBOgorCQljYXNlIFRDU0JSSzoKKyNkZWZpbmUgT0xEX1BPU0lYICgneCcgPDwgOCkKKyNkZWZpbmUgT0xEX1BPU0lYX1NFVEEgKE9MRF9QT1NJWCB8IDIpCisjZGVmaW5lIE9MRF9QT1NJWF9TRVRBVyAoT0xEX1BPU0lYIHwgMykKKyNkZWZpbmUgT0xEX1BPU0lYX1NFVEFGIChPTERfUE9TSVggfCA0KQorI2RlZmluZSBORVdfUE9TSVggKCgnaScgPDwgMjQpIHwgKCdYJyA8PCAxNikpCisjZGVmaW5lIE5FV19QT1NJWF9TRVRBIChORVdfUE9TSVggfCAyKQorI2RlZmluZSBORVdfUE9TSVhfU0VUQVcgKE5FV19QT1NJWCB8IDMpCisjZGVmaW5lIE5FV19QT1NJWF9TRVRBRiAoTkVXX1BPU0lYIHwgNCkKKwkJY2FzZSBPTERfUE9TSVhfU0VUQToKKwkJY2FzZSBPTERfUE9TSVhfU0VUQVc6CisJCWNhc2UgT0xEX1BPU0lYX1NFVEFGOgorCQljYXNlIE5FV19QT1NJWF9TRVRBOgorCQljYXNlIE5FV19QT1NJWF9TRVRBVzoKKwkJY2FzZSBORVdfUE9TSVhfU0VUQUY6CisjaWZkZWYgVElPQ1NFVFAKKwkJY2FzZSBUSU9DU0VUUDoKKyNlbmRpZgorCQljYXNlIFRJT0NTRVREOgorCQljYXNlIFRJT0NTRVROOgorCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJ3YWl0IGZvciBub24tQlVTWSwgc2VtYXBob3JlIHNldFxuIik7CisJCQkvKgorCQkJKiogV2FpdCBmb3IgZHJhaW4gaGVyZSwgYXQgbGVhc3QgYXMgZmFyIGFzIHRoZSBkb3VibGUgYnVmZmVyCisJCQkqKiBiZWluZyBlbXB0eS4KKwkJCSovCisJCQkvKiBYWFggRG9lcyB0aGUgYWJvdmUgY29tbWVudCBtZWFuIHRoYXQgdGhpcyBoYXMKKwkJCSAgIHN0aWxsIHRvIGJlIGltcGxlbWVudGVkPyAtLSBSRVcgKi8KKwkJCS8qIFhYWCBJcyB0aGUgbG9ja2luZyBPSyB0b2dldGhlciB3aXRoIGxvY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHR4ZW5hYmxlPyAoRGVhZGxvY2s/KSAtLSBSRVcgKi8KKwkJCQorCQkJUklPVHhFbmFibGUoKGNoYXIgKilQb3J0UCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCW9sZF9jZmxhZyA9IHRwLT50bS5jX2NmbGFnOworCW9sZF9pZmxhZyA9IHRwLT50bS5jX2lmbGFnOworCW9sZF9vZmxhZyA9IHRwLT50bS5jX29mbGFnOworCW9sZGNvb2sgPSBQb3J0UC0+Q29va01vZGU7CisKKwlpZiAoIHAtPlJJT0hhbHRlZCApIHsKKwkJUklPQ2xlYXJVcCggUG9ydFAgKTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXBzZXRlcnIoRUlPKTsKKwkJcmV0dXJuIDA7CisJfQorCisJUG9ydFAtPkZsdXNoQ21kQm9kZ2UgPSAwOworCisJLyoKKwkqKiBJZiB0aGUgcG9ydCBpcyBsb2NrZWQsIGFuZCBpdCBpcyByZWNvbmZpZ3VyZWQsIHdlIHdhbnQKKwkqKiB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgdHR5IHN0cnVjdHVyZSBzbyB0aGUgY2hhbmdlIGlzIE5PVAorCSoqIG1hZGUuCisJKi8KKwlpZiAoUG9ydFAtPkxvY2spIHsKKwkJdHAtPnRtLmNfaWZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmlmbGFnOworCQl0cC0+dG0uY19vZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkub2ZsYWc7CisJCXRwLT50bS5jX2NmbGFnID0gUG9ydFAtPlN0b3JlZFR0eS5jZmxhZzsKKwkJdHAtPnRtLmNfbGZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmxmbGFnOworCQl0cC0+dG0uY19saW5lID0gUG9ydFAtPlN0b3JlZFR0eS5saW5lOworCQlmb3IgKGkgPSAwOyBpIDwgTkNDICsgMTsgaSsrKQorCQkJdHAtPnRtLmNfY2NbaV0gPSBQb3J0UC0+U3RvcmVkVHR5LmNjW2ldOworCX0KKwllbHNlIHsKKwkJLyoKKwkJKiogSWYgdGhlIHBvcnQgaXMgc2V0IHRvIHN0b3JlIHRoZSBwYXJhbWV0ZXJzLCBhbmQgaXQgaXMKKwkJKiogcmVjb25maWd1cmVkLCB3ZSB3YW50IHRvIHNhdmUgdGhlIGN1cnJlbnQgdHR5IHN0cnVjdCBzbyBpdAorCQkqKiBtYXkgYmUgcmVzdG9yZWQgb24gdGhlIG5leHQgb3Blbi4KKwkJKi8KKwkJaWYgKFBvcnRQLT5TdG9yZSkgeworCQkJUG9ydFAtPlN0b3JlZFR0eS5pZmxhZyA9IHRwLT50bS5jX2lmbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5vZmxhZyA9IHRwLT50bS5jX29mbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5jZmxhZyA9IHRwLT50bS5jX2NmbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5sZmxhZyA9IHRwLT50bS5jX2xmbGFnOworCQkJUG9ydFAtPlN0b3JlZFR0eS5saW5lID0gdHAtPnRtLmNfbGluZTsKKwkJCWZvciAoaSA9IDA7IGkgPCBOQ0MgKyAxOyBpKyspCisJCQkJUG9ydFAtPlN0b3JlZFR0eS5jY1tpXSA9IHRwLT50bS5jX2NjW2ldOworCQl9CisJfQorCisJY2hhbmdlZCA9ICh0cC0+dG0uY19jZmxhZyAhPSBvbGRfY2ZsYWcpIHx8CisJCQkJKHRwLT50bS5jX2lmbGFnICE9IG9sZF9pZmxhZykgfHwKKwkJCQkodHAtPnRtLmNfb2ZsYWcgIT0gb2xkX29mbGFnKTsKKworCVBvcnRQLT5Db29rTW9kZSA9IFJJT0Nvb2tNb2RlKHRwKTsJLyogU2V0IG5ldyBjb29raW5nIG1vZGUgKi8KKworCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUklPSW9jdGwgY2hhbmdlZCAlZCBuZXdjb29rICVkIG9sZGNvb2sgJWRcbiIsCisJCQljaGFuZ2VkLFBvcnRQLT5Db29rTW9kZSxvbGRjb29rKTsKKworI2lmZGVmIE1PREVNX1NVUFBPUlQKKwkvKgorCSoqIGtsdWRnZSB0byBmb3JjZSBDQVJSX09OIGlmIENMT0NBTCBzZXQKKwkqLworCWlmICgodHAtPnRtLmNfY2ZsYWcgJiBDTE9DQUwpIHx8IChQb3J0UC0+TW9kZW1TdGF0ZSAmIE1TVlIxX0NEKSkJeworCQl0cC0+dG0uY19zdGF0ZSB8PSBDQVJSX09OOworCQl3YWtldXAgKChjYWRkcl90KSZ0cC0+dG0uY19jYW5xKTsKKwl9CisjZW5kaWYKKworCWlmICggcC0+UklPSGFsdGVkICkgeworCQlSSU9DbGVhclVwKCBQb3J0UCApOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcHNldGVycihFSU8pOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkqKiBSZS1jb25maWd1cmUgaWYgbW9kZXMgb3IgY29va2luZyBoYXZlIGNoYW5nZWQKKwkqLworCWlmIChjaGFuZ2VkIHx8IG9sZGNvb2sgIT0gUG9ydFAtPkNvb2tNb2RlIHx8IChpb2N0bF9wcm9jZXNzZWQpKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIklvY3RsIGNoYW5naW5nIHRoZSBQT1JUIHNldHRpbmdzXG4iKTsKKwkJUklPUGFyYW0oUG9ydFAsQ09ORklHLE1vZGVtLE9LX1RPX1NMRUVQKTsJCisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwl9CisKKwlpZiAocC0+UklPSGFsdGVkKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlSSU9DbGVhclVwKCBQb3J0UCApOworCQlwc2V0ZXJyKEVJTyk7CisJCXJldHVybiAwOworCX0KKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKwl0dHlzZXRoIC0tIHNldCBoYXJkd2FyZSBkZXBlbmRlbnQgdHR5IHNldHRpbmdzCisqLwordm9pZAordHR5c2V0aChQb3J0UCwgcywgc2cpCitzdHJ1Y3QgUG9ydCAqCQlQb3J0UDsKK3N0cnVjdCB0dHlzdGF0aWNzICoJCXM7CitzdHJ1Y3Qgb2xkX3NndHR5YiAqc2c7Cit7CisJc3RydWN0IG9sZF9zZ3R0eWIgKgl0c2c7CisJc3RydWN0IHRlcm1pb3MgKnRwID0gJnMtPnRtOworCisJdHNnID0gJnMtPnNnOworCisJaWYgKHNnLT5zZ19mbGFncyAmIChFVkVOUHxPRERQKSkgIHsKKwkJdHAtPmNfY2ZsYWcgJj0gUEFSRU5COworCQlpZiAoc2ctPnNnX2ZsYWdzICYgRVZFTlApIHsKKwkJCWlmIChzZy0+c2dfZmxhZ3MgJiBPRERQKSB7CisJCQkJdHAtPmNfY2ZsYWcgJj0gVl9DUzc7CisJCQkJdHAtPmNfY2ZsYWcgJj0gflBBUkVOQjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXRwLT5jX2NmbGFnICY9IFZfQ1M3OworCQkJCXRwLT5jX2NmbGFnICY9IFBBUkVOQjsKKwkJCQl0cC0+Y19jZmxhZyAmPSBQQVJPREQ7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoc2ctPnNnX2ZsYWdzICYgT0REUCkgeworCQkJdHAtPmNfY2ZsYWcgJj0gVl9DUzc7CisJCQl0cC0+Y19jZmxhZyAmPSBQQVJFTkI7CisJCQl0cC0+Y19jZmxhZyAmPSBQQVJPREQ7CisJCX0KKwkJZWxzZSB7CisJCQl0cC0+Y19jZmxhZyAmPSBWX0NTNzsKKwkJCXRwLT5jX2NmbGFnICY9IFBBUkVOQjsKKwkJfQorCX0KKy8qCisgKiBVc2UgaXNwZWVkIGFzIHRoZSBkZXNpcmVkIHNwZWVkLiAgTW9zdCBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgaGFuZGxlIAorICogc2VwYXJhdGUgaW5wdXQgYW5kIG91dHB1dCBzcGVlZHMgdmVyeSB3ZWxsLiBJZiB0aGUgUklPIGhhbmRsZXMgdGhpcywgCisgKiBJIHdpbGwgaGF2ZSB0byB1c2Ugc2VwYXJhdGUgc2V0cyBvZiBmbGFncyB0byBzdG9yZSB0aGVtIGluIHRoZSAKKyAqIFBvcnQgc3RydWN0dXJlLgorICovCisJaWYgKCAhc2ctPnNnX29zcGVlZCApCisJCXNnLT5zZ19vc3BlZWQgPSBzZy0+c2dfaXNwZWVkOworCWVsc2UKKwkJc2ctPnNnX2lzcGVlZCA9IHNnLT5zZ19vc3BlZWQ7CisJaWYgKHNnLT5zZ19pc3BlZWQgPiBWX0VYVEIgKSAKKwkJc2ctPnNnX2lzcGVlZCA9IFZfRVhUQjsKKwlpZiAoc2ctPnNnX2lzcGVlZCA8IFZfQjApCisJCXNnLT5zZ19pc3BlZWQgPSBWX0IwOworCSp0c2cgPSAqc2c7CisgICB0cC0+Y19jZmxhZyA9ICh0cC0+Y19jZmxhZyAmIH5WX0NCQVVEKSB8IGNvbnZfYnZbKGludClzZy0+c2dfaXNwZWVkXTsKK30KKworLyoKKwl0dHlzZXRoX3B2IC0tIHNldCBoYXJkd2FyZSBkZXBlbmRlbnQgdHR5IHNldHRpbmdzIHVzaW5nIGVpdGhlciB0aGUKKwkJCVBPU0lYIHRlcm1pb3Mgc3RydWN0dXJlIG9yIHRoZSBTeXN0ZW0gViB0ZXJtaW8gc3RydWN0dXJlLgorCQkJCXN5c3YgPSAwID0+IChQT1NJWCk6CSBzdHJ1Y3QgdGVybWlvcyAqc2cKKwkJCQlzeXN2ICE9IDAgPT4gKFN5c3RlbSBWKTogc3RydWN0IHRlcm1pbyAqc2cKKyovCitzdGF0aWMgdm9pZAordHR5c2V0aF9wdihQb3J0UCwgcywgc2csIHN5c3YpCitzdHJ1Y3QgUG9ydCAqUG9ydFA7CitzdHJ1Y3QgdHR5c3RhdGljcyAqczsKK3N0cnVjdCB0ZXJtaW9zICpzZzsKK2ludCBzeXN2OworeworICAgIGludCBzcGVlZDsKKyAgICB1bnNpZ25lZCBjaGFyIGNzaXplOworICAgIHVuc2lnbmVkIGNoYXIgY3JlYWQ7CisgICAgdW5zaWduZWQgaW50IGxjcl9mbGFnczsKKyAgICBpbnQgcHM7CisgCisgICAgaWYgKHN5c3YpIHsKKyAgICAgICAgLyogc2cgcG9pbnRzIHRvIGEgU3lzdGVtIFYgdGVybWlvIHN0cnVjdHVyZSAqLworICAgICAgICBjc2l6ZSA9ICgoc3RydWN0IHRlcm1pbyAqKXNnKS0+Y19jZmxhZyAmIENTSVpFOworICAgICAgICBjcmVhZCA9ICgoc3RydWN0IHRlcm1pbyAqKXNnKS0+Y19jZmxhZyAmIENSRUFEOworICAgICAgICBzcGVlZCA9IGNvbnZfdmJbKChzdHJ1Y3QgdGVybWlvICopc2cpLT5jX2NmbGFnICYgVl9DQkFVRF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBzZyBwb2ludHMgdG8gYSBQT1NJWCB0ZXJtaW9zIHN0cnVjdHVyZSAqLworICAgICAgICBjc2l6ZSA9IHNnLT5jX2NmbGFnICYgQ1NJWkU7CisgICAgICAgIGNyZWFkID0gc2ctPmNfY2ZsYWcgJiBDUkVBRDsKKyAgICAgICAgc3BlZWQgPSBjb252X3ZiW3NnLT5jX2NmbGFnICYgVl9DQkFVRF07CisgICAgfQorICAgIGlmIChzLT5zZy5zZ19pc3BlZWQgIT0gc3BlZWQgfHwgcy0+c2cuc2dfb3NwZWVkICE9IHNwZWVkKSB7CisgICAgICAgIHMtPnNnLnNnX2lzcGVlZCA9IHNwZWVkOworICAgICAgICBzLT5zZy5zZ19vc3BlZWQgPSBzcGVlZDsKKyAgICAgICAgcy0+dG0uY19jZmxhZyA9IChzLT50bS5jX2NmbGFnICYgflZfQ0JBVUQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2J2WyhpbnQpcy0+c2cuc2dfaXNwZWVkXTsKKyAgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvdHlwZXMuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzdjNDJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90eXBlcy5oCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIFIgSSBPIFQgWSBQIEUgUworICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSm9uIEJyYXduCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3Jpb3R5cGVzX2gKKyNkZWZpbmUgX3Jpb3R5cGVzX2ggMQorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcmlvdHlwZXNfaF9zY2NzID0gIkAoIylyaW90eXBlcy5oCTEuMTAiOyAqLworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIElOS0VSTkVMCisKKyNpZiAhZGVmaW5lZChNSVBTQVQpCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IE5VTUJFUl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFdPUkRfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBCWVRFX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgY2hhcl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IENoYW5uZWxfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBGUkVFX0xJU1RfcHRyX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgRlJFRV9MSVNUX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgTFBCX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgUHJvY2Vzc19wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFBIQl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFBLVF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFBLVF9wdHJfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBRX0JVRl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFFfQlVGX3B0cl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFJPVVRFX1NUUl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFJVUF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHNob3J0X3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9zaG9ydF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydF9wdHI7CisjZWxzZQorLyogTUlQU0FUIHR5cGVzICovCit0eXBlZGVmIGNoYXIgUklPX1BPSU5URVJbOF07Cit0eXBlZGVmIFJJT19QT0lOVEVSIE5VTUJFUl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFdPUkRfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBCWVRFX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgY2hhcl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIENoYW5uZWxfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBGUkVFX0xJU1RfcHRyX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgRlJFRV9MSVNUX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgTFBCX3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgUHJvY2Vzc19wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFBIQl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFBLVF9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFBLVF9wdHJfcHRyOwordHlwZWRlZiBSSU9fUE9JTlRFUiBRX0JVRl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFFfQlVGX3B0cl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFJPVVRFX1NUUl9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIFJVUF9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIHNob3J0X3B0cjsKK3R5cGVkZWYgUklPX1BPSU5URVIgdV9zaG9ydF9wdHI7Cit0eXBlZGVmIFJJT19QT0lOVEVSIHVzaG9ydF9wdHI7CisjZW5kaWYKKworI2Vsc2UgLyogbm90IElOS0VSTkVMICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBCWVRFOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgV09SRDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIERXT1JEOwordHlwZWRlZiBzaG9ydCAgICAgICAgICAgTlVNQkVSOwordHlwZWRlZiBzaG9ydCAgICAgICAgICAgKk5VTUJFUl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAqV09SRF9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAqQllURV9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2hhciA7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1c2hvcnQgOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludCA7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1bG9uZyA7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1X2NoYXIgOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdV9zaG9ydCA7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1X2ludCA7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1X2xvbmcgOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgRVJST1IgOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIElEIDsKK3R5cGVkZWYgY2hhciAgICAgICAgICAgICAqY2hhcl9wdHI7Cit0eXBlZGVmIENoYW5uZWwgICAgICAgICAgKkNoYW5uZWxfcHRyOwordHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUICpGUkVFX0xJU1RfcHRyOwordHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUICoqRlJFRV9MSVNUX3B0cl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBMUEIgICAgICAgKkxQQl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBQcm9jZXNzICAgKlByb2Nlc3NfcHRyOwordHlwZWRlZiBzdHJ1Y3QgUEhCICAgICAgICpQSEJfcHRyOwordHlwZWRlZiBzdHJ1Y3QgUEtUICAgICAgICpQS1RfcHRyOwordHlwZWRlZiBzdHJ1Y3QgUEtUICAgICAgICoqUEtUX3B0cl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBRX0JVRiAgICAgKlFfQlVGX3B0cjsKK3R5cGVkZWYgc3RydWN0IFFfQlVGICAgICAqKlFfQlVGX3B0cl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBST1VURV9TVFIgKlJPVVRFX1NUUl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBSVVAgICAgICAgKlJVUF9wdHI7Cit0eXBlZGVmIHNob3J0ICAgICAgICAgICAgKnNob3J0X3B0cjsKK3R5cGVkZWYgdV9zaG9ydCAgICAgICAgICAqdV9zaG9ydF9wdHI7Cit0eXBlZGVmIHVzaG9ydCAgICAgICAgICAgKnVzaG9ydF9wdHI7Cit0eXBlZGVmIHN0cnVjdCBQS1QJIFBLVDsKK3R5cGVkZWYgc3RydWN0IExQQgkgTFBCOwordHlwZWRlZiBzdHJ1Y3QgUlVQCSBSVVA7CisjZW5kaWYKKworCisjZW5kaWYgLyogX19yaW90eXBlc19fICovCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW93aW5pZi5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW93aW5pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTRmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3dpbmlmLmgKQEAgLTAsMCArMSwxMzM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJVGl0bGUJCToJUklPIFNoYXJlZCBNZW1vcnkgV2luZG93IEludGVmYWNlCSovCisvKgkJCQkJCQkJCSovCisvKglBdXRob3IJCToJTi5QLlZhc3NhbGxvCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDcmVhdGlvbgk6CTd0aCBKdW5lIDE5OTkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVZlcnNpb24JCToJMS4wLjAJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKglDb3B5cmlnaHQJOgkoYykgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiAxOTk5CSoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCQkJCQkJCQkJKi8KKy8qCURlc2NyaXB0aW9uCToJUHJvdG90eXBlcywgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJKi8KKy8qCQkJCWRlc2NyaWJpbmcgUklPIGhvc3QgY2FyZCBzaGFyZWQJbWVtb3J5CSovCisvKgkJCQl3aW5kb3cgaW50ZXJmYWNlIHN0cnVjdHVyZXM6CQkqLworLyoJCQkJCVBBUk1NQVAJCQkJKi8KKy8qCQkJCQlSVVAJCQkJKi8KKy8qCQkJCQlQSEIJCQkJKi8KKy8qCQkJCQlMUEIJCQkJKi8KKy8qCQkJCQlQS1QJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhpc3RvcnkuLi4KKworMS4wLjAJMDcvMDYvOTkgTlBWCUNyZWF0aW9uLiAoYmFzZWQgb24gUEFSTU1BUC5IKQorCisqLworCisjaWZuZGVmCV9yaW93aW5pZl9oCQkJCS8qIElmIFJJT1dJTkRJRi5IIG5vdCBhbHJlYWR5IGRlZmluZWQgKi8KKyNkZWZpbmUJX3Jpb3dpbmlmX2ggICAgMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBHZW5lcmFsICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCVRQTlVMTAkJKChfdTE2KSgweDgwMDApKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQQVJNX01BUCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgUEFSTV9NQVAgc3RydWN0dXJlIGRlZmluZXMgZ2xvYmFsIHZhbHVlcyByZWxhdGluZyB0byB0aGUgSG9zdCBDYXJkIC8gUlRBCisgICBhbmQgaXMgdGhlIG1haW4gc3RydWN0dXJlIGZyb20gd2hpY2ggYWxsIG90aGVyIHN0cnVjdHVyZXMgYXJlIHJlZmVyZW5jZWQuICovCisKK3R5cGVkZWYJc3RydWN0CV9QQVJNX01BUAoreworCV91MTYJcGhiX3B0cjsJCS8qIDB4MDAgUG9pbnRlciB0byB0aGUgUEhCIGFycmF5ICovCisJX3UxNglwaGJfbnVtX3B0cjsJCS8qIDB4MDIgUHRyIHRvIE51bWJlciBvZiBQSEIncyAqLworCV91MTYJZnJlZV9saXN0OwkJLyogMHgwNCBGcmVlIExpc3QgcG9pbnRlciAqLworCV91MTYJZnJlZV9saXN0X2VuZDsJCS8qIDB4MDYgRnJlZSBMaXN0IEVuZCBwb2ludGVyICovCisJX3UxNglxX2ZyZWVfbGlzdF9wdHI7CS8qIDB4MDggUHRyIHRvIFFfQlVGIHZhcmlhYmxlICovCisJX3UxNgl1bml0X2lkX3B0cjsJCS8qIDB4MEEgVW5pdCBJZCAqLworCV91MTYJbGlua19zdHJfcHRyOwkJLyogMHgwQyBMaW5rIFN0cnVjdHVyZSBBcnJheSAqLworCV91MTYJYm9vdGxvYWRlcl8xOwkJLyogMHgwRSAxc3QgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KKwlfdTE2CWJvb3Rsb2FkZXJfMjsJCS8qIDB4MTAgMm5kIFN0YWdlIEJvb3QgTG9hZGVyICovCisJX3UxNglwb3J0X3JvdXRlX21hcF9wdHI7CS8qIDB4MTIgUG9ydCBSb3V0ZSBNYXAgKi8KKwlfdTE2CXJvdXRlX3B0cjsJCS8qIDB4MTQgUm91dGUgTWFwICovCisJX3UxNgltYXBfcHJlc2VudDsJCS8qIDB4MTYgUm91dGUgTWFwIHByZXNlbnQgKi8KKwlfdTE2CXBrdF9udW07CQkvKiAweDE4IFRvdGFsIG51bWJlciBvZiBwYWNrZXRzICovCisJX3UxNglxX251bTsJCQkvKiAweDFBIFRvdGFsIG51bWJlciBvZiBRIHBhY2tldHMgKi8KKwlfdTE2CWJ1ZmZlcnNfcGVyX3BvcnQ7CS8qIDB4MUMgTnVtYmVyIG9mIGJ1ZmZlcnMgcGVyIHBvcnQgKi8KKwlfdTE2CWhlYXBfc2l6ZTsJCS8qIDB4MUUgSW5pdGlhbCBzaXplIG9mIGhlYXAgKi8KKwlfdTE2CWhlYXBfbGVmdDsJCS8qIDB4MjAgQ3VycmVudCBIZWFwIGxlZnQgKi8KKwlfdTE2CWVycm9yOwkJCS8qIDB4MjIgRXJyb3IgY29kZSAqLworCV91MTYJdHhfbWF4OwkJCS8qIDB4MjQgTWF4IG51bWJlciBvZiB0eCBwa3RzIHBlciBwaGIgKi8KKwlfdTE2CXJ4X21heDsJCQkvKiAweDI2IE1heCBudW1iZXIgb2YgcnggcGt0cyBwZXIgcGhiICovCisJX3UxNglyeF9saW1pdDsJCS8qIDB4MjggRm9yIGhpZ2ggLyBsb3cgd2F0ZXJtYXJrcyAqLworCV91MTYJbGlua3M7CQkJLyogMHgyQSBMaW5rcyB0byB1c2UgKi8KKwlfdTE2CXRpbWVyOwkJCS8qIDB4MkMgSW50ZXJydXB0cyBwZXIgc2Vjb25kICovCisJX3UxNglydXBzOwkJCS8qIDB4MkUgUG9pbnRlciB0byB0aGUgUlVQcyAqLworCV91MTYJbWF4X3BoYjsJCS8qIDB4MzAgTW9zdGx5IGZvciBkZWJ1Z2dpbmcgKi8KKwlfdTE2CWxpdmluZzsJCQkvKiAweDMyIEp1c3QgaW5jcmVtZW50cyEhICovCisJX3UxNglpbml0X2RvbmU7CQkvKiAweDM0IEluaXRpYWxpc2F0aW9uIG92ZXIgKi8KKwlfdTE2CWJvb3RpbmdfbGluazsJCS8qIDB4MzYgKi8KKwlfdTE2CWlkbGVfY291bnQ7CQkvKiAweDM4IElkbGUgdGltZSBjb3VudGVyICovCisJX3UxNglidXN5X2NvdW50OwkJLyogMHgzQSBCdXN5IGNvdW50ZXIgKi8KKwlfdTE2CWlkbGVfY29udHJvbDsJCS8qIDB4M0MgQ29udHJvbCBJZGxlIFByb2Nlc3MgKi8KKwlfdTE2CXR4X2ludHI7CQkvKiAweDNFIFRYIGludGVycnVwdCBwZW5kaW5nICovCisJX3UxNglyeF9pbnRyOwkJLyogMHg0MCBSWCBpbnRlcnJ1cHQgcGVuZGluZyAqLworCV91MTYJcnVwX2ludHI7CQkvKiAweDQyIFJVUCBpbnRlcnJ1cHQgcGVuZGluZyAqLworCit9IFBBUk1fTUFQOworCisvKiBTYW1lIHRoaW5nIGFnYWluLCBidXQgZGVmaW5lZCBhcyBvZmZzZXRzLi4uICovCisKKyNkZWZpbmUJUE1fcGhiX3B0cgkJMHgwMAkvKiAweDAwIFBvaW50ZXIgdG8gdGhlIFBIQiBhcnJheSAqLworI2RlZmluZQlQTV9waGJfbnVtX3B0cgkJMHgwMgkvKiAweDAyIFB0ciB0byBOdW1iZXIgb2YgUEhCJ3MgKi8KKyNkZWZpbmUJUE1fZnJlZV9saXN0CQkweDA0CS8qIDB4MDQgRnJlZSBMaXN0IHBvaW50ZXIgKi8KKyNkZWZpbmUJUE1fZnJlZV9saXN0X2VuZAkweDA2CS8qIDB4MDYgRnJlZSBMaXN0IEVuZCBwb2ludGVyICovCisjZGVmaW5lCVBNX3FfZnJlZV9saXN0X3B0cgkweDA4CS8qIDB4MDggUHRyIHRvIFFfQlVGIHZhcmlhYmxlICovCisjZGVmaW5lCVBNX3VuaXRfaWRfcHRyCQkweDBBCS8qIDB4MEEgVW5pdCBJZCAqLworI2RlZmluZQlQTV9saW5rX3N0cl9wdHIJCTB4MEMJLyogMHgwQyBMaW5rIFN0cnVjdHVyZSBBcnJheSAqLworI2RlZmluZQlQTV9ib290bG9hZGVyXzEJCTB4MEUJLyogMHgwRSAxc3QgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KKyNkZWZpbmUJUE1fYm9vdGxvYWRlcl8yCQkweDEwCS8qIDB4MTAgMm5kIFN0YWdlIEJvb3QgTG9hZGVyICovCisjZGVmaW5lCVBNX3BvcnRfcm91dGVfbWFwX3B0cgkweDEyCS8qIDB4MTIgUG9ydCBSb3V0ZSBNYXAgKi8KKyNkZWZpbmUJUE1fcm91dGVfcHRyCQkweDE0CS8qIDB4MTQgUm91dGUgTWFwICovCisjZGVmaW5lCVBNX21hcF9wcmVzZW50CQkweDE2CS8qIDB4MTYgUm91dGUgTWFwIHByZXNlbnQgKi8KKyNkZWZpbmUJUE1fcGt0X251bQkJMHgxOAkvKiAweDE4IFRvdGFsIG51bWJlciBvZiBwYWNrZXRzICovCisjZGVmaW5lCVBNX3FfbnVtCQkweDFBCS8qIDB4MUEgVG90YWwgbnVtYmVyIG9mIFEgcGFja2V0cyAqLworI2RlZmluZQlQTV9idWZmZXJzX3Blcl9wb3J0CTB4MUMJLyogMHgxQyBOdW1iZXIgb2YgYnVmZmVycyBwZXIgcG9ydCAqLworI2RlZmluZQlQTV9oZWFwX3NpemUJCTB4MUUJLyogMHgxRSBJbml0aWFsIHNpemUgb2YgaGVhcCAqLworI2RlZmluZQlQTV9oZWFwX2xlZnQJCTB4MjAJLyogMHgyMCBDdXJyZW50IEhlYXAgbGVmdCAqLworI2RlZmluZQlQTV9lcnJvcgkJMHgyMgkvKiAweDIyIEVycm9yIGNvZGUgKi8KKyNkZWZpbmUJUE1fdHhfbWF4CQkweDI0CS8qIDB4MjQgTWF4IG51bWJlciBvZiB0eCBwa3RzIHBlciBwaGIgKi8KKyNkZWZpbmUJUE1fcnhfbWF4CQkweDI2CS8qIDB4MjYgTWF4IG51bWJlciBvZiByeCBwa3RzIHBlciBwaGIgKi8KKyNkZWZpbmUJUE1fcnhfbGltaXQJCTB4MjgJLyogMHgyOCBGb3IgaGlnaCAvIGxvdyB3YXRlcm1hcmtzICovCisjZGVmaW5lCVBNX2xpbmtzCQkweDJBCS8qIDB4MkEgTGlua3MgdG8gdXNlICovCisjZGVmaW5lCVBNX3RpbWVyCQkweDJDCS8qIDB4MkMgSW50ZXJydXB0cyBwZXIgc2Vjb25kICovCisjZGVmaW5lCVBNX3J1cHMJCQkweDJFCS8qIDB4MkUgUG9pbnRlciB0byB0aGUgUlVQcyAqLworI2RlZmluZQlQTV9tYXhfcGhiCQkweDMwCS8qIDB4MzAgTW9zdGx5IGZvciBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUJUE1fbGl2aW5nCQkweDMyCS8qIDB4MzIgSnVzdCBpbmNyZW1lbnRzISEgKi8KKyNkZWZpbmUJUE1faW5pdF9kb25lCQkweDM0CS8qIDB4MzQgSW5pdGlhbGlzYXRpb24gb3ZlciAqLworI2RlZmluZQlQTV9ib290aW5nX2xpbmsJCTB4MzYJLyogMHgzNiAqLworI2RlZmluZQlQTV9pZGxlX2NvdW50CQkweDM4CS8qIDB4MzggSWRsZSB0aW1lIGNvdW50ZXIgKi8KKyNkZWZpbmUJUE1fYnVzeV9jb3VudAkJMHgzQQkvKiAweDNBIEJ1c3kgY291bnRlciAqLworI2RlZmluZQlQTV9pZGxlX2NvbnRyb2wJCTB4M0MJLyogMHgzQyBDb250cm9sIElkbGUgUHJvY2VzcyAqLworI2RlZmluZQlQTV90eF9pbnRyCQkweDNFCS8qIDB4NEUgVFggaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUJUE1fcnhfaW50cgkJMHg0MAkvKiAweDQwIFJYIGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lCVBNX3J1cF9pbnRyCQkweDQyCS8qIDB4NDIgUlVQIGludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lCXNpemVvZl9QQVJNX01BUAkJMHg0NAkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4NDQgKi8KKworLyogUEFSTV9NQVAuZXJyb3IgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJRV9OT19FUlJPUgkJMHgwMAorI2RlZmluZQlFX1BST0NFU1NfTk9UX0lOSVQJMHgwMQorI2RlZmluZQlFX0xJTktfVElNRU9VVAkJMHgwMgorI2RlZmluZQlFX05PX1JPVVRFCQkweDAzCisjZGVmaW5lCUVfQ09ORlVTRUQJCTB4MDQKKyNkZWZpbmUJRV9IT01FCQkJMHgwNQorI2RlZmluZQlFX0NTVU1fRkFJTAkJMHgwNgorI2RlZmluZQlFX0RJU0NPTk5FQ1RFRAkJMHgwNworI2RlZmluZQlFX0JBRF9SVVAJCTB4MDgKKyNkZWZpbmUJRV9OT19WSVJHSU4JCTB4MDkKKyNkZWZpbmUJRV9CT09UX1JVUF9CVVNZCQkweDEwCisjZGVmaW5lCUVfQ0hBTkFMTE9DCQkweDgwCisjZGVmaW5lCUVfUE9MTF9BTExPQwkJMHg4MQorI2RlZmluZQlFX0xUVFdBS0UJCTB4ODIKKyNkZWZpbmUJRV9MVFRfQUxMT0MJCTB4ODMKKyNkZWZpbmUJRV9MUlRfQUxMT0MJCTB4ODQKKyNkZWZpbmUJRV9DSVJSVVMJCTB4ODUKKyNkZWZpbmUJRV9NT05JVE9SCQkweDg2CisjZGVmaW5lCUVfUEhCX0FMTE9DCQkweDg3CisjZGVmaW5lCUVfQVJSQVlfQUxMT0MJCTB4ODgKKyNkZWZpbmUJRV9RQlVGX0FMTE9DCQkweDg5CisjZGVmaW5lCUVfUEtUX0FMTE9DCQkweDhhCisjZGVmaW5lCUVfR0VUX1RYX1FfQlVGCQkweDhiCisjZGVmaW5lCUVfR0VUX1JYX1FfQlVGCQkweDhjCisjZGVmaW5lCUVfTUVNX09VVAkJMHg4ZAorI2RlZmluZQlFX01NVV9JTklUCQkweDhlCisjZGVmaW5lCUVfTFRUX0lOSVQJCTB4OGYKKyNkZWZpbmUJRV9MUlRfSU5JVAkJMHg5MAorI2RlZmluZQlFX0xJTktfUlVOCQkweDkxCisjZGVmaW5lCUVfTU9OSVRPUl9BTExPQwkJMHg5MgorI2RlZmluZQlFX01PTklUT1JfSU5JVAkJMHg5MworI2RlZmluZQlFX1BPTExfSU5JVAkJMHg5NAorCisvKiBQQVJNX01BUC5saW5rcyBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fTElOS19FTkFCTEUJMHg4MEZGCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUlVQICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBSVVAgKFJlbW90ZSBVbml0IFBvcnQpIHN0cnVjdHVyZSByZWxhdGVzIHRvIHRoZSBSZW1vdGUgVGVybWluYWwgQWRhcHRlcnMKKyAgIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW0gYW5kIHRoZXJlIGlzIG5vcm1hbGx5IGFuIGFycmF5IG9mIE1BWF9SVVBTICg9MTYpIHN0cnVjdHVyZXMKKyAgIGluIGEgaG9zdCBjYXJkLCBkZWZpbmVkIGJ5IFBBUk1fTUFQLT5ydXAuICovCisKK3R5cGVkZWYJc3RydWN0CV9SVVAKK3sKKwlfdTE2CQl0eHBrdDsJCQkvKiAweDAwIE91dGdvaW5nIHBhY2tldCAqLworCV91MTYJCXJ4cGt0OwkJCS8qIDB4MDIgbmNvbWluZyBwYWNrZXQgKi8KKwlfdTE2CQlsaW5rOwkJCS8qIDB4MDQgV2hpY2ggbGluayB0byBzZW5kIHBhY2tldCBkb3duID8gKi8KKwlfdTgJCXJ1cF9kZXN0X3VuaXRbMl07CS8qIDB4MDYgRGVzdGluYXRpb24gVW5pdCAqLworCV91MTYJCWhhbmRzaGFrZTsJCS8qIDB4MDggSGFuZHNoYWtpbmcgKi8KKwlfdTE2CQl0aW1lb3V0OwkJLyogMHgwQSBUaW1lb3V0ICovCisJX3UxNgkJc3RhdHVzOwkJCS8qIDB4MEMgU3RhdHVzICovCisJX3UxNgkJdHhjb250cm9sOwkJLyogMHgwRSBUcmFuc21pdCBjb250cm9sICovCisJX3UxNgkJcnhjb250cm9sOwkJLyogMHgxMCBSZWNlaXZlIGNvbnRyb2wgKi8KKworfSBSVVA7CisKKy8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KKworI2RlZmluZQlSVVBfdHhwa3QJCTB4MDAJCS8qIDB4MDAgT3V0Z29pbmcgcGFja2V0ICovCisjZGVmaW5lCVJVUF9yeHBrdAkJMHgwMgkJLyogMHgwMiBJbmNvbWluZyBwYWNrZXQgKi8KKyNkZWZpbmUJUlVQX2xpbmsJCTB4MDQJCS8qIDB4MDQgV2hpY2ggbGluayB0byBzZW5kIHBhY2tldCBkb3duID8gKi8KKyNkZWZpbmUJUlVQX3J1cF9kZXN0X3VuaXQJMHgwNgkJLyogMHgwNiBEZXN0aW5hdGlvbiBVbml0ICovCisjZGVmaW5lCVJVUF9oYW5kc2hha2UJCTB4MDgJCS8qIDB4MDggSGFuZHNoYWtpbmcgKi8KKyNkZWZpbmUJUlVQX3RpbWVvdXQJCTB4MEEJCS8qIDB4MEEgVGltZW91dCAqLworI2RlZmluZQlSVVBfc3RhdHVzCQkweDBDCQkvKiAweDBDIFN0YXR1cyAqLworI2RlZmluZQlSVVBfdHhjb250cm9sCQkweDBFCQkvKiAweDBFIFRyYW5zbWl0IGNvbnRyb2wgKi8KKyNkZWZpbmUJUlVQX3J4Y29udHJvbAkJMHgxMAkJLyogMHgxMCBSZWNlaXZlIGNvbnRyb2wgKi8KKyNkZWZpbmUJc2l6ZW9mX1JVUAkJMHgxMgkJLyogc3RydWN0dXJlIHNpemUgPSAweDEyICovCisKKyNkZWZpbmUgTUFYX1JVUAkJCTE2CisKKy8qIFJVUC50eGNvbnRyb2wgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJVFhfUlVQX0lOQUNUSVZFCQkwCQkvKiBOb3RoaW5nIHRvIHRyYW5zbWl0ICovCisjZGVmaW5lCVRYX1BBQ0tFVF9SRUFEWQkJMQkJLyogVHJhbnNtaXQgcGFja2V0IHJlYWR5ICovCisjZGVmaW5lCVRYX0xPQ0tfUlVQCQkyCQkvKiBUcmFuc21pdCBzaWRlIGxvY2tlZCAqLworCisvKiBSVVAudHhjb250cm9sIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVJYX1JVUF9JTkFDVElWRQkJMAkJLyogTm90aGluZyByZWNlaXZlZCAqLworI2RlZmluZQlSWF9QQUNLRVRfUkVBRFkJCTEJCS8qIFBhY2tldCByZWNlaXZlZCAqLworCisjZGVmaW5lCVJVUF9OT19PV05FUgkJMHhGRgkJLyogUlVQIG5vdCBvd25lZCBieSBhbnkgcHJvY2VzcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBIQiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgUEhCIChQb3J0IEhlYWRlciBCbG9jaykgc3RydWN0dXJlIHJlbGF0ZXMgdG8gdGhlIHNlcmlhbCBwb3J0cyBhdHRhY2hlZAorICAgdG8gdGhlIHN5c3RlbSBhbmQgdGhlcmUgaXMgbm9ybWFsbHkgYW4gYXJyYXkgb2YgTUFYX1BIQlMgKD0xMjgpIHN0cnVjdHVyZXMKKyAgIGluIGEgaG9zdCBjYXJkLCBkZWZpbmVkIGJ5IFBBUk1fTUFQLT5waGJfcHRyIGFuZCBQQVJNX01BUC0+cGhiX251bV9wdHIuICovCisKK3R5cGVkZWYJc3RydWN0CV9QSEIKK3sKKwlfdTE2CQlzb3VyY2U7CQkJLyogMHgwMCBMb2NhdGlvbiBvZiB0aGUgUEhCIGluIHRoZSBob3N0IGNhcmQgKi8KKwlfdTE2CQloYW5kc2hha2U7CQkvKiAweDAyIFVzZWQgdG8gbWFuYWdlIHJlY2VpdmUgcGFja2V0IGZsb3cgY29udHJvbCAqLworCV91MTYJCXN0YXR1czsJCQkvKiAweDA0IEludGVybmFsIHBvcnQgdHJhbnNtaXQvcmVjZWl2ZSBzdGF0dXMgKi8KKwlfdTE2CQl0aW1lb3V0OwkJLyogMHgwNiBUaW1lIHBlcmlvZCB0byB3YWl0IGZvciBhbiBBQ0sgKi8KKwlfdTE2CQlsaW5rOwkJCS8qIDB4MDggVGhlIGhvc3QgbGluayBhc3NvY2lhdGVkIHdpdGggdGhlIFBIQiAqLworCV91MTYJCWRlc3RpbmF0aW9uOwkJLyogMHgwQSBMb2NhdGlvbiBvZiB0aGUgcmVtb3RlIHBvcnQgb24gdGhlIG5ldHdvcmsgKi8KKworCV91MTYJCXR4X3N0YXJ0OwkJLyogMHgwQyBmaXJzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCisJX3UxNgkJdHhfZW5kOwkJCS8qIDB4MEUgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCisJX3UxNgkJdHhfYWRkOwkJCS8qIDB4MTAgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgbmV3IHRyYW5zbWl0IHBhY2tldHMgKi8KKwlfdTE2CQl0eF9yZW1vdmU7CQkvKiAweDEyIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBwb2ludGVyIGFycmF5ICovCisKKwlfdTE2CQlyeF9zdGFydDsJCS8qIDB4MTQgZmlyc3QgZW50cnkgaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgcmVjZWl2ZSBwYWNrZXRzICovCisJX3UxNgkJcnhfZW5kOwkJCS8qIDB4MTYgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciByZWNlaXZlIHBhY2tldHMgKi8KKwlfdTE2CQlyeF9hZGQ7CQkJLyogMHgxOCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IGFycmF5IGZvciBuZXcgcmVjZWl2ZSBwYWNrZXRzICovCisJX3UxNgkJcnhfcmVtb3ZlOwkJLyogMHgxQSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBwYWNrZXQgcG9pbnRlciBhcnJheSAqLworCit9IFBIQjsKKworLyogU2FtZSB0aGluZyBhZ2FpbiwgYnV0IGRlZmluZWQgYXMgb2Zmc2V0cy4uLiAqLworCisjZGVmaW5lCVBIQl9zb3VyY2UJCTB4MDAJCS8qIDB4MDAgTG9jYXRpb24gb2YgdGhlIFBIQiBpbiB0aGUgaG9zdCBjYXJkICovCisjZGVmaW5lCVBIQl9oYW5kc2hha2UJCTB4MDIJCS8qIDB4MDIgVXNlZCB0byBtYW5hZ2UgcmVjZWl2ZSBwYWNrZXQgZmxvdyBjb250cm9sICovCisjZGVmaW5lCVBIQl9zdGF0dXMJCTB4MDQJCS8qIDB4MDQgSW50ZXJuYWwgcG9ydCB0cmFuc21pdC9yZWNlaXZlIHN0YXR1cyAqLworI2RlZmluZQlQSEJfdGltZW91dAkJMHgwNgkJLyogMHgwNiBUaW1lIHBlcmlvZCB0byB3YWl0IGZvciBhbiBBQ0sgKi8KKyNkZWZpbmUJUEhCX2xpbmsJCTB4MDgJCS8qIDB4MDggVGhlIGhvc3QgbGluayBhc3NvY2lhdGVkIHdpdGggdGhlIFBIQiAqLworI2RlZmluZQlQSEJfZGVzdGluYXRpb24JCTB4MEEJCS8qIDB4MEEgTG9jYXRpb24gb2YgdGhlIHJlbW90ZSBwb3J0IG9uIHRoZSBuZXR3b3JrICovCisjZGVmaW5lCVBIQl90eF9zdGFydAkJMHgwQwkJLyogMHgwQyBmaXJzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCisjZGVmaW5lCVBIQl90eF9lbmQJCTB4MEUJCS8qIDB4MEUgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCisjZGVmaW5lCVBIQl90eF9hZGQJCTB4MTAJCS8qIDB4MTAgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgbmV3IHRyYW5zbWl0IHBhY2tldHMgKi8KKyNkZWZpbmUJUEhCX3R4X3JlbW92ZQkJMHgxMgkJLyogMHgxMiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBwYWNrZXQgcG9pbnRlciBhcnJheSAqLworI2RlZmluZQlQSEJfcnhfc3RhcnQJCTB4MTQJCS8qIDB4MTQgZmlyc3QgZW50cnkgaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgcmVjZWl2ZSBwYWNrZXRzICovCisjZGVmaW5lCVBIQl9yeF9lbmQJCTB4MTYJCS8qIDB4MTYgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciByZWNlaXZlIHBhY2tldHMgKi8KKyNkZWZpbmUJUEhCX3J4X2FkZAkJMHgxOAkJLyogMHgxOCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IGFycmF5IGZvciBuZXcgcmVjZWl2ZSBwYWNrZXRzICovCisjZGVmaW5lCVBIQl9yeF9yZW1vdmUJCTB4MUEJCS8qIDB4MUEgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IHBvaW50ZXIgYXJyYXkgKi8KKyNkZWZpbmUJc2l6ZW9mX1BIQgkJMHgxQwkJLyogc3RydWN0dXJlIHNpemUgPSAweDFDICovCisKKy8qIFBIQi5oYW5kc2hha2UgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUEhCX0hBTkRTSEFLRV9TRVQJMHgwMDAxCQkvKiBTZXQgYnkgTFJUICovCisjZGVmaW5lCVBIQl9IQU5EU0hBS0VfUkVTRVQJMHgwMDAyCQkvKiBTZXQgYnkgSVNSIC8gZHJpdmVyICovCisjZGVmaW5lCVBIQl9IQU5EU0hBS0VfRkxBR1MJKFBIQl9IQU5EU0hBS0VfUkVTRVR8UEhCX0hBTkRTSEFLRV9TRVQpCisJCQkJCQkvKiBSZXNldCBieSBsdHQgKi8KKworI2RlZmluZQlNQVhfUEhCCQkJMTI4CQkvKiByYW5nZSAwLTEyNyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIExQQiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgTFBCIChMaW5rIFBhcmFtZXRlciBCbG9jaykgc3RydWN0dXJlIHJlbGF0ZXMgdG8gYSBSSU8gTmV0d29yayBMaW5rCisgICBhbmQgdGhlcmUgaXMgbm9ybWFsbHkgYW4gYXJyYXkgb2YgTUFYX0xJTktTICg9NCkgc3RydWN0dXJlcyBpbiBhIGhvc3QgY2FyZCwKKyAgIGRlZmluZWQgYnkgUEFSTV9NQVAtPmxpbmtfc3RyX3B0ci4gKi8KKwordHlwZWRlZglzdHJ1Y3QJX0xQQgoreworCV91MTYJCWxpbmtfbnVtYmVyOwkJLyogMHgwMCBMaW5rIE51bWJlciAqLworCV91MTYJCWluX2NoOwkJCS8qIDB4MDIgTGluayBJbiBDaGFubmVsICovCisJX3UxNgkJb3V0X2NoOwkJCS8qIDB4MDQgTGluayBPdXQgQ2hhbm5lbCAqLworCV91OAkJYXR0YWNoZWRfc2VyaWFsWzRdOwkvKiAweDA2IEF0dGFjaGVkIHNlcmlhbCBudW1iZXIgKi8KKwlfdTgJCWF0dGFjaGVkX2hvc3Rfc2VyaWFsWzRdOy8qIDB4MEEgU2VyaWFsIG51bWJlciBvZiBIb3N0IHdobyBib290ZWQgb3RoZXIgZW5kICovCisJX3UxNgkJZGVzY2hlZHVsZWQ7CQkvKiAweDBFIEN1cnJlbnRseSBEZXNjaGVkdWxlZCAqLworCV91MTYJCXN0YXRlOwkJCS8qIDB4MTAgQ3VycmVudCBzdGF0ZSAqLworCV91MTYJCXNlbmRfcG9sbDsJCS8qIDB4MTIgU2VuZCBhIFBvbGwgUGFja2V0ICovCisJX3UxNgkJbHR0X3A7CQkJLyogMHgxNCBQcm9jZXNzIERlc2NyaXB0b3IgKi8KKwlfdTE2CQlscnRfcDsJCQkvKiAweDE2IFByb2Nlc3MgRGVzY3JpcHRvciAqLworCV91MTYJCWxydF9zdGF0dXM7CQkvKiAweDE4IEN1cnJlbnQgbHJ0IHN0YXR1cyAqLworCV91MTYJCWx0dF9zdGF0dXM7CQkvKiAweDFBIEN1cnJlbnQgbHR0IHN0YXR1cyAqLworCV91MTYJCXRpbWVvdXQ7CQkvKiAweDFDIFRpbWVvdXQgdmFsdWUgKi8KKwlfdTE2CQl0b3BvbG9neTsJCS8qIDB4MUUgVG9wb2xvZ3kgYml0cyAqLworCV91MTYJCW1vbl9sdHQ7CQkvKiAweDIwICovCisJX3UxNgkJbW9uX2xydDsJCS8qIDB4MjIgKi8KKwlfdTE2CQludW1fcGt0czsJCS8qIDB4MjQgKi8KKwlfdTE2CQlhZGRfcGFja2V0X2xpc3Q7CS8qIDB4MjYgQWRkIHBhY2tldHMgdG8gaGVyZSAqLworCV91MTYJCXJlbW92ZV9wYWNrZXRfbGlzdDsJLyogMHgyOCBTZW5kIHBhY2tldHMgZnJvbSBoZXJlICovCisKKwlfdTE2CQlscnRfZmFpbF9jaGFuOwkJLyogMHgyQSBMcnQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKwlfdTE2CQlsdHRfZmFpbF9jaGFuOwkJLyogMHgyQyBMdHQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKworCVJVUAkJcnVwOwkJCS8qIDB4MkUgUlVQIHN0cnVjdHVyZSBmb3IgSE9TVCB0byBkcml2ZXIgY29tbXMgKi8KKwlSVVAJCWxpbmtfcnVwOwkJLyogMHg0MCBSVVAgZm9yIHRoZSBsaW5rIChQT0xMLCB0b3BvbG9neSBldGMuKSAqLworCV91MTYJCWF0dGFjaGVkX2xpbms7CQkvKiAweDUyIE51bWJlciBvZiBhdHRhY2hlZCBsaW5rICovCisJX3UxNgkJY3N1bV9lcnJvcnM7CQkvKiAweDU0IGNzdW0gZXJyb3JzICovCisJX3UxNgkJbnVtX2Rpc2Nvbm5lY3RzOwkvKiAweDU2IG51bWJlciBvZiBkaXNjb25uZWN0cyAqLworCV91MTYJCW51bV9zeW5jX3JjdmQ7CQkvKiAweDU4ICMgc3luYydzIHJlY2VpdmVkICovCisJX3UxNgkJbnVtX3N5bmNfcnFzdDsJCS8qIDB4NUEgIyBzeW5jIHJlcXVlc3RzICovCisJX3UxNgkJbnVtX3R4OwkJCS8qIDB4NUMgTnVtIHBrdHMgc2VudCAqLworCV91MTYJCW51bV9yeDsJCQkvKiAweDVFIE51bSBwa3RzIHJlY2VpdmVkICovCisJX3UxNgkJbW9kdWxlX2F0dGFjaGVkOwkvKiAweDYwIE1vZHVsZSB0cHllcyBvZiBhdHRhY2hlZCAqLworCV91MTYJCWxlZF90aW1lb3V0OwkJLyogMHg2MiBMRUQgdGltZW91dCAqLworCV91MTYJCWZpcnN0X3BvcnQ7CQkvKiAweDY0IEZpcnN0IHBvcnQgdG8gc2VydmljZSAqLworCV91MTYJCWxhc3RfcG9ydDsJCS8qIDB4NjYgTGFzdCBwb3J0IHRvIHNlcnZpY2UgKi8KKworfSBMUEI7CisKKy8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KKworI2RlZmluZQlMUEJfbGlua19udW1iZXIJCTB4MDAJCS8qIDB4MDAgTGluayBOdW1iZXIgKi8KKyNkZWZpbmUJTFBCX2luX2NoCQkweDAyCQkvKiAweDAyIExpbmsgSW4gQ2hhbm5lbCAqLworI2RlZmluZQlMUEJfb3V0X2NoCQkweDA0CQkvKiAweDA0IExpbmsgT3V0IENoYW5uZWwgKi8KKyNkZWZpbmUJTFBCX2F0dGFjaGVkX3NlcmlhbAkweDA2CQkvKiAweDA2IEF0dGFjaGVkIHNlcmlhbCBudW1iZXIgKi8KKyNkZWZpbmUJTFBCX2F0dGFjaGVkX2hvc3Rfc2VyaWFsIDB4MEEJCS8qIDB4MEEgU2VyaWFsIG51bWJlciBvZiBIb3N0IHdobyBib290ZWQgb3RoZXIgZW5kICovCisjZGVmaW5lCUxQQl9kZXNjaGVkdWxlZAkJMHgwRQkJLyogMHgwRSBDdXJyZW50bHkgRGVzY2hlZHVsZWQgKi8KKyNkZWZpbmUJTFBCX3N0YXRlCQkweDEwCQkvKiAweDEwIEN1cnJlbnQgc3RhdGUgKi8KKyNkZWZpbmUJTFBCX3NlbmRfcG9sbAkJMHgxMgkJLyogMHgxMiBTZW5kIGEgUG9sbCBQYWNrZXQgKi8KKyNkZWZpbmUJTFBCX2x0dF9wCQkweDE0CQkvKiAweDE0IFByb2Nlc3MgRGVzY3JpcHRvciAqLworI2RlZmluZQlMUEJfbHJ0X3AJCTB4MTYJCS8qIDB4MTYgUHJvY2VzcyBEZXNjcmlwdG9yICovCisjZGVmaW5lCUxQQl9scnRfc3RhdHVzCQkweDE4CQkvKiAweDE4IEN1cnJlbnQgbHJ0IHN0YXR1cyAqLworI2RlZmluZQlMUEJfbHR0X3N0YXR1cwkJMHgxQQkJLyogMHgxQSBDdXJyZW50IGx0dCBzdGF0dXMgKi8KKyNkZWZpbmUJTFBCX3RpbWVvdXQJCTB4MUMJCS8qIDB4MUMgVGltZW91dCB2YWx1ZSAqLworI2RlZmluZQlMUEJfdG9wb2xvZ3kJCTB4MUUJCS8qIDB4MUUgVG9wb2xvZ3kgYml0cyAqLworI2RlZmluZQlMUEJfbW9uX2x0dAkJMHgyMAkJLyogMHgyMCAqLworI2RlZmluZQlMUEJfbW9uX2xydAkJMHgyMgkJLyogMHgyMiAqLworI2RlZmluZQlMUEJfbnVtX3BrdHMJCTB4MjQJCS8qIDB4MjQgKi8KKyNkZWZpbmUJTFBCX2FkZF9wYWNrZXRfbGlzdAkweDI2CQkvKiAweDI2IEFkZCBwYWNrZXRzIHRvIGhlcmUgKi8KKyNkZWZpbmUJTFBCX3JlbW92ZV9wYWNrZXRfbGlzdAkweDI4CQkvKiAweDI4IFNlbmQgcGFja2V0cyBmcm9tIGhlcmUgKi8KKyNkZWZpbmUJTFBCX2xydF9mYWlsX2NoYW4JMHgyQQkJLyogMHgyQSBMcnQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKyNkZWZpbmUJTFBCX2x0dF9mYWlsX2NoYW4JMHgyQwkJLyogMHgyQyBMdHQncyBmYWlsdXJlIGNoYW5uZWwgKi8KKyNkZWZpbmUJTFBCX3J1cAkJCTB4MkUJCS8qIDB4MkUgUlVQIHN0cnVjdHVyZSBmb3IgSE9TVCB0byBkcml2ZXIgY29tbXMgKi8KKyNkZWZpbmUJTFBCX2xpbmtfcnVwCQkweDQwCQkvKiAweDQwIFJVUCBmb3IgdGhlIGxpbmsgKFBPTEwsIHRvcG9sb2d5IGV0Yy4pICovCisjZGVmaW5lCUxQQl9hdHRhY2hlZF9saW5rCTB4NTIJCS8qIDB4NTIgTnVtYmVyIG9mIGF0dGFjaGVkIGxpbmsgKi8KKyNkZWZpbmUJTFBCX2NzdW1fZXJyb3JzCQkweDU0CQkvKiAweDU0IGNzdW0gZXJyb3JzICovCisjZGVmaW5lCUxQQl9udW1fZGlzY29ubmVjdHMJMHg1NgkJLyogMHg1NiBudW1iZXIgb2YgZGlzY29ubmVjdHMgKi8KKyNkZWZpbmUJTFBCX251bV9zeW5jX3JjdmQJMHg1OAkJLyogMHg1OCAjIHN5bmMncyByZWNlaXZlZCAqLworI2RlZmluZQlMUEJfbnVtX3N5bmNfcnFzdAkweDVBCQkvKiAweDVBICMgc3luYyByZXF1ZXN0cyAqLworI2RlZmluZQlMUEJfbnVtX3R4CQkweDVDCQkvKiAweDVDIE51bSBwa3RzIHNlbnQgKi8KKyNkZWZpbmUJTFBCX251bV9yeAkJMHg1RQkJLyogMHg1RSBOdW0gcGt0cyByZWNlaXZlZCAqLworI2RlZmluZQlMUEJfbW9kdWxlX2F0dGFjaGVkCTB4NjAJCS8qIDB4NjAgTW9kdWxlIHRweWVzIG9mIGF0dGFjaGVkICovCisjZGVmaW5lCUxQQl9sZWRfdGltZW91dAkJMHg2MgkJLyogMHg2MiBMRUQgdGltZW91dCAqLworI2RlZmluZQlMUEJfZmlyc3RfcG9ydAkJMHg2NAkJLyogMHg2NCBGaXJzdCBwb3J0IHRvIHNlcnZpY2UgKi8KKyNkZWZpbmUJTFBCX2xhc3RfcG9ydAkJMHg2NgkJLyogMHg2NiBMYXN0IHBvcnQgdG8gc2VydmljZSAqLworI2RlZmluZQlzaXplb2ZfTFBCCQkweDY4CQkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4NjggKi8KKworI2RlZmluZQlMSU5LU19QRVJfVU5JVAkJNAkJLyogbnVtYmVyIG9mIGxpbmtzIGZyb20gYSBob3N0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEZSRUVfTElTVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFVzZWQgdG8gb3ZlcmxheSBwYWNrZXQgaGVhZGVycyB3aGVuIGFsbG9jYXRpbmcvZnJlZWluZyBwYWNrZXRzIGZyb20gdGhlIGZyZWUgbGlzdCAqLworCit0eXBlZGVmCXN0cnVjdAlfRlJFRV9MSVNUCit7CisJX3UxNgkJbmV4dDsJCQkvKiAweDAwIG9mZnNldCBvZiBuZXh0IGxpc3QgaXRlbSAqLworCV91MTYJCXByZXY7CQkJLyogMHgwMiBvZmZzZXQgb2YgcHJldmlvdXMgbGlzdCBpdGVtICovCisKK30gRlJFRV9MSVNUOworCisvKiBTYW1lIHRoaW5nIGFnYWluLCBidXQgZGVmaW5lZCBhcyBvZmZzZXRzLi4uICovCisKKyNkZWZpbmUJRkxfbmV4dAkJCTB4MDAJCS8qIDB4MDAgb2Zmc2V0IG9mIG5leHQgbGlzdCBpdGVtICovCisjZGVmaW5lCUZMX3ByZXYJCQkweDAyCQkvKiAweDAyIG9mZnNldCBvZiBwcmV2aW91cyBsaXN0IGl0ZW0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQS1QgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIFBLVCBpcyB0aGUgbWFpbiB1bml0IG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBIb3N0IENhcmRzIGFuZCBSVEFzIGFjcm9zcworICAgdGhlIFJJTyBuZXR3b3JrLiAgKi8KKworI2RlZmluZSBQS1RfTUFYX0RBVEFfTEVOICAgNzIJCQkvKiBTaXplIG9mIHBhY2tldCBkYXRhICovCisKK3R5cGVkZWYJc3RydWN0CV9QS1QKK3sKKwlfdTgJCWRlc3RfdW5pdDsJCS8qIDB4MDAgRGVzdGluYXRpb24gVW5pdCBJZCAqLworCV91OAkJZGVzdF9wb3J0OwkJLyogMHgwMSBEZXN0aW5hdGlvbiBQb3J0ICovCisJX3U4CQlzcmNfdW5pdDsJCS8qIDB4MDIgU291cmNlIFVuaXQgSWQgKi8KKwlfdTgJCXNyY19wb3J0OwkJLyogMHgwMyBTb3VyY2UgUG9ydCAqLworCV91OAkJbGVuOwkJCS8qIDB4MDQgTGVuZ3RoIChpbiBieXRlcykgb2YgZGF0YSBmaWVsZCAqLworCV91OAkJY29udHJvbDsJCS8qIDB4MDUgKi8KKwlfdTgJCWRhdGFbUEtUX01BWF9EQVRBX0xFTl07CS8qIDB4MDYgQWN0dWFsIGRhdGEgKi8KKwlfdTE2CQljc3VtOwkJCS8qIDB4NEUgQy1TVU0gKi8KKworfSBQS1Q7CisKKy8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KKworI2RlZmluZQlQS1RfZGVzdF91bml0CQkweDAwCQkvKiAweDAwIERlc3RpbmF0aW9uIFVuaXQgSWQgKi8KKyNkZWZpbmUJUEtUX2Rlc3RfcG9ydAkJMHgwMQkJLyogMHgwMSBEZXN0aW5hdGlvbiBQb3J0ICovCisjZGVmaW5lCVBLVF9zcmNfdW5pdAkJMHgwMgkJLyogMHgwMiBTb3VyY2UgVW5pdCBJZCAqLworI2RlZmluZQlQS1Rfc3JjX3BvcnQJCTB4MDMJCS8qIDB4MDMgU291cmNlIFBvcnQgKi8KKyNkZWZpbmUJUEtUX2xlbgkJCTB4MDQJCS8qIDB4MDQgTGVuZ3RoIChpbiBieXRlcykgb2YgZGF0YSBmaWVsZCAqLworI2RlZmluZQlQS1RfY29udHJvbAkJMHgwNQkJLyogMHgwNSAqLworI2RlZmluZQlQS1RfZGF0YQkJMHgwNgkJLyogMHgwNiBBY3R1YWwgZGF0YSAqLworI2RlZmluZQlQS1RfY3N1bQkJMHg0RQkJLyogMHg0RSBDLVNVTSAqLworI2RlZmluZQlzaXplb2ZfUEtUCQkweDUwCQkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4NTAgKi8KKworLyogUEtULmxlbiBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlQS1RfQ01EX0JJVAkJMHg4MAorI2RlZmluZQlQS1RfQ01EX0RBVEEJCTB4ODAKKyNkZWZpbmUJUEtUX0xFTl9NQVNLCQkweDdGCisKKy8qIFBLVC5jb250cm9sIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVBLVF9BQ0sJCQkweDQwCisjZGVmaW5lCVBLVF9UR0wJCQkweDIwCisjZGVmaW5lCURBVEFfV05EVwkJMHgxMAorI2RlZmluZQlQS1RfVFRMX01BU0sJCTB4MEYKKyNkZWZpbmUJTUFYX1RUTAkJCTB4MEYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQ29udHJvbCBQYWNrZXRzICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcyBkZWZpbmUgdGhlIGNvbnRyb2wgcGFja2V0cyBzZW50CisgICBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIFJJTyBQb3J0cywgUlRBcyBhbmQgSG9zdCBDYXJkcy4gKi8KKworI2RlZmluZQlQUkVfRU1QVElWRQkJMHg4MAkJCS8qIFByZS1lbXB0aXZlIGNvbW1hbmQgKHNlbnQgdmlhIHBvcnQncyBSVVApICovCisKKy8qICJpbi1iYW5kIiBhbmQgInByZS1lbXB0aXZlIiBwb3J0IGNvbW1hbmRzLi4uICovCisjZGVmaW5lCU9QRU4JCQkweDAwCQkJLyogRHJpdmVyLT5SSU8gT3BlbiBhIHBvcnQgKi8KKyNkZWZpbmUJQ09ORklHCQkJMHgwMQkJCS8qIERyaXZlci0+UklPIENvbmZpZ3VyZSBhIHBvcnQgKi8KKyNkZWZpbmUJTU9QRU4JCQkweDAyCQkJLyogRHJpdmVyLT5SSU8gTW9kZW0gb3BlbiAod2FpdCBmb3IgRENEKSAqLworI2RlZmluZQlDTE9TRQkJCTB4MDMJCQkvKiBEcml2ZXItPlJJTyBDbG9zZSBhIHBvcnQgKi8KKyNkZWZpbmUJV0ZMVVNICQkJKDB4MDR8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIFdyaXRlIGZsdXNoICovCisjZGVmaW5lCVJGTFVTSAkJCSgweDA1fFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBSZWFkIGZsdXNoICovCisjZGVmaW5lCVJFU1VNRQkJCSgweDA2fFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBCZWhhdmUgYXMgaWYgWE9OIHJlY2VpdmVkICovCisjZGVmaW5lCVNCUkVBSwkJCTB4MDcJCQkvKiBEcml2ZXItPlJJTyBTdGFydCBicmVhayAqLworI2RlZmluZQlFQlJFQUsJCQkweDA4CQkJLyogRHJpdmVyLT5SSU8gRW5kIGJyZWFrICovCisjZGVmaW5lCVNVU1BFTkQJCQkoMHgwOXxQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gQmVoYXZlIGFzIGlmIFhPRkYgcmVjZWl2ZWQgKi8KKyNkZWZpbmUJRkNMT1NFCQkJKDB4MEF8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIEZvcmNlIGNsb3NlICovCisjZGVmaW5lCVhQUklOVAkJCTB4MEIJCQkvKiBEcml2ZXItPlJJTyBYcHJpbnQgcGFja2V0ICovCisjZGVmaW5lCU1CSVMJCQkoMHgwQ3xQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gU2V0IG1vZGVtIGxpbmVzICovCisjZGVmaW5lCU1CSUMJCQkoMHgwRHxQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gQ2xlYXIgbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUJTVNFVAkJCSgweDBFfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBTZXQgbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUJUENMT1NFCQkJMHgwRgkJCS8qIERyaXZlci0+UklPIFBzZXVkbyBjbG9zZSAqLworI2RlZmluZQlNR0VUCQkJKDB4MTB8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIEZvcmNlIHVwZGF0ZSBvZiBtb2RlbSBzdGF0dXMgKi8KKyNkZWZpbmUJTUVNRFVNUAkJCSgweDExfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBERUJVRyByZXF1ZXN0IGZvciBSVEEgbWVtb3J5ICovCisjZGVmaW5lCVJFQURfUkVHSVNURVIJCSgweDEyfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBERUJVRyByZWFkIENEMTQwMCByZWdpc3RlciAqLworCisvKiBSZW1vdGUgVW5pdCBQb3J0IChSVVApIHBhY2tldCBkZWZpbml0aW9ucy4uLiAoc3BlY2lmaWVkIGluIFBLVC5kZXN0X3VuaXQgYW5kIFBLVC5zcmNfdW5pdCkgKi8KKyNkZWZpbmUJU1lOQ19SVVAJCTB4RkYJCQkvKiBEb3dubG9hZCBpbnRlcm5hbCAqLworI2RlZmluZQlDT01NQU5EX1JVUAkJMHhGRQkJCS8qIENvbW1hbmQgYWNrL3N0YXR1cyAqLworI2RlZmluZQlFUlJPUl9SVVAJCTB4RkQJCQkvKiBEb3dubG9hZCBpbnRlcm5hbCAqLworI2RlZmluZQlQT0xMX1JVUAkJMHhGQwkJCS8qIERvd25sb2FkIGludGVybmFsICovCisjZGVmaW5lCUJPT1RfUlVQCQkweEZCCQkJLyogVXNlZCB0byBib290IFJUQXMgKi8KKyNkZWZpbmUJUk9VVEVfUlVQCQkweEZBCQkJLyogVXNlZCB0byBzcGVjaWZ5IHJvdXRpbmcvdG9wb2xvZ3kgKi8KKyNkZWZpbmUJU1RBVFVTX1JVUAkJMHhGOQkJCS8qIE5vdCB1c2VkICovCisjZGVmaW5lCVBPV0VSX1JVUAkJMHhGOAkJCS8qIERvd25sb2FkIGludGVybmFsICovCisKKy8qIENPTU1BTkRfUlVQIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCUNPTVBMRVRFCQkoMHgyMHxQUkVfRU1QVElWRSkJLyogUklPLT5Ecml2ZXIgQ29tbWFuZCBjb21wbGV0ZSAqLworI2RlZmluZQlCUkVBS19SRUNFSVZFRAkJKDB4MjF8UFJFX0VNUFRJVkUpCS8qIFJJTy0+RHJpdmVyIEJyZWFrIHJlY2VpdmVkICovCisjZGVmaW5lCU1PREVNX1NUQVRVUwkJKDB4MjJ8UFJFX0VNUFRJVkUpCS8qIFJJTy0+RHJpdmVyIE1vZGVtIHN0YXR1cyBjaGFuZ2UgKi8KKworLyogQk9PVF9SVVAgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJQk9PVF9SRVFVRVNUCQkweDAwCQkJLyogUklPLT5Ecml2ZXIgUmVxdWVzdCBmb3IgYm9vdCAqLworI2RlZmluZQlCT09UX0FCT1JUCQkweDAxCQkJLyogRHJpdmVyLT5SSU8gQWJvcnQgYSBib290ICovCisjZGVmaW5lCUJPT1RfU0VRVUVOQ0UJCTB4MDIJCQkvKiBEcml2ZXItPlJJTyBQYWNrZXQgd2l0aCBmaXJtd2FyZSBkZXRhaWxzICovCisjZGVmaW5lCUJPT1RfQ09NUExFVEVECQkweDAzCQkJLyogUklPLT5Ecml2ZXIgQm9vdCBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgSUZPQUQJCQkweDJGCQkJLyogRHJpdmVyLT5SSU8gU2h1dGRvd24vUmVib290IFJUQSAoRmFsbCBPdmVyIEFuZCBEaWUpICovCisjZGVmaW5lCUlERU5USUZZCQkweDMwCQkJLyogRHJpdmVyLT5SSU8gSWRlbnRpZnkgUlRBICovCisjZGVmaW5lCVpPTUJJRQkJCTB4MzEJCQkvKiBEcml2ZXItPlJJTyBTaHV0ZG93bi9GbGFzaCBMRURzICovCisjZGVmaW5lCVVGT0FECQkJMHgzMgkJCS8qIERyaXZlci0+UklPIFNodXRkb3duL1JlYm9vdCBuZWlnaGJvdXJpbmcgUlRBICovCisjZGVmaW5lIElXQUlUCQkJMHgzMwkJCS8qIERyaXZlci0+UklPIFBhdXNlIGJvb3RpbmcgcHJvY2VzcyAqLworCisvKiBST1VURV9SVVAgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUk9VVEVfUkVRVUVTVAkJMHgwMAkJCS8qIFJJTy0+RHJpdmVyIFJlcXVlc3QgYW4gSUQgKi8KKyNkZWZpbmUJUk9VVEVfRk9BRAkJMHgwMQkJCS8qIERyaXZlci0+UklPIFNodXRkb3duL3JlYm9vdCBSVEEgKi8KKyNkZWZpbmUJUk9VVEVfQUxSRUFEWQkJMHgwMgkJCS8qIERyaXZlci0+UklPIE5vdCB1c2VkICovCisjZGVmaW5lCVJPVVRFX1VTRUQJCTB4MDMJCQkvKiBEcml2ZXItPlJJTyBOb3QgdXNlZCAqLworI2RlZmluZQlST1VURV9BTExPQ0FURQkJMHgwNAkJCS8qIERyaXZlci0+UklPIEFsbG9jYXRlIFJUQSBSVVAgbnVtYmVycyAqLworI2RlZmluZQlST1VURV9SRVFfVE9QCQkweDA1CQkJLyogRHJpdmVyLT5SSU8gTm90IHVzZWQgKi8KKyNkZWZpbmUgUk9VVEVfVE9QT0xPR1kJCTB4MDYJCQkvKiBSSU8tPkRyaXZlciBSb3V0ZS9Ub3BvbG9neSBzdGF0dXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBPUEVOICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLGluLWJhbmQpCisKKyAgIFNlbnQgdG8gb3BlbiBhIHBvcnQuIAorICAgU3RydWN0dXJlIG9mIGNvbmZpZ3VyYXRpb24gaW5mbyB1c2VkIHdpdGggT1BFTiwgQ09ORklHIGFuZCBNT1BFTiBwYWNrZXRzLi4uICovCisKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9Db3IxCQkoUEtUX0RhdGErMSkJCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJUEtUX0NvcjIJCShQS1RfRGF0YSsyKQkJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZQlQS1RfQ29yNAkJKFBLVF9EYXRhKzMpCQkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciA0ICovCisjZGVmaW5lCVBLVF9Db3I1CQkoUEtUX0RhdGErNCkJCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUJUEtUX1R4WG9uCQkoUEtUX0RhdGErNSkJCS8qIFRyYW5zbWl0IFhPTiBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUEtUX1R4WG9mZgkJKFBLVF9EYXRhKzYpCQkvKiBUcmFuc21pdCBYT0ZGIGNoYXJhY3RlciAqLworI2RlZmluZQlQS1RfUnhYb24JCShQS1RfRGF0YSs3KQkJLyogUmVjZWl2ZSBYT04gY2hhcmFjdGVyICovCisjZGVmaW5lCVBLVF9SeFhvZmYJCShQS1RfRGF0YSs4KQkJLyogUmVjZWl2ZSBYT0ZGIGNoYXJhY3RlciAqLworI2RlZmluZQlQS1RfTG5leHQJCShQS1RfRGF0YSs5KQkJLyogTG5leHQgY2hhcmFjdGVyICovCisjZGVmaW5lCVBLVF9UeEJhdWQJCShQS1RfRGF0YSsxMCkJCS8qIFRyYW5zbWl0IGJhdWQgcmF0ZSAqLworI2RlZmluZQlQS1RfUnhCYXVkCQkoUEtUX0RhdGErMTEpCQkvKiBSZWNlaXZlIGJhdWQgcmF0ZSAqLworCisvKiBDT1IxIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCUNPUjFfUEFSSVRZCQkweEUwCQkJLyogUGFyaXR5IG1hc2sgKi8KKyNkZWZpbmUJQ09SMV9OT05FCQkweDAwCQkJLyogTm8gcGFyaXR5ICovCisjZGVmaW5lCUNPUjFfU1BBQ0UJCTB4MjAJCQkvKiBTcGFjZSBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9FVkVOCQkweDQwCQkJLyogRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9NQVJLCQkweEEwCQkJLyogTWFyayBwYXJpdHkgKi8KKyNkZWZpbmUJQ09SMV9PREQJCTB4QzAJCQkvKiBPZGQgcGFyaXR5ICovCisKKyNkZWZpbmUJQ09SMV9TVE9QQklUUwkJMHgwQwkJCS8qIFN0b3AgYml0cyBtYXNrICovCisjZGVmaW5lCUNPUjFfU1RPUDEJCTB4MDAJCQkvKiAxIHN0b3AgYml0ICovCisjZGVmaW5lCUNPUjFfU1RPUDFfNQkJMHgwNAkJCS8qIDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV9TVE9QMgkJMHgwOAkJCS8qIDIgc3RvcCBiaXRzICovCisKKyNkZWZpbmUJQ09SMV9EQVRBQklUUwkJMHgwMwkJCS8qIERhdGEgYml0cyBtYXNrICovCisjZGVmaW5lCUNPUjFfREFUQTUJCTB4MDAJCQkvKiA1IGRhdGEgYml0cyAqLworI2RlZmluZQlDT1IxX0RBVEE2CQkweDAxCQkJLyogNiBkYXRhIGJpdHMgKi8KKyNkZWZpbmUJQ09SMV9EQVRBNwkJMHgwMgkJCS8qIDcgZGF0YSBiaXRzICovCisjZGVmaW5lCUNPUjFfREFUQTgJCTB4MDMJCQkvKiA4IGRhdGEgYml0cyAqLworCisvKiBDT1IyIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCUNPUjJfWE9OX1RYRkxPVwkJMHg0MAkJCS8qIFhPTi9YT0ZGIFRyYW5zbWl0IEZsb3cgKi8KKyNkZWZpbmUJQ09SMl9YQU5ZX1RYRkxPVwkweEMwCQkJLyogWE9OL1hBTlkgVHJhbnNtaXQgRmxvdyAqLworI2RlZmluZQlDT1IyX0hVUENMCQkweDIwCQkJLyogSGFuZyBVcCBPbiBDbG9zZSAqLworI2RlZmluZQlDT1IyX0RTUl9UWEZMT1cJCTB4MDgJCQkvKiBEU1IgVHJhbnNtaXQgRmxvdyBDb250cm9sICovCisjZGVmaW5lCUNPUjJfUlRTX1JYRkxPVwkJMHgwNAkJCS8qIFJUUyBSZWNlaXZlIEZsb3cgQ29udHJvbCAqLworI2RlZmluZQlDT1IyX0NUU19UWEZMT1cJCTB4MDIJCQkvKiBDVFMgVHJhbnNtaXQgRmxvdyBDb250cm9sICovCisjZGVmaW5lCUNPUjJfWE9OX1JYRkxPVwkJMHgwMQkJCS8qIFhPTi9YT0ZGIFJlY2VpdmUgRmxvdyAqLworCisvKiBDT1I0IGRlZmluaXRpb24uLi4gKi8KKyNkZWZpbmUJQ09SNF9JR05DUgkJMHg4MAkJCS8qIERpc2NhcmQgcmVjZWl2ZWQgQ1IgKi8KKyNkZWZpbmUJQ09SNF9JQ1JOTAkJMHg0MAkJCS8qIE1hcCByZWNlaXZlZCBDUiAtPiBOTCAqLworI2RlZmluZQlDT1I0X0lOTENSCQkweDIwCQkJLyogTWFwIHJlY2VpdmVkIE5MIC0+IENSICovCisjZGVmaW5lCUNPUjRfSUdOQlJLCQkweDEwCQkJLyogSWdub3JlIFJlY2VpdmVkIEJyZWFrICovCisjZGVmaW5lCUNPUjRfTkJSS0lOVAkJMHgwOAkJCS8qIE5vIGludGVycnVwdCBvbiByeCBCcmVhayAqLworI2RlZmluZQlDT1I0X0lHTlBBUgkJMHgwNAkJCS8qIGlnbm9yZSByeCBwYXJpdHkgZXJyb3IgY2hhcnMgKi8KKyNkZWZpbmUJQ09SNF9QQVJNUksJCTB4MDIJCQkvKiBNYXJrIHJ4IHBhcml0eSBlcnJvciBjaGFycyAqLworI2RlZmluZQlDT1I0X1JBSVNFTU9ECQkweDAxCQkJLyogUmFpc2UgbW9kZW0gbGluZXMgb24gITAgYmF1ZCAqLworCisvKiBDT1I1IGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCUNPUjVfSVNUUklQCQkweDgwCQkJLyogU3RyaXAgaW5wdXQgY2hhcnMgdG8gNyBiaXRzICovCisjZGVmaW5lCUNPUjVfTE5FCQkweDQwCQkJLyogRW5hYmxlIExORVhUIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUJQ09SNV9DTU9FCQkweDIwCQkJLyogTWF0Y2ggZ29vZCAmIGVycm9yIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUJQ09SNV9UQUIzCQkweDEwCQkJLyogVEFCMyBtb2RlICovCisjZGVmaW5lCUNPUjVfVFNUQVRFX09OCQkweDA4CQkJLyogRW5hYmxlIHRidXN5L3RzdG9wIG1vbml0b3JpbmcgKi8KKyNkZWZpbmUJQ09SNV9UU1RBVEVfT0ZGCQkweDA0CQkJLyogRGlzYWJsZSB0YnVzeS90c3RvcCBtb25pdG9yaW5nICovCisjZGVmaW5lCUNPUjVfT05MQ1IJCTB4MDIJCQkvKiBOTCAtPiBDUiBOTCBvbiBvdXRwdXQgKi8KKyNkZWZpbmUJQ09SNV9PQ1JOTAkJMHgwMQkJCS8qIENSIC0+IE5MIG9uIG91dHB1dCAqLworCisvKiBSeEJhdWQgYW5kIFR4QmF1ZCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlSSU9fQjAJCQkweDAwCQkJLyogUlRTIC8gRFRSIHNpZ25hbHMgZHJvcHBlZCAqLworI2RlZmluZQlSSU9fQjUwCQkJMHgwMQkJCS8qIDUwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I3NQkJCTB4MDIJCQkvKiA3NSBiYXVkICovCisjZGVmaW5lCVJJT19CMTEwCQkweDAzCQkJLyogMTEwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMzQJCTB4MDQJCQkvKiAxMzQuNSBiYXVkICovCisjZGVmaW5lCVJJT19CMTUwCQkweDA1CQkJLyogMTUwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IyMDAJCTB4MDYJCQkvKiAyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjMwMAkJMHgwNwkJCS8qIDMwMCBiYXVkICovCisjZGVmaW5lCVJJT19CNjAwCQkweDA4CQkJLyogNjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMjAwCQkweDA5CQkJLyogMTIwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMTgwMAkJMHgwQQkJCS8qIDE4MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjI0MDAJCTB4MEIJCQkvKiAyNDAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I0ODAwCQkweDBDCQkJLyogNDgwMCBiYXVkICovCisjZGVmaW5lCVJJT19COTYwMAkJMHgwRAkJCS8qIDk2MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjE5MjAwCQkweDBFCQkJLyogMTkyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjM4NDAwCQkweDBGCQkJLyogMzg0MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjU2MDAwCQkweDEwCQkJLyogNTYwMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjU3NjAwCQkweDExCQkJLyogNTc2MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjY0MDAwCQkweDEyCQkJLyogNjQwMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjExNTIwMAkJMHgxMwkJCS8qIDExNTIwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMjAwMAkJMHgxNAkJCS8qIDIwMDAgYmF1ZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQ09ORklHICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKKworICAgQ09ORklHIGlzIHNlbnQgZnJvbSB0aGUgZHJpdmVyIHRvIGNvbmZpZ3VyZSBhbiBhbHJlYWR5IG9wZW5lZCBwb3J0LgorICAgUGFja2V0IHN0cnVjdHVyZSBpcyBzYW1lIGFzIE9QRU4uICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTU9QRU4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKKworICAgTU9QRU4gaXMgc2VudCBmcm9tIHRoZSBkcml2ZXIgdG8gb3BlbiBhIHBvcnQgYXR0YWNoZWQgdG8gYSBtb2RlbS4gKGluLWJhbmQpCisgICBQYWNrZXQgc3RydWN0dXJlIGlzIHNhbWUgYXMgT1BFTi4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBDTE9TRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQorCisgICBDTE9TRSBpcyBzZW50IGZyb20gdGhlIGRyaXZlciB0byBjbG9zZSBhIHByZXZpb3VzbHkgb3BlbmVkIHBvcnQuCisgICBObyBwYXJhbWV0ZXJzLgorICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFdGTFVTSCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBXRkxVU0ggaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBmbHVzaCB0aGUgd3JpdGUgYnVmZmVycyBhbmQKKyAgIHBhY2tldHMgb2YgYSBwb3J0LiAgKHByZS1lbXB0aXZlKQorICAgCisgICBXRkxVU0ggaXMgYWxzbyBzZW50IGluLWJhbmQgZnJvbSB0aGUgZHJpdmVyIHRvIGEgcG9ydCBhcyBhIG1hcmtlciB0byBlbmQKKyAgIHdyaXRlIGZsdXNoaW5nIHByZXZpb3VzbHkgc3RhcnRlZCBieSBhIHByZS1lbXB0aXZlIFdGTFVTSCBwYWNrZXQuIChpbi1iYW5kKQorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUkZMVVNIICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIFJGTFVTSCBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIGZsdXNoIHRoZSByZWFkIGJ1ZmZlcnMgYW5kCisgICBwYWNrZXRzIG9mIGEgcG9ydC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJFU1VNRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBSRVNVTUUgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBjYXVzZSBhIHBvcnQgdG8gcmVzdW1lIAorICAgdHJhbnNtaXNzaW9uIG9mIGRhdGEgaWYgYmxvY2tlZCBieSBYT0ZGLiAgKGFzIGlmIFhPTiBoYWQgYmVlbiByZWNlaXZlZCkKKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFNCUkVBSyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLGluLWJhbmQpCisKKyAgIFNCUkVBSyBpcyBzZW50IGluLWJhbmQgZnJvbSB0aGUgZHJpdmVyIHRvIGEgcG9ydCB0byBzdXNwZW5kIGRhdGEgYW5kIHN0YXJ0CisgICBicmVhayBzaWduYWwgdHJhbnNtaXNzaW9uLgorCisgICBJZiB0aGUgYnJlYWsgZGVsYXkgaXMgMCwgdGhlIGJyZWFrIHNpZ25hbCB3aWxsIGJlIGFja25vd2xlZGdlZCB3aXRoIGEKKyAgIFJVUF9DT01NQU5ELCBDT01QTEVURSBwYWNrZXQgYW5kIGNvbnRpbnVlIHVudGlsIGFuIEVCUkVBSyBwYWNrZXQgaXMgcmVjZWl2ZWQuCisKKyAgIE90aGVyd2lzZSwgdGhlcmUgaXMgbm8gYWNrbm93bGVkZ2VtZW50IGFuZCB0aGUgYnJlYWsgc2lnbmFsIHdpbGwgbGFzdCBmb3IgdGhlCisgICBzcGVjaWZpZWQgbnVtYmVyIG9mIG1TLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9CcmVha0RlbGF5CQkoUEtUX0RhdGErMSkJCS8qIEJyZWFrIGRlbGF5IGluIG1TICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBFQlJFQUsgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQorCisgICBFQlJFQUsgaXMgc2VudCBpbi1iYW5kIGZyb20gdGhlIGRyaXZlciB0byBhIHBvcnQgdG8gc3RvcCB0cmFuc21pc3Npb24gb2YgYQorICAgYnJlYWsgc2lnbmFsLgorCisgICBObyBwYXJhbWV0ZXJzLiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFNVU1BFTkQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBTVVNQRU5EIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gY2F1c2UgYSBwb3J0IHRvIHN1c3BlbmQKKyAgIHRyYW5zbWlzc2lvbiBvZiBkYXRhLiAgKGFzIGlmIFhPRkYgaGFkIGJlZW4gcmVjZWl2ZWQpCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBGQ0xPU0UgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgRkNMT1NFIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gZm9yY2UgY2xvc2UgYSBwb3J0LgorICAgQSBmb3JjZSBjbG9zZSBmbHVzaGVzIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHF1ZXVlcywgYW5kIGFsc28gbG93ZXJzIGFsbCBvdXRwdXQKKyAgIG1vZGVtIHNpZ25hbHMgaWYgdGhlIENPUjVfSFVQQ0wgKEhhbmcgVXAgT24gQ2xvc2UpIGZsYWcgaXMgc2V0LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgWFBSSU5UICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKKworICAgWFBSSU5UIGlzIHNlbnQgYXMgYSBub3JtYWwgSS9PIGRhdGEgcGFja2V0IGV4Y2VwdCB0aGF0IHRoZSBQS1RfQ01EX0JJVCBvZgorICAgdGhlICJsZW4iIGZpZWxkIGlzIHNldCwgYW5kIHRoZSBmaXJzdCAiZGF0YSIgYnl0ZSBpcyBYUFJJTlQuCisKKyAgIFRoZSBJL08gZGF0YSBpbiB0aGUgWFBSSU5UIHBhY2tldCB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKKyAgIC0JVHJhbnNwYXJlbnQgUHJpbnQgU3RhcnQgU2VxdWVuY2UKKyAgIC0JVHJhbnNwYXJlbnQgUHJpbnQgRGF0YQorICAgLQlUcmFuc3BhcmVudCBQcmludCBTdG9wIFNlcXVlbmNlLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIE1CSVMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIE1CSVMgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBzZXQgYSBwb3J0J3MgbW9kZW0gc2lnbmFscy4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX01vZGVtU2V0CQkoUEtUX0RhdGErNCkJCS8qIE1vZGVtIHNldCBzaWduYWxzIG1hc2sgKi8KKworLyogTW9kZW1TZXQgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJTUJJU19SVFMJCTB4MDEJCQkvKiBSVFMgbW9kZW0gc2lnbmFsICovCisjZGVmaW5lCU1CSVNfRFRSCQkweDAyCQkJLyogRFRSIG1vZGVtIHNpZ25hbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIE1CSUMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIE1CSUMgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBjbGVhciBhIHBvcnQncyBtb2RlbSBzaWduYWxzLgorICAgKi8KKyNpZiAwICAgCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KKyNlbmRpZgorCisjZGVmaW5lCVBLVF9Nb2RlbUNsZWFyCQkoUEtUX0RhdGErNCkJCS8qIE1vZGVtIGNsZWFyIHNpZ25hbHMgbWFzayAqLworCisvKiBNb2RlbUNsZWFyIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCU1CSUNfUlRTCQkweDAxCQkJLyogUlRTIG1vZGVtIHNpZ25hbCAqLworI2RlZmluZQlNQklDX0RUUgkJMHgwMgkJCS8qIERUUiBtb2RlbSBzaWduYWwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBNU0VUICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBNU0VUIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gc2V0L2NsZWFyIGEgcG9ydCdzIG1vZGVtIHNpZ25hbHMuICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZW5kaWYKKworI2RlZmluZQlQS1RfTW9kZW1TZXQJCShQS1RfRGF0YSs0KQkJLyogTW9kZW0gc2V0IHNpZ25hbHMgbWFzayAqLworCisvKiBNb2RlbVNldCBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlNU0VUX1JUUwkJMHgwMQkJCS8qIFJUUyBtb2RlbSBzaWduYWwgKi8KKyNkZWZpbmUJTVNFVF9EVFIJCTB4MDIJCQkvKiBEVFIgbW9kZW0gc2lnbmFsICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQQ0xPU0UgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQorCisgICBQQ0xPU0UgaXMgc2VudCBmcm9tIHRoZSBkcml2ZXIgdG8gcHNldWRvIGNsb3NlIGEgcHJldmlvdXNseSBvcGVuZWQgcG9ydC4KKyAgIAorICAgVGhlIHBvcnQgd2lsbCBjbG9zZSB3aGVuIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQvcmVjZWl2ZWQsIGhvd2V2ZXIsIHRoZQorICAgcG9ydCdzIHRyYW5zbWl0IC8gcmVjZWl2ZSBhbmQgbW9kZW0gc2lnbmFscyB3aWxsIGJlIGxlZnQgZW5hYmxlZCBhbmQgdGhlCisgICBwb3J0IG1hcmtlZCBpbnRlcm5hbGx5IGFzIFBzZXVkbyBDbG9zZWQuICovCisKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTUdFVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgTUdFVCBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIHJlcXVlc3QgdGhlIHBvcnQncyBjdXJyZW50IG1vZGVtIHNpZ25hbHMuICovCisKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTUVNRFVNUCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIE1FTURVTVAgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byByZXF1ZXN0IGEgZHVtcCBvZiAzMiBieXRlcworICAgb2YgdGhlIHNwZWNpZmllZCBwb3J0J3MgUlRBIGFkZHJlc3Mgc3BhY2UuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KKyNkZWZpbmUJUEtUX0FkZHJlc3MJCShQS1RfRGF0YSs2KQkJLyogUmVxdWVzdGVkIGFkZHJlc3MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJFQURfUkVHSVNURVIgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBSRUFEX1JFR0lTVEVSIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gcmVxdWVzdCB0aGUgY29udGVudHMKKyAgIG9mIHRoZSBDRDE0MDAgcmVnaXN0ZXIgc3BlY2lmaWVkIGluIGFkZHJlc3MuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KKyNkZWZpbmUJUEtUX0FkZHJlc3MJCShQS1RfRGF0YSs2KQkJLyogUmVxdWVzdGVkIGFkZHJlc3MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBDT01NQU5EX1JVUCAtIENPTVBMRVRFIGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYWxsIHBvcnQgSS9PIGNvbnRyb2wgY29tbWFuZAorICAgcGFja2V0cywgZXhjZXB0IE1FTURVTVAgYW5kIFJFQURfUkVHSVNURVIuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZGVmaW5lCVBLVF9Nb2RlbVN0YXR1cwkJKFBLVF9EYXRhKzMpCQkvKiBNb2RlbSBzaWduYWwgc3RhdHVzICovCisjZGVmaW5lCVBLVF9Qb3J0U3RhdHVzCQkoUEtUX0RhdGErNCkJCS8qIFBvcnQgc2lnbmFsIHN0YXR1cyAqLworI2RlZmluZQlQS1RfU3ViQ21kCQkoUEtUX0RhdGErNSkJCS8qIFN1YiBDb21tYW5kICovCisKKy8qIE1vZGVtU3RhdHVzIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCU1PREVNX0RTUgkJMHg4MAkJCS8qIERhdGEgU2V0IFJlYWR5IG1vZGVtIHN0YXRlICovCisjZGVmaW5lCU1PREVNX0NUUwkJMHg0MAkJCS8qIENsZWFyIFRvIFNlbmQgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fUkkJCTB4MjAJCQkvKiBSaW5nIEluZGljYXRlIG1vZGVtIHN0YXRlICovCisjZGVmaW5lCU1PREVNX0NECQkweDEwCQkJLyogQ2FycmllciBEZXRlY3QgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fVFNUT1AJCTB4MDgJCQkvKiBUcmFuc21pdCBTdG9wcGVkIHN0YXRlICovCisjZGVmaW5lCU1PREVNX1RFTVBUWQkJMHgwNAkJCS8qIFRyYW5zbWl0IEVtcHR5IHN0YXRlICovCisjZGVmaW5lCU1PREVNX0RUUgkJMHgwMgkJCS8qIERUUiBtb2RlbSBvdXRwdXQgc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fUlRTCQkweDAxCQkJLyogUlRTIG1vZGVtIG91dHB1dCBzdGF0ZSAqLworCisvKiBQb3J0U3RhdHVzIGRlZmluaXRpb25zLi4uICovCisjZGVmaW5lCVBPUlRfSVNPUEVOCQkweDAxCQkJLyogUG9ydCBvcGVuID8gKi8KKyNkZWZpbmUJUE9SVF9IVVBDTAkJMHgwMgkJCS8qIEhhbmd1cCBvbiBjbG9zZT8gKi8KKyNkZWZpbmUJUE9SVF9NT1BFTlBFTkQJCTB4MDQJCQkvKiBNb2RlbSBvcGVuIHBlbmRpbmcgKi8KKyNkZWZpbmUJUE9SVF9JU1BBUkFMTEVMCQkweDA4CQkJLyogUGFyYWxsZWwgcG9ydCAqLworI2RlZmluZQlQT1JUX0JSRUFLCQkweDEwCQkJLyogUG9ydCBvbiBicmVhayAqLworI2RlZmluZQlQT1JUX1NUQVRVU1BFTkQJCTAwMjAJCQkvKiBTdGF0dXMgcGFja2V0IHBlbmRpbmcgKi8KKyNkZWZpbmUJUE9SVF9CUkVBS1BFTkQJCTB4NDAJCQkvKiBCcmVhayBwYWNrZXQgcGVuZGluZyAqLworI2RlZmluZQlQT1JUX01PREVNUEVORAkJMHg4MAkJCS8qIE1vZGVtIHN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgaXMgc2VudCBpbiByZXNwb25zZSB0byBhbGwgcG9ydCBJL08gY29udHJvbCBjb21tYW5kCisgICBwYWNrZXRzLCBleGNlcHQgTUVNRFVNUCBhbmQgUkVBRF9SRUdJU1RFUi4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX01vZGVtU3RhdHVzCQkoUEtUX0RhdGErMykJCS8qIE1vZGVtIHNpZ25hbCBzdGF0dXMgKi8KKyNkZWZpbmUJUEtUX1BvcnRTdGF0dXMJCShQS1RfRGF0YSs0KQkJLyogUG9ydCBzaWduYWwgc3RhdHVzICovCisjaWYgMAorI2RlZmluZQlQS1RfU3ViQ21kCQkoUEtUX0RhdGErNSkJCS8qIFN1YiBDb21tYW5kICovCisjZW5kaWYKKworLyogTW9kZW1TdGF0dXMgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJTU9ERU1fRFNSCQkweDgwCQkJLyogRGF0YSBTZXQgUmVhZHkgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fQ1RTCQkweDQwCQkJLyogQ2xlYXIgVG8gU2VuZCBtb2RlbSBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9SSQkJMHgyMAkJCS8qIFJpbmcgSW5kaWNhdGUgbW9kZW0gc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fQ0QJCTB4MTAJCQkvKiBDYXJyaWVyIERldGVjdCBtb2RlbSBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9UU1RPUAkJMHgwOAkJCS8qIFRyYW5zbWl0IFN0b3BwZWQgc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fVEVNUFRZCQkweDA0CQkJLyogVHJhbnNtaXQgRW1wdHkgc3RhdGUgKi8KKyNkZWZpbmUJTU9ERU1fRFRSCQkweDAyCQkJLyogRFRSIG1vZGVtIG91dHB1dCBzdGF0ZSAqLworI2RlZmluZQlNT0RFTV9SVFMJCTB4MDEJCQkvKiBSVFMgbW9kZW0gb3V0cHV0IHN0YXRlICovCisKKy8qIFBvcnRTdGF0dXMgZGVmaW5pdGlvbnMuLi4gKi8KKyNkZWZpbmUJUE9SVF9JU09QRU4JCTB4MDEJCQkvKiBQb3J0IG9wZW4gPyAqLworI2RlZmluZQlQT1JUX0hVUENMCQkweDAyCQkJLyogSGFuZ3VwIG9uIGNsb3NlPyAqLworI2RlZmluZQlQT1JUX01PUEVOUEVORAkJMHgwNAkJCS8qIE1vZGVtIG9wZW4gcGVuZGluZyAqLworI2RlZmluZQlQT1JUX0lTUEFSQUxMRUwJCTB4MDgJCQkvKiBQYXJhbGxlbCBwb3J0ICovCisjZGVmaW5lCVBPUlRfQlJFQUsJCTB4MTAJCQkvKiBQb3J0IG9uIGJyZWFrICovCisjZGVmaW5lCVBPUlRfU1RBVFVTUEVORAkJMDAyMAkJCS8qIFN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLworI2RlZmluZQlQT1JUX0JSRUFLUEVORAkJMHg0MAkJCS8qIEJyZWFrIHBhY2tldCBwZW5kaW5nICovCisjZGVmaW5lCVBPUlRfTU9ERU1QRU5ECQkweDgwCQkJLyogTW9kZW0gc3RhdHVzIHBhY2tldCBwZW5kaW5nICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgLSBNRU1EVU1QICAgKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAtIE1FTURVTVAgaXMgc2VudCBhcyBhbiBhY2tub3dsZWRnZW1lbnQgZm9yIGEgTUVNRFVNUAorICAgcG9ydCBJL08gY29udHJvbCBjb21tYW5kIHBhY2tldC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZGVmaW5lCVBLVF9Nb2RlbVN0YXR1cwkJKFBLVF9EYXRhKzMpCQkvKiBNb2RlbSBzaWduYWwgc3RhdHVzICovCisjZGVmaW5lCVBLVF9Qb3J0U3RhdHVzCQkoUEtUX0RhdGErNCkJCS8qIFBvcnQgc2lnbmFsIHN0YXR1cyAqLworI2RlZmluZQlQS1RfU3ViQ21kCQkoUEtUX0RhdGErNSkJCS8qIFN1YiBDb21tYW5kICovCisjZGVmaW5lCVBLVF9BZGRyZXNzCQkoUEtUX0RhdGErNikJCS8qIFJlcXVlc3RlZCBhZGRyZXNzICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0R1bXAJCShQS1RfRGF0YSs4KQkJLyogMzJieXRlcyBvZiByZXF1ZXN0ZWQgZHVtcCBkYXRhICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgLSBSRUFEX1JFR0lTVEVSICAgKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAtIFJFQURfUkVHSVNURVIgaXMgc2VudCBhcyBhbiBhY2tub3dsZWRnZW1lbnQgZm9yIGEKKyAgIFJFQURfUkVHSVNURVIgcG9ydCBJL08gY29udHJvbCBjb21tYW5kIHBhY2tldC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKkNvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qUG9ydCBudW1iZXIgd3J0IFJUQSAqLworI2RlZmluZQlQS1RfQ21kMgkJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIGNvZGUgY29weSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9SZWdpc3RlclZhbHVlCShQS1RfRGF0YSszKQkJLyogTW9kZW0gc2lnbmFsIHN0YXR1cyAqLworI2lmIDAKKyNkZWZpbmUJUEtUX1BvcnRTdGF0dXMJCShQS1RfRGF0YSs0KQkJLyogUG9ydCBzaWduYWwgc3RhdHVzICovCisjZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBCUkVBS19SRUNFSVZFRCAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIENPTU1BTkRfUlVQIC0gQlJFQUtfUkVDRUlWRUQgcGFja2V0cyBhcmUgc2VudCB3aGVuIHRoZSBwb3J0IGRldGVjdHMgYSByZWNlaXZlIEJSRUFLIHNpZ25hbC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCisjZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gTU9ERU1fU1RBVFVTICAgKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBDT01NQU5EX1JVUCAtIE1PREVNX1NUQVRVUyBwYWNrZXRzIGFyZSBzZW50IHdoZW5ldmVyIHRoZSBwb3J0IGRldGVjdHMgYQorICAgY2hhbmdlIGluIHRoZSBpbnB1dCBtb2RlbSBzaWduYWwgc3RhdGVzLgorCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLworI2RlZmluZQlQS1RfQ21kMgkJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIGNvZGUgY29weSAqLworI2RlZmluZQlQS1RfTW9kZW1TdGF0dXMJCShQS1RfRGF0YSszKQkJLyogTW9kZW0gc2lnbmFsIHN0YXR1cyAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIEJPT1RfUkVRVUVTVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgQk9PVF9SVVAgLSBCT09UX1JFUVVFU1QgcGFja2V0cyBhcmUgc2VudCB0byB0aGUgRHJpdmVyIGZyb20gUklPIHRvIHJlcXVlc3QKKyAgIGZpcm13YXJlIGNvZGUgdG8gbG9hZCBvbnRvIGF0dGFjaGVkIFJUQXMuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gQk9PVF9TRVFVRU5DRSAgICoqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIEJPT1RfU0VRVUVOQ0UgcGFja2V0cyBhcmUgc2VudCBmcm9tIHRoZSBEcml2ZXIgdG8gUklPIGluIHJlc3BvbnNlCisgICB0byBhIEJPT1RfUlVQIC0gQk9PVF9SRVFVRVNUIHBhY2tldC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfTnVtUGFja2V0cwkJKFBLVF9EYXRhKzIpCQkvKiBQYWNrZXRzIHJlcXVpcmVkIHRvIGxvYWQgZmlybXdhcmUgKi8KKyNkZWZpbmUJUEtUX0xvYWRCYXNlCQkoUEtUX0RhdGErNCkJCS8qIFJUQSBmaXJtd2FyZSBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUJUEtUX0NvZGVTaXplCQkoUEtUX0RhdGErNikJCS8qIFNpemUgb2YgZmlybXdhcmUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUJUEtUX0NtZFN0cmluZwkJKFBLVF9EYXRhKzgpCQkvKiBDb21tYW5kIHN0cmluZyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBCT09UX0NPTVBMRVRFRCAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCisKKyAgIEJPT1RfUlVQIC0gQk9PVF9DT01QTEVURSBpcyBzZW50IHRvIHRoZSBEcml2ZXIgZnJvbSBSSU8gd2hlbiBkb3dubG9hZGluZyBvZgorICAgUlRBIGZpcm13YXJlIGhhcyBjb21wbGV0ZWQuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0xpbmtOdW1iZXIJCShQS1RfRGF0YSsxKQkJLyogTGluayBudW1iZXIgUlRBIGJvb3RlZCBvbiAqLworI2RlZmluZQlQS1RfU2VyaWFsTnVtYmVyCShQS1RfRGF0YSsyKQkJLyogNCBieXRlIHNlcmlhbCBudW1iZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gUGFja2V0IFJlcXVlc3QgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCBwYWNrZXQgd2l0aG91dCB0aGUgUEtUX0NNRF9CSVQgc2V0IGluIHRoZSBQS1QtPmxlbiBmaWVsZCBpcyBzZW50CisgICBmcm9tIFJJTyB0byB0aGUgRHJpdmVyIGFzIGEgcmVxdWVzdCBmb3IgYSBmaXJtd2FyZSBib290IHBhY2tldC4gKi8KKworI2RlZmluZQlQS1RfU2VxdWVuY2VOdW1iZXIJKFBLVF9EYXRhKzApCQkvKiBQYWNrZXQgc2VxdWVuY2UgbnVtYmVyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gUGFja2V0IFJlc3BvbnNlICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgSW4gcmVzcG9uc2UgdG8gYSBCT09UX1JVUCBib290IHBhY2tldCByZXF1ZXN0LCB0aGUgZHJpdmVyIGZpbGxzIG91dCB0aGUgcmVzcG9uc2UKKyAgIHBhY2tldCB3aXRoIHRoZSA3MCBieXRlcyBvZiB0aGUgcmVxdWVzdGVkIHNlcXVlbmNlLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9TZXF1ZW5jZU51bWJlcgkoUEtUX0RhdGErMCkJCS8qIFBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfRmlybXdhcmVQYWNrZXQJKFBLVF9EYXRhKzIpCQkvKiBGaXJtd2FyZSBwYWNrZXQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIElGT0FEICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIElGT0FEIHBhY2tldHMgYXJlIHNlbnQgZnJvbSB0aGUgRHJpdmVyIHRvIGFuIFJUQSB0byBjYXVzZSB0aGUKKyAgIFJUQSB0byBzaHV0IGRvd24gYW5kIHJlYm9vdC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfSWZvYWRJZDEJCShQS1RfRGF0YSsyKQkJLyogSUZPQUQgSWQgMSAqLworI2RlZmluZQlQS1RfSWZvYWRJZDIJCShQS1RfRGF0YSszKQkJLyogSUZPQUQgSWQgMiAqLworCisjZGVmaW5lCUlGT0FESUQxCQkweEFECisjZGVmaW5lCUlGT0FESUQyCQkweEYwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gSURFTlRJRlkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgQk9PVF9SVVAgLSBJREVOVElGWSBwYWNrZXRzIGFyZSBzZW50IGZyb20gdGhlIERyaXZlciB0byBhbiBSVEEgdG8gY2F1c2UgdGhlCisgICBSVEEgdG8gZmxhc2ggaXRzIExFRHMgZm9yIGEgcGVyaW9kIG9mIHRpbWUuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0lkZW50aWZ5SWQJCShQS1RfRGF0YSsyKQkJLyogZGVmaW5lcyBwYXR0ZXJuIHRvIGZsYXNoICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBaT01CSUUgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgQk9PVF9SVVAgLSBaT01CSUUgcGFja2V0cyBhcmUgc2VudCBmcm9tIHRoZSBEcml2ZXIgdG8gYW4gUlRBIHRvIGNhdXNlIHRoZQorICAgUlRBIHRvIHNodXQgZG93biBhbmQgZmxhc2ggaXQncyBMRURzLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9ab21iaWVJZDEJCShQS1RfRGF0YSsyKQkJLyogWk9NQklFIElkIDEgKi8KKyNkZWZpbmUJUEtUX1pvbWJpZUlkMgkJKFBLVF9EYXRhKzMpCQkvKiBaT01CSUUgSWQgMiAqLworCisjZGVmaW5lCVpPTUJJRUlEMQkJMHg1MgorI2RlZmluZQlaT01CSUVJRDIJCTB4MjEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIFVGT0FEICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQorCisgICBCT09UX1JVUCAtIFVGT0FEIHBhY2tldHMgYXJlIHNlbnQgZnJvbSB0aGUgRHJpdmVyIHRvIGFuIFJUQSB0byBjYXVzZSB0aGUgUlRBCisgICB0byBhc2sgaXQncyBuZWlnaGJvdXJpbmcgUlRBIHRvIHNodXQgZG93biBhbmQgcmVib290LgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2RlZmluZQlQS1RfTGlua051bWJlcgkJKFBLVF9EYXRhKzEpCQkvKiBMaW5rIG51bWJlciBvZiBSVEEgdG8gVUZPQUQgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfVWZvYWRJZDEJCShQS1RfRGF0YSsyKQkJLyogVUZPQUQgSWQgMSAqLworI2RlZmluZQlQS1RfVWZvYWRJZDIJCShQS1RfRGF0YSszKQkJLyogVUZPQUQgSWQgMiAqLworCisjZGVmaW5lCVVGT0FESUQxCQkweDFFCisjZGVmaW5lCVVGT0FESUQyCQkweDBECisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBJV0FJVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgQk9PVF9SVVAgLSBJV0FJVCBwYWNrZXRzIGFyZSBzZW50IGZyb20gdGhlIERyaXZlciB0byBhbiBSVEEgdG8gY2F1c2UgdGhlIFJUQQorICAgdG8gcGF1c2UgYm9vdGluZyBvbiB0aGUgc3BlY2lmaWVkIGxpbmsgZm9yIDMwIHNlY29uZHMuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZGVmaW5lCVBLVF9MaW5rTnVtYmVyCQkoUEtUX0RhdGErMSkJCS8qIExpbmsgbnVtYmVyIG9mIFJUQSB0byBVRk9BRCAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9Jd2FpdElkMQkJKFBLVF9EYXRhKzIpCQkvKiBJV0FJVCBJZCAxICovCisjZGVmaW5lCVBLVF9Jd2FpdElkMgkJKFBLVF9EYXRhKzMpCQkvKiBJV0FJVCBJZCAyICovCisKKyNkZWZpbmUJSVdBSVRJRDEJCTB4REUKKyNkZWZpbmUJSVdBSVRJRDIJCTB4QjEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiAgIFJPVVRFX1JVUCAtIFJPVVRFX1JFUVVFU1QgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQorCisgICBST1VURV9SVVAgLSBST1VURV9SRVFVRVNUIHBhY2tldHMgYXJlIHNlbnQgZnJvbSBhIG5ld2x5IGJvb3RlZCBvciBjb25uZWN0ZWQKKyAgIFJUQSB0byBhIERyaXZlciB0byByZXF1ZXN0IGFuIElEIChSVVAgb3IgdW5pdCBudW1iZXIpLgorICAgKi8KKyNpZiAwCisjZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLworI2VuZGlmCisjZGVmaW5lCVBLVF9TZXJpYWxOdW1iZXIJKFBLVF9EYXRhKzIpCQkvKiA0IGJ5dGUgc2VyaWFsIG51bWJlciAqLworI2RlZmluZQlQS1RfTW9kdWxlVHlwZXMJCShQS1RfRGF0YSs2KQkJLyogUlRBIE1vZHVsZSB0eXBlcyAqLworCisvKiBNb2R1bGVUeXBlcyBkZWZpbml0aW9ucy4uLiAqLworI2RlZmluZQlNT0RfQkxBTksJCTB4MEYJCQkvKiBCbGFuayBwbGF0ZSBhdHRhY2hlZCAqLworI2RlZmluZQlNT0RfUlMyMzJEQjI1CQkweDAwCQkJLyogUlMyMzIgREIyNSBjb25uZWN0b3IgKi8KKyNkZWZpbmUJTU9EX1JTMjMyUko0NQkJMHgwMQkJCS8qIFJTMjMyIFJKNDUgY29ubmVjdG9yICovCisjZGVmaW5lCU1PRF9SUzQyMkRCMjUJCTB4MDIJCQkvKiBSUzQyMiBEQjI1IGNvbm5lY3RvciAqLworI2RlZmluZQlNT0RfUlM0ODVEQjI1CQkweDAzCQkJLyogUlM0ODUgREIyNSBjb25uZWN0b3IgKi8KKyNkZWZpbmUJTU9EX1BBUkFMTEVMCQkweDA0CQkJLyogQ2VudHJvbmljcyBwYXJhbGxlbCAqLworCisjZGVmaW5lCU1PRDIJCQkweDA4CQkJLyogU2V0IHRvIGluZGljYXRlIFJldjIgbW9kdWxlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqICAgUk9VVEVfUlVQIC0gUk9VVEVfRk9BRCAgICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKKworICAgUk9VVEVfUlVQIC0gUk9VVEVfRk9BRCBwYWNrZXQgaXMgc2VudCBhcyBhIHJlc3BvbnNlIHRvIGEgUk9VVEVfUlVQIC0gUk9VVEVfUkVRVUVTVAorICAgcGFja2V0IHRvIGNhdXNlIHRoZSBSVEEgdG8gIkZhbGwgT3ZlciBBbmQgRGllIi4sIGkuZS4gc2h1dGRvd24gYW5kIHJlYm9vdC4KKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfUm91dGVDbWRTdHJpbmcJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIHN0cmluZyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICBST1VURV9SVVAgLSBST1VURV9BTExPQ0FURSAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCisKKyAgIFJPVVRFX1JVUCAtIFJPVVRFX0FMTE9DQVRFIHBhY2tldCBpcyBzZW50IGFzIGEgcmVzcG9uc2UgdG8gYSBST1VURV9SVVAgLSBST1VURV9SRVFVRVNUCisgICBwYWNrZXQgdG8gYWxsb2NhdGUgdGhlIFJUQSdzIElkIG51bWJlciAoUlVQIG51bWJlciAxLi4xNikKKyAgICovCisjaWYgMAorI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfSWROdW0JCShQS1RfRGF0YSsxKQkJLyogUlVQIG51bWJlciBmb3IgcG9ydHMgMS4uOCAqLworI2lmIDAKKyNkZWZpbmUJUEtUX1JvdXRlQ21kU3RyaW5nCShQS1RfRGF0YSsyKQkJLyogQ29tbWFuZCBzdHJpbmcgKi8KKyNlbmRpZgorI2RlZmluZQlQS1RfSWROdW0yCQkoUEtUX0RhdGErMHgxNykJCS8qIFJVUCBudW1iZXIgZm9yIHBvcnRzIDkuLjE2ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKiAgIFJPVVRFX1JVUCAtIFJPVVRFX1RPUE9MT0dZICAgKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKKworICAgUk9VVEVfUlVQIC0gUk9VVEVfVE9QT0xPR1kgcGFja2V0IGlzIHNlbnQgdG8gaW5mb3JtIHRoZSBkcml2ZXIgb2YgYW4gUlRBJ3MKKyAgIGN1cnJlbnQgbGluayBzdGF0dXMuCisgICAqLworI2lmIDAKKyNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCisjZW5kaWYKKyNkZWZpbmUJUEtUX0xpbmsxUnVwCQkoUEtUX0RhdGErMikJCS8qIExpbmsgMSBSVVAgbnVtYmVyICovCisjZGVmaW5lCVBLVF9MaW5rMUxpbmsJCShQS1RfRGF0YSszKQkJLyogTGluayAxIGxpbmsgbnVtYmVyICovCisjZGVmaW5lCVBLVF9MaW5rMlJ1cAkJKFBLVF9EYXRhKzQpCQkvKiBMaW5rIDIgUlVQIG51bWJlciAqLworI2RlZmluZQlQS1RfTGluazJMaW5rCQkoUEtUX0RhdGErNSkJCS8qIExpbmsgMiBsaW5rIG51bWJlciAqLworI2RlZmluZQlQS1RfTGluazNSdXAJCShQS1RfRGF0YSs2KQkJLyogTGluayAzIFJVUCBudW1iZXIgKi8KKyNkZWZpbmUJUEtUX0xpbmszTGluawkJKFBLVF9EYXRhKzcpCQkvKiBMaW5rIDMgbGluayBudW1iZXIgKi8KKyNkZWZpbmUJUEtUX0xpbms0UnVwCQkoUEtUX0RhdGErOCkJCS8qIExpbmsgNCBSVVAgbnVtYmVyICovCisjZGVmaW5lCVBLVF9MaW5rNExpbmsJCShQS1RfRGF0YSs5KQkJLyogTGluayA0IGxpbmsgbnVtYmVyICovCisjZGVmaW5lCVBLVF9SdGFWcGRQcm9tCQkoUEtUX0RhdGErMTApCQkvKiAzMiBieXRlcyBvZiBSVEEgVlBEIFBST00gQ29udGVudHMgKi8KKworI2VuZGlmCQkJCQkJLyogX3N4d2luaWZfaCAqLworCisvKiBFbmQgb2YgUklPV0lOSUYuSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaXNjb3MuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlzY29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4NWNjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlzY29zLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4CisqKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKglNb2R1bGUJCTogcmlzY29zLmgKKyoqCVNJRAkJOiAxLjIKKyoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjE5CisqKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIyCisqKgorKiogIGlkZW50IEAoIylyaXNjb3MuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19yaXNjb3NfaF9fCisjZGVmaW5lIF9fcmlvX3Jpc2Nvc19oX18KKworI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpc2Nvc19oX3NjY3NfID0gIkAoIylyaXNjb3MuaAkxLjIiOworI2VuZGlmCisKKy8qCisqKiBUaGlzIG1vZHVsZSB1c2VkIHRvIGRlZmluZSBhbGwgdGhvc2UgbGl0dGxlIGl0c3kgYml0cyByZXF1aXJlZCBmb3IgUklTQy9PUworKiogbm93IGl0J3MgZnVsbCBvZiBudWxsIG1hY3Jvcy4KKyovCisKKy8qCisqKglSQllURSByZWFkcyBhIGJ5dGUgZnJvbSBhIGxvY2F0aW9uLgorKioJUldPUkQgcmVhZHMgYSB3b3JkIGZyb20gYSBsb2NhdGlvbi4KKyoqCVdCWVRFIHdyaXRlcyBhIGJ5dGUgdG8gYSBsb2NhdGlvbi4KKyoqCVdXT1JEIHdyaXRlcyBhIHdvcmQgdG8gYSBsb2NhdGlvbi4KKyoqCVJJTkRXIHJlYWRzIGEgd29yZCB0aHJvdWdoIGEgcG9pbnRlci4KKyoqCVdJTkRXIHdyaXRlcyBhIHdvcmQgdGhyb3VnaCBhIHBvaW50ZXIuCisqKglSSU9TV0FCIHN3YXBzIHRoZSB0d28gYnl0ZXMgb2YgYSB3b3JkLCBpZiBuZWVkZWQuCisqLworCisjZGVmaW5lCVJJT1NXQUIoTikgICAgICAoTikKKyNkZWZpbmUJV0JZVEUoQSxWKQkoQSk9KHVjaGFyKShWKQorI2RlZmluZSBXV09SRChBLFYpCShBKT0odXNob3J0KShWKQorI2RlZmluZSBSQllURShBKQkodWNoYXIpKEEpCisjZGVmaW5lIFJXT1JEKEEpCSh1c2hvcnQpKEEpCisjZGVmaW5lIFJJTkRXKEEpCSgqKHVzaG9ydCAqKShBKSkKKyNkZWZpbmUgV0lORFcoQSxWKQkoKih1c2hvcnQgKikoQSk9KHVzaG9ydCkoVikpCisKKyNlbmRpZiAvKiBfX3Jpb19yaXNjb3NfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3JvbS5oIGIvZHJpdmVycy9jaGFyL3Jpby9yb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc5YjhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yb20uaApAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIFIgTyBNCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9yb21faAorI2RlZmluZSBfcm9tX2ggMQorCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTCitzdGF0aWMgY2hhciAqX3Jpb19yb21faF9zY2NzID0gIkAoIylyb20uaAkxLjEiIDsKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0ICBST00gIFJPTSA7CitzdHJ1Y3QgIFJPTSAgeworICAgICAgICAgICAgICAgICB1X3Nob3J0ICAgIHNseCA7CisgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgcGNiX2xldHRlcl9yZXYgOworICAgICAgICAgICAgICAgICBjaGFyICAgICAgIHBjYl9udW1iZXJfcmV2IDsKKyAgICAgICAgICAgICAgICAgY2hhciAgICAgICBzZXJpYWxbNF0gOworICAgICAgICAgICAgICAgICBjaGFyICAgICAgIHllYXIgOworICAgICAgICAgICAgICAgICBjaGFyICAgICAgIHdlZWsgOworICAgICAgICAgICAgIH0gOworCisjZW5kaWYKKworI2RlZmluZSBIT1NUX1JPTSAgICAoUk9NICopIDB4N2MwMAorI2RlZmluZSBSVEFfUk9NCSAgICAoUk9NICopIDB4NzgwMQorI2RlZmluZSBST01fTEVOR1RIICAweDIwCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3JvdXRlLmggYi9kcml2ZXJzL2NoYXIvcmlvL3JvdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyZGJiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcm91dGUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgUiBPIFUgVCBFICAgICBIIEUgQSBEIEUgUgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfcm91dGVfaAorI2RlZmluZSBfcm91dGVfaAorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcm91dGVfaF9zY2NzID0gIkAoIylyb3V0ZS5oCTEuMyI7ICovCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9MSU5LUyA0CisjZGVmaW5lIE1BWF9OT0RFUyAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBub2RlcyBpbiBhIHN1Ym5ldCAqLworI2RlZmluZSBOT0RFX0JZVEVTICgoTUFYX05PREVTIC8gOCkgKyAxKSAgICAgIC8qIE51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBiaXQgcGVyIG5vZGUgKi8KKyNkZWZpbmUgUk9VVEVfREFUQV9TSVpFICAoTk9ERV9CWVRFUyArIDIpICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgZm9yIGNvbXBsZXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gYWJvdXQgY29zdCBldGMuICovCisjZGVmaW5lIFJPVVRFU19QRVJfUEFDS0VUICgoUEtUX01BWF9EQVRBX0xFTiAtMikvIFJPVVRFX0RBVEFfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygbm9kZXMgd2UgY2FuIHNxdWVlemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIG9uZSBwYWNrZXQgKi8KKyNkZWZpbmUgTUFYX1RPUE9MT0dZX1BBQ0tFVFMgKE1BWF9OT0RFUyAvIFJPVVRFU19QRVJfUEFDS0VUICsgMSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZSB0aGUgdHlwZXMgb2YgY29tbWFuZCBmb3IgdGhlIFJPVVRFIFJVUC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJPVVRFX1JFUVVFU1QgICAgMCAgICAgICAgICAgICAgICAgICAgLyogUmVxdWVzdCBhbiBJRCAqLworI2RlZmluZSBST1VURV9GT0FEICAgICAgIDEgICAgICAgICAgICAgICAgICAgIC8qIEtpbGwgdGhlIFJUQSAqLworI2RlZmluZSBST1VURV9BTFJFQURZICAgIDIgICAgICAgICAgICAgICAgICAgIC8qIElEIGdpdmVuIGFscmVhZHkgKi8KKyNkZWZpbmUgUk9VVEVfVVNFRCAgICAgICAzICAgICAgICAgICAgICAgICAgICAvKiBBbGwgSUQncyB1c2VkICovCisjZGVmaW5lIFJPVVRFX0FMTE9DQVRFICAgNCAgICAgICAgICAgICAgICAgICAgLyogSGVyZSBpdCBpcyAqLworI2RlZmluZSBST1VURV9SRVFfVE9QICAgIDUgICAgICAgICAgICAgICAgICAgIC8qIEkgYmV0IHlvdSBkaWRuJ3QgZXhwZWN0Li4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBUb3BvbG9naWNhbCBJbnF1aXNpdGlvbiAqLworI2RlZmluZSBST1VURV9UT1BPTE9HWSAgIDYgICAgICAgICAgICAgICAgICAgIC8qIFRvcG9sb2d5IHJlcXVlc3QgYW5zd2VyZWQgRkQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWZpbmUgdGhlIFJvdXRlIE1hcCBTdHJ1Y3R1cmUKKyAqCisgKiBUaGUgcm91dGUgbWFwIGdpdmVzIGEgcG9pbnRlciB0byBhIExpbmsgU3RydWN0dXJlIHRvIHVzZS4KKyAqIFRoaXMgYWxsb3dzIERpc2Nvbm5lY3RlZCBMaW5rcyB0byBiZSBjaGVja2VkIHF1aWNrbHkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBDT1NUX1JPVVRFIENPU1RfUk9VVEU7CitzdHJ1Y3QgQ09TVF9ST1VURSB7CisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjb3N0OyAgICAgICAgLyogQ29zdCBkb3duIHRoaXMgbGluayAqLworICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcm91dGVbTk9ERV9CWVRFU107IC8qIE5vZGVzIHRob3JvdWdoIHRoaXMgcm91dGUgKi8KKyAgICAgICAgICAgICAgICAgIH0gOworCit0eXBlZGVmIHN0cnVjdCBST1VURV9TVFIgUk9VVEVfU1RSIDsKK3N0cnVjdCAgUk9VVEVfU1RSIHsKKyAgICAgICAgICAgICAgICAgICAgICBDT1NUX1JPVVRFIGNvc3Rfcm91dGVbTUFYX0xJTktTXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvc3QgLyByb3V0ZSBmb3IgdGhpcyBsaW5rICovCisgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGZhdm91cmVkOyAgICAgICAgICAvKiBmYXZvdXJlZCBsaW5rICovCisgICAgICAgICAgICAgICAgICB9IDsKKworCisjZGVmaW5lIE5PX0xJTksgICAgICAgICAgICAoc2hvcnQpIDUgICAgICAvKiBMaW5rIHVuYXR0YWNoZWQgKi8KKyNkZWZpbmUgUk9VVEVfTk9fSUQgICAgICAgIChzaG9ydCkgMTAwICAgIC8qIE5vIElkICovCisjZGVmaW5lIFJPVVRFX0RJU0NPTk5FQ1QgICAodXNob3J0KSAweGZmICAvKiBOb3QgY29ubmVjdGVkICovCisjZGVmaW5lIFJPVVRFX0lOVEVSQ09OTkVDVCAodXNob3J0KSAweDQwICAvKiBTdWItbmV0IGludGVyY29ubmVjdCAqLworCisKKyNkZWZpbmUgU1lOQ19SVVAgICAgICAgICAodXNob3J0KSAyNTUKKyNkZWZpbmUgQ09NTUFORF9SVVAgICAgICAodXNob3J0KSAyNTQKKyNkZWZpbmUgRVJST1JfUlVQICAgICAgICAodXNob3J0KSAyNTMKKyNkZWZpbmUgUE9MTF9SVVAgICAgICAgICAodXNob3J0KSAyNTIKKyNkZWZpbmUgQk9PVF9SVVAgICAgICAgICAodXNob3J0KSAyNTEKKyNkZWZpbmUgUk9VVEVfUlVQICAgICAgICAodXNob3J0KSAyNTAKKyNkZWZpbmUgU1RBVFVTX1JVUCAgICAgICAodXNob3J0KSAyNDkKKyNkZWZpbmUgUE9XRVJfUlVQICAgICAgICAodXNob3J0KSAyNDgKKworI2RlZmluZSBISUdIRVNUX1JVUCAgICAgICh1c2hvcnQpIDI1NSAgIC8qIFNldCB0byBUb3Agb25lICovCisjZGVmaW5lIExPV0VTVF9SVVAgICAgICAgKHVzaG9ydCkgMjQ4ICAgLyogU2V0IHRvIGJvdHRvbSBvbmUgKi8KKworI2VuZGlmCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ydGFody5oIGIvZHJpdmVycy9jaGFyL3Jpby9ydGFody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ODYwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3J0YWh3LmgKQEAgLTAsMCArMSw3NSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqICAgICAgICAgICAgICAgIFIgVCBBICAgIEggQSBSIEQgVyBBIFIgRQorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBsaW50CisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfcmlvX3J0YWh3X2hfc2NjcyA9ICJAKCMpcnRhaHcuaAkxLjUiIDsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUJV0FUQ0hET0dfQUREUgkoKHVuc2lnbmVkIHNob3J0ICopMHg3YTAwKQorI2RlZmluZSBSVEFfTEVEX0FERFIJKCh1bnNpZ25lZCBzaG9ydCAqKTB4N2MwMCkKKyNkZWZpbmUgU0VSSUFMTlVNX0FERFIJKCh1bnNpZ25lZCBjaGFyICopMHg3ODA5KQorI2RlZmluZSBMQVRDSF9BRERSICAgICAgKCh1bnNpZ25lZCBjaGFyICopMHg3ODAwKQorCisvKgorKiogSGVyZSB3ZSBkZWZpbmUgd2hlcmUgdGhlIGNkMTQwMCBjaGlwcyBhcmUgaW4gbWVtb3J5LgorKi8KKyNkZWZpbmUgQ0QxNDAwX09ORV9BRERSCQkoMHg3MzAwKQorI2RlZmluZSBDRDE0MDBfVFdPX0FERFIJCSgweDcyMDApCisjZGVmaW5lIENEMTQwMF9USFJFRV9BRERSCSgweDcxMDApCisjZGVmaW5lIENEMTQwMF9GT1VSX0FERFIJKDB4NzAwMCkKKworLyoKKyoqIERlZmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIG1vZHVsZXMgd2UgY2FuIGhhdmUKKyovCitlbnVtIG1vZHVsZSB7CisgICAgTU9EX0JMQU5LCQk9IDB4MGYsCQkvKiBCbGFuayBwbGF0ZSBhdHRhY2hlZCAqLworICAgIE1PRF9SUzIzMkRCMjUJPSAweDAwLAkJLyogUlMyMzIgREIyNSBjb25uZWN0b3IgKi8KKyAgICBNT0RfUlMyMzJSSjQ1CT0gMHgwMSwJCS8qIFJTMjMyIFJKNDUgY29ubmVjdG9yICovCisgICAgTU9EX1JTNDIyREIyNQk9IDB4MDIsCQkvKiBSUzQyMiBEQjI1IGNvbm5lY3RvciAqLworICAgIE1PRF9SUzQ4NURCMjUJPSAweDAzLAkJLyogUlM0ODUgREIyNSBjb25uZWN0b3IgKi8KKyAgICBNT0RfUEFSQUxMRUwJPSAweDA0CQkvKiBDZW50cm9uaWNzIHBhcmFsbGVsICovCit9OworCisjZGVmaW5lIFRZUEVfSE9TVAkwCisjZGVmaW5lIFRZUEVfUlRBOAkxCisjZGVmaW5lIFRZUEVfUlRBMTYJMgorCisjZGVmaW5lCVdBVENIX0RPRwlXQVRDSERPR19BRERSCisKKy8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcnVwLmggYi9kcml2ZXJzL2NoYXIvcmlvL3J1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDJiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3J1cC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICBSIFUgUCAgIFMgVCBSIFUgQyBUIFUgUiBFCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9ydXBfaAorI2RlZmluZSBfcnVwX2ggMQorCisjaWZkZWYgU0NDU19MQUJFTFMKKyNpZm5kZWYgbGludAorLyogc3RhdGljIGNoYXIgKl9yaW9fcnVwX2hfc2NjcyA9ICJAKCMpcnVwLmgJMS41IjsgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBIT1NUICkgfHwgZGVmaW5lZCggSU5LRVJORUwgKQorI2RlZmluZSBNQVhfUlVQICAgICAgICAgICgoc2hvcnQpIDE2KSAKKyNlbmRpZgorI2lmZGVmIFJUQQorI2RlZmluZSBNQVhfUlVQICAgICAgICAgICgoc2hvcnQpIDEpCisjZW5kaWYKKworI2RlZmluZSBQS1RTX1BFUl9SVVAgICAgICgoc2hvcnQpIDIpICAgICAvKiBUaGV5IGFyZSBhbHdheXMgdXNlZCBpbiBwYWlycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lIGFsbCB0aGUgIHBhY2tldCByZXF1ZXN0IHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUWF9SVVBfSU5BQ1RJVkUgICAgICAgICAgMCAgICAgICAgLyogTm90aGluZyB0byB0cmFuc21pdCAqLworI2RlZmluZSBUWF9QQUNLRVRfUkVBRFkgICAgICAgICAgMSAgICAgICAgLyogVHJhbnNtaXQgcGFja2V0IHJlYWR5ICovCisjZGVmaW5lIFRYX0xPQ0tfUlVQICAgICAgICAgICAgICAyICAgICAgICAvKiBUcmFuc21pdCBzaWRlIGxvY2tlZCAqLworCisjZGVmaW5lIFJYX1JVUF9JTkFDVElWRSAgICAgICAgICAwICAgICAgICAvKiBOb3RoaW5nIHJlY2VpdmVkICovCisjZGVmaW5lIFJYX1BBQ0tFVF9SRUFEWSAgICAgICAgICAxICAgICAgICAvKiBQYWNrZXQgcmVjZWl2ZWQgKi8KKworI2RlZmluZSBSVVBfTk9fT1dORVIgICAgICAgICAgICAgMHhmZiAgICAgLyogUlVQIG5vdCBvd25lZCBieSBhbnkgcHJvY2VzcyAqLworCitzdHJ1Y3QgUlVQIHsKKyAgICAgICAgICAgICBQS1RfcHRyICAgIHR4cGt0OyAgICAgICAgICAgIC8qIE91dGdvaW5nIHBhY2tldCAqLworICAgICAgICAgICAgIFBLVF9wdHIgICAgcnhwa3Q7ICAgICAgICAgICAgLyogSW5jb21pbmcgcGFja2V0ICovCisgICAgICAgICAgICAgV09SRCAgICAgICBsaW5rOyAgICAgICAgICAgICAvKiBXaGljaCBsaW5rIHRvIHNlbmQgZG93bj8gKi8KKyAgICAgICAgICAgICBCWVRFICAgICAgIHJ1cF9kZXN0X3VuaXRbMl07IC8qIERlc3RpbmF0aW9uIHVuaXQgKi8KKyAgICAgICAgICAgICBXT1JEICAgICAgIGhhbmRzaGFrZTsgICAgICAgIC8qIEZvciBoYW5kc2hha2luZyAqLworICAgICAgICAgICAgIFdPUkQgICAgICAgdGltZW91dDsgICAgICAgICAgLyogVGltZW91dCAqLworICAgICAgICAgICAgIFdPUkQgICAgICAgc3RhdHVzOyAgICAgICAgICAgLyogU3RhdHVzICovCisgICAgICAgICAgICAgV09SRCAgICAgICB0eGNvbnRyb2w7ICAgICAgICAvKiBUcmFuc21pdCBjb250cm9sICovCisgICAgICAgICAgICAgV09SRCAgICAgICByeGNvbnRyb2w7ICAgICAgICAvKiBSZWNlaXZlIGNvbnRyb2wgKi8KKyAgICAgICAgICAgfTsKKyAKKyNlbmRpZgorCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcnVwc3RhdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9ydXBzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhYWZhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcnVwc3RhdC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgUlVQU1RBVAorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSmVyZW15IFJvbGxzCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX3J1cHN0YXRfaAorI2RlZmluZSBfcnVwc3RhdF9oCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19ydXBzdGF0X2hfc2NjcyA9ICJAKCMpcnVwc3RhdC5oCTEuMSIgOworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSAgICBTVEFUVVNfU1lOQyAgICAwCisjZGVmaW5lICAgIFNUQVRVU19SRVFfVE9QIDEKKyNkZWZpbmUgICAgU1RBVFVTX1RPUE9MT0dZICAgIDIKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vc2FtLmggYi9kcml2ZXJzL2NoYXIvcmlvL3NhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWNjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3NhbS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgIFMgQSBNIC4gSAorICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBBdXRob3IgIDogSWFuIE5hbmRocmEKKyBEYXRlICAgIDoKKworICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyBWZXJzaW9uIDogMC4wMQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX3NhbV9oCisjZGVmaW5lIF9zYW1faCAxCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworI2lmbmRlZiBsaW50CisvKiBzdGF0aWMgY2hhciAqX3Jpb19zYW1faF9zY2NzID0gIkAoIylzYW0uaAkxLjMiOyAqLworI2VuZGlmCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoIEhPU1QgKSAmJiAhZGVmaW5lZCggSU5LRVJORUwgKQorI2RlZmluZSBSVEEgMQorI2VuZGlmCisKKyNkZWZpbmUgTlVNX0ZSRUVfTElTVF9VTklUUyAgICAgNTAwCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgKHNob3J0KSAgMHgwMAorI2VuZGlmCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgKHNob3J0KSAgIUZBTFNFCisjZW5kaWYKKworI2RlZmluZSBUWCAgICBUUlVFCisjZGVmaW5lIFJYICAgIEZBTFNFCisKKwordHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUIEZSRUVfTElTVCA7CitzdHJ1Y3QgRlJFRV9MSVNUICAgeworICAgICAgICAgICAgICAgICAgICAgICBGUkVFX0xJU1RfcHRyIG5leHQgOworICAgICAgICAgICAgICAgICAgICAgICBGUkVFX0xJU1RfcHRyIHByZXYgOworICAgICAgICAgICAgICAgICAgIH0gOworCisKKyNlbmRpZgorLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9zZWxmdGVzdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9zZWxmdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWU0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3NlbGZ0ZXN0LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyoqIEZpbGU6CQlzZWxmdGVzdC5oCisqKgorKiogQXV0aG9yOgkJRGF2aWQgRGl4CisqKgorKiogQ3JlYXRlZDoJCTE1dGggTWFyY2ggMTk5MworKioKKyoqIExhc3QgbW9kaWZpZWQ6CTk0LzA2LzE0CisqKgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmCV9zZWxmdGVzdHNfaF8KKyNkZWZpbmUgX3NlbGZ0ZXN0c19oXworCisvKgorKiogU2VsZnRlc3QgaWRlbnRpZmllci4uLgorKi8KKyNkZWZpbmUgU0VMRlRFU1RfTUFHSUMJMHg1YTVhCisKKy8qCisqKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHBhY2tldCB0aGF0IGlzIHNlbnQgYmFjayBhZnRlciBlYWNoCisqKiBzZWxmdGVzdCBvbiBhIGJvb3RpbmcgUlRBLgorKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydAkJbWFnaWM7CQkJLyogSWRlbnRpZmllcyBwYWNrZXQgdHlwZSAqLworICAgIGludAkJCXRlc3Q7CQkJLyogVGVzdCBudW1iZXIsIHNlZSBiZWxvdyAqLworICAgIHVuc2lnbmVkIGludAlyZXN1bHQ7CQkJLyogUmVzdWx0IHZhbHVlICovCisgICAgdW5zaWduZWQgaW50CWRhdGFJbjsKKyAgICB1bnNpZ25lZCBpbnQJZGF0YU91dDsKK31zZWxmdGVzdFN0cnVjdDsKKworLyoKKyoqIFRoZSBkaWZmZXJlbnQgdGVzdHMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIGZvbGxvd2luZyBkYXRhIHZhbHVlcy4KKyovCitlbnVtIHRlc3QgeworICAgIFRFU1RTX0NPTVBMRVRFCT0gMHgwMCwKKyAgICBNRU1URVNUX0FERFIJPSAweDAxLAorICAgIE1FTVRFU1RfQklUCQk9IDB4MDIsCisgICAgTUVNVEVTVF9GSUxMCT0gMHgwMywKKyAgICBNRU1URVNUX0RBVEFCVVMJPSAweDA0LAorICAgIE1FTVRFU1RfQUREUkJVUwk9IDB4MDUsCisgICAgQ0QxNDAwX0lOSVQJCT0gMHgxMCwKKyAgICBDRDE0MDBfTE9PUAkJPSAweDExLAorICAgIENEMTQwMF9JTlRFUlJVUFQgICAgPSAweDEyCit9OworCitlbnVtIHJlc3VsdCB7CisgICAgRV9QT1JUCQk9IDB4MTAsCisgICAgRV9UWAkJPSAweDExLAorICAgIEVfUlgJCT0gMHgxMiwKKyAgICBFX0VYQ0VQVAkJPSAweDEzLAorICAgIEVfQ09NUEFSRQkJPSAweDE0LAorICAgIEVfTU9ERU0JCT0gMHgxNSwKKyAgICBFX1RJTUVPVVQJCT0gMHgxNiwKKyAgICBFX0lOVEVSUlVQVCAgICAgICAgID0gMHgxNworfTsKKyNlbmRpZgkvKiBfc2VsZnRlc3RzX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3NwYWNlLmggYi9kcml2ZXJzL2NoYXIvcmlvL3NwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzOThkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vc3BhY2UuaApAQCAtMCwwICsxLDQ1IEBACisvKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKKyoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqCU1vZHVsZQkJOiBzcGFjZS5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxOQorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMgorKioKKyoqICBpZGVudCBAKCMpc3BhY2UuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb19zcGFjZV9oX18KKyNkZWZpbmUgX19yaW9fc3BhY2VfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9zcGFjZV9oX3NjY3NfID0gIkAoIylzcGFjZS5oCTEuMiI7CisjZW5kaWYKKworZXh0ZXJuIGludCByaW9fY250bHM7CitleHRlcm4gaW50IHJpb19iYXNlc1tdOworZXh0ZXJuIGludCByaW9fbGltaXRzW107CitleHRlcm4gaW50IHJpb192ZWN0c1tdOworCisjZW5kaWYgLyogX19yaW9fc3BhY2VfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3N5c21hcC5oIGIvZHJpdmVycy9jaGFyL3Jpby9zeXNtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM3MzEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9zeXNtYXAuaApAQCAtMCwwICsxLDYzIEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgUyBZIFMgVCBFIE0gICBNIEEgUCAgIEggRSBBIEQgRSBSCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEF1dGhvciAgOiBJYW4gTmFuZGhyYQorIERhdGUgICAgOgorCisgKgorICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIFZlcnNpb24gOiAwLjAxCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl9yaW9fc3lzbWFwX2hfc2NjcyA9ICJAKCMpc3lzbWFwLmgJMS4xIiA7CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFNZU1RFTV9NQVBfTEVOICAgICA2NCAgICAgICAgICAgLyogTGVuIG9mIFN5c3RlbSBNYXAgYXJyYXkgKi8KKworCit0eXBlZGVmIHN0cnVjdCBTWVNfTUFQICAgICAgICBTWVNfTUFQIDsKK3R5cGVkZWYgc3RydWN0IFNZU19NQVBfTElOSyAgIFNZU19NQVBfTElOSyA7CisKK3N0cnVjdCBTWVNfTUFQX0xJTksgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgaWQgOyAgICAgICAgICAvKiBVbml0IElkICovCisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBsaW5rIDsgICAgICAgIC8qIElkJ3MgTGluayAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgYmVlbl9oZXJlIDsgICAvKiBVc2VkIGJ5IG1hcF9nZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgfSA7CisKK3N0cnVjdCBTWVNfTUFQIHsKKyAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgc2VyaWFsX251bVs0XSA7CisgICAgICAgICAgICAgICAgICAgU1lTX01BUF9MSU5LIGxpbmtbNF0gOworICAgICAgICAgICAgICAgfSA7CisKKworLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3RpbWVvdXRzLmggYi9kcml2ZXJzL2NoYXIvcmlvL3RpbWVvdXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiMzEzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vdGltZW91dHMuaApAQCAtMCwwICsxLDUxIEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgorICoqKioqKiogICAgICAgICAgICAgICAgICAgICBUIEkgTSBFIE8gVSBUIFMKKyAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgQXV0aG9yICA6IElhbiBOYW5kaHJhCisgRGF0ZSAgICA6CisKKyAqCisgKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgVmVyc2lvbiA6IDAuMDEKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgbGludAorI2lmZGVmIFNDQ1NfTEFCRUxTCitzdGF0aWMgY2hhciAqX3Jpb19kZWZhdWx0c19oX3NjY3MgPSAiQCgjKXRpbWVvdXRzLmgJMS4zIiA7CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIE1JTExJU0VDT05EICAgICAgICAgICAoaW50KSAoMTAwMC82NCkgICAvKiAxNS42MjUgbG93IHRpY2tzICovCisjZGVmaW5lIFNFQ09ORCAgICAgICAgICAgICAgICAoaW50KSAxNTYyNSAgICAgICAvKiBMb3cgcHJpb3JpdHkgdGlja3MgKi8KKworI2RlZmluZSBUWF9USU1FT1VUICAgICAgICAgIChpbnQpICgyMDAgKiBNSUxMSVNFQ09ORCkKKworCisvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdG9wLmggYi9kcml2ZXJzL2NoYXIvcmlvL3RvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NWM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3RvcC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHRvcC5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxOQorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMgorKioKKyoqICBpZGVudCBAKCMpdG9wLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fdG9wX2hfXworI2RlZmluZSBfX3Jpb190b3BfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl90b3BfaF9zY2NzXyA9ICJAKCMpdG9wLmgJMS4yIjsKKyNlbmRpZgorCisvKgorKiogVG9wb2xvZ3kgaW5mb3JtYXRpb24KKyovCitzdHJ1Y3QgVG9wCit7CisgICAgdWNoYXIgVW5pdDsKKyAgICB1Y2hhciBMaW5rOworfTsKKworI2VuZGlmIC8qIF9fcmlvX3RvcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdHlwZGVmLmggYi9kcml2ZXJzL2NoYXIvcmlvL3R5cGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYjlkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3R5cGRlZi5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHR5cGRlZi5oCisqKglTSUQJCTogMS4yCisqKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoyMAorKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMgorKioKKyoqICBpZGVudCBAKCMpdHlwZGVmLmgJMS4yCisqKgorKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19yaW9fdHlwZGVmX2hfXworI2RlZmluZSBfX3Jpb190eXBkZWZfaF9fCisKKyNpZmRlZiBTQ0NTX0xBQkVMUworc3RhdGljIGNoYXIgKl90eXBkZWZfaF9zY2NzXyA9ICJAKCMpdHlwZGVmLmgJMS4yIjsKKyNlbmRpZgorCisjdW5kZWYgVlBJWAorCisvKgorKiogSVQgSVMgUkVBTExZLCBSRUFMTFksIElNUE9SVEFOVCBUSEFUIEJZVEVTIEFSRSBVTlNJR05FRCEKKyoqCisqKiBUaGVzZSB0eXBlcyBhcmUgT05MWSB0byBiZSB1c2VkIGZvciByZWZlcmluZyB0byBkYXRhIHN0cnVjdHVyZXMKKyoqIG9uIHRoZSBSSU8gSG9zdCBjYXJkIQorKi8KK3R5cGVkZWYJdm9sYXRpbGUgdW5zaWduZWQgY2hhcglCWVRFOwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydAlXT1JEOwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBpbnQJRFdPUkQ7Cit0eXBlZGVmCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IFJJT1A7Cit0eXBlZGVmCXZvbGF0aWxlIHNob3J0ICAgICAgICAgIE5VTUJFUjsKKworCisvKgorKiogMjcuMDEuMTk5IEFSRyAtIG1vZHMgdG8gY29tcGlsZSAnbmV3dXRpbHMnIG9uIEx5eG5PUyAtCisqKiBUaGVzZSAjZGVmaW5lcyBhcmUgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSAnbGliZnVuY3MnIGxpYnJhcnkKKyoqIG9ubHkuIFRoZXkgYXJlIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0IHR5cGUgbWFwcGluZ3MgYW5kCisqKiBhcmUgaGVyZSBvbmx5IHRvIG1ha2UgdGhlIHNvdXJjZSBjb21waWxlLgorKi8KKy8qIHR5cGVkZWYgdW5zaWduZWQgaW50CXVpbnQ7ICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJdWxvbmdfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJdXNob3J0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJdWNoYXJfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhcglxdWV1ZV90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCW1ibGtfdDsKK3R5cGVkZWYJdW5zaWduZWQgaW50IAlwYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWNoYXI7CisKKyNkZWZpbmUJVFBOVUxMCSgodXNob3J0KSgweDgwMDApKQorCisKKy8qCisqKiBSSU8gc3RydWN0dXJlcyBkZWZpbmVkIGluIG90aGVyIGluY2x1ZGUgZmlsZXMuCisqLwordHlwZWRlZiBzdHJ1Y3QgUEtUCSAJUEtUOwordHlwZWRlZiBzdHJ1Y3QgTFBCCSAJTFBCOwordHlwZWRlZiBzdHJ1Y3QgUlVQCSAJUlVQOwordHlwZWRlZiBzdHJ1Y3QgUG9ydAkJUG9ydDsKK3R5cGVkZWYgc3RydWN0IERwUmFtCQlEcFJhbTsKKworI2VuZGlmIC8qIF9fcmlvX3R5cGRlZl9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdW5peHJ1cC5oIGIvZHJpdmVycy9jaGFyL3Jpby91bml4cnVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkZjg2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vdW5peHJ1cC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAorKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgorICoKKyAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKioJTW9kdWxlCQk6IHVuaXhydXAuaAorKioJU0lECQk6IDEuMgorKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MjAKKyoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKKyoqCisqKiAgaWRlbnQgQCgjKXVuaXhydXAuaAkxLjIKKyoqCisqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX3Jpb191bml4cnVwX2hfXworI2RlZmluZSBfX3Jpb191bml4cnVwX2hfXworCisjaWZkZWYgU0NDU19MQUJFTFMKK3N0YXRpYyBjaGFyICpfdW5peHJ1cF9oX3NjY3NfID0gIkAoIyl1bml4cnVwLmgJMS4yIjsKKyNlbmRpZgorCisvKgorKiogICAgVW5peFJ1cCBkYXRhIHN0cnVjdHVyZS4gVGhpcyBjb250YWlucyBwb2ludGVycyB0byBhY3R1YWwgUlVQcyBvbiB0aGUKKyoqICAgIGhvc3QgY2FyZCwgYW5kIGFsbCB0aGUgY29tbWFuZC9ib290IGNvbnRyb2wgc3R1ZmYuCisqLworc3RydWN0ICAgIFVuaXhSdXAKK3sKKyAgICBzdHJ1Y3QgQ21kQmxrICAgICpDbWRzV2FpdGluZ1A7CS8qIENvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZG9uZSAqLworICAgIHN0cnVjdCBDbWRCbGsgICAgKkNtZFBlbmRpbmdQOwkvKiBUaGUgY29tbWFuZCBjdXJyZW50bHkgYmVpbmcgc2VudCAqLworICAgIHN0cnVjdCBSVVAgICAgICAgKlJ1cFA7CQkvKiB0aGUgUnVwIHRvIHNlbmQgaXQgdG8gKi8KKyAgICB1aW50ICAgICAgICAgICAgIElkOwkJLyogSWQgbnVtYmVyICovCisgICAgdWludCAgICAgICAgICAgICBCYXNlU3lzUG9ydDsJLyogU3lzUG9ydCBvZiBmaXJzdCB0dHkgb24gdGhpcyBSVEEgKi8KKyAgICB1aW50ICAgICAgICAgICAgIE1vZFR5cGVzOwkJLyogTW9kdWxlcyBvbiB0aGlzIFJUQSAqLworICAgIHNwaW5sb2NrX3QJICAgICBSdXBMb2NrOwkJLyogTG9jayBzdHJ1Y3R1cmUgZm9yIE1QWCAqLworLyogICAgc3RydWN0IGxvY2tiICAgICBSdXBMb2NrOwkqLwkvKiBMb2NrIHN0cnVjdHVyZSBmb3IgTVBYICovCit9OworCisjZW5kaWYgLyogX19yaW9fdW5peHJ1cF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaXNjb204LmMgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YTNhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCkBAIC0wLDAgKzEsMTgwOSBAQAorLyoKKyAqICAgICAgbGludXgvZHJpdmVycy9jaGFyL3Jpc2NvbS5jICAtLSBSSVNDb20vOCBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBEbWl0cnkgR29yb2RjaGFuaW4gKHBnbWRzZ0BpYmkuY29tKQorICoKKyAqICAgICAgVGhpcyBjb2RlIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlIExpbnV4IHNlcmlhbCBkcml2ZXIsIHdyaXR0ZW4gYnkKKyAqICAgICAgTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFQnc28gYW5kIG90aGVycy4gVGhlIFJJU0NvbS84IGNhcmQgCisgKiAgICAgIHByb2dyYW1taW5nIGluZm8gd2FzIG9idGFpbmVkIGZyb20gdmFyaW91cyBkcml2ZXJzIGZvciBvdGhlciBPU2VzIAorICoJKEZyZWVCU0QsIElTQywgZXRjKSwgYnV0IG5vIHNvdXJjZSBjb2RlIGZyb20gdGhvc2UgZHJpdmVycyB3ZXJlIAorICoJZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhpcyBkcml2ZXIuCisgKgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKglSZXZpc2lvbiAxLjEKKyAqCisgKglDaGFuZ2VMb2c6CisgKglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAyNy1KdW4tMjAwMQorICoJLSBnZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbiBhbmQgc2V2ZXJhbCBjbGVhbnVwcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJyaXNjb204LmgiCisjaW5jbHVkZSAicmlzY29tOF9yZWcuaCIKKworLyogQW0gSSBwYXJhbm9pZCBvciBub3QgPyA7LSkgKi8KKyNkZWZpbmUgUklTQ09NX1BBUkFOT0lBX0NIRUNLCisKKy8qIAorICogQ3JhenkgSW50ZWxpQ29tLzggYm9hcmRzIHNvbWV0aW1lcyBoYXMgc3dhcHBlZCBDVFMgJiBEU1Igc2lnbmFscy4KKyAqIFlvdSBjYW4gc2xpZ2h0bHkgc3BlZWQgdXAgdGhpbmdzIGJ5ICN1bmRlZmluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiwKKyAqIGlmIHlvdSBhcmUgUkVBTExZIHN1cmUgdGhhdCB5b3VyIGJvYXJkIGlzIGNvcnJlY3Qgb25lLiAKKyAqLworCisjZGVmaW5lIFJJU0NPTV9CUkFJTl9EQU1BR0VEX0NUUworCisvKiAKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBCdXQgaWYgeW91IG5lZWQKKyAqIHNvbWUgbmljZSByZXBvcnRpbmcgaW4geW91ciBzeXNsb2csIHlvdSBjYW4gZGVmaW5lIHRoZW0gYWxzby4KKyAqLworI3VuZGVmIFJDX1JFUE9SVF9GSUZPCisjdW5kZWYgUkNfUkVQT1JUX09WRVJSVU4KKworCisjZGVmaW5lIFJJU0NPTV9MRUdBTF9GTEFHUyBcCisJKEFTWU5DX0hVUF9OT1RJRlkgICB8IEFTWU5DX1NBSyAgICAgICAgICB8IEFTWU5DX1NQTElUX1RFUk1JT1MgICB8IFwKKwkgQVNZTkNfU1BEX0hJICAgICAgIHwgQVNZTkNfU1BFRURfVkhJICAgIHwgQVNZTkNfU0VTU0lPTl9MT0NLT1VUIHwgXAorCSBBU1lOQ19QR1JQX0xPQ0tPVVQgfCBBU1lOQ19DQUxMT1VUX05PSFVQKQorCisjZGVmaW5lIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAkwCisKK3N0YXRpYyBzdHJ1Y3QgcmlzY29tX2JvYXJkICogSVJRX3RvX2JvYXJkWzE2XTsKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcmlzY29tX2RyaXZlcjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogdG1wX2J1ZjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmF1ZF90YWJsZVtdID0gIHsKKwkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCisJOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgNzY4MDAsIDAsIAorfTsKKworc3RhdGljIHN0cnVjdCByaXNjb21fYm9hcmQgcmNfYm9hcmRbUkNfTkJPQVJEXSA9ICB7CisJeworCQkuYmFzZQk9IFJDX0lPQkFTRTEsCisJfSwKKwl7CisJCS5iYXNlCT0gUkNfSU9CQVNFMiwKKwl9LAorCXsKKwkJLmJhc2UJPSBSQ19JT0JBU0UzLAorCX0sCisJeworCQkuYmFzZQk9IFJDX0lPQkFTRTQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmlzY29tX3BvcnQgcmNfcG9ydFtSQ19OQk9BUkQgKiBSQ19OUE9SVF07CisKKy8qIFJJU0NvbS84IEkvTyBwb3J0cyBhZGRyZXNzZXMgKHdpdGhvdXQgYWRkcmVzcyB0cmFuc2xhdGlvbikgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByY19pb3BvcnRbXSA9ICB7CisjaWYgMQkKKwkweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA5LCAweDBhLCAweDBiLCAweDBjLAorI2Vsc2UJCisJMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgxMCwKKwkweDExLCAweDEyLCAweDE4LCAweDI4LCAweDMxLCAweDMyLCAweDM5LCAweDNhLCAweDQwLCAweDQxLCAweDYxLCAweDYyLAorCTB4NjMsIDB4NjQsIDB4NmIsIDB4NzAsIDB4NzEsIDB4NzgsIDB4N2EsIDB4N2IsIDB4N2YsIDB4MTAwLCAweDEwMQorI2VuZGlmCQorfTsKKyNkZWZpbmUgUkNfTklPUE9SVAkoc2l6ZW9mKHJjX2lvcG9ydCkgLyBzaXplb2YocmNfaW9wb3J0WzBdKSkKKworCitzdGF0aWMgaW5saW5lIGludCByY19wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgcmlzY29tX3BvcnQgY29uc3QgKiBwb3J0LAorCQkJCSAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQoreworI2lmZGVmIFJJU0NPTV9QQVJBTk9JQV9DSEVDSworCXN0YXRpYyBjb25zdCBjaGFyIGJhZG1hZ2ljW10gPSBLRVJOX0lORk8KKwkJInJjOiBXYXJuaW5nOiBiYWQgcmlzY29tIHBvcnQgbWFnaWMgbnVtYmVyIGZvciBkZXZpY2UgJXMgaW4gJXNcbiI7CisJc3RhdGljIGNvbnN0IGNoYXIgYmFkaW5mb1tdID0gS0VSTl9JTkZPCisJCSJyYzogV2FybmluZzogbnVsbCByaXNjb20gcG9ydCBmb3IgZGV2aWNlICVzIGluICVzXG4iOworCisJaWYgKCFwb3J0KSB7CisJCXByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChwb3J0LT5tYWdpYyAhPSBSSVNDT004X01BR0lDKSB7CisJCXByaW50ayhiYWRtYWdpYywgbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogCisgKiAgU2VydmljZSBmdW5jdGlvbnMgZm9yIFJJU0NvbS84IGRyaXZlci4KKyAqIAorICovCisKKy8qIEdldCBib2FyZCBudW1iZXIgZnJvbSBwb2ludGVyICovCitzdGF0aWMgaW5saW5lIGludCBib2FyZF9ObyAoc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwKQoreworCXJldHVybiBicCAtIHJjX2JvYXJkOworfQorCisvKiBHZXQgcG9ydCBudW1iZXIgZnJvbSBwb2ludGVyICovCitzdGF0aWMgaW5saW5lIGludCBwb3J0X05vIChzdHJ1Y3QgcmlzY29tX3BvcnQgY29uc3QgKiBwb3J0KQoreworCXJldHVybiBSQ19QT1JUKHBvcnQgLSByY19wb3J0KTsgCit9CisKKy8qIEdldCBwb2ludGVyIHRvIGJvYXJkIGZyb20gcG9pbnRlciB0byBwb3J0ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByaXNjb21fYm9hcmQgKiBwb3J0X0JvYXJkKHN0cnVjdCByaXNjb21fcG9ydCBjb25zdCAqIHBvcnQpCit7CisJcmV0dXJuICZyY19ib2FyZFtSQ19CT0FSRChwb3J0IC0gcmNfcG9ydCldOworfQorCisvKiBJbnB1dCBCeXRlIGZyb20gQ0wgQ0QxODAgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByY19pbihzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnAsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlyZXR1cm4gaW5iKGJwLT5iYXNlICsgUkNfVE9fSVNBKHJlZykpOworfQorCisvKiBPdXRwdXQgQnl0ZSB0byBDTCBDRDE4MCByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB2b2lkIHJjX291dChzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnAsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCSAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJb3V0Yih2YWwsIGJwLT5iYXNlICsgUkNfVE9fSVNBKHJlZykpOworfQorCisvKiBXYWl0IGZvciBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgcmVhZHkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY193YWl0X0NDUihzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnApCit7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKKworCS8qIEZJWE1FOiBuZWVkIHNvbWV0aGluZyBtb3JlIGRlc2NyaXB0aXZlIHRoZW4gMTAwMDAwIDopICovCisJZm9yIChkZWxheSA9IDEwMDAwMDsgZGVsYXk7IGRlbGF5LS0pIAorCQlpZiAoIXJjX2luKGJwLCBDRDE4MF9DQ1IpKQorCQkJcmV0dXJuOworCQorCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IFRpbWVvdXQgd2FpdGluZyBmb3IgQ0NSLlxuIiwgYm9hcmRfTm8oYnApKTsKK30KKworLyoKKyAqICBSSVNDb20vOCBwcm9iZSBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgcmNfcmVxdWVzdF9pb19yYW5nZShzdHJ1Y3QgcmlzY29tX2JvYXJkICogY29uc3QgYnApCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IFJDX05JT1BPUlQ7IGkrKykgIAorCQlpZiAoIXJlcXVlc3RfcmVnaW9uKFJDX1RPX0lTQShyY19pb3BvcnRbaV0pICsgYnAtPmJhc2UsIDEsCisJCQkJICAgIlJJU0NvbS84IikpICB7CisJCQlnb3RvIG91dF9yZWxlYXNlOworCQl9CisJcmV0dXJuIDA7CitvdXRfcmVsZWFzZToKKwlwcmludGsoS0VSTl9JTkZPICJyYyVkOiBTa2lwcGluZyBwcm9iZSBhdCAweCUwM3guIElPIGFkZHJlc3MgaW4gdXNlLlxuIiwKKwkJCSBib2FyZF9ObyhicCksIGJwLT5iYXNlKTsKKwl3aGlsZSgtLWkgPj0gMCkKKwkJcmVsZWFzZV9yZWdpb24oUkNfVE9fSVNBKHJjX2lvcG9ydFtpXSkgKyBicC0+YmFzZSwgMSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY19yZWxlYXNlX2lvX3JhbmdlKHN0cnVjdCByaXNjb21fYm9hcmQgKiBjb25zdCBicCkKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgUkNfTklPUE9SVDsgaSsrKSAgCisJCXJlbGVhc2VfcmVnaW9uKFJDX1RPX0lTQShyY19pb3BvcnRbaV0pICsgYnAtPmJhc2UsIDEpOworfQorCQorLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBlbmFibGVkIGludGVycnVwdHMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY19sb25nX2RlbGF5KHVuc2lnbmVkIGxvbmcgZGVsYXkpCit7CisJdW5zaWduZWQgbG9uZyBpOworCQorCWZvciAoaSA9IGppZmZpZXMgKyBkZWxheTsgdGltZV9hZnRlcihpLGppZmZpZXMpOyApIDsKK30KKworLyogUmVzZXQgYW5kIHNldHVwIENEMTgwIGNoaXAgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByY19pbml0X0NEMTgwKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlyY19vdXQoYnAsIFJDX0NUT1VULCAwKTsgICAgIAkgICAgICAgICAgIC8qIENsZWFyIHRpbWVvdXQgICAgICAgICAgICAgKi8KKwlyY193YWl0X0NDUihicCk7CQkJICAgLyogV2FpdCBmb3IgQ0NSIHJlYWR5ICAgICAgICAqLworCXJjX291dChicCwgQ0QxODBfQ0NSLCBDQ1JfSEFSRFJFU0VUKTsgICAgICAvKiBSZXNldCBDRDE4MCBjaGlwICAgICAgICAgICovCisJc3RpKCk7CisJcmNfbG9uZ19kZWxheShIWi8yMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IDAuMDUgc2VjICAgICAgICAgICAgKi8KKwljbGkoKTsKKwlyY19vdXQoYnAsIENEMTgwX0dJVlIsIFJDX0lEKTsgICAgICAgICAgICAgLyogU2V0IElEIGZvciB0aGlzIGNoaXAgICAgICAqLworCXJjX291dChicCwgQ0QxODBfR0lDUiwgMCk7ICAgICAgICAgICAgICAgICAvKiBDbGVhciBhbGwgYml0cyAgICAgICAgICAgICovCisJcmNfb3V0KGJwLCBDRDE4MF9QSUxSMSwgUkNfQUNLX01JTlQpOyAgICAgIC8qIFByaW8gZm9yIG1vZGVtIGludHIgICAgICAgKi8KKwlyY19vdXQoYnAsIENEMTgwX1BJTFIyLCBSQ19BQ0tfVElOVCk7ICAgICAgLyogUHJpbyBmb3IgdHJhbnNtaXR0ZXIgaW50ciAqLworCXJjX291dChicCwgQ0QxODBfUElMUjMsIFJDX0FDS19SSU5UKTsgICAgICAvKiBQcmlvIGZvciByZWNlaXZlciBpbnRyICAgICovCisJCisJLyogU2V0dGluZyB1cCBwcmVzY2FsZXIuIFdlIG5lZWQgNCB0aWNrcyBwZXIgMSBtcyAqLworCXJjX291dChicCwgQ0QxODBfUFBSSCwgKFJDX09TQ0ZSRVEvKDEwMDAwMDAvUklTQ09NX1RQUykpID4+IDgpOworCXJjX291dChicCwgQ0QxODBfUFBSTCwgKFJDX09TQ0ZSRVEvKDEwMDAwMDAvUklTQ09NX1RQUykpICYgMHhmZik7CisJCisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKy8qIE1haW4gcHJvYmluZyByb3V0aW5lLCBhbHNvIHNldHMgaXJxLiAqLworc3RhdGljIGludCBfX2luaXQgcmNfcHJvYmUoc3RydWN0IHJpc2NvbV9ib2FyZCAqYnApCit7CisJdW5zaWduZWQgY2hhciB2YWwxLCB2YWwyOworCWludCBpcnFzID0gMDsKKwlpbnQgcmV0cmllczsKKwkKKwlicC0+aXJxID0gMDsKKworCWlmIChyY19yZXF1ZXN0X2lvX3JhbmdlKGJwKSkKKwkJcmV0dXJuIDE7CisJCisJLyogQXJlIHRoZSBJL08gcG9ydHMgaGVyZSA/ICovCisJcmNfb3V0KGJwLCBDRDE4MF9QUFJMLCAweDVhKTsKKwlvdXRiKDB4ZmYsIDB4ODApOworCXZhbDEgPSByY19pbihicCwgQ0QxODBfUFBSTCk7CisJcmNfb3V0KGJwLCBDRDE4MF9QUFJMLCAweGE1KTsKKwlvdXRiKDB4MDAsIDB4ODApOworCXZhbDIgPSByY19pbihicCwgQ0QxODBfUFBSTCk7CisJCisJaWYgKCh2YWwxICE9IDB4NWEpIHx8ICh2YWwyICE9IDB4YTUpKSAgeworCQlwcmludGsoS0VSTl9FUlIgInJjJWQ6IFJJU0NvbS84IEJvYXJkIGF0IDB4JTAzeCBub3QgZm91bmQuXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBicC0+YmFzZSk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCQorCS8qIEl0J3MgdGltZSB0byBmaW5kIElSUSBmb3IgdGhpcyBib2FyZCAqLworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCA1ICYmIGlycXMgPD0gMDsgcmV0cmllcysrKSAgeworCQlpcnFzID0gcHJvYmVfaXJxX29uKCk7CisJCXJjX2luaXRfQ0QxODAoYnApOwkgICAgICAgCQkvKiBSZXNldCBDRDE4MCBjaGlwICAgICAgICovCisJCXJjX291dChicCwgQ0QxODBfQ0FSLCAyKTsgICAgICAgICAgICAgICAvKiBTZWxlY3QgcG9ydCAyICAgICAgICAgICovCisJCXJjX3dhaXRfQ0NSKGJwKTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9UWEVOKTsgICAgICAgIC8qIEVuYWJsZSB0cmFuc21pdHRlciAgICAgKi8KKwkJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIElFUl9UWFJEWSk7ICAgICAgIC8qIEVuYWJsZSB0eCBlbXB0eSBpbnRyICAgKi8KKwkJcmNfbG9uZ19kZWxheShIWi8yMCk7CSAgICAgICAJCQorCQlpcnFzID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKwkJdmFsMSA9IHJjX2luKGJwLCBSQ19CU1IpOwkJLyogR2V0IEJvYXJkIFN0YXR1cyByZWcgICAqLworCQl2YWwyID0gcmNfaW4oYnAsIFJDX0FDS19USU5UKTsgICAgICAgICAgLyogQUNLIGludGVycnVwdCAgICAgICAgICAqLworCQlyY19pbml0X0NEMTgwKGJwKTsJICAgICAgIAkJLyogUmVzZXQgQ0QxODAgYWdhaW4gICAgICAqLworCQorCQlpZiAoKHZhbDEgJiBSQ19CU1JfVElOVCkgfHwgKHZhbDIgIT0gKFJDX0lEIHwgR0lWUl9JVF9UWCkpKSAgeworCQkJcHJpbnRrKEtFUk5fRVJSICJyYyVkOiBSSVNDb20vOCBCb2FyZCBhdCAweCUwM3ggbm90ICIKKwkJCQkJImZvdW5kLlxuIiwgYm9hcmRfTm8oYnApLCBicC0+YmFzZSk7CisJCQlnb3RvIG91dF9yZWxlYXNlOworCQl9CisJfQorCQorCWlmIChpcnFzIDw9IDApICB7CisJCXByaW50ayhLRVJOX0VSUiAicmMlZDogQ2FuJ3QgZmluZCBJUlEgZm9yIFJJU0NvbS84IGJvYXJkICIKKwkJCQkiYXQgMHglMDN4LlxuIiwgYm9hcmRfTm8oYnApLCBicC0+YmFzZSk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCWJwLT5pcnEgPSBpcnFzOworCWJwLT5mbGFncyB8PSBSQ19CT0FSRF9QUkVTRU5UOworCQorCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IFJJU0NvbS84IFJldi4gJWMgYm9hcmQgZGV0ZWN0ZWQgYXQgIgorCQkJICIweCUwM3gsIElSUSAlZC5cbiIsCisJICAgICAgIGJvYXJkX05vKGJwKSwKKwkgICAgICAgKHJjX2luKGJwLCBDRDE4MF9HRlJDUikgJiAweDBmKSArICdBJywgICAvKiBCb2FyZCByZXZpc2lvbiAqLworCSAgICAgICBicC0+YmFzZSwgYnAtPmlycSk7CisJCisJcmV0dXJuIDA7CitvdXRfcmVsZWFzZToKKwlyY19yZWxlYXNlX2lvX3JhbmdlKGJwKTsKKwlyZXR1cm4gMTsKK30KKworLyogCisgKiAKKyAqICBJbnRlcnJ1cHQgcHJvY2Vzc2luZyByb3V0aW5lcy4KKyAqIAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY19tYXJrX2V2ZW50KHN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQsIGludCBldmVudCkKK3sKKwlzZXRfYml0KGV2ZW50LCAmcG9ydC0+ZXZlbnQpOworCXNjaGVkdWxlX3dvcmsoJnBvcnQtPnRxdWV1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJpc2NvbV9wb3J0ICogcmNfZ2V0X3BvcnQoc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwLAorCQkJCQkgICAgICAgdW5zaWduZWQgY2hhciBjb25zdCAqIHdoYXQpCit7CisJdW5zaWduZWQgY2hhciBjaGFubmVsOworCXN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQ7CisJCisJY2hhbm5lbCA9IHJjX2luKGJwLCBDRDE4MF9HSUNSKSA+PiBHSUNSX0NIQU5fT0ZGOworCWlmIChjaGFubmVsIDwgQ0QxODBfTkNIKSAgeworCQlwb3J0ID0gJnJjX3BvcnRbYm9hcmRfTm8oYnApICogUkNfTlBPUlQgKyBjaGFubmVsXTsKKwkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpICB7CisJCQlyZXR1cm4gcG9ydDsKKwkJfQorCX0KKwlwcmludGsoS0VSTl9FUlIgInJjJWQ6ICVzIGludGVycnVwdCBmcm9tIGludmFsaWQgcG9ydCAlZFxuIiwgCisJICAgICAgIGJvYXJkX05vKGJwKSwgd2hhdCwgY2hhbm5lbCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY19yZWNlaXZlX2V4YyhzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnApCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBjaDsKKwkKKwlpZiAoIShwb3J0ID0gcmNfZ2V0X3BvcnQoYnAsICJSZWNlaXZlIikpKQorCQlyZXR1cm47CisKKwl0dHkgPSBwb3J0LT50dHk7CisJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSAgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYyVkOiBwb3J0ICVkOiBXb3JraW5nIGFyb3VuZCBmbGlwICIKKwkJCQkgICAgImJ1ZmZlciBvdmVyZmxvdy5cbiIsCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOworCQlyZXR1cm47CisJfQorCQorI2lmZGVmIFJDX1JFUE9SVF9PVkVSUlVOCQorCXN0YXR1cyA9IHJjX2luKGJwLCBDRDE4MF9SQ1NSKTsKKwlpZiAoc3RhdHVzICYgUkNTUl9PRSkgIHsKKwkJcG9ydC0+b3ZlcnJ1bisrOworI2lmIDAJCQorCQlwcmludGsoS0VSTl9FUlIgInJjJWQ6IHBvcnQgJWQ6IE92ZXJydW4uIFRvdGFsICVsZCBvdmVycnVuc1xuIiwgCisJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCksIHBvcnQtPm92ZXJydW4pOworI2VuZGlmCQkKKwl9CisJc3RhdHVzICY9IHBvcnQtPm1hcmtfbWFzazsKKyNlbHNlCQorCXN0YXR1cyA9IHJjX2luKGJwLCBDRDE4MF9SQ1NSKSAmIHBvcnQtPm1hcmtfbWFzazsKKyNlbmRpZgkKKwljaCA9IHJjX2luKGJwLCBDRDE4MF9SRFIpOworCWlmICghc3RhdHVzKSAgeworCQlyZXR1cm47CisJfQorCWlmIChzdGF0dXMgJiBSQ1NSX1RPVVQpICB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJjJWQ6IHBvcnQgJWQ6IFJlY2VpdmVyIHRpbWVvdXQuICIKKwkJCQkgICAgIkhhcmR3YXJlIHByb2JsZW1zID9cbiIsIAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKKwkJcmV0dXJuOworCQkKKwl9IGVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfQlJFQUspICB7CisJCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IHBvcnQgJWQ6IEhhbmRsaW5nIGJyZWFrLi4uXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKwkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfU0FLKQorCQkJZG9fU0FLKHR0eSk7CisJCQorCX0gZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9QRSkgCisJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfUEFSSVRZOworCQorCWVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfRkUpIAorCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0ZSQU1FOworCQorICAgICAgICBlbHNlIGlmIChzdGF0dXMgJiBSQ1NSX09FKQorCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX09WRVJSVU47CisJCisJZWxzZQorCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKwkKKwkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gY2g7CisJdHR5LT5mbGlwLmNvdW50Kys7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY19yZWNlaXZlKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBjaGFyIGNvdW50OworCQorCWlmICghKHBvcnQgPSByY19nZXRfcG9ydChicCwgIlJlY2VpdmUiKSkpCisJCXJldHVybjsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisJCisJY291bnQgPSByY19pbihicCwgQ0QxODBfUkRDUik7CisJCisjaWZkZWYgUkNfUkVQT1JUX0ZJRk8KKwlwb3J0LT5oaXRzW2NvdW50ID4gOCA/IDkgOiBjb3VudF0rKzsKKyNlbmRpZgkKKwkKKwl3aGlsZSAoY291bnQtLSkgIHsKKwkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSAgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmMlZDogcG9ydCAlZDogV29ya2luZyBhcm91bmQgIgorCQkJCQkgICAgImZsaXAgYnVmZmVyIG92ZXJmbG93LlxuIiwKKwkJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOworCQkJYnJlYWs7CisJCX0KKwkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IHJjX2luKGJwLCBDRDE4MF9SRFIpOworCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKwkJdHR5LT5mbGlwLmNvdW50Kys7CisJfQorCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmNfdHJhbnNtaXQoc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgY291bnQ7CisJCisJCisJaWYgKCEocG9ydCA9IHJjX2dldF9wb3J0KGJwLCAiVHJhbnNtaXQiKSkpCisJCXJldHVybjsKKwkKKwl0dHkgPSBwb3J0LT50dHk7CisJCisJaWYgKHBvcnQtPklFUiAmIElFUl9UWEVNUFRZKSAgeworCQkvKiBGSUZPIGRyYWluZWQgKi8KKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlwb3J0LT5JRVIgJj0gfklFUl9UWEVNUFRZOworCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoKHBvcnQtPnhtaXRfY250IDw9IDAgJiYgIXBvcnQtPmJyZWFrX2xlbmd0aCkKKwkgICAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCkgIHsKKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHBvcnQtPklFUik7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHBvcnQtPmJyZWFrX2xlbmd0aCkgIHsKKwkJaWYgKHBvcnQtPmJyZWFrX2xlbmd0aCA+IDApICB7CisJCQlpZiAocG9ydC0+Q09SMiAmIENPUjJfRVRDKSAgeworCQkJCXJjX291dChicCwgQ0QxODBfVERSLCBDRDE4MF9DX0VTQyk7CisJCQkJcmNfb3V0KGJwLCBDRDE4MF9URFIsIENEMTgwX0NfU0JSSyk7CisJCQkJcG9ydC0+Q09SMiAmPSB+Q09SMl9FVEM7CisJCQl9CisJCQljb3VudCA9IG1pbl90KGludCwgcG9ydC0+YnJlYWtfbGVuZ3RoLCAweGZmKTsKKwkJCXJjX291dChicCwgQ0QxODBfVERSLCBDRDE4MF9DX0VTQyk7CisJCQlyY19vdXQoYnAsIENEMTgwX1REUiwgQ0QxODBfQ19ERUxBWSk7CisJCQlyY19vdXQoYnAsIENEMTgwX1REUiwgY291bnQpOworCQkJaWYgKCEocG9ydC0+YnJlYWtfbGVuZ3RoIC09IGNvdW50KSkKKwkJCQlwb3J0LT5icmVha19sZW5ndGgtLTsKKwkJfSBlbHNlICB7CisJCQlyY19vdXQoYnAsIENEMTgwX1REUiwgQ0QxODBfQ19FU0MpOworCQkJcmNfb3V0KGJwLCBDRDE4MF9URFIsIENEMTgwX0NfRUJSSyk7CisJCQlyY19vdXQoYnAsIENEMTgwX0NPUjIsIHBvcnQtPkNPUjIpOworCQkJcmNfd2FpdF9DQ1IoYnApOworCQkJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9DT1JDSEcyKTsKKwkJCXBvcnQtPmJyZWFrX2xlbmd0aCA9IDA7CisJCX0KKwkJcmV0dXJuOworCX0KKwkKKwljb3VudCA9IENEMTgwX05GSUZPOworCWRvIHsKKwkJcmNfb3V0KGJwLCBDRDE4MF9URFIsIHBvcnQtPnhtaXRfYnVmW3BvcnQtPnhtaXRfdGFpbCsrXSk7CisJCXBvcnQtPnhtaXRfdGFpbCA9IHBvcnQtPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOworCQlpZiAoLS1wb3J0LT54bWl0X2NudCA8PSAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoLS1jb3VudCA+IDApOworCQorCWlmIChwb3J0LT54bWl0X2NudCA8PSAwKSAgeworCQlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwl9CisJaWYgKHBvcnQtPnhtaXRfY250IDw9IHBvcnQtPndha2V1cF9jaGFycykKKwkJcmNfbWFya19ldmVudChwb3J0LCBSU19FVkVOVF9XUklURV9XQUtFVVApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmNfY2hlY2tfbW9kZW0oc3RydWN0IHJpc2NvbV9ib2FyZCBjb25zdCAqIGJwKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgbWNyOworCQorCWlmICghKHBvcnQgPSByY19nZXRfcG9ydChicCwgIk1vZGVtIikpKQorCQlyZXR1cm47CisJCisJdHR5ID0gcG9ydC0+dHR5OworCQorCW1jciA9IHJjX2luKGJwLCBDRDE4MF9NQ1IpOworCWlmIChtY3IgJiBNQ1JfQ0RDSEcpICB7CisJCWlmIChyY19pbihicCwgQ0QxODBfTVNWUikgJiBNU1ZSX0NEKSAKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKKwkJZWxzZQorCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+dHF1ZXVlX2hhbmd1cCk7CisJfQorCQorI2lmZGVmIFJJU0NPTV9CUkFJTl9EQU1BR0VEX0NUUworCWlmIChtY3IgJiBNQ1JfQ1RTQ0hHKSAgeworCQlpZiAocmNfaW4oYnAsIENEMTgwX01TVlIpICYgTVNWUl9DVFMpICB7CisJCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQkJcG9ydC0+SUVSIHw9IElFUl9UWFJEWTsKKwkJCWlmIChwb3J0LT54bWl0X2NudCA8PSBwb3J0LT53YWtldXBfY2hhcnMpCisJCQkJcmNfbWFya19ldmVudChwb3J0LCBSU19FVkVOVF9XUklURV9XQUtFVVApOworCQl9IGVsc2UgIHsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKKwkJfQorCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwl9CisJaWYgKG1jciAmIE1DUl9EU1JDSEcpICB7CisJCWlmIChyY19pbihicCwgQ0QxODBfTVNWUikgJiBNU1ZSX0RTUikgIHsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQlwb3J0LT5JRVIgfD0gSUVSX1RYUkRZOworCQkJaWYgKHBvcnQtPnhtaXRfY250IDw9IHBvcnQtPndha2V1cF9jaGFycykKKwkJCQlyY19tYXJrX2V2ZW50KHBvcnQsIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisJCX0gZWxzZSAgeworCQkJdHR5LT5od19zdG9wcGVkID0gMTsKKwkJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOworCQl9CisJCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCX0KKyNlbmRpZiAvKiBSSVNDT01fQlJBSU5fREFNQUdFRF9DVFMgKi8KKwkKKwkvKiBDbGVhciBjaGFuZ2UgYml0cyAqLworCXJjX291dChicCwgQ0QxODBfTUNSLCAwKTsKK30KKworLyogVGhlIG1haW4gaW50ZXJydXB0IHByb2Nlc3Npbmcgcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IHJjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBhY2s7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisJdW5zaWduZWQgbG9uZyBsb29wID0gMDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlicCA9IElSUV90b19ib2FyZFtpcnFdOworCQorCWlmICghYnAgfHwgIShicC0+ZmxhZ3MgJiBSQ19CT0FSRF9BQ1RJVkUpKSAgeworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCQorCXdoaWxlICgoKytsb29wIDwgMTYpICYmICgoc3RhdHVzID0gfihyY19pbihicCwgUkNfQlNSKSkpICYKKwkJCQkgKFJDX0JTUl9UT1VUIHwgUkNfQlNSX1RJTlQgfAorCQkJCSAgUkNfQlNSX01JTlQgfCBSQ19CU1JfUklOVCkpKSB7CisJCWhhbmRsZWQgPSAxOworCQlpZiAoc3RhdHVzICYgUkNfQlNSX1RPVVQpIAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmMlZDogR290IHRpbWVvdXQuIEhhcmR3YXJlICIKKwkJCQkJICAgICJlcnJvcj9cbiIsIGJvYXJkX05vKGJwKSk7CisJCQorCQllbHNlIGlmIChzdGF0dXMgJiBSQ19CU1JfUklOVCkgeworCQkJYWNrID0gcmNfaW4oYnAsIFJDX0FDS19SSU5UKTsKKwkJCisJCQlpZiAoYWNrID09IChSQ19JRCB8IEdJVlJfSVRfUkNWKSkKKwkJCQlyY19yZWNlaXZlKGJwKTsKKwkJCWVsc2UgaWYgKGFjayA9PSAoUkNfSUQgfCBHSVZSX0lUX1JFWEMpKQorCQkJCXJjX3JlY2VpdmVfZXhjKGJwKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYyVkOiBCYWQgcmVjZWl2ZSBhY2sgIgorCQkJCQkJICAgICIweCUwMnguXG4iLAorCQkJCSAgICAgICBib2FyZF9ObyhicCksIGFjayk7CisJCQorCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFJDX0JTUl9USU5UKSB7CisJCQlhY2sgPSByY19pbihicCwgUkNfQUNLX1RJTlQpOworCQkKKwkJCWlmIChhY2sgPT0gKFJDX0lEIHwgR0lWUl9JVF9UWCkpCisJCQkJcmNfdHJhbnNtaXQoYnApOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInJjJWQ6IEJhZCB0cmFuc21pdCBhY2sgIgorCQkJCQkJICAgICIweCUwMnguXG4iLAorCQkJCSAgICAgICBib2FyZF9ObyhicCksIGFjayk7CisJCQorCQl9IGVsc2UgLyogaWYgKHN0YXR1cyAmIFJDX0JTUl9NSU5UKSAqLyB7CisJCQlhY2sgPSByY19pbihicCwgUkNfQUNLX01JTlQpOworCQkKKwkJCWlmIChhY2sgPT0gKFJDX0lEIHwgR0lWUl9JVF9NT0RFTSkpIAorCQkJCXJjX2NoZWNrX21vZGVtKGJwKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYyVkOiBCYWQgbW9kZW0gYWNrICIKKwkJCQkJCSAgICAiMHglMDJ4LlxuIiwKKwkJCQkgICAgICAgYm9hcmRfTm8oYnApLCBhY2spOworCQkKKwkJfSAKKworCQlyY19vdXQoYnAsIENEMTgwX0VPSVIsIDApOyAgIC8qIE1hcmsgZW5kIG9mIGludGVycnVwdCAqLworCQlyY19vdXQoYnAsIFJDX0NUT1VULCAwKTsgICAgIC8qIENsZWFyIHRpbWVvdXQgZmxhZyAgICAqLworCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoKKyAqICBSb3V0aW5lcyBmb3Igb3BlbiAmIGNsb3NlIHByb2Nlc3NpbmcuCisgKi8KKworLyogQ2FsbGVkIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyAqLworc3RhdGljIGlubGluZSBpbnQgcmNfc2V0dXBfYm9hcmQoc3RydWN0IHJpc2NvbV9ib2FyZCAqIGJwKQoreworCWludCBlcnJvcjsKKworCWlmIChicC0+ZmxhZ3MgJiBSQ19CT0FSRF9BQ1RJVkUpIAorCQlyZXR1cm4gMDsKKwkKKwllcnJvciA9IHJlcXVlc3RfaXJxKGJwLT5pcnEsIHJjX2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkJICAgICJSSVNDb20vOCIsIE5VTEwpOworCWlmIChlcnJvcikgCisJCXJldHVybiBlcnJvcjsKKwkKKwlyY19vdXQoYnAsIFJDX0NUT1VULCAwKTsgICAgICAgCQkvKiBKdXN0IGluIGNhc2UgICAgICAgICAqLworCWJwLT5EVFIgPSB+MDsKKwlyY19vdXQoYnAsIFJDX0RUUiwgYnAtPkRUUik7CSAgICAgICAgLyogRHJvcCBEVFIgb24gYWxsIHBvcnRzICovCisJCisJSVJRX3RvX2JvYXJkW2JwLT5pcnFdID0gYnA7CisJYnAtPmZsYWdzIHw9IFJDX0JPQVJEX0FDVElWRTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyAqLworc3RhdGljIGlubGluZSB2b2lkIHJjX3NodXRkb3duX2JvYXJkKHN0cnVjdCByaXNjb21fYm9hcmQgKmJwKQoreworCWlmICghKGJwLT5mbGFncyAmIFJDX0JPQVJEX0FDVElWRSkpCisJCXJldHVybjsKKwkKKwlicC0+ZmxhZ3MgJj0gflJDX0JPQVJEX0FDVElWRTsKKwkKKwlmcmVlX2lycShicC0+aXJxLCBOVUxMKTsKKwlJUlFfdG9fYm9hcmRbYnAtPmlycV0gPSBOVUxMOworCQorCWJwLT5EVFIgPSB+MDsKKwlyY19vdXQoYnAsIFJDX0RUUiwgYnAtPkRUUik7CSAgICAgICAvKiBEcm9wIERUUiBvbiBhbGwgcG9ydHMgKi8KKwkKK30KKworLyoKKyAqIFNldHRpbmcgdXAgcG9ydCBjaGFyYWN0ZXJpc3RpY3MuIAorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyB2b2lkIHJjX2NoYW5nZV9zcGVlZChzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCwgc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBiYXVkOworCWxvbmcgdG1wOworCXVuc2lnbmVkIGNoYXIgY29yMSA9IDAsIGNvcjMgPSAwOworCXVuc2lnbmVkIGNoYXIgbWNvcjEgPSAwLCBtY29yMiA9IDA7CisJCisJaWYgKCEodHR5ID0gcG9ydC0+dHR5KSB8fCAhdHR5LT50ZXJtaW9zKQorCQlyZXR1cm47CisKKwlwb3J0LT5JRVIgID0gMDsKKwlwb3J0LT5DT1IyID0gMDsKKwlwb3J0LT5NU1ZSID0gTVNWUl9SVFM7CisJCisJYmF1ZCA9IENfQkFVRCh0dHkpOworCQorCWlmIChiYXVkICYgQ0JBVURFWCkgeworCQliYXVkICY9IH5DQkFVREVYOworCQlpZiAoYmF1ZCA8IDEgfHwgYmF1ZCA+IDIpIAorCQkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVREVYOworCQllbHNlCisJCQliYXVkICs9IDE1OworCX0KKwlpZiAoYmF1ZCA9PSAxNSkgIHsKKwkJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQliYXVkICsrOworCQlpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCQliYXVkICs9IDI7CisJfQorCQorCS8qIFNlbGVjdCBwb3J0IG9uIHRoZSBib2FyZCAqLworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkKKwlpZiAoIWJhdWRfdGFibGVbYmF1ZF0pICB7CisJCS8qIERyb3AgRFRSICYgZXhpdCAqLworCQlicC0+RFRSIHw9ICgxdSA8PCBwb3J0X05vKHBvcnQpKTsKKwkJcmNfb3V0KGJwLCBSQ19EVFIsIGJwLT5EVFIpOworCQlyZXR1cm47CisJfSBlbHNlICB7CisJCS8qIFNldCBEVFIgb24gKi8KKwkJYnAtPkRUUiAmPSB+KDF1IDw8IHBvcnRfTm8ocG9ydCkpOworCQlyY19vdXQoYnAsIFJDX0RUUiwgYnAtPkRUUik7CisJfQorCQorCS8qCisJICogTm93IHdlIG11c3QgY2FsY3VsYXRlIHNvbWUgc3BlZWQgZGVwZW5kZWQgdGhpbmdzIAorCSAqLworCQorCS8qIFNldCBiYXVkIHJhdGUgZm9yIHBvcnQgKi8KKwl0bXAgPSAoKChSQ19PU0NGUkVRICsgYmF1ZF90YWJsZVtiYXVkXS8yKSAvIGJhdWRfdGFibGVbYmF1ZF0gKworCQlDRDE4MF9UUEMvMikgLyBDRDE4MF9UUEMpOworCisJcmNfb3V0KGJwLCBDRDE4MF9SQlBSSCwgKHRtcCA+PiA4KSAmIDB4ZmYpOyAKKwlyY19vdXQoYnAsIENEMTgwX1RCUFJILCAodG1wID4+IDgpICYgMHhmZik7IAorCXJjX291dChicCwgQ0QxODBfUkJQUkwsIHRtcCAmIDB4ZmYpOyAKKwlyY19vdXQoYnAsIENEMTgwX1RCUFJMLCB0bXAgJiAweGZmKTsKKwkKKwliYXVkID0gKGJhdWRfdGFibGVbYmF1ZF0gKyA1KSAvIDEwOyAgIC8qIEVzdGltYXRlZCBDUFMgKi8KKwkKKwkvKiBUd28gdGltZXIgdGlja3Mgc2VlbXMgZW5vdWdoIHRvIHdha2V1cCBzb21ldGhpbmcgbGlrZSBTTElQIGRyaXZlciAqLworCXRtcCA9ICgoYmF1ZCArIEhaLzIpIC8gSFopICogMiAtIENEMTgwX05GSUZPOwkJCisJcG9ydC0+d2FrZXVwX2NoYXJzID0gKHRtcCA8IDApID8gMCA6ICgodG1wID49IFNFUklBTF9YTUlUX1NJWkUpID8KKwkJCQkJICAgICAgU0VSSUFMX1hNSVRfU0laRSAtIDEgOiB0bXApOworCQorCS8qIFJlY2VpdmVyIHRpbWVvdXQgd2lsbCBiZSB0cmFuc21pc3Npb24gdGltZSBmb3IgMS41IGNoYXJzICovCisJdG1wID0gKFJJU0NPTV9UUFMgKyBSSVNDT01fVFBTLzIgKyBiYXVkLzIpIC8gYmF1ZDsKKwl0bXAgPSAodG1wID4gMHhmZikgPyAweGZmIDogdG1wOworCXJjX291dChicCwgQ0QxODBfUlRQUiwgdG1wKTsKKwkKKwlzd2l0Y2ggKENfQ1NJWkUodHR5KSkgIHsKKwkgY2FzZSBDUzU6CisJCWNvcjEgfD0gQ09SMV81QklUUzsKKwkJYnJlYWs7CisJIGNhc2UgQ1M2OgorCQljb3IxIHw9IENPUjFfNkJJVFM7CisJCWJyZWFrOworCSBjYXNlIENTNzoKKwkJY29yMSB8PSBDT1IxXzdCSVRTOworCQlicmVhazsKKwkgY2FzZSBDUzg6CisJCWNvcjEgfD0gQ09SMV84QklUUzsKKwkJYnJlYWs7CisJfQorCQorCWlmIChDX0NTVE9QQih0dHkpKSAKKwkJY29yMSB8PSBDT1IxXzJTQjsKKwkKKwljb3IxIHw9IENPUjFfSUdOT1JFOworCWlmIChDX1BBUkVOQih0dHkpKSAgeworCQljb3IxIHw9IENPUjFfTk9STVBBUjsKKwkJaWYgKENfUEFST0REKHR0eSkpIAorCQkJY29yMSB8PSBDT1IxX09ERFA7CisJCWlmIChJX0lOUENLKHR0eSkpIAorCQkJY29yMSAmPSB+Q09SMV9JR05PUkU7CisJfQorCS8qIFNldCBtYXJraW5nIG9mIHNvbWUgZXJyb3JzICovCisJcG9ydC0+bWFya19tYXNrID0gUkNTUl9PRSB8IFJDU1JfVE9VVDsKKwlpZiAoSV9JTlBDSyh0dHkpKSAKKwkJcG9ydC0+bWFya19tYXNrIHw9IFJDU1JfRkUgfCBSQ1NSX1BFOworCWlmIChJX0JSS0lOVCh0dHkpIHx8IElfUEFSTVJLKHR0eSkpIAorCQlwb3J0LT5tYXJrX21hc2sgfD0gUkNTUl9CUkVBSzsKKwlpZiAoSV9JR05QQVIodHR5KSkgCisJCXBvcnQtPm1hcmtfbWFzayAmPSB+KFJDU1JfRkUgfCBSQ1NSX1BFKTsKKwlpZiAoSV9JR05CUksodHR5KSkgIHsKKwkJcG9ydC0+bWFya19tYXNrICY9IH5SQ1NSX0JSRUFLOworCQlpZiAoSV9JR05QQVIodHR5KSkgCisJCQkvKiBSZWFsIHJhdyBtb2RlLiBJZ25vcmUgYWxsICovCisJCQlwb3J0LT5tYXJrX21hc2sgJj0gflJDU1JfT0U7CisJfQorCS8qIEVuYWJsZSBIYXJkd2FyZSBGbG93IENvbnRyb2wgKi8KKwlpZiAoQ19DUlRTQ1RTKHR0eSkpICB7CisjaWZkZWYgUklTQ09NX0JSQUlOX0RBTUFHRURfQ1RTCisJCXBvcnQtPklFUiB8PSBJRVJfRFNSIHwgSUVSX0NUUzsKKwkJbWNvcjEgfD0gTUNPUjFfRFNSWkQgfCBNQ09SMV9DVFNaRDsKKwkJbWNvcjIgfD0gTUNPUjJfRFNST0QgfCBNQ09SMl9DVFNPRDsKKwkJdHR5LT5od19zdG9wcGVkID0gIShyY19pbihicCwgQ0QxODBfTVNWUikgJiAoTVNWUl9DVFN8TVNWUl9EU1IpKTsKKyNlbHNlCisJCXBvcnQtPkNPUjIgfD0gQ09SMl9DVFNBRTsKKyNlbmRpZgorCX0KKwkvKiBFbmFibGUgU29mdHdhcmUgRmxvdyBDb250cm9sLiBGSVhNRTogSSdtIG5vdCBzdXJlIGFib3V0IHRoaXMgKi8KKwkvKiBTb21lIHBlb3BsZSByZXBvcnRlZCB0aGF0IGl0IHdvcmtzLCBidXQgSSBzdGlsbCBkb3VidCAqLworCWlmIChJX0lYT04odHR5KSkgIHsKKwkJcG9ydC0+Q09SMiB8PSBDT1IyX1RYSUJFOworCQljb3IzIHw9IChDT1IzX0ZDVCB8IENPUjNfU0NERSk7CisJCWlmIChJX0lYQU5ZKHR0eSkpCisJCQlwb3J0LT5DT1IyIHw9IENPUjJfSVhNOworCQlyY19vdXQoYnAsIENEMTgwX1NDSFIxLCBTVEFSVF9DSEFSKHR0eSkpOworCQlyY19vdXQoYnAsIENEMTgwX1NDSFIyLCBTVE9QX0NIQVIodHR5KSk7CisJCXJjX291dChicCwgQ0QxODBfU0NIUjMsIFNUQVJUX0NIQVIodHR5KSk7CisJCXJjX291dChicCwgQ0QxODBfU0NIUjQsIFNUT1BfQ0hBUih0dHkpKTsKKwl9CisJaWYgKCFDX0NMT0NBTCh0dHkpKSAgeworCQkvKiBFbmFibGUgQ0QgY2hlY2sgKi8KKwkJcG9ydC0+SUVSIHw9IElFUl9DRDsKKwkJbWNvcjEgfD0gTUNPUjFfQ0RaRDsKKwkJbWNvcjIgfD0gTUNPUjJfQ0RPRDsKKwl9CisJCisJaWYgKENfQ1JFQUQodHR5KSkgCisJCS8qIEVuYWJsZSByZWNlaXZlciAqLworCQlwb3J0LT5JRVIgfD0gSUVSX1JYRDsKKwkKKwkvKiBTZXQgaW5wdXQgRklGTyBzaXplICgxLTggYnl0ZXMpICovCisJY29yMyB8PSBSSVNDT01fUlhGSUZPOyAKKwkvKiBTZXR0aW5nIHVwIENEMTgwIGNoYW5uZWwgcmVnaXN0ZXJzICovCisJcmNfb3V0KGJwLCBDRDE4MF9DT1IxLCBjb3IxKTsKKwlyY19vdXQoYnAsIENEMTgwX0NPUjIsIHBvcnQtPkNPUjIpOworCXJjX291dChicCwgQ0QxODBfQ09SMywgY29yMyk7CisJLyogTWFrZSBDRDE4MCBrbm93IGFib3V0IHJlZ2lzdGVycyBjaGFuZ2UgKi8KKwlyY193YWl0X0NDUihicCk7CisJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9DT1JDSEcxIHwgQ0NSX0NPUkNIRzIgfCBDQ1JfQ09SQ0hHMyk7CisJLyogU2V0dGluZyB1cCBtb2RlbSBvcHRpb24gcmVnaXN0ZXJzICovCisJcmNfb3V0KGJwLCBDRDE4MF9NQ09SMSwgbWNvcjEpOworCXJjX291dChicCwgQ0QxODBfTUNPUjIsIG1jb3IyKTsKKwkvKiBFbmFibGUgQ0QxODAgdHJhbnNtaXR0ZXIgJiByZWNlaXZlciAqLworCXJjX3dhaXRfQ0NSKGJwKTsKKwlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1RYRU4gfCBDQ1JfUlhFTik7CisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwkvKiBBbmQgZmluYWxseSBzZXQgUlRTIG9uICovCisJcmNfb3V0KGJwLCBDRDE4MF9NU1ZSLCBwb3J0LT5NU1ZSKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KK3N0YXRpYyBpbnQgcmNfc2V0dXBfcG9ydChzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCwgc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCisJCXJldHVybiAwOworCQorCWlmICghcG9ydC0+eG1pdF9idWYpIHsKKwkJLyogV2UgbWF5IHNsZWVwIGluIGdldF96ZXJvZWRfcGFnZSgpICovCisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQkKKwkJaWYgKCEodG1wID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQkgICAgCisJCWlmIChwb3J0LT54bWl0X2J1ZikgeworCQkJZnJlZV9wYWdlKHRtcCk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJCXBvcnQtPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgdG1wOworCX0KKwkJCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCQkKKwlpZiAocG9ydC0+dHR5KSAKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnBvcnQtPnR0eS0+ZmxhZ3MpOworCQkKKwlpZiAocG9ydC0+Y291bnQgPT0gMSkgCisJCWJwLT5jb3VudCsrOworCQkKKwlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7CisJcmNfY2hhbmdlX3NwZWVkKGJwLCBwb3J0KTsKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwkJCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworc3RhdGljIHZvaWQgcmNfc2h1dGRvd25fcG9ydChzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCwgc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJCisJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIAorCQlyZXR1cm47CisJCisjaWZkZWYgUkNfUkVQT1JUX09WRVJSVU4KKwlwcmludGsoS0VSTl9JTkZPICJyYyVkOiBwb3J0ICVkOiBUb3RhbCAlbGQgb3ZlcnJ1bnMgd2VyZSBkZXRlY3RlZC5cbiIsCisJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSwgcG9ydC0+b3ZlcnJ1bik7CisjZW5kaWYJCisjaWZkZWYgUkNfUkVQT1JUX0ZJRk8KKwl7CisJCWludCBpOworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogcG9ydCAlZDogRklGTyBoaXRzIFsgIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSAgeworCQkJcHJpbnRrKCIlbGQgIiwgcG9ydC0+aGl0c1tpXSk7CisJCX0KKwkJcHJpbnRrKCJdLlxuIik7CisJfQorI2VuZGlmCQorCWlmIChwb3J0LT54bWl0X2J1ZikgIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwb3J0LT54bWl0X2J1Zik7CisJCXBvcnQtPnhtaXRfYnVmID0gTlVMTDsKKwl9CisKKwlpZiAoISh0dHkgPSBwb3J0LT50dHkpIHx8IENfSFVQQ0wodHR5KSkgIHsKKwkJLyogRHJvcCBEVFIgKi8KKwkJYnAtPkRUUiB8PSAoMXUgPDwgcG9ydF9Obyhwb3J0KSk7CisJCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsKKwl9CisJCisgICAgICAgIC8qIFNlbGVjdCBwb3J0ICovCisJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCS8qIFJlc2V0IHBvcnQgKi8KKwlyY193YWl0X0NDUihicCk7CisJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9TT0ZUUkVTRVQpOworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgZnJvbSB0aGlzIHBvcnQgKi8KKwlwb3J0LT5JRVIgPSAwOworCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCQorCWlmICh0dHkpICAKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CisJCisJaWYgKC0tYnAtPmNvdW50IDwgMCkgIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogcmNfc2h1dGRvd25fcG9ydDogIgorCQkJCSAiYmFkIGJvYXJkIGNvdW50OiAlZFxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgYnAtPmNvdW50KTsKKwkJYnAtPmNvdW50ID0gMDsKKwl9CisJCisJLyoKKwkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IG9wZW5lZCBwb3J0IG9uIHRoZSBib2FyZAorCSAqIHNodXRkb3duIHdob2xlIGJvYXJkCisJICovCisJaWYgKCFicC0+Y291bnQpIAorCQlyY19zaHV0ZG93bl9ib2FyZChicCk7Cit9CisKKwkKK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgIHN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJaW50ICAgIHJldHZhbDsKKwlpbnQgICAgZG9fY2xvY2FsID0gMDsKKwlpbnQgICAgQ0Q7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKKwkgKiB1bnRpbCBpdCdzIGRvbmUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJZWxzZQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisKKwkvKgorCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgb3IgdGhlIHBvcnQgaXMgbm90IGVuYWJsZWQsCisJICogdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udCBhbmQgdGhlbiBleGl0LgorCSAqLworCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8CisJICAgICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKENfQ0xPQ0FMKHR0eSkpICAKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiByc19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCWNsaSgpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydC0+Y291bnQtLTsKKwlzdGkoKTsKKwlwb3J0LT5ibG9ja2VkX29wZW4rKzsKKwl3aGlsZSAoMSkgeworCQljbGkoKTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlDRCA9IHJjX2luKGJwLCBDRDE4MF9NU1ZSKSAmIE1TVlJfQ0Q7CisJCXJjX291dChicCwgQ0QxODBfTVNWUiwgTVNWUl9SVFMpOworCQlicC0+RFRSICY9IH4oMXUgPDwgcG9ydF9Obyhwb3J0KSk7CisJCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsKKwkJc3RpKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCSAgICAhKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQorCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwkKKwkJCWJyZWFrOworCQl9CisJCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKwkJICAgIChkb19jbG9jYWwgfHwgQ0QpKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydC0+Y291bnQrKzsKKwlwb3J0LT5ibG9ja2VkX29wZW4tLTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCQorCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuIDA7Cit9CQorCitzdGF0aWMgaW50IHJjX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpbnQgYm9hcmQ7CisJaW50IGVycm9yOworCXN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQ7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqIGJwOworCQorCWJvYXJkID0gUkNfQk9BUkQodHR5LT5pbmRleCk7CisJaWYgKGJvYXJkID49IFJDX05CT0FSRCB8fCAhKHJjX2JvYXJkW2JvYXJkXS5mbGFncyAmIFJDX0JPQVJEX1BSRVNFTlQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlicCA9ICZyY19ib2FyZFtib2FyZF07CisJcG9ydCA9IHJjX3BvcnQgKyBib2FyZCAqIFJDX05QT1JUICsgUkNfUE9SVCh0dHktPmluZGV4KTsKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfb3BlbiIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlpZiAoKGVycm9yID0gcmNfc2V0dXBfYm9hcmQoYnApKSkgCisJCXJldHVybiBlcnJvcjsKKwkJCisJcG9ydC0+Y291bnQrKzsKKwl0dHktPmRyaXZlcl9kYXRhID0gcG9ydDsKKwlwb3J0LT50dHkgPSB0dHk7CisJCisJaWYgKChlcnJvciA9IHJjX3NldHVwX3BvcnQoYnAsIHBvcnQpKSkgCisJCXJldHVybiBlcnJvcjsKKwkKKwlpZiAoKGVycm9yID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgcG9ydCkpKQorCQlyZXR1cm4gZXJyb3I7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCQorCWlmICghcG9ydCB8fCByY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJjbG9zZSIpKQorCQlyZXR1cm47CisJCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlnb3RvIG91dDsKKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChwb3J0LT5jb3VudCAhPSAxKSkgIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmMlZDogcmNfY2xvc2U6IGJhZCBwb3J0IGNvdW50OyIKKwkJICAgICAgICIgdHR5LT5jb3VudCBpcyAxLCBwb3J0IGNvdW50IGlzICVkXG4iLAorCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0LT5jb3VudCk7CisJCXBvcnQtPmNvdW50ID0gMTsKKwl9CisJaWYgKC0tcG9ydC0+Y291bnQgPCAwKSAgeworCQlwcmludGsoS0VSTl9JTkZPICJyYyVkOiByY19jbG9zZTogYmFkIHBvcnQgY291bnQgIgorCQkJCSAiZm9yIHR0eSVkOiAlZFxuIiwKKwkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSwgcG9ydC0+Y291bnQpOworCQlwb3J0LT5jb3VudCA9IDA7CisJfQorCWlmIChwb3J0LT5jb3VudCkKKwkJZ290byBvdXQ7CisJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKwkvKgorCSAqIE5vdyB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXQgYnVmZmVyIHRvIGNsZWFyOyBhbmQgd2Ugbm90aWZ5IAorCSAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCisJICovCisJdHR5LT5jbG9zaW5nID0gMTsKKwlpZiAocG9ydC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydC0+Y2xvc2luZ193YWl0KTsKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2Ugc3RvcCBhY2NlcHRpbmcgaW5wdXQuICBUbyBkbyB0aGlzLCB3ZQorCSAqIGRpc2FibGUgdGhlIHJlY2VpdmUgbGluZSBzdGF0dXMgaW50ZXJydXB0cywgYW5kIHRlbGwgdGhlCisJICogaW50ZXJydXB0IGRyaXZlciB0byBzdG9wIGNoZWNraW5nIHRoZSBkYXRhIHJlYWR5IGJpdCBpbiB0aGUKKwkgKiBsaW5lIHN0YXR1cyByZWdpc3Rlci4KKwkgKi8KKwlwb3J0LT5JRVIgJj0gfklFUl9SWEQ7CisJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CisJCXBvcnQtPklFUiB8PSBJRVJfVFhFTVBUWTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwkJLyoKKwkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKKwkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5CisJCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCisJCSAqLworCQl0aW1lb3V0ID0gamlmZmllcytIWjsKKwkJd2hpbGUocG9ydC0+SUVSICYgSUVSX1RYRU1QVFkpICB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnQtPnRpbWVvdXQpKTsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJfQorCXJjX3NodXRkb3duX3BvcnQoYnAsIHBvcnQpOworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisKKwl0dHktPmNsb3NpbmcgPSAwOworCXBvcnQtPmV2ZW50ID0gMDsKKwlwb3J0LT50dHkgPSBOVUxMOworCWlmIChwb3J0LT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKHBvcnQtPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHBvcnQtPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCX0KKwlwb3J0LT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkV8QVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5jbG9zZV93YWl0KTsKK291dDoJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcmNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisJaW50IGMsIHRvdGFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY193cml0ZSIpKQorCQlyZXR1cm4gMDsKKwkKKwlicCA9IHBvcnRfQm9hcmQocG9ydCk7CisKKwlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpCisJCXJldHVybiAwOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJd2hpbGUgKDEpIHsKKwkJY2xpKCk7CQkKKwkJYyA9IG1pbl90KGludCwgY291bnQsIG1pbihTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9jbnQgLSAxLAorCQkJCQkgIFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2hlYWQpKTsKKwkJaWYgKGMgPD0gMCkgeworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlicmVhazsKKwkJfQorCisJCW1lbWNweShwb3J0LT54bWl0X2J1ZiArIHBvcnQtPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwkJcG9ydC0+eG1pdF9oZWFkID0gKHBvcnQtPnhtaXRfaGVhZCArIGMpICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJCXBvcnQtPnhtaXRfY250ICs9IGM7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQl0b3RhbCArPSBjOworCX0KKworCWNsaSgpOworCWlmIChwb3J0LT54bWl0X2NudCAmJiAhdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQgJiYKKwkgICAgIShwb3J0LT5JRVIgJiBJRVJfVFhSRFkpKSB7CisJCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CisJCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwkJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHBvcnQtPklFUik7CisJfQorCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgdm9pZCByY19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3B1dF9jaGFyIikpCisJCXJldHVybjsKKworCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZikKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCQorCWlmIChwb3J0LT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkKKwkJZ290byBvdXQ7CisKKwlwb3J0LT54bWl0X2J1Zltwb3J0LT54bWl0X2hlYWQrK10gPSBjaDsKKwlwb3J0LT54bWl0X2hlYWQgJj0gU0VSSUFMX1hNSVRfU0laRSAtIDE7CisJcG9ydC0+eG1pdF9jbnQrKzsKK291dDoJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJjX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX2ZsdXNoX2NoYXJzIikpCisJCXJldHVybjsKKwkKKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8CisJICAgICFwb3J0LT54bWl0X2J1ZikKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CisJcmNfb3V0KHBvcnRfQm9hcmQocG9ydCksIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJcmNfb3V0KHBvcnRfQm9hcmQocG9ydCksIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIGludCByY193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCWludAlyZXQ7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3dyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX2NoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKwkKKwlyZXR1cm4gcG9ydC0+eG1pdF9jbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHJjX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJcG9ydC0+eG1pdF9jbnQgPSBwb3J0LT54bWl0X2hlYWQgPSBwb3J0LT54bWl0X3RhaWwgPSAwOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl0dHlfd2FrZXVwKHR0eSk7Cit9CisKK3N0YXRpYyBpbnQgcmNfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqIGJwOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJCXJldHVybiAtRU5PREVWOworCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJc3RhdHVzID0gcmNfaW4oYnAsIENEMTgwX01TVlIpOworCXJlc3VsdCA9IHJjX2luKGJwLCBSQ19SSSkgJiAoMXUgPDwgcG9ydF9Obyhwb3J0KSkgPyAwIDogVElPQ01fUk5HOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXJlc3VsdCB8PSAoKHN0YXR1cyAmIE1TVlJfUlRTKSA/IFRJT0NNX1JUUyA6IDApCisJCXwgKChzdGF0dXMgJiBNU1ZSX0RUUikgPyBUSU9DTV9EVFIgOiAwKQorCQl8ICgoc3RhdHVzICYgTVNWUl9DRCkgID8gVElPQ01fQ0FSIDogMCkKKwkJfCAoKHN0YXR1cyAmIE1TVlJfRFNSKSA/IFRJT0NNX0RTUiA6IDApCisJCXwgKChzdGF0dXMgJiBNU1ZSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHJjX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisKKwlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCBfX0ZVTkNUSU9OX18pKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlwb3J0LT5NU1ZSIHw9IE1TVlJfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWJwLT5EVFIgJj0gfigxdSA8PCBwb3J0X05vKHBvcnQpKTsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJcG9ydC0+TVNWUiAmPSB+TVNWUl9SVFM7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlicC0+RFRSIHw9ICgxdSA8PCBwb3J0X05vKHBvcnQpKTsKKworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlyY19vdXQoYnAsIENEMTgwX01TVlIsIHBvcnQtPk1TVlIpOworCXJjX291dChicCwgUkNfRFRSLCBicC0+RFRSKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJjX3NlbmRfYnJlYWsoc3RydWN0IHJpc2NvbV9wb3J0ICogcG9ydCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCXBvcnQtPmJyZWFrX2xlbmd0aCA9IFJJU0NPTV9UUFMgLyBIWiAqIGxlbmd0aDsKKwlwb3J0LT5DT1IyIHw9IENPUjJfRVRDOworCXBvcnQtPklFUiAgfD0gSUVSX1RYUkRZOworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHBvcnQpKTsKKwlyY19vdXQoYnAsIENEMTgwX0NPUjIsIHBvcnQtPkNPUjIpOworCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCXJjX3dhaXRfQ0NSKGJwKTsKKwlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX0NPUkNIRzIpOworCXJjX3dhaXRfQ0NSKGJwKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmNfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQsCisJCQkJICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCA9IHBvcnRfQm9hcmQocG9ydCk7CisJaW50IGNoYW5nZV9zcGVlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCBuZXdpbmZvLCBzaXplb2YodG1wKSkpCisJCXJldHVybiAtRUZBVUxUOworCQorI2lmIDAJCisJaWYgKCh0bXAuaXJxICE9IGJwLT5pcnEpIHx8CisJICAgICh0bXAucG9ydCAhPSBicC0+YmFzZSkgfHwKKwkgICAgKHRtcC50eXBlICE9IFBPUlRfQ0lSUlVTKSB8fAorCSAgICAodG1wLmJhdWRfYmFzZSAhPSAoUkNfT1NDRlJFUSArIENEMTgwX1RQQy8yKSAvIENEMTgwX1RQQykgfHwKKwkgICAgKHRtcC5jdXN0b21fZGl2aXNvciAhPSAwKSB8fAorCSAgICAodG1wLnhtaXRfZmlmb19zaXplICE9IENEMTgwX05GSUZPKSB8fAorCSAgICAodG1wLmZsYWdzICYgflJJU0NPTV9MRUdBTF9GTEFHUykpCisJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCQorCQorCWNoYW5nZV9zcGVlZCA9ICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0KKwkJCSh0bXAuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpOworCQorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKHRtcC5jbG9zZV9kZWxheSAhPSBwb3J0LT5jbG9zZV9kZWxheSkgfHwKKwkJICAgICh0bXAuY2xvc2luZ193YWl0ICE9IHBvcnQtPmNsb3Npbmdfd2FpdCkgfHwKKwkJICAgICgodG1wLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgICAgIChwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKSAgCisJCQlyZXR1cm4gLUVQRVJNOworCQlwb3J0LT5mbGFncyA9ICgocG9ydC0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKwkJCSAgICAgICAodG1wLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwl9IGVsc2UgIHsKKwkJcG9ydC0+ZmxhZ3MgPSAoKHBvcnQtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCQkgICAgICAgKHRtcC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJCXBvcnQtPmNsb3NlX2RlbGF5ID0gdG1wLmNsb3NlX2RlbGF5OworCQlwb3J0LT5jbG9zaW5nX3dhaXQgPSB0bXAuY2xvc2luZ193YWl0OworCX0KKwlpZiAoY2hhbmdlX3NwZWVkKSAgeworCQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJCXJjX2NoYW5nZV9zcGVlZChicCwgcG9ydCk7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmNfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCByaXNjb21fcG9ydCAqIHBvcnQsCisJCQkJICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCXRtcC50eXBlID0gUE9SVF9DSVJSVVM7CisJdG1wLmxpbmUgPSBwb3J0IC0gcmNfcG9ydDsKKwl0bXAucG9ydCA9IGJwLT5iYXNlOworCXRtcC5pcnEgID0gYnAtPmlycTsKKwl0bXAuZmxhZ3MgPSBwb3J0LT5mbGFnczsKKwl0bXAuYmF1ZF9iYXNlID0gKFJDX09TQ0ZSRVEgKyBDRDE4MF9UUEMvMikgLyBDRDE4MF9UUEM7CisJdG1wLmNsb3NlX2RlbGF5ID0gcG9ydC0+Y2xvc2VfZGVsYXkgKiBIWi8xMDA7CisJdG1wLmNsb3Npbmdfd2FpdCA9IHBvcnQtPmNsb3Npbmdfd2FpdCAqIEhaLzEwMDsKKwl0bXAueG1pdF9maWZvX3NpemUgPSBDRDE4MF9ORklGTzsKKwlyZXR1cm4gY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZih0bXApKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHJjX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisJCSAgICAKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcmV0dmFsOworCQkJCQorCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY19pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCSBjYXNlIFRDU0JSSzoJLyogU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrICovCisJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJaWYgKCFhcmcpCisJCQlyY19zZW5kX2JyZWFrKHBvcnQsIEhaLzQpOwkvKiAxLzQgc2Vjb25kICovCisJCWJyZWFrOworCSBjYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQlyY19zZW5kX2JyZWFrKHBvcnQsIGFyZyA/IGFyZyooSFovMTApIDogSFovNCk7CisJCWJyZWFrOworCSBjYXNlIFRJT0NHU09GVENBUjoKKwkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApOworCSBjYXNlIFRJT0NTU09GVENBUjoKKwkJaWYgKGdldF91c2VyKGFyZywodW5zaWduZWQgX191c2VyICopIGFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9CisJCQkoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKKwkJCShhcmcgPyBDTE9DQUwgOiAwKSk7CisJCWJyZWFrOworCSBjYXNlIFRJT0NHU0VSSUFMOgkKKwkJcmV0dXJuIHJjX2dldF9zZXJpYWxfaW5mbyhwb3J0LCBhcmdwKTsKKwkgY2FzZSBUSU9DU1NFUklBTDoJCisJCXJldHVybiByY19zZXRfc2VyaWFsX2luZm8ocG9ydCwgYXJncCk7CisJIGRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByY190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY190aHJvdHRsZSIpKQorCQlyZXR1cm47CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlwb3J0LT5NU1ZSICY9IH5NU1ZSX1JUUzsKKwlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJaWYgKElfSVhPRkYodHR5KSkgIHsKKwkJcmNfd2FpdF9DQ1IoYnApOworCQlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1NTQ0gyKTsKKwkJcmNfd2FpdF9DQ1IoYnApOworCX0KKwlyY19vdXQoYnAsIENEMTgwX01TVlIsIHBvcnQtPk1TVlIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByY191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3VudGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJcG9ydC0+TVNWUiB8PSBNU1ZSX1JUUzsKKwlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJaWYgKElfSVhPRkYodHR5KSkgIHsKKwkJcmNfd2FpdF9DQ1IoYnApOworCQlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1NTQ0gxKTsKKwkJcmNfd2FpdF9DQ1IoYnApOworCX0KKwlyY19vdXQoYnAsIENEMTgwX01TVlIsIHBvcnQtPk1TVlIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByY19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3N0b3AiKSkKKwkJcmV0dXJuOworCQorCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKKwkKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CisJcmNfb3V0KGJwLCBDRDE4MF9DQVIsIHBvcnRfTm8ocG9ydCkpOworCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByY19zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQorCWlmIChyY19wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJyY19zdGFydCIpKQorCQlyZXR1cm47CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlpZiAocG9ydC0+eG1pdF9jbnQgJiYgcG9ydC0+eG1pdF9idWYgJiYgIShwb3J0LT5JRVIgJiBJRVJfVFhSRFkpKSAgeworCQlwb3J0LT5JRVIgfD0gSUVSX1RYUkRZOworCQlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CisJCXJjX291dChicCwgQ0QxODBfSUVSLCBwb3J0LT5JRVIpOworCX0KKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB0aGUgd29yayBxdWV1ZSB3aGVuIHRoZSBpbnRlcnJ1cHQKKyAqIHJvdXRpbmUgaGFzIHNpZ25hbGxlZCB0aGF0IGEgaGFuZ3VwIGhhcyBvY2N1cnJlZC4gIFRoZSBwYXRoIG9mCisgKiBoYW5ndXAgcHJvY2Vzc2luZyBpczoKKyAqCisgKiAJc2VyaWFsIGludGVycnVwdCByb3V0aW5lIC0+ICh3b3JrcXVldWUpIC0+CisgKiAJZG9fcmNfaGFuZ3VwKCkgLT4gdHR5LT5oYW5ndXAoKSAtPiByY19oYW5ndXAoKQorICogCisgKi8KK3N0YXRpYyB2b2lkIGRvX3JjX2hhbmd1cCh2b2lkICpwcml2YXRlXykKK3sKKwlzdHJ1Y3QgcmlzY29tX3BvcnQJKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CisJCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICh0dHkpCisJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2Ugc3RpbGwgaGVyZSAqLworfQorCitzdGF0aWMgdm9pZCByY19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0ID0gKHN0cnVjdCByaXNjb21fcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnA7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX2hhbmd1cCIpKQorCQlyZXR1cm47CisJCisJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOworCQorCXJjX3NodXRkb3duX3BvcnQoYnAsIHBvcnQpOworCXBvcnQtPmV2ZW50ID0gMDsKKwlwb3J0LT5jb3VudCA9IDA7CisJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcG9ydC0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIHJjX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJCisJaWYgKHJjX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgInJjX3NldF90ZXJtaW9zIikpCisJCXJldHVybjsKKwkKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnICYmCisJICAgIHR0eS0+dGVybWlvcy0+Y19pZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19pZmxhZykKKwkJcmV0dXJuOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCXJjX2NoYW5nZV9zcGVlZChwb3J0X0JvYXJkKHBvcnQpLCBwb3J0KTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCXJjX3N0YXJ0KHR0eSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKQoreworCXN0cnVjdCByaXNjb21fcG9ydAkqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKikgcHJpdmF0ZV87CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwkKKwlpZighKHR0eSA9IHBvcnQtPnR0eSkpIAorCQlyZXR1cm47CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJTX0VWRU5UX1dSSVRFX1dBS0VVUCwgJnBvcnQtPmV2ZW50KSkgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcmlzY29tX29wcyA9IHsKKwkub3BlbiAgPSByY19vcGVuLAorCS5jbG9zZSA9IHJjX2Nsb3NlLAorCS53cml0ZSA9IHJjX3dyaXRlLAorCS5wdXRfY2hhciA9IHJjX3B1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IHJjX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gcmNfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gcmNfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSByY19mbHVzaF9idWZmZXIsCisJLmlvY3RsID0gcmNfaW9jdGwsCisJLnRocm90dGxlID0gcmNfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSByY191bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IHJjX3NldF90ZXJtaW9zLAorCS5zdG9wID0gcmNfc3RvcCwKKwkuc3RhcnQgPSByY19zdGFydCwKKwkuaGFuZ3VwID0gcmNfaGFuZ3VwLAorCS50aW9jbWdldCA9IHJjX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IHJjX3Rpb2Ntc2V0LAorfTsKKworc3RhdGljIGlubGluZSBpbnQgcmNfaW5pdF9kcml2ZXJzKHZvaWQpCit7CisJaW50IGVycm9yOworCWludCBpOworCisJcmlzY29tX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoUkNfTkJPQVJEICogUkNfTlBPUlQpOworCWlmICghcmlzY29tX2RyaXZlcikJCisJCXJldHVybiAtRU5PTUVNOworCQorCWlmICghKHRtcF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmM6IENvdWxkbid0IGdldCBmcmVlIHBhZ2UuXG4iKTsKKwkJcHV0X3R0eV9kcml2ZXIocmlzY29tX2RyaXZlcik7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQoSVJRX3RvX2JvYXJkLCAwLCBzaXplb2YoSVJRX3RvX2JvYXJkKSk7CisJcmlzY29tX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlyaXNjb21fZHJpdmVyLT5uYW1lID0gInR0eUwiOworCXJpc2NvbV9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL0wiOworCXJpc2NvbV9kcml2ZXItPm1ham9yID0gUklTQ09NOF9OT1JNQUxfTUFKT1I7CisJcmlzY29tX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJcmlzY29tX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlyaXNjb21fZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJcmlzY29tX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJcmlzY29tX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhyaXNjb21fZHJpdmVyLCAmcmlzY29tX29wcyk7CisJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIocmlzY29tX2RyaXZlcikpKSAgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJCXB1dF90dHlfZHJpdmVyKHJpc2NvbV9kcml2ZXIpOworCQlwcmludGsoS0VSTl9FUlIgInJjOiBDb3VsZG4ndCByZWdpc3RlciBSSVNDb20vOCBkcml2ZXIsICIKKwkJCQkiZXJyb3IgPSAlZFxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbWVtc2V0KHJjX3BvcnQsIDAsIHNpemVvZihyY19wb3J0KSk7CisJZm9yIChpID0gMDsgaSA8IFJDX05QT1JUICogUkNfTkJPQVJEOyBpKyspICB7CisJCXJjX3BvcnRbaV0ubWFnaWMgPSBSSVNDT004X01BR0lDOworCQlJTklUX1dPUksoJnJjX3BvcnRbaV0udHF1ZXVlLCBkb19zb2Z0aW50LCAmcmNfcG9ydFtpXSk7CisJCUlOSVRfV09SSygmcmNfcG9ydFtpXS50cXVldWVfaGFuZ3VwLCBkb19yY19oYW5ndXAsICZyY19wb3J0W2ldKTsKKwkJcmNfcG9ydFtpXS5jbG9zZV9kZWxheSA9IDUwICogSFovMTAwOworCQlyY19wb3J0W2ldLmNsb3Npbmdfd2FpdCA9IDMwMDAgKiBIWi8xMDA7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJjX3BvcnRbaV0ub3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcmNfcG9ydFtpXS5jbG9zZV93YWl0KTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJjX3JlbGVhc2VfZHJpdmVycyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJpc2NvbV9kcml2ZXIpOworCXB1dF90dHlfZHJpdmVyKHJpc2NvbV9kcml2ZXIpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisjaWZuZGVmIE1PRFVMRQorLyoKKyAqIENhbGxlZCBhdCBib290IHRpbWUuCisgKiAKKyAqIFlvdSBjYW4gc3BlY2lmeSBJTyBiYXNlIGZvciB1cCB0byBSQ19OQk9BUkQgY2FyZHMsCisgKiB1c2luZyBsaW5lICJyaXNjb204PTB4aW9iYXNlMSwweGlvYmFzZTIsLi4iIGF0IExJTE8gcHJvbXB0LgorICogTm90ZSB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gcHJvYmluZyBhdCBkZWZhdWx0CisgKiBhZGRyZXNzZXMgaW4gdGhpcyBjYXNlLgorICoKKyAqLyAKK3N0YXRpYyBpbnQgX19pbml0IHJpc2NvbThfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzW1JDX05CT0FSRF07CisJaW50IGk7CisKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJZm9yIChpID0gMDsgaSA8IFJDX05CT0FSRDsgaSsrKSB7CisJCWlmIChpIDwgaW50c1swXSkKKwkJCXJjX2JvYXJkW2ldLmJhc2UgPSBpbnRzW2krMV07CisJCWVsc2UgCisJCQlyY19ib2FyZFtpXS5iYXNlID0gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInJpc2NvbTg9IiwgcmlzY29tOF9zZXR1cCk7CisjZW5kaWYKKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9CisJS0VSTl9JTkZPICJyYzogU0RMIFJJU0NvbS84IGNhcmQgZHJpdmVyIHYxLjEsIChjKSBELkdvcm9kY2hhbmluICIKKwkJICAiMTk5NC0xOTk2LlxuIjsKK3N0YXRpYyBjaGFyIG5vX2JvYXJkc19tc2dbXSBfX2luaXRkYXRhID0KKwlLRVJOX0lORk8gInJjOiBObyBSSVNDb20vOCBib2FyZHMgZGV0ZWN0ZWQuXG4iOworCisvKiAKKyAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBieSBrZXJuZWwgYXQgYm9vdCB0aW1lIAorICovCitzdGF0aWMgaW50IF9faW5pdCByaXNjb204X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgZm91bmQgPSAwOworCisJcHJpbnRrKGJhbm5lcik7CisKKwlpZiAocmNfaW5pdF9kcml2ZXJzKCkpIAorCQlyZXR1cm4gLUVJTzsKKworCWZvciAoaSA9IDA7IGkgPCBSQ19OQk9BUkQ7IGkrKykgCisJCWlmIChyY19ib2FyZFtpXS5iYXNlICYmICFyY19wcm9iZSgmcmNfYm9hcmRbaV0pKSAgCisJCQlmb3VuZCsrOworCQorCWlmICghZm91bmQpICB7CisJCXJjX3JlbGVhc2VfZHJpdmVycygpOworCQlwcmludGsobm9fYm9hcmRzX21zZyk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGludCBpb2Jhc2U7CitzdGF0aWMgaW50IGlvYmFzZTE7CitzdGF0aWMgaW50IGlvYmFzZTI7CitzdGF0aWMgaW50IGlvYmFzZTM7CitNT0RVTEVfUEFSTShpb2Jhc2UsICJpIik7CitNT0RVTEVfUEFSTShpb2Jhc2UxLCAiaSIpOworTU9EVUxFX1BBUk0oaW9iYXNlMiwgImkiKTsKK01PRFVMRV9QQVJNKGlvYmFzZTMsICJpIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworLyoKKyAqIFlvdSBjYW4gc2V0dXAgdXAgdG8gNCBib2FyZHMgKGN1cnJlbnQgdmFsdWUgb2YgUkNfTkJPQVJEKQorICogYnkgc3BlY2lmeWluZyAiaW9iYXNlPTB4WFhYIGlvYmFzZTE9MHhYWFggLi4uIiBhcyBpbnNtb2QgcGFyYW1ldGVyLgorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgcmlzY29tOF9pbml0X21vZHVsZSAodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlpbnQgaTsKKworCWlmIChpb2Jhc2UgfHwgaW9iYXNlMSB8fCBpb2Jhc2UyIHx8IGlvYmFzZTMpIHsKKwkJZm9yKGkgPSAwOyBpIDwgUkNfTkJPQVJEOyBpKyspCisJCQlyY19ib2FyZFswXS5iYXNlID0gMDsKKwl9CisKKwlpZiAoaW9iYXNlKQorCQlyY19ib2FyZFswXS5iYXNlID0gaW9iYXNlOworCWlmIChpb2Jhc2UxKQorCQlyY19ib2FyZFsxXS5iYXNlID0gaW9iYXNlMTsKKwlpZiAoaW9iYXNlMikKKwkJcmNfYm9hcmRbMl0uYmFzZSA9IGlvYmFzZTI7CisJaWYgKGlvYmFzZTMpCisJCXJjX2JvYXJkWzNdLmJhc2UgPSBpb2Jhc2UzOworI2VuZGlmIC8qIE1PRFVMRSAqLworCisJcmV0dXJuIHJpc2NvbThfaW5pdCgpOworfQorCQorc3RhdGljIHZvaWQgX19leGl0IHJpc2NvbThfZXhpdF9tb2R1bGUgKHZvaWQpCit7CisJaW50IGk7CisJCisJcmNfcmVsZWFzZV9kcml2ZXJzKCk7CisJZm9yIChpID0gMDsgaSA8IFJDX05CT0FSRDsgaSsrKSAgCisJCWlmIChyY19ib2FyZFtpXS5mbGFncyAmIFJDX0JPQVJEX1BSRVNFTlQpIAorCQkJcmNfcmVsZWFzZV9pb19yYW5nZSgmcmNfYm9hcmRbaV0pOworCQorfQorCittb2R1bGVfaW5pdChyaXNjb204X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHJpc2NvbThfZXhpdF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlzY29tOC5oIGIvZHJpdmVycy9jaGFyL3Jpc2NvbTguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE3YWFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpc2NvbTguaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqICAgICAgbGludXgvZHJpdmVycy9jaGFyL3Jpc2NvbTguaCAgLS0gUklTQ29tLzggbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiAgRG1pdHJ5IEdvcm9kY2hhbmluIChwZ21kc2dAaWJpLmNvbSkKKyAqCisgKiAgICAgIFRoaXMgY29kZSBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBMaW51eCBzZXJpYWwgZHJpdmVyLCB3cml0dGVuIGJ5CisgKiAgICAgIExpbnVzIFRvcnZhbGRzLCBUaGVvZG9yZSBUJ3NvIGFuZCBvdGhlcnMuIFRoZSBSSVNDb20vOCBjYXJkIAorICogICAgICBwcm9ncmFtbWluZyBpbmZvIHdhcyBvYnRhaW5lZCBmcm9tIHZhcmlvdXMgZHJpdmVycyBmb3Igb3RoZXIgT1NlcyAKKyAqCShGcmVlQlNELCBJU0MsIGV0YyksIGJ1dCBubyBzb3VyY2UgY29kZSBmcm9tIHRob3NlIGRyaXZlcnMgd2VyZSAKKyAqCWRpcmVjdGx5IGluY2x1ZGVkIGluIHRoaXMgZHJpdmVyLgorICoKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1JJU0NPTThfSAorI2RlZmluZSBfX0xJTlVYX1JJU0NPTThfSAorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgUkNfTkJPQVJECQk0CisvKiBOT1RFOiBSSVNDb20gZGVjb2RlciByZWNvZ25pemVzIDE2IGFkZHJlc3Nlcy4uLiAqLworI2RlZmluZSBSQ19OUE9SVCAgICAgICAgCTggIAorI2RlZmluZSBSQ19CT0FSRChsaW5lKQkJKCgobGluZSkgPj4gMykgJiAweDA3KQorI2RlZmluZSBSQ19QT1JUKGxpbmUpCQkoKGxpbmUpICYgKFJDX05QT1JUIC0gMSkpCisKKy8qIFRpY2tzIHBlciBzZWMuIFVzZWQgZm9yIHNldHRpbmcgcmVjZWl2ZXIgdGltZW91dCBhbmQgYnJlYWsgbGVuZ3RoICovCisjZGVmaW5lIFJJU0NPTV9UUFMJCTQwMDAKKworLyogWWVhaCwgYWZ0ZXIgaGVhdnkgdGVzdGluZyBJIGRlY2lkZWQgaXQgbXVzdCBiZSA2LgorICogU3VyZSwgWW91IGNhbiBjaGFuZ2UgaXQgaWYgbmVlZGVkLgorICovCisjZGVmaW5lIFJJU0NPTV9SWEZJRk8JCTYJLyogTWF4LiByZWNlaXZlciBGSUZPIHNpemUgKDEtOCkgKi8KKworI2RlZmluZSBSSVNDT004X01BR0lDCQkweDA5MDcKKworI2RlZmluZSBSQ19JT0JBU0UxCTB4MjIwCisjZGVmaW5lIFJDX0lPQkFTRTIJMHgyNDAKKyNkZWZpbmUgUkNfSU9CQVNFMwkweDI1MAorI2RlZmluZSBSQ19JT0JBU0U0CTB4MjYwCisKK3N0cnVjdCByaXNjb21fYm9hcmQgeworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydAliYXNlOworCXVuc2lnbmVkIGNoYXIgCWlycTsKKwlzaWduZWQgICBjaGFyCWNvdW50OworCXVuc2lnbmVkIGNoYXIJRFRSOworfTsKKworI2RlZmluZSBSQ19CT0FSRF9QUkVTRU5UCTB4MDAwMDAwMDEKKyNkZWZpbmUgUkNfQk9BUkRfQUNUSVZFCQkweDAwMDAwMDAyCisJCitzdHJ1Y3QgcmlzY29tX3BvcnQgeworCWludAkJCW1hZ2ljOworCWludAkJCWJhdWRfYmFzZTsKKwlpbnQJCQlmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAJKiB0dHk7CisJaW50CQkJY291bnQ7CisJaW50CQkJYmxvY2tlZF9vcGVuOworCWxvbmcJCQlldmVudDsgLyogbG9uZyByZXEnZCBmb3Igc2V0X2JpdCAtLVJSICovCisJaW50CQkJdGltZW91dDsKKwlpbnQJCQljbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBjaGFyIAkJKiB4bWl0X2J1ZjsKKwlpbnQJCQljdXN0b21fZGl2aXNvcjsKKwlpbnQJCQl4bWl0X2hlYWQ7CisJaW50CQkJeG1pdF90YWlsOworCWludAkJCXhtaXRfY250OworCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OworCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0CXRxdWV1ZV9oYW5ndXA7CisJc2hvcnQJCQl3YWtldXBfY2hhcnM7CisJc2hvcnQJCQlicmVha19sZW5ndGg7CisJdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDsKKwl1bnNpZ25lZCBjaGFyCQltYXJrX21hc2s7CisJdW5zaWduZWQgY2hhcgkJSUVSOworCXVuc2lnbmVkIGNoYXIJCU1TVlI7CisJdW5zaWduZWQgY2hhcgkJQ09SMjsKKyNpZmRlZiBSQ19SRVBPUlRfT1ZFUlJVTgorCXVuc2lnbmVkIGxvbmcJCW92ZXJydW47CisjZW5kaWYJCisjaWZkZWYgUkNfUkVQT1JUX0ZJRk8KKwl1bnNpZ25lZCBsb25nCQloaXRzWzEwXTsKKyNlbmRpZgorfTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0xJTlVYX1JJU0NPTThfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbThfcmVnLmggYi9kcml2ZXJzL2NoYXIvcmlzY29tOF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzI0NzVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Jpc2NvbThfcmVnLmgKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiAgICAgIGxpbnV4L2RyaXZlcnMvY2hhci9yaXNjb204X3JlZy5oICAtLSBSSVNDb20vOCBtdWx0aXBvcnQgc2VyaWFsIGRyaXZlci4KKyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIFJJU0NvbS84IEFzeW5jIE11eCBjYXJkIGJ5IFNETCBDb21tdW5pY2F0aW9ucywgSW5jLgorICovCisKKy8qCisgKiBBZGRyZXNzIG1hcHBpbmcgYmV0d2VlbiBDaXJydXMgTG9naWMgQ0QxODAgY2hpcCBpbnRlcm5hbCByZWdpc3RlcnMKKyAqIGFuZCBJU0EgcG9ydCBhZGRyZXNzZXM6CisgKgorICogICAgICBDTC1DRDE4MCAgICAgICAgICAgICAgICBBNiAgQTUgICBBNCAgQTMgICAgICAgICAgICAgICAgICAgICAgQTIgQTEgQTAKKyAqICAgICAgSVNBICAgICAgICAgICAgIEExNSBBMTQgQTEzIEExMiAgQTExIEExMCBBOSBBOCAgQTcgQTYgQTUgQTQgIEEzIEEyIEExIEEwCisgKi8KKyNkZWZpbmUgUkNfVE9fSVNBKHIpICAgICgoKChyKSYweDA3KTw8MSkgfCAoKChyKSZ+MHgwNyk8PDcpKQorCisKKy8qIFJJU0NvbS84IE9uLUJvYXJkIFJlZ2lzdGVycyAoYXNzdW1pbmcgYWRkcmVzcyB0cmFuc2xhdGlvbikgKi8KKworI2RlZmluZSBSQ19SSSAgICAgICAgICAgMHgxMDAgICAvKiBSaW5nIEluZGljYXRvciBSZWdpc3RlciAoUi9PKSAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNfRFRSICAgICAgICAgIDB4MTAwICAgLyogRFRSIFJlZ2lzdGVyIChXL08pICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDX0JTUiAgICAgICAgICAweDEwMSAgIC8qIEJvYXJkIFN0YXR1cyBSZWdpc3RlciAoUi9PKSAgICAgICAgICAgICAqLworI2RlZmluZSBSQ19DVE9VVCAgICAgICAgMHgxMDEgICAvKiBDbGVhciBUaW1lb3V0IChXL08pICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBCb2FyZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBSQ19CU1JfVE9VVCAgICAgMHgwOCAgICAgLyogSGFyZHdhcmUgVGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNfQlNSX1JJTlQgICAgIDB4MDQgICAgIC8qIFJlY2VpdmVyIEludGVycnVwdCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDX0JTUl9USU5UICAgICAweDAyICAgICAvKiBUcmFuc21pdHRlciBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ19CU1JfTUlOVCAgICAgMHgwMSAgICAgLyogTW9kZW0gQ3RsIEludGVycnVwdCAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBPbi1ib2FyZCBvc2NpbGxhdG9yIGZyZXF1ZW5jeSAoaW4gSHopICovCisjZGVmaW5lIFJDX09TQ0ZSRVEgICAgICA5ODMwNDAwCisKKy8qIFZhbHVlcyBvZiBjaG9pY2UgZm9yIEludGVycnVwdCBBQ0tzICovCisjZGVmaW5lIFJDX0FDS19NSU5UICAgICAweDgxICAgIC8qIGdvZXMgdG8gUElMUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ19BQ0tfUklOVCAgICAgMHg4MiAgICAvKiBnb2VzIHRvIFBJTFIzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNfQUNLX1RJTlQgICAgIDB4ODQgICAgLyogZ29lcyB0byBQSUxSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIENoaXAgSUQgKHNvcnJ5LCBvbmx5IG9uZSBjaGlwIG5vdykgKi8KKyNkZWZpbmUgUkNfSUQgICAgICAgICAgIDB4MTAKKworLyogRGVmaW5pdGlvbnMgZm9yIENpcnJ1cyBMb2dpYyBDTC1DRDE4MCA4LXBvcnQgYXN5bmMgbXV4IGNoaXAgKi8KKyAKKyNkZWZpbmUgQ0QxODBfTkNIICAgICAgIDggICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1RQQyAgICAgICAxNiAgICAgIC8qIFRpY2tzIHBlciBjaGFyYWN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9ORklGTwk4CS8qIFRYIEZJRk8gc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEdsb2JhbCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBDRDE4MF9HSVZSICAgICAgMHg0MCAgICAvKiBHbG9iYWwgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfR0lDUiAgICAgIDB4NDEgICAgLyogR2xvYmFsIEludGVycnVwdGluZyBDaGFubmVsIFJlZ2lzdGVyICAgICovCisjZGVmaW5lIENEMTgwX1BJTFIxICAgICAweDYxICAgIC8qIFByaW9yaXR5IEludGVycnVwdCBMZXZlbCBSZWdpc3RlciAxICAgICAqLworI2RlZmluZSBDRDE4MF9QSUxSMiAgICAgMHg2MiAgICAvKiBQcmlvcml0eSBJbnRlcnJ1cHQgTGV2ZWwgUmVnaXN0ZXIgMiAgICAgKi8KKyNkZWZpbmUgQ0QxODBfUElMUjMgICAgIDB4NjMgICAgLyogUHJpb3JpdHkgSW50ZXJydXB0IExldmVsIFJlZ2lzdGVyIDMgICAgICovCisjZGVmaW5lIENEMTgwX0NBUiAgICAgICAweDY0ICAgIC8qIENoYW5uZWwgQWNjZXNzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9HRlJDUiAgICAgMHg2YiAgICAvKiBHbG9iYWwgRmlybXdhcmUgUmV2aXNpb24gQ29kZSBSZWdpc3RlciAgKi8KKyNkZWZpbmUgQ0QxODBfUFBSSCAgICAgIDB4NzAgICAgLyogUHJlc2NhbGVyIFBlcmlvZCBSZWdpc3RlciBIaWdoICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1BQUkwgICAgICAweDcxICAgIC8qIFByZXNjYWxlciBQZXJpb2QgUmVnaXN0ZXIgTG93ICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9SRFIgICAgICAgMHg3OCAgICAvKiBSZWNlaXZlciBEYXRhIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfUkNTUiAgICAgIDB4N2EgICAgLyogUmVjZWl2ZXIgQ2hhcmFjdGVyIFN0YXR1cyBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIENEMTgwX1REUiAgICAgICAweDdiICAgIC8qIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9FT0lSICAgICAgMHg3ZiAgICAvKiBFbmQgb2YgSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIENEMTgwX0NDUiAgICAgICAweDAxICAgIC8qIENoYW5uZWwgQ29tbWFuZCBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9JRVIgICAgICAgMHgwMiAgICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfQ09SMSAgICAgIDB4MDMgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX0NPUjIgICAgICAweDA0ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDIgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9DT1IzICAgICAgMHgwNSAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfQ0NTUiAgICAgIDB4MDYgICAgLyogQ2hhbm5lbCBDb250cm9sIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1JEQ1IgICAgICAweDA3ICAgIC8qIFJlY2VpdmUgRGF0YSBDb3VudCBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9TQ0hSMSAgICAgMHgwOSAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAxICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfU0NIUjIgICAgIDB4MGEgICAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMiAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX1NDSFIzICAgICAweDBiICAgIC8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDMgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9TQ0hSNCAgICAgMHgwYyAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciA0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfTUNPUjEgICAgIDB4MTAgICAgLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiAxIFJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX01DT1IyICAgICAweDExICAgIC8qIE1vZGVtIENoYW5nZSBPcHRpb24gMiBSZWdpc3RlciAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9NQ1IgICAgICAgMHgxMiAgICAvKiBNb2RlbSBDaGFuZ2UgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfUlRQUiAgICAgIDB4MTggICAgLyogUmVjZWl2ZSBUaW1lb3V0IFBlcmlvZCBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIENEMTgwX01TVlIgICAgICAweDI4ICAgIC8qIE1vZGVtIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9SQlBSSCAgICAgMHgzMSAgICAvKiBSZWNlaXZlIEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgSGlnaCAgKi8KKyNkZWZpbmUgQ0QxODBfUkJQUkwgICAgIDB4MzIgICAgLyogUmVjZWl2ZSBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyIExvdyAgICovCisjZGVmaW5lIENEMTgwX1RCUFJIICAgICAweDM5ICAgIC8qIFRyYW5zbWl0IEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgSGlnaCAqLworI2RlZmluZSBDRDE4MF9UQlBSTCAgICAgMHgzYSAgICAvKiBUcmFuc21pdCBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyIExvdyAgKi8KKworCisvKiBHbG9iYWwgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAoUi9XKSAqLworCisjZGVmaW5lIEdJVlJfSVRNQVNLICAgICAweDA3ICAgICAvKiBJbnRlcnJ1cHQgdHlwZSBtYXNrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdJVlJfSVRfTU9ERU0gICAweDAxICAgIC8qIE1vZGVtIFNpZ25hbCBDaGFuZ2UgSW50ZXJydXB0ICAgICAgICAgICAqLworI2RlZmluZSAgR0lWUl9JVF9UWCAgICAgIDB4MDIgICAgLyogVHJhbnNtaXQgRGF0YSBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBHSVZSX0lUX1JDViAgICAgMHgwMyAgICAvKiBSZWNlaXZlIEdvb2QgRGF0YSBJbnRlcnJ1cHQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdJVlJfSVRfUkVYQyAgICAweDA3ICAgIC8qIFJlY2VpdmUgRXhjZXB0aW9uIEludGVycnVwdCAgICAgICAgICAgICAqLworCisKKy8qIEdsb2JhbCBJbnRlcnJ1cHQgQ2hhbm5lbCBSZWdpc3RlciAoUi9XKSAqLworIAorI2RlZmluZSBHSUNSX0NIQU4gICAgICAgMHgxYyAgICAvKiBDaGFubmVsIE51bWJlciBNYXNrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0lDUl9DSEFOX09GRiAgIDIgICAgICAgLyogQ2hhbm5lbCBOdW1iZXIgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICovCisKKworLyogQ2hhbm5lbCBBZGRyZXNzIFJlZ2lzdGVyIChSL1cpICovCisKKyNkZWZpbmUgQ0FSX0NIQU4gICAgICAgIDB4MDcgICAgLyogQ2hhbm5lbCBOdW1iZXIgTWFzayAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUl9BNyAgICAgICAgICAweDA4ICAgIC8qIEE3IEFkZHJlc3MgRXh0ZW5zaW9uICh1bnVzZWQpICAgICAgICAgICAqLworCisKKy8qIFJlY2VpdmUgQ2hhcmFjdGVyIFN0YXR1cyBSZWdpc3RlciAoUi9PKSAqLworCisjZGVmaW5lIFJDU1JfVE9VVCAgICAgICAweDgwICAgIC8qIFJ4IFRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX1NDREVUICAgICAgMHg3MCAgICAvKiBTcGVjaWFsIENoYXJhY3RlciBEZXRlY3RlZCBNYXNrICAgICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfTk9fU0MgICAgICAweDAwICAgLyogTm8gU3BlY2lhbCBDaGFyYWN0ZXJzIERldGVjdGVkICAgICAgICAgICovCisjZGVmaW5lICBSQ1NSX1NDXzEgICAgICAgMHgxMCAgIC8qIFNwZWNpYWwgQ2hhciAxIChvciAxICYgMykgRGV0ZWN0ZWQgICAgICAqLworI2RlZmluZSAgUkNTUl9TQ18yICAgICAgIDB4MjAgICAvKiBTcGVjaWFsIENoYXIgMiAob3IgMiAmIDQpIERldGVjdGVkICAgICAgKi8KKyNkZWZpbmUgIFJDU1JfU0NfMyAgICAgICAweDMwICAgLyogU3BlY2lhbCBDaGFyIDMgRGV0ZWN0ZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBSQ1NSX1NDXzQgICAgICAgMHg0MCAgIC8qIFNwZWNpYWwgQ2hhciA0IERldGVjdGVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX0JSRUFLICAgICAgMHgwOCAgICAvKiBCcmVhayBoYXMgYmVlbiBkZXRlY3RlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNTUl9QRSAgICAgICAgIDB4MDQgICAgLyogUGFyaXR5IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDU1JfRkUgICAgICAgICAweDAyICAgIC8qIEZyYW1lIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1NSX09FICAgICAgICAgMHgwMSAgICAvKiBPdmVycnVuIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgKFIvVykgKGNvbW1hbmRzIGluIGdyb3VwcyBjYW4gYmUgT1ItZWQpICovCisKKyNkZWZpbmUgQ0NSX0hBUkRSRVNFVCAgIDB4ODEgICAgLyogUmVzZXQgdGhlIGNoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX1NPRlRSRVNFVCAgIDB4ODAgICAgLyogU29mdCBDaGFubmVsIFJlc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX0NPUkNIRzEgICAgIDB4NDIgICAgLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSBDaGFuZ2VkICAgICAgICovCisjZGVmaW5lIENDUl9DT1JDSEcyICAgICAweDQ0ICAgIC8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDIgQ2hhbmdlZCAgICAgICAqLworI2RlZmluZSBDQ1JfQ09SQ0hHMyAgICAgMHg0OCAgICAvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzIENoYW5nZWQgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDEgICAgICAgMHgyMSAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDEgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDIgICAgICAgMHgyMiAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDIgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDMgICAgICAgMHgyMyAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDMgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfU1NDSDQgICAgICAgMHgyNCAgICAvKiBTZW5kIFNwZWNpYWwgQ2hhcmFjdGVyIDQgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDQ1JfVFhFTiAgICAgICAgMHgxOCAgICAvKiBFbmFibGUgVHJhbnNtaXR0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NSX1JYRU4gICAgICAgIDB4MTIgICAgLyogRW5hYmxlIFJlY2VpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ0NSX1RYRElTICAgICAgIDB4MTQgICAgLyogRGlzYWJsZSBUcmFuc21pdHRlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDUl9SWERJUyAgICAgICAweDExICAgIC8qIERpc2FibGUgUmVjZWl2ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKFIvVykgKi8KKworI2RlZmluZSBJRVJfRFNSICAgICAgICAgMHg4MCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIERTUiBjaGFuZ2UgICAgICAgICAgKi8KKyNkZWZpbmUgSUVSX0NEICAgICAgICAgIDB4NDAgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBDRCBjaGFuZ2UgICAgICAgICAgICovCisjZGVmaW5lIElFUl9DVFMgICAgICAgICAweDIwICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gQ1RTIGNoYW5nZSAgICAgICAgICAqLworI2RlZmluZSBJRVJfUlhEICAgICAgICAgMHgxMCAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFJlY2VpdmUgRGF0YSAgICAgICAgKi8KKyNkZWZpbmUgSUVSX1JYU0MgICAgICAgIDB4MDggICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBSZWNlaXZlIFNwZWMuIENoYXIgICovCisjZGVmaW5lIElFUl9UWFJEWSAgICAgICAweDA0ICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gVFggRklGTyBlbXB0eSAgICAgICAqLworI2RlZmluZSBJRVJfVFhFTVBUWSAgICAgMHgwMiAgICAvKiBFbmFibGUgaW50ZXJydXB0IG9uIFRYIGNvbXBsZXRlbHkgZW1wdHkgKi8KKyNkZWZpbmUgSUVSX1JFVCAgICAgICAgIDB4MDEgICAgLyogRW5hYmxlIGludGVycnVwdCBvbiBSWCBFeGMuIFRpbWVvdXQgICAgICovCisKKworLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMSAoUi9XKSAqLworCisjZGVmaW5lIENPUjFfT0REUCAgICAgICAweDgwICAgIC8qIE9kZCBQYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IxX1BBUk1PREUgICAgMHg2MCAgICAvKiBQYXJpdHkgTW9kZSBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfTk9QQVIgICAgICAweDAwICAgLyogTm8gUGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxX0ZPUkNFUEFSICAgMHgyMCAgIC8qIEZvcmNlIFBhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV9OT1JNUEFSICAgIDB4NDAgICAvKiBOb3JtYWwgUGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMV9JR05PUkUgICAgIDB4MTAgICAgLyogSWdub3JlIFBhcml0eSBvbiBSWCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjFfU1RPUEJJVFMgICAweDBjICAgIC8qIE51bWJlciBvZiBTdG9wIEJpdHMgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV8xU0IgICAgICAgIDB4MDAgICAvKiAxIFN0b3AgQml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfMTVTQiAgICAgICAweDA0ICAgLyogMS41IFN0b3AgQml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzJTQiAgICAgICAgMHgwOCAgIC8qIDIgU3RvcCBCaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IxX0NIQVJMRU4gICAgMHgwMyAgICAvKiBDaGFyYWN0ZXIgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfNUJJVFMgICAgICAweDAwICAgLyogNSBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBDT1IxXzZCSVRTICAgICAgMHgwMSAgIC8qIDYgYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgQ09SMV83QklUUyAgICAgIDB4MDIgICAvKiA3IGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIENPUjFfOEJJVFMgICAgICAweDAzICAgLyogOCBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAoUi9XKSAqLworCisjZGVmaW5lIENPUjJfSVhNICAgICAgICAweDgwICAgIC8qIEltcGxpZWQgWE9OIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX1RYSUJFICAgICAgMHg0MCAgICAvKiBFbmFibGUgSW4tQmFuZCAoWE9OL1hPRkYpIEZsb3cgQ29udHJvbCAgKi8KKyNkZWZpbmUgQ09SMl9FVEMgICAgICAgIDB4MjAgICAgLyogRW1iZWRkZWQgVHggQ29tbWFuZHMgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfTExNICAgICAgICAweDEwICAgIC8qIExvY2FsIExvb3BiYWNrIE1vZGUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX1JMTSAgICAgICAgMHgwOCAgICAvKiBSZW1vdGUgTG9vcGJhY2sgTW9kZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SMl9SVFNBTyAgICAgIDB4MDQgICAgLyogUlRTIEF1dG9tYXRpYyBPdXRwdXQgRW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENPUjJfQ1RTQUUgICAgICAweDAyICAgIC8qIENUUyBBdXRvbWF0aWMgRW5hYmxlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT1IyX0RTUkFFICAgICAgMHgwMSAgICAvKiBEU1IgQXV0b21hdGljIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKworCisvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAzIChSL1cpICovCisKKyNkZWZpbmUgQ09SM19YT05DSCAgICAgIDB4ODAgICAgLyogWE9OIGlzIGEgcGFpciBvZiBjaGFyYWN0ZXJzICgxICYgMykgICAgICovCisjZGVmaW5lIENPUjNfWE9GRkNIICAgICAweDQwICAgIC8qIFhPRkYgaXMgYSBwYWlyIG9mIGNoYXJhY3RlcnMgKDIgJiA0KSAgICAqLworI2RlZmluZSBDT1IzX0ZDVCAgICAgICAgMHgyMCAgICAvKiBGbG93LUNvbnRyb2wgVHJhbnNwYXJlbmN5IE1vZGUgICAgICAgICAgKi8KKyNkZWZpbmUgQ09SM19TQ0RFICAgICAgIDB4MTAgICAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgRGV0ZWN0aW9uIEVuYWJsZSAgICAgICovCisjZGVmaW5lIENPUjNfUlhUSCAgICAgICAweDBmICAgIC8qIFJYIEZJRk8gVGhyZXNob2xkIHZhbHVlICgxLTgpICAgICAgICAgICAqLworCisKKy8qIENoYW5uZWwgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXIgKFIvTykgKi8KKworI2RlZmluZSBDQ1NSX1JYRU4gICAgICAgMHg4MCAgICAvKiBSZWNlaXZlciBFbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9SWEZMT0ZGICAgIDB4NDAgICAgLyogUmVjZWl2ZSBGbG93IE9mZiAoWE9GRiB3YXMgc2VudCkgICAgICAgICovCisjZGVmaW5lIENDU1JfUlhGTE9OICAgICAweDIwICAgIC8qIFJlY2VpdmUgRmxvdyBPbiAoWE9OIHdhcyBzZW50KSAgICAgICAgICAqLworI2RlZmluZSBDQ1NSX1RYRU4gICAgICAgMHgwOCAgICAvKiBUcmFuc21pdHRlciBFbmFibGVkICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NTUl9UWEZMT0ZGICAgIDB4MDQgICAgLyogVHJhbnNtaXQgRmxvdyBPZmYgKGdvdCBYT0ZGKSAgICAgICAgICAgICovCisjZGVmaW5lIENDU1JfVFhGTE9OICAgICAweDAyICAgIC8qIFRyYW5zbWl0IEZsb3cgT24gKGdvdCBYT04pICAgICAgICAgICAgICAqLworCisKKy8qIE1vZGVtIENoYW5nZSBPcHRpb24gUmVnaXN0ZXIgMSAoUi9XKSAqLworCisjZGVmaW5lIE1DT1IxX0RTUlpEICAgICAweDgwICAgIC8qIERldGVjdCAwLT4xIHRyYW5zaXRpb24gb2YgRFNSICAgICAgICAgICAqLworI2RlZmluZSBNQ09SMV9DRFpEICAgICAgMHg0MCAgICAvKiBEZXRlY3QgMC0+MSB0cmFuc2l0aW9uIG9mIENEICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUNPUjFfQ1RTWkQgICAgIDB4MjAgICAgLyogRGV0ZWN0IDAtPjEgdHJhbnNpdGlvbiBvZiBDVFMgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IxX0RUUlRIICAgICAweDBmICAgIC8qIEF1dG8gRFRSIGZsb3cgY29udHJvbCBUaHJlc2hvbGQgKDEtOCkgICAqLworI2RlZmluZSAgTUNPUjFfTk9EVFJGQyAgIDB4MCAgICAgLyogQXV0b21hdGljIERUUiBmbG93IGNvbnRyb2wgZGlzYWJsZWQgICAgICovCisKKworLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdpc3RlciAyIChSL1cpICovCisKKyNkZWZpbmUgTUNPUjJfRFNST0QgICAgIDB4ODAgICAgLyogRGV0ZWN0IDEtPjAgdHJhbnNpdGlvbiBvZiBEU1IgICAgICAgICAgICovCisjZGVmaW5lIE1DT1IyX0NET0QgICAgICAweDQwICAgIC8qIERldGVjdCAxLT4wIHRyYW5zaXRpb24gb2YgQ0QgICAgICAgICAgICAqLworI2RlZmluZSBNQ09SMl9DVFNPRCAgICAgMHgyMCAgICAvKiBEZXRlY3QgMS0+MCB0cmFuc2l0aW9uIG9mIENUUyAgICAgICAgICAgKi8KKworCisvKiBNb2RlbSBDaGFuZ2UgUmVnaXN0ZXIgKFIvVykgKi8KKworI2RlZmluZSBNQ1JfRFNSQ0hHICAgICAgMHg4MCAgICAvKiBEU1IgQ2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUNSX0NEQ0hHICAgICAgIDB4NDAgICAgLyogQ0QgQ2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1DUl9DVFNDSEcgICAgICAweDIwICAgIC8qIENUUyBDaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKy8qIE1vZGVtIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciAoUi9XKSAqLworCisjZGVmaW5lIE1TVlJfRFNSICAgICAgICAweDgwICAgIC8qIEN1cnJlbnQgc3RhdGUgb2YgRFNSIGlucHV0ICAgICAgICAgICAgICAqLworI2RlZmluZSBNU1ZSX0NEICAgICAgICAgMHg0MCAgICAvKiBDdXJyZW50IHN0YXRlIG9mIENEIGlucHV0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVNWUl9DVFMgICAgICAgIDB4MjAgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBDVFMgaW5wdXQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1TVlJfRFRSICAgICAgICAweDAyICAgIC8qIEN1cnJlbnQgc3RhdGUgb2YgRFRSIG91dHB1dCAgICAgICAgICAgICAqLworI2RlZmluZSBNU1ZSX1JUUyAgICAgICAgMHgwMSAgICAvKiBDdXJyZW50IHN0YXRlIG9mIFJUUyBvdXRwdXQgICAgICAgICAgICAgKi8KKworCisvKiBFc2NhcGUgY2hhcmFjdGVycyAqLworCisjZGVmaW5lIENEMTgwX0NfRVNDICAgICAweDAwICAgIC8qIEVzY2FwZSBjaGFyYWN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRDE4MF9DX1NCUksgICAgMHg4MSAgICAvKiBTdGFydCBzZW5kaW5nIEJSRUFLICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0QxODBfQ19ERUxBWSAgIDB4ODIgICAgLyogRGVsYXkgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENEMTgwX0NfRUJSSyAgICAweDgzICAgIC8qIFN0b3Agc2VuZGluZyBCUkVBSyAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JvY2tldC5jIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2JlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKQEAgLTAsMCArMSwzMjk5IEBACisvKgorICogUm9ja2V0UG9ydCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMC4KKyAqIAorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAzIGJ5IENvbXRyb2wsIEluYy4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogS2VybmVsIFN5bmNocm9uaXphdGlvbjoKKyAqCisgKiBUaGlzIGRyaXZlciBoYXMgMiBrZXJuZWwgY29udHJvbCBwYXRocyAtIGV4Y2VwdGlvbiBoYW5kbGVycyAoY2FsbHMgaW50byB0aGUgZHJpdmVyCisgKiBmcm9tIHVzZXIgbW9kZSkgYW5kIHRoZSB0aW1lciBib3R0b20gaGFsZiAodGFza2xldCkuICBUaGlzIGlzIGEgcG9sbGVkIGRyaXZlciwgaW50ZXJydXB0cworICogYXJlIG5vdCB1c2VkLgorICoKKyAqIENyaXRpY2FsIGRhdGE6IAorICogLSAgcnBfdGFibGVbXSwgYWNjZXNzZWQgdGhyb3VnaCBwYXNzZWQgImluZm8iIHBvaW50ZXJzLCBpcyBhIGdsb2JhbCAoc3RhdGljKSBhcnJheSBvZiAKKyAqICAgIHNlcmlhbCBwb3J0IHN0YXRlIGluZm9ybWF0aW9uIGFuZCB0aGUgeG1pdF9idWYgY2lyY3VsYXIgYnVmZmVyLiAgUHJvdGVjdGVkIGJ5IAorICogICAgYSBwZXIgcG9ydCBzcGlubG9jay4KKyAqIC0gIHhtaXRfZmxhZ3NbXSwgYW4gYXJyYXkgb2YgaW50cyBpbmRleGVkIGJ5IGxpbmUgKHBvcnQpIG51bWJlciwgaW5kaWNhdGluZyB0aGF0IHRoZXJlCisgKiAgICBpcyBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLiAgUHJvdGVjdGVkIGJ5IGF0b21pYyBiaXQgb3BlcmF0aW9ucy4KKyAqIC0gIHJwX251bV9wb3J0cywgaW50IGluZGljYXRpbmcgbnVtYmVyIG9mIG9wZW4gcG9ydHMsIHByb3RlY3RlZCBieSBhdG9taWMgb3BlcmF0aW9ucy4KKyAqIAorICogcnBfd3JpdGUoKSBhbmQgcnBfd3JpdGVfY2hhcigpIGZ1bmN0aW9ucyB1c2UgYSBwZXIgcG9ydCBzZW1hcGhvcmUgdG8gcHJvdGVjdCBhZ2FpbnN0CisgKiBzaW11bHRhbmVvdXMgYWNjZXNzIHRvIHRoZSBzYW1lIHBvcnQgYnkgbW9yZSB0aGFuIG9uZSBwcm9jZXNzLgorICovCisKKy8qKioqKiogRGVmaW5lcyAqKioqKiovCisjaWZkZWYgUENJX05VTV9SRVNPVVJDRVMKKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTUyhkZXYsIHIpICgoZGV2KS0+cmVzb3VyY2Vbcl0uc3RhcnQpCisjZWxzZQorI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTKGRldiwgcikgKChkZXYpLT5iYXNlX2FkZHJlc3Nbcl0pCisjZW5kaWYKKworI2RlZmluZSBST0NLRVRfUEFSQU5PSUFfQ0hFQ0sKKyNkZWZpbmUgUk9DS0VUX0RJU0FCTEVfU0lNVVNBR0UKKworI3VuZGVmIFJPQ0tFVF9TT0ZUX0ZMT1cKKyN1bmRlZiBST0NLRVRfREVCVUdfT1BFTgorI3VuZGVmIFJPQ0tFVF9ERUJVR19JTlRSCisjdW5kZWYgUk9DS0VUX0RFQlVHX1dSSVRFCisjdW5kZWYgUk9DS0VUX0RFQlVHX0ZMT1cKKyN1bmRlZiBST0NLRVRfREVCVUdfVEhST1RUTEUKKyN1bmRlZiBST0NLRVRfREVCVUdfV0FJVF9VTlRJTF9TRU5UCisjdW5kZWYgUk9DS0VUX0RFQlVHX1JFQ0VJVkUKKyN1bmRlZiBST0NLRVRfREVCVUdfSEFOR1VQCisjdW5kZWYgUkVWX1BDSV9PUkRFUgorI3VuZGVmIFJPQ0tFVF9ERUJVR19JTworCisjZGVmaW5lIFBPTExfUEVSSU9EIEhaLzEwMAkvKiAgUG9sbGluZyBwZXJpb2QgLjAxIHNlY29uZHMgKDEwbXMpICovCisKKy8qKioqKiogS2VybmVsIGluY2x1ZGVzICoqKioqKi8KKworI2lmZGVmIE1PRFZFUlNJT05TCisjaW5jbHVkZSA8Y29uZmlnL21vZHZlcnNpb25zLmg+CisjZW5kaWYJCQkJCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisvKioqKioqIFJvY2tldFBvcnQgaW5jbHVkZXMgKioqKioqLworCisjaW5jbHVkZSAicm9ja2V0X2ludC5oIgorI2luY2x1ZGUgInJvY2tldC5oIgorCisjZGVmaW5lIFJPQ0tFVF9WRVJTSU9OICIyLjA5IgorI2RlZmluZSBST0NLRVRfREFURSAiMTItSnVuZS0yMDAzIgorCisvKioqKioqIFJvY2tldFBvcnQgTG9jYWwgVmFyaWFibGVzICoqKioqKi8KKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpyb2NrZXRfZHJpdmVyOworCitzdGF0aWMgc3RydWN0IHJvY2tldF92ZXJzaW9uIGRyaXZlcl92ZXJzaW9uID0gewkKKwlST0NLRVRfVkVSU0lPTiwgUk9DS0VUX0RBVEUKK307CisKK3N0YXRpYyBzdHJ1Y3Qgcl9wb3J0ICpycF90YWJsZVtNQVhfUlBfUE9SVFNdOwkgICAgICAgLyogIFRoZSBtYWluIHJlcG9zaXRvcnkgb2Ygc2VyaWFsIHBvcnQgc3RhdGUgaW5mb3JtYXRpb24uICovCitzdGF0aWMgdW5zaWduZWQgaW50IHhtaXRfZmxhZ3NbTlVNX0JPQVJEU107CSAgICAgICAvKiAgQml0IHNpZ25pZmljYW50LCBpbmRpY2F0ZXMgcG9ydCBoYWQgZGF0YSB0byB0cmFuc21pdC4gKi8KKwkJCQkJCSAgICAgICAvKiAgZWcuICBCaXQgMCBpbmRpY2F0ZXMgcG9ydCAwIGhhcyB4bWl0IGRhdGEsIC4uLiAgICAgICAgKi8KK3N0YXRpYyBhdG9taWNfdCBycF9udW1fcG9ydHNfb3BlbjsJICAgICAgICAgICAgICAgLyogIE51bWJlciBvZiBzZXJpYWwgcG9ydHMgb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgcm9ja2V0X3RpbWVyOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZDE7CSAgICAgICAgICAgICAgICAgICAgICAgLyogSVNBIGFkZHJlc3NlcywgcmV0cmlldmVkIGZyb20gcm9ja2V0cG9ydC5jb25mICAgICAgICAgICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZDI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZDM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZDQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb250cm9sbGVyOworc3RhdGljIGludCBzdXBwb3J0X2xvd19zcGVlZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZGVtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZGVtMjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZGVtMzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZGVtNDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjMTA0XzFbOF07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYzEwNF8yWzhdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGMxMDRfM1s4XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjMTA0XzRbOF07CitzdGF0aWMgdW5zaWduZWQgbG9uZyAqcGMxMDRbNF0gPSB7IHBjMTA0XzEsIHBjMTA0XzIsIHBjMTA0XzMsIHBjMTA0XzQgfTsKKworc3RhdGljIGludCBycF9iYXVkX2Jhc2VbTlVNX0JPQVJEU107CSAgICAgICAgICAgICAgIC8qICBCb2FyZCBjb25maWcgaW5mbyAoU29tZWRheSBtYWtlIGEgcGVyLWJvYXJkIHN0cnVjdHVyZSkgICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyByY2t0cHRfaW9fYWRkcltOVU1fQk9BUkRTXTsKK3N0YXRpYyBpbnQgcmNrdHB0X3R5cGVbTlVNX0JPQVJEU107CitzdGF0aWMgaW50IGlzX1BDSVtOVU1fQk9BUkRTXTsKK3N0YXRpYyByb2NrZXRNb2RlbF90IHJvY2tldE1vZGVsW05VTV9CT0FSRFNdOworc3RhdGljIGludCBtYXhfYm9hcmQ7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFycmF5cyBkZWZpbmUgdGhlIGludGVycnVwdCBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBBSU9QLgorICogVGhlc2UgYml0cyBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIElTQSBhbmQgcmVndWxhciBQQ0kgYm9hcmRzIGFuZCB0aGUKKyAqIFVuaXZlcnNhbCBQQ0kgYm9hcmRzLgorICovCisKK3N0YXRpYyBXb3JkX3QgYWlvcF9pbnRyX2JpdHNbQUlPUF9DVExfU0laRV0gPSB7CisJQUlPUF9JTlRSX0JJVF8wLAorCUFJT1BfSU5UUl9CSVRfMSwKKwlBSU9QX0lOVFJfQklUXzIsCisJQUlPUF9JTlRSX0JJVF8zCit9OworCitzdGF0aWMgV29yZF90IHVwY2lfYWlvcF9pbnRyX2JpdHNbQUlPUF9DVExfU0laRV0gPSB7CisJVVBDSV9BSU9QX0lOVFJfQklUXzAsCisJVVBDSV9BSU9QX0lOVFJfQklUXzEsCisJVVBDSV9BSU9QX0lOVFJfQklUXzIsCisJVVBDSV9BSU9QX0lOVFJfQklUXzMKK307CisKKy8qCisgKiAgTGluZSBudW1iZXIgaXMgdGhlIHR0eVNJeCBudW1iZXIgKHgpLCB0aGUgTWlub3IgbnVtYmVyLiAgV2UgCisgKiAgYXNzaWduIHRoZW0gc2VxdWVudGlhbGx5LCBzdGFydGluZyBhdCB6ZXJvLiAgVGhlIGZvbGxvd2luZyAKKyAqICBhcnJheSBrZWVwcyB0cmFjayBvZiB0aGUgbGluZSBudW1iZXIgYXNzaWduZWQgdG8gYSBnaXZlbiBib2FyZC9haW9wL2NoYW5uZWwuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxpbmVOdW1iZXJzW01BWF9SUF9QT1JUU107CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0TGluZU51bWJlcjsKKworLyoqKioqICBSb2NrZXRQb3J0IFN0YXRpYyBQcm90b3R5cGVzICAgKioqKioqKioqLworc3RhdGljIGludCBfX2luaXQgaW5pdF9JU0EoaW50IGkpOworc3RhdGljIHZvaWQgcnBfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKK3N0YXRpYyB2b2lkIHJwX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIHJtU3BlYWtlclJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIHVuc2lnbmVkIGxvbmcgbW9kZWwpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgR2V0TGluZU51bWJlcihpbnQgY3RybCwgaW50IGFpb3AsIGludCBjaCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBTZXRMaW5lTnVtYmVyKGludCBjdHJsLCBpbnQgYWlvcCwgaW50IGNoKTsKK3N0YXRpYyB2b2lkIHJwX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworCisjaWZkZWYgTU9EVUxFCitNT0RVTEVfQVVUSE9SKCJUaGVvZG9yZSBUcydvIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbXRyb2wgUm9ja2V0UG9ydCBkcml2ZXIiKTsKK21vZHVsZV9wYXJhbShib2FyZDEsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQxLCAiSS9PIHBvcnQgZm9yIChJU0EpIGJvYXJkICMxIik7Cittb2R1bGVfcGFyYW0oYm9hcmQyLCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJvYXJkMiwgIkkvTyBwb3J0IGZvciAoSVNBKSBib2FyZCAjMiIpOworbW9kdWxlX3BhcmFtKGJvYXJkMywgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhib2FyZDMsICJJL08gcG9ydCBmb3IgKElTQSkgYm9hcmQgIzMiKTsKK21vZHVsZV9wYXJhbShib2FyZDQsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYm9hcmQ0LCAiSS9PIHBvcnQgZm9yIChJU0EpIGJvYXJkICM0Iik7Cittb2R1bGVfcGFyYW0oY29udHJvbGxlciwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb250cm9sbGVyLCAiSS9PIHBvcnQgZm9yIChJU0EpIHJvY2tldHBvcnQgY29udHJvbGxlciIpOworbW9kdWxlX3BhcmFtKHN1cHBvcnRfbG93X3NwZWVkLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3VwcG9ydF9sb3dfc3BlZWQsICIxIG1lYW5zIHN1cHBvcnQgNTAgYmF1ZCwgMCBtZWFucyBzdXBwb3J0IDQ2MDQwMCBiYXVkIik7Cittb2R1bGVfcGFyYW0obW9kZW0xLCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGVtMSwgIjEgbWVhbnMgKElTQSkgYm9hcmQgIzEgaXMgYSBSb2NrZXRNb2RlbSIpOworbW9kdWxlX3BhcmFtKG1vZGVtMiwgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb2RlbTIsICIxIG1lYW5zIChJU0EpIGJvYXJkICMyIGlzIGEgUm9ja2V0TW9kZW0iKTsKK21vZHVsZV9wYXJhbShtb2RlbTMsIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZW0zLCAiMSBtZWFucyAoSVNBKSBib2FyZCAjMyBpcyBhIFJvY2tldE1vZGVtIik7Cittb2R1bGVfcGFyYW0obW9kZW00LCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGVtNCwgIjEgbWVhbnMgKElTQSkgYm9hcmQgIzQgaXMgYSBSb2NrZXRNb2RlbSIpOworbW9kdWxlX3BhcmFtX2FycmF5KHBjMTA0XzEsIHVsb25nLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGMxMDRfMSwgInNldCBpbnRlcmZhY2UgdHlwZXMgZm9yIElTQShQQzEwNCkgYm9hcmQgIzEgKGUuZy4gcGMxMDRfMT0yMzIsMjMyLDQ4NSw0ODUsLi4uIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocGMxMDRfMiwgdWxvbmcsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhwYzEwNF8yLCAic2V0IGludGVyZmFjZSB0eXBlcyBmb3IgSVNBKFBDMTA0KSBib2FyZCAjMiAoZS5nLiBwYzEwNF8yPTIzMiwyMzIsNDg1LDQ4NSwuLi4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShwYzEwNF8zLCB1bG9uZywgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBjMTA0XzMsICJzZXQgaW50ZXJmYWNlIHR5cGVzIGZvciBJU0EoUEMxMDQpIGJvYXJkICMzIChlLmcuIHBjMTA0XzM9MjMyLDIzMiw0ODUsNDg1LC4uLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHBjMTA0XzQsIHVsb25nLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGMxMDRfNCwgInNldCBpbnRlcmZhY2UgdHlwZXMgZm9yIElTQShQQzEwNCkgYm9hcmQgIzQgKGUuZy4gcGMxMDRfND0yMzIsMjMyLDQ4NSw0ODUsLi4uIik7CisKK2ludCBycF9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgcnBfY2xlYW51cF9tb2R1bGUodm9pZCk7CisKK21vZHVsZV9pbml0KHJwX2luaXQpOworbW9kdWxlX2V4aXQocnBfY2xlYW51cF9tb2R1bGUpOworCisjZW5kaWYKKworI2lmZGVmIE1PRFVMRV9MSUNFTlNFCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGlubGluZSBpbnQgcm9ja2V0X3BhcmFub2lhX2NoZWNrKHN0cnVjdCByX3BvcnQgKmluZm8sCisJCQkJCWNvbnN0IGNoYXIgKnJvdXRpbmUpCit7CisjaWZkZWYgUk9DS0VUX1BBUkFOT0lBX0NIRUNLCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gMTsKKwlpZiAoaW5mby0+bWFnaWMgIT0gUlBPUlRfTUFHSUMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2FybmluZzogYmFkIG1hZ2ljIG51bWJlciBmb3Igcm9ja2V0cG9ydCBzdHJ1Y3QgaW4gJXNcbiIsCisJCSAgICAgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisKKy8qICBTZXJpYWwgcG9ydCByZWNlaXZlIGRhdGEgZnVuY3Rpb24uICBDYWxsZWQgKGZyb20gdGltZXIgcG9sbCkgd2hlbiBhbiBBSU9QSUMgc2lnbmFscyAKKyAqICB0aGF0IHJlY2VpdmUgZGF0YSBpcyBwcmVzZW50IG9uIGEgc2VyaWFsIHBvcnQuICBQdWxscyBkYXRhIGZyb20gRklGTywgbW92ZXMgaXQgaW50byB0aGUgCisgKiAgdHR5IGxheWVyLiAgCisgKi8KK3N0YXRpYyB2b2lkIHJwX2RvX3JlY2VpdmUoc3RydWN0IHJfcG9ydCAqaW5mbywKKwkJCSAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSAgQ0hBTk5FTF90ICogY3AsIHVuc2lnbmVkIGludCBDaGFuU3RhdHVzKQoreworCXVuc2lnbmVkIGludCBDaGFyTlN0YXQ7CisJaW50IFRvUmVjdiwgd1JlY3YsIHNwYWNlID0gMCwgY291bnQ7CisJdW5zaWduZWQgY2hhciAqY2J1ZjsKKwljaGFyICpmYnVmOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisKKwlUb1JlY3YgPSBzR2V0UnhDbnQoY3ApOworCWlmIChsZCkKKwkJc3BhY2UgPSBsZC0+cmVjZWl2ZV9yb29tKHR0eSk7CisJaWYgKHNwYWNlID4gMiAqIFRUWV9GTElQQlVGX1NJWkUpCisJCXNwYWNlID0gMiAqIFRUWV9GTElQQlVGX1NJWkU7CisJY2J1ZiA9IHR0eS0+ZmxpcC5jaGFyX2J1ZjsKKwlmYnVmID0gdHR5LT5mbGlwLmZsYWdfYnVmOworCWNvdW50ID0gMDsKKyNpZmRlZiBST0NLRVRfREVCVUdfSU5UUgorCXByaW50ayhLRVJOX0lORk8gInJwX2RvX3JlY2VpdmUoJWQsICVkKS4uLiIsIFRvUmVjdiwgc3BhY2UpOworI2VuZGlmCisKKwkvKgorCSAqIGRldGVybWluZSBob3cgbWFueSB3ZSBjYW4gYWN0dWFsbHkgcmVhZCBpbi4gIElmIHdlIGNhbid0CisJICogcmVhZCBhbnkgaW4gdGhlbiB3ZSBoYXZlIGEgc29mdHdhcmUgb3ZlcnJ1biBjb25kaXRpb24uCisJICovCisJaWYgKFRvUmVjdiA+IHNwYWNlKQorCQlUb1JlY3YgPSBzcGFjZTsKKworCWlmIChUb1JlY3YgPD0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBpZiBzdGF0dXMgaW5kaWNhdGVzIHRoZXJlIGFyZSBlcnJvcmVkIGNoYXJhY3RlcnMgaW4gdGhlCisJICogRklGTywgdGhlbiBlbnRlciBzdGF0dXMgbW9kZSAoYSB3b3JkIGluIEZJRk8gaG9sZHMKKwkgKiBjaGFyYWN0ZXIgYW5kIHN0YXR1cykuCisJICovCisJaWYgKENoYW5TdGF0dXMgJiAoUlhGT1ZFUkZMIHwgUlhCUkVBSyB8IFJYRlJBTUUgfCBSWFBBUklUWSkpIHsKKwkJaWYgKCEoQ2hhblN0YXR1cyAmIFNUQVRNT0RFKSkgeworI2lmZGVmIFJPQ0tFVF9ERUJVR19SRUNFSVZFCisJCQlwcmludGsoS0VSTl9JTkZPICJFbnRlcmluZyBTVEFUTU9ERS4uLiIpOworI2VuZGlmCisJCQlDaGFuU3RhdHVzIHw9IFNUQVRNT0RFOworCQkJc0VuUnhTdGF0dXNNb2RlKGNwKTsKKwkJfQorCX0KKworCS8qIAorCSAqIGlmIHdlIHByZXZpb3VzbHkgZW50ZXJlZCBzdGF0dXMgbW9kZSwgdGhlbiByZWFkIGRvd24gdGhlCisJICogRklGTyBvbmUgd29yZCBhdCBhIHRpbWUsIHB1bGxpbmcgYXBhcnQgdGhlIGNoYXJhY3RlciBhbmQKKwkgKiB0aGUgc3RhdHVzLiAgVXBkYXRlIGVycm9yIGNvdW50ZXJzIGRlcGVuZGluZyBvbiBzdGF0dXMKKwkgKi8KKwlpZiAoQ2hhblN0YXR1cyAmIFNUQVRNT0RFKSB7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1JFQ0VJVkUKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSWdub3JlICV4LCByZWFkICV4Li4uIiwgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrLAorCQkgICAgICAgaW5mby0+cmVhZF9zdGF0dXNfbWFzayk7CisjZW5kaWYKKwkJd2hpbGUgKFRvUmVjdikgeworCQkJQ2hhck5TdGF0ID0gc0luVyhzR2V0VHhSeERhdGFJTyhjcCkpOworI2lmZGVmIFJPQ0tFVF9ERUJVR19SRUNFSVZFCisJCQlwcmludGsoS0VSTl9JTkZPICIleC4uLiIsIENoYXJOU3RhdCk7CisjZW5kaWYKKwkJCWlmIChDaGFyTlN0YXQgJiBTVE1CUkVBS0gpCisJCQkJQ2hhck5TdGF0ICY9IH4oU1RNRlJBTUVIIHwgU1RNUEFSSVRZSCk7CisJCQlpZiAoQ2hhck5TdGF0ICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKSB7CisJCQkJVG9SZWN2LS07CisJCQkJY29udGludWU7CisJCQl9CisJCQlDaGFyTlN0YXQgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKKwkJCWlmIChDaGFyTlN0YXQgJiBTVE1CUkVBS0gpCisJCQkJKmZidWYrKyA9IFRUWV9CUkVBSzsKKwkJCWVsc2UgaWYgKENoYXJOU3RhdCAmIFNUTVBBUklUWUgpCisJCQkJKmZidWYrKyA9IFRUWV9QQVJJVFk7CisJCQllbHNlIGlmIChDaGFyTlN0YXQgJiBTVE1GUkFNRUgpCisJCQkJKmZidWYrKyA9IFRUWV9GUkFNRTsKKwkJCWVsc2UgaWYgKENoYXJOU3RhdCAmIFNUTVJDVlJPVlJIKQorCQkJCSpmYnVmKysgPSBUVFlfT1ZFUlJVTjsKKwkJCWVsc2UKKwkJCQkqZmJ1ZisrID0gMDsKKwkJCSpjYnVmKysgPSBDaGFyTlN0YXQgJiAweGZmOworCQkJY291bnQrKzsKKwkJCVRvUmVjdi0tOworCQl9CisKKwkJLyoKKwkJICogYWZ0ZXIgd2UndmUgZW1wdGllZCB0aGUgRklGTyBpbiBzdGF0dXMgbW9kZSwgdHVybgorCQkgKiBzdGF0dXMgbW9kZSBiYWNrIG9mZgorCQkgKi8KKwkJaWYgKHNHZXRSeENudChjcCkgPT0gMCkgeworI2lmZGVmIFJPQ0tFVF9ERUJVR19SRUNFSVZFCisJCQlwcmludGsoS0VSTl9JTkZPICJTdGF0dXMgbW9kZSBvZmYuXG4iKTsKKyNlbmRpZgorCQkJc0Rpc1J4U3RhdHVzTW9kZShjcCk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSBhcmVuJ3QgaW4gc3RhdHVzIG1vZGUsIHNvIHJlYWQgZG93biB0aGUgRklGTyB0d28KKwkJICogY2hhcmFjdGVycyBhdCB0aW1lIGJ5IGRvaW5nIHJlcGVhdGVkIHdvcmQgSU8KKwkJICogdHJhbnNmZXIuCisJCSAqLworCQl3UmVjdiA9IFRvUmVjdiA+PiAxOworCQlpZiAod1JlY3YpCisJCQlzSW5TdHJXKHNHZXRUeFJ4RGF0YUlPKGNwKSwgKHVuc2lnbmVkIHNob3J0ICopIGNidWYsIHdSZWN2KTsKKwkJaWYgKFRvUmVjdiAmIDEpCisJCQljYnVmW1RvUmVjdiAtIDFdID0gc0luQihzR2V0VHhSeERhdGFJTyhjcCkpOworCQltZW1zZXQoZmJ1ZiwgMCwgVG9SZWN2KTsKKwkJY2J1ZiArPSBUb1JlY3Y7CisJCWZidWYgKz0gVG9SZWN2OworCQljb3VudCArPSBUb1JlY3Y7CisJfQorCS8qICBQdXNoIHRoZSBkYXRhIHVwIHRvIHRoZSB0dHkgbGF5ZXIgKi8KKwlsZC0+cmVjZWl2ZV9idWYodHR5LCB0dHktPmZsaXAuY2hhcl9idWYsIHR0eS0+ZmxpcC5mbGFnX2J1ZiwgY291bnQpOworCXR0eV9sZGlzY19kZXJlZihsZCk7Cit9CisKKy8qCisgKiAgU2VyaWFsIHBvcnQgdHJhbnNtaXQgZGF0YSBmdW5jdGlvbi4gIENhbGxlZCBmcm9tIHRoZSB0aW1lciBwb2xsaW5nIGxvb3AgYXMgYSAKKyAqICByZXN1bHQgb2YgYSBiaXQgc2V0IGluIHhtaXRfZmxhZ3NbXSwgaW5kaWNhdGluZyBkYXRhIChmcm9tIHRoZSB0dHkgbGF5ZXIpIGlzIHJlYWR5CisgKiAgdG8gYmUgc2VudCBvdXQgdGhlIHNlcmlhbCBwb3J0LiAgRGF0YSBpcyBidWZmZXJlZCBpbiBycF90YWJsZVtsaW5lXS54bWl0X2J1ZiwgaXQgaXMgCisgKiAgbW92ZWQgdG8gdGhlIHBvcnQncyB4bWl0IEZJRk8uICAqaW5mbyBpcyBjcml0aWNhbCBkYXRhLCBwcm90ZWN0ZWQgYnkgc3BpbmxvY2tzLgorICovCitzdGF0aWMgdm9pZCBycF9kb190cmFuc21pdChzdHJ1Y3Qgcl9wb3J0ICppbmZvKQoreworCWludCBjOworCUNIQU5ORUxfdCAqY3AgPSAmaW5mby0+Y2hhbm5lbDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfSU5UUgorCXByaW50ayhLRVJOX0lORk8gInJwX2RvX3RyYW5zbWl0ICIpOworI2VuZGlmCisJaWYgKCFpbmZvKQorCQlyZXR1cm47CisJaWYgKCFpbmZvLT50dHkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAgInJwOiBXQVJOSU5HIHJwX2RvX3RyYW5zbWl0IGNhbGxlZCB3aXRoIGluZm8tPnR0eT09TlVMTFxuIik7CisJCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXR0eSA9IGluZm8tPnR0eTsKKwlpbmZvLT54bWl0X2ZpZm9fcm9vbSA9IFRYRklGT19TSVpFIC0gc0dldFR4Q250KGNwKTsKKworCS8qICBMb29wIHNlbmRpbmcgZGF0YSB0byBGSUZPIHVudGlsIGRvbmUgb3IgRklGTyBmdWxsICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQpCisJCQlicmVhazsKKwkJYyA9IG1pbihpbmZvLT54bWl0X2ZpZm9fcm9vbSwgbWluKGluZm8tPnhtaXRfY250LCBYTUlUX0JVRl9TSVpFIC0gaW5mby0+eG1pdF90YWlsKSk7CisJCWlmIChjIDw9IDAgfHwgaW5mby0+eG1pdF9maWZvX3Jvb20gPD0gMCkKKwkJCWJyZWFrOworCQlzT3V0U3RyVyhzR2V0VHhSeERhdGFJTyhjcCksICh1bnNpZ25lZCBzaG9ydCAqKSAoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X3RhaWwpLCBjIC8gMik7CisJCWlmIChjICYgMSkKKwkJCXNPdXRCKHNHZXRUeFJ4RGF0YUlPKGNwKSwgaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsICsgYyAtIDFdKTsKKwkJaW5mby0+eG1pdF90YWlsICs9IGM7CisJCWluZm8tPnhtaXRfdGFpbCAmPSBYTUlUX0JVRl9TSVpFIC0gMTsKKwkJaW5mby0+eG1pdF9jbnQgLT0gYzsKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20gLT0gYzsKKyNpZmRlZiBST0NLRVRfREVCVUdfSU5UUgorCQlwcmludGsoS0VSTl9JTkZPICJ0eCAlZCBjaGFycy4uLiIsIGMpOworI2VuZGlmCisJfQorCisJaWYgKGluZm8tPnhtaXRfY250ID09IDApCisJCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKworCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworCQl0dHlfd2FrZXVwKHR0eSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKyNpZmRlZiBST0NLRVRQT1JUX0hBVkVfUE9MTF9XQUlUCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5wb2xsX3dhaXQpOworI2VuZGlmCisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCisJcHJpbnRrKEtFUk5fSU5GTyAiKCVkLCVkLCVkLCVkKS4uLiIsIGluZm8tPnhtaXRfY250LCBpbmZvLT54bWl0X2hlYWQsCisJICAgICAgIGluZm8tPnhtaXRfdGFpbCwgaW5mby0+eG1pdF9maWZvX3Jvb20pOworI2VuZGlmCit9CisKKy8qCisgKiAgQ2FsbGVkIHdoZW4gYSBzZXJpYWwgcG9ydCBzaWduYWxzIGl0IGhhcyByZWFkIGRhdGEgaW4gaXQncyBSWCBGSUZPLgorICogIEl0IGNoZWNrcyB3aGF0IGludGVycnVwdHMgYXJlIHBlbmRpbmcgYW5kIHNlcnZpY2VzIHRoZW0sIGluY2x1ZGluZworICogIHJlY2VpdmluZyBzZXJpYWwgZGF0YS4gIAorICovCitzdGF0aWMgdm9pZCBycF9oYW5kbGVfcG9ydChzdHJ1Y3Qgcl9wb3J0ICppbmZvKQoreworCUNIQU5ORUxfdCAqY3A7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBpbnQgSW50TWFzaywgQ2hhblN0YXR1czsKKworCWlmICghaW5mbykKKwkJcmV0dXJuOworCisJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9JTklUSUFMSVpFRCkgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJycDogV0FSTklORzogcnBfaGFuZGxlX3BvcnQgY2FsbGVkIHdpdGggaW5mby0+ZmxhZ3MgJiBOT1RfSU5JVFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCFpbmZvLT50dHkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnA6IFdBUk5JTkc6IHJwX2hhbmRsZV9wb3J0IGNhbGxlZCB3aXRoIGluZm8tPnR0eT09TlVMTFxuIik7CisJCXJldHVybjsKKwl9CisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKwl0dHkgPSBpbmZvLT50dHk7CisKKwlJbnRNYXNrID0gc0dldENoYW5JbnRJRChjcCkgJiBpbmZvLT5pbnRtYXNrOworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCisJcHJpbnRrKEtFUk5fSU5GTyAicnBfaW50ZXJydXB0ICUwMnguLi4iLCBJbnRNYXNrKTsKKyNlbmRpZgorCUNoYW5TdGF0dXMgPSBzR2V0Q2hhblN0YXR1cyhjcCk7CisJaWYgKEludE1hc2sgJiBSWEZfVFJJRykgewkvKiBSeCBGSUZPIHRyaWdnZXIgbGV2ZWwgKi8KKwkJcnBfZG9fcmVjZWl2ZShpbmZvLCB0dHksIGNwLCBDaGFuU3RhdHVzKTsKKwl9CisJaWYgKEludE1hc2sgJiBERUxUQV9DRCkgewkvKiBDRCBjaGFuZ2UgICovCisjaWYgKGRlZmluZWQoUk9DS0VUX0RFQlVHX09QRU4pIHx8IGRlZmluZWQoUk9DS0VUX0RFQlVHX0lOVFIpIHx8IGRlZmluZWQoUk9DS0VUX0RFQlVHX0hBTkdVUCkpCisJCXByaW50ayhLRVJOX0lORk8gInR0eVIlZCBDRCBub3cgJXMuLi4iLCBpbmZvLT5saW5lLAorCQkgICAgICAgKENoYW5TdGF0dXMgJiBDRF9BQ1QpID8gIm9uIiA6ICJvZmYiKTsKKyNlbmRpZgorCQlpZiAoIShDaGFuU3RhdHVzICYgQ0RfQUNUKSAmJiBpbmZvLT5jZF9zdGF0dXMpIHsKKyNpZmRlZiBST0NLRVRfREVCVUdfSEFOR1VQCisJCQlwcmludGsoS0VSTl9JTkZPICJDRCBkcm9wLCBjYWxsaW5nIGhhbmd1cC5cbiIpOworI2VuZGlmCisJCQl0dHlfaGFuZ3VwKHR0eSk7CisJCX0KKwkJaW5mby0+Y2Rfc3RhdHVzID0gKENoYW5TdGF0dXMgJiBDRF9BQ1QpID8gMSA6IDA7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwl9CisjaWZkZWYgUk9DS0VUX0RFQlVHX0lOVFIKKwlpZiAoSW50TWFzayAmIERFTFRBX0NUUykgewkvKiBDVFMgY2hhbmdlICovCisJCXByaW50ayhLRVJOX0lORk8gIkNUUyBjaGFuZ2UuLi5cbiIpOworCX0KKwlpZiAoSW50TWFzayAmIERFTFRBX0RTUikgewkvKiBEU1IgY2hhbmdlICovCisJCXByaW50ayhLRVJOX0lORk8gIkRTUiBjaGFuZ2UuLi5cbiIpOworCX0KKyNlbmRpZgorfQorCisvKgorICogIFRoZSB0b3AgbGV2ZWwgcG9sbGluZyByb3V0aW5lLiAgUmVwZWF0cyBldmVyeSAxLzEwMCBIWiAoMTBtcykuCisgKi8KK3N0YXRpYyB2b2lkIHJwX2RvX3BvbGwodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlDT05UUk9MTEVSX3QgKmN0bHA7CisJaW50IGN0cmwsIGFpb3AsIGNoLCBsaW5lLCBpOworCXVuc2lnbmVkIGludCB4bWl0bWFzazsKKwl1bnNpZ25lZCBpbnQgQ3RsTWFzazsKKwl1bnNpZ25lZCBjaGFyIEFpb3BNYXNrOworCVdvcmRfdCBiaXQ7CisKKwkvKiAgV2FsayB0aHJvdWdoIGFsbCB0aGUgYm9hcmRzIChjdHJsJ3MpICovCisJZm9yIChjdHJsID0gMDsgY3RybCA8IG1heF9ib2FyZDsgY3RybCsrKSB7CisJCWlmIChyY2t0cHRfaW9fYWRkcltjdHJsXSA8PSAwKQorCQkJY29udGludWU7CisKKwkJLyogIEdldCBhIHB0ciB0byB0aGUgYm9hcmQncyBjb250cm9sIHN0cnVjdCAqLworCQljdGxwID0gc0N0bE51bVRvQ3RsUHRyKGN0cmwpOworCisJCS8qICBHZXQgdGhlIGludGVydXB0IHN0YXR1cyBmcm9tIHRoZSBib2FyZCAqLworI2lmZGVmIENPTkZJR19QQ0kKKwkJaWYgKGN0bHAtPkJ1c1R5cGUgPT0gaXNQQ0kpCisJCQlDdGxNYXNrID0gc1BDSUdldENvbnRyb2xsZXJJbnRTdGF0dXMoY3RscCk7CisJCWVsc2UKKyNlbmRpZgorCQkJQ3RsTWFzayA9IHNHZXRDb250cm9sbGVySW50U3RhdHVzKGN0bHApOworCisJCS8qICBDaGVjayBpZiBhbnkgQUlPUCByZWFkIGJpdHMgYXJlIHNldCAqLworCQlmb3IgKGFpb3AgPSAwOyBDdGxNYXNrOyBhaW9wKyspIHsKKwkJCWJpdCA9IGN0bHAtPkFpb3BJbnRyQml0c1thaW9wXTsKKwkJCWlmIChDdGxNYXNrICYgYml0KSB7CisJCQkJQ3RsTWFzayAmPSB+Yml0OworCQkJCUFpb3BNYXNrID0gc0dldEFpb3BJbnRTdGF0dXMoY3RscCwgYWlvcCk7CisKKwkJCQkvKiAgQ2hlY2sgaWYgYW55IHBvcnQgcmVhZCBiaXRzIGFyZSBzZXQgKi8KKwkJCQlmb3IgKGNoID0gMDsgQWlvcE1hc2s7ICBBaW9wTWFzayA+Pj0gMSwgY2grKykgeworCQkJCQlpZiAoQWlvcE1hc2sgJiAxKSB7CisKKwkJCQkJCS8qICBHZXQgdGhlIGxpbmUgbnVtYmVyICgvZGV2L3R0eVJ4IG51bWJlcikuICovCisJCQkJCQkvKiAgUmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBwb3J0LiAqLworCQkJCQkJbGluZSA9IEdldExpbmVOdW1iZXIoY3RybCwgYWlvcCwgY2gpOworCQkJCQkJcnBfaGFuZGxlX3BvcnQocnBfdGFibGVbbGluZV0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJeG1pdG1hc2sgPSB4bWl0X2ZsYWdzW2N0cmxdOworCisJCS8qCisJCSAqICB4bWl0X2ZsYWdzIGNvbnRhaW5zIGJpdC1zaWduaWZpY2FudCBmbGFncywgaW5kaWNhdGluZyB0aGVyZSBpcyBkYXRhCisJCSAqICB0byB4bWl0IG9uIHRoZSBwb3J0LiBCaXQgMCBpcyBwb3J0IDAgb24gdGhpcyBib2FyZCwgYml0IDEgaXMgcG9ydCAKKwkJICogIDEsIC4uLiAoMzIgdG90YWwgcG9zc2libGUpLiAgVGhlIHZhcmlhYmxlIGkgaGFzIHRoZSBhaW9wIGFuZCBjaCAKKwkJICogIG51bWJlcnMgZW5jb2RlZCBpbiBpdCAocG9ydCAwLTcgYXJlIGFpb3AwLCA4LTE1IGFyZSBhaW9wMSwgZXRjKS4KKwkJICovCisJCWlmICh4bWl0bWFzaykgeworCQkJZm9yIChpID0gMDsgaSA8IHJvY2tldE1vZGVsW2N0cmxdLm51bVBvcnRzOyBpKyspIHsKKwkJCQlpZiAoeG1pdG1hc2sgJiAoMSA8PCBpKSkgeworCQkJCQlhaW9wID0gKGkgJiAweDE4KSA+PiAzOworCQkJCQljaCA9IGkgJiAweDA3OworCQkJCQlsaW5lID0gR2V0TGluZU51bWJlcihjdHJsLCBhaW9wLCBjaCk7CisJCQkJCXJwX2RvX3RyYW5zbWl0KHJwX3RhYmxlW2xpbmVdKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFJlc2V0IHRoZSB0aW1lciBzbyB3ZSBnZXQgY2FsbGVkIGF0IHRoZSBuZXh0IGNsb2NrIHRpY2sgKDEwbXMpLgorCSAqLworCWlmIChhdG9taWNfcmVhZCgmcnBfbnVtX3BvcnRzX29wZW4pKQorCQltb2RfdGltZXIoJnJvY2tldF90aW1lciwgamlmZmllcyArIFBPTExfUEVSSU9EKTsKK30KKworLyoKKyAqICBJbml0aWFsaXplcyB0aGUgcl9wb3J0IHN0cnVjdHVyZSBmb3IgYSBwb3J0LCBhcyB3ZWxsIGFzIGVuYWJsaW5nIHRoZSBwb3J0IG9uIAorICogIHRoZSBib2FyZC4gIAorICogIElucHV0czogIGJvYXJkLCBhaW9wLCBjaGFuIG51bWJlcnMKKyAqLworc3RhdGljIHZvaWQgaW5pdF9yX3BvcnQoaW50IGJvYXJkLCBpbnQgYWlvcCwgaW50IGNoYW4sIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXVuc2lnbmVkIHJvY2tldE1vZGU7CisJc3RydWN0IHJfcG9ydCAqaW5mbzsKKwlpbnQgbGluZTsKKwlDT05UUk9MTEVSX1QgKmN0bHA7CisKKwkvKiAgR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBsaW5lIG51bWJlciAqLworCWxpbmUgPSBTZXRMaW5lTnVtYmVyKGJvYXJkLCBhaW9wLCBjaGFuKTsKKworCWN0bHAgPSBzQ3RsTnVtVG9DdGxQdHIoYm9hcmQpOworCisJLyogIEdldCBhIHJfcG9ydCBzdHJ1Y3QgZm9yIHRoZSBwb3J0LCBmaWxsIGl0IGluIGFuZCBzYXZlIGl0IGdsb2JhbGx5LCBpbmRleGVkIGJ5IGxpbmUgbnVtYmVyICovCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgcl9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkNvdWxkbid0IGFsbG9jYXRlIGluZm8gc3RydWN0IGZvciBsaW5lICMlZFxuIiwgbGluZSk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZiAoc3RydWN0IHJfcG9ydCkpOworCisJaW5mby0+bWFnaWMgPSBSUE9SVF9NQUdJQzsKKwlpbmZvLT5saW5lID0gbGluZTsKKwlpbmZvLT5jdGxwID0gY3RscDsKKwlpbmZvLT5ib2FyZCA9IGJvYXJkOworCWluZm8tPmFpb3AgPSBhaW9wOworCWluZm8tPmNoYW4gPSBjaGFuOworCWluZm8tPmNsb3Npbmdfd2FpdCA9IDMwMDA7CisJaW5mby0+Y2xvc2VfZGVsYXkgPSA1MDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOworCWluZm8tPmZsYWdzICY9IH5ST0NLRVRfTU9ERV9NQVNLOworCXN3aXRjaCAocGMxMDRbYm9hcmRdW2xpbmVdKSB7CisJY2FzZSA0MjI6CisJCWluZm8tPmZsYWdzIHw9IFJPQ0tFVF9NT0RFX1JTNDIyOworCQlicmVhazsKKwljYXNlIDQ4NToKKwkJaW5mby0+ZmxhZ3MgfD0gUk9DS0VUX01PREVfUlM0ODU7CisJCWJyZWFrOworCWNhc2UgMjMyOgorCWRlZmF1bHQ6CisJCWluZm8tPmZsYWdzIHw9IFJPQ0tFVF9NT0RFX1JTMjMyOworCQlicmVhazsKKwl9CisKKwlpbmZvLT5pbnRtYXNrID0gUlhGX1RSSUcgfCBUWEZJRk9fTVQgfCBTUkNfSU5UIHwgREVMVEFfQ0QgfCBERUxUQV9DVFMgfCBERUxUQV9EU1I7CisJaWYgKHNJbml0Q2hhbihjdGxwLCAmaW5mby0+Y2hhbm5lbCwgYWlvcCwgY2hhbikgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJSb2NrZXRQb3J0IHNJbml0Q2hhbiglZCwgJWQsICVkKSBmYWlsZWQhXG4iLCBib2FyZCwgYWlvcCwgY2hhbik7CisJCWtmcmVlKGluZm8pOworCQlyZXR1cm47CisJfQorCisJcm9ja2V0TW9kZSA9IGluZm8tPmZsYWdzICYgUk9DS0VUX01PREVfTUFTSzsKKworCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfUlRTX1RPR0dMRSkgfHwgKHJvY2tldE1vZGUgPT0gUk9DS0VUX01PREVfUlM0ODUpKQorCQlzRW5SVFNUb2dnbGUoJmluZm8tPmNoYW5uZWwpOworCWVsc2UKKwkJc0Rpc1JUU1RvZ2dsZSgmaW5mby0+Y2hhbm5lbCk7CisKKwlpZiAoY3RscC0+Ym9hcmRUeXBlID09IFJPQ0tFVF9UWVBFX1BDMTA0KSB7CisJCXN3aXRjaCAocm9ja2V0TW9kZSkgeworCQljYXNlIFJPQ0tFVF9NT0RFX1JTNDg1OgorCQkJc1NldEludGVyZmFjZU1vZGUoJmluZm8tPmNoYW5uZWwsIEludGVyZmFjZU1vZGVSUzQ4NSk7CisJCQlicmVhazsKKwkJY2FzZSBST0NLRVRfTU9ERV9SUzQyMjoKKwkJCXNTZXRJbnRlcmZhY2VNb2RlKCZpbmZvLT5jaGFubmVsLCBJbnRlcmZhY2VNb2RlUlM0MjIpOworCQkJYnJlYWs7CisJCWNhc2UgUk9DS0VUX01PREVfUlMyMzI6CisJCWRlZmF1bHQ6CisJCQlpZiAoaW5mby0+ZmxhZ3MgJiBST0NLRVRfUlRTX1RPR0dMRSkKKwkJCQlzU2V0SW50ZXJmYWNlTW9kZSgmaW5mby0+Y2hhbm5lbCwgSW50ZXJmYWNlTW9kZVJTMjMyVCk7CisJCQllbHNlCisJCQkJc1NldEludGVyZmFjZU1vZGUoJmluZm8tPmNoYW5uZWwsIEludGVyZmFjZU1vZGVSUzIzMik7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+c2xvY2spOworCXNlbWFfaW5pdCgmaW5mby0+d3JpdGVfc2VtLCAxKTsKKwlycF90YWJsZVtsaW5lXSA9IGluZm87CisJaWYgKHBjaV9kZXYpCisJCXR0eV9yZWdpc3Rlcl9kZXZpY2Uocm9ja2V0X2RyaXZlciwgbGluZSwgJnBjaV9kZXYtPmRldik7Cit9CisKKy8qCisgKiAgQ29uZmlndXJlcyBhIHJvY2tldHBvcnQgcG9ydCBhY2NvcmRpbmcgdG8gaXRzIHRlcm1pbyBzZXR0aW5ncy4gIENhbGxlZCBmcm9tIAorICogIHVzZXIgbW9kZSBpbnRvIHRoZSBkcml2ZXIgKGV4Y2VwdGlvbiBoYW5kbGVyKS4gICppbmZvIENEIG1hbmlwdWxhdGlvbiBpcyBzcGlubG9jayBwcm90ZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZV9yX3BvcnQoc3RydWN0IHJfcG9ydCAqaW5mbywKKwkJCSAgICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXVuc2lnbmVkIGNmbGFnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcm9ja2V0TW9kZTsKKwlpbnQgYml0cywgYmF1ZCwgZGl2aXNvcjsKKwlDSEFOTkVMX3QgKmNwOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuOworCWNwID0gJmluZm8tPmNoYW5uZWw7CisJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwkvKiBCeXRlIHNpemUgYW5kIHBhcml0eSAqLworCWlmICgoY2ZsYWcgJiBDU0laRSkgPT0gQ1M4KSB7CisJCXNTZXREYXRhOChjcCk7CisJCWJpdHMgPSAxMDsKKwl9IGVsc2UgeworCQlzU2V0RGF0YTcoY3ApOworCQliaXRzID0gOTsKKwl9CisJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CisJCXNTZXRTdG9wMihjcCk7CisJCWJpdHMrKzsKKwl9IGVsc2UgeworCQlzU2V0U3RvcDEoY3ApOworCX0KKworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlzRW5QYXJpdHkoY3ApOworCQliaXRzKys7CisJCWlmIChjZmxhZyAmIFBBUk9ERCkgeworCQkJc1NldE9kZFBhcml0eShjcCk7CisJCX0gZWxzZSB7CisJCQlzU2V0RXZlblBhcml0eShjcCk7CisJCX0KKwl9IGVsc2UgeworCQlzRGlzUGFyaXR5KGNwKTsKKwl9CisKKwkvKiBiYXVkIHJhdGUgKi8KKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwlpZiAoIWJhdWQpCisJCWJhdWQgPSA5NjAwOworCWRpdmlzb3IgPSAoKHJwX2JhdWRfYmFzZVtpbmZvLT5ib2FyZF0gKyAoYmF1ZCA+PiAxKSkgLyBiYXVkKSAtIDE7CisJaWYgKChkaXZpc29yID49IDgxOTIgfHwgZGl2aXNvciA8IDApICYmIG9sZF90ZXJtaW9zKSB7CisJCWluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7CisJCWluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyB8PQorCQkgICAgKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpOworCQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwkJaWYgKCFiYXVkKQorCQkJYmF1ZCA9IDk2MDA7CisJCWRpdmlzb3IgPSAocnBfYmF1ZF9iYXNlW2luZm8tPmJvYXJkXSAvIGJhdWQpIC0gMTsKKwl9CisJaWYgKGRpdmlzb3IgPj0gODE5MiB8fCBkaXZpc29yIDwgMCkgeworCQliYXVkID0gOTYwMDsKKwkJZGl2aXNvciA9IChycF9iYXVkX2Jhc2VbaW5mby0+Ym9hcmRdIC8gYmF1ZCkgLSAxOworCX0KKwlpbmZvLT5jcHMgPSBiYXVkIC8gYml0czsKKwlzU2V0QmF1ZChjcCwgZGl2aXNvcik7CisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWluZm8tPmludG1hc2sgfD0gREVMVEFfQ1RTOworCQlzRW5DVFNGbG93Q3RsKGNwKTsKKwl9IGVsc2UgeworCQlpbmZvLT5pbnRtYXNrICY9IH5ERUxUQV9DVFM7CisJCXNEaXNDVFNGbG93Q3RsKGNwKTsKKwl9CisJaWYgKGNmbGFnICYgQ0xPQ0FMKSB7CisJCWluZm8tPmludG1hc2sgJj0gfkRFTFRBX0NEOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlpZiAoc0dldENoYW5TdGF0dXMoY3ApICYgQ0RfQUNUKQorCQkJaW5mby0+Y2Rfc3RhdHVzID0gMTsKKwkJZWxzZQorCQkJaW5mby0+Y2Rfc3RhdHVzID0gMDsKKwkJaW5mby0+aW50bWFzayB8PSBERUxUQV9DRDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgaW4gdGhlIGJvYXJkCisJICovCisjaWZkZWYgUk9DS0VUX1NPRlRfRkxPVworCWlmIChJX0lYT04oaW5mby0+dHR5KSkgeworCQlzRW5UeFNvZnRGbG93Q3RsKGNwKTsKKwkJaWYgKElfSVhBTlkoaW5mby0+dHR5KSkgeworCQkJc0VuSVhBTlkoY3ApOworCQl9IGVsc2UgeworCQkJc0Rpc0lYQU5ZKGNwKTsKKwkJfQorCQlzU2V0VHhYT05DaGFyKGNwLCBTVEFSVF9DSEFSKGluZm8tPnR0eSkpOworCQlzU2V0VHhYT0ZGQ2hhcihjcCwgU1RPUF9DSEFSKGluZm8tPnR0eSkpOworCX0gZWxzZSB7CisJCXNEaXNUeFNvZnRGbG93Q3RsKGNwKTsKKwkJc0Rpc0lYQU5ZKGNwKTsKKwkJc0NsclR4WE9GRihjcCk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFNldCB1cCBpZ25vcmUvcmVhZCBtYXNrIHdvcmRzCisJICovCisJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFNUTVJDVlJPVlJIIHwgMHhGRjsKKwlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFNUTUZSQU1FSCB8IFNUTVBBUklUWUg7CisJaWYgKElfQlJLSU5UKGluZm8tPnR0eSkgfHwgSV9QQVJNUksoaW5mby0+dHR5KSkKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBTVE1CUkVBS0g7CisKKwkvKgorCSAqIENoYXJhY3RlcnMgdG8gaWdub3JlCisJICovCisJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKKwlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFNUTUZSQU1FSCB8IFNUTVBBUklUWUg7CisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFNUTUJSRUFLSDsKKwkJLyoKKwkJICogSWYgd2UncmUgaWdub3JpbmcgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLAorCQkgKiBpZ25vcmUgb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KKwkJICovCisJCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFNUTVJDVlJPVlJIOworCX0KKworCXJvY2tldE1vZGUgPSBpbmZvLT5mbGFncyAmIFJPQ0tFVF9NT0RFX01BU0s7CisKKwlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1JUU19UT0dHTEUpCisJICAgIHx8IChyb2NrZXRNb2RlID09IFJPQ0tFVF9NT0RFX1JTNDg1KSkKKwkJc0VuUlRTVG9nZ2xlKGNwKTsKKwllbHNlCisJCXNEaXNSVFNUb2dnbGUoY3ApOworCisJc1NldFJUUygmaW5mby0+Y2hhbm5lbCk7CisKKwlpZiAoY3AtPkN0bFAtPmJvYXJkVHlwZSA9PSBST0NLRVRfVFlQRV9QQzEwNCkgeworCQlzd2l0Y2ggKHJvY2tldE1vZGUpIHsKKwkJY2FzZSBST0NLRVRfTU9ERV9SUzQ4NToKKwkJCXNTZXRJbnRlcmZhY2VNb2RlKGNwLCBJbnRlcmZhY2VNb2RlUlM0ODUpOworCQkJYnJlYWs7CisJCWNhc2UgUk9DS0VUX01PREVfUlM0MjI6CisJCQlzU2V0SW50ZXJmYWNlTW9kZShjcCwgSW50ZXJmYWNlTW9kZVJTNDIyKTsKKwkJCWJyZWFrOworCQljYXNlIFJPQ0tFVF9NT0RFX1JTMjMyOgorCQlkZWZhdWx0OgorCQkJaWYgKGluZm8tPmZsYWdzICYgUk9DS0VUX1JUU19UT0dHTEUpCisJCQkJc1NldEludGVyZmFjZU1vZGUoY3AsIEludGVyZmFjZU1vZGVSUzIzMlQpOworCQkJZWxzZQorCQkJCXNTZXRJbnRlcmZhY2VNb2RlKGNwLCBJbnRlcmZhY2VNb2RlUlMyMzIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qICBpbmZvLT5jb3VudCBpcyBjb25zaWRlcmVkIGNyaXRpY2FsLCBwcm90ZWN0ZWQgYnkgc3BpbmxvY2tzLiAgKi8KK3N0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgc3RydWN0IHJfcG9ydCAqaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgcmV0dmFsOworCWludCBkb19jbG9jYWwgPSAwLCBleHRyYV9jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jaworCSAqIHVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgorCSAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQorCQlyZXR1cm4gKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9IVVBfTk9USUZZKSA/IC1FQUdBSU4gOiAtRVJFU1RBUlRTWVMpOworCWlmIChpbmZvLT5mbGFncyAmIFJPQ0tFVF9DTE9TSU5HKSB7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOworCQlyZXR1cm4gKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9IVVBfTk9USUZZKSA/IC1FQUdBSU4gOiAtRVJFU1RBUlRTWVMpOworCX0KKworCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworCQlpbmZvLT5mbGFncyB8PSBST0NLRVRfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvX2Nsb2NhbCA9IDE7CisKKwkvKgorCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lIGZyZWUuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0IHJwX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIAorICAgICAgICAgKiBXZSByZXN0b3JlIGl0IHVwb24gZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KKwkgKi8KKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKyNpZmRlZiBST0NLRVRfREVCVUdfT1BFTgorCXByaW50ayhLRVJOX0lORk8gImJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6IHR0eVIlZCwgY291bnQgPSAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKyNpZmRlZiBST0NLRVRfRElTQUJMRV9TSU1VU0FHRQorCWluZm8tPmZsYWdzIHw9IFJPQ0tFVF9OT1JNQUxfQUNUSVZFOworI2Vsc2UKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJZXh0cmFfY291bnQgPSAxOworCQlpbmZvLT5jb3VudC0tOworCX0KKyNlbmRpZgorCWluZm8tPmJsb2NrZWRfb3BlbisrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICgxKSB7CisJCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgeworCQkJc1NldERUUigmaW5mby0+Y2hhbm5lbCk7CisJCQlzU2V0UlRTKCZpbmZvLT5jaGFubmVsKTsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAhKGluZm8tPmZsYWdzICYgUk9DS0VUX0lOSVRJQUxJWkVEKSkgeworCQkJaWYgKGluZm8tPmZsYWdzICYgUk9DS0VUX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShpbmZvLT5mbGFncyAmIFJPQ0tFVF9DTE9TSU5HKSAmJiAoZG9fY2xvY2FsIHx8IChzR2V0Q2hhblN0YXR1c0xvKCZpbmZvLT5jaGFubmVsKSAmIENEX0FDVCkpKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBST0NLRVRfREVCVUdfT1BFTgorCQlwcmludGsoS0VSTl9JTkZPICJibG9ja190aWxfcmVhZHkgYmxvY2tpbmc6IHR0eVIlZCwgY291bnQgPSAlZCwgZmxhZ3M9MHglMHhcbiIsCisJCSAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQsIGluZm8tPmZsYWdzKTsKKyNlbmRpZgorCQlzY2hlZHVsZSgpOwkvKiAgRG9uJ3QgaG9sZCBzcGlubG9jayBoZXJlLCB3aWxsIGhhbmcgUEMgKi8KKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoZXh0cmFfY291bnQpCisJCWluZm8tPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwlwcmludGsoS0VSTl9JTkZPICJibG9ja190aWxfcmVhZHkgYWZ0ZXIgYmxvY2tpbmc6IHR0eVIlZCwgY291bnQgPSAlZFxuIiwKKwkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpbmZvLT5mbGFncyB8PSBST0NLRVRfTk9STUFMX0FDVElWRTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBFeGNlcHRpb24gaGFuZGxlciB0aGF0IG9wZW5zIGEgc2VyaWFsIHBvcnQuICBDcmVhdGVzIHhtaXRfYnVmIHN0b3JhZ2UsIGZpbGxzIGluIAorICogIHBvcnQncyByX3BvcnQgc3RydWN0LiAgSW5pdGlhbGl6ZXMgdGhlIHBvcnQgaGFyZHdhcmUuICAKKyAqLworc3RhdGljIGludCBycF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCByX3BvcnQgKmluZm87CisJaW50IGxpbmUgPSAwLCByZXR2YWw7CisJQ0hBTk5FTF90ICpjcDsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisKKwlsaW5lID0gVFRZX0dFVF9MSU5FKHR0eSk7CisJaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gTUFYX1JQX1BPUlRTKSB8fCAoKGluZm8gPSBycF90YWJsZVtsaW5lXSkgPT0gTlVMTCkpCisJCXJldHVybiAtRU5YSU87CisKKwlwYWdlID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBST0NLRVRfQ0xPU0lORykgeworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkJZnJlZV9wYWdlKHBhZ2UpOworCQlyZXR1cm4gKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9IVVBfTk9USUZZKSA/IC1FQUdBSU4gOiAtRVJFU1RBUlRTWVMpOworCX0KKworCS8qCisJICogV2UgbXVzdCBub3Qgc2xlZXAgZnJvbSBoZXJlIHVudGlsIHRoZSBwb3J0IGlzIG1hcmtlZCBmdWxseSBpbiB1c2UuCisJICovCisJaWYgKGluZm8tPnhtaXRfYnVmKQorCQlmcmVlX3BhZ2UocGFnZSk7CisJZWxzZQorCQlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisKKwlpZiAoaW5mby0+Y291bnQrKyA9PSAwKSB7CisJCWF0b21pY19pbmMoJnJwX251bV9wb3J0c19vcGVuKTsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCisJCXByaW50ayhLRVJOX0lORk8gInJvY2tldCBtb2QrKyA9ICVkLi4uIiwgYXRvbWljX3JlYWQoJnJwX251bV9wb3J0c19vcGVuKSk7CisjZW5kaWYKKwl9CisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwlwcmludGsoS0VSTl9JTkZPICJycF9vcGVuIHR0eVIlZCwgY291bnQ9JWRcbiIsIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCisJLyoKKwkgKiBJbmZvLT5jb3VudCBpcyBub3cgMTsgc28gaXQncyBzYWZlIHRvIHNsZWVwIG5vdy4KKwkgKi8KKwlpbmZvLT5zZXNzaW9uID0gY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uOworCWluZm8tPnBncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOworCisJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9JTklUSUFMSVpFRCkgPT0gMCkgeworCQljcCA9ICZpbmZvLT5jaGFubmVsOworCQlzU2V0UnhUcmlnZ2VyKGNwLCBUUklHXzEpOworCQlpZiAoc0dldENoYW5TdGF0dXMoY3ApICYgQ0RfQUNUKQorCQkJaW5mby0+Y2Rfc3RhdHVzID0gMTsKKwkJZWxzZQorCQkJaW5mby0+Y2Rfc3RhdHVzID0gMDsKKwkJc0Rpc1J4U3RhdHVzTW9kZShjcCk7CisJCXNGbHVzaFJ4RklGTyhjcCk7CisJCXNGbHVzaFR4RklGTyhjcCk7CisKKwkJc0VuSW50ZXJydXB0cyhjcCwgKFRYSU5UX0VOIHwgTUNJTlRfRU4gfCBSWElOVF9FTiB8IFNSQ0lOVF9FTiB8IENIQU5JTlRfRU4pKTsKKwkJc1NldFJ4VHJpZ2dlcihjcCwgVFJJR18xKTsKKworCQlzR2V0Q2hhblN0YXR1cyhjcCk7CisJCXNEaXNSeFN0YXR1c01vZGUoY3ApOworCQlzQ2xyVHhYT0ZGKGNwKTsKKworCQlzRGlzQ1RTRmxvd0N0bChjcCk7CisJCXNEaXNUeFNvZnRGbG93Q3RsKGNwKTsKKworCQlzRW5SeEZJRk8oY3ApOworCQlzRW5UcmFuc21pdChjcCk7CisKKwkJaW5mby0+ZmxhZ3MgfD0gUk9DS0VUX0lOSVRJQUxJWkVEOworCisJCS8qCisJCSAqIFNldCB1cCB0aGUgdHR5LT5hbHRfc3BlZWQga2x1ZGdlCisJCSAqLworCQlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1NQRF9NQVNLKSA9PSBST0NLRVRfU1BEX0hJKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA1NzYwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9WSEkpCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9TSEkpCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9XQVJQKQorCQkJaW5mby0+dHR5LT5hbHRfc3BlZWQgPSA0NjA4MDA7CisKKwkJY29uZmlndXJlX3JfcG9ydChpbmZvLCBOVUxMKTsKKwkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSB7CisJCQlzU2V0RFRSKGNwKTsKKwkJCXNTZXRSVFMoY3ApOworCQl9CisJfQorCS8qICBTdGFydHMgKG9yIHJlc2V0cykgdGhlIG1haW50IHBvbGxpbmcgbG9vcCAqLworCW1vZF90aW1lcigmcm9ja2V0X3RpbWVyLCBqaWZmaWVzICsgUE9MTF9QRVJJT0QpOworCisJcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisJaWYgKHJldHZhbCkgeworI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCisJCXByaW50ayhLRVJOX0lORk8gInJwX29wZW4gcmV0dXJuaW5nIGFmdGVyIGJsb2NrX3RpbF9yZWFkeSB3aXRoICVkXG4iLCByZXR2YWwpOworI2VuZGlmCisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogIEV4Y2VwdGlvbiBoYW5kbGVyIHRoYXQgY2xvc2VzIGEgc2VyaWFsIHBvcnQuIGluZm8tPmNvdW50IGlzIGNvbnNpZGVyZWQgY3JpdGljYWwuIAorICovCitzdGF0aWMgdm9pZCBycF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0aW1lb3V0OworCUNIQU5ORUxfdCAqY3A7CisJCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfY2xvc2UiKSkKKwkJcmV0dXJuOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwlwcmludGsoS0VSTl9JTkZPICJycF9jbG9zZSB0dHlSJWQsIGNvdW50ID0gJWRcbiIsIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKyNlbmRpZgorCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCisJCXJldHVybjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoaW5mby0+Y291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBJbmZvLT5jb3VudCBzaG91bGQgYWx3YXlzCisJCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KKwkJICogb25lLCB3ZSd2ZSBnb3QgcmVhbCBwcm9ibGVtcywgc2luY2UgaXQgbWVhbnMgdGhlCisJCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAicnBfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCisJCSAgICAgICAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnBfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgdHR5UiVkOiAlZFxuIiwKKwkJICAgICAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAwOworCX0KKwlpZiAoaW5mby0+Y291bnQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpbmZvLT5mbGFncyB8PSBST0NLRVRfQ0xPU0lORzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKworCS8qCisJICogTm90aWZ5IHRoZSBsaW5lIGRpc2NwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycworCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisKKwkvKgorCSAqIElmIHRyYW5zbWlzc2lvbiB3YXMgdGhyb3R0bGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0LAorCSAqIGp1c3QgZmx1c2ggdGhlIHhtaXQgYnVmZmVyLgorCSAqLworCWlmICh0dHktPmZsb3dfc3RvcHBlZCkKKwkJcnBfZmx1c2hfYnVmZmVyKHR0eSk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXIKKwkgKi8KKwlpZiAoaW5mby0+Y2xvc2luZ193YWl0ICE9IFJPQ0tFVF9DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJLyoKKwkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgorCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQorCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCisJICovCisJdGltZW91dCA9IChzR2V0VHhDbnQoY3ApICsgMSkgKiBIWiAvIGluZm8tPmNwczsKKwlpZiAodGltZW91dCA9PSAwKQorCQl0aW1lb3V0ID0gMTsKKwlycF93YWl0X3VudGlsX3NlbnQodHR5LCB0aW1lb3V0KTsKKwljbGVhcl9iaXQoKGluZm8tPmFpb3AgKiA4KSArIGluZm8tPmNoYW4sICh2b2lkICopICZ4bWl0X2ZsYWdzW2luZm8tPmJvYXJkXSk7CisKKwlzRGlzVHJhbnNtaXQoY3ApOworCXNEaXNJbnRlcnJ1cHRzKGNwLCAoVFhJTlRfRU4gfCBNQ0lOVF9FTiB8IFJYSU5UX0VOIHwgU1JDSU5UX0VOIHwgQ0hBTklOVF9FTikpOworCXNEaXNDVFNGbG93Q3RsKGNwKTsKKwlzRGlzVHhTb2Z0Rmxvd0N0bChjcCk7CisJc0NsclR4WE9GRihjcCk7CisJc0ZsdXNoUnhGSUZPKGNwKTsKKwlzRmx1c2hUeEZJRk8oY3ApOworCXNDbHJSVFMoY3ApOworCWlmIChDX0hVUENMKHR0eSkpCisJCXNDbHJEVFIoY3ApOworCisJaWYgKFRUWV9EUklWRVJfRkxVU0hfQlVGRkVSX0VYSVNUUyh0dHkpKQorCQlUVFlfRFJJVkVSX0ZMVVNIX0JVRkZFUih0dHkpOworCQkKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKworCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0gZWxzZSB7CisJCWlmIChpbmZvLT54bWl0X2J1ZikgeworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7CisJCQlpbmZvLT54bWl0X2J1ZiA9IE5VTEw7CisJCX0KKwl9CisJaW5mby0+ZmxhZ3MgJj0gfihST0NLRVRfSU5JVElBTElaRUQgfCBST0NLRVRfQ0xPU0lORyB8IFJPQ0tFVF9OT1JNQUxfQUNUSVZFKTsKKwl0dHktPmNsb3NpbmcgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJYXRvbWljX2RlYygmcnBfbnVtX3BvcnRzX29wZW4pOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KKwlwcmludGsoS0VSTl9JTkZPICJyb2NrZXQgbW9kLS0gPSAlZC4uLiIsIGF0b21pY19yZWFkKCZycF9udW1fcG9ydHNfb3BlbikpOworCXByaW50ayhLRVJOX0lORk8gInJwX2Nsb3NlIHR0eVIlZCBjb21wbGV0ZSBzaHV0ZG93blxuIiwgaW5mby0+bGluZSk7CisjZW5kaWYKKworfQorCitzdGF0aWMgdm9pZCBycF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisJdW5zaWduZWQgY2ZsYWc7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9zZXRfdGVybWlvcyIpKQorCQlyZXR1cm47CisKKwljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCWlmIChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGlzIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgQ1M1IG9yIENTNgorCSAqLworCWlmICgoKGNmbGFnICYgQ1NJWkUpID09IENTNSkgfHwgKChjZmxhZyAmIENTSVpFKSA9PSBDUzYpKQorCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkgICAgKChjZmxhZyAmIH5DU0laRSkgfCAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkpOworCisJY29uZmlndXJlX3JfcG9ydChpbmZvLCBvbGRfdGVybWlvcyk7CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCisJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJiAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQlzQ2xyRFRSKGNwKTsKKwkJc0NsclJUUyhjcCk7CisJfQorCisJLyogSGFuZGxlIHRyYW5zaXRpb24gYXdheSBmcm9tIEIwIHN0YXR1cyAqLworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKKwkJaWYgKCF0dHktPmh3X3N0b3BwZWQgfHwgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkKKwkJCXNTZXRSVFMoY3ApOworCQlzU2V0RFRSKGNwKTsKKwl9CisKKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQlycF9zdGFydCh0dHkpOworCX0KK30KKworc3RhdGljIHZvaWQgcnBfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9icmVhayIpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCXNTZW5kQnJlYWsoJmluZm8tPmNoYW5uZWwpOworCWVsc2UKKwkJc0NsckJyZWFrKCZpbmZvLT5jaGFubmVsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCisvKgorICogc0dldENoYW5SSSB1c2VkIHRvIGJlIGEgbWFjcm8gaW4gcm9ja2V0X2ludC5oLiBXaGVuIHRoZSBmdW5jdGlvbmFsaXR5IGZvcgorICogdGhlIFVQQ0kgYm9hcmRzIHdhcyBhZGRlZCwgaXQgd2FzIGRlY2lkZWQgdG8gbWFrZSB0aGlzIGEgZnVuY3Rpb24gYmVjYXVzZQorICogdGhlIG1hY3JvIHdhcyBnZXR0aW5nIHRvbyBjb21wbGljYXRlZC4gQWxsIGNhc2VzIGV4Y2VwdCB0aGUgZmlyc3Qgb25lCisgKiAoVVBDSVJpbmdJbmQpIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZSBvcmlnaW5hbCBtYWNyby4KKyAqLworc3RhdGljIGludCBzR2V0Q2hhblJJKENIQU5ORUxfVCAqIENoUCkKK3sKKwlDT05UUk9MTEVSX3QgKkN0bFAgPSBDaFAtPkN0bFA7CisJaW50IENoYW5OdW0gPSBDaFAtPkNoYW5OdW07CisJaW50IFJpbmdJbmQgPSAwOworCisJaWYgKEN0bFAtPlVQQ0lSaW5nSW5kKQorCQlSaW5nSW5kID0gIShzSW5CKEN0bFAtPlVQQ0lSaW5nSW5kKSAmIHNCaXRNYXBTZXRUYmxbQ2hhbk51bV0pOworCWVsc2UgaWYgKEN0bFAtPkFsdENoYW5SaW5nSW5kaWNhdG9yKQorCQlSaW5nSW5kID0gc0luQigoQnl0ZUlPX3QpIChDaFAtPkNoYW5TdGF0ICsgOCkpICYgRFNSX0FDVDsKKwllbHNlIGlmIChDdGxQLT5ib2FyZFR5cGUgPT0gUk9DS0VUX1RZUEVfUEMxMDQpCisJCVJpbmdJbmQgPSAhKHNJbkIoQ3RsUC0+QWlvcElPWzNdKSAmIHNCaXRNYXBTZXRUYmxbQ2hhbk51bV0pOworCisJcmV0dXJuIFJpbmdJbmQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBIZXJlIGFyZSB0aGUgcm91dGluZXMgdXNlZCBieSBycF9pb2N0bC4gIFRoZXNlIGFyZSBhbGwgY2FsbGVkIGZyb20gZXhjZXB0aW9uIGhhbmRsZXJzLiAgKi8KKworLyoKKyAqICBSZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGUgc2VyaWFsIG1vZGVtIGNvbnRyb2wgbGluZXMuICBUaGVzZSBuZXh0IDIgZnVuY3Rpb25zIAorICogIGFyZSB0aGUgd2F5IGtlcm5lbCB2ZXJzaW9ucyA+IDIuNSBoYW5kbGUgbW9kZW0gY29udHJvbCBsaW5lcyByYXRoZXIgdGhhbiBJT0NUTHMuCisgKi8KK3N0YXRpYyBpbnQgcnBfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY29udHJvbCwgcmVzdWx0LCBDaGFuU3RhdHVzOworCisJQ2hhblN0YXR1cyA9IHNHZXRDaGFuU3RhdHVzTG8oJmluZm8tPmNoYW5uZWwpOworCWNvbnRyb2wgPSBpbmZvLT5jaGFubmVsLlR4Q29udHJvbFszXTsKKwlyZXN1bHQgPSAoKGNvbnRyb2wgJiBTRVRfUlRTKSA/IFRJT0NNX1JUUyA6IDApIHwgCisJCSgoY29udHJvbCAmIFNFVF9EVFIpID8gIFRJT0NNX0RUUiA6IDApIHwKKwkJKChDaGFuU3RhdHVzICYgQ0RfQUNUKSA/IFRJT0NNX0NBUiA6IDApIHwKKwkJKHNHZXRDaGFuUkkoJmluZm8tPmNoYW5uZWwpID8gVElPQ01fUk5HIDogMCkgfAorCQkoKENoYW5TdGF0dXMgJiBEU1JfQUNUKSA/IFRJT0NNX0RTUiA6IDApIHwKKwkJKChDaGFuU3RhdHVzICYgQ1RTX0FDVCkgPyBUSU9DTV9DVFMgOiAwKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIAorICogIFNldHMgdGhlIG1vZGVtIGNvbnRyb2wgbGluZXMKKyAqLworc3RhdGljIGludCBycF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJaW5mby0+Y2hhbm5lbC5UeENvbnRyb2xbM10gfD0gU0VUX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlpbmZvLT5jaGFubmVsLlR4Q29udHJvbFszXSB8PSBTRVRfRFRSOworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJaW5mby0+Y2hhbm5lbC5UeENvbnRyb2xbM10gJj0gflNFVF9SVFM7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlpbmZvLT5jaGFubmVsLlR4Q29udHJvbFszXSAmPSB+U0VUX0RUUjsKKworCXNPdXREVyhpbmZvLT5jaGFubmVsLkluZGV4QWRkciwgKihEV29yZF90ICopICYgKGluZm8tPmNoYW5uZWwuVHhDb250cm9sWzBdKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvbmZpZyhzdHJ1Y3Qgcl9wb3J0ICppbmZvLCBzdHJ1Y3Qgcm9ja2V0X2NvbmZpZyBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IHJvY2tldF9jb25maWcgdG1wOworCisJaWYgKCFyZXRpbmZvKQorCQlyZXR1cm4gLUVGQVVMVDsKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mICh0bXApKTsKKwl0bXAubGluZSA9IGluZm8tPmxpbmU7CisJdG1wLmZsYWdzID0gaW5mby0+ZmxhZ3M7CisJdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7CisJdG1wLmNsb3Npbmdfd2FpdCA9IGluZm8tPmNsb3Npbmdfd2FpdDsKKwl0bXAucG9ydCA9IHJja3RwdF9pb19hZGRyWyhpbmZvLT5saW5lID4+IDUpICYgM107CisKKwlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZiAoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvbmZpZyhzdHJ1Y3Qgcl9wb3J0ICppbmZvLCBzdHJ1Y3Qgcm9ja2V0X2NvbmZpZyBfX3VzZXIgKm5ld19pbmZvKQoreworCXN0cnVjdCByb2NrZXRfY29uZmlnIG5ld19zZXJpYWw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld19pbmZvLCBzaXplb2YgKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJeworCQlpZiAoKG5ld19zZXJpYWwuZmxhZ3MgJiB+Uk9DS0VUX1VTUl9NQVNLKSAhPSAoaW5mby0+ZmxhZ3MgJiB+Uk9DS0VUX1VTUl9NQVNLKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5ST0NLRVRfVVNSX01BU0spIHwgKG5ld19zZXJpYWwuZmxhZ3MgJiBST0NLRVRfVVNSX01BU0spKTsKKwkJY29uZmlndXJlX3JfcG9ydChpbmZvLCBOVUxMKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgflJPQ0tFVF9GTEFHUykgfCAobmV3X3NlcmlhbC5mbGFncyAmIFJPQ0tFVF9GTEFHUykpOworCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheTsKKwlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdDsKKworCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfU1BEX01BU0spID09IFJPQ0tFVF9TUERfSEkpCisJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CisJaWYgKChpbmZvLT5mbGFncyAmIFJPQ0tFVF9TUERfTUFTSykgPT0gUk9DS0VUX1NQRF9WSEkpCisJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOworCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfU1BEX01BU0spID09IFJPQ0tFVF9TUERfU0hJKQorCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX1NQRF9NQVNLKSA9PSBST0NLRVRfU1BEX1dBUlApCisJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOworCisJY29uZmlndXJlX3JfcG9ydChpbmZvLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIGEgcm9ja2V0X3BvcnRzIHN0cnVjdCB3aXRoIGluZm9ybWF0aW9uCisgKiAgYWJvdXQgd2hhdCBib2FyZHMvcG9ydHMgYXJlIGluIHRoZSBzeXN0ZW0uICBUaGlzIGluZm8gaXMgcGFzc2VkCisgKiAgdG8gdXNlciBzcGFjZS4gIFNlZSBzZXRyb2NrZXQuYyB3aGVyZSB0aGUgaW5mbyBpcyB1c2VkIHRvIGNyZWF0ZQorICogIHRoZSAvZGV2L3R0eVJ4IHBvcnRzLgorICovCitzdGF0aWMgaW50IGdldF9wb3J0cyhzdHJ1Y3Qgcl9wb3J0ICppbmZvLCBzdHJ1Y3Qgcm9ja2V0X3BvcnRzIF9fdXNlciAqcmV0cG9ydHMpCit7CisJc3RydWN0IHJvY2tldF9wb3J0cyB0bXA7CisJaW50IGJvYXJkOworCisJaWYgKCFyZXRwb3J0cykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZiAodG1wKSk7CisJdG1wLnR0eV9tYWpvciA9IHJvY2tldF9kcml2ZXItPm1ham9yOworCisJZm9yIChib2FyZCA9IDA7IGJvYXJkIDwgNDsgYm9hcmQrKykgeworCQl0bXAucm9ja2V0TW9kZWxbYm9hcmRdLm1vZGVsID0gcm9ja2V0TW9kZWxbYm9hcmRdLm1vZGVsOworCQlzdHJjcHkodG1wLnJvY2tldE1vZGVsW2JvYXJkXS5tb2RlbFN0cmluZywgcm9ja2V0TW9kZWxbYm9hcmRdLm1vZGVsU3RyaW5nKTsKKwkJdG1wLnJvY2tldE1vZGVsW2JvYXJkXS5udW1Qb3J0cyA9IHJvY2tldE1vZGVsW2JvYXJkXS5udW1Qb3J0czsKKwkJdG1wLnJvY2tldE1vZGVsW2JvYXJkXS5sb2Fkcm0yID0gcm9ja2V0TW9kZWxbYm9hcmRdLmxvYWRybTI7CisJCXRtcC5yb2NrZXRNb2RlbFtib2FyZF0uc3RhcnRpbmdQb3J0TnVtYmVyID0gcm9ja2V0TW9kZWxbYm9hcmRdLnN0YXJ0aW5nUG9ydE51bWJlcjsKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihyZXRwb3J0cywgJnRtcCwgc2l6ZW9mICgqcmV0cG9ydHMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzZXRfcm0yKHN0cnVjdCByX3BvcnQgKmluZm8sIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJlc2V0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXNldCwgYXJnLCBzaXplb2YgKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocmVzZXQpCisJCXJlc2V0ID0gMTsKKworCWlmIChyY2t0cHRfdHlwZVtpbmZvLT5ib2FyZF0gIT0gUk9DS0VUX1RZUEVfTU9ERU1JSSAmJgorICAgICAgICAgICAgcmNrdHB0X3R5cGVbaW5mby0+Ym9hcmRdICE9IFJPQ0tFVF9UWVBFX01PREVNSUlJKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbmZvLT5jdGxwLT5CdXNUeXBlID09IGlzSVNBKQorCQlzTW9kZW1SZXNldChpbmZvLT5jdGxwLCBpbmZvLT5jaGFuLCByZXNldCk7CisJZWxzZQorCQlzUENJTW9kZW1SZXNldChpbmZvLT5jdGxwLCBpbmZvLT5jaGFuLCByZXNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdmVyc2lvbihzdHJ1Y3Qgcl9wb3J0ICppbmZvLCBzdHJ1Y3Qgcm9ja2V0X3ZlcnNpb24gX191c2VyICpyZXR2ZXJzKQoreworCWlmIChjb3B5X3RvX3VzZXIocmV0dmVycywgJmRyaXZlcl92ZXJzaW9uLCBzaXplb2YgKCpyZXR2ZXJzKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiAgSU9DVEwgY2FsbCBoYW5kbGVyIGludG8gdGhlIGRyaXZlciAqLworc3RhdGljIGludCBycF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGNtZCAhPSBSQ0tQX0dFVF9QT1JUUyAmJiByb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX2lvY3RsIikpCisJCXJldHVybiAtRU5YSU87CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUkNLUF9HRVRfU1RSVUNUOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGluZm8sIHNpemVvZiAoc3RydWN0IHJfcG9ydCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgUkNLUF9HRVRfQ09ORklHOgorCQlyZXR1cm4gZ2V0X2NvbmZpZyhpbmZvLCBhcmdwKTsKKwljYXNlIFJDS1BfU0VUX0NPTkZJRzoKKwkJcmV0dXJuIHNldF9jb25maWcoaW5mbywgYXJncCk7CisJY2FzZSBSQ0tQX0dFVF9QT1JUUzoKKwkJcmV0dXJuIGdldF9wb3J0cyhpbmZvLCBhcmdwKTsKKwljYXNlIFJDS1BfUkVTRVRfUk0yOgorCQlyZXR1cm4gcmVzZXRfcm0yKGluZm8sIGFyZ3ApOworCWNhc2UgUkNLUF9HRVRfVkVSU0lPTjoKKwkJcmV0dXJuIGdldF92ZXJzaW9uKGluZm8sIGFyZ3ApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBycF9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCit7CisJc3RydWN0IHJfcG9ydCAqaW5mbyA9IChzdHJ1Y3Qgcl9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJQ0hBTk5FTF90ICpjcDsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3NlbmRfeGNoYXIiKSkKKwkJcmV0dXJuOworCisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKwlpZiAoc0dldFR4Q250KGNwKSkKKwkJc1dyaXRlVHhQcmlvQnl0ZShjcCwgY2gpOworCWVsc2UKKwkJc1dyaXRlVHhCeXRlKHNHZXRUeFJ4RGF0YUlPKGNwKSwgY2gpOworfQorCitzdGF0aWMgdm9pZCBycF90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfVEhST1RUTEUKKwlwcmludGsoS0VSTl9JTkZPICJ0aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHktPm5hbWUsCisJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF90aHJvdHRsZSIpKQorCQlyZXR1cm47CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCWlmIChJX0lYT0ZGKHR0eSkpCisJCXJwX3NlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7CisKKwlzQ2xyUlRTKCZpbmZvLT5jaGFubmVsKTsKK30KKworc3RhdGljIHZvaWQgcnBfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1RIUk9UVExFCisJcHJpbnRrKEtFUk5fSU5GTyAidW50aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHktPm5hbWUsCisJICAgICAgIHR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSkpOworI2VuZGlmCisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF90aHJvdHRsZSIpKQorCQlyZXR1cm47CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCWlmIChJX0lYT0ZGKHR0eSkpCisJCXJwX3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOworCisJc1NldFJUUygmaW5mby0+Y2hhbm5lbCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJwX3N0b3AoKSBhbmQgcnBfc3RhcnQoKQorICoKKyAqIFRoaXMgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvciByZXNldHRpbmcgdHR5LT5zdG9wcGVkLgorICogVGhleSBlbmFibGUgb3IgZGlzYWJsZSB0cmFuc21pdHRlciBpbnRlcnJ1cHRzLCBhcyBuZWNlc3NhcnkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgcnBfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX0ZMT1cKKwlwcmludGsoS0VSTl9JTkZPICJzdG9wICVzOiAlZCAlZC4uLi5cbiIsIHR0eS0+bmFtZSwKKwkgICAgICAgaW5mby0+eG1pdF9jbnQsIGluZm8tPnhtaXRfZmlmb19yb29tKTsKKyNlbmRpZgorCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfc3RvcCIpKQorCQlyZXR1cm47CisKKwlpZiAoc0dldFR4Q250KCZpbmZvLT5jaGFubmVsKSkKKwkJc0Rpc1RyYW5zbWl0KCZpbmZvLT5jaGFubmVsKTsKK30KKworc3RhdGljIHZvaWQgcnBfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19GTE9XCisJcHJpbnRrKEtFUk5fSU5GTyAic3RhcnQgJXM6ICVkICVkLi4uLlxuIiwgdHR5LT5uYW1lLAorCSAgICAgICBpbmZvLT54bWl0X2NudCwgaW5mby0+eG1pdF9maWZvX3Jvb20pOworI2VuZGlmCisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9zdG9wIikpCisJCXJldHVybjsKKworCXNFblRyYW5zbWl0KCZpbmZvLT5jaGFubmVsKTsKKwlzZXRfYml0KChpbmZvLT5haW9wICogOCkgKyBpbmZvLT5jaGFuLAorCQkodm9pZCAqKSAmeG1pdF9mbGFnc1tpbmZvLT5ib2FyZF0pOworfQorCisvKgorICogcnBfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5CisgKi8KK3N0YXRpYyB2b2lkIHJwX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gKHN0cnVjdCByX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlDSEFOTkVMX3QgKmNwOworCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzOworCWludCBjaGVja190aW1lLCBleGl0X3RpbWU7CisJaW50IHR4Y250OworCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfd2FpdF91bnRpbF9zZW50IikpCisJCXJldHVybjsKKworCWNwID0gJmluZm8tPmNoYW5uZWw7CisKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworI2lmZGVmIFJPQ0tFVF9ERUJVR19XQUlUX1VOVElMX1NFTlQKKwlwcmludGsoS0VSTl9JTkZPICJJbiBSUF93YWl0X3VudGlsX3NlbnQoJWQpIChqaWZmPSVsdSkuLi4iLCB0aW1lb3V0LAorCSAgICAgICBqaWZmaWVzKTsKKwlwcmludGsoS0VSTl9JTkZPICJjcHM9JWQuLi4iLCBpbmZvLT5jcHMpOworI2VuZGlmCisJd2hpbGUgKDEpIHsKKwkJdHhjbnQgPSBzR2V0VHhDbnQoY3ApOworCQlpZiAoIXR4Y250KSB7CisJCQlpZiAoc0dldENoYW5TdGF0dXNMbyhjcCkgJiBUWFNIUk1UKQorCQkJCWJyZWFrOworCQkJY2hlY2tfdGltZSA9IChIWiAvIGluZm8tPmNwcykgLyA1OworCQl9IGVsc2UgeworCQkJY2hlY2tfdGltZSA9IEhaICogdHhjbnQgLyBpbmZvLT5jcHM7CisJCX0KKwkJaWYgKHRpbWVvdXQpIHsKKwkJCWV4aXRfdGltZSA9IG9yaWdfamlmZmllcyArIHRpbWVvdXQgLSBqaWZmaWVzOworCQkJaWYgKGV4aXRfdGltZSA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGV4aXRfdGltZSA8IGNoZWNrX3RpbWUpCisJCQkJY2hlY2tfdGltZSA9IGV4aXRfdGltZTsKKwkJfQorCQlpZiAoY2hlY2tfdGltZSA9PSAwKQorCQkJY2hlY2tfdGltZSA9IDE7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1dBSVRfVU5USUxfU0VOVAorCQlwcmludGsoS0VSTl9JTkZPICJ0eGNudCA9ICVkIChqaWZmPSVsdSxjaGVjaz0lZCkuLi4iLCB0eGNudCwgamlmZmllcywgY2hlY2tfdGltZSk7CisjZW5kaWYKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGVja190aW1lKSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCX0KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKyNpZmRlZiBST0NLRVRfREVCVUdfV0FJVF9VTlRJTF9TRU5UCisJcHJpbnRrKEtFUk5fSU5GTyAidHhjbnQgPSAlZCAoamlmZj0lbHUpLi4uZG9uZVxuIiwgdHhjbnQsIGppZmZpZXMpOworI2VuZGlmCit9CisKKy8qCisgKiBycF9oYW5ndXAoKSAtLS0gY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICovCitzdGF0aWMgdm9pZCBycF9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlDSEFOTkVMX3QgKmNwOworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKHJvY2tldF9wYXJhbm9pYV9jaGVjayhpbmZvLCAicnBfaGFuZ3VwIikpCisJCXJldHVybjsKKworI2lmIChkZWZpbmVkKFJPQ0tFVF9ERUJVR19PUEVOKSB8fCBkZWZpbmVkKFJPQ0tFVF9ERUJVR19IQU5HVVApKQorCXByaW50ayhLRVJOX0lORk8gInJwX2hhbmd1cCBvZiB0dHlSJWQuLi4iLCBpbmZvLT5saW5lKTsKKyNlbmRpZgorCXJwX2ZsdXNoX2J1ZmZlcih0dHkpOworCWlmIChpbmZvLT5mbGFncyAmIFJPQ0tFVF9DTE9TSU5HKQorCQlyZXR1cm47CisJaWYgKGluZm8tPmNvdW50KSAKKwkJYXRvbWljX2RlYygmcnBfbnVtX3BvcnRzX29wZW4pOworCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKworCWluZm8tPmNvdW50ID0gMDsKKwlpbmZvLT5mbGFncyAmPSB+Uk9DS0VUX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKworCWNwID0gJmluZm8tPmNoYW5uZWw7CisJc0Rpc1J4RklGTyhjcCk7CisJc0Rpc1RyYW5zbWl0KGNwKTsKKwlzRGlzSW50ZXJydXB0cyhjcCwgKFRYSU5UX0VOIHwgTUNJTlRfRU4gfCBSWElOVF9FTiB8IFNSQ0lOVF9FTiB8IENIQU5JTlRfRU4pKTsKKwlzRGlzQ1RTRmxvd0N0bChjcCk7CisJc0Rpc1R4U29mdEZsb3dDdGwoY3ApOworCXNDbHJUeFhPRkYoY3ApOworCWluZm8tPmZsYWdzICY9IH5ST0NLRVRfSU5JVElBTElaRUQ7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKy8qCisgKiAgRXhjZXB0aW9uIGhhbmRsZXIgLSB3cml0ZSBjaGFyIHJvdXRpbmUuICBUaGUgUm9ja2V0UG9ydCBkcml2ZXIgdXNlcyBhCisgKiAgZG91YmxlLWJ1ZmZlcmluZyBzdHJhdGVneSwgd2l0aCB0aGUgdHdpc3QgdGhhdCBpZiB0aGUgaW4tbWVtb3J5IENQVQorICogIGJ1ZmZlciBpcyBlbXB0eSwgYW5kIHRoZXJlJ3Mgc3BhY2UgaW4gdGhlIHRyYW5zbWl0IEZJRk8sIHRoZQorICogIHdyaXRpbmcgcm91dGluZXMgd2lsbCB3cml0ZSBkaXJlY3RseSB0byB0cmFuc21pdCBGSUZPLgorICogIFdyaXRlIGJ1ZmZlciBhbmQgY291bnRlcnMgcHJvdGVjdGVkIGJ5IHNwaW5sb2NrcworICovCitzdGF0aWMgdm9pZCBycF9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3B1dF9jaGFyIikpCisJCXJldHVybjsKKworCS8qICBHcmFiIHRoZSBwb3J0IHdyaXRlIHNlbWFwaG9yZSwgbG9ja2luZyBvdXQgb3RoZXIgcHJvY2Vzc2VzIHRoYXQgdHJ5IHRvIHdyaXRlIHRvIHRoaXMgcG9ydCAqLworCWRvd24oJmluZm8tPndyaXRlX3NlbSk7CisKKyNpZmRlZiBST0NLRVRfREVCVUdfV1JJVEUKKwlwcmludGsoS0VSTl9JTkZPICJycF9wdXRfY2hhciAlYy4uLiIsIGNoKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKworCWlmICghdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQgJiYgaW5mby0+eG1pdF9maWZvX3Jvb20gPT0gMCkKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20gPSBUWEZJRk9fU0laRSAtIHNHZXRUeENudChjcCk7CisKKwlpZiAodHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fCBpbmZvLT54bWl0X2ZpZm9fcm9vbSA9PSAwIHx8IGluZm8tPnhtaXRfY250ICE9IDApIHsKKwkJaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7CisJCWluZm8tPnhtaXRfaGVhZCAmPSBYTUlUX0JVRl9TSVpFIC0gMTsKKwkJaW5mby0+eG1pdF9jbnQrKzsKKwkJc2V0X2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKKwl9IGVsc2UgeworCQlzT3V0QihzR2V0VHhSeERhdGFJTyhjcCksIGNoKTsKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20tLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwl1cCgmaW5mby0+d3JpdGVfc2VtKTsKK30KKworLyoKKyAqICBFeGNlcHRpb24gaGFuZGxlciAtIHdyaXRlIHJvdXRpbmUsIGNhbGxlZCB3aGVuIHVzZXIgYXBwIHdyaXRlcyB0byB0aGUgZGV2aWNlLgorICogIEEgcGVyIHBvcnQgd3JpdGUgc2VtYXBob3JlIGlzIHVzZWQgdG8gcHJvdGVjdCBmcm9tIGFub3RoZXIgcHJvY2VzcyB3cml0aW5nIHRvCisgKiAgdGhpcyBwb3J0IGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIG90aGVyIHByb2Nlc3MgY291bGQgYmUgcnVubmluZyBvbiB0aGUgb3RoZXIgQ1BVCisgKiAgb3IgZ2V0IGNvbnRyb2wgb2YgdGhlIENQVSBpZiB0aGUgY29weV9mcm9tX3VzZXIoKSBibG9ja3MgZHVlIHRvIGEgcGFnZSBmYXVsdCAoc3dhcHBlZCBvdXQpLiAKKyAqICBTcGlubG9ja3MgcHJvdGVjdCB0aGUgaW5mbyB4bWl0IG1lbWJlcnMuCisgKi8KK3N0YXRpYyBpbnQgcnBfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYjsKKwlpbnQgYywgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNvdW50IDw9IDAgfHwgcm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF93cml0ZSIpKQorCQlyZXR1cm4gMDsKKworCWRvd25faW50ZXJydXB0aWJsZSgmaW5mby0+d3JpdGVfc2VtKTsKKworI2lmZGVmIFJPQ0tFVF9ERUJVR19XUklURQorCXByaW50ayhLRVJOX0lORk8gInJwX3dyaXRlICVkIGNoYXJzLi4uIiwgY291bnQpOworI2VuZGlmCisJY3AgPSAmaW5mby0+Y2hhbm5lbDsKKworCWlmICghdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQgJiYgaW5mby0+eG1pdF9maWZvX3Jvb20gPCBjb3VudCkKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20gPSBUWEZJRk9fU0laRSAtIHNHZXRUeENudChjcCk7CisKKyAgICAgICAgLyoKKwkgKiAgSWYgdGhlIHdyaXRlIHF1ZXVlIGZvciB0aGUgcG9ydCBpcyBlbXB0eSwgYW5kIHRoZXJlIGlzIEZJRk8gc3BhY2UsIHN0dWZmIGJ5dGVzIAorCSAqICBpbnRvIEZJRk8uICBVc2UgdGhlIHdyaXRlIHF1ZXVlIGZvciB0ZW1wIHN0b3JhZ2UuCisgICAgICAgICAqLworCWlmICghdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQgJiYgaW5mby0+eG1pdF9jbnQgPT0gMCAmJiBpbmZvLT54bWl0X2ZpZm9fcm9vbSA+IDApIHsKKwkJYyA9IG1pbihjb3VudCwgaW5mby0+eG1pdF9maWZvX3Jvb20pOworCQliID0gYnVmOworCisJCS8qICBQdXNoIGRhdGEgaW50byBGSUZPLCAyIGJ5dGVzIGF0IGEgdGltZSAqLworCQlzT3V0U3RyVyhzR2V0VHhSeERhdGFJTyhjcCksICh1bnNpZ25lZCBzaG9ydCAqKSBiLCBjIC8gMik7CisKKwkJLyogIElmIHRoZXJlIGlzIGEgYnl0ZSByZW1haW5pbmcsIHdyaXRlIGl0ICovCisJCWlmIChjICYgMSkKKwkJCXNPdXRCKHNHZXRUeFJ4RGF0YUlPKGNwKSwgYltjIC0gMV0pOworCisJCXJldHZhbCArPSBjOworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+eG1pdF9maWZvX3Jvb20gLT0gYzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwl9CisKKwkvKiBJZiBjb3VudCBpcyB6ZXJvLCB3ZSB3cm90ZSBpdCBhbGwgYW5kIGFyZSBkb25lICovCisJaWYgKCFjb3VudCkKKwkJZ290byBlbmQ7CisKKwkvKiAgV3JpdGUgcmVtYWluaW5nIGRhdGEgaW50byB0aGUgcG9ydCdzIHhtaXRfYnVmICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKGluZm8tPnR0eSA9PSAwKQkvKiAgIFNlZW1pbmdseSBvYmxpZ2F0b3J5IGNoZWNrLi4uICovCisJCQlnb3RvIGVuZDsKKworCQljID0gbWluKGNvdW50LCBtaW4oWE1JVF9CVUZfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSwgWE1JVF9CVUZfU0laRSAtIGluZm8tPnhtaXRfaGVhZCkpOworCQlpZiAoYyA8PSAwKQorCQkJYnJlYWs7CisKKwkJYiA9IGJ1ZjsKKwkJbWVtY3B5KGluZm8tPnhtaXRfYnVmICsgaW5mby0+eG1pdF9oZWFkLCBiLCBjKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+eG1pdF9oZWFkID0KKwkJICAgIChpbmZvLT54bWl0X2hlYWQgKyBjKSAmIChYTUlUX0JVRl9TSVpFIC0gMSk7CisJCWluZm8tPnhtaXRfY250ICs9IGM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwkJYnVmICs9IGM7CisJCWNvdW50IC09IGM7CisJCXJldHZhbCArPSBjOworCX0KKworCWlmICgocmV0dmFsID4gMCkgJiYgIXR0eS0+c3RvcHBlZCAmJiAhdHR5LT5od19zdG9wcGVkKQorCQlzZXRfYml0KChpbmZvLT5haW9wICogOCkgKyBpbmZvLT5jaGFuLCAodm9pZCAqKSAmeG1pdF9mbGFnc1tpbmZvLT5ib2FyZF0pOworCQorZW5kOgorIAlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKKyAJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworI2lmZGVmIFJPQ0tFVFBPUlRfSEFWRV9QT0xMX1dBSVQKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnBvbGxfd2FpdCk7CisjZW5kaWYKKwl9CisJdXAoJmluZm8tPndyaXRlX3NlbSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgc2VudC4gIFdlIGVzdGltYXRlCisgKiBvbmx5IHVzaW5nIHRoZSBpbi1tZW1vcnkgdHJhbnNtaXQgYnVmZmVyIG9ubHksIGFuZCBpZ25vcmUgdGhlCisgKiBwb3RlbnRpYWwgc3BhY2UgaW4gdGhlIHRyYW5zbWl0IEZJRk8uCisgKi8KK3N0YXRpYyBpbnQgcnBfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF93cml0ZV9yb29tIikpCisJCXJldHVybiAwOworCisJcmV0ID0gWE1JVF9CVUZfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKyNpZmRlZiBST0NLRVRfREVCVUdfV1JJVEUKKwlwcmludGsoS0VSTl9JTkZPICJycF93cml0ZV9yb29tIHJldHVybnMgJWQuLi4iLCByZXQpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlci4gIEFnYWluLCB0aGlzIG9ubHkKKyAqIGNvdW50cyB0aG9zZSBjaGFyYWN0ZXJzIGluIHRoZSBpbi1tZW1vcnkgdHJhbnNtaXQgYnVmZmVyLgorICovCitzdGF0aWMgaW50IHJwX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisKKwlpZiAocm9ja2V0X3BhcmFub2lhX2NoZWNrKGluZm8sICJycF9jaGFyc19pbl9idWZmZXIiKSkKKwkJcmV0dXJuIDA7CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCisjaWZkZWYgUk9DS0VUX0RFQlVHX1dSSVRFCisJcHJpbnRrKEtFUk5fSU5GTyAicnBfY2hhcnNfaW5fYnVmZmVyIHJldHVybnMgJWQuLi4iLCBpbmZvLT54bWl0X2NudCk7CisjZW5kaWYKKwlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7Cit9CisKKy8qCisgKiAgRmx1c2hlcyB0aGUgVFggZmlmbyBmb3IgYSBwb3J0LCBkZWxldGVzIGRhdGEgaW4gdGhlIHhtaXRfYnVmIHN0b3JlZCBpbiB0aGUKKyAqICByX3BvcnQgc3RydWN0IGZvciB0aGUgcG9ydC4gIE5vdGUgdGhhdCBzcGlubG9jayBhcmUgdXNlZCB0byBwcm90ZWN0IGluZm8gbWVtYmVycywKKyAqICBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIHRoZSBzcGlubG9jayBpcyBhbHJlYWR5IGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIHJwX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCUNIQU5ORUxfdCAqY3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX2ZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKyNpZmRlZiBST0NLRVRQT1JUX0hBVkVfUE9MTF9XQUlUCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnBvbGxfd2FpdCk7CisjZW5kaWYKKwl0dHlfd2FrZXVwKHR0eSk7CisKKwljcCA9ICZpbmZvLT5jaGFubmVsOworCXNGbHVzaFR4RklGTyhjcCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCisKKy8qCisgKiAgQ2FsbGVkIHdoZW4gYSBQQ0kgY2FyZCBpcyBmb3VuZC4gIFJldHJpZXZlcyBhbmQgc3RvcmVzIG1vZGVsIGluZm9ybWF0aW9uLAorICogIGluaXQncyBhaW9waWMgYW5kIHNlcmlhbCBwb3J0IGhhcmR3YXJlLgorICogIElucHV0czogIGkgaXMgdGhlIGJvYXJkIG51bWJlciAoMC1uKQorICovCitfX2luaXQgaW50IHJlZ2lzdGVyX1BDSShpbnQgaSwgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgbnVtX2Fpb3BzLCBhaW9wLCBtYXhfbnVtX2Fpb3BzLCBudW1fY2hhbiwgY2hhbjsKKwl1bnNpZ25lZCBpbnQgYWlvcGlvW01BWF9BSU9QU19QRVJfQk9BUkRdOworCWNoYXIgKnN0ciwgKmJvYXJkX3R5cGU7CisJQ09OVFJPTExFUl90ICpjdGxwOworCisJaW50IGZhc3RfY2xvY2sgPSAwOworCWludCBhbHRDaGFuUmluZ0luZGljYXRvciA9IDA7CisJaW50IHBvcnRzX3Blcl9haW9wID0gODsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBjbGFzc19yZXY7CisJV29yZElPX3QgQ29uZmlnSU8gPSAwOworCUJ5dGVJT190IFVQQ0lSaW5nSW5kID0gMDsKKworCWlmICghZGV2IHx8IHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJcmNrdHB0X2lvX2FkZHJbaV0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlyZXQgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzc19yZXYpOworCisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9JTkZPICIgIEVycm9yIGR1cmluZyByZWdpc3Rlcl9QQ0koKSwgdW5hYmxlIHRvIHJlYWQgY29uZmlnIGR3b3JkIFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJja3RwdF90eXBlW2ldID0gUk9DS0VUX1RZUEVfTk9STUFMOworCXJvY2tldE1vZGVsW2ldLmxvYWRybTIgPSAwOworCXJvY2tldE1vZGVsW2ldLnN0YXJ0aW5nUG9ydE51bWJlciA9IG5leHRMaW5lTnVtYmVyOworCisJLyogIERlcGVuZGluZyBvbiB0aGUgbW9kZWwsIHNldCB1cCBzb21lIGNvbmZpZyB2YXJpYWJsZXMgKi8KKwlzd2l0Y2ggKGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQNFFVQUQ6CisJCXN0ciA9ICJRdWFkY2FibGUiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSA0OworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQNFFVQUQ7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgNCBwb3J0IHcvcXVhZCBjYWJsZSIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDQ7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDhPQ1RBOgorCQlzdHIgPSAiT2N0YWNhYmxlIjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlA4T0NUQTsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCA4IHBvcnQgdy9vY3RhIGNhYmxlIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDhPQ1RBOgorCQlzdHIgPSAiT2N0YWNhYmxlIjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfVVBDSV9SUDhPQ1RBOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IFVQQ0kgOCBwb3J0IHcvb2N0YSBjYWJsZSIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDg7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDhJTlRGOgorCQlzdHIgPSAiOCI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQOElOVEY7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDhJTlRGOgorCQlzdHIgPSAiOCI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1VQQ0lfUlA4SU5URjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCBVUENJIDggcG9ydCB3L2V4dGVybmFsIEkvRiIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDg7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDhKOgorCQlzdHIgPSAiOEoiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDhKOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IDggcG9ydCB3L1JKMTEgY29ubmVjdG9ycyIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDg7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDRKOgorCQlzdHIgPSAiNEoiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSA0OworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQNEo7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgNCBwb3J0IHcvUko0NSBjb25uZWN0b3JzIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gNDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQOFNOSToKKwkJc3RyID0gIjggKERCNzggQ3VzdG9tKSI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQOFNOSTsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCA4IHBvcnQgdy8gY3VzdG9tIERCNzgiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA4OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlAxNlNOSToKKwkJc3RyID0gIjE2IChEQjc4IEN1c3RvbSkiOworCQltYXhfbnVtX2Fpb3BzID0gMjsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDE2U05JOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IDE2IHBvcnQgdy8gY3VzdG9tIERCNzgiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQMTZJTlRGOgorCQlzdHIgPSAiMTYiOworCQltYXhfbnVtX2Fpb3BzID0gMjsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDE2SU5URjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gMTY7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9VUlAxNklOVEY6CisJCXN0ciA9ICIxNiI7CisJCW1heF9udW1fYWlvcHMgPSAyOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1VQQ0lfUlAxNklOVEY7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgVVBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GIik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gMTY7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9DUlAxNklOVEY6CisJCXN0ciA9ICIxNiI7CisJCW1heF9udW1fYWlvcHMgPSAyOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX0NQQ0lfUlAxNklOVEY7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgQ29tcGFjdCBQQ0kgMTYgcG9ydCB3L2V4dGVybmFsIEkvRiIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDE2OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlAzMklOVEY6CisJCXN0ciA9ICIzMiI7CisJCW1heF9udW1fYWlvcHMgPSA0OworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQMzJJTlRGOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IDMyIHBvcnQgdy9leHRlcm5hbCBJL0YiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDMySU5URjoKKwkJc3RyID0gIjMyIjsKKwkJbWF4X251bV9haW9wcyA9IDQ7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfVVBDSV9SUDMySU5URjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCBVUENJIDMyIHBvcnQgdy9leHRlcm5hbCBJL0YiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQUDQ6CisJCXN0ciA9ICJQbHVzIFF1YWRjYWJsZSI7CisJCW1heF9udW1fYWlvcHMgPSAxOworCQlwb3J0c19wZXJfYWlvcCA9IDQ7CisJCWFsdENoYW5SaW5nSW5kaWNhdG9yKys7CisJCWZhc3RfY2xvY2srKzsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUFA0OworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IFBsdXMgNCBwb3J0Iik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gNDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQUDg6CisJCXN0ciA9ICJQbHVzIE9jdGFjYWJsZSI7CisJCW1heF9udW1fYWlvcHMgPSAyOworCQlwb3J0c19wZXJfYWlvcCA9IDQ7CisJCWFsdENoYW5SaW5nSW5kaWNhdG9yKys7CisJCWZhc3RfY2xvY2srKzsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUFA4OworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IFBsdXMgOCBwb3J0Iik7CisJCXJvY2tldE1vZGVsW2ldLm51bVBvcnRzID0gODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JQMl8yMzI6CisJCXN0ciA9ICJQbHVzIDIgKFJTLTIzMikiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSAyOworCQlhbHRDaGFuUmluZ0luZGljYXRvcisrOworCQlmYXN0X2Nsb2NrKys7CisJCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfUlAyXzIzMjsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0UG9ydCBQbHVzIDIgcG9ydCBSUzIzMiIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDI7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9SUDJfNDIyOgorCQlzdHIgPSAiUGx1cyAyIChSUy00MjIpIjsKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXBvcnRzX3Blcl9haW9wID0gMjsKKwkJYWx0Q2hhblJpbmdJbmRpY2F0b3IrKzsKKwkJZmFzdF9jbG9jaysrOworCQlyb2NrZXRNb2RlbFtpXS5tb2RlbCA9IE1PREVMX1JQMl80MjI7CisJCXN0cmNweShyb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywgIlJvY2tldFBvcnQgUGx1cyAyIHBvcnQgUlM0MjIiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSAyOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlA2TToKKworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcG9ydHNfcGVyX2Fpb3AgPSA2OworCQlzdHIgPSAiNi1wb3J0IjsKKworCQkvKiAgSWYgY2xhc3NfcmV2IGlzIDEsIHRoZSByb2NrZXRtb2RlbSBmbGFzaCBtdXN0IGJlIGxvYWRlZC4gIElmIGl0IGlzIDIgaXQgaXMgYSAic29ja2V0ZWQiIHZlcnNpb24uICovCisJCWlmICgoY2xhc3NfcmV2ICYgMHhGRikgPT0gMSkgeworCQkJcmNrdHB0X3R5cGVbaV0gPSBST0NLRVRfVFlQRV9NT0RFTUlJOworCQkJcm9ja2V0TW9kZWxbaV0ubG9hZHJtMiA9IDE7CisJCX0gZWxzZSB7CisJCQlyY2t0cHRfdHlwZVtpXSA9IFJPQ0tFVF9UWVBFX01PREVNOworCQl9CisKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDZNOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRNb2RlbSA2IHBvcnQiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA2OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUlA0TToKKwkJbWF4X251bV9haW9wcyA9IDE7CisJCXBvcnRzX3Blcl9haW9wID0gNDsKKwkJc3RyID0gIjQtcG9ydCI7CisJCWlmICgoY2xhc3NfcmV2ICYgMHhGRikgPT0gMSkgeworCQkJcmNrdHB0X3R5cGVbaV0gPSBST0NLRVRfVFlQRV9NT0RFTUlJOworCQkJcm9ja2V0TW9kZWxbaV0ubG9hZHJtMiA9IDE7CisJCX0gZWxzZSB7CisJCQlyY2t0cHRfdHlwZVtpXSA9IFJPQ0tFVF9UWVBFX01PREVNOworCQl9CisKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9SUDRNOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRNb2RlbSA0IHBvcnQiKTsKKwkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdHIgPSAiKHVua25vd24vdW5zdXBwb3J0ZWQpIjsKKwkJbWF4X251bV9haW9wcyA9IDA7CisJCWJyZWFrOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIFVQQ0kgYm9hcmRzLgorCSAqLworCisJc3dpdGNoIChkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9VUlAzMklOVEY6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1VSUDhJTlRGOgorCWNhc2UgUENJX0RFVklDRV9JRF9VUlAxNklOVEY6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0NSUDE2SU5URjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfVVJQOE9DVEE6CisJCXJja3RwdF9pb19hZGRyW2ldID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMik7CisJCUNvbmZpZ0lPID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJCWlmIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1VSUDhPQ1RBKSB7CisJCQlVUENJUmluZ0luZCA9IHJja3RwdF9pb19hZGRyW2ldICsgX1BDSV85MDMwX1JJTkdfSU5EOworCisJCQkvKgorCQkJICogQ2hlY2sgZm9yIG9jdGEgb3IgcXVhZCBjYWJsZS4KKwkJCSAqLworCQkJaWYgKCEKKwkJCSAgICAoc0luVyhDb25maWdJTyArIF9QQ0lfOTAzMF9HUElPX0NUUkwpICYKKwkJCSAgICAgUENJX0dQSU9fQ1RSTF84UE9SVCkpIHsKKwkJCQlzdHIgPSAiUXVhZGNhYmxlIjsKKwkJCQlwb3J0c19wZXJfYWlvcCA9IDQ7CisJCQkJcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgPSA0OworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9VUENJX1JNM184UE9SVDoKKwkJc3RyID0gIjggcG9ydHMiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9VUENJX1JNM184UE9SVDsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0TW9kZW0gSUlJIDggcG9ydCIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDg7CisJCXJja3RwdF9pb19hZGRyW2ldID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMik7CisJCVVQQ0lSaW5nSW5kID0gcmNrdHB0X2lvX2FkZHJbaV0gKyBfUENJXzkwMzBfUklOR19JTkQ7CisJCUNvbmZpZ0lPID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJCXJja3RwdF90eXBlW2ldID0gUk9DS0VUX1RZUEVfTU9ERU1JSUk7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9VUENJX1JNM180UE9SVDoKKwkJc3RyID0gIjQgcG9ydHMiOworCQltYXhfbnVtX2Fpb3BzID0gMTsKKwkJcm9ja2V0TW9kZWxbaV0ubW9kZWwgPSBNT0RFTF9VUENJX1JNM180UE9SVDsKKwkJc3RyY3B5KHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nLCAiUm9ja2V0TW9kZW0gSUlJIDQgcG9ydCIpOworCQlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IDQ7CisJCXJja3RwdF9pb19hZGRyW2ldID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMik7CisJCVVQQ0lSaW5nSW5kID0gcmNrdHB0X2lvX2FkZHJbaV0gKyBfUENJXzkwMzBfUklOR19JTkQ7CisJCUNvbmZpZ0lPID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJCXJja3RwdF90eXBlW2ldID0gUk9DS0VUX1RZUEVfTU9ERU1JSUk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAocmNrdHB0X3R5cGVbaV0pIHsKKwljYXNlIFJPQ0tFVF9UWVBFX01PREVNOgorCQlib2FyZF90eXBlID0gIlJvY2tldE1vZGVtIjsKKwkJYnJlYWs7CisJY2FzZSBST0NLRVRfVFlQRV9NT0RFTUlJOgorCQlib2FyZF90eXBlID0gIlJvY2tldE1vZGVtIElJIjsKKwkJYnJlYWs7CisJY2FzZSBST0NLRVRfVFlQRV9NT0RFTUlJSToKKwkJYm9hcmRfdHlwZSA9ICJSb2NrZXRNb2RlbSBJSUkiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlib2FyZF90eXBlID0gIlJvY2tldFBvcnQiOworCQlicmVhazsKKwl9CisKKwlpZiAoZmFzdF9jbG9jaykgeworCQlzQ2xvY2tQcmVzY2FsZSA9IDB4MTI7CS8qIG1vZCAyIChkaXZpZGUgYnkgMykgKi8KKwkJcnBfYmF1ZF9iYXNlW2ldID0gOTIxNjAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIHN1cHBvcnRfbG93X3NwZWVkIGlzIHNldCwgdXNlIHRoZSBzbG93IGNsb2NrCisJCSAqIHByZXNjYWxlLCB3aGljaCBzdXBwb3J0cyA1MCBicHMKKwkJICovCisJCWlmIChzdXBwb3J0X2xvd19zcGVlZCkgeworCQkJLyogbW9kIDkgKGRpdmlkZSBieSAxMCkgcHJlc2NhbGUgKi8KKwkJCXNDbG9ja1ByZXNjYWxlID0gMHgxOTsKKwkJCXJwX2JhdWRfYmFzZVtpXSA9IDIzMDQwMDsKKwkJfSBlbHNlIHsKKwkJCS8qIG1vZCA0IChkZXZpZGUgYnkgNSkgcHJlc2NhbGUgKi8KKwkJCXNDbG9ja1ByZXNjYWxlID0gMHgxNDsKKwkJCXJwX2JhdWRfYmFzZVtpXSA9IDQ2MDgwMDsKKwkJfQorCX0KKworCWZvciAoYWlvcCA9IDA7IGFpb3AgPCBtYXhfbnVtX2Fpb3BzOyBhaW9wKyspCisJCWFpb3Bpb1thaW9wXSA9IHJja3RwdF9pb19hZGRyW2ldICsgKGFpb3AgKiAweDQwKTsKKwljdGxwID0gc0N0bE51bVRvQ3RsUHRyKGkpOworCW51bV9haW9wcyA9IHNQQ0lJbml0Q29udHJvbGxlcihjdGxwLCBpLCBhaW9waW8sIG1heF9udW1fYWlvcHMsIENvbmZpZ0lPLCAwLCBGUkVRX0RJUywgMCwgYWx0Q2hhblJpbmdJbmRpY2F0b3IsIFVQQ0lSaW5nSW5kKTsKKwlmb3IgKGFpb3AgPSAwOyBhaW9wIDwgbWF4X251bV9haW9wczsgYWlvcCsrKQorCQljdGxwLT5BaW9wTnVtQ2hhblthaW9wXSA9IHBvcnRzX3Blcl9haW9wOworCisJcHJpbnRrKCJDb210cm9sIFBDSSBjb250cm9sbGVyICMlZCBJRCAweCV4IGZvdW5kIGluIGJ1czpzbG90OmZuICVzIGF0IGFkZHJlc3MgJTA0bHgsICIKKwkgICAgICIlZCBBSU9QKHMpICglcylcbiIsIGksIGRldi0+ZGV2aWNlLCBwY2lfbmFtZShkZXYpLAorCSAgICAgcmNrdHB0X2lvX2FkZHJbaV0sIG51bV9haW9wcywgcm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcpOworCXByaW50ayhLRVJOX0lORk8gIkluc3RhbGxpbmcgJXMsIGNyZWF0aW5nIC9kZXYvdHR5UiVkIC0gJWxkXG4iLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywKKwkgICAgICAgcm9ja2V0TW9kZWxbaV0uc3RhcnRpbmdQb3J0TnVtYmVyLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5zdGFydGluZ1BvcnROdW1iZXIgKworCSAgICAgICByb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyAtIDEpOworCisJaWYgKG51bV9haW9wcyA8PSAwKSB7CisJCXJja3RwdF9pb19hZGRyW2ldID0gMDsKKwkJcmV0dXJuICgwKTsKKwl9CisJaXNfUENJW2ldID0gMTsKKworCS8qICBSZXNldCB0aGUgQUlPUElDLCBpbml0IHRoZSBzZXJpYWwgcG9ydHMgKi8KKwlmb3IgKGFpb3AgPSAwOyBhaW9wIDwgbnVtX2Fpb3BzOyBhaW9wKyspIHsKKwkJc1Jlc2V0QWlvcEJ5TnVtKGN0bHAsIGFpb3ApOworCQludW1fY2hhbiA9IHBvcnRzX3Blcl9haW9wOworCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbnVtX2NoYW47IGNoYW4rKykKKwkJCWluaXRfcl9wb3J0KGksIGFpb3AsIGNoYW4sIGRldik7CisJfQorCisJLyogIFJvY2tldCBtb2RlbXMgbXVzdCBiZSByZXNldCAqLworCWlmICgocmNrdHB0X3R5cGVbaV0gPT0gUk9DS0VUX1RZUEVfTU9ERU0pIHx8CisJICAgIChyY2t0cHRfdHlwZVtpXSA9PSBST0NLRVRfVFlQRV9NT0RFTUlJKSB8fAorCSAgICAocmNrdHB0X3R5cGVbaV0gPT0gUk9DS0VUX1RZUEVfTU9ERU1JSUkpKSB7CisJCW51bV9jaGFuID0gcG9ydHNfcGVyX2Fpb3A7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBudW1fY2hhbjsgY2hhbisrKQorCQkJc1BDSU1vZGVtUmVzZXQoY3RscCwgY2hhbiwgMSk7CisJCW1kZWxheSg1MDApOworCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbnVtX2NoYW47IGNoYW4rKykKKwkJCXNQQ0lNb2RlbVJlc2V0KGN0bHAsIGNoYW4sIDApOworCQltZGVsYXkoNTAwKTsKKwkJcm1TcGVha2VyUmVzZXQoY3RscCwgcm9ja2V0TW9kZWxbaV0ubW9kZWwpOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogIFByb2JlcyBmb3IgUENJIGNhcmRzLCBpbml0cyB0aGVtIGlmIGZvdW5kCisgKiAgSW5wdXQ6ICAgYm9hcmRfZm91bmQgPSBudW1iZXIgb2YgSVNBIGJvYXJkcyBhbHJlYWR5IGZvdW5kLCBvciB0aGUKKyAqICAgICAgICAgICBzdGFydGluZyBib2FyZCBudW1iZXIKKyAqICBSZXR1cm5zOiBOdW1iZXIgb2YgUENJIGJvYXJkcyBmb3VuZAorICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X1BDSShpbnQgYm9hcmRzX2ZvdW5kKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCWludCBjb3VudCA9IDA7CisKKwkvKiAgV29yayB0aHJvdWdoIHRoZSBQQ0kgZGV2aWNlIGxpc3QsIHB1bGxpbmcgb3V0IG91cnMgKi8KKwl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1JQLCBQQ0lfQU5ZX0lELCBkZXYpKSkgeworCQlpZiAocmVnaXN0ZXJfUENJKGNvdW50ICsgYm9hcmRzX2ZvdW5kLCBkZXYpKQorCQkJY291bnQrKzsKKwl9CisJcmV0dXJuIChjb3VudCk7Cit9CisKKyNlbmRpZgkJCQkvKiBDT05GSUdfUENJICovCisKKy8qCisgKiAgUHJvYmVzIGZvciBJU0EgY2FyZHMKKyAqICBJbnB1dDogICBpID0gdGhlIGJvYXJkIG51bWJlciB0byBsb29rIGZvcgorICogIFJldHVybnM6IDEgaWYgYm9hcmQgZm91bmQsIDAgZWxzZQorICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X0lTQShpbnQgaSkKK3sKKwlpbnQgbnVtX2Fpb3BzLCBudW1fY2hhbiA9IDAsIHRvdGFsX251bV9jaGFuID0gMDsKKwlpbnQgYWlvcCwgY2hhbjsKKwl1bnNpZ25lZCBpbnQgYWlvcGlvW01BWF9BSU9QU19QRVJfQk9BUkRdOworCUNPTlRST0xMRVJfdCAqY3RscDsKKwljaGFyICp0eXBlX3N0cmluZzsKKworCS8qICBJZiBpb19hZGRyIGlzIHplcm8sIG5vIGJvYXJkIGNvbmZpZ3VyZWQgKi8KKwlpZiAocmNrdHB0X2lvX2FkZHJbaV0gPT0gMCkKKwkJcmV0dXJuICgwKTsKKworCS8qICBSZXNlcnZlIHRoZSBJTyByZWdpb24gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHJja3RwdF9pb19hZGRyW2ldLCA2NCwgIkNvbXRyb2wgUm9ja2V0UG9ydCIpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlVuYWJsZSB0byByZXNlcnZlIElPIHJlZ2lvbiBmb3IgY29uZmlndXJlZCBJU0EgUm9ja2V0UG9ydCBhdCBhZGRyZXNzIDB4JWx4LCBib2FyZCBub3QgaW5zdGFsbGVkLi4uXG4iLCByY2t0cHRfaW9fYWRkcltpXSk7CisJCXJja3RwdF9pb19hZGRyW2ldID0gMDsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwljdGxwID0gc0N0bE51bVRvQ3RsUHRyKGkpOworCisJY3RscC0+Ym9hcmRUeXBlID0gcmNrdHB0X3R5cGVbaV07CisKKwlzd2l0Y2ggKHJja3RwdF90eXBlW2ldKSB7CisJY2FzZSBST0NLRVRfVFlQRV9QQzEwNDoKKwkJdHlwZV9zdHJpbmcgPSAiKFBDMTA0KSI7CisJCWJyZWFrOworCWNhc2UgUk9DS0VUX1RZUEVfTU9ERU06CisJCXR5cGVfc3RyaW5nID0gIihSb2NrZXRNb2RlbSkiOworCQlicmVhazsKKwljYXNlIFJPQ0tFVF9UWVBFX01PREVNSUk6CisJCXR5cGVfc3RyaW5nID0gIihSb2NrZXRNb2RlbSBJSSkiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0eXBlX3N0cmluZyA9ICIiOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIElmIHN1cHBvcnRfbG93X3NwZWVkIGlzIHNldCwgdXNlIHRoZSBzbG93IGNsb2NrIHByZXNjYWxlLAorCSAqIHdoaWNoIHN1cHBvcnRzIDUwIGJwcworCSAqLworCWlmIChzdXBwb3J0X2xvd19zcGVlZCkgeworCQlzQ2xvY2tQcmVzY2FsZSA9IDB4MTk7CS8qIG1vZCA5IChkaXZpZGUgYnkgMTApIHByZXNjYWxlICovCisJCXJwX2JhdWRfYmFzZVtpXSA9IDIzMDQwMDsKKwl9IGVsc2UgeworCQlzQ2xvY2tQcmVzY2FsZSA9IDB4MTQ7CS8qIG1vZCA0IChkZXZpZGUgYnkgNSkgcHJlc2NhbGUgKi8KKwkJcnBfYmF1ZF9iYXNlW2ldID0gNDYwODAwOworCX0KKworCWZvciAoYWlvcCA9IDA7IGFpb3AgPCBNQVhfQUlPUFNfUEVSX0JPQVJEOyBhaW9wKyspCisJCWFpb3Bpb1thaW9wXSA9IHJja3RwdF9pb19hZGRyW2ldICsgKGFpb3AgKiAweDQwMCk7CisKKwludW1fYWlvcHMgPSBzSW5pdENvbnRyb2xsZXIoY3RscCwgaSwgY29udHJvbGxlciArIChpICogMHg0MDApLCBhaW9waW8sICBNQVhfQUlPUFNfUEVSX0JPQVJELCAwLCBGUkVRX0RJUywgMCk7CisKKwlpZiAoY3RscC0+Ym9hcmRUeXBlID09IFJPQ0tFVF9UWVBFX1BDMTA0KSB7CisJCXNFbkFpb3AoY3RscCwgMik7CS8qIG9ubHkgb25lIEFJT1BJQywgYnV0IHRoZXNlICovCisJCXNFbkFpb3AoY3RscCwgMyk7CS8qIENTZWxzIHVzZWQgZm9yIG90aGVyIHN0dWZmICovCisJfQorCisJLyogIElmIHNvbWV0aGluZyB3ZW50IHdyb25nIGluaXRpbmcgdGhlIEFJT1AncyByZWxlYXNlIHRoZSBJU0EgSU8gbWVtb3J5ICovCisJaWYgKG51bV9haW9wcyA8PSAwKSB7CisJCXJlbGVhc2VfcmVnaW9uKHJja3RwdF9pb19hZGRyW2ldLCA2NCk7CisJCXJja3RwdF9pb19hZGRyW2ldID0gMDsKKwkJcmV0dXJuICgwKTsKKwl9CisgIAorCXJvY2tldE1vZGVsW2ldLnN0YXJ0aW5nUG9ydE51bWJlciA9IG5leHRMaW5lTnVtYmVyOworCisJZm9yIChhaW9wID0gMDsgYWlvcCA8IG51bV9haW9wczsgYWlvcCsrKSB7CisJCXNSZXNldEFpb3BCeU51bShjdGxwLCBhaW9wKTsKKwkJc0VuQWlvcChjdGxwLCBhaW9wKTsKKwkJbnVtX2NoYW4gPSBzR2V0QWlvcE51bUNoYW4oY3RscCwgYWlvcCk7CisJCXRvdGFsX251bV9jaGFuICs9IG51bV9jaGFuOworCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbnVtX2NoYW47IGNoYW4rKykKKwkJCWluaXRfcl9wb3J0KGksIGFpb3AsIGNoYW4sIE5VTEwpOworCX0KKwlpc19QQ0lbaV0gPSAwOworCWlmICgocmNrdHB0X3R5cGVbaV0gPT0gUk9DS0VUX1RZUEVfTU9ERU0pIHx8IChyY2t0cHRfdHlwZVtpXSA9PSBST0NLRVRfVFlQRV9NT0RFTUlJKSkgeworCQludW1fY2hhbiA9IHNHZXRBaW9wTnVtQ2hhbihjdGxwLCAwKTsKKwkJdG90YWxfbnVtX2NoYW4gPSBudW1fY2hhbjsKKwkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG51bV9jaGFuOyBjaGFuKyspCisJCQlzTW9kZW1SZXNldChjdGxwLCBjaGFuLCAxKTsKKwkJbWRlbGF5KDUwMCk7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBudW1fY2hhbjsgY2hhbisrKQorCQkJc01vZGVtUmVzZXQoY3RscCwgY2hhbiwgMCk7CisJCW1kZWxheSg1MDApOworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRNb2RlbSBJU0EiKTsKKwl9IGVsc2UgeworCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IElTQSIpOworCX0KKwlyb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyA9IHRvdGFsX251bV9jaGFuOworCXJvY2tldE1vZGVsW2ldLm1vZGVsID0gTU9ERUxfSVNBOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUm9ja2V0UG9ydCBJU0EgY2FyZCAjJWQgZm91bmQgYXQgMHglbHggLSAlZCBBSU9QcyAlc1xuIiwgCisJICAgICAgIGksIHJja3RwdF9pb19hZGRyW2ldLCBudW1fYWlvcHMsIHR5cGVfc3RyaW5nKTsKKworCXByaW50ayhLRVJOX0lORk8gIkluc3RhbGxpbmcgJXMsIGNyZWF0aW5nIC9kZXYvdHR5UiVkIC0gJWxkXG4iLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5tb2RlbFN0cmluZywKKwkgICAgICAgcm9ja2V0TW9kZWxbaV0uc3RhcnRpbmdQb3J0TnVtYmVyLAorCSAgICAgICByb2NrZXRNb2RlbFtpXS5zdGFydGluZ1BvcnROdW1iZXIgKworCSAgICAgICByb2NrZXRNb2RlbFtpXS5udW1Qb3J0cyAtIDEpOworCisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyByb2NrZXRfb3BzID0geworCS5vcGVuID0gcnBfb3BlbiwKKwkuY2xvc2UgPSBycF9jbG9zZSwKKwkud3JpdGUgPSBycF93cml0ZSwKKwkucHV0X2NoYXIgPSBycF9wdXRfY2hhciwKKwkud3JpdGVfcm9vbSA9IHJwX3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IHJwX2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyID0gcnBfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCA9IHJwX2lvY3RsLAorCS50aHJvdHRsZSA9IHJwX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gcnBfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MgPSBycF9zZXRfdGVybWlvcywKKwkuc3RvcCA9IHJwX3N0b3AsCisJLnN0YXJ0ID0gcnBfc3RhcnQsCisJLmhhbmd1cCA9IHJwX2hhbmd1cCwKKwkuYnJlYWtfY3RsID0gcnBfYnJlYWssCisJLnNlbmRfeGNoYXIgPSBycF9zZW5kX3hjaGFyLAorCS53YWl0X3VudGlsX3NlbnQgPSBycF93YWl0X3VudGlsX3NlbnQsCisJLnRpb2NtZ2V0ID0gcnBfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gcnBfdGlvY21zZXQsCit9OworCisvKgorICogVGhlIG1vZHVsZSAic3RhcnR1cCIgcm91dGluZTsgaXQncyBydW4gd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZC4KKyAqLworaW50IF9faW5pdCBycF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCwgcGNpX2JvYXJkc19mb3VuZCwgaXNhX2JvYXJkc19mb3VuZCwgaTsKKworCXByaW50ayhLRVJOX0lORk8gIlJvY2tldFBvcnQgZGV2aWNlIGRyaXZlciBtb2R1bGUsIHZlcnNpb24gJXMsICVzXG4iLAorCSAgICAgICBST0NLRVRfVkVSU0lPTiwgUk9DS0VUX0RBVEUpOworCisJcm9ja2V0X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX1JQX1BPUlRTKTsKKwlpZiAoIXJvY2tldF9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIHRpbWVyIGNoYW5uZWwuCisJICovCisJaW5pdF90aW1lcigmcm9ja2V0X3RpbWVyKTsKKwlyb2NrZXRfdGltZXIuZnVuY3Rpb24gPSBycF9kb19wb2xsOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBhcnJheSBvZiBwb2ludGVycyB0byBvdXIgb3duIGludGVybmFsIHN0YXRlCisJICogc3RydWN0dXJlcy4KKwkgKi8KKwltZW1zZXQocnBfdGFibGUsIDAsIHNpemVvZiAocnBfdGFibGUpKTsKKwltZW1zZXQoeG1pdF9mbGFncywgMCwgc2l6ZW9mICh4bWl0X2ZsYWdzKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JQX1BPUlRTOyBpKyspCisJCWxpbmVOdW1iZXJzW2ldID0gMDsKKwluZXh0TGluZU51bWJlciA9IDA7CisJbWVtc2V0KHJvY2tldE1vZGVsLCAwLCBzaXplb2YgKHJvY2tldE1vZGVsKSk7CisKKwkvKgorCSAqICBJZiBib2FyZCAxIGlzIG5vbi16ZXJvLCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgSVNBIGNvbmZpZ3VyZWQuICBJZiBjb250cm9sbGVyIGlzIAorCSAqICB6ZXJvLCB1c2UgdGhlIGRlZmF1bHQgY29udHJvbGxlciBJTyBhZGRyZXNzIG9mIGJvYXJkMSArIDB4NDAuCisJICovCisJaWYgKGJvYXJkMSkgeworCQlpZiAoY29udHJvbGxlciA9PSAwKQorCQkJY29udHJvbGxlciA9IGJvYXJkMSArIDB4NDA7CisJfSBlbHNlIHsKKwkJY29udHJvbGxlciA9IDA7ICAvKiAgVXNlZCBhcyBhIGZsYWcsIG1lYW5pbmcgbm8gSVNBIGJvYXJkcyAqLworCX0KKworCS8qICBJZiBhbiBJU0EgY2FyZCBpcyBjb25maWd1cmVkLCByZXNlcnZlIHRoZSA0IGJ5dGUgSU8gc3BhY2UgZm9yIHRoZSBNdWRiYWMgY29udHJvbGxlciAqLworCWlmIChjb250cm9sbGVyICYmICghcmVxdWVzdF9yZWdpb24oY29udHJvbGxlciwgNCwgIkNvbXRyb2wgUm9ja2V0UG9ydCIpKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJVbmFibGUgdG8gcmVzZXJ2ZSBJTyByZWdpb24gZm9yIGZpcnN0IGNvbmZpZ3VyZWQgSVNBIFJvY2tldFBvcnQgY29udHJvbGxlciAweCVseC4gIERyaXZlciBleGl0aW5nIFxuIiwgY29udHJvbGxlcik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogIFN0b3JlIElTQSB2YXJpYWJsZSByZXRyaWV2ZWQgZnJvbSBjb21tYW5kIGxpbmUgb3IgLmNvbmYgZmlsZS4gKi8KKwlyY2t0cHRfaW9fYWRkclswXSA9IGJvYXJkMTsKKwlyY2t0cHRfaW9fYWRkclsxXSA9IGJvYXJkMjsKKwlyY2t0cHRfaW9fYWRkclsyXSA9IGJvYXJkMzsKKwlyY2t0cHRfaW9fYWRkclszXSA9IGJvYXJkNDsKKworCXJja3RwdF90eXBlWzBdID0gbW9kZW0xID8gUk9DS0VUX1RZUEVfTU9ERU0gOiBST0NLRVRfVFlQRV9OT1JNQUw7CisJcmNrdHB0X3R5cGVbMF0gPSBwYzEwNF8xWzBdID8gUk9DS0VUX1RZUEVfUEMxMDQgOiByY2t0cHRfdHlwZVswXTsKKwlyY2t0cHRfdHlwZVsxXSA9IG1vZGVtMiA/IFJPQ0tFVF9UWVBFX01PREVNIDogUk9DS0VUX1RZUEVfTk9STUFMOworCXJja3RwdF90eXBlWzFdID0gcGMxMDRfMlswXSA/IFJPQ0tFVF9UWVBFX1BDMTA0IDogcmNrdHB0X3R5cGVbMV07CisJcmNrdHB0X3R5cGVbMl0gPSBtb2RlbTMgPyBST0NLRVRfVFlQRV9NT0RFTSA6IFJPQ0tFVF9UWVBFX05PUk1BTDsKKwlyY2t0cHRfdHlwZVsyXSA9IHBjMTA0XzNbMF0gPyBST0NLRVRfVFlQRV9QQzEwNCA6IHJja3RwdF90eXBlWzJdOworCXJja3RwdF90eXBlWzNdID0gbW9kZW00ID8gUk9DS0VUX1RZUEVfTU9ERU0gOiBST0NLRVRfVFlQRV9OT1JNQUw7CisJcmNrdHB0X3R5cGVbM10gPSBwYzEwNF80WzBdID8gUk9DS0VUX1RZUEVfUEMxMDQgOiByY2t0cHRfdHlwZVszXTsKKworCS8qCisJICogU2V0IHVwIHRoZSB0dHkgZHJpdmVyIHN0cnVjdHVyZSBhbmQgdGhlbiByZWdpc3RlciB0aGlzCisJICogZHJpdmVyIHdpdGggdGhlIHR0eSBsYXllci4KKwkgKi8KKworCXJvY2tldF9kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJcm9ja2V0X2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX05PX0RFVkZTOworCXJvY2tldF9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzL1IiOworCXJvY2tldF9kcml2ZXItPm5hbWUgPSAidHR5UiI7CisJcm9ja2V0X2RyaXZlci0+ZHJpdmVyX25hbWUgPSAiQ29tdHJvbCBSb2NrZXRQb3J0IjsKKwlyb2NrZXRfZHJpdmVyLT5tYWpvciA9IFRUWV9ST0NLRVRfTUFKT1I7CisJcm9ja2V0X2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCXJvY2tldF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCXJvY2tldF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJcm9ja2V0X2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXJvY2tldF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkgICAgQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworI2lmZGVmIFJPQ0tFVF9TT0ZUX0ZMT1cKKwlyb2NrZXRfZHJpdmVyLT5mbGFncyB8PSBUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9OT19ERVZGUzsKKyNlbmRpZgorCXR0eV9zZXRfb3BlcmF0aW9ucyhyb2NrZXRfZHJpdmVyLCAmcm9ja2V0X29wcyk7CisKKwlyZXR2YWwgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHJvY2tldF9kcml2ZXIpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkNvdWxkbid0IGluc3RhbGwgdHR5IFJvY2tldFBvcnQgZHJpdmVyIChlcnJvciAlZClcbiIsIC1yZXR2YWwpOworCQlwdXRfdHR5X2RyaXZlcihyb2NrZXRfZHJpdmVyKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCisJcHJpbnRrKEtFUk5fSU5GTyAiUm9ja2V0UG9ydCBkcml2ZXIgaXMgbWFqb3IgJWRcbiIsIHJvY2tldF9kcml2ZXIubWFqb3IpOworI2VuZGlmCisKKwkvKgorCSAqICBPSywgbGV0J3MgcHJvYmUgZWFjaCBvZiB0aGUgY29udHJvbGxlcnMgbG9va2luZyBmb3IgYm9hcmRzLiAgQW55IGJvYXJkcyBmb3VuZAorICAgICAgICAgKiAgd2lsbCBiZSBpbml0aWFsaXplZCBoZXJlLgorCSAqLworCWlzYV9ib2FyZHNfZm91bmQgPSAwOworCXBjaV9ib2FyZHNfZm91bmQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9CT0FSRFM7IGkrKykgeworCQlpZiAoaW5pdF9JU0EoaSkpCisJCQlpc2FfYm9hcmRzX2ZvdW5kKys7CisJfQorCisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChpc2FfYm9hcmRzX2ZvdW5kIDwgTlVNX0JPQVJEUykKKwkJcGNpX2JvYXJkc19mb3VuZCA9IGluaXRfUENJKGlzYV9ib2FyZHNfZm91bmQpOworI2VuZGlmCisKKwltYXhfYm9hcmQgPSBwY2lfYm9hcmRzX2ZvdW5kICsgaXNhX2JvYXJkc19mb3VuZDsKKworCWlmIChtYXhfYm9hcmQgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJObyByb2NrZXRwb3J0IHBvcnRzIGZvdW5kOyB1bmxvYWRpbmcgZHJpdmVyLlxuIik7CisJCWRlbF90aW1lcl9zeW5jKCZyb2NrZXRfdGltZXIpOworCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocm9ja2V0X2RyaXZlcik7CisJCXB1dF90dHlfZHJpdmVyKHJvY2tldF9kcml2ZXIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyB2b2lkIHJwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKwlpbnQgaTsKKworCWRlbF90aW1lcl9zeW5jKCZyb2NrZXRfdGltZXIpOworCisJcmV0dmFsID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJvY2tldF9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCXByaW50ayhLRVJOX0lORk8gIkVycm9yICVkIHdoaWxlIHRyeWluZyB0byB1bnJlZ2lzdGVyICIKKwkJICAgICAgICJyb2NrZXRwb3J0IGRyaXZlclxuIiwgLXJldHZhbCk7CisJcHV0X3R0eV9kcml2ZXIocm9ja2V0X2RyaXZlcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JQX1BPUlRTOyBpKyspIHsKKwkJaWYgKHJwX3RhYmxlW2ldKQorCQkJa2ZyZWUocnBfdGFibGVbaV0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQk9BUkRTOyBpKyspIHsKKwkJaWYgKHJja3RwdF9pb19hZGRyW2ldIDw9IDAgfHwgaXNfUENJW2ldKQorCQkJY29udGludWU7CisJCXJlbGVhc2VfcmVnaW9uKHJja3RwdF9pb19hZGRyW2ldLCA2NCk7CisJfQorCWlmIChjb250cm9sbGVyKQorCQlyZWxlYXNlX3JlZ2lvbihjb250cm9sbGVyLCA0KTsKK30KKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworc3RhdGljIEJ5dGVfdCBSRGF0YVtSREFUQVNJWkVdID0geworCTB4MDAsIDB4MDksIDB4ZjYsIDB4ODIsCisJMHgwMiwgMHgwOSwgMHg4NiwgMHhmYiwKKwkweDA0LCAweDA5LCAweDAwLCAweDBhLAorCTB4MDYsIDB4MDksIDB4MDEsIDB4MGEsCisJMHgwOCwgMHgwOSwgMHg4YSwgMHgxMywKKwkweDBhLCAweDA5LCAweGM1LCAweDExLAorCTB4MGMsIDB4MDksIDB4ODYsIDB4ODUsCisJMHgwZSwgMHgwOSwgMHgyMCwgMHgwYSwKKwkweDEwLCAweDA5LCAweDIxLCAweDBhLAorCTB4MTIsIDB4MDksIDB4NDEsIDB4ZmYsCisJMHgxNCwgMHgwOSwgMHg4MiwgMHgwMCwKKwkweDE2LCAweDA5LCAweDgyLCAweDdiLAorCTB4MTgsIDB4MDksIDB4OGEsIDB4N2QsCisJMHgxYSwgMHgwOSwgMHg4OCwgMHg4MSwKKwkweDFjLCAweDA5LCAweDg2LCAweDdhLAorCTB4MWUsIDB4MDksIDB4ODQsIDB4ODEsCisJMHgyMCwgMHgwOSwgMHg4MiwgMHg3YywKKwkweDIyLCAweDA5LCAweDBhLCAweDBhCit9OworCitzdGF0aWMgQnl0ZV90IFJSZWdEYXRhW1JSRUdEQVRBU0laRV0gPSB7CisJMHgwMCwgMHgwOSwgMHhmNiwgMHg4MiwJLyogMDA6IFN0b3AgUnggcHJvY2Vzc29yICovCisJMHgwOCwgMHgwOSwgMHg4YSwgMHgxMywJLyogMDQ6IFR4IHNvZnR3YXJlIGZsb3cgY29udHJvbCAqLworCTB4MGEsIDB4MDksIDB4YzUsIDB4MTEsCS8qIDA4OiBYT04gY2hhciAqLworCTB4MGMsIDB4MDksIDB4ODYsIDB4ODUsCS8qIDBjOiBYQU5ZICovCisJMHgxMiwgMHgwOSwgMHg0MSwgMHhmZiwJLyogMTA6IFJ4IG1hc2sgY2hhciAqLworCTB4MTQsIDB4MDksIDB4ODIsIDB4MDAsCS8qIDE0OiBDb21wYXJlL0lnbm9yZSAjMCAqLworCTB4MTYsIDB4MDksIDB4ODIsIDB4N2IsCS8qIDE4OiBDb21wYXJlICMxICovCisJMHgxOCwgMHgwOSwgMHg4YSwgMHg3ZCwJLyogMWM6IENvbXBhcmUgIzIgKi8KKwkweDFhLCAweDA5LCAweDg4LCAweDgxLAkvKiAyMDogSW50ZXJydXB0ICMxICovCisJMHgxYywgMHgwOSwgMHg4NiwgMHg3YSwJLyogMjQ6IElnbm9yZS9SZXBsYWNlICMxICovCisJMHgxZSwgMHgwOSwgMHg4NCwgMHg4MSwJLyogMjg6IEludGVycnVwdCAjMiAqLworCTB4MjAsIDB4MDksIDB4ODIsIDB4N2MsCS8qIDJjOiBJZ25vcmUvUmVwbGFjZSAjMiAqLworCTB4MjIsIDB4MDksIDB4MGEsIDB4MGEJLyogMzA6IFJ4IEZJRk8gRW5hYmxlICovCit9OworCitDT05UUk9MTEVSX1Qgc0NvbnRyb2xsZXJbQ1RMX1NJWkVdID0geworCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19LAorCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19LAorCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19LAorCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19Cit9OworCitCeXRlX3Qgc0JpdE1hcENsclRibFs4XSA9IHsKKwkweGZlLCAweGZkLCAweGZiLCAweGY3LCAweGVmLCAweGRmLCAweGJmLCAweDdmCit9OworCitCeXRlX3Qgc0JpdE1hcFNldFRibFs4XSA9IHsKKwkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwCit9OworCitpbnQgc0Nsb2NrUHJlc2NhbGUgPSAweDE0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0luaXRDb250cm9sbGVyCitQdXJwb3NlOiAgSW5pdGlhbGl6YXRpb24gb2YgY29udHJvbGxlciBnbG9iYWwgcmVnaXN0ZXJzIGFuZCBjb250cm9sbGVyCisgICAgICAgICAgc3RydWN0dXJlLgorQ2FsbDogICAgIHNJbml0Q29udHJvbGxlcihDdGxQLEN0bE51bSxNdWRiYWNJTyxBaW9wSU9MaXN0LEFpb3BJT0xpc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJUlFOdW0sRnJlcXVlbmN5LFBlcmlvZGljT25seSkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorICAgICAgICAgIGludCBDdGxOdW07IENvbnRyb2xsZXIgbnVtYmVyCisgICAgICAgICAgQnl0ZUlPX3QgTXVkYmFjSU87IE11ZGJhYyBiYXNlIEkvTyBhZGRyZXNzLgorICAgICAgICAgIEJ5dGVJT190ICpBaW9wSU9MaXN0OyBMaXN0IG9mIEkvTyBhZGRyZXNzZXMgZm9yIGVhY2ggQUlPUC4KKyAgICAgICAgICAgICBUaGlzIGxpc3QgbXVzdCBiZSBpbiB0aGUgb3JkZXIgdGhlIEFJT1BzIHdpbGwgYmUgZm91bmQgb24gdGhlCisgICAgICAgICAgICAgY29udHJvbGxlci4gIE9uY2UgYW4gQUlPUCBpbiB0aGUgbGlzdCBpcyBub3QgZm91bmQsIGl0IGlzCisgICAgICAgICAgICAgYXNzdW1lZCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIEFJT1BzIG9uIHRoZSBjb250cm9sbGVyLgorICAgICAgICAgIGludCBBaW9wSU9MaXN0U2l6ZTsgTnVtYmVyIG9mIGFkZHJlc3NlcyBpbiBBaW9wSU9MaXN0CisgICAgICAgICAgaW50IElSUU51bTsgSW50ZXJydXB0IFJlcXVlc3QgbnVtYmVyLiAgQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgIDA6IERpc2FibGUgZ2xvYmFsIGludGVycnVwdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAzOiBJUlEgMworICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IElSUSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgNTogSVJRIDUKKyAgICAgICAgICAgICAgICAgICAgICAgICA5OiBJUlEgOQorICAgICAgICAgICAgICAgICAgICAgICAgIDEwOiBJUlEgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAxMTogSVJRIDExCisgICAgICAgICAgICAgICAgICAgICAgICAgMTI6IElSUSAxMgorICAgICAgICAgICAgICAgICAgICAgICAgIDE1OiBJUlEgMTUKKyAgICAgICAgICBCeXRlX3QgRnJlcXVlbmN5OiBBIGZsYWcgaWRlbnRpZnlpbmcgdGhlIGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwZXJpb2RpYyBpbnRlcnJ1cHQsIGNhbiBiZSBhbnkgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV9ESVMgLSBwZXJpb2RpYyBpbnRlcnJ1cHQgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzEzN0haIC0gMTM3IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV82OUhaIC0gNjkgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzM0SFogLSAzNCBIZXJ0egorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfMTdIWiAtIDE3IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV85SFogLSA5IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV80SFogLSA0IEhlcnR6CisgICAgICAgICAgICAgICAgICAgSWYgSVJRTnVtIGlzIHNldCB0byAwIHRoZSBGcmVxdWVuY3kgcGFyYW1ldGVyIGlzCisgICAgICAgICAgICAgICAgICAgb3ZlcmlkZGVuLCBpdCBpcyBmb3JjZWQgdG8gYSB2YWx1ZSBvZiBGUkVRX0RJUy4KKyAgICAgICAgICBpbnQgUGVyaW9kaWNPbmx5OiBUUlVFIGlmIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCB0aGUgcGVyaW9kaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgYXJlIHRvIGJlIGJsb2NrZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgaXMgYm90aCB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGNoYW5uZWwgaW50ZXJydXB0cyBhcmUgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBJUlFOdW0gaXMgc2V0IHRvIDAgdGhlIFBlcmlvZGljT25seSBwYXJhbWV0ZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaWRkZW4sIGl0IGlzIGZvcmNlZCB0byBhIHZhbHVlIG9mIEZBTFNFLgorUmV0dXJuOiAgIGludDogTnVtYmVyIG9mIEFJT1BzIG9uIHRoZSBjb250cm9sbGVyLCBvciBDVExJRF9OVUxMIGlmIGNvbnRyb2xsZXIKKyAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIGZhaWxlZC4KKworQ29tbWVudHM6CisgICAgICAgICAgSWYgcGVyaW9kaWMgaW50ZXJydXB0cyBhcmUgdG8gYmUgZGlzYWJsZWQgYnV0IEFJT1AgaW50ZXJydXB0cworICAgICAgICAgIGFyZSBhbGxvd2VkLCBzZXQgRnJlcXVlbmN5IHRvIEZSRVFfRElTIGFuZCBQZXJpb2RpY09ubHkgdG8gRkFMU0UuCisKKyAgICAgICAgICBJZiBpbnRlcnJ1cHRzIGFyZSB0byBiZSBjb21wbGV0ZWx5IGRpc2FibGVkIHNldCBJUlFOdW0gdG8gMC4KKworICAgICAgICAgIFNldHRpbmcgRnJlcXVlbmN5IHRvIEZSRVFfRElTIGFuZCBQZXJpb2RpY09ubHkgdG8gVFJVRSBpcyBhbgorICAgICAgICAgIGludmFsaWQgY29tYmluYXRpb24uCisKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uIG9mIGdsb2JhbCBpbnRlcnJ1cHQgbW9kZXMsCisgICAgICAgICAgYnV0IGl0IGRvZXMgbm90IGFjdHVhbGx5IGVuYWJsZSBnbG9iYWwgaW50ZXJydXB0cy4gIFRvIGVuYWJsZQorICAgICAgICAgIGFuZCBkaXNhYmxlIGdsb2JhbCBpbnRlcnJ1cHRzIHVzZSBmdW5jdGlvbnMgc0VuR2xvYmFsSW50KCkgYW5kCisgICAgICAgICAgc0Rpc0dsb2JhbEludCgpLiAgRW5hYmxpbmcgb2YgZ2xvYmFsIGludGVycnVwdHMgaXMgbm9ybWFsbHkgbm90CisgICAgICAgICAgZG9uZSB1bnRpbCBhbGwgb3RoZXIgaW5pdGlhbGl6YXRpb25zIGFyZSBjb21wbGV0ZS4KKworICAgICAgICAgIEV2ZW4gaWYgaW50ZXJydXB0cyBhcmUgZ2xvYmFsbHkgZW5hYmxlZCwgdGhleSBtdXN0IGFsc28gYmUKKyAgICAgICAgICBpbmRpdmlkdWFsbHkgZW5hYmxlZCBmb3IgZWFjaCBjaGFubmVsIHRoYXQgaXMgdG8gZ2VuZXJhdGUKKyAgICAgICAgICBpbnRlcnJ1cHRzLgorCitXYXJuaW5nczogTm8gcmFuZ2UgY2hlY2tpbmcgb24gYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGRvbmUuCisKKyAgICAgICAgICBObyBjb250ZXh0IHN3aXRjaGVzIGFyZSBhbGxvd2VkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9uLgorCisgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiBhbGwgQUlPUHMgb24gdGhlIGNvbnRyb2xsZXIgYXJlIGRpc2FibGVkLAorICAgICAgICAgIHRoZXkgY2FuIGJlIGVuYWJsZWQgd2l0aCBzRW5BaW9wKCkuCisqLworaW50IHNJbml0Q29udHJvbGxlcihDT05UUk9MTEVSX1QgKiBDdGxQLCBpbnQgQ3RsTnVtLCBCeXRlSU9fdCBNdWRiYWNJTywKKwkJICAgIEJ5dGVJT190ICogQWlvcElPTGlzdCwgaW50IEFpb3BJT0xpc3RTaXplLCBpbnQgSVJRTnVtLAorCQkgICAgQnl0ZV90IEZyZXF1ZW5jeSwgaW50IFBlcmlvZGljT25seSkKK3sKKwlpbnQgaTsKKwlCeXRlSU9fdCBpbzsKKwlpbnQgZG9uZTsKKworCUN0bFAtPkFpb3BJbnRyQml0cyA9IGFpb3BfaW50cl9iaXRzOworCUN0bFAtPkFsdENoYW5SaW5nSW5kaWNhdG9yID0gMDsKKwlDdGxQLT5DdGxOdW0gPSBDdGxOdW07CisJQ3RsUC0+Q3RsSUQgPSBDVExJRF8wMDAxOwkvKiBjb250cm9sbGVyIHJlbGVhc2UgMSAqLworCUN0bFAtPkJ1c1R5cGUgPSBpc0lTQTsKKwlDdGxQLT5NQmFzZUlPID0gTXVkYmFjSU87CisJQ3RsUC0+TVJlZzFJTyA9IE11ZGJhY0lPICsgMTsKKwlDdGxQLT5NUmVnMklPID0gTXVkYmFjSU8gKyAyOworCUN0bFAtPk1SZWczSU8gPSBNdWRiYWNJTyArIDM7CisjaWYgMQorCUN0bFAtPk1SZWcyID0gMDsJLyogaW50ZXJydXB0IGRpc2FibGUgKi8KKwlDdGxQLT5NUmVnMyA9IDA7CS8qIG5vIHBlcmlvZGljIGludGVycnVwdHMgKi8KKyNlbHNlCisJaWYgKHNJUlFNYXBbSVJRTnVtXSA9PSAwKSB7CS8qIGludGVycnVwdHMgZ2xvYmFsbHkgZGlzYWJsZWQgKi8KKwkJQ3RsUC0+TVJlZzIgPSAwOwkvKiBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCQlDdGxQLT5NUmVnMyA9IDA7CS8qIG5vIHBlcmlvZGljIGludGVycnVwdHMgKi8KKwl9IGVsc2UgeworCQlDdGxQLT5NUmVnMiA9IHNJUlFNYXBbSVJRTnVtXTsJLyogc2V0IElSUSBudW1iZXIgKi8KKwkJQ3RsUC0+TVJlZzMgPSBGcmVxdWVuY3k7CS8qIHNldCBmcmVxdWVuY3kgKi8KKwkJaWYgKFBlcmlvZGljT25seSkgewkvKiBwZXJpb2RpYyBpbnRlcnJ1cHQgb25seSAqLworCQkJQ3RsUC0+TVJlZzMgfD0gUEVSSU9ESUNfT05MWTsKKwkJfQorCX0KKyNlbmRpZgorCXNPdXRCKEN0bFAtPk1SZWcySU8sIEN0bFAtPk1SZWcyKTsKKwlzT3V0QihDdGxQLT5NUmVnM0lPLCBDdGxQLT5NUmVnMyk7CisJc0NvbnRyb2xsZXJFT0koQ3RsUCk7CS8qIGNsZWFyIEVPSSBpZiB3YXJtIGluaXQgKi8KKwkvKiBJbml0IEFJT1BzICovCisJQ3RsUC0+TnVtQWlvcCA9IDA7CisJZm9yIChpID0gZG9uZSA9IDA7IGkgPCBBaW9wSU9MaXN0U2l6ZTsgaSsrKSB7CisJCWlvID0gQWlvcElPTGlzdFtpXTsKKwkJQ3RsUC0+QWlvcElPW2ldID0gKFdvcmRJT190KSBpbzsKKwkJQ3RsUC0+QWlvcEludENoYW5JT1tpXSA9IGlvICsgX0lOVF9DSEFOOworCQlzT3V0QihDdGxQLT5NUmVnMklPLCBDdGxQLT5NUmVnMiB8IChpICYgMHgwMykpOwkvKiBBSU9QIGluZGV4ICovCisJCXNPdXRCKE11ZGJhY0lPLCAoQnl0ZV90KSAoaW8gPj4gNikpOwkvKiBzZXQgdXAgQUlPUCBJL08gaW4gTVVEQkFDICovCisJCWlmIChkb25lKQorCQkJY29udGludWU7CisJCXNFbkFpb3AoQ3RsUCwgaSk7CS8qIGVuYWJsZSB0aGUgQUlPUCAqLworCQlDdGxQLT5BaW9wSURbaV0gPSBzUmVhZEFpb3BJRChpbyk7CS8qIHJlYWQgQUlPUCBJRCAqLworCQlpZiAoQ3RsUC0+QWlvcElEW2ldID09IEFJT1BJRF9OVUxMKQkvKiBpZiBBSU9QIGRvZXMgbm90IGV4aXN0ICovCisJCQlkb25lID0gMTsJLyogZG9uZSBsb29raW5nIGZvciBBSU9QcyAqLworCQllbHNlIHsKKwkJCUN0bFAtPkFpb3BOdW1DaGFuW2ldID0gc1JlYWRBaW9wTnVtQ2hhbigoV29yZElPX3QpIGlvKTsJLyogbnVtIGNoYW5uZWxzIGluIEFJT1AgKi8KKwkJCXNPdXRXKChXb3JkSU9fdCkgaW8gKyBfSU5EWF9BRERSLCBfQ0xLX1BSRSk7CS8qIGNsb2NrIHByZXNjYWxlciAqLworCQkJc091dEIoaW8gKyBfSU5EWF9EQVRBLCBzQ2xvY2tQcmVzY2FsZSk7CisJCQlDdGxQLT5OdW1BaW9wKys7CS8qIGJ1bXAgY291bnQgb2YgQUlPUHMgKi8KKwkJfQorCQlzRGlzQWlvcChDdGxQLCBpKTsJLyogZGlzYWJsZSBBSU9QICovCisJfQorCisJaWYgKEN0bFAtPk51bUFpb3AgPT0gMCkKKwkJcmV0dXJuICgtMSk7CisJZWxzZQorCQlyZXR1cm4gKEN0bFAtPk51bUFpb3ApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1BDSUluaXRDb250cm9sbGVyCitQdXJwb3NlOiAgSW5pdGlhbGl6YXRpb24gb2YgY29udHJvbGxlciBnbG9iYWwgcmVnaXN0ZXJzIGFuZCBjb250cm9sbGVyCisgICAgICAgICAgc3RydWN0dXJlLgorQ2FsbDogICAgIHNQQ0lJbml0Q29udHJvbGxlcihDdGxQLEN0bE51bSxBaW9wSU9MaXN0LEFpb3BJT0xpc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJUlFOdW0sRnJlcXVlbmN5LFBlcmlvZGljT25seSkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorICAgICAgICAgIGludCBDdGxOdW07IENvbnRyb2xsZXIgbnVtYmVyCisgICAgICAgICAgQnl0ZUlPX3QgKkFpb3BJT0xpc3Q7IExpc3Qgb2YgSS9PIGFkZHJlc3NlcyBmb3IgZWFjaCBBSU9QLgorICAgICAgICAgICAgIFRoaXMgbGlzdCBtdXN0IGJlIGluIHRoZSBvcmRlciB0aGUgQUlPUHMgd2lsbCBiZSBmb3VuZCBvbiB0aGUKKyAgICAgICAgICAgICBjb250cm9sbGVyLiAgT25jZSBhbiBBSU9QIGluIHRoZSBsaXN0IGlzIG5vdCBmb3VuZCwgaXQgaXMKKyAgICAgICAgICAgICBhc3N1bWVkIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgQUlPUHMgb24gdGhlIGNvbnRyb2xsZXIuCisgICAgICAgICAgaW50IEFpb3BJT0xpc3RTaXplOyBOdW1iZXIgb2YgYWRkcmVzc2VzIGluIEFpb3BJT0xpc3QKKyAgICAgICAgICBpbnQgSVJRTnVtOyBJbnRlcnJ1cHQgUmVxdWVzdCBudW1iZXIuICBDYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgMDogRGlzYWJsZSBnbG9iYWwgaW50ZXJydXB0cworICAgICAgICAgICAgICAgICAgICAgICAgIDM6IElSUSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgNDogSVJRIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICA1OiBJUlEgNQorICAgICAgICAgICAgICAgICAgICAgICAgIDk6IElSUSA5CisgICAgICAgICAgICAgICAgICAgICAgICAgMTA6IElSUSAxMAorICAgICAgICAgICAgICAgICAgICAgICAgIDExOiBJUlEgMTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAxMjogSVJRIDEyCisgICAgICAgICAgICAgICAgICAgICAgICAgMTU6IElSUSAxNQorICAgICAgICAgIEJ5dGVfdCBGcmVxdWVuY3k6IEEgZmxhZyBpZGVudGlmeWluZyB0aGUgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgb2YgdGhlIHBlcmlvZGljIGludGVycnVwdCwgY2FuIGJlIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRX0RJUyAtIHBlcmlvZGljIGludGVycnVwdCBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfMTM3SFogLSAxMzcgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzY5SFogLSA2OSBIZXJ0egorICAgICAgICAgICAgICAgICAgICAgIEZSRVFfMzRIWiAtIDM0IEhlcnR6CisgICAgICAgICAgICAgICAgICAgICAgRlJFUV8xN0haIC0gMTcgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzlIWiAtIDkgSGVydHoKKyAgICAgICAgICAgICAgICAgICAgICBGUkVRXzRIWiAtIDQgSGVydHoKKyAgICAgICAgICAgICAgICAgICBJZiBJUlFOdW0gaXMgc2V0IHRvIDAgdGhlIEZyZXF1ZW5jeSBwYXJhbWV0ZXIgaXMKKyAgICAgICAgICAgICAgICAgICBvdmVyaWRkZW4sIGl0IGlzIGZvcmNlZCB0byBhIHZhbHVlIG9mIEZSRVFfRElTLgorICAgICAgICAgIGludCBQZXJpb2RpY09ubHk6IFRSVUUgaWYgYWxsIGludGVycnVwdHMgZXhjZXB0IHRoZSBwZXJpb2RpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBhcmUgdG8gYmUgYmxvY2tlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpcyBib3RoIHRoZSBwZXJpb2RpYyBpbnRlcnJ1cHQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2hhbm5lbCBpbnRlcnJ1cHRzIGFyZSBhbGxvd2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIElSUU51bSBpcyBzZXQgdG8gMCB0aGUgUGVyaW9kaWNPbmx5IHBhcmFtZXRlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJpZGRlbiwgaXQgaXMgZm9yY2VkIHRvIGEgdmFsdWUgb2YgRkFMU0UuCitSZXR1cm46ICAgaW50OiBOdW1iZXIgb2YgQUlPUHMgb24gdGhlIGNvbnRyb2xsZXIsIG9yIENUTElEX05VTEwgaWYgY29udHJvbGxlcgorICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gZmFpbGVkLgorCitDb21tZW50czoKKyAgICAgICAgICBJZiBwZXJpb2RpYyBpbnRlcnJ1cHRzIGFyZSB0byBiZSBkaXNhYmxlZCBidXQgQUlPUCBpbnRlcnJ1cHRzCisgICAgICAgICAgYXJlIGFsbG93ZWQsIHNldCBGcmVxdWVuY3kgdG8gRlJFUV9ESVMgYW5kIFBlcmlvZGljT25seSB0byBGQUxTRS4KKworICAgICAgICAgIElmIGludGVycnVwdHMgYXJlIHRvIGJlIGNvbXBsZXRlbHkgZGlzYWJsZWQgc2V0IElSUU51bSB0byAwLgorCisgICAgICAgICAgU2V0dGluZyBGcmVxdWVuY3kgdG8gRlJFUV9ESVMgYW5kIFBlcmlvZGljT25seSB0byBUUlVFIGlzIGFuCisgICAgICAgICAgaW52YWxpZCBjb21iaW5hdGlvbi4KKworICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgZ2xvYmFsIGludGVycnVwdCBtb2RlcywKKyAgICAgICAgICBidXQgaXQgZG9lcyBub3QgYWN0dWFsbHkgZW5hYmxlIGdsb2JhbCBpbnRlcnJ1cHRzLiAgVG8gZW5hYmxlCisgICAgICAgICAgYW5kIGRpc2FibGUgZ2xvYmFsIGludGVycnVwdHMgdXNlIGZ1bmN0aW9ucyBzRW5HbG9iYWxJbnQoKSBhbmQKKyAgICAgICAgICBzRGlzR2xvYmFsSW50KCkuICBFbmFibGluZyBvZiBnbG9iYWwgaW50ZXJydXB0cyBpcyBub3JtYWxseSBub3QKKyAgICAgICAgICBkb25lIHVudGlsIGFsbCBvdGhlciBpbml0aWFsaXphdGlvbnMgYXJlIGNvbXBsZXRlLgorCisgICAgICAgICAgRXZlbiBpZiBpbnRlcnJ1cHRzIGFyZSBnbG9iYWxseSBlbmFibGVkLCB0aGV5IG11c3QgYWxzbyBiZQorICAgICAgICAgIGluZGl2aWR1YWxseSBlbmFibGVkIGZvciBlYWNoIGNoYW5uZWwgdGhhdCBpcyB0byBnZW5lcmF0ZQorICAgICAgICAgIGludGVycnVwdHMuCisKK1dhcm5pbmdzOiBObyByYW5nZSBjaGVja2luZyBvbiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgaXMgZG9uZS4KKworICAgICAgICAgIE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisKKyAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uIGFsbCBBSU9QcyBvbiB0aGUgY29udHJvbGxlciBhcmUgZGlzYWJsZWQsCisgICAgICAgICAgdGhleSBjYW4gYmUgZW5hYmxlZCB3aXRoIHNFbkFpb3AoKS4KKyovCitpbnQgc1BDSUluaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBDdGxOdW0sCisJCSAgICAgICBCeXRlSU9fdCAqIEFpb3BJT0xpc3QsIGludCBBaW9wSU9MaXN0U2l6ZSwKKwkJICAgICAgIFdvcmRJT190IENvbmZpZ0lPLCBpbnQgSVJRTnVtLCBCeXRlX3QgRnJlcXVlbmN5LAorCQkgICAgICAgaW50IFBlcmlvZGljT25seSwgaW50IGFsdENoYW5SaW5nSW5kaWNhdG9yLAorCQkgICAgICAgaW50IFVQQ0lSaW5nSW5kKQoreworCWludCBpOworCUJ5dGVJT190IGlvOworCisJQ3RsUC0+QWx0Q2hhblJpbmdJbmRpY2F0b3IgPSBhbHRDaGFuUmluZ0luZGljYXRvcjsKKwlDdGxQLT5VUENJUmluZ0luZCA9IFVQQ0lSaW5nSW5kOworCUN0bFAtPkN0bE51bSA9IEN0bE51bTsKKwlDdGxQLT5DdGxJRCA9IENUTElEXzAwMDE7CS8qIGNvbnRyb2xsZXIgcmVsZWFzZSAxICovCisJQ3RsUC0+QnVzVHlwZSA9IGlzUENJOwkvKiBjb250cm9sbGVyIHJlbGVhc2UgMSAqLworCisJaWYgKENvbmZpZ0lPKSB7CisJCUN0bFAtPmlzVVBDSSA9IDE7CisJCUN0bFAtPlBDSUlPID0gQ29uZmlnSU8gKyBfUENJXzkwMzBfSU5UX0NUUkw7CisJCUN0bFAtPlBDSUlPMiA9IENvbmZpZ0lPICsgX1BDSV85MDMwX0dQSU9fQ1RSTDsKKwkJQ3RsUC0+QWlvcEludHJCaXRzID0gdXBjaV9haW9wX2ludHJfYml0czsKKwl9IGVsc2UgeworCQlDdGxQLT5pc1VQQ0kgPSAwOworCQlDdGxQLT5QQ0lJTyA9CisJCSAgICAoV29yZElPX3QpICgoQnl0ZUlPX3QpIEFpb3BJT0xpc3RbMF0gKyBfUENJX0lOVF9GVU5DKTsKKwkJQ3RsUC0+QWlvcEludHJCaXRzID0gYWlvcF9pbnRyX2JpdHM7CisJfQorCisJc1BDSUNvbnRyb2xsZXJFT0koQ3RsUCk7CS8qIGNsZWFyIEVPSSBpZiB3YXJtIGluaXQgKi8KKwkvKiBJbml0IEFJT1BzICovCisJQ3RsUC0+TnVtQWlvcCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFpb3BJT0xpc3RTaXplOyBpKyspIHsKKwkJaW8gPSBBaW9wSU9MaXN0W2ldOworCQlDdGxQLT5BaW9wSU9baV0gPSAoV29yZElPX3QpIGlvOworCQlDdGxQLT5BaW9wSW50Q2hhbklPW2ldID0gaW8gKyBfSU5UX0NIQU47CisKKwkJQ3RsUC0+QWlvcElEW2ldID0gc1JlYWRBaW9wSUQoaW8pOwkvKiByZWFkIEFJT1AgSUQgKi8KKwkJaWYgKEN0bFAtPkFpb3BJRFtpXSA9PSBBSU9QSURfTlVMTCkJLyogaWYgQUlPUCBkb2VzIG5vdCBleGlzdCAqLworCQkJYnJlYWs7CS8qIGRvbmUgbG9va2luZyBmb3IgQUlPUHMgKi8KKworCQlDdGxQLT5BaW9wTnVtQ2hhbltpXSA9IHNSZWFkQWlvcE51bUNoYW4oKFdvcmRJT190KSBpbyk7CS8qIG51bSBjaGFubmVscyBpbiBBSU9QICovCisJCXNPdXRXKChXb3JkSU9fdCkgaW8gKyBfSU5EWF9BRERSLCBfQ0xLX1BSRSk7CS8qIGNsb2NrIHByZXNjYWxlciAqLworCQlzT3V0QihpbyArIF9JTkRYX0RBVEEsIHNDbG9ja1ByZXNjYWxlKTsKKwkJQ3RsUC0+TnVtQWlvcCsrOwkvKiBidW1wIGNvdW50IG9mIEFJT1BzICovCisJfQorCisJaWYgKEN0bFAtPk51bUFpb3AgPT0gMCkKKwkJcmV0dXJuICgtMSk7CisJZWxzZQorCQlyZXR1cm4gKEN0bFAtPk51bUFpb3ApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1JlYWRBaW9wSUQKK1B1cnBvc2U6ICBSZWFkIHRoZSBBSU9QIGlkZW5maWNhdGlvbiBudW1iZXIgZGlyZWN0bHkgZnJvbSBhbiBBSU9QLgorQ2FsbDogICAgIHNSZWFkQWlvcElEKGlvKQorICAgICAgICAgIEJ5dGVJT190IGlvOiBBSU9QIGJhc2UgSS9PIGFkZHJlc3MKK1JldHVybjogICBpbnQ6IEZsYWcgQUlPUElEX1hYWFggaWYgYSB2YWxpZCBBSU9QIGlzIGZvdW5kLCB3aGVyZSBYCisgICAgICAgICAgICAgICAgIGlzIHJlcGxhY2UgYnkgYW4gaWRlbnRpZnlpbmcgbnVtYmVyLgorICAgICAgICAgIEZsYWcgQUlPUElEX05VTEwgaWYgbm8gdmFsaWQgQUlPUCBpcyBmb3VuZAorV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisKKyovCitpbnQgc1JlYWRBaW9wSUQoQnl0ZUlPX3QgaW8pCit7CisJQnl0ZV90IEFpb3BJRDsJCS8qIElEIGJ5dGUgZnJvbSBBSU9QICovCisKKwlzT3V0QihpbyArIF9DTURfUkVHLCBSRVNFVF9BTEwpOwkvKiByZXNldCBBSU9QICovCisJc091dEIoaW8gKyBfQ01EX1JFRywgMHgwKTsKKwlBaW9wSUQgPSBzSW5XKGlvICsgX0NITl9TVEFUMCkgJiAweDA3OworCWlmIChBaW9wSUQgPT0gMHgwNikKKwkJcmV0dXJuICgxKTsKKwllbHNlCQkJLyogQUlPUCBkb2VzIG5vdCBleGlzdCAqLworCQlyZXR1cm4gKC0xKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNSZWFkQWlvcE51bUNoYW4KK1B1cnBvc2U6ICBSZWFkIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXZhaWxhYmxlIGluIGFuIEFJT1AgZGlyZWN0bHkgZnJvbQorICAgICAgICAgIGFuIEFJT1AuCitDYWxsOiAgICAgc1JlYWRBaW9wTnVtQ2hhbihpbykKKyAgICAgICAgICBXb3JkSU9fdCBpbzogQUlPUCBiYXNlIEkvTyBhZGRyZXNzCitSZXR1cm46ICAgaW50OiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGF2YWlsYWJsZQorQ29tbWVudHM6IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgZGV0ZXJtaW5lZCBieSB3cml0ZS9yZWFkcyBmcm9tIGlkZW50aWNhbAorICAgICAgICAgIG9mZnNldHMgd2l0aGluIHRoZSBTUkFNIGFkZHJlc3Mgc3BhY2VzIGZvciBjaGFubmVscyAwIGFuZCA0LgorICAgICAgICAgIElmIHRoZSBjaGFubmVsIDQgc3BhY2UgaXMgbWlycm9yZWQgdG8gY2hhbm5lbCAwIGl0IGlzIGEgNCBjaGFubmVsCisgICAgICAgICAgQUlPUCwgb3RoZXJ3aXNlIGl0IGlzIGFuIDggY2hhbm5lbC4KK1dhcm5pbmdzOiBObyBjb250ZXh0IHN3aXRjaGVzIGFyZSBhbGxvd2VkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9uLgorKi8KK2ludCBzUmVhZEFpb3BOdW1DaGFuKFdvcmRJT190IGlvKQoreworCVdvcmRfdCB4OworCXN0YXRpYyBCeXRlX3QgUls0XSA9IHsgMHgwMCwgMHgwMCwgMHgzNCwgMHgxMiB9OworCisJLyogd3JpdGUgdG8gY2hhbiAwIFNSQU0gKi8KKwlzT3V0RFcoKERXb3JkSU9fdCkgaW8gKyBfSU5EWF9BRERSLCAqKChEV29yZF90ICopICYgUlswXSkpOworCXNPdXRXKGlvICsgX0lORFhfQUREUiwgMCk7CS8qIHJlYWQgZnJvbSBTUkFNLCBjaGFuIDAgKi8KKwl4ID0gc0luVyhpbyArIF9JTkRYX0RBVEEpOworCXNPdXRXKGlvICsgX0lORFhfQUREUiwgMHg0MDAwKTsJLyogcmVhZCBmcm9tIFNSQU0sIGNoYW4gNCAqLworCWlmICh4ICE9IHNJblcoaW8gKyBfSU5EWF9EQVRBKSkJLyogaWYgZGlmZmVyZW50IG11c3QgYmUgOCBjaGFuICovCisJCXJldHVybiAoOCk7CisJZWxzZQorCQlyZXR1cm4gKDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0luaXRDaGFuCitQdXJwb3NlOiAgSW5pdGlhbGl6YXRpb24gb2YgYSBjaGFubmVsIGFuZCBjaGFubmVsIHN0cnVjdHVyZQorQ2FsbDogICAgIHNJbml0Q2hhbihDdGxQLENoUCxBaW9wTnVtLENoYW5OdW0pCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgaW50IEFpb3BOdW07IEFJT1AgbnVtYmVyIHdpdGhpbiBjb250cm9sbGVyCisgICAgICAgICAgaW50IENoYW5OdW07IENoYW5uZWwgbnVtYmVyIHdpdGhpbiBBSU9QCitSZXR1cm46ICAgaW50OiBUUlVFIGlmIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCwgRkFMU0UgaWYgaXQgZmFpbHMgYmVjYXVzZSBjaGFubmVsCisgICAgICAgICAgICAgICBudW1iZXIgZXhjZWVkcyBudW1iZXIgb2YgY2hhbm5lbHMgYXZhaWxhYmxlIGluIEFJT1AuCitDb21tZW50czogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYSBjaGFubmVsIGNhbiBiZSB1c2VkLgorV2FybmluZ3M6IE5vIHJhbmdlIGNoZWNraW5nIG9uIGFueSBvZiB0aGUgcGFyYW1ldGVycyBpcyBkb25lLgorCisgICAgICAgICAgTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KKyovCitpbnQgc0luaXRDaGFuKENPTlRST0xMRVJfVCAqIEN0bFAsIENIQU5ORUxfVCAqIENoUCwgaW50IEFpb3BOdW0sCisJICAgICAgaW50IENoYW5OdW0pCit7CisJaW50IGk7CisJV29yZElPX3QgQWlvcElPOworCVdvcmRJT190IENoSU9PZmY7CisJQnl0ZV90ICpDaFI7CisJV29yZF90IENoT2ZmOworCXN0YXRpYyBCeXRlX3QgUls0XTsKKwlpbnQgYnJkOTYwMDsKKworCWlmIChDaGFuTnVtID49IEN0bFAtPkFpb3BOdW1DaGFuW0Fpb3BOdW1dKQorCQlyZXR1cm4gKEZBTFNFKTsJLyogZXhjZWVkcyBudW0gY2hhbnMgaW4gQUlPUCAqLworCisJLyogQ2hhbm5lbCwgQUlPUCwgYW5kIGNvbnRyb2xsZXIgaWRlbnRpZmllcnMgKi8KKwlDaFAtPkN0bFAgPSBDdGxQOworCUNoUC0+Q2hhbklEID0gQ3RsUC0+QWlvcElEW0Fpb3BOdW1dOworCUNoUC0+QWlvcE51bSA9IEFpb3BOdW07CisJQ2hQLT5DaGFuTnVtID0gQ2hhbk51bTsKKworCS8qIEdsb2JhbCBkaXJlY3QgYWRkcmVzc2VzICovCisJQWlvcElPID0gQ3RsUC0+QWlvcElPW0Fpb3BOdW1dOworCUNoUC0+Q21kID0gKEJ5dGVJT190KSBBaW9wSU8gKyBfQ01EX1JFRzsKKwlDaFAtPkludENoYW4gPSAoQnl0ZUlPX3QpIEFpb3BJTyArIF9JTlRfQ0hBTjsKKwlDaFAtPkludE1hc2sgPSAoQnl0ZUlPX3QpIEFpb3BJTyArIF9JTlRfTUFTSzsKKwlDaFAtPkluZGV4QWRkciA9IChEV29yZElPX3QpIEFpb3BJTyArIF9JTkRYX0FERFI7CisJQ2hQLT5JbmRleERhdGEgPSBBaW9wSU8gKyBfSU5EWF9EQVRBOworCisJLyogQ2hhbm5lbCBkaXJlY3QgYWRkcmVzc2VzICovCisJQ2hJT09mZiA9IEFpb3BJTyArIENoUC0+Q2hhbk51bSAqIDI7CisJQ2hQLT5UeFJ4RGF0YSA9IENoSU9PZmYgKyBfVEQwOworCUNoUC0+Q2hhblN0YXQgPSBDaElPT2ZmICsgX0NITl9TVEFUMDsKKwlDaFAtPlR4UnhDb3VudCA9IENoSU9PZmYgKyBfRklGT19DTlQwOworCUNoUC0+SW50SUQgPSAoQnl0ZUlPX3QpIEFpb3BJTyArIENoUC0+Q2hhbk51bSArIF9JTlRfSUQwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2hhbm5lbCBmcm9tIHRoZSBSRGF0YSBhcnJheSAqLworCWZvciAoaSA9IDA7IGkgPCBSREFUQVNJWkU7IGkgKz0gNCkgeworCQlSWzBdID0gUkRhdGFbaV07CisJCVJbMV0gPSBSRGF0YVtpICsgMV0gKyAweDEwICogQ2hhbk51bTsKKwkJUlsyXSA9IFJEYXRhW2kgKyAyXTsKKwkJUlszXSA9IFJEYXRhW2kgKyAzXTsKKwkJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKChEV29yZF90ICopICYgUlswXSkpOworCX0KKworCUNoUiA9IENoUC0+UjsKKwlmb3IgKGkgPSAwOyBpIDwgUlJFR0RBVEFTSVpFOyBpICs9IDQpIHsKKwkJQ2hSW2ldID0gUlJlZ0RhdGFbaV07CisJCUNoUltpICsgMV0gPSBSUmVnRGF0YVtpICsgMV0gKyAweDEwICogQ2hhbk51bTsKKwkJQ2hSW2kgKyAyXSA9IFJSZWdEYXRhW2kgKyAyXTsKKwkJQ2hSW2kgKyAzXSA9IFJSZWdEYXRhW2kgKyAzXTsKKwl9CisKKwkvKiBJbmRleGVkIHJlZ2lzdGVycyAqLworCUNoT2ZmID0gKFdvcmRfdCkgQ2hhbk51bSAqMHgxMDAwOworCisJaWYgKHNDbG9ja1ByZXNjYWxlID09IDB4MTQpCisJCWJyZDk2MDAgPSA0NzsKKwllbHNlCisJCWJyZDk2MDAgPSAyMzsKKworCUNoUC0+QmF1ZERpdlswXSA9IChCeXRlX3QpIChDaE9mZiArIF9CQVVEKTsKKwlDaFAtPkJhdWREaXZbMV0gPSAoQnl0ZV90KSAoKENoT2ZmICsgX0JBVUQpID4+IDgpOworCUNoUC0+QmF1ZERpdlsyXSA9IChCeXRlX3QpIGJyZDk2MDA7CisJQ2hQLT5CYXVkRGl2WzNdID0gKEJ5dGVfdCkgKGJyZDk2MDAgPj4gOCk7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPkJhdWREaXZbMF0pOworCisJQ2hQLT5UeENvbnRyb2xbMF0gPSAoQnl0ZV90KSAoQ2hPZmYgKyBfVFhfQ1RSTCk7CisJQ2hQLT5UeENvbnRyb2xbMV0gPSAoQnl0ZV90KSAoKENoT2ZmICsgX1RYX0NUUkwpID4+IDgpOworCUNoUC0+VHhDb250cm9sWzJdID0gMDsKKwlDaFAtPlR4Q29udHJvbFszXSA9IDA7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlR4Q29udHJvbFswXSk7CisKKwlDaFAtPlJ4Q29udHJvbFswXSA9IChCeXRlX3QpIChDaE9mZiArIF9SWF9DVFJMKTsKKwlDaFAtPlJ4Q29udHJvbFsxXSA9IChCeXRlX3QpICgoQ2hPZmYgKyBfUlhfQ1RSTCkgPj4gOCk7CisJQ2hQLT5SeENvbnRyb2xbMl0gPSAwOworCUNoUC0+UnhDb250cm9sWzNdID0gMDsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+UnhDb250cm9sWzBdKTsKKworCUNoUC0+VHhFbmFibGVzWzBdID0gKEJ5dGVfdCkgKENoT2ZmICsgX1RYX0VOQkxTKTsKKwlDaFAtPlR4RW5hYmxlc1sxXSA9IChCeXRlX3QpICgoQ2hPZmYgKyBfVFhfRU5CTFMpID4+IDgpOworCUNoUC0+VHhFbmFibGVzWzJdID0gMDsKKwlDaFAtPlR4RW5hYmxlc1szXSA9IDA7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlR4RW5hYmxlc1swXSk7CisKKwlDaFAtPlR4Q29tcGFyZVswXSA9IChCeXRlX3QpIChDaE9mZiArIF9UWENNUDEpOworCUNoUC0+VHhDb21wYXJlWzFdID0gKEJ5dGVfdCkgKChDaE9mZiArIF9UWENNUDEpID4+IDgpOworCUNoUC0+VHhDb21wYXJlWzJdID0gMDsKKwlDaFAtPlR4Q29tcGFyZVszXSA9IDA7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlR4Q29tcGFyZVswXSk7CisKKwlDaFAtPlR4UmVwbGFjZTFbMF0gPSAoQnl0ZV90KSAoQ2hPZmYgKyBfVFhSRVAxQjEpOworCUNoUC0+VHhSZXBsYWNlMVsxXSA9IChCeXRlX3QpICgoQ2hPZmYgKyBfVFhSRVAxQjEpID4+IDgpOworCUNoUC0+VHhSZXBsYWNlMVsyXSA9IDA7CisJQ2hQLT5UeFJlcGxhY2UxWzNdID0gMDsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+VHhSZXBsYWNlMVswXSk7CisKKwlDaFAtPlR4UmVwbGFjZTJbMF0gPSAoQnl0ZV90KSAoQ2hPZmYgKyBfVFhSRVAyKTsKKwlDaFAtPlR4UmVwbGFjZTJbMV0gPSAoQnl0ZV90KSAoKENoT2ZmICsgX1RYUkVQMikgPj4gOCk7CisJQ2hQLT5UeFJlcGxhY2UyWzJdID0gMDsKKwlDaFAtPlR4UmVwbGFjZTJbM10gPSAwOworCXNPdXREVyhDaFAtPkluZGV4QWRkciwgKihEV29yZF90ICopICYgQ2hQLT5UeFJlcGxhY2UyWzBdKTsKKworCUNoUC0+VHhGSUZPUHRycyA9IENoT2ZmICsgX1RYRl9PVVRQOworCUNoUC0+VHhGSUZPID0gQ2hPZmYgKyBfVFhfRklGTzsKKworCXNPdXRCKENoUC0+Q21kLCAoQnl0ZV90KSBDaGFuTnVtIHwgUkVTVFhGQ05UKTsJLyogYXBwbHkgcmVzZXQgVHggRklGTyBjb3VudCAqLworCXNPdXRCKENoUC0+Q21kLCAoQnl0ZV90KSBDaGFuTnVtKTsJLyogcmVtb3ZlIHJlc2V0IFR4IEZJRk8gY291bnQgKi8KKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlR4RklGT1B0cnMpOwkvKiBjbGVhciBUeCBpbi9vdXQgcHRycyAqLworCXNPdXRXKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlDaFAtPlJ4RklGT1B0cnMgPSBDaE9mZiArIF9SWEZfT1VUUDsKKwlDaFAtPlJ4RklGTyA9IENoT2ZmICsgX1JYX0ZJRk87CisKKwlzT3V0QihDaFAtPkNtZCwgKEJ5dGVfdCkgQ2hhbk51bSB8IFJFU1JYRkNOVCk7CS8qIGFwcGx5IHJlc2V0IFJ4IEZJRk8gY291bnQgKi8KKwlzT3V0QihDaFAtPkNtZCwgKEJ5dGVfdCkgQ2hhbk51bSk7CS8qIHJlbW92ZSByZXNldCBSeCBGSUZPIGNvdW50ICovCisJc091dFcoKFdvcmRJT190KSBDaFAtPkluZGV4QWRkciwgQ2hQLT5SeEZJRk9QdHJzKTsJLyogY2xlYXIgUnggb3V0IHB0ciAqLworCXNPdXRXKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlJ4RklGT1B0cnMgKyAyKTsJLyogY2xlYXIgUnggaW4gcHRyICovCisJc091dFcoQ2hQLT5JbmRleERhdGEsIDApOworCUNoUC0+VHhQcmlvQ250ID0gQ2hPZmYgKyBfVFhQX0NOVDsKKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlR4UHJpb0NudCk7CisJc091dEIoQ2hQLT5JbmRleERhdGEsIDApOworCUNoUC0+VHhQcmlvUHRyID0gQ2hPZmYgKyBfVFhQX1BOVFI7CisJc091dFcoKFdvcmRJT190KSBDaFAtPkluZGV4QWRkciwgQ2hQLT5UeFByaW9QdHIpOworCXNPdXRCKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlDaFAtPlR4UHJpb0J1ZiA9IENoT2ZmICsgX1RYUF9CVUY7CisJc0VuUnhQcm9jZXNzb3IoQ2hQKTsJLyogc3RhcnQgdGhlIFJ4IHByb2Nlc3NvciAqLworCisJcmV0dXJuIChUUlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTdG9wUnhQcm9jZXNzb3IKK1B1cnBvc2U6ICBTdG9wIHRoZSByZWNlaXZlIHByb2Nlc3NvciBmcm9tIHByb2Nlc3NpbmcgYSBjaGFubmVsLgorQ2FsbDogICAgIHNTdG9wUnhQcm9jZXNzb3IoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKworQ29tbWVudHM6IFRoZSByZWNlaXZlIHByb2Nlc3NvciBjYW4gYmUgc3RhcnRlZCBhZ2FpbiB3aXRoIHNTdGFydFJ4UHJvY2Vzc29yKCkuCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYXVzZXMgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIHRvIHNraXAgb3ZlciB0aGUKKyAgICAgICAgICBzdG9wcGVkIGNoYW5uZWwuICBJdCBkb2VzIG5vdCBzdG9wIGl0IGZyb20gcHJvY2Vzc2luZyBvdGhlciBjaGFubmVscy4KKworV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisKKyAgICAgICAgICBEbyBub3QgbGVhdmUgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIHN0b3BwZWQgZm9yIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgICBjaGFyYWN0ZXIgdGltZS4KKworICAgICAgICAgIEFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhIGRlbGF5IG9mIDQgdVMgaXMgcmVxdWlyZWQgdG8gZW5zdXJlCisgICAgICAgICAgdGhhdCB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IgaXMgbm8gbG9uZ2VyIHByb2Nlc3NpbmcgdGhpcyBjaGFubmVsLgorKi8KK3ZvaWQgc1N0b3BSeFByb2Nlc3NvcihDSEFOTkVMX1QgKiBDaFApCit7CisJQnl0ZV90IFJbNF07CisKKwlSWzBdID0gQ2hQLT5SWzBdOworCVJbMV0gPSBDaFAtPlJbMV07CisJUlsyXSA9IDB4MGE7CisJUlszXSA9IENoUC0+UlszXTsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIFJbMF0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0ZsdXNoUnhGSUZPCitQdXJwb3NlOiAgRmx1c2ggdGhlIFJ4IEZJRk8KK0NhbGw6ICAgICBzRmx1c2hSeEZJRk8oQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK1JldHVybjogICB2b2lkCitDb21tZW50czogVG8gcHJldmVudCBkYXRhIGZyb20gYmVpbmcgZW5xdWV1ZWQgb3IgZGVxdWV1ZWQgaW4gdGhlIFR4IEZJRk8KKyAgICAgICAgICB3aGlsZSBpdCBpcyBiZWluZyBmbHVzaGVkIHRoZSByZWNlaXZlIHByb2Nlc3NvciBpcyBzdG9wcGVkCisgICAgICAgICAgYW5kIHRoZSB0cmFuc21pdHRlciBpcyBkaXNhYmxlZC4gIEFmdGVyIHRoZXNlIG9wZXJhdGlvbnMgYQorICAgICAgICAgIDQgdVMgZGVsYXkgaXMgZG9uZSBiZWZvcmUgY2xlYXJpbmcgdGhlIHBvaW50ZXJzIHRvIGFsbG93CisgICAgICAgICAgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIHRvIHN0b3AuICBUaGVzZSBpdGVtcyBhcmUgaGFuZGxlZCBpbnNpZGUKKyAgICAgICAgICB0aGlzIGZ1bmN0aW9uLgorV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisqLwordm9pZCBzRmx1c2hSeEZJRk8oQ0hBTk5FTF9UICogQ2hQKQoreworCWludCBpOworCUJ5dGVfdCBDaDsJCS8qIGNoYW5uZWwgbnVtYmVyIHdpdGhpbiBBSU9QICovCisJaW50IFJ4RklGT0VuYWJsZWQ7CS8qIFRSVUUgaWYgUnggRklGTyBlbmFibGVkICovCisKKwlpZiAoc0dldFJ4Q250KENoUCkgPT0gMCkJLyogUnggRklGTyBlbXB0eSAqLworCQlyZXR1cm47CQkvKiBkb24ndCBuZWVkIHRvIGZsdXNoICovCisKKwlSeEZJRk9FbmFibGVkID0gRkFMU0U7CisJaWYgKENoUC0+UlsweDMyXSA9PSAweDA4KSB7CS8qIFJ4IEZJRk8gaXMgZW5hYmxlZCAqLworCQlSeEZJRk9FbmFibGVkID0gVFJVRTsKKwkJc0Rpc1J4RklGTyhDaFApOwkvKiBkaXNhYmxlIGl0ICovCisJCWZvciAoaSA9IDA7IGkgPCAyMDAwIC8gMjAwOyBpKyspCS8qIGRlbGF5IDIgdVMgdG8gYWxsb3cgcHJvYyB0byBkaXNhYmxlIEZJRk8gKi8KKwkJCXNJbkIoQ2hQLT5JbnRDaGFuKTsJLyogZGVwZW5kcyBvbiBidXMgaS9vIHRpbWluZyAqLworCX0KKwlzR2V0Q2hhblN0YXR1cyhDaFApOwkvKiBjbGVhciBhbnkgcGVuZGluZyBSeCBlcnJvcnMgaW4gY2hhbiBzdGF0ICovCisJQ2ggPSAoQnl0ZV90KSBzR2V0Q2hhbk51bShDaFApOworCXNPdXRCKENoUC0+Q21kLCBDaCB8IFJFU1JYRkNOVCk7CS8qIGFwcGx5IHJlc2V0IFJ4IEZJRk8gY291bnQgKi8KKwlzT3V0QihDaFAtPkNtZCwgQ2gpOwkvKiByZW1vdmUgcmVzZXQgUnggRklGTyBjb3VudCAqLworCXNPdXRXKChXb3JkSU9fdCkgQ2hQLT5JbmRleEFkZHIsIENoUC0+UnhGSUZPUHRycyk7CS8qIGNsZWFyIFJ4IG91dCBwdHIgKi8KKwlzT3V0VyhDaFAtPkluZGV4RGF0YSwgMCk7CisJc091dFcoKFdvcmRJT190KSBDaFAtPkluZGV4QWRkciwgQ2hQLT5SeEZJRk9QdHJzICsgMik7CS8qIGNsZWFyIFJ4IGluIHB0ciAqLworCXNPdXRXKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlpZiAoUnhGSUZPRW5hYmxlZCkKKwkJc0VuUnhGSUZPKENoUCk7CS8qIGVuYWJsZSBSeCBGSUZPICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRmx1c2hUeEZJRk8KK1B1cnBvc2U6ICBGbHVzaCB0aGUgVHggRklGTworQ2FsbDogICAgIHNGbHVzaFR4RklGTyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIHZvaWQKK0NvbW1lbnRzOiBUbyBwcmV2ZW50IGRhdGEgZnJvbSBiZWluZyBlbnF1ZXVlZCBvciBkZXF1ZXVlZCBpbiB0aGUgVHggRklGTworICAgICAgICAgIHdoaWxlIGl0IGlzIGJlaW5nIGZsdXNoZWQgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIGlzIHN0b3BwZWQKKyAgICAgICAgICBhbmQgdGhlIHRyYW5zbWl0dGVyIGlzIGRpc2FibGVkLiAgQWZ0ZXIgdGhlc2Ugb3BlcmF0aW9ucyBhCisgICAgICAgICAgNCB1UyBkZWxheSBpcyBkb25lIGJlZm9yZSBjbGVhcmluZyB0aGUgcG9pbnRlcnMgdG8gYWxsb3cKKyAgICAgICAgICB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IgdG8gc3RvcC4gIFRoZXNlIGl0ZW1zIGFyZSBoYW5kbGVkIGluc2lkZQorICAgICAgICAgIHRoaXMgZnVuY3Rpb24uCitXYXJuaW5nczogTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KKyovCit2b2lkIHNGbHVzaFR4RklGTyhDSEFOTkVMX1QgKiBDaFApCit7CisJaW50IGk7CisJQnl0ZV90IENoOwkJLyogY2hhbm5lbCBudW1iZXIgd2l0aGluIEFJT1AgKi8KKwlpbnQgVHhFbmFibGVkOwkJLyogVFJVRSBpZiB0cmFuc21pdHRlciBlbmFibGVkICovCisKKwlpZiAoc0dldFR4Q250KENoUCkgPT0gMCkJLyogVHggRklGTyBlbXB0eSAqLworCQlyZXR1cm47CQkvKiBkb24ndCBuZWVkIHRvIGZsdXNoICovCisKKwlUeEVuYWJsZWQgPSBGQUxTRTsKKwlpZiAoQ2hQLT5UeENvbnRyb2xbM10gJiBUWF9FTkFCTEUpIHsKKwkJVHhFbmFibGVkID0gVFJVRTsKKwkJc0Rpc1RyYW5zbWl0KENoUCk7CS8qIGRpc2FibGUgdHJhbnNtaXR0ZXIgKi8KKwl9CisJc1N0b3BSeFByb2Nlc3NvcihDaFApOwkvKiBzdG9wIFJ4IHByb2Nlc3NvciAqLworCWZvciAoaSA9IDA7IGkgPCA0MDAwIC8gMjAwOyBpKyspCS8qIGRlbGF5IDQgdVMgdG8gYWxsb3cgcHJvYyB0byBzdG9wICovCisJCXNJbkIoQ2hQLT5JbnRDaGFuKTsJLyogZGVwZW5kcyBvbiBidXMgaS9vIHRpbWluZyAqLworCUNoID0gKEJ5dGVfdCkgc0dldENoYW5OdW0oQ2hQKTsKKwlzT3V0QihDaFAtPkNtZCwgQ2ggfCBSRVNUWEZDTlQpOwkvKiBhcHBseSByZXNldCBUeCBGSUZPIGNvdW50ICovCisJc091dEIoQ2hQLT5DbWQsIENoKTsJLyogcmVtb3ZlIHJlc2V0IFR4IEZJRk8gY291bnQgKi8KKwlzT3V0VygoV29yZElPX3QpIENoUC0+SW5kZXhBZGRyLCBDaFAtPlR4RklGT1B0cnMpOwkvKiBjbGVhciBUeCBpbi9vdXQgcHRycyAqLworCXNPdXRXKENoUC0+SW5kZXhEYXRhLCAwKTsKKwlpZiAoVHhFbmFibGVkKQorCQlzRW5UcmFuc21pdChDaFApOwkvKiBlbmFibGUgdHJhbnNtaXR0ZXIgKi8KKwlzU3RhcnRSeFByb2Nlc3NvcihDaFApOwkvKiByZXN0YXJ0IFJ4IHByb2Nlc3NvciAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1dyaXRlVHhQcmlvQnl0ZQorUHVycG9zZTogIFdyaXRlIGEgYnl0ZSBvZiBwcmlvcml0eSB0cmFuc21pdCBkYXRhIHRvIGEgY2hhbm5lbAorQ2FsbDogICAgIHNXcml0ZVR4UHJpb0J5dGUoQ2hQLERhdGEpCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorICAgICAgICAgIEJ5dGVfdCBEYXRhOyBUaGUgdHJhbnNtaXQgZGF0YSBieXRlCisKK1JldHVybjogICBpbnQ6IDEgaWYgdGhlIGJ5dGVzIGlzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLCBvdGhlcndpc2UgMC4KKworQ29tbWVudHM6IFRoZSBwcmlvcml0eSBieXRlIGlzIHRyYW5zbWl0dGVkIGJlZm9yZSBhbnkgZGF0YSBpbiB0aGUgVHggRklGTy4KKworV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCisqLworaW50IHNXcml0ZVR4UHJpb0J5dGUoQ0hBTk5FTF9UICogQ2hQLCBCeXRlX3QgRGF0YSkKK3sKKwlCeXRlX3QgRFdCdWZbNF07CS8qIGJ1ZmZlciBmb3IgZG91YmxlIHdvcmQgd3JpdGVzICovCisJV29yZF90ICpXb3JkUHRyOwkvKiBtdXN0IGJlIGZhciBiZWNhdXNlIFdpbiBTUyAhPSBEUyAqLworCXJlZ2lzdGVyIERXb3JkSU9fdCBJbmRleEFkZHI7CisKKwlpZiAoc0dldFR4Q250KENoUCkgPiAxKSB7CS8qIHdyaXRlIGl0IHRvIFR4IHByaW9yaXR5IGJ1ZmZlciAqLworCQlJbmRleEFkZHIgPSBDaFAtPkluZGV4QWRkcjsKKwkJc091dFcoKFdvcmRJT190KSBJbmRleEFkZHIsIENoUC0+VHhQcmlvQ250KTsJLyogZ2V0IHByaW9yaXR5IGJ1ZmZlciBzdGF0dXMgKi8KKwkJaWYgKHNJbkIoKEJ5dGVJT190KSBDaFAtPkluZGV4RGF0YSkgJiBQUklfUEVORCkJLyogcHJpb3JpdHkgYnVmZmVyIGJ1c3kgKi8KKwkJCXJldHVybiAoMCk7CS8qIG5vdGhpbmcgc2VudCAqLworCisJCVdvcmRQdHIgPSAoV29yZF90ICopICgmRFdCdWZbMF0pOworCQkqV29yZFB0ciA9IENoUC0+VHhQcmlvQnVmOwkvKiBkYXRhIGJ5dGUgYWRkcmVzcyAqLworCisJCURXQnVmWzJdID0gRGF0YTsJLyogZGF0YSBieXRlIHZhbHVlICovCisJCXNPdXREVyhJbmRleEFkZHIsICooKERXb3JkX3QgKikgKCZEV0J1ZlswXSkpKTsJLyogd3JpdGUgaXQgb3V0ICovCisKKwkJKldvcmRQdHIgPSBDaFAtPlR4UHJpb0NudDsJLyogVHggcHJpb3JpdHkgY291bnQgYWRkcmVzcyAqLworCisJCURXQnVmWzJdID0gUFJJX1BFTkQgKyAxOwkvKiBpbmRpY2F0ZSAxIGJ5dGUgcGVuZGluZyAqLworCQlEV0J1ZlszXSA9IDA7CS8qIHByaW9yaXR5IGJ1ZmZlciBwb2ludGVyICovCisJCXNPdXREVyhJbmRleEFkZHIsICooKERXb3JkX3QgKikgKCZEV0J1ZlswXSkpKTsJLyogd3JpdGUgaXQgb3V0ICovCisJfSBlbHNlIHsJCS8qIHdyaXRlIGl0IHRvIFR4IEZJRk8gKi8KKworCQlzV3JpdGVUeEJ5dGUoc0dldFR4UnhEYXRhSU8oQ2hQKSwgRGF0YSk7CisJfQorCXJldHVybiAoMSk7CQkvKiAxIGJ5dGUgc2VudCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuSW50ZXJydXB0cworUHVycG9zZTogIEVuYWJsZSBvbmUgb3IgbW9yZSBpbnRlcnJ1cHRzIGZvciBhIGNoYW5uZWwKK0NhbGw6ICAgICBzRW5JbnRlcnJ1cHRzKENoUCxGbGFncykKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgV29yZF90IEZsYWdzOiBJbnRlcnJ1cHQgZW5hYmxlIGZsYWdzLCBjYW4gYmUgYW55IGNvbWJpbmF0aW9uCisgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKyAgICAgICAgICAgICAgICBUWElOVF9FTjogICBJbnRlcnJ1cHQgb24gVHggRklGTyBlbXB0eQorICAgICAgICAgICAgICAgIFJYSU5UX0VOOiAgIEludGVycnVwdCBvbiBSeCBGSUZPIGF0IHRyaWdnZXIgbGV2ZWwgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTZXRSeFRyaWdnZXIoKSkKKyAgICAgICAgICAgICAgICBTUkNJTlRfRU46ICBJbnRlcnJ1cHQgb24gU1JDIChTcGVjaWFsIFJ4IENvbmRpdGlvbikKKyAgICAgICAgICAgICAgICBNQ0lOVF9FTjogICBJbnRlcnJ1cHQgb24gbW9kZW0gaW5wdXQgY2hhbmdlCisgICAgICAgICAgICAgICAgQ0hBTklOVF9FTjogQWxsb3cgY2hhbm5lbCBpbnRlcnJ1cHQgc2lnbmFsIHRvIHRoZSBBSU9QJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHQgQ2hhbm5lbCBSZWdpc3Rlci4KK1JldHVybjogICB2b2lkCitDb21tZW50czogSWYgYW4gaW50ZXJydXB0IGVuYWJsZSBmbGFnIGlzIHNldCBpbiBGbGFncywgdGhhdCBpbnRlcnJ1cHQgd2lsbCBiZQorICAgICAgICAgIGVuYWJsZWQuICBJZiBhbiBpbnRlcnJ1cHQgZW5hYmxlIGZsYWcgaXMgbm90IHNldCBpbiBGbGFncywgdGhhdAorICAgICAgICAgIGludGVycnVwdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgSW50ZXJydXB0cyBjYW4gYmUgZGlzYWJsZWQgd2l0aAorICAgICAgICAgIGZ1bmN0aW9uIHNEaXNJbnRlcnJ1cHRzKCkuCisKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFwcHJvcHJpYXRlIGJpdCBmb3IgdGhlIGNoYW5uZWwgaW4gdGhlIEFJT1AncworICAgICAgICAgIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIGlmIHRoZSBDSEFOSU5UX0VOIGZsYWcgaXMgc2V0LiAgVGhpcyBhbGxvd3MKKyAgICAgICAgICB0aGlzIGNoYW5uZWwncyBiaXQgdG8gYmUgc2V0IGluIHRoZSBBSU9QJ3MgSW50ZXJydXB0IENoYW5uZWwgUmVnaXN0ZXIuCisKKyAgICAgICAgICBJbnRlcnJ1cHRzIG11c3QgYWxzbyBiZSBnbG9iYWxseSBlbmFibGVkIGJlZm9yZSBjaGFubmVsIGludGVycnVwdHMKKyAgICAgICAgICB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgaG9zdC4gIFRoaXMgaXMgZG9uZSB3aXRoIGZ1bmN0aW9uCisgICAgICAgICAgc0VuR2xvYmFsSW50KCkuCisKKyAgICAgICAgICBJbiBzb21lIGNhc2VzIGl0IG1heSBiZSBkZXNpcmFibGUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIGdsb2JhbGx5IGJ1dAorICAgICAgICAgIGVuYWJsZSBjaGFubmVsIGludGVycnVwdHMuICBUaGlzIHdvdWxkIGFsbG93IHRoZSBnbG9iYWwgaW50ZXJydXB0CisgICAgICAgICAgc3RhdHVzIHJlZ2lzdGVyIHRvIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIEFJT1BzIG5lZWQgc2VydmljZS4KKyovCit2b2lkIHNFbkludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpCit7CisJQnl0ZV90IE1hc2s7CQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworCisJQ2hQLT5SeENvbnRyb2xbMl0gfD0KKwkgICAgKChCeXRlX3QpIEZsYWdzICYgKFJYSU5UX0VOIHwgU1JDSU5UX0VOIHwgTUNJTlRfRU4pKTsKKworCXNPdXREVyhDaFAtPkluZGV4QWRkciwgKihEV29yZF90ICopICYgQ2hQLT5SeENvbnRyb2xbMF0pOworCisJQ2hQLT5UeENvbnRyb2xbMl0gfD0gKChCeXRlX3QpIEZsYWdzICYgVFhJTlRfRU4pOworCisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlR4Q29udHJvbFswXSk7CisKKwlpZiAoRmxhZ3MgJiBDSEFOSU5UX0VOKSB7CisJCU1hc2sgPSBzSW5CKENoUC0+SW50TWFzaykgfCBzQml0TWFwU2V0VGJsW0NoUC0+Q2hhbk51bV07CisJCXNPdXRCKENoUC0+SW50TWFzaywgTWFzayk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0Rpc0ludGVycnVwdHMKK1B1cnBvc2U6ICBEaXNhYmxlIG9uZSBvciBtb3JlIGludGVycnVwdHMgZm9yIGEgY2hhbm5lbAorQ2FsbDogICAgIHNEaXNJbnRlcnJ1cHRzKENoUCxGbGFncykKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgV29yZF90IEZsYWdzOiBJbnRlcnJ1cHQgZmxhZ3MsIGNhbiBiZSBhbnkgY29tYmluYXRpb24KKyAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorICAgICAgICAgICAgICAgIFRYSU5UX0VOOiAgIEludGVycnVwdCBvbiBUeCBGSUZPIGVtcHR5CisgICAgICAgICAgICAgICAgUlhJTlRfRU46ICAgSW50ZXJydXB0IG9uIFJ4IEZJRk8gYXQgdHJpZ2dlciBsZXZlbCAoc2VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1NldFJ4VHJpZ2dlcigpKQorICAgICAgICAgICAgICAgIFNSQ0lOVF9FTjogIEludGVycnVwdCBvbiBTUkMgKFNwZWNpYWwgUnggQ29uZGl0aW9uKQorICAgICAgICAgICAgICAgIE1DSU5UX0VOOiAgIEludGVycnVwdCBvbiBtb2RlbSBpbnB1dCBjaGFuZ2UKKyAgICAgICAgICAgICAgICBDSEFOSU5UX0VOOiBEaXNhYmxlIGNoYW5uZWwgaW50ZXJydXB0IHNpZ25hbCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSU9QJ3MgSW50ZXJydXB0IENoYW5uZWwgUmVnaXN0ZXIuCitSZXR1cm46ICAgdm9pZAorQ29tbWVudHM6IElmIGFuIGludGVycnVwdCBmbGFnIGlzIHNldCBpbiBGbGFncywgdGhhdCBpbnRlcnJ1cHQgd2lsbCBiZQorICAgICAgICAgIGRpc2FibGVkLiAgSWYgYW4gaW50ZXJydXB0IGZsYWcgaXMgbm90IHNldCBpbiBGbGFncywgdGhhdAorICAgICAgICAgIGludGVycnVwdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgSW50ZXJydXB0cyBjYW4gYmUgZW5hYmxlZCB3aXRoCisgICAgICAgICAgZnVuY3Rpb24gc0VuSW50ZXJydXB0cygpLgorCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGFwcHJvcHJpYXRlIGJpdCBmb3IgdGhlIGNoYW5uZWwgaW4gdGhlIEFJT1AncworICAgICAgICAgIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIGlmIHRoZSBDSEFOSU5UX0VOIGZsYWcgaXMgc2V0LiAgVGhpcyBibG9ja3MKKyAgICAgICAgICB0aGlzIGNoYW5uZWwncyBiaXQgZnJvbSBiZWluZyBzZXQgaW4gdGhlIEFJT1AncyBJbnRlcnJ1cHQgQ2hhbm5lbAorICAgICAgICAgIFJlZ2lzdGVyLgorKi8KK3ZvaWQgc0Rpc0ludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpCit7CisJQnl0ZV90IE1hc2s7CQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworCisJQ2hQLT5SeENvbnRyb2xbMl0gJj0KKwkgICAgfigoQnl0ZV90KSBGbGFncyAmIChSWElOVF9FTiB8IFNSQ0lOVF9FTiB8IE1DSU5UX0VOKSk7CisJc091dERXKENoUC0+SW5kZXhBZGRyLCAqKERXb3JkX3QgKikgJiBDaFAtPlJ4Q29udHJvbFswXSk7CisJQ2hQLT5UeENvbnRyb2xbMl0gJj0gfigoQnl0ZV90KSBGbGFncyAmIFRYSU5UX0VOKTsKKwlzT3V0RFcoQ2hQLT5JbmRleEFkZHIsICooRFdvcmRfdCAqKSAmIENoUC0+VHhDb250cm9sWzBdKTsKKworCWlmIChGbGFncyAmIENIQU5JTlRfRU4pIHsKKwkJTWFzayA9IHNJbkIoQ2hQLT5JbnRNYXNrKSAmIHNCaXRNYXBDbHJUYmxbQ2hQLT5DaGFuTnVtXTsKKwkJc091dEIoQ2hQLT5JbnRNYXNrLCBNYXNrKTsKKwl9Cit9CisKK3ZvaWQgc1NldEludGVyZmFjZU1vZGUoQ0hBTk5FTF9UICogQ2hQLCBCeXRlX3QgbW9kZSkKK3sKKwlzT3V0QihDaFAtPkN0bFAtPkFpb3BJT1syXSwgKG1vZGUgJiAweDE4KSB8IENoUC0+Q2hhbk51bSk7Cit9CisKKy8qCisgKiAgTm90IGFuIG9mZmljaWFsIFNTQ0kgZnVuY3Rpb24sIGJ1dCBob3cgdG8gcmVzZXQgUm9ja2V0TW9kZW1zLgorICogIElTQSBidXMgdmVyc2lvbgorICovCit2b2lkIHNNb2RlbVJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBjaGFuLCBpbnQgb24pCit7CisJQnl0ZUlPX3QgYWRkcjsKKwlCeXRlX3QgdmFsOworCisJYWRkciA9IEN0bFAtPkFpb3BJT1swXSArIDB4NDAwOworCXZhbCA9IHNJbkIoQ3RsUC0+TVJlZzNJTyk7CisJLyogaWYgQUlPUFsxXSBpcyBub3QgZW5hYmxlZCwgZW5hYmxlIGl0ICovCisJaWYgKCh2YWwgJiAyKSA9PSAwKSB7CisJCXZhbCA9IHNJbkIoQ3RsUC0+TVJlZzJJTyk7CisJCXNPdXRCKEN0bFAtPk1SZWcySU8sICh2YWwgJiAweGZjKSB8ICgxICYgMHgwMykpOworCQlzT3V0QihDdGxQLT5NQmFzZUlPLCAodW5zaWduZWQgY2hhcikgKGFkZHIgPj4gNikpOworCX0KKworCXNFbkFpb3AoQ3RsUCwgMSk7CisJaWYgKCFvbikKKwkJYWRkciArPSA4OworCXNPdXRCKGFkZHIgKyBjaGFuLCAwKTsJLyogYXBwbHkgb3IgcmVtb3ZlIHJlc2V0ICovCisJc0Rpc0Fpb3AoQ3RsUCwgMSk7Cit9CisKKy8qCisgKiAgTm90IGFuIG9mZmljaWFsIFNTQ0kgZnVuY3Rpb24sIGJ1dCBob3cgdG8gcmVzZXQgUm9ja2V0TW9kZW1zLgorICogIFBDSSBidXMgdmVyc2lvbgorICovCit2b2lkIHNQQ0lNb2RlbVJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBjaGFuLCBpbnQgb24pCit7CisJQnl0ZUlPX3QgYWRkcjsKKworCWFkZHIgPSBDdGxQLT5BaW9wSU9bMF0gKyAweDQwOwkvKiAybmQgQUlPUCAqLworCWlmICghb24pCisJCWFkZHIgKz0gODsKKwlzT3V0QihhZGRyICsgY2hhbiwgMCk7CS8qIGFwcGx5IG9yIHJlbW92ZSByZXNldCAqLworfQorCisvKiAgUmVzZXRzIHRoZSBzcGVha2VyIGNvbnRyb2xsZXIgb24gUm9ja2V0TW9kZW0gSUkgYW5kIElJSSBkZXZpY2VzICovCitzdGF0aWMgdm9pZCBybVNwZWFrZXJSZXNldChDT05UUk9MTEVSX1QgKiBDdGxQLCB1bnNpZ25lZCBsb25nIG1vZGVsKQoreworCUJ5dGVJT190IGFkZHI7CisKKwkvKiBSb2NrZXRNb2RlbSBJSSBzcGVha2VyIGNvbnRyb2wgaXMgYXQgdGhlIDh0aCBwb3J0IGxvY2F0aW9uIG9mIG9mZnNldCAweDQwICovCisJaWYgKChtb2RlbCA9PSBNT0RFTF9SUDRNKSB8fCAobW9kZWwgPT0gTU9ERUxfUlA2TSkpIHsKKwkJYWRkciA9IEN0bFAtPkFpb3BJT1swXSArIDB4NEY7CisJCXNPdXRCKGFkZHIsIDApOworCX0KKworCS8qIFJvY2tldE1vZGVtIElJSSBzcGVha2VyIGNvbnRyb2wgaXMgYXQgdGhlIDFzdCBwb3J0IGxvY2F0aW9uIG9mIG9mZnNldCAweDgwICovCisJaWYgKChtb2RlbCA9PSBNT0RFTF9VUENJX1JNM184UE9SVCkKKwkgICAgfHwgKG1vZGVsID09IE1PREVMX1VQQ0lfUk0zXzRQT1JUKSkgeworCQlhZGRyID0gQ3RsUC0+QWlvcElPWzBdICsgMHg4ODsKKwkJc091dEIoYWRkciwgMCk7CisJfQorfQorCisvKiAgUmV0dXJucyB0aGUgbGluZSBudW1iZXIgZ2l2ZW4gdGhlIGNvbnRyb2xsZXIgKGJvYXJkKSwgYWlvcCBhbmQgY2hhbm5lbCBudW1iZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIEdldExpbmVOdW1iZXIoaW50IGN0cmwsIGludCBhaW9wLCBpbnQgY2gpCit7CisJcmV0dXJuIGxpbmVOdW1iZXJzWyhjdHJsIDw8IDUpIHwgKGFpb3AgPDwgMykgfCBjaF07Cit9CisKKy8qCisgKiAgU3RvcmVzIHRoZSBsaW5lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBjb250cm9sbGVyIChib2FyZCksIGFpb3AKKyAqICBhbmQgY2hhbm5lbCBudW1iZXIuICAKKyAqICBSZXR1cm5zOiAgVGhlIGxpbmUgbnVtYmVyIGFzc2lnbmVkIAorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBTZXRMaW5lTnVtYmVyKGludCBjdHJsLCBpbnQgYWlvcCwgaW50IGNoKQoreworCWxpbmVOdW1iZXJzWyhjdHJsIDw8IDUpIHwgKGFpb3AgPDwgMykgfCBjaF0gPSBuZXh0TGluZU51bWJlcisrOworCXJldHVybiAobmV4dExpbmVOdW1iZXIgLSAxKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXQuaCBiL2RyaXZlcnMvY2hhci9yb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTZiMDRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogcm9ja2V0LmggLS0tIHRoZSBleHBvcnRlZCBpbnRlcmZhY2Ugb2YgdGhlIHJvY2tldCBkcml2ZXIgdG8gaXRzIGNvbmZpZ3VyYXRpb24gcHJvZ3JhbS4KKyAqCisgKiBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIENvcHlyaWdodCAxOTk3LgorICogQ29weXJpZ2h0IDE5OTcgQ29tdHJvbCBDb3Jwb3JhdGlvbi4gCisgKgorICovCisKKy8qICBNb2RlbCBJbmZvcm1hdGlvbiBTdHJ1Y3QgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1vZGVsOworCWNoYXIgbW9kZWxTdHJpbmdbODBdOworCXVuc2lnbmVkIGxvbmcgbnVtUG9ydHM7CisJaW50IGxvYWRybTI7CisJaW50IHN0YXJ0aW5nUG9ydE51bWJlcjsKK30gcm9ja2V0TW9kZWxfdDsKKworc3RydWN0IHJvY2tldF9jb25maWcgeworCWludCBsaW5lOworCWludCBmbGFnczsKKwlpbnQgY2xvc2luZ193YWl0OworCWludCBjbG9zZV9kZWxheTsKKwlpbnQgcG9ydDsKKwlpbnQgcmVzZXJ2ZWRbMzJdOworfTsKKworc3RydWN0IHJvY2tldF9wb3J0cyB7CisJaW50IHR0eV9tYWpvcjsKKwlpbnQgY2FsbG91dF9tYWpvcjsKKwlyb2NrZXRNb2RlbF90IHJvY2tldE1vZGVsWzhdOworfTsKKworc3RydWN0IHJvY2tldF92ZXJzaW9uIHsKKwljaGFyIHJvY2tldF92ZXJzaW9uWzMyXTsKKwljaGFyIHJvY2tldF9kYXRlWzMyXTsKKwljaGFyIHJlc2VydmVkWzY0XTsKK307CisKKy8qCisgKiBSb2NrZXRwb3J0IGZsYWdzCisgKi8KKyNkZWZpbmUgUk9DS0VUX0NBTExPVVRfTk9IVVAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBST0NLRVRfRk9SQ0VfQ0QJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUk9DS0VUX0hVUF9OT1RJRlkJMHgwMDAwMDAwNAorI2RlZmluZSBST0NLRVRfU1BMSVRfVEVSTUlPUwkweDAwMDAwMDA4CisjZGVmaW5lIFJPQ0tFVF9TUERfTUFTSwkJMHgwMDAwMDA3MAorI2RlZmluZSBST0NLRVRfU1BEX0hJCQkweDAwMDAwMDEwCS8qIFVzZSA1NjAwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBST0NLRVRfU1BEX1ZISQkJMHgwMDAwMDAyMAkvKiBVc2UgMTE1MjAwIGluc3RlYWQgb2YgMzg0MDAgYnBzICovCisjZGVmaW5lIFJPQ0tFVF9TUERfU0hJCQkweDAwMDAwMDMwCS8qIFVzZSAyMzA0MDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KKyNkZWZpbmUgUk9DS0VUX1NQRF9XQVJQCSAgICAgICAgMHgwMDAwMDA0MAkvKiBVc2UgNDYwODAwIGluc3RlYWQgb2YgMzg0MDAgYnBzICovCisjZGVmaW5lIFJPQ0tFVF9TQUsJCTB4MDAwMDAwODAKKyNkZWZpbmUgUk9DS0VUX1NFU1NJT05fTE9DS09VVAkweDAwMDAwMTAwCisjZGVmaW5lIFJPQ0tFVF9QR1JQX0xPQ0tPVVQJMHgwMDAwMDIwMAorI2RlZmluZSBST0NLRVRfUlRTX1RPR0dMRQkweDAwMDAwNDAwCisjZGVmaW5lIFJPQ0tFVF9NT0RFX01BU0sgICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgUk9DS0VUX01PREVfUlMyMzIgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBST0NLRVRfTU9ERV9SUzQ4NSAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFJPQ0tFVF9NT0RFX1JTNDIyICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUk9DS0VUX0ZMQUdTCQkweDAwMDAzRkZGCisKKyNkZWZpbmUgUk9DS0VUX1VTUl9NQVNLIDB4MDA3MQkvKiBMZWdhbCBmbGFncyB0aGF0IG5vbi1wcml2aWxlZ2VkCisJCQkJICogdXNlcnMgY2FuIHNldCBvciByZXNldCAqLworCisvKgorICogRm9yIGNsb3Npbmdfd2FpdCBhbmQgY2xvc2luZ193YWl0MgorICovCisjZGVmaW5lIFJPQ0tFVF9DTE9TSU5HX1dBSVRfTk9ORQk2NTUzNQorI2RlZmluZSBST0NLRVRfQ0xPU0lOR19XQUlUX0lORgkJMAorCisvKgorICogUm9ja2V0cG9ydCBpb2N0bHMgLS0gIlJQIgorICovCisjZGVmaW5lIFJDS1BfR0VUX1NUUlVDVAkJMHgwMDUyNTAwMQorI2RlZmluZSBSQ0tQX0dFVF9DT05GSUcJCTB4MDA1MjUwMDIKKyNkZWZpbmUgUkNLUF9TRVRfQ09ORklHCQkweDAwNTI1MDAzCisjZGVmaW5lIFJDS1BfR0VUX1BPUlRTCQkweDAwNTI1MDA0CisjZGVmaW5lIFJDS1BfUkVTRVRfUk0yCQkweDAwNTI1MDA1CisjZGVmaW5lIFJDS1BfR0VUX1ZFUlNJT04JMHgwMDUyNTAwNgorCisvKiAgUm9ja2V0cG9ydCBNb2RlbHMgKi8KKyNkZWZpbmUgTU9ERUxfUlAzMklOVEYgICAgICAgIDB4MDAwMQkvKiBSUCAzMiBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgKi8KKyNkZWZpbmUgTU9ERUxfUlA4SU5URiAgICAgICAgIDB4MDAwMgkvKiBSUCA4IHBvcnQgdy9leHRlcm5hbCBJL0YgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlAxNklOVEYgICAgICAgIDB4MDAwMwkvKiBSUCAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgKi8KKyNkZWZpbmUgTU9ERUxfUlA4T0NUQSAgICAgICAgIDB4MDAwNQkvKiBSUCA4IHBvcnQgdy9vY3RhIGNhYmxlICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlA0UVVBRCAgICAgICAgIDB4MDAwNAkvKiBSUCA0IHBvcnQgdy9xdWFkIGNhYmxlICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlA4SiAgICAgICAgICAgIDB4MDAwNgkvKiBSUCA4IHBvcnQgdy9SSjExIGNvbm5lY3RvcnMgKi8KKyNkZWZpbmUgTU9ERUxfUlA0SiAgICAgICAgICAgIDB4MDAwNwkvKiBSUCA0IHBvcnQgdy9SSjQ1IGNvbm5lY3RvcnMgKi8KKyNkZWZpbmUgTU9ERUxfUlA4U05JICAgICAgICAgIDB4MDAwOAkvKiBSUCA4IHBvcnQgdy8gREI3OCBTTkkgY29ubmVjdG9yICovCisjZGVmaW5lIE1PREVMX1JQMTZTTkkgICAgICAgICAweDAwMDkJLyogUlAgMTYgcG9ydCB3LyBEQjc4IFNOSSBjb25uZWN0b3IgKi8KKyNkZWZpbmUgTU9ERUxfUlBQNCAgICAgICAgICAgIDB4MDAwQQkvKiBSUCBQbHVzIDQgcG9ydCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlBQOCAgICAgICAgICAgIDB4MDAwQgkvKiBSUCBQbHVzIDggcG9ydCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlAyXzIzMiAgICAgICAgIDB4MDAwRQkvKiBSUCBQbHVzIDIgcG9ydCBSUzIzMiAgICAgICAgKi8KKyNkZWZpbmUgTU9ERUxfUlAyXzQyMiAgICAgICAgIDB4MDAwRgkvKiBSUCBQbHVzIDIgcG9ydCBSUzIzMiAgICAgICAgKi8KKworLyogIFJvY2tldG1vZGVtIElJIE1vZGVscyAqLworI2RlZmluZSBNT0RFTF9SUDZNICAgICAgICAgICAgMHgwMDBDCS8qIFJNIDYgcG9ydCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNT0RFTF9SUDRNICAgICAgICAgICAgMHgwMDBECS8qIFJNIDQgcG9ydCAgICAgICAgICAgICAgICAgICAqLworCisvKiBVbml2ZXJzYWwgUENJIGJvYXJkcyAqLworI2RlZmluZSBNT0RFTF9VUENJX1JQMzJJTlRGICAgMHgwODAxCS8qIFJQIFVQQ0kgMzIgcG9ydCB3L2V4dGVybmFsIEkvRiAgICAgKi8KKyNkZWZpbmUgTU9ERUxfVVBDSV9SUDhJTlRGICAgIDB4MDgwMgkvKiBSUCBVUENJIDggcG9ydCB3L2V4dGVybmFsIEkvRiAgICAgICovCisjZGVmaW5lIE1PREVMX1VQQ0lfUlAxNklOVEYgICAweDA4MDMJLyogUlAgVVBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgICAqLworI2RlZmluZSBNT0RFTF9VUENJX1JQOE9DVEEgICAgMHgwODA1CS8qIFJQIFVQQ0kgOCBwb3J0IHcvb2N0YSBjYWJsZSAgICAgICAgKi8gCisjZGVmaW5lIE1PREVMX1VQQ0lfUk0zXzhQT1JUICAweDA4MEMJLyogUlAgVVBDSSBSb2NrZXRtb2RlbSBJSUkgOCBwb3J0ICAgICAqLworI2RlZmluZSBNT0RFTF9VUENJX1JNM180UE9SVCAgMHgwODBDCS8qIFJQIFVQQ0kgUm9ja2V0bW9kZW0gSUlJIDQgcG9ydCAgICAgKi8KKworLyogIENvbXBhY3QgUENJIDE2IHBvcnQgICovCisjZGVmaW5lIE1PREVMX0NQQ0lfUlAxNklOVEYgICAweDA5MDMJLyogUlAgQ29tcGFjdCBQQ0kgMTYgcG9ydCB3L2V4dGVybmFsIEkvRiAqLworCisvKiBBbGwgSVNBIGJvYXJkcyAqLworI2RlZmluZSBNT0RFTF9JU0EgICAgICAgICAgICAgMHgxMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcm9ja2V0X2ludC5oIGIvZHJpdmVycy9jaGFyL3JvY2tldF9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI2ODcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldF9pbnQuaApAQCAtMCwwICsxLDEyOTYgQEAKKy8qCisgKiByb2NrZXRfaW50LmggLS0tIGludGVybmFsIGhlYWRlciBmaWxlIGZvciByb2NrZXQuYworICoKKyAqIFdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgQ29weXJpZ2h0IDE5OTcuCisgKiBDb3B5cmlnaHQgMTk5NyBDb210cm9sIENvcnBvcmF0aW9uLiAgCisgKiAKKyAqLworCisvKgorICogRGVmaW5pdGlvbiBvZiB0aGUgdHlwZXMgaW4gcmNrdHB0X3R5cGUKKyAqLworI2RlZmluZSBST0NLRVRfVFlQRV9OT1JNQUwJMAorI2RlZmluZSBST0NLRVRfVFlQRV9NT0RFTQkxCisjZGVmaW5lIFJPQ0tFVF9UWVBFX01PREVNSUkJMgorI2RlZmluZSBST0NLRVRfVFlQRV9NT0RFTUlJSQkzCisjZGVmaW5lIFJPQ0tFVF9UWVBFX1BDMTA0ICAgICAgIDQKKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJ5dGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEJ5dGVJT190OworCit0eXBlZGVmIHVuc2lnbmVkIGludCBXb3JkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBXb3JkSU9fdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIERXb3JkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBEV29yZElPX3Q7CisKKy8qCisgKiBOb3RlISAgTm9ybWFsbHkgdGhlIExpbnV4IEkvTyBtYWNyb3MgYWxyZWFkeSB0YWtlIGNhcmUgb2YKKyAqIGJ5dGUtc3dhcHBpbmcgdGhlIEkvTyBpbnN0cnVjdGlvbnMuICBIb3dldmVyLCBhbGwgYWNjZXNzZXMgdXNpbmcKKyAqIHNPdXREVyBhcmVuJ3QgcmVhbGx5IDMyLWJpdCBhY2Nlc3NlcywgYnV0IHNob3VsZCBiZSBoYW5kbGVkIGluIGJ5dGUKKyAqIG9yZGVyLiAgSGVuY2UgdGhlIHVzZSBvZiB0aGUgY3B1X3RvX2xlMzIoKSBtYWNybyB0byBieXRlLXN3YXAKKyAqIHRoaW5ncyB0byBuby1vcCB0aGUgYnl0ZSBzd2FwcGluZyBkb25lIGJ5IHRoZSBiaWctZW5kaWFuIG91dGwoKQorICogaW5zdHJ1Y3Rpb24uCisgKi8KKworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTworc3RhdGljIGlubGluZSB2b2lkIHNPdXRCKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisjaWZkZWYgUk9DS0VUX0RFQlVHX0lPCisJcHJpbnRrKCJzT3V0QigleCwgJXgpLi4uIiwgcG9ydCwgdmFsdWUpOworI2VuZGlmCisJb3V0Yl9wKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNPdXRXKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworI2lmZGVmIFJPQ0tFVF9ERUJVR19JTworCXByaW50aygic091dFcoJXgsICV4KS4uLiIsIHBvcnQsIHZhbHVlKTsKKyNlbmRpZgorCW91dHdfcCh2YWx1ZSwgcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzT3V0RFcodW5zaWduZWQgc2hvcnQgcG9ydCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKyNpZmRlZiBST0NLRVRfREVCVUdfSU8KKwlwcmludGsoInNPdXREVygleCwgJWx4KS4uLiIsIHBvcnQsIHZhbHVlKTsKKyNlbmRpZgorCW91dGxfcChjcHVfdG9fbGUzMih2YWx1ZSksIHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc0luQih1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXJldHVybiBpbmJfcChwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBzSW5XKHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJcmV0dXJuIGlud19wKHBvcnQpOworfQorCisjZWxzZQkJCQkvKiAhUk9DS0VUX0RFQlVHX0lPICovCisjZGVmaW5lIHNPdXRCKGEsIGIpIG91dGJfcChiLCBhKQorI2RlZmluZSBzT3V0VyhhLCBiKSBvdXR3X3AoYiwgYSkKKyNkZWZpbmUgc091dERXKHBvcnQsIHZhbHVlKSBvdXRsX3AoY3B1X3RvX2xlMzIodmFsdWUpLCBwb3J0KQorI2RlZmluZSBzSW5CKGEpIChpbmJfcChhKSkKKyNkZWZpbmUgc0luVyhhKSAoaW53X3AoYSkpCisjZW5kaWYJCQkJLyogUk9DS0VUX0RFQlVHX0lPICovCisKKy8qIFRoaXMgaXMgdXNlZCB0byBtb3ZlIGFycmF5cyBvZiBieXRlcyBzbyBieXRlIHN3YXBwaW5nIGlzbid0IGFwcHJvcHJpYXRlLiAqLworI2RlZmluZSBzT3V0U3RyVyhwb3J0LCBhZGRyLCBjb3VudCkgaWYgKGNvdW50KSBvdXRzdyhwb3J0LCBhZGRyLCBjb3VudCkKKyNkZWZpbmUgc0luU3RyVyhwb3J0LCBhZGRyLCBjb3VudCkgaWYgKGNvdW50KSBpbnN3KHBvcnQsIGFkZHIsIGNvdW50KQorCisjZGVmaW5lIENUTF9TSVpFIDgKKyNkZWZpbmUgQUlPUF9DVExfU0laRSA0CisjZGVmaW5lIENIQU5fQUlPUF9TSVpFIDgKKyNkZWZpbmUgTUFYX1BPUlRTX1BFUl9BSU9QIDgKKyNkZWZpbmUgTUFYX0FJT1BTX1BFUl9CT0FSRCA0CisjZGVmaW5lIE1BWF9QT1JUU19QRVJfQk9BUkQgMzIKKworLyogQnVzIHR5cGUgSUQgKi8KKyNkZWZpbmUJaXNJU0EJMAorI2RlZmluZQlpc1BDSQkxCisjZGVmaW5lCWlzTUMJMgorCisvKiBDb250cm9sbGVyIElEIG51bWJlcnMgKi8KKyNkZWZpbmUgQ1RMSURfTlVMTCAgLTEJCS8qIG5vIGNvbnRyb2xsZXIgZXhpc3RzICovCisjZGVmaW5lIENUTElEXzAwMDEgIDB4MDAwMQkvKiBjb250cm9sbGVyIHJlbGVhc2UgMSAqLworCisvKiBBSU9QIElEIG51bWJlcnMsIGlkZW50aWZpZXMgQUlPUCB0eXBlIGltcGxlbWVudGluZyBjaGFubmVsICovCisjZGVmaW5lIEFJT1BJRF9OVUxMIC0xCQkvKiBubyBBSU9QIG9yIGNoYW5uZWwgZXhpc3RzICovCisjZGVmaW5lIEFJT1BJRF8wMDAxIDB4MDAwMQkvKiBBSU9QIHJlbGVhc2UgMSAqLworCisjZGVmaW5lIE5VTExERVYgLTEJCS8qIGlkZW50aWZpZXMgbm9uLWV4aXN0YW50IGRldmljZSAqLworI2RlZmluZSBOVUxMQ1RMIC0xCQkvKiBpZGVudGlmaWVzIG5vbi1leGlzdGFudCBjb250cm9sbGVyICovCisjZGVmaW5lIE5VTExDVExQVFIgKENPTlRST0xMRVJfVCAqKTAJLyogaWRlbnRpZmllcyBub24tZXhpc3RhbnQgY29udHJvbGxlciAqLworI2RlZmluZSBOVUxMQUlPUCAtMQkJLyogaWRlbnRpZmllcyBub24tZXhpc3RhbnQgQUlPUCAqLworI2RlZmluZSBOVUxMQ0hBTiAtMQkJLyogaWRlbnRpZmllcyBub24tZXhpc3RhbnQgY2hhbm5lbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgR2xvYmFsIFJlZ2lzdGVyIE9mZnNldHMgLSBEaXJlY3QgQWNjZXNzIC0gRml4ZWQgdmFsdWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX0NNRF9SRUcgICAweDM4CQkvKiBDb21tYW5kIFJlZ2lzdGVyICAgICAgICAgICAgOCAgICBXcml0ZSAqLworI2RlZmluZSBfSU5UX0NIQU4gIDB4MzkJCS8qIEludGVycnVwdCBDaGFubmVsIFJlZ2lzdGVyICA4ICAgIFJlYWQgKi8KKyNkZWZpbmUgX0lOVF9NQVNLICAweDNBCQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAgICAgOCAgICBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1VOVVNFRCAgICAweDNCCQkvKiBVbnVzZWQgICAgICAgICAgICAgICAgICAgICAgOCAqLworI2RlZmluZSBfSU5EWF9BRERSIDB4M0MJCS8qIEluZGV4IFJlZ2lzdGVyIEFkZHJlc3MgICAgICAxNiAgIFdyaXRlICovCisjZGVmaW5lIF9JTkRYX0RBVEEgMHgzRQkJLyogSW5kZXggUmVnaXN0ZXIgRGF0YSAgICAgICAgIDgvMTYgUmVhZCAvIFdyaXRlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBDaGFubmVsIFJlZ2lzdGVyIE9mZnNldHMgZm9yIDFzdCBjaGFubmVsIGluIEFJT1AgLSBEaXJlY3QgQWNjZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9URDAgICAgICAgMHgwMAkJLyogVHJhbnNtaXQgRGF0YSAgICAgICAgICAgICAgIDE2ICAgV3JpdGUgKi8KKyNkZWZpbmUgX1JEMCAgICAgICAweDAwCQkvKiBSZWNlaXZlIERhdGEgICAgICAgICAgICAgICAgMTYgICBSZWFkICovCisjZGVmaW5lIF9DSE5fU1RBVDAgMHgyMAkJLyogQ2hhbm5lbCBTdGF0dXMgICAgICAgICAgICAgIDgvMTYgUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9GSUZPX0NOVDAgMHgxMAkJLyogVHJhbnNtaXQvUmVjZWl2ZSBGSUZPIENvdW50IDE2ICAgUmVhZCAqLworI2RlZmluZSBfSU5UX0lEMCAgIDB4MzAJCS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiAgICA4ICAgIFJlYWQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFR4IENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0cyAtIEluZGV4ZWQgLSBFeHRlcm5hbCAtIEZpeGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF9UWF9FTkJMUyAgMHg5ODAJLyogVHggUHJvY2Vzc29yIEVuYWJsZXMgUmVnaXN0ZXIgOCBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1RYQ01QMSAgICAweDk4OAkvKiBUcmFuc21pdCBDb21wYXJlIFZhbHVlICMxICAgICA4IFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhDTVAyICAgIDB4OTg5CS8qIFRyYW5zbWl0IENvbXBhcmUgVmFsdWUgIzIgICAgIDggUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9UWFJFUDFCMSAgMHg5OEEJLyogVHggUmVwbGFjZSBWYWx1ZSAjMSAtIEJ5dGUgMSAgOCBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1RYUkVQMUIyICAweDk4QgkvKiBUeCBSZXBsYWNlIFZhbHVlICMxIC0gQnl0ZSAyICA4IFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhSRVAyICAgIDB4OThDCS8qIFRyYW5zbWl0IFJlcGxhY2UgVmFsdWUgIzIgICAgIDggUmVhZCAvIFdyaXRlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01lbW9yeSBDb250cm9sbGVyIFJlZ2lzdGVyIE9mZnNldHMgLSBJbmRleGVkIC0gRXh0ZXJuYWwgLSBGaXhlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBfUlhfRklGTyAgICAweDAwMAkvKiBSeCBGSUZPICovCisjZGVmaW5lIF9UWF9GSUZPICAgIDB4ODAwCS8qIFR4IEZJRk8gKi8KKyNkZWZpbmUgX1JYRl9PVVRQICAgMHg5OTAJLyogUnggRklGTyBPVVQgcG9pbnRlciAgICAgICAgMTYgUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9SWEZfSU5QICAgIDB4OTkyCS8qIFJ4IEZJRk8gSU4gcG9pbnRlciAgICAgICAgIDE2IFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhGX09VVFAgICAweDk5NAkvKiBUeCBGSUZPIE9VVCBwb2ludGVyICAgICAgICA4ICBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgX1RYRl9JTlAgICAgMHg5OTUJLyogVHggRklGTyBJTiBwb2ludGVyICAgICAgICAgOCAgUmVhZCAvIFdyaXRlICovCisjZGVmaW5lIF9UWFBfQ05UICAgIDB4OTk2CS8qIFR4IFByaW9yaXR5IENvdW50ICAgICAgICAgIDggIFJlYWQgLyBXcml0ZSAqLworI2RlZmluZSBfVFhQX1BOVFIgICAweDk5NwkvKiBUeCBQcmlvcml0eSBQb2ludGVyICAgICAgICA4ICBSZWFkIC8gV3JpdGUgKi8KKworI2RlZmluZSBQUklfUEVORCAgICAweDgwCS8qIFByaW9yaXR5IGRhdGEgcGVuZGluZyAoYml0NywgVHggcHJpIGNudCkgKi8KKyNkZWZpbmUgVFhGSUZPX1NJWkUgMjU1CQkvKiBzaXplIG9mIFR4IEZJRk8gKi8KKyNkZWZpbmUgUlhGSUZPX1NJWkUgMTAyMwkvKiBzaXplIG9mIFJ4IEZJRk8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVHggUHJpb3JpdHkgQnVmZmVyIC0gSW5kZXhlZCAtIEV4dGVybmFsIC0gRml4ZWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgX1RYUF9CVUYgICAgMHg5QzAJLyogVHggUHJpb3JpdHkgQnVmZmVyICAzMiAgQnl0ZXMgICBSZWFkIC8gV3JpdGUgKi8KKyNkZWZpbmUgVFhQX1NJWkUgICAgMHgyMAkvKiAzMiBieXRlcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDaGFubmVsIFJlZ2lzdGVyIE9mZnNldHMgLSBJbmRleGVkIC0gSW50ZXJuYWwgLSBGaXhlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9UWF9DVFJMICAgIDB4RkYwCS8qIFRyYW5zbWl0IENvbnRyb2wgICAgICAgICAgICAgICAxNiAgV3JpdGUgKi8KKyNkZWZpbmUgX1JYX0NUUkwgICAgMHhGRjIJLyogUmVjZWl2ZSBDb250cm9sICAgICAgICAgICAgICAgICA4ICBXcml0ZSAqLworI2RlZmluZSBfQkFVRCAgICAgICAweEZGNAkvKiBCYXVkIFJhdGUgICAgICAgICAgICAgICAgICAgICAgMTYgIFdyaXRlICovCisjZGVmaW5lIF9DTEtfUFJFICAgIDB4RkY2CS8qIENsb2NrIFByZXNjYWxlciAgICAgICAgICAgICAgICAgOCAgV3JpdGUgKi8KKworI2RlZmluZSBTVE1CUkVBSyAgIDB4MDgJCS8qIEJSRUFLICovCisjZGVmaW5lIFNUTUZSQU1FICAgMHgwNAkJLyogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBTVE1SQ1ZST1ZSIDB4MDIJCS8qIHJlY2VpdmVyIG92ZXIgcnVuIGVycm9yICovCisjZGVmaW5lIFNUTVBBUklUWSAgMHgwMQkJLyogcGFyaXR5IGVycm9yICovCisjZGVmaW5lIFNUTUVSUk9SICAgKFNUTUJSRUFLIHwgU1RNRlJBTUUgfCBTVE1QQVJJVFkpCisjZGVmaW5lIFNUTUJSRUFLSCAgIDB4ODAwCS8qIEJSRUFLICovCisjZGVmaW5lIFNUTUZSQU1FSCAgIDB4NDAwCS8qIGZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgU1RNUkNWUk9WUkggMHgyMDAJLyogcmVjZWl2ZXIgb3ZlciBydW4gZXJyb3IgKi8KKyNkZWZpbmUgU1RNUEFSSVRZSCAgMHgxMDAJLyogcGFyaXR5IGVycm9yICovCisjZGVmaW5lIFNUTUVSUk9SSCAgIChTVE1CUkVBS0ggfCBTVE1GUkFNRUggfCBTVE1QQVJJVFlIKQorCisjZGVmaW5lIENUU19BQ1QgICAweDIwCQkvKiBDVFMgaW5wdXQgYXNzZXJ0ZWQgKi8KKyNkZWZpbmUgRFNSX0FDVCAgIDB4MTAJCS8qIERTUiBpbnB1dCBhc3NlcnRlZCAqLworI2RlZmluZSBDRF9BQ1QgICAgMHgwOAkJLyogQ0QgaW5wdXQgYXNzZXJ0ZWQgKi8KKyNkZWZpbmUgVFhGSUZPTVQgIDB4MDQJCS8qIFR4IEZJRk8gaXMgZW1wdHkgKi8KKyNkZWZpbmUgVFhTSFJNVCAgIDB4MDIJCS8qIFR4IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5ICovCisjZGVmaW5lIFJEQSAgICAgICAweDAxCQkvKiBSeCBkYXRhIGF2YWlsYWJsZSAqLworI2RlZmluZSBEUkFJTkVEIChUWEZJRk9NVCB8IFRYU0hSTVQpCS8qIGluZGljYXRlcyBUeCBpcyBkcmFpbmVkICovCisKKyNkZWZpbmUgU1RBVE1PREUgIDB4ODAwMAkvKiBzdGF0dXMgbW9kZSBlbmFibGUgYml0ICovCisjZGVmaW5lIFJYRk9WRVJGTCAweDIwMDAJLyogcmVjZWl2ZSBGSUZPIG92ZXJmbG93ICovCisjZGVmaW5lIFJYMk1BVENIICAweDEwMDAJLyogcmVjZWl2ZSBjb21wYXJlIGJ5dGUgMiBtYXRjaCAqLworI2RlZmluZSBSWDFNQVRDSCAgMHgwODAwCS8qIHJlY2VpdmUgY29tcGFyZSBieXRlIDEgbWF0Y2ggKi8KKyNkZWZpbmUgUlhCUkVBSyAgIDB4MDQwMAkvKiByZWNlaXZlZCBCUkVBSyAqLworI2RlZmluZSBSWEZSQU1FICAgMHgwMjAwCS8qIHJlY2VpdmVkIGZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgUlhQQVJJVFkgIDB4MDEwMAkvKiByZWNlaXZlZCBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgU1RBVEVSUk9SIChSWEJSRUFLIHwgUlhGUkFNRSB8IFJYUEFSSVRZKQorCisjZGVmaW5lIENUU0ZDX0VOICAweDgwCQkvKiBDVFMgZmxvdyBjb250cm9sIGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgUlRTVE9HX0VOIDB4NDAJCS8qIFJUUyB0b2dnbGUgZW5hYmxlIGJpdCAqLworI2RlZmluZSBUWElOVF9FTiAgMHgxMAkJLyogdHJhbnNtaXQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBTVE9QMiAgICAgMHgwOAkJLyogZW5hYmxlIDIgc3RvcCBiaXRzICgwID0gMSBzdG9wKSAqLworI2RlZmluZSBQQVJJVFlfRU4gMHgwNAkJLyogZW5hYmxlIHBhcml0eSAoMCA9IG5vIHBhcml0eSkgKi8KKyNkZWZpbmUgRVZFTl9QQVIgIDB4MDIJCS8qIGV2ZW4gcGFyaXR5ICgwID0gb2RkIHBhcml0eSkgKi8KKyNkZWZpbmUgREFUQThCSVQgIDB4MDEJCS8qIDggYml0IGRhdGEgKDAgPSA3IGJpdCBkYXRhKSAqLworCisjZGVmaW5lIFNFVEJSRUFLICAweDEwCQkvKiBzZW5kIGJyZWFrIGNvbmRpdGlvbiAobXVzdCBjbGVhcikgKi8KKyNkZWZpbmUgTE9DQUxMT09QIDB4MDgJCS8qIGxvY2FsIGxvb3BiYWNrIHNldCBmb3IgdGVzdCAqLworI2RlZmluZSBTRVRfRFRSICAgMHgwNAkJLyogYXNzZXJ0IERUUiAqLworI2RlZmluZSBTRVRfUlRTICAgMHgwMgkJLyogYXNzZXJ0IFJUUyAqLworI2RlZmluZSBUWF9FTkFCTEUgMHgwMQkJLyogZW5hYmxlIHRyYW5zbWl0dGVyICovCisKKyNkZWZpbmUgUlRTRkNfRU4gIDB4NDAJCS8qIFJUUyBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIFJYUFJPQ19FTiAweDIwCQkvKiByZWNlaXZlIHByb2Nlc3NvciBlbmFibGUgKi8KKyNkZWZpbmUgVFJJR19OTyAgIDB4MDAJCS8qIFJ4IEZJRk8gdHJpZ2dlciBsZXZlbCAwIChubyB0cmlnZ2VyKSAqLworI2RlZmluZSBUUklHXzEgICAgMHgwOAkJLyogdHJpZ2dlciBsZXZlbCAxIGNoYXIgKi8KKyNkZWZpbmUgVFJJR18xXzIgIDB4MTAJCS8qIHRyaWdnZXIgbGV2ZWwgMS8yICovCisjZGVmaW5lIFRSSUdfN184ICAweDE4CQkvKiB0cmlnZ2VyIGxldmVsIDcvOCAqLworI2RlZmluZSBUUklHX01BU0sgMHgxOAkJLyogdHJpZ2dlciBsZXZlbCBtYXNrICovCisjZGVmaW5lIFNSQ0lOVF9FTiAweDA0CQkvKiBzcGVjaWFsIFJ4IGNvbmRpdGlvbiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFJYSU5UX0VOICAweDAyCQkvKiBSeCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIE1DSU5UX0VOICAweDAxCQkvKiBtb2RlbSBjaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLworCisjZGVmaW5lIFJYRl9UUklHICAweDIwCQkvKiBSeCBGSUZPIHRyaWdnZXIgbGV2ZWwgaW50ZXJydXB0ICovCisjZGVmaW5lIFRYRklGT19NVCAweDEwCQkvKiBUeCBGSUZPIGVtcHR5IGludGVycnVwdCAqLworI2RlZmluZSBTUkNfSU5UICAgMHgwOAkJLyogc3BlY2lhbCByZWNlaXZlIGNvbmRpdGlvbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgREVMVEFfQ0QgIDB4MDQJCS8qIENEIGNoYW5nZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgREVMVEFfQ1RTIDB4MDIJCS8qIENUUyBjaGFuZ2UgaW50ZXJydXB0ICovCisjZGVmaW5lIERFTFRBX0RTUiAweDAxCQkvKiBEU1IgY2hhbmdlIGludGVycnVwdCAqLworCisjZGVmaW5lIFJFUDFXMl9FTiAweDEwCQkvKiByZXBsYWNlIGJ5dGUgMSB3aXRoIDIgYnl0ZXMgZW5hYmxlICovCisjZGVmaW5lIElHTjJfRU4gICAweDA4CQkvKiBpZ25vcmUgYnl0ZSAyIGVuYWJsZSAqLworI2RlZmluZSBJR04xX0VOICAgMHgwNAkJLyogaWdub3JlIGJ5dGUgMSBlbmFibGUgKi8KKyNkZWZpbmUgQ09NUDJfRU4gIDB4MDIJCS8qIGNvbXBhcmUgYnl0ZSAyIGVuYWJsZSAqLworI2RlZmluZSBDT01QMV9FTiAgMHgwMQkJLyogY29tcGFyZSBieXRlIDEgZW5hYmxlICovCisKKyNkZWZpbmUgUkVTRVRfQUxMIDB4ODAJCS8qIHJlc2V0IEFJT1AgKGFsbCBjaGFubmVscykgKi8KKyNkZWZpbmUgVFhPVkVSSURFIDB4NDAJCS8qIFRyYW5zbWl0IHNvZnR3YXJlIG9mZiBvdmVycmlkZSAqLworI2RlZmluZSBSRVNFVFVBUlQgMHgyMAkJLyogcmVzZXQgY2hhbm5lbCdzIFVBUlQgKi8KKyNkZWZpbmUgUkVTVFhGQ05UIDB4MTAJCS8qIHJlc2V0IGNoYW5uZWwncyBUeCBGSUZPIGNvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lIFJFU1JYRkNOVCAweDA4CQkvKiByZXNldCBjaGFubmVsJ3MgUnggRklGTyBjb3VudCByZWdpc3RlciAqLworCisjZGVmaW5lIElOVFNUQVQwICAweDAxCQkvKiBBSU9QIDAgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBJTlRTVEFUMSAgMHgwMgkJLyogQUlPUCAxIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgSU5UU1RBVDIgIDB4MDQJCS8qIEFJT1AgMiBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIElOVFNUQVQzICAweDA4CQkvKiBBSU9QIDMgaW50ZXJydXB0IHN0YXR1cyAqLworCisjZGVmaW5lIElOVFJfRU4gICAweDA4CQkvKiBhbGxvdyBpbnRlcnJ1cHRzIHRvIGhvc3QgKi8KKyNkZWZpbmUgSU5UX1NUUk9CIDB4MDQJCS8qIHN0cm9iZSBhbmQgY2xlYXIgaW50ZXJydXB0IGxpbmUgKEVPSSkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgTVVEQkFDIHJlbWFwcGVkIGZvciBQQ0kKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9DRkdfSU5UX1BDSSAgMHg0MAorI2RlZmluZSBfUENJX0lOVF9GVU5DIDB4M0EKKworI2RlZmluZSBQQ0lfU1RST0IgMHgyMDAwCS8qIGJpdCAxMyBvZiBpbnQgYWlvcCByZWdpc3RlciAqLworI2RlZmluZSBJTlRSX0VOX1BDSSAgIDB4MDAxMAkvKiBhbGxvdyBpbnRlcnJ1cHRzIHRvIGhvc3QgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBVbml2ZXJzYWwgUENJIGJvYXJkIHJlZ2lzdGVycworICovCisjZGVmaW5lIF9QQ0lfOTAzMF9JTlRfQ1RSTAkweDRjICAgICAgICAgIC8qIE9mZnNldHMgZnJvbSBCQVIxICovCisjZGVmaW5lIF9QQ0lfOTAzMF9HUElPX0NUUkwJMHg1NAorI2RlZmluZSBQQ0lfSU5UX0NUUkxfQUlPUAkweDAwMDEKKyNkZWZpbmUgUENJX0dQSU9fQ1RSTF84UE9SVAkweDQwMDAKKyNkZWZpbmUgX1BDSV85MDMwX1JJTkdfSU5ECTB4YzAgICAgICAgICAgLyogT2Zmc2V0cyBmcm9tIEJBUjEgKi8KKworI2RlZmluZSBDSEFOM19FTiAgMHgwOAkJLyogZW5hYmxlIEFJT1AgMyAqLworI2RlZmluZSBDSEFOMl9FTiAgMHgwNAkJLyogZW5hYmxlIEFJT1AgMiAqLworI2RlZmluZSBDSEFOMV9FTiAgMHgwMgkJLyogZW5hYmxlIEFJT1AgMSAqLworI2RlZmluZSBDSEFOMF9FTiAgMHgwMQkJLyogZW5hYmxlIEFJT1AgMCAqLworI2RlZmluZSBGUkVRX0RJUyAgMHgwMAorI2RlZmluZSBGUkVRXzI3NEhaIDB4NjAKKyNkZWZpbmUgRlJFUV8xMzdIWiAweDUwCisjZGVmaW5lIEZSRVFfNjlIWiAgMHg0MAorI2RlZmluZSBGUkVRXzM0SFogIDB4MzAKKyNkZWZpbmUgRlJFUV8xN0haICAweDIwCisjZGVmaW5lIEZSRVFfOUhaICAgMHgxMAorI2RlZmluZSBQRVJJT0RJQ19PTkxZIDB4ODAJLyogb25seSBQRVJJT0RJQyBpbnRlcnJ1cHQgKi8KKworI2RlZmluZSBDSEFOSU5UX0VOIDB4MDEwMAkvKiBmbGFncyB0byBlbmFibGUvZGlzYWJsZSBjaGFubmVsIGludHMgKi8KKworI2RlZmluZSBSREFUQVNJWkUgNzIKKyNkZWZpbmUgUlJFR0RBVEFTSVpFIDUyCisKKy8qCisgKiBBSU9QIGludGVycnVwdCBiaXRzIGZvciBJU0EvUENJIGJvYXJkcyBhbmQgVVBDSSBib2FyZHMuCisgKi8KKyNkZWZpbmUgQUlPUF9JTlRSX0JJVF8wCQkweDAwMDEKKyNkZWZpbmUgQUlPUF9JTlRSX0JJVF8xCQkweDAwMDIKKyNkZWZpbmUgQUlPUF9JTlRSX0JJVF8yCQkweDAwMDQKKyNkZWZpbmUgQUlPUF9JTlRSX0JJVF8zCQkweDAwMDgKKworI2RlZmluZSBBSU9QX0lOVFJfQklUUyAoIFwKKwlBSU9QX0lOVFJfQklUXzAgXAorCXwgQUlPUF9JTlRSX0JJVF8xIFwKKwl8IEFJT1BfSU5UUl9CSVRfMiBcCisJfCBBSU9QX0lOVFJfQklUXzMpCisKKyNkZWZpbmUgVVBDSV9BSU9QX0lOVFJfQklUXzAJMHgwMDA0CisjZGVmaW5lIFVQQ0lfQUlPUF9JTlRSX0JJVF8xCTB4MDAyMAorI2RlZmluZSBVUENJX0FJT1BfSU5UUl9CSVRfMgkweDAxMDAKKyNkZWZpbmUgVVBDSV9BSU9QX0lOVFJfQklUXzMJMHgwODAwCisKKyNkZWZpbmUgVVBDSV9BSU9QX0lOVFJfQklUUyAoIFwKKwlVUENJX0FJT1BfSU5UUl9CSVRfMCBcCisJfCBVUENJX0FJT1BfSU5UUl9CSVRfMSBcCisJfCBVUENJX0FJT1BfSU5UUl9CSVRfMiBcCisJfCBVUENJX0FJT1BfSU5UUl9CSVRfMykKKworLyogQ29udHJvbGxlciBsZXZlbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgQ3RsSUQ7CisJaW50IEN0bE51bTsKKwlpbnQgQnVzVHlwZTsKKwlpbnQgYm9hcmRUeXBlOworCWludCBpc1VQQ0k7CisJV29yZElPX3QgUENJSU87CisJV29yZElPX3QgUENJSU8yOworCUJ5dGVJT190IE1CYXNlSU87CisJQnl0ZUlPX3QgTVJlZzFJTzsKKwlCeXRlSU9fdCBNUmVnMklPOworCUJ5dGVJT190IE1SZWczSU87CisJQnl0ZV90IE1SZWcyOworCUJ5dGVfdCBNUmVnMzsKKwlpbnQgTnVtQWlvcDsKKwlpbnQgQWx0Q2hhblJpbmdJbmRpY2F0b3I7CisJQnl0ZUlPX3QgVVBDSVJpbmdJbmQ7CisJV29yZElPX3QgQWlvcElPW0FJT1BfQ1RMX1NJWkVdOworCUJ5dGVJT190IEFpb3BJbnRDaGFuSU9bQUlPUF9DVExfU0laRV07CisJaW50IEFpb3BJRFtBSU9QX0NUTF9TSVpFXTsKKwlpbnQgQWlvcE51bUNoYW5bQUlPUF9DVExfU0laRV07CisJV29yZF90ICpBaW9wSW50ckJpdHM7Cit9IENPTlRST0xMRVJfVDsKKwordHlwZWRlZiBDT05UUk9MTEVSX1QgQ09OVFJPTExFUl90OworCisvKiBDaGFubmVsIGxldmVsIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUNPTlRST0xMRVJfVCAqQ3RsUDsKKwlpbnQgQWlvcE51bTsKKwlpbnQgQ2hhbklEOworCWludCBDaGFuTnVtOworCWludCBydHNUb2dnbGU7CisKKwlCeXRlSU9fdCBDbWQ7CisJQnl0ZUlPX3QgSW50Q2hhbjsKKwlCeXRlSU9fdCBJbnRNYXNrOworCURXb3JkSU9fdCBJbmRleEFkZHI7CisJV29yZElPX3QgSW5kZXhEYXRhOworCisJV29yZElPX3QgVHhSeERhdGE7CisJV29yZElPX3QgQ2hhblN0YXQ7CisJV29yZElPX3QgVHhSeENvdW50OworCUJ5dGVJT190IEludElEOworCisJV29yZF90IFR4RklGTzsKKwlXb3JkX3QgVHhGSUZPUHRyczsKKwlXb3JkX3QgUnhGSUZPOworCVdvcmRfdCBSeEZJRk9QdHJzOworCVdvcmRfdCBUeFByaW9DbnQ7CisJV29yZF90IFR4UHJpb1B0cjsKKwlXb3JkX3QgVHhQcmlvQnVmOworCisJQnl0ZV90IFJbUlJFR0RBVEFTSVpFXTsKKworCUJ5dGVfdCBCYXVkRGl2WzRdOworCUJ5dGVfdCBUeENvbnRyb2xbNF07CisJQnl0ZV90IFJ4Q29udHJvbFs0XTsKKwlCeXRlX3QgVHhFbmFibGVzWzRdOworCUJ5dGVfdCBUeENvbXBhcmVbNF07CisJQnl0ZV90IFR4UmVwbGFjZTFbNF07CisJQnl0ZV90IFR4UmVwbGFjZTJbNF07Cit9IENIQU5ORUxfVDsKKwordHlwZWRlZiBDSEFOTkVMX1QgQ0hBTk5FTF90OwordHlwZWRlZiBDSEFOTkVMX1QgKkNIQU5QVFJfVDsKKworI2RlZmluZSBJbnRlcmZhY2VNb2RlUlMyMzIgIDB4MDAKKyNkZWZpbmUgSW50ZXJmYWNlTW9kZVJTNDIyICAweDA4CisjZGVmaW5lIEludGVyZmFjZU1vZGVSUzQ4NSAgMHgxMAorI2RlZmluZSBJbnRlcmZhY2VNb2RlUlMyMzJUIDB4MTgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNDbHJCcmVhaworUHVycG9zZTogIFN0b3Agc2VuZGluZyBhIHRyYW5zbWl0IEJSRUFLIHNpZ25hbAorQ2FsbDogICAgIHNDbHJCcmVhayhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0NsckJyZWFrKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzNdICY9IH5TRVRCUkVBSzsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0NsckRUUgorUHVycG9zZTogIENsciB0aGUgRFRSIG91dHB1dAorQ2FsbDogICAgIHNDbHJEVFIoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNDbHJEVFIoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gJj0gflNFVF9EVFI7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNDbHJSVFMKK1B1cnBvc2U6ICBDbHIgdGhlIFJUUyBvdXRwdXQKK0NhbGw6ICAgICBzQ2xyUlRTKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzQ2xyUlRTKENoUCkgXAorZG8geyBcCisgICBpZiAoKENoUCktPnJ0c1RvZ2dsZSkgYnJlYWs7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gJj0gflNFVF9SVFM7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNDbHJUeFhPRkYKK1B1cnBvc2U6ICBDbGVhciBhbnkgZXhpc3RpbmcgdHJhbnNtaXQgc29mdHdhcmUgZmxvdyBjb250cm9sIG9mZiBjb25kaXRpb24KK0NhbGw6ICAgICBzQ2xyVHhYT0ZGKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzQ2xyVHhYT0ZGKENoUCkgXAorZG8geyBcCisgICBzT3V0QigoQ2hQKS0+Q21kLFRYT1ZFUklERSB8IChCeXRlX3QpKENoUCktPkNoYW5OdW0pOyBcCisgICBzT3V0QigoQ2hQKS0+Q21kLChCeXRlX3QpKENoUCktPkNoYW5OdW0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0N0bE51bVRvQ3RsUHRyCitQdXJwb3NlOiAgQ29udmVydCBhIGNvbnRyb2xsZXIgbnVtYmVyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlIHBvaW50ZXIKK0NhbGw6ICAgICBzQ3RsTnVtVG9DdGxQdHIoQ3RsTnVtKQorICAgICAgICAgIGludCBDdGxOdW07IENvbnRyb2xsZXIgbnVtYmVyCitSZXR1cm46ICAgQ09OVFJPTExFUl9UICo6IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0N0bE51bVRvQ3RsUHRyKENUTE5VTSkgJnNDb250cm9sbGVyW0NUTE5VTV0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNDb250cm9sbGVyRU9JCitQdXJwb3NlOiAgU3Ryb2JlIHRoZSBNVURCQUMncyBFbmQgT2YgSW50ZXJydXB0IGJpdC4KK0NhbGw6ICAgICBzQ29udHJvbGxlckVPSShDdGxQKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisqLworI2RlZmluZSBzQ29udHJvbGxlckVPSShDVExQKSBzT3V0QigoQ1RMUCktPk1SZWcySU8sKENUTFApLT5NUmVnMiB8IElOVF9TVFJPQikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNQQ0lDb250cm9sbGVyRU9JCitQdXJwb3NlOiAgU3Ryb2JlIHRoZSBQQ0kgRW5kIE9mIEludGVycnVwdCBiaXQuCisgICAgICAgICAgRm9yIHRoZSBVUENJIGJvYXJkcywgdG9nZ2xlIHRoZSBBSU9QIGludGVycnVwdCBlbmFibGUgYml0CisJICAodGhpcyB3YXMgdGFrZW4gZnJvbSB0aGUgV2luZG93cyBkcml2ZXIpLgorQ2FsbDogICAgIHNQQ0lDb250cm9sbGVyRU9JKEN0bFApCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNQQ0lDb250cm9sbGVyRU9JKENUTFApIFwKK2RvIHsgXAorICAgIGlmICgoQ1RMUCktPmlzVVBDSSkgeyBcCisJV29yZF90IHcgPSBzSW5XKChDVExQKS0+UENJSU8pOyBcCisJc091dFcoKENUTFApLT5QQ0lJTywgKHcgXiBQQ0lfSU5UX0NUUkxfQUlPUCkpOyBcCisJc091dFcoKENUTFApLT5QQ0lJTywgdyk7IFwKKyAgICB9IFwKKyAgICBlbHNlIHsgXAorCXNPdXRXKChDVExQKS0+UENJSU8sIFBDSV9TVFJPQik7IFwKKyAgICB9IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzQWlvcAorUHVycG9zZTogIERpc2FibGUgSS9PIGFjY2VzcyB0byBhbiBBSU9QCitDYWxsOiAgICAgc0Rpc0Fpb3AoQ2x0UCkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorICAgICAgICAgIGludCBBaW9wTnVtOyBOdW1iZXIgb2YgQUlPUCBvbiBjb250cm9sbGVyCisqLworI2RlZmluZSBzRGlzQWlvcChDVExQLEFJT1BOVU0pIFwKK2RvIHsgXAorICAgKENUTFApLT5NUmVnMyAmPSBzQml0TWFwQ2xyVGJsW0FJT1BOVU1dOyBcCisgICBzT3V0QigoQ1RMUCktPk1SZWczSU8sKENUTFApLT5NUmVnMyk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzQ1RTRmxvd0N0bAorUHVycG9zZTogIERpc2FibGUgb3V0cHV0IGZsb3cgY29udHJvbCB1c2luZyBDVFMKK0NhbGw6ICAgICBzRGlzQ1RTRmxvd0N0bChDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0Rpc0NUU0Zsb3dDdGwoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gJj0gfkNUU0ZDX0VOOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzSVhBTlkKK1B1cnBvc2U6ICBEaXNhYmxlIElYQU5ZIFNvZnR3YXJlIEZsb3cgQ29udHJvbAorQ2FsbDogICAgIHNEaXNJWEFOWShDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0Rpc0lYQU5ZKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDBlXSA9IDB4ODY7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDBjXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBEaXNQYXJpdHkKK1B1cnBvc2U6ICBEaXNhYmxlIHBhcml0eQorQ2FsbDogICAgIHNEaXNQYXJpdHkoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBGdW5jdGlvbiBzU2V0UGFyaXR5KCkgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgZnVuY3Rpb25zIHNFblBhcml0eSgpLAorICAgICAgICAgIHNEaXNQYXJpdHkoKSwgc1NldE9kZFBhcml0eSgpLCBhbmQgc1NldEV2ZW5QYXJpdHkoKS4KKyovCisjZGVmaW5lIHNEaXNQYXJpdHkoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gJj0gflBBUklUWV9FTjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0Rpc1JUU1RvZ2dsZQorUHVycG9zZTogIERpc2FibGUgUlRTIHRvZ2dsZQorQ2FsbDogICAgIHNEaXNSVFNUb2dnbGUoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNEaXNSVFNUb2dnbGUoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gJj0gflJUU1RPR19FTjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCisgICAoQ2hQKS0+cnRzVG9nZ2xlID0gMDsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNEaXNSeEZJRk8KK1B1cnBvc2U6ICBEaXNhYmxlIFJ4IEZJRk8KK0NhbGw6ICAgICBzRGlzUnhGSUZPKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRGlzUnhGSUZPKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDMyXSA9IDB4MGE7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDMwXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzUnhTdGF0dXNNb2RlCitQdXJwb3NlOiAgRGlzYWJsZSB0aGUgUnggc3RhdHVzIG1vZGUKK0NhbGw6ICAgICBzRGlzUnhTdGF0dXNNb2RlKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogVGhpcyB0YWtlcyB0aGUgY2hhbm5lbCBvdXQgb2YgdGhlIHJlY2VpdmUgc3RhdHVzIG1vZGUuICBBbGwKKyAgICAgICAgICBzdWJzZXF1ZW50IHJlYWRzIG9mIHJlY2VpdmUgZGF0YSB1c2luZyBzUmVhZFJ4V29yZCgpIHdpbGwgcmV0dXJuCisgICAgICAgICAgdHdvIGRhdGEgYnl0ZXMuCisqLworI2RlZmluZSBzRGlzUnhTdGF0dXNNb2RlKENoUCkgc091dFcoKENoUCktPkNoYW5TdGF0LDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRGlzVHJhbnNtaXQKK1B1cnBvc2U6ICBEaXNhYmxlIHRyYW5zbWl0CitDYWxsOiAgICAgc0Rpc1RyYW5zbWl0KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgVGhpcyBkaXNhYmxlcyBtb3ZlbWVudCBvZiBUeCBkYXRhIGZyb20gdGhlIFR4IEZJRk8gaW50byB0aGUgMSBieXRlCisgICAgICAgICAgVHggYnVmZmVyLiAgVGhlcmVmb3JlIHRoZXJlIGNvdWxkIGJlIHVwIHRvIGEgMiBieXRlIGxhdGVuY3kKKyAgICAgICAgICBiZXR3ZWVuIHRoZSB0aW1lIHNEaXNUcmFuc21pdCgpIGlzIGNhbGxlZCBhbmQgdGhlIHRyYW5zbWl0IGJ1ZmZlcgorICAgICAgICAgIGFuZCB0cmFuc21pdCBzaGlmdCByZWdpc3RlciBnb2luZyBjb21wbGV0ZWx5IGVtcHR5LgorKi8KKyNkZWZpbmUgc0Rpc1RyYW5zbWl0KENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzNdICY9IH5UWF9FTkFCTEU7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNEaXNUeFNvZnRGbG93Q3RsCitQdXJwb3NlOiAgRGlzYWJsZSBUeCBTb2Z0d2FyZSBGbG93IENvbnRyb2wKK0NhbGw6ICAgICBzRGlzVHhTb2Z0Rmxvd0N0bChDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0Rpc1R4U29mdEZsb3dDdGwoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5SWzB4MDZdID0gMHg4YTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzB4MDRdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNFbkFpb3AKK1B1cnBvc2U6ICBFbmFibGUgSS9PIGFjY2VzcyB0byBhbiBBSU9QCitDYWxsOiAgICAgc0VuQWlvcChDbHRQKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisgICAgICAgICAgaW50IEFpb3BOdW07IE51bWJlciBvZiBBSU9QIG9uIGNvbnRyb2xsZXIKKyovCisjZGVmaW5lIHNFbkFpb3AoQ1RMUCxBSU9QTlVNKSBcCitkbyB7IFwKKyAgIChDVExQKS0+TVJlZzMgfD0gc0JpdE1hcFNldFRibFtBSU9QTlVNXTsgXAorICAgc091dEIoKENUTFApLT5NUmVnM0lPLChDVExQKS0+TVJlZzMpOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuQ1RTRmxvd0N0bAorUHVycG9zZTogIEVuYWJsZSBvdXRwdXQgZmxvdyBjb250cm9sIHVzaW5nIENUUworQ2FsbDogICAgIHNFbkNUU0Zsb3dDdGwoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNFbkNUU0Zsb3dDdGwoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gfD0gQ1RTRkNfRU47IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNFbklYQU5ZCitQdXJwb3NlOiAgRW5hYmxlIElYQU5ZIFNvZnR3YXJlIEZsb3cgQ29udHJvbAorQ2FsbDogICAgIHNFbklYQU5ZKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRW5JWEFOWShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlJbMHgwZV0gPSAweDIxOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJbMHgwY10pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogRW5QYXJpdHkKK1B1cnBvc2U6ICBFbmFibGUgcGFyaXR5CitDYWxsOiAgICAgc0VuUGFyaXR5KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogRnVuY3Rpb24gc1NldFBhcml0eSgpIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGZ1bmN0aW9ucyBzRW5QYXJpdHkoKSwKKyAgICAgICAgICBzRGlzUGFyaXR5KCksIHNTZXRPZGRQYXJpdHkoKSwgYW5kIHNTZXRFdmVuUGFyaXR5KCkuCisKK1dhcm5pbmdzOiBCZWZvcmUgZW5hYmxpbmcgcGFyaXR5IG9kZCBvciBldmVuIHBhcml0eSBzaG91bGQgYmUgY2hvc2VuIHVzaW5nCisgICAgICAgICAgZnVuY3Rpb25zIHNTZXRPZGRQYXJpdHkoKSBvciBzU2V0RXZlblBhcml0eSgpLgorKi8KKyNkZWZpbmUgc0VuUGFyaXR5KENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzJdIHw9IFBBUklUWV9FTjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuUlRTVG9nZ2xlCitQdXJwb3NlOiAgRW5hYmxlIFJUUyB0b2dnbGUKK0NhbGw6ICAgICBzRW5SVFNUb2dnbGUoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGlzYWJsZSBSVFMgZmxvdyBjb250cm9sIGFuZCBjbGVhciB0aGUgUlRTCisgICAgICAgICAgbGluZSB0byBhbGxvdyBvcGVyYXRpb24gb2YgUlRTIHRvZ2dsZS4KKyovCisjZGVmaW5lIHNFblJUU1RvZ2dsZShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlJ4Q29udHJvbFsyXSAmPSB+UlRTRkNfRU47IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UnhDb250cm9sWzBdKTsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSB8PSBSVFNUT0dfRU47IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gJj0gflNFVF9SVFM7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorICAgKENoUCktPnJ0c1RvZ2dsZSA9IDE7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5SeEZJRk8KK1B1cnBvc2U6ICBFbmFibGUgUnggRklGTworQ2FsbDogICAgIHNFblJ4RklGTyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc0VuUnhGSUZPKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDMyXSA9IDB4MDg7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDMwXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5SeFByb2Nlc3NvcgorUHVycG9zZTogIEVuYWJsZSB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IKK0NhbGw6ICAgICBzRW5SeFByb2Nlc3NvcihDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorQ29tbWVudHM6IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCB0aGUgcmVjZWl2ZSBwcm9jZXNzb3IuICBXaGVuCisgICAgICAgICAgdGhlIGNoYW5uZWwgaXMgaW4gdGhlIHJlc2V0IHN0YXRlIHRoZSByZWNlaXZlIHByb2Nlc3NvciBpcyBub3QKKyAgICAgICAgICBydW5uaW5nLiAgVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIGZyb20KKyAgICAgICAgICBleGVjdXRpbmcgaW52YWxpZCBtaWNyb2NvZGUgaW5zdHJ1Y3Rpb25zIHByaW9yIHRvIHRoZQorICAgICAgICAgIGRvd25sb2FkaW5nIG9mIHRoZSBtaWNyb2NvZGUuCisKK1dhcm5pbmdzOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIHZhbGlkIG1pY3JvY29kZSBoYXMgYmVlbgorICAgICAgICAgIGRvd25sb2FkZWQgdG8gdGhlIEFJT1AsIGFuZCBpdCBtdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIHRoZQorICAgICAgICAgIG1pY3JvY29kZSBoYXMgYmVlbiBkb3dubG9hZGVkLgorKi8KKyNkZWZpbmUgc0VuUnhQcm9jZXNzb3IoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5SeENvbnRyb2xbMl0gfD0gUlhQUk9DX0VOOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJ4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzRW5SeFN0YXR1c01vZGUKK1B1cnBvc2U6ICBFbmFibGUgdGhlIFJ4IHN0YXR1cyBtb2RlCitDYWxsOiAgICAgc0VuUnhTdGF0dXNNb2RlKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogVGhpcyBwbGFjZXMgdGhlIGNoYW5uZWwgaW4gdGhlIHJlY2VpdmUgc3RhdHVzIG1vZGUuICBBbGwgc3Vic2VxdWVudAorICAgICAgICAgIHJlYWRzIG9mIHJlY2VpdmUgZGF0YSB1c2luZyBzUmVhZFJ4V29yZCgpIHdpbGwgcmV0dXJuIGEgZGF0YSBieXRlCisgICAgICAgICAgaW4gdGhlIGxvdyB3b3JkIGFuZCBhIHN0YXR1cyBieXRlIGluIHRoZSBoaWdoIHdvcmQuCisKKyovCisjZGVmaW5lIHNFblJ4U3RhdHVzTW9kZShDaFApIHNPdXRXKChDaFApLT5DaGFuU3RhdCxTVEFUTU9ERSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNFblRyYW5zbWl0CitQdXJwb3NlOiAgRW5hYmxlIHRyYW5zbWl0CitDYWxsOiAgICAgc0VuVHJhbnNtaXQoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNFblRyYW5zbWl0KENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzNdIHw9IFRYX0VOQUJMRTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0VuVHhTb2Z0Rmxvd0N0bAorUHVycG9zZTogIEVuYWJsZSBUeCBTb2Z0d2FyZSBGbG93IENvbnRyb2wKK0NhbGw6ICAgICBzRW5UeFNvZnRGbG93Q3RsKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzRW5UeFNvZnRGbG93Q3RsKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+UlsweDA2XSA9IDB4YzU7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+UlsweDA0XSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzR2V0QWlvcEludFN0YXR1cworUHVycG9zZTogIEdldCB0aGUgQUlPUCBpbnRlcnJ1cHQgc3RhdHVzCitDYWxsOiAgICAgc0dldEFpb3BJbnRTdGF0dXMoQ3RsUCxBaW9wTnVtKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisgICAgICAgICAgaW50IEFpb3BOdW07IEFJT1AgbnVtYmVyCitSZXR1cm46ICAgQnl0ZV90OiBUaGUgQUlPUCBpbnRlcnJ1cHQgc3RhdHVzLiAgQml0cyAwIHRocm91Z2ggNworICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudCBjaGFubmVscyAwIHRocm91Z2ggNyByZXNwZWN0aXZlbHkuICBJZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgYml0IGlzIHNldCB0aGF0IGNoYW5uZWwgaXMgaW50ZXJydXB0aW5nLgorKi8KKyNkZWZpbmUgc0dldEFpb3BJbnRTdGF0dXMoQ1RMUCxBSU9QTlVNKSBzSW5CKChDVExQKS0+QWlvcEludENoYW5JT1tBSU9QTlVNXSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRBaW9wTnVtQ2hhbgorUHVycG9zZTogIEdldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBieSBhbiBBSU9QCitDYWxsOiAgICAgc0dldEFpb3BOdW1DaGFuKEN0bFAsQWlvcE51bSkKKyAgICAgICAgICBDT05UUk9MTEVSX1QgKkN0bFA7IFB0ciB0byBjb250cm9sbGVyIHN0cnVjdHVyZQorICAgICAgICAgIGludCBBaW9wTnVtOyBBSU9QIG51bWJlcgorUmV0dXJuOiAgIGludDogVGhlIG51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgdGhlIEFJT1AKKyovCisjZGVmaW5lIHNHZXRBaW9wTnVtQ2hhbihDVExQLEFJT1BOVU0pIChDVExQKS0+QWlvcE51bUNoYW5bQUlPUE5VTV0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRDaGFuSW50SUQKK1B1cnBvc2U6ICBHZXQgYSBjaGFubmVsJ3MgaW50ZXJydXB0IGlkZW50aWZpY2F0aW9uIGJ5dGUKK0NhbGw6ICAgICBzR2V0Q2hhbkludElEKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgQnl0ZV90OiBUaGUgY2hhbm5lbCBpbnRlcnJ1cHQgSUQuICBDYW4gYmUgYW55CisgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKyAgICAgICAgICAgICAgICBSWEZfVFJJRzogICAgIFJ4IEZJRk8gdHJpZ2dlciBsZXZlbCBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICBUWEZJRk9fTVQ6ICAgIFR4IEZJRk8gZW1wdHkgaW50ZXJydXB0CisgICAgICAgICAgICAgICAgU1JDX0lOVDogICAgICBTcGVjaWFsIHJlY2VpdmUgY29uZGl0aW9uIGludGVycnVwdAorICAgICAgICAgICAgICAgIERFTFRBX0NEOiAgICAgQ0QgY2hhbmdlIGludGVycnVwdAorICAgICAgICAgICAgICAgIERFTFRBX0NUUzogICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICBERUxUQV9EU1I6ICAgIERTUiBjaGFuZ2UgaW50ZXJydXB0CisqLworI2RlZmluZSBzR2V0Q2hhbkludElEKENoUCkgKHNJbkIoKENoUCktPkludElEKSAmIChSWEZfVFJJRyB8IFRYRklGT19NVCB8IFNSQ19JTlQgfCBERUxUQV9DRCB8IERFTFRBX0NUUyB8IERFTFRBX0RTUikpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzR2V0Q2hhbk51bQorUHVycG9zZTogIEdldCB0aGUgbnVtYmVyIG9mIGEgY2hhbm5lbCB3aXRoaW4gYW4gQUlPUAorQ2FsbDogICAgIHNHZXRDaGFuTnVtKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgaW50OiBDaGFubmVsIG51bWJlciB3aXRoaW4gQUlPUCwgb3IgTlVMTENIQU4gaWYgY2hhbm5lbCBkb2VzCisgICAgICAgICAgICAgICBub3QgZXhpc3QuCisqLworI2RlZmluZSBzR2V0Q2hhbk51bShDaFApIChDaFApLT5DaGFuTnVtCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzR2V0Q2hhblN0YXR1cworUHVycG9zZTogIEdldCB0aGUgY2hhbm5lbCBzdGF0dXMKK0NhbGw6ICAgICBzR2V0Q2hhblN0YXR1cyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIFdvcmRfdDogVGhlIGNoYW5uZWwgc3RhdHVzLiAgQ2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZgorICAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgICAgICAgTE9XIEJZVEUgRkxBR1MKKyAgICAgICAgICAgICAgICBDVFNfQUNUOiAgICAgIENUUyBpbnB1dCBhc3NlcnRlZAorICAgICAgICAgICAgICAgIERTUl9BQ1Q6ICAgICAgRFNSIGlucHV0IGFzc2VydGVkCisgICAgICAgICAgICAgICAgQ0RfQUNUOiAgICAgICBDRCBpbnB1dCBhc3NlcnRlZAorICAgICAgICAgICAgICAgIFRYRklGT01UOiAgICAgVHggRklGTyBpcyBlbXB0eQorICAgICAgICAgICAgICAgIFRYU0hSTVQ6ICAgICAgVHggc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHkKKyAgICAgICAgICAgICAgICBSREE6ICAgICAgICAgIFJ4IGRhdGEgYXZhaWxhYmxlCisKKyAgICAgICAgICAgICAgICBISUdIIEJZVEUgRkxBR1MKKyAgICAgICAgICAgICAgICBTVEFUTU9ERTogICAgIHN0YXR1cyBtb2RlIGVuYWJsZSBiaXQKKyAgICAgICAgICAgICAgICBSWEZPVkVSRkw6ICAgIHJlY2VpdmUgRklGTyBvdmVyZmxvdworICAgICAgICAgICAgICAgIFJYMk1BVENIOiAgICAgcmVjZWl2ZSBjb21wYXJlIGJ5dGUgMiBtYXRjaAorICAgICAgICAgICAgICAgIFJYMU1BVENIOiAgICAgcmVjZWl2ZSBjb21wYXJlIGJ5dGUgMSBtYXRjaAorICAgICAgICAgICAgICAgIFJYQlJFQUs6ICAgICAgcmVjZWl2ZWQgQlJFQUsKKyAgICAgICAgICAgICAgICBSWEZSQU1FOiAgICAgIHJlY2VpdmVkIGZyYW1pbmcgZXJyb3IKKyAgICAgICAgICAgICAgICBSWFBBUklUWTogICAgIHJlY2VpdmVkIHBhcml0eSBlcnJvcgorV2FybmluZ3M6IFRoaXMgZnVuY3Rpb24gd2lsbCBjbGVhciB0aGUgaGlnaCBieXRlIGZsYWdzIGluIHRoZSBDaGFubmVsCisgICAgICAgICAgU3RhdHVzIFJlZ2lzdGVyLgorKi8KKyNkZWZpbmUgc0dldENoYW5TdGF0dXMoQ2hQKSBzSW5XKChDaFApLT5DaGFuU3RhdCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRDaGFuU3RhdHVzTG8KK1B1cnBvc2U6ICBHZXQgdGhlIGxvdyBieXRlIG9ubHkgb2YgdGhlIGNoYW5uZWwgc3RhdHVzCitDYWxsOiAgICAgc0dldENoYW5TdGF0dXNMbyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIEJ5dGVfdDogVGhlIGNoYW5uZWwgc3RhdHVzIGxvdyBieXRlLiAgQ2FuIGJlIGFueSBjb21iaW5hdGlvbgorICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgICAgICAgICAgICAgICAgQ1RTX0FDVDogICAgICBDVFMgaW5wdXQgYXNzZXJ0ZWQKKyAgICAgICAgICAgICAgICBEU1JfQUNUOiAgICAgIERTUiBpbnB1dCBhc3NlcnRlZAorICAgICAgICAgICAgICAgIENEX0FDVDogICAgICAgQ0QgaW5wdXQgYXNzZXJ0ZWQKKyAgICAgICAgICAgICAgICBUWEZJRk9NVDogICAgIFR4IEZJRk8gaXMgZW1wdHkKKyAgICAgICAgICAgICAgICBUWFNIUk1UOiAgICAgIFR4IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5CisgICAgICAgICAgICAgICAgUkRBOiAgICAgICAgICBSeCBkYXRhIGF2YWlsYWJsZQorKi8KKyNkZWZpbmUgc0dldENoYW5TdGF0dXNMbyhDaFApIHNJbkIoKEJ5dGVJT190KShDaFApLT5DaGFuU3RhdCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdldCBSSSBzdGF0dXMgb2YgY2hhbm5lbAorICogRGVmaW5lZCBhcyBhIGZ1bmN0aW9uIGluIHJvY2tldC5jICAgLWFlcworICovCisjaWYgMAorI2RlZmluZSBzR2V0Q2hhblJJKENoUCkgKChDaFApLT5DdGxQLT5BbHRDaGFuUmluZ0luZGljYXRvciA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHNJbkIoKEJ5dGVJT190KSgoQ2hQKS0+Q2hhblN0YXQrOCkpICYgRFNSX0FDVCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoQ2hQKS0+Q3RsUC0+Ym9hcmRUeXBlID09IFJPQ0tFVF9UWVBFX1BDMTA0KSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIShzSW5CKChDaFApLT5DdGxQLT5BaW9wSU9bM10pICYgc0JpdE1hcFNldFRibFsoQ2hQKS0+Q2hhbk51bV0pKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRDb250cm9sbGVySW50U3RhdHVzCitQdXJwb3NlOiAgR2V0IHRoZSBjb250cm9sbGVyIGludGVycnVwdCBzdGF0dXMKK0NhbGw6ICAgICBzR2V0Q29udHJvbGxlckludFN0YXR1cyhDdGxQKQorICAgICAgICAgIENPTlRST0xMRVJfVCAqQ3RsUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCitSZXR1cm46ICAgQnl0ZV90OiBUaGUgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBsb3dlciA0CisgICAgICAgICAgICAgICAgICAgICAgICAgYml0cy4gIEJpdHMgMCB0aHJvdWdoIDMgcmVwcmVzZW50IEFJT1AncyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCAzIHJlc3BlY3RpdmVseS4gIElmIGEgYml0IGlzIHNldCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgQUlPUCBpcyBpbnRlcnJ1cHRpbmcuICBCaXRzIDQgdGhyb3VnaCA3IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgYmUgY2xlYXJlZC4KKyovCisjZGVmaW5lIHNHZXRDb250cm9sbGVySW50U3RhdHVzKENUTFApIChzSW5CKChDVExQKS0+TVJlZzFJTykgJiAweDBmKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1BDSUdldENvbnRyb2xsZXJJbnRTdGF0dXMKK1B1cnBvc2U6ICBHZXQgdGhlIGNvbnRyb2xsZXIgaW50ZXJydXB0IHN0YXR1cworQ2FsbDogICAgIHNQQ0lHZXRDb250cm9sbGVySW50U3RhdHVzKEN0bFApCisgICAgICAgICAgQ09OVFJPTExFUl9UICpDdGxQOyBQdHIgdG8gY29udHJvbGxlciBzdHJ1Y3R1cmUKK1JldHVybjogICB1bnNpZ25lZCBjaGFyOiBUaGUgY29udHJvbGxlciBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBsb3dlciA0CisgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyBhbmQgYml0IDQuICBCaXRzIDAgdGhyb3VnaCAzIHJlcHJlc2VudCBBSU9QJ3MgMAorICAgICAgICAgICAgICAgICAgICAgICAgIHRocm91Z2ggMyByZXNwZWN0aXZlbHkuIEJpdCA0IGlzIHNldCBpZiB0aGUgaW50IAorCQkJIHdhcyBnZW5lcmF0ZWQgZnJvbSBwZXJpb2RpYy4gSWYgYSBiaXQgaXMgc2V0IHRoZQorCQkJIEFJT1AgaXMgaW50ZXJydXB0aW5nLgorKi8KKyNkZWZpbmUgc1BDSUdldENvbnRyb2xsZXJJbnRTdGF0dXMoQ1RMUCkgXAorCSgoQ1RMUCktPmlzVVBDSSA/IFwKKwkgIChzSW5XKChDVExQKS0+UENJSU8yKSAmIFVQQ0lfQUlPUF9JTlRSX0JJVFMpIDogXAorCSAgKChzSW5XKChDVExQKS0+UENJSU8pID4+IDgpICYgQUlPUF9JTlRSX0JJVFMpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0Z1bmN0aW9uOiBzR2V0UnhDbnQKK1B1cnBvc2U6ICBHZXQgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIHRoZSBSeCBGSUZPCitDYWxsOiAgICAgc0dldFJ4Q250KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitSZXR1cm46ICAgaW50OiBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhlIFJ4IEZJRk8uCitDb21tZW50czogQnl0ZSByZWFkIG9mIGNvdW50IHJlZ2lzdGVyIGlzIHJlcXVpcmVkIHRvIG9idGFpbiBSeCBjb3VudC4KKworKi8KKyNkZWZpbmUgc0dldFJ4Q250KENoUCkgc0luVygoQ2hQKS0+VHhSeENvdW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc0dldFR4Q250CitQdXJwb3NlOiAgR2V0IHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgVHggRklGTworQ2FsbDogICAgIHNHZXRUeENudChDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIEJ5dGVfdDogVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIHRoZSBUeCBGSUZPLgorQ29tbWVudHM6IEJ5dGUgcmVhZCBvZiBjb3VudCByZWdpc3RlciBpcyByZXF1aXJlZCB0byBvYnRhaW4gVHggY291bnQuCisKKyovCisjZGVmaW5lIHNHZXRUeENudChDaFApIHNJbkIoKEJ5dGVJT190KShDaFApLT5UeFJ4Q291bnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNHZXRUeFJ4RGF0YUlPCitQdXJwb3NlOiAgR2V0IHRoZSBJL08gYWRkcmVzcyBvZiBhIGNoYW5uZWwncyBUeFJ4IERhdGEgcmVnaXN0ZXIKK0NhbGw6ICAgICBzR2V0VHhSeERhdGFJTyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorUmV0dXJuOiAgIFdvcmRJT190OiBJL08gYWRkcmVzcyBvZiBhIGNoYW5uZWwncyBUeFJ4IERhdGEgcmVnaXN0ZXIKKyovCisjZGVmaW5lIHNHZXRUeFJ4RGF0YUlPKENoUCkgKENoUCktPlR4UnhEYXRhCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzSW5pdENoYW5EZWZhdWx0cworUHVycG9zZTogIEluaXRpYWxpemUgYSBjaGFubmVsIHN0cnVjdHVyZSB0byBpdCdzIGRlZmF1bHQgc3RhdGUuCitDYWxsOiAgICAgc0luaXRDaGFuRGVmYXVsdHMoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gdGhlIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBldmVyeSBjaGFubmVsIHN0cnVjdHVyZQorICAgICAgICAgIHRoYXQgZXhpc3RzIGJlZm9yZSBhbnkgb3RoZXIgU1NDSSBjYWxscyBjYW4gYmUgbWFkZS4KKworKi8KKyNkZWZpbmUgc0luaXRDaGFuRGVmYXVsdHMoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5DdGxQID0gTlVMTENUTFBUUjsgXAorICAgKENoUCktPkFpb3BOdW0gPSBOVUxMQUlPUDsgXAorICAgKENoUCktPkNoYW5JRCA9IEFJT1BJRF9OVUxMOyBcCisgICAoQ2hQKS0+Q2hhbk51bSA9IE5VTExDSEFOOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1Jlc2V0QWlvcEJ5TnVtCitQdXJwb3NlOiAgUmVzZXQgdGhlIEFJT1AgYnkgbnVtYmVyCitDYWxsOiAgICAgc1Jlc2V0QWlvcEJ5TnVtKENUTFAsQUlPUE5VTSkKKwlDT05UUk9MTEVSX1QgQ1RMUDsgUHRyIHRvIGNvbnRyb2xsZXIgc3RydWN0dXJlCisJQUlPUE5VTTsgQUlPUCBpbmRleCAKKyovCisjZGVmaW5lIHNSZXNldEFpb3BCeU51bShDVExQLEFJT1BOVU0pIFwKK2RvIHsgXAorICAgc091dEIoKENUTFApLT5BaW9wSU9bKEFJT1BOVU0pXStfQ01EX1JFRyxSRVNFVF9BTEwpOyBcCisgICBzT3V0QigoQ1RMUCktPkFpb3BJT1soQUlPUE5VTSldK19DTURfUkVHLDB4MCk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzU2VuZEJyZWFrCitQdXJwb3NlOiAgU2VuZCBhIHRyYW5zbWl0IEJSRUFLIHNpZ25hbAorQ2FsbDogICAgIHNTZW5kQnJlYWsoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNTZW5kQnJlYWsoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gfD0gU0VUQlJFQUs7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRCYXVkCitQdXJwb3NlOiAgU2V0IGJhdWQgcmF0ZQorQ2FsbDogICAgIHNTZXRCYXVkKENoUCxEaXZpc29yKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyAgICAgICAgICBXb3JkX3QgRGl2aXNvcjsgMTYgYml0IGJhdWQgcmF0ZSBkaXZpc29yIGZvciBjaGFubmVsCisqLworI2RlZmluZSBzU2V0QmF1ZChDaFAsRElWSVNPUikgXAorZG8geyBcCisgICAoQ2hQKS0+QmF1ZERpdlsyXSA9IChCeXRlX3QpKERJVklTT1IpOyBcCisgICAoQ2hQKS0+QmF1ZERpdlszXSA9IChCeXRlX3QpKChESVZJU09SKSA+PiA4KTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5CYXVkRGl2WzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXREYXRhNworUHVycG9zZTogIFNldCBkYXRhIGJpdHMgdG8gNworQ2FsbDogICAgIHNTZXREYXRhNyhDaFApCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorKi8KKyNkZWZpbmUgc1NldERhdGE3KENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzJdICY9IH5EQVRBOEJJVDsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldERhdGE4CitQdXJwb3NlOiAgU2V0IGRhdGEgYml0cyB0byA4CitDYWxsOiAgICAgc1NldERhdGE4KENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzU2V0RGF0YTgoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gfD0gREFUQThCSVQ7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXREVFIKK1B1cnBvc2U6ICBTZXQgdGhlIERUUiBvdXRwdXQKK0NhbGw6ICAgICBzU2V0RFRSKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzU2V0RFRSKENoUCkgXAorZG8geyBcCisgICAoQ2hQKS0+VHhDb250cm9sWzNdIHw9IFNFVF9EVFI7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRFdmVuUGFyaXR5CitQdXJwb3NlOiAgU2V0IGV2ZW4gcGFyaXR5CitDYWxsOiAgICAgc1NldEV2ZW5QYXJpdHkoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBGdW5jdGlvbiBzU2V0UGFyaXR5KCkgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgZnVuY3Rpb25zIHNFblBhcml0eSgpLAorICAgICAgICAgIHNEaXNQYXJpdHkoKSwgc1NldE9kZFBhcml0eSgpLCBhbmQgc1NldEV2ZW5QYXJpdHkoKS4KKworV2FybmluZ3M6IFRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCB1bmxlc3MgcGFyaXR5IGlzIGVuYWJsZWQgd2l0aCBmdW5jdGlvbgorICAgICAgICAgIHNFblBhcml0eSgpLgorKi8KKyNkZWZpbmUgc1NldEV2ZW5QYXJpdHkoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gfD0gRVZFTl9QQVI7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRPZGRQYXJpdHkKK1B1cnBvc2U6ICBTZXQgb2RkIHBhcml0eQorQ2FsbDogICAgIHNTZXRPZGRQYXJpdHkoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKK0NvbW1lbnRzOiBGdW5jdGlvbiBzU2V0UGFyaXR5KCkgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgZnVuY3Rpb25zIHNFblBhcml0eSgpLAorICAgICAgICAgIHNEaXNQYXJpdHkoKSwgc1NldE9kZFBhcml0eSgpLCBhbmQgc1NldEV2ZW5QYXJpdHkoKS4KKworV2FybmluZ3M6IFRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCB1bmxlc3MgcGFyaXR5IGlzIGVuYWJsZWQgd2l0aCBmdW5jdGlvbgorICAgICAgICAgIHNFblBhcml0eSgpLgorKi8KKyNkZWZpbmUgc1NldE9kZFBhcml0eShDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSAmPSB+RVZFTl9QQVI7IFwKKyAgIHNPdXREVygoQ2hQKS0+SW5kZXhBZGRyLCooRFdvcmRfdCAqKSYoQ2hQKS0+VHhDb250cm9sWzBdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRSVFMKK1B1cnBvc2U6ICBTZXQgdGhlIFJUUyBvdXRwdXQKK0NhbGw6ICAgICBzU2V0UlRTKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzU2V0UlRTKENoUCkgXAorZG8geyBcCisgICBpZiAoKENoUCktPnJ0c1RvZ2dsZSkgYnJlYWs7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbM10gfD0gU0VUX1JUUzsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldFJ4VHJpZ2dlcgorUHVycG9zZTogIFNldCB0aGUgUnggRklGTyB0cmlnZ2VyIGxldmVsCitDYWxsOiAgICAgc1NldFJ4UHJvY2Vzc29yKENoUCxMZXZlbCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgQnl0ZV90IExldmVsOyBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBSeCBGSUZPIGF0IHdoaWNoIHRoZQorICAgICAgICAgICAgIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZC4gIENhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKworICAgICAgICAgICAgIFRSSUdfTk86ICAgbm8gdHJpZ2dlcgorICAgICAgICAgICAgIFRSSUdfMTogICAgMSBjaGFyYWN0ZXIgaW4gRklGTworICAgICAgICAgICAgIFRSSUdfMV8yOiAgRklGTyAxLzIgZnVsbAorICAgICAgICAgICAgIFRSSUdfN184OiAgRklGTyA3LzggZnVsbAorQ29tbWVudHM6IEFuIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIHRoZSB0cmlnZ2VyIGxldmVsIGlzIHJlYWNoZWQKKyAgICAgICAgICBvbmx5IGlmIGZ1bmN0aW9uIHNFbkludGVycnVwdCgpIGhhcyBiZWVuIGNhbGxlZCB3aXRoIGZsYWcKKyAgICAgICAgICBSWElOVF9FTiBzZXQuICBUaGUgUlhGX1RSSUcgZmxhZyBpbiB0aGUgSW50ZXJydXB0IElkZW5maWZpY2F0aW9uCisgICAgICAgICAgcmVnaXN0ZXIgd2lsbCBiZSBzZXQgd2hlbmV2ZXIgdGhlIHRyaWdnZXIgbGV2ZWwgaXMgcmVhY2hlZAorICAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgUlhJTlRfRU4uCisKKyovCisjZGVmaW5lIHNTZXRSeFRyaWdnZXIoQ2hQLExFVkVMKSBcCitkbyB7IFwKKyAgIChDaFApLT5SeENvbnRyb2xbMl0gJj0gflRSSUdfTUFTSzsgXAorICAgKENoUCktPlJ4Q29udHJvbFsyXSB8PSBMRVZFTDsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldFN0b3AxCitQdXJwb3NlOiAgU2V0IHN0b3AgYml0cyB0byAxCitDYWxsOiAgICAgc1NldFN0b3AxKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisqLworI2RlZmluZSBzU2V0U3RvcDEoQ2hQKSBcCitkbyB7IFwKKyAgIChDaFApLT5UeENvbnRyb2xbMl0gJj0gflNUT1AyOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlR4Q29udHJvbFswXSk7IFwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9uOiBzU2V0U3RvcDIKK1B1cnBvc2U6ICBTZXQgc3RvcCBiaXRzIHRvIDIKK0NhbGw6ICAgICBzU2V0U3RvcDIoQ2hQKQorICAgICAgICAgIENIQU5ORUxfVCAqQ2hQOyBQdHIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIHNTZXRTdG9wMihDaFApIFwKK2RvIHsgXAorICAgKENoUCktPlR4Q29udHJvbFsyXSB8PSBTVE9QMjsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5UeENvbnRyb2xbMF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1NldFR4WE9GRkNoYXIKK1B1cnBvc2U6ICBTZXQgdGhlIFR4IFhPRkYgZmxvdyBjb250cm9sIGNoYXJhY3RlcgorQ2FsbDogICAgIHNTZXRUeFhPRkZDaGFyKENoUCxDaCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCisgICAgICAgICAgQnl0ZV90IENoOyBUaGUgdmFsdWUgdG8gc2V0IHRoZSBUeCBYT0ZGIGNoYXJhY3RlciB0bworKi8KKyNkZWZpbmUgc1NldFR4WE9GRkNoYXIoQ2hQLENIKSBcCitkbyB7IFwKKyAgIChDaFApLT5SWzB4MDddID0gKENIKTsgXAorICAgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzB4MDRdKTsgXAorfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb246IHNTZXRUeFhPTkNoYXIKK1B1cnBvc2U6ICBTZXQgdGhlIFR4IFhPTiBmbG93IGNvbnRyb2wgY2hhcmFjdGVyCitDYWxsOiAgICAgc1NldFR4WE9OQ2hhcihDaFAsQ2gpCisgICAgICAgICAgQ0hBTk5FTF9UICpDaFA7IFB0ciB0byBjaGFubmVsIHN0cnVjdHVyZQorICAgICAgICAgIEJ5dGVfdCBDaDsgVGhlIHZhbHVlIHRvIHNldCB0aGUgVHggWE9OIGNoYXJhY3RlciB0bworKi8KKyNkZWZpbmUgc1NldFR4WE9OQ2hhcihDaFAsQ0gpIFwKK2RvIHsgXAorICAgKENoUCktPlJbMHgwYl0gPSAoQ0gpOyBcCisgICBzT3V0RFcoKENoUCktPkluZGV4QWRkciwqKERXb3JkX3QgKikmKENoUCktPlJbMHgwOF0pOyBcCit9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1N0YXJ0UnhQcm9jZXNzb3IKK1B1cnBvc2U6ICBTdGFydCBhIGNoYW5uZWwncyByZWNlaXZlIHByb2Nlc3NvcgorQ2FsbDogICAgIHNTdGFydFJ4UHJvY2Vzc29yKENoUCkKKyAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCitDb21tZW50czogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGEgUnggcHJvY2Vzc29yIGFmdGVyIGl0IHdhcworICAgICAgICAgIHN0b3BwZWQgd2l0aCBzU3RvcFJ4UHJvY2Vzc29yKCkgb3Igc1N0b3BTV0luRmxvd0N0bCgpLiAgSXQKKyAgICAgICAgICB3aWxsIHJlc3RhcnQgYm90aCB0aGUgUnggcHJvY2Vzc29yIGFuZCBzb2Z0d2FyZSBpbnB1dCBmbG93IGNvbnRyb2wuCisKKyovCisjZGVmaW5lIHNTdGFydFJ4UHJvY2Vzc29yKENoUCkgc091dERXKChDaFApLT5JbmRleEFkZHIsKihEV29yZF90ICopJihDaFApLT5SWzBdKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitGdW5jdGlvbjogc1dyaXRlVHhCeXRlCitQdXJwb3NlOiAgV3JpdGUgYSB0cmFuc21pdCBkYXRhIGJ5dGUgdG8gYSBjaGFubmVsLgorICAgICAgICAgIEJ5dGVJT190IGlvOiBDaGFubmVsIHRyYW5zbWl0IHJlZ2lzdGVyIEkvTyBhZGRyZXNzLiAgVGhpcyBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIG9idGFpbmVkIHdpdGggc0dldFR4UnhEYXRhSU8oKS4KKyAgICAgICAgICBCeXRlX3QgRGF0YTsgVGhlIHRyYW5zbWl0IGRhdGEgYnl0ZS4KK1dhcm5pbmdzOiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgZGF0YSBieXRlIHdpdGhvdXQgY2hlY2tpbmcgdG8gc2VlIGlmCisgICAgICAgICAgc01heFR4U2l6ZSBpcyBleGNlZWRlZCBpbiB0aGUgVHggRklGTy4KKyovCisjZGVmaW5lIHNXcml0ZVR4Qnl0ZShJTyxEQVRBKSBzT3V0QihJTyxEQVRBKQorCitpbnQgc0luaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsCisJCSAgICBpbnQgQ3RsTnVtLAorCQkgICAgQnl0ZUlPX3QgTXVkYmFjSU8sCisJCSAgICBCeXRlSU9fdCAqIEFpb3BJT0xpc3QsCisJCSAgICBpbnQgQWlvcElPTGlzdFNpemUsCisJCSAgICBpbnQgSVJRTnVtLCBCeXRlX3QgRnJlcXVlbmN5LCBpbnQgUGVyaW9kaWNPbmx5KTsKKworaW50IHNQQ0lJbml0Q29udHJvbGxlcihDT05UUk9MTEVSX1QgKiBDdGxQLAorCQkgICAgICAgaW50IEN0bE51bSwKKwkJICAgICAgIEJ5dGVJT190ICogQWlvcElPTGlzdCwKKwkJICAgICAgIGludCBBaW9wSU9MaXN0U2l6ZSwKKwkJICAgICAgIFdvcmRJT190IENvbmZpZ0lPLAorCQkgICAgICAgaW50IElSUU51bSwKKwkJICAgICAgIEJ5dGVfdCBGcmVxdWVuY3ksCisJCSAgICAgICBpbnQgUGVyaW9kaWNPbmx5LAorCQkgICAgICAgaW50IGFsdENoYW5SaW5nSW5kaWNhdG9yLCBpbnQgVVBDSVJpbmdJbmQpOworCitpbnQgc1JlYWRBaW9wSUQoQnl0ZUlPX3QgaW8pOworaW50IHNSZWFkQWlvcE51bUNoYW4oV29yZElPX3QgaW8pOworaW50IHNJbml0Q2hhbihDT05UUk9MTEVSX1QgKiBDdGxQLAorCSAgICAgIENIQU5ORUxfVCAqIENoUCwgaW50IEFpb3BOdW0sIGludCBDaGFuTnVtKTsKK0J5dGVfdCBzR2V0UnhFcnJTdGF0dXMoQ0hBTk5FTF9UICogQ2hQKTsKK3ZvaWQgc1N0b3BSeFByb2Nlc3NvcihDSEFOTkVMX1QgKiBDaFApOwordm9pZCBzU3RvcFNXSW5GbG93Q3RsKENIQU5ORUxfVCAqIENoUCk7Cit2b2lkIHNGbHVzaFJ4RklGTyhDSEFOTkVMX1QgKiBDaFApOwordm9pZCBzRmx1c2hUeEZJRk8oQ0hBTk5FTF9UICogQ2hQKTsKK2ludCBzV3JpdGVUeFByaW9CeXRlKENIQU5ORUxfVCAqIENoUCwgQnl0ZV90IERhdGEpOwordm9pZCBzRW5JbnRlcnJ1cHRzKENIQU5ORUxfVCAqIENoUCwgV29yZF90IEZsYWdzKTsKK3ZvaWQgc0Rpc0ludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpOwordm9pZCBzTW9kZW1SZXNldChDT05UUk9MTEVSX1QgKiBDdGxQLCBpbnQgY2hhbiwgaW50IG9uKTsKK3ZvaWQgc1BDSU1vZGVtUmVzZXQoQ09OVFJPTExFUl9UICogQ3RsUCwgaW50IGNoYW4sIGludCBvbik7Cit2b2lkIHNTZXRJbnRlcmZhY2VNb2RlKENIQU5ORUxfVCAqIENoUCwgQnl0ZV90IG1vZGUpOworCitleHRlcm4gQnl0ZV90IFJbUkRBVEFTSVpFXTsKK2V4dGVybiBDT05UUk9MTEVSX1Qgc0NvbnRyb2xsZXJbQ1RMX1NJWkVdOworZXh0ZXJuIEJ5dGVfdCBzSVJRTWFwWzE2XTsKK2V4dGVybiBCeXRlX3Qgc0JpdE1hcENsclRibFs4XTsKK2V4dGVybiBCeXRlX3Qgc0JpdE1hcFNldFRibFs4XTsKK2V4dGVybiBpbnQgc0Nsb2NrUHJlc2NhbGU7CisKKy8qCisgKiBCZWdpbiBMaW51eCBzcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgdGhlIFJvY2tldHBvcnQgZHJpdmVyCisgKgorICogVGhpcyBjb2RlIGlzIENvcHlyaWdodCBUaGVvZG9yZSBUcydvLCAxOTk1LTE5OTcKKyAqLworCitzdHJ1Y3Qgcl9wb3J0IHsKKwlpbnQgbWFnaWM7CisJaW50IGxpbmU7CisJaW50IGZsYWdzOworCWludCBjb3VudDsKKwlpbnQgYmxvY2tlZF9vcGVuOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgaW50IGJvYXJkOjM7CisJdW5zaWduZWQgaW50IGFpb3A6MjsKKwl1bnNpZ25lZCBpbnQgY2hhbjozOworCUNPTlRST0xMRVJfdCAqY3RscDsKKwlDSEFOTkVMX3QgY2hhbm5lbDsKKwlpbnQgY2xvc2luZ193YWl0OworCWludCBjbG9zZV9kZWxheTsKKwlpbnQgaW50bWFzazsKKwlpbnQgeG1pdF9maWZvX3Jvb207CS8qIHJvb20gaW4geG1pdCBmaWZvICovCisJdW5zaWduZWQgY2hhciAqeG1pdF9idWY7CisJaW50IHhtaXRfaGVhZDsKKwlpbnQgeG1pdF90YWlsOworCWludCB4bWl0X2NudDsKKwlpbnQgc2Vzc2lvbjsKKwlpbnQgcGdycDsKKwlpbnQgY2Rfc3RhdHVzOworCWludCBpZ25vcmVfc3RhdHVzX21hc2s7CisJaW50IHJlYWRfc3RhdHVzX21hc2s7CisJaW50IGNwczsKKworI2lmZGVmIERFQ0xBUkVfV0FJVFFVRVVFCisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGNsb3NlX3dhaXQ7CisjZWxzZQorCXN0cnVjdCB3YWl0X3F1ZXVlICpvcGVuX3dhaXQ7CisJc3RydWN0IHdhaXRfcXVldWUgKmNsb3NlX3dhaXQ7CisjZW5kaWYKKwlzcGlubG9ja190IHNsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgd3JpdGVfc2VtOworfTsKKworI2RlZmluZSBSUE9SVF9NQUdJQyAweDUyNTAwMQorCisjZGVmaW5lIE5VTV9CT0FSRFMgOAorI2RlZmluZSBNQVhfUlBfUE9SVFMgKDMyKk5VTV9CT0FSRFMpCisKKy8qCisgKiBUaGUgc2l6ZSBvZiB0aGUgeG1pdCBidWZmZXIgaXMgMSBwYWdlLCBvciA0MDk2IGJ5dGVzCisgKi8KKyNkZWZpbmUgWE1JVF9CVUZfU0laRSA0MDk2CisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxlZnQgaW4geG1pdCBidWZmZXIgYmVmb3JlIHdlIGFzayBmb3IgbW9yZSAqLworI2RlZmluZSBXQUtFVVBfQ0hBUlMgMjU2CisKKy8qIEludGVybmFsIGZsYWdzIHVzZWQgb25seSBieSB0aGUgcm9ja2V0cG9ydCBkcml2ZXIgKi8KKyNkZWZpbmUgUk9DS0VUX0lOSVRJQUxJWkVECTB4ODAwMDAwMDAJLyogUG9ydCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgUk9DS0VUX0NMT1NJTkcJCTB4NDAwMDAwMDAJLyogU2VyaWFsIHBvcnQgaXMgY2xvc2luZyAqLworI2RlZmluZSBST0NLRVRfTk9STUFMX0FDVElWRQkweDIwMDAwMDAwCS8qIE5vcm1hbCBwb3J0IGlzIGFjdGl2ZSAqLworCisvKiB0dHkgc3VidHlwZXMgKi8KKyNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMIDEKKworLyoKKyAqIEFzc2lnbmVkIG1ham9yIG51bWJlcnMgZm9yIHRoZSBDb210cm9sIFJvY2tldHBvcnQKKyAqLworI2RlZmluZSBUVFlfUk9DS0VUX01BSk9SCTQ2CisjZGVmaW5lIENVQV9ST0NLRVRfTUFKT1IJNDcKKworI2lmZGVmIFBDSV9WRU5ET1JfSURfUlAKKyN1bmRlZiBQQ0lfVkVORE9SX0lEX1JQCisjdW5kZWYgUENJX0RFVklDRV9JRF9SUDhPQ1RBCisjdW5kZWYgUENJX0RFVklDRV9JRF9SUDhJTlRGCisjdW5kZWYgUENJX0RFVklDRV9JRF9SUDE2SU5URgorI3VuZGVmIFBDSV9ERVZJQ0VfSURfUlAzMklOVEYKKyN1bmRlZiBQQ0lfREVWSUNFX0lEX1VSUDhPQ1RBCisjdW5kZWYgUENJX0RFVklDRV9JRF9VUlA4SU5URgorI3VuZGVmIFBDSV9ERVZJQ0VfSURfVVJQMTZJTlRGCisjdW5kZWYgUENJX0RFVklDRV9JRF9DUlAxNklOVEYKKyN1bmRlZiBQQ0lfREVWSUNFX0lEX1VSUDMySU5URgorI2VuZGlmCisKKy8qICBDb210cm9sIFBDSSBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SUAkJMHgxMWZlCisKKy8qICBDb210cm9sIERldmljZSBJRCdzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlAzMklOVEYJCTB4MDAwMQkvKiBSb2NrZXRwb3J0IDMyIHBvcnQgdy9leHRlcm5hbCBJL0YgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4SU5URgkJMHgwMDAyCS8qIFJvY2tldHBvcnQgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GICAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDE2SU5URgkJMHgwMDAzCS8qIFJvY2tldHBvcnQgMTYgcG9ydCB3L2V4dGVybmFsIEkvRiAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDRRVUFECQkweDAwMDQJLyogUm9ja2V0cG9ydCA0IHBvcnQgdy9xdWFkIGNhYmxlICAgICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQOE9DVEEJCTB4MDAwNQkvKiBSb2NrZXRwb3J0IDggcG9ydCB3L29jdGEgY2FibGUgICAgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4SgkJMHgwMDA2CS8qIFJvY2tldHBvcnQgOCBwb3J0IHcvUkoxMSBjb25uZWN0b3JzICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDRKCQkweDAwMDcJLyogUm9ja2V0cG9ydCA0IHBvcnQgdy9SSjExIGNvbm5lY3RvcnMgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQOFNOSQkJMHgwMDA4CS8qIFJvY2tldHBvcnQgOCBwb3J0IHcvIERCNzggU05JIChTaWVtZW5zKSBjb25uZWN0b3IgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDE2U05JCQkweDAwMDkJLyogUm9ja2V0cG9ydCAxNiBwb3J0IHcvIERCNzggU05JIChTaWVtZW5zKSBjb25uZWN0b3IgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQUDQJCTB4MDAwQQkvKiBSb2NrZXRwb3J0IFBsdXMgNCBwb3J0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlBQOAkJMHgwMDBCCS8qIFJvY2tldHBvcnQgUGx1cyA4IHBvcnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDZNCQkweDAwMEMJLyogUm9ja2V0TW9kZW0gNiBwb3J0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JQNE0JCTB4MDAwRAkvKiBSb2NrZXRNb2RlbSA0IHBvcnQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlAyXzIzMiAgICAgICAgICAgMHgwMDBFCS8qIFJvY2tldHBvcnQgUGx1cyAyIHBvcnQgUlMyMzIgICAgICAgICAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDJfNDIyICAgICAgICAgICAweDAwMEYJLyogUm9ja2V0cG9ydCBQbHVzIDIgcG9ydCBSUzQyMiAgICAgICAgICAqLyAKKworLyogVW5pdmVyc2FsIFBDSSBib2FyZHMgICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVVJQMzJJTlRGCQkweDA4MDEJLyogUm9ja2V0cG9ydCBVUENJIDMyIHBvcnQgdy9leHRlcm5hbCBJL0YgKi8gCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVVJQOElOVEYJCTB4MDgwMgkvKiBSb2NrZXRwb3J0IFVQQ0kgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VSUDE2SU5URgkJMHgwODAzCS8qIFJvY2tldHBvcnQgVVBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVVJQOE9DVEEJCTB4MDgwNQkvKiBSb2NrZXRwb3J0IFVQQ0kgOCBwb3J0IHcvb2N0YSBjYWJsZSAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VQQ0lfUk0zXzhQT1JUICAgIDB4MDgwQwkvKiBSb2NrZXRtb2RlbSBJSUkgOCBwb3J0ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VQQ0lfUk0zXzRQT1JUICAgIDB4MDgwRAkvKiBSb2NrZXRtb2RlbSBJSUkgNCBwb3J0ICAgICAgICAgICAgICAgICAqLworCisvKiBDb21wYWN0IFBDSSBkZXZpY2UgKi8gCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1JQMTZJTlRGCQkweDA5MDMJLyogUm9ja2V0cG9ydCBDb21wYWN0IFBDSSAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GICovCisKKyNkZWZpbmUgVFRZX0dFVF9MSU5FKHQpIHQtPmluZGV4CisjZGVmaW5lIFRUWV9EUklWRVJfTUlOT1JfU1RBUlQodCkgdC0+ZHJpdmVyLT5taW5vcl9zdGFydAorI2RlZmluZSBUVFlfRFJJVkVSX1NVQlRZUEUodCkgdC0+ZHJpdmVyLT5zdWJ0eXBlCisjZGVmaW5lIFRUWV9EUklWRVJfTkFNRSh0KSB0LT5kcml2ZXItPm5hbWUKKyNkZWZpbmUgVFRZX0RSSVZFUl9OQU1FX0JBU0UodCkgdC0+ZHJpdmVyLT5uYW1lX2Jhc2UKKyNkZWZpbmUgVFRZX0RSSVZFUl9GTFVTSF9CVUZGRVJfRVhJU1RTKHQpIHQtPmRyaXZlci0+Zmx1c2hfYnVmZmVyCisjZGVmaW5lIFRUWV9EUklWRVJfRkxVU0hfQlVGRkVSKHQpIHQtPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHQpCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3J0Yy5jIGIvZHJpdmVycy9jaGFyL3J0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNGYwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcnRjLmMKQEAgLTAsMCArMSwxMzU0IEBACisvKgorICoJUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgTGludXgJCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgR29ydG1ha2VyCisgKgorICoJVGhpcyBkcml2ZXIgYWxsb3dzIHVzZSBvZiB0aGUgcmVhbCB0aW1lIGNsb2NrIChidWlsdCBpbnRvCisgKgluZWFybHkgYWxsIGNvbXB1dGVycykgZnJvbSB1c2VyIHNwYWNlLiBJdCBleHBvcnRzIHRoZSAvZGV2L3J0YworICoJaW50ZXJmYWNlIHN1cHBvcnRpbmcgdmFyaW91cyBpb2N0bCgpIGFuZCBhbHNvIHRoZQorICoJL3Byb2MvZHJpdmVyL3J0YyBwc2V1ZG8tZmlsZSBmb3Igc3RhdHVzIGluZm9ybWF0aW9uLgorICoKKyAqCVRoZSBpb2N0bHMgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbnRlcnJ1cHQgYmVoYXZpb3VyIGFuZAorICoJZ2VuZXJhdGlvbiByYXRlIGZyb20gdGhlIFJUQyB2aWEgSVJRIDguIFRoZW4gdGhlIC9kZXYvcnRjCisgKglpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgdGhlc2UgdGltZXIgaW50ZXJydXB0cywKKyAqCWJlIHRoZXkgaW50ZXJ2YWwgb3IgYWxhcm0gYmFzZWQuCisgKgorICoJVGhlIC9kZXYvcnRjIGludGVyZmFjZSB3aWxsIGJsb2NrIG9uIHJlYWRzIHVudGlsIGFuIGludGVycnVwdAorICoJaGFzIGJlZW4gcmVjZWl2ZWQuIElmIGEgUlRDIGludGVycnVwdCBoYXMgYWxyZWFkeSBoYXBwZW5lZCwKKyAqCWl0IHdpbGwgb3V0cHV0IGFuIHVuc2lnbmVkIGxvbmcgYW5kIHRoZW4gYmxvY2suIFRoZSBvdXRwdXQgdmFsdWUKKyAqCWNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBsb3cgYnl0ZSBhbmQgdGhlIG51bWJlciBvZgorICoJaW50ZXJydXB0cyBzaW5jZSB0aGUgbGFzdCByZWFkIGluIHRoZSByZW1haW5pbmcgaGlnaCBieXRlcy4gVGhlIAorICoJL2Rldi9ydGMgaW50ZXJmYWNlIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgc2VsZWN0KDIpIGNhbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglCYXNlZCBvbiBvdGhlciBtaW5pbWFsIGNoYXIgZGV2aWNlIGRyaXZlcnMsIGxpa2UgQWxhbidzCisgKgl3YXRjaGRvZywgVGVkJ3MgcmFuZG9tLCBldGMuIGV0Yy4KKyAqCisgKgkxLjA3CVBhdWwgR29ydG1ha2VyLgorICoJMS4wOAlNaXF1ZWwgdmFuIFNtb29yZW5idXJnOiBkaXNhbGxvdyBjZXJ0YWluIHRoaW5ncyBvbiB0aGUKKyAqCQlERUMgQWxwaGEgYXMgdGhlIENNT1MgY2xvY2sgaXMgYWxzbyB1c2VkIGZvciBvdGhlciB0aGluZ3MuCisgKgkxLjA5CU5pa2l0YSBTY2htaWR0OiBlcG9jaCBzdXBwb3J0IGFuZCBzb21lIEFscGhhIGNsZWFudXAuCisgKgkxLjA5YQlQZXRlIFphaXRjZXY6IFN1biBTUEFSQworICoJMS4wOWIJSmVmZiBHYXJ6aWs6IE1vZHVsYXJpemUsIGluaXQgY2xlYW51cAorICoJMS4wOWMJSmVmZiBHYXJ6aWs6IFNNUCBjbGVhbnVwCisgKgkxLjEwICAgIFBhdWwgQmFydG9uLURhdmlzOiBhZGQgc3VwcG9ydCBmb3IgYXN5bmMgSS9PCisgKgkxLjEwYQlBbmRyZWEgQXJjYW5nZWxpOiBBbHBoYSB1cGRhdGVzCisgKgkxLjEwYglBbmRyZXcgTW9ydG9uOiBTTVAgbG9jayBmaXgKKyAqCTEuMTBjCUNlc2FyIEJhcnJvczogU01QIGxvY2tpbmcgZml4ZXMgYW5kIGNsZWFudXAKKyAqCTEuMTBkCVBhdWwgR29ydG1ha2VyOiBkZWxldGUgcGFyYW5vaWEgY2hlY2sgaW4gcnRjX2V4aXQKKyAqCTEuMTBlCU1hY2llaiBXLiBSb3p5Y2tpOiBIYW5kbGUgREVDc3RhdGlvbidzIHllYXIgd2VpcmRuZXNzLgorICogICAgICAxLjExICAgIFRha2FzaGkgSXdhaTogS2VybmVsIGFjY2VzcyBmdW5jdGlvbnMKKyAqCQkJICAgICAgcnRjX3JlZ2lzdGVyL3J0Y191bnJlZ2lzdGVyL3J0Y19jb250cm9sCisgKiAgICAgIDEuMTFhICAgRGFuaWVsZSBCZWxsdWNjaTogQXVkaXQgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSBpbiBydGNfaW5pdAorICoJMS4xMglWZW5rYXRlc2ggUGFsbGlwYWRpOiBIb29rcyBmb3IgZW11bGF0aW5nIHJ0YyBvbiBIUEVUIGJhc2UtdGltZXIKKyAqCQlDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworICoKKyAqLworCisjZGVmaW5lIFJUQ19WRVJTSU9OCQkiMS4xMiIKKworI2RlZmluZSBSVENfSU9fRVhURU5UCTB4OAorCisvKgorICoJTm90ZSB0aGF0ICphbGwqIGNhbGxzIHRvIENNT1NfUkVBRCBhbmQgQ01PU19XUklURSBhcmUgZG9uZSB3aXRoCisgKglpbnRlcnJ1cHRzIGRpc2FibGVkLiBEdWUgdG8gdGhlIGluZGV4LXBvcnQvZGF0YS1wb3J0ICgweDcwLzB4NzEpCisgKglkZXNpZ24gb2YgdGhlIFJUQywgd2UgZG9uJ3Qgd2FudCB0d28gZGlmZmVyZW50IHRoaW5ncyB0cnlpbmcgdG8KKyAqCWdldCB0byBpdCBhdCBvbmNlLiAoZS5nLiB0aGUgcGVyaW9kaWMgMTEgbWluIHN5bmMgZnJvbSB0aW1lLmMgdnMuCisgKgl0aGlzIGRyaXZlci4pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2lmIGRlZmluZWQoX19pMzg2X18pCisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKyNlbmRpZgorCisjaWZkZWYgX19zcGFyY19fCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2VidXMuaD4KKyNpZmRlZiBfX3NwYXJjX3Y5X18KKyNpbmNsdWRlIDxhc20vaXNhLmg+CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX3BvcnQ7CitzdGF0aWMgaW50IHJ0Y19pcnEgPSBQQ0lfSVJRX05PTkU7CisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19IUEVUX1JUQ19JUlEKKyN1bmRlZglSVENfSVJRCisjZW5kaWYKKworI2lmZGVmIFJUQ19JUlEKK3N0YXRpYyBpbnQgcnRjX2hhc19pcnEgPSAxOworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKyNkZWZpbmUgaXNfaHBldF9lbmFibGVkKCkJCQkwCisjZGVmaW5lIGhwZXRfc2V0X2FsYXJtX3RpbWUoaHJzLCBtaW4sIHNlYykgCTAKKyNkZWZpbmUgaHBldF9zZXRfcGVyaW9kaWNfZnJlcShhcmcpIAkJMAorI2RlZmluZSBocGV0X21hc2tfcnRjX2lycV9iaXQoYXJnKSAJCTAKKyNkZWZpbmUgaHBldF9zZXRfcnRjX2lycV9iaXQoYXJnKSAJCTAKKyNkZWZpbmUgaHBldF9ydGNfdGltZXJfaW5pdCgpIAkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaHBldF9ydGNfZHJvcHBlZF9pcnEoKSAJCQkwCitzdGF0aWMgaW5saW5lIGlycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSB7cmV0dXJuIDA7fQorI2Vsc2UKK2V4dGVybiBpcnFyZXR1cm5fdCBocGV0X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZW5kaWYKKworLyoKKyAqCVdlIHNwb25nZSBhIG1pbm9yIG9mZiBvZiB0aGUgbWlzYyBtYWpvci4gTm8gbmVlZCBzbHVycGluZworICoJdXAgYW5vdGhlciB2YWx1YWJsZSBtYWpvciBkZXYgbnVtYmVyIGZvciB0aGlzLiBJZiB5b3UgYWRkCisgKglhbiBpb2N0bCwgbWFrZSBzdXJlIHlvdSBkb24ndCBjb25mbGljdCB3aXRoIFNQQVJDJ3MgUlRDCisgKglpb2N0bHMuCisgKi8KKworc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICpydGNfYXN5bmNfcXVldWU7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChydGNfd2FpdCk7CisKKyNpZmRlZiBSVENfSVJRCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcnRjX2lycV90aW1lcjsKKyNlbmRpZgorCitzdGF0aWMgc3NpemVfdCBydGNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworc3RhdGljIGludCBydGNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisjaWZkZWYgUlRDX0lSUQorc3RhdGljIHVuc2lnbmVkIGludCBydGNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X3J0Y19hbG1fdGltZSAoc3RydWN0IHJ0Y190aW1lICphbG1fdG0pOworI2lmZGVmIFJUQ19JUlEKK3N0YXRpYyB2b2lkIHJ0Y19kcm9wcGVkX2lycSh1bnNpZ25lZCBsb25nIGRhdGEpOworCitzdGF0aWMgdm9pZCBzZXRfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpOworc3RhdGljIHZvaWQgbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCk7CisjZW5kaWYKKworc3RhdGljIGludCBydGNfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKKworLyoKKyAqCUJpdHMgaW4gcnRjX3N0YXR1cy4gKDYgYml0cyBvZiByb29tIGZvciBmdXR1cmUgZXhwYW5zaW9uKQorICovCisKKyNkZWZpbmUgUlRDX0lTX09QRU4JCTB4MDEJLyogbWVhbnMgL2Rldi9ydGMgaXMgaW4gdXNlCSovCisjZGVmaW5lIFJUQ19USU1FUl9PTgkJMHgwMgkvKiBtaXNzZWQgaXJxIHRpbWVyIGFjdGl2ZQkqLworCisvKgorICogcnRjX3N0YXR1cyBpcyBuZXZlciBjaGFuZ2VkIGJ5IHJ0Y19pbnRlcnJ1cHQsIGFuZCBpb2N0bC9vcGVuL2Nsb3NlIGlzCisgKiBwcm90ZWN0ZWQgYnkgdGhlIGJpZyBrZXJuZWwgbG9jay4gSG93ZXZlciwgaW9jdGwgY2FuIHN0aWxsIGRpc2FibGUgdGhlIHRpbWVyCisgKiBpbiBydGNfc3RhdHVzIGFuZCB0aGVuIHdpdGggZGVsX3RpbWVyIGFmdGVyIHRoZSBpbnRlcnJ1cHQgaGFzIHJlYWQKKyAqIHJ0Y19zdGF0dXMgYnV0IGJlZm9yZSBtb2RfdGltZXIgaXMgY2FsbGVkLCB3aGljaCB3b3VsZCB0aGVuIHJlZW5hYmxlIHRoZQorICogdGltZXIgKGJ1dCB5b3Ugd291bGQgbmVlZCB0byBoYXZlIGFuIGF3ZnVsIHRpbWluZyBiZWZvcmUgeW91J2QgdHJpcCBvbiBpdCkKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX3N0YXR1cyA9IDA7CS8qIGJpdG1hcHBlZCBzdGF0dXMgYnl0ZS4JKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y19mcmVxID0gMDsJLyogQ3VycmVudCBwZXJpb2RpYyBJUlEgcmF0ZQkqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX2lycV9kYXRhID0gMDsJLyogb3VyIG91dHB1dCB0byB0aGUgd29ybGQJKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y19tYXhfdXNlcl9mcmVxID0gNjQ7IC8qID4gdGhpcywgbmVlZCBDQVBfU1lTX1JFU09VUkNFICovCisKKyNpZmRlZiBSVENfSVJRCisvKgorICogcnRjX3Rhc2tfbG9jayBuZXN0cyBpbnNpZGUgcnRjX2xvY2suCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnRjX3Rhc2tfbG9jayk7CitzdGF0aWMgcnRjX3Rhc2tfdCAqcnRjX2NhbGxiYWNrID0gTlVMTDsKKyNlbmRpZgorCisvKgorICoJSWYgdGhpcyBkcml2ZXIgZXZlciBiZWNvbWVzIG1vZHVsYXJpc2VkLCBpdCB3aWxsIGJlIHJlYWxseSBuaWNlCisgKgl0byBtYWtlIHRoZSBlcG9jaCByZXRhaW4gaXRzIHZhbHVlIGFjcm9zcyBtb2R1bGUgcmVsb2FkLi4uCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXBvY2ggPSAxOTAwOwkvKiB5ZWFyIGNvcnJlc3BvbmRpbmcgdG8gMHgwMAkqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkYXlzX2luX21vW10gPSAKK3swLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIGNsb2NrIHVwZGF0ZSBpcyBpbiBwcm9ncmVzcworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcnRjX2lzX3VwZGF0aW5nKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciB1aXA7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJdWlwID0gKENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpICYgUlRDX1VJUCk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJcmV0dXJuIHVpcDsKK30KKworI2lmZGVmIFJUQ19JUlEKKy8qCisgKglBIHZlcnkgdGlueSBpbnRlcnJ1cHQgaGFuZGxlci4gSXQgcnVucyB3aXRoIFNBX0lOVEVSUlVQVCBzZXQsCisgKglidXQgdGhlcmUgaXMgcG9zc2liaWxpdHkgb2YgY29uZmxpY3Rpbmcgd2l0aCB0aGUgc2V0X3J0Y19tbXNzKCkKKyAqCWNhbGwgKHRoZSBydGMgaXJxIGFuZCB0aGUgdGltZXIgaXJxIGNhbiBlYXNpbHkgcnVuIGF0IHRoZSBzYW1lCisgKgl0aW1lIGluIHR3byBkaWZmZXJlbnQgQ1BVcykuIFNvIHdlIG5lZWQgdG8gc2VyaWFsaXplCisgKglhY2Nlc3NlcyB0byB0aGUgY2hpcCB3aXRoIHRoZSBydGNfbG9jayBzcGlubG9jayB0aGF0IGVhY2gKKyAqCWFyY2hpdGVjdHVyZSBzaG91bGQgaW1wbGVtZW50IGluIHRoZSB0aW1lciBjb2RlLgorICoJKFNlZSAuL2FyY2gvWFhYWC9rZXJuZWwvdGltZS5jIGZvciB0aGUgc2V0X3J0Y19tbXNzKCkgZnVuY3Rpb24uKQorICovCisKK2lycXJldHVybl90IHJ0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKgorCSAqCUNhbiBiZSBhbiBhbGFybSBpbnRlcnJ1cHQsIHVwZGF0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQsCisJICoJb3IgYSBwZXJpb2RpYyBpbnRlcnJ1cHQuIFdlIHN0b3JlIHRoZSBzdGF0dXMgaW4gdGhlCisJICoJbG93IGJ5dGUgYW5kIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyByZWNlaXZlZCBzaW5jZQorCSAqCXRoZSBsYXN0IHJlYWQgaW4gdGhlIHJlbWFpbmRlciBvZiBydGNfaXJxX2RhdGEuCisJICovCisKKwlzcGluX2xvY2sgKCZydGNfbG9jayk7CisJcnRjX2lycV9kYXRhICs9IDB4MTAwOworCXJ0Y19pcnFfZGF0YSAmPSB+MHhmZjsKKwlpZiAoaXNfaHBldF9lbmFibGVkKCkpIHsKKwkJLyoKKwkJICogSW4gdGhpcyBjYXNlIGl0IGlzIEhQRVQgUlRDIGludGVycnVwdCBoYW5kbGVyCisJCSAqIGNhbGxpbmcgdXMsIHdpdGggdGhlIGludGVycnVwdCBpbmZvcm1hdGlvbgorCQkgKiBwYXNzZWQgYXMgYXJnMSwgaW5zdGVhZCBvZiBpcnEuCisJCSAqLworCQlydGNfaXJxX2RhdGEgfD0gKHVuc2lnbmVkIGxvbmcpaXJxICYgMHhGMDsKKwl9IGVsc2UgeworCQlydGNfaXJxX2RhdGEgfD0gKENNT1NfUkVBRChSVENfSU5UUl9GTEFHUykgJiAweEYwKTsKKwl9CisKKwlpZiAocnRjX3N0YXR1cyAmIFJUQ19USU1FUl9PTikKKwkJbW9kX3RpbWVyKCZydGNfaXJxX3RpbWVyLCBqaWZmaWVzICsgSFovcnRjX2ZyZXEgKyAyKkhaLzEwMCk7CisKKwlzcGluX3VubG9jayAoJnJ0Y19sb2NrKTsKKworCS8qIE5vdyBkbyB0aGUgcmVzdCBvZiB0aGUgYWN0aW9ucyAqLworCXNwaW5fbG9jaygmcnRjX3Rhc2tfbG9jayk7CisJaWYgKHJ0Y19jYWxsYmFjaykKKwkJcnRjX2NhbGxiYWNrLT5mdW5jKHJ0Y19jYWxsYmFjay0+cHJpdmF0ZV9kYXRhKTsKKwlzcGluX3VubG9jaygmcnRjX3Rhc2tfbG9jayk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGNfd2FpdCk7CQorCisJa2lsbF9mYXN5bmMgKCZydGNfYXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbmRpZgorCisvKgorICogc3lzY3RsLXR1bmluZyBpbmZyYXN0cnVjdHVyZS4KKyAqLworc3RhdGljIGN0bF90YWJsZSBydGNfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IDEsCisJCS5wcm9jbmFtZQk9ICJtYXgtdXNlci1mcmVxIiwKKwkJLmRhdGEJCT0gJnJ0Y19tYXhfdXNlcl9mcmVxLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBydGNfcm9vdFtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gMSwKKwkJLnByb2NuYW1lCT0gInJ0YyIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IHJ0Y190YWJsZSwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGRldl9yb290W10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfREVWLAorCQkucHJvY25hbWUJPSAiZGV2IiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gcnRjX3Jvb3QsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzeXNjdGxfaGVhZGVyOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3N5c2N0bCh2b2lkKQoreworICAgIHN5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoZGV2X3Jvb3QsIDApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zeXNjdGwodm9pZCkKK3sKKyAgICB1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfaGVhZGVyKTsKK30KKworLyoKKyAqCU5vdyBhbGwgdGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHRoYXQgd2UgZXhwb3J0LgorICovCisKK3N0YXRpYyBzc2l6ZV90IHJ0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisjaWZuZGVmIFJUQ19JUlEKKwlyZXR1cm4gLUVJTzsKKyNlbHNlCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXNzaXplX3QgcmV0dmFsOworCQorCWlmIChydGNfaGFzX2lycSA9PSAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChjb3VudCA8IHNpemVvZih1bnNpZ25lZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkX3dhaXRfcXVldWUoJnJ0Y193YWl0LCAmd2FpdCk7CisKKwlkbyB7CisJCS8qIEZpcnN0IG1ha2UgaXQgcmlnaHQuIFRoZW4gbWFrZSBpdCBmYXN0LiBQdXR0aW5nIHRoaXMgd2hvbGUKKwkJICogYmxvY2sgd2l0aGluIHRoZSBwYXJlbnRoZXNlcyBvZiBhIHdoaWxlIHdvdWxkIGJlIHRvbworCQkgKiBjb25mdXNpbmcuIEFuZCBubywgeGNoZygpIGlzIG5vdCB0aGUgYW5zd2VyLiAqLworCisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCisJCXNwaW5fbG9ja19pcnEgKCZydGNfbG9jayk7CisJCWRhdGEgPSBydGNfaXJxX2RhdGE7CisJCXJ0Y19pcnFfZGF0YSA9IDA7CisJCXNwaW5fdW5sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKworCQlpZiAoZGF0YSAhPSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0gd2hpbGUgKDEpOworCisJaWYgKGNvdW50IDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlyZXR2YWwgPSBwdXRfdXNlcihkYXRhLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWJ1ZikgPzogc2l6ZW9mKGludCk7IAorCWVsc2UKKwkJcmV0dmFsID0gcHV0X3VzZXIoZGF0YSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYnVmKSA/OiBzaXplb2YobG9uZyk7Cisgb3V0OgorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZydGNfd2FpdCwgJndhaXQpOworCisJcmV0dXJuIHJldHZhbDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHJ0Y19kb19pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IGtlcm5lbCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7IAorCisjaWZkZWYgUlRDX0lSUQorCWlmIChydGNfaGFzX2lycSA9PSAwKSB7CisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgUlRDX0FJRV9PRkY6CisJCWNhc2UgUlRDX0FJRV9PTjoKKwkJY2FzZSBSVENfUElFX09GRjoKKwkJY2FzZSBSVENfUElFX09OOgorCQljYXNlIFJUQ19VSUVfT0ZGOgorCQljYXNlIFJUQ19VSUVfT046CisJCWNhc2UgUlRDX0lSUVBfUkVBRDoKKwkJY2FzZSBSVENfSVJRUF9TRVQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfTsKKwl9CisjZW5kaWYKKworCXN3aXRjaCAoY21kKSB7CisjaWZkZWYgUlRDX0lSUQorCWNhc2UgUlRDX0FJRV9PRkY6CS8qIE1hc2sgYWxhcm0gaW50LiBlbmFiLiBiaXQJKi8KKwl7CisJCW1hc2tfcnRjX2lycV9iaXQoUlRDX0FJRSk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19BSUVfT046CS8qIEFsbG93IGFsYXJtIGludGVycnVwdHMuCSovCisJeworCQlzZXRfcnRjX2lycV9iaXQoUlRDX0FJRSk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19QSUVfT0ZGOgkvKiBNYXNrIHBlcmlvZGljIGludC4gZW5hYi4gYml0CSovCisJeworCQltYXNrX3J0Y19pcnFfYml0KFJUQ19QSUUpOworCQlpZiAocnRjX3N0YXR1cyAmIFJUQ19USU1FUl9PTikgeworCQkJc3Bpbl9sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwkJCXJ0Y19zdGF0dXMgJj0gflJUQ19USU1FUl9PTjsKKwkJCWRlbF90aW1lcigmcnRjX2lycV90aW1lcik7CisJCQlzcGluX3VubG9ja19pcnEgKCZydGNfbG9jayk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1BJRV9PTjoJLyogQWxsb3cgcGVyaW9kaWMgaW50cwkJKi8KKwl7CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgcmVhbGx5IHdhbnQgSm9lIFVzZXIgZW5hYmxpbmcgbW9yZQorCQkgKiB0aGFuIDY0SHogb2YgaW50ZXJydXB0cyBvbiBhIG11bHRpLXVzZXIgbWFjaGluZS4KKwkJICovCisJCWlmICgha2VybmVsICYmIChydGNfZnJlcSA+IHJ0Y19tYXhfdXNlcl9mcmVxKSAmJgorCQkJKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmICghKHJ0Y19zdGF0dXMgJiBSVENfVElNRVJfT04pKSB7CisJCQlzcGluX2xvY2tfaXJxICgmcnRjX2xvY2spOworCQkJcnRjX2lycV90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaL3J0Y19mcmVxICsgMipIWi8xMDA7CisJCQlhZGRfdGltZXIoJnJ0Y19pcnFfdGltZXIpOworCQkJcnRjX3N0YXR1cyB8PSBSVENfVElNRVJfT047CisJCQlzcGluX3VubG9ja19pcnEgKCZydGNfbG9jayk7CisJCX0KKwkJc2V0X3J0Y19pcnFfYml0KFJUQ19QSUUpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfVUlFX09GRjoJLyogTWFzayBpbnRzIGZyb20gUlRDIHVwZGF0ZXMuCSovCisJeworCQltYXNrX3J0Y19pcnFfYml0KFJUQ19VSUUpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfVUlFX09OOgkvKiBBbGxvdyBpbnRzIGZvciBSVEMgdXBkYXRlcy4JKi8KKwl7CisJCXNldF9ydGNfaXJxX2JpdChSVENfVUlFKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJY2FzZSBSVENfQUxNX1JFQUQ6CS8qIFJlYWQgdGhlIHByZXNlbnQgYWxhcm0gdGltZSAqLworCXsKKwkJLyoKKwkJICogVGhpcyByZXR1cm5zIGEgc3RydWN0IHJ0Y190aW1lLiBSZWFkaW5nID49IDB4YzAKKwkJICogbWVhbnMgImRvbid0IGNhcmUiIG9yICJtYXRjaCBhbGwiLiBPbmx5IHRoZSB0bV9ob3VyLAorCQkgKiB0bV9taW4sIGFuZCB0bV9zZWMgdmFsdWVzIGFyZSBmaWxsZWQgaW4uCisJCSAqLworCQltZW1zZXQoJnd0aW1lLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CisJCWdldF9ydGNfYWxtX3RpbWUoJnd0aW1lKTsKKwkJYnJlYWs7IAorCX0KKwljYXNlIFJUQ19BTE1fU0VUOgkvKiBTdG9yZSBhIHRpbWUgaW50byB0aGUgYWxhcm0gKi8KKwl7CisJCS8qCisJCSAqIFRoaXMgZXhwZWN0cyBhIHN0cnVjdCBydGNfdGltZS4gV3JpdGluZyAweGZmIG1lYW5zCisJCSAqICJkb24ndCBjYXJlIiBvciAibWF0Y2ggYWxsIi4gT25seSB0aGUgdG1faG91ciwKKwkJICogdG1fbWluIGFuZCB0bV9zZWMgYXJlIHVzZWQuCisJCSAqLworCQl1bnNpZ25lZCBjaGFyIGhycywgbWluLCBzZWM7CisJCXN0cnVjdCBydGNfdGltZSBhbG1fdG07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhbG1fdG0sIChzdHJ1Y3QgcnRjX3RpbWUgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWhycyA9IGFsbV90bS50bV9ob3VyOworCQltaW4gPSBhbG1fdG0udG1fbWluOworCQlzZWMgPSBhbG1fdG0udG1fc2VjOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJaWYgKGhwZXRfc2V0X2FsYXJtX3RpbWUoaHJzLCBtaW4sIHNlYykpIHsKKwkJCS8qCisJCQkgKiBGYWxsdGhydSBhbmQgc2V0IGFsYXJtIHRpbWUgaW4gQ01PUyB0b28sCisJCQkgKiBzbyB0aGF0IHdlIHdpbGwgZ2V0IHByb3BlciB2YWx1ZSBpbiBSVENfQUxNX1JFQUQKKwkJCSAqLworCQl9CisJCWlmICghKENNT1NfUkVBRChSVENfQ09OVFJPTCkgJiBSVENfRE1fQklOQVJZKSB8fAorCQkgICAgUlRDX0FMV0FZU19CQ0QpCisJCXsKKwkJCWlmIChzZWMgPCA2MCkgQklOX1RPX0JDRChzZWMpOworCQkJZWxzZSBzZWMgPSAweGZmOworCisJCQlpZiAobWluIDwgNjApIEJJTl9UT19CQ0QobWluKTsKKwkJCWVsc2UgbWluID0gMHhmZjsKKworCQkJaWYgKGhycyA8IDI0KSBCSU5fVE9fQkNEKGhycyk7CisJCQllbHNlIGhycyA9IDB4ZmY7CisJCX0KKwkJQ01PU19XUklURShocnMsIFJUQ19IT1VSU19BTEFSTSk7CisJCUNNT1NfV1JJVEUobWluLCBSVENfTUlOVVRFU19BTEFSTSk7CisJCUNNT1NfV1JJVEUoc2VjLCBSVENfU0VDT05EU19BTEFSTSk7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19SRF9USU1FOgkvKiBSZWFkIHRoZSB0aW1lL2RhdGUgZnJvbSBSVEMJKi8KKwl7CisJCW1lbXNldCgmd3RpbWUsIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKKwkJcnRjX2dldF9ydGNfdGltZSgmd3RpbWUpOworCQlicmVhazsKKwl9CisJY2FzZSBSVENfU0VUX1RJTUU6CS8qIFNldCB0aGUgUlRDICovCisJeworCQlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworCQl1bnNpZ25lZCBjaGFyIG1vbiwgZGF5LCBocnMsIG1pbiwgc2VjLCBsZWFwX3lyOworCQl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbCwgc2F2ZV9mcmVxX3NlbGVjdDsKKwkJdW5zaWduZWQgaW50IHlyczsKKyNpZmRlZiBDT05GSUdfTUFDSF9ERUNTVEFUSU9OCisJCXVuc2lnbmVkIGludCByZWFsX3lyczsKKyNlbmRpZgorCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZydGNfdG0sIChzdHJ1Y3QgcnRjX3RpbWUgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXlycyA9IHJ0Y190bS50bV95ZWFyICsgMTkwMDsKKwkJbW9uID0gcnRjX3RtLnRtX21vbiArIDE7ICAgLyogdG1fbW9uIHN0YXJ0cyBhdCB6ZXJvICovCisJCWRheSA9IHJ0Y190bS50bV9tZGF5OworCQlocnMgPSBydGNfdG0udG1faG91cjsKKwkJbWluID0gcnRjX3RtLnRtX21pbjsKKwkJc2VjID0gcnRjX3RtLnRtX3NlYzsKKworCQlpZiAoeXJzIDwgMTk3MCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxlYXBfeXIgPSAoKCEoeXJzICUgNCkgJiYgKHlycyAlIDEwMCkpIHx8ICEoeXJzICUgNDAwKSk7CisKKwkJaWYgKChtb24gPiAxMikgfHwgKGRheSA9PSAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChkYXkgPiAoZGF5c19pbl9tb1ttb25dICsgKChtb24gPT0gMikgJiYgbGVhcF95cikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkKKwkJaWYgKChocnMgPj0gMjQpIHx8IChtaW4gPj0gNjApIHx8IChzZWMgPj0gNjApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCh5cnMgLT0gZXBvY2gpID4gMjU1KSAgICAvKiBUaGV5IGFyZSB1bnNpZ25lZCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworI2lmZGVmIENPTkZJR19NQUNIX0RFQ1NUQVRJT04KKwkJcmVhbF95cnMgPSB5cnM7CisJCXlycyA9IDcyOworCisJCS8qCisJCSAqIFdlIHdhbnQgdG8ga2VlcCB0aGUgeWVhciBzZXQgdG8gNzMgdW50aWwgTWFyY2gKKwkJICogZm9yIG5vbi1sZWFwIHllYXJzLCBzbyB0aGF0IEZlYiwgMjl0aCBpcyBoYW5kbGVkCisJCSAqIGNvcnJlY3RseS4KKwkJICovCisJCWlmICghbGVhcF95ciAmJiBtb24gPCAzKSB7CisJCQlyZWFsX3lycy0tOworCQkJeXJzID0gNzM7CisJCX0KKyNlbmRpZgorCQkvKiBUaGVzZSBsaW1pdHMgYW5kIGFkanVzdG1lbnRzIGFyZSBpbmRlcGVuZGVudCBvZgorCQkgKiB3aGV0aGVyIHRoZSBjaGlwIGlzIGluIGJpbmFyeSBtb2RlIG9yIG5vdC4KKwkJICovCisJCWlmICh5cnMgPiAxNjkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHlycyA+PSAxMDApCisJCQl5cnMgLT0gMTAwOworCisJCWlmICghKENNT1NfUkVBRChSVENfQ09OVFJPTCkgJiBSVENfRE1fQklOQVJZKQorCQkgICAgfHwgUlRDX0FMV0FZU19CQ0QpIHsKKwkJCUJJTl9UT19CQ0Qoc2VjKTsKKwkJCUJJTl9UT19CQ0QobWluKTsKKwkJCUJJTl9UT19CQ0QoaHJzKTsKKwkJCUJJTl9UT19CQ0QoZGF5KTsKKwkJCUJJTl9UT19CQ0QobW9uKTsKKwkJCUJJTl9UT19CQ0QoeXJzKTsKKwkJfQorCisJCXNhdmVfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJCUNNT1NfV1JJVEUoKHNhdmVfY29udHJvbHxSVENfU0VUKSwgUlRDX0NPTlRST0wpOworCQlzYXZlX2ZyZXFfc2VsZWN0ID0gQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCk7CisJCUNNT1NfV1JJVEUoKHNhdmVfZnJlcV9zZWxlY3R8UlRDX0RJVl9SRVNFVDIpLCBSVENfRlJFUV9TRUxFQ1QpOworCisjaWZkZWYgQ09ORklHX01BQ0hfREVDU1RBVElPTgorCQlDTU9TX1dSSVRFKHJlYWxfeXJzLCBSVENfREVDX1lFQVIpOworI2VuZGlmCisJCUNNT1NfV1JJVEUoeXJzLCBSVENfWUVBUik7CisJCUNNT1NfV1JJVEUobW9uLCBSVENfTU9OVEgpOworCQlDTU9TX1dSSVRFKGRheSwgUlRDX0RBWV9PRl9NT05USCk7CisJCUNNT1NfV1JJVEUoaHJzLCBSVENfSE9VUlMpOworCQlDTU9TX1dSSVRFKG1pbiwgUlRDX01JTlVURVMpOworCQlDTU9TX1dSSVRFKHNlYywgUlRDX1NFQ09ORFMpOworCisJCUNNT1NfV1JJVEUoc2F2ZV9jb250cm9sLCBSVENfQ09OVFJPTCk7CisJCUNNT1NfV1JJVEUoc2F2ZV9mcmVxX3NlbGVjdCwgUlRDX0ZSRVFfU0VMRUNUKTsKKworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIFJUQ19JUlEKKwljYXNlIFJUQ19JUlFQX1JFQUQ6CS8qIFJlYWQgdGhlIHBlcmlvZGljIElSUSByYXRlLgkqLworCXsKKwkJcmV0dXJuIHB1dF91c2VyKHJ0Y19mcmVxLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpOworCX0KKwljYXNlIFJUQ19JUlFQX1NFVDoJLyogU2V0IHBlcmlvZGljIElSUSByYXRlLgkqLworCXsKKwkJaW50IHRtcCA9IDA7CisJCXVuc2lnbmVkIGNoYXIgdmFsOworCisJCS8qIAorCQkgKiBUaGUgbWF4IHdlIGNhbiBkbyBpcyA4MTkySHouCisJCSAqLworCQlpZiAoKGFyZyA8IDIpIHx8IChhcmcgPiA4MTkyKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKgorCQkgKiBXZSBkb24ndCByZWFsbHkgd2FudCBKb2UgVXNlciBnZW5lcmF0aW5nIG1vcmUKKwkJICogdGhhbiA2NEh6IG9mIGludGVycnVwdHMgb24gYSBtdWx0aS11c2VyIG1hY2hpbmUuCisJCSAqLworCQlpZiAoIWtlcm5lbCAmJiAoYXJnID4gcnRjX21heF91c2VyX2ZyZXEpICYmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQl3aGlsZSAoYXJnID4gKDE8PHRtcCkpCisJCQl0bXArKzsKKworCQkvKgorCQkgKiBDaGVjayB0aGF0IHRoZSBpbnB1dCB3YXMgcmVhbGx5IGEgcG93ZXIgb2YgMi4KKwkJICovCisJCWlmIChhcmcgIT0gKDE8PHRtcCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJCWlmIChocGV0X3NldF9wZXJpb2RpY19mcmVxKGFyZykpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcnRjX2ZyZXEgPSBhcmc7CisKKwkJdmFsID0gQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCkgJiAweGYwOworCQl2YWwgfD0gKDE2IC0gdG1wKTsKKwkJQ01PU19XUklURSh2YWwsIFJUQ19GUkVRX1NFTEVDVCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwljYXNlIFJUQ19FUE9DSF9SRUFEOgkvKiBSZWFkIHRoZSBlcG9jaC4JKi8KKwl7CisJCXJldHVybiBwdXRfdXNlciAoZXBvY2gsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZyk7CisJfQorCWNhc2UgUlRDX0VQT0NIX1NFVDoJLyogU2V0IHRoZSBlcG9jaC4JKi8KKwl7CisJCS8qIAorCQkgKiBUaGVyZSB3ZXJlIG5vIFJUQyBjbG9ja3MgYmVmb3JlIDE5MDAuCisJCSAqLworCQlpZiAoYXJnIDwgMTkwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJZXBvY2ggPSBhcmc7CisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ3dGltZSwgc2l6ZW9mIHd0aW1lKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHJ0Y19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gcnRjX2RvX2lvY3RsKGNtZCwgYXJnLCAwKTsKK30KKworLyoKKyAqCVdlIGVuZm9yY2Ugb25seSBvbmUgdXNlciBhdCBhIHRpbWUgaGVyZSB3aXRoIHRoZSBvcGVuL2Nsb3NlLgorICoJQWxzbyBjbGVhciB0aGUgcHJldmlvdXMgaW50ZXJydXB0IGRhdGEgb24gYW4gb3BlbiwgYW5kIGNsZWFuCisgKgl1cCB0aGluZ3Mgb24gYSBjbG9zZS4KKyAqLworCisvKiBXZSB1c2UgcnRjX2xvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgb3BlbnMuIFNvIHRoZSBCS0wgaXMgbm90CisgKiBuZWVkZWQgaGVyZS4gT3IgYW55d2hlcmUgZWxzZSBpbiB0aGlzIGRyaXZlci4gKi8KK3N0YXRpYyBpbnQgcnRjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3Bpbl9sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKworCWlmKHJ0Y19zdGF0dXMgJiBSVENfSVNfT1BFTikKKwkJZ290byBvdXRfYnVzeTsKKworCXJ0Y19zdGF0dXMgfD0gUlRDX0lTX09QRU47CisKKwlydGNfaXJxX2RhdGEgPSAwOworCXNwaW5fdW5sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwlyZXR1cm4gMDsKKworb3V0X2J1c3k6CisJc3Bpbl91bmxvY2tfaXJxICgmcnRjX2xvY2spOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgcnRjX2Zhc3luYyAoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQorCit7CisJcmV0dXJuIGZhc3luY19oZWxwZXIgKGZkLCBmaWxwLCBvbiwgJnJ0Y19hc3luY19xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbnQgcnRjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisjaWZkZWYgUlRDX0lSUQorCXVuc2lnbmVkIGNoYXIgdG1wOworCisJaWYgKHJ0Y19oYXNfaXJxID09IDApCisJCWdvdG8gbm9faXJxOworCisJLyoKKwkgKiBUdXJuIG9mZiBhbGwgaW50ZXJydXB0cyBvbmNlIHRoZSBkZXZpY2UgaXMgbm8gbG9uZ2VyCisJICogaW4gdXNlLCBhbmQgY2xlYXIgdGhlIGRhdGEuCisJICovCisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJaWYgKCFocGV0X21hc2tfcnRjX2lycV9iaXQoUlRDX1BJRSB8IFJUQ19BSUUgfCBSVENfVUlFKSkgeworCQl0bXAgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCQl0bXAgJj0gIH5SVENfUElFOworCQl0bXAgJj0gIH5SVENfQUlFOworCQl0bXAgJj0gIH5SVENfVUlFOworCQlDTU9TX1dSSVRFKHRtcCwgUlRDX0NPTlRST0wpOworCQlDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpOworCX0KKwlpZiAocnRjX3N0YXR1cyAmIFJUQ19USU1FUl9PTikgeworCQlydGNfc3RhdHVzICY9IH5SVENfVElNRVJfT047CisJCWRlbF90aW1lcigmcnRjX2lycV90aW1lcik7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGQVNZTkMpIHsKKwkJcnRjX2Zhc3luYyAoLTEsIGZpbGUsIDApOworCX0KK25vX2lycToKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwlydGNfaXJxX2RhdGEgPSAwOworCXJ0Y19zdGF0dXMgJj0gflJUQ19JU19PUEVOOworCXNwaW5fdW5sb2NrX2lycSAoJnJ0Y19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFJUQ19JUlEKKy8qIENhbGxlZCB3aXRob3V0IHRoZSBrZXJuZWwgbG9jayAtIGZpbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJdW5zaWduZWQgbG9uZyBsOworCisJaWYgKHJ0Y19oYXNfaXJxID09IDApCisJCXJldHVybiAwOworCisJcG9sbF93YWl0KGZpbGUsICZydGNfd2FpdCwgd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxICgmcnRjX2xvY2spOworCWwgPSBydGNfaXJxX2RhdGE7CisJc3Bpbl91bmxvY2tfaXJxICgmcnRjX2xvY2spOworCisJaWYgKGwgIT0gMCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIGV4cG9ydGVkIHN0dWZmcworICovCisKK0VYUE9SVF9TWU1CT0wocnRjX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wocnRjX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChydGNfY29udHJvbCk7CisKK2ludCBydGNfcmVnaXN0ZXIocnRjX3Rhc2tfdCAqdGFzaykKK3sKKyNpZm5kZWYgUlRDX0lSUQorCXJldHVybiAtRUlPOworI2Vsc2UKKwlpZiAodGFzayA9PSBOVUxMIHx8IHRhc2stPmZ1bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCWlmIChydGNfc3RhdHVzICYgUlRDX0lTX09QRU4pIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNwaW5fbG9jaygmcnRjX3Rhc2tfbG9jayk7CisJaWYgKHJ0Y19jYWxsYmFjaykgeworCQlzcGluX3VubG9jaygmcnRjX3Rhc2tfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlydGNfc3RhdHVzIHw9IFJUQ19JU19PUEVOOworCXJ0Y19jYWxsYmFjayA9IHRhc2s7CisJc3Bpbl91bmxvY2soJnJ0Y190YXNrX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCXJldHVybiAwOworI2VuZGlmCit9CisKK2ludCBydGNfdW5yZWdpc3RlcihydGNfdGFza190ICp0YXNrKQoreworI2lmbmRlZiBSVENfSVJRCisJcmV0dXJuIC1FSU87CisjZWxzZQorCXVuc2lnbmVkIGNoYXIgdG1wOworCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCXNwaW5fbG9jaygmcnRjX3Rhc2tfbG9jayk7CisJaWYgKHJ0Y19jYWxsYmFjayAhPSB0YXNrKSB7CisJCXNwaW5fdW5sb2NrKCZydGNfdGFza19sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXJ0Y19jYWxsYmFjayA9IE5VTEw7CisJCisJLyogZGlzYWJsZSBjb250cm9scyAqLworCWlmICghaHBldF9tYXNrX3J0Y19pcnFfYml0KFJUQ19QSUUgfCBSVENfQUlFIHwgUlRDX1VJRSkpIHsKKwkJdG1wID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwkJdG1wICY9IH5SVENfUElFOworCQl0bXAgJj0gflJUQ19BSUU7CisJCXRtcCAmPSB+UlRDX1VJRTsKKwkJQ01PU19XUklURSh0bXAsIFJUQ19DT05UUk9MKTsKKwkJQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKTsKKwl9CisJaWYgKHJ0Y19zdGF0dXMgJiBSVENfVElNRVJfT04pIHsKKwkJcnRjX3N0YXR1cyAmPSB+UlRDX1RJTUVSX09OOworCQlkZWxfdGltZXIoJnJ0Y19pcnFfdGltZXIpOworCX0KKwlydGNfc3RhdHVzICY9IH5SVENfSVNfT1BFTjsKKwlzcGluX3VubG9jaygmcnRjX3Rhc2tfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50IHJ0Y19jb250cm9sKHJ0Y190YXNrX3QgKnRhc2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworI2lmbmRlZiBSVENfSVJRCisJcmV0dXJuIC1FSU87CisjZWxzZQorCXNwaW5fbG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCWlmIChydGNfY2FsbGJhY2sgIT0gdGFzaykgeworCQlzcGluX3VubG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlzcGluX3VubG9ja19pcnEoJnJ0Y190YXNrX2xvY2spOworCXJldHVybiBydGNfZG9faW9jdGwoY21kLCBhcmcsIDEpOworI2VuZGlmCit9CisKKworLyoKKyAqCVRoZSB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucyB3ZSBzdXBwb3J0LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0Y19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBydGNfcmVhZCwKKyNpZmRlZiBSVENfSVJRCisJLnBvbGwJCT0gcnRjX3BvbGwsCisjZW5kaWYKKwkuaW9jdGwJCT0gcnRjX2lvY3RsLAorCS5vcGVuCQk9IHJ0Y19vcGVuLAorCS5yZWxlYXNlCT0gcnRjX3JlbGVhc2UsCisJLmZhc3luYwkJPSBydGNfZmFzeW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHJ0Y19kZXYgPSB7CisJLm1pbm9yCQk9IFJUQ19NSU5PUiwKKwkubmFtZQkJPSAicnRjIiwKKwkuZm9wcwkJPSAmcnRjX2ZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGNfcHJvY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcnRjX3Byb2Nfb3BlbiwKKwkucmVhZCAgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisjaWYgZGVmaW5lZChSVENfSVJRKSAmJiAhZGVmaW5lZChfX3NwYXJjX18pCitzdGF0aWMgaXJxcmV0dXJuX3QgKCpydGNfaW50X2hhbmRsZXJfcHRyKShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBydGNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorCXVuc2lnbmVkIGludCB5ZWFyLCBjdHJsOworCXVuc2lnbmVkIGxvbmcgdWlwX3dhdGNoZG9nOworCWNoYXIgKmd1ZXNzID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIF9fc3BhcmNfXworCXN0cnVjdCBsaW51eF9lYnVzICplYnVzOworCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldjsKKyNpZmRlZiBfX3NwYXJjX3Y5X18KKwlzdHJ1Y3Qgc3BhcmNfaXNhX2JyaWRnZSAqaXNhX2JyOworCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FfZGV2OworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fc3BhcmNfXworCWZvcl9lYWNoX2VidXMoZWJ1cykgeworCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKKwkJCWlmKHN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJydGMiKSA9PSAwKSB7CisJCQkJcnRjX3BvcnQgPSBlZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwkJCQlydGNfaXJxID0gZWRldi0+aXJxc1swXTsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJfQorI2lmZGVmIF9fc3BhcmNfdjlfXworCWZvcl9lYWNoX2lzYShpc2FfYnIpIHsKKwkJZm9yX2VhY2hfaXNhZGV2KGlzYV9kZXYsIGlzYV9icikgeworCQkJaWYgKHN0cmNtcChpc2FfZGV2LT5wcm9tX25hbWUsICJydGMiKSA9PSAwKSB7CisJCQkJcnRjX3BvcnQgPSBpc2FfZGV2LT5yZXNvdXJjZS5zdGFydDsKKwkJCQlydGNfaXJxID0gaXNhX2Rldi0+aXJxOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlwcmludGsoS0VSTl9FUlIgInJ0Y19pbml0OiBubyBQQyBydGMgZm91bmRcbiIpOworCXJldHVybiAtRUlPOworCitmb3VuZDoKKwlpZiAocnRjX2lycSA9PSBQQ0lfSVJRX05PTkUpIHsKKwkJcnRjX2hhc19pcnEgPSAwOworCQlnb3RvIG5vX2lycTsKKwl9CisKKwkvKgorCSAqIFhYWCBJbnRlcnJ1cHQgcGluICM3IGluIEVzcHJlc3NvIGlzIHNoYXJlZCBiZXR3ZWVuIFJUQyBhbmQKKwkgKiBQQ0kgU2xvdCAyIElOVEEjIChhbmQgc29tZSBJTlR4IyBpbiBTbG90IDEpLiBTQV9JTlRFUlJVUFQgaGVyZQorCSAqIGlzIGFza2luZyBmb3IgdHJvdWJsZSB3aXRoIGFkZC1vbiBib2FyZHMuIENoYW5nZSB0byBTQV9TSElSUS4KKwkgKi8KKwlpZiAocmVxdWVzdF9pcnEocnRjX2lycSwgcnRjX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCAicnRjIiwgKHZvaWQgKikmcnRjX3BvcnQpKSB7CisJCS8qCisJCSAqIFN0YW5kYXJkIHdheSBmb3Igc3BhcmMgdG8gcHJpbnQgaXJxJ3MgaXMgdG8gdXNlCisJCSAqIF9faXJxX2l0b2EoKS4gSSB0aGluayBmb3IgRUJ1cyBpdCdzIG9rIHRvIHVzZSAlZC4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAicnRjOiBjYW5ub3QgcmVnaXN0ZXIgSVJRICVkXG4iLCBydGNfaXJxKTsKKwkJcmV0dXJuIC1FSU87CisJfQorbm9faXJxOgorI2Vsc2UKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKFJUQ19QT1JUKDApLCBSVENfSU9fRVhURU5ULCAicnRjIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJydGM6IEkvTyBwb3J0ICVkIGlzIG5vdCBmcmVlLlxuIiwgUlRDX1BPUlQgKDApKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisjaWZkZWYgUlRDX0lSUQorCWlmIChpc19ocGV0X2VuYWJsZWQoKSkgeworCQlydGNfaW50X2hhbmRsZXJfcHRyID0gaHBldF9ydGNfaW50ZXJydXB0OworCX0gZWxzZSB7CisJCXJ0Y19pbnRfaGFuZGxlcl9wdHIgPSBydGNfaW50ZXJydXB0OworCX0KKworCWlmKHJlcXVlc3RfaXJxKFJUQ19JUlEsIHJ0Y19pbnRfaGFuZGxlcl9wdHIsIFNBX0lOVEVSUlVQVCwgInJ0YyIsIE5VTEwpKSB7CisJCS8qIFllYWggcmlnaHQsIHNlZWluZyBhcyBpcnEgOCBkb2Vzbid0IGV2ZW4gaGl0IHRoZSBidXMuICovCisJCXByaW50ayhLRVJOX0VSUiAicnRjOiBJUlEgJWQgaXMgbm90IGZyZWUuXG4iLCBSVENfSVJRKTsKKwkJcmVsZWFzZV9yZWdpb24oUlRDX1BPUlQoMCksIFJUQ19JT19FWFRFTlQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaHBldF9ydGNfdGltZXJfaW5pdCgpOworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fc3BhcmNfXyB2cy4gb3RoZXJzICovCisKKwlpZiAobWlzY19yZWdpc3RlcigmcnRjX2RldikpIHsKKyNpZmRlZiBSVENfSVJRCisJCWZyZWVfaXJxKFJUQ19JUlEsIE5VTEwpOworI2VuZGlmCisJCXJlbGVhc2VfcmVnaW9uKFJUQ19QT1JUKDApLCBSVENfSU9fRVhURU5UKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZW50ID0gY3JlYXRlX3Byb2NfZW50cnkoImRyaXZlci9ydGMiLCAwLCBOVUxMKTsKKwlpZiAoIWVudCkgeworI2lmZGVmIFJUQ19JUlEKKwkJZnJlZV9pcnEoUlRDX0lSUSwgTlVMTCk7CisjZW5kaWYKKwkJcmVsZWFzZV9yZWdpb24oUlRDX1BPUlQoMCksIFJUQ19JT19FWFRFTlQpOworCQltaXNjX2RlcmVnaXN0ZXIoJnJ0Y19kZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZW50LT5wcm9jX2ZvcHMgPSAmcnRjX3Byb2NfZm9wczsKKworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorCXJ0Y19mcmVxID0gSFo7CisJCisJLyogRWFjaCBvcGVyYXRpbmcgc3lzdGVtIG9uIGFuIEFscGhhIHVzZXMgaXRzIG93biBlcG9jaC4KKwkgICBMZXQncyB0cnkgdG8gZ3Vlc3Mgd2hpY2ggb25lIHdlIGFyZSB1c2luZyBub3cuICovCisJCisJdWlwX3dhdGNoZG9nID0gamlmZmllczsKKwlpZiAocnRjX2lzX3VwZGF0aW5nKCkgIT0gMCkKKwkJd2hpbGUgKGppZmZpZXMgLSB1aXBfd2F0Y2hkb2cgPCAyKkhaLzEwMCkgeyAKKwkJCWJhcnJpZXIoKTsKKwkJCWNwdV9yZWxheCgpOworCQl9CisJCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCXllYXIgPSBDTU9TX1JFQUQoUlRDX1lFQVIpOworCWN0cmwgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQorCWlmICghKGN0cmwgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkKKwkJQkNEX1RPX0JJTih5ZWFyKTsgICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uICovCisJCisJaWYgKHllYXIgPCAyMCkgeworCQllcG9jaCA9IDIwMDA7CisJCWd1ZXNzID0gIlNSTSAocG9zdC0yMDAwKSI7CisJfSBlbHNlIGlmICh5ZWFyID49IDIwICYmIHllYXIgPCA0OCkgeworCQllcG9jaCA9IDE5ODA7CisJCWd1ZXNzID0gIkFSQyBjb25zb2xlIjsKKwl9IGVsc2UgaWYgKHllYXIgPj0gNDggJiYgeWVhciA8IDcyKSB7CisJCWVwb2NoID0gMTk1MjsKKwkJZ3Vlc3MgPSAiRGlnaXRhbCBVTklYIjsKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorCX0gZWxzZSBpZiAoeWVhciA+PSA3MiAmJiB5ZWFyIDwgNzQpIHsKKwkJZXBvY2ggPSAyMDAwOworCQlndWVzcyA9ICJEaWdpdGFsIERFQ3N0YXRpb24iOworI2Vsc2UKKwl9IGVsc2UgaWYgKHllYXIgPj0gNzApIHsKKwkJZXBvY2ggPSAxOTAwOworCQlndWVzcyA9ICJTdGFuZGFyZCBQQyAoMTkwMCkiOworI2VuZGlmCisJfQorCWlmIChndWVzcykKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnRjOiAlcyBlcG9jaCAoJWx1KSBkZXRlY3RlZFxuIiwgZ3Vlc3MsIGVwb2NoKTsKKyNlbmRpZgorI2lmZGVmIFJUQ19JUlEKKwlpZiAocnRjX2hhc19pcnEgPT0gMCkKKwkJZ290byBub19pcnEyOworCisJaW5pdF90aW1lcigmcnRjX2lycV90aW1lcik7CisJcnRjX2lycV90aW1lci5mdW5jdGlvbiA9IHJ0Y19kcm9wcGVkX2lycTsKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJcnRjX2ZyZXEgPSAxMDI0OworCWlmICghaHBldF9zZXRfcGVyaW9kaWNfZnJlcShydGNfZnJlcSkpIHsKKwkJLyogSW5pdGlhbGl6ZSBwZXJpb2RpYyBmcmVxLiB0byBDTU9TIHJlc2V0IGRlZmF1bHQsIHdoaWNoIGlzIDEwMjRIeiAqLworCQlDTU9TX1dSSVRFKCgoQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCkgJiAweEYwKSB8IDB4MDYpLCBSVENfRlJFUV9TRUxFQ1QpOworCX0KKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKK25vX2lycTI6CisjZW5kaWYKKworCSh2b2lkKSBpbml0X3N5c2N0bCgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUmVhbCBUaW1lIENsb2NrIERyaXZlciB2IiBSVENfVkVSU0lPTiAiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRjX2V4aXQgKHZvaWQpCit7CisJY2xlYW51cF9zeXNjdGwoKTsKKwlyZW1vdmVfcHJvY19lbnRyeSAoImRyaXZlci9ydGMiLCBOVUxMKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnJ0Y19kZXYpOworCisjaWZkZWYgX19zcGFyY19fCisJaWYgKHJ0Y19oYXNfaXJxKQorCQlmcmVlX2lycSAocnRjX2lycSwgJnJ0Y19wb3J0KTsKKyNlbHNlCisJcmVsZWFzZV9yZWdpb24gKFJUQ19QT1JUICgwKSwgUlRDX0lPX0VYVEVOVCk7CisjaWZkZWYgUlRDX0lSUQorCWlmIChydGNfaGFzX2lycSkKKwkJZnJlZV9pcnEgKFJUQ19JUlEsIE5VTEwpOworI2VuZGlmCisjZW5kaWYgLyogX19zcGFyY19fICovCit9CisKK21vZHVsZV9pbml0KHJ0Y19pbml0KTsKK21vZHVsZV9leGl0KHJ0Y19leGl0KTsKKworI2lmZGVmIFJUQ19JUlEKKy8qCisgKiAJQXQgSVJRIHJhdGVzID49IDQwOTZIeiwgYW4gaW50ZXJydXB0IG1heSBnZXQgbG9zdCBhbHRvZ2V0aGVyLgorICoJKHVzdWFsbHkgZHVyaW5nIGFuIElERSBkaXNrIGludGVycnVwdCwgd2l0aCBJUlEgdW5tYXNraW5nIG9mZikKKyAqCVNpbmNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2Vzbid0IGdldCBjYWxsZWQsIHRoZSBJUlEgc3RhdHVzCisgKglieXRlIGRvZXNuJ3QgZ2V0IHJlYWQsIGFuZCB0aGUgUlRDIHN0b3BzIGdlbmVyYXRpbmcgaW50ZXJydXB0cy4KKyAqCUEgdGltZXIgaXMgc2V0LCBhbmQgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYvd2hlbiB0aGF0IGhhcHBlbnMuCisgKglUbyBnZXQgaXQgb3V0IG9mIHRoaXMgc3RhbGxlZCBzdGF0ZSwgd2UganVzdCByZWFkIHRoZSBzdGF0dXMuCisgKglBdCBsZWFzdCBhIGppZmZ5IG9mIGludGVycnVwdHMgKHJ0Y19mcmVxL0haKSB3aWxsIGhhdmUgYmVlbiBsb3N0LgorICoJKFlvdSAqcmVhbGx5KiBzaG91bGRuJ3QgYmUgdHJ5aW5nIHRvIHVzZSBhIG5vbi1yZWFsdGltZSBzeXN0ZW0gCisgKglmb3Igc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgYSBzdGVhZHkgPiAxS0h6IHNpZ25hbCBhbnl3YXlzLikKKyAqLworCitzdGF0aWMgdm9pZCBydGNfZHJvcHBlZF9pcnEodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZnJlcTsKKworCXNwaW5fbG9ja19pcnEgKCZydGNfbG9jayk7CisKKwlpZiAoaHBldF9ydGNfZHJvcHBlZF9pcnEoKSkgeworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEp1c3QgaW4gY2FzZSBzb21lb25lIGRpc2FibGVkIHRoZSB0aW1lciBmcm9tIGJlaGluZCBvdXIgYmFjay4uLiAqLworCWlmIChydGNfc3RhdHVzICYgUlRDX1RJTUVSX09OKQorCQltb2RfdGltZXIoJnJ0Y19pcnFfdGltZXIsIGppZmZpZXMgKyBIWi9ydGNfZnJlcSArIDIqSFovMTAwKTsKKworCXJ0Y19pcnFfZGF0YSArPSAoKHJ0Y19mcmVxL0haKTw8OCk7CisJcnRjX2lycV9kYXRhICY9IH4weGZmOworCXJ0Y19pcnFfZGF0YSB8PSAoQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKSAmIDB4RjApOwkvKiByZXN0YXJ0ICovCisKKwlmcmVxID0gcnRjX2ZyZXE7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgInJ0YzogbG9zdCBzb21lIGludGVycnVwdHMgYXQgJWxkSHouXG4iLCBmcmVxKTsKKworCS8qIE5vdyB3ZSBoYXZlIG5ldyBkYXRhICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGNfd2FpdCk7CisKKwlraWxsX2Zhc3luYyAoJnJ0Y19hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfSU4pOworfQorI2VuZGlmCisKKy8qCisgKglJbmZvIGV4cG9ydGVkIHZpYSAiL3Byb2MvZHJpdmVyL3J0YyIuCisgKi8KKworc3RhdGljIGludCBydGNfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworI2RlZmluZSBZTihiaXQpICgoY3RybCAmIGJpdCkgPyAieWVzIiA6ICJubyIpCisjZGVmaW5lIE5ZKGJpdCkgKChjdHJsICYgYml0KSA/ICJubyIgOiAieWVzIikKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJdW5zaWduZWQgY2hhciBiYXR0LCBjdHJsOworCXVuc2lnbmVkIGxvbmcgZnJlcTsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwliYXR0ID0gQ01PU19SRUFEKFJUQ19WQUxJRCkgJiBSVENfVlJUOworCWN0cmwgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCWZyZXEgPSBydGNfZnJlcTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCisJcnRjX2dldF9ydGNfdGltZSgmdG0pOworCisJLyoKKwkgKiBUaGVyZSBpcyBubyB3YXkgdG8gdGVsbCBpZiB0aGUgbHVzZXIgaGFzIHRoZSBSVEMgc2V0IGZvciBsb2NhbAorCSAqIHRpbWUgb3IgZm9yIFVuaXZlcnNhbCBTdGFuZGFyZCBUaW1lIChHTVQpLiBQcm9iYWJseSBsb2NhbCB0aG91Z2guCisJICovCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICJydGNfdGltZVx0OiAlMDJkOiUwMmQ6JTAyZFxuIgorCQkgICAicnRjX2RhdGVcdDogJTA0ZC0lMDJkLSUwMmRcbiIKKwkJICAgInJ0Y19lcG9jaFx0OiAlMDRsdVxuIiwKKwkJICAgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMsCisJCSAgIHRtLnRtX3llYXIgKyAxOTAwLCB0bS50bV9tb24gKyAxLCB0bS50bV9tZGF5LCBlcG9jaCk7CisKKwlnZXRfcnRjX2FsbV90aW1lKCZ0bSk7CisKKwkvKgorCSAqIFdlIGltcGxpY2l0bHkgYXNzdW1lIDI0aHIgbW9kZSBoZXJlLiBBbGFybSB2YWx1ZXMgPj0gMHhjMCB3aWxsCisJICogbWF0Y2ggYW55IHZhbHVlIGZvciB0aGF0IHBhcnRpY3VsYXIgZmllbGQuIFZhbHVlcyB0aGF0IGFyZQorCSAqIGdyZWF0ZXIgdGhhbiBhIHZhbGlkIHRpbWUsIGJ1dCBsZXNzIHRoYW4gMHhjMCBzaG91bGRuJ3QgYXBwZWFyLgorCSAqLworCXNlcV9wdXRzKHNlcSwgImFsYXJtXHRcdDogIik7CisJaWYgKHRtLnRtX2hvdXIgPD0gMjQpCisJCXNlcV9wcmludGYoc2VxLCAiJTAyZDoiLCB0bS50bV9ob3VyKTsKKwllbHNlCisJCXNlcV9wdXRzKHNlcSwgIioqOiIpOworCisJaWYgKHRtLnRtX21pbiA8PSA1OSkKKwkJc2VxX3ByaW50ZihzZXEsICIlMDJkOiIsIHRtLnRtX21pbik7CisJZWxzZQorCQlzZXFfcHV0cyhzZXEsICIqKjoiKTsKKworCWlmICh0bS50bV9zZWMgPD0gNTkpCisJCXNlcV9wcmludGYoc2VxLCAiJTAyZFxuIiwgdG0udG1fc2VjKTsKKwllbHNlCisJCXNlcV9wdXRzKHNlcSwgIioqXG4iKTsKKworCXNlcV9wcmludGYoc2VxLAorCQkgICAiRFNUX2VuYWJsZVx0OiAlc1xuIgorCQkgICAiQkNEXHRcdDogJXNcbiIKKwkJICAgIjI0aHJcdFx0OiAlc1xuIgorCQkgICAic3F1YXJlX3dhdmVcdDogJXNcbiIKKwkJICAgImFsYXJtX0lSUVx0OiAlc1xuIgorCQkgICAidXBkYXRlX0lSUVx0OiAlc1xuIgorCQkgICAicGVyaW9kaWNfSVJRXHQ6ICVzXG4iCisJCSAgICJwZXJpb2RpY19mcmVxXHQ6ICVsZFxuIgorCQkgICAiYmF0dF9zdGF0dXNcdDogJXNcbiIsCisJCSAgIFlOKFJUQ19EU1RfRU4pLAorCQkgICBOWShSVENfRE1fQklOQVJZKSwKKwkJICAgWU4oUlRDXzI0SCksCisJCSAgIFlOKFJUQ19TUVdFKSwKKwkJICAgWU4oUlRDX0FJRSksCisJCSAgIFlOKFJUQ19VSUUpLAorCQkgICBZTihSVENfUElFKSwKKwkJICAgZnJlcSwKKwkJICAgYmF0dCA/ICJva2F5IiA6ICJkZWFkIik7CisKKwlyZXR1cm4gIDA7CisjdW5kZWYgWU4KKyN1bmRlZiBOWQorfQorCitzdGF0aWMgaW50IHJ0Y19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0Y19wcm9jX3Nob3csIE5VTEwpOworfQorCit2b2lkIHJ0Y19nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdW5zaWduZWQgbG9uZyB1aXBfd2F0Y2hkb2cgPSBqaWZmaWVzOworCXVuc2lnbmVkIGNoYXIgY3RybDsKKyNpZmRlZiBDT05GSUdfTUFDSF9ERUNTVEFUSU9OCisJdW5zaWduZWQgaW50IHJlYWxfeWVhcjsKKyNlbmRpZgorCisJLyoKKwkgKiByZWFkIFJUQyBvbmNlIGFueSB1cGRhdGUgaW4gcHJvZ3Jlc3MgaXMgZG9uZS4gVGhlIHVwZGF0ZQorCSAqIGNhbiB0YWtlIGp1c3Qgb3ZlciAybXMuIFdlIHdhaXQgMTAgdG8gMjBtcy4gVGhlcmUgaXMgbm8gbmVlZCB0bworCSAqIHRvIHBvbGwtd2FpdCAodXAgdG8gMXMgLSBlZWNjY2gpIGZvciB0aGUgZmFsbGluZyBlZGdlIG9mIFJUQ19VSVAuCisJICogSWYgeW91IG5lZWQgdG8ga25vdyAqZXhhY3RseSogd2hlbiBhIHNlY29uZCBoYXMgc3RhcnRlZCwgZW5hYmxlCisJICogcGVyaW9kaWMgdXBkYXRlIGNvbXBsZXRlIGludGVycnVwdHMsICh2aWEgaW9jdGwpIGFuZCB0aGVuIAorCSAqIGltbWVkaWF0ZWx5IHJlYWQgL2Rldi9ydGMgd2hpY2ggd2lsbCBibG9jayB1bnRpbCB5b3UgZ2V0IHRoZSBJUlEuCisJICogT25jZSB0aGUgcmVhZCBjbGVhcnMsIHJlYWQgdGhlIFJUQyB0aW1lIChhZ2FpbiB2aWEgaW9jdGwpLiBFYXN5LgorCSAqLworCisJaWYgKHJ0Y19pc191cGRhdGluZygpICE9IDApCisJCXdoaWxlIChqaWZmaWVzIC0gdWlwX3dhdGNoZG9nIDwgMipIWi8xMDApIHsKKwkJCWJhcnJpZXIoKTsKKwkJCWNwdV9yZWxheCgpOworCQl9CisKKwkvKgorCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFdlIGxlYXZlCisJICogdG1fd2RheSwgdG1feWRheSBhbmQgdG1faXNkc3QgdW50b3VjaGVkLiBFdmVuIHRob3VnaCB0aGUKKwkgKiBSVEMgaGFzIFJUQ19EQVlfT0ZfV0VFSywgd2UgaWdub3JlIGl0LCBhcyBpdCBpcyBvbmx5IHVwZGF0ZWQKKwkgKiBieSB0aGUgUlRDIHdoZW4gaW5pdGlhbGx5IHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLgorCSAqLworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlydGNfdG0tPnRtX3NlYyA9IENNT1NfUkVBRChSVENfU0VDT05EUyk7CisJcnRjX3RtLT50bV9taW4gPSBDTU9TX1JFQUQoUlRDX01JTlVURVMpOworCXJ0Y190bS0+dG1faG91ciA9IENNT1NfUkVBRChSVENfSE9VUlMpOworCXJ0Y190bS0+dG1fbWRheSA9IENNT1NfUkVBRChSVENfREFZX09GX01PTlRIKTsKKwlydGNfdG0tPnRtX21vbiA9IENNT1NfUkVBRChSVENfTU9OVEgpOworCXJ0Y190bS0+dG1feWVhciA9IENNT1NfUkVBRChSVENfWUVBUik7CisjaWZkZWYgQ09ORklHX01BQ0hfREVDU1RBVElPTgorCXJlYWxfeWVhciA9IENNT1NfUkVBRChSVENfREVDX1lFQVIpOworI2VuZGlmCisJY3RybCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlpZiAoIShjdHJsICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpCisJeworCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fc2VjKTsKKwkJQkNEX1RPX0JJTihydGNfdG0tPnRtX21pbik7CisJCUJDRF9UT19CSU4ocnRjX3RtLT50bV9ob3VyKTsKKwkJQkNEX1RPX0JJTihydGNfdG0tPnRtX21kYXkpOworCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbW9uKTsKKwkJQkNEX1RPX0JJTihydGNfdG0tPnRtX3llYXIpOworCX0KKworI2lmZGVmIENPTkZJR19NQUNIX0RFQ1NUQVRJT04KKwlydGNfdG0tPnRtX3llYXIgKz0gcmVhbF95ZWFyIC0gNzI7CisjZW5kaWYKKworCS8qCisJICogQWNjb3VudCBmb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBob3cgdGhlIFJUQyB1c2VzIHRoZSB2YWx1ZXMKKwkgKiBhbmQgaG93IHRoZXkgYXJlIGRlZmluZWQgaW4gYSBzdHJ1Y3QgcnRjX3RpbWU7CisJICovCisJaWYgKChydGNfdG0tPnRtX3llYXIgKz0gKGVwb2NoIC0gMTkwMCkpIDw9IDY5KQorCQlydGNfdG0tPnRtX3llYXIgKz0gMTAwOworCisJcnRjX3RtLT50bV9tb24tLTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3J0Y19hbG1fdGltZShzdHJ1Y3QgcnRjX3RpbWUgKmFsbV90bSkKK3sKKwl1bnNpZ25lZCBjaGFyIGN0cmw7CisKKwkvKgorCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFRoYXQKKwkgKiBtZWFucyBvbmx5IHRtX2hvdXIsIHRtX21pbiwgYW5kIHRtX3NlYy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJYWxtX3RtLT50bV9zZWMgPSBDTU9TX1JFQUQoUlRDX1NFQ09ORFNfQUxBUk0pOworCWFsbV90bS0+dG1fbWluID0gQ01PU19SRUFEKFJUQ19NSU5VVEVTX0FMQVJNKTsKKwlhbG1fdG0tPnRtX2hvdXIgPSBDTU9TX1JFQUQoUlRDX0hPVVJTX0FMQVJNKTsKKwljdHJsID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlmICghKGN0cmwgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkKKwl7CisJCUJDRF9UT19CSU4oYWxtX3RtLT50bV9zZWMpOworCQlCQ0RfVE9fQklOKGFsbV90bS0+dG1fbWluKTsKKwkJQkNEX1RPX0JJTihhbG1fdG0tPnRtX2hvdXIpOworCX0KK30KKworI2lmZGVmIFJUQ19JUlEKKy8qCisgKiBVc2VkIHRvIGRpc2FibGUvZW5hYmxlIGludGVycnVwdHMgZm9yIGFueSBvbmUgb2YgVUlFLCBBSUUsIFBJRS4KKyAqIFJ1bW91ciBoYXMgaXQgdGhhdCBpZiB5b3UgZnJvYiB0aGUgaW50ZXJydXB0IGVuYWJsZS9kaXNhYmxlCisgKiBiaXRzIGluIFJUQ19DT05UUk9MLCB5b3Ugc2hvdWxkIHJlYWQgUlRDX0lOVFJfRkxBR1MsIHRvCisgKiBlbnN1cmUgeW91IGFjdHVhbGx5IHN0YXJ0IGdldHRpbmcgaW50ZXJydXB0cy4gUHJvYmFibHkgZm9yCisgKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIvYnJva2VuIGNoaXBzZXQgUlRDIGltcGxlbWVudGF0aW9ucy4KKyAqIFdlIGFsc28gY2xlYXIgb3V0IGFueSBvbGQgaXJxIGRhdGEgYWZ0ZXIgYW4gaW9jdGwoKSB0aGF0CisgKiBtZWRkbGVzIHdpdGggdGhlIGludGVycnVwdCBlbmFibGUvZGlzYWJsZSBiaXRzLgorICovCisKK3N0YXRpYyB2b2lkIG1hc2tfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJaWYgKGhwZXRfbWFza19ydGNfaXJxX2JpdChiaXQpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCQlyZXR1cm47CisJfQorCXZhbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJdmFsICY9ICB+Yml0OworCUNNT1NfV1JJVEUodmFsLCBSVENfQ09OVFJPTCk7CisJQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKTsKKworCXJ0Y19pcnFfZGF0YSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKwlpZiAoaHBldF9zZXRfcnRjX2lycV9iaXQoYml0KSkgeworCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuOworCX0KKwl2YWwgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCXZhbCB8PSBiaXQ7CisJQ01PU19XUklURSh2YWwsIFJUQ19DT05UUk9MKTsKKwlDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpOworCisJcnRjX2lycV9kYXRhID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKK30KKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJQYXVsIEdvcnRtYWtlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoUlRDX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zM2MyNDEwLXJ0Yy5jIGIvZHJpdmVycy9jaGFyL3MzYzI0MTAtcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2NjYzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zM2MyNDEwLXJ0Yy5jCkBAIC0wLDAgKzEsNTg4IEBACisvKiBkcml2ZXJzL2NoYXIvczNjMjQxMF9ydGMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MgPGxpbnV4QHNpbXRlYy5jby51az4KKyAqCQkgICAgICBodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogUzNDMjQxMCBJbnRlcm5hbCBSVEMgRHJpdmVyCisgKgorICogIENoYW5nZWxvZzoKKyAqCTA4LU5vdi0yMDA0CUJKRAlJbml0aWFsIGNyZWF0aW9uCisgKgkxMi1Ob3YtMjAwNAlCSkQJQWRkZWQgcGVyaW9kaWMgSVJRIGFuZCBQTSBjb2RlCisgKgkyMi1Ob3YtMjAwNAlCSkQJU2lnbi10ZXN0IG9uIGFsYXJtIGNvZGUgdG8gY2hlY2sgZm9yIDwwCisgKgkxMC1NYXItMjAwNQlMQ1ZSCUNoYW5nZWQgUzNDMjQxMF9WQV9SVEMgdG8gUzNDMjRYWF9WQV9SVEMKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtcnRjLmg+CisKKy8qIG5lZWQgdGhpcyBmb3IgdGhlIFJUQ19BRiBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisKKyN1bmRlZiBTM0MyNFhYX1ZBX1JUQworI2RlZmluZSBTM0MyNFhYX1ZBX1JUQyBzM2MyNDEwX3J0Y19iYXNlCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKnMzYzI0MTBfcnRjX21lbTsKKworc3RhdGljIHZvaWQgX19pb21lbSAqczNjMjQxMF9ydGNfYmFzZTsKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfYWxhcm1ubyA9IE5PX0lSUTsKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfdGlja25vICA9IE5PX0lSUTsKK3N0YXRpYyBpbnQgczNjMjQxMF9ydGNfZnJlcSAgICA9IDE7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soczNjMjQxMF9ydGNfcGllX2xvY2spOworCisvKiBJUlEgSGFuZGxlcnMgKi8KKworc3RhdGljIGlycXJldHVybl90IHMzYzI0MTBfcnRjX2FsYXJtaXJxKGludCBpcnEsIHZvaWQgKmlkLCBzdHJ1Y3QgcHRfcmVncyAqcikKK3sKKwlydGNfdXBkYXRlKDEsIFJUQ19BRiB8IFJUQ19JUlFGKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzM2MyNDEwX3J0Y190aWNraXJxKGludCBpcnEsIHZvaWQgKmlkLCBzdHJ1Y3QgcHRfcmVncyAqcikKK3sKKwlydGNfdXBkYXRlKDEsIFJUQ19QRiB8IFJUQ19JUlFGKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIFVwZGF0ZSBjb250cm9sIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgczNjMjQxMF9ydGNfc2V0YWllKGludCB0bykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJcHJfZGVidWcoIiVzOiBhaWU9JWRcbiIsIF9fRlVOQ1RJT05fXywgdG8pOworCisJdG1wID0gcmVhZGIoUzNDMjQxMF9SVENBTE0pOworCisJaWYgKHRvKQorCQl0bXAgfD0gUzNDMjQxMF9SVENBTE1fQUxNRU47CisJZWxzZQorCQl0bXAgJj0gflMzQzI0MTBfUlRDQUxNX0FMTUVOOworCisKKwl3cml0ZWIodG1wLCBTM0MyNDEwX1JUQ0FMTSk7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcnRjX3NldHBpZShpbnQgdG8pCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXByX2RlYnVnKCIlczogcGllPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHRvKTsKKworCXNwaW5fbG9ja19pcnEoJnMzYzI0MTBfcnRjX3BpZV9sb2NrKTsKKwl0bXAgPSByZWFkYihTM0MyNDEwX1RJQ05UKSAmIH5TM0MyNDEwX1RJQ05UX0VOQUJMRTsKKworCWlmICh0bykKKwkJdG1wIHw9IFMzQzI0MTBfVElDTlRfRU5BQkxFOworCisJd3JpdGViKHRtcCwgUzNDMjQxMF9USUNOVCk7CisJc3Bpbl91bmxvY2tfaXJxKCZzM2MyNDEwX3J0Y19waWVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcnRjX3NldGZyZXEoaW50IGZyZXEpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXNwaW5fbG9ja19pcnEoJnMzYzI0MTBfcnRjX3BpZV9sb2NrKTsKKwl0bXAgPSByZWFkYihTM0MyNDEwX1RJQ05UKSAmIFMzQzI0MTBfVElDTlRfRU5BQkxFOworCisJczNjMjQxMF9ydGNfZnJlcSA9IGZyZXE7CisKKwl0bXAgfD0gKDEyOCAvIGZyZXEpLTE7CisKKwl3cml0ZWIodG1wLCBTM0MyNDEwX1RJQ05UKTsKKwlzcGluX3VubG9ja19pcnEoJnMzYzI0MTBfcnRjX3BpZV9sb2NrKTsKK30KKworLyogVGltZSByZWFkL3dyaXRlICovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcnRjX2dldHRpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJdW5zaWduZWQgaW50IGhhdmVfcmV0cmllZCA9IDA7CisKKyByZXRyeV9nZXRfdGltZToKKwlydGNfdG0tPnRtX21pbiAgPSByZWFkYihTM0MyNDEwX1JUQ01JTik7CisJcnRjX3RtLT50bV9ob3VyID0gcmVhZGIoUzNDMjQxMF9SVENIT1VSKTsKKwlydGNfdG0tPnRtX21kYXkgPSByZWFkYihTM0MyNDEwX1JUQ0RBVEUpOworCXJ0Y190bS0+dG1fbW9uICA9IHJlYWRiKFMzQzI0MTBfUlRDTU9OKTsKKwlydGNfdG0tPnRtX3llYXIgPSByZWFkYihTM0MyNDEwX1JUQ1lFQVIpOworCXJ0Y190bS0+dG1fc2VjICA9IHJlYWRiKFMzQzI0MTBfUlRDU0VDKTsKKworCS8qIHRoZSBvbmx5IHdheSB0byB3b3JrIG91dCB3ZXRoZXIgdGhlIHN5c3RlbSB3YXMgbWlkLXVwZGF0ZQorCSAqIHdoZW4gd2UgcmVhZCBpdCBpcyB0byBjaGVjayB0aGUgc2Vjb25kIGNvdW50ZXIsIGFuZCBpZiBpdAorCSAqIGlzIHplcm8sIHRoZW4gd2UgcmUtdHJ5IHRoZSBlbnRpcmUgcmVhZAorCSAqLworCisJaWYgKHJ0Y190bS0+dG1fc2VjID09IDAgJiYgIWhhdmVfcmV0cmllZCkgeworCQloYXZlX3JldHJpZWQgPSAxOworCQlnb3RvIHJldHJ5X2dldF90aW1lOworCX0KKworCXByX2RlYnVnKCJyZWFkIHRpbWUgJTAyeC4lMDJ4LiUwMnggJTAyeC8lMDJ4LyUwMnhcbiIsCisJCSBydGNfdG0tPnRtX3llYXIsIHJ0Y190bS0+dG1fbW9uLCBydGNfdG0tPnRtX21kYXksCisJCSBydGNfdG0tPnRtX2hvdXIsIHJ0Y190bS0+dG1fbWluLCBydGNfdG0tPnRtX3NlYyk7CisKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fc2VjKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbWluKTsKKwlCQ0RfVE9fQklOKHJ0Y190bS0+dG1faG91cik7CisJQkNEX1RPX0JJTihydGNfdG0tPnRtX21kYXkpOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV9tb24pOworCUJDRF9UT19CSU4ocnRjX3RtLT50bV95ZWFyKTsKKworCXJ0Y190bS0+dG1feWVhciArPSAxMDA7CisJcnRjX3RtLT50bV9tb24gLT0gMTsKK30KKworCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX3NldHRpbWUoc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwkvKiB0aGUgcnRjIGdldHMgcm91bmQgdGhlIHkyayBwcm9ibGVtIGJ5IGp1c3Qgbm90IHN1cHBvcnRpbmcgaXQgKi8KKworCWlmICh0bS0+dG1feWVhciA8IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fc2VjKSwgIFMzQzI0MTBfUlRDU0VDKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fbWluKSwgIFMzQzI0MTBfUlRDTUlOKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1faG91ciksIFMzQzI0MTBfUlRDSE9VUik7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21kYXkpLCBTM0MyNDEwX1JUQ0RBVEUpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9tb24gKyAxKSwgUzNDMjQxMF9SVENNT04pOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV95ZWFyIC0gMTAwKSwgUzNDMjQxMF9SVENZRUFSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzM2MyNDEwX3J0Y19nZXRhbGFybShzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKmFsbV90bSA9ICZhbHJtLT50aW1lOworCXVuc2lnbmVkIGludCBhbG1fZW47CisKKwlhbG1fdG0tPnRtX3NlYyAgPSByZWFkYihTM0MyNDEwX0FMTVNFQyk7CisJYWxtX3RtLT50bV9taW4gID0gcmVhZGIoUzNDMjQxMF9BTE1NSU4pOworCWFsbV90bS0+dG1faG91ciA9IHJlYWRiKFMzQzI0MTBfQUxNSE9VUik7CisJYWxtX3RtLT50bV9tb24gID0gcmVhZGIoUzNDMjQxMF9BTE1NT04pOworCWFsbV90bS0+dG1fbWRheSA9IHJlYWRiKFMzQzI0MTBfQUxNREFURSk7CisJYWxtX3RtLT50bV95ZWFyID0gcmVhZGIoUzNDMjQxMF9BTE1ZRUFSKTsKKworCWFsbV9lbiA9IHJlYWRiKFMzQzI0MTBfUlRDQUxNKTsKKworCXByX2RlYnVnKCJyZWFkIGFsYXJtICUwMnggJTAyeC4lMDJ4LiUwMnggJTAyeC8lMDJ4LyUwMnhcbiIsCisJCSBhbG1fZW4sCisJCSBhbG1fdG0tPnRtX3llYXIsIGFsbV90bS0+dG1fbW9uLCBhbG1fdG0tPnRtX21kYXksCisJCSBhbG1fdG0tPnRtX2hvdXIsIGFsbV90bS0+dG1fbWluLCBhbG1fdG0tPnRtX3NlYyk7CisKKworCS8qIGRlY29kZSB0aGUgYWxhcm0gZW5hYmxlIGZpZWxkICovCisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fU0VDRU4pIHsKKwkJQkNEX1RPX0JJTihhbG1fdG0tPnRtX3NlYyk7CisJfSBlbHNlIHsKKwkJYWxtX3RtLT50bV9zZWMgPSAweGZmOworCX0KKworCWlmIChhbG1fZW4gJiBTM0MyNDEwX1JUQ0FMTV9NSU5FTikgeworCQlCQ0RfVE9fQklOKGFsbV90bS0+dG1fbWluKTsKKwl9IGVsc2UgeworCQlhbG1fdG0tPnRtX21pbiA9IDB4ZmY7CisJfQorCisJaWYgKGFsbV9lbiAmIFMzQzI0MTBfUlRDQUxNX0hPVVJFTikgeworCQlCQ0RfVE9fQklOKGFsbV90bS0+dG1faG91cik7CisJfSBlbHNlIHsKKwkJYWxtX3RtLT50bV9ob3VyID0gMHhmZjsKKwl9CisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fREFZRU4pIHsKKwkJQkNEX1RPX0JJTihhbG1fdG0tPnRtX21kYXkpOworCX0gZWxzZSB7CisJCWFsbV90bS0+dG1fbWRheSA9IDB4ZmY7CisJfQorCisJaWYgKGFsbV9lbiAmIFMzQzI0MTBfUlRDQUxNX01PTkVOKSB7CisJCUJDRF9UT19CSU4oYWxtX3RtLT50bV9tb24pOworCQlhbG1fdG0tPnRtX21vbiAtPSAxOworCX0gZWxzZSB7CisJCWFsbV90bS0+dG1fbW9uID0gMHhmZjsKKwl9CisKKwlpZiAoYWxtX2VuICYgUzNDMjQxMF9SVENBTE1fWUVBUkVOKSB7CisJCUJDRF9UT19CSU4oYWxtX3RtLT50bV95ZWFyKTsKKwl9IGVsc2UgeworCQlhbG1fdG0tPnRtX3llYXIgPSAweGZmZmY7CisJfQorCisJLyogdG9kbyAtIHNldCBhbHJtLT5lbmFibGVkID8gKi8KK30KKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19zZXRhbGFybShzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisJdW5zaWduZWQgaW50IGFscm1fZW47CisKKwlwcl9kZWJ1ZygiczNjMjQxMF9ydGNfc2V0YWxhcm06ICVkLCAlMDJ4LyUwMngvJTAyeCAlMDJ4LiUwMnguJTAyeFxuIiwKKwkJIGFscm0tPmVuYWJsZWQsCisJCSB0bS0+dG1fbWRheSAmIDB4ZmYsIHRtLT50bV9tb24gJiAweGZmLCB0bS0+dG1feWVhciAmIDB4ZmYsCisJCSB0bS0+dG1faG91ciAmIDB4ZmYsIHRtLT50bV9taW4gJiAweGZmLCB0bS0+dG1fc2VjKTsKKworCWlmIChhbHJtLT5lbmFibGVkIHx8IDEpIHsKKwkJYWxybV9lbiA9IHJlYWRiKFMzQzI0MTBfUlRDQUxNKSAmIFMzQzI0MTBfUlRDQUxNX0FMTUVOOworCQl3cml0ZWIoMHgwMCwgUzNDMjQxMF9SVENBTE0pOworCisJCWlmICh0bS0+dG1fc2VjIDwgNjAgJiYgdG0tPnRtX3NlYyA+PSAwKSB7CisJCQlhbHJtX2VuIHw9IFMzQzI0MTBfUlRDQUxNX1NFQ0VOOworCQkJd3JpdGViKEJJTjJCQ0QodG0tPnRtX3NlYyksIFMzQzI0MTBfQUxNU0VDKTsKKwkJfQorCisJCWlmICh0bS0+dG1fbWluIDwgNjAgJiYgdG0tPnRtX21pbiA+PSAwKSB7CisJCQlhbHJtX2VuIHw9IFMzQzI0MTBfUlRDQUxNX01JTkVOOworCQkJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21pbiksIFMzQzI0MTBfQUxNTUlOKTsKKwkJfQorCisJCWlmICh0bS0+dG1faG91ciA8IDI0ICYmIHRtLT50bV9ob3VyID49IDApIHsKKwkJCWFscm1fZW4gfD0gUzNDMjQxMF9SVENBTE1fSE9VUkVOOworCQkJd3JpdGViKEJJTjJCQ0QodG0tPnRtX2hvdXIpLCBTM0MyNDEwX0FMTUhPVVIpOworCQl9CisKKwkJcHJfZGVidWcoInNldHRpbmcgUzNDMjQxMF9SVENBTE0gdG8gJTA4eFxuIiwgYWxybV9lbik7CisKKwkJd3JpdGViKGFscm1fZW4sIFMzQzI0MTBfUlRDQUxNKTsKKwkJZW5hYmxlX2lycV93YWtlKHMzYzI0MTBfcnRjX2FsYXJtbm8pOworCX0gZWxzZSB7CisJCWFscm1fZW4gPSByZWFkYihTM0MyNDEwX1JUQ0FMTSk7CisJCWFscm1fZW4gJj0gflMzQzI0MTBfUlRDQUxNX0FMTUVOOworCQl3cml0ZWIoYWxybV9lbiwgUzNDMjQxMF9SVENBTE0pOworCQlkaXNhYmxlX2lycV93YWtlKHMzYzI0MTBfcnRjX2FsYXJtbm8pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwljYXNlIFJUQ19BSUVfT046CisJCXMzYzI0MTBfcnRjX3NldGFpZSgoY21kID09IFJUQ19BSUVfT04pID8gMSA6IDApOworCQlyZXR1cm4gMDsKKworCWNhc2UgUlRDX1BJRV9PRkY6CisJY2FzZSBSVENfUElFX09OOgorCQlzM2MyNDEwX3J0Y19zZXRwaWUoKGNtZCA9PSBSVENfUElFX09OKSA/IDEgOiAwKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJUQ19JUlFQX1JFQUQ6CisJCXJldHVybiBwdXRfdXNlcihzM2MyNDEwX3J0Y19mcmVxLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpOworCisJY2FzZSBSVENfSVJRUF9TRVQ6CisJCWlmIChhcmcgPCAxIHx8IGFyZyA+IDY0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJLyogY2hlY2sgZm9yIHBvd2VyIG9mIDIgKi8KKworCQlpZiAoKGFyZyAmIChhcmctMSkpICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcl9kZWJ1ZygiczNjMjQxMF9ydGM6IHNldHRpbmcgZnJlcXVlbmN5ICVsZFxuIiwgYXJnKTsKKworCQlzM2MyNDEwX3J0Y19zZXRmcmVxKGFyZyk7CisJCXJldHVybiAwOworCisJY2FzZSBSVENfVUlFX09OOgorCWNhc2UgUlRDX1VJRV9PRkY6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX3Byb2MoY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBydGNhbG0gPSByZWFkYihTM0MyNDEwX1JUQ0FMTSk7CisJdW5zaWduZWQgaW50IHRpY250ID0gcmVhZGIgKFMzQzI0MTBfVElDTlQpOworCWNoYXIgKnAgPSBidWY7CisKKwlwICs9IHNwcmludGYocCwgImFsYXJtX0lSUVx0OiAlc1xuIiwKKwkJICAgICAocnRjYWxtICYgUzNDMjQxMF9SVENBTE1fQUxNRU4pID8gInllcyIgOiAibm8iICk7CisJcCArPSBzcHJpbnRmKHAsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsCisJCSAgICAgKHRpY250ICYgUzNDMjQxMF9USUNOVF9FTkFCTEUpID8gInllcyIgOiAibm8iICk7CisJcCArPSBzcHJpbnRmKHAsICJwZXJpb2RpY19mcmVxXHQ6ICVkXG4iLCBzM2MyNDEwX3J0Y19mcmVxKTsKKworCXJldHVybiBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IHMzYzI0MTBfcnRjX29wZW4odm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoczNjMjQxMF9ydGNfYWxhcm1ubywgczNjMjQxMF9ydGNfYWxhcm1pcnEsCisJCQkgIFNBX0lOVEVSUlVQVCwgICJzM2MyNDEwLXJ0YyBhbGFybSIsIE5VTEwpOworCisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICJJUlElZCBhbHJlYWR5IGluIHVzZVxuIiwgczNjMjQxMF9ydGNfYWxhcm1ubyk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShzM2MyNDEwX3J0Y190aWNrbm8sIHMzYzI0MTBfcnRjX3RpY2tpcnEsCisJCQkgIFNBX0lOVEVSUlVQVCwgICJzM2MyNDEwLXJ0YyB0aWNrIiwgTlVMTCk7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVJRJWQgYWxyZWFkeSBpbiB1c2VcbiIsIHMzYzI0MTBfcnRjX3RpY2tubyk7CisJCWdvdG8gdGlja19lcnI7CisJfQorCisJcmV0dXJuIHJldDsKKworIHRpY2tfZXJyOgorCWZyZWVfaXJxKHMzYzI0MTBfcnRjX2FsYXJtbm8sIE5VTEwpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBfcnRjX3JlbGVhc2Uodm9pZCkKK3sKKwkvKiBkbyBub3QgY2xlYXIgQUlFIGhlcmUsIGl0IG1heSBiZSBuZWVkZWQgZm9yIHdha2UgKi8KKworCXMzYzI0MTBfcnRjX3NldHBpZSgwKTsKKwlmcmVlX2lycShzM2MyNDEwX3J0Y19hbGFybW5vLCBOVUxMKTsKKwlmcmVlX2lycShzM2MyNDEwX3J0Y190aWNrbm8sIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19vcHMgczNjMjQxMF9ydGNvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHMzYzI0MTBfcnRjX29wZW4sCisJLnJlbGVhc2UJPSBzM2MyNDEwX3J0Y19yZWxlYXNlLAorCS5pb2N0bAkJPSBzM2MyNDEwX3J0Y19pb2N0bCwKKwkucmVhZF90aW1lCT0gczNjMjQxMF9ydGNfZ2V0dGltZSwKKwkuc2V0X3RpbWUJPSBzM2MyNDEwX3J0Y19zZXR0aW1lLAorCS5yZWFkX2FsYXJtCT0gczNjMjQxMF9ydGNfZ2V0YWxhcm0sCisJLnNldF9hbGFybQk9IHMzYzI0MTBfcnRjX3NldGFsYXJtLAorCS5wcm9jCSAgICAgICAgPSBzM2MyNDEwX3J0Y19wcm9jLAorfTsKKworc3RhdGljIHZvaWQgczNjMjQxMF9ydGNfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGVuKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlpZiAoczNjMjQxMF9ydGNfYmFzZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoIWVuKSB7CisJCXRtcCA9IHJlYWRiKFMzQzI0MTBfUlRDQ09OKTsKKwkJd3JpdGViKHRtcCAmIH5TM0MyNDEwX1JUQ0NPTl9SVENFTiwgUzNDMjQxMF9SVENDT04pOworCisJCXRtcCA9IHJlYWRiKFMzQzI0MTBfVElDTlQpOworCQl3cml0ZWIodG1wICYgflMzQzI0MTBfVElDTlRfRU5BQkxFLCBTM0MyNDEwX1RJQ05UKTsKKwl9IGVsc2UgeworCQkvKiByZS1lbmFibGUgdGhlIGRldmljZSwgYW5kIGNoZWNrIGl0IGlzIG9rICovCisKKwkJaWYgKChyZWFkYihTM0MyNDEwX1JUQ0NPTikgJiBTM0MyNDEwX1JUQ0NPTl9SVENFTikgPT0gMCl7CisJCQlkZXZfaW5mbyhkZXYsICJydGMgZGlzYWJsZWQsIHJlLWVuYWJsaW5nXG4iKTsKKworCQkJdG1wID0gcmVhZGIoUzNDMjQxMF9SVENDT04pOworCQkJd3JpdGViKHRtcCB8IFMzQzI0MTBfUlRDQ09OX1JUQ0VOICwgUzNDMjQxMF9SVENDT04pOworCQl9CisKKwkJaWYgKChyZWFkYihTM0MyNDEwX1JUQ0NPTikgJiBTM0MyNDEwX1JUQ0NPTl9DTlRTRUwpKXsKKwkJCWRldl9pbmZvKGRldiwgInJlbW92aW5nIFMzQzI0MTBfUlRDQ09OX0NOVFNFTFxuIik7CisKKwkJCXRtcCA9IHJlYWRiKFMzQzI0MTBfUlRDQ09OKTsKKwkJCXdyaXRlYih0bXAmIH5TM0MyNDEwX1JUQ0NPTl9DTlRTRUwgLCBTM0MyNDEwX1JUQ0NPTik7CisJCX0KKworCQlpZiAoKHJlYWRiKFMzQzI0MTBfUlRDQ09OKSAmIFMzQzI0MTBfUlRDQ09OX0NMS1JTVCkpeworCQkJZGV2X2luZm8oZGV2LCAicmVtb3ZpbmcgUzNDMjQxMF9SVENDT05fQ0xLUlNUXG4iKTsKKworCQkJdG1wID0gcmVhZGIoUzNDMjQxMF9SVENDT04pOworCQkJd3JpdGViKHRtcCAmIH5TM0MyNDEwX1JUQ0NPTl9DTEtSU1QsIFMzQzI0MTBfUlRDQ09OKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXVucmVnaXN0ZXJfcnRjKCZzM2MyNDEwX3J0Y29wcyk7CisKKwlzM2MyNDEwX3J0Y19zZXRwaWUoMCk7CisJczNjMjQxMF9ydGNfc2V0YWllKDApOworCisJaWYgKHMzYzI0MTBfcnRjX21lbSAhPSBOVUxMKSB7CisJCXByX2RlYnVnKCJzM2MyNDEwX3J0YzogcmVsZWFzaW5nIHMzYzI0MTBfcnRjX21lbVxuIik7CisJCWlvdW5tYXAoczNjMjQxMF9ydGNfYmFzZSk7CisJCXJlbGVhc2VfcmVzb3VyY2UoczNjMjQxMF9ydGNfbWVtKTsKKwkJa2ZyZWUoczNjMjQxMF9ydGNfbWVtKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXM6IHByb2JlPSVwLCBkZXZpY2U9JXBcbiIsIF9fRlVOQ1RJT05fXywgcGRldiwgZGV2KTsKKworCS8qIGZpbmQgdGhlIElSUXMgKi8KKworCXMzYzI0MTBfcnRjX3RpY2tubyA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CisJaWYgKHMzYzI0MTBfcnRjX3RpY2tubyA8PSAwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gaXJxIGZvciBydGMgdGlja1xuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXMzYzI0MTBfcnRjX2FsYXJtbm8gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChzM2MyNDEwX3J0Y19hbGFybW5vIDw9IDApIHsKKwkJZGV2X2VycihkZXYsICJubyBpcnEgZm9yIGFsYXJtXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcHJfZGVidWcoInMzYzI0MTBfcnRjOiB0aWNrIGlycSAlZCwgYWxhcm0gaXJxICVkXG4iLAorCQkgczNjMjQxMF9ydGNfdGlja25vLCBzM2MyNDEwX3J0Y19hbGFybW5vKTsKKworCS8qIGdldCB0aGUgbWVtb3J5IHJlZ2lvbiAqLworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb24gcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlzM2MyNDEwX3J0Y19tZW0gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQtcmVzLT5zdGFydCsxLAorCQkJCSAgICAgcGRldi0+bmFtZSk7CisKKwlpZiAoczNjMjQxMF9ydGNfbWVtID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVzZXJ2ZSBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBleGl0X2VycjsKKwl9CisKKwlzM2MyNDEwX3J0Y19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlpZiAoczNjMjQxMF9ydGNfYmFzZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIGlvcmVtYXAoKVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdF9lcnI7CisJfQorCisJczNjMjQxMF9ydGNfbWVtID0gcmVzOworCXByX2RlYnVnKCJzM2MyNDEwX3J0Y19iYXNlPSVwXG4iLCBzM2MyNDEwX3J0Y19iYXNlKTsKKworIAlwcl9kZWJ1ZygiczNjMjQxMF9ydGM6IFJUQ0NPTj0lMDJ4XG4iLCByZWFkYihTM0MyNDEwX1JUQ0NPTikpOworCisJLyogY2hlY2sgdG8gc2VlIGlmIGV2ZXJ5dGhpbmcgaXMgc2V0dXAgY29ycmVjdGx5ICovCisKKwlzM2MyNDEwX3J0Y19lbmFibGUoZGV2LCAxKTsKKworIAlwcl9kZWJ1ZygiczNjMjQxMF9ydGM6IFJUQ0NPTj0lMDJ4XG4iLCByZWFkYihTM0MyNDEwX1JUQ0NPTikpOworCisJczNjMjQxMF9ydGNfc2V0ZnJlcShzM2MyNDEwX3J0Y19mcmVxKTsKKworCS8qIHJlZ2lzdGVyIFJUQyBhbmQgZXhpdCAqLworCisJcmVnaXN0ZXJfcnRjKCZzM2MyNDEwX3J0Y29wcyk7CisJcmV0dXJuIDA7CisKKyBleGl0X2VycjoKKwlkZXZfZXJyKGRldiwgImVycm9yICVkIGR1cmluZyBpbml0aWFsaXNhdGlvblxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworLyogUzNDMjQxMCBSVEMgUG93ZXIgbWFuYWdlbWVudCBjb250cm9sICovCisKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgczNjMjQxMF9ydGNfZGVsdGE7CisKK3N0YXRpYyBpbnQgdGljbnRfc2F2ZTsKKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJdGltZS50dl9uc2VjID0gMDsKKworCWlmIChsZXZlbCA9PSBTVVNQRU5EX1BPV0VSX0RPV04pIHsKKwkJLyogc2F2ZSBUSUNOVCBmb3IgYW55b25lIHVzaW5nIHBlcmlvZGljIGludGVycnVwdHMgKi8KKworCQl0aWNudF9zYXZlID0gcmVhZGIoUzNDMjQxMF9USUNOVCk7CisKKwkJLyogY2FsY3VsYXRlIHRpbWUgZGVsdGEgZm9yIHN1c3BlbmQgKi8KKworCQlzM2MyNDEwX3J0Y19nZXR0aW1lKCZ0bSk7CisJCXJ0Y190bV90b190aW1lKCZ0bSwgJnRpbWUudHZfc2VjKTsKKwkJc2F2ZV90aW1lX2RlbHRhKCZzM2MyNDEwX3J0Y19kZWx0YSwgJnRpbWUpOworCQlzM2MyNDEwX3J0Y19lbmFibGUoZGV2LCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwX3J0Y19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJdGltZS50dl9uc2VjID0gMDsKKworCXMzYzI0MTBfcnRjX2VuYWJsZShkZXYsIDEpOworCXMzYzI0MTBfcnRjX2dldHRpbWUoJnRtKTsKKwlydGNfdG1fdG9fdGltZSgmdG0sICZ0aW1lLnR2X3NlYyk7CisJcmVzdG9yZV90aW1lX2RlbHRhKCZzM2MyNDEwX3J0Y19kZWx0YSwgJnRpbWUpOworCisJd3JpdGViKHRpY250X3NhdmUsIFMzQzI0MTBfVElDTlQpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgczNjMjQxMF9ydGNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHMzYzI0MTBfcnRjX3Jlc3VtZSAgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzM2MyNDEwX3J0Y2RydiA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1ydGMiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBzM2MyNDEwX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IHMzYzI0MTBfcnRjX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHMzYzI0MTBfcnRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzM2MyNDEwX3J0Y19yZXN1bWUsCit9OworCitzdGF0aWMgY2hhciBfX2luaXRkYXRhIGJhbm5lcltdID0gIlMzQzI0MTAgUlRDLCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3NcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHMzYzI0MTBfcnRjX2luaXQodm9pZCkKK3sKKwlwcmludGsoYmFubmVyKTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZzM2MyNDEwX3J0Y2Rydik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNDEwX3J0Y19leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0MTBfcnRjZHJ2KTsKK30KKworbW9kdWxlX2luaXQoczNjMjQxMF9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChzM2MyNDEwX3J0Y19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNFhYIFJUQyBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJlbiBEb29rcywgPGJlbkBzaW10ZWMuY28udWs+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc2Nhbl9rZXliLmMgYi9kcml2ZXJzL2NoYXIvc2Nhbl9rZXliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1YmI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9zY2FuX2tleWIuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqCSRJZDogc2Nhbl9rZXliLmMsdiAxLjIgMjAwMC8wNy8wNCAwNjoyNDo0MiB5YWVnYXNoaSBFeHAgJCAKKyAqCUNvcHlyaWdodCAoQykgMjAwMCBZQUVHQVNISSBUYWtlc2hpCisgKglHZW5lcmljIHNjYW4ga2V5Ym9hcmQgZHJpdmVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rYmRfbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKworI2RlZmluZSBTQ0FOSFoJKEhaLzIwKQorCitzdHJ1Y3Qgc2Nhbl9rZXlib2FyZCB7CisJc3RydWN0IHNjYW5fa2V5Ym9hcmQgKm5leHQ7CisJaW50ICgqc2NhbikodW5zaWduZWQgY2hhciAqYnVmZmVyKTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZTsKKwl1bnNpZ25lZCBjaGFyICpzMCwgKnMxOworCWludCBsZW5ndGg7Cit9OworCitzdGF0aWMgaW50IHNjYW5famlmZmllcz0wOworc3RhdGljIHN0cnVjdCBzY2FuX2tleWJvYXJkICprZXlib2FyZHM9TlVMTDsKK3N0cnVjdCB0aW1lcl9saXN0IHNjYW5fdGltZXI7CisKK3N0YXRpYyB2b2lkIGNoZWNrX2tiZChjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbmV3LCB1bnNpZ25lZCBjaGFyICpvbGQsIGludCBsZW5ndGgpCit7CisJaW50IG5lZWRfdGFza2xldF9zY2hlZHVsZT0wOworCXVuc2lnbmVkIGludCB4b3IsIGJpdDsKKwkKKwl3aGlsZShsZW5ndGgtLT4wKSB7CisJCWlmKCh4b3I9Km5ld14qb2xkKT09MCkgeworCQkJdGFibGUrPTg7CisJCX0KKwkJZWxzZSB7CisJCQlmb3IoYml0PTB4MDE7IGJpdDwweDEwMDsgYml0PDw9MSkgeworCQkJCWlmKHhvciZiaXQpIHsKKwkJCQkJaGFuZGxlX3NjYW5jb2RlKCp0YWJsZSwgISgqbmV3JmJpdCkpOworCQkJCQluZWVkX3Rhc2tsZXRfc2NoZWR1bGU9MTsKKyNpZiAwCisJCQkJCXByaW50aygiMHgleCAlc1xuIiwgKnRhYmxlLCAoKm5ldyZiaXQpPyJyZWxlYXNlZCI6InByZXNzZWQiKTsKKyNlbmRpZgorCQkJCX0KKwkJCQl0YWJsZSsrOworCQkJfQorCQl9CisJCW5ldysrOyBvbGQrKzsKKwl9CisKKwlpZihuZWVkX3Rhc2tsZXRfc2NoZWR1bGUpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmtleWJvYXJkX3Rhc2tsZXQpOworfQorCisKK3N0YXRpYyB2b2lkIHNjYW5fa2JkKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJc3RydWN0IHNjYW5fa2V5Ym9hcmQgKmtiZDsKKworCXNjYW5famlmZmllcysrOworCisJZm9yKGtiZD1rZXlib2FyZHM7IGtiZCE9TlVMTDsga2JkPWtiZC0+bmV4dCkgeworCQlpZihzY2FuX2ppZmZpZXMmMSkgeworCQkJaWYoIWtiZC0+c2NhbihrYmQtPnMwKSkKKwkJCQljaGVja19rYmQoa2JkLT50YWJsZSwKKwkJCQkJICBrYmQtPnMwLCBrYmQtPnMxLCBrYmQtPmxlbmd0aCk7CisJCQllbHNlCisJCQkJbWVtY3B5KGtiZC0+czAsIGtiZC0+czEsIGtiZC0+bGVuZ3RoKTsKKwkJfQorCQllbHNlIHsKKwkJCWlmKCFrYmQtPnNjYW4oa2JkLT5zMSkpCisJCQkJY2hlY2tfa2JkKGtiZC0+dGFibGUsCisJCQkJCSAga2JkLT5zMSwga2JkLT5zMCwga2JkLT5sZW5ndGgpOworCQkJZWxzZQorCQkJCW1lbWNweShrYmQtPnMxLCBrYmQtPnMwLCBrYmQtPmxlbmd0aCk7CisJCX0KKwkJCisJfQorCisJaW5pdF90aW1lcigmc2Nhbl90aW1lcik7CisJc2Nhbl90aW1lci5leHBpcmVzID0gamlmZmllcyArIFNDQU5IWjsKKwlzY2FuX3RpbWVyLmRhdGEgPSAwOworCXNjYW5fdGltZXIuZnVuY3Rpb24gPSBzY2FuX2tiZDsKKwlhZGRfdGltZXIoJnNjYW5fdGltZXIpOworfQorCisKK2ludCByZWdpc3Rlcl9zY2FuX2tleWJvYXJkKGludCAoKnNjYW4pKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciksCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZSwKKwkJCSAgIGludCBsZW5ndGgpCit7CisJc3RydWN0IHNjYW5fa2V5Ym9hcmQgKmtiZDsKKworCWtiZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2FuX2tleWJvYXJkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGtiZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX291dDsKKworCWtiZC0+c2Nhbj1zY2FuOworCWtiZC0+dGFibGU9dGFibGU7CisJa2JkLT5sZW5ndGg9bGVuZ3RoOworCisJa2JkLT5zMCA9IGttYWxsb2MobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoa2JkLT5zMCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2ZyZWVfa2JkOworCisJa2JkLT5zMSA9IGttYWxsb2MobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoa2JkLT5zMSA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2ZyZWVfczA7CisKKwltZW1zZXQoa2JkLT5zMCwgLTEsIGtiZC0+bGVuZ3RoKTsKKwltZW1zZXQoa2JkLT5zMSwgLTEsIGtiZC0+bGVuZ3RoKTsKKwkKKwlrYmQtPm5leHQ9a2V5Ym9hcmRzOworCWtleWJvYXJkcz1rYmQ7CisKKwlyZXR1cm4gMDsKKworIGVycm9yX2ZyZWVfczA6CisJa2ZyZWUoa2JkLT5zMCk7CisKKyBlcnJvcl9mcmVlX2tiZDoKKwlrZnJlZShrYmQpOworCisgZXJyb3Jfb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCQkJICAgICAgCisJCQkgICAgICAKK3ZvaWQgX19pbml0IHNjYW5fa2JkX2luaXQodm9pZCkKK3sKKwlpbml0X3RpbWVyKCZzY2FuX3RpbWVyKTsKKwlzY2FuX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU0NBTkhaOworCXNjYW5fdGltZXIuZGF0YSA9IDA7CisJc2Nhbl90aW1lci5mdW5jdGlvbiA9IHNjYW5fa2JkOworCWFkZF90aW1lcigmc2Nhbl90aW1lcik7CisKKwlwcmludGsoS0VSTl9JTkZPICJHZW5lcmljIHNjYW4ga2V5Ym9hcmQgZHJpdmVyIGluaXRpYWxpemVkXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zY2FuX2tleWIuaCBiL2RyaXZlcnMvY2hhci9zY2FuX2tleWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI2MTEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NjYW5fa2V5Yi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYJX19EUklWRVJfQ0hBUl9TQ0FOX0tFWUJfSAorI2RlZmluZQlfX0RSSVZFUl9DSEFSX1NDQU5fS0VZQl9ICisvKgorICoJJElkOiBzY2FuX2tleWIuaCx2IDEuMSAyMDAwLzA2LzEwIDIxOjQ1OjMwIHlhZWdhc2hpIEV4cCAkCisgKglDb3B5cmlnaHQgKEMpIDIwMDAgWUFFR0FTSEkgVGFrZXNoaQorICoJR2VuZXJpYyBzY2FuIGtleWJvYXJkIGRyaXZlcgorICovCisKK2ludCByZWdpc3Rlcl9zY2FuX2tleWJvYXJkKGludCAoKnNjYW4pKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciksCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZSwKKwkJCSAgIGludCBsZW5ndGgpOworCit2b2lkIF9faW5pdCBzY2FuX2tiZF9pbml0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zY2MuaCBiL2RyaXZlcnMvY2hhci9zY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgxMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NjYy5oCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICogYXRhcmlfU0NDLmg6IERlZmluaXRpb25zIGZvciB0aGUgQW04NTMwIFNlcmlhbCBDb21tdW5pY2F0aW9ucyBDb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IDE5OTQgUm9tYW4gSG9kZWsgPFJvbWFuLkhvZGVrQGluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworCisjaWZuZGVmIF9TQ0NfSAorI2RlZmluZSBfU0NDX0gKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKy8qIFNwZWNpYWwgY29uZmlndXJhdGlvbiBpb2N0bHMgZm9yIHRoZSBBdGFyaSBTQ0M1MzgwIFNlcmlhbAorICogQ29tbXVuaWNhdGlvbnMgQ29udHJvbGxlcgorICovCisKKy8qIGlvY3RsIGNvbW1hbmQgY29kZXMgKi8KKworI2RlZmluZSBUSU9DR0FUU0NDCTB4NTRjMAkvKiBnZXQgU0NDIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgVElPQ1NBVFNDQwkweDU0YzEJLyogc2V0IFNDQyBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFRJT0NEQVRTQ0MJMHg1NGMyCS8qIHJlc2V0IGNvbmZpZ3VyYXRpb24gdG8gZGVmYXVsdHMgKi8KKworLyogQ2xvY2sgc291cmNlcyAqLworCisjZGVmaW5lIENMS19SVHhDCTAKKyNkZWZpbmUgQ0xLX1RSeEMJMQorI2RlZmluZSBDTEtfUENMSwkyCisKKy8qIGJhdWRfYmFzZXMgZm9yIHRoZSBjb21tb24gY2xvY2tzIGluIHRoZSBBdGFyaS4gVGhlc2UgYXJlIHRoZSByZWFsCisgKiBmcmVxdWVuY2llcyBkaXZpZGVkIGJ5IDE2LgorICovCisgICAKKyNkZWZpbmUgU0NDX0JBVURfQkFTRV9USU1DCTE5MjAwCS8qIDAuMzA3MiBNSHogZnJvbSBUVC1NRlAsIFRpbWVyIEMgKi8KKyNkZWZpbmUgU0NDX0JBVURfQkFTRV9CQ0xLCTE1MzYwMAkvKiAyLjQ1NzYgTUh6ICovCisjZGVmaW5lIFNDQ19CQVVEX0JBU0VfUENMSzQJMjI5NTAwCS8qIDMuNjcyMCBNSHogKi8KKyNkZWZpbmUgU0NDX0JBVURfQkFTRV9QQ0xLCTUwMzM3NAkvKiA4LjA1Mzk3NjMgTUh6ICovCisjZGVmaW5lIFNDQ19CQVVEX0JBU0VfTk9ORQkwCS8qIGZvciBub3QgY29ubmVjdGVkIG9yIHVudXNlZAorCQkJCQkgKiBjbG9jayBzb3VyY2VzICovCisKKy8qIFRoZSBTQ0MgY2xvY2sgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IHNjY19jbG9ja19jb25maWcgeworCXVuc2lnbmVkCVJUeENfYmFzZTsJLyogYmFzZV9iYXVkIG9mIFJUeEMgKi8KKwl1bnNpZ25lZAlUUnhDX2Jhc2U7CS8qIGJhc2VfYmF1ZCBvZiBUUnhDICovCisJdW5zaWduZWQJUENMS19iYXNlOwkvKiBiYXNlX2JhdWQgb2YgUENMSywgYm90aCBjaGFubmVscyEgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjbGtzcmM7CS8qIENMS19SVHhDLCBDTEtfVFJ4QyBvciBDTEtfUENMSyAqLworCQl1bnNpZ25lZCBkaXZpc29yOwkvKiBkaXZpc29yIGZvciBiYXNlIGJhdWQsIHZhbGlkIHZhbHVlczoKKwkJCQkJICogc2VlIGJlbG93ICovCisJfSBiYXVkX3RhYmxlWzE3XTsJCS8qIEZvciA1MCwgNzUsIDExMCwgMTM1LCAxNTAsIDIwMCwgMzAwLAorCQkJCQkgKiA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsIDk2MDAsCisJCQkJCSAqIDE5MjAwLCAzODQwMCwgNTc2MDAgYW5kIDExNTIwMCBicHMuCisJCQkJCSAqIFRoZSBsYXN0IHR3byBjb3VsZCBiZSByZXBsYWNlZCBieQorCQkJCQkgKiBvdGhlciByYXRlcyA+IDM4NDAwIGlmIHRoZXkncmUgbm90CisJCQkJCSAqIHBvc3NpYmxlLgorCQkJCQkgKi8KK307CisKKy8qIFRoZSBmb2xsb3dpbmcgZGl2aXNvcnMgYXJlIHZhbGlkOgorICoKKyAqICAgLSBDTEtfUlR4QzogMSBvciBldmVuICgxLCAyIGFuZCA0IGFyZSB0aGUgZGlyZWN0IG1vZGVzLCA+IDQgdXNlCisgKiAgICAgICAgICAgICAgIHRoZSBCUkcpCisgKgorICogICAtIENMS19UUnhDOiAxLCAyIG9yIDQgKG5vIEJSRywgb25seSBkaXJlY3QgbW9kZXMgcG9zc2libGUpCisgKgorICogICAtIENMS19QQ0xLOiA+PSA0IGFuZCBldmVuIChubyBkaXJlY3QgbW9kZXMsIG9ubHkgQlJHKQorICoKKyAqLworCitzdHJ1Y3Qgc2NjX3BvcnQgeworCXN0cnVjdCBnc19wb3J0CQlnczsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpjdHJscDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpkYXRhcDsKKwlpbnQJCQl4X2NoYXI7CQkvKiB4b24veG9mZiBjaGFyYWN0ZXIgKi8KKwlpbnQJCQljX2RjZDsKKwlpbnQJCQljaGFubmVsOworCXN0cnVjdCBzY2NfcG9ydAkJKnBvcnRfYTsJLyogUmVmZXJlbmNlIHRvIHBvcnQgQSBhbmQgQiAqLworCXN0cnVjdCBzY2NfcG9ydAkJKnBvcnRfYjsJLyogICBzdHJ1Y3RzIGZvciByZWcgYWNjZXNzICAqLworfTsKKworI2RlZmluZSBTQ0NfTUFHSUMJMHg1MjY5NjM2OAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBTQ0MgZG9jdW1lbnRhdGlvbiBnaXZlcyBubyBleHBsaWNpdCBuYW1lcyB0byB0aGUgcmVnaXN0ZXJzLAorICogdGhleSdyZSBqdXN0IGNhbGxlZCBXUjAuLjE1IGFuZCBSUjAuLjE1LiBUbyBtYWtlIHRoZSBzb3VyY2UgY29kZQorICogYmV0dGVyIHJlYWRhYmxlIGFuZCBtYWtlIHRoZSB0cmFuc3BhcmVudCB3cml0ZSByZWcgcmVhZCBhY2Nlc3MgKHNlZQorICogYmVsb3cpIHBvc3NpYmxlLCBJIGNocmlzdGVuIHRoZW0gaGVyZSB3aXRoIHNlbGYtaW52ZW50ZWQgbmFtZXMuCisgKiBOb3RlIHRoYXQgKHJlYWwpIHJlYWQgcmVnaXN0ZXJzIGFyZSBhc3NpZ25lZCBudW1iZXJzIDE2Li4zMS4gV1I3JworICogaGFzIG51bWJlciAzMy4KKyAqLworCisjZGVmaW5lCUNPTU1BTkRfUkVHCQkwCS8qIHdvICovCisjZGVmaW5lCUlOVF9BTkRfRE1BX1JFRwkJMQkvKiB3byAqLworI2RlZmluZQlJTlRfVkVDVE9SX1JFRwkJMgkvKiBydywgY29tbW9uIHRvIGJvdGggY2hhbm5lbHMgKi8KKyNkZWZpbmUJUlhfQ1RSTF9SRUcJCTMJLyogcncgKi8KKyNkZWZpbmUJQVVYMV9DVFJMX1JFRwkJNAkvKiBydyAqLworI2RlZmluZQlUWF9DVFJMX1JFRwkJNQkvKiBydyAqLworI2RlZmluZQlTWU5DX0FEUl9SRUcJCTYJLyogd28gKi8KKyNkZWZpbmUJU1lOQ19DSEFSX1JFRwkJNwkvKiB3byAqLworI2RlZmluZQlTRExDX09QVElPTl9SRUcJCTMzCS8qIHdvICovCisjZGVmaW5lCVRYX0RBVEFfUkVHCQk4CS8qIHdvICovCisjZGVmaW5lCU1BU1RFUl9JTlRfQ1RSTAkJOQkvKiB3bywgY29tbW9uIHRvIGJvdGggY2hhbm5lbHMgKi8KKyNkZWZpbmUJQVVYMl9DVFJMX1JFRwkJMTAJLyogcncgKi8KKyNkZWZpbmUJQ0xLX0NUUkxfUkVHCQkxMQkvKiB3byAqLworI2RlZmluZQlUSU1FUl9MT1dfUkVHCQkxMgkvKiBydyAqLworI2RlZmluZQlUSU1FUl9ISUdIX1JFRwkJMTMJLyogcncgKi8KKyNkZWZpbmUJRFBMTF9DVFJMX1JFRwkJMTQJLyogd28gKi8KKyNkZWZpbmUJSU5UX0NUUkxfUkVHCQkxNQkvKiBydyAqLworCisjZGVmaW5lCVNUQVRVU19SRUcJCTE2CS8qIHJvICovCisjZGVmaW5lCVNQQ09ORF9TVEFUVVNfUkVHCTE3CS8qIHdvICovCisvKiBSUjIgaXMgV1IyIGZvciBDaGFubmVsIEEsIENoYW5uZWwgQiBnaXZlcyB2ZWN0b3IgKyBjdXJyZW50IHN0YXR1czogKi8KKyNkZWZpbmUJQ1VSUl9WRUNUT1JfUkVHCQkxOAkvKiBDaC4gQiBvbmx5LCBDaC4gQSBmb3IgcncgKi8KKyNkZWZpbmUJSU5UX1BFTkRJTkdfUkVHCQkxOQkvKiBDaGFubmVsIEEgb25seSEgKi8KKy8qIFJSNCBpcyBXUjQsIGlmIGI2KE1SNycpID09IDEgKi8KKy8qIFJSNSBpcyBXUjUsIGlmIGI2KE1SNycpID09IDEgKi8KKyNkZWZpbmUJRlNfRklGT19MT1dfUkVHCQkyMgkvKiBybyAqLworI2RlZmluZQlGU19GSUZPX0hJR0hfUkVHCTIzCS8qIHJvICovCisjZGVmaW5lCVJYX0RBVEFfUkVHCQkyNAkvKiBybyAqLworLyogUlI5IGlzIFdSMywgaWYgYjYoTVI3JykgPT0gMSAqLworI2RlZmluZQlEUExMX1NUQVRVU19SRUcJCTI2CS8qIHJvICovCisvKiBSUjExIGlzIFdSMTAsIGlmIGI2KE1SNycpID09IDEgKi8KKy8qIFJSMTIgaXMgV1IxMiAqLworLyogUlIxMyBpcyBXUjEzICovCisvKiBSUjE0IG5vdCBwcmVzZW50ICovCisvKiBSUjE1IGlzIFdSMTUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgVmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogV1IwOiBDT01NQU5EX1JFRyAiQ1IiICovCisKKyNkZWZpbmUJQ1JfUlhfQ1JDX1JFU0VUCQkweDQwCisjZGVmaW5lCUNSX1RYX0NSQ19SRVNFVAkJMHg4MAorI2RlZmluZQlDUl9UWF9VTkRFUlJVTl9SRVNFVAkweGMwCisKKyNkZWZpbmUJQ1JfRVhUU1RBVF9SRVNFVAkweDEwCisjZGVmaW5lCUNSX1NFTkRfQUJPUlQJCTB4MTgKKyNkZWZpbmUJQ1JfRU5BQl9JTlRfTkVYVF9SWAkweDIwCisjZGVmaW5lCUNSX1RYX1BFTkRJTkdfUkVTRVQJMHgyOAorI2RlZmluZQlDUl9FUlJPUl9SRVNFVAkJMHgzMAorI2RlZmluZQlDUl9ISUdIRVNUX0lVU19SRVNFVAkweDM4CisKKworLyogV1IxOiBJTlRfQU5EX0RNQV9SRUcgIklEUiIgKi8KKworI2RlZmluZQlJRFJfRVhUU1RBVF9JTlRfRU5BQgkweDAxCisjZGVmaW5lCUlEUl9UWF9JTlRfRU5BQgkJMHgwMgorI2RlZmluZQlJRFJfUEFSRVJSX0FTX1NQQ09ORAkweDA0CisKKyNkZWZpbmUJSURSX1JYX0lOVF9ESVNBQgkweDAwCisjZGVmaW5lCUlEUl9SWF9JTlRfRklSU1QJMHgwOAorI2RlZmluZQlJRFJfUlhfSU5UX0FMTAkJMHgxMAorI2RlZmluZQlJRFJfUlhfSU5UX1NQQ09ORAkweDE4CisjZGVmaW5lCUlEUl9SWF9JTlRfTUFTSwkJMHgxOAorCisjZGVmaW5lCUlEUl9XQUlUUkVRX1JYCQkweDIwCisjZGVmaW5lCUlEUl9XQUlUUkVRX0lTX1JFUQkweDQwCisjZGVmaW5lCUlEUl9XQUlUUkVRX0VOQUIJMHg4MAorCisKKy8qIFdSMzogUlhfQ1RSTF9SRUcgIlJDUiIgKi8KKworI2RlZmluZQlSQ1JfUlhfRU5BQgkJMHgwMQorI2RlZmluZQlSQ1JfRElTQ0FSRF9TWU5DX0NIQVJTCTB4MDIKKyNkZWZpbmUJUkNSX0FERFJfU0VBUkNICQkweDA0CisjZGVmaW5lCVJDUl9DUkNfRU5BQgkJMHgwOAorI2RlZmluZQlSQ1JfU0VBUkNIX01PREUJCTB4MTAKKyNkZWZpbmUJUkNSX0FVVE9fRU5BQl9NT0RFCTB4MjAKKworI2RlZmluZQlSQ1JfQ0hTSVpFX01BU0sJCTB4YzAKKyNkZWZpbmUJUkNSX0NIU0laRV81CQkweDAwCisjZGVmaW5lCVJDUl9DSFNJWkVfNgkJMHg0MAorI2RlZmluZQlSQ1JfQ0hTSVpFXzcJCTB4ODAKKyNkZWZpbmUJUkNSX0NIU0laRV84CQkweGMwCisKKworLyogV1I0OiBBVVgxX0NUUkxfUkVHICJBMUNSIiAqLworCisjZGVmaW5lCUExQ1JfUEFSSVRZX01BU0sJMHgwMworI2RlZmluZQlBMUNSX1BBUklUWV9OT05FCTB4MDAKKyNkZWZpbmUJQTFDUl9QQVJJVFlfT0RECQkweDAxCisjZGVmaW5lCUExQ1JfUEFSSVRZX0VWRU4JMHgwMworCisjZGVmaW5lCUExQ1JfTU9ERV9NQVNLCQkweDBjCisjZGVmaW5lCUExQ1JfTU9ERV9TWU5DUgkJMHgwMAorI2RlZmluZQlBMUNSX01PREVfQVNZTkNfMQkweDA0CisjZGVmaW5lCUExQ1JfTU9ERV9BU1lOQ18xNQkweDA4CisjZGVmaW5lCUExQ1JfTU9ERV9BU1lOQ18yCTB4MGMKKworI2RlZmluZQlBMUNSX1NZTkNSX01PREVfTUFTSwkweDMwCisjZGVmaW5lCUExQ1JfU1lOQ1JfTU9OT1NZTkMJMHgwMAorI2RlZmluZQlBMUNSX1NZTkNSX0JJU1lOQwkweDEwCisjZGVmaW5lCUExQ1JfU1lOQ1JfU0RMQwkJMHgyMAorI2RlZmluZQlBMUNSX1NZTkNSX0VYVENTWU5DCTB4MzAKKworI2RlZmluZQlBMUNSX0NMS01PREVfTUFTSwkweGMwCisjZGVmaW5lCUExQ1JfQ0xLTU9ERV94MQkJMHgwMAorI2RlZmluZQlBMUNSX0NMS01PREVfeDE2CTB4NDAKKyNkZWZpbmUJQTFDUl9DTEtNT0RFX3gzMgkweDgwCisjZGVmaW5lCUExQ1JfQ0xLTU9ERV94NjQJMHhjMAorCisKKy8qIFdSNTogVFhfQ1RSTF9SRUcgIlRDUiIgKi8KKworI2RlZmluZQlUQ1JfVFhfQ1JDX0VOQUIJCTB4MDEKKyNkZWZpbmUJVENSX1JUUwkJCTB4MDIKKyNkZWZpbmUJVENSX1VTRV9DUkNfQ0NJVFQJMHgwMAorI2RlZmluZQlUQ1JfVVNFX0NSQ18xNgkJMHgwNAorI2RlZmluZQlUQ1JfVFhfRU5BQgkJMHgwOAorI2RlZmluZQlUQ1JfU0VORF9CUkVBSwkJMHgxMAorCisjZGVmaW5lCVRDUl9DSFNJWkVfTUFTSwkJMHg2MAorI2RlZmluZQlUQ1JfQ0hTSVpFXzUJCTB4MDAKKyNkZWZpbmUJVENSX0NIU0laRV82CQkweDIwCisjZGVmaW5lCVRDUl9DSFNJWkVfNwkJMHg0MAorI2RlZmluZQlUQ1JfQ0hTSVpFXzgJCTB4NjAKKworI2RlZmluZQlUQ1JfRFRSCQkJMHg4MAorCisKKy8qIFdSNyc6IFNMRENfT1BUSU9OX1JFRyAiU09SIiAqLworCisjZGVmaW5lCVNPUl9BVVRPX1RYX0VOQUIJMHgwMQorI2RlZmluZQlTT1JfQVVUT19FT01fUkVTRVQJMHgwMgorI2RlZmluZQlTT1JfQVVUT19SVFNfTU9ERQkweDA0CisjZGVmaW5lCVNPUl9OUlpJX0RJU0FCX0hJR0gJMHgwOAorI2RlZmluZQlTT1JfQUxUX0RUUlJFUV9USU1JTkcJMHgxMAorI2RlZmluZQlTT1JfUkVBRF9DUkNfQ0hBUlMJMHgyMAorI2RlZmluZQlTT1JfRVhURU5ERURfUkVHX0FDQ0VTUwkweDQwCisKKworLyogV1I5OiBNQVNURVJfSU5UX0NUUkwgIk1JQyIgKi8KKworI2RlZmluZQlNSUNfVkVDX0lOQ0xfU1RBVAkweDAxCisjZGVmaW5lCU1JQ19OT19WRUNUT1IJCTB4MDIKKyNkZWZpbmUJTUlDX0RJU0FCX0xPV0VSX0NIQUlOCTB4MDQKKyNkZWZpbmUJTUlDX01BU1RFUl9JTlRfRU5BQgkweDA4CisjZGVmaW5lCU1JQ19TVEFUVVNfSElHSAkJMHgxMAorI2RlZmluZQlNSUNfSUdOX0lOVEFDSwkJMHgyMAorCisjZGVmaW5lCU1JQ19OT19SRVNFVAkJMHgwMAorI2RlZmluZQlNSUNfQ0hfQV9SRVNFVAkJMHg0MAorI2RlZmluZQlNSUNfQ0hfQl9SRVNFVAkJMHg4MAorI2RlZmluZQlNSUNfSEFSRF9SRVNFVAkJMHhjMAorCisKKy8qIFdSMTA6IEFVWDJfQ1RSTF9SRUcgIkEyQ1IiICovCisKKyNkZWZpbmUJQTJDUl9TWU5DXzYJCTB4MDEKKyNkZWZpbmUJQTJDUl9MT09QX01PREUJCTB4MDIKKyNkZWZpbmUJQTJDUl9BQk9SVF9PTl9VTkRFUlJVTgkweDA0CisjZGVmaW5lCUEyQ1JfTUFSS19JRExFCQkweDA4CisjZGVmaW5lCUEyQ1JfR09fQUNUSVZFX09OX1BPTEwJMHgxMAorCisjZGVmaW5lCUEyQ1JfQ09ESU5HX01BU0sJMHg2MAorI2RlZmluZQlBMkNSX0NPRElOR19OUloJCTB4MDAKKyNkZWZpbmUJQTJDUl9DT0RJTkdfTlJaSQkweDIwCisjZGVmaW5lCUEyQ1JfQ09ESU5HX0ZNMQkJMHg0MAorI2RlZmluZQlBMkNSX0NPRElOR19GTTAJCTB4NjAKKworI2RlZmluZQlBMkNSX1BSRVNFVF9DUkNfMQkweDgwCisKKworLyogV1IxMTogQ0xLX0NUUkxfUkVHICJDQ1IiICovCisKKyNkZWZpbmUJQ0NSX1RSeENPVVRfTUFTSwkweDAzCisjZGVmaW5lCUNDUl9UUnhDT1VUX1hUQUwJMHgwMAorI2RlZmluZQlDQ1JfVFJ4Q09VVF9UWENMSwkweDAxCisjZGVmaW5lCUNDUl9UUnhDT1VUX0JSRwkJMHgwMgorI2RlZmluZQlDQ1JfVFJ4Q09VVF9EUExMCTB4MDMKKworI2RlZmluZQlDQ1JfVFJ4Q19PVVRQVVQJCTB4MDQKKworI2RlZmluZQlDQ1JfVFhDTEtfTUFTSwkJMHgxOAorI2RlZmluZQlDQ1JfVFhDTEtfUlR4QwkJMHgwMAorI2RlZmluZQlDQ1JfVFhDTEtfVFJ4QwkJMHgwOAorI2RlZmluZQlDQ1JfVFhDTEtfQlJHCQkweDEwCisjZGVmaW5lCUNDUl9UWENMS19EUExMCQkweDE4CisKKyNkZWZpbmUJQ0NSX1JYQ0xLX01BU0sJCTB4NjAKKyNkZWZpbmUJQ0NSX1JYQ0xLX1JUeEMJCTB4MDAKKyNkZWZpbmUJQ0NSX1JYQ0xLX1RSeEMJCTB4MjAKKyNkZWZpbmUJQ0NSX1JYQ0xLX0JSRwkJMHg0MAorI2RlZmluZQlDQ1JfUlhDTEtfRFBMTAkJMHg2MAorCisjZGVmaW5lCUNDUl9SVHhDX1hUQUwJCTB4ODAKKworCisvKiBXUjE0OiBEUExMX0NUUkxfUkVHICJEQ1IiICovCisKKyNkZWZpbmUJRENSX0JSR19FTkFCCQkweDAxCisjZGVmaW5lCURDUl9CUkdfVVNFX1BDTEsJMHgwMgorI2RlZmluZQlEQ1JfRFRSUkVRX0lTX1JFUQkweDA0CisjZGVmaW5lCURDUl9BVVRPX0VDSE8JCTB4MDgKKyNkZWZpbmUJRENSX0xPQ0FMX0xPT1BCQUNLCTB4MTAKKworI2RlZmluZQlEQ1JfRFBMTF9FREdFX1NFQVJDSAkweDIwCisjZGVmaW5lCURDUl9EUExMX0VSUl9SRVNFVAkweDQwCisjZGVmaW5lCURDUl9EUExMX0RJU0FCCQkweDYwCisjZGVmaW5lCURDUl9EUExMX0NMS19CUkcJMHg4MAorI2RlZmluZQlEQ1JfRFBMTF9DTEtfUlR4QwkweGEwCisjZGVmaW5lCURDUl9EUExMX0ZNCQkweGMwCisjZGVmaW5lCURDUl9EUExMX05SWkkJCTB4ZTAKKworCisvKiBXUjE1OiBJTlRfQ1RSTF9SRUcgIklDUiIgKi8KKworI2RlZmluZQlJQ1JfT1BUSU9OUkVHX1NFTEVDVAkweDAxCisjZGVmaW5lCUlDUl9FTkFCX0JSR19aRVJPX0lOVAkweDAyCisjZGVmaW5lCUlDUl9VU0VfRlNfRklGTwkJMHgwNAorI2RlZmluZQlJQ1JfRU5BQl9EQ0RfSU5UCTB4MDgKKyNkZWZpbmUJSUNSX0VOQUJfU1lOQ19JTlQJMHgxMAorI2RlZmluZQlJQ1JfRU5BQl9DVFNfSU5UCTB4MjAKKyNkZWZpbmUJSUNSX0VOQUJfVU5ERVJSVU5fSU5UCTB4NDAKKyNkZWZpbmUJSUNSX0VOQUJfQlJFQUtfSU5UCTB4ODAKKworCisvKiBSUjA6IFNUQVRVU19SRUcgIlNSIiAqLworCisjZGVmaW5lCVNSX0NIQVJfQVZBSUwJCTB4MDEKKyNkZWZpbmUJU1JfQlJHX1pFUk8JCTB4MDIKKyNkZWZpbmUJU1JfVFhfQlVGX0VNUFRZCQkweDA0CisjZGVmaW5lCVNSX0RDRAkJCTB4MDgKKyNkZWZpbmUJU1JfU1lOQ19BQk9SVAkJMHgxMAorI2RlZmluZQlTUl9DVFMJCQkweDIwCisjZGVmaW5lCVNSX1RYX1VOREVSUlVOCQkweDQwCisjZGVmaW5lCVNSX0JSRUFLCQkweDgwCisKKworLyogUlIxOiBTUENPTkRfU1RBVFVTX1JFRyAiU0NTUiIgKi8KKworI2RlZmluZQlTQ1NSX0FMTF9TRU5UCQkweDAxCisjZGVmaW5lCVNDU1JfUkVTSURVQUxfTUFTSwkweDBlCisjZGVmaW5lCVNDU1JfUEFSSVRZX0VSUgkJMHgxMAorI2RlZmluZQlTQ1NSX1JYX09WRVJSVU4JCTB4MjAKKyNkZWZpbmUJU0NTUl9DUkNfRlJBTUVfRVJSCTB4NDAKKyNkZWZpbmUJU0NTUl9FTkRfT0ZfRlJBTUUJMHg4MAorCisKKy8qIFJSMzogSU5UX1BFTkRJTkdfUkVHICJJUFIiICovCisKKyNkZWZpbmUJSVBSX0JfRVhUU1RBVAkJMHgwMQorI2RlZmluZQlJUFJfQl9UWAkJMHgwMgorI2RlZmluZQlJUFJfQl9SWAkJMHgwNAorI2RlZmluZQlJUFJfQV9FWFRTVEFUCQkweDA4CisjZGVmaW5lCUlQUl9BX1RYCQkweDEwCisjZGVmaW5lCUlQUl9BX1JYCQkweDIwCisKKworLyogUlI3OiBGU19GSUZPX0hJR0hfUkVHICJGRkhSIiAqLworCisjZGVmaW5lCUZGSFJfQ05UX01BU0sJCTB4M2YKKyNkZWZpbmUJRkZIUl9JU19GUk9NX0ZJRk8JMHg0MAorI2RlZmluZQlGRkhSX0ZJRk9fT1ZFUlJVTgkweDgwCisKKworLyogUlIxMDogRFBMTF9TVEFUVVNfUkVHICJEU1IiICovCisKKyNkZWZpbmUJRFNSX09OX0xPT1AJCTB4MDIKKyNkZWZpbmUJRFNSX09OX0xPT1BfU0VORElORwkweDEwCisjZGVmaW5lCURTUl9UV09fQ0xLX01JU1NJTkcJMHg0MAorI2RlZmluZQlEU1JfT05FX0NMS19NSVNTSU5HCTB4ODAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIEFjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFRoZSBTQ0MgbmVlZHMgMy41IFBDTEsgY3ljbGVzIHJlY292ZXJ5IHRpbWUgYmV0d2VlbiB0byByZWdpc3RlcgorICogYWNjZXNzZXMuIFBDTEsgcnVucyB3aXRoIDggTUh6IG9uIGFuIEF0YXJpLCBzbyB0aGlzIGRlbGF5IGlzIDMuNSAqCisgKiAxMjUgbnMgPSA0MzcuNSBucy4gVGhpcyBpcyB0b28gc2hvcnQgZm9yIHVkZWxheSgpLgorICogMTAvMTYvOTU6IEEgdHN0YiBtZnAucGFyX2R0X3JlZyB0YWtlcyA2MDBucyAoc3VyZT8pIGFuZCB0aHVzIHNob3VsZCBiZQorICogcXVpdGUgcmlnaHQKKyAqLworCisjZGVmaW5lIHNjY19yZWdfZGVsYXkoKSBcCisgICAgZG8gewkJCVwKKwlpZiAoTUFDSF9JU19NVk1FMTZ4IHx8IE1BQ0hfSVNfQlZNRTYwMDAgfHwgTUFDSF9JU19NVk1FMTQ3KQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICggIiBub3A7IG5vcCIpOwkJCVwKKwllbHNlIGlmIChNQUNIX0lTX0FUQVJJKQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAidHN0YiAlMCIgOiA6ICJnIiAoKl9zY2NfZGVsKSA6ICJjYyIgKTtcCisgICAgfSB3aGlsZSAoMCkKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2NjX3NoYWRvd1syXVsxNl07CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHNob3VsZCByZWxheCB0aGUgc29tZWhvdyBjb21wbGljYXRlZAorICogcmVnaXN0ZXIgYWNjZXNzIG9mIHRoZSBTQ0MuIF9TQ0N3cml0ZSgpIHN0b3JlcyBhbGwgd3JpdHRlbiB2YWx1ZXMKKyAqIChleGNlcHQgZm9yIFdSMCBhbmQgV1I4KSBpbiBzaGFkb3cgcmVnaXN0ZXJzIGZvciBsYXRlciByZWNhbGwuIFRoaXMKKyAqIHJlbW92ZXMgdGhlIGJ1cmRlbiBvZiByZW1lbWJlcmluZyB3cml0dGVuIHZhbHVlcyBhcyBuZWVkZWQuIFRoZQorICogZXh0cmEgd29yayBvZiBzdG9yaW5nIHRoZSB2YWx1ZSBkb2Vzbid0IGNvdW50LCBzaW5jZSBhIGRlbGF5IGlzCisgKiBuZWVkZWQgYWZ0ZXIgYSBTQ0MgYWNjZXNzIGFueXdheS4gQWRkaXRpb25hbGx5LCBfU0NDd3JpdGUoKSBtYW5hZ2VzCisgKiB3cml0ZXMgdG8gV1IwIGFuZCBXUjggZGlmZmVyZW50bHksIGJlY2F1c2UgdGhlc2UgY2FuIGJlIGFjY2Vzc2VkCisgKiBkaXJlY3RseSB3aXRoIGxlc3Mgb3ZlcmhlYWQuIEFub3RoZXIgc3BlY2lhbCBjYXNlIGFyZSBXUjcgYW5kIFdSNycuCisgKiBfU0NDd3JpdGUgYXV0b21hdGljYWxseSBjaGVja3Mgd2hhdCBvZiB0aGlzIHJlZ2lzdGVycyBpcyBzZWxlY3RlZAorICogYW5kIGNoYW5nZXMgYjAgb2YgV1IxNSBpZiBuZWVkZWQuCisgKiAKKyAqIF9TQ0NyZWFkKCkgZm9yIHN0YW5kYXJkIHJlYWQgcmVnaXN0ZXJzIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgZXhjZXB0CisgKiBmb3IgUlIyIChzcGxpdCBpbnRvIHR3byAidmlydHVhbCIgcmVnaXN0ZXJzOiBvbmUgZm9yIHRoZSB2YWx1ZQorICogd3JpdHRlbiB0byBXUjIgKGZyb20gdGhlIHNoYWRvdykgYW5kIG9uZSBmb3IgdGhlIHZlY3RvciBpbmNsdWRpbmcKKyAqIHN0YXR1cyBmcm9tIFJSMiwgQ2guIEIpIGFuZCBSUjMuIFRoZSBsYXR0ZXIgbXVzdCBiZSByZWFkIGZyb20KKyAqIENoYW5uZWwgQSwgYmVjYXVzZSBpdCByZWFkcyBhcyBhbGwgemVyb3Mgb24gQ2guIEIuIFJSMCBhbmQgUlI4IGNhbgorICogYmUgYWNjZXNzZWQgZGlyZWN0bHkgYXMgYmVmb3JlLgorICogCisgKiBUaGUgdHdvIGlubGluZSBmdW5jdGlvbiBjb250YWluIGNvbXBsaWNhdGVkIHN3aXRjaCBzdGF0ZW1lbnRzLiBCdXQKKyAqIEkgcmVseSBvbiByZWdubyBhbmQgZmluYWxfZGVsYXkgYmVpbmcgY29uc3RhbnRzLCBzbyBnY2MgY2FuIHJlZHVjZQorICogdGhlIHdob2xlIHN0dWZmIHRvIGp1c3Qgc29tZSBhc3NlbWJsZXIgc3RhdGVtZW50cy4KKyAqIAorICogX1NDQ3dyaXRlIGFuZCBfU0NDcmVhZCBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseSB1bmRlcgorICogbm9ybWFsIGNpcmN1bXN0YW5jZXMuIFRoZSBtYWNyb3MgU0NDcmVhZFtfTkRdIGFuZCBTQ0N3cml0ZVtfTkRdIGFyZQorICogZm9yIHRoYXQgcHVycG9zZS4gVGhleSBhc3N1bWUgdGhhdCBhIGxvY2FsIHZhcmlhYmxlICdwb3J0JyBpcworICogZGVjbGFyZWQgYW5kIHBvaW50aW5nIHRvIHRoZSBwb3J0J3Mgc2NjX3N0cnVjdCBlbnRyeS4gVGhlCisgKiB2YXJpYW50cyB3aXRoICJfTkIiIGFwcGVuZGVkIHNob3VsZCBiZSB1c2VkIGlmIG5vIG90aGVyIFNDQworICogYWNjZXNzZXMgZm9sbG93IGltbWVkaWF0ZWx5ICh3aXRoaW4gMC41IHVzZWNzKS4gVGhleSBqdXN0IHNraXAgdGhlCisgKiBmaW5hbCBkZWxheSBub3BzLgorICogCisgKiBQbGVhc2Ugbm90ZSB0aGF0IGFjY2Vzc2VzIHRvIFNDQyByZWdpc3RlcnMgc2hvdWxkIG9ubHkgdGFrZSBwbGFjZQorICogd2hlbiBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb2ZmIChhdCBsZWFzdCBpZiBTQ0MgaW50ZXJydXB0cyBhcmUKKyAqIGVuYWJsZWQpLiBPdGhlcndpc2UsIGFuIGludGVycnVwdCBjb3VsZCBpbnRlcmZlcmUgd2l0aCB0aGUKKyAqIHR3by1zdGFnZSBhY2Nlc3NpbmcgcHJvY2Vzcy4KKyAqCisgKi8KKworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9TQ0N3cml0ZSgKKwlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQsCisJdW5zaWduZWQgY2hhciAqc2hhZG93LAorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKl9zY2NfZGVsLAorCWludCByZWdubywKKwl1bnNpZ25lZCBjaGFyIHZhbCwgaW50IGZpbmFsX2RlbGF5ICkKK3sKKwlzd2l0Y2goIHJlZ25vICkgeworCisJICBjYXNlIENPTU1BTkRfUkVHOgorCQkvKiBXUjAgY2FuIGJlIHdyaXR0ZW4gZGlyZWN0bHkgd2l0aG91dCBwb2ludGluZyAqLworCQkqcG9ydC0+Y3RybHAgPSB2YWw7CisJCWJyZWFrOworCisJICBjYXNlIFNZTkNfQ0hBUl9SRUc6CisJCS8qIEZvciBXUjcsIGZpcnN0IHNldCBiMCBvZiBXUjE1IHRvIDAsIGlmIG5lZWRlZCAqLworCQlpZiAoc2hhZG93W0lOVF9DVFJMX1JFR10gJiBJQ1JfT1BUSU9OUkVHX1NFTEVDVCkgeworCQkJKnBvcnQtPmN0cmxwID0gMTU7CisJCQlzaGFkb3dbSU5UX0NUUkxfUkVHXSAmPSB+SUNSX09QVElPTlJFR19TRUxFQ1Q7CisJCQlzY2NfcmVnX2RlbGF5KCk7CisJCQkqcG9ydC0+Y3RybHAgPSBzaGFkb3dbSU5UX0NUUkxfUkVHXTsKKwkJCXNjY19yZWdfZGVsYXkoKTsKKwkJfQorCQlnb3RvIG5vcm1hbF9jYXNlOworCQkKKwkgIGNhc2UgU0RMQ19PUFRJT05fUkVHOgorCQkvKiBGb3IgV1I3JywgZmlyc3Qgc2V0IGIwIG9mIFdSMTUgdG8gMSwgaWYgbmVlZGVkICovCisJCWlmICghKHNoYWRvd1tJTlRfQ1RSTF9SRUddICYgSUNSX09QVElPTlJFR19TRUxFQ1QpKSB7CisJCQkqcG9ydC0+Y3RybHAgPSAxNTsKKwkJCXNoYWRvd1tJTlRfQ1RSTF9SRUddIHw9IElDUl9PUFRJT05SRUdfU0VMRUNUOworCQkJc2NjX3JlZ19kZWxheSgpOworCQkJKnBvcnQtPmN0cmxwID0gc2hhZG93W0lOVF9DVFJMX1JFR107CisJCQlzY2NfcmVnX2RlbGF5KCk7CisJCX0KKwkJKnBvcnQtPmN0cmxwID0gNzsKKwkJc2hhZG93WzhdID0gdmFsOwkvKiBXUjcnIHNoYWRvd2VkIGF0IFdSOCAqLworCQlzY2NfcmVnX2RlbGF5KCk7CisJCSpwb3J0LT5jdHJscCA9IHZhbDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgVFhfREFUQV9SRUc6CQkvKiBXUjggKi8KKwkJLyogVFhfREFUQV9SRUcgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IG9uIHNvbWUgaC93ICovCisJCWlmIChNQUNIX0lTX01WTUUxNnggfHwgTUFDSF9JU19CVk1FNjAwMCB8fCBNQUNIX0lTX01WTUUxNDcpCisJCXsKKwkJCSpwb3J0LT5jdHJscCA9IHJlZ25vOworCQkJc2NjX3JlZ19kZWxheSgpOworCQkJKnBvcnQtPmN0cmxwID0gdmFsOworCQl9CisJCWVsc2UKKwkJCSpwb3J0LT5kYXRhcCA9IHZhbDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgTUFTVEVSX0lOVF9DVFJMOgorCQkqcG9ydC0+Y3RybHAgPSByZWdubzsKKwkJdmFsICY9IDB4M2Y7CS8qIGJpdHMgNi4uNyBhcmUgdGhlIHJlc2V0IGNvbW1hbmRzICovCisJCXNjY19zaGFkb3dbMF1bcmVnbm9dID0gdmFsOworCQlzY2NfcmVnX2RlbGF5KCk7CisJCSpwb3J0LT5jdHJscCA9IHZhbDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgRFBMTF9DVFJMX1JFRzoKKwkJKnBvcnQtPmN0cmxwID0gcmVnbm87CisJCXZhbCAmPSAweDFmOwkJCS8qIGJpdHMgNS4uNyBhcmUgdGhlIERQTEwgY29tbWFuZHMgKi8KKwkJc2hhZG93W3JlZ25vXSA9IHZhbDsKKwkJc2NjX3JlZ19kZWxheSgpOworCQkqcG9ydC0+Y3RybHAgPSB2YWw7CisJCWJyZWFrOworCisJICBjYXNlIDEgLi4uIDY6CQorCSAgY2FzZSAxMCAuLi4gMTM6CisJICBjYXNlIDE1OgorCSAgbm9ybWFsX2Nhc2U6CisJCSpwb3J0LT5jdHJscCA9IHJlZ25vOworCQlzaGFkb3dbcmVnbm9dID0gdmFsOworCQlzY2NfcmVnX2RlbGF5KCk7CisJCSpwb3J0LT5jdHJscCA9IHZhbDsKKwkJYnJlYWs7CisJCQorCSAgZGVmYXVsdDoKKwkJcHJpbnRrKCAiQmFkIFNDQyB3cml0ZSBhY2Nlc3MgdG8gV1IlZFxuIiwgcmVnbm8gKTsKKwkJYnJlYWs7CisJCQorCX0KKworCWlmIChmaW5hbF9kZWxheSkKKwkJc2NjX3JlZ19kZWxheSgpOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgX1NDQ3JlYWQoCisJc3RydWN0IHNjY19wb3J0ICpwb3J0LAorCXVuc2lnbmVkIGNoYXIgKnNoYWRvdywKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpfc2NjX2RlbCwKKwlpbnQgcmVnbm8sIGludCBmaW5hbF9kZWxheSApCit7CisJdW5zaWduZWQgY2hhciBydjsKKworCXN3aXRjaCggcmVnbm8gKSB7CisKKwkJLyogLS0tIHJlYWwgcmVhZCByZWdpc3RlcnMgLS0tICovCisJICBjYXNlIFNUQVRVU19SRUc6CisJCXJ2ID0gKnBvcnQtPmN0cmxwOworCQlicmVhazsKKworCSAgY2FzZSBJTlRfUEVORElOR19SRUc6CisJCS8qIFJSMzogcmVhZCBvbmx5IGZyb20gQ2hhbm5lbCBBISAqLworCQlwb3J0ID0gcG9ydC0+cG9ydF9hOworCQlnb3RvIG5vcm1hbF9jYXNlOworCisJICBjYXNlIFJYX0RBVEFfUkVHOgorCQkvKiBSUjggY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IG9uIHNvbWUgaC93ICovCisJCWlmIChNQUNIX0lTX01WTUUxNnggfHwgTUFDSF9JU19CVk1FNjAwMCB8fCBNQUNIX0lTX01WTUUxNDcpCisJCXsKKwkJCSpwb3J0LT5jdHJscCA9IDg7CisJCQlzY2NfcmVnX2RlbGF5KCk7CisJCQlydiA9ICpwb3J0LT5jdHJscDsKKwkJfQorCQllbHNlCisJCQlydiA9ICpwb3J0LT5kYXRhcDsKKwkJYnJlYWs7CisKKwkgIGNhc2UgQ1VSUl9WRUNUT1JfUkVHOgorCQkvKiBSUjIgKHZlY3RvciBpbmNsdWRpbmcgc3RhdHVzKSBmcm9tIENoLiBCICovCisJCXBvcnQgPSBwb3J0LT5wb3J0X2I7CisJCWdvdG8gbm9ybWFsX2Nhc2U7CisJCQorCQkvKiAtLS0gcmVhZGluZyB3cml0ZSByZWdpc3RlcnM6IGFjY2VzcyB0aGUgc2hhZG93IC0tLSAqLworCSAgY2FzZSAxIC4uLiA3OgorCSAgY2FzZSAxMCAuLi4gMTU6CisJCXJldHVybiBzaGFkb3dbcmVnbm9dOyAvKiBubyBmaW5hbCBkZWxheSEgKi8KKworCQkvKiBXUjcnIGlzIHNwZWNpYWwsIGJlY2F1c2UgaXQgaXMgc2hhZG93ZWQgYXQgdGhlIHBsYWNlIG9mIFdSOCAqLworCSAgY2FzZSBTRExDX09QVElPTl9SRUc6CisJCXJldHVybiBzaGFkb3dbOF07IC8qIG5vIGZpbmFsIGRlbGF5ISAqLworCisJCS8qIFdSOSBpcyBzcGVjaWFsIHRvbywgYmVjYXVzZSBpdCBpcyBjb21tb24gZm9yIGJvdGggY2hhbm5lbHMgKi8KKwkgIGNhc2UgTUFTVEVSX0lOVF9DVFJMOgorCQlyZXR1cm4gc2NjX3NoYWRvd1swXVs5XTsgLyogbm8gZmluYWwgZGVsYXkhICovCisKKwkgIGRlZmF1bHQ6CisJCXByaW50ayggIkJhZCBTQ0MgcmVhZCBhY2Nlc3MgdG8gJWNSJWRcbiIsIChyZWdubyAmIDE2KSA/ICdSJyA6ICdXJywKKwkJCQlyZWdubyAmIH4xNiApOworCQlicmVhazsKKwkJCisJICBjYXNlIFNQQ09ORF9TVEFUVVNfUkVHOgorCSAgY2FzZSBGU19GSUZPX0xPV19SRUc6CisJICBjYXNlIEZTX0ZJRk9fSElHSF9SRUc6CisJICBjYXNlIERQTExfU1RBVFVTX1JFRzoKKwkgIG5vcm1hbF9jYXNlOgorCQkqcG9ydC0+Y3RybHAgPSByZWdubyAmIDB4MGY7CisJCXNjY19yZWdfZGVsYXkoKTsKKwkJcnYgPSAqcG9ydC0+Y3RybHA7CisJCWJyZWFrOworCQkKKwl9CisKKwlpZiAoZmluYWxfZGVsYXkpCisJCXNjY19yZWdfZGVsYXkoKTsKKwlyZXR1cm4gcnY7Cit9CisKKyNkZWZpbmUgU0NDX0FDQ0VTU19JTklUKHBvcnQpCQkJCQkJXAorCXVuc2lnbmVkIGNoYXIgKl9zY2Nfc2hhZG93ID0gJnNjY19zaGFkb3dbcG9ydC0+Y2hhbm5lbF1bMF0KKworI2RlZmluZQlTQ0N3cml0ZShyZWcsdmFsKQlfU0NDd3JpdGUocG9ydCxfc2NjX3NoYWRvdyxzY2NfZGVsLChyZWcpLCh2YWwpLDEpCisjZGVmaW5lCVNDQ3dyaXRlX05CKHJlZyx2YWwpCV9TQ0N3cml0ZShwb3J0LF9zY2Nfc2hhZG93LHNjY19kZWwsKHJlZyksKHZhbCksMCkKKyNkZWZpbmUJU0NDcmVhZChyZWcpCQlfU0NDcmVhZChwb3J0LF9zY2Nfc2hhZG93LHNjY19kZWwsKHJlZyksMSkKKyNkZWZpbmUJU0NDcmVhZF9OQihyZWcpCQlfU0NDcmVhZChwb3J0LF9zY2Nfc2hhZG93LHNjY19kZWwsKHJlZyksMCkKKworI2RlZmluZSBTQ0Ntb2QocmVnLGFuZCxvcikJU0NDd3JpdGUoKHJlZyksKFNDQ3JlYWQocmVnKSYoYW5kKSl8KG9yKSkKKworI2VuZGlmIC8qIF9TQ0NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NjeDIwMF9ncGlvLmMgYi9kcml2ZXJzL2NoYXIvc2N4MjAwX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRhNmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NjeDIwMF9ncGlvLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qIGxpbnV4L2RyaXZlcnMvY2hhci9zY3gyMDBfZ3Bpby5jIAorCisgICBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFNDeDIwMCBHUElPIGRyaXZlci4gIEFsbG93cyBhIHVzZXIgc3BhY2UKKyAgIHByb2Nlc3MgdG8gcGxheSB3aXRoIHRoZSBHUElPIHBpbnMuCisKKyAgIENvcHlyaWdodCAoYykgMjAwMSwyMDAyIENocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvc2N4MjAwX2dwaW8uaD4KKworI2RlZmluZSBOQU1FICJzY3gyMDBfZ3BpbyIKKworTU9EVUxFX0FVVEhPUigiQ2hyaXN0ZXIgV2VpbmlnZWwgPHdpbmdlbEBuYW5vLXN5c3RlbS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5hdFNlbWkgU0N4MjAwIEdQSU8gUGluIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IG1ham9yID0gMDsJCS8qIGRlZmF1bHQgdG8gZHluYW1pYyBtYWpvciAqLworbW9kdWxlX3BhcmFtKG1ham9yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYWpvciwgIk1ham9yIGRldmljZSBudW1iZXIiKTsKKworc3RhdGljIHNzaXplX3Qgc2N4MjAwX2dwaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCAKKwkJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIG0gPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCWNoYXIgYzsKKwkJaWYgKGdldF91c2VyKGMsIGRhdGEraSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3dpdGNoIChjKQorCQl7CisJCWNhc2UgJzAnOiAKKwkJCXNjeDIwMF9ncGlvX3NldChtLCAwKTsgCisJCQlicmVhazsKKwkJY2FzZSAnMSc6IAorCQkJc2N4MjAwX2dwaW9fc2V0KG0sIDEpOyAKKwkJCWJyZWFrOworCQljYXNlICdPJzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgb3V0cHV0IGVuYWJsZWRcbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH4xLCAxKTsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgb3V0cHV0IGRpc2FibGVkXG4iLCBtKTsKKwkJCXNjeDIwMF9ncGlvX2NvbmZpZ3VyZShtLCB+MSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogR1BJTyVkIG91dHB1dCBpcyBwdXNoIHB1bGxcbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH4yLCAyKTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgb3V0cHV0IGlzIG9wZW4gZHJhaW5cbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH4yLCAwKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBHUElPJWQgcHVsbCB1cCBlbmFibGVkXG4iLCBtKTsKKwkJCXNjeDIwMF9ncGlvX2NvbmZpZ3VyZShtLCB+NCwgNCk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogR1BJTyVkIHB1bGwgdXAgZGlzYWJsZWRcbiIsIG0pOworCQkJc2N4MjAwX2dwaW9fY29uZmlndXJlKG0sIH40LCAwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3Qgc2N4MjAwX2dwaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbSA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHZhbHVlOworCisJdmFsdWUgPSBzY3gyMDBfZ3Bpb19nZXQobSk7CisJaWYgKHB1dF91c2VyKHZhbHVlID8gJzEnIDogJzAnLCBidWYpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzY3gyMDBfZ3Bpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIG0gPSBpbWlub3IoaW5vZGUpOworCWlmIChtID4gNjMpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzY3gyMDBfZ3Bpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNjeDIwMF9ncGlvX2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkud3JpdGUgICA9IHNjeDIwMF9ncGlvX3dyaXRlLAorCS5yZWFkICAgID0gc2N4MjAwX2dwaW9fcmVhZCwKKwkub3BlbiAgICA9IHNjeDIwMF9ncGlvX29wZW4sCisJLnJlbGVhc2UgPSBzY3gyMDBfZ3Bpb19yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2N4MjAwX2dwaW9faW5pdCh2b2lkKQoreworCWludCByOworCisJcHJpbnRrKEtFUk5fREVCVUcgTkFNRSAiOiBOYXRTZW1pIFNDeDIwMCBHUElPIERyaXZlclxuIik7CisKKwlpZiAoIXNjeDIwMF9ncGlvX3ByZXNlbnQoKSkgeworCQlwcmludGsoS0VSTl9FUlIgTkFNRSAiOiBubyBTQ3gyMDAgZ3BpbyBwaW5zIGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXIgPSByZWdpc3Rlcl9jaHJkZXYobWFqb3IsIE5BTUUsICZzY3gyMDBfZ3Bpb19mb3BzKTsKKwlpZiAociA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE5BTUUgIjogdW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2VcbiIpOworCQlyZXR1cm4gcjsKKwl9CisJaWYgKCFtYWpvcikgeworCQltYWpvciA9IHI7CisJCXByaW50ayhLRVJOX0RFQlVHIE5BTUUgIjogZ290IGR5bmFtaWMgbWFqb3IgJWRcbiIsIG1ham9yKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNjeDIwMF9ncGlvX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2NocmRldihtYWpvciwgTkFNRSk7Cit9CisKK21vZHVsZV9pbml0KHNjeDIwMF9ncGlvX2luaXQpOworbW9kdWxlX2V4aXQoc2N4MjAwX2dwaW9fY2xlYW51cCk7CisKKy8qCisgICAgTG9jYWwgdmFyaWFibGVzOgorICAgICAgICBjb21waWxlLWNvbW1hbmQ6ICJtYWtlIC1rIC1DIC4uLy4uIFNVQkRJUlM9ZHJpdmVycy9jaGFyIG1vZHVsZXMiCisgICAgICAgIGMtYmFzaWMtb2Zmc2V0OiA4CisgICAgRW5kOgorKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYyBiL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQ2MzBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogbGludXgvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCisgKgorICogVGhpcyBtb2R1bGUgZXhwb3J0cyB0aGUgZnVuY3Rpb25zOgorICoKKyAqICAgICAnaW50IHNldF9zZWxlY3Rpb24oc3RydWN0IHRpb2NsX3NlbGVjdGlvbiBfX3VzZXIgKiwgc3RydWN0IHR0eV9zdHJ1Y3QgKiknCisgKiAgICAgJ3ZvaWQgY2xlYXJfc2VsZWN0aW9uKHZvaWQpJworICogICAgICdpbnQgcGFzdGVfc2VsZWN0aW9uKHN0cnVjdCB0dHlfc3RydWN0ICopJworICogICAgICdpbnQgc2VsX2xvYWRsdXQoY2hhciBfX3VzZXIgKiknCisgKgorICogTm93IHRoYXQgL2Rldi92Y3MgZXhpc3RzLCBtb3N0IG9mIHRoaXMgY2FuIGRpc2FwcGVhciBhZ2Fpbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvdGlvY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisKKy8qIERvbid0IHRha2UgdGhpcyBmcm9tIDxjdHlwZS5oPjogMDExLTAxNSBvbiB0aGUgc2NyZWVuIGFyZW4ndCBzcGFjZXMgKi8KKyNkZWZpbmUgaXNzcGFjZShjKQkoKGMpID09ICcgJykKKworZXh0ZXJuIHZvaWQgcG9rZV9ibGFua2VkX2NvbnNvbGUodm9pZCk7CisKKy8qIFZhcmlhYmxlcyBmb3Igc2VsZWN0aW9uIGNvbnRyb2wuICovCisvKiBVc2UgYSBkeW5hbWljIGJ1ZmZlciwgaW5zdGVhZCBvZiBzdGF0aWMgKERlYyAxOTk0KSAqLworc3RydWN0IHZjX2RhdGEgKnNlbF9jb25zOwkJLyogbXVzdCBub3QgYmUgZGlzYWxsb2NhdGVkICovCitzdGF0aWMgdm9sYXRpbGUgaW50IHNlbF9zdGFydCA9IC0xOyAJLyogY2xlYXJlZCBieSBjbGVhcl9zZWxlY3Rpb24gKi8KK3N0YXRpYyBpbnQgc2VsX2VuZDsKK3N0YXRpYyBpbnQgc2VsX2J1ZmZlcl9sdGg7CitzdGF0aWMgY2hhciAqc2VsX2J1ZmZlcjsKKworLyogY2xlYXJfc2VsZWN0aW9uLCBoaWdobGlnaHQgYW5kIGhpZ2hsaWdodF9wb2ludGVyIGNhbiBiZSBjYWxsZWQKKyAgIGZyb20gaW50ZXJydXB0ICh2aWEgc2Nyb2xsYmFjay9mcm9udCkgKi8KKworLyogc2V0IHJldmVyc2UgdmlkZW8gb24gY2hhcmFjdGVycyBzLWUgb2YgY29uc29sZSB3aXRoIHNlbGVjdGlvbi4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWdobGlnaHQoY29uc3QgaW50IHMsIGNvbnN0IGludCBlKQoreworCWludmVydF9zY3JlZW4oc2VsX2NvbnMsIHMsIGUtcysyLCAxKTsKK30KKworLyogdXNlIGNvbXBsZW1lbnRhcnkgY29sb3IgdG8gc2hvdyB0aGUgcG9pbnRlciAqLworc3RhdGljIGlubGluZSB2b2lkIGhpZ2hsaWdodF9wb2ludGVyKGNvbnN0IGludCB3aGVyZSkKK3sKKwljb21wbGVtZW50X3BvcyhzZWxfY29ucywgd2hlcmUpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorc2VsX3BvcyhpbnQgbikKK3sKKwlyZXR1cm4gaW52ZXJzZV90cmFuc2xhdGUoc2VsX2NvbnMsIHNjcmVlbl9nbHlwaChzZWxfY29ucywgbikpOworfQorCisvKiByZW1vdmUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGhpZ2hsaWdodCwgaWYgYW55LAorICAgZnJvbSB0aGUgY29uc29sZSBob2xkaW5nIHRoZSBzZWxlY3Rpb24uICovCit2b2lkCitjbGVhcl9zZWxlY3Rpb24odm9pZCkgeworCWhpZ2hsaWdodF9wb2ludGVyKC0xKTsgLyogaGlkZSB0aGUgcG9pbnRlciAqLworCWlmIChzZWxfc3RhcnQgIT0gLTEpIHsKKwkJaGlnaGxpZ2h0KHNlbF9zdGFydCwgc2VsX2VuZCk7CisJCXNlbF9zdGFydCA9IC0xOworCX0KK30KKworLyoKKyAqIFVzZXIgc2V0dGFibGUgdGFibGU6IHdoYXQgY2hhcmFjdGVycyBhcmUgdG8gYmUgY29uc2lkZXJlZCBhbHBoYWJldGljPworICogMjU2IGJpdHMKKyAqLworc3RhdGljIHUzMiBpbndvcmRMdXRbOF09eworICAweDAwMDAwMDAwLCAvKiBjb250cm9sIGNoYXJzICAgICAqLworICAweDAzRkYwMDAwLCAvKiBkaWdpdHMgICAgICAgICAgICAqLworICAweDg3RkZGRkZFLCAvKiB1cHBlcmNhc2UgYW5kICdfJyAqLworICAweDA3RkZGRkZFLCAvKiBsb3dlcmNhc2UgICAgICAgICAqLworICAweDAwMDAwMDAwLAorICAweDAwMDAwMDAwLAorICAweEZGN0ZGRkZGLCAvKiBsYXRpbi0xIGFjY2VudGVkIGxldHRlcnMsIG5vdCBtdWx0aXBsaWNhdGlvbiBzaWduICovCisgIDB4RkY3RkZGRkYgIC8qIGxhdGluLTEgYWNjZW50ZWQgbGV0dGVycywgbm90IGRpdmlzaW9uIHNpZ24gKi8KK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGlud29yZChjb25zdCB1bnNpZ25lZCBjaGFyIGMpIHsKKwlyZXR1cm4gKCBpbndvcmRMdXRbYz4+NV0gPj4gKGMgJiAweDFGKSApICYgMTsKK30KKworLyogc2V0IGlud29yZEx1dCBjb250ZW50cy4gSW52b2tlZCBieSBpb2N0bCgpLiAqLworaW50IHNlbF9sb2FkbHV0KGNoYXIgX191c2VyICpwKQoreworCXJldHVybiBjb3B5X2Zyb21fdXNlcihpbndvcmRMdXQsICh1MzIgX191c2VyICopKHArNCksIDMyKSA/IC1FRkFVTFQgOiAwOworfQorCisvKiBkb2VzIHNjcmVlbiBhZGRyZXNzIHAgY29ycmVzcG9uZCB0byBjaGFyYWN0ZXIgYXQgTEgvUkggZWRnZSBvZiBzY3JlZW4/ICovCitzdGF0aWMgaW5saW5lIGludCBhdGVkZ2UoY29uc3QgaW50IHAsIGludCBzaXplX3JvdykKK3sKKwlyZXR1cm4gKCEocCAlIHNpemVfcm93KQl8fCAhKChwICsgMikgJSBzaXplX3JvdykpOworfQorCisvKiBjb25zdHJhaW4gdiBzdWNoIHRoYXQgdiA8PSB1ICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGxpbWl0KGNvbnN0IHVuc2lnbmVkIHNob3J0IHYsIGNvbnN0IHVuc2lnbmVkIHNob3J0IHUpCit7CisJcmV0dXJuICh2ID4gdSkgPyB1IDogdjsKK30KKworLyogc2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gSW52b2tlZCBieSBpb2N0bCgpIG9yIGJ5IGtlcm5lbCBjb2RlLiAqLworaW50IHNldF9zZWxlY3Rpb24oY29uc3Qgc3RydWN0IHRpb2NsX3NlbGVjdGlvbiBfX3VzZXIgKnNlbCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CisJaW50IHNlbF9tb2RlLCBuZXdfc2VsX3N0YXJ0LCBuZXdfc2VsX2VuZCwgc3BjOworCWNoYXIgKmJwLCAqb2JwOworCWludCBpLCBwcywgcGU7CisKKwlwb2tlX2JsYW5rZWRfY29uc29sZSgpOworCisJeyB1bnNpZ25lZCBzaG9ydCB4cywgeXMsIHhlLCB5ZTsKKworCSAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNlbCwgc2l6ZW9mKCpzZWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJICBfX2dldF91c2VyKHhzLCAmc2VsLT54cyk7CisJICBfX2dldF91c2VyKHlzLCAmc2VsLT55cyk7CisJICBfX2dldF91c2VyKHhlLCAmc2VsLT54ZSk7CisJICBfX2dldF91c2VyKHllLCAmc2VsLT55ZSk7CisJICBfX2dldF91c2VyKHNlbF9tb2RlLCAmc2VsLT5zZWxfbW9kZSk7CisJICB4cy0tOyB5cy0tOyB4ZS0tOyB5ZS0tOworCSAgeHMgPSBsaW1pdCh4cywgdmMtPnZjX2NvbHMgLSAxKTsKKwkgIHlzID0gbGltaXQoeXMsIHZjLT52Y19yb3dzIC0gMSk7CisJICB4ZSA9IGxpbWl0KHhlLCB2Yy0+dmNfY29scyAtIDEpOworCSAgeWUgPSBsaW1pdCh5ZSwgdmMtPnZjX3Jvd3MgLSAxKTsKKwkgIHBzID0geXMgKiB2Yy0+dmNfc2l6ZV9yb3cgKyAoeHMgPDwgMSk7CisJICBwZSA9IHllICogdmMtPnZjX3NpemVfcm93ICsgKHhlIDw8IDEpOworCisJICBpZiAoc2VsX21vZGUgPT0gVElPQ0xfU0VMQ0xFQVIpIHsKKwkgICAgICAvKiB1c2VmdWwgZm9yIHNjcmVlbmR1bXAgd2l0aG91dCBzZWxlY3Rpb24gaGlnaGxpZ2h0cyAqLworCSAgICAgIGNsZWFyX3NlbGVjdGlvbigpOworCSAgICAgIHJldHVybiAwOworCSAgfQorCisJICBpZiAobW91c2VfcmVwb3J0aW5nKCkgJiYgKHNlbF9tb2RlICYgVElPQ0xfU0VMTU9VU0VSRVBPUlQpKSB7CisJICAgICAgbW91c2VfcmVwb3J0KHR0eSwgc2VsX21vZGUgJiBUSU9DTF9TRUxCVVRUT05NQVNLLCB4cywgeXMpOworCSAgICAgIHJldHVybiAwOworCSAgfQorICAgICAgICB9CisKKwlpZiAocHMgPiBwZSkJLyogbWFrZSBzZWxfc3RhcnQgPD0gc2VsX2VuZCAqLworCXsKKwkJaW50IHRtcCA9IHBzOworCQlwcyA9IHBlOworCQlwZSA9IHRtcDsKKwl9CisKKwlpZiAoc2VsX2NvbnMgIT0gdmNfY29uc1tmZ19jb25zb2xlXS5kKSB7CisJCWNsZWFyX3NlbGVjdGlvbigpOworCQlzZWxfY29ucyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKKwl9CisKKwlzd2l0Y2ggKHNlbF9tb2RlKQorCXsKKwkJY2FzZSBUSU9DTF9TRUxDSEFSOgkvKiBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIHNlbGVjdGlvbiAqLworCQkJbmV3X3NlbF9zdGFydCA9IHBzOworCQkJbmV3X3NlbF9lbmQgPSBwZTsKKwkJCWJyZWFrOworCQljYXNlIFRJT0NMX1NFTFdPUkQ6CS8qIHdvcmQtYnktd29yZCBzZWxlY3Rpb24gKi8KKwkJCXNwYyA9IGlzc3BhY2Uoc2VsX3BvcyhwcykpOworCQkJZm9yIChuZXdfc2VsX3N0YXJ0ID0gcHM7IDsgcHMgLT0gMikKKwkJCXsKKwkJCQlpZiAoKHNwYyAmJiAhaXNzcGFjZShzZWxfcG9zKHBzKSkpIHx8CisJCQkJICAgICghc3BjICYmICFpbndvcmQoc2VsX3BvcyhwcykpKSkKKwkJCQkJYnJlYWs7CisJCQkJbmV3X3NlbF9zdGFydCA9IHBzOworCQkJCWlmICghKHBzICUgdmMtPnZjX3NpemVfcm93KSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzcGMgPSBpc3NwYWNlKHNlbF9wb3MocGUpKTsKKwkJCWZvciAobmV3X3NlbF9lbmQgPSBwZTsgOyBwZSArPSAyKQorCQkJeworCQkJCWlmICgoc3BjICYmICFpc3NwYWNlKHNlbF9wb3MocGUpKSkgfHwKKwkJCQkgICAgKCFzcGMgJiYgIWlud29yZChzZWxfcG9zKHBlKSkpKQorCQkJCQlicmVhazsKKwkJCQluZXdfc2VsX2VuZCA9IHBlOworCQkJCWlmICghKChwZSArIDIpICUgdmMtPnZjX3NpemVfcm93KSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTF9TRUxMSU5FOgkvKiBsaW5lLWJ5LWxpbmUgc2VsZWN0aW9uICovCisJCQluZXdfc2VsX3N0YXJ0ID0gcHMgLSBwcyAlIHZjLT52Y19zaXplX3JvdzsKKwkJCW5ld19zZWxfZW5kID0gcGUgKyB2Yy0+dmNfc2l6ZV9yb3cKKwkJCQkgICAgLSBwZSAlIHZjLT52Y19zaXplX3JvdyAtIDI7CisJCQlicmVhazsKKwkJY2FzZSBUSU9DTF9TRUxQT0lOVEVSOgorCQkJaGlnaGxpZ2h0X3BvaW50ZXIocGUpOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiByZW1vdmUgdGhlIHBvaW50ZXIgKi8KKwloaWdobGlnaHRfcG9pbnRlcigtMSk7CisKKwkvKiBzZWxlY3QgdG8gZW5kIG9mIGxpbmUgaWYgb24gdHJhaWxpbmcgc3BhY2UgKi8KKwlpZiAobmV3X3NlbF9lbmQgPiBuZXdfc2VsX3N0YXJ0ICYmCisJCSFhdGVkZ2UobmV3X3NlbF9lbmQsIHZjLT52Y19zaXplX3JvdykgJiYKKwkJaXNzcGFjZShzZWxfcG9zKG5ld19zZWxfZW5kKSkpIHsKKwkJZm9yIChwZSA9IG5ld19zZWxfZW5kICsgMjsgOyBwZSArPSAyKQorCQkJaWYgKCFpc3NwYWNlKHNlbF9wb3MocGUpKSB8fAorCQkJICAgIGF0ZWRnZShwZSwgdmMtPnZjX3NpemVfcm93KSkKKwkJCQlicmVhazsKKwkJaWYgKGlzc3BhY2Uoc2VsX3BvcyhwZSkpKQorCQkJbmV3X3NlbF9lbmQgPSBwZTsKKwl9CisJaWYgKHNlbF9zdGFydCA9PSAtMSkJLyogbm8gY3VycmVudCBzZWxlY3Rpb24gKi8KKwkJaGlnaGxpZ2h0KG5ld19zZWxfc3RhcnQsIG5ld19zZWxfZW5kKTsKKwllbHNlIGlmIChuZXdfc2VsX3N0YXJ0ID09IHNlbF9zdGFydCkKKwl7CisJCWlmIChuZXdfc2VsX2VuZCA9PSBzZWxfZW5kKQkvKiBubyBhY3Rpb24gcmVxdWlyZWQgKi8KKwkJCXJldHVybiAwOworCQllbHNlIGlmIChuZXdfc2VsX2VuZCA+IHNlbF9lbmQpCS8qIGV4dGVuZCB0byByaWdodCAqLworCQkJaGlnaGxpZ2h0KHNlbF9lbmQgKyAyLCBuZXdfc2VsX2VuZCk7CisJCWVsc2UJCQkJLyogY29udHJhY3QgZnJvbSByaWdodCAqLworCQkJaGlnaGxpZ2h0KG5ld19zZWxfZW5kICsgMiwgc2VsX2VuZCk7CisJfQorCWVsc2UgaWYgKG5ld19zZWxfZW5kID09IHNlbF9lbmQpCisJeworCQlpZiAobmV3X3NlbF9zdGFydCA8IHNlbF9zdGFydCkJLyogZXh0ZW5kIHRvIGxlZnQgKi8KKwkJCWhpZ2hsaWdodChuZXdfc2VsX3N0YXJ0LCBzZWxfc3RhcnQgLSAyKTsKKwkJZWxzZQkJCQkvKiBjb250cmFjdCBmcm9tIGxlZnQgKi8KKwkJCWhpZ2hsaWdodChzZWxfc3RhcnQsIG5ld19zZWxfc3RhcnQgLSAyKTsKKwl9CisJZWxzZQkvKiBzb21lIG90aGVyIGNhc2U7IHN0YXJ0IHNlbGVjdGlvbiBmcm9tIHNjcmF0Y2ggKi8KKwl7CisJCWNsZWFyX3NlbGVjdGlvbigpOworCQloaWdobGlnaHQobmV3X3NlbF9zdGFydCwgbmV3X3NlbF9lbmQpOworCX0KKwlzZWxfc3RhcnQgPSBuZXdfc2VsX3N0YXJ0OworCXNlbF9lbmQgPSBuZXdfc2VsX2VuZDsKKworCS8qIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBiZWZvcmUgZnJlZWluZyB0aGUgb2xkIG9uZSAuLi4gKi8KKwlicCA9IGttYWxsb2MoKHNlbF9lbmQtc2VsX3N0YXJ0KS8yKzEsIEdGUF9LRVJORUwpOworCWlmICghYnApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2VsZWN0aW9uOiBrbWFsbG9jKCkgZmFpbGVkXG4iKTsKKwkJY2xlYXJfc2VsZWN0aW9uKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoc2VsX2J1ZmZlcikKKwkJa2ZyZWUoc2VsX2J1ZmZlcik7CisJc2VsX2J1ZmZlciA9IGJwOworCisJb2JwID0gYnA7CisJZm9yIChpID0gc2VsX3N0YXJ0OyBpIDw9IHNlbF9lbmQ7IGkgKz0gMikgeworCQkqYnAgPSBzZWxfcG9zKGkpOworCQlpZiAoIWlzc3BhY2UoKmJwKyspKQorCQkJb2JwID0gYnA7CisJCWlmICghICgoaSArIDIpICUgdmMtPnZjX3NpemVfcm93KSkgeworCQkJLyogc3RyaXAgdHJhaWxpbmcgYmxhbmtzIGZyb20gbGluZSBhbmQgYWRkIG5ld2xpbmUsCisJCQkgICB1bmxlc3Mgbm9uLXNwYWNlIGF0IGVuZCBvZiBsaW5lLiAqLworCQkJaWYgKG9icCAhPSBicCkgeworCQkJCWJwID0gb2JwOworCQkJCSpicCsrID0gJ1xyJzsKKwkJCX0KKwkJCW9icCA9IGJwOworCQl9CisJfQorCXNlbF9idWZmZXJfbHRoID0gYnAgLSBzZWxfYnVmZmVyOworCXJldHVybiAwOworfQorCisvKiBJbnNlcnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWxlY3Rpb24gYnVmZmVyIGludG8gdGhlCisgKiBxdWV1ZSBvZiB0aGUgdHR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBjb25zb2xlLgorICogSW52b2tlZCBieSBpb2N0bCgpLgorICovCitpbnQgcGFzdGVfc2VsZWN0aW9uKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHZjX2RhdGEgKnZjID0gKHN0cnVjdCB2Y19kYXRhICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQJcGFzdGVkID0gMCwgY291bnQ7CisJc3RydWN0ICB0dHlfbGRpc2MgKmxkOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCXBva2VfYmxhbmtlZF9jb25zb2xlKCk7CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCisJbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsKKwkKKwlhZGRfd2FpdF9xdWV1ZSgmdmMtPnBhc3RlX3dhaXQsICZ3YWl0KTsKKwl3aGlsZSAoc2VsX2J1ZmZlciAmJiBzZWxfYnVmZmVyX2x0aCA+IHBhc3RlZCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAodGVzdF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpKSB7CisJCQlzY2hlZHVsZSgpOworCQkJY29udGludWU7CisJCX0KKwkJY291bnQgPSBzZWxfYnVmZmVyX2x0aCAtIHBhc3RlZDsKKwkJY291bnQgPSBtaW4oY291bnQsIHR0eS0+bGRpc2MucmVjZWl2ZV9yb29tKHR0eSkpOworCQl0dHktPmxkaXNjLnJlY2VpdmVfYnVmKHR0eSwgc2VsX2J1ZmZlciArIHBhc3RlZCwgTlVMTCwgY291bnQpOworCQlwYXN0ZWQgKz0gY291bnQ7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZ2Yy0+cGFzdGVfd2FpdCwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCisJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYyBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRlOWQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jCkBAIC0wLDAgKzEsODI1IEBACisvKiBkcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmMgKi8KKworLyogJElkOiBzZXJfYTIyMzIuYyx2IDAuNCAyMDAwLzAxLzI1IDEyOjAwOjAwIGVoYWFzZSBFeHAgJCAqLworCisvKiBMaW51eCBzZXJpYWwgZHJpdmVyIGZvciB0aGUgQW1pZ2EgQTIyMzIgYm9hcmQgKi8KKworLyogVGhpcyBkcml2ZXIgaXMgTUFJTlRBSU5FRC4gQmVmb3JlIGFwcGx5aW5nIGFueSBjaGFuZ2VzLCBwbGVhc2UgY29udGFjdAorICogdGhlIGF1dGhvci4KKyAqLworCisvKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBFbnZlciBIYWFzZSAgICA8ZWhhYXNlQGluZi5mdS1iZXJsaW4uZGU+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=